@willbooster/wbfy 1.2.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +3 -3
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import e from"node:fs";import t from"node:path";import n from"yargs";import r from"typescript";import{PromisePool as i}from"minimal-promise-pool";import s from"node:fs/promises";import o from"fast-glob";import a from"semver/functions/compare.js";import c from"semver/ranges/min-version.js";import l from"deepmerge";import p from"js-yaml";import{parse as d}from"smol-toml";import u from"node:os";import m from"node:child_process";import{Octokit as f}from"@octokit/core";import g from"semver";import y from"dotenv";import h from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";async function k(e){return new Promise(t=>setTimeout(t,e))}async function x(e){try{return await e()}catch{}}async function _(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}const j=new class{isVerbose=!1;doesUploadEnvVars=!1};const S=new class{async functionIgnoringException(e,t){j.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}j.isVerbose&&console.info(`---------- ${e} end ----------`)}},$={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,r){await e.promises.mkdir(t.dirname(n),{recursive:!0});let i=r.trim();i&&(i+="\n"),await e.promises.writeFile(n,i)}},P=new i;async function O(n){return S.functionIgnoringException("fixNextConfigJson",async()=>{const i=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!i)return;const s=await e.promises.readFile(i,"utf8"),o=function(e){const t=r.createSourceFile("next.config.js",e,r.ScriptTarget.Latest,!0,r.ScriptKind.JS);let n;const i=e=>{n||(r.isExportAssignment(e)&&r.isObjectLiteralExpression(e.expression)?n=e.expression:r.isBinaryExpression(e)&&e.operatorToken.kind===r.SyntaxKind.EqualsToken&&"module.exports"===e.left.getText(t)&&r.isObjectLiteralExpression(e.right)?n=e.right:r.forEachChild(e,i))};return i(t),n}(s);if(!o)return;const a=[];if(new Set(o.properties.map(e=>e.name?.getText())).has("typescript")||a.push("typescript: { ignoreBuildErrors: true }"),0===a.length)return;const c=o.getEnd()-1,l=o.properties.at(-1),p=!!l&&s.slice(l.getEnd(),c).includes(","),d=o.properties.length>0&&!p?", ":"",u=`${s.slice(0,c)}${d}${a.join(", ")}${s.slice(c)}`;await P.run(()=>$.generateFile(i,u))})}const E=e=>({kind:"literal",value:e}),C=(e,t=[])=>({kind:"object",value:B(e,t)}),A=B({forbidOnly:E("!!process.env.CI"),retries:E("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:C({baseURL:E("process.env.NEXT_PUBLIC_BASE_URL"),trace:E("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:E("process.env.CI ? 'only-on-failure' : 'only-on-failure'"),video:E("process.env.CI ? 'retain-on-failure' : 'retain-on-failure'")}),webServer:C({command:E("'yarn start-test-server'"),url:E("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:E("!!process.env.CI"),timeout:E("300_000"),stdout:E("'pipe'"),stderr:E("'pipe'"),env:E("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:E("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})});function B(e,t=[]){return{extraMembers:t,memberOrder:[...Object.keys(e).map(e=>({kind:"property",key:e})),...t.map((e,t)=>({kind:"extra",index:t}))],properties:e}}async function F(n){const i=t.resolve(n.dirPath,"playwright.config.ts");if(e.existsSync(i))return S.functionIgnoringException("fixPlaywrightConfig",async()=>{await async function(n){for(const r of function(n){const r=[".env",".env.test",".env.example","mise.toml","mise.test.toml"],i=[];for(let s=t.resolve(n);i.push(...r.map(e=>t.resolve(s,e))),!e.existsSync(t.resolve(s,".git"));s=t.dirname(s)){if(t.dirname(s)===s)break}return i}(n))try{const t=await e.promises.readFile(r,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(t))return}catch{}throw new Error("NEXT_PUBLIC_BASE_URL is required for Playwright. Define NEXT_PUBLIC_BASE_URL in the target repo.")}(n.dirPath);const s=await e.promises.readFile(i,"utf8"),o=function(e){const t=r.createSourceFile("playwright.config.ts",e,r.ScriptTarget.Latest,!0,r.ScriptKind.TS);let n;const i=e=>{if(!n){if(r.isCallExpression(e)&&"defineConfig"===e.expression.getText(t)){const t=e.arguments[0];if(t&&r.isObjectLiteralExpression(t))return void(n=t)}r.forEachChild(e,i)}};return i(t),n?{source:t,node:n}:void 0}(s);if(!o)return;const a=R(o.node,o.source);if(!a)return;const c=I(A,a),l=Boolean(n.packageJson?.scripts?.["start-test-server"]),p=Boolean(a.properties.webServer);l||p||delete c.properties.webServer,function(e,t){const n=t.properties.webServer;if("object"!==n?.kind)return;n.value.properties.command=E(e.isBun?"'bun start-test-server'":"'yarn start-test-server'")}(n,c);const d=W({kind:"object",value:c},0),u=o.node.getStart(o.source),m=o.node.getEnd(),f=`${s.slice(0,u)}${d}${s.slice(m)}`;await P.run(()=>$.generateFile(i,f))})}function I(e,t){const n=new Set(Object.keys(t.properties)),r=[...e.extraMembers,...t.extraMembers],i=[...e.memberOrder.filter(e=>"property"!==e.kind||!n.has(e.key)),...t.memberOrder.map(t=>"property"===t.kind?t:{kind:"extra",index:e.extraMembers.length+t.index})],s={...e.properties};for(const[e,n]of Object.entries(t.properties))s[e]=D(s[e],n);return{extraMembers:r,memberOrder:i,properties:s}}function D(e,t){return"object"===e?.kind&&"object"===t.kind?{kind:"object",value:I(e.value,t.value)}:t}function T(e,t){if(r.isObjectLiteralExpression(e)){const n=R(e,t);return n?{kind:"object",value:n}:E(e.getText(t))}if(r.isArrayLiteralExpression(e)){const n=e.elements.map(e=>T(e,t));return n.some(e=>void 0===e)?E(e.getText(t)):{kind:"array",value:n}}return E(e.getText(t))}function R(e,t){const n={extraMembers:[],memberOrder:[],properties:{}};for(const i of e.properties){if(r.isShorthandPropertyAssignment(i)){const e=i.name.getText(t);n.properties[e]=E(e),n.memberOrder.push({kind:"property",key:e});continue}if(!r.isPropertyAssignment(i)||!r.isIdentifier(i.name)&&!r.isStringLiteral(i.name)){const e=n.extraMembers.push(i.getText(t))-1;n.memberOrder.push({kind:"extra",index:e});continue}const e=T(i.initializer,t);if(void 0===e)return;const s=i.name.getText(t);n.properties[s]=e,n.memberOrder.push({kind:"property",key:s})}return n}function W(e,t){const n=" ".repeat(t);if("array"===e.kind){if(0===e.value.length)return"[]";const r=" ".repeat(t+1);return`[\n${e.value.map(e=>{const n=W(e,t+1).split("\n");if(n[n.length-1]=`${n.at(-1)},`,"literal"===e.kind)for(let e=1;e<n.length;e+=1)n[e]=`${r}${n[e]}`;return n[0]=`${r}${n[0]}`,n.join("\n")}).join("\n")}\n${n}]`}if("literal"===e.kind)return e.value;const r=" ".repeat(t+1),i=new Set,s=function(e){const t=new Map;for(const[n,r]of e.entries())"property"===r.kind&&t.set(r.key,n);return t}(e.value.memberOrder),o=e.value.memberOrder.flatMap((n,o)=>{if("extra"===n.kind)return[L(e.value.extraMembers[n.index]??"",r)];if(s.get(n.key)!==o)return[];const a=e.value.properties[n.key];return!a||i.has(n.key)?[]:(i.add(n.key),[N(n.key,a,t,r)])});return o.push(...Object.entries(e.value.properties).filter(([e])=>!i.has(e)).map(([e,n])=>N(e,n,t,r))),0===o.length?`{\n${n}}`:`{\n${o.join("\n")}\n${n}}`}function N(e,t,n,r){const i=W(t,n+1).split("\n");if(i[i.length-1]=`${i.at(-1)},`,"literal"===t.kind)for(let e=1;e<i.length;e+=1)i[e]=`${r}${i[e]}`;return i[0]=`${r}${e}: ${i[0]}`,i.join("\n")}function L(e,t){const n=e.split("\n");n[n.length-1]=`${n.at(-1)},`;for(const[e,r]of n.entries())n[e]=`${t}${r}`;return n.join("\n")}const J=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function M(e){return S.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await o.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:J});for(const r of n){const n=t.resolve(e.dirPath,r),i=(await s.readFile(n,"utf8")).replaceAll(/DATABASE_URL\s*=\s*"?([^"#\n]+?\.sqlite3[^"#\n]*)"?/g,(e,t)=>{if(t.includes("connection_limit=1"))return e;const n=t.includes("?")?"&":"?";return`DATABASE_URL="${t}${n}connection_limit=1"`});await s.writeFile(n,i)}})}const U=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function G(e,t){let n,r,i;"function"==typeof t?r=t:n=t;const s={},o=[...n??[],...Object.keys(e).sort(r)];for(i of o)U(e,i)&&(s[i]=e[i]);return s}const q=/^(?:( )+|\t+)/,z="space";function H(e,t,n){return e&&t===z&&1===n}function Y(e,t){const n=new Map;let r,i,s=0;for(const o of e.split(/\n/g)){if(!o)continue;const e=o.match(q);if(null===e)s=0,r="";else{const o=e[0].length,a=e[1]?z:"tab";if(H(t,a,o))continue;a!==r&&(s=0),r=a;let c=1,l=0;const p=o-s;if(s=o,0===p)c=0,l=1;else{const e=Math.abs(p);if(H(t,a,e))continue;i=K(a,e)}const d=n.get(i);n.set(i,void 0===d?[1,0]:[d[0]+c,d[1]+l])}}return n}function K(e,t){return(e===z?"s":"t")+String(t)}function V(e){if("string"!=typeof e)throw new TypeError("Expected a string");let t=Y(e,!0);0===t.size&&(t=Y(e,!1));const n=function(e){let t,n=0,r=0;for(const[i,[s,o]]of e)(s>n||s===n&&o>r)&&(n=s,r=o,t=i);return t}(t);let r,i=0,s="";var o;return void 0!==n&&(({type:r,amount:i}={type:"s"===(o=n)[0]?z:"tab",amount:Number(o.slice(1))}),s=function(e,t){return(e===z?" ":"\t").repeat(t)}(r,i)),{amount:i,type:r,indent:s}}function X(e){return"string"==typeof e&&function(e){if("string"!=typeof e)throw new TypeError("Expected a string");const t=e.match(/(?:\r?\n)/g)||[];if(0===t.length)return;const n=t.filter(e=>"\r\n"===e).length;return n>t.length-n?"\r\n":"\n"}(e)||"\n"}const Z=e=>(t,...n)=>e.reduce((e,t)=>t(e,...n),t),Q=e=>t=>Array.isArray(t)?e(t):t,ee=e=>t=>Array.isArray(t)&&t.every(e=>"string"==typeof e)?e(t):t,te=ee(e=>[...new Set(e)]),ne=ee(e=>e.toSorted()),re=Z([te,ne]),ie=e=>(t,...n)=>function(e){if("object"!=typeof e||null===e)return!1;const t=Object.getPrototypeOf(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)}(t)?e(t,...n):t,se=(e,t)=>{const n=ie(r=>(t&&(r=Object.fromEntries(Object.entries(r).map(([e,t])=>[e,n(t)]))),G(r,e)));return n},oe=Object.groupBy||((e,t)=>{const n=Object.create(null);for(const r of e){const e=t(r);n[e]?n[e].push(r):n[e]=[r]}return n}),ae=se(),ce=se(["type","url"]),le=se(["name","email","url"]),pe=se(["lib","bin","man","doc","example","test"]),de=(e,t)=>ie((n,...r)=>Object.hasOwn(n,e)?{...n,[e]:t(n[e],...r)}:n),ue=se(["applypatch-msg","pre-applypatch","post-applypatch","pre-commit","pre-merge-commit","prepare-commit-msg","commit-msg","post-commit","pre-rebase","post-checkout","post-merge","pre-push","pre-receive","update","proc-receive","post-receive","post-update","reference-transaction","push-to-checkout","pre-auto-gc","post-rewrite","sendemail-validate","fsmonitor-watchman","p4-changelist","p4-prepare-changelist","p4-post-changelist","p4-pre-submit","post-index-change"]),me=e=>{const[t]=e.split(">"),n=[...t.matchAll("@")];if(!n.length||1===n.length&&0===n[0].index)return{name:e};const r=n.pop().index;return{name:t.substring(0,r),range:t.substring(r+1)}},fe=se((e,t)=>{const{name:n,range:r}=me(e),{name:i,range:s}=me(t);return n!==i?n.localeCompare(i,"en"):r?s?a(c(r),c(s)):1:-1}),ge=e=>{const t=e.indexOf("@",e.startsWith("@")?1:0);return-1===t?e:e.slice(0,t)},ye=new Map;function he(t){return"string"==typeof t.packageManager?t.packageManager.startsWith("npm@"):t.devEngines?.packageManager?.name?"npm"===t.devEngines.packageManager.name:!t.pnpm&&(!!t.engines?.npm||!(()=>{const t=process.cwd();return ye.has(t)||ye.set(t,e.existsSync("yarn.lock")||e.existsSync(".yarn/")||e.existsSync(".yarnrc.yml")||e.existsSync("pnpm-lock.yaml")||e.existsSync("pnpm-workspace.yaml")),ye.get(t)})())}const we=ie((e,t)=>Object.keys(e).length<2?e:he(t)?G(e,(e,t)=>e.localeCompare(t,"en")):G(e)),be=Z([se(["packages","catalog"]),de("packages",re),de("catalog",we)]),ve=Z([se(["files","excludedFiles","env","parser","parserOptions","settings","plugins","extends","rules","overrides","globals","processor","noInlineConfig","reportUnusedDisableDirectives"]),de("env",ae),de("globals",ae),de("overrides",Q(e=>e.map(ve))),de("parserOptions",ae),de("rules",se((e,t)=>e.split("/").length-t.split("/").length||e.localeCompare(t))),de("settings",ae)]),ke=se(["description","url","href"]),xe=Z([ie(e=>G(e,[...Object.keys(e).filter(e=>"overrides"!==e).sort(),"overrides"])),de("overrides",Q(e=>e.map(Z([ae,de("options",ae)]))))]),_e=se(["node","npm","yarn"]),je=de("packageManager",se(["name","version","onFail"])),Se=Z([se(["peerDependencyRules","neverBuiltDependencies","onlyBuiltDependencies","onlyBuiltDependenciesFile","allowedDeprecatedVersions","allowNonAppliedPatches","updateConfig","auditConfig","requiredScripts","supportedArchitectures","overrides","patchedDependencies","packageExtensions"],!0),de("overrides",fe)]),$e=new Set(["install","pack","prepare","publish","restart","shrinkwrap","start","stop","test","uninstall","version"]),Pe=(e,t)=>Object.hasOwn(t,"devDependencies")&&Object.hasOwn(t.devDependencies,e),Oe=/(?<=^|[\s&;<>|(])(?:run-s|npm-run-all2? .*(?:--sequential|--serial|-s))(?=$|[\s&;<>|)])/,Ee=e=>{if(!Pe("npm-run-all",e)&&!Pe("npm-run-all2",e))return!1;return["scripts","betterScripts"].flatMap(t=>e[t]?Object.values(e[t]):[]).some(e=>{return(t=e).includes("*")&&Oe.test(t);var t})};function Ce(e,t=""){const n=new Map;for(const r of e){const e=(t?r.slice(t.length+1):r).indexOf(":");if(e>0){const i=r.slice(0,(t?t.length+1:0)+e);n.has(i)||n.set(i,[]),n.get(i).push(r)}else n.has(r)||n.set(r,[]),n.get(r).push(r)}return Array.from(n.keys()).sort().flatMap(e=>{const t=n.get(e);if(t.length>1&&t.some(t=>t!==e&&t.startsWith(e+":"))){return[...t.filter(t=>t===e||!t.startsWith(e+":")).sort(),...Ce(t.filter(t=>t.startsWith(e+":")),e)]}return t.sort()})}const Ae=ie((e,t)=>{let n=Object.keys(e);const r=new Set;return n=n.map(e=>{const t=e.replace(/^(?:pre|post)/,"");return $e.has(t)||n.includes(t)?(r.add(t),t):e}),Ee(t)||(n=Ce(n)),n=n.flatMap(e=>r.has(e)?[`pre${e}`,e,`post${e}`]:[e]),G(e,n)}),Be=e=>{const{defaultConditions:t=[],restConditions:n=[]}=oe(e,e=>"default"===e?"defaultConditions":"restConditions");return[...n,...t]},Fe=ie(e=>{const{paths:t=[],conditions:n=[]}=oe(Object.keys(e),e=>e.startsWith(".")?"paths":"conditions");return Object.fromEntries([...t,...Be(n)].map(t=>[t,Fe(e[t])]))}),Ie=[{key:"$schema"},{key:"name"},{key:"displayName"},{key:"version"},{key:"stableVersion"},{key:"private"},{key:"description"},{key:"categories",over:te},{key:"keywords",over:te},{key:"homepage"},{key:"bugs",over:se(["url","email"])},{key:"repository",over:ce},{key:"funding",over:ce},{key:"license",over:ce},{key:"qna"},{key:"author",over:le},{key:"maintainers",over:Q(e=>e.map(le))},{key:"contributors",over:Q(e=>e.map(le))},{key:"publisher"},{key:"sideEffects"},{key:"type"},{key:"imports"},{key:"exports",over:Fe},{key:"main"},{key:"svelte"},{key:"umd:main"},{key:"jsdelivr"},{key:"unpkg"},{key:"module"},{key:"source"},{key:"jsnext:main"},{key:"browser"},{key:"react-native"},{key:"types"},{key:"typesVersions"},{key:"typings"},{key:"style"},{key:"example"},{key:"examplestyle"},{key:"assets"},{key:"bin",over:ae},{key:"man"},{key:"directories",over:pe},{key:"files",over:te},{key:"workspaces",over:be},{key:"binary",over:se(["module_name","module_path","remote_path","package_name","host"])},{key:"scripts",over:Ae},{key:"betterScripts",over:Ae},{key:"l10n"},{key:"contributes",over:ae},{key:"activationEvents",over:te},{key:"husky",over:de("hooks",ue)},{key:"simple-git-hooks",over:ue},{key:"pre-commit"},{key:"commitlint",over:ae},{key:"lint-staged"},{key:"nano-staged"},{key:"config",over:ae},{key:"nodemonConfig",over:ae},{key:"browserify",over:ae},{key:"babel",over:ae},{key:"browserslist"},{key:"xo",over:ae},{key:"prettier",over:xe},{key:"eslintConfig",over:ve},{key:"eslintIgnore"},{key:"npmpkgjsonlint",over:ae},{key:"npmPackageJsonLintConfig",over:ae},{key:"npmpackagejsonlint",over:ae},{key:"release",over:ae},{key:"remarkConfig",over:ae},{key:"stylelint"},{key:"ava",over:ae},{key:"jest",over:ae},{key:"jest-junit",over:ae},{key:"jest-stare",over:ae},{key:"mocha",over:ae},{key:"nyc",over:ae},{key:"c8",over:ae},{key:"tap",over:ae},{key:"oclif",over:se(void 0,!0)},{key:"resolutions",over:ae},{key:"overrides",over:we},{key:"dependencies",over:we},{key:"devDependencies",over:we},{key:"dependenciesMeta",over:se((e,t)=>{const n=ge(e),r=ge(t);return n<r?-1:n>r?1:0},!0)},{key:"peerDependencies",over:we},{key:"peerDependenciesMeta",over:se(void 0,!0)},{key:"optionalDependencies",over:we},{key:"bundledDependencies",over:re},{key:"bundleDependencies",over:re},{key:"extensionPack",over:re},{key:"extensionDependencies",over:re},{key:"flat"},{key:"packageManager"},{key:"engines",over:ae},{key:"engineStrict",over:ae},{key:"devEngines",over:je},{key:"volta",over:_e},{key:"languageName"},{key:"os"},{key:"cpu"},{key:"preferGlobal",over:ae},{key:"publishConfig",over:ae},{key:"icon"},{key:"badges",over:Q(e=>e.map(ke))},{key:"galleryBanner",over:ae},{key:"preview"},{key:"markdown"},{key:"pnpm",over:Se}],De=Ie.map(({key:e})=>e),Te=Z(Ie.map(({key:e,over:t})=>t?de(e,t):void 0).filter(Boolean));function Re(e,t={}){return function(e,t){if("string"==typeof e){const{indent:n,type:r}=V(e),i="\n"===e.slice(-1)?"\n":"",s=X(e);e=JSON.parse(e);let o=JSON.stringify(t(e),null,"tab"===r?"\t":n)+i;return"\r\n"===s&&(o=o.replace(/\n/g,s)),o}return t(e)}(e,ie(e=>{let n=t.sortOrder||De;if(Array.isArray(n)){const t=Object.keys(e),{privateKeys:r=[],publicKeys:i=[]}=oe(t,e=>"_"===e[0]?"privateKeys":"publicKeys");n=[...n,...De,...i.sort(),...r.sort()]}return Te(G(e,n),e)}))}async function We(n){return S.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const r=t.join(n,"package.json");if(!e.existsSync(r))return;const i=t.join(n,"test");for(const s of["__tests__","tests"]){const o=t.join(n,s);try{await Ne(o,i);const t=JSON.parse(await e.promises.readFile(r,"utf8"));let n=!1;const a=t.scripts??{};for(const[e,t]of Object.entries(a)){const r=t.replaceAll(s,"test");t!==r&&(a[e]=r,n=!0)}if(t.scripts=a,!n)return;await $.generateFile(r,JSON.stringify(Re(t),void 0,2))}catch{}}}))})}async function Ne(n,r){if(!e.existsSync(r))return void await e.promises.rename(n,r);const i=await e.promises.readdir(n,{withFileTypes:!0});await Promise.all(i.map(async i=>{const s=t.join(n,i.name),o=t.join(r,i.name),a=e.existsSync(o)?await e.promises.stat(o):void 0;i.isDirectory()&&a?.isDirectory()?await Ne(s,o):await e.promises.rename(s,o)})),await e.promises.rm(n,{recursive:!0})}async function Le(e,n){return S.functionIgnoringException("fixTypeDefinitions",async()=>{const r=t.resolve(e.dirPath,"@types"),i=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),o=await _(()=>s.readdir(r,{withFileTypes:!0}));if(o)for(const e of o){const o=e.name.slice(0,-5),a=e.name.endsWith(".d.ts");let c=a?o:e.name;c.includes("__")&&(c=`@${c.replace("__","/")}`);const l=n.some(e=>e.packageJson?.dependencies?.[c]||e.packageJson?.devDependencies?.[c]);e.isFile()&&a?l?(await s.mkdir(t.join(r,o),{recursive:!0}),await P.run(()=>s.rename(t.join(r,e.name),t.join(r,o,"index.d.ts")))):i&&(await s.mkdir(i,{recursive:!0}),await P.run(()=>s.rename(t.join(r,e.name),t.join(i,e.name)))):e.isDirectory()&&i&&!l&&(await s.mkdir(i,{recursive:!0}),await P.run(()=>_(()=>s.rename(t.join(r,e.name,"index.d.ts"),t.join(i,`${e.name}.d.ts`)))))}})}function Je(e,t){return t}function Me(e,t,n){const r=[...e];for(const[i,s]of t.entries())void 0===r[i]?r[i]=Ue(s,n):Ge(e[i],n)&&Ge(s,n)?r[i]=l(e[i],s,n):e.includes(s)||r.push(s);return r}function Ue(e,t){return Ge(e,t)?t.cloneUnlessOtherwiseSpecified(e,t):e}function Ge(e,t){return!!e&&"object"==typeof e&&t.isMergeableObject(e)}function qe(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,r]of t)delete e[n],e[n]=r,r&&"object"==typeof r&&!Array.isArray(r)&&qe(r);return e}const ze={name:"autofix.ci",on:{pull_request:null,push:{branches:["main"]}},permissions:{contents:"read"},concurrency:{group:"autofix-${{ github.head_ref }}","cancel-in-progress":!0},jobs:{autofix:{"runs-on":"ubuntu-latest"}}},He={name:"Fix code automatically",on:{pull_request:null},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{autofix:{uses:"WillBooster/reusable-workflows/.github/workflows/autofix.yml@main"}}},Ye={test:{name:"Test",on:{pull_request:null,push:{branches:["main","wbfy"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:"write"},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{"id-token":"write",contents:"write"},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},permissions:{contents:"write"},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"gen-pr-claude":{name:"Generate PR with Claude Code",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-claude')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"claude-code","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{CLAUDE_CODE_OAUTH_TOKEN:"${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}"}}}},"gen-pr-codex":{name:"Generate PR with Codex CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-codex')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"codex-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{OPENAI_API_KEY:"${{ secrets.OPENAI_API_KEY }}"}}}},"gen-pr-gemini":{name:"Generate PR with Gemini CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-gemini')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"gemini-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{GEMINI_API_KEY:"${{ secrets.GEMINI_API_KEY }}"}}}}};async function Ke(n){return S.functionIgnoringException("generateWorkflow",async()=>{if(Ve(n.repository))return;const r=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(r,{recursive:!0});const i=t.resolve(n.dirPath,".github","semantic.yml");await P.run(()=>e.promises.rm(i,{force:!0,recursive:!0}));const s=await e.promises.readdir(r,{withFileTypes:!0}),o=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml","gen-pr-claude.yml","gen-pr-codex.yml","gen-pr-gemini.yml",...s.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&o.add("release.yml");for(const e of o){const i=t.basename(e,".yml");await P.run(()=>Xe(n,r,i))}})}function Ve(e){return e?.endsWith("/reusable-workflows")??!1}async function Xe(n,r,i){const s=t.join(r,`${i}.yml`),o=e.existsSync(t.join(r,"deploy-production.yml"));if("autofix"===i)return void await Qe(function(e){if(!e.isPublicRepo)return structuredClone(He);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0,"node-version":"lts/*"}},...e.isBun?[{uses:"oven-sh/setup-bun@v1",with:{"bun-version":"latest"}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`});n.push({uses:"autofix-ci/action@v1"});const r=structuredClone(ze),i=r.jobs.autofix??{"runs-on":"ubuntu-latest"};return r.jobs.autofix={...i,steps:n},r}(n),s);let a=structuredClone(i in Ye?Ye[i]:{});try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);a=l.all([a,n,a],{arrayMerge:Me})}catch{}if(!("jobs"in a))return;i.startsWith("deploy")&&(a={...a,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(a,"jobs"),a.on?.push&&(a.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...a.on.push["paths-ignore"]??[]])])),"release"===i&&a.jobs.release&&o&&(a.permissions??={},a.permissions.actions="write",a.jobs.release.with??={},a.jobs.release.with.trigger_deploy_workflow="deploy-production.yml");let c=!1;for(const e of Object.values(a.jobs))e.uses?.includes("/reusable-workflows/")&&(Ze(n,e,i),c=!0);if(c){switch(i){case"release":if(a.on?.schedule)delete a.on.push;else{if(!(a.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(r,"release.yml"),{force:!0});a.on.push.branches=n.release.branches}n.isPublicRepo?(a.permissions??={},a.permissions["id-token"]="write"):delete a.permissions?.["id-token"];break;case"test":a.on?.pull_request&&delete a.on.pull_request["paths-ignore"],a.on?.push&&(delete a.on.push["paths-ignore"],a.on.push.branches=a.on.push.branches.filter(e=>"renovate/**"!==e))}if(await Qe(a,s),"sync"===i){if(await e.promises.rm(t.join(r,"sync-init.yml"),{force:!0}),!a.jobs.sync?.with)return;a.jobs["sync-force"]=a.jobs.sync;const n=a.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;a.jobs.sync.with.sync_params_without_dest=`--force ${n}`,a.name="Force to Sync",a.on={workflow_dispatch:null},delete a.jobs.sync,await Qe(a,t.join(r,"sync-force.yml"))}}}function Ze(e,t,n){if(t.with??={},t.secrets??={},delete t.secrets.NPM_TOKEN,"test"!==n&&"release"!==n&&"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.with["test-command"]=e.isBun?"bun run check-all-for-ai":"yarn check-all-for-ai"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with.sync_params_without_dest;"string"==typeof e&&(t.with.sync_params_without_dest=e.replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses?.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses?.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&"string"==typeof t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,"")),e.doesContainDockerfile&&!t.with.ci_label&&n.startsWith("test")&&(t.with.ci_label="large"),"release"===n||"test"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?qe(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=qe(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function Qe(t,n){const r=p.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}).replaceAll(/[ \t]+$/gm,"");await e.promises.writeFile(n,r)}async function et(n){return S.functionIgnoringException("fixTypos",async()=>{if(Ve(n.repository))return;const r=n.dirPath,i=await o.glob("**/*.md",{dot:!0,cwd:r,ignore:J});j.isVerbose&&console.info(`Found ${i.length} markdown files in ${r}`);for(const s of i){const i=t.join(r,s);P.run(async()=>{const t=await e.promises.readFile(i,"utf8");let r=tt(t);r=nt(r,n,"doc"),t!==r&&await $.generateFile(i,r)})}const s=await o.glob(["{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:r,ignore:J});j.isVerbose&&console.info(`Found ${s.length} TypeScript files in ${r}`);for(const i of s){const s=t.join(r,i);P.run(async()=>{const t=await e.promises.readFile(s,"utf8");let r=t.replaceAll(/\/\*[\s\S]*?\*\//g,e=>tt(e)).replaceAll(/(^|\s)\/\/(.*?)c\.f\./g,"$1//$2cf.").replaceAll(/(^|\s)\/\/(.*?)eg\./g,"$1//$2e.g.").replaceAll(/(^|\s)\/\/(.*?)ie\./g,"$1//$2i.e.");r=nt(r,n,"ts"),t!==r&&await $.generateFile(s,r)})}const a=await o.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:r,ignore:J});j.isVerbose&&console.info(`Found ${a.length} text-based files in ${r}`);for(const i of a){const s=t.join(r,i);P.run(async()=>{const t=await e.promises.readFile(s,"utf8");let r=tt(t);r=nt(r,n,"text"),t!==r&&await $.generateFile(s,r)})}await P.promiseAll()})}function tt(e){return e.replaceAll(/\bc\.f\.(?=\s|$)/g,"cf.").replaceAll(/\beg\.(?=\s|$)/g,"e.g.").replaceAll(/\bie\.(?=\s)/g,"i.e.")}function nt(e,t,n){for(const[n,r]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,r);for(const[r,i]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(r,i);return e}async function rt(e,n){return S.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const r=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),i=await $.readFileIgnoringError(r);for(const[r,s]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const o=it(e,n,s,i),a=t.resolve(e.dirPath,r);await P.run(()=>$.generateFile(a,o))}const s=t.resolve(e.dirPath,".cursor/rules/general.mdc"),o=function(e,t,n){const r="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",i=it(e,t,"Cursor",n);return`${r}\n\n${i}`}(e,n,i);await P.run(()=>$.generateFile(s,o))})}function it(e,t,n,r){const i=e.isBun?"bun":"yarn",s=`\n## Project Information\n\n- Name: \`${e.packageJson?.name||"unknown"}\`\n- Description: ${e.packageJson?.description}\n- Package Manager: ${i}\n\n## General Instructions\n\n- Create a new branch if the current branch is \`main\`.\n- Run any \`git\` commands sequentially.\n- Write tests ONLY if explicitly requested. If requested, follow these rules:\n - Continue modifying the tests and code until all tests pass.\n - Ensure tests reset any related persistent data, as our test infrastructure does not clear it automatically.\n - Prefer actual API calls over mocks. Use mocks when actual calls are impractical, have unintended side effects, or are explicitly requested.\n- When fixing issues, follow these rules:\n - Investigate the root cause first (e.g., by gathering debug logs, taking screenshots, etc.).\n - Fix the actual root cause instead of applying workarounds.\n- After making code changes, run \`${i} check-all-for-ai\` to execute all tests (takes up to 1 hour) or \`${i} check-for-ai\` for type checking and linting only (takes up to 10 minutes).\n - If you are confident your changes will not break any tests, you may use \`check-for-ai\`.\n- Once you have verified your changes, commit and push them to the current (non-main) branch then create a PR via \`gh\`.\n - Follow the conventional commits; your commit message should start with \`feat:\`, \`fix:\`, etc.\n - If not specified, make sure to add a new line at the end of your commit message${e.isWillBoosterRepo?` with: \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\``:""}.\n - Always create new commits. Avoid using \`--amend\`.\n${t.some(e=>e.hasStartTestServer)?`- Use \`${i} run start-test-server\` to launch a web server for debugging or testing.`:""}\n\n${st(t)}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim(),o=r?.trim().startsWith("#");return s+(r?o?"\n\n"+r.trim():"\n"+r:"")}function st(e){return`\n## Coding Style\n\n- Use camelCase for JavaScript and TypeScript files (or PascalCase for React components).\n- Simplify code as much as possible to eliminate redundancy.\n- Design each module with high cohesion, grouping related functionality together.\n - Refactor existing large modules into smaller, focused modules when necessary.\n - Create well-organized directory structures with low coupling and high cohesion.\n- Place calling functions in the file above the functions they call to maintain a clear top-down order.\n - e.g. \`function caller() { callee(); } function callee() { ... }\`\n- Write comments that explain "why" rather than "what". Avoid stating what can be understood from the code itself.\n- Prefer \`undefined\` over \`null\` unless explicitly required by APIs or libraries.\n- Prefer using a single template literal for prompts instead of \`join()\` with an array of strings.\n${e.some(e=>e.depending.genI18nTs)?'- When introducing new string literals in React components, update the language resource files in the `i18n` directory (e.g., `i18n/ja-JP.json`). Reference these strings using the `i18n` utility. For example, use `i18n.pages.home.title()` for `{ "pages": { "home": { "title": "My App" } } }`.':""}\n${e.some(e=>e.depending.react||e.depending.next)?"- Prefer `useImmer` for storing an array or an object to `useState`.":""}\n${e.some(e=>e.depending.next)?"\n- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.\n- Assume there is only a single server instance.\n":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim()}const ot=["@exercode/problem-utils","@willbooster/agent-skills","@willbooster/babel-configs","@willbooster/oxfmt-config","@willbooster/oxlint-config","@willbooster/prettier-config","@willbooster/renovate-config","@willbooster/shared-lib","@willbooster/shared-lib-blitz-next","@willbooster/shared-lib-next","@willbooster/shared-lib-node","@willbooster/shared-lib-react","@willbooster/wb","agent-runtime-kit","one-way-git-sync","@typescript/native-preview","@typescript/native-preview-darwin-arm64","@typescript/native-preview-darwin-x64","@typescript/native-preview-linux-arm","@typescript/native-preview-linux-arm64","@typescript/native-preview-linux-x64","@typescript/native-preview-win32-arm64","@typescript/native-preview-win32-x64","oxfmt","@oxfmt/binding-android-arm-eabi","@oxfmt/binding-android-arm64","@oxfmt/binding-darwin-arm64","@oxfmt/binding-darwin-x64","@oxfmt/binding-freebsd-x64","@oxfmt/binding-linux-arm-gnueabihf","@oxfmt/binding-linux-arm-musleabihf","@oxfmt/binding-linux-arm64-gnu","@oxfmt/binding-linux-arm64-musl","@oxfmt/binding-linux-ppc64-gnu","@oxfmt/binding-linux-riscv64-gnu","@oxfmt/binding-linux-riscv64-musl","@oxfmt/binding-linux-s390x-gnu","@oxfmt/binding-linux-x64-gnu","@oxfmt/binding-linux-x64-musl","@oxfmt/binding-openharmony-arm64","@oxfmt/binding-win32-arm64-msvc","@oxfmt/binding-win32-ia32-msvc","@oxfmt/binding-win32-x64-msvc","oxlint","@oxlint/binding-android-arm-eabi","@oxlint/binding-android-arm64","@oxlint/binding-darwin-arm64","@oxlint/binding-darwin-x64","@oxlint/binding-freebsd-x64","@oxlint/binding-linux-arm-gnueabihf","@oxlint/binding-linux-arm-musleabihf","@oxlint/binding-linux-arm64-gnu","@oxlint/binding-linux-arm64-musl","@oxlint/binding-linux-ppc64-gnu","@oxlint/binding-linux-riscv64-gnu","@oxlint/binding-linux-riscv64-musl","@oxlint/binding-linux-s390x-gnu","@oxlint/binding-linux-x64-gnu","@oxlint/binding-linux-x64-musl","@oxlint/binding-openharmony-arm64","@oxlint/binding-win32-arm64-msvc","@oxlint/binding-win32-ia32-msvc","@oxlint/binding-win32-x64-msvc","oxlint-tsgolint","@oxlint-tsgolint/darwin-arm64","@oxlint-tsgolint/darwin-x64","@oxlint-tsgolint/linux-arm64","@oxlint-tsgolint/linux-x64","@oxlint-tsgolint/win32-arm64","@oxlint-tsgolint/win32-x64","@next/env","@next/font","@next/rspack-binding-linux-arm64-gnu","@next/rspack-binding-linux-arm64-musl","@next/rspack-binding-linux-x64-gnu","@next/rspack-binding-linux-x64-musl","@next/swc-android-arm-eabi","@next/swc-android-arm64","@next/swc-darwin-arm64","@next/swc-darwin-x64","@next/swc-freebsd-x64","@next/swc-linux-arm-gnueabihf","@next/swc-linux-arm64-gnu","@next/swc-linux-arm64-musl","@next/swc-linux-x64-gnu","@next/swc-linux-x64-musl","@next/swc-wasm-nodejs","@next/swc-wasm-web","@next/third-parties","next","react","react-dom"];async function at(n){return S.functionIgnoringException("generateBunfigToml",async()=>{const r=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(r)?e.readFileSync(r,"utf8"):void 0,s=ct(i);await P.run(()=>$.generateFile(r,s))})}const ct=e=>{const t=function(e){if(!e)return;try{return d(e)}catch{return}}(e);return`env = false\ntelemetry = false\n\n${function(e){return"boolean"==typeof e?.run?.bun?`[run]\nbun = ${e.run.bun}\n`:""}(t)}\n[install]\nexact = ${!1===t?.install?.exact?"false":"true"}\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n${ot.map(e=>` "${e}",`).join("\n")}\n]\n`};const lt="# Project-specific settings",pt=/# Project-specific settings[^\n]*\n/gm,dt="# Generated by wbfy",ut=`${lt} (head)\n\n\n${dt}\n`,mt=`\n${lt} (tail)\n`,ft={separator:dt,separatorPrefix:"# Generated by ",defaultHeadUserContent:ut,defaultTailUserContent:mt,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const r=gt(n);return r>0&&(n=n.slice(0,r-1)),n.replaceAll(pt,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return-1!==t?e.slice(0,e.indexOf("\n",t)+1).replaceAll(pt,`${lt} (head)\n`):ut},getTailUserContent(e){const t=gt(e);return t>0?e.slice(t-1):mt},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function gt(e){const t=e.indexOf(lt),n=e.lastIndexOf(lt);return n>t?n:-1}async function yt(n){return S.functionIgnoringException("generateDockerignore",async()=>{const r=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await $.readFileIgnoringError(r)??"",t=ft.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+ft.getTailUserContent(e);await P.run(()=>$.generateFile(r,t))}else await e.promises.rm(r,{force:!0})})}const ht={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].toSorted(),codeWith4IndentSize:["go","gradle","java","py"].toSorted(),markdownLike:["md"].toSorted(),oxlint:["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"].toSorted(),oxfmt:["astro","cjs","css","cts","gql","graphql","hbs","htm","html","js","json","json5","jsonc","jsx","less","md","mdx","mjs","mts","scss","svelte","toml","ts","tsx","vue","yaml","yml"].toSorted(),prettierOnly:["java"].toSorted()},wt=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${vt(ht.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${vt(ht.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${vt(ht.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function bt(e){return S.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await P.run(()=>$.generateFile(n,wt))})}function vt(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}const kt={have_fun:!0,code_review:{disable:!1,comment_severity_threshold:"MEDIUM",max_review_comments:-1,pull_request_opened:{help:!1,summary:!0,code_review:!0}},ignore_patterns:["**/__generated__"]};async function xt(n,r){return S.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),s=t.resolve(i,"config.yml"),o=t.resolve(i,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let c=structuredClone(kt);try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);c=l.all([c,n,c],{arrayMerge:Je})}catch{}const d=p.dump(c,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),u=await $.readFileIgnoringError(a),m=u?.trimStart().startsWith("#")?void 0:u,f=`${n.isPublicRepo?"Review in English based on the following coding standards.":"以下のコーディング規約を踏まえて、日本語でレビューしてください。"}\n\n${st(r)}${m?`\n${m.trimEnd()}`:""}`,g=[P.run(()=>$.generateFile(s,d)),P.run(()=>$.generateFile(o,f))];await Promise.all(g)})}async function _t(n){return S.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const r=t.resolve(n.dirPath,".gemini"),i=t.resolve(r,"settings.json");await e.promises.rm(i,{force:!0})})}const jt=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...ht.codeWith2IndentSize,...ht.codeWith4IndentSize,...ht.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function St(e){return S.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await P.run(()=>$.generateFile(n,jt))})}const $t=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Pt(e,n){return S.functionIgnoringException("generateGitignore",async()=>{const r=t.resolve(e.dirPath,".gitignore"),i=await $.readFileIgnoringError(r)??"";let s=ft.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n*/mount/*.hash\n.devcontainer/\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot.*\n.idea/copilot/chatSessions/\n.playwright-cli/\n.serena/\n.tmp/\n__generated__/\n@willbooster/\ndist/\ntemp/\ntmp/\n";const o=ft.getTailUserContent(i),a=[...$t];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),s+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),s+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),s+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(s+=".aws-sam/\npackaged.yaml\n"),e.doesContainPoetryLock&&(a.push("python"),s+=".venv/\n"),e.depending.blitz&&(s+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(s+="*.sqlite3*\n"),e.depending.playwrightTest&&(s+="playwright-report/\ntest-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),s+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(s+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Ct(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,r=await fetch(n),i=await r.text();if(!r.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await P.run(()=>Et(e,t)),j.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await ft.isBerryZeroInstallEnabled(r)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=s+"\n"+c+o;await P.run(()=>$.generateFile(r,l))})}const Ot=t.join(u.homedir(),".cache","wbfy","gitignore");async function Et(n,r){await e.promises.mkdir(Ot,{recursive:!0}),await e.promises.writeFile(t.join(Ot,n),r)}async function Ct(n){try{const r=await e.promises.stat(t.join(Ot,n));if(Date.now()-r.mtimeMs>216e5)return;return await e.promises.readFile(t.join(Ot,n),"utf8")}catch{}}function At(e){return e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages}async function Bt(n){return S.functionIgnoringException("generateIdeaSettings",async()=>{const r=t.resolve(n.dirPath,".idea");if(e.existsSync(r)){const i=t.resolve(r,"watcherTasks.xml");await(At(n)?P.run(()=>$.generateFile(i,It)):P.run(()=>e.promises.rm(i,{force:!0})))}})}function Ft(e,t,n,r){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${r}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${r})" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="${e}" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n`}const It=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ht.oxfmt.map(e=>Ft("node","node_modules/.bin/oxfmt --write --no-error-on-unmatched-pattern","Oxfmt",e)).join("")}\n${ht.prettierOnly.map(e=>Ft("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`;function Dt(e,t,n,r=0){Tt(e,t,n,r)}function Tt(e,t,n,r=0){do{const[i,s,o]=Wt(e,t,n),a=m.spawnSync(i,s,o).status??1;if(0===a)break;if(r<=0)return a}while(--r>=0);return 0}function Rt(e,t,n){const[r,i,s]=Wt(e,t,n);s.stdio="pipe";const o=m.spawnSync(r,i,s),a=o.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();o.error?console.error(`${r} [${i.map(e=>`"${e}"`).join(", ")}] failed with: ${o.error.message}`):c&&console.error(`${r} [${i.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${c}`);const l=o.stdout??"";return"string"==typeof l?l.trim():l.toString().trim()}function Wt(e,t,n){const r={...process.env};return r.PATH&&r.BERRY_BIN_FOLDER&&(r.PATH=r.PATH.split(":").filter(e=>e!==r.BERRY_BIN_FOLDER).join(":")),[e,t,{cwd:n,env:r,encoding:"utf8",shell:!1,stdio:"inherit"}]}const Nt=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},Lt=new Map;function Jt(e){const t=e??"",n=Lt.get(t);if(n)return n;const r=new f({auth:Ut(e)||void 0});return Lt.set(t,r),r}function Mt(e){return!!Ut(e)}function Ut(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER:"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB:process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN}const Gt=["@willbooster/oxfmt-config","@willbooster/oxlint-config","oxfmt","oxlint","oxlint-tsgolint"],qt="@typescript/native-preview",zt=["@biomejs/biome","@eslint-react/eslint-plugin","@eslint/js","@next/eslint-plugin-next","@types/eslint","@types/micromatch","@typescript-eslint/eslint-plugin","@typescript-eslint/parser","@willbooster/biome-config","@willbooster/eslint-config","@willbooster/eslint-config-blitz-next","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-react","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","biome","eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-import-resolver-node","eslint-import-resolver-typescript","eslint-plugin-import","eslint-plugin-import-x","eslint-plugin-perfectionist","eslint-plugin-prettier","eslint-plugin-react-compiler","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-storybook","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals","micromatch","typescript-eslint"],Ht=new Map;async function Yt(n,r,i){return S.functionIgnoringException("generatePackageJson",async()=>{await async function(n,r,i){const s=t.resolve(n.dirPath,"package.json"),a=await async function(t){const n=await e.promises.readFile(t,"utf8"),r=JSON.parse(n);return r.scripts=r.scripts??{},r.dependencies=r.dependencies??{},r.devDependencies=r.devDependencies??{},r.peerDependencies=r.peerDependencies??{},r}(s),c=n.isBun?"bun":"yarn";await async function(n,r){"WillBooster LLC"===n.author&&(n.author="WillBooster Inc.");delete n.scripts["sort-package-json"],delete n.scripts["sort-all-package-json"],delete n.scripts["typecheck/warn"],delete n.scripts["typecheck:gen-code"],delete n.scripts["typecheck:codegen"],delete n.dependencies.tslib,delete n.devDependencies["@willbooster/renovate-config"],delete n.devDependencies["@willbooster/tsconfig"],delete n.devDependencies.typescript,delete n.devDependencies.lerna,delete n.devDependencies.pinst,delete n.scripts["flutter-format"],delete n.scripts["format-flutter"],delete n.scripts["python-format"],delete n.scripts["format-python"],delete n.scripts.prettier,delete n.scripts["check-all"],await P.run(()=>e.promises.rm(t.resolve(r,"lerna.json"),{force:!0})),function(e){for(const t of zt)delete e.dependencies[t],delete e.devDependencies[t],delete e.peerDependencies[t]}(n)}(a,n.dirPath),await async function(n,r,i){(function(e){for(const[t,n]of Object.entries(e))"string"==typeof n&&(n.includes("git clone")||(e[t]=n.replaceAll(/yarn\s*(?:install\s*)?&&\s*/gu,"")))})(r.scripts),r.scripts={...r.scripts,...tn(n,r.scripts)},function(e,t){if(!e.depending.playwrightTest||!e.depending.wb||t.scripts?.["start-test-server"])return;t.scripts??={},t.scripts["start-test-server"]="wb start --mode test"}(n,r),function(e,t){if(!("check-for-ai"in e))return;"gen-code"in e&&(e["check-for-ai"]=`${t} gen-code > /dev/null && ${e["check-for-ai"]}`);e["check-for-ai"]=`${t} install > /dev/null && ${e["check-for-ai"]}`}(r.scripts,i),n.isBun?delete r.scripts.prettify:r.scripts.prettify=(r.scripts.prettify??"")+await async function(n){const r=t.resolve(n,".prettierignore"),i=await e.promises.readFile(r,"utf8"),s=i.indexOf(ft.separatorPrefix);if(-1===s)return"";const o=i.slice(0,s);return`${o.split("\n").map(e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith("#")&&!e.includes("/")).map(e=>` "!**/${e}/**"`).join("")} || true`}(n.dirPath);!function(e){for(const[t,n]of Object.entries(e))n?.includes("yarn workspaces foreach")&&(e[t]=n.replaceAll(/yarn workspaces foreach(?!\s+(?:-A|-R|--(?:all|recursive|since|worktree|from|include|exclude|public|private)))/gu,"yarn workspaces foreach --all"))}(r.scripts)}(n,a,c);const p=function(n,r,i){const s=[],a=["prettier","sort-package-json"],c=[];e.existsSync(t.join(r.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(i.prettier="@willbooster/prettier-config",a.push("prettier-plugin-java","@willbooster/prettier-config"));if(delete i.devDependencies["lint-staged"],delete i["lint-staged"],n.isRoot){if(delete i.devDependencies.husky,delete i.scripts.postinstall,delete i.scripts.postpublish,delete i.scripts.prepublishOnly,delete i.scripts.prepack,delete i.scripts.postpack,i.scripts.prepare="lefthook install || true",a.push("lefthook"),n.depending.semanticRelease&&(i.devDependencies["semantic-release"]||i.devDependencies["multi-semantic-release"]||i.devDependencies["@qiwi/multi-semantic-release"]||a.push("semantic-release"),i.version="0.0.0-semantically-released"),n.depending.playwrightTest){i.dependencies.artillery||i.devDependencies.artillery||i.dependencies["@playwright/test"]||a.push("@playwright/test"),delete i.dependencies.playwright,delete i.devDependencies.playwright}n.doesContainSubPackageJsons?i.workspaces=Array.isArray(i.workspaces)?l.all([i.workspaces,["packages/*"]],{arrayMerge:Me}):["packages/*"]:Array.isArray(i.workspaces)&&(i.workspaces=i.workspaces.filter(e=>o.globSync(e,{dot:!0,cwd:n.dirPath,ignore:J}).length>0),0===i.workspaces.length&&delete i.workspaces)}if(n.depending.wb||n.isBun){i.dependencies["@willbooster/wb"]?s.push("@willbooster/wb"):a.push("@willbooster/wb");for(const[e,t]of Object.entries(i.scripts))"string"==typeof t&&(i.scripts[e]=t.replaceAll(/wb\s+db/gu,"wb prisma"))}At(n)&&a.push(...Gt);At(n)&&a.push(...function(e){return e.isBun?["@tsconfig/bun"]:e.depending.reactNative?["@tsconfig/react-native"]:["@tsconfig/node-lts","@tsconfig/node-ts"]}(n));(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(a.push(qt),n.isBun?a.push("@types/bun"):n.depending.reactNative||a.push("@types/node"),(i.dependencies.jest||i.devDependencies.jest||i.dependencies["@jest/globals"]||i.devDependencies["@jest/globals"]||i.dependencies["ts-jest"]||i.devDependencies["ts-jest"])&&a.push("@types/jest"));if(n.isWillBoosterConfigs)return{dependencies:s.filter(e=>!e.includes("@willbooster/")),devDependencies:a.filter(e=>!e.includes("@willbooster/")),poetryDevDependencies:c};return{dependencies:s,devDependencies:a,poetryDevDependencies:c}}(n,r,a);await async function(n,r,i,s){i.name||(i.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(i.private=!0);i.license||(i.license="UNLICENSED");!i.private&&"UNLICENSED"!==i.license&&r.isPublicRepo&&(i.publishConfig??={},i.publishConfig.access??="public");const[a]=Nt.getOrgAndName(n.repository??"");"WillBooster"!==a&&"WillBoosterLab"!==a||(i.author="WillBooster Inc.");n.isRoot||!i.private||i.main||(i.main="./src");if(delete i.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)i.scripts["lint-fix"]=i.scripts["lint-fix"]??"yarn lint --fix";else{delete i.scripts.lint,delete i.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=i.scripts[e];t&&(i.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){i.scripts.lint="flutter analyze",i.scripts["lint-fix"]="yarn lint";const r=["lib","test","test_driver"].filter(r=>e.existsSync(t.resolve(n.dirPath,r)));r.length>0&&(i.scripts["format-code"]=`dart format $(find ${r.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,i.scripts.format=(i.scripts.format??"")+" && yarn format-code")}if(n.doesContainPoetryLock){"poetry install"===i.scripts.postinstall&&delete i.scripts.postinstall;const e=await o.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:J}),t=new Set;for(const n of e){const[e,r]=n.split("/");e&&r&&t.add(e)}if(t.size>0){const e=[...t].join(" ");i.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,i.scripts.lint?i.scripts.lint=`poetry run flake8 ${e} && ${i.scripts.lint}`:(i.scripts.lint=`poetry run flake8 ${e}`,i.scripts["lint-fix"]="yarn lint"),i.scripts.format=(i.scripts.format??"")+" && yarn format-code",s.poetryDevDependencies.push("black","isort","flake8")}}}(n.repository||i.repository)&&(i.repository=function(e,t){const n=Qt(e);if(n)return en(n,e,t);const r=Qt(t);if(r)return en(r,t);return e}(n.repository??i.repository,i.repository));n.depending.blitz?i.scripts["gen-code"]?.startsWith("blitz codegen")?i.scripts["gen-code"].includes("blitz prisma generate")||(i.scripts["gen-code"]=i.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):i.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!i.scripts["gen-code"]?.startsWith("prisma generate")&&(i.scripts["gen-code"]="prisma generate");i.dependencies.prettier||delete i.devDependencies["@types/prettier"]}(n,r,a,p),function(e,t){const n=e.dependencies,r=e.devDependencies;t.dependencies=Vt(n,t.dependencies),t.devDependencies=t.devDependencies.filter(e=>!n[e]),t.devDependencies=Vt(r,t.devDependencies)}(a,p),await async function(e){const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]),n=[{packageName:"@willbooster/auth",repo:"auth",target:"dependencies"},{packageName:"@discord-bot/shared",repo:"discord-bot",target:"dependencies"},{packageName:"@willbooster/code-analyzer",repo:"code-analyzer",target:"devDependencies"},{packageName:"@willbooster/judge",repo:"judge",target:"dependencies"},{packageName:"@willbooster/llm-proxy",repo:"llm-proxy",target:"dependencies"}];await Promise.all(n.map(async({packageName:n,repo:r,target:i})=>{if(!t.has(n)||function(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}(e,n))return;const s="dependencies"===i?"devDependencies":"dependencies";Reflect.deleteProperty(e[s],n),e[i][n]=await async function(e){const t=await function(e,t){try{const n=Rt("git",["ls-remote",`git@github.com:${e}/${t}.git`,"HEAD"],process.cwd()).split(/\s+/)[0];if(!n)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(n)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}("WillBoosterLab",e);return`git@github.com:WillBoosterLab/${e}.git#${t}`}(r)}))}(a),function(e){for(const t of["dependencies","devDependencies","peerDependencies"]){const n=e[t];n&&0===Object.keys(n).length&&Reflect.deleteProperty(e,t)}}(a),n.isBun&&delete a.packageManager;await P.run(()=>$.generateFile(s,JSON.stringify(Re(a),void 0,2))),i||function(e,t,n,r){const i=n.dependencies.filter(e=>!t.devDependencies?.[e]);Kt(e,r,i,!1);const s=n.devDependencies.filter(e=>!t.dependencies?.[e]);Kt(e,r,s,!0),n.poetryDevDependencies.length>0&&Dt("poetry",["add","--group","dev",...new Set(n.poetryDevDependencies)],e.dirPath)}(n,a,p,c)}(n,r,i)})}function Kt(e,t,n,r){if(0===n.length)return;const i=[...new Set(n)];e.isBun?Dt(t,["add",...r?["-D"]:[],"--exact",...i],e.dirPath):Dt(t,["add",...r?["-D"]:[],...i],e.dirPath)}function Vt(e,t){const n=[];for(const r of new Set(t)){const t=Zt(r,e[r]);t&&n.push(r),e[r]&&!t&&"*"!==e[r]||(e[r]=Xt(r))}return n}function Xt(e){const t=Ht.get(e);if(t)return t;const n=Rt("npm",["show",e,"version","--workspaces=false"],process.cwd())||"*";return Ht.set(e,n),n}function Zt(e,t){return!t||("*"===t||("@willbooster/oxlint-config"===e||"oxlint"===e||e===qt))}function Qt(e){if("string"==typeof e){if(!e.startsWith("github:"))return;const[t,n]=Nt.getOrgAndName(e);if(!t||!n)return;return`git+https://github.com/${t}/${n}.git`}const t=e?.url;if("string"!=typeof t)return;const n=/^(?:git\+)?https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/u.exec(t);if(!n)return;const[,r,i]=n;return`git+https://github.com/${r}/${i}.git`}function en(e,t,n){return{..."object"==typeof t?t:"object"==typeof n?n:void 0,type:"git",url:e}}function tn(e,t){if(e.isBun){const t={"check-all-for-ai":"bun run check-for-ai && bun run test","check-for-ai":"bun run cleanup",cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun wb test",typecheck:"bun --bun wb typecheck"};return e.doesContainTypeScript||e.doesContainTypeScriptInPackages||delete t.typecheck,t}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,r=At(e),i=t.test;let s={"check-all-for-ai":"yarn check-for-ai && yarn test","check-for-ai":"yarn format > /dev/null 2> /dev/null || true && yarn lint-fix --quiet",cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn format-code && yarn prettify",lint:"oxlint --no-error-on-unmatched-pattern .","lint-fix":"yarn lint --fix","format-code":"oxfmt --write --no-error-on-unmatched-pattern .",prettify:`prettier --cache --color --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${ht.prettierOnly.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsgo --noEmit"};return e.doesContainSubPackageJsons?s=l({...s},{format:"sort-package-json && yarn format-code && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${ht.prettierOnly.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}):e.depending.pyright&&(s.typecheck=s.typecheck?`${s.typecheck} && `:"",s.typecheck+="pyright"),i?.includes("wb test")&&(s.test=i),r||(delete s["format-code"],s.format="sort-package-json && yarn prettify",delete s.lint,delete s["lint-fix"]),n?e.depending.wb&&(s.typecheck="wb typecheck"):delete s.typecheck,s}}const nn={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},rn={commands:{cleanup:{glob:"",run:""},"check-migrations":{glob:"**/migration.sql",run:"\nif grep -q 'Warnings:' {staged_files}; then\n echo \"Migration SQL files ({staged_files}) contain warnings! Please solve the warnings and commit again.\"\n exit 1\nfi\n".trim()}}},sn='\n#!/bin/bash\n\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim();async function on(n){return S.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const r=t.resolve(n.dirPath,".lefthook"),i=t.resolve(n.dirPath,".husky"),s=e.existsSync(i),{lint:o}=tn(n,{}),a={...nn,"pre-commit":{...rn,commands:{...rn.commands,cleanup:{...rn.commands.cleanup,glob:an(n),run:cn(n)}}}};o||delete a["pre-push"];await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),p.dump(a,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(r,{force:!0,recursive:!0})]),s&&(await Promise.all([e.promises.rm(i,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})]),Dt("git",["config","--unset","core.hooksPath"],n.dirPath));if(o){const i=function(e){let t;t=e.isBun?e.depending.wb?"bun --bun wb lint":"bun run lint":e.depending.wb?"yarn wb lint":"yarn run lint";if(e.repository?.startsWith("github:WillBoosterLab/"))return`\n#!/bin/bash\n\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don't push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\n${t}\n`.trim();return t}(n);e.mkdirSync(t.join(r,"pre-push"),{recursive:!0}),await P.run(()=>e.promises.writeFile(t.join(r,"pre-push","check.sh"),i+"\n",{mode:493}))}const c=`${sn}\n\n${function(e){const t=[];if(e.hasVersionSettings){const e=String.raw`(mise\.toml|\.mise\.toml|\.tool-versions|\..+-version)`;t.push(String.raw`run_if_changed "${e}" "mise install"`)}const n=e.isBun?"bun install":"yarn",r=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";t.push(String.raw`run_if_changed "package\.json" "${n}${r}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`);e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`);return t}(n).join("\n")}\n`;e.mkdirSync(t.join(r,"post-merge"),{recursive:!0}),await P.run(()=>e.promises.writeFile(t.resolve(r,"post-merge","prepare.sh"),c,{mode:493}))}(n)})}function an(e){const t=[...ht.prettierOnly];At(e)&&t.push(...ht.oxfmt,...ht.oxlint),e.doesContainPoetryLock&&t.push("py"),e.doesContainPubspecYaml&&t.push("dart");return`**/*.{${[...new Set(t)].toSorted().join(",")}}`}function cn(n){if(function(n){if(!n.isRoot)return!1;const r=t.resolve(n.dirPath,"packages","wb","package.json");if(!e.existsSync(r))return!1;try{return"@willbooster/wb"===JSON.parse(e.readFileSync(r,"utf8")).name}catch{return!1}}(n))return'yarn workspace @willbooster/wb start --working-dir "$(git rev-parse --show-toplevel)" lint --fix --format -- {staged_files} && git add -- {staged_files}';if(n.isBun||n.depending.wb){const e=n.isBun?"bun":"yarn";return`${n.depending.wb?(n.isBun?"bun --bun wb":"yarn wb")+" lint --fix --format -- {staged_files}":`${e} run format && ${e} run lint-fix`} && git add -- {staged_files}`}const r=ht.oxlint.map(e=>String.raw`\.${e}$`).join("|"),i=ht.oxfmt.map(e=>String.raw`\.${e}$`).join("|"),s=ht.prettierOnly.map(e=>String.raw`\.${e}$`).join("|"),o=At(n);return String.raw`
1
+ import e from"node:fs";import t from"node:path";import n from"yargs";import r from"typescript";import{PromisePool as i}from"minimal-promise-pool";import s from"node:fs/promises";import o from"fast-glob";import a from"semver/functions/compare.js";import c from"semver/ranges/min-version.js";import l from"deepmerge";import p from"js-yaml";import{parse as d}from"smol-toml";import u from"node:os";import m from"node:child_process";import{Octokit as f}from"@octokit/core";import g from"semver";import y from"dotenv";import h from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";async function k(e){return new Promise(t=>setTimeout(t,e))}async function x(e){try{return await e()}catch{}}async function _(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}const j=new class{isVerbose=!1;doesUploadEnvVars=!1};const S=new class{async functionIgnoringException(e,t){j.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}j.isVerbose&&console.info(`---------- ${e} end ----------`)}},$={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,r){await e.promises.mkdir(t.dirname(n),{recursive:!0});let i=r.trim();i&&(i+="\n"),await e.promises.writeFile(n,i)}},P=new i;async function O(n){return S.functionIgnoringException("fixNextConfigJson",async()=>{const i=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!i)return;const s=await e.promises.readFile(i,"utf8"),o=function(e){const t=r.createSourceFile("next.config.js",e,r.ScriptTarget.Latest,!0,r.ScriptKind.JS);let n;const i=e=>{n||(r.isExportAssignment(e)&&r.isObjectLiteralExpression(e.expression)?n=e.expression:r.isBinaryExpression(e)&&e.operatorToken.kind===r.SyntaxKind.EqualsToken&&"module.exports"===e.left.getText(t)&&r.isObjectLiteralExpression(e.right)?n=e.right:r.forEachChild(e,i))};return i(t),n}(s);if(!o)return;const a=[];if(new Set(o.properties.map(e=>e.name?.getText())).has("typescript")||a.push("typescript: { ignoreBuildErrors: true }"),0===a.length)return;const c=o.getEnd()-1,l=o.properties.at(-1),p=!!l&&s.slice(l.getEnd(),c).includes(","),d=o.properties.length>0&&!p?", ":"",u=`${s.slice(0,c)}${d}${a.join(", ")}${s.slice(c)}`;await P.run(()=>$.generateFile(i,u))})}const E=e=>({kind:"literal",value:e}),C=(e,t=[])=>({kind:"object",value:B(e,t)}),A=B({forbidOnly:E("!!process.env.CI"),retries:E("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:C({baseURL:E("process.env.NEXT_PUBLIC_BASE_URL"),trace:E("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:E("process.env.CI ? 'only-on-failure' : 'only-on-failure'"),video:E("process.env.CI ? 'retain-on-failure' : 'retain-on-failure'")}),webServer:C({command:E("'yarn start-test-server'"),url:E("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:E("!!process.env.CI"),timeout:E("300_000"),stdout:E("'pipe'"),stderr:E("'pipe'"),env:E("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:E("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})});function B(e,t=[]){return{extraMembers:t,memberOrder:[...Object.keys(e).map(e=>({kind:"property",key:e})),...t.map((e,t)=>({kind:"extra",index:t}))],properties:e}}async function F(n){const i=t.resolve(n.dirPath,"playwright.config.ts");if(e.existsSync(i))return S.functionIgnoringException("fixPlaywrightConfig",async()=>{await async function(n){for(const r of function(n){const r=[".env",".env.test",".env.example","mise.toml","mise.test.toml"],i=[];for(let s=t.resolve(n);i.push(...r.map(e=>t.resolve(s,e))),!e.existsSync(t.resolve(s,".git"));s=t.dirname(s)){if(t.dirname(s)===s)break}return i}(n))try{const t=await e.promises.readFile(r,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(t))return}catch{}throw new Error("NEXT_PUBLIC_BASE_URL is required for Playwright. Define NEXT_PUBLIC_BASE_URL in the target repo.")}(n.dirPath);const s=await e.promises.readFile(i,"utf8"),o=function(e){const t=r.createSourceFile("playwright.config.ts",e,r.ScriptTarget.Latest,!0,r.ScriptKind.TS);let n;const i=e=>{if(!n){if(r.isCallExpression(e)&&"defineConfig"===e.expression.getText(t)){const t=e.arguments[0];if(t&&r.isObjectLiteralExpression(t))return void(n=t)}r.forEachChild(e,i)}};return i(t),n?{source:t,node:n}:void 0}(s);if(!o)return;const a=R(o.node,o.source);if(!a)return;const c=I(A,a),l=Boolean(n.packageJson?.scripts?.["start-test-server"]),p=Boolean(a.properties.webServer);l||p||delete c.properties.webServer,function(e,t){const n=t.properties.webServer;if("object"!==n?.kind)return;n.value.properties.command=E(e.isBun?"'bun start-test-server'":"'yarn start-test-server'")}(n,c);const d=W({kind:"object",value:c},0),u=o.node.getStart(o.source),m=o.node.getEnd(),f=`${s.slice(0,u)}${d}${s.slice(m)}`;await P.run(()=>$.generateFile(i,f))})}function I(e,t){const n=new Set(Object.keys(t.properties)),r=[...e.extraMembers,...t.extraMembers],i=[...e.memberOrder.filter(e=>"property"!==e.kind||!n.has(e.key)),...t.memberOrder.map(t=>"property"===t.kind?t:{kind:"extra",index:e.extraMembers.length+t.index})],s={...e.properties};for(const[e,n]of Object.entries(t.properties))s[e]=D(s[e],n);return{extraMembers:r,memberOrder:i,properties:s}}function D(e,t){return"object"===e?.kind&&"object"===t.kind?{kind:"object",value:I(e.value,t.value)}:t}function T(e,t){if(r.isObjectLiteralExpression(e)){const n=R(e,t);return n?{kind:"object",value:n}:E(e.getText(t))}if(r.isArrayLiteralExpression(e)){const n=e.elements.map(e=>T(e,t));return n.some(e=>void 0===e)?E(e.getText(t)):{kind:"array",value:n}}return E(e.getText(t))}function R(e,t){const n={extraMembers:[],memberOrder:[],properties:{}};for(const i of e.properties){if(r.isShorthandPropertyAssignment(i)){const e=i.name.getText(t);n.properties[e]=E(e),n.memberOrder.push({kind:"property",key:e});continue}if(!r.isPropertyAssignment(i)||!r.isIdentifier(i.name)&&!r.isStringLiteral(i.name)){const e=n.extraMembers.push(i.getText(t))-1;n.memberOrder.push({kind:"extra",index:e});continue}const e=T(i.initializer,t);if(void 0===e)return;const s=i.name.getText(t);n.properties[s]=e,n.memberOrder.push({kind:"property",key:s})}return n}function W(e,t){const n=" ".repeat(t);if("array"===e.kind){if(0===e.value.length)return"[]";const r=" ".repeat(t+1);return`[\n${e.value.map(e=>{const n=W(e,t+1).split("\n");if(n[n.length-1]=`${n.at(-1)},`,"literal"===e.kind)for(let e=1;e<n.length;e+=1)n[e]=`${r}${n[e]}`;return n[0]=`${r}${n[0]}`,n.join("\n")}).join("\n")}\n${n}]`}if("literal"===e.kind)return e.value;const r=" ".repeat(t+1),i=new Set,s=function(e){const t=new Map;for(const[n,r]of e.entries())"property"===r.kind&&t.set(r.key,n);return t}(e.value.memberOrder),o=e.value.memberOrder.flatMap((n,o)=>{if("extra"===n.kind)return[L(e.value.extraMembers[n.index]??"",r)];if(s.get(n.key)!==o)return[];const a=e.value.properties[n.key];return!a||i.has(n.key)?[]:(i.add(n.key),[N(n.key,a,t,r)])});return o.push(...Object.entries(e.value.properties).filter(([e])=>!i.has(e)).map(([e,n])=>N(e,n,t,r))),0===o.length?`{\n${n}}`:`{\n${o.join("\n")}\n${n}}`}function N(e,t,n,r){const i=W(t,n+1).split("\n");if(i[i.length-1]=`${i.at(-1)},`,"literal"===t.kind)for(let e=1;e<i.length;e+=1)i[e]=`${r}${i[e]}`;return i[0]=`${r}${e}: ${i[0]}`,i.join("\n")}function L(e,t){const n=e.split("\n");n[n.length-1]=`${n.at(-1)},`;for(const[e,r]of n.entries())n[e]=`${t}${r}`;return n.join("\n")}const J=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function M(e){return S.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await o.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:J});for(const r of n){const n=t.resolve(e.dirPath,r),i=(await s.readFile(n,"utf8")).replaceAll(/DATABASE_URL\s*=\s*"?([^"#\n]+?\.sqlite3[^"#\n]*)"?/g,(e,t)=>{if(t.includes("connection_limit=1"))return e;const n=t.includes("?")?"&":"?";return`DATABASE_URL="${t}${n}connection_limit=1"`});await s.writeFile(n,i)}})}const U=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function G(e,t){let n,r,i;"function"==typeof t?r=t:n=t;const s={},o=[...n??[],...Object.keys(e).sort(r)];for(i of o)U(e,i)&&(s[i]=e[i]);return s}const q=/^(?:( )+|\t+)/,z="space";function H(e,t,n){return e&&t===z&&1===n}function Y(e,t){const n=new Map;let r,i,s=0;for(const o of e.split(/\n/g)){if(!o)continue;const e=o.match(q);if(null===e)s=0,r="";else{const o=e[0].length,a=e[1]?z:"tab";if(H(t,a,o))continue;a!==r&&(s=0),r=a;let c=1,l=0;const p=o-s;if(s=o,0===p)c=0,l=1;else{const e=Math.abs(p);if(H(t,a,e))continue;i=K(a,e)}const d=n.get(i);n.set(i,void 0===d?[1,0]:[d[0]+c,d[1]+l])}}return n}function K(e,t){return(e===z?"s":"t")+String(t)}function V(e){if("string"!=typeof e)throw new TypeError("Expected a string");let t=Y(e,!0);0===t.size&&(t=Y(e,!1));const n=function(e){let t,n=0,r=0;for(const[i,[s,o]]of e)(s>n||s===n&&o>r)&&(n=s,r=o,t=i);return t}(t);let r,i=0,s="";var o;return void 0!==n&&(({type:r,amount:i}={type:"s"===(o=n)[0]?z:"tab",amount:Number(o.slice(1))}),s=function(e,t){return(e===z?" ":"\t").repeat(t)}(r,i)),{amount:i,type:r,indent:s}}function X(e){return"string"==typeof e&&function(e){if("string"!=typeof e)throw new TypeError("Expected a string");const t=e.match(/(?:\r?\n)/g)||[];if(0===t.length)return;const n=t.filter(e=>"\r\n"===e).length;return n>t.length-n?"\r\n":"\n"}(e)||"\n"}const Z=e=>(t,...n)=>e.reduce((e,t)=>t(e,...n),t),Q=e=>t=>Array.isArray(t)?e(t):t,ee=e=>t=>Array.isArray(t)&&t.every(e=>"string"==typeof e)?e(t):t,te=ee(e=>[...new Set(e)]),ne=ee(e=>e.toSorted()),re=Z([te,ne]),ie=e=>(t,...n)=>function(e){if("object"!=typeof e||null===e)return!1;const t=Object.getPrototypeOf(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)}(t)?e(t,...n):t,se=(e,t)=>{const n=ie(r=>(t&&(r=Object.fromEntries(Object.entries(r).map(([e,t])=>[e,n(t)]))),G(r,e)));return n},oe=Object.groupBy||((e,t)=>{const n=Object.create(null);for(const r of e){const e=t(r);n[e]?n[e].push(r):n[e]=[r]}return n}),ae=se(),ce=se(["type","url"]),le=se(["name","email","url"]),pe=se(["lib","bin","man","doc","example","test"]),de=(e,t)=>ie((n,...r)=>Object.hasOwn(n,e)?{...n,[e]:t(n[e],...r)}:n),ue=se(["applypatch-msg","pre-applypatch","post-applypatch","pre-commit","pre-merge-commit","prepare-commit-msg","commit-msg","post-commit","pre-rebase","post-checkout","post-merge","pre-push","pre-receive","update","proc-receive","post-receive","post-update","reference-transaction","push-to-checkout","pre-auto-gc","post-rewrite","sendemail-validate","fsmonitor-watchman","p4-changelist","p4-prepare-changelist","p4-post-changelist","p4-pre-submit","post-index-change"]),me=e=>{const[t]=e.split(">"),n=[...t.matchAll("@")];if(!n.length||1===n.length&&0===n[0].index)return{name:e};const r=n.pop().index;return{name:t.substring(0,r),range:t.substring(r+1)}},fe=se((e,t)=>{const{name:n,range:r}=me(e),{name:i,range:s}=me(t);return n!==i?n.localeCompare(i,"en"):r?s?a(c(r),c(s)):1:-1}),ge=e=>{const t=e.indexOf("@",e.startsWith("@")?1:0);return-1===t?e:e.slice(0,t)},ye=new Map;function he(t){return"string"==typeof t.packageManager?t.packageManager.startsWith("npm@"):t.devEngines?.packageManager?.name?"npm"===t.devEngines.packageManager.name:!t.pnpm&&(!!t.engines?.npm||!(()=>{const t=process.cwd();return ye.has(t)||ye.set(t,e.existsSync("yarn.lock")||e.existsSync(".yarn/")||e.existsSync(".yarnrc.yml")||e.existsSync("pnpm-lock.yaml")||e.existsSync("pnpm-workspace.yaml")),ye.get(t)})())}const we=ie((e,t)=>Object.keys(e).length<2?e:he(t)?G(e,(e,t)=>e.localeCompare(t,"en")):G(e)),be=Z([se(["packages","catalog"]),de("packages",re),de("catalog",we)]),ve=Z([se(["files","excludedFiles","env","parser","parserOptions","settings","plugins","extends","rules","overrides","globals","processor","noInlineConfig","reportUnusedDisableDirectives"]),de("env",ae),de("globals",ae),de("overrides",Q(e=>e.map(ve))),de("parserOptions",ae),de("rules",se((e,t)=>e.split("/").length-t.split("/").length||e.localeCompare(t))),de("settings",ae)]),ke=se(["description","url","href"]),xe=Z([ie(e=>G(e,[...Object.keys(e).filter(e=>"overrides"!==e).sort(),"overrides"])),de("overrides",Q(e=>e.map(Z([ae,de("options",ae)]))))]),_e=se(["node","npm","yarn"]),je=de("packageManager",se(["name","version","onFail"])),Se=Z([se(["peerDependencyRules","neverBuiltDependencies","onlyBuiltDependencies","onlyBuiltDependenciesFile","allowedDeprecatedVersions","allowNonAppliedPatches","updateConfig","auditConfig","requiredScripts","supportedArchitectures","overrides","patchedDependencies","packageExtensions"],!0),de("overrides",fe)]),$e=new Set(["install","pack","prepare","publish","restart","shrinkwrap","start","stop","test","uninstall","version"]),Pe=(e,t)=>Object.hasOwn(t,"devDependencies")&&Object.hasOwn(t.devDependencies,e),Oe=/(?<=^|[\s&;<>|(])(?:run-s|npm-run-all2? .*(?:--sequential|--serial|-s))(?=$|[\s&;<>|)])/,Ee=e=>{if(!Pe("npm-run-all",e)&&!Pe("npm-run-all2",e))return!1;return["scripts","betterScripts"].flatMap(t=>e[t]?Object.values(e[t]):[]).some(e=>{return(t=e).includes("*")&&Oe.test(t);var t})};function Ce(e,t=""){const n=new Map;for(const r of e){const e=(t?r.slice(t.length+1):r).indexOf(":");if(e>0){const i=r.slice(0,(t?t.length+1:0)+e);n.has(i)||n.set(i,[]),n.get(i).push(r)}else n.has(r)||n.set(r,[]),n.get(r).push(r)}return Array.from(n.keys()).sort().flatMap(e=>{const t=n.get(e);if(t.length>1&&t.some(t=>t!==e&&t.startsWith(e+":"))){return[...t.filter(t=>t===e||!t.startsWith(e+":")).sort(),...Ce(t.filter(t=>t.startsWith(e+":")),e)]}return t.sort()})}const Ae=ie((e,t)=>{let n=Object.keys(e);const r=new Set;return n=n.map(e=>{const t=e.replace(/^(?:pre|post)/,"");return $e.has(t)||n.includes(t)?(r.add(t),t):e}),Ee(t)||(n=Ce(n)),n=n.flatMap(e=>r.has(e)?[`pre${e}`,e,`post${e}`]:[e]),G(e,n)}),Be=e=>{const{defaultConditions:t=[],restConditions:n=[]}=oe(e,e=>"default"===e?"defaultConditions":"restConditions");return[...n,...t]},Fe=ie(e=>{const{paths:t=[],conditions:n=[]}=oe(Object.keys(e),e=>e.startsWith(".")?"paths":"conditions");return Object.fromEntries([...t,...Be(n)].map(t=>[t,Fe(e[t])]))}),Ie=[{key:"$schema"},{key:"name"},{key:"displayName"},{key:"version"},{key:"stableVersion"},{key:"private"},{key:"description"},{key:"categories",over:te},{key:"keywords",over:te},{key:"homepage"},{key:"bugs",over:se(["url","email"])},{key:"repository",over:ce},{key:"funding",over:ce},{key:"license",over:ce},{key:"qna"},{key:"author",over:le},{key:"maintainers",over:Q(e=>e.map(le))},{key:"contributors",over:Q(e=>e.map(le))},{key:"publisher"},{key:"sideEffects"},{key:"type"},{key:"imports"},{key:"exports",over:Fe},{key:"main"},{key:"svelte"},{key:"umd:main"},{key:"jsdelivr"},{key:"unpkg"},{key:"module"},{key:"source"},{key:"jsnext:main"},{key:"browser"},{key:"react-native"},{key:"types"},{key:"typesVersions"},{key:"typings"},{key:"style"},{key:"example"},{key:"examplestyle"},{key:"assets"},{key:"bin",over:ae},{key:"man"},{key:"directories",over:pe},{key:"files",over:te},{key:"workspaces",over:be},{key:"binary",over:se(["module_name","module_path","remote_path","package_name","host"])},{key:"scripts",over:Ae},{key:"betterScripts",over:Ae},{key:"l10n"},{key:"contributes",over:ae},{key:"activationEvents",over:te},{key:"husky",over:de("hooks",ue)},{key:"simple-git-hooks",over:ue},{key:"pre-commit"},{key:"commitlint",over:ae},{key:"lint-staged"},{key:"nano-staged"},{key:"config",over:ae},{key:"nodemonConfig",over:ae},{key:"browserify",over:ae},{key:"babel",over:ae},{key:"browserslist"},{key:"xo",over:ae},{key:"prettier",over:xe},{key:"eslintConfig",over:ve},{key:"eslintIgnore"},{key:"npmpkgjsonlint",over:ae},{key:"npmPackageJsonLintConfig",over:ae},{key:"npmpackagejsonlint",over:ae},{key:"release",over:ae},{key:"remarkConfig",over:ae},{key:"stylelint"},{key:"ava",over:ae},{key:"jest",over:ae},{key:"jest-junit",over:ae},{key:"jest-stare",over:ae},{key:"mocha",over:ae},{key:"nyc",over:ae},{key:"c8",over:ae},{key:"tap",over:ae},{key:"oclif",over:se(void 0,!0)},{key:"resolutions",over:ae},{key:"overrides",over:we},{key:"dependencies",over:we},{key:"devDependencies",over:we},{key:"dependenciesMeta",over:se((e,t)=>{const n=ge(e),r=ge(t);return n<r?-1:n>r?1:0},!0)},{key:"peerDependencies",over:we},{key:"peerDependenciesMeta",over:se(void 0,!0)},{key:"optionalDependencies",over:we},{key:"bundledDependencies",over:re},{key:"bundleDependencies",over:re},{key:"extensionPack",over:re},{key:"extensionDependencies",over:re},{key:"flat"},{key:"packageManager"},{key:"engines",over:ae},{key:"engineStrict",over:ae},{key:"devEngines",over:je},{key:"volta",over:_e},{key:"languageName"},{key:"os"},{key:"cpu"},{key:"preferGlobal",over:ae},{key:"publishConfig",over:ae},{key:"icon"},{key:"badges",over:Q(e=>e.map(ke))},{key:"galleryBanner",over:ae},{key:"preview"},{key:"markdown"},{key:"pnpm",over:Se}],De=Ie.map(({key:e})=>e),Te=Z(Ie.map(({key:e,over:t})=>t?de(e,t):void 0).filter(Boolean));function Re(e,t={}){return function(e,t){if("string"==typeof e){const{indent:n,type:r}=V(e),i="\n"===e.slice(-1)?"\n":"",s=X(e);e=JSON.parse(e);let o=JSON.stringify(t(e),null,"tab"===r?"\t":n)+i;return"\r\n"===s&&(o=o.replace(/\n/g,s)),o}return t(e)}(e,ie(e=>{let n=t.sortOrder||De;if(Array.isArray(n)){const t=Object.keys(e),{privateKeys:r=[],publicKeys:i=[]}=oe(t,e=>"_"===e[0]?"privateKeys":"publicKeys");n=[...n,...De,...i.sort(),...r.sort()]}return Te(G(e,n),e)}))}async function We(n){return S.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const r=t.join(n,"package.json");if(!e.existsSync(r))return;const i=t.join(n,"test");for(const s of["__tests__","tests"]){const o=t.join(n,s);try{await Ne(o,i);const t=JSON.parse(await e.promises.readFile(r,"utf8"));let n=!1;const a=t.scripts??{};for(const[e,t]of Object.entries(a)){const r=t.replaceAll(s,"test");t!==r&&(a[e]=r,n=!0)}if(t.scripts=a,!n)return;await $.generateFile(r,JSON.stringify(Re(t),void 0,2))}catch{}}}))})}async function Ne(n,r){if(!e.existsSync(r))return void await e.promises.rename(n,r);const i=await e.promises.readdir(n,{withFileTypes:!0});await Promise.all(i.map(async i=>{const s=t.join(n,i.name),o=t.join(r,i.name),a=e.existsSync(o)?await e.promises.stat(o):void 0;i.isDirectory()&&a?.isDirectory()?await Ne(s,o):await e.promises.rename(s,o)})),await e.promises.rm(n,{recursive:!0})}async function Le(e,n){return S.functionIgnoringException("fixTypeDefinitions",async()=>{const r=t.resolve(e.dirPath,"@types"),i=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),o=await _(()=>s.readdir(r,{withFileTypes:!0}));if(o)for(const e of o){const o=e.name.slice(0,-5),a=e.name.endsWith(".d.ts");let c=a?o:e.name;c.includes("__")&&(c=`@${c.replace("__","/")}`);const l=n.some(e=>e.packageJson?.dependencies?.[c]||e.packageJson?.devDependencies?.[c]);e.isFile()&&a?l?(await s.mkdir(t.join(r,o),{recursive:!0}),await P.run(()=>s.rename(t.join(r,e.name),t.join(r,o,"index.d.ts")))):i&&(await s.mkdir(i,{recursive:!0}),await P.run(()=>s.rename(t.join(r,e.name),t.join(i,e.name)))):e.isDirectory()&&i&&!l&&(await s.mkdir(i,{recursive:!0}),await P.run(()=>_(()=>s.rename(t.join(r,e.name,"index.d.ts"),t.join(i,`${e.name}.d.ts`)))))}})}function Je(e,t){return t}function Me(e,t,n){const r=[...e];for(const[i,s]of t.entries())void 0===r[i]?r[i]=Ue(s,n):Ge(e[i],n)&&Ge(s,n)?r[i]=l(e[i],s,n):e.includes(s)||r.push(s);return r}function Ue(e,t){return Ge(e,t)?t.cloneUnlessOtherwiseSpecified(e,t):e}function Ge(e,t){return!!e&&"object"==typeof e&&t.isMergeableObject(e)}function qe(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,r]of t)delete e[n],e[n]=r,r&&"object"==typeof r&&!Array.isArray(r)&&qe(r);return e}const ze={name:"autofix.ci",on:{pull_request:null,push:{branches:["main"]}},permissions:{contents:"read"},concurrency:{group:"autofix-${{ github.head_ref }}","cancel-in-progress":!0},jobs:{autofix:{"runs-on":"ubuntu-latest"}}},He={name:"Fix code automatically",on:{pull_request:null},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{autofix:{uses:"WillBooster/reusable-workflows/.github/workflows/autofix.yml@main"}}},Ye={test:{name:"Test",on:{pull_request:null,push:{branches:["main","wbfy"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:"write"},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{"id-token":"write",contents:"write"},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},permissions:{contents:"write"},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"gen-pr-claude":{name:"Generate PR with Claude Code",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-claude')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"claude-code","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{CLAUDE_CODE_OAUTH_TOKEN:"${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}"}}}},"gen-pr-codex":{name:"Generate PR with Codex CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-codex')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"codex-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{OPENAI_API_KEY:"${{ secrets.OPENAI_API_KEY }}"}}}},"gen-pr-gemini":{name:"Generate PR with Gemini CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-gemini')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"gemini-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{GEMINI_API_KEY:"${{ secrets.GEMINI_API_KEY }}"}}}}};async function Ke(n){return S.functionIgnoringException("generateWorkflow",async()=>{if(Ve(n.repository))return;const r=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(r,{recursive:!0});const i=t.resolve(n.dirPath,".github","semantic.yml");await P.run(()=>e.promises.rm(i,{force:!0,recursive:!0}));const s=await e.promises.readdir(r,{withFileTypes:!0}),o=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml","gen-pr-claude.yml","gen-pr-codex.yml","gen-pr-gemini.yml",...s.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&o.add("release.yml");for(const e of o){const i=t.basename(e,".yml");await P.run(()=>Xe(n,r,i))}})}function Ve(e){return e?.endsWith("/reusable-workflows")??!1}async function Xe(n,r,i){const s=t.join(r,`${i}.yml`),o=e.existsSync(t.join(r,"deploy-production.yml"));if("autofix"===i)return void await Qe(function(e){if(!e.isPublicRepo)return structuredClone(He);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0,"node-version":"lts/*"}},...e.isBun?[{uses:"oven-sh/setup-bun@v1",with:{"bun-version":"latest"}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`});n.push({uses:"autofix-ci/action@v1"});const r=structuredClone(ze),i=r.jobs.autofix??{"runs-on":"ubuntu-latest"};return r.jobs.autofix={...i,steps:n},r}(n),s);let a=structuredClone(i in Ye?Ye[i]:{});try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);a=l.all([a,n,a],{arrayMerge:Me})}catch{}if(!("jobs"in a))return;i.startsWith("deploy")&&(a={...a,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(a,"jobs"),a.on?.push&&(a.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...a.on.push["paths-ignore"]??[]])])),"release"===i&&a.jobs.release&&o&&(a.permissions??={},a.permissions.actions="write",a.jobs.release.with??={},a.jobs.release.with.trigger_deploy_workflow="deploy-production.yml");let c=!1;for(const e of Object.values(a.jobs))e.uses?.includes("/reusable-workflows/")&&(Ze(n,e,i),c=!0);if(c){switch(i){case"release":if(a.on?.schedule)delete a.on.push;else{if(!(a.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(r,"release.yml"),{force:!0});a.on.push.branches=n.release.branches}n.isPublicRepo?(a.permissions??={},a.permissions["id-token"]="write"):delete a.permissions?.["id-token"];break;case"test":a.on?.pull_request&&delete a.on.pull_request["paths-ignore"],a.on?.push&&(delete a.on.push["paths-ignore"],a.on.push.branches=a.on.push.branches.filter(e=>"renovate/**"!==e))}if(await Qe(a,s),"sync"===i){if(await e.promises.rm(t.join(r,"sync-init.yml"),{force:!0}),!a.jobs.sync?.with)return;a.jobs["sync-force"]=a.jobs.sync;const n=a.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;a.jobs.sync.with.sync_params_without_dest=`--force ${n}`,a.name="Force to Sync",a.on={workflow_dispatch:null},delete a.jobs.sync,await Qe(a,t.join(r,"sync-force.yml"))}}}function Ze(e,t,n){if(t.with??={},t.secrets??={},delete t.secrets.NPM_TOKEN,"test"!==n&&"release"!==n&&"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.with["test-command"]=e.isBun?"bun run check-all-for-ai":"yarn check-all-for-ai"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with.sync_params_without_dest;"string"==typeof e&&(t.with.sync_params_without_dest=e.replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses?.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses?.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&"string"==typeof t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,"")),e.doesContainDockerfile&&!t.with.ci_label&&n.startsWith("test")&&(t.with.ci_label="large"),"release"===n||"test"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?qe(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=qe(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function Qe(t,n){const r=p.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}).replaceAll(/[ \t]+$/gm,"");await e.promises.writeFile(n,r)}async function et(n){return S.functionIgnoringException("fixTypos",async()=>{if(Ve(n.repository))return;const r=n.dirPath,i=await o.glob("**/*.md",{dot:!0,cwd:r,ignore:J});j.isVerbose&&console.info(`Found ${i.length} markdown files in ${r}`);for(const s of i){const i=t.join(r,s);P.run(async()=>{const t=await e.promises.readFile(i,"utf8");let r=tt(t);r=nt(r,n,"doc"),t!==r&&await $.generateFile(i,r)})}const s=await o.glob(["{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:r,ignore:J});j.isVerbose&&console.info(`Found ${s.length} TypeScript files in ${r}`);for(const i of s){const s=t.join(r,i);P.run(async()=>{const t=await e.promises.readFile(s,"utf8");let r=t.replaceAll(/\/\*[\s\S]*?\*\//g,e=>tt(e)).replaceAll(/(^|\s)\/\/(.*?)c\.f\./g,"$1//$2cf.").replaceAll(/(^|\s)\/\/(.*?)eg\./g,"$1//$2e.g.").replaceAll(/(^|\s)\/\/(.*?)ie\./g,"$1//$2i.e.");r=nt(r,n,"ts"),t!==r&&await $.generateFile(s,r)})}const a=await o.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:r,ignore:J});j.isVerbose&&console.info(`Found ${a.length} text-based files in ${r}`);for(const i of a){const s=t.join(r,i);P.run(async()=>{const t=await e.promises.readFile(s,"utf8");let r=tt(t);r=nt(r,n,"text"),t!==r&&await $.generateFile(s,r)})}await P.promiseAll()})}function tt(e){return e.replaceAll(/\bc\.f\.(?=\s|$)/g,"cf.").replaceAll(/\beg\.(?=\s|$)/g,"e.g.").replaceAll(/\bie\.(?=\s)/g,"i.e.")}function nt(e,t,n){for(const[n,r]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,r);for(const[r,i]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(r,i);return e}async function rt(e,n){return S.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const r=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),i=await $.readFileIgnoringError(r);for(const[r,s]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const o=it(e,n,s,i),a=t.resolve(e.dirPath,r);await P.run(()=>$.generateFile(a,o))}const s=t.resolve(e.dirPath,".cursor/rules/general.mdc"),o=function(e,t,n){const r="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",i=it(e,t,"Cursor",n);return`${r}\n\n${i}`}(e,n,i);await P.run(()=>$.generateFile(s,o))})}function it(e,t,n,r){const i=e.isBun?"bun":"yarn",s=`\n## Project Information\n\n- Name: \`${e.packageJson?.name||"unknown"}\`\n- Description: ${e.packageJson?.description}\n- Package Manager: ${i}\n\n## General Instructions\n\n- Create a new branch if the current branch is \`main\`.\n- Run any \`git\` commands sequentially.\n- Write tests ONLY if explicitly requested. If requested, follow these rules:\n - Continue modifying the tests and code until all tests pass.\n - Ensure tests reset any related persistent data, as our test infrastructure does not clear it automatically.\n - Prefer actual API calls over mocks. Use mocks when actual calls are impractical, have unintended side effects, or are explicitly requested.\n- When fixing issues, follow these rules:\n - Investigate the root cause first (e.g., by gathering debug logs, taking screenshots, etc.).\n - Fix the actual root cause instead of applying workarounds.\n- After making code changes, run \`${i} check-all-for-ai\` to execute all tests (takes up to 1 hour), or \`${i} check-for-ai\` for only type checking and linting (takes up to 10 minutes).\n - If you are confident that your changes will not break any tests, you may use \`check-for-ai\`.\n - Use \`oxlint\` ignore comments with reasons (e.g., \`// oxlint-disable-next-line no-console --- <reason>\`) if lint errors or warnings cannot be fixed.\n- Once you have verified your changes, commit and push them to the current (non-main) branch, then create a PR via \`gh\`.\n - Follow the conventional commits; your commit message should start with \`feat:\`, \`fix:\`, etc.\n - If not specified, make sure to add a new line at the end of your commit message${e.isWillBoosterRepo?` with: \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\``:""}.\n - Always create new commits. Avoid using \`--amend\`.\n${t.some(e=>e.hasStartTestServer)?`- Use \`${i} run start-test-server\` to launch a web server for debugging or testing.`:""}\n\n${st(t)}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim(),o=r?.trim().startsWith("#");return s+(r?o?"\n\n"+r.trim():"\n"+r:"")}function st(e){return`\n## Coding Style\n\n- Use camelCase for JavaScript and TypeScript files (or PascalCase for React components).\n- Simplify code as much as possible to eliminate redundancy.\n- Design each module with high cohesion, grouping related functionality together.\n - Refactor existing large modules into smaller, focused modules when necessary.\n - Create well-organized directory structures with low coupling and high cohesion.\n- Place calling functions in the file above the functions they call to maintain a clear top-down order.\n - e.g. \`function caller() { callee(); } function callee() { ... }\`\n- Write comments that explain "why" rather than "what". Avoid stating what can be understood from the code itself.\n- Prefer \`undefined\` over \`null\` unless explicitly required by APIs or libraries.\n- Prefer using a single template literal for prompts instead of \`join()\` with an array of strings.\n${e.some(e=>e.depending.genI18nTs)?'- When introducing new string literals in React components, update the language resource files in the `i18n` directory (e.g., `i18n/ja-JP.json`). Reference these strings using the `i18n` utility. For example, use `i18n.pages.home.title()` for `{ "pages": { "home": { "title": "My App" } } }`.':""}\n${e.some(e=>e.depending.react||e.depending.next)?"- Prefer `useImmer` for storing an array or an object to `useState`.":""}\n${e.some(e=>e.depending.next)?"\n- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.\n- Assume there is only a single server instance.\n":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim()}const ot=["@exercode/problem-utils","@willbooster/agent-skills","@willbooster/babel-configs","@willbooster/oxfmt-config","@willbooster/oxlint-config","@willbooster/prettier-config","@willbooster/renovate-config","@willbooster/shared-lib","@willbooster/shared-lib-blitz-next","@willbooster/shared-lib-next","@willbooster/shared-lib-node","@willbooster/shared-lib-react","@willbooster/wb","agent-runtime-kit","one-way-git-sync","@typescript/native-preview","@typescript/native-preview-darwin-arm64","@typescript/native-preview-darwin-x64","@typescript/native-preview-linux-arm","@typescript/native-preview-linux-arm64","@typescript/native-preview-linux-x64","@typescript/native-preview-win32-arm64","@typescript/native-preview-win32-x64","oxfmt","@oxfmt/binding-android-arm-eabi","@oxfmt/binding-android-arm64","@oxfmt/binding-darwin-arm64","@oxfmt/binding-darwin-x64","@oxfmt/binding-freebsd-x64","@oxfmt/binding-linux-arm-gnueabihf","@oxfmt/binding-linux-arm-musleabihf","@oxfmt/binding-linux-arm64-gnu","@oxfmt/binding-linux-arm64-musl","@oxfmt/binding-linux-ppc64-gnu","@oxfmt/binding-linux-riscv64-gnu","@oxfmt/binding-linux-riscv64-musl","@oxfmt/binding-linux-s390x-gnu","@oxfmt/binding-linux-x64-gnu","@oxfmt/binding-linux-x64-musl","@oxfmt/binding-openharmony-arm64","@oxfmt/binding-win32-arm64-msvc","@oxfmt/binding-win32-ia32-msvc","@oxfmt/binding-win32-x64-msvc","oxlint","@oxlint/binding-android-arm-eabi","@oxlint/binding-android-arm64","@oxlint/binding-darwin-arm64","@oxlint/binding-darwin-x64","@oxlint/binding-freebsd-x64","@oxlint/binding-linux-arm-gnueabihf","@oxlint/binding-linux-arm-musleabihf","@oxlint/binding-linux-arm64-gnu","@oxlint/binding-linux-arm64-musl","@oxlint/binding-linux-ppc64-gnu","@oxlint/binding-linux-riscv64-gnu","@oxlint/binding-linux-riscv64-musl","@oxlint/binding-linux-s390x-gnu","@oxlint/binding-linux-x64-gnu","@oxlint/binding-linux-x64-musl","@oxlint/binding-openharmony-arm64","@oxlint/binding-win32-arm64-msvc","@oxlint/binding-win32-ia32-msvc","@oxlint/binding-win32-x64-msvc","oxlint-tsgolint","@oxlint-tsgolint/darwin-arm64","@oxlint-tsgolint/darwin-x64","@oxlint-tsgolint/linux-arm64","@oxlint-tsgolint/linux-x64","@oxlint-tsgolint/win32-arm64","@oxlint-tsgolint/win32-x64","@next/env","@next/font","@next/rspack-binding-linux-arm64-gnu","@next/rspack-binding-linux-arm64-musl","@next/rspack-binding-linux-x64-gnu","@next/rspack-binding-linux-x64-musl","@next/swc-android-arm-eabi","@next/swc-android-arm64","@next/swc-darwin-arm64","@next/swc-darwin-x64","@next/swc-freebsd-x64","@next/swc-linux-arm-gnueabihf","@next/swc-linux-arm64-gnu","@next/swc-linux-arm64-musl","@next/swc-linux-x64-gnu","@next/swc-linux-x64-musl","@next/swc-wasm-nodejs","@next/swc-wasm-web","@next/third-parties","next","react","react-dom"];async function at(n){return S.functionIgnoringException("generateBunfigToml",async()=>{const r=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(r)?e.readFileSync(r,"utf8"):void 0,s=ct(i);await P.run(()=>$.generateFile(r,s))})}const ct=e=>{const t=function(e){if(!e)return;try{return d(e)}catch{return}}(e);return`env = false\ntelemetry = false\n\n${function(e){return"boolean"==typeof e?.run?.bun?`[run]\nbun = ${e.run.bun}\n`:""}(t)}\n[install]\nexact = ${!1===t?.install?.exact?"false":"true"}\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n${ot.map(e=>` "${e}",`).join("\n")}\n]\n`};const lt="# Project-specific settings",pt=/# Project-specific settings[^\n]*\n/gm,dt="# Generated by wbfy",ut=`${lt} (head)\n\n\n${dt}\n`,mt=`\n${lt} (tail)\n`,ft={separator:dt,separatorPrefix:"# Generated by ",defaultHeadUserContent:ut,defaultTailUserContent:mt,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const r=gt(n);return r>0&&(n=n.slice(0,r-1)),n.replaceAll(pt,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return-1!==t?e.slice(0,e.indexOf("\n",t)+1).replaceAll(pt,`${lt} (head)\n`):ut},getTailUserContent(e){const t=gt(e);return t>0?e.slice(t-1):mt},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function gt(e){const t=e.indexOf(lt),n=e.lastIndexOf(lt);return n>t?n:-1}async function yt(n){return S.functionIgnoringException("generateDockerignore",async()=>{const r=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await $.readFileIgnoringError(r)??"",t=ft.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+ft.getTailUserContent(e);await P.run(()=>$.generateFile(r,t))}else await e.promises.rm(r,{force:!0})})}const ht={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].toSorted(),codeWith4IndentSize:["go","gradle","java","py"].toSorted(),markdownLike:["md"].toSorted(),oxlint:["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"].toSorted(),oxfmt:["astro","cjs","css","cts","gql","graphql","hbs","htm","html","js","json","json5","jsonc","jsx","less","md","mdx","mjs","mts","scss","svelte","toml","ts","tsx","vue","yaml","yml"].toSorted(),prettierOnly:["java"].toSorted()},wt=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${vt(ht.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${vt(ht.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${vt(ht.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function bt(e){return S.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await P.run(()=>$.generateFile(n,wt))})}function vt(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}const kt={have_fun:!0,code_review:{disable:!1,comment_severity_threshold:"MEDIUM",max_review_comments:-1,pull_request_opened:{help:!1,summary:!0,code_review:!0}},ignore_patterns:["**/__generated__"]};async function xt(n,r){return S.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),s=t.resolve(i,"config.yml"),o=t.resolve(i,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let c=structuredClone(kt);try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);c=l.all([c,n,c],{arrayMerge:Je})}catch{}const d=p.dump(c,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),u=await $.readFileIgnoringError(a),m=u?.trimStart().startsWith("#")?void 0:u,f=`${n.isPublicRepo?"Review in English based on the following coding standards.":"以下のコーディング規約を踏まえて、日本語でレビューしてください。"}\n\n${st(r)}${m?`\n${m.trimEnd()}`:""}`,g=[P.run(()=>$.generateFile(s,d)),P.run(()=>$.generateFile(o,f))];await Promise.all(g)})}async function _t(n){return S.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const r=t.resolve(n.dirPath,".gemini"),i=t.resolve(r,"settings.json");await e.promises.rm(i,{force:!0})})}const jt=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...ht.codeWith2IndentSize,...ht.codeWith4IndentSize,...ht.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function St(e){return S.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await P.run(()=>$.generateFile(n,jt))})}const $t=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Pt(e,n){return S.functionIgnoringException("generateGitignore",async()=>{const r=t.resolve(e.dirPath,".gitignore"),i=await $.readFileIgnoringError(r)??"";let s=ft.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n*/mount/*.hash\n.devcontainer/\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot.*\n.idea/copilot/chatSessions/\n.playwright-cli/\n.serena/\n.tmp/\n__generated__/\n@willbooster/\ndist/\ntemp/\ntmp/\n";const o=ft.getTailUserContent(i),a=[...$t];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),s+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),s+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),s+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(s+=".aws-sam/\npackaged.yaml\n"),e.doesContainPoetryLock&&(a.push("python"),s+=".venv/\n"),e.depending.blitz&&(s+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(s+="*.sqlite3*\n"),e.depending.playwrightTest&&(s+="playwright-report/\ntest-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),s+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(s+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Ct(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,r=await fetch(n),i=await r.text();if(!r.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await P.run(()=>Et(e,t)),j.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await ft.isBerryZeroInstallEnabled(r)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=s+"\n"+c+o;await P.run(()=>$.generateFile(r,l))})}const Ot=t.join(u.homedir(),".cache","wbfy","gitignore");async function Et(n,r){await e.promises.mkdir(Ot,{recursive:!0}),await e.promises.writeFile(t.join(Ot,n),r)}async function Ct(n){try{const r=await e.promises.stat(t.join(Ot,n));if(Date.now()-r.mtimeMs>216e5)return;return await e.promises.readFile(t.join(Ot,n),"utf8")}catch{}}function At(e){return e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages}async function Bt(n){return S.functionIgnoringException("generateIdeaSettings",async()=>{const r=t.resolve(n.dirPath,".idea");if(e.existsSync(r)){const i=t.resolve(r,"watcherTasks.xml");await(At(n)?P.run(()=>$.generateFile(i,It)):P.run(()=>e.promises.rm(i,{force:!0})))}})}function Ft(e,t,n,r){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${r}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${r})" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="${e}" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n`}const It=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ht.oxfmt.map(e=>Ft("node","node_modules/.bin/oxfmt --write --no-error-on-unmatched-pattern","Oxfmt",e)).join("")}\n${ht.prettierOnly.map(e=>Ft("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`;function Dt(e,t,n,r=0){Tt(e,t,n,r)}function Tt(e,t,n,r=0){do{const[i,s,o]=Wt(e,t,n),a=m.spawnSync(i,s,o).status??1;if(0===a)break;if(r<=0)return a}while(--r>=0);return 0}function Rt(e,t,n){const[r,i,s]=Wt(e,t,n);s.stdio="pipe";const o=m.spawnSync(r,i,s),a=o.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();o.error?console.error(`${r} [${i.map(e=>`"${e}"`).join(", ")}] failed with: ${o.error.message}`):c&&console.error(`${r} [${i.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${c}`);const l=o.stdout??"";return"string"==typeof l?l.trim():l.toString().trim()}function Wt(e,t,n){const r={...process.env};return r.PATH&&r.BERRY_BIN_FOLDER&&(r.PATH=r.PATH.split(":").filter(e=>e!==r.BERRY_BIN_FOLDER).join(":")),[e,t,{cwd:n,env:r,encoding:"utf8",shell:!1,stdio:"inherit"}]}const Nt=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},Lt=new Map;function Jt(e){const t=e??"",n=Lt.get(t);if(n)return n;const r=new f({auth:Ut(e)||void 0});return Lt.set(t,r),r}function Mt(e){return!!Ut(e)}function Ut(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER:"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB:process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN}const Gt=["@willbooster/oxfmt-config","@willbooster/oxlint-config","oxfmt","oxlint","oxlint-tsgolint"],qt="@typescript/native-preview",zt=["@biomejs/biome","@eslint-react/eslint-plugin","@eslint/js","@next/eslint-plugin-next","@types/eslint","@types/micromatch","@typescript-eslint/eslint-plugin","@typescript-eslint/parser","@willbooster/biome-config","@willbooster/eslint-config","@willbooster/eslint-config-blitz-next","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-react","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","biome","eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-import-resolver-node","eslint-import-resolver-typescript","eslint-plugin-import","eslint-plugin-import-x","eslint-plugin-perfectionist","eslint-plugin-prettier","eslint-plugin-react-compiler","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-storybook","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals","micromatch","typescript-eslint"],Ht=new Map;async function Yt(n,r,i){return S.functionIgnoringException("generatePackageJson",async()=>{await async function(n,r,i){const s=t.resolve(n.dirPath,"package.json"),a=await async function(t){const n=await e.promises.readFile(t,"utf8"),r=JSON.parse(n);return r.scripts=r.scripts??{},r.dependencies=r.dependencies??{},r.devDependencies=r.devDependencies??{},r.peerDependencies=r.peerDependencies??{},r}(s),c=n.isBun?"bun":"yarn";await async function(n,r){"WillBooster LLC"===n.author&&(n.author="WillBooster Inc.");delete n.scripts["sort-package-json"],delete n.scripts["sort-all-package-json"],delete n.scripts["typecheck/warn"],delete n.scripts["typecheck:gen-code"],delete n.scripts["typecheck:codegen"],delete n.dependencies.tslib,delete n.devDependencies["@willbooster/renovate-config"],delete n.devDependencies["@willbooster/tsconfig"],delete n.devDependencies.typescript,delete n.devDependencies.lerna,delete n.devDependencies.pinst,delete n.scripts["flutter-format"],delete n.scripts["format-flutter"],delete n.scripts["python-format"],delete n.scripts["format-python"],delete n.scripts.prettier,delete n.scripts["check-all"],await P.run(()=>e.promises.rm(t.resolve(r,"lerna.json"),{force:!0})),function(e){for(const t of zt)delete e.dependencies[t],delete e.devDependencies[t],delete e.peerDependencies[t]}(n)}(a,n.dirPath),await async function(n,r,i){(function(e){for(const[t,n]of Object.entries(e))"string"==typeof n&&(n.includes("git clone")||(e[t]=n.replaceAll(/yarn\s*(?:install\s*)?&&\s*/gu,"")))})(r.scripts),r.scripts={...r.scripts,...tn(n,r.scripts)},function(e,t){if(!e.depending.playwrightTest||!e.depending.wb||t.scripts?.["start-test-server"])return;t.scripts??={},t.scripts["start-test-server"]="wb start --mode test"}(n,r),function(e,t){if(!("check-for-ai"in e))return;"gen-code"in e&&(e["check-for-ai"]=`${t} gen-code > /dev/null && ${e["check-for-ai"]}`);e["check-for-ai"]=`${t} install > /dev/null && ${e["check-for-ai"]}`}(r.scripts,i),n.isBun?delete r.scripts.prettify:r.scripts.prettify=(r.scripts.prettify??"")+await async function(n){const r=t.resolve(n,".prettierignore"),i=await e.promises.readFile(r,"utf8"),s=i.indexOf(ft.separatorPrefix);if(-1===s)return"";const o=i.slice(0,s);return`${o.split("\n").map(e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith("#")&&!e.includes("/")).map(e=>` "!**/${e}/**"`).join("")} || true`}(n.dirPath);!function(e){for(const[t,n]of Object.entries(e))n?.includes("yarn workspaces foreach")&&(e[t]=n.replaceAll(/yarn workspaces foreach(?!\s+(?:-A|-R|--(?:all|recursive|since|worktree|from|include|exclude|public|private)))/gu,"yarn workspaces foreach --all"))}(r.scripts)}(n,a,c);const p=function(n,r,i){const s=[],a=["prettier","sort-package-json"],c=[];e.existsSync(t.join(r.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(i.prettier="@willbooster/prettier-config",a.push("prettier-plugin-java","@willbooster/prettier-config"));if(delete i.devDependencies["lint-staged"],delete i["lint-staged"],n.isRoot){if(delete i.devDependencies.husky,delete i.scripts.postinstall,delete i.scripts.postpublish,delete i.scripts.prepublishOnly,delete i.scripts.prepack,delete i.scripts.postpack,i.scripts.prepare="lefthook install || true",a.push("lefthook"),n.depending.semanticRelease&&(i.devDependencies["semantic-release"]||i.devDependencies["multi-semantic-release"]||i.devDependencies["@qiwi/multi-semantic-release"]||a.push("semantic-release"),i.version="0.0.0-semantically-released"),n.depending.playwrightTest){i.dependencies.artillery||i.devDependencies.artillery||i.dependencies["@playwright/test"]||a.push("@playwright/test"),delete i.dependencies.playwright,delete i.devDependencies.playwright}n.doesContainSubPackageJsons?i.workspaces=Array.isArray(i.workspaces)?l.all([i.workspaces,["packages/*"]],{arrayMerge:Me}):["packages/*"]:Array.isArray(i.workspaces)&&(i.workspaces=i.workspaces.filter(e=>o.globSync(e,{dot:!0,cwd:n.dirPath,ignore:J}).length>0),0===i.workspaces.length&&delete i.workspaces)}if(n.depending.wb||n.isBun){i.dependencies["@willbooster/wb"]?s.push("@willbooster/wb"):a.push("@willbooster/wb");for(const[e,t]of Object.entries(i.scripts))"string"==typeof t&&(i.scripts[e]=t.replaceAll(/wb\s+db/gu,"wb prisma"))}At(n)&&a.push(...Gt);At(n)&&a.push(...function(e){return e.isBun?["@tsconfig/bun"]:e.depending.reactNative?["@tsconfig/react-native"]:["@tsconfig/node-lts","@tsconfig/node-ts"]}(n));(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(a.push(qt),n.isBun?a.push("@types/bun"):n.depending.reactNative||a.push("@types/node"),(i.dependencies.jest||i.devDependencies.jest||i.dependencies["@jest/globals"]||i.devDependencies["@jest/globals"]||i.dependencies["ts-jest"]||i.devDependencies["ts-jest"])&&a.push("@types/jest"));if(n.isWillBoosterConfigs)return{dependencies:s.filter(e=>!e.includes("@willbooster/")),devDependencies:a.filter(e=>!e.includes("@willbooster/")),poetryDevDependencies:c};return{dependencies:s,devDependencies:a,poetryDevDependencies:c}}(n,r,a);await async function(n,r,i,s){i.name||(i.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(i.private=!0);i.license||(i.license="UNLICENSED");!i.private&&"UNLICENSED"!==i.license&&r.isPublicRepo&&(i.publishConfig??={},i.publishConfig.access??="public");const[a]=Nt.getOrgAndName(n.repository??"");"WillBooster"!==a&&"WillBoosterLab"!==a||(i.author="WillBooster Inc.");n.isRoot||!i.private||i.main||(i.main="./src");if(delete i.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)i.scripts["lint-fix"]=i.scripts["lint-fix"]??"yarn lint --fix";else{delete i.scripts.lint,delete i.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=i.scripts[e];t&&(i.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){i.scripts.lint="flutter analyze",i.scripts["lint-fix"]="yarn lint";const r=["lib","test","test_driver"].filter(r=>e.existsSync(t.resolve(n.dirPath,r)));r.length>0&&(i.scripts["format-code"]=`dart format $(find ${r.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,i.scripts.format=(i.scripts.format??"")+" && yarn format-code")}if(n.doesContainPoetryLock){"poetry install"===i.scripts.postinstall&&delete i.scripts.postinstall;const e=await o.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:J}),t=new Set;for(const n of e){const[e,r]=n.split("/");e&&r&&t.add(e)}if(t.size>0){const e=[...t].join(" ");i.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,i.scripts.lint?i.scripts.lint=`poetry run flake8 ${e} && ${i.scripts.lint}`:(i.scripts.lint=`poetry run flake8 ${e}`,i.scripts["lint-fix"]="yarn lint"),i.scripts.format=(i.scripts.format??"")+" && yarn format-code",s.poetryDevDependencies.push("black","isort","flake8")}}}(n.repository||i.repository)&&(i.repository=function(e,t){const n=Qt(e);if(n)return en(n,e,t);const r=Qt(t);if(r)return en(r,t);return e}(n.repository??i.repository,i.repository));n.depending.blitz?i.scripts["gen-code"]?.startsWith("blitz codegen")?i.scripts["gen-code"].includes("blitz prisma generate")||(i.scripts["gen-code"]=i.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):i.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!i.scripts["gen-code"]?.startsWith("prisma generate")&&(i.scripts["gen-code"]="prisma generate");i.dependencies.prettier||delete i.devDependencies["@types/prettier"]}(n,r,a,p),function(e,t){const n=e.dependencies,r=e.devDependencies;t.dependencies=Vt(n,t.dependencies),t.devDependencies=t.devDependencies.filter(e=>!n[e]),t.devDependencies=Vt(r,t.devDependencies)}(a,p),await async function(e){const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]),n=[{packageName:"@willbooster/auth",repo:"auth",target:"dependencies"},{packageName:"@discord-bot/shared",repo:"discord-bot",target:"dependencies"},{packageName:"@willbooster/code-analyzer",repo:"code-analyzer",target:"devDependencies"},{packageName:"@willbooster/judge",repo:"judge",target:"dependencies"},{packageName:"@willbooster/llm-proxy",repo:"llm-proxy",target:"dependencies"}];await Promise.all(n.map(async({packageName:n,repo:r,target:i})=>{if(!t.has(n)||function(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}(e,n))return;const s="dependencies"===i?"devDependencies":"dependencies";Reflect.deleteProperty(e[s],n),e[i][n]=await async function(e){const t=await function(e,t){try{const n=Rt("git",["ls-remote",`git@github.com:${e}/${t}.git`,"HEAD"],process.cwd()).split(/\s+/)[0];if(!n)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(n)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}("WillBoosterLab",e);return`git@github.com:WillBoosterLab/${e}.git#${t}`}(r)}))}(a),function(e){for(const t of["dependencies","devDependencies","peerDependencies"]){const n=e[t];n&&0===Object.keys(n).length&&Reflect.deleteProperty(e,t)}}(a),n.isBun&&delete a.packageManager;await P.run(()=>$.generateFile(s,JSON.stringify(Re(a),void 0,2))),i||function(e,t,n,r){const i=n.dependencies.filter(e=>!t.devDependencies?.[e]);Kt(e,r,i,!1);const s=n.devDependencies.filter(e=>!t.dependencies?.[e]);Kt(e,r,s,!0),n.poetryDevDependencies.length>0&&Dt("poetry",["add","--group","dev",...new Set(n.poetryDevDependencies)],e.dirPath)}(n,a,p,c)}(n,r,i)})}function Kt(e,t,n,r){if(0===n.length)return;const i=[...new Set(n)];e.isBun?Dt(t,["add",...r?["-D"]:[],"--exact",...i],e.dirPath):Dt(t,["add",...r?["-D"]:[],...i],e.dirPath)}function Vt(e,t){const n=[];for(const r of new Set(t)){const t=Zt(r,e[r]);t&&n.push(r),e[r]&&!t&&"*"!==e[r]||(e[r]=Xt(r))}return n}function Xt(e){const t=Ht.get(e);if(t)return t;const n=Rt("npm",["show",e,"version","--workspaces=false"],process.cwd())||"*";return Ht.set(e,n),n}function Zt(e,t){return!t||("*"===t||("@willbooster/oxlint-config"===e||"oxlint"===e||e===qt))}function Qt(e){if("string"==typeof e){if(!e.startsWith("github:"))return;const[t,n]=Nt.getOrgAndName(e);if(!t||!n)return;return`git+https://github.com/${t}/${n}.git`}const t=e?.url;if("string"!=typeof t)return;const n=/^(?:git\+)?https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/u.exec(t);if(!n)return;const[,r,i]=n;return`git+https://github.com/${r}/${i}.git`}function en(e,t,n){return{..."object"==typeof t?t:"object"==typeof n?n:void 0,type:"git",url:e}}function tn(e,t){if(e.isBun){const t={"check-all-for-ai":"bun run check-for-ai && bun run test","check-for-ai":"bun run cleanup",cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun wb test",typecheck:"bun --bun wb typecheck"};return e.doesContainTypeScript||e.doesContainTypeScriptInPackages||delete t.typecheck,t}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,r=At(e),i=t.test;let s={"check-all-for-ai":"yarn check-for-ai && yarn test","check-for-ai":"yarn format > /dev/null 2> /dev/null || true && yarn lint-fix --quiet",cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn format-code && yarn prettify",lint:"oxlint --no-error-on-unmatched-pattern .","lint-fix":"yarn lint --fix","format-code":"oxfmt --write --no-error-on-unmatched-pattern .",prettify:`prettier --cache --color --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${ht.prettierOnly.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsgo --noEmit"};return e.doesContainSubPackageJsons?s=l({...s},{format:"sort-package-json && yarn format-code && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${ht.prettierOnly.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}):e.depending.pyright&&(s.typecheck=s.typecheck?`${s.typecheck} && `:"",s.typecheck+="pyright"),i?.includes("wb test")&&(s.test=i),r||(delete s["format-code"],s.format="sort-package-json && yarn prettify",delete s.lint,delete s["lint-fix"]),n?e.depending.wb&&(s.typecheck="wb typecheck"):delete s.typecheck,s}}const nn={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},rn={commands:{cleanup:{glob:"",run:""},"check-migrations":{glob:"**/migration.sql",run:"\nif grep -q 'Warnings:' {staged_files}; then\n echo \"Migration SQL files ({staged_files}) contain warnings! Please solve the warnings and commit again.\"\n exit 1\nfi\n".trim()}}},sn='\n#!/bin/bash\n\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim();async function on(n){return S.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const r=t.resolve(n.dirPath,".lefthook"),i=t.resolve(n.dirPath,".husky"),s=e.existsSync(i),{lint:o}=tn(n,{}),a={...nn,"pre-commit":{...rn,commands:{...rn.commands,cleanup:{...rn.commands.cleanup,glob:an(n),run:cn(n)}}}};o||delete a["pre-push"];await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),p.dump(a,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(r,{force:!0,recursive:!0})]),s&&(await Promise.all([e.promises.rm(i,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})]),Dt("git",["config","--unset","core.hooksPath"],n.dirPath));if(o){const i=function(e){let t;t=e.isBun?e.depending.wb?"bun --bun wb lint":"bun run lint":e.depending.wb?"yarn wb lint":"yarn run lint";if(e.repository?.startsWith("github:WillBoosterLab/"))return`\n#!/bin/bash\n\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don't push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\n${t}\n`.trim();return t}(n);e.mkdirSync(t.join(r,"pre-push"),{recursive:!0}),await P.run(()=>e.promises.writeFile(t.join(r,"pre-push","check.sh"),i+"\n",{mode:493}))}const c=`${sn}\n\n${function(e){const t=[];if(e.hasVersionSettings){const e=String.raw`(mise\.toml|\.mise\.toml|\.tool-versions|\..+-version)`;t.push(String.raw`run_if_changed "${e}" "mise install"`)}const n=e.isBun?"bun install":"yarn",r=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";t.push(String.raw`run_if_changed "package\.json" "${n}${r}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`);e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`);return t}(n).join("\n")}\n`;e.mkdirSync(t.join(r,"post-merge"),{recursive:!0}),await P.run(()=>e.promises.writeFile(t.resolve(r,"post-merge","prepare.sh"),c,{mode:493}))}(n)})}function an(e){const t=[...ht.prettierOnly];At(e)&&t.push(...ht.oxfmt,...ht.oxlint),e.doesContainPoetryLock&&t.push("py"),e.doesContainPubspecYaml&&t.push("dart");return`**/*.{${[...new Set(t)].toSorted().join(",")}}`}function cn(n){if(function(n){if(!n.isRoot)return!1;const r=t.resolve(n.dirPath,"packages","wb","package.json");if(!e.existsSync(r))return!1;try{return"@willbooster/wb"===JSON.parse(e.readFileSync(r,"utf8")).name}catch{return!1}}(n))return'yarn workspace @willbooster/wb start --working-dir "$(git rev-parse --show-toplevel)" lint --fix --format -- {staged_files} && git add -- {staged_files}';if(n.isBun||n.depending.wb){const e=n.isBun?"bun":"yarn";return`${n.depending.wb?(n.isBun?"bun --bun wb":"yarn wb")+" lint --fix --format -- {staged_files}":`${e} run format && ${e} run lint-fix`} && git add -- {staged_files}`}const r=ht.oxlint.map(e=>String.raw`\.${e}$`).join("|"),i=ht.oxfmt.map(e=>String.raw`\.${e}$`).join("|"),s=ht.prettierOnly.map(e=>String.raw`\.${e}$`).join("|"),o=At(n);return String.raw`
2
2
  ${o?String.raw`oxlint_files="$(printf '%s\n' {staged_files} | grep -E '(${r})' || true)"`:""}
3
3
  ${o?String.raw`oxfmt_files="$(printf '%s\n' {staged_files} | grep -E '(${i})' || true)"`:""}
4
4
  prettier_files="$(printf '%s\n' {staged_files} | grep -E '(${s})' || true)"
@@ -25,5 +25,5 @@ fi
25
25
  ${n.doesContainPoetryLock?'if [ -n "$python_files" ]; then\n poetry run isort --profile black --filter-files $python_files\n poetry run black $python_files\n poetry run flake8 $python_files\nfi':""}
26
26
  ${n.doesContainPubspecYaml?'if [ -n "$dart_files" ]; then\n dart format $dart_files\nfi':""}
27
27
  git add -- {staged_files}
28
- `.trim()}async function ln(t){return S.functionIgnoringException("generateLintstagedrc",async()=>{await Promise.all([P.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.cjs`,{force:!0})),P.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.js`,{force:!0})),P.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.json`,{force:!0}))])})}async function pn(n){return S.functionIgnoringException("generateOxfmtConfig",async()=>{const r=t.resolve(n.dirPath,".oxfmtrc.json"),i=t.resolve(n.dirPath,"oxfmt.config.ts");await P.run(()=>e.promises.rm(r,{force:!0})),e.existsSync(i)||await P.run(()=>$.generateFile(i,dn))})}const dn="import config from '@willbooster/oxfmt-config';\n\nexport default config;\n";async function un(n,r){return S.functionIgnoringException("generateOxlintConfig",async()=>{const r=t.resolve(n.dirPath,"oxlint.config.ts"),i=e.existsSync(r)?e.readFileSync(r,"utf8"):void 0,s=[P.run(()=>e.promises.rm(t.resolve(n.dirPath,".oxlintrc.json"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.json"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.jsonc"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.cjs"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.js"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yaml"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yml"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.cjs"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.mjs"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.ts"),{force:!0}))];i||s.push(P.run(()=>$.generateFile(r,mn))),await Promise.all(s)})}const mn="import config from '@willbooster/oxlint-config';\n\nexport default config;\n";async function fn(e){return S.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),r=await $.readFileIgnoringError(n)??"",i=ft.getHeadUserContent(r),s=ft.getTailUserContent(r),o=t.resolve(e.dirPath,".gitignore"),a=await ft.readGitignoreWithoutSeparators(o)||"";let c="";e.doesContainPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+s;await P.run(()=>$.generateFile(n,l))})}const gn={venvPath:".",venv:".venv"};async function yn(n){return S.functionIgnoringException("generatePyrightConfigJson",async()=>{let r=structuredClone(gn);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);r=l.all([r,n,r],{arrayMerge:Je})}catch{}const s=JSON.stringify(r,void 0,2);await P.run(()=>$.generateFile(i,s))})}async function hn(n){return S.functionIgnoringException("generateReadme",async()=>{const r=t.resolve(n.dirPath,"README.md");let i=await e.promises.readFile(r,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(i=wn(i,"[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)"));const s=n.repository?.slice(n.repository.indexOf(":")+1),o=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const r of o){if(!r.startsWith("test")&&!r.startsWith("deploy"))continue;let o=r;if(o=(o[0]||"").toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," "),!s)continue;const a=`[![${o}](https://github.com/${s}/actions/workflows/${r}/badge.svg)](https://github.com/${s}/actions/workflows/${r})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${r}`))&&(i=wn(i,a))}await P.run(()=>$.generateFile(r,i))})}function wn(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const r=e.slice(0,n+1);let i=e.slice(n+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${r}${t}\n${i}`}return`${e}\n${t}\n`}async function bn(n){return S.functionIgnoringException("generateReleaserc",async()=>{const r=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(r))return;const i=JSON.parse(await e.promises.readFile(r,"utf8")),s=i.plugins??[];for(let e=0;e<s.length;e++){const t=s[e],n=Array.isArray(t),r=n?t[0]:t,i=n&&t[1]||{};"@semantic-release/commit-analyzer"===r?s[e]=["@semantic-release/commit-analyzer",l.all([i,{preset:"conventionalcommits"}],{arrayMerge:Je})]:"@semantic-release/github"===r&&(s[e]=["@semantic-release/github",l.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:Je})])}const o=JSON.stringify(i,void 0,2);await P.run(()=>$.generateFile(r,o))})}const vn={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function kn(n){return S.functionIgnoringException("generateRenovateJson",async()=>{let r=structuredClone(vn);const i=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${i}5`))return;try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);r=l.all([r,n,r],{arrayMerge:Je}),r.extends=r.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(r.packageRules??=[],r.packageRules.some(e=>e.matchPackageNames?.includes("next"))||r.packageRules.push({matchPackageNames:["next"],enabled:!1})),await P.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await P.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const s=JSON.stringify(r,void 0,2);await P.run(()=>$.generateFile(i,s))})}async function xn(e){return S.functionIgnoringException("installAgentSkills",async()=>{await Promise.all([s.rm(t.resolve(e.dirPath,".agents"),{force:!0,recursive:!0}),s.rm(t.resolve(e.dirPath,".claude"),{force:!0,recursive:!0}),s.rm(t.resolve(e.dirPath,"skills-lock.json"),{force:!0})])})}const _n={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},jn={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function Sn(n){return S.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let r=structuredClone(n.isRoot?_n:jn);const i=function(e){const t=new Set,n={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};e.isBun?t.add("bun"):e.depending.reactNative||t.add("node");(n.jest||n["@jest/globals"]||n["jest-environment-jsdom"]||n["ts-jest"])&&t.add("jest");n.vitest&&t.add("vitest/globals");n.mocha&&t.add("mocha");n.cypress&&t.add("cypress");return[...t]}(n);r.extends=function(e){return e.isBun?"@tsconfig/bun/tsconfig.json":e.depending.reactNative?"@tsconfig/react-native/tsconfig.json":["@tsconfig/node-lts/tsconfig.json","@tsconfig/node-ts/tsconfig.json"]}(n),r.compilerOptions??={},r.compilerOptions.rootDir=function(n){return n.isRoot?".":e.existsSync(t.resolve(n.dirPath,"..","..","package.json"))?"../..":"."}(n),i.length>0&&(r.compilerOptions={...r.compilerOptions,types:i}),n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?n.isBun||n.depending.reactNative||(r.compilerOptions={...r.compilerOptions,jsx:"react-jsx"}):delete r.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(r.include=r.include?.filter(e=>!e.startsWith("packages/*/")),r.exclude=r.exclude?.filter(e=>!e.startsWith("packages/*/")));const s=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(s,"utf8"),n=JSON.parse(t),a=(o=n.compilerOptions?.types,"string"==typeof o?[o]:Array.isArray(o)?o.filter(e=>"string"==typeof e):[]),c=function(e){const t={};for(const n of["declaration","declarationMap","emitDeclarationOnly","noEmit","sourceMap"]){const r=e?.[n];void 0!==r&&(t[n]=r)}return t}(n.compilerOptions);r.extends=function(e,t){const n=[...$n(e),...$n(t)],r=[...new Set(n)];return 0===r.length?void 0:1===r.length?r[0]:r}(r.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,r=l.all([r,n,r],{arrayMerge:Me}),r.include=r.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/")),r.compilerOptions??={},r.compilerOptions={...r.compilerOptions,...c},function(e){if(!e)return;if(!1!==e.noEmit||!0===e.emitDeclarationOnly)return;e.rewriteRelativeImportExtensions=!0}(r.compilerOptions);const p=[...new Set([...Pn(a,i),...i])];p.length>0?r.compilerOptions.types=p:delete r.compilerOptions.types,i.some(e=>"cypress"===e||e.includes("/"))&&delete r.compilerOptions.typeRoots}catch{}var o;qe(r),r.include?.sort(),delete r.compilerOptions?.experimentalDecorators,n.depending.reactNative&&delete r.compilerOptions?.verbatimModuleSyntax;const a=JSON.stringify(r,void 0,2);await P.run(()=>$.generateFile(s,a))})}function $n(e){return e?Array.isArray(e)?e:[e]:[]}function Pn(e,t){const n=new Set(t);return e.filter(e=>!(function(e){return"cypress"===e||"jest"===e||"mocha"===e||"vitest/globals"===e}(e)&&!n.has(e)))}const On=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function En(n){return S.functionIgnoringException("generateVscodeSettings",async()=>{try{const r=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(r,"utf8");let s=JSON.parse(i);for(const e of On)s=l.all([s,Cn(e)]);n.doesContainPoetryLock&&(s=l.all([s,Cn("**/.venv/**")])),n.depending.next&&(s=l.all([s,Cn("**/.next/**")])),"editor.codeActionsOnSave"in s&&delete s["editor.codeActionsOnSave"],"editor.formatOnSave"in s&&delete s["editor.formatOnSave"],qe(s);const o=JSON.stringify(s,void 0,2);await P.run(()=>$.generateFile(r,o))}catch{}})}function Cn(e){return{"files.watcherExclude":{[e]:!0}}}async function An(n){return S.functionIgnoringException("generateYarnrcYml",async()=>{const r=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await P.run(()=>e.promises.rm(r,{force:!0})),await P.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await P.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const i=Rt("yarn",["--version"],n.dirPath),s=function(e,t){return Rt("npm",["show",e,"version"],t)||"0.0.0"}("@yarnpkg/cli",n.dirPath);(function(e,t){const n=g.valid(e);return!!n&&g.gt(n,g.valid(t)??"0.0.0")})(s,i)&&Dt("yarn",["set","version",s],n.dirPath,1);const o=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(o,{recursive:!0});for(const n of await e.promises.readdir(o))n.startsWith("yarn-")&&!n.startsWith(`yarn-${s}.`)&&await P.run(()=>e.promises.rm(t.join(o,n)));const a=t.resolve(n.dirPath,".yarnrc");await P.run(()=>e.promises.rm(a,{force:!0}));let c={};try{c=p.load(await e.promises.readFile(r,"utf8"))??c}catch{}c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.npmPreapprovedPackages=["@exercode/*","@willbooster/*","agent-runtime-kit","one-way-git-sync","next","@next/*","@typescript/*","@oxfmt/*","@oxlint/*","@oxlint-tsgolint/*","oxfmt","oxlint","oxlint-tsgolint","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const r=t.resolve(n.dirPath,".yarn","plugins","undefined.cjs");await P.run(()=>e.promises.rm(r,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(r,p.dump(c,{lineWidth:-1})),Dt("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath),Dt("yarn",["dlx","prettier","--write",t.relative(n.dirPath,r)],n.dirPath)})}async function Bn(e){return S.functionIgnoringException("setupLabels",async()=>{const[t,n]=Nt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Mt(t))return;const r=Jt(t);try{await Fn(r,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await Fn(r,t,n,"d2: easy :rabbit2:","DDD6FE"),await Fn(r,t,n,"d3: medium :ox:","C4B5FD"),await Fn(r,t,n,"d4: hard :squid:","A78BFA"),await Fn(r,t,n,"d5: x-hard :whale2:","8B5CF6"),await Fn(r,t,n,"p1: critical :fire::fire::fire:","EF4444"),await Fn(r,t,n,"p2: urgent :fire::fire:","F87171"),await Fn(r,t,n,"p3: important :fire:","FCA5A5"),await Fn(r,t,n,"p4: nice to have :droplet:","FECACA"),await Fn(r,t,n,"r: blitz","5300bc"),await Fn(r,t,n,"r: firebase","ffca28"),await Fn(r,t,n,"r: prisma","0c344b"),await Fn(r,t,n,"r: react","61dafb"),await Fn(r,t,n,"r: svelte","ff3e00"),await Fn(r,t,n,"r: semantic-release","494949"),await Fn(r,t,n,"ready :rocket:","22C55E"),await Fn(r,t,n,"review requested :mag:","FBCA04"),await Fn(r,t,n,"released :bookmark:","6366F1"),await Fn(r,t,n,"s: 0.5h :clock1230:","F3F4F6"),await Fn(r,t,n,"s: 1h :clock1:","E5E7EB"),await Fn(r,t,n,"s: 2h :clock2:","D1D5DB"),await Fn(r,t,n,"s: 3h :clock3:","9CA3AF"),await Fn(r,t,n,"s: 5h :clock5:","6B7280"),await Fn(r,t,n,"s: 8h :clock8:","4B5563"),await Fn(r,t,n,"s: 13h :clock1:","374151"),await Fn(r,t,n,"t: build :hammer:","BFDBFE"),await Fn(r,t,n,"t: chore :broom:","BFDBFE"),await Fn(r,t,n,"t: ci :construction_worker:","BFDBFE"),await Fn(r,t,n,"t: docs :memo:","BFDBFE"),await Fn(r,t,n,"t: feat :sparkles:","BFDBFE"),await Fn(r,t,n,"t: fix :bug:","BFDBFE"),await Fn(r,t,n,"t: perf :zap:","BFDBFE"),await Fn(r,t,n,"t: refactor :recycle:","BFDBFE"),await Fn(r,t,n,"t: style :lipstick:","BFDBFE"),await Fn(r,t,n,"t: test :test_tube:","BFDBFE"),await Fn(r,t,n,"project","24292F"),await Fn(r,t,n,"focused :dart:","22C55E"),await Fn(r,t,n,"gen-pr-all :robot:","00B4D8"),await Fn(r,t,n,"gen-pr-claude :robot:","00B4D8"),await Fn(r,t,n,"gen-pr-codex :robot:","00B4D8"),await Fn(r,t,n,"gen-pr-gemini :robot:","00B4D8"),await In(r,t,n,"bug"),await In(r,t,n,"documentation"),await In(r,t,n,"duplicate"),await In(r,t,n,"enhancement"),await In(r,t,n,"good first issue"),await In(r,t,n,"help wanted"),await In(r,t,n,"invalid"),await In(r,t,n,"question"),await In(r,t,n,"wontfix"),await In(r,t,n,"ready"),await In(r,t,n,"review requested"),await In(r,t,n,"released"),await In(r,t,n,"semantic-release"),await In(r,t,n,"llm-pr :robot:"),await In(r,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function Fn(e,t,n,r,i){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:r,color:i})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:r,color:i})}}async function In(e,t,n,r){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:r})}catch{}}const Dn=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function Tn(e){return S.functionIgnoringException("setupSecrets",async()=>{const[n,r]=Nt.getOrgAndName(e.repository??"");if(!n||!r||"WillBoosterLab"!==n)return;if(!Mt(n)||!j.doesUploadEnvVars)return;const i=y.config({path:t.resolve(e.dirPath,".env")}).parsed??{};if(0===Object.keys(i).length)return;const s=Jt(n);try{for(const e of Dn)try{await s.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:r,secret_name:e})}catch{}const e=await s.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:n,repo:r}),{key:t,key_id:o}=e.data;await h.ready;for(const[e,a]of Object.entries(i)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const i=h.from_base64(t,h.base64_variants.ORIGINAL),c=h.from_string(a),l=h.crypto_box_seal(c,i),p=h.to_base64(l,h.base64_variants.ORIGINAL);await s.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:r,secret_name:e,encrypted_value:p,key_id:o})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Rn(e){const[t,n]=Nt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Mt(t))return;const r=Jt(t);await async function(e,{beforeRetry:t,handleError:n,retryCount:r=3,retryLogger:i,shouldRetry:s,sleepMilliseconds:o=0,updateSleepMilliseconds:a}={}){let c=0;for(;;)try{return await e(c)}catch(e){if(await(n?.(e)),c++,c>=r)throw e;if(s&&!s(e))throw e;o>0&&await k(o),a&&(o=a(o)),i?.(`Retry due to: ${e}\n${e instanceof Error?"---\n"+(e.stack??""):""}`),await(t?.(e))}}(()=>r.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}))}const Wn="__PM_RUN__",Nn={"pull_request_template.md":`\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I've confirmed \`All checks have passed\` on this page.\n - PR title follows [Angular's commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn't have \`WIP:\`.\n - The test command (e.g., \`${Wn} test\`) passed.\n - The lint command (e.g., \`${Wn} lint\`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I've reviewed my changes on the GitHub diff view.\n- [ ] I've written the steps to test my changes.\n- [ ] I've added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn't modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language \`C\`.\n3. Write the following code:\n \`\`\`c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n \`\`\`\n4. Push \`Submit\` button.\n5. ...\n--\x3e\n`.trim()};async function Ln(n){return S.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[r,i]of Object.entries(Nn)){const s=Jn(i,n),o=t.resolve(n.dirPath,".github",r);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(w(t,s)>s.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await P.run(()=>$.generateFile(o,s))}})}function Jn(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Wn,n)}const Mn=v.object({typos:v.object({all:v.record(v.string(),v.string()).optional(),doc:v.record(v.string(),v.string()).optional(),ts:v.record(v.string(),v.string()).optional(),text:v.record(v.string(),v.string()).optional()}).optional()});async function Un(n,r){const i=t.resolve(n,"package.json");try{const o=e.existsSync(i);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),r=JSON.parse(await s.readFile(e,"utf8"));d=r?.branches??[],u=r?.plugins?.flat()??[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=b(e),r=(await n.getRemotes(!0)).find(e=>"origin"===e.name),i=r?.refs.fetch??r?.refs.push;if("string"==typeof i){const e=await qn(i);if(e)return e}const s="string"==typeof t.repository?t.repository:t.repository?.url;if(s){const e=await qn(s);if(e&&"Not Found"!==e.message)return e}}(n,l));let g=function(n){const r=t.resolve(n);return e.existsSync(t.join(r,"mise.toml"))||e.existsSync(t.join(r,".mise.toml"))||e.existsSync(t.join(r,".tool-versions"))}(n);for(const r of["java","node","python"])if(e.existsSync(t.resolve(n,`.${r}-version`))){g=!0;break}let y="";try{y=await s.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const h=t.resolve(n,"wbfy.json");let w;try{const e=await s.readFile(h,"utf8");w=Mn.parse(JSON.parse(e))}catch{}const v="string"==typeof f?.full_name?f.full_name:void 0;let k,x;if(v){const e=v.split("/");e.length>=2&&(k=e[0],x=e[1])}const _=v?`github:${v}`:void 0,j={dirPath:n,dockerfile:y,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:_,repoAuthor:k,repoName:x,isWillBoosterRepo:Boolean(_?.startsWith("github:WillBooster/")||_?.startsWith("github:WillBoosterLab/")),isBun:r?.isBun||e.existsSync(t.join(n,"bun.lock")),isEsmPackage:p,isWillBoosterConfigs:i.includes("/willbooster-configs"),doesContainSubPackageJsons:Gn("packages/**/package.json",n),doesContainDockerfile:!!y||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:Gn("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Gn("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Gn("{app,src,test}/**/*.{t,j}sx",n),doesContainJavaScriptInPackages:Gn("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Gn("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Gn("packages/**/{app,src,test}/**/*.{t,j}sx",n),hasStartTestServer:!!l.scripts?.["start-test-server"],depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!c["gen-i18n-ts"],litestream:y.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},hasVersionSettings:g,packageJson:l,wbfyJson:w};if(j.doesContainGemfile||j.doesContainGoMod||j.doesContainPackageJson||j.doesContainPoetryLock||j.doesContainPomXml||j.doesContainPubspecYaml||j.doesContainTemplateYaml)return j}catch{}}function Gn(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:J}).length>0}async function qn(e){const[t,n]=Nt.getOrgAndName(e);if(!t||!n)return;const r={full_name:`${t}/${n}`};try{const e=await Jt().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(r,e.data)}catch(e){const t=function(e){if(!e||"object"!=typeof e)return;const t="response"in e?e.response:void 0,n=t?.status??e.status;if(301!==n&&302!==n)return;const r=t?.headers?.location;if("string"!=typeof r)return;const[i,s]=Nt.getOrgAndName(r);if(!i||!s)return;return`${i}/${s}`}(e);t&&(r.full_name=t)}return r}const zn=new Set(["@willbooster/oxlint-config","@willbooster/prettier-config"]);function Hn(e){const t=e.packageJson?.name;return e.isWillBoosterConfigs&&"string"==typeof t&&zn.has(t)}function Yn(n){const r=t.join(n,"bun.lock"),i=t.join(n,".bun.lock.wbfy-backup");e.rmSync(i,{force:!0}),e.existsSync(r)&&(e.copyFileSync(r,i),e.rmSync(r,{force:!0}));const s=Tt("bun",["update"],n);if(0!==s||!e.existsSync(r))throw e.existsSync(i)&&(e.copyFileSync(i,r),e.rmSync(i,{force:!0})),new Error(`Failed to regenerate ${r}: bun update exited with status ${s}`);e.rmSync(i,{force:!0})}await async function(){const r=await n(process.argv.slice(2)).command("$0 [paths..]","Make a given project follow the WillBooster standard",e=>{e.positional("paths",{describe:"project paths to be wbfied",array:!0,type:"string",default:["."]})}).options({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;j.isVerbose=r.verbose,j.doesUploadEnvVars=r.env;for(const n of r.paths){const i=t.join(n,"packages"),s=(await x(()=>e.promises.readdir(i,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(i,e.name));await We([n,...s]);const o=await Un(n);if(j.isVerbose,!o){console.error(`there is no valid package.json in ${n}`);continue}const a=et(o),c=(await Promise.all(s.map(e=>Un(e,o)))).filter(e=>!!e),l=[o,...c];if(j.isVerbose)for(const e of l)console.info(e);await An(o),o.isBun&&await at(o);const p=!Ve(o.repository)&&(o.repository?.startsWith("github:WillBooster/")||o.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([M(o),a.then(()=>hn(o)),rt(o,l),yt(o),bt(o),xt(o,l),_t(o),St(o),Ln(o),Bt(o),kn(o),bn(o),...p?[Ke(o)]:[],Bn(o),Tn(o),Rn(o),on(o),ln(o)]),await P.promiseAll();const d=[];for(const e of l)Hn(e)||((e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Le(e,e.isRoot?l:[e])),e.depending.playwrightTest&&d.push(F(e)),e.depending.next&&d.push(O(e)),await Pt(e,o),await P.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await fn(e),await Yt(e,o,r.skipDeps),d.push(ln(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&d.push(En(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Sn(e)),At(e)&&(d.push(pn(e)),d.push(un(e))),e.depending.pyright&&d.push(yn(e))));await Promise.all(d),await P.promiseAll();const u=o.isBun?"bun":"yarn";o.isBun?await S.functionIgnoringException("refreshBunLock",async()=>{await Promise.resolve(),Yn(n)}):Dt(u,["install","--no-immutable"],n),Dt(u,["cleanup"],n),await xn(o)}}();
29
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2dsb2JVdGlsLnRzIiwiLi4vc3JjL2ZpeGVycy9wcmlzbWEudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kZXRlY3QtaW5kZW50L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1uZXdsaW5lL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lzLXBsYWluLW9iai9pbmRleC5qcyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLnRzIiwiLi4vc3JjL3V0aWxzL3RzY29uZmlnQmFzZS50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGZtdENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294bGludENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3NraWxscy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3RzY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy95YXJucmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9zZWNyZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy9wYWNrYWdlQ29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xuICBkb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuZXhwb3J0IGNvbnN0IGZzVXRpbCA9IHtcbiAgYXN5bmMgcmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBhc3luYyBnZW5lcmF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgbGV0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCArPSAnXFxuJztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwob2xkQ29udGVudCk7XG4gICAgaWYgKCFvYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBleGlzdGluZ1Byb3BlcnRpZXMgPSBuZXcgU2V0KG9iamVjdExpdGVyYWwucHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lPy5nZXRUZXh0KCkpKTtcbiAgICBjb25zdCBwcm9wZXJ0eVRleHRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICghZXhpc3RpbmdQcm9wZXJ0aWVzLmhhcygndHlwZXNjcmlwdCcpKSB7XG4gICAgICBwcm9wZXJ0eVRleHRzLnB1c2goJ3R5cGVzY3JpcHQ6IHsgaWdub3JlQnVpbGRFcnJvcnM6IHRydWUgfScpO1xuICAgIH1cbiAgICBpZiAocHJvcGVydHlUZXh0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gb2JqZWN0TGl0ZXJhbC5nZXRFbmQoKSAtIDE7XG4gICAgY29uc3QgbGFzdFByb3BlcnR5ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmF0KC0xKTtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NvbW1hID0gbGFzdFByb3BlcnR5XG4gICAgICA/IG9sZENvbnRlbnQuc2xpY2UobGFzdFByb3BlcnR5LmdldEVuZCgpLCBpbnNlcnRpb25Qb2ludCkuaW5jbHVkZXMoJywnKVxuICAgICAgOiBmYWxzZTtcbiAgICBjb25zdCBwcmVmaXggPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubGVuZ3RoID4gMCAmJiAhaGFzVHJhaWxpbmdDb21tYSA/ICcsICcgOiAnJztcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBpbnNlcnRpb25Qb2ludCl9JHtwcmVmaXh9JHtwcm9wZXJ0eVRleHRzLmpvaW4oJywgJyl9JHtvbGRDb250ZW50LnNsaWNlKFxuICAgICAgaW5zZXJ0aW9uUG9pbnRcbiAgICApfWA7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKGNvbnRlbnQ6IHN0cmluZyk6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gdHMuY3JlYXRlU291cmNlRmlsZSgnbmV4dC5jb25maWcuanMnLCBjb250ZW50LCB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LCB0cnVlLCB0cy5TY3JpcHRLaW5kLkpTKTtcbiAgbGV0IG9iamVjdExpdGVyYWw6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiB0cy5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKG9iamVjdExpdGVyYWwpIHJldHVybjtcbiAgICBpZiAodHMuaXNFeHBvcnRBc3NpZ25tZW50KG5vZGUpICYmIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgb2JqZWN0TGl0ZXJhbCA9IG5vZGUuZXhwcmVzc2lvbjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHMuaXNCaW5hcnlFeHByZXNzaW9uKG5vZGUpICYmXG4gICAgICBub2RlLm9wZXJhdG9yVG9rZW4ua2luZCA9PT0gdHMuU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgbm9kZS5sZWZ0LmdldFRleHQoc291cmNlKSA9PT0gJ21vZHVsZS5leHBvcnRzJyAmJlxuICAgICAgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihub2RlLnJpZ2h0KVxuICAgICkge1xuICAgICAgb2JqZWN0TGl0ZXJhbCA9IG5vZGUucmlnaHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG4gIH07XG4gIHZpc2l0KHNvdXJjZSk7XG4gIHJldHVybiBvYmplY3RMaXRlcmFsO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIE9iamVjdE1lbWJlciA9IHsga2luZDogJ2V4dHJhJzsgaW5kZXg6IG51bWJlciB9IHwgeyBraW5kOiAncHJvcGVydHknOyBrZXk6IHN0cmluZyB9O1xuaW50ZXJmYWNlIFBhcnNlZE9iamVjdCB7XG4gIGV4dHJhTWVtYmVyczogc3RyaW5nW107XG4gIG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXTtcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+O1xufVxuaW50ZXJmYWNlIEV4dHJhY3RlZE9iamVjdExpdGVyYWwge1xuICBzb3VyY2U6IHRzLlNvdXJjZUZpbGU7XG4gIG5vZGU6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uO1xufVxuXG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRWYWx1ZSA9PiAoe1xuICBraW5kOiAnb2JqZWN0JyxcbiAgdmFsdWU6IHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXMsIGV4dHJhTWVtYmVycyksXG59KTtcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHRvUGFyc2VkT2JqZWN0KHtcbiAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgdXNlOiBhc09iamVjdCh7XG4gICAgYmFzZVVSTDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb25seS1vbi1mYWlsdXJlJ1wiKSxcbiAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ3JldGFpbi1vbi1mYWlsdXJlJyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gIH0pLFxuICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICBjb21tYW5kOiBsaXRlcmFsKFwiJ3lhcm4gc3RhcnQtdGVzdC1zZXJ2ZXInXCIpLFxuICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICB9KSxcbn0pO1xuXG5mdW5jdGlvbiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZE9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgZXh0cmFNZW1iZXJzLFxuICAgIG1lbWJlck9yZGVyOiBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5tYXAoKGtleSk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSkpLFxuICAgICAgLi4uZXh0cmFNZW1iZXJzLm1hcCgoXywgaW5kZXgpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSkpLFxuICAgIF0sXG4gICAgcHJvcGVydGllcyxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgcGxheXdyaWdodC5jb25maWcudHNgKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UGxheXdyaWdodENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBhc3NlcnROZXh0UHVibGljQmFzZVVybChjb25maWcuZGlyUGF0aCk7XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCA9IGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKG9sZENvbnRlbnQpO1xuICAgIGlmICghZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUsIGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuO1xuXG4gICAgLy8gS2VlcCBmaWxsaW5nIG1pc3NpbmcgZGVmYXVsdHMsIGJ1dCBkb24ndCBvdmVyd3JpdGUgbG9jYWwgYWRqdXN0bWVudHMgb24gZXZlcnkgcmVnZW5lcmF0aW9uLlxuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlUGFyc2VkT2JqZWN0cyhkZWZhdWx0Q29uZmlnLCBwYXJzZWQpO1xuICAgIGNvbnN0IGhhc1N0YXJ0VGVzdFNlcnZlciA9IEJvb2xlYW4oY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3Qtc2VydmVyJ10pO1xuICAgIGNvbnN0IGhhc0V4aXN0aW5nV2ViU2VydmVyID0gQm9vbGVhbihwYXJzZWQucHJvcGVydGllcy53ZWJTZXJ2ZXIpO1xuICAgIC8vIE9ubHkgZHJvcCB3YmZ5J3MgZGVmYXVsdCBzZXJ2ZXIgY29tbWFuZC4gUmVwb3Mgd2l0aCBjdXN0b20gUGxheXdyaWdodFxuICAgIC8vIHNlcnZlciBzZXR1cCBzdGlsbCBuZWVkIGl0IGV2ZW4gd2hlbiB0aGV5IGRvIG5vdCBleHBvc2Ugc3RhcnQtdGVzdC1zZXJ2ZXIuXG4gICAgaWYgKCFoYXNTdGFydFRlc3RTZXJ2ZXIgJiYgIWhhc0V4aXN0aW5nV2ViU2VydmVyKSB7XG4gICAgICBkZWxldGUgbWVyZ2VkLnByb3BlcnRpZXMud2ViU2VydmVyO1xuICAgIH1cbiAgICBzZXRXZWJTZXJ2ZXJDb21tYW5kKGNvbmZpZywgbWVyZ2VkKTtcblxuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlWYWx1ZSh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VkIH0sIDApO1xuICAgIGNvbnN0IHN0YXJ0ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldFN0YXJ0KGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBjb25zdCBlbmQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0RW5kKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgc3RhcnQpfSR7bmV3T2JqZWN0TGl0ZXJhbH0ke29sZENvbnRlbnQuc2xpY2UoZW5kKX1gO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlOiBQYXJzZWRPYmplY3QsIG92ZXJyaWRlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCBvdmVycmlkZVByb3BlcnR5S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMob3ZlcnJpZGUucHJvcGVydGllcykpO1xuICBjb25zdCBleHRyYU1lbWJlcnMgPSBbLi4uYmFzZS5leHRyYU1lbWJlcnMsIC4uLm92ZXJyaWRlLmV4dHJhTWVtYmVyc107XG4gIC8vIEtlZXAgZGVmYXVsdC1vbmx5IG1lbWJlcnMgYmVmb3JlIHBhcnNlZCBtZW1iZXJzIHNvIHNwcmVhZHMgYW5kIGV4cGxpY2l0IGxvY2FsIHByb3BlcnRpZXMgcmV0YWluIHByZWNlZGVuY2UuXG4gIGNvbnN0IG1lbWJlck9yZGVyID0gW1xuICAgIC4uLmJhc2UubWVtYmVyT3JkZXIuZmlsdGVyKChtZW1iZXIpID0+IG1lbWJlci5raW5kICE9PSAncHJvcGVydHknIHx8ICFvdmVycmlkZVByb3BlcnR5S2V5cy5oYXMobWVtYmVyLmtleSkpLFxuICAgIC4uLm92ZXJyaWRlLm1lbWJlck9yZGVyLm1hcCgobWVtYmVyKTogT2JqZWN0TWVtYmVyID0+IHtcbiAgICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5JykgcmV0dXJuIG1lbWJlcjtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdleHRyYScsIGluZGV4OiBiYXNlLmV4dHJhTWVtYmVycy5sZW5ndGggKyBtZW1iZXIuaW5kZXggfTtcbiAgICB9KSxcbiAgXTtcbiAgY29uc3QgcHJvcGVydGllcyA9IHsgLi4uYmFzZS5wcm9wZXJ0aWVzIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlLnByb3BlcnRpZXMpKSB7XG4gICAgcHJvcGVydGllc1trZXldID0gbWVyZ2VQYXJzZWRWYWx1ZShwcm9wZXJ0aWVzW2tleV0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4geyBleHRyYU1lbWJlcnMsIG1lbWJlck9yZGVyLCBwcm9wZXJ0aWVzIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkVmFsdWUoYmFzZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQsIG92ZXJyaWRlOiBQYXJzZWRWYWx1ZSk6IFBhcnNlZFZhbHVlIHtcbiAgaWYgKGJhc2U/LmtpbmQgPT09ICdvYmplY3QnICYmIG92ZXJyaWRlLmtpbmQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZS52YWx1ZSwgb3ZlcnJpZGUudmFsdWUpIH07XG4gIH1cbiAgcmV0dXJuIG92ZXJyaWRlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhc3NlcnROZXh0UHVibGljQmFzZVVybChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBlbnZGaWxlUGF0aCBvZiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKC9ORVhUX1BVQkxJQ19CQVNFX1VSTFxccyo9L20udGVzdChjb250ZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIGVudiBmaWxlcyBhcmUgZXhwZWN0ZWQgaW4gc29tZSByZXBvcy5cbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05FWFRfUFVCTElDX0JBU0VfVVJMIGlzIHJlcXVpcmVkIGZvciBQbGF5d3JpZ2h0LiBEZWZpbmUgTkVYVF9QVUJMSUNfQkFTRV9VUkwgaW4gdGhlIHRhcmdldCByZXBvLicpO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBlbnZGaWxlTmFtZXMgPSBbJy5lbnYnLCAnLmVudi50ZXN0JywgJy5lbnYuZXhhbXBsZScsICdtaXNlLnRvbWwnLCAnbWlzZS50ZXN0LnRvbWwnXTtcbiAgY29uc3QgZW52RmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAobGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpOyA7IGN1cnJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKSkge1xuICAgIGVudkZpbGVQYXRocy5wdXNoKC4uLmVudkZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsIGZpbGVOYW1lKSkpO1xuXG4gICAgLy8gUGxheXdyaWdodCBjb25maWdzIG9mdGVuIGxpdmUgaW4gcGFja2FnZXMvKiB3aGlsZSBzaGFyZWQgZW52IGZpbGVzIGxpdmUgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290LCBzbyB3YWxrIHVwd2FyZCB1bnRpbCB0aGUgdGFyZ2V0IHJlcG8gYm91bmRhcnkuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCAnLmdpdCcpKSkgYnJlYWs7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGVudkZpbGVQYXRocztcbn1cblxuZnVuY3Rpb24gc2V0V2ViU2VydmVyQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcsIG9iamVjdDogUGFyc2VkT2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IHdlYlNlcnZlciA9IG9iamVjdC5wcm9wZXJ0aWVzLndlYlNlcnZlcjtcbiAgaWYgKHdlYlNlcnZlcj8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICAvLyB3YmZ5IG93bnMgdGhlIHBhY2thZ2Ugc2NyaXB0LCBzbyBQbGF5d3JpZ2h0IHNob3VsZCBjb25zaXN0ZW50bHkgY2FsbCB0aGF0XG4gIC8vIHNjcmlwdCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSByZXN0IG9mIGVhY2ggcmVwb3NpdG9yeSdzIHdlYlNlcnZlciBzZXR0aW5ncy5cbiAgd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZCA9IGxpdGVyYWwoY29uZmlnLmlzQnVuID8gXCInYnVuIHN0YXJ0LXRlc3Qtc2VydmVyJ1wiIDogXCIneWFybiBzdGFydC10ZXN0LXNlcnZlcidcIik7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGNvbnRlbnQ6IHN0cmluZyk6IEV4dHJhY3RlZE9iamVjdExpdGVyYWwgfCB1bmRlZmluZWQge1xuICBjb25zdCBzb3VyY2UgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUsIHRzLlNjcmlwdEtpbmQuVFMpO1xuXG4gIC8vIFR5cGVTY3JpcHQgYWxyZWFkeSB1bmRlcnN0YW5kcyBuZXN0ZWQgb2JqZWN0IGxpdGVyYWxzIGFuZCB0ZW1wbGF0ZSBzdHJpbmdzLCBzbyB1c2VcbiAgLy8gaXRzIEFTVCByYW5nZXMgaW5zdGVhZCBvZiBhIHJlZ2V4IHRoYXQgY2FuIHN0b3AgYXQgdGhlIGZpcnN0IGlubmVyIGNsb3NpbmcgYnJhY2UuXG4gIGxldCBmb3VuZDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IHRzLk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoZm91bmQpIHJldHVybjtcbiAgICBpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpID09PSAnZGVmaW5lQ29uZmlnJykge1xuICAgICAgY29uc3QgZmlyc3RBcmd1bWVudCA9IG5vZGUuYXJndW1lbnRzWzBdO1xuICAgICAgaWYgKGZpcnN0QXJndW1lbnQgJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZ3VtZW50KSkge1xuICAgICAgICBmb3VuZCA9IGZpcnN0QXJndW1lbnQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgfTtcbiAgdmlzaXQoc291cmNlKTtcblxuICByZXR1cm4gZm91bmQgPyB7IHNvdXJjZSwgbm9kZTogZm91bmQgfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb246IHRzLkV4cHJlc3Npb24sIHNvdXJjZTogdHMuU291cmNlRmlsZSk6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBwYXJzZWRPYmplY3QgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNvdXJjZSk7XG4gICAgcmV0dXJuIHBhcnNlZE9iamVjdCA/IHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWRPYmplY3QgfSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmICh0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogdHMuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7IGV4dHJhTWVtYmVyczogW10sIG1lbWJlck9yZGVyOiBbXSwgcHJvcGVydGllczoge30gfTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAodHMuaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSBsaXRlcmFsKGtleSk7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIXRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fCAoIXRzLmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhdHMuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKSkge1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJzZWQuZXh0cmFNZW1iZXJzLnB1c2gocHJvcGVydHkuZ2V0VGV4dChzb3VyY2UpKSAtIDE7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyLCBzb3VyY2UpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVZhbHVlKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgaWYgKHZhbHVlLnZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdbXSc7XG4gICAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICAgIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xuICAgIH0pO1xuICAgIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xuICB9XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZTtcblxuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBlbWl0dGVkUHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSh2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlcik7XG4gIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWVtYmVyT3JkZXIuZmxhdE1hcCgobWVtYmVyLCBpbmRleCkgPT4ge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ2V4dHJhJykge1xuICAgICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RNZW1iZXIodmFsdWUudmFsdWUuZXh0cmFNZW1iZXJzW21lbWJlci5pbmRleF0gPz8gJycsIGluZGVudCldO1xuICAgIH1cblxuICAgIGlmIChsYXN0UHJvcGVydHlJbmRleEJ5S2V5LmdldChtZW1iZXIua2V5KSAhPT0gaW5kZXgpIHJldHVybiBbXTtcbiAgICBjb25zdCBpdGVtID0gdmFsdWUudmFsdWUucHJvcGVydGllc1ttZW1iZXIua2V5XTtcbiAgICBpZiAoIWl0ZW0gfHwgZW1pdHRlZFByb3BlcnRpZXMuaGFzKG1lbWJlci5rZXkpKSByZXR1cm4gW107XG4gICAgZW1pdHRlZFByb3BlcnRpZXMuYWRkKG1lbWJlci5rZXkpO1xuICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkobWVtYmVyLmtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCldO1xuICB9KTtcbiAgbGluZXMucHVzaChcbiAgICAuLi5PYmplY3QuZW50cmllcyh2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzKVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFlbWl0dGVkUHJvcGVydGllcy5oYXMoa2V5KSlcbiAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpKVxuICApO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIG1lbWJlcl0gb2YgbWVtYmVyT3JkZXIuZW50cmllcygpKSB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSB7XG4gICAgICBsYXN0UHJvcGVydHlJbmRleEJ5S2V5LnNldChtZW1iZXIua2V5LCBpbmRleCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBsYXN0UHJvcGVydHlJbmRleEJ5S2V5O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXk6IHN0cmluZywgaXRlbTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgIH1cbiAgfVxuICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RNZW1iZXIobWVtYmVyOiBzdHJpbmcsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBtZW1iZXIuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIHN0cmluZ2lmaWVkLmVudHJpZXMoKSkge1xuICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke2xpbmV9YDtcbiAgfVxuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG4iLCJleHBvcnQgY29uc3QgZ2xvYklnbm9yZSA9IFtcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi8udmVudi8qKicsXG4gICcqKi90ZXN0LWZpeHR1cmVzLyoqJyxcbiAgJyoqL3Rlc3QvZml4dHVyZXMvKionLFxuICAnKiovZGlzdC8qKicsXG4gICcqKi9idWlsZC8qKicsXG4gICcqKi90YXJnZXQvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi90bXAvKionLFxuXTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UHJpc21hRW52RmlsZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UHJpc21hRW52RmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW52RmlsZXMgPSBhd2FpdCBmZy5nbG9iKFsnKi5lbnYnLCAnKi5lbnYuKiddLCB7IGRvdDogdHJ1ZSwgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGZvciAoY29uc3QgZW52RmlsZSBvZiBlbnZGaWxlcykge1xuICAgICAgY29uc3QgZW52RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGVudkZpbGUpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbChcbiAgICAgICAgL0RBVEFCQVNFX1VSTFxccyo9XFxzKlwiPyhbXlwiI1xcbl0rP1xcLnNxbGl0ZTNbXlwiI1xcbl0qKVwiPy9nLFxuICAgICAgICAobWF0Y2gsIHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnY29ubmVjdGlvbl9saW1pdD0xJykpIHJldHVybiBtYXRjaDtcbiAgICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSB1cmwuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/JztcbiAgICAgICAgICByZXR1cm4gYERBVEFCQVNFX1VSTD1cIiR7dXJsfSR7c2VwYXJhdG9yfWNvbm5lY3Rpb25fbGltaXQ9MVwiYDtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShlbnZGaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsImNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0T2JqZWN0QnlLZXlOYW1lTGlzdChvYmplY3QsIHNvcnRXaXRoKSB7XG4gIGxldCBrZXlzLCBzb3J0Rm4sIGtleVxuXG4gIGlmICh0eXBlb2Ygc29ydFdpdGggPT09ICdmdW5jdGlvbicpIHtcbiAgICBzb3J0Rm4gPSBzb3J0V2l0aFxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBzb3J0V2l0aFxuICB9XG5cbiAgY29uc3QgdG90YWwgPSB7fVxuICBjb25zdCBvYmplY3RLZXlzID0gWy4uLihrZXlzID8/IFtdKSwgLi4uT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KHNvcnRGbildXG5cbiAgZm9yIChrZXkgb2Ygb2JqZWN0S2V5cykge1xuICAgIGlmIChoYXMob2JqZWN0LCBrZXkpKSB7XG4gICAgICB0b3RhbFtrZXldID0gb2JqZWN0W2tleV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG90YWxcbn1cbiIsIi8vIERldGVjdCBlaXRoZXIgc3BhY2VzIG9yIHRhYnMgYnV0IG5vdCBib3RoIHRvIHByb3Blcmx5IGhhbmRsZSB0YWJzIGZvciBpbmRlbnRhdGlvbiBhbmQgc3BhY2VzIGZvciBhbGlnbm1lbnRcbmNvbnN0IElOREVOVF9SRUdFWCA9IC9eKD86KCApK3xcXHQrKS87XG5cbmNvbnN0IElOREVOVF9UWVBFX1NQQUNFID0gJ3NwYWNlJztcbmNvbnN0IElOREVOVF9UWVBFX1RBQiA9ICd0YWInO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIGlnbm9yZSBzaW5nbGUgc3BhY2UgcGF0dGVybnNcbmZ1bmN0aW9uIHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgdmFsdWUpIHtcblx0cmV0dXJuIGlnbm9yZVNpbmdsZVNwYWNlcyAmJiBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSAmJiB2YWx1ZSA9PT0gMTtcbn1cblxuLyoqXG5NYWtlIGEgTWFwIHRoYXQgY291bnRzIGhvdyBtYW55IGluZGVudHMvdW5pbmRlbnRzIGhhdmUgb2NjdXJyZWQgZm9yIGEgZ2l2ZW4gc2l6ZSBhbmQgaG93IG1hbnkgbGluZXMgZm9sbG93IGEgZ2l2ZW4gaW5kZW50YXRpb24uXG5cblRoZSBrZXkgaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBpbmRlbnRhdGlvbiB0eXBlIChzID0gc3BhY2UgYW5kIHQgPSB0YWIpIGFuZCB0aGUgc2l6ZSBvZiB0aGUgaW5kZW50cy91bmluZGVudHMuXG5cbmBgYFxuaW5kZW50cyA9IHtcblx0dDM6IFsxLCAwXSxcblx0dDQ6IFsxLCA1XSxcblx0czU6IFsxLCAwXSxcblx0czEyOiBbMSwgMF0sXG59XG5gYGBcbiovXG5mdW5jdGlvbiBtYWtlSW5kZW50c01hcChzdHJpbmcsIGlnbm9yZVNpbmdsZVNwYWNlcykge1xuXHRjb25zdCBpbmRlbnRzID0gbmV3IE1hcCgpO1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBzaXplIG9mIHByZXZpb3VzIGxpbmUncyBpbmRlbnRhdGlvblxuXHRsZXQgcHJldmlvdXNTaXplID0gMDtcblx0bGV0IHByZXZpb3VzSW5kZW50VHlwZTtcblxuXHQvLyBJbmRlbnRzIGtleSAoaWRlbnQgdHlwZSArIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzKVxuXHRsZXQga2V5O1xuXG5cdGZvciAoY29uc3QgbGluZSBvZiBzdHJpbmcuc3BsaXQoL1xcbi9nKSkge1xuXHRcdGlmICghbGluZSkge1xuXHRcdFx0Ly8gSWdub3JlIGVtcHR5IGxpbmVzXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBtYXRjaGVzID0gbGluZS5tYXRjaChJTkRFTlRfUkVHRVgpO1xuXG5cdFx0aWYgKG1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHRwcmV2aW91c0luZGVudFR5cGUgPSAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgaW5kZW50ID0gbWF0Y2hlc1swXS5sZW5ndGg7XG5cdFx0XHRjb25zdCBpbmRlbnRUeXBlID0gbWF0Y2hlc1sxXSA/IElOREVOVF9UWVBFX1NQQUNFIDogSU5ERU5UX1RZUEVfVEFCO1xuXG5cdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIHVubGVzcyBpdCdzIHRoZSBvbmx5IGluZGVudCBkZXRlY3RlZCB0byBwcmV2ZW50IGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXNcblx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGluZGVudCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpbmRlbnRUeXBlICE9PSBwcmV2aW91c0luZGVudFR5cGUpIHtcblx0XHRcdFx0cHJldmlvdXNTaXplID0gMDtcblx0XHRcdH1cblxuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gaW5kZW50VHlwZTtcblxuXHRcdFx0bGV0IHVzZSA9IDE7XG5cdFx0XHRsZXQgd2VpZ2h0ID0gMDtcblxuXHRcdFx0Y29uc3QgaW5kZW50RGlmZmVyZW5jZSA9IGluZGVudCAtIHByZXZpb3VzU2l6ZTtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IGluZGVudDtcblxuXHRcdFx0Ly8gUHJldmlvdXMgbGluZSBoYXZlIHNhbWUgaW5kZW50P1xuXHRcdFx0aWYgKGluZGVudERpZmZlcmVuY2UgPT09IDApIHtcblx0XHRcdFx0Ly8gTm90IGEgbmV3IFwidXNlXCIgb2YgdGhlIGN1cnJlbnQgaW5kZW50OlxuXHRcdFx0XHR1c2UgPSAwO1xuXHRcdFx0XHQvLyBCdXQgZG8gYWRkIGEgYml0IHRvIGl0IGZvciBicmVha2luZyB0aWVzOlxuXHRcdFx0XHR3ZWlnaHQgPSAxO1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGtleSBmcm9tIHByZXZpb3VzIGxvb3Bcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSA9IE1hdGguYWJzKGluZGVudERpZmZlcmVuY2UpO1xuXG5cdFx0XHRcdC8vIElnbm9yZSBzaW5nbGUgc3BhY2UgY2hhbmdlcyB3aGVuIGlnbm9yZVNpbmdsZVNwYWNlcyBpcyB0cnVlXG5cdFx0XHRcdC8vIFRoaXMgcHJldmVudHMgY29tbW9uIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHRoaW5ncyBsaWtlIGFsaWduZWQgY29tbWVudHNcblx0XHRcdFx0aWYgKHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0gZW5jb2RlSW5kZW50c0tleShpbmRlbnRUeXBlLCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHN0YXRzXG5cdFx0XHRjb25zdCBlbnRyeSA9IGluZGVudHMuZ2V0KGtleSk7XG5cdFx0XHRpbmRlbnRzLnNldChrZXksIGVudHJ5ID09PSB1bmRlZmluZWQgPyBbMSwgMF0gOiBbZW50cnlbMF0gKyB1c2UsIGVudHJ5WzFdICsgd2VpZ2h0XSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGluZGVudHM7XG59XG5cbi8vIEVuY29kZSB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBhcyBhIHN0cmluZyAoZS5nLiAnczQnKSBmb3IgdXNlIGFzIGEgY29tcG91bmQga2V5IGluIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgaW5kZW50QW1vdW50KSB7XG5cdGNvbnN0IHR5cGVDaGFyYWN0ZXIgPSBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICdzJyA6ICd0Jztcblx0cmV0dXJuIHR5cGVDaGFyYWN0ZXIgKyBTdHJpbmcoaW5kZW50QW1vdW50KTtcbn1cblxuLy8gRXh0cmFjdCB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBmcm9tIGEga2V5IG9mIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGRlY29kZUluZGVudHNLZXkoaW5kZW50c0tleSkge1xuXHRjb25zdCBrZXlIYXNUeXBlU3BhY2UgPSBpbmRlbnRzS2V5WzBdID09PSAncyc7XG5cdGNvbnN0IHR5cGUgPSBrZXlIYXNUeXBlU3BhY2UgPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRjb25zdCBhbW91bnQgPSBOdW1iZXIoaW5kZW50c0tleS5zbGljZSgxKSk7XG5cblx0cmV0dXJuIHt0eXBlLCBhbW91bnR9O1xufVxuXG4vLyBSZXR1cm4gdGhlIGtleSAoZS5nLiAnczQnKSBmcm9tIHRoZSBpbmRlbnRzIE1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIG1vc3QgY29tbW9uIGluZGVudCxcbi8vIG9yIHJldHVybiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIGluZGVudHMuXG5mdW5jdGlvbiBnZXRNb3N0VXNlZEtleShpbmRlbnRzKSB7XG5cdGxldCByZXN1bHQ7XG5cdGxldCBtYXhVc2VkID0gMDtcblx0bGV0IG1heFdlaWdodCA9IDA7XG5cblx0Zm9yIChjb25zdCBba2V5LCBbdXNlZENvdW50LCB3ZWlnaHRdXSBvZiBpbmRlbnRzKSB7XG5cdFx0aWYgKHVzZWRDb3VudCA+IG1heFVzZWQgfHwgKHVzZWRDb3VudCA9PT0gbWF4VXNlZCAmJiB3ZWlnaHQgPiBtYXhXZWlnaHQpKSB7XG5cdFx0XHRtYXhVc2VkID0gdXNlZENvdW50O1xuXHRcdFx0bWF4V2VpZ2h0ID0gd2VpZ2h0O1xuXHRcdFx0cmVzdWx0ID0ga2V5O1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KSB7XG5cdGNvbnN0IGluZGVudENoYXJhY3RlciA9IHR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFID8gJyAnIDogJ1xcdCc7XG5cdHJldHVybiBpbmRlbnRDaGFyYWN0ZXIucmVwZWF0KGFtb3VudCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdEluZGVudChzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdC8vIElkZW50aWZ5IGluZGVudHMgd2hpbGUgc2tpcHBpbmcgc2luZ2xlIHNwYWNlIGluZGVudHMgdG8gYXZvaWQgY29tbW9uIGVkZ2UgY2FzZXMgKGUuZy4gY29kZSBjb21tZW50cylcblx0Ly8gSWYgbm8gaW5kZW50cyBhcmUgaWRlbnRpZmllZCwgcnVuIGFnYWluIGFuZCBpbmNsdWRlIGFsbCBpbmRlbnRzIGZvciBjb21wcmVoZW5zaXZlIGRldGVjdGlvblxuXHRsZXQgaW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgdHJ1ZSk7XG5cdGlmIChpbmRlbnRzLnNpemUgPT09IDApIHtcblx0XHRpbmRlbnRzID0gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBmYWxzZSk7XG5cdH1cblxuXHRjb25zdCBrZXlPZk1vc3RVc2VkSW5kZW50ID0gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cyk7XG5cblx0bGV0IHR5cGU7XG5cdGxldCBhbW91bnQgPSAwO1xuXHRsZXQgaW5kZW50ID0gJyc7XG5cblx0aWYgKGtleU9mTW9zdFVzZWRJbmRlbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdCh7dHlwZSwgYW1vdW50fSA9IGRlY29kZUluZGVudHNLZXkoa2V5T2ZNb3N0VXNlZEluZGVudCkpO1xuXHRcdGluZGVudCA9IG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0YW1vdW50LFxuXHRcdHR5cGUsXG5cdFx0aW5kZW50LFxuXHR9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGRldGVjdE5ld2xpbmUoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHRjb25zdCBuZXdsaW5lcyA9IHN0cmluZy5tYXRjaCgvKD86XFxyP1xcbikvZykgfHwgW107XG5cblx0aWYgKG5ld2xpbmVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGNybGYgPSBuZXdsaW5lcy5maWx0ZXIobmV3bGluZSA9PiBuZXdsaW5lID09PSAnXFxyXFxuJykubGVuZ3RoO1xuXHRjb25zdCBsZiA9IG5ld2xpbmVzLmxlbmd0aCAtIGNybGY7XG5cblx0cmV0dXJuIGNybGYgPiBsZiA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lR3JhY2VmdWwoc3RyaW5nKSB7XG5cdHJldHVybiAodHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycgJiYgZGV0ZWN0TmV3bGluZShzdHJpbmcpKSB8fCAnXFxuJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHNvcnRPYmplY3RLZXlzIGZyb20gJ3NvcnQtb2JqZWN0LWtleXMnXG5pbXBvcnQgZGV0ZWN0SW5kZW50IGZyb20gJ2RldGVjdC1pbmRlbnQnXG5pbXBvcnQgeyBkZXRlY3ROZXdsaW5lR3JhY2VmdWwgYXMgZGV0ZWN0TmV3bGluZSB9IGZyb20gJ2RldGVjdC1uZXdsaW5lJ1xuaW1wb3J0IGdpdEhvb2tzIGZyb20gJ2dpdC1ob29rcy1saXN0J1xuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnaXMtcGxhaW4tb2JqJ1xuaW1wb3J0IHNlbXZlckNvbXBhcmUgZnJvbSAnc2VtdmVyL2Z1bmN0aW9ucy9jb21wYXJlLmpzJ1xuaW1wb3J0IHNlbXZlck1pblZlcnNpb24gZnJvbSAnc2VtdmVyL3Jhbmdlcy9taW4tdmVyc2lvbi5qcydcblxuY29uc3QgcGlwZSA9XG4gIChmbnMpID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGZucy5yZWR1Y2UoKHJlc3VsdCwgZm4pID0+IGZuKHJlc3VsdCwgLi4uYXJncyksIHgpXG5jb25zdCBvbkFycmF5ID0gKGZuKSA9PiAoeCkgPT4gKEFycmF5LmlzQXJyYXkoeCkgPyBmbih4KSA6IHgpXG5jb25zdCBvblN0cmluZ0FycmF5ID0gKGZuKSA9PiAoeCkgPT5cbiAgQXJyYXkuaXNBcnJheSh4KSAmJiB4LmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpID8gZm4oeCkgOiB4XG5jb25zdCB1bmlxID0gb25TdHJpbmdBcnJheSgoeHMpID0+IFsuLi5uZXcgU2V0KHhzKV0pXG5jb25zdCBzb3J0QXJyYXkgPSBvblN0cmluZ0FycmF5KChhcnJheSkgPT4gYXJyYXkudG9Tb3J0ZWQoKSlcbmNvbnN0IHVuaXFBbmRTb3J0QXJyYXkgPSBwaXBlKFt1bmlxLCBzb3J0QXJyYXldKVxuY29uc3Qgb25PYmplY3QgPVxuICAoZm4pID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGlzUGxhaW5PYmplY3QoeCkgPyBmbih4LCAuLi5hcmdzKSA6IHhcbmNvbnN0IHNvcnRPYmplY3RCeSA9IChjb21wYXJhdG9yLCBkZWVwKSA9PiB7XG4gIGNvbnN0IG92ZXIgPSBvbk9iamVjdCgob2JqZWN0KSA9PiB7XG4gICAgaWYgKGRlZXApIHtcbiAgICAgIG9iamVjdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMob2JqZWN0KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgb3Zlcih2YWx1ZSldKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMob2JqZWN0LCBjb21wYXJhdG9yKVxuICB9KVxuXG4gIHJldHVybiBvdmVyXG59XG5jb25zdCBvYmplY3RHcm91cEJ5ID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvZXMtYnVpbHRpbnMsIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvZXMtc3ludGF4IC0tIFNhZmVcbiAgT2JqZWN0Lmdyb3VwQnkgfHxcbiAgLy8gUmVtb3ZlIHRoaXMgd2hlbiB3ZSBkcm9wIHN1cHBvcnQgZm9yIE5vZGUuanMgMjBcbiAgKChhcnJheSwgY2FsbGJhY2spID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhcnJheSkge1xuICAgICAgY29uc3Qga2V5ID0gY2FsbGJhY2sodmFsdWUpXG4gICAgICBpZiAocmVzdWx0W2tleV0pIHtcbiAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gW3ZhbHVlXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH0pXG5jb25zdCBzb3J0T2JqZWN0ID0gc29ydE9iamVjdEJ5KClcbmNvbnN0IHNvcnRVUkxPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyd0eXBlJywgJ3VybCddKVxuY29uc3Qgc29ydFBlb3BsZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ25hbWUnLCAnZW1haWwnLCAndXJsJ10pXG5jb25zdCBzb3J0RGlyZWN0b3JpZXMgPSBzb3J0T2JqZWN0QnkoW1xuICAnbGliJyxcbiAgJ2JpbicsXG4gICdtYW4nLFxuICAnZG9jJyxcbiAgJ2V4YW1wbGUnLFxuICAndGVzdCcsXG5dKVxuY29uc3Qgb3ZlclByb3BlcnR5ID0gKHByb3BlcnR5LCBvdmVyKSA9PlxuICBvbk9iamVjdCgob2JqZWN0LCAuLi5hcmdzKSA9PlxuICAgIE9iamVjdC5oYXNPd24ob2JqZWN0LCBwcm9wZXJ0eSlcbiAgICAgID8geyAuLi5vYmplY3QsIFtwcm9wZXJ0eV06IG92ZXIob2JqZWN0W3Byb3BlcnR5XSwgLi4uYXJncykgfVxuICAgICAgOiBvYmplY3QsXG4gIClcbmNvbnN0IHNvcnRHaXRIb29rcyA9IHNvcnRPYmplY3RCeShnaXRIb29rcylcblxuY29uc3QgcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlID0gKHNwZWNpZmllcikgPT4ge1xuICAvLyBJZ25vcmUgYW55dGhpbmcgYWZ0ZXIgPiAmIHJlbHkgb24gZmFsbGJhY2sgYWxwaGFudW1lcmljIHNvcnRpbmcgZm9yIHRoYXRcbiAgY29uc3QgW25hbWVBbmRWZXJzaW9uXSA9IHNwZWNpZmllci5zcGxpdCgnPicpXG4gIGNvbnN0IGF0TWF0Y2hlcyA9IFsuLi5uYW1lQW5kVmVyc2lvbi5tYXRjaEFsbCgnQCcpXVxuICBpZiAoXG4gICAgIWF0TWF0Y2hlcy5sZW5ndGggfHxcbiAgICAoYXRNYXRjaGVzLmxlbmd0aCA9PT0gMSAmJiBhdE1hdGNoZXNbMF0uaW5kZXggPT09IDApXG4gICkge1xuICAgIHJldHVybiB7IG5hbWU6IHNwZWNpZmllciB9XG4gIH1cbiAgY29uc3Qgc3BsaXRJbmRleCA9IGF0TWF0Y2hlcy5wb3AoKS5pbmRleFxuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZygwLCBzcGxpdEluZGV4KSxcbiAgICByYW5nZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKHNwbGl0SW5kZXggKyAxKSxcbiAgfVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlTZW12ZXIgPSBzb3J0T2JqZWN0QnkoKGEsIGIpID0+IHtcbiAgY29uc3QgeyBuYW1lOiBhTmFtZSwgcmFuZ2U6IGFSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGEpXG4gIGNvbnN0IHsgbmFtZTogYk5hbWUsIHJhbmdlOiBiUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShiKVxuXG4gIGlmIChhTmFtZSAhPT0gYk5hbWUpIHtcbiAgICByZXR1cm4gYU5hbWUubG9jYWxlQ29tcGFyZShiTmFtZSwgJ2VuJylcbiAgfVxuICBpZiAoIWFSYW5nZSkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmICghYlJhbmdlKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuICByZXR1cm4gc2VtdmVyQ29tcGFyZShzZW12ZXJNaW5WZXJzaW9uKGFSYW5nZSksIHNlbXZlck1pblZlcnNpb24oYlJhbmdlKSlcbn0pXG5cbmNvbnN0IGdldFBhY2thZ2VOYW1lID0gKGlkZW50KSA9PiB7XG4gIGNvbnN0IGluZGV4ID0gaWRlbnQuaW5kZXhPZignQCcsIGlkZW50LnN0YXJ0c1dpdGgoJ0AnKSA/IDEgOiAwKVxuICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCB1bmxlc3MgdXNlciBtYW51YWxseSBlZGl0IHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICByZXR1cm4gaW5kZXggPT09IC0xID8gaWRlbnQgOiBpZGVudC5zbGljZSgwLCBpbmRleClcbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5SWRlbnQgPSAoYSwgYikgPT4ge1xuICBjb25zdCBwYWNrYWdlTmFtZUEgPSBnZXRQYWNrYWdlTmFtZShhKVxuICBjb25zdCBwYWNrYWdlTmFtZUIgPSBnZXRQYWNrYWdlTmFtZShiKVxuXG4gIGlmIChwYWNrYWdlTmFtZUEgPCBwYWNrYWdlTmFtZUIpIHJldHVybiAtMVxuICBpZiAocGFja2FnZU5hbWVBID4gcGFja2FnZU5hbWVCKSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBDYWNoZSBieSBgcHJvY2Vzcy5jd2QoKWAgaW5zdGVhZCBvZiBhIHZhcmlhYmxlIHRvIGFsbG93IHVzZXIgY2FsbCBgcHJvY2Vzcy5jaGRpcigpYFxuY29uc3QgY2FjaGUgPSBuZXcgTWFwKClcbmNvbnN0IGhhc1lhcm5PclBucG1GaWxlcyA9ICgpID0+IHtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKVxuICBpZiAoIWNhY2hlLmhhcyhjd2QpKSB7XG4gICAgY2FjaGUuc2V0KFxuICAgICAgY3dkLFxuICAgICAgZnMuZXhpc3RzU3luYygneWFybi5sb2NrJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm4vJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm5yYy55bWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLWxvY2sueWFtbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0td29ya3NwYWNlLnlhbWwnKSxcbiAgICApXG4gIH1cbiAgcmV0dXJuIGNhY2hlLmdldChjd2QpXG59XG5cbi8qKlxuICogRGV0ZWN0cyB0aGUgcGFja2FnZSBtYW5hZ2VyIGZyb20gcGFja2FnZS5qc29uIGFuZCBsb2NrIGZpbGVzXG4gKiBAcGFyYW0ge29iamVjdH0gcGFja2FnZUpzb24gLSBUaGUgcGFyc2VkIHBhY2thZ2UuanNvbiBvYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRoZSBkZXRlY3RlZCBwYWNrYWdlIG1hbmFnZXIuIERlZmF1bHQgdG8gbnBtIGlmIG5vdCBkZXRlY3RlZC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pIHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9jb3JlcGFja1xuICBpZiAodHlwZW9mIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlci5zdGFydHNXaXRoKCducG1AJylcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5kZXZFbmdpbmVzPy5wYWNrYWdlTWFuYWdlcj8ubmFtZSkge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5kZXZFbmdpbmVzLnBhY2thZ2VNYW5hZ2VyLm5hbWUgPT09ICducG0nXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24ucG5wbSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gT3B0aW1pc2F0aW9uOiBDaGVjayBpZiBucG0gaXMgZXhwbGljaXQgYmVmb3JlIHJlYWRpbmcgRlMuXG4gIGlmIChwYWNrYWdlSnNvbi5lbmdpbmVzPy5ucG0pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGhhc1lhcm5PclBucG1GaWxlcygpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIFNvcnQgZGVwZW5kZW5jaWVzIGFscGhhYmV0aWNhbGx5LCBkZXRlY3RpbmcgcGFja2FnZSBtYW5hZ2VyIHRvIHVzZSB0aGVcbiAqIGFwcHJvcHJpYXRlIGNvbXBhcmlzb24uIG5wbSB1c2VzIGxvY2FsZS1hd2FyZSBjb21wYXJpc29uLCB5YXJuIGFuZCBwbnBtIHVzZVxuICogc2ltcGxlIHN0cmluZyBjb21wYXJpc29uXG4gKi9cbmNvbnN0IHNvcnREZXBlbmRlbmNpZXMgPSBvbk9iamVjdCgoZGVwZW5kZW5jaWVzLCBwYWNrYWdlSnNvbikgPT4ge1xuICAvLyBBdm9pZCBmaWxlIGFjY2Vzc1xuICBpZiAoT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzKS5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIGRlcGVuZGVuY2llc1xuICB9XG5cbiAgLy8gc29ydCBkZXBzIGxpa2UgdGhlIG5wbSBDTEkgZG9lcyAodmlhIHRoZSBwYWNrYWdlIEBucG1jbGkvcGFja2FnZS1qc29uKVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbnBtL3BhY2thZ2UtanNvbi9ibG9iL2I2NDY1ZjQ0YzcyN2Q2NTEzZGI2ODk4YzdjYmU0MWRkMzU1Y2ViZTgvbGliL3VwZGF0ZS1kZXBlbmRlbmNpZXMuanMjTDgtTDIxXG4gIGlmIChzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikpIHtcbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzLCAoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIsICdlbicpKVxuICB9XG5cbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcylcbn0pXG5cbi8qKlxuICogXCJ3b3Jrc3BhY2VzXCIgY2FuIGJlIGFuIGFycmF5IChucG0gb3IgeWFybiBjbGFzc2ljKSBvciBhbiBvYmplY3QgKHBucG0vYnVuKS5cbiAqIEluIHRoZSBjYXNlIG9mIGFuIGFycmF5LCB3ZSBkbyBub3Qgd2FudCB0byBhbHBoYWJldGljYWxseSBzb3J0IGl0IGluIGNhc2VcbiAqIHNjcmlwdHMgbmVlZCB0byBydW4gaW4gYSBzcGVjaWZpYyBvcmRlci5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3Y3L3VzaW5nLW5wbS93b3Jrc3BhY2VzP3Y9dHJ1ZSNydW5uaW5nLWNvbW1hbmRzLWluLXRoZS1jb250ZXh0LW9mLXdvcmtzcGFjZXNcbiAqL1xuY29uc3Qgc29ydFdvcmtzcGFjZXMgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KFsncGFja2FnZXMnLCAnY2F0YWxvZyddKSxcbiAgb3ZlclByb3BlcnR5KCdwYWNrYWdlcycsIHVuaXFBbmRTb3J0QXJyYXkpLFxuICBvdmVyUHJvcGVydHkoJ2NhdGFsb2cnLCBzb3J0RGVwZW5kZW5jaWVzKSxcbl0pXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2Jsb2IvYWNjMGU0NzU3MmE5MzkwMjkyYjRlMzEzYjRhNGJmMzYwZDIzNjM1OC9jb25mL2NvbmZpZy1zY2hlbWEuanNcbmNvbnN0IGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzID0gW1xuICAvLyBgZmlsZXNgIGFuZCBgZXhjbHVkZWRGaWxlc2AgYXJlIG9ubHkgb24gYG92ZXJyaWRlc1tdYFxuICAvLyBmb3IgZWFzaWVyIHNvcnQgYG92ZXJyaWRlc1tdYCxcbiAgLy8gYWRkIHRoZW0gdG8gaGVyZSwgc28gd2UgZG9uJ3QgbmVlZCBzb3J0IGBvdmVycmlkZXNbXWAgdHdpY2VcbiAgJ2ZpbGVzJyxcbiAgJ2V4Y2x1ZGVkRmlsZXMnLFxuICAvLyBiYXNlQ29uZmlnXG4gICdlbnYnLFxuICAncGFyc2VyJyxcbiAgJ3BhcnNlck9wdGlvbnMnLFxuICAnc2V0dGluZ3MnLFxuICAncGx1Z2lucycsXG4gICdleHRlbmRzJyxcbiAgJ3J1bGVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdnbG9iYWxzJyxcbiAgJ3Byb2Nlc3NvcicsXG4gICdub0lubGluZUNvbmZpZycsXG4gICdyZXBvcnRVbnVzZWREaXNhYmxlRGlyZWN0aXZlcycsXG5dXG5jb25zdCBzb3J0RXNsaW50Q29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyksXG4gIG92ZXJQcm9wZXJ0eSgnZW52Jywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eSgnZ2xvYmFscycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PiBvdmVycmlkZXMubWFwKHNvcnRFc2xpbnRDb25maWcpKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdwYXJzZXJPcHRpb25zJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAncnVsZXMnLFxuICAgIHNvcnRPYmplY3RCeShcbiAgICAgIChydWxlMSwgcnVsZTIpID0+XG4gICAgICAgIHJ1bGUxLnNwbGl0KCcvJykubGVuZ3RoIC0gcnVsZTIuc3BsaXQoJy8nKS5sZW5ndGggfHxcbiAgICAgICAgcnVsZTEubG9jYWxlQ29tcGFyZShydWxlMiksXG4gICAgKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdzZXR0aW5ncycsIHNvcnRPYmplY3QpLFxuXSlcbmNvbnN0IHNvcnRWU0NvZGVCYWRnZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ2Rlc2NyaXB0aW9uJywgJ3VybCcsICdocmVmJ10pXG5cbmNvbnN0IHNvcnRQcmV0dGllckNvbmZpZyA9IHBpcGUoW1xuICAvLyBzb3J0IGtleXMgYWxwaGFiZXRpY2FsbHksIGJ1dCBwdXQgYG92ZXJyaWRlc2AgYXQgYm90dG9tXG4gIG9uT2JqZWN0KChjb25maWcpID0+XG4gICAgc29ydE9iamVjdEtleXMoY29uZmlnLCBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhjb25maWcpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSAnb3ZlcnJpZGVzJylcbiAgICAgICAgLnNvcnQoKSxcbiAgICAgICdvdmVycmlkZXMnLFxuICAgIF0pLFxuICApLFxuICAvLyBpZiBgY29uZmlnLm92ZXJyaWRlc2AgZXhpc3RzXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICAvLyBhbmQgYGNvbmZpZy5vdmVycmlkZXNgIGlzIGFuIGFycmF5XG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PlxuICAgICAgb3ZlcnJpZGVzLm1hcChcbiAgICAgICAgcGlwZShbXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIHNvcnRPYmplY3QsXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdLm9wdGlvbnNgIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgb3ZlclByb3BlcnR5KCdvcHRpb25zJywgc29ydE9iamVjdCksXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICApLFxuICApLFxuXSlcblxuY29uc3Qgc29ydFZvbHRhID0gc29ydE9iamVjdEJ5KFsnbm9kZScsICducG0nLCAneWFybiddKVxuY29uc3Qgc29ydERldkVuZ2luZXMgPSBvdmVyUHJvcGVydHkoXG4gICdwYWNrYWdlTWFuYWdlcicsXG4gIHNvcnRPYmplY3RCeShbJ25hbWUnLCAndmVyc2lvbicsICdvbkZhaWwnXSksXG4pXG5cbmNvbnN0IHBucG1CYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgJ3BlZXJEZXBlbmRlbmN5UnVsZXMnLFxuICAnbmV2ZXJCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzRmlsZScsXG4gICdhbGxvd2VkRGVwcmVjYXRlZFZlcnNpb25zJyxcbiAgJ2FsbG93Tm9uQXBwbGllZFBhdGNoZXMnLFxuICAndXBkYXRlQ29uZmlnJyxcbiAgJ2F1ZGl0Q29uZmlnJyxcbiAgJ3JlcXVpcmVkU2NyaXB0cycsXG4gICdzdXBwb3J0ZWRBcmNoaXRlY3R1cmVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdwYXRjaGVkRGVwZW5kZW5jaWVzJyxcbiAgJ3BhY2thZ2VFeHRlbnNpb25zJyxcbl1cblxuY29uc3Qgc29ydFBucG1Db25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KHBucG1CYXNlQ29uZmlnUHJvcGVydGllcywgdHJ1ZSksXG4gIG92ZXJQcm9wZXJ0eSgnb3ZlcnJpZGVzJywgc29ydE9iamVjdEJ5U2VtdmVyKSxcbl0pXG5cbi8vIFNlZSBodHRwczovL2RvY3MubnBtanMuY29tL21pc2Mvc2NyaXB0c1xuY29uc3QgZGVmYXVsdE5wbVNjcmlwdHMgPSBuZXcgU2V0KFtcbiAgJ2luc3RhbGwnLFxuICAncGFjaycsXG4gICdwcmVwYXJlJyxcbiAgJ3B1Ymxpc2gnLFxuICAncmVzdGFydCcsXG4gICdzaHJpbmt3cmFwJyxcbiAgJ3N0YXJ0JyxcbiAgJ3N0b3AnLFxuICAndGVzdCcsXG4gICd1bmluc3RhbGwnLFxuICAndmVyc2lvbicsXG5dKVxuXG5jb25zdCBoYXNEZXZEZXBlbmRlbmN5ID0gKGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uKSA9PiB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbiwgJ2RldkRlcGVuZGVuY2llcycpICYmXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3kpXG4gIClcbn1cblxuY29uc3QgcnVuU1JlZ0V4cCA9XG4gIC8oPzw9XnxbXFxzJjs8PnwoXSkoPzpydW4tc3xucG0tcnVuLWFsbDI/IC4qKD86LS1zZXF1ZW50aWFsfC0tc2VyaWFsfC1zKSkoPz0kfFtcXHMmOzw+fCldKS9cblxuY29uc3QgaXNTZXF1ZW50aWFsU2NyaXB0ID0gKGNvbW1hbmQpID0+XG4gIGNvbW1hbmQuaW5jbHVkZXMoJyonKSAmJiBydW5TUmVnRXhwLnRlc3QoY29tbWFuZClcblxuY29uc3QgaGFzU2VxdWVudGlhbFNjcmlwdCA9IChwYWNrYWdlSnNvbikgPT4ge1xuICBpZiAoXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsJywgcGFja2FnZUpzb24pICYmXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsMicsIHBhY2thZ2VKc29uKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBzY3JpcHRzID0gWydzY3JpcHRzJywgJ2JldHRlclNjcmlwdHMnXS5mbGF0TWFwKChmaWVsZCkgPT5cbiAgICBwYWNrYWdlSnNvbltmaWVsZF0gPyBPYmplY3QudmFsdWVzKHBhY2thZ2VKc29uW2ZpZWxkXSkgOiBbXSxcbiAgKVxuICByZXR1cm4gc2NyaXB0cy5zb21lKChzY3JpcHQpID0+IGlzU2VxdWVudGlhbFNjcmlwdChzY3JpcHQpKVxufVxuXG5mdW5jdGlvbiBzb3J0U2NyaXB0TmFtZXMoa2V5cywgcHJlZml4ID0gJycpIHtcbiAgY29uc3QgZ3JvdXBNYXAgPSBuZXcgTWFwKClcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSBwcmVmaXggPyBrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCArIDEpIDoga2V5XG4gICAgY29uc3QgaWR4ID0gcmVzdC5pbmRleE9mKCc6JylcbiAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgY29uc3QgYmFzZSA9IGtleS5zbGljZSgwLCAocHJlZml4ID8gcHJlZml4Lmxlbmd0aCArIDEgOiAwKSArIGlkeClcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGJhc2UpKSBncm91cE1hcC5zZXQoYmFzZSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoYmFzZSkucHVzaChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGtleSkpIGdyb3VwTWFwLnNldChrZXksIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGtleSkucHVzaChrZXkpXG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKGdyb3VwTWFwLmtleXMoKSlcbiAgICAuc29ydCgpXG4gICAgLmZsYXRNYXAoKGdyb3VwS2V5KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGdyb3VwTWFwLmdldChncm91cEtleSlcbiAgICAgIGlmIChcbiAgICAgICAgY2hpbGRyZW4ubGVuZ3RoID4gMSAmJlxuICAgICAgICBjaGlsZHJlbi5zb21lKChrKSA9PiBrICE9PSBncm91cEtleSAmJiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdCA9IGNoaWxkcmVuXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gayA9PT0gZ3JvdXBLZXkgfHwgIWsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICBjb25zdCBuZXN0ZWQgPSBjaGlsZHJlbi5maWx0ZXIoKGspID0+IGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgIHJldHVybiBbLi4uZGlyZWN0LCAuLi5zb3J0U2NyaXB0TmFtZXMobmVzdGVkLCBncm91cEtleSldXG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGRyZW4uc29ydCgpXG4gICAgfSlcbn1cblxuY29uc3Qgc29ydFNjcmlwdHMgPSBvbk9iamVjdCgoc2NyaXB0cywgcGFja2FnZUpzb24pID0+IHtcbiAgbGV0IG5hbWVzID0gT2JqZWN0LmtleXMoc2NyaXB0cylcbiAgY29uc3QgcHJlZml4YWJsZSA9IG5ldyBTZXQoKVxuXG4gIG5hbWVzID0gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgY29uc3Qgb21pdHRlZCA9IG5hbWUucmVwbGFjZSgvXig/OnByZXxwb3N0KS8sICcnKVxuICAgIGlmIChkZWZhdWx0TnBtU2NyaXB0cy5oYXMob21pdHRlZCkgfHwgbmFtZXMuaW5jbHVkZXMob21pdHRlZCkpIHtcbiAgICAgIHByZWZpeGFibGUuYWRkKG9taXR0ZWQpXG4gICAgICByZXR1cm4gb21pdHRlZFxuICAgIH1cbiAgICByZXR1cm4gbmFtZVxuICB9KVxuXG4gIGlmICghaGFzU2VxdWVudGlhbFNjcmlwdChwYWNrYWdlSnNvbikpIHtcbiAgICBuYW1lcyA9IHNvcnRTY3JpcHROYW1lcyhuYW1lcylcbiAgfVxuICBuYW1lcyA9IG5hbWVzLmZsYXRNYXAoKGtleSkgPT5cbiAgICBwcmVmaXhhYmxlLmhhcyhrZXkpID8gW2BwcmUke2tleX1gLCBrZXksIGBwb3N0JHtrZXl9YF0gOiBba2V5XSxcbiAgKVxuICByZXR1cm4gc29ydE9iamVjdEtleXMoc2NyaXB0cywgbmFtZXMpXG59KVxuXG4vKlxuLSBNb3ZlIGBkZWZhdWx0YCBjb25kaXRpb24gdG8gYm90dG9tXG4qL1xuY29uc3Qgc29ydENvbmRpdGlvbnMgPSAoY29uZGl0aW9ucykgPT4ge1xuICBjb25zdCB7IGRlZmF1bHRDb25kaXRpb25zID0gW10sIHJlc3RDb25kaXRpb25zID0gW10gfSA9IG9iamVjdEdyb3VwQnkoXG4gICAgY29uZGl0aW9ucyxcbiAgICAoY29uZGl0aW9uKSA9PiB7XG4gICAgICBpZiAoY29uZGl0aW9uID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgcmV0dXJuICdkZWZhdWx0Q29uZGl0aW9ucydcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdyZXN0Q29uZGl0aW9ucydcbiAgICB9LFxuICApXG5cbiAgcmV0dXJuIFsuLi5yZXN0Q29uZGl0aW9ucywgLi4uZGVmYXVsdENvbmRpdGlvbnNdXG59XG5cbmNvbnN0IHNvcnRFeHBvcnRzID0gb25PYmplY3QoKGV4cG9ydHMpID0+IHtcbiAgY29uc3QgeyBwYXRocyA9IFtdLCBjb25kaXRpb25zID0gW10gfSA9IG9iamVjdEdyb3VwQnkoXG4gICAgT2JqZWN0LmtleXMoZXhwb3J0cyksXG4gICAgKGtleSkgPT4gKGtleS5zdGFydHNXaXRoKCcuJykgPyAncGF0aHMnIDogJ2NvbmRpdGlvbnMnKSxcbiAgKVxuXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgWy4uLnBhdGhzLCAuLi5zb3J0Q29uZGl0aW9ucyhjb25kaXRpb25zKV0ubWFwKChrZXkpID0+IFtcbiAgICAgIGtleSxcbiAgICAgIHNvcnRFeHBvcnRzKGV4cG9ydHNba2V5XSksXG4gICAgXSksXG4gIClcbn0pXG5cbi8vIGZpZWxkcyBtYXJrZWQgYHZzY29kZWAgYXJlIGZvciBgVmlzdWFsIFN0dWRpbyBDb2RlIGV4dGVuc2lvbiBtYW5pZmVzdGAgb25seVxuLy8gaHR0cHM6Ly9jb2RlLnZpc3VhbHN0dWRpby5jb20vYXBpL3JlZmVyZW5jZXMvZXh0ZW5zaW9uLW1hbmlmZXN0XG4vLyBTdXBwb3J0ZWQgZmllbGRzOlxuLy8gcHVibGlzaGVyLCBkaXNwbGF5TmFtZSwgY2F0ZWdvcmllcywgZ2FsbGVyeUJhbm5lciwgcHJldmlldywgY29udHJpYnV0ZXMsXG4vLyBhY3RpdmF0aW9uRXZlbnRzLCBiYWRnZXMsIG1hcmtkb3duLCBxbmEsIGV4dGVuc2lvblBhY2ssXG4vLyBleHRlbnNpb25EZXBlbmRlbmNpZXMsIGljb25cblxuLy8gZmllbGQua2V5e3N0cmluZ306IGZpZWxkIG5hbWVcbi8vIGZpZWxkLm92ZXJ7ZnVuY3Rpb259OiBzb3J0IGZpZWxkIHN1YktleVxuY29uc3QgZmllbGRzID0gW1xuICB7IGtleTogJyRzY2hlbWEnIH0sXG4gIHsga2V5OiAnbmFtZScgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZGlzcGxheU5hbWUnIH0sXG4gIHsga2V5OiAndmVyc2lvbicgfSxcbiAgLyogeWFybiAqLyB7IGtleTogJ3N0YWJsZVZlcnNpb24nIH0sXG4gIHsga2V5OiAncHJpdmF0ZScgfSxcbiAgeyBrZXk6ICdkZXNjcmlwdGlvbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY2F0ZWdvcmllcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdrZXl3b3JkcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdob21lcGFnZScgfSxcbiAgeyBrZXk6ICdidWdzJywgb3Zlcjogc29ydE9iamVjdEJ5KFsndXJsJywgJ2VtYWlsJ10pIH0sXG4gIHsga2V5OiAncmVwb3NpdG9yeScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdmdW5kaW5nJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2xpY2Vuc2UnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3FuYScgfSxcbiAgeyBrZXk6ICdhdXRob3InLCBvdmVyOiBzb3J0UGVvcGxlT2JqZWN0IH0sXG4gIHtcbiAgICBrZXk6ICdtYWludGFpbmVycycsXG4gICAgb3Zlcjogb25BcnJheSgobWFpbnRhaW5lcnMpID0+IG1haW50YWluZXJzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjb250cmlidXRvcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGNvbnRyaWJ1dG9ycykgPT4gY29udHJpYnV0b3JzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3B1Ymxpc2hlcicgfSxcbiAgeyBrZXk6ICdzaWRlRWZmZWN0cycgfSxcbiAgeyBrZXk6ICd0eXBlJyB9LFxuICB7IGtleTogJ2ltcG9ydHMnIH0sXG4gIHsga2V5OiAnZXhwb3J0cycsIG92ZXI6IHNvcnRFeHBvcnRzIH0sXG4gIHsga2V5OiAnbWFpbicgfSxcbiAgeyBrZXk6ICdzdmVsdGUnIH0sXG4gIHsga2V5OiAndW1kOm1haW4nIH0sXG4gIHsga2V5OiAnanNkZWxpdnInIH0sXG4gIHsga2V5OiAndW5wa2cnIH0sXG4gIHsga2V5OiAnbW9kdWxlJyB9LFxuICB7IGtleTogJ3NvdXJjZScgfSxcbiAgeyBrZXk6ICdqc25leHQ6bWFpbicgfSxcbiAgeyBrZXk6ICdicm93c2VyJyB9LFxuICB7IGtleTogJ3JlYWN0LW5hdGl2ZScgfSxcbiAgeyBrZXk6ICd0eXBlcycgfSxcbiAgeyBrZXk6ICd0eXBlc1ZlcnNpb25zJyB9LFxuICB7IGtleTogJ3R5cGluZ3MnIH0sXG4gIHsga2V5OiAnc3R5bGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlc3R5bGUnIH0sXG4gIHsga2V5OiAnYXNzZXRzJyB9LFxuICB7IGtleTogJ2JpbicsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtYW4nIH0sXG4gIHsga2V5OiAnZGlyZWN0b3JpZXMnLCBvdmVyOiBzb3J0RGlyZWN0b3JpZXMgfSxcbiAgeyBrZXk6ICdmaWxlcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICd3b3Jrc3BhY2VzJywgb3Zlcjogc29ydFdvcmtzcGFjZXMgfSxcbiAgLy8gbm9kZS1wcmUtZ3lwIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL25vZGUtcHJlLWd5cCMxLWFkZC1uZXctZW50cmllcy10by15b3VyLXBhY2thZ2Vqc29uXG4gIHtcbiAgICBrZXk6ICdiaW5hcnknLFxuICAgIG92ZXI6IHNvcnRPYmplY3RCeShbXG4gICAgICAnbW9kdWxlX25hbWUnLFxuICAgICAgJ21vZHVsZV9wYXRoJyxcbiAgICAgICdyZW1vdGVfcGF0aCcsXG4gICAgICAncGFja2FnZV9uYW1lJyxcbiAgICAgICdob3N0JyxcbiAgICBdKSxcbiAgfSxcbiAgeyBrZXk6ICdzY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgeyBrZXk6ICdiZXR0ZXJTY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbDEwbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY29udHJpYnV0ZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2FjdGl2YXRpb25FdmVudHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaHVza3knLCBvdmVyOiBvdmVyUHJvcGVydHkoJ2hvb2tzJywgc29ydEdpdEhvb2tzKSB9LFxuICB7IGtleTogJ3NpbXBsZS1naXQtaG9va3MnLCBvdmVyOiBzb3J0R2l0SG9va3MgfSxcbiAgeyBrZXk6ICdwcmUtY29tbWl0JyB9LFxuICB7IGtleTogJ2NvbW1pdGxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbGludC1zdGFnZWQnIH0sXG4gIHsga2V5OiAnbmFuby1zdGFnZWQnIH0sXG4gIHsga2V5OiAnY29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25vZGVtb25Db25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcmlmeScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdiYWJlbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2Vyc2xpc3QnIH0sXG4gIHsga2V5OiAneG8nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHJldHRpZXInLCBvdmVyOiBzb3J0UHJldHRpZXJDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRDb25maWcnLCBvdmVyOiBzb3J0RXNsaW50Q29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50SWdub3JlJyB9LFxuICB7IGtleTogJ25wbXBrZ2pzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbVBhY2thZ2VKc29uTGludENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1wYWNrYWdlanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVsZWFzZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZW1hcmtDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnc3R5bGVsaW50JyB9LFxuICB7IGtleTogJ2F2YScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QtanVuaXQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1zdGFyZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtb2NoYScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdueWMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYzgnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAndGFwJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ29jbGlmJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdyZXNvbHV0aW9ucycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvdmVycmlkZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RldkRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHNvcnRPYmplY3RCeUlkZW50LCB0cnVlKSB9LFxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIC8vIFRPRE86IG9ubHkgc29ydCBkZXB0aCA9IDJcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnYnVuZGxlZERlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdidW5kbGVEZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvblBhY2snLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvbkRlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdmbGF0JyB9LFxuICB7IGtleTogJ3BhY2thZ2VNYW5hZ2VyJyB9LFxuICB7IGtleTogJ2VuZ2luZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZW5naW5lU3RyaWN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2RldkVuZ2luZXMnLCBvdmVyOiBzb3J0RGV2RW5naW5lcyB9LFxuICB7IGtleTogJ3ZvbHRhJywgb3Zlcjogc29ydFZvbHRhIH0sXG4gIHsga2V5OiAnbGFuZ3VhZ2VOYW1lJyB9LFxuICB7IGtleTogJ29zJyB9LFxuICB7IGtleTogJ2NwdScgfSxcbiAgeyBrZXk6ICdwcmVmZXJHbG9iYWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHVibGlzaENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnaWNvbicgfSxcbiAgLyogdnNjb2RlICovIHtcbiAgICBrZXk6ICdiYWRnZXMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGJhZGdlKSA9PiBiYWRnZS5tYXAoc29ydFZTQ29kZUJhZGdlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2dhbGxlcnlCYW5uZXInLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3ByZXZpZXcnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ21hcmtkb3duJyB9LFxuICB7IGtleTogJ3BucG0nLCBvdmVyOiBzb3J0UG5wbUNvbmZpZyB9LFxuXVxuXG5jb25zdCBkZWZhdWx0U29ydE9yZGVyID0gZmllbGRzLm1hcCgoeyBrZXkgfSkgPT4ga2V5KVxuY29uc3Qgb3ZlckZpZWxkcyA9IHBpcGUoXG4gIGZpZWxkc1xuICAgIC5tYXAoKHsga2V5LCBvdmVyIH0pID0+IChvdmVyID8gb3ZlclByb3BlcnR5KGtleSwgb3ZlcikgOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoQm9vbGVhbiksXG4pXG5cbmZ1bmN0aW9uIGVkaXRTdHJpbmdKU09OKGpzb24sIG92ZXIpIHtcbiAgaWYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHsgaW5kZW50LCB0eXBlIH0gPSBkZXRlY3RJbmRlbnQoanNvbilcbiAgICBjb25zdCBlbmRDaGFyYWN0ZXJzID0ganNvbi5zbGljZSgtMSkgPT09ICdcXG4nID8gJ1xcbicgOiAnJ1xuICAgIGNvbnN0IG5ld2xpbmUgPSBkZXRlY3ROZXdsaW5lKGpzb24pXG4gICAganNvbiA9IEpTT04ucGFyc2UoanNvbilcblxuICAgIGxldCByZXN1bHQgPVxuICAgICAgSlNPTi5zdHJpbmdpZnkob3Zlcihqc29uKSwgbnVsbCwgdHlwZSA9PT0gJ3RhYicgPyAnXFx0JyA6IGluZGVudCkgK1xuICAgICAgZW5kQ2hhcmFjdGVyc1xuICAgIGlmIChuZXdsaW5lID09PSAnXFxyXFxuJykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xcbi9nLCBuZXdsaW5lKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByZXR1cm4gb3Zlcihqc29uKVxufVxuXG5mdW5jdGlvbiBzb3J0UGFja2FnZUpzb24oanNvbklzaCwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBlZGl0U3RyaW5nSlNPTihcbiAgICBqc29uSXNoLFxuICAgIG9uT2JqZWN0KChqc29uKSA9PiB7XG4gICAgICBsZXQgc29ydE9yZGVyID0gb3B0aW9ucy5zb3J0T3JkZXIgfHwgZGVmYXVsdFNvcnRPcmRlclxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3J0T3JkZXIpKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhqc29uKVxuICAgICAgICBjb25zdCB7IHByaXZhdGVLZXlzID0gW10sIHB1YmxpY0tleXMgPSBbXSB9ID0gb2JqZWN0R3JvdXBCeShcbiAgICAgICAgICBrZXlzLFxuICAgICAgICAgIChrZXkpID0+IChrZXlbMF0gPT09ICdfJyA/ICdwcml2YXRlS2V5cycgOiAncHVibGljS2V5cycpLFxuICAgICAgICApXG4gICAgICAgIHNvcnRPcmRlciA9IFtcbiAgICAgICAgICAuLi5zb3J0T3JkZXIsXG4gICAgICAgICAgLi4uZGVmYXVsdFNvcnRPcmRlcixcbiAgICAgICAgICAuLi5wdWJsaWNLZXlzLnNvcnQoKSxcbiAgICAgICAgICAuLi5wcml2YXRlS2V5cy5zb3J0KCksXG4gICAgICAgIF1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG92ZXJGaWVsZHMoc29ydE9iamVjdEtleXMoanNvbiwgc29ydE9yZGVyKSwganNvbilcbiAgICB9KSxcbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBzb3J0UGFja2FnZUpzb25cbmV4cG9ydCB7IHNvcnRQYWNrYWdlSnNvbiwgZGVmYXVsdFNvcnRPcmRlciBhcyBzb3J0T3JkZXIgfVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG5cdHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbHVlKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcGFja2FnZURpclBhdGhzLm1hcChhc3luYyAocGFja2FnZURpclBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbmV3VGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICd0ZXN0Jyk7XG4gICAgICAgIGZvciAoY29uc3Qgb2xkVGVzdERpck5hbWUgb2YgWydfX3Rlc3RzX18nLCAndGVzdHMnXSkge1xuICAgICAgICAgIGNvbnN0IG9sZFRlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCBvbGRUZXN0RGlyTmFtZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IG1vdmVUZXN0RGlyZWN0b3J5KG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICAgICAgICAgIHNjcmlwdHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBkaWRVcGRhdGVTY3JpcHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBbc2NyaXB0TmFtZSwgc2NyaXB0XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgICAgICAgICAgICBjb25zdCBuZXdTY3JpcHQgPSBzY3JpcHQucmVwbGFjZUFsbChvbGRUZXN0RGlyTmFtZSwgJ3Rlc3QnKTtcbiAgICAgICAgICAgICAgaWYgKHNjcmlwdCAhPT0gbmV3U2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG5ld1NjcmlwdDtcbiAgICAgICAgICAgICAgICBkaWRVcGRhdGVTY3JpcHQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWNrYWdlSnNvbi5zY3JpcHRzID0gc2NyaXB0cztcbiAgICAgICAgICAgIGlmICghZGlkVXBkYXRlU2NyaXB0KSByZXR1cm47XG5cbiAgICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShzb3J0UGFja2FnZUpzb24ocGFja2FnZUpzb24pLCB1bmRlZmluZWQsIDIpKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1vdmVUZXN0RGlyZWN0b3J5KG9sZFRlc3REaXJQYXRoOiBzdHJpbmcsIG5ld1Rlc3REaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG5ld1Rlc3REaXJQYXRoKSkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKG9sZFRlc3REaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGRpcmVudHMubWFwKGFzeW5jIChkaXJlbnQpID0+IHtcbiAgICAgIGNvbnN0IG9sZFBhdGggPSBwYXRoLmpvaW4ob2xkVGVzdERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGNvbnN0IG5ld1BhdGggPSBwYXRoLmpvaW4obmV3VGVzdERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGNvbnN0IG5ld1BhdGhTdGF0ID0gZnMuZXhpc3RzU3luYyhuZXdQYXRoKSA/IGF3YWl0IGZzLnByb21pc2VzLnN0YXQobmV3UGF0aCkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgbmV3UGF0aFN0YXQ/LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgYXdhaXQgbW92ZVRlc3REaXJlY3Rvcnkob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICB9KVxuICApO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ybShvbGRUZXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwZURlZmluaXRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbjogUGFja2FnZUNvbmZpZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBlRGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGliVHlwZURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdAdHlwZXMnKTtcbiAgICBjb25zdCBzcmNUeXBlRGlyUGF0aCA9XG4gICAgICBjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyA/IHVuZGVmaW5lZCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3NyYycsICd0eXBlcycpO1xuXG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnJlYWRkaXIobGliVHlwZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSk7XG4gICAgaWYgKCFkaXJlbnRzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gZGlyZW50Lm5hbWUuc2xpY2UoMCwgLTUpO1xuICAgICAgY29uc3QgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID0gZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5kLnRzJyk7XG4gICAgICBsZXQgcGFja2FnZU5hbWUgPSBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPyBkaXJOYW1lIDogZGlyZW50Lm5hbWU7XG4gICAgICBpZiAocGFja2FnZU5hbWUuaW5jbHVkZXMoJ19fJykpIHtcbiAgICAgICAgcGFja2FnZU5hbWUgPSBgQCR7cGFja2FnZU5hbWUucmVwbGFjZSgnX18nLCAnLycpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNMaWJyYXJ5ID0gY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuLnNvbWUoXG4gICAgICAgIChjb25maWcpID0+XG4gICAgICAgICAgY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICAgICk7XG5cbiAgICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uKSB7XG4gICAgICAgIGlmIChoYXNMaWJyYXJ5KSB7XG4gICAgICAgICAgLy8gTW92ZSBAdHlwZXMvPG5hbWU+L2luZGV4LmQudHMgaWYgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSwgJ2luZGV4LmQudHMnKSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNyY1R5cGVEaXJQYXRoKSB7XG4gICAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+IGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgc3JjVHlwZURpclBhdGggJiYgIWhhc0xpYnJhcnkpIHtcbiAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+LmQudHMgaWYgbm90IGluc3RhbGxlZFxuICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgIGlnbm9yZUVub2VudEFzeW5jKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUoXG4gICAgICAgICAgICAgIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdpbmRleC5kLnRzJyksXG4gICAgICAgICAgICAgIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgYCR7ZGlyZW50Lm5hbWV9LmQudHNgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiB1bmtub3duW10sIHNvdXJjZTogdW5rbm93bltdLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd25bXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QodGFyZ2V0W2luZGV4XSwgb3B0aW9ucykgJiYgaXNNZXJnZWFibGVPYmplY3QoaXRlbSwgb3B0aW9ucykpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlLCBvcHRpb25zKSA/IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWUsIG9wdGlvbnMpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh2YWx1ZSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIHBhY2thZ2UuanNvbi1zdHlsZSBrZXlzIGFyZSBub24tYXJyYXktaW5kZXgga2V5cywgc28gSlNPTi5zdHJpbmdpZnkgcHJlc2VydmVzIHRoaXMgaW5zZXJ0aW9uIG9yZGVyLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHNvcnRLZXlzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBsb2FkL2R1bXAgdXNhZ2UgY2xlYXJlci5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIC8vIEdpdEh1YiBBY3Rpb25zIHRyZWF0cyBgZXZlbnQ6IG51bGxgIGFzIGEgdmFsdWVsZXNzIGV2ZW50IG1hcHBpbmcsIGUuZy5cbiAgLy8gYHB1bGxfcmVxdWVzdDpgLiBgdW5kZWZpbmVkYCB3b3VsZCBvbWl0IHRoZSBldmVudCBlbnRpcmVseSB3aGVuIGR1bXBpbmcgWUFNTC5cbiAgaXNzdWVzPzogVHlwZXMgfCBudWxsO1xuICBwdWxsX3JlcXVlc3Q/OiBQdWxsUmVxdWVzdCB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcyB8IG51bGw7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgJ3J1bnMtb24nPzogc3RyaW5nO1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHN0ZXBzPzogU3RlcFtdO1xuICB1c2VzPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgdXNlcz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBydW4/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnYXV0b2ZpeC5jaScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgIHB1c2g6IHtcbiAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICB9LFxuICB9LFxuICBwZXJtaXNzaW9uczoge1xuICAgIGNvbnRlbnRzOiAncmVhZCcsXG4gIH0sXG4gIGNvbmN1cnJlbmN5OiB7XG4gICAgZ3JvdXA6ICdhdXRvZml4LSR7eyBnaXRodWIuaGVhZF9yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDogeyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9LFxuICB9LFxufTtcblxuY29uc3QgcHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnRml4IGNvZGUgYXV0b21hdGljYWxseScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gIH0sXG4gIGpvYnM6IHtcbiAgICBhdXRvZml4OiB7XG4gICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2F1dG9maXgueW1sQG1haW4nLFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBsaW50ZXIgZml4XG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS90cnVzdGVkLXB1Ymxpc2hlcnMjc3RlcC0yLWNvbmZpZ3VyZS15b3VyLWNpY2Qtd29ya2Zsb3dcbiAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgY29tbWl0aW5nIGNoYW5nZXNcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWNsYXVkZSc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDbGF1ZGUgQ29kZScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1jbGF1ZGUnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY2xhdWRlLWNvZGUnLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIENMQVVERV9DT0RFX09BVVRIX1RPS0VOOiAnJHt7IHNlY3JldHMuQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4gfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWNvZGV4Jzoge1xuICAgIG5hbWU6ICdHZW5lcmF0ZSBQUiB3aXRoIENvZGV4IENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1jb2RleCcpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdjb2RleC1jbGknLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIE9QRU5BSV9BUElfS0VZOiAnJHt7IHNlY3JldHMuT1BFTkFJX0FQSV9LRVkgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWdlbWluaSc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBHZW1pbmkgQ0xJJyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdnZW4tcHInOiB7XG4gICAgICAgIGlmOiBcImNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWFsbCcpIHx8IGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWdlbWluaScpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdnZW1pbmktY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBHRU1JTklfQVBJX0tFWTogJyR7eyBzZWNyZXRzLkdFTUlOSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knIHwgJ2F1dG9maXgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZpZyBvZiBzZW1hbnRpYyBwdWxsIHJlcXVlc3RcbiAgICBjb25zdCBzZW1hbnRpY1ltbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICdzZW1hbnRpYy55bWwnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oc2VtYW50aWNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGZpbGVOYW1lU2V0ID0gbmV3IFNldChbXG4gICAgICAndGVzdC55bWwnLFxuICAgICAgJ2F1dG9maXgueW1sJyxcbiAgICAgICdzZW1hbnRpYy1wci55bWwnLFxuICAgICAgJ2Nsb3NlLWNvbW1lbnQueW1sJyxcbiAgICAgICdnZW4tcHItY2xhdWRlLnltbCcsXG4gICAgICAnZ2VuLXByLWNvZGV4LnltbCcsXG4gICAgICAnZ2VuLXByLWdlbWluaS55bWwnLFxuICAgICAgLi4uZW50cmllcy5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lLmVuZHNXaXRoKCcueW1sJykpLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSksXG4gICAgXSk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdyZWxlYXNlLnltbCcpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocmVwb3NpdG9yeT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVwb3NpdG9yeT8uZW5kc1dpdGgoJy9yZXVzYWJsZS13b3JrZmxvd3MnKSA/PyBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGtpbmQ6IEtub3duS2luZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBgJHtraW5kfS55bWxgKTtcbiAgY29uc3QgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2RlcGxveS1wcm9kdWN0aW9uLnltbCcpKTtcblxuICBpZiAoa2luZCA9PT0gJ2F1dG9maXgnKSB7XG4gICAgYXdhaXQgd3JpdGVZYW1sKGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZyksIGZpbGVQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcblxuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICAvLyBTa2lwIGEgYnJva2VuIHdvcmtmbG93XG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgJiYgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlICYmIGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cykge1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucy5hY3Rpb25zID0gJ3dyaXRlJztcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aCA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGgudHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3cgPSAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJztcbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBub24tcmV1c2FibGUgd29ya2Zsb3dzXG4gICAgaWYgKCFqb2IudXNlcz8uaW5jbHVkZXMoJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIGNvbnRpbnVlO1xuXG4gICAgbm9ybWFsaXplSm9iKGNvbmZpZywgam9iLCBraW5kKTtcbiAgICBpc1JldXNhYmxlV29ya2Zsb3cgPSB0cnVlO1xuICB9XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93KSByZXR1cm47XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zWydpZC10b2tlbiddID0gJ3dyaXRlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uWydpZC10b2tlbiddO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAvLyBEb24ndCB1c2UgYHBhdGhzLWlnbm9yZWAgZm9yIHRlc3QgYmVjYXVzZSBHaXRIdWIncyBCcmFuY2ggUHJvdGVjdGlvbiBhbmQgUnVsZXNldHMgcmVxdWlyZSBqb2IgcnVubmluZy5cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVsbF9yZXF1ZXN0KSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdWxsX3JlcXVlc3RbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXTtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMuZmlsdGVyKChicmFuY2gpID0+IGJyYW5jaCAhPT0gJ3Jlbm92YXRlLyoqJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm8gZGVmYXVsdFxuICB9XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIGpvYi5zZWNyZXRzID8/PSB7fTtcbiAgLy8gVXNlIHRydXN0ZWQgcHVibGlzaGluZyBpbnN0ZWFkIG9mIE5QTV9UT0tFTlxuICBkZWxldGUgam9iLnNlY3JldHMuTlBNX1RPS0VOO1xuXG4gIGlmIChcbiAgICBraW5kID09PSAndGVzdCcgfHxcbiAgICBraW5kID09PSAncmVsZWFzZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNsYXVkZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJ1xuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgLy8gU2V0IHRlc3QtY29tbWFuZCBmb3IgZ2VuLXByIHdvcmtmbG93cyBiYXNlZCBvbiBwYWNrYWdlIG1hbmFnZXJcbiAgaWYgKGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fCBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fCBraW5kID09PSAnZ2VuLXByLWdlbWluaScpIHtcbiAgICBqb2Iud2l0aFsndGVzdC1jb21tYW5kJ10gPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1biBjaGVjay1hbGwtZm9yLWFpJyA6ICd5YXJuIGNoZWNrLWFsbC1mb3ItYWknO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTikge1xuICAgIGpvYi5zZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgICAgam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gcGFyYW1zLnJlcGxhY2UoJ3N5bmMgJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoLmRvdF9lbnZfcGF0aCA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmRvdF9lbnZfcGF0aDtcbiAgfVxuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0cy5GTFlfQVBJX1RPS0VOICYmIHR5cGVvZiBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9IGpvYi53aXRoLmRlcGxveV9jb21tYW5kLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXIgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXI7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogV29ya2Zsb3cge1xuICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NicgfSxcbiAgICB7IHVzZXM6ICdhY3Rpb25zL3NldHVwLW5vZGVAdjYnLCB3aXRoOiB7ICdjaGVjay1sYXRlc3QnOiB0cnVlLCAnbm9kZS12ZXJzaW9uJzogJ2x0cy8qJyB9IH0sXG4gICAgLi4uKGNvbmZpZy5pc0J1biA/IFt7IHVzZXM6ICdvdmVuLXNoL3NldHVwLWJ1bkB2MScsIHdpdGg6IHsgJ2J1bi12ZXJzaW9uJzogJ2xhdGVzdCcgfSB9XSA6IFtdKSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgIH0sXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gY2xlYW51cGAgfSxcbiAgXTtcbiAgaWYgKGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uYnVpbGQpIHtcbiAgICBzdGVwcy5wdXNoKHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGJ1aWxkYCB9KTtcbiAgfVxuICBzdGVwcy5wdXNoKHsgdXNlczogJ2F1dG9maXgtY2kvYWN0aW9uQHYxJyB9KTtcblxuICBjb25zdCBhdXRvZml4V29ya2Zsb3cgPSBzdHJ1Y3R1cmVkQ2xvbmUocHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyk7XG4gIGNvbnN0IGF1dG9maXhKb2IgPSBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID8/IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfTtcbiAgYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA9IHsgLi4uYXV0b2ZpeEpvYiwgc3RlcHMgfTtcbiAgcmV0dXJuIGF1dG9maXhXb3JrZmxvdztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB5YW1sVGV4dCA9IHJlbW92ZVRyYWlsaW5nU3BhY2VzKFxuICAgIHlhbWwuZHVtcChuZXdTZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xLCBub0NvbXBhdE1vZGU6IHRydWUsIHN0eWxlczogeyAnISFudWxsJzogJ2VtcHR5JyB9IH0pXG4gICk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVUcmFpbGluZ1NwYWNlcyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBqcy15YW1sIGVtaXRzIHZhbHVlbGVzcyBHaXRIdWIgQWN0aW9ucyBldmVudHMgYXMgYGV2ZW50OiBgIHdoZW4gdXNpbmcgdGhlIGVtcHR5IG51bGwgc3R5bGUuXG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoL1sgXFx0XSskL2dtLCAnJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndGV4dCcpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnY2YuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oPz1cXHN8JCkvZywgJ2UuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLig/PVxccykvZywgJ2kuZS4nKTtcbn1cblxuZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAoY29tbWVudCkgPT4gZml4VHlwb3NJblRleHQoY29tbWVudCkpXG4gICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KWNcXC5mXFwuL2csICckMS8vJDJjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPyllZ1xcLi9nLCAnJDEvLyQyZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KWllXFwuL2csICckMS8vJDJpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIEFHRU5UU19FWFRSQS5tZCBleGlzdHMgYW5kIHJlYWQgaXRzIGNvbnRlbnRcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBgLS0tXFxuZGVzY3JpcHRpb246IEdlbmVyYWwgQ29kaW5nIFJ1bGVzXFxuZ2xvYnM6XFxuYWx3YXlzQXBwbHk6IHRydWVcXG4tLS1gO1xuICBjb25zdCBib2R5ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKGNvbmZpZywgYWxsQ29uZmlncywgJ0N1cnNvcicsIGV4dHJhQ29udGVudCk7XG4gIHJldHVybiBgJHtmcm9udG1hdHRlcn1cXG5cXG4ke2JvZHl9YDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6IFxcYCR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSB8fCAndW5rbm93bid9XFxgXG4tIERlc2NyaXB0aW9uOiAke3Jvb3RDb25maWcucGFja2FnZUpzb24/LmRlc2NyaXB0aW9ufVxuLSBQYWNrYWdlIE1hbmFnZXI6ICR7cGFja2FnZU1hbmFnZXJ9XG5cbiMjIEdlbmVyYWwgSW5zdHJ1Y3Rpb25zXG5cbi0gQ3JlYXRlIGEgbmV3IGJyYW5jaCBpZiB0aGUgY3VycmVudCBicmFuY2ggaXMgXFxgbWFpblxcYC5cbi0gUnVuIGFueSBcXGBnaXRcXGAgY29tbWFuZHMgc2VxdWVudGlhbGx5LlxuLSBXcml0ZSB0ZXN0cyBPTkxZIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiBJZiByZXF1ZXN0ZWQsIGZvbGxvdyB0aGVzZSBydWxlczpcbiAgLSBDb250aW51ZSBtb2RpZnlpbmcgdGhlIHRlc3RzIGFuZCBjb2RlIHVudGlsIGFsbCB0ZXN0cyBwYXNzLlxuICAtIEVuc3VyZSB0ZXN0cyByZXNldCBhbnkgcmVsYXRlZCBwZXJzaXN0ZW50IGRhdGEsIGFzIG91ciB0ZXN0IGluZnJhc3RydWN0dXJlIGRvZXMgbm90IGNsZWFyIGl0IGF1dG9tYXRpY2FsbHkuXG4gIC0gUHJlZmVyIGFjdHVhbCBBUEkgY2FsbHMgb3ZlciBtb2Nrcy4gVXNlIG1vY2tzIHdoZW4gYWN0dWFsIGNhbGxzIGFyZSBpbXByYWN0aWNhbCwgaGF2ZSB1bmludGVuZGVkIHNpZGUgZWZmZWN0cywgb3IgYXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuLSBXaGVuIGZpeGluZyBpc3N1ZXMsIGZvbGxvdyB0aGVzZSBydWxlczpcbiAgLSBJbnZlc3RpZ2F0ZSB0aGUgcm9vdCBjYXVzZSBmaXJzdCAoZS5nLiwgYnkgZ2F0aGVyaW5nIGRlYnVnIGxvZ3MsIHRha2luZyBzY3JlZW5zaG90cywgZXRjLikuXG4gIC0gRml4IHRoZSBhY3R1YWwgcm9vdCBjYXVzZSBpbnN0ZWFkIG9mIGFwcGx5aW5nIHdvcmthcm91bmRzLlxuLSBBZnRlciBtYWtpbmcgY29kZSBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stYWxsLWZvci1haVxcYCB0byBleGVjdXRlIGFsbCB0ZXN0cyAodGFrZXMgdXAgdG8gMSBob3VyKSBvciBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1mb3ItYWlcXGAgZm9yIHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmcgb25seSAodGFrZXMgdXAgdG8gMTAgbWludXRlcykuXG4gIC0gSWYgeW91IGFyZSBjb25maWRlbnQgeW91ciBjaGFuZ2VzIHdpbGwgbm90IGJyZWFrIGFueSB0ZXN0cywgeW91IG1heSB1c2UgXFxgY2hlY2stZm9yLWFpXFxgLlxuLSBPbmNlIHlvdSBoYXZlIHZlcmlmaWVkIHlvdXIgY2hhbmdlcywgY29tbWl0IGFuZCBwdXNoIHRoZW0gdG8gdGhlIGN1cnJlbnQgKG5vbi1tYWluKSBicmFuY2ggdGhlbiBjcmVhdGUgYSBQUiB2aWEgXFxgZ2hcXGAuXG4gIC0gRm9sbG93IHRoZSBjb252ZW50aW9uYWwgY29tbWl0czsgeW91ciBjb21taXQgbWVzc2FnZSBzaG91bGQgc3RhcnQgd2l0aCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgZXRjLlxuICAtIElmIG5vdCBzcGVjaWZpZWQsIG1ha2Ugc3VyZSB0byBhZGQgYSBuZXcgbGluZSBhdCB0aGUgZW5kIG9mIHlvdXIgY29tbWl0IG1lc3NhZ2Uke3Jvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8gPyBgIHdpdGg6IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgYCA6ICcnfS5cbiAgLSBBbHdheXMgY3JlYXRlIG5ldyBjb21taXRzLiBBdm9pZCB1c2luZyBcXGAtLWFtZW5kXFxgLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmhhc1N0YXJ0VGVzdFNlcnZlcilcbiAgICA/IGAtIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gc3RhcnQtdGVzdC1zZXJ2ZXJcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJydcbn1cblxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBoYXNOZXdTZWN0aW9uID0gZXh0cmFDb250ZW50Py50cmltKCkuc3RhcnRzV2l0aCgnIycpO1xuICBjb25zdCBub3JtYWxpemVkRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50XG4gICAgPyBoYXNOZXdTZWN0aW9uXG4gICAgICA/ICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKVxuICAgICAgOiAnXFxuJyArIGV4dHJhQ29udGVudFxuICAgIDogJyc7XG4gIHJldHVybiBiYXNlQ29udGVudCArIG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gS2VlcCB0b3AtZG93biBvcmRlcmluZyBndWlkYW5jZSBmdW5jdGlvbi1vbmx5IGJlY2F1c2UgY2xhc3NlcyBhcmUgbm90IGhvaXN0ZWQgYW5kIGNhbiBmYWlsIHdoZW4gaW5oZXJpdGFuY2Ugb3IgdG9wLWxldmVsIGluc3RhbnRpYXRpb24gZGVwZW5kcyBvbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAgcmV0dXJuIGBcbiMjIENvZGluZyBTdHlsZVxuXG4tIFVzZSBjYW1lbENhc2UgZm9yIEphdmFTY3JpcHQgYW5kIFR5cGVTY3JpcHQgZmlsZXMgKG9yIFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMpLlxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBlYWNoIG1vZHVsZSB3aXRoIGhpZ2ggY29oZXNpb24sIGdyb3VwaW5nIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSB0b2dldGhlci5cbiAgLSBSZWZhY3RvciBleGlzdGluZyBsYXJnZSBtb2R1bGVzIGludG8gc21hbGxlciwgZm9jdXNlZCBtb2R1bGVzIHdoZW4gbmVjZXNzYXJ5LlxuICAtIENyZWF0ZSB3ZWxsLW9yZ2FuaXplZCBkaXJlY3Rvcnkgc3RydWN0dXJlcyB3aXRoIGxvdyBjb3VwbGluZyBhbmQgaGlnaCBjb2hlc2lvbi5cbi0gUGxhY2UgY2FsbGluZyBmdW5jdGlvbnMgaW4gdGhlIGZpbGUgYWJvdmUgdGhlIGZ1bmN0aW9ucyB0aGV5IGNhbGwgdG8gbWFpbnRhaW4gYSBjbGVhciB0b3AtZG93biBvcmRlci5cbiAgLSBlLmcuIFxcYGZ1bmN0aW9uIGNhbGxlcigpIHsgY2FsbGVlKCk7IH0gZnVuY3Rpb24gY2FsbGVlKCkgeyAuLi4gfVxcYFxuLSBXcml0ZSBjb21tZW50cyB0aGF0IGV4cGxhaW4gXCJ3aHlcIiByYXRoZXIgdGhhbiBcIndoYXRcIi4gQXZvaWQgc3RhdGluZyB3aGF0IGNhbiBiZSB1bmRlcnN0b29kIGZyb20gdGhlIGNvZGUgaXRzZWxmLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgZXhwbGljaXRseSByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gUHJlZmVyIHVzaW5nIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgZm9yIHByb21wdHMgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgd2l0aCBhbiBhcnJheSBvZiBzdHJpbmdzLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGludHJvZHVjaW5nIG5ldyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgdXBkYXRlIHRoZSBsYW5ndWFnZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUgXFxgaTE4blxcYCBkaXJlY3RvcnkgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkuIFJlZmVyZW5jZSB0aGVzZSBzdHJpbmdzIHVzaW5nIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkuIEZvciBleGFtcGxlLCB1c2UgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIGZvciBzdG9yaW5nIGFuIGFycmF5IG9yIGFuIG9iamVjdCB0byBcXGB1c2VTdGF0ZVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYFxuLSBTaW5jZSB0aGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgXFxgdXNlQ2FsbGJhY2tcXGAgb3IgXFxgdXNlTWVtb1xcYCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxuLSBBc3N1bWUgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuXG5gXG4gICAgOiAnJ1xufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3Ntb2wtdG9tbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIEJ1bmZpZ1RvbWwge1xuICBpbnN0YWxsPzoge1xuICAgIGV4YWN0PzogYm9vbGVhbjtcbiAgfTtcbiAgcnVuPzoge1xuICAgIGJ1bj86IGJvb2xlYW47XG4gIH07XG59XG5cbmNvbnN0IG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gIC8vIC0tLS0tLS0tLS0gV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuICAnQGV4ZXJjb2RlL3Byb2JsZW0tdXRpbHMnLFxuICAnQHdpbGxib29zdGVyL2FnZW50LXNraWxscycsXG4gICdAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlncycsXG4gICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYicsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZScsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvd2InLFxuICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAnb25lLXdheS1naXQtc3luYycsXG4gIC8vIHdiZnkgcGlucyB0aGVzZSB0b29saW5nIHBhY2thZ2VzIGFuZCBtYXkgYXBwbHkgdGhlbSBpbW1lZGlhdGVseSBhZnRlciBhXG4gIC8vIHJlbGVhc2UsIGJlZm9yZSB0aGUgZ2xvYmFsIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93IGhhcyBlbGFwc2VkLlxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctZGFyd2luLWFybTY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWRhcndpbi14NjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctbGludXgtYXJtJyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWxpbnV4LWFybTY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWxpbnV4LXg2NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy13aW4zMi1hcm02NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy13aW4zMi14NjQnLFxuICAnb3hmbXQnLFxuICAnQG94Zm10L2JpbmRpbmctYW5kcm9pZC1hcm0tZWFiaScsXG4gICdAb3hmbXQvYmluZGluZy1hbmRyb2lkLWFybTY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWRhcndpbi1hcm02NCcsXG4gICdAb3hmbXQvYmluZGluZy1kYXJ3aW4teDY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWZyZWVic2QteDY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtLW11c2xlYWJpaGYnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtNjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtcHBjNjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtbXVzbCcsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1zMzkweC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgteDY0LWdudScsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAb3hmbXQvYmluZGluZy1vcGVuaGFybW9ueS1hcm02NCcsXG4gICdAb3hmbXQvYmluZGluZy13aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ0BveGZtdC9iaW5kaW5nLXdpbjMyLWlhMzItbXN2YycsXG4gICdAb3hmbXQvYmluZGluZy13aW4zMi14NjQtbXN2YycsXG4gICdveGxpbnQnLFxuICAnQG94bGludC9iaW5kaW5nLWFuZHJvaWQtYXJtLWVhYmknLFxuICAnQG94bGludC9iaW5kaW5nLWFuZHJvaWQtYXJtNjQnLFxuICAnQG94bGludC9iaW5kaW5nLWRhcndpbi1hcm02NCcsXG4gICdAb3hsaW50L2JpbmRpbmctZGFyd2luLXg2NCcsXG4gICdAb3hsaW50L2JpbmRpbmctZnJlZWJzZC14NjQnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybS1tdXNsZWFiaWhmJyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1hcm02NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXBwYzY0LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtcmlzY3Y2NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtbXVzbCcsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtczM5MHgtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC14NjQtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAb3hsaW50L2JpbmRpbmctb3Blbmhhcm1vbnktYXJtNjQnLFxuICAnQG94bGludC9iaW5kaW5nLXdpbjMyLWFybTY0LW1zdmMnLFxuICAnQG94bGludC9iaW5kaW5nLXdpbjMyLWlhMzItbXN2YycsXG4gICdAb3hsaW50L2JpbmRpbmctd2luMzIteDY0LW1zdmMnLFxuICAnb3hsaW50LXRzZ29saW50JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvZGFyd2luLWFybTY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvZGFyd2luLXg2NCcsXG4gICdAb3hsaW50LXRzZ29saW50L2xpbnV4LWFybTY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvbGludXgteDY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvd2luMzItYXJtNjQnLFxuICAnQG94bGludC10c2dvbGludC93aW4zMi14NjQnLFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgJ0BuZXh0L2VudicsXG4gICdAbmV4dC9mb250JyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LWFybTY0LWdudScsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC1hcm02NC1tdXNsJyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LXg2NC1nbnUnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgteDY0LW11c2wnLFxuICAnQG5leHQvc3djLWFuZHJvaWQtYXJtLWVhYmknLFxuICAnQG5leHQvc3djLWFuZHJvaWQtYXJtNjQnLFxuICAnQG5leHQvc3djLWRhcndpbi1hcm02NCcsXG4gICdAbmV4dC9zd2MtZGFyd2luLXg2NCcsXG4gICdAbmV4dC9zd2MtZnJlZWJzZC14NjQnLFxuICAnQG5leHQvc3djLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG5leHQvc3djLWxpbnV4LWFybTY0LWdudScsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtNjQtbXVzbCcsXG4gICdAbmV4dC9zd2MtbGludXgteDY0LWdudScsXG4gICdAbmV4dC9zd2MtbGludXgteDY0LW11c2wnLFxuICAnQG5leHQvc3djLXdhc20tbm9kZWpzJyxcbiAgJ0BuZXh0L3N3Yy13YXNtLXdlYicsXG4gICdAbmV4dC90aGlyZC1wYXJ0aWVzJyxcbiAgJ25leHQnLFxuICAncmVhY3QnLFxuICAncmVhY3QtZG9tJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJ1bmZpZ1RvbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCdW5maWdUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250ZW50ID0gbmV3Q29udGVudChleGlzdGluZ0NvbnRlbnQpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBuZXdDb250ZW50ID0gKGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcbiAgY29uc3QgYnVuZmlnVG9tbCA9IHBhcnNlQnVuZmlnVG9tbChleGlzdGluZ0NvbnRlbnQpO1xuICByZXR1cm4gYGVudiA9IGZhbHNlXG50ZWxlbWV0cnkgPSBmYWxzZVxuXG4ke2dlbmVyYXRlUnVuU2VjdGlvbihidW5maWdUb21sKX1cbltpbnN0YWxsXVxuZXhhY3QgPSAke2J1bmZpZ1RvbWw/Lmluc3RhbGw/LmV4YWN0ID09PSBmYWxzZSA/ICdmYWxzZScgOiAndHJ1ZSd9XG5saW5rZXIgPSBcImhvaXN0ZWRcIlxubWluaW11bVJlbGVhc2VBZ2UgPSA0MzIwMDAgIyA1IGRheXNcbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4ke21pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMubWFwKChwYWNrYWdlTmFtZSkgPT4gYCAgICBcIiR7cGFja2FnZU5hbWV9XCIsYCkuam9pbignXFxuJyl9XG5dXG5gO1xufTtcblxuZnVuY3Rpb24gcGFyc2VCdW5maWdUb21sKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlKGNvbnRlbnQpIGFzIEJ1bmZpZ1RvbWw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVSdW5TZWN0aW9uKGJ1bmZpZ1RvbWw6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIGJ1bmZpZ1RvbWw/LnJ1bj8uYnVuID09PSAnYm9vbGVhbicgPyBgW3J1bl1cXG5idW4gPSAke2J1bmZpZ1RvbWwucnVuLmJ1bn1cXG5gIDogJyc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGXjgafjga9ub2RlX21vZHVsZXPjgpJDT1BZ44GZ44KL5b+F6KaB44GM44GC44KL44Gf44KB44CBbm9kZV9tb2R1bGVz44KS6Zmk5aSW44GX44Gm44Gv44GE44GR44Gq44GE44CCXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuKiovLmlkZWFcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IHtcbiAgY29kZVdpdGgySW5kZW50U2l6ZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjcHAnLFxuICAgICdkYXJ0JyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3B1JyxcbiAgICAncHVtbCcsXG4gICAgJ3JiJyxcbiAgICAndnVlJyxcbiAgICAneG1sJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ3NoJyxcbiAgXS50b1NvcnRlZCgpLFxuICBjb2RlV2l0aDRJbmRlbnRTaXplOiBbJ2dvJywgJ2dyYWRsZScsICdqYXZhJywgJ3B5J10udG9Tb3J0ZWQoKSxcbiAgbWFya2Rvd25MaWtlOiBbJ21kJ10udG9Tb3J0ZWQoKSxcbiAgb3hsaW50OiBbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXS50b1NvcnRlZCgpLFxuICBveGZtdDogW1xuICAgICdhc3RybycsXG4gICAgJ2NqcycsXG4gICAgJ2NzcycsXG4gICAgJ2N0cycsXG4gICAgJ2dxbCcsXG4gICAgJ2dyYXBocWwnLFxuICAgICdoYnMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnanMnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2pzeCcsXG4gICAgJ2xlc3MnLFxuICAgICdtZCcsXG4gICAgJ21keCcsXG4gICAgJ21qcycsXG4gICAgJ210cycsXG4gICAgJ3Njc3MnLFxuICAgICdzdmVsdGUnLFxuICAgICd0b21sJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICd2dWUnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS50b1NvcnRlZCgpLFxuICBwcmV0dGllck9ubHk6IFsnamF2YSddLnRvU29ydGVkKCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcblxuICAgIGxldCBuZXdDb25maWc6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShkZWZhdWx0Q29uZmlnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGNvbmZpZ0ZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld0NvbmZpZyA9IG1lcmdlLmFsbChbbmV3Q29uZmlnLCBvbGRDb25maWcsIG5ld0NvbmZpZ10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nIC0gZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIHBhcnNlZFxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbC5kdW1wKG5ld0NvbmZpZywge1xuICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHJldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb24gPSBjb25maWcuaXNQdWJsaWNSZXBvXG4gICAgICA/ICdSZXZpZXcgaW4gRW5nbGlzaCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNvZGluZyBzdGFuZGFyZHMuJ1xuICAgICAgOiAn5Lul5LiL44Gu44Kz44O844OH44Kj44Oz44Kw6KaP57SE44KS6LiP44G+44GI44Gm44CB5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCJztcbiAgICBjb25zdCBzdHlsZWd1aWRlQ29udGVudCA9IGAke3Jldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb259XFxuXFxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9JHtcbiAgICAgIGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPyBgXFxuJHtjb2RpbmdSdWxlRXh0cmFDb250ZW50LnRyaW1FbmQoKX1gIDogJydcbiAgICB9YDtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSksXG4gICAgXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VtaW5pU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRG8gbm90IHJlbW92ZSBgd2luZG93c2A6IGdlbmVyYXRlZCAuZ2l0aWdub3JlIGZpbGVzIG11c3Qga2VlcCBpZ25vcmluZyBXaW5kb3dzLWNyZWF0ZWQgbG9jYWwgYXJ0aWZhY3RzLlxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4hLmtlZXBcbi5haWRlcipcbi5lbnYucHJvZHVjdGlvblxuKi9tb3VudC8qLmhhc2hcbi5kZXZjb250YWluZXIvXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90Lipcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLnBsYXl3cmlnaHQtY2xpL1xuLnNlcmVuYS9cbi50bXAvXG5fX2dlbmVyYXRlZF9fL1xuQHdpbGxib29zdGVyL1xuZGlzdC9cbnRlbXAvXG50bXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnlcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBveGxpbnRDb250ZW50KSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cblxuY29uc3Qgb3hsaW50Q29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5veGZtdC5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ25vZGUnLCAnbm9kZV9tb2R1bGVzLy5iaW4vb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJywgJ094Zm10JywgZXh0KSkuam9pbignJyl9XG4ke2V4dGVuc2lvbnMucHJldHRpZXJPbmx5Lm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnLCAnUHJldHRpZXInLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuIiwiaW1wb3J0IHR5cGUgeyBTcGF3blN5bmNPcHRpb25zIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZCwgYXJncywgY3dkLCByZXRyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IG51bWJlciB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBjb25zdCBzdGF0dXMgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgaWYgKHN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gICAgaWYgKHJldHJ5IDw9IDApIHJldHVybiBzdGF0dXM7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZGVyciBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZGVyciA9IHByb2Muc3RkZXJyID8/ICcnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnID8gc3RkZXJyLnRyaW0oKSA6IHN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBmYWlsZWQgd2l0aDogJHtwcm9jLmVycm9yLm1lc3NhZ2V9YCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3Rkb3V0IG9uIEVOT0VOVC5cbiAgY29uc3Qgc3Rkb3V0ID0gcHJvYy5zdGRvdXQgPz8gJyc7XG4gIHJldHVybiB0eXBlb2Ygc3Rkb3V0ID09PSAnc3RyaW5nJyA/IHN0ZG91dC50cmltKCkgOiBzdGRvdXQudG9TdHJpbmcoKS50cmltKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICAvLyBSZW1vdmUgYmVycnkgZnJvbSBQQVRIXG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEguc3BsaXQoJzonKVxuICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gZW52LkJFUlJZX0JJTl9GT0xERVIpXG4gICAgICAuam9pbignOicpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUjtcbiAgfVxuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUI7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU5cbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcblxuY29uc3Qgb3hsaW50RGVwcyA9IFsnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsICdveGZtdCcsICdveGxpbnQnLCAnb3hsaW50LXRzZ29saW50J107XG5jb25zdCB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID0gJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JztcbmNvbnN0IG9ic29sZXRlTGludERlcGVuZGVuY2llcyA9IFtcbiAgJ0BiaW9tZWpzL2Jpb21lJyxcbiAgJ0Blc2xpbnQtcmVhY3QvZXNsaW50LXBsdWdpbicsXG4gICdAZXNsaW50L2pzJyxcbiAgJ0BuZXh0L2VzbGludC1wbHVnaW4tbmV4dCcsXG4gICdAdHlwZXMvZXNsaW50JyxcbiAgJ0B0eXBlcy9taWNyb21hdGNoJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInLFxuICAnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnLFxuICAnYmlvbWUnLFxuICAnZXNsaW50JyxcbiAgJ2VzbGludC1jb25maWctZmxhdC1naXRpZ25vcmUnLFxuICAnZXNsaW50LWNvbmZpZy1wcmV0dGllcicsXG4gICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLW5vZGUnLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0JyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0JyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAnZXNsaW50LXBsdWdpbi1wZXJmZWN0aW9uaXN0JyxcbiAgJ2VzbGludC1wbHVnaW4tcHJldHRpZXInLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdC1jb21waWxlcicsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtY2xhc3MtbWVtYmVycycsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtZGVzdHJ1Y3R1cmUta2V5cycsXG4gICdlc2xpbnQtcGx1Z2luLXN0b3J5Ym9vaycsXG4gICdlc2xpbnQtcGx1Z2luLXVuaWNvcm4nLFxuICAnZXNsaW50LXBsdWdpbi11bnVzZWQtaW1wb3J0cycsXG4gICdnbG9iYWxzJyxcbiAgJ21pY3JvbWF0Y2gnLFxuICAndHlwZXNjcmlwdC1lc2xpbnQnLFxuXTtcblxuY29uc3QgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbnR5cGUgV3JpdGFibGVQYWNrYWdlSnNvbiA9IFNldFJlcXVpcmVkPFxuICBQYWNrYWdlSnNvbixcbiAgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJ1xuPjtcblxuaW50ZXJmYWNlIERlcGVuZGVuY3lVcGRhdGVzIHtcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgZGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uT2JqID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoanNvbk9iaiwgY29uZmlnLmRpclBhdGgpO1xuICBhd2FpdCB1cGRhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iaiwgcGFja2FnZU1hbmFnZXIpO1xuICBjb25zdCBkZXBlbmRlbmN5VXBkYXRlcyA9IGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oanNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG4gIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpKSk7XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhjb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzLCBwYWNrYWdlTWFuYWdlcik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFdyaXRhYmxlUGFja2FnZUpzb24+IHtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgcmV0dXJuIGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybidcbik6IFByb21pc2U8dm9pZD4ge1xuICByZW1vdmVMZWdhY3lJbnN0YWxsQ29tbWFuZHMoanNvbk9iai5zY3JpcHRzKTtcblxuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xuICBhZGRTdGFydFRlc3RTZXJ2ZXJTY3JpcHRJZk5lZWRlZChjb25maWcsIGpzb25PYmopO1xuICBhZGRJbnN0YWxsU3RlcFRvQ2hlY2tGb3JBaShqc29uT2JqLnNjcmlwdHMsIHBhY2thZ2VNYW5hZ2VyKTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeTtcbiAgfSBlbHNlIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucHJldHRpZnkgPSAoanNvbk9iai5zY3JpcHRzLnByZXR0aWZ5ID8/ICcnKSArIChhd2FpdCBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGNvbmZpZy5kaXJQYXRoKSk7XG4gIH1cbiAgbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKGpzb25PYmouc2NyaXB0cyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgIC8vIEZyZXNoIHJlcG9zIHN0aWxsIHJlcXVpcmUgc3RhbmRhbG9uZSBgeWFybiBpbnN0YWxsYDsgb25seSByZW1vdmUgbGVnYWN5IGluc3RhbGwgcHJlZml4ZXMgYmVmb3JlIGFub3RoZXIgY29tbWFuZC5cbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbCgveWFyblxccyooPzppbnN0YWxsXFxzKik/JiZcXHMqL2d1LCAnJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEluc3RhbGxTdGVwVG9DaGVja0ZvckFpKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyk6IHZvaWQge1xuICBpZiAoISgnY2hlY2stZm9yLWFpJyBpbiBzY3JpcHRzKSkgcmV0dXJuO1xuXG4gIGlmICgnZ2VuLWNvZGUnIGluIHNjcmlwdHMpIHtcbiAgICBzY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZSA+IC9kZXYvbnVsbCAmJiAke3NjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG4gIH1cbiAgc2NyaXB0c1snY2hlY2stZm9yLWFpJ10gPSBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbCA+IC9kZXYvbnVsbCAmJiAke3NjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbChcbiAgICAgIC95YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCg/IVxccysoPzotQXwtUnwtLSg/OmFsbHxyZWN1cnNpdmV8c2luY2V8d29ya3RyZWV8ZnJvbXxpbmNsdWRlfGV4Y2x1ZGV8cHVibGljfHByaXZhdGUpKSkvZ3UsXG4gICAgICAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogRGVwZW5kZW5jeVVwZGF0ZXMge1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IFsncHJldHRpZXInLCAnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG5cbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICBkZWxldGUgKGpzb25PYmogYXMgUGFja2FnZUpzb24gJiB7ICdsaW50LXN0YWdlZCc/OiB1bmtub3duIH0pWydsaW50LXN0YWdlZCddO1xuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmh1c2t5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby5cbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKVxuICAgICAgICA/IG1lcmdlLmFsbChbanNvbk9iai53b3Jrc3BhY2VzLCBbJ3BhY2thZ2VzLyonXV0sIHtcbiAgICAgICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFsncGFja2FnZXMvKiddO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy53YiB8fCBjb25maWcuaXNCdW4pIHtcbiAgICBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKC93YlxccytkYi9ndSwgJ3diIHByaXNtYScpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4ub3hsaW50RGVwcyk7XG4gIH1cblxuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLmdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpKTtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdEdvRGVwZW5kZW5jeSk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL25vZGUnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ3RzLWplc3QnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICAgICkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9qZXN0Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIHJldHVybiB7XG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIGRldkRlcGVuZGVuY2llczogZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gWWFybiB0cmVhdHMgdGhlIGxlZ2FjeSBucG0vY2hhbGsgcmVzb2x1dGlvbiBhbGlhcyBhcyBhbiBpbnZhbGlkIHBhY2thZ2UgdG9rZW4uXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBbJ2NsZWFudXAnLCAnY2hlY2stZm9yLWFpJ10pIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgICAgICAgaWYgKCFzY3JpcHQpIGNvbnRpbnVlO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXSA9IHNjcmlwdC5yZXBsYWNlKC8gPyYmID95YXJuIGxpbnQtZml4KD86IC0tcXVpZXQpPy8sICcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0ganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID8/ICd5YXJuIGxpbnQgLS1maXgnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGRhcnQgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IChqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID8/ICcnKSArIGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgcG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgcG9ldHJ5IHJ1biBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IChqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID8/ICcnKSArIGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICAgIGRlcGVuZGVuY3lVcGRhdGVzLnBvZXRyeURldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnkgfHwganNvbk9iai5yZXBvc2l0b3J5KSB7XG4gICAganNvbk9iai5yZXBvc2l0b3J5ID0gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKGNvbmZpZy5yZXBvc2l0b3J5ID8/IGpzb25PYmoucmVwb3NpdG9yeSwganNvbk9iai5yZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ2JsaXR6IGNvZGVnZW4nKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ2JsaXR6IGNvZGVnZW4nO1xuICAgIH0gZWxzZSBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5pbmNsdWRlcygnYmxpdHogcHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5yZXBsYWNlKFxuICAgICAgICAnYmxpdHogY29kZWdlbicsXG4gICAgICAgICdibGl0eiBjb2RlZ2VuICYmIGJsaXR6IHByaXNtYSBnZW5lcmF0ZSdcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hICYmICFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ3ByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ3ByaXNtYSBnZW5lcmF0ZSc7XG4gIH1cblxuICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzLnByZXR0aWVyKSB7XG4gICAgLy8gQmVjYXVzZSBAdHlwZXMvcHJldHRpZXIgYmxvY2tzIHByZXR0aWVyIGV4ZWN1dGlvbi5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9wcmV0dGllciddO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbiwgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLCBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMpO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBdKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsXG4gICAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3QpIHtcbiAgICBjb25zdCBzZWN0aW9uID0ganNvbk9ialtrZXldO1xuICAgIGlmIChzZWN0aW9uICYmIE9iamVjdC5rZXlzKHNlY3Rpb24pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqLCBrZXkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlcyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nXG4pOiB2b2lkIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHBhY2thZ2VNYW5hZ2VyLCBkZXBlbmRlbmNpZXMsIGZhbHNlKTtcblxuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGRldkRlcGVuZGVuY2llcywgdHJ1ZSk7XG5cbiAgaWYgKGRlcGVuZGVuY3lVcGRhdGVzLnBvZXRyeURldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLm5ldyBTZXQoZGVwZW5kZW5jeVVwZGF0ZXMucG9ldHJ5RGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyxcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgZGV2OiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IFsuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksICctLWV4YWN0JywgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSW50ZW50aW9uYWxseSBvbWl0IHZlcnNpb25zIHRvIHVwZGF0ZSBkZXBlbmRlbmNpZXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9ucyB3aXRoIFlhcm4uXG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXBlbmRlbmNpZXNUb0luc3RhbGw6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBuZXcgU2V0KGRlcGVuZGVuY2llcykpIHtcbiAgICBjb25zdCBzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgPSBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICAgICAgZGVwZW5kZW5jeSxcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5KSB7XG4gICAgICBkZXBlbmRlbmNpZXNUb0luc3RhbGwucHVzaChkZXBlbmRlbmN5KTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gJiZcbiAgICAgICFzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgJiZcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICE9PSAnKidcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmNpZXNUb0luc3RhbGw7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhY2hlZFZlcnNpb24gPSBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLmdldChkZXBlbmRlbmN5KTtcbiAgaWYgKGNhY2hlZFZlcnNpb24pIHJldHVybiBjYWNoZWRWZXJzaW9uO1xuXG4gIGNvbnN0IHZlcnNpb24gPVxuICAgIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgZGVwZW5kZW5jeSwgJ3ZlcnNpb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sIHByb2Nlc3MuY3dkKCkpIHx8ICcqJztcbiAgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5zZXQoZGVwZW5kZW5jeSwgdmVyc2lvbik7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG4vLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBtaWdyYXRpb24gY29kZSBpbiBmdXR1cmVcbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+LFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoanNvbk9iai5hdXRob3IgPT09ICdXaWxsQm9vc3RlciBMTEMnKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1hbGwtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjay93YXJuJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpnZW4tY29kZSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Y29kZWdlbiddO1xuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMudHNsaWI7XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci90c2NvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMudHlwZXNjcmlwdDtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmxlcm5hO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGllcjtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stYWxsJ107XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2xlcm5hLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgcmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKGpzb25PYmopO1xufVxuXG5mdW5jdGlvbiByZW1vdmVPYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMoXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPlxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBvYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShkZXBlbmRlbmN5OiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFjdXJyZW50VmVyc2lvbikgcmV0dXJuIHRydWU7XG4gIGlmIChjdXJyZW50VmVyc2lvbiA9PT0gJyonKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIChcbiAgICBkZXBlbmRlbmN5ID09PSAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnIHx8IGRlcGVuZGVuY3kgPT09ICdveGxpbnQnIHx8IGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3lcbiAgKTtcbn1cblxuZnVuY3Rpb24gYWRkU3RhcnRUZXN0U2VydmVyU2NyaXB0SWZOZWVkZWQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QgfHwgIWNvbmZpZy5kZXBlbmRpbmcud2IgfHwganNvbk9iai5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3Qtc2VydmVyJ10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPz89IHt9O1xuICBqc29uT2JqLnNjcmlwdHNbJ3N0YXJ0LXRlc3Qtc2VydmVyJ10gPSAnd2Igc3RhcnQgLS1tb2RlIHRlc3QnO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ2J1biBydW4gY2hlY2stZm9yLWFpICYmIGJ1biBydW4gdGVzdCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogJ2J1biBydW4gY2xlYW51cCcsXG4gICAgICBjbGVhbnVwOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIC0tYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biAtLWJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgfTtcbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG4gICAgY29uc3Qgb2xkVGVzdCA9IG9sZFNjcmlwdHMudGVzdDtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ3lhcm4gY2hlY2stZm9yLWFpICYmIHlhcm4gdGVzdCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogYHlhcm4gZm9ybWF0ID4gL2Rldi9udWxsIDI+IC9kZXYvbnVsbCB8fCB0cnVlICYmIHlhcm4gbGludC1maXggLS1xdWlldGAsXG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIGZvcm1hdC1jb2RlICYmIHlhcm4gcHJldHRpZnlgLFxuICAgICAgbGludDogYG94bGludCAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC5gLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICAnZm9ybWF0LWNvZGUnOiBgb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC5gLFxuICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyT25seS5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgLFxuICAgICAgdHlwZWNoZWNrOiAndHNnbyAtLW5vRW1pdCcsXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBzY3JpcHRzID0gbWVyZ2UoXG4gICAgICAgIHsgLi4uc2NyaXB0cyB9LFxuICAgICAgICB7XG4gICAgICAgICAgZm9ybWF0OiBgc29ydC1wYWNrYWdlLWpzb24gJiYgeWFybiBmb3JtYXQtY29kZSAmJiB5YXJuIHByZXR0aWZ5ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyT25seS5qb2luKFxuICAgICAgICAgICAgJywnXG4gICAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLlxuICAgICAgICAgIC8vIEZPUkNFX0NPTE9SPTMgbWFrZSB3YiBlbmFibGUgY29sb3Igb3V0cHV0LlxuICAgICAgICAgIHRlc3Q6ICdDST0xIEZPUkNFX0NPTE9SPTMgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgIH1cbiAgICBpZiAoIWhhc0pzT3JUcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ107XG4gICAgICBzY3JpcHRzLmZvcm1hdCA9ICdzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5JztcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLmxpbnQ7XG4gICAgICBkZWxldGUgc2NyaXB0c1snbGludC1maXgnXTtcbiAgICB9XG4gICAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gJ3diIHR5cGVjaGVjayc7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBgJHtsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyl9IHx8IHRydWVgO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2F1dGgnLCByZXBvOiAnYXV0aCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQGRpc2NvcmQtYm90L3NoYXJlZCcsIHJlcG86ICdkaXNjb3JkLWJvdCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCByZXBvOiAnY29kZS1hbmFseXplcicsIHRhcmdldDogJ2RldkRlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2p1ZGdlJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IHBhY2thZ2VOYW1lLCByZXBvLCB0YXJnZXQgfSkgPT4ge1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSB8fCBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgcGFja2FnZU5hbWUpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gdGFyZ2V0ID09PSAnZGVwZW5kZW5jaWVzJyA/ICdkZXZEZXBlbmRlbmNpZXMnIDogJ2RlcGVuZGVuY2llcyc7XG4gICAgICAvLyBUaGUgbGludCBydWxlIGRpc2FsbG93cyBgZGVsZXRlYCB3aXRoIGNvbXB1dGVkIHBhY2thZ2UgbmFtZXM7IFJlZmxlY3QgaGFzIHRoZSBzYW1lIGRlbGV0aW9uIHNlbWFudGljcyBoZXJlLlxuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqW290aGVyVGFyZ2V0XSwgcGFja2FnZU5hbWUpO1xuICAgICAganNvbk9ialt0YXJnZXRdW3BhY2thZ2VOYW1lXSA9IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiLyR7cmVwb30uZ2l0IyR7Y29tbWl0SGFzaH1gO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvYnVuL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvcmVhY3QtbmF0aXZlL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9ub2RlLWx0cy90c2NvbmZpZy5qc29uJywgJ0B0c2NvbmZpZy9ub2RlLXRzL3RzY29uZmlnLmpzb24nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzJywgJ0B0c2NvbmZpZy9ub2RlLXRzJ107XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmdhbml6YXRpb246IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvVXJsID0gYGdpdEBnaXRodWIuY29tOiR7b3JnYW5pemF0aW9ufS8ke3JlcG99LmdpdGA7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdnaXQnLCBbJ2xzLXJlbW90ZScsIHJlcG9VcmwsICdIRUFEJ10sIHByb2Nlc3MuY3dkKCkpO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBvdXRwdXQuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoIWNvbW1pdEhhc2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb21taXRIYXNoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0cyBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb306ICR7U3RyaW5nKGVycm9yKX1gKSk7XG4gIH1cbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5pbnRlcmZhY2UgTGVmdGhvb2tTZXR0aW5ncyB7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdwcmVwYXJlLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJztcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgY29tbWFuZHM6IHtcbiAgICAgIGNsZWFudXA6IHtcbiAgICAgICAgZ2xvYjogc3RyaW5nO1xuICAgICAgICBydW46IHN0cmluZztcbiAgICAgIH07XG4gICAgICAnY2hlY2stbWlncmF0aW9ucyc6IHtcbiAgICAgICAgZ2xvYjogc3RyaW5nO1xuICAgICAgICBydW46IHN0cmluZztcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbiAgJ3ByZS1wdXNoJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdjaGVjay5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCc7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG59XG5cbmNvbnN0IGJhc2VTZXR0aW5nczogT21pdDxMZWZ0aG9va1NldHRpbmdzLCAncHJlLWNvbW1pdCc+ID0ge1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAncHJlcGFyZS5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAnY2hlY2suc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3QgcHJlQ29tbWl0U2V0dGluZ3M6IExlZnRob29rU2V0dGluZ3NbJ3ByZS1jb21taXQnXSA9IHtcbiAgY29tbWFuZHM6IHtcbiAgICBjbGVhbnVwOiB7XG4gICAgICBnbG9iOiAnJyxcbiAgICAgIHJ1bjogJycsXG4gICAgfSxcbiAgICAnY2hlY2stbWlncmF0aW9ucyc6IHtcbiAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgIHJ1bjogYFxuaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyB7c3RhZ2VkX2ZpbGVzfTsgdGhlblxuICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlcyAoe3N0YWdlZF9maWxlc30pIGNvbnRhaW4gd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICBleGl0IDFcbmZpXG5gLnRyaW0oKSxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBjb25zdCBodXNreURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3knKTtcbiAgY29uc3QgaGFzSHVza3lEaXIgPSBmcy5leGlzdHNTeW5jKGh1c2t5RGlyUGF0aCk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICAuLi5wcmVDb21taXRTZXR0aW5ncyxcbiAgICAgIGNvbW1hbmRzOiB7XG4gICAgICAgIC4uLnByZUNvbW1pdFNldHRpbmdzLmNvbW1hbmRzLFxuICAgICAgICBjbGVhbnVwOiB7XG4gICAgICAgICAgLi4ucHJlQ29tbWl0U2V0dGluZ3MuY29tbWFuZHMuY2xlYW51cCxcbiAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICBydW46IGdldENsZWFudXBDb21tYW5kKGNvbmZpZyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG4gIGlmICghbGludCkge1xuICAgIGRlbGV0ZSBzZXR0aW5nc1sncHJlLXB1c2gnXTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAoc2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuICBpZiAoaGFzSHVza3lEaXIpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5wcm9taXNlcy5ybShodXNreURpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSxcbiAgICBdKTtcbiAgICBzcGF3blN5bmMoJ2dpdCcsIFsnY29uZmlnJywgJy0tdW5zZXQnLCAnY29yZS5ob29rc1BhdGgnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGxpbnQpIHtcbiAgICBjb25zdCBwcmVQdXNoID0gZ2V0UHJlUHVzaFNjcmlwdChjb25maWcpO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBsZXQgbGludENvbW1hbmQ6IHN0cmluZztcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGxpbnRDb21tYW5kID0gY29uZmlnLmRlcGVuZGluZy53YiA/ICdidW4gLS1idW4gd2IgbGludCcgOiAnYnVuIHJ1biBsaW50JztcbiAgfSBlbHNlIHtcbiAgICBsaW50Q29tbWFuZCA9IGNvbmZpZy5kZXBlbmRpbmcud2IgPyAneWFybiB3YiBsaW50JyA6ICd5YXJuIHJ1biBsaW50JztcbiAgfVxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHtsaW50Q29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiBsaW50Q29tbWFuZDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN1cHBvcnRlZEV4dGVuc2lvbnMgPSBbLi4uZXh0ZW5zaW9ucy5wcmV0dGllck9ubHldO1xuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCguLi5leHRlbnNpb25zLm94Zm10LCAuLi5leHRlbnNpb25zLm94bGludCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ3B5Jyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdkYXJ0Jyk7XG4gIH1cbiAgY29uc3QgZmlsdGVyZWRFeHRlbnNpb25zID0gWy4uLm5ldyBTZXQoc3VwcG9ydGVkRXh0ZW5zaW9ucyldLnRvU29ydGVkKCk7XG4gIHJldHVybiBgKiovKi57JHtmaWx0ZXJlZEV4dGVuc2lvbnMuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWcpKSB7XG4gICAgcmV0dXJuICd5YXJuIHdvcmtzcGFjZSBAd2lsbGJvb3N0ZXIvd2Igc3RhcnQgLS13b3JraW5nLWRpciBcIiQoZ2l0IHJldi1wYXJzZSAtLXNob3ctdG9wbGV2ZWwpXCIgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfSAmJiBnaXQgYWRkIC0tIHtzdGFnZWRfZmlsZXN9JztcbiAgfVxuICBpZiAoY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIGNvbnN0IGNvbW1hbmQgPSBjb25maWcuZGVwZW5kaW5nLndiXG4gICAgICA/IGAke2NvbmZpZy5pc0J1biA/ICdidW4gLS1idW4gd2InIDogJ3lhcm4gd2InfSBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9YFxuICAgICAgOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGZvcm1hdCAmJiAke3BhY2thZ2VNYW5hZ2VyfSBydW4gbGludC1maXhgO1xuICAgIHJldHVybiBgJHtjb21tYW5kfSAmJiBnaXQgYWRkIC0tIHtzdGFnZWRfZmlsZXN9YDtcbiAgfVxuXG4gIGNvbnN0IG94bGludFBhdHRlcm4gPSBleHRlbnNpb25zLm94bGludC5tYXAoKGV4dGVuc2lvbikgPT4gU3RyaW5nLnJhd2BcXC4ke2V4dGVuc2lvbn0kYCkuam9pbignfCcpO1xuICBjb25zdCBveGZtdFBhdHRlcm4gPSBleHRlbnNpb25zLm94Zm10Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IHByZXR0aWVyUGF0dGVybiA9IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG5cbiAgcmV0dXJuIFN0cmluZy5yYXdgXG4ke2hhc0pzT3JUcyA/IFN0cmluZy5yYXdgb3hsaW50X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke294bGludFBhdHRlcm59KScgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7aGFzSnNPclRzID8gU3RyaW5nLnJhd2BveGZtdF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtveGZtdFBhdHRlcm59KScgfHwgdHJ1ZSlcImAgOiAnJ31cbnByZXR0aWVyX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke3ByZXR0aWVyUGF0dGVybn0pJyB8fCB0cnVlKVwiXG5wYWNrYWdlX2pzb25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJcbiR7Y29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayA/IFN0cmluZy5yYXdgcHl0aG9uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLnB5JCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7Y29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgPyBTdHJpbmcucmF3YGRhcnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwuZGFydCQnIHwgZ3JlcCAtdiAnZ2VuZXJhdGVkJyB8IGdyZXAgLXYgJ1xcLmZyZWV6ZWRcXC5kYXJ0JCcgfCBncmVwIC12ICdcXC5nXFwuZGFydCQnIHx8IHRydWUpXCJgIDogJyd9XG5cbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hmbXRfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICRveGZtdF9maWxlc1xuZmlcbmBcbiAgICA6ICcnXG59XG5pZiBbIC1uIFwiJHByZXR0aWVyX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSAtLWlnbm9yZS11bmtub3duIC0tICRwcmV0dGllcl9maWxlc1xuZmlcbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hsaW50X2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL294bGludCAtLWZpeCAkb3hsaW50X2ZpbGVzXG5maVxuYFxuICAgIDogJydcbn1cbmlmIFsgLW4gXCIkcGFja2FnZV9qc29uX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3NvcnQtcGFja2FnZS1qc29uIC0tICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gIHBvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzICRweXRob25fZmlsZXNcbiAgcG9ldHJ5IHJ1biBibGFjayAkcHl0aG9uX2ZpbGVzXG4gIHBvZXRyeSBydW4gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuZ2l0IGFkZCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5oYXNWZXJzaW9uU2V0dGluZ3MpIHtcbiAgICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWx8XFwudG9vbC12ZXJzaW9uc3xcXC4uKy12ZXJzaW9uKWA7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmNqc2AsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmpzYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuanNvbmAsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgIF0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGZtdENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsZWdhY3lDb25maWdQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm94Zm10cmMuanNvbicpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hmbXQuY29uZmlnLnRzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGxlZ2FjeUNvbmZpZ1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBjb25maWdDb250ZW50ID0gYGltcG9ydCBjb25maWcgZnJvbSAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbmZpZztcbmA7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIF9yb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGxpbnRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGxpbnQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMueWFtbCcpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMueW1sJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5tanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy50cycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICBdO1xuICAgIGlmICghZXhpc3RpbmdDb250ZW50KSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWdDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5jb25zdCBjb25maWdDb250ZW50ID0gYGltcG9ydCBjb25maWcgZnJvbSAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjb25maWc7XG5gO1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbnRlc3QvZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgdmVudlBhdGg6ICcuJyxcbiAgdmVudjogJy52ZW52Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmMoYCR7Y29uZmlnLmRpclBhdGh9Ly5naXRodWIvd29ya2Zsb3dzYCk7XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IChiYWRnZU5hbWVbMF0gfHwgJycpLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBpZiAoIXJlcG9zaXRvcnkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYmFkZ2UgPSBgWyFbJHtiYWRnZU5hbWV9XShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfSlgO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLmdpdGh1Yi93b3JrZmxvd3MvJHtmaWxlTmFtZX1gKSkpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIGJhZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g5pei44GrYmFkZ2XjgYzjgYLjgovloLTlkIjjga/liYrpmaRcbiAgcmVhZG1lID0gcmVhZG1lLnJlcGxhY2UoYmFkZ2UsICcnKS5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRtZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZWFkbWVbaSAtIDFdID09PSAnXFxuJyAmJiByZWFkbWVbaV0gPT09ICdcXG4nKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSByZWFkbWUuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgbGV0IGFmdGVyID0gcmVhZG1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIGlmICghYWZ0ZXIuc3RhcnRzV2l0aCgnWycpICYmICFhZnRlci5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgYWZ0ZXIgPSBgXFxuJHthZnRlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2JlZm9yZX0ke2JhZGdlfVxcbiR7YWZ0ZXJ9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3JlYWRtZX1cXG4ke2JhZGdlfVxcbmA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luRW50cnkgPSBwbHVnaW5zW2ldO1xuICAgICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocGx1Z2luRW50cnkpO1xuICAgICAgY29uc3QgcGx1Z2luID0gaXNBcnJheSA/IHBsdWdpbkVudHJ5WzBdIDogcGx1Z2luRW50cnk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoaXNBcnJheSAmJiBwbHVnaW5FbnRyeVsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uNSddLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IHR5cGVvZiBqc29uT2JqICYgeyBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoanNvbk9iaikgYXMgU2V0dGluZ3M7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdyZW5vdmF0ZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7ZmlsZVBhdGh9NWApKSB7XG4gICAgICAvLyBTaW5jZSBpdCBpcyBkaWZmaWN1bHQgZm9yIHBhcnNpbmcgcmVub3ZhdGUuanNvbjUsIHdlIGRvIG5vdGhpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBEb24ndCB1cGdyYWRlIE5leHQuanMgYXV0b21hdGljYWxseVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMgPz89IFtdO1xuICAgICAgaWYgKFxuICAgICAgICAhbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnNvbWUoKHJ1bGU6IHsgbWF0Y2hQYWNrYWdlTmFtZXM/OiBzdHJpbmdbXSB9KSA9PlxuICAgICAgICAgIHJ1bGUubWF0Y2hQYWNrYWdlTmFtZXM/LmluY2x1ZGVzKCduZXh0JylcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5wdXNoKHsgbWF0Y2hQYWNrYWdlTmFtZXM6IFsnbmV4dCddLCBlbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRlcGVuZGFib3QnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZW5vdmF0ZXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdpbnN0YWxsQWdlbnRTa2lsbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVE9ETzogV2UgYXJlIHRlbXBvcmFyaWx5IHJlbW92aW5nIGFnZW50IHNraWxscyBmcm9tIHRoZSByZXBvXG4gICAgLy8gYXdhaXQgcnVuSW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZzLnJtKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuYWdlbnRzJyksIHtcbiAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgZnMucm0ocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jbGF1ZGUnKSwge1xuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSksXG4gICAgICBmcy5ybShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnc2tpbGxzLWxvY2suanNvbicpLCB7XG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgfSksXG4gICAgXSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IHRydWUsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsncGFja2FnZXMvKi90ZXN0L2ZpeHR1cmVzJywgJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogW1xuICAgICdwYWNrYWdlcy8qL3NjcmlwdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc3JjLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3Rlc3QvKiovKicsXG4gICAgJ3NjcmlwdHMvKiovKicsXG4gICAgJ3NyYy8qKi8qJyxcbiAgICAndGVzdC8qKi8qJyxcbiAgXSxcbn07XG5cbmNvbnN0IHN1Ykpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IHRydWUsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSByZXR1cm47XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpciA9IGdldFJvb3REaXIoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHR5cGVzOiBnZW5lcmF0ZWRUeXBlcyB9O1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNCdW4gJiYgIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBqc3g6ICdyZWFjdC1qc3gnIH07XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgICBuZXdTZXR0aW5ncy5leGNsdWRlID0gbmV3U2V0dGluZ3MuZXhjbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVHlwZXMgPSBub3JtYWxpemVTdHJpbmdBcnJheShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW1pdE9wdGlvbnMgPSBwaWNrRXhpc3RpbmdFbWl0T3B0aW9ucyhvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG1lcmdlVHNjb25maWdFeHRlbmRzKG5ld1NldHRpbmdzLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMpO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgICAgLy8gS2VlcCBleHBsaWNpdCBlbWl0IHNldHRpbmdzIGJlY2F1c2Ugc29tZSByZXBvcyBoYXZlIHRzY29uZmlnLmJ1aWxkLmpzb24gZmlsZXNcbiAgICAgIC8vIHRoYXQgZXh0ZW5kIHRoaXMgY29uZmlnIGFuZCByZWx5IG9uIHRob3NlIG9wdGlvbnMgZm9yIHRyYWNrZWQgLmQudHMgb3V0cHV0cy5cbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCAuLi5leGlzdGluZ0VtaXRPcHRpb25zIH07XG4gICAgICBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IG1lcmdlZFR5cGVzID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlcywgZ2VuZXJhdGVkVHlwZXMpLCAuLi5nZW5lcmF0ZWRUeXBlc10pXTtcbiAgICAgIGlmIChtZXJnZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IG1lcmdlZFR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGREZWxldGVUeXBlUm9vdHMoZ2VuZXJhdGVkVHlwZXMpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZVJvb3RzO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udmVyYmF0aW1Nb2R1bGVTeW50YXg7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdERpcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnLmlzUm9vdCkgcmV0dXJuICcuJztcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpID8gJy4uLy4uJyA6ICcuJztcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxldGVUeXBlUm9vdHModHlwZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGdlbmVyYXRlZCBwYWNrYWdlLW93bmVkIHRlc3QgdHlwZXMgc2hvdWxkIHRyaWdnZXIgdGhpcy4gVXNlci1kZWZpbmVkIHNsYXNoLWJhc2VkXG4gIC8vIGVudHJpZXMgbWF5IGludGVudGlvbmFsbHkgcmVseSBvbiBjdXN0b20gdHlwZVJvb3RzIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIGFzLWlzLlxuICByZXR1cm4gdHlwZU5hbWVzLnNvbWUoKHR5cGVOYW1lKSA9PiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lLmluY2x1ZGVzKCcvJykpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXM6IHN0cmluZ1tdLCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdlbmVyYXRlZFR5cGVTZXQgPSBuZXcgU2V0KGdlbmVyYXRlZFR5cGVzKTtcbiAgcmV0dXJuIGV4aXN0aW5nVHlwZXMuZmlsdGVyKCh0eXBlTmFtZSkgPT4ge1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBwYWNrYWdlLXByb3ZpZGVkIHRlc3QgZ2xvYmFscy4gRHJvcCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlXG4gICAgLy8gY29ycmVzcG9uZGluZyBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBwcmVzZW50IHNvIFR5cGVTY3JpcHQgd29uJ3QgcmVxdWlyZVxuICAgIC8vIG1pc3NpbmcgcGFja2FnZXMgc3VjaCBhcyB2aXRlc3QuXG4gICAgaWYgKGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWUpICYmICFnZW5lcmF0ZWRUeXBlU2V0Lmhhcyh0eXBlTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZSA9PT0gJ2plc3QnIHx8IHR5cGVOYW1lID09PSAnbW9jaGEnIHx8IHR5cGVOYW1lID09PSAndml0ZXN0L2dsb2JhbHMnO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuICBpZiAoY29tcGlsZXJPcHRpb25zLm5vRW1pdCAhPT0gZmFsc2UgfHwgY29tcGlsZXJPcHRpb25zLmVtaXREZWNsYXJhdGlvbk9ubHkgPT09IHRydWUpIHJldHVybjtcblxuICAvLyBAdHNjb25maWcvYnVuIGVuYWJsZXMgYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnMsIHdoaWNoIFR5cGVTY3JpcHQgcGVybWl0c1xuICAvLyBkdXJpbmcgZW1pdCBvbmx5IHdoZW4gcmVsYXRpdmUgVFMgZXh0ZW5zaW9ucyBhcmUgcmV3cml0dGVuLlxuICBjb21waWxlck9wdGlvbnMucmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9ucyA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHBpY2tFeGlzdGluZ0VtaXRPcHRpb25zKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ11cbik6IFBpY2s8XG4gIE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LFxuICAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdlbWl0RGVjbGFyYXRpb25Pbmx5JyB8ICdub0VtaXQnIHwgJ3NvdXJjZU1hcCdcbj4ge1xuICBjb25zdCBlbWl0T3B0aW9ucyA9IHt9IGFzIFBpY2s8XG4gICAgTm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sXG4gICAgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnZW1pdERlY2xhcmF0aW9uT25seScgfCAnbm9FbWl0JyB8ICdzb3VyY2VNYXAnXG4gID47XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnZGVjbGFyYXRpb24nLCAnZGVjbGFyYXRpb25NYXAnLCAnZW1pdERlY2xhcmF0aW9uT25seScsICdub0VtaXQnLCAnc291cmNlTWFwJ10gYXMgY29uc3QpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXBpbGVyT3B0aW9ucz8uW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVtaXRPcHRpb25zW2tleV0gPSB2YWx1ZSBhcyBuZXZlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVtaXRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2J1bicpO1xuICB9IGVsc2UgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbm9kZScpO1xuICB9XG4gIGlmIChcbiAgICBkZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgIGRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgZGVwZW5kZW5jaWVzWydqZXN0LWVudmlyb25tZW50LWpzZG9tJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICApIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdqZXN0Jyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy52aXRlc3QpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCd2aXRlc3QvZ2xvYmFscycpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMubW9jaGEpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdtb2NoYScpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMuY3lwcmVzcykge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2N5cHJlc3MnKTtcbiAgfVxuXG4gIHJldHVybiBbLi4udHlwZU5hbWVzXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy52ZW52LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLm5leHQvKionKV0pO1xuICAgICAgfVxuICAgICAgLy8gTExN44Gr44KI44KLdmliZSBjb2Rpbmfjgafjga/jgIHoh6rli5Xjg5Xjgqnjg7zjg57jg4Pjg4jjgoTjgrPjg7zjg4njgqLjgq/jgrfjg6fjg7PjgpLnhKHlirnljJbjgZnjgovjgZPjgajjgadcbiAgICAgIC8vIOeUn+aIkOOBleOCjOOBn+OCs+ODvOODieOBruWFg+OBruW9ouW8j+OCkue2reaMgeOBp+OBjeOCi1xuICAgICAgaWYgKCdlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJ107XG4gICAgICB9XG4gICAgICBpZiAoJ2VkaXRvci5mb3JtYXRPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmZvcm1hdE9uU2F2ZSddO1xuICAgICAgfVxuICAgICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm46IHN0cmluZyk6IG9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgJ2ZpbGVzLndhdGNoZXJFeGNsdWRlJzoge1xuICAgICAgW2V4Y2x1ZGVGaWxlUGF0dGVybl06IHRydWUsXG4gICAgfSxcbiAgfTtcbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG50eXBlIFNldHRpbmdzID0ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgbnBtTWluaW1hbEFnZUdhdGU/OiBzdHJpbmc7XG4gIG5wbVByZWFwcHJvdmVkUGFja2FnZXM/OiBzdHJpbmdbXTtcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufSAmIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPjtcblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGlzTmV3ZXJWZXJzaW9uKGxhdGVzdFZlcnNpb24sIGN1cnJlbnRWZXJzaW9uKSkge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGxldCBzZXR0aW5ncyA9IHt9IGFzIFNldHRpbmdzO1xuICAgIHRyeSB7XG4gICAgICBzZXR0aW5ncyA9ICh5YW1sLmxvYWQoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoeWFybnJjWW1sUGF0aCwgJ3V0ZjgnKSkgYXMgU2V0dGluZ3MgfCB1bmRlZmluZWQpID8/IHNldHRpbmdzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzZXR0aW5ncy5kZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXggPSAnJztcbiAgICBzZXR0aW5ncy5ub2RlTGlua2VyID0gJ25vZGUtbW9kdWxlcyc7XG4gICAgc2V0dGluZ3Mubm1Nb2RlID0gJ2hhcmRsaW5rcy1nbG9iYWwnO1xuICAgIHNldHRpbmdzLm5wbU1pbmltYWxBZ2VHYXRlID0gJzVkJztcbiAgICBzZXR0aW5ncy5ucG1QcmVhcHByb3ZlZFBhY2thZ2VzID0gW1xuICAgICAgLy8gLS0tLS0tLS0tLSBXZSBiZWxpZXZlIG91ciBwYWNrYWdlcyBhcmUgc2FmZSAtLS0tLS0tLS0tXG4gICAgICAnQGV4ZXJjb2RlLyonLFxuICAgICAgJ0B3aWxsYm9vc3Rlci8qJyxcbiAgICAgICdhZ2VudC1ydW50aW1lLWtpdCcsXG4gICAgICAnb25lLXdheS1naXQtc3luYycsXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8vIFRvIGRlYWwgd2l0aCBDVkUgbGlrZSBodHRwczovL25leHRqcy5vcmcvYmxvZy9DVkUtMjAyNS02NjQ3OFxuICAgICAgJ25leHQnLFxuICAgICAgJ0BuZXh0LyonLFxuICAgICAgJ0B0eXBlc2NyaXB0LyonLFxuICAgICAgJ0BveGZtdC8qJyxcbiAgICAgICdAb3hsaW50LyonLFxuICAgICAgJ0BveGxpbnQtdHNnb2xpbnQvKicsXG4gICAgICAnb3hmbXQnLFxuICAgICAgJ294bGludCcsXG4gICAgICAnb3hsaW50LXRzZ29saW50JyxcbiAgICAgICdyZWFjdCcsXG4gICAgICAncmVhY3QtZG9tJyxcbiAgICBdO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3BsdWdpbnMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAvLyBUaGUgdGFyZ2V0IHJlcG8gbWF5IG5vdCBoYXZlIHByZXR0aWVyIGluc3RhbGxlZCB5ZXQsIGFuZCB5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwgZWRpdHMgdGhpcyBmaWxlIGFmdGVyIGpzLXlhbWwuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAncHJldHRpZXInLCAnLS13cml0ZScsIHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIHlhcm5yY1ltbFBhdGgpXSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9uJ10sIGRpclBhdGgpIHx8ICcwLjAuMCc7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJWZXJzaW9uKG5ld1ZlcnNpb246IHN0cmluZywgb2xkVmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTmV3VmVyc2lvbiA9IHNlbXZlci52YWxpZChuZXdWZXJzaW9uKTtcbiAgaWYgKCF2YWxpZE5ld1ZlcnNpb24pIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gc2VtdmVyLmd0KHZhbGlkTmV3VmVyc2lvbiwgc2VtdmVyLnZhbGlkKG9sZFZlcnNpb24pID8/ICcwLjAuMCcpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1hbGwgOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY2xhdWRlIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNvZGV4IDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWdlbWluaSA6cm9ib3Q6JywgJzAwQjREOCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdsbG0tcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdhaS1wciA6cm9ib3Q6Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCIvLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBMaWJTb2RpdW0ncyBuYW1lc3BhY2UgQVBJIGtlZXBzIGNyeXB0byBoZWxwZXJzIGdyb3VwZWQuXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgc29kaXVtIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IERFUFJFQ0FURURfU0VDUkVUX05BTUVTID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJywgJ0dIX0JPVF9QQVQnLCAnUFVCTElDX0dIX0JPVF9QQVQnXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVudicpIH0pLnBhcnNlZCA/PyB7fTtcbiAgICBpZiAoT2JqZWN0LmtleXMocGFyc2VkKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHNlY3JldE5hbWUgb2YgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBzZWNyZXRfbmFtZTogc2VjcmV0TmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUicgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUInXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCBTZWNyZXQgJiBCYXNlNjQga2V5IHRvIFVpbnQ4QXJyYXkuXG4gICAgICAgIGNvbnN0IHJhd0tleSA9IHNvZGl1bS5mcm9tX2Jhc2U2NChrZXksIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuICAgICAgICBjb25zdCByYXdTZWMgPSBzb2RpdW0uZnJvbV9zdHJpbmcoc2VjcmV0KTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBzZWNyZXQgdXNpbmcgTGliU29kaXVtXG4gICAgICAgIGNvbnN0IGVuY0J5dGVzID0gc29kaXVtLmNyeXB0b19ib3hfc2VhbChyYXdTZWMsIHJhd0tleSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBlbmNyeXB0ZWQgVWludDhBcnJheSB0byBCYXNlNjRcbiAgICAgICAgY29uc3QgZW5jQmFzZTY0ID0gc29kaXVtLnRvX2Jhc2U2NChlbmNCeXRlcywgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG5cbiAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAvLyBBZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uXG4gIGF3YWl0IHdpdGhSZXRyeSgoKSA9PlxuICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSxcbiAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgYWxsb3dfdXBkYXRlX2JyYW5jaDogdHJ1ZSxcbiAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICB9LFxuICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyID0gJ19fUE1fUlVOX18nO1xuXG5jb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG4jIyBTZWxmIENoZWNrXG5cbi0gWyBdIEkndmUgY29uZmlybWVkIFxcYEFsbCBjaGVja3MgaGF2ZSBwYXNzZWRcXGAgb24gdGhpcyBwYWdlLlxuICAtIFBSIHRpdGxlIGZvbGxvd3MgW0FuZ3VsYXIncyBjb21taXQgbWVzc2FnZSBmb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYWluL0NPTlRSSUJVVElORy5tZCMtY29tbWl0LW1lc3NhZ2UtZm9ybWF0KS5cbiAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBUaGUgdGVzdCBjb21tYW5kIChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXJ9IHRlc3RcXGApIHBhc3NlZC5cbiAgLSBUaGUgbGludCBjb21tYW5kIChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXJ9IGxpbnRcXGApIHBhc3NlZC5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBkdWUgdG8gbG9uZyB3b3JrZmxvd3MuXG4tIFsgXSBJJ3ZlIHJldmlld2VkIG15IGNoYW5nZXMgb24gdGhlIEdpdEh1YiBkaWZmIHZpZXcuXG4tIFsgXSBJJ3ZlIHdyaXR0ZW4gdGhlIHN0ZXBzIHRvIHRlc3QgbXkgY2hhbmdlcy5cbi0gWyBdIEkndmUgYWRkZWQgc2NyZWVuc2hvdHMgKGlmIHRoZSBVSSBjaGFuZ2VkKS5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBpZiB5b3UgZGlkbid0IG1vZGlmeSB0aGUgVUkuXG5cbjwhLS0gUGxlYXNlIGFkZCBzY3JlZW5zaG90cyBpZiB5b3UgbW9kaWZ5IHRoZSBVSS5cbnwgQ3VycmVudCAgICAgICAgICAgICAgICAgIHwgSW4gY29taW5nICAgICAgICAgICAgICAgIHxcbnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbnwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfFxuLS0+XG5cbjwhLS0gUGxlYXNlIGFkZCBzdGVwcyB0byB0ZXN0IHlvdXIgY2hhbmdlcy5cbiMjIFN0ZXBzIHRvIFRlc3RcblxuMS4gT3BlbiBodHRwOi8vbG9jYWxob3N0LWV4ZXJjb2RlLndpbGxib29zdGVyLm5ldDozMDAwL2phLUpQL2NvdXJzZXMvX2V4YW1wbGUvbGVzc29ucy9fZXhhbXBsZV9hX3BsdXNfYi9wcm9ibGVtcy9fZXhhbXBsZV9hX3BsdXNfYiBhZnRlciBsb2dpbi5cbjIuIFNlbGVjdCB0aGUgbGFuZ3VhZ2UgXFxgQ1xcYC5cbjMuIFdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZTpcbiAgIFxcYFxcYFxcYGNcbiAgICNpbmNsdWRlIDxzdGRpby5oPlxuXG4gICBpbnQgbWFpbih2b2lkKSB7XG4gICAgIGludCBhLCBiO1xuXG4gICAgIHNjYW5mKFwiJWQgJWRcIiwgJmEsICZiKTtcbiAgICAgcHJpbnRmKFwiJWRcIiwgYSArIGIpO1xuICAgICByZXR1cm4gMDtcbiAgIH1cbiAgIFxcYFxcYFxcYFxuNC4gUHVzaCBcXGBTdWJtaXRcXGAgYnV0dG9uLlxuNS4gLi4uXG4tLT5cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBuZXdDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKG5ld0NvbnRlbnQsIGNvbmZpZyk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBpZiAoZGlzdGFuY2Uob2xkQ29udGVudCwgY29udGVudCkgPiBjb250ZW50Lmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUodGVtcGxhdGU6IHN0cmluZywgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZUFsbChwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyLCBwYWNrYWdlTWFuYWdlckNvbW1hbmQpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgc2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsIH0gZnJvbSAnLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNCdW46IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIC8vIGRlcGVuZGVuY3kgaW5mb3JtYXRpb25cbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9tWG1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIC8vIHNvdXJjZSBjb2RlIGZpbGVzXG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcblxuICBoYXNTdGFydFRlc3RTZXJ2ZXI6IGJvb2xlYW47XG5cbiAgZGVwZW5kaW5nOiB7XG4gICAgYmxpdHo6IGJvb2xlYW47XG4gICAgZmlyZWJhc2U6IGJvb2xlYW47XG4gICAgZ2VuSTE4blRzOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGhhc1ZlcnNpb25TZXR0aW5nczogYm9vbGVhbjtcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcGx1Z2lucz86IHN0cmluZ1tdW107XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzID8/IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgPz8gW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IGhhc1ZlcnNpb25TZXR0aW5ncyA9IGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBwcmVmaXggb2YgWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ10pIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCkpKSB7XG4gICAgICAgIGhhc1ZlcnNpb25TZXR0aW5ncyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0Z1bGxOYW1lID8gYGdpdGh1Yjoke3JlcG9GdWxsTmFtZX1gIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcygnL3dpbGxib29zdGVyLWNvbmZpZ3MnKSxcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgaGFzU3RhcnRUZXN0U2VydmVyOiAhIXBhY2thZ2VKc29uLnNjcmlwdHM/Llsnc3RhcnQtdGVzdC1zZXJ2ZXInXSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXMuYmxpdHosXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucHJpc21hLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llcy5weXJpZ2h0LFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgaGFzVmVyc2lvblNldHRpbmdzLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHJldHVybiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJ21pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcubWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy50b29sLXZlcnNpb25zJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcy5mZXRjaCA/PyBvcmlnaW4/LnJlZnMucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgY29uc3QgcmV0ID0geyBmdWxsX25hbWU6IGAke29yZ30vJHtuYW1lfWAgfTtcbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KCkucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24ocmV0LCByZXNwb25zZS5kYXRhKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWRpcmVjdGVkRnVsbE5hbWUgPSBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yKTtcbiAgICBpZiAocmVkaXJlY3RlZEZ1bGxOYW1lKSB7XG4gICAgICByZXQuZnVsbF9uYW1lID0gcmVkaXJlY3RlZEZ1bGxOYW1lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IFdJTExCT09TVEVSX0NPTkZJR19QQUNLQUdFX05BTUVTID0gbmV3IFNldChbJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnXSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBjb25maWcucGFja2FnZUpzb24/Lm5hbWU7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmIHR5cGVvZiBwYWNrYWdlTmFtZSA9PT0gJ3N0cmluZycgJiYgV0lMTEJPT1NURVJfQ09ORklHX1BBQ0tBR0VfTkFNRVMuaGFzKHBhY2thZ2VOYW1lKVxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlbW92ZUdlbWluaVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGluc3RhbGxBZ2VudFNraWxscyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9za2lsbHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIH0gZnJvbSAnLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZW52OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzZWNyZXRzIHRvIEdpdEh1YicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZScsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdTa2lwIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCB5YXJuIGJlcnJ5XG4gICAgYXdhaXQgZ2VuZXJhdGVZYXJucmNZbWwocm9vdENvbmZpZyk7XG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSdW5Xb3JrZmxvd3MgPVxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgIChyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fFxuICAgICAgICByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZml4UHJpc21hRW52RmlsZXMocm9vdENvbmZpZyksXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHZW1pbmlDb25maWcocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgcmVtb3ZlR2VtaW5pU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZW5vdmF0ZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihzaG91bGRSdW5Xb3JrZmxvd3MgPyBbZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyldIDogW10pLFxuICAgICAgc2V0dXBMYWJlbHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cFNlY3JldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWcpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdyZWZyZXNoQnVuTG9jaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCcsICctLW5vLWltbXV0YWJsZSddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcblxuICAgIGF3YWl0IGluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGxvY2tGaWxlUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ2J1bi5sb2NrJyk7XG4gIGNvbnN0IGJhY2t1cExvY2tGaWxlUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJy5idW4ubG9jay53YmZ5LWJhY2t1cCcpO1xuICBmcy5ybVN5bmMoYmFja3VwTG9ja0ZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NrRmlsZVBhdGgpKSB7XG4gICAgLy8gUmVnZW5lcmF0ZSBmcm9tIHNjcmF0Y2gsIGJ1dCBrZWVwIHRoZSBwcmV2aW91cyBsb2NrZmlsZSBzbyBhIHJlZ2lzdHJ5IG9yXG4gICAgLy8gcmVzb2x2ZXIgZmFpbHVyZSBjYW5ub3QgbGVhdmUgdGhlIHJlcG9zaXRvcnkgd2l0aG91dCBhIGxvY2tmaWxlLlxuICAgIGZzLmNvcHlGaWxlU3luYyhsb2NrRmlsZVBhdGgsIGJhY2t1cExvY2tGaWxlUGF0aCk7XG4gICAgZnMucm1TeW5jKGxvY2tGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWyd1cGRhdGUnXSwgcm9vdERpclBhdGgpO1xuICBpZiAoc3RhdHVzID09PSAwICYmIGZzLmV4aXN0c1N5bmMobG9ja0ZpbGVQYXRoKSkge1xuICAgIGZzLnJtU3luYyhiYWNrdXBMb2NrRmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMoYmFja3VwTG9ja0ZpbGVQYXRoKSkge1xuICAgIGZzLmNvcHlGaWxlU3luYyhiYWNrdXBMb2NrRmlsZVBhdGgsIGxvY2tGaWxlUGF0aCk7XG4gICAgZnMucm1TeW5jKGJhY2t1cExvY2tGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWdlbmVyYXRlICR7bG9ja0ZpbGVQYXRofTogYnVuIHVwZGF0ZSBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJhc3luYyIsInNsZWVwIiwibWlsbGlzZWNvbmRzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwiaWdub3JlRXJyb3JBc3luYyIsImZuIiwiaWdub3JlRW5vZW50QXN5bmMiLCJlcnJvciIsImNvZGUiLCJvcHRpb25zIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsIkVycm9yIiwic3RhY2siLCJTdHJpbmciLCJmc1V0aWwiLCJyZWFkRmlsZUlnbm9yaW5nRXJyb3IiLCJmaWxlUGF0aCIsImZzIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJta2RpciIsInBhdGgiLCJkaXJuYW1lIiwicmVjdXJzaXZlIiwibm9ybWFsaXplZENvbnRlbnQiLCJ0cmltIiwid3JpdGVGaWxlIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImZpeE5leHRDb25maWdKc29uIiwiY29uZmlnIiwibWFwIiwiZXh0IiwiZGlyUGF0aCIsImZpbmQiLCJwIiwiZXhpc3RzU3luYyIsIm9sZENvbnRlbnQiLCJvYmplY3RMaXRlcmFsIiwic291cmNlIiwidHMiLCJjcmVhdGVTb3VyY2VGaWxlIiwiU2NyaXB0VGFyZ2V0IiwiTGF0ZXN0IiwiU2NyaXB0S2luZCIsIkpTIiwidmlzaXQiLCJub2RlIiwiaXNFeHBvcnRBc3NpZ25tZW50IiwiaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsImV4cHJlc3Npb24iLCJpc0JpbmFyeUV4cHJlc3Npb24iLCJvcGVyYXRvclRva2VuIiwia2luZCIsIlN5bnRheEtpbmQiLCJFcXVhbHNUb2tlbiIsImxlZnQiLCJnZXRUZXh0IiwicmlnaHQiLCJmb3JFYWNoQ2hpbGQiLCJnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbCIsInByb3BlcnR5VGV4dHMiLCJTZXQiLCJwcm9wZXJ0aWVzIiwicHJvcGVydHkiLCJoYXMiLCJwdXNoIiwibGVuZ3RoIiwiaW5zZXJ0aW9uUG9pbnQiLCJnZXRFbmQiLCJsYXN0UHJvcGVydHkiLCJhdCIsImhhc1RyYWlsaW5nQ29tbWEiLCJzbGljZSIsImluY2x1ZGVzIiwicHJlZml4IiwibmV3Q29udGVudCIsImpvaW4iLCJydW4iLCJsaXRlcmFsIiwidmFsdWUiLCJhc09iamVjdCIsImV4dHJhTWVtYmVycyIsInRvUGFyc2VkT2JqZWN0IiwiZGVmYXVsdENvbmZpZyIsImZvcmJpZE9ubHkiLCJyZXRyaWVzIiwidXNlIiwiYmFzZVVSTCIsInRyYWNlIiwic2NyZWVuc2hvdCIsInZpZGVvIiwid2ViU2VydmVyIiwiY29tbWFuZCIsInVybCIsInJldXNlRXhpc3RpbmdTZXJ2ZXIiLCJ0aW1lb3V0Iiwic3Rkb3V0Iiwic3RkZXJyIiwiZW52IiwiZ3JhY2VmdWxTaHV0ZG93biIsIm1lbWJlck9yZGVyIiwiT2JqZWN0Iiwia2V5cyIsImtleSIsIl8iLCJpbmRleCIsImZpeFBsYXl3cmlnaHRDb25maWciLCJlbnZGaWxlUGF0aCIsImVudkZpbGVOYW1lcyIsImVudkZpbGVQYXRocyIsImN1cnJlbnREaXJQYXRoIiwiZmlsZU5hbWUiLCJnZXRFbnZGaWxlUGF0aHMiLCJ0ZXN0IiwiYXNzZXJ0TmV4dFB1YmxpY0Jhc2VVcmwiLCJleHRyYWN0ZWRPYmplY3RMaXRlcmFsIiwiVFMiLCJmb3VuZCIsImlzQ2FsbEV4cHJlc3Npb24iLCJmaXJzdEFyZ3VtZW50IiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwiLCJwYXJzZWQiLCJwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uIiwibWVyZ2VkIiwibWVyZ2VQYXJzZWRPYmplY3RzIiwiaGFzU3RhcnRUZXN0U2VydmVyIiwiQm9vbGVhbiIsInBhY2thZ2VKc29uIiwic2NyaXB0cyIsImhhc0V4aXN0aW5nV2ViU2VydmVyIiwib2JqZWN0IiwiaXNCdW4iLCJzZXRXZWJTZXJ2ZXJDb21tYW5kIiwibmV3T2JqZWN0TGl0ZXJhbCIsInN0cmluZ2lmeVZhbHVlIiwic3RhcnQiLCJnZXRTdGFydCIsImVuZCIsImJhc2UiLCJvdmVycmlkZSIsIm92ZXJyaWRlUHJvcGVydHlLZXlzIiwiZmlsdGVyIiwibWVtYmVyIiwiZW50cmllcyIsIm1lcmdlUGFyc2VkVmFsdWUiLCJwYXJzZUV4cHJlc3Npb24iLCJwYXJzZWRPYmplY3QiLCJpc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24iLCJlbGVtZW50cyIsImVsZW1lbnQiLCJzb21lIiwiaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc1Byb3BlcnR5QXNzaWdubWVudCIsImlzSWRlbnRpZmllciIsImlzU3RyaW5nTGl0ZXJhbCIsImluaXRpYWxpemVyIiwibGV2ZWwiLCJjbG9zaW5nSW5kZW50IiwicmVwZWF0IiwiaW5kZW50IiwiaXRlbSIsInN0cmluZ2lmaWVkIiwic3BsaXQiLCJlbWl0dGVkUHJvcGVydGllcyIsImxhc3RQcm9wZXJ0eUluZGV4QnlLZXkiLCJNYXAiLCJzZXQiLCJnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5IiwibGluZXMiLCJmbGF0TWFwIiwic3RyaW5naWZ5T2JqZWN0TWVtYmVyIiwiZ2V0IiwiYWRkIiwic3RyaW5naWZ5T2JqZWN0UHJvcGVydHkiLCJsaW5lIiwiZ2xvYklnbm9yZSIsImZpeFByaXNtYUVudkZpbGVzIiwiZW52RmlsZXMiLCJmZyIsImdsb2IiLCJkb3QiLCJjd2QiLCJpZ25vcmUiLCJlbnZGaWxlIiwicmVwbGFjZUFsbCIsIm1hdGNoIiwic2VwYXJhdG9yIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwic29ydE9iamVjdEJ5S2V5TmFtZUxpc3QiLCJzb3J0V2l0aCIsInNvcnRGbiIsInRvdGFsIiwib2JqZWN0S2V5cyIsInNvcnQiLCJJTkRFTlRfUkVHRVgiLCJJTkRFTlRfVFlQRV9TUEFDRSIsInNob3VsZElnbm9yZVNpbmdsZVNwYWNlIiwiaWdub3JlU2luZ2xlU3BhY2VzIiwiaW5kZW50VHlwZSIsIm1ha2VJbmRlbnRzTWFwIiwic3RyaW5nIiwiaW5kZW50cyIsInByZXZpb3VzSW5kZW50VHlwZSIsInByZXZpb3VzU2l6ZSIsIm1hdGNoZXMiLCJ3ZWlnaHQiLCJpbmRlbnREaWZmZXJlbmNlIiwiYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlIiwiTWF0aCIsImFicyIsImVuY29kZUluZGVudHNLZXkiLCJlbnRyeSIsImluZGVudEFtb3VudCIsImRldGVjdEluZGVudCIsIlR5cGVFcnJvciIsInNpemUiLCJrZXlPZk1vc3RVc2VkSW5kZW50IiwicmVzdWx0IiwibWF4VXNlZCIsIm1heFdlaWdodCIsInVzZWRDb3VudCIsImdldE1vc3RVc2VkS2V5IiwidHlwZSIsImFtb3VudCIsImluZGVudHNLZXkiLCJOdW1iZXIiLCJtYWtlSW5kZW50U3RyaW5nIiwiZGV0ZWN0TmV3bGluZUdyYWNlZnVsIiwibmV3bGluZXMiLCJjcmxmIiwibmV3bGluZSIsImRldGVjdE5ld2xpbmUiLCJwaXBlIiwiZm5zIiwieCIsImFyZ3MiLCJyZWR1Y2UiLCJvbkFycmF5IiwiQXJyYXkiLCJpc0FycmF5Iiwib25TdHJpbmdBcnJheSIsImV2ZXJ5IiwidW5pcSIsInhzIiwic29ydEFycmF5IiwiYXJyYXkiLCJ0b1NvcnRlZCIsInVuaXFBbmRTb3J0QXJyYXkiLCJvbk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJpdGVyYXRvciIsImlzUGxhaW5PYmplY3QiLCJzb3J0T2JqZWN0QnkiLCJjb21wYXJhdG9yIiwiZGVlcCIsIm92ZXIiLCJmcm9tRW50cmllcyIsInNvcnRPYmplY3RLZXlzIiwib2JqZWN0R3JvdXBCeSIsImdyb3VwQnkiLCJjYWxsYmFjayIsImNyZWF0ZSIsInNvcnRPYmplY3QiLCJzb3J0VVJMT2JqZWN0Iiwic29ydFBlb3BsZU9iamVjdCIsInNvcnREaXJlY3RvcmllcyIsIm92ZXJQcm9wZXJ0eSIsImhhc093biIsInNvcnRHaXRIb29rcyIsInBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSIsInNwZWNpZmllciIsIm5hbWVBbmRWZXJzaW9uIiwiYXRNYXRjaGVzIiwibWF0Y2hBbGwiLCJzcGxpdEluZGV4IiwicG9wIiwic3Vic3RyaW5nIiwicmFuZ2UiLCJzb3J0T2JqZWN0QnlTZW12ZXIiLCJhIiwiYiIsImFOYW1lIiwiYVJhbmdlIiwiYk5hbWUiLCJiUmFuZ2UiLCJsb2NhbGVDb21wYXJlIiwic2VtdmVyQ29tcGFyZSIsInNlbXZlck1pblZlcnNpb24iLCJnZXRQYWNrYWdlTmFtZSIsImlkZW50IiwiaW5kZXhPZiIsInN0YXJ0c1dpdGgiLCJjYWNoZSIsInNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtIiwicGFja2FnZU1hbmFnZXIiLCJkZXZFbmdpbmVzIiwicG5wbSIsImVuZ2luZXMiLCJucG0iLCJwcm9jZXNzIiwiaGFzWWFybk9yUG5wbUZpbGVzIiwic29ydERlcGVuZGVuY2llcyIsImRlcGVuZGVuY2llcyIsInNvcnRXb3Jrc3BhY2VzIiwic29ydEVzbGludENvbmZpZyIsIm92ZXJyaWRlcyIsInJ1bGUxIiwicnVsZTIiLCJzb3J0VlNDb2RlQmFkZ2VPYmplY3QiLCJzb3J0UHJldHRpZXJDb25maWciLCJzb3J0Vm9sdGEiLCJzb3J0RGV2RW5naW5lcyIsInNvcnRQbnBtQ29uZmlnIiwiZGVmYXVsdE5wbVNjcmlwdHMiLCJoYXNEZXZEZXBlbmRlbmN5IiwiZGVwZW5kZW5jeSIsImRldkRlcGVuZGVuY2llcyIsInJ1blNSZWdFeHAiLCJoYXNTZXF1ZW50aWFsU2NyaXB0IiwiZmllbGQiLCJ2YWx1ZXMiLCJzY3JpcHQiLCJpc1NlcXVlbnRpYWxTY3JpcHQiLCJzb3J0U2NyaXB0TmFtZXMiLCJncm91cE1hcCIsImlkeCIsImZyb20iLCJncm91cEtleSIsImNoaWxkcmVuIiwiayIsInNvcnRTY3JpcHRzIiwibmFtZXMiLCJwcmVmaXhhYmxlIiwib21pdHRlZCIsInJlcGxhY2UiLCJzb3J0Q29uZGl0aW9ucyIsImNvbmRpdGlvbnMiLCJkZWZhdWx0Q29uZGl0aW9ucyIsInJlc3RDb25kaXRpb25zIiwiY29uZGl0aW9uIiwic29ydEV4cG9ydHMiLCJleHBvcnRzIiwicGF0aHMiLCJmaWVsZHMiLCJtYWludGFpbmVycyIsImNvbnRyaWJ1dG9ycyIsInBhY2thZ2VOYW1lQSIsInBhY2thZ2VOYW1lQiIsImJhZGdlIiwiZGVmYXVsdFNvcnRPcmRlciIsIm92ZXJGaWVsZHMiLCJzb3J0UGFja2FnZUpzb24iLCJqc29uSXNoIiwianNvbiIsImVuZENoYXJhY3RlcnMiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJlZGl0U3RyaW5nSlNPTiIsInNvcnRPcmRlciIsInByaXZhdGVLZXlzIiwicHVibGljS2V5cyIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJhbGwiLCJwYWNrYWdlSnNvblBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm5ld1Rlc3REaXJQYXRoIiwib2xkVGVzdERpck5hbWUiLCJvbGRUZXN0RGlyUGF0aCIsIm1vdmVUZXN0RGlyZWN0b3J5IiwiZGlkVXBkYXRlU2NyaXB0Iiwic2NyaXB0TmFtZSIsIm5ld1NjcmlwdCIsInJlbmFtZSIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9sZFBhdGgiLCJkaXJlbnQiLCJuZXdQYXRoIiwibmV3UGF0aFN0YXQiLCJzdGF0IiwiaXNEaXJlY3RvcnkiLCJybSIsImZpeFR5cGVEZWZpbml0aW9ucyIsImNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbiIsImxpYlR5cGVEaXJQYXRoIiwic3JjVHlwZURpclBhdGgiLCJpc1Jvb3QiLCJkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyIsImRpck5hbWUiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaGFzTGlicmFyeSIsImlzRmlsZSIsIm92ZXJ3cml0ZU1lcmdlIiwiZGVzdGluYXRpb25BcnJheSIsInNvdXJjZUFycmF5IiwiY29tYmluZU1lcmdlIiwidGFyZ2V0IiwiZGVzdGluYXRpb24iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwibWVyZ2UiLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsImtleTEiLCJrZXkyIiwicHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyIsIm9uIiwicHVsbF9yZXF1ZXN0IiwiYnJhbmNoZXMiLCJwZXJtaXNzaW9ucyIsImNvbnRlbnRzIiwiY29uY3VycmVuY3kiLCJncm91cCIsImpvYnMiLCJhdXRvZml4IiwicHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3ciLCJ1c2VzIiwid29ya2Zsb3dzIiwicmVsZWFzZSIsInB1bGxfcmVxdWVzdF90YXJnZXQiLCJ0eXBlcyIsInN5bmMiLCJpc3N1ZXMiLCJpZiIsIndpdGgiLCJzZWNyZXRzIiwiQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4iLCJPUEVOQUlfQVBJX0tFWSIsIkdFTUlOSV9BUElfS0VZIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJyb290Q29uZmlnIiwiaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8iLCJyZXBvc2l0b3J5Iiwid29ya2Zsb3dzUGF0aCIsInNlbWFudGljWW1sUGF0aCIsImZvcmNlIiwiZmlsZU5hbWVTZXQiLCJkZXBlbmRpbmciLCJzZW1hbnRpY1JlbGVhc2UiLCJiYXNlbmFtZSIsIndyaXRlV29ya2Zsb3dZYW1sIiwiZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzIiwid3JpdGVZYW1sIiwiaXNQdWJsaWNSZXBvIiwic3RydWN0dXJlZENsb25lIiwic3RlcHMiLCJidWlsZCIsImF1dG9maXhXb3JrZmxvdyIsImF1dG9maXhKb2IiLCJnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyIsIm5ld1NldHRpbmdzIiwib2xkU2V0dGluZ3MiLCJ5YW1sIiwibG9hZCIsImFycmF5TWVyZ2UiLCJtb3ZlVG9Cb3R0b20iLCJhY3Rpb25zIiwidHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3ciLCJpc1JldXNhYmxlV29ya2Zsb3ciLCJqb2IiLCJub3JtYWxpemVKb2IiLCJzY2hlZHVsZSIsImJyYW5jaCIsInBhcmFtcyIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIndvcmtmbG93X2Rpc3BhdGNoIiwiTlBNX1RPS0VOIiwiR0hfVE9LRU4iLCJGSVJFQkFTRV9UT0tFTiIsIkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UiLCJESVNDT1JEX1dFQkhPT0tfVVJMIiwic2VydmVyX3VybCIsImRvdF9lbnZfcGF0aCIsIkZMWV9BUElfVE9LRU4iLCJkZXBsb3lfY29tbWFuZCIsImRvZXNDb250YWluRG9ja2VyZmlsZSIsImNpX2xhYmVsIiwiZ2l0aHViX2hvc3RlZF9ydW5uZXIiLCJuZXdTZWNyZXRzIiwieWFtbFRleHQiLCJkdW1wIiwibGluZVdpZHRoIiwibm9Db21wYXRNb2RlIiwic3R5bGVzIiwiZml4VHlwb3MiLCJwYWNrYWdlQ29uZmlnIiwiZG9jRmlsZXMiLCJtZEZpbGUiLCJmaXhUeXBvc0luVGV4dCIsInJlcGxhY2VXaXRoQ29uZmlnIiwidHNGaWxlcyIsInRzRmlsZSIsImNvbW1lbnQiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIndiZnlKc29uIiwidHlwb3MiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIiwiYWxsQ29uZmlncyIsImFnZW50c0V4dHJhUGF0aCIsImV4dHJhQ29udGVudCIsInRvb2xOYW1lIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uIiwiY3Vyc29yUnVsZXNQYXRoIiwiY3Vyc29yUnVsZXNDb250ZW50IiwiZnJvbnRtYXR0ZXIiLCJib2R5IiwiZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudCIsImJhc2VDb250ZW50IiwiZGVzY3JpcHRpb24iLCJpc1dpbGxCb29zdGVyUmVwbyIsImMiLCJnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUiLCJoYXNOZXdTZWN0aW9uIiwiZ2VuSTE4blRzIiwicmVhY3QiLCJuZXh0IiwibWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyIsImdlbmVyYXRlQnVuZmlnVG9tbCIsImV4aXN0aW5nQ29udGVudCIsInJlYWRGaWxlU3luYyIsImJ1bmZpZ1RvbWwiLCJwYXJzZUJ1bmZpZ1RvbWwiLCJidW4iLCJnZW5lcmF0ZVJ1blNlY3Rpb24iLCJpbnN0YWxsIiwiZXhhY3QiLCJ1c2VyQ29udGVudEhlYWRlciIsInVzZXJDb250ZW50SGVhZGVyUmVnZXgiLCJkZWZhdWx0SGVhZFVzZXJDb250ZW50IiwiZGVmYXVsdFRhaWxVc2VyQ29udGVudCIsImlnbm9yZUZpbGVVdGlsIiwic2VwYXJhdG9yUHJlZml4IiwicmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzIiwibGFzdEhlYWRlckluZGV4IiwiZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlciIsImdldEhlYWRVc2VyQ29udGVudCIsInRoaXMiLCJnZXRUYWlsVXNlckNvbnRlbnQiLCJpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkIiwibGFzdEluZGV4IiwibGFzdEluZGV4T2YiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsIm94bGludCIsIm94Zm10IiwicHJldHRpZXJPbmx5IiwiZ2VuZXJhdGVFeHRlbnNpb25zIiwiZ2VuZXJhdGVFZGl0b3Jjb25maWciLCJoYXZlX2Z1biIsImNvZGVfcmV2aWV3IiwiZGlzYWJsZSIsImNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkIiwibWF4X3Jldmlld19jb21tZW50cyIsInB1bGxfcmVxdWVzdF9vcGVuZWQiLCJoZWxwIiwic3VtbWFyeSIsImlnbm9yZV9wYXR0ZXJucyIsImdlbmVyYXRlR2VtaW5pQ29uZmlnIiwiY29uZmlnRmlsZVBhdGgiLCJzdHlsZWd1aWRlRmlsZVBhdGgiLCJuZXdDb25maWciLCJvbGRDb25maWciLCJ5YW1sQ29udGVudCIsImNvZGluZ1J1bGVFeHRyYUNvbnRlbnQiLCJ0cmltU3RhcnQiLCJzdHlsZWd1aWRlQ29udGVudCIsInRyaW1FbmQiLCJyZW1vdmVHZW1pbmlTZXR0aW5ncyIsImdlbmVyYXRlR2l0YXR0cmlidXRlcyIsImRlZmF1bHROYW1lcyIsImdlbmVyYXRlR2l0aWdub3JlIiwiaGVhZFVzZXJDb250ZW50IiwidGFpbFVzZXJDb250ZW50IiwiZG9lc0NvbnRhaW5HZW1maWxlIiwiZG9lc0NvbnRhaW5Hb01vZCIsImRvZXNDb250YWluUGFja2FnZUpzb24iLCJkb2VzQ29udGFpblBvbVhtbCIsImRvZXNDb250YWluUHVic3BlY1lhbWwiLCJkb2VzQ29udGFpblRlbXBsYXRlWWFtbCIsImRvZXNDb250YWluUG9ldHJ5TG9jayIsImJsaXR6IiwiZmlyZWJhc2UiLCJwcmlzbWEiLCJwbGF5d3JpZ2h0VGVzdCIsInJlYWN0TmF0aXZlIiwic3Rvcnlib29rIiwibGl0ZXN0cmVhbSIsImdlbmVyYXRlZCIsInJlYWRDYWNoZSIsInJlc3BvbnNlIiwiZmV0Y2giLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwiRGF0ZSIsIm5vdyIsIm10aW1lTXMiLCJkb2VzQ29udGFpbkpzT3JUcyIsImRvZXNDb250YWluSmF2YVNjcmlwdCIsImRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpblR5cGVTY3JpcHQiLCJkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzIiwiZ2VuZXJhdGVJZGVhU2V0dGluZ3MiLCJveGxpbnRDb250ZW50IiwiY3JlYXRlVGFza09wdGlvbnMiLCJydW5uZXIiLCJleHRlbnNpb24iLCJzcGF3blN5bmMiLCJyZXRyeSIsInNwYXduU3luY0FuZFJldHVyblN0YXR1cyIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwic3RhdHVzIiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luY0FuZFJldHVyblN0ZG91dCIsInN0ZGlvIiwicHJvYyIsInRvU3RyaW5nIiwicyIsIm1lc3NhZ2UiLCJQQVRIIiwiQkVSUllfQklOX0ZPTERFUiIsImVuY29kaW5nIiwic2hlbGwiLCJnaXRIdWJVdGlsIiwiZ2V0T3JnQW5kTmFtZSIsInVybE9yRnVsbE5hbWUiLCJ1cmxXaXRob3V0UHJvdG9jb2wiLCJvY3Rva2l0Q2FjaGUiLCJnZXRPY3Rva2l0Iiwib3duZXIiLCJjYWNoZWQiLCJvY3Rva2l0IiwiT2N0b2tpdCIsImF1dGgiLCJnZXRHaXRIdWJUb2tlbiIsImhhc0dpdEh1YlRva2VuIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIiLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiIsIkdJVEhVQl9UT0tFTiIsIm94bGludERlcHMiLCJ0eXBlc2NyaXB0R29EZXBlbmRlbmN5Iiwib2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzIiwibGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSIsImdlbmVyYXRlUGFja2FnZUpzb24iLCJza2lwQWRkaW5nRGVwcyIsImpzb25PYmoiLCJqc29uVGV4dCIsInBlZXJEZXBlbmRlbmNpZXMiLCJyZWFkUGFja2FnZUpzb24iLCJhdXRob3IiLCJ0c2xpYiIsInR5cGVzY3JpcHQiLCJsZXJuYSIsInBpbnN0IiwicHJldHRpZXIiLCJyZW1vdmVPYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMiLCJyZW1vdmVEZXByZWNhdGVkU3R1ZmYiLCJyZW1vdmVMZWdhY3lJbnN0YWxsQ29tbWFuZHMiLCJnZW5lcmF0ZVNjcmlwdHMiLCJ3YiIsImFkZFN0YXJ0VGVzdFNlcnZlclNjcmlwdElmTmVlZGVkIiwiYWRkSW5zdGFsbFN0ZXBUb0NoZWNrRm9yQWkiLCJwcmV0dGlmeSIsIm9yaWdpbmFsQ29udGVudCIsIm5ld0xpbmUiLCJsIiwiZ2VuZXJhdGVQcmV0dGllclN1ZmZpeCIsIm5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyIsInVwZGF0ZVNjcmlwdHMiLCJkZXBlbmRlbmN5VXBkYXRlcyIsInBvZXRyeURldkRlcGVuZGVuY2llcyIsImh1c2t5IiwicG9zdGluc3RhbGwiLCJwb3N0cHVibGlzaCIsInByZXB1Ymxpc2hPbmx5IiwicHJlcGFjayIsInBvc3RwYWNrIiwicHJlcGFyZSIsInZlcnNpb24iLCJhcnRpbGxlcnkiLCJwbGF5d3JpZ2h0Iiwid29ya3NwYWNlcyIsIndvcmtzcGFjZSIsImdsb2JTeW5jIiwiZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwiamVzdCIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwiZGVwIiwiYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImRpcnMiLCJkaXIiLCJmb3JtYXQiLCJweXRob25GaWxlcyIsImRpck5hbWVTZXQiLCJweXRob25GaWxlIiwiZmlyc3QiLCJzZWNvbmQiLCJkaXJOYW1lc1N0ciIsImV4aXN0aW5nUmVwb3NpdG9yeSIsIm5vcm1hbGl6ZWRSZXBvc2l0b3J5Iiwibm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uIiwiYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uIiwibm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSIsImZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbiIsIm5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YSIsInBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIiwicGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMiLCJhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyIsImFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24iLCJwYWNrYWdlTmFtZXMiLCJwcml2YXRlUGFja2FnZXMiLCJyZXBvIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwib3RoZXJUYXJnZXQiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJjb21taXRIYXNoIiwib3JnYW5pemF0aW9uIiwicmVqZWN0IiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsImdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwic2VjdGlvbiIsInJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zIiwiaW5zdGFsbE5wbURlcGVuZGVuY2llcyIsImluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyIsImNvcmUiLCJkZXYiLCJkZXBlbmRlbmN5U3BlY2lmaWVycyIsImRlcGVuZGVuY2llc1RvSW5zdGFsbCIsInNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSIsInNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3kiLCJnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbiIsImNhY2hlZFZlcnNpb24iLCJjdXJyZW50VmVyc2lvbiIsInJlcG9zaXRvcnlVcmwiLCJtYXRjaGVkIiwiZXhlYyIsIm5vcm1hbGl6ZWRVcmwiLCJvbGRTY3JpcHRzIiwiY2xlYW51cCIsInR5cGVjaGVjayIsImhhc1R5cGVjaGVjayIsImhhc0pzT3JUcyIsIm9sZFRlc3QiLCJweXJpZ2h0IiwiYmFzZVNldHRpbmdzIiwicHJlQ29tbWl0U2V0dGluZ3MiLCJjb21tYW5kcyIsImdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIiwiaHVza3lEaXJQYXRoIiwiaGFzSHVza3lEaXIiLCJzZXR0aW5ncyIsImdldENsZWFudXBHbG9icyIsImdldENsZWFudXBDb21tYW5kIiwicHJlUHVzaCIsImxpbnRDb21tYW5kIiwiZ2V0UHJlUHVzaFNjcmlwdCIsIm1rZGlyU3luYyIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwicG9zdE1lcmdlQ29tbWFuZHMiLCJoYXNWZXJzaW9uU2V0dGluZ3MiLCJ0b29sc0NoYW5nZWRQYXR0ZXJuIiwicmF3IiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIiwic3VwcG9ydGVkRXh0ZW5zaW9ucyIsImxvY2FsV2JQYWNrYWdlSnNvblBhdGgiLCJoYXNMb2NhbFdiV29ya3NwYWNlIiwib3hsaW50UGF0dGVybiIsIm94Zm10UGF0dGVybiIsInByZXR0aWVyUGF0dGVybiIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwiZ2VuZXJhdGVPeGZtdENvbmZpZyIsImxlZ2FjeUNvbmZpZ1BhdGgiLCJjb25maWdDb250ZW50IiwiZ2VuZXJhdGVPeGxpbnRDb25maWciLCJfcm9vdENvbmZpZyIsImdlbmVyYXRlUHJldHRpZXJpZ25vcmUiLCJnaXRpZ25vcmVGaWxlUGF0aCIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJnZW5lcmF0ZVJlYWRtZSIsImluc2VydEJhZGdlIiwiZmlsZU5hbWVzIiwicmVhZGRpclN5bmMiLCJiYWRnZU5hbWUiLCJ0b1VwcGVyQ2FzZSIsInJlYWRtZSIsImkiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInBsdWdpbnMiLCJwbHVnaW5FbnRyeSIsInBsdWdpbiIsInByZXNldCIsInN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uIiwiZmFpbENvbW1lbnRDb25kaXRpb24iLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsIiRzY2hlbWEiLCJleHRlbmRzIiwiZ2VuZXJhdGVSZW5vdmF0ZUpzb24iLCJwYWNrYWdlUnVsZXMiLCJydWxlIiwibWF0Y2hQYWNrYWdlTmFtZXMiLCJlbmFibGVkIiwiaW5zdGFsbEFnZW50U2tpbGxzIiwicm9vdEpzb25PYmoiLCJjb21waWxlck9wdGlvbnMiLCJhbHdheXNTdHJpY3QiLCJub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3MiLCJhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzIiwiZXNNb2R1bGVJbnRlcm9wIiwicmVzb2x2ZUpzb25Nb2R1bGUiLCJpbXBvcnRIZWxwZXJzIiwibm9FbWl0IiwiZXhjbHVkZSIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImdlbmVyYXRlZFR5cGVzIiwidHlwZU5hbWVzIiwidml0ZXN0IiwibW9jaGEiLCJjeXByZXNzIiwiZ2V0R2VuZXJhdGVkVHlwZXMiLCJnZXRUc2NvbmZpZ0V4dGVuZHMiLCJyb290RGlyIiwiZ2V0Um9vdERpciIsImRvZXNDb250YWluSnN4T3JUc3giLCJkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcyIsImpzeCIsImV4aXN0aW5nVHlwZXMiLCJleGlzdGluZ0VtaXRPcHRpb25zIiwiZW1pdE9wdGlvbnMiLCJwaWNrRXhpc3RpbmdFbWl0T3B0aW9ucyIsImdlbmVyYXRlZEV4dGVuZHMiLCJleGlzdGluZ0V4dGVuZHMiLCJtZXJnZWRFeHRlbmRzIiwibm9ybWFsaXplRXh0ZW5kcyIsInVuaXF1ZUV4dGVuZHMiLCJtZXJnZVRzY29uZmlnRXh0ZW5kcyIsImVtaXREZWNsYXJhdGlvbk9ubHkiLCJyZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb25zIiwiZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eSIsIm1lcmdlZFR5cGVzIiwiZmlsdGVyRXhpc3RpbmdUeXBlcyIsInR5cGVOYW1lIiwidHlwZVJvb3RzIiwiZXhwZXJpbWVudGFsRGVjb3JhdG9ycyIsInZlcmJhdGltTW9kdWxlU3ludGF4IiwiZ2VuZXJhdGVkVHlwZVNldCIsImlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwiZ2VuZXJhdGVZYXJucmNZbWwiLCJ5YXJucmNZbWxQYXRoIiwibGF0ZXN0VmVyc2lvbiIsImdldExhdGVzdFZlcnNpb24iLCJuZXdWZXJzaW9uIiwib2xkVmVyc2lvbiIsInZhbGlkTmV3VmVyc2lvbiIsInNlbXZlciIsInZhbGlkIiwiZ3QiLCJpc05ld2VyVmVyc2lvbiIsInJlbGVhc2VzUGF0aCIsInlhcm5yY1BhdGgiLCJkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXgiLCJub2RlTGlua2VyIiwibm1Nb2RlIiwibnBtTWluaW1hbEFnZUdhdGUiLCJucG1QcmVhcHByb3ZlZFBhY2thZ2VzIiwiY29tcHJlc3Npb25MZXZlbCIsImluamVjdEVudmlyb25tZW50RmlsZXMiLCJlbmFibGVHbG9iYWxDYWNoZSIsIm9yaWdpbmFsTGVuZ3RoIiwicGx1Z2luUGF0aCIsInJlbGF0aXZlIiwic2V0dXBMYWJlbHMiLCJzZXR1cExhYmVsIiwiZGVsZXRlTGFiZWwiLCJ3YXJuIiwiY29sb3IiLCJyZXF1ZXN0IiwiREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMiLCJzZXR1cFNlY3JldHMiLCJkb3RlbnYiLCJzZWNyZXROYW1lIiwic2VjcmV0X25hbWUiLCJrZXlfaWQiLCJrZXlJZCIsImRhdGEiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsImJlZm9yZVJldHJ5IiwiaGFuZGxlRXJyb3IiLCJyZXRyeUNvdW50IiwicmV0cnlMb2dnZXIiLCJzaG91bGRSZXRyeSIsInNsZWVwTWlsbGlzZWNvbmRzIiwidXBkYXRlU2xlZXBNaWxsaXNlY29uZHMiLCJmYWlsZWRDb3VudCIsIndpdGhSZXRyeSIsImFsbG93X2F1dG9fbWVyZ2UiLCJhbGxvd19tZXJnZV9jb21taXQiLCJhbGxvd19zcXVhc2hfbWVyZ2UiLCJhbGxvd19yZWJhc2VfbWVyZ2UiLCJhbGxvd191cGRhdGVfYnJhbmNoIiwiZGVsZXRlX2JyYW5jaF9vbl9tZXJnZSIsInNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGUiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2UiLCJoZWFkZXJzIiwicGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciIsInRlbXBsYXRlcyIsImdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIiwiYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlIiwiZGlzdGFuY2UiLCJ0ZW1wbGF0ZSIsInBhY2thZ2VNYW5hZ2VyQ29tbWFuZCIsIndiZnlKc29uU2NoZW1hIiwieiIsInJlY29yZCIsIm9wdGlvbmFsIiwiZG9jIiwiZ2V0UGFja2FnZUNvbmZpZyIsImVzbVBhY2thZ2UiLCJwYWNrYWdlSnNvblRleHQiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwiZnNwIiwiZmxhdCIsInJlcG9JbmZvIiwiZ2l0Iiwic2ltcGxlR2l0Iiwib3JpZ2luIiwiZ2V0UmVtb3RlcyIsInIiLCJyZW1vdGVVcmwiLCJyZWZzIiwicmVxdWVzdFJlcG9JbmZvIiwiZmV0Y2hSZXBvSW5mbyIsImN1cnJlbnQiLCJoYXNWZXJzaW9uU2V0dGluZ3NGaWxlIiwiZG9ja2VyZmlsZSIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsInJlcG9GdWxsTmFtZSIsImZ1bGxfbmFtZSIsInJlcG9BdXRob3IiLCJyZXBvTmFtZSIsInJlcG9QYXJ0cyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsImZpbGVzIiwiaXNFc21QYWNrYWdlIiwiY29udGFpbnNBbnkiLCJkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiIsImdpdGh1YiIsInBhdHRlcm4iLCJvcmciLCJyZXQiLCJhc3NpZ24iLCJyZWRpcmVjdGVkRnVsbE5hbWUiLCJsb2NhdGlvbiIsImdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUiLCJXSUxMQk9PU1RFUl9DT05GSUdfUEFDS0FHRV9OQU1FUyIsInNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIiwicmVmcmVzaEJ1bkxvY2siLCJyb290RGlyUGF0aCIsImxvY2tGaWxlUGF0aCIsImJhY2t1cExvY2tGaWxlUGF0aCIsInJtU3luYyIsImNvcHlGaWxlU3luYyIsImFyZ3YiLCJ5YXJncyIsInBvc2l0aW9uYWwiLCJkZXNjcmliZSIsImRlZmF1bHQiLCJhbGlhcyIsInNraXBEZXBzIiwidmVyYm9zZSIsInBhY2thZ2VKc29uRGlyIiwiVVJMIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwic3RyaWN0IiwicGFja2FnZXNEaXJQYXRoIiwic3ViRGlyUGF0aHMiLCJkIiwiYWJicmV2aWF0aW9uUHJvbWlzZSIsInN1YlBhY2thZ2VDb25maWdzIiwic3ViRGlyUGF0aCIsImFsbFBhY2thZ2VDb25maWdzIiwic2hvdWxkUnVuV29ya2Zsb3dzIiwidGhlbiJdLCJtYXBwaW5ncyI6ImlwQkFBT0EsZUFBZUMsRUFBTUMsR0FDMUIsT0FBTyxJQUFJQyxRQUFTQyxHQUFZQyxXQUFXRCxFQUFTRixHQUN0RCxDQ2lDT0YsZUFBZU0sRUFBb0JDLEdBQ3hDLElBQ0UsYUFBYUEsR0FDZixDQUFFLE1BQ0EsQ0FFSixDQUVPUCxlQUFlUSxFQUFxQkQsR0FDekMsSUFDRSxhQUFhQSxHQUNmLENBQUUsTUFBT0UsR0FDUCxHQUFxQixpQkFBVkEsR0FBc0JBLEdBQVMsU0FBVUEsR0FBd0IsV0FBZkEsRUFBTUMsS0FDakUsT0FFRixNQUFNRCxDQUNS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
28
+ `.trim()}async function ln(t){return S.functionIgnoringException("generateLintstagedrc",async()=>{await Promise.all([P.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.cjs`,{force:!0})),P.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.js`,{force:!0})),P.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.json`,{force:!0}))])})}async function pn(n){return S.functionIgnoringException("generateOxfmtConfig",async()=>{const r=t.resolve(n.dirPath,".oxfmtrc.json"),i=t.resolve(n.dirPath,"oxfmt.config.ts");await P.run(()=>e.promises.rm(r,{force:!0})),e.existsSync(i)||await P.run(()=>$.generateFile(i,dn))})}const dn="import config from '@willbooster/oxfmt-config';\n\nexport default config;\n";async function un(n,r){return S.functionIgnoringException("generateOxlintConfig",async()=>{const r=t.resolve(n.dirPath,"oxlint.config.ts"),i=e.existsSync(r)?e.readFileSync(r,"utf8"):void 0,s=[P.run(()=>e.promises.rm(t.resolve(n.dirPath,".oxlintrc.json"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.json"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.jsonc"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.cjs"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.js"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yaml"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yml"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.cjs"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.mjs"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.ts"),{force:!0}))];i||s.push(P.run(()=>$.generateFile(r,mn))),await Promise.all(s)})}const mn="import config from '@willbooster/oxlint-config';\n\nexport default config;\n";async function fn(e){return S.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),r=await $.readFileIgnoringError(n)??"",i=ft.getHeadUserContent(r),s=ft.getTailUserContent(r),o=t.resolve(e.dirPath,".gitignore"),a=await ft.readGitignoreWithoutSeparators(o)||"";let c="";e.doesContainPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+s;await P.run(()=>$.generateFile(n,l))})}const gn={venvPath:".",venv:".venv"};async function yn(n){return S.functionIgnoringException("generatePyrightConfigJson",async()=>{let r=structuredClone(gn);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);r=l.all([r,n,r],{arrayMerge:Je})}catch{}const s=JSON.stringify(r,void 0,2);await P.run(()=>$.generateFile(i,s))})}async function hn(n){return S.functionIgnoringException("generateReadme",async()=>{const r=t.resolve(n.dirPath,"README.md");let i=await e.promises.readFile(r,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(i=wn(i,"[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)"));const s=n.repository?.slice(n.repository.indexOf(":")+1),o=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const r of o){if(!r.startsWith("test")&&!r.startsWith("deploy"))continue;let o=r;if(o=(o[0]||"").toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," "),!s)continue;const a=`[![${o}](https://github.com/${s}/actions/workflows/${r}/badge.svg)](https://github.com/${s}/actions/workflows/${r})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${r}`))&&(i=wn(i,a))}await P.run(()=>$.generateFile(r,i))})}function wn(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const r=e.slice(0,n+1);let i=e.slice(n+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${r}${t}\n${i}`}return`${e}\n${t}\n`}async function bn(n){return S.functionIgnoringException("generateReleaserc",async()=>{const r=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(r))return;const i=JSON.parse(await e.promises.readFile(r,"utf8")),s=i.plugins??[];for(let e=0;e<s.length;e++){const t=s[e],n=Array.isArray(t),r=n?t[0]:t,i=n&&t[1]||{};"@semantic-release/commit-analyzer"===r?s[e]=["@semantic-release/commit-analyzer",l.all([i,{preset:"conventionalcommits"}],{arrayMerge:Je})]:"@semantic-release/github"===r&&(s[e]=["@semantic-release/github",l.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:Je})])}const o=JSON.stringify(i,void 0,2);await P.run(()=>$.generateFile(r,o))})}const vn={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function kn(n){return S.functionIgnoringException("generateRenovateJson",async()=>{let r=structuredClone(vn);const i=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${i}5`))return;try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);r=l.all([r,n,r],{arrayMerge:Je}),r.extends=r.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(r.packageRules??=[],r.packageRules.some(e=>e.matchPackageNames?.includes("next"))||r.packageRules.push({matchPackageNames:["next"],enabled:!1})),await P.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await P.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const s=JSON.stringify(r,void 0,2);await P.run(()=>$.generateFile(i,s))})}async function xn(e){return S.functionIgnoringException("installAgentSkills",async()=>{await Promise.all([s.rm(t.resolve(e.dirPath,".agents"),{force:!0,recursive:!0}),s.rm(t.resolve(e.dirPath,".claude"),{force:!0,recursive:!0}),s.rm(t.resolve(e.dirPath,"skills-lock.json"),{force:!0})])})}const _n={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},jn={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function Sn(n){return S.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let r=structuredClone(n.isRoot?_n:jn);const i=function(e){const t=new Set,n={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};e.isBun?t.add("bun"):e.depending.reactNative||t.add("node");(n.jest||n["@jest/globals"]||n["jest-environment-jsdom"]||n["ts-jest"])&&t.add("jest");n.vitest&&t.add("vitest/globals");n.mocha&&t.add("mocha");n.cypress&&t.add("cypress");return[...t]}(n);r.extends=function(e){return e.isBun?"@tsconfig/bun/tsconfig.json":e.depending.reactNative?"@tsconfig/react-native/tsconfig.json":["@tsconfig/node-lts/tsconfig.json","@tsconfig/node-ts/tsconfig.json"]}(n),r.compilerOptions??={},r.compilerOptions.rootDir=function(n){return n.isRoot?".":e.existsSync(t.resolve(n.dirPath,"..","..","package.json"))?"../..":"."}(n),i.length>0&&(r.compilerOptions={...r.compilerOptions,types:i}),n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?n.isBun||n.depending.reactNative||(r.compilerOptions={...r.compilerOptions,jsx:"react-jsx"}):delete r.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(r.include=r.include?.filter(e=>!e.startsWith("packages/*/")),r.exclude=r.exclude?.filter(e=>!e.startsWith("packages/*/")));const s=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(s,"utf8"),n=JSON.parse(t),a=(o=n.compilerOptions?.types,"string"==typeof o?[o]:Array.isArray(o)?o.filter(e=>"string"==typeof e):[]),c=function(e){const t={};for(const n of["declaration","declarationMap","emitDeclarationOnly","noEmit","sourceMap"]){const r=e?.[n];void 0!==r&&(t[n]=r)}return t}(n.compilerOptions);r.extends=function(e,t){const n=[...$n(e),...$n(t)],r=[...new Set(n)];return 0===r.length?void 0:1===r.length?r[0]:r}(r.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,r=l.all([r,n,r],{arrayMerge:Me}),r.include=r.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/")),r.compilerOptions??={},r.compilerOptions={...r.compilerOptions,...c},function(e){if(!e)return;if(!1!==e.noEmit||!0===e.emitDeclarationOnly)return;e.rewriteRelativeImportExtensions=!0}(r.compilerOptions);const p=[...new Set([...Pn(a,i),...i])];p.length>0?r.compilerOptions.types=p:delete r.compilerOptions.types,i.some(e=>"cypress"===e||e.includes("/"))&&delete r.compilerOptions.typeRoots}catch{}var o;qe(r),r.include?.sort(),delete r.compilerOptions?.experimentalDecorators,delete r.compilerOptions?.baseUrl,n.depending.reactNative&&delete r.compilerOptions?.verbatimModuleSyntax;const a=JSON.stringify(r,void 0,2);await P.run(()=>$.generateFile(s,a))})}function $n(e){return e?Array.isArray(e)?e:[e]:[]}function Pn(e,t){const n=new Set(t);return e.filter(e=>!(function(e){return"cypress"===e||"jest"===e||"mocha"===e||"vitest/globals"===e}(e)&&!n.has(e)))}const On=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function En(n){return S.functionIgnoringException("generateVscodeSettings",async()=>{try{const r=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(r,"utf8");let s=JSON.parse(i);for(const e of On)s=l.all([s,Cn(e)]);n.doesContainPoetryLock&&(s=l.all([s,Cn("**/.venv/**")])),n.depending.next&&(s=l.all([s,Cn("**/.next/**")])),"editor.codeActionsOnSave"in s&&delete s["editor.codeActionsOnSave"],"editor.formatOnSave"in s&&delete s["editor.formatOnSave"],qe(s);const o=JSON.stringify(s,void 0,2);await P.run(()=>$.generateFile(r,o))}catch{}})}function Cn(e){return{"files.watcherExclude":{[e]:!0}}}async function An(n){return S.functionIgnoringException("generateYarnrcYml",async()=>{const r=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await P.run(()=>e.promises.rm(r,{force:!0})),await P.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await P.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const i=Rt("yarn",["--version"],n.dirPath),s=function(e,t){return Rt("npm",["show",e,"version"],t)||"0.0.0"}("@yarnpkg/cli",n.dirPath);(function(e,t){const n=g.valid(e);return!!n&&g.gt(n,g.valid(t)??"0.0.0")})(s,i)&&Dt("yarn",["set","version",s],n.dirPath,1);const o=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(o,{recursive:!0});for(const n of await e.promises.readdir(o))n.startsWith("yarn-")&&!n.startsWith(`yarn-${s}.`)&&await P.run(()=>e.promises.rm(t.join(o,n)));const a=t.resolve(n.dirPath,".yarnrc");await P.run(()=>e.promises.rm(a,{force:!0}));let c={};try{c=p.load(await e.promises.readFile(r,"utf8"))??c}catch{}c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.npmPreapprovedPackages=["@exercode/*","@willbooster/*","agent-runtime-kit","one-way-git-sync","next","@next/*","@typescript/*","@oxfmt/*","@oxlint/*","@oxlint-tsgolint/*","oxfmt","oxlint","oxlint-tsgolint","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const r=t.resolve(n.dirPath,".yarn","plugins","undefined.cjs");await P.run(()=>e.promises.rm(r,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(r,p.dump(c,{lineWidth:-1})),Dt("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath),Dt("yarn",["dlx","prettier","--write",t.relative(n.dirPath,r)],n.dirPath)})}async function Bn(e){return S.functionIgnoringException("setupLabels",async()=>{const[t,n]=Nt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Mt(t))return;const r=Jt(t);try{await Fn(r,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await Fn(r,t,n,"d2: easy :rabbit2:","DDD6FE"),await Fn(r,t,n,"d3: medium :ox:","C4B5FD"),await Fn(r,t,n,"d4: hard :squid:","A78BFA"),await Fn(r,t,n,"d5: x-hard :whale2:","8B5CF6"),await Fn(r,t,n,"p1: critical :fire::fire::fire:","EF4444"),await Fn(r,t,n,"p2: urgent :fire::fire:","F87171"),await Fn(r,t,n,"p3: important :fire:","FCA5A5"),await Fn(r,t,n,"p4: nice to have :droplet:","FECACA"),await Fn(r,t,n,"r: blitz","5300bc"),await Fn(r,t,n,"r: firebase","ffca28"),await Fn(r,t,n,"r: prisma","0c344b"),await Fn(r,t,n,"r: react","61dafb"),await Fn(r,t,n,"r: svelte","ff3e00"),await Fn(r,t,n,"r: semantic-release","494949"),await Fn(r,t,n,"ready :rocket:","22C55E"),await Fn(r,t,n,"review requested :mag:","FBCA04"),await Fn(r,t,n,"released :bookmark:","6366F1"),await Fn(r,t,n,"s: 0.5h :clock1230:","F3F4F6"),await Fn(r,t,n,"s: 1h :clock1:","E5E7EB"),await Fn(r,t,n,"s: 2h :clock2:","D1D5DB"),await Fn(r,t,n,"s: 3h :clock3:","9CA3AF"),await Fn(r,t,n,"s: 5h :clock5:","6B7280"),await Fn(r,t,n,"s: 8h :clock8:","4B5563"),await Fn(r,t,n,"s: 13h :clock1:","374151"),await Fn(r,t,n,"t: build :hammer:","BFDBFE"),await Fn(r,t,n,"t: chore :broom:","BFDBFE"),await Fn(r,t,n,"t: ci :construction_worker:","BFDBFE"),await Fn(r,t,n,"t: docs :memo:","BFDBFE"),await Fn(r,t,n,"t: feat :sparkles:","BFDBFE"),await Fn(r,t,n,"t: fix :bug:","BFDBFE"),await Fn(r,t,n,"t: perf :zap:","BFDBFE"),await Fn(r,t,n,"t: refactor :recycle:","BFDBFE"),await Fn(r,t,n,"t: style :lipstick:","BFDBFE"),await Fn(r,t,n,"t: test :test_tube:","BFDBFE"),await Fn(r,t,n,"project","24292F"),await Fn(r,t,n,"focused :dart:","22C55E"),await Fn(r,t,n,"gen-pr-all :robot:","00B4D8"),await Fn(r,t,n,"gen-pr-claude :robot:","00B4D8"),await Fn(r,t,n,"gen-pr-codex :robot:","00B4D8"),await Fn(r,t,n,"gen-pr-gemini :robot:","00B4D8"),await In(r,t,n,"bug"),await In(r,t,n,"documentation"),await In(r,t,n,"duplicate"),await In(r,t,n,"enhancement"),await In(r,t,n,"good first issue"),await In(r,t,n,"help wanted"),await In(r,t,n,"invalid"),await In(r,t,n,"question"),await In(r,t,n,"wontfix"),await In(r,t,n,"ready"),await In(r,t,n,"review requested"),await In(r,t,n,"released"),await In(r,t,n,"semantic-release"),await In(r,t,n,"llm-pr :robot:"),await In(r,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function Fn(e,t,n,r,i){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:r,color:i})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:r,color:i})}}async function In(e,t,n,r){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:r})}catch{}}const Dn=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function Tn(e){return S.functionIgnoringException("setupSecrets",async()=>{const[n,r]=Nt.getOrgAndName(e.repository??"");if(!n||!r||"WillBoosterLab"!==n)return;if(!Mt(n)||!j.doesUploadEnvVars)return;const i=y.config({path:t.resolve(e.dirPath,".env")}).parsed??{};if(0===Object.keys(i).length)return;const s=Jt(n);try{for(const e of Dn)try{await s.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:r,secret_name:e})}catch{}const e=await s.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:n,repo:r}),{key:t,key_id:o}=e.data;await h.ready;for(const[e,a]of Object.entries(i)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const i=h.from_base64(t,h.base64_variants.ORIGINAL),c=h.from_string(a),l=h.crypto_box_seal(c,i),p=h.to_base64(l,h.base64_variants.ORIGINAL);await s.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:r,secret_name:e,encrypted_value:p,key_id:o})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Rn(e){const[t,n]=Nt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Mt(t))return;const r=Jt(t);await async function(e,{beforeRetry:t,handleError:n,retryCount:r=3,retryLogger:i,shouldRetry:s,sleepMilliseconds:o=0,updateSleepMilliseconds:a}={}){let c=0;for(;;)try{return await e(c)}catch(e){if(await(n?.(e)),c++,c>=r)throw e;if(s&&!s(e))throw e;o>0&&await k(o),a&&(o=a(o)),i?.(`Retry due to: ${e}\n${e instanceof Error?"---\n"+(e.stack??""):""}`),await(t?.(e))}}(()=>r.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}))}const Wn="__PM_RUN__",Nn={"pull_request_template.md":`\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I've confirmed \`All checks have passed\` on this page.\n - PR title follows [Angular's commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn't have \`WIP:\`.\n - The test command (e.g., \`${Wn} test\`) passed.\n - The lint command (e.g., \`${Wn} lint\`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I've reviewed my changes on the GitHub diff view.\n- [ ] I've written the steps to test my changes.\n- [ ] I've added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn't modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language \`C\`.\n3. Write the following code:\n \`\`\`c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n \`\`\`\n4. Push \`Submit\` button.\n5. ...\n--\x3e\n`.trim()};async function Ln(n){return S.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[r,i]of Object.entries(Nn)){const s=Jn(i,n),o=t.resolve(n.dirPath,".github",r);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(w(t,s)>s.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await P.run(()=>$.generateFile(o,s))}})}function Jn(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Wn,n)}const Mn=v.object({typos:v.object({all:v.record(v.string(),v.string()).optional(),doc:v.record(v.string(),v.string()).optional(),ts:v.record(v.string(),v.string()).optional(),text:v.record(v.string(),v.string()).optional()}).optional()});async function Un(n,r){const i=t.resolve(n,"package.json");try{const o=e.existsSync(i);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),r=JSON.parse(await s.readFile(e,"utf8"));d=r?.branches??[],u=r?.plugins?.flat()??[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=b(e),r=(await n.getRemotes(!0)).find(e=>"origin"===e.name),i=r?.refs.fetch??r?.refs.push;if("string"==typeof i){const e=await qn(i);if(e)return e}const s="string"==typeof t.repository?t.repository:t.repository?.url;if(s){const e=await qn(s);if(e&&"Not Found"!==e.message)return e}}(n,l));let g=function(n){const r=t.resolve(n);return e.existsSync(t.join(r,"mise.toml"))||e.existsSync(t.join(r,".mise.toml"))||e.existsSync(t.join(r,".tool-versions"))}(n);for(const r of["java","node","python"])if(e.existsSync(t.resolve(n,`.${r}-version`))){g=!0;break}let y="";try{y=await s.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const h=t.resolve(n,"wbfy.json");let w;try{const e=await s.readFile(h,"utf8");w=Mn.parse(JSON.parse(e))}catch{}const v="string"==typeof f?.full_name?f.full_name:void 0;let k,x;if(v){const e=v.split("/");e.length>=2&&(k=e[0],x=e[1])}const _=v?`github:${v}`:void 0,j={dirPath:n,dockerfile:y,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:_,repoAuthor:k,repoName:x,isWillBoosterRepo:Boolean(_?.startsWith("github:WillBooster/")||_?.startsWith("github:WillBoosterLab/")),isBun:r?.isBun||e.existsSync(t.join(n,"bun.lock")),isEsmPackage:p,isWillBoosterConfigs:i.includes("/willbooster-configs"),doesContainSubPackageJsons:Gn("packages/**/package.json",n),doesContainDockerfile:!!y||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:Gn("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Gn("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Gn("{app,src,test}/**/*.{t,j}sx",n),doesContainJavaScriptInPackages:Gn("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Gn("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Gn("packages/**/{app,src,test}/**/*.{t,j}sx",n),hasStartTestServer:!!l.scripts?.["start-test-server"],depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!c["gen-i18n-ts"],litestream:y.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},hasVersionSettings:g,packageJson:l,wbfyJson:w};if(j.doesContainGemfile||j.doesContainGoMod||j.doesContainPackageJson||j.doesContainPoetryLock||j.doesContainPomXml||j.doesContainPubspecYaml||j.doesContainTemplateYaml)return j}catch{}}function Gn(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:J}).length>0}async function qn(e){const[t,n]=Nt.getOrgAndName(e);if(!t||!n)return;const r={full_name:`${t}/${n}`};try{const e=await Jt().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(r,e.data)}catch(e){const t=function(e){if(!e||"object"!=typeof e)return;const t="response"in e?e.response:void 0,n=t?.status??e.status;if(301!==n&&302!==n)return;const r=t?.headers?.location;if("string"!=typeof r)return;const[i,s]=Nt.getOrgAndName(r);if(!i||!s)return;return`${i}/${s}`}(e);t&&(r.full_name=t)}return r}const zn=new Set(["@willbooster/oxlint-config","@willbooster/prettier-config"]);function Hn(e){const t=e.packageJson?.name;return e.isWillBoosterConfigs&&"string"==typeof t&&zn.has(t)}function Yn(n){const r=t.join(n,"bun.lock"),i=t.join(n,".bun.lock.wbfy-backup");e.rmSync(i,{force:!0}),e.existsSync(r)&&(e.copyFileSync(r,i),e.rmSync(r,{force:!0}));const s=Tt("bun",["update"],n);if(0!==s||!e.existsSync(r))throw e.existsSync(i)&&(e.copyFileSync(i,r),e.rmSync(i,{force:!0})),new Error(`Failed to regenerate ${r}: bun update exited with status ${s}`);e.rmSync(i,{force:!0})}await async function(){const r=await n(process.argv.slice(2)).command("$0 [paths..]","Make a given project follow the WillBooster standard",e=>{e.positional("paths",{describe:"project paths to be wbfied",array:!0,type:"string",default:["."]})}).options({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;j.isVerbose=r.verbose,j.doesUploadEnvVars=r.env;for(const n of r.paths){const i=t.join(n,"packages"),s=(await x(()=>e.promises.readdir(i,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(i,e.name));await We([n,...s]);const o=await Un(n);if(j.isVerbose,!o){console.error(`there is no valid package.json in ${n}`);continue}const a=et(o),c=(await Promise.all(s.map(e=>Un(e,o)))).filter(e=>!!e),l=[o,...c];if(j.isVerbose)for(const e of l)console.info(e);await An(o),o.isBun&&await at(o);const p=!Ve(o.repository)&&(o.repository?.startsWith("github:WillBooster/")||o.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([M(o),a.then(()=>hn(o)),rt(o,l),yt(o),bt(o),xt(o,l),_t(o),St(o),Ln(o),Bt(o),kn(o),bn(o),...p?[Ke(o)]:[],Bn(o),Tn(o),Rn(o),on(o),ln(o)]),await P.promiseAll();const d=[];for(const e of l)Hn(e)||((e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Le(e,e.isRoot?l:[e])),e.depending.playwrightTest&&d.push(F(e)),e.depending.next&&d.push(O(e)),await Pt(e,o),await P.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await fn(e),await Yt(e,o,r.skipDeps),d.push(ln(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&d.push(En(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Sn(e)),At(e)&&(d.push(pn(e)),d.push(un(e))),e.depending.pyright&&d.push(yn(e))));await Promise.all(d),await P.promiseAll();const u=o.isBun?"bun":"yarn";o.isBun?await S.functionIgnoringException("refreshBunLock",async()=>{await Promise.resolve(),Yn(n)}):Dt(u,["install","--no-immutable"],n),Dt(u,["cleanup"],n),await xn(o)}}();
29
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2dsb2JVdGlsLnRzIiwiLi4vc3JjL2ZpeGVycy9wcmlzbWEudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kZXRlY3QtaW5kZW50L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1uZXdsaW5lL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lzLXBsYWluLW9iai9pbmRleC5qcyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLnRzIiwiLi4vc3JjL3V0aWxzL3RzY29uZmlnQmFzZS50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGZtdENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294bGludENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3NraWxscy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3RzY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy95YXJucmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9zZWNyZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy9wYWNrYWdlQ29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xuICBkb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuZXhwb3J0IGNvbnN0IGZzVXRpbCA9IHtcbiAgYXN5bmMgcmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBhc3luYyBnZW5lcmF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgbGV0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCArPSAnXFxuJztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwob2xkQ29udGVudCk7XG4gICAgaWYgKCFvYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBleGlzdGluZ1Byb3BlcnRpZXMgPSBuZXcgU2V0KG9iamVjdExpdGVyYWwucHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lPy5nZXRUZXh0KCkpKTtcbiAgICBjb25zdCBwcm9wZXJ0eVRleHRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICghZXhpc3RpbmdQcm9wZXJ0aWVzLmhhcygndHlwZXNjcmlwdCcpKSB7XG4gICAgICBwcm9wZXJ0eVRleHRzLnB1c2goJ3R5cGVzY3JpcHQ6IHsgaWdub3JlQnVpbGRFcnJvcnM6IHRydWUgfScpO1xuICAgIH1cbiAgICBpZiAocHJvcGVydHlUZXh0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gb2JqZWN0TGl0ZXJhbC5nZXRFbmQoKSAtIDE7XG4gICAgY29uc3QgbGFzdFByb3BlcnR5ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmF0KC0xKTtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NvbW1hID0gbGFzdFByb3BlcnR5XG4gICAgICA/IG9sZENvbnRlbnQuc2xpY2UobGFzdFByb3BlcnR5LmdldEVuZCgpLCBpbnNlcnRpb25Qb2ludCkuaW5jbHVkZXMoJywnKVxuICAgICAgOiBmYWxzZTtcbiAgICBjb25zdCBwcmVmaXggPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubGVuZ3RoID4gMCAmJiAhaGFzVHJhaWxpbmdDb21tYSA/ICcsICcgOiAnJztcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBpbnNlcnRpb25Qb2ludCl9JHtwcmVmaXh9JHtwcm9wZXJ0eVRleHRzLmpvaW4oJywgJyl9JHtvbGRDb250ZW50LnNsaWNlKFxuICAgICAgaW5zZXJ0aW9uUG9pbnRcbiAgICApfWA7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKGNvbnRlbnQ6IHN0cmluZyk6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gdHMuY3JlYXRlU291cmNlRmlsZSgnbmV4dC5jb25maWcuanMnLCBjb250ZW50LCB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LCB0cnVlLCB0cy5TY3JpcHRLaW5kLkpTKTtcbiAgbGV0IG9iamVjdExpdGVyYWw6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiB0cy5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKG9iamVjdExpdGVyYWwpIHJldHVybjtcbiAgICBpZiAodHMuaXNFeHBvcnRBc3NpZ25tZW50KG5vZGUpICYmIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgb2JqZWN0TGl0ZXJhbCA9IG5vZGUuZXhwcmVzc2lvbjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHMuaXNCaW5hcnlFeHByZXNzaW9uKG5vZGUpICYmXG4gICAgICBub2RlLm9wZXJhdG9yVG9rZW4ua2luZCA9PT0gdHMuU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgbm9kZS5sZWZ0LmdldFRleHQoc291cmNlKSA9PT0gJ21vZHVsZS5leHBvcnRzJyAmJlxuICAgICAgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihub2RlLnJpZ2h0KVxuICAgICkge1xuICAgICAgb2JqZWN0TGl0ZXJhbCA9IG5vZGUucmlnaHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG4gIH07XG4gIHZpc2l0KHNvdXJjZSk7XG4gIHJldHVybiBvYmplY3RMaXRlcmFsO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIE9iamVjdE1lbWJlciA9IHsga2luZDogJ2V4dHJhJzsgaW5kZXg6IG51bWJlciB9IHwgeyBraW5kOiAncHJvcGVydHknOyBrZXk6IHN0cmluZyB9O1xuaW50ZXJmYWNlIFBhcnNlZE9iamVjdCB7XG4gIGV4dHJhTWVtYmVyczogc3RyaW5nW107XG4gIG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXTtcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+O1xufVxuaW50ZXJmYWNlIEV4dHJhY3RlZE9iamVjdExpdGVyYWwge1xuICBzb3VyY2U6IHRzLlNvdXJjZUZpbGU7XG4gIG5vZGU6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uO1xufVxuXG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRWYWx1ZSA9PiAoe1xuICBraW5kOiAnb2JqZWN0JyxcbiAgdmFsdWU6IHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXMsIGV4dHJhTWVtYmVycyksXG59KTtcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHRvUGFyc2VkT2JqZWN0KHtcbiAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgdXNlOiBhc09iamVjdCh7XG4gICAgYmFzZVVSTDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb25seS1vbi1mYWlsdXJlJ1wiKSxcbiAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ3JldGFpbi1vbi1mYWlsdXJlJyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gIH0pLFxuICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICBjb21tYW5kOiBsaXRlcmFsKFwiJ3lhcm4gc3RhcnQtdGVzdC1zZXJ2ZXInXCIpLFxuICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICB9KSxcbn0pO1xuXG5mdW5jdGlvbiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZE9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgZXh0cmFNZW1iZXJzLFxuICAgIG1lbWJlck9yZGVyOiBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5tYXAoKGtleSk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSkpLFxuICAgICAgLi4uZXh0cmFNZW1iZXJzLm1hcCgoXywgaW5kZXgpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSkpLFxuICAgIF0sXG4gICAgcHJvcGVydGllcyxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgcGxheXdyaWdodC5jb25maWcudHNgKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UGxheXdyaWdodENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBhc3NlcnROZXh0UHVibGljQmFzZVVybChjb25maWcuZGlyUGF0aCk7XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCA9IGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKG9sZENvbnRlbnQpO1xuICAgIGlmICghZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUsIGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuO1xuXG4gICAgLy8gS2VlcCBmaWxsaW5nIG1pc3NpbmcgZGVmYXVsdHMsIGJ1dCBkb24ndCBvdmVyd3JpdGUgbG9jYWwgYWRqdXN0bWVudHMgb24gZXZlcnkgcmVnZW5lcmF0aW9uLlxuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlUGFyc2VkT2JqZWN0cyhkZWZhdWx0Q29uZmlnLCBwYXJzZWQpO1xuICAgIGNvbnN0IGhhc1N0YXJ0VGVzdFNlcnZlciA9IEJvb2xlYW4oY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3Qtc2VydmVyJ10pO1xuICAgIGNvbnN0IGhhc0V4aXN0aW5nV2ViU2VydmVyID0gQm9vbGVhbihwYXJzZWQucHJvcGVydGllcy53ZWJTZXJ2ZXIpO1xuICAgIC8vIE9ubHkgZHJvcCB3YmZ5J3MgZGVmYXVsdCBzZXJ2ZXIgY29tbWFuZC4gUmVwb3Mgd2l0aCBjdXN0b20gUGxheXdyaWdodFxuICAgIC8vIHNlcnZlciBzZXR1cCBzdGlsbCBuZWVkIGl0IGV2ZW4gd2hlbiB0aGV5IGRvIG5vdCBleHBvc2Ugc3RhcnQtdGVzdC1zZXJ2ZXIuXG4gICAgaWYgKCFoYXNTdGFydFRlc3RTZXJ2ZXIgJiYgIWhhc0V4aXN0aW5nV2ViU2VydmVyKSB7XG4gICAgICBkZWxldGUgbWVyZ2VkLnByb3BlcnRpZXMud2ViU2VydmVyO1xuICAgIH1cbiAgICBzZXRXZWJTZXJ2ZXJDb21tYW5kKGNvbmZpZywgbWVyZ2VkKTtcblxuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlWYWx1ZSh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VkIH0sIDApO1xuICAgIGNvbnN0IHN0YXJ0ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldFN0YXJ0KGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBjb25zdCBlbmQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0RW5kKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgc3RhcnQpfSR7bmV3T2JqZWN0TGl0ZXJhbH0ke29sZENvbnRlbnQuc2xpY2UoZW5kKX1gO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlOiBQYXJzZWRPYmplY3QsIG92ZXJyaWRlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCBvdmVycmlkZVByb3BlcnR5S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMob3ZlcnJpZGUucHJvcGVydGllcykpO1xuICBjb25zdCBleHRyYU1lbWJlcnMgPSBbLi4uYmFzZS5leHRyYU1lbWJlcnMsIC4uLm92ZXJyaWRlLmV4dHJhTWVtYmVyc107XG4gIC8vIEtlZXAgZGVmYXVsdC1vbmx5IG1lbWJlcnMgYmVmb3JlIHBhcnNlZCBtZW1iZXJzIHNvIHNwcmVhZHMgYW5kIGV4cGxpY2l0IGxvY2FsIHByb3BlcnRpZXMgcmV0YWluIHByZWNlZGVuY2UuXG4gIGNvbnN0IG1lbWJlck9yZGVyID0gW1xuICAgIC4uLmJhc2UubWVtYmVyT3JkZXIuZmlsdGVyKChtZW1iZXIpID0+IG1lbWJlci5raW5kICE9PSAncHJvcGVydHknIHx8ICFvdmVycmlkZVByb3BlcnR5S2V5cy5oYXMobWVtYmVyLmtleSkpLFxuICAgIC4uLm92ZXJyaWRlLm1lbWJlck9yZGVyLm1hcCgobWVtYmVyKTogT2JqZWN0TWVtYmVyID0+IHtcbiAgICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5JykgcmV0dXJuIG1lbWJlcjtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdleHRyYScsIGluZGV4OiBiYXNlLmV4dHJhTWVtYmVycy5sZW5ndGggKyBtZW1iZXIuaW5kZXggfTtcbiAgICB9KSxcbiAgXTtcbiAgY29uc3QgcHJvcGVydGllcyA9IHsgLi4uYmFzZS5wcm9wZXJ0aWVzIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlLnByb3BlcnRpZXMpKSB7XG4gICAgcHJvcGVydGllc1trZXldID0gbWVyZ2VQYXJzZWRWYWx1ZShwcm9wZXJ0aWVzW2tleV0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4geyBleHRyYU1lbWJlcnMsIG1lbWJlck9yZGVyLCBwcm9wZXJ0aWVzIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkVmFsdWUoYmFzZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQsIG92ZXJyaWRlOiBQYXJzZWRWYWx1ZSk6IFBhcnNlZFZhbHVlIHtcbiAgaWYgKGJhc2U/LmtpbmQgPT09ICdvYmplY3QnICYmIG92ZXJyaWRlLmtpbmQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZS52YWx1ZSwgb3ZlcnJpZGUudmFsdWUpIH07XG4gIH1cbiAgcmV0dXJuIG92ZXJyaWRlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhc3NlcnROZXh0UHVibGljQmFzZVVybChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBlbnZGaWxlUGF0aCBvZiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKC9ORVhUX1BVQkxJQ19CQVNFX1VSTFxccyo9L20udGVzdChjb250ZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIGVudiBmaWxlcyBhcmUgZXhwZWN0ZWQgaW4gc29tZSByZXBvcy5cbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05FWFRfUFVCTElDX0JBU0VfVVJMIGlzIHJlcXVpcmVkIGZvciBQbGF5d3JpZ2h0LiBEZWZpbmUgTkVYVF9QVUJMSUNfQkFTRV9VUkwgaW4gdGhlIHRhcmdldCByZXBvLicpO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBlbnZGaWxlTmFtZXMgPSBbJy5lbnYnLCAnLmVudi50ZXN0JywgJy5lbnYuZXhhbXBsZScsICdtaXNlLnRvbWwnLCAnbWlzZS50ZXN0LnRvbWwnXTtcbiAgY29uc3QgZW52RmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAobGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpOyA7IGN1cnJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKSkge1xuICAgIGVudkZpbGVQYXRocy5wdXNoKC4uLmVudkZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsIGZpbGVOYW1lKSkpO1xuXG4gICAgLy8gUGxheXdyaWdodCBjb25maWdzIG9mdGVuIGxpdmUgaW4gcGFja2FnZXMvKiB3aGlsZSBzaGFyZWQgZW52IGZpbGVzIGxpdmUgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290LCBzbyB3YWxrIHVwd2FyZCB1bnRpbCB0aGUgdGFyZ2V0IHJlcG8gYm91bmRhcnkuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCAnLmdpdCcpKSkgYnJlYWs7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGVudkZpbGVQYXRocztcbn1cblxuZnVuY3Rpb24gc2V0V2ViU2VydmVyQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcsIG9iamVjdDogUGFyc2VkT2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IHdlYlNlcnZlciA9IG9iamVjdC5wcm9wZXJ0aWVzLndlYlNlcnZlcjtcbiAgaWYgKHdlYlNlcnZlcj8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICAvLyB3YmZ5IG93bnMgdGhlIHBhY2thZ2Ugc2NyaXB0LCBzbyBQbGF5d3JpZ2h0IHNob3VsZCBjb25zaXN0ZW50bHkgY2FsbCB0aGF0XG4gIC8vIHNjcmlwdCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSByZXN0IG9mIGVhY2ggcmVwb3NpdG9yeSdzIHdlYlNlcnZlciBzZXR0aW5ncy5cbiAgd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZCA9IGxpdGVyYWwoY29uZmlnLmlzQnVuID8gXCInYnVuIHN0YXJ0LXRlc3Qtc2VydmVyJ1wiIDogXCIneWFybiBzdGFydC10ZXN0LXNlcnZlcidcIik7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGNvbnRlbnQ6IHN0cmluZyk6IEV4dHJhY3RlZE9iamVjdExpdGVyYWwgfCB1bmRlZmluZWQge1xuICBjb25zdCBzb3VyY2UgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUsIHRzLlNjcmlwdEtpbmQuVFMpO1xuXG4gIC8vIFR5cGVTY3JpcHQgYWxyZWFkeSB1bmRlcnN0YW5kcyBuZXN0ZWQgb2JqZWN0IGxpdGVyYWxzIGFuZCB0ZW1wbGF0ZSBzdHJpbmdzLCBzbyB1c2VcbiAgLy8gaXRzIEFTVCByYW5nZXMgaW5zdGVhZCBvZiBhIHJlZ2V4IHRoYXQgY2FuIHN0b3AgYXQgdGhlIGZpcnN0IGlubmVyIGNsb3NpbmcgYnJhY2UuXG4gIGxldCBmb3VuZDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IHRzLk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoZm91bmQpIHJldHVybjtcbiAgICBpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpID09PSAnZGVmaW5lQ29uZmlnJykge1xuICAgICAgY29uc3QgZmlyc3RBcmd1bWVudCA9IG5vZGUuYXJndW1lbnRzWzBdO1xuICAgICAgaWYgKGZpcnN0QXJndW1lbnQgJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZ3VtZW50KSkge1xuICAgICAgICBmb3VuZCA9IGZpcnN0QXJndW1lbnQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgfTtcbiAgdmlzaXQoc291cmNlKTtcblxuICByZXR1cm4gZm91bmQgPyB7IHNvdXJjZSwgbm9kZTogZm91bmQgfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb246IHRzLkV4cHJlc3Npb24sIHNvdXJjZTogdHMuU291cmNlRmlsZSk6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBwYXJzZWRPYmplY3QgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNvdXJjZSk7XG4gICAgcmV0dXJuIHBhcnNlZE9iamVjdCA/IHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWRPYmplY3QgfSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmICh0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogdHMuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7IGV4dHJhTWVtYmVyczogW10sIG1lbWJlck9yZGVyOiBbXSwgcHJvcGVydGllczoge30gfTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAodHMuaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSBsaXRlcmFsKGtleSk7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIXRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fCAoIXRzLmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhdHMuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKSkge1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJzZWQuZXh0cmFNZW1iZXJzLnB1c2gocHJvcGVydHkuZ2V0VGV4dChzb3VyY2UpKSAtIDE7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyLCBzb3VyY2UpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVZhbHVlKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgaWYgKHZhbHVlLnZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdbXSc7XG4gICAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICAgIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xuICAgIH0pO1xuICAgIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xuICB9XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZTtcblxuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBlbWl0dGVkUHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSh2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlcik7XG4gIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWVtYmVyT3JkZXIuZmxhdE1hcCgobWVtYmVyLCBpbmRleCkgPT4ge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ2V4dHJhJykge1xuICAgICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RNZW1iZXIodmFsdWUudmFsdWUuZXh0cmFNZW1iZXJzW21lbWJlci5pbmRleF0gPz8gJycsIGluZGVudCldO1xuICAgIH1cblxuICAgIGlmIChsYXN0UHJvcGVydHlJbmRleEJ5S2V5LmdldChtZW1iZXIua2V5KSAhPT0gaW5kZXgpIHJldHVybiBbXTtcbiAgICBjb25zdCBpdGVtID0gdmFsdWUudmFsdWUucHJvcGVydGllc1ttZW1iZXIua2V5XTtcbiAgICBpZiAoIWl0ZW0gfHwgZW1pdHRlZFByb3BlcnRpZXMuaGFzKG1lbWJlci5rZXkpKSByZXR1cm4gW107XG4gICAgZW1pdHRlZFByb3BlcnRpZXMuYWRkKG1lbWJlci5rZXkpO1xuICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkobWVtYmVyLmtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCldO1xuICB9KTtcbiAgbGluZXMucHVzaChcbiAgICAuLi5PYmplY3QuZW50cmllcyh2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzKVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFlbWl0dGVkUHJvcGVydGllcy5oYXMoa2V5KSlcbiAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpKVxuICApO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIG1lbWJlcl0gb2YgbWVtYmVyT3JkZXIuZW50cmllcygpKSB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSB7XG4gICAgICBsYXN0UHJvcGVydHlJbmRleEJ5S2V5LnNldChtZW1iZXIua2V5LCBpbmRleCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBsYXN0UHJvcGVydHlJbmRleEJ5S2V5O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXk6IHN0cmluZywgaXRlbTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgIH1cbiAgfVxuICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RNZW1iZXIobWVtYmVyOiBzdHJpbmcsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBtZW1iZXIuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIHN0cmluZ2lmaWVkLmVudHJpZXMoKSkge1xuICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke2xpbmV9YDtcbiAgfVxuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG4iLCJleHBvcnQgY29uc3QgZ2xvYklnbm9yZSA9IFtcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi8udmVudi8qKicsXG4gICcqKi90ZXN0LWZpeHR1cmVzLyoqJyxcbiAgJyoqL3Rlc3QvZml4dHVyZXMvKionLFxuICAnKiovZGlzdC8qKicsXG4gICcqKi9idWlsZC8qKicsXG4gICcqKi90YXJnZXQvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi90bXAvKionLFxuXTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UHJpc21hRW52RmlsZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UHJpc21hRW52RmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW52RmlsZXMgPSBhd2FpdCBmZy5nbG9iKFsnKi5lbnYnLCAnKi5lbnYuKiddLCB7IGRvdDogdHJ1ZSwgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGZvciAoY29uc3QgZW52RmlsZSBvZiBlbnZGaWxlcykge1xuICAgICAgY29uc3QgZW52RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGVudkZpbGUpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbChcbiAgICAgICAgL0RBVEFCQVNFX1VSTFxccyo9XFxzKlwiPyhbXlwiI1xcbl0rP1xcLnNxbGl0ZTNbXlwiI1xcbl0qKVwiPy9nLFxuICAgICAgICAobWF0Y2gsIHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnY29ubmVjdGlvbl9saW1pdD0xJykpIHJldHVybiBtYXRjaDtcbiAgICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSB1cmwuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/JztcbiAgICAgICAgICByZXR1cm4gYERBVEFCQVNFX1VSTD1cIiR7dXJsfSR7c2VwYXJhdG9yfWNvbm5lY3Rpb25fbGltaXQ9MVwiYDtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShlbnZGaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsImNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0T2JqZWN0QnlLZXlOYW1lTGlzdChvYmplY3QsIHNvcnRXaXRoKSB7XG4gIGxldCBrZXlzLCBzb3J0Rm4sIGtleVxuXG4gIGlmICh0eXBlb2Ygc29ydFdpdGggPT09ICdmdW5jdGlvbicpIHtcbiAgICBzb3J0Rm4gPSBzb3J0V2l0aFxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBzb3J0V2l0aFxuICB9XG5cbiAgY29uc3QgdG90YWwgPSB7fVxuICBjb25zdCBvYmplY3RLZXlzID0gWy4uLihrZXlzID8/IFtdKSwgLi4uT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KHNvcnRGbildXG5cbiAgZm9yIChrZXkgb2Ygb2JqZWN0S2V5cykge1xuICAgIGlmIChoYXMob2JqZWN0LCBrZXkpKSB7XG4gICAgICB0b3RhbFtrZXldID0gb2JqZWN0W2tleV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG90YWxcbn1cbiIsIi8vIERldGVjdCBlaXRoZXIgc3BhY2VzIG9yIHRhYnMgYnV0IG5vdCBib3RoIHRvIHByb3Blcmx5IGhhbmRsZSB0YWJzIGZvciBpbmRlbnRhdGlvbiBhbmQgc3BhY2VzIGZvciBhbGlnbm1lbnRcbmNvbnN0IElOREVOVF9SRUdFWCA9IC9eKD86KCApK3xcXHQrKS87XG5cbmNvbnN0IElOREVOVF9UWVBFX1NQQUNFID0gJ3NwYWNlJztcbmNvbnN0IElOREVOVF9UWVBFX1RBQiA9ICd0YWInO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIGlnbm9yZSBzaW5nbGUgc3BhY2UgcGF0dGVybnNcbmZ1bmN0aW9uIHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgdmFsdWUpIHtcblx0cmV0dXJuIGlnbm9yZVNpbmdsZVNwYWNlcyAmJiBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSAmJiB2YWx1ZSA9PT0gMTtcbn1cblxuLyoqXG5NYWtlIGEgTWFwIHRoYXQgY291bnRzIGhvdyBtYW55IGluZGVudHMvdW5pbmRlbnRzIGhhdmUgb2NjdXJyZWQgZm9yIGEgZ2l2ZW4gc2l6ZSBhbmQgaG93IG1hbnkgbGluZXMgZm9sbG93IGEgZ2l2ZW4gaW5kZW50YXRpb24uXG5cblRoZSBrZXkgaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBpbmRlbnRhdGlvbiB0eXBlIChzID0gc3BhY2UgYW5kIHQgPSB0YWIpIGFuZCB0aGUgc2l6ZSBvZiB0aGUgaW5kZW50cy91bmluZGVudHMuXG5cbmBgYFxuaW5kZW50cyA9IHtcblx0dDM6IFsxLCAwXSxcblx0dDQ6IFsxLCA1XSxcblx0czU6IFsxLCAwXSxcblx0czEyOiBbMSwgMF0sXG59XG5gYGBcbiovXG5mdW5jdGlvbiBtYWtlSW5kZW50c01hcChzdHJpbmcsIGlnbm9yZVNpbmdsZVNwYWNlcykge1xuXHRjb25zdCBpbmRlbnRzID0gbmV3IE1hcCgpO1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBzaXplIG9mIHByZXZpb3VzIGxpbmUncyBpbmRlbnRhdGlvblxuXHRsZXQgcHJldmlvdXNTaXplID0gMDtcblx0bGV0IHByZXZpb3VzSW5kZW50VHlwZTtcblxuXHQvLyBJbmRlbnRzIGtleSAoaWRlbnQgdHlwZSArIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzKVxuXHRsZXQga2V5O1xuXG5cdGZvciAoY29uc3QgbGluZSBvZiBzdHJpbmcuc3BsaXQoL1xcbi9nKSkge1xuXHRcdGlmICghbGluZSkge1xuXHRcdFx0Ly8gSWdub3JlIGVtcHR5IGxpbmVzXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBtYXRjaGVzID0gbGluZS5tYXRjaChJTkRFTlRfUkVHRVgpO1xuXG5cdFx0aWYgKG1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHRwcmV2aW91c0luZGVudFR5cGUgPSAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgaW5kZW50ID0gbWF0Y2hlc1swXS5sZW5ndGg7XG5cdFx0XHRjb25zdCBpbmRlbnRUeXBlID0gbWF0Y2hlc1sxXSA/IElOREVOVF9UWVBFX1NQQUNFIDogSU5ERU5UX1RZUEVfVEFCO1xuXG5cdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIHVubGVzcyBpdCdzIHRoZSBvbmx5IGluZGVudCBkZXRlY3RlZCB0byBwcmV2ZW50IGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXNcblx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGluZGVudCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpbmRlbnRUeXBlICE9PSBwcmV2aW91c0luZGVudFR5cGUpIHtcblx0XHRcdFx0cHJldmlvdXNTaXplID0gMDtcblx0XHRcdH1cblxuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gaW5kZW50VHlwZTtcblxuXHRcdFx0bGV0IHVzZSA9IDE7XG5cdFx0XHRsZXQgd2VpZ2h0ID0gMDtcblxuXHRcdFx0Y29uc3QgaW5kZW50RGlmZmVyZW5jZSA9IGluZGVudCAtIHByZXZpb3VzU2l6ZTtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IGluZGVudDtcblxuXHRcdFx0Ly8gUHJldmlvdXMgbGluZSBoYXZlIHNhbWUgaW5kZW50P1xuXHRcdFx0aWYgKGluZGVudERpZmZlcmVuY2UgPT09IDApIHtcblx0XHRcdFx0Ly8gTm90IGEgbmV3IFwidXNlXCIgb2YgdGhlIGN1cnJlbnQgaW5kZW50OlxuXHRcdFx0XHR1c2UgPSAwO1xuXHRcdFx0XHQvLyBCdXQgZG8gYWRkIGEgYml0IHRvIGl0IGZvciBicmVha2luZyB0aWVzOlxuXHRcdFx0XHR3ZWlnaHQgPSAxO1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGtleSBmcm9tIHByZXZpb3VzIGxvb3Bcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSA9IE1hdGguYWJzKGluZGVudERpZmZlcmVuY2UpO1xuXG5cdFx0XHRcdC8vIElnbm9yZSBzaW5nbGUgc3BhY2UgY2hhbmdlcyB3aGVuIGlnbm9yZVNpbmdsZVNwYWNlcyBpcyB0cnVlXG5cdFx0XHRcdC8vIFRoaXMgcHJldmVudHMgY29tbW9uIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHRoaW5ncyBsaWtlIGFsaWduZWQgY29tbWVudHNcblx0XHRcdFx0aWYgKHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0gZW5jb2RlSW5kZW50c0tleShpbmRlbnRUeXBlLCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHN0YXRzXG5cdFx0XHRjb25zdCBlbnRyeSA9IGluZGVudHMuZ2V0KGtleSk7XG5cdFx0XHRpbmRlbnRzLnNldChrZXksIGVudHJ5ID09PSB1bmRlZmluZWQgPyBbMSwgMF0gOiBbZW50cnlbMF0gKyB1c2UsIGVudHJ5WzFdICsgd2VpZ2h0XSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGluZGVudHM7XG59XG5cbi8vIEVuY29kZSB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBhcyBhIHN0cmluZyAoZS5nLiAnczQnKSBmb3IgdXNlIGFzIGEgY29tcG91bmQga2V5IGluIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgaW5kZW50QW1vdW50KSB7XG5cdGNvbnN0IHR5cGVDaGFyYWN0ZXIgPSBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICdzJyA6ICd0Jztcblx0cmV0dXJuIHR5cGVDaGFyYWN0ZXIgKyBTdHJpbmcoaW5kZW50QW1vdW50KTtcbn1cblxuLy8gRXh0cmFjdCB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBmcm9tIGEga2V5IG9mIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGRlY29kZUluZGVudHNLZXkoaW5kZW50c0tleSkge1xuXHRjb25zdCBrZXlIYXNUeXBlU3BhY2UgPSBpbmRlbnRzS2V5WzBdID09PSAncyc7XG5cdGNvbnN0IHR5cGUgPSBrZXlIYXNUeXBlU3BhY2UgPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRjb25zdCBhbW91bnQgPSBOdW1iZXIoaW5kZW50c0tleS5zbGljZSgxKSk7XG5cblx0cmV0dXJuIHt0eXBlLCBhbW91bnR9O1xufVxuXG4vLyBSZXR1cm4gdGhlIGtleSAoZS5nLiAnczQnKSBmcm9tIHRoZSBpbmRlbnRzIE1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIG1vc3QgY29tbW9uIGluZGVudCxcbi8vIG9yIHJldHVybiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIGluZGVudHMuXG5mdW5jdGlvbiBnZXRNb3N0VXNlZEtleShpbmRlbnRzKSB7XG5cdGxldCByZXN1bHQ7XG5cdGxldCBtYXhVc2VkID0gMDtcblx0bGV0IG1heFdlaWdodCA9IDA7XG5cblx0Zm9yIChjb25zdCBba2V5LCBbdXNlZENvdW50LCB3ZWlnaHRdXSBvZiBpbmRlbnRzKSB7XG5cdFx0aWYgKHVzZWRDb3VudCA+IG1heFVzZWQgfHwgKHVzZWRDb3VudCA9PT0gbWF4VXNlZCAmJiB3ZWlnaHQgPiBtYXhXZWlnaHQpKSB7XG5cdFx0XHRtYXhVc2VkID0gdXNlZENvdW50O1xuXHRcdFx0bWF4V2VpZ2h0ID0gd2VpZ2h0O1xuXHRcdFx0cmVzdWx0ID0ga2V5O1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KSB7XG5cdGNvbnN0IGluZGVudENoYXJhY3RlciA9IHR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFID8gJyAnIDogJ1xcdCc7XG5cdHJldHVybiBpbmRlbnRDaGFyYWN0ZXIucmVwZWF0KGFtb3VudCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdEluZGVudChzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdC8vIElkZW50aWZ5IGluZGVudHMgd2hpbGUgc2tpcHBpbmcgc2luZ2xlIHNwYWNlIGluZGVudHMgdG8gYXZvaWQgY29tbW9uIGVkZ2UgY2FzZXMgKGUuZy4gY29kZSBjb21tZW50cylcblx0Ly8gSWYgbm8gaW5kZW50cyBhcmUgaWRlbnRpZmllZCwgcnVuIGFnYWluIGFuZCBpbmNsdWRlIGFsbCBpbmRlbnRzIGZvciBjb21wcmVoZW5zaXZlIGRldGVjdGlvblxuXHRsZXQgaW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgdHJ1ZSk7XG5cdGlmIChpbmRlbnRzLnNpemUgPT09IDApIHtcblx0XHRpbmRlbnRzID0gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBmYWxzZSk7XG5cdH1cblxuXHRjb25zdCBrZXlPZk1vc3RVc2VkSW5kZW50ID0gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cyk7XG5cblx0bGV0IHR5cGU7XG5cdGxldCBhbW91bnQgPSAwO1xuXHRsZXQgaW5kZW50ID0gJyc7XG5cblx0aWYgKGtleU9mTW9zdFVzZWRJbmRlbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdCh7dHlwZSwgYW1vdW50fSA9IGRlY29kZUluZGVudHNLZXkoa2V5T2ZNb3N0VXNlZEluZGVudCkpO1xuXHRcdGluZGVudCA9IG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0YW1vdW50LFxuXHRcdHR5cGUsXG5cdFx0aW5kZW50LFxuXHR9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGRldGVjdE5ld2xpbmUoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHRjb25zdCBuZXdsaW5lcyA9IHN0cmluZy5tYXRjaCgvKD86XFxyP1xcbikvZykgfHwgW107XG5cblx0aWYgKG5ld2xpbmVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGNybGYgPSBuZXdsaW5lcy5maWx0ZXIobmV3bGluZSA9PiBuZXdsaW5lID09PSAnXFxyXFxuJykubGVuZ3RoO1xuXHRjb25zdCBsZiA9IG5ld2xpbmVzLmxlbmd0aCAtIGNybGY7XG5cblx0cmV0dXJuIGNybGYgPiBsZiA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lR3JhY2VmdWwoc3RyaW5nKSB7XG5cdHJldHVybiAodHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycgJiYgZGV0ZWN0TmV3bGluZShzdHJpbmcpKSB8fCAnXFxuJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHNvcnRPYmplY3RLZXlzIGZyb20gJ3NvcnQtb2JqZWN0LWtleXMnXG5pbXBvcnQgZGV0ZWN0SW5kZW50IGZyb20gJ2RldGVjdC1pbmRlbnQnXG5pbXBvcnQgeyBkZXRlY3ROZXdsaW5lR3JhY2VmdWwgYXMgZGV0ZWN0TmV3bGluZSB9IGZyb20gJ2RldGVjdC1uZXdsaW5lJ1xuaW1wb3J0IGdpdEhvb2tzIGZyb20gJ2dpdC1ob29rcy1saXN0J1xuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnaXMtcGxhaW4tb2JqJ1xuaW1wb3J0IHNlbXZlckNvbXBhcmUgZnJvbSAnc2VtdmVyL2Z1bmN0aW9ucy9jb21wYXJlLmpzJ1xuaW1wb3J0IHNlbXZlck1pblZlcnNpb24gZnJvbSAnc2VtdmVyL3Jhbmdlcy9taW4tdmVyc2lvbi5qcydcblxuY29uc3QgcGlwZSA9XG4gIChmbnMpID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGZucy5yZWR1Y2UoKHJlc3VsdCwgZm4pID0+IGZuKHJlc3VsdCwgLi4uYXJncyksIHgpXG5jb25zdCBvbkFycmF5ID0gKGZuKSA9PiAoeCkgPT4gKEFycmF5LmlzQXJyYXkoeCkgPyBmbih4KSA6IHgpXG5jb25zdCBvblN0cmluZ0FycmF5ID0gKGZuKSA9PiAoeCkgPT5cbiAgQXJyYXkuaXNBcnJheSh4KSAmJiB4LmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpID8gZm4oeCkgOiB4XG5jb25zdCB1bmlxID0gb25TdHJpbmdBcnJheSgoeHMpID0+IFsuLi5uZXcgU2V0KHhzKV0pXG5jb25zdCBzb3J0QXJyYXkgPSBvblN0cmluZ0FycmF5KChhcnJheSkgPT4gYXJyYXkudG9Tb3J0ZWQoKSlcbmNvbnN0IHVuaXFBbmRTb3J0QXJyYXkgPSBwaXBlKFt1bmlxLCBzb3J0QXJyYXldKVxuY29uc3Qgb25PYmplY3QgPVxuICAoZm4pID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGlzUGxhaW5PYmplY3QoeCkgPyBmbih4LCAuLi5hcmdzKSA6IHhcbmNvbnN0IHNvcnRPYmplY3RCeSA9IChjb21wYXJhdG9yLCBkZWVwKSA9PiB7XG4gIGNvbnN0IG92ZXIgPSBvbk9iamVjdCgob2JqZWN0KSA9PiB7XG4gICAgaWYgKGRlZXApIHtcbiAgICAgIG9iamVjdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMob2JqZWN0KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgb3Zlcih2YWx1ZSldKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMob2JqZWN0LCBjb21wYXJhdG9yKVxuICB9KVxuXG4gIHJldHVybiBvdmVyXG59XG5jb25zdCBvYmplY3RHcm91cEJ5ID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvZXMtYnVpbHRpbnMsIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvZXMtc3ludGF4IC0tIFNhZmVcbiAgT2JqZWN0Lmdyb3VwQnkgfHxcbiAgLy8gUmVtb3ZlIHRoaXMgd2hlbiB3ZSBkcm9wIHN1cHBvcnQgZm9yIE5vZGUuanMgMjBcbiAgKChhcnJheSwgY2FsbGJhY2spID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhcnJheSkge1xuICAgICAgY29uc3Qga2V5ID0gY2FsbGJhY2sodmFsdWUpXG4gICAgICBpZiAocmVzdWx0W2tleV0pIHtcbiAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gW3ZhbHVlXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH0pXG5jb25zdCBzb3J0T2JqZWN0ID0gc29ydE9iamVjdEJ5KClcbmNvbnN0IHNvcnRVUkxPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyd0eXBlJywgJ3VybCddKVxuY29uc3Qgc29ydFBlb3BsZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ25hbWUnLCAnZW1haWwnLCAndXJsJ10pXG5jb25zdCBzb3J0RGlyZWN0b3JpZXMgPSBzb3J0T2JqZWN0QnkoW1xuICAnbGliJyxcbiAgJ2JpbicsXG4gICdtYW4nLFxuICAnZG9jJyxcbiAgJ2V4YW1wbGUnLFxuICAndGVzdCcsXG5dKVxuY29uc3Qgb3ZlclByb3BlcnR5ID0gKHByb3BlcnR5LCBvdmVyKSA9PlxuICBvbk9iamVjdCgob2JqZWN0LCAuLi5hcmdzKSA9PlxuICAgIE9iamVjdC5oYXNPd24ob2JqZWN0LCBwcm9wZXJ0eSlcbiAgICAgID8geyAuLi5vYmplY3QsIFtwcm9wZXJ0eV06IG92ZXIob2JqZWN0W3Byb3BlcnR5XSwgLi4uYXJncykgfVxuICAgICAgOiBvYmplY3QsXG4gIClcbmNvbnN0IHNvcnRHaXRIb29rcyA9IHNvcnRPYmplY3RCeShnaXRIb29rcylcblxuY29uc3QgcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlID0gKHNwZWNpZmllcikgPT4ge1xuICAvLyBJZ25vcmUgYW55dGhpbmcgYWZ0ZXIgPiAmIHJlbHkgb24gZmFsbGJhY2sgYWxwaGFudW1lcmljIHNvcnRpbmcgZm9yIHRoYXRcbiAgY29uc3QgW25hbWVBbmRWZXJzaW9uXSA9IHNwZWNpZmllci5zcGxpdCgnPicpXG4gIGNvbnN0IGF0TWF0Y2hlcyA9IFsuLi5uYW1lQW5kVmVyc2lvbi5tYXRjaEFsbCgnQCcpXVxuICBpZiAoXG4gICAgIWF0TWF0Y2hlcy5sZW5ndGggfHxcbiAgICAoYXRNYXRjaGVzLmxlbmd0aCA9PT0gMSAmJiBhdE1hdGNoZXNbMF0uaW5kZXggPT09IDApXG4gICkge1xuICAgIHJldHVybiB7IG5hbWU6IHNwZWNpZmllciB9XG4gIH1cbiAgY29uc3Qgc3BsaXRJbmRleCA9IGF0TWF0Y2hlcy5wb3AoKS5pbmRleFxuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZygwLCBzcGxpdEluZGV4KSxcbiAgICByYW5nZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKHNwbGl0SW5kZXggKyAxKSxcbiAgfVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlTZW12ZXIgPSBzb3J0T2JqZWN0QnkoKGEsIGIpID0+IHtcbiAgY29uc3QgeyBuYW1lOiBhTmFtZSwgcmFuZ2U6IGFSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGEpXG4gIGNvbnN0IHsgbmFtZTogYk5hbWUsIHJhbmdlOiBiUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShiKVxuXG4gIGlmIChhTmFtZSAhPT0gYk5hbWUpIHtcbiAgICByZXR1cm4gYU5hbWUubG9jYWxlQ29tcGFyZShiTmFtZSwgJ2VuJylcbiAgfVxuICBpZiAoIWFSYW5nZSkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmICghYlJhbmdlKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuICByZXR1cm4gc2VtdmVyQ29tcGFyZShzZW12ZXJNaW5WZXJzaW9uKGFSYW5nZSksIHNlbXZlck1pblZlcnNpb24oYlJhbmdlKSlcbn0pXG5cbmNvbnN0IGdldFBhY2thZ2VOYW1lID0gKGlkZW50KSA9PiB7XG4gIGNvbnN0IGluZGV4ID0gaWRlbnQuaW5kZXhPZignQCcsIGlkZW50LnN0YXJ0c1dpdGgoJ0AnKSA/IDEgOiAwKVxuICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCB1bmxlc3MgdXNlciBtYW51YWxseSBlZGl0IHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICByZXR1cm4gaW5kZXggPT09IC0xID8gaWRlbnQgOiBpZGVudC5zbGljZSgwLCBpbmRleClcbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5SWRlbnQgPSAoYSwgYikgPT4ge1xuICBjb25zdCBwYWNrYWdlTmFtZUEgPSBnZXRQYWNrYWdlTmFtZShhKVxuICBjb25zdCBwYWNrYWdlTmFtZUIgPSBnZXRQYWNrYWdlTmFtZShiKVxuXG4gIGlmIChwYWNrYWdlTmFtZUEgPCBwYWNrYWdlTmFtZUIpIHJldHVybiAtMVxuICBpZiAocGFja2FnZU5hbWVBID4gcGFja2FnZU5hbWVCKSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBDYWNoZSBieSBgcHJvY2Vzcy5jd2QoKWAgaW5zdGVhZCBvZiBhIHZhcmlhYmxlIHRvIGFsbG93IHVzZXIgY2FsbCBgcHJvY2Vzcy5jaGRpcigpYFxuY29uc3QgY2FjaGUgPSBuZXcgTWFwKClcbmNvbnN0IGhhc1lhcm5PclBucG1GaWxlcyA9ICgpID0+IHtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKVxuICBpZiAoIWNhY2hlLmhhcyhjd2QpKSB7XG4gICAgY2FjaGUuc2V0KFxuICAgICAgY3dkLFxuICAgICAgZnMuZXhpc3RzU3luYygneWFybi5sb2NrJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm4vJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm5yYy55bWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLWxvY2sueWFtbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0td29ya3NwYWNlLnlhbWwnKSxcbiAgICApXG4gIH1cbiAgcmV0dXJuIGNhY2hlLmdldChjd2QpXG59XG5cbi8qKlxuICogRGV0ZWN0cyB0aGUgcGFja2FnZSBtYW5hZ2VyIGZyb20gcGFja2FnZS5qc29uIGFuZCBsb2NrIGZpbGVzXG4gKiBAcGFyYW0ge29iamVjdH0gcGFja2FnZUpzb24gLSBUaGUgcGFyc2VkIHBhY2thZ2UuanNvbiBvYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRoZSBkZXRlY3RlZCBwYWNrYWdlIG1hbmFnZXIuIERlZmF1bHQgdG8gbnBtIGlmIG5vdCBkZXRlY3RlZC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pIHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9jb3JlcGFja1xuICBpZiAodHlwZW9mIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlci5zdGFydHNXaXRoKCducG1AJylcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5kZXZFbmdpbmVzPy5wYWNrYWdlTWFuYWdlcj8ubmFtZSkge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5kZXZFbmdpbmVzLnBhY2thZ2VNYW5hZ2VyLm5hbWUgPT09ICducG0nXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24ucG5wbSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gT3B0aW1pc2F0aW9uOiBDaGVjayBpZiBucG0gaXMgZXhwbGljaXQgYmVmb3JlIHJlYWRpbmcgRlMuXG4gIGlmIChwYWNrYWdlSnNvbi5lbmdpbmVzPy5ucG0pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGhhc1lhcm5PclBucG1GaWxlcygpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIFNvcnQgZGVwZW5kZW5jaWVzIGFscGhhYmV0aWNhbGx5LCBkZXRlY3RpbmcgcGFja2FnZSBtYW5hZ2VyIHRvIHVzZSB0aGVcbiAqIGFwcHJvcHJpYXRlIGNvbXBhcmlzb24uIG5wbSB1c2VzIGxvY2FsZS1hd2FyZSBjb21wYXJpc29uLCB5YXJuIGFuZCBwbnBtIHVzZVxuICogc2ltcGxlIHN0cmluZyBjb21wYXJpc29uXG4gKi9cbmNvbnN0IHNvcnREZXBlbmRlbmNpZXMgPSBvbk9iamVjdCgoZGVwZW5kZW5jaWVzLCBwYWNrYWdlSnNvbikgPT4ge1xuICAvLyBBdm9pZCBmaWxlIGFjY2Vzc1xuICBpZiAoT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzKS5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIGRlcGVuZGVuY2llc1xuICB9XG5cbiAgLy8gc29ydCBkZXBzIGxpa2UgdGhlIG5wbSBDTEkgZG9lcyAodmlhIHRoZSBwYWNrYWdlIEBucG1jbGkvcGFja2FnZS1qc29uKVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbnBtL3BhY2thZ2UtanNvbi9ibG9iL2I2NDY1ZjQ0YzcyN2Q2NTEzZGI2ODk4YzdjYmU0MWRkMzU1Y2ViZTgvbGliL3VwZGF0ZS1kZXBlbmRlbmNpZXMuanMjTDgtTDIxXG4gIGlmIChzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikpIHtcbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzLCAoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIsICdlbicpKVxuICB9XG5cbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcylcbn0pXG5cbi8qKlxuICogXCJ3b3Jrc3BhY2VzXCIgY2FuIGJlIGFuIGFycmF5IChucG0gb3IgeWFybiBjbGFzc2ljKSBvciBhbiBvYmplY3QgKHBucG0vYnVuKS5cbiAqIEluIHRoZSBjYXNlIG9mIGFuIGFycmF5LCB3ZSBkbyBub3Qgd2FudCB0byBhbHBoYWJldGljYWxseSBzb3J0IGl0IGluIGNhc2VcbiAqIHNjcmlwdHMgbmVlZCB0byBydW4gaW4gYSBzcGVjaWZpYyBvcmRlci5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3Y3L3VzaW5nLW5wbS93b3Jrc3BhY2VzP3Y9dHJ1ZSNydW5uaW5nLWNvbW1hbmRzLWluLXRoZS1jb250ZXh0LW9mLXdvcmtzcGFjZXNcbiAqL1xuY29uc3Qgc29ydFdvcmtzcGFjZXMgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KFsncGFja2FnZXMnLCAnY2F0YWxvZyddKSxcbiAgb3ZlclByb3BlcnR5KCdwYWNrYWdlcycsIHVuaXFBbmRTb3J0QXJyYXkpLFxuICBvdmVyUHJvcGVydHkoJ2NhdGFsb2cnLCBzb3J0RGVwZW5kZW5jaWVzKSxcbl0pXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2Jsb2IvYWNjMGU0NzU3MmE5MzkwMjkyYjRlMzEzYjRhNGJmMzYwZDIzNjM1OC9jb25mL2NvbmZpZy1zY2hlbWEuanNcbmNvbnN0IGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzID0gW1xuICAvLyBgZmlsZXNgIGFuZCBgZXhjbHVkZWRGaWxlc2AgYXJlIG9ubHkgb24gYG92ZXJyaWRlc1tdYFxuICAvLyBmb3IgZWFzaWVyIHNvcnQgYG92ZXJyaWRlc1tdYCxcbiAgLy8gYWRkIHRoZW0gdG8gaGVyZSwgc28gd2UgZG9uJ3QgbmVlZCBzb3J0IGBvdmVycmlkZXNbXWAgdHdpY2VcbiAgJ2ZpbGVzJyxcbiAgJ2V4Y2x1ZGVkRmlsZXMnLFxuICAvLyBiYXNlQ29uZmlnXG4gICdlbnYnLFxuICAncGFyc2VyJyxcbiAgJ3BhcnNlck9wdGlvbnMnLFxuICAnc2V0dGluZ3MnLFxuICAncGx1Z2lucycsXG4gICdleHRlbmRzJyxcbiAgJ3J1bGVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdnbG9iYWxzJyxcbiAgJ3Byb2Nlc3NvcicsXG4gICdub0lubGluZUNvbmZpZycsXG4gICdyZXBvcnRVbnVzZWREaXNhYmxlRGlyZWN0aXZlcycsXG5dXG5jb25zdCBzb3J0RXNsaW50Q29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyksXG4gIG92ZXJQcm9wZXJ0eSgnZW52Jywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eSgnZ2xvYmFscycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PiBvdmVycmlkZXMubWFwKHNvcnRFc2xpbnRDb25maWcpKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdwYXJzZXJPcHRpb25zJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAncnVsZXMnLFxuICAgIHNvcnRPYmplY3RCeShcbiAgICAgIChydWxlMSwgcnVsZTIpID0+XG4gICAgICAgIHJ1bGUxLnNwbGl0KCcvJykubGVuZ3RoIC0gcnVsZTIuc3BsaXQoJy8nKS5sZW5ndGggfHxcbiAgICAgICAgcnVsZTEubG9jYWxlQ29tcGFyZShydWxlMiksXG4gICAgKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdzZXR0aW5ncycsIHNvcnRPYmplY3QpLFxuXSlcbmNvbnN0IHNvcnRWU0NvZGVCYWRnZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ2Rlc2NyaXB0aW9uJywgJ3VybCcsICdocmVmJ10pXG5cbmNvbnN0IHNvcnRQcmV0dGllckNvbmZpZyA9IHBpcGUoW1xuICAvLyBzb3J0IGtleXMgYWxwaGFiZXRpY2FsbHksIGJ1dCBwdXQgYG92ZXJyaWRlc2AgYXQgYm90dG9tXG4gIG9uT2JqZWN0KChjb25maWcpID0+XG4gICAgc29ydE9iamVjdEtleXMoY29uZmlnLCBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhjb25maWcpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSAnb3ZlcnJpZGVzJylcbiAgICAgICAgLnNvcnQoKSxcbiAgICAgICdvdmVycmlkZXMnLFxuICAgIF0pLFxuICApLFxuICAvLyBpZiBgY29uZmlnLm92ZXJyaWRlc2AgZXhpc3RzXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICAvLyBhbmQgYGNvbmZpZy5vdmVycmlkZXNgIGlzIGFuIGFycmF5XG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PlxuICAgICAgb3ZlcnJpZGVzLm1hcChcbiAgICAgICAgcGlwZShbXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIHNvcnRPYmplY3QsXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdLm9wdGlvbnNgIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgb3ZlclByb3BlcnR5KCdvcHRpb25zJywgc29ydE9iamVjdCksXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICApLFxuICApLFxuXSlcblxuY29uc3Qgc29ydFZvbHRhID0gc29ydE9iamVjdEJ5KFsnbm9kZScsICducG0nLCAneWFybiddKVxuY29uc3Qgc29ydERldkVuZ2luZXMgPSBvdmVyUHJvcGVydHkoXG4gICdwYWNrYWdlTWFuYWdlcicsXG4gIHNvcnRPYmplY3RCeShbJ25hbWUnLCAndmVyc2lvbicsICdvbkZhaWwnXSksXG4pXG5cbmNvbnN0IHBucG1CYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgJ3BlZXJEZXBlbmRlbmN5UnVsZXMnLFxuICAnbmV2ZXJCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzRmlsZScsXG4gICdhbGxvd2VkRGVwcmVjYXRlZFZlcnNpb25zJyxcbiAgJ2FsbG93Tm9uQXBwbGllZFBhdGNoZXMnLFxuICAndXBkYXRlQ29uZmlnJyxcbiAgJ2F1ZGl0Q29uZmlnJyxcbiAgJ3JlcXVpcmVkU2NyaXB0cycsXG4gICdzdXBwb3J0ZWRBcmNoaXRlY3R1cmVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdwYXRjaGVkRGVwZW5kZW5jaWVzJyxcbiAgJ3BhY2thZ2VFeHRlbnNpb25zJyxcbl1cblxuY29uc3Qgc29ydFBucG1Db25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KHBucG1CYXNlQ29uZmlnUHJvcGVydGllcywgdHJ1ZSksXG4gIG92ZXJQcm9wZXJ0eSgnb3ZlcnJpZGVzJywgc29ydE9iamVjdEJ5U2VtdmVyKSxcbl0pXG5cbi8vIFNlZSBodHRwczovL2RvY3MubnBtanMuY29tL21pc2Mvc2NyaXB0c1xuY29uc3QgZGVmYXVsdE5wbVNjcmlwdHMgPSBuZXcgU2V0KFtcbiAgJ2luc3RhbGwnLFxuICAncGFjaycsXG4gICdwcmVwYXJlJyxcbiAgJ3B1Ymxpc2gnLFxuICAncmVzdGFydCcsXG4gICdzaHJpbmt3cmFwJyxcbiAgJ3N0YXJ0JyxcbiAgJ3N0b3AnLFxuICAndGVzdCcsXG4gICd1bmluc3RhbGwnLFxuICAndmVyc2lvbicsXG5dKVxuXG5jb25zdCBoYXNEZXZEZXBlbmRlbmN5ID0gKGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uKSA9PiB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbiwgJ2RldkRlcGVuZGVuY2llcycpICYmXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3kpXG4gIClcbn1cblxuY29uc3QgcnVuU1JlZ0V4cCA9XG4gIC8oPzw9XnxbXFxzJjs8PnwoXSkoPzpydW4tc3xucG0tcnVuLWFsbDI/IC4qKD86LS1zZXF1ZW50aWFsfC0tc2VyaWFsfC1zKSkoPz0kfFtcXHMmOzw+fCldKS9cblxuY29uc3QgaXNTZXF1ZW50aWFsU2NyaXB0ID0gKGNvbW1hbmQpID0+XG4gIGNvbW1hbmQuaW5jbHVkZXMoJyonKSAmJiBydW5TUmVnRXhwLnRlc3QoY29tbWFuZClcblxuY29uc3QgaGFzU2VxdWVudGlhbFNjcmlwdCA9IChwYWNrYWdlSnNvbikgPT4ge1xuICBpZiAoXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsJywgcGFja2FnZUpzb24pICYmXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsMicsIHBhY2thZ2VKc29uKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBzY3JpcHRzID0gWydzY3JpcHRzJywgJ2JldHRlclNjcmlwdHMnXS5mbGF0TWFwKChmaWVsZCkgPT5cbiAgICBwYWNrYWdlSnNvbltmaWVsZF0gPyBPYmplY3QudmFsdWVzKHBhY2thZ2VKc29uW2ZpZWxkXSkgOiBbXSxcbiAgKVxuICByZXR1cm4gc2NyaXB0cy5zb21lKChzY3JpcHQpID0+IGlzU2VxdWVudGlhbFNjcmlwdChzY3JpcHQpKVxufVxuXG5mdW5jdGlvbiBzb3J0U2NyaXB0TmFtZXMoa2V5cywgcHJlZml4ID0gJycpIHtcbiAgY29uc3QgZ3JvdXBNYXAgPSBuZXcgTWFwKClcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSBwcmVmaXggPyBrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCArIDEpIDoga2V5XG4gICAgY29uc3QgaWR4ID0gcmVzdC5pbmRleE9mKCc6JylcbiAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgY29uc3QgYmFzZSA9IGtleS5zbGljZSgwLCAocHJlZml4ID8gcHJlZml4Lmxlbmd0aCArIDEgOiAwKSArIGlkeClcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGJhc2UpKSBncm91cE1hcC5zZXQoYmFzZSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoYmFzZSkucHVzaChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGtleSkpIGdyb3VwTWFwLnNldChrZXksIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGtleSkucHVzaChrZXkpXG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKGdyb3VwTWFwLmtleXMoKSlcbiAgICAuc29ydCgpXG4gICAgLmZsYXRNYXAoKGdyb3VwS2V5KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGdyb3VwTWFwLmdldChncm91cEtleSlcbiAgICAgIGlmIChcbiAgICAgICAgY2hpbGRyZW4ubGVuZ3RoID4gMSAmJlxuICAgICAgICBjaGlsZHJlbi5zb21lKChrKSA9PiBrICE9PSBncm91cEtleSAmJiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdCA9IGNoaWxkcmVuXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gayA9PT0gZ3JvdXBLZXkgfHwgIWsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICBjb25zdCBuZXN0ZWQgPSBjaGlsZHJlbi5maWx0ZXIoKGspID0+IGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgIHJldHVybiBbLi4uZGlyZWN0LCAuLi5zb3J0U2NyaXB0TmFtZXMobmVzdGVkLCBncm91cEtleSldXG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGRyZW4uc29ydCgpXG4gICAgfSlcbn1cblxuY29uc3Qgc29ydFNjcmlwdHMgPSBvbk9iamVjdCgoc2NyaXB0cywgcGFja2FnZUpzb24pID0+IHtcbiAgbGV0IG5hbWVzID0gT2JqZWN0LmtleXMoc2NyaXB0cylcbiAgY29uc3QgcHJlZml4YWJsZSA9IG5ldyBTZXQoKVxuXG4gIG5hbWVzID0gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgY29uc3Qgb21pdHRlZCA9IG5hbWUucmVwbGFjZSgvXig/OnByZXxwb3N0KS8sICcnKVxuICAgIGlmIChkZWZhdWx0TnBtU2NyaXB0cy5oYXMob21pdHRlZCkgfHwgbmFtZXMuaW5jbHVkZXMob21pdHRlZCkpIHtcbiAgICAgIHByZWZpeGFibGUuYWRkKG9taXR0ZWQpXG4gICAgICByZXR1cm4gb21pdHRlZFxuICAgIH1cbiAgICByZXR1cm4gbmFtZVxuICB9KVxuXG4gIGlmICghaGFzU2VxdWVudGlhbFNjcmlwdChwYWNrYWdlSnNvbikpIHtcbiAgICBuYW1lcyA9IHNvcnRTY3JpcHROYW1lcyhuYW1lcylcbiAgfVxuICBuYW1lcyA9IG5hbWVzLmZsYXRNYXAoKGtleSkgPT5cbiAgICBwcmVmaXhhYmxlLmhhcyhrZXkpID8gW2BwcmUke2tleX1gLCBrZXksIGBwb3N0JHtrZXl9YF0gOiBba2V5XSxcbiAgKVxuICByZXR1cm4gc29ydE9iamVjdEtleXMoc2NyaXB0cywgbmFtZXMpXG59KVxuXG4vKlxuLSBNb3ZlIGBkZWZhdWx0YCBjb25kaXRpb24gdG8gYm90dG9tXG4qL1xuY29uc3Qgc29ydENvbmRpdGlvbnMgPSAoY29uZGl0aW9ucykgPT4ge1xuICBjb25zdCB7IGRlZmF1bHRDb25kaXRpb25zID0gW10sIHJlc3RDb25kaXRpb25zID0gW10gfSA9IG9iamVjdEdyb3VwQnkoXG4gICAgY29uZGl0aW9ucyxcbiAgICAoY29uZGl0aW9uKSA9PiB7XG4gICAgICBpZiAoY29uZGl0aW9uID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgcmV0dXJuICdkZWZhdWx0Q29uZGl0aW9ucydcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdyZXN0Q29uZGl0aW9ucydcbiAgICB9LFxuICApXG5cbiAgcmV0dXJuIFsuLi5yZXN0Q29uZGl0aW9ucywgLi4uZGVmYXVsdENvbmRpdGlvbnNdXG59XG5cbmNvbnN0IHNvcnRFeHBvcnRzID0gb25PYmplY3QoKGV4cG9ydHMpID0+IHtcbiAgY29uc3QgeyBwYXRocyA9IFtdLCBjb25kaXRpb25zID0gW10gfSA9IG9iamVjdEdyb3VwQnkoXG4gICAgT2JqZWN0LmtleXMoZXhwb3J0cyksXG4gICAgKGtleSkgPT4gKGtleS5zdGFydHNXaXRoKCcuJykgPyAncGF0aHMnIDogJ2NvbmRpdGlvbnMnKSxcbiAgKVxuXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgWy4uLnBhdGhzLCAuLi5zb3J0Q29uZGl0aW9ucyhjb25kaXRpb25zKV0ubWFwKChrZXkpID0+IFtcbiAgICAgIGtleSxcbiAgICAgIHNvcnRFeHBvcnRzKGV4cG9ydHNba2V5XSksXG4gICAgXSksXG4gIClcbn0pXG5cbi8vIGZpZWxkcyBtYXJrZWQgYHZzY29kZWAgYXJlIGZvciBgVmlzdWFsIFN0dWRpbyBDb2RlIGV4dGVuc2lvbiBtYW5pZmVzdGAgb25seVxuLy8gaHR0cHM6Ly9jb2RlLnZpc3VhbHN0dWRpby5jb20vYXBpL3JlZmVyZW5jZXMvZXh0ZW5zaW9uLW1hbmlmZXN0XG4vLyBTdXBwb3J0ZWQgZmllbGRzOlxuLy8gcHVibGlzaGVyLCBkaXNwbGF5TmFtZSwgY2F0ZWdvcmllcywgZ2FsbGVyeUJhbm5lciwgcHJldmlldywgY29udHJpYnV0ZXMsXG4vLyBhY3RpdmF0aW9uRXZlbnRzLCBiYWRnZXMsIG1hcmtkb3duLCBxbmEsIGV4dGVuc2lvblBhY2ssXG4vLyBleHRlbnNpb25EZXBlbmRlbmNpZXMsIGljb25cblxuLy8gZmllbGQua2V5e3N0cmluZ306IGZpZWxkIG5hbWVcbi8vIGZpZWxkLm92ZXJ7ZnVuY3Rpb259OiBzb3J0IGZpZWxkIHN1YktleVxuY29uc3QgZmllbGRzID0gW1xuICB7IGtleTogJyRzY2hlbWEnIH0sXG4gIHsga2V5OiAnbmFtZScgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZGlzcGxheU5hbWUnIH0sXG4gIHsga2V5OiAndmVyc2lvbicgfSxcbiAgLyogeWFybiAqLyB7IGtleTogJ3N0YWJsZVZlcnNpb24nIH0sXG4gIHsga2V5OiAncHJpdmF0ZScgfSxcbiAgeyBrZXk6ICdkZXNjcmlwdGlvbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY2F0ZWdvcmllcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdrZXl3b3JkcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdob21lcGFnZScgfSxcbiAgeyBrZXk6ICdidWdzJywgb3Zlcjogc29ydE9iamVjdEJ5KFsndXJsJywgJ2VtYWlsJ10pIH0sXG4gIHsga2V5OiAncmVwb3NpdG9yeScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdmdW5kaW5nJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2xpY2Vuc2UnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3FuYScgfSxcbiAgeyBrZXk6ICdhdXRob3InLCBvdmVyOiBzb3J0UGVvcGxlT2JqZWN0IH0sXG4gIHtcbiAgICBrZXk6ICdtYWludGFpbmVycycsXG4gICAgb3Zlcjogb25BcnJheSgobWFpbnRhaW5lcnMpID0+IG1haW50YWluZXJzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjb250cmlidXRvcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGNvbnRyaWJ1dG9ycykgPT4gY29udHJpYnV0b3JzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3B1Ymxpc2hlcicgfSxcbiAgeyBrZXk6ICdzaWRlRWZmZWN0cycgfSxcbiAgeyBrZXk6ICd0eXBlJyB9LFxuICB7IGtleTogJ2ltcG9ydHMnIH0sXG4gIHsga2V5OiAnZXhwb3J0cycsIG92ZXI6IHNvcnRFeHBvcnRzIH0sXG4gIHsga2V5OiAnbWFpbicgfSxcbiAgeyBrZXk6ICdzdmVsdGUnIH0sXG4gIHsga2V5OiAndW1kOm1haW4nIH0sXG4gIHsga2V5OiAnanNkZWxpdnInIH0sXG4gIHsga2V5OiAndW5wa2cnIH0sXG4gIHsga2V5OiAnbW9kdWxlJyB9LFxuICB7IGtleTogJ3NvdXJjZScgfSxcbiAgeyBrZXk6ICdqc25leHQ6bWFpbicgfSxcbiAgeyBrZXk6ICdicm93c2VyJyB9LFxuICB7IGtleTogJ3JlYWN0LW5hdGl2ZScgfSxcbiAgeyBrZXk6ICd0eXBlcycgfSxcbiAgeyBrZXk6ICd0eXBlc1ZlcnNpb25zJyB9LFxuICB7IGtleTogJ3R5cGluZ3MnIH0sXG4gIHsga2V5OiAnc3R5bGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlc3R5bGUnIH0sXG4gIHsga2V5OiAnYXNzZXRzJyB9LFxuICB7IGtleTogJ2JpbicsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtYW4nIH0sXG4gIHsga2V5OiAnZGlyZWN0b3JpZXMnLCBvdmVyOiBzb3J0RGlyZWN0b3JpZXMgfSxcbiAgeyBrZXk6ICdmaWxlcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICd3b3Jrc3BhY2VzJywgb3Zlcjogc29ydFdvcmtzcGFjZXMgfSxcbiAgLy8gbm9kZS1wcmUtZ3lwIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL25vZGUtcHJlLWd5cCMxLWFkZC1uZXctZW50cmllcy10by15b3VyLXBhY2thZ2Vqc29uXG4gIHtcbiAgICBrZXk6ICdiaW5hcnknLFxuICAgIG92ZXI6IHNvcnRPYmplY3RCeShbXG4gICAgICAnbW9kdWxlX25hbWUnLFxuICAgICAgJ21vZHVsZV9wYXRoJyxcbiAgICAgICdyZW1vdGVfcGF0aCcsXG4gICAgICAncGFja2FnZV9uYW1lJyxcbiAgICAgICdob3N0JyxcbiAgICBdKSxcbiAgfSxcbiAgeyBrZXk6ICdzY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgeyBrZXk6ICdiZXR0ZXJTY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbDEwbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY29udHJpYnV0ZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2FjdGl2YXRpb25FdmVudHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaHVza3knLCBvdmVyOiBvdmVyUHJvcGVydHkoJ2hvb2tzJywgc29ydEdpdEhvb2tzKSB9LFxuICB7IGtleTogJ3NpbXBsZS1naXQtaG9va3MnLCBvdmVyOiBzb3J0R2l0SG9va3MgfSxcbiAgeyBrZXk6ICdwcmUtY29tbWl0JyB9LFxuICB7IGtleTogJ2NvbW1pdGxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbGludC1zdGFnZWQnIH0sXG4gIHsga2V5OiAnbmFuby1zdGFnZWQnIH0sXG4gIHsga2V5OiAnY29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25vZGVtb25Db25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcmlmeScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdiYWJlbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2Vyc2xpc3QnIH0sXG4gIHsga2V5OiAneG8nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHJldHRpZXInLCBvdmVyOiBzb3J0UHJldHRpZXJDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRDb25maWcnLCBvdmVyOiBzb3J0RXNsaW50Q29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50SWdub3JlJyB9LFxuICB7IGtleTogJ25wbXBrZ2pzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbVBhY2thZ2VKc29uTGludENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1wYWNrYWdlanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVsZWFzZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZW1hcmtDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnc3R5bGVsaW50JyB9LFxuICB7IGtleTogJ2F2YScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QtanVuaXQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1zdGFyZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtb2NoYScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdueWMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYzgnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAndGFwJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ29jbGlmJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdyZXNvbHV0aW9ucycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvdmVycmlkZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RldkRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHNvcnRPYmplY3RCeUlkZW50LCB0cnVlKSB9LFxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIC8vIFRPRE86IG9ubHkgc29ydCBkZXB0aCA9IDJcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnYnVuZGxlZERlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdidW5kbGVEZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvblBhY2snLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvbkRlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdmbGF0JyB9LFxuICB7IGtleTogJ3BhY2thZ2VNYW5hZ2VyJyB9LFxuICB7IGtleTogJ2VuZ2luZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZW5naW5lU3RyaWN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2RldkVuZ2luZXMnLCBvdmVyOiBzb3J0RGV2RW5naW5lcyB9LFxuICB7IGtleTogJ3ZvbHRhJywgb3Zlcjogc29ydFZvbHRhIH0sXG4gIHsga2V5OiAnbGFuZ3VhZ2VOYW1lJyB9LFxuICB7IGtleTogJ29zJyB9LFxuICB7IGtleTogJ2NwdScgfSxcbiAgeyBrZXk6ICdwcmVmZXJHbG9iYWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHVibGlzaENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnaWNvbicgfSxcbiAgLyogdnNjb2RlICovIHtcbiAgICBrZXk6ICdiYWRnZXMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGJhZGdlKSA9PiBiYWRnZS5tYXAoc29ydFZTQ29kZUJhZGdlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2dhbGxlcnlCYW5uZXInLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3ByZXZpZXcnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ21hcmtkb3duJyB9LFxuICB7IGtleTogJ3BucG0nLCBvdmVyOiBzb3J0UG5wbUNvbmZpZyB9LFxuXVxuXG5jb25zdCBkZWZhdWx0U29ydE9yZGVyID0gZmllbGRzLm1hcCgoeyBrZXkgfSkgPT4ga2V5KVxuY29uc3Qgb3ZlckZpZWxkcyA9IHBpcGUoXG4gIGZpZWxkc1xuICAgIC5tYXAoKHsga2V5LCBvdmVyIH0pID0+IChvdmVyID8gb3ZlclByb3BlcnR5KGtleSwgb3ZlcikgOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoQm9vbGVhbiksXG4pXG5cbmZ1bmN0aW9uIGVkaXRTdHJpbmdKU09OKGpzb24sIG92ZXIpIHtcbiAgaWYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHsgaW5kZW50LCB0eXBlIH0gPSBkZXRlY3RJbmRlbnQoanNvbilcbiAgICBjb25zdCBlbmRDaGFyYWN0ZXJzID0ganNvbi5zbGljZSgtMSkgPT09ICdcXG4nID8gJ1xcbicgOiAnJ1xuICAgIGNvbnN0IG5ld2xpbmUgPSBkZXRlY3ROZXdsaW5lKGpzb24pXG4gICAganNvbiA9IEpTT04ucGFyc2UoanNvbilcblxuICAgIGxldCByZXN1bHQgPVxuICAgICAgSlNPTi5zdHJpbmdpZnkob3Zlcihqc29uKSwgbnVsbCwgdHlwZSA9PT0gJ3RhYicgPyAnXFx0JyA6IGluZGVudCkgK1xuICAgICAgZW5kQ2hhcmFjdGVyc1xuICAgIGlmIChuZXdsaW5lID09PSAnXFxyXFxuJykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xcbi9nLCBuZXdsaW5lKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByZXR1cm4gb3Zlcihqc29uKVxufVxuXG5mdW5jdGlvbiBzb3J0UGFja2FnZUpzb24oanNvbklzaCwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBlZGl0U3RyaW5nSlNPTihcbiAgICBqc29uSXNoLFxuICAgIG9uT2JqZWN0KChqc29uKSA9PiB7XG4gICAgICBsZXQgc29ydE9yZGVyID0gb3B0aW9ucy5zb3J0T3JkZXIgfHwgZGVmYXVsdFNvcnRPcmRlclxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3J0T3JkZXIpKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhqc29uKVxuICAgICAgICBjb25zdCB7IHByaXZhdGVLZXlzID0gW10sIHB1YmxpY0tleXMgPSBbXSB9ID0gb2JqZWN0R3JvdXBCeShcbiAgICAgICAgICBrZXlzLFxuICAgICAgICAgIChrZXkpID0+IChrZXlbMF0gPT09ICdfJyA/ICdwcml2YXRlS2V5cycgOiAncHVibGljS2V5cycpLFxuICAgICAgICApXG4gICAgICAgIHNvcnRPcmRlciA9IFtcbiAgICAgICAgICAuLi5zb3J0T3JkZXIsXG4gICAgICAgICAgLi4uZGVmYXVsdFNvcnRPcmRlcixcbiAgICAgICAgICAuLi5wdWJsaWNLZXlzLnNvcnQoKSxcbiAgICAgICAgICAuLi5wcml2YXRlS2V5cy5zb3J0KCksXG4gICAgICAgIF1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG92ZXJGaWVsZHMoc29ydE9iamVjdEtleXMoanNvbiwgc29ydE9yZGVyKSwganNvbilcbiAgICB9KSxcbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBzb3J0UGFja2FnZUpzb25cbmV4cG9ydCB7IHNvcnRQYWNrYWdlSnNvbiwgZGVmYXVsdFNvcnRPcmRlciBhcyBzb3J0T3JkZXIgfVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG5cdHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbHVlKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcGFja2FnZURpclBhdGhzLm1hcChhc3luYyAocGFja2FnZURpclBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbmV3VGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICd0ZXN0Jyk7XG4gICAgICAgIGZvciAoY29uc3Qgb2xkVGVzdERpck5hbWUgb2YgWydfX3Rlc3RzX18nLCAndGVzdHMnXSkge1xuICAgICAgICAgIGNvbnN0IG9sZFRlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCBvbGRUZXN0RGlyTmFtZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IG1vdmVUZXN0RGlyZWN0b3J5KG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICAgICAgICAgIHNjcmlwdHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBkaWRVcGRhdGVTY3JpcHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBbc2NyaXB0TmFtZSwgc2NyaXB0XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgICAgICAgICAgICBjb25zdCBuZXdTY3JpcHQgPSBzY3JpcHQucmVwbGFjZUFsbChvbGRUZXN0RGlyTmFtZSwgJ3Rlc3QnKTtcbiAgICAgICAgICAgICAgaWYgKHNjcmlwdCAhPT0gbmV3U2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG5ld1NjcmlwdDtcbiAgICAgICAgICAgICAgICBkaWRVcGRhdGVTY3JpcHQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWNrYWdlSnNvbi5zY3JpcHRzID0gc2NyaXB0cztcbiAgICAgICAgICAgIGlmICghZGlkVXBkYXRlU2NyaXB0KSByZXR1cm47XG5cbiAgICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShzb3J0UGFja2FnZUpzb24ocGFja2FnZUpzb24pLCB1bmRlZmluZWQsIDIpKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1vdmVUZXN0RGlyZWN0b3J5KG9sZFRlc3REaXJQYXRoOiBzdHJpbmcsIG5ld1Rlc3REaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG5ld1Rlc3REaXJQYXRoKSkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKG9sZFRlc3REaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGRpcmVudHMubWFwKGFzeW5jIChkaXJlbnQpID0+IHtcbiAgICAgIGNvbnN0IG9sZFBhdGggPSBwYXRoLmpvaW4ob2xkVGVzdERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGNvbnN0IG5ld1BhdGggPSBwYXRoLmpvaW4obmV3VGVzdERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGNvbnN0IG5ld1BhdGhTdGF0ID0gZnMuZXhpc3RzU3luYyhuZXdQYXRoKSA/IGF3YWl0IGZzLnByb21pc2VzLnN0YXQobmV3UGF0aCkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgbmV3UGF0aFN0YXQ/LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgYXdhaXQgbW92ZVRlc3REaXJlY3Rvcnkob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICB9KVxuICApO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ybShvbGRUZXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwZURlZmluaXRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbjogUGFja2FnZUNvbmZpZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBlRGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGliVHlwZURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdAdHlwZXMnKTtcbiAgICBjb25zdCBzcmNUeXBlRGlyUGF0aCA9XG4gICAgICBjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyA/IHVuZGVmaW5lZCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3NyYycsICd0eXBlcycpO1xuXG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnJlYWRkaXIobGliVHlwZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSk7XG4gICAgaWYgKCFkaXJlbnRzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gZGlyZW50Lm5hbWUuc2xpY2UoMCwgLTUpO1xuICAgICAgY29uc3QgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID0gZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5kLnRzJyk7XG4gICAgICBsZXQgcGFja2FnZU5hbWUgPSBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPyBkaXJOYW1lIDogZGlyZW50Lm5hbWU7XG4gICAgICBpZiAocGFja2FnZU5hbWUuaW5jbHVkZXMoJ19fJykpIHtcbiAgICAgICAgcGFja2FnZU5hbWUgPSBgQCR7cGFja2FnZU5hbWUucmVwbGFjZSgnX18nLCAnLycpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNMaWJyYXJ5ID0gY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuLnNvbWUoXG4gICAgICAgIChjb25maWcpID0+XG4gICAgICAgICAgY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICAgICk7XG5cbiAgICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uKSB7XG4gICAgICAgIGlmIChoYXNMaWJyYXJ5KSB7XG4gICAgICAgICAgLy8gTW92ZSBAdHlwZXMvPG5hbWU+L2luZGV4LmQudHMgaWYgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSwgJ2luZGV4LmQudHMnKSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNyY1R5cGVEaXJQYXRoKSB7XG4gICAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+IGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgc3JjVHlwZURpclBhdGggJiYgIWhhc0xpYnJhcnkpIHtcbiAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+LmQudHMgaWYgbm90IGluc3RhbGxlZFxuICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgIGlnbm9yZUVub2VudEFzeW5jKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUoXG4gICAgICAgICAgICAgIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdpbmRleC5kLnRzJyksXG4gICAgICAgICAgICAgIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgYCR7ZGlyZW50Lm5hbWV9LmQudHNgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiB1bmtub3duW10sIHNvdXJjZTogdW5rbm93bltdLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd25bXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QodGFyZ2V0W2luZGV4XSwgb3B0aW9ucykgJiYgaXNNZXJnZWFibGVPYmplY3QoaXRlbSwgb3B0aW9ucykpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlLCBvcHRpb25zKSA/IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWUsIG9wdGlvbnMpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh2YWx1ZSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIHBhY2thZ2UuanNvbi1zdHlsZSBrZXlzIGFyZSBub24tYXJyYXktaW5kZXgga2V5cywgc28gSlNPTi5zdHJpbmdpZnkgcHJlc2VydmVzIHRoaXMgaW5zZXJ0aW9uIG9yZGVyLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHNvcnRLZXlzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBsb2FkL2R1bXAgdXNhZ2UgY2xlYXJlci5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIC8vIEdpdEh1YiBBY3Rpb25zIHRyZWF0cyBgZXZlbnQ6IG51bGxgIGFzIGEgdmFsdWVsZXNzIGV2ZW50IG1hcHBpbmcsIGUuZy5cbiAgLy8gYHB1bGxfcmVxdWVzdDpgLiBgdW5kZWZpbmVkYCB3b3VsZCBvbWl0IHRoZSBldmVudCBlbnRpcmVseSB3aGVuIGR1bXBpbmcgWUFNTC5cbiAgaXNzdWVzPzogVHlwZXMgfCBudWxsO1xuICBwdWxsX3JlcXVlc3Q/OiBQdWxsUmVxdWVzdCB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcyB8IG51bGw7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgJ3J1bnMtb24nPzogc3RyaW5nO1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHN0ZXBzPzogU3RlcFtdO1xuICB1c2VzPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgdXNlcz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBydW4/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnYXV0b2ZpeC5jaScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgIHB1c2g6IHtcbiAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICB9LFxuICB9LFxuICBwZXJtaXNzaW9uczoge1xuICAgIGNvbnRlbnRzOiAncmVhZCcsXG4gIH0sXG4gIGNvbmN1cnJlbmN5OiB7XG4gICAgZ3JvdXA6ICdhdXRvZml4LSR7eyBnaXRodWIuaGVhZF9yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDogeyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9LFxuICB9LFxufTtcblxuY29uc3QgcHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnRml4IGNvZGUgYXV0b21hdGljYWxseScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gIH0sXG4gIGpvYnM6IHtcbiAgICBhdXRvZml4OiB7XG4gICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2F1dG9maXgueW1sQG1haW4nLFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBsaW50ZXIgZml4XG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS90cnVzdGVkLXB1Ymxpc2hlcnMjc3RlcC0yLWNvbmZpZ3VyZS15b3VyLWNpY2Qtd29ya2Zsb3dcbiAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgY29tbWl0aW5nIGNoYW5nZXNcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWNsYXVkZSc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDbGF1ZGUgQ29kZScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1jbGF1ZGUnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY2xhdWRlLWNvZGUnLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIENMQVVERV9DT0RFX09BVVRIX1RPS0VOOiAnJHt7IHNlY3JldHMuQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4gfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWNvZGV4Jzoge1xuICAgIG5hbWU6ICdHZW5lcmF0ZSBQUiB3aXRoIENvZGV4IENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1jb2RleCcpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdjb2RleC1jbGknLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIE9QRU5BSV9BUElfS0VZOiAnJHt7IHNlY3JldHMuT1BFTkFJX0FQSV9LRVkgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWdlbWluaSc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBHZW1pbmkgQ0xJJyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdnZW4tcHInOiB7XG4gICAgICAgIGlmOiBcImNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWFsbCcpIHx8IGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWdlbWluaScpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdnZW1pbmktY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBHRU1JTklfQVBJX0tFWTogJyR7eyBzZWNyZXRzLkdFTUlOSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knIHwgJ2F1dG9maXgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZpZyBvZiBzZW1hbnRpYyBwdWxsIHJlcXVlc3RcbiAgICBjb25zdCBzZW1hbnRpY1ltbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICdzZW1hbnRpYy55bWwnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oc2VtYW50aWNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGZpbGVOYW1lU2V0ID0gbmV3IFNldChbXG4gICAgICAndGVzdC55bWwnLFxuICAgICAgJ2F1dG9maXgueW1sJyxcbiAgICAgICdzZW1hbnRpYy1wci55bWwnLFxuICAgICAgJ2Nsb3NlLWNvbW1lbnQueW1sJyxcbiAgICAgICdnZW4tcHItY2xhdWRlLnltbCcsXG4gICAgICAnZ2VuLXByLWNvZGV4LnltbCcsXG4gICAgICAnZ2VuLXByLWdlbWluaS55bWwnLFxuICAgICAgLi4uZW50cmllcy5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lLmVuZHNXaXRoKCcueW1sJykpLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSksXG4gICAgXSk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdyZWxlYXNlLnltbCcpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocmVwb3NpdG9yeT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVwb3NpdG9yeT8uZW5kc1dpdGgoJy9yZXVzYWJsZS13b3JrZmxvd3MnKSA/PyBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGtpbmQ6IEtub3duS2luZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBgJHtraW5kfS55bWxgKTtcbiAgY29uc3QgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2RlcGxveS1wcm9kdWN0aW9uLnltbCcpKTtcblxuICBpZiAoa2luZCA9PT0gJ2F1dG9maXgnKSB7XG4gICAgYXdhaXQgd3JpdGVZYW1sKGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZyksIGZpbGVQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcblxuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICAvLyBTa2lwIGEgYnJva2VuIHdvcmtmbG93XG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgJiYgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlICYmIGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cykge1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucy5hY3Rpb25zID0gJ3dyaXRlJztcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aCA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGgudHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3cgPSAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJztcbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBub24tcmV1c2FibGUgd29ya2Zsb3dzXG4gICAgaWYgKCFqb2IudXNlcz8uaW5jbHVkZXMoJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIGNvbnRpbnVlO1xuXG4gICAgbm9ybWFsaXplSm9iKGNvbmZpZywgam9iLCBraW5kKTtcbiAgICBpc1JldXNhYmxlV29ya2Zsb3cgPSB0cnVlO1xuICB9XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93KSByZXR1cm47XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zWydpZC10b2tlbiddID0gJ3dyaXRlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uWydpZC10b2tlbiddO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAvLyBEb24ndCB1c2UgYHBhdGhzLWlnbm9yZWAgZm9yIHRlc3QgYmVjYXVzZSBHaXRIdWIncyBCcmFuY2ggUHJvdGVjdGlvbiBhbmQgUnVsZXNldHMgcmVxdWlyZSBqb2IgcnVubmluZy5cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVsbF9yZXF1ZXN0KSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdWxsX3JlcXVlc3RbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXTtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMuZmlsdGVyKChicmFuY2gpID0+IGJyYW5jaCAhPT0gJ3Jlbm92YXRlLyoqJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm8gZGVmYXVsdFxuICB9XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIGpvYi5zZWNyZXRzID8/PSB7fTtcbiAgLy8gVXNlIHRydXN0ZWQgcHVibGlzaGluZyBpbnN0ZWFkIG9mIE5QTV9UT0tFTlxuICBkZWxldGUgam9iLnNlY3JldHMuTlBNX1RPS0VOO1xuXG4gIGlmIChcbiAgICBraW5kID09PSAndGVzdCcgfHxcbiAgICBraW5kID09PSAncmVsZWFzZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNsYXVkZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJ1xuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgLy8gU2V0IHRlc3QtY29tbWFuZCBmb3IgZ2VuLXByIHdvcmtmbG93cyBiYXNlZCBvbiBwYWNrYWdlIG1hbmFnZXJcbiAgaWYgKGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fCBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fCBraW5kID09PSAnZ2VuLXByLWdlbWluaScpIHtcbiAgICBqb2Iud2l0aFsndGVzdC1jb21tYW5kJ10gPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1biBjaGVjay1hbGwtZm9yLWFpJyA6ICd5YXJuIGNoZWNrLWFsbC1mb3ItYWknO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTikge1xuICAgIGpvYi5zZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgICAgam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gcGFyYW1zLnJlcGxhY2UoJ3N5bmMgJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoLmRvdF9lbnZfcGF0aCA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmRvdF9lbnZfcGF0aDtcbiAgfVxuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0cy5GTFlfQVBJX1RPS0VOICYmIHR5cGVvZiBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9IGpvYi53aXRoLmRlcGxveV9jb21tYW5kLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXIgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXI7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogV29ya2Zsb3cge1xuICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NicgfSxcbiAgICB7IHVzZXM6ICdhY3Rpb25zL3NldHVwLW5vZGVAdjYnLCB3aXRoOiB7ICdjaGVjay1sYXRlc3QnOiB0cnVlLCAnbm9kZS12ZXJzaW9uJzogJ2x0cy8qJyB9IH0sXG4gICAgLi4uKGNvbmZpZy5pc0J1biA/IFt7IHVzZXM6ICdvdmVuLXNoL3NldHVwLWJ1bkB2MScsIHdpdGg6IHsgJ2J1bi12ZXJzaW9uJzogJ2xhdGVzdCcgfSB9XSA6IFtdKSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgIH0sXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gY2xlYW51cGAgfSxcbiAgXTtcbiAgaWYgKGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uYnVpbGQpIHtcbiAgICBzdGVwcy5wdXNoKHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGJ1aWxkYCB9KTtcbiAgfVxuICBzdGVwcy5wdXNoKHsgdXNlczogJ2F1dG9maXgtY2kvYWN0aW9uQHYxJyB9KTtcblxuICBjb25zdCBhdXRvZml4V29ya2Zsb3cgPSBzdHJ1Y3R1cmVkQ2xvbmUocHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyk7XG4gIGNvbnN0IGF1dG9maXhKb2IgPSBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID8/IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfTtcbiAgYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA9IHsgLi4uYXV0b2ZpeEpvYiwgc3RlcHMgfTtcbiAgcmV0dXJuIGF1dG9maXhXb3JrZmxvdztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB5YW1sVGV4dCA9IHJlbW92ZVRyYWlsaW5nU3BhY2VzKFxuICAgIHlhbWwuZHVtcChuZXdTZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xLCBub0NvbXBhdE1vZGU6IHRydWUsIHN0eWxlczogeyAnISFudWxsJzogJ2VtcHR5JyB9IH0pXG4gICk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVUcmFpbGluZ1NwYWNlcyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBqcy15YW1sIGVtaXRzIHZhbHVlbGVzcyBHaXRIdWIgQWN0aW9ucyBldmVudHMgYXMgYGV2ZW50OiBgIHdoZW4gdXNpbmcgdGhlIGVtcHR5IG51bGwgc3R5bGUuXG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoL1sgXFx0XSskL2dtLCAnJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndGV4dCcpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnY2YuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oPz1cXHN8JCkvZywgJ2UuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLig/PVxccykvZywgJ2kuZS4nKTtcbn1cblxuZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAoY29tbWVudCkgPT4gZml4VHlwb3NJblRleHQoY29tbWVudCkpXG4gICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KWNcXC5mXFwuL2csICckMS8vJDJjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPyllZ1xcLi9nLCAnJDEvLyQyZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KWllXFwuL2csICckMS8vJDJpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIEFHRU5UU19FWFRSQS5tZCBleGlzdHMgYW5kIHJlYWQgaXRzIGNvbnRlbnRcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBgLS0tXFxuZGVzY3JpcHRpb246IEdlbmVyYWwgQ29kaW5nIFJ1bGVzXFxuZ2xvYnM6XFxuYWx3YXlzQXBwbHk6IHRydWVcXG4tLS1gO1xuICBjb25zdCBib2R5ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKGNvbmZpZywgYWxsQ29uZmlncywgJ0N1cnNvcicsIGV4dHJhQ29udGVudCk7XG4gIHJldHVybiBgJHtmcm9udG1hdHRlcn1cXG5cXG4ke2JvZHl9YDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6IFxcYCR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSB8fCAndW5rbm93bid9XFxgXG4tIERlc2NyaXB0aW9uOiAke3Jvb3RDb25maWcucGFja2FnZUpzb24/LmRlc2NyaXB0aW9ufVxuLSBQYWNrYWdlIE1hbmFnZXI6ICR7cGFja2FnZU1hbmFnZXJ9XG5cbiMjIEdlbmVyYWwgSW5zdHJ1Y3Rpb25zXG5cbi0gQ3JlYXRlIGEgbmV3IGJyYW5jaCBpZiB0aGUgY3VycmVudCBicmFuY2ggaXMgXFxgbWFpblxcYC5cbi0gUnVuIGFueSBcXGBnaXRcXGAgY29tbWFuZHMgc2VxdWVudGlhbGx5LlxuLSBXcml0ZSB0ZXN0cyBPTkxZIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiBJZiByZXF1ZXN0ZWQsIGZvbGxvdyB0aGVzZSBydWxlczpcbiAgLSBDb250aW51ZSBtb2RpZnlpbmcgdGhlIHRlc3RzIGFuZCBjb2RlIHVudGlsIGFsbCB0ZXN0cyBwYXNzLlxuICAtIEVuc3VyZSB0ZXN0cyByZXNldCBhbnkgcmVsYXRlZCBwZXJzaXN0ZW50IGRhdGEsIGFzIG91ciB0ZXN0IGluZnJhc3RydWN0dXJlIGRvZXMgbm90IGNsZWFyIGl0IGF1dG9tYXRpY2FsbHkuXG4gIC0gUHJlZmVyIGFjdHVhbCBBUEkgY2FsbHMgb3ZlciBtb2Nrcy4gVXNlIG1vY2tzIHdoZW4gYWN0dWFsIGNhbGxzIGFyZSBpbXByYWN0aWNhbCwgaGF2ZSB1bmludGVuZGVkIHNpZGUgZWZmZWN0cywgb3IgYXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuLSBXaGVuIGZpeGluZyBpc3N1ZXMsIGZvbGxvdyB0aGVzZSBydWxlczpcbiAgLSBJbnZlc3RpZ2F0ZSB0aGUgcm9vdCBjYXVzZSBmaXJzdCAoZS5nLiwgYnkgZ2F0aGVyaW5nIGRlYnVnIGxvZ3MsIHRha2luZyBzY3JlZW5zaG90cywgZXRjLikuXG4gIC0gRml4IHRoZSBhY3R1YWwgcm9vdCBjYXVzZSBpbnN0ZWFkIG9mIGFwcGx5aW5nIHdvcmthcm91bmRzLlxuLSBBZnRlciBtYWtpbmcgY29kZSBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stYWxsLWZvci1haVxcYCB0byBleGVjdXRlIGFsbCB0ZXN0cyAodGFrZXMgdXAgdG8gMSBob3VyKSwgb3IgXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stZm9yLWFpXFxgIGZvciBvbmx5IHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmcgKHRha2VzIHVwIHRvIDEwIG1pbnV0ZXMpLlxuICAtIElmIHlvdSBhcmUgY29uZmlkZW50IHRoYXQgeW91ciBjaGFuZ2VzIHdpbGwgbm90IGJyZWFrIGFueSB0ZXN0cywgeW91IG1heSB1c2UgXFxgY2hlY2stZm9yLWFpXFxgLlxuICAtIFVzZSBcXGBveGxpbnRcXGAgaWdub3JlIGNvbW1lbnRzIHdpdGggcmVhc29ucyAoZS5nLiwgXFxgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUgLS0tIDxyZWFzb24+XFxgKSBpZiBsaW50IGVycm9ycyBvciB3YXJuaW5ncyBjYW5ub3QgYmUgZml4ZWQuXG4tIE9uY2UgeW91IGhhdmUgdmVyaWZpZWQgeW91ciBjaGFuZ2VzLCBjb21taXQgYW5kIHB1c2ggdGhlbSB0byB0aGUgY3VycmVudCAobm9uLW1haW4pIGJyYW5jaCwgdGhlbiBjcmVhdGUgYSBQUiB2aWEgXFxgZ2hcXGAuXG4gIC0gRm9sbG93IHRoZSBjb252ZW50aW9uYWwgY29tbWl0czsgeW91ciBjb21taXQgbWVzc2FnZSBzaG91bGQgc3RhcnQgd2l0aCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgZXRjLlxuICAtIElmIG5vdCBzcGVjaWZpZWQsIG1ha2Ugc3VyZSB0byBhZGQgYSBuZXcgbGluZSBhdCB0aGUgZW5kIG9mIHlvdXIgY29tbWl0IG1lc3NhZ2Uke3Jvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8gPyBgIHdpdGg6IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgYCA6ICcnfS5cbiAgLSBBbHdheXMgY3JlYXRlIG5ldyBjb21taXRzLiBBdm9pZCB1c2luZyBcXGAtLWFtZW5kXFxgLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmhhc1N0YXJ0VGVzdFNlcnZlcilcbiAgICA/IGAtIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gc3RhcnQtdGVzdC1zZXJ2ZXJcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJydcbn1cblxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBoYXNOZXdTZWN0aW9uID0gZXh0cmFDb250ZW50Py50cmltKCkuc3RhcnRzV2l0aCgnIycpO1xuICBjb25zdCBub3JtYWxpemVkRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50XG4gICAgPyBoYXNOZXdTZWN0aW9uXG4gICAgICA/ICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKVxuICAgICAgOiAnXFxuJyArIGV4dHJhQ29udGVudFxuICAgIDogJyc7XG4gIHJldHVybiBiYXNlQ29udGVudCArIG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gS2VlcCB0b3AtZG93biBvcmRlcmluZyBndWlkYW5jZSBmdW5jdGlvbi1vbmx5IGJlY2F1c2UgY2xhc3NlcyBhcmUgbm90IGhvaXN0ZWQgYW5kIGNhbiBmYWlsIHdoZW4gaW5oZXJpdGFuY2Ugb3IgdG9wLWxldmVsIGluc3RhbnRpYXRpb24gZGVwZW5kcyBvbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAgcmV0dXJuIGBcbiMjIENvZGluZyBTdHlsZVxuXG4tIFVzZSBjYW1lbENhc2UgZm9yIEphdmFTY3JpcHQgYW5kIFR5cGVTY3JpcHQgZmlsZXMgKG9yIFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMpLlxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBlYWNoIG1vZHVsZSB3aXRoIGhpZ2ggY29oZXNpb24sIGdyb3VwaW5nIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSB0b2dldGhlci5cbiAgLSBSZWZhY3RvciBleGlzdGluZyBsYXJnZSBtb2R1bGVzIGludG8gc21hbGxlciwgZm9jdXNlZCBtb2R1bGVzIHdoZW4gbmVjZXNzYXJ5LlxuICAtIENyZWF0ZSB3ZWxsLW9yZ2FuaXplZCBkaXJlY3Rvcnkgc3RydWN0dXJlcyB3aXRoIGxvdyBjb3VwbGluZyBhbmQgaGlnaCBjb2hlc2lvbi5cbi0gUGxhY2UgY2FsbGluZyBmdW5jdGlvbnMgaW4gdGhlIGZpbGUgYWJvdmUgdGhlIGZ1bmN0aW9ucyB0aGV5IGNhbGwgdG8gbWFpbnRhaW4gYSBjbGVhciB0b3AtZG93biBvcmRlci5cbiAgLSBlLmcuIFxcYGZ1bmN0aW9uIGNhbGxlcigpIHsgY2FsbGVlKCk7IH0gZnVuY3Rpb24gY2FsbGVlKCkgeyAuLi4gfVxcYFxuLSBXcml0ZSBjb21tZW50cyB0aGF0IGV4cGxhaW4gXCJ3aHlcIiByYXRoZXIgdGhhbiBcIndoYXRcIi4gQXZvaWQgc3RhdGluZyB3aGF0IGNhbiBiZSB1bmRlcnN0b29kIGZyb20gdGhlIGNvZGUgaXRzZWxmLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgZXhwbGljaXRseSByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gUHJlZmVyIHVzaW5nIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgZm9yIHByb21wdHMgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgd2l0aCBhbiBhcnJheSBvZiBzdHJpbmdzLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGludHJvZHVjaW5nIG5ldyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgdXBkYXRlIHRoZSBsYW5ndWFnZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUgXFxgaTE4blxcYCBkaXJlY3RvcnkgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkuIFJlZmVyZW5jZSB0aGVzZSBzdHJpbmdzIHVzaW5nIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkuIEZvciBleGFtcGxlLCB1c2UgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIGZvciBzdG9yaW5nIGFuIGFycmF5IG9yIGFuIG9iamVjdCB0byBcXGB1c2VTdGF0ZVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYFxuLSBTaW5jZSB0aGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgXFxgdXNlQ2FsbGJhY2tcXGAgb3IgXFxgdXNlTWVtb1xcYCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxuLSBBc3N1bWUgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuXG5gXG4gICAgOiAnJ1xufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3Ntb2wtdG9tbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIEJ1bmZpZ1RvbWwge1xuICBpbnN0YWxsPzoge1xuICAgIGV4YWN0PzogYm9vbGVhbjtcbiAgfTtcbiAgcnVuPzoge1xuICAgIGJ1bj86IGJvb2xlYW47XG4gIH07XG59XG5cbmNvbnN0IG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gIC8vIC0tLS0tLS0tLS0gV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuICAnQGV4ZXJjb2RlL3Byb2JsZW0tdXRpbHMnLFxuICAnQHdpbGxib29zdGVyL2FnZW50LXNraWxscycsXG4gICdAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlncycsXG4gICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYicsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZScsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvd2InLFxuICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAnb25lLXdheS1naXQtc3luYycsXG4gIC8vIHdiZnkgcGlucyB0aGVzZSB0b29saW5nIHBhY2thZ2VzIGFuZCBtYXkgYXBwbHkgdGhlbSBpbW1lZGlhdGVseSBhZnRlciBhXG4gIC8vIHJlbGVhc2UsIGJlZm9yZSB0aGUgZ2xvYmFsIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93IGhhcyBlbGFwc2VkLlxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctZGFyd2luLWFybTY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWRhcndpbi14NjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctbGludXgtYXJtJyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWxpbnV4LWFybTY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWxpbnV4LXg2NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy13aW4zMi1hcm02NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy13aW4zMi14NjQnLFxuICAnb3hmbXQnLFxuICAnQG94Zm10L2JpbmRpbmctYW5kcm9pZC1hcm0tZWFiaScsXG4gICdAb3hmbXQvYmluZGluZy1hbmRyb2lkLWFybTY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWRhcndpbi1hcm02NCcsXG4gICdAb3hmbXQvYmluZGluZy1kYXJ3aW4teDY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWZyZWVic2QteDY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtLW11c2xlYWJpaGYnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtNjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtcHBjNjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtbXVzbCcsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1zMzkweC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgteDY0LWdudScsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAb3hmbXQvYmluZGluZy1vcGVuaGFybW9ueS1hcm02NCcsXG4gICdAb3hmbXQvYmluZGluZy13aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ0BveGZtdC9iaW5kaW5nLXdpbjMyLWlhMzItbXN2YycsXG4gICdAb3hmbXQvYmluZGluZy13aW4zMi14NjQtbXN2YycsXG4gICdveGxpbnQnLFxuICAnQG94bGludC9iaW5kaW5nLWFuZHJvaWQtYXJtLWVhYmknLFxuICAnQG94bGludC9iaW5kaW5nLWFuZHJvaWQtYXJtNjQnLFxuICAnQG94bGludC9iaW5kaW5nLWRhcndpbi1hcm02NCcsXG4gICdAb3hsaW50L2JpbmRpbmctZGFyd2luLXg2NCcsXG4gICdAb3hsaW50L2JpbmRpbmctZnJlZWJzZC14NjQnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybS1tdXNsZWFiaWhmJyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1hcm02NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXBwYzY0LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtcmlzY3Y2NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtbXVzbCcsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtczM5MHgtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC14NjQtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAb3hsaW50L2JpbmRpbmctb3Blbmhhcm1vbnktYXJtNjQnLFxuICAnQG94bGludC9iaW5kaW5nLXdpbjMyLWFybTY0LW1zdmMnLFxuICAnQG94bGludC9iaW5kaW5nLXdpbjMyLWlhMzItbXN2YycsXG4gICdAb3hsaW50L2JpbmRpbmctd2luMzIteDY0LW1zdmMnLFxuICAnb3hsaW50LXRzZ29saW50JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvZGFyd2luLWFybTY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvZGFyd2luLXg2NCcsXG4gICdAb3hsaW50LXRzZ29saW50L2xpbnV4LWFybTY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvbGludXgteDY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvd2luMzItYXJtNjQnLFxuICAnQG94bGludC10c2dvbGludC93aW4zMi14NjQnLFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgJ0BuZXh0L2VudicsXG4gICdAbmV4dC9mb250JyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LWFybTY0LWdudScsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC1hcm02NC1tdXNsJyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LXg2NC1nbnUnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgteDY0LW11c2wnLFxuICAnQG5leHQvc3djLWFuZHJvaWQtYXJtLWVhYmknLFxuICAnQG5leHQvc3djLWFuZHJvaWQtYXJtNjQnLFxuICAnQG5leHQvc3djLWRhcndpbi1hcm02NCcsXG4gICdAbmV4dC9zd2MtZGFyd2luLXg2NCcsXG4gICdAbmV4dC9zd2MtZnJlZWJzZC14NjQnLFxuICAnQG5leHQvc3djLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG5leHQvc3djLWxpbnV4LWFybTY0LWdudScsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtNjQtbXVzbCcsXG4gICdAbmV4dC9zd2MtbGludXgteDY0LWdudScsXG4gICdAbmV4dC9zd2MtbGludXgteDY0LW11c2wnLFxuICAnQG5leHQvc3djLXdhc20tbm9kZWpzJyxcbiAgJ0BuZXh0L3N3Yy13YXNtLXdlYicsXG4gICdAbmV4dC90aGlyZC1wYXJ0aWVzJyxcbiAgJ25leHQnLFxuICAncmVhY3QnLFxuICAncmVhY3QtZG9tJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJ1bmZpZ1RvbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCdW5maWdUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250ZW50ID0gbmV3Q29udGVudChleGlzdGluZ0NvbnRlbnQpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBuZXdDb250ZW50ID0gKGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcbiAgY29uc3QgYnVuZmlnVG9tbCA9IHBhcnNlQnVuZmlnVG9tbChleGlzdGluZ0NvbnRlbnQpO1xuICByZXR1cm4gYGVudiA9IGZhbHNlXG50ZWxlbWV0cnkgPSBmYWxzZVxuXG4ke2dlbmVyYXRlUnVuU2VjdGlvbihidW5maWdUb21sKX1cbltpbnN0YWxsXVxuZXhhY3QgPSAke2J1bmZpZ1RvbWw/Lmluc3RhbGw/LmV4YWN0ID09PSBmYWxzZSA/ICdmYWxzZScgOiAndHJ1ZSd9XG5saW5rZXIgPSBcImhvaXN0ZWRcIlxubWluaW11bVJlbGVhc2VBZ2UgPSA0MzIwMDAgIyA1IGRheXNcbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4ke21pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMubWFwKChwYWNrYWdlTmFtZSkgPT4gYCAgICBcIiR7cGFja2FnZU5hbWV9XCIsYCkuam9pbignXFxuJyl9XG5dXG5gO1xufTtcblxuZnVuY3Rpb24gcGFyc2VCdW5maWdUb21sKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlKGNvbnRlbnQpIGFzIEJ1bmZpZ1RvbWw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVSdW5TZWN0aW9uKGJ1bmZpZ1RvbWw6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIGJ1bmZpZ1RvbWw/LnJ1bj8uYnVuID09PSAnYm9vbGVhbicgPyBgW3J1bl1cXG5idW4gPSAke2J1bmZpZ1RvbWwucnVuLmJ1bn1cXG5gIDogJyc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGXjgafjga9ub2RlX21vZHVsZXPjgpJDT1BZ44GZ44KL5b+F6KaB44GM44GC44KL44Gf44KB44CBbm9kZV9tb2R1bGVz44KS6Zmk5aSW44GX44Gm44Gv44GE44GR44Gq44GE44CCXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuKiovLmlkZWFcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IHtcbiAgY29kZVdpdGgySW5kZW50U2l6ZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjcHAnLFxuICAgICdkYXJ0JyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3B1JyxcbiAgICAncHVtbCcsXG4gICAgJ3JiJyxcbiAgICAndnVlJyxcbiAgICAneG1sJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ3NoJyxcbiAgXS50b1NvcnRlZCgpLFxuICBjb2RlV2l0aDRJbmRlbnRTaXplOiBbJ2dvJywgJ2dyYWRsZScsICdqYXZhJywgJ3B5J10udG9Tb3J0ZWQoKSxcbiAgbWFya2Rvd25MaWtlOiBbJ21kJ10udG9Tb3J0ZWQoKSxcbiAgb3hsaW50OiBbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXS50b1NvcnRlZCgpLFxuICBveGZtdDogW1xuICAgICdhc3RybycsXG4gICAgJ2NqcycsXG4gICAgJ2NzcycsXG4gICAgJ2N0cycsXG4gICAgJ2dxbCcsXG4gICAgJ2dyYXBocWwnLFxuICAgICdoYnMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnanMnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2pzeCcsXG4gICAgJ2xlc3MnLFxuICAgICdtZCcsXG4gICAgJ21keCcsXG4gICAgJ21qcycsXG4gICAgJ210cycsXG4gICAgJ3Njc3MnLFxuICAgICdzdmVsdGUnLFxuICAgICd0b21sJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICd2dWUnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS50b1NvcnRlZCgpLFxuICBwcmV0dGllck9ubHk6IFsnamF2YSddLnRvU29ydGVkKCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcblxuICAgIGxldCBuZXdDb25maWc6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShkZWZhdWx0Q29uZmlnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGNvbmZpZ0ZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld0NvbmZpZyA9IG1lcmdlLmFsbChbbmV3Q29uZmlnLCBvbGRDb25maWcsIG5ld0NvbmZpZ10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nIC0gZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIHBhcnNlZFxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbC5kdW1wKG5ld0NvbmZpZywge1xuICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHJldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb24gPSBjb25maWcuaXNQdWJsaWNSZXBvXG4gICAgICA/ICdSZXZpZXcgaW4gRW5nbGlzaCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNvZGluZyBzdGFuZGFyZHMuJ1xuICAgICAgOiAn5Lul5LiL44Gu44Kz44O844OH44Kj44Oz44Kw6KaP57SE44KS6LiP44G+44GI44Gm44CB5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCJztcbiAgICBjb25zdCBzdHlsZWd1aWRlQ29udGVudCA9IGAke3Jldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb259XFxuXFxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9JHtcbiAgICAgIGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPyBgXFxuJHtjb2RpbmdSdWxlRXh0cmFDb250ZW50LnRyaW1FbmQoKX1gIDogJydcbiAgICB9YDtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSksXG4gICAgXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VtaW5pU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRG8gbm90IHJlbW92ZSBgd2luZG93c2A6IGdlbmVyYXRlZCAuZ2l0aWdub3JlIGZpbGVzIG11c3Qga2VlcCBpZ25vcmluZyBXaW5kb3dzLWNyZWF0ZWQgbG9jYWwgYXJ0aWZhY3RzLlxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4hLmtlZXBcbi5haWRlcipcbi5lbnYucHJvZHVjdGlvblxuKi9tb3VudC8qLmhhc2hcbi5kZXZjb250YWluZXIvXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90Lipcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLnBsYXl3cmlnaHQtY2xpL1xuLnNlcmVuYS9cbi50bXAvXG5fX2dlbmVyYXRlZF9fL1xuQHdpbGxib29zdGVyL1xuZGlzdC9cbnRlbXAvXG50bXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnlcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBveGxpbnRDb250ZW50KSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cblxuY29uc3Qgb3hsaW50Q29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5veGZtdC5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ25vZGUnLCAnbm9kZV9tb2R1bGVzLy5iaW4vb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJywgJ094Zm10JywgZXh0KSkuam9pbignJyl9XG4ke2V4dGVuc2lvbnMucHJldHRpZXJPbmx5Lm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnLCAnUHJldHRpZXInLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuIiwiaW1wb3J0IHR5cGUgeyBTcGF3blN5bmNPcHRpb25zIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZCwgYXJncywgY3dkLCByZXRyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IG51bWJlciB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBjb25zdCBzdGF0dXMgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgaWYgKHN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gICAgaWYgKHJldHJ5IDw9IDApIHJldHVybiBzdGF0dXM7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZGVyciBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZGVyciA9IHByb2Muc3RkZXJyID8/ICcnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnID8gc3RkZXJyLnRyaW0oKSA6IHN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBmYWlsZWQgd2l0aDogJHtwcm9jLmVycm9yLm1lc3NhZ2V9YCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3Rkb3V0IG9uIEVOT0VOVC5cbiAgY29uc3Qgc3Rkb3V0ID0gcHJvYy5zdGRvdXQgPz8gJyc7XG4gIHJldHVybiB0eXBlb2Ygc3Rkb3V0ID09PSAnc3RyaW5nJyA/IHN0ZG91dC50cmltKCkgOiBzdGRvdXQudG9TdHJpbmcoKS50cmltKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICAvLyBSZW1vdmUgYmVycnkgZnJvbSBQQVRIXG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEguc3BsaXQoJzonKVxuICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gZW52LkJFUlJZX0JJTl9GT0xERVIpXG4gICAgICAuam9pbignOicpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUjtcbiAgfVxuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUI7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU5cbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcblxuY29uc3Qgb3hsaW50RGVwcyA9IFsnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsICdveGZtdCcsICdveGxpbnQnLCAnb3hsaW50LXRzZ29saW50J107XG5jb25zdCB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID0gJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JztcbmNvbnN0IG9ic29sZXRlTGludERlcGVuZGVuY2llcyA9IFtcbiAgJ0BiaW9tZWpzL2Jpb21lJyxcbiAgJ0Blc2xpbnQtcmVhY3QvZXNsaW50LXBsdWdpbicsXG4gICdAZXNsaW50L2pzJyxcbiAgJ0BuZXh0L2VzbGludC1wbHVnaW4tbmV4dCcsXG4gICdAdHlwZXMvZXNsaW50JyxcbiAgJ0B0eXBlcy9taWNyb21hdGNoJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInLFxuICAnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnLFxuICAnYmlvbWUnLFxuICAnZXNsaW50JyxcbiAgJ2VzbGludC1jb25maWctZmxhdC1naXRpZ25vcmUnLFxuICAnZXNsaW50LWNvbmZpZy1wcmV0dGllcicsXG4gICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLW5vZGUnLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0JyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0JyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAnZXNsaW50LXBsdWdpbi1wZXJmZWN0aW9uaXN0JyxcbiAgJ2VzbGludC1wbHVnaW4tcHJldHRpZXInLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdC1jb21waWxlcicsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtY2xhc3MtbWVtYmVycycsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtZGVzdHJ1Y3R1cmUta2V5cycsXG4gICdlc2xpbnQtcGx1Z2luLXN0b3J5Ym9vaycsXG4gICdlc2xpbnQtcGx1Z2luLXVuaWNvcm4nLFxuICAnZXNsaW50LXBsdWdpbi11bnVzZWQtaW1wb3J0cycsXG4gICdnbG9iYWxzJyxcbiAgJ21pY3JvbWF0Y2gnLFxuICAndHlwZXNjcmlwdC1lc2xpbnQnLFxuXTtcblxuY29uc3QgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbnR5cGUgV3JpdGFibGVQYWNrYWdlSnNvbiA9IFNldFJlcXVpcmVkPFxuICBQYWNrYWdlSnNvbixcbiAgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJ1xuPjtcblxuaW50ZXJmYWNlIERlcGVuZGVuY3lVcGRhdGVzIHtcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgZGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uT2JqID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoanNvbk9iaiwgY29uZmlnLmRpclBhdGgpO1xuICBhd2FpdCB1cGRhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iaiwgcGFja2FnZU1hbmFnZXIpO1xuICBjb25zdCBkZXBlbmRlbmN5VXBkYXRlcyA9IGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oanNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG4gIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpKSk7XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhjb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzLCBwYWNrYWdlTWFuYWdlcik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFdyaXRhYmxlUGFja2FnZUpzb24+IHtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgcmV0dXJuIGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybidcbik6IFByb21pc2U8dm9pZD4ge1xuICByZW1vdmVMZWdhY3lJbnN0YWxsQ29tbWFuZHMoanNvbk9iai5zY3JpcHRzKTtcblxuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xuICBhZGRTdGFydFRlc3RTZXJ2ZXJTY3JpcHRJZk5lZWRlZChjb25maWcsIGpzb25PYmopO1xuICBhZGRJbnN0YWxsU3RlcFRvQ2hlY2tGb3JBaShqc29uT2JqLnNjcmlwdHMsIHBhY2thZ2VNYW5hZ2VyKTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeTtcbiAgfSBlbHNlIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucHJldHRpZnkgPSAoanNvbk9iai5zY3JpcHRzLnByZXR0aWZ5ID8/ICcnKSArIChhd2FpdCBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGNvbmZpZy5kaXJQYXRoKSk7XG4gIH1cbiAgbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKGpzb25PYmouc2NyaXB0cyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgIC8vIEZyZXNoIHJlcG9zIHN0aWxsIHJlcXVpcmUgc3RhbmRhbG9uZSBgeWFybiBpbnN0YWxsYDsgb25seSByZW1vdmUgbGVnYWN5IGluc3RhbGwgcHJlZml4ZXMgYmVmb3JlIGFub3RoZXIgY29tbWFuZC5cbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbCgveWFyblxccyooPzppbnN0YWxsXFxzKik/JiZcXHMqL2d1LCAnJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEluc3RhbGxTdGVwVG9DaGVja0ZvckFpKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyk6IHZvaWQge1xuICBpZiAoISgnY2hlY2stZm9yLWFpJyBpbiBzY3JpcHRzKSkgcmV0dXJuO1xuXG4gIGlmICgnZ2VuLWNvZGUnIGluIHNjcmlwdHMpIHtcbiAgICBzY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZSA+IC9kZXYvbnVsbCAmJiAke3NjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG4gIH1cbiAgc2NyaXB0c1snY2hlY2stZm9yLWFpJ10gPSBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbCA+IC9kZXYvbnVsbCAmJiAke3NjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbChcbiAgICAgIC95YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCg/IVxccysoPzotQXwtUnwtLSg/OmFsbHxyZWN1cnNpdmV8c2luY2V8d29ya3RyZWV8ZnJvbXxpbmNsdWRlfGV4Y2x1ZGV8cHVibGljfHByaXZhdGUpKSkvZ3UsXG4gICAgICAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogRGVwZW5kZW5jeVVwZGF0ZXMge1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IFsncHJldHRpZXInLCAnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG5cbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICBkZWxldGUgKGpzb25PYmogYXMgUGFja2FnZUpzb24gJiB7ICdsaW50LXN0YWdlZCc/OiB1bmtub3duIH0pWydsaW50LXN0YWdlZCddO1xuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmh1c2t5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby5cbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKVxuICAgICAgICA/IG1lcmdlLmFsbChbanNvbk9iai53b3Jrc3BhY2VzLCBbJ3BhY2thZ2VzLyonXV0sIHtcbiAgICAgICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFsncGFja2FnZXMvKiddO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy53YiB8fCBjb25maWcuaXNCdW4pIHtcbiAgICBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKC93YlxccytkYi9ndSwgJ3diIHByaXNtYScpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4ub3hsaW50RGVwcyk7XG4gIH1cblxuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLmdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpKTtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdEdvRGVwZW5kZW5jeSk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL25vZGUnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ3RzLWplc3QnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICAgICkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9qZXN0Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIHJldHVybiB7XG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIGRldkRlcGVuZGVuY2llczogZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gWWFybiB0cmVhdHMgdGhlIGxlZ2FjeSBucG0vY2hhbGsgcmVzb2x1dGlvbiBhbGlhcyBhcyBhbiBpbnZhbGlkIHBhY2thZ2UgdG9rZW4uXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBbJ2NsZWFudXAnLCAnY2hlY2stZm9yLWFpJ10pIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgICAgICAgaWYgKCFzY3JpcHQpIGNvbnRpbnVlO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXSA9IHNjcmlwdC5yZXBsYWNlKC8gPyYmID95YXJuIGxpbnQtZml4KD86IC0tcXVpZXQpPy8sICcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0ganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID8/ICd5YXJuIGxpbnQgLS1maXgnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGRhcnQgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IChqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID8/ICcnKSArIGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgcG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgcG9ldHJ5IHJ1biBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IChqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID8/ICcnKSArIGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICAgIGRlcGVuZGVuY3lVcGRhdGVzLnBvZXRyeURldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnkgfHwganNvbk9iai5yZXBvc2l0b3J5KSB7XG4gICAganNvbk9iai5yZXBvc2l0b3J5ID0gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKGNvbmZpZy5yZXBvc2l0b3J5ID8/IGpzb25PYmoucmVwb3NpdG9yeSwganNvbk9iai5yZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ2JsaXR6IGNvZGVnZW4nKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ2JsaXR6IGNvZGVnZW4nO1xuICAgIH0gZWxzZSBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5pbmNsdWRlcygnYmxpdHogcHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5yZXBsYWNlKFxuICAgICAgICAnYmxpdHogY29kZWdlbicsXG4gICAgICAgICdibGl0eiBjb2RlZ2VuICYmIGJsaXR6IHByaXNtYSBnZW5lcmF0ZSdcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hICYmICFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ3ByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ3ByaXNtYSBnZW5lcmF0ZSc7XG4gIH1cblxuICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzLnByZXR0aWVyKSB7XG4gICAgLy8gQmVjYXVzZSBAdHlwZXMvcHJldHRpZXIgYmxvY2tzIHByZXR0aWVyIGV4ZWN1dGlvbi5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9wcmV0dGllciddO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbiwgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLCBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMpO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBdKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsXG4gICAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3QpIHtcbiAgICBjb25zdCBzZWN0aW9uID0ganNvbk9ialtrZXldO1xuICAgIGlmIChzZWN0aW9uICYmIE9iamVjdC5rZXlzKHNlY3Rpb24pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqLCBrZXkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlcyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nXG4pOiB2b2lkIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHBhY2thZ2VNYW5hZ2VyLCBkZXBlbmRlbmNpZXMsIGZhbHNlKTtcblxuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGRldkRlcGVuZGVuY2llcywgdHJ1ZSk7XG5cbiAgaWYgKGRlcGVuZGVuY3lVcGRhdGVzLnBvZXRyeURldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLm5ldyBTZXQoZGVwZW5kZW5jeVVwZGF0ZXMucG9ldHJ5RGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyxcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgZGV2OiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IFsuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksICctLWV4YWN0JywgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSW50ZW50aW9uYWxseSBvbWl0IHZlcnNpb25zIHRvIHVwZGF0ZSBkZXBlbmRlbmNpZXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9ucyB3aXRoIFlhcm4uXG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXBlbmRlbmNpZXNUb0luc3RhbGw6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBuZXcgU2V0KGRlcGVuZGVuY2llcykpIHtcbiAgICBjb25zdCBzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgPSBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICAgICAgZGVwZW5kZW5jeSxcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5KSB7XG4gICAgICBkZXBlbmRlbmNpZXNUb0luc3RhbGwucHVzaChkZXBlbmRlbmN5KTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gJiZcbiAgICAgICFzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgJiZcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICE9PSAnKidcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmNpZXNUb0luc3RhbGw7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhY2hlZFZlcnNpb24gPSBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLmdldChkZXBlbmRlbmN5KTtcbiAgaWYgKGNhY2hlZFZlcnNpb24pIHJldHVybiBjYWNoZWRWZXJzaW9uO1xuXG4gIGNvbnN0IHZlcnNpb24gPVxuICAgIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgZGVwZW5kZW5jeSwgJ3ZlcnNpb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sIHByb2Nlc3MuY3dkKCkpIHx8ICcqJztcbiAgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5zZXQoZGVwZW5kZW5jeSwgdmVyc2lvbik7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG4vLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBtaWdyYXRpb24gY29kZSBpbiBmdXR1cmVcbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+LFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoanNvbk9iai5hdXRob3IgPT09ICdXaWxsQm9vc3RlciBMTEMnKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1hbGwtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjay93YXJuJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpnZW4tY29kZSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Y29kZWdlbiddO1xuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMudHNsaWI7XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci90c2NvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMudHlwZXNjcmlwdDtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmxlcm5hO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGllcjtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stYWxsJ107XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2xlcm5hLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgcmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKGpzb25PYmopO1xufVxuXG5mdW5jdGlvbiByZW1vdmVPYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMoXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPlxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBvYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShkZXBlbmRlbmN5OiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFjdXJyZW50VmVyc2lvbikgcmV0dXJuIHRydWU7XG4gIGlmIChjdXJyZW50VmVyc2lvbiA9PT0gJyonKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIChcbiAgICBkZXBlbmRlbmN5ID09PSAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnIHx8IGRlcGVuZGVuY3kgPT09ICdveGxpbnQnIHx8IGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3lcbiAgKTtcbn1cblxuZnVuY3Rpb24gYWRkU3RhcnRUZXN0U2VydmVyU2NyaXB0SWZOZWVkZWQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QgfHwgIWNvbmZpZy5kZXBlbmRpbmcud2IgfHwganNvbk9iai5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3Qtc2VydmVyJ10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPz89IHt9O1xuICBqc29uT2JqLnNjcmlwdHNbJ3N0YXJ0LXRlc3Qtc2VydmVyJ10gPSAnd2Igc3RhcnQgLS1tb2RlIHRlc3QnO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ2J1biBydW4gY2hlY2stZm9yLWFpICYmIGJ1biBydW4gdGVzdCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogJ2J1biBydW4gY2xlYW51cCcsXG4gICAgICBjbGVhbnVwOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIC0tYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biAtLWJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgfTtcbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG4gICAgY29uc3Qgb2xkVGVzdCA9IG9sZFNjcmlwdHMudGVzdDtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ3lhcm4gY2hlY2stZm9yLWFpICYmIHlhcm4gdGVzdCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogYHlhcm4gZm9ybWF0ID4gL2Rldi9udWxsIDI+IC9kZXYvbnVsbCB8fCB0cnVlICYmIHlhcm4gbGludC1maXggLS1xdWlldGAsXG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIGZvcm1hdC1jb2RlICYmIHlhcm4gcHJldHRpZnlgLFxuICAgICAgbGludDogYG94bGludCAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC5gLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICAnZm9ybWF0LWNvZGUnOiBgb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC5gLFxuICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyT25seS5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgLFxuICAgICAgdHlwZWNoZWNrOiAndHNnbyAtLW5vRW1pdCcsXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBzY3JpcHRzID0gbWVyZ2UoXG4gICAgICAgIHsgLi4uc2NyaXB0cyB9LFxuICAgICAgICB7XG4gICAgICAgICAgZm9ybWF0OiBgc29ydC1wYWNrYWdlLWpzb24gJiYgeWFybiBmb3JtYXQtY29kZSAmJiB5YXJuIHByZXR0aWZ5ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyT25seS5qb2luKFxuICAgICAgICAgICAgJywnXG4gICAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLlxuICAgICAgICAgIC8vIEZPUkNFX0NPTE9SPTMgbWFrZSB3YiBlbmFibGUgY29sb3Igb3V0cHV0LlxuICAgICAgICAgIHRlc3Q6ICdDST0xIEZPUkNFX0NPTE9SPTMgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgIH1cbiAgICBpZiAoIWhhc0pzT3JUcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ107XG4gICAgICBzY3JpcHRzLmZvcm1hdCA9ICdzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5JztcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLmxpbnQ7XG4gICAgICBkZWxldGUgc2NyaXB0c1snbGludC1maXgnXTtcbiAgICB9XG4gICAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gJ3diIHR5cGVjaGVjayc7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBgJHtsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyl9IHx8IHRydWVgO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2F1dGgnLCByZXBvOiAnYXV0aCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQGRpc2NvcmQtYm90L3NoYXJlZCcsIHJlcG86ICdkaXNjb3JkLWJvdCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCByZXBvOiAnY29kZS1hbmFseXplcicsIHRhcmdldDogJ2RldkRlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2p1ZGdlJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IHBhY2thZ2VOYW1lLCByZXBvLCB0YXJnZXQgfSkgPT4ge1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSB8fCBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgcGFja2FnZU5hbWUpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gdGFyZ2V0ID09PSAnZGVwZW5kZW5jaWVzJyA/ICdkZXZEZXBlbmRlbmNpZXMnIDogJ2RlcGVuZGVuY2llcyc7XG4gICAgICAvLyBUaGUgbGludCBydWxlIGRpc2FsbG93cyBgZGVsZXRlYCB3aXRoIGNvbXB1dGVkIHBhY2thZ2UgbmFtZXM7IFJlZmxlY3QgaGFzIHRoZSBzYW1lIGRlbGV0aW9uIHNlbWFudGljcyBoZXJlLlxuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqW290aGVyVGFyZ2V0XSwgcGFja2FnZU5hbWUpO1xuICAgICAganNvbk9ialt0YXJnZXRdW3BhY2thZ2VOYW1lXSA9IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiLyR7cmVwb30uZ2l0IyR7Y29tbWl0SGFzaH1gO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvYnVuL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvcmVhY3QtbmF0aXZlL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9ub2RlLWx0cy90c2NvbmZpZy5qc29uJywgJ0B0c2NvbmZpZy9ub2RlLXRzL3RzY29uZmlnLmpzb24nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzJywgJ0B0c2NvbmZpZy9ub2RlLXRzJ107XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmdhbml6YXRpb246IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvVXJsID0gYGdpdEBnaXRodWIuY29tOiR7b3JnYW5pemF0aW9ufS8ke3JlcG99LmdpdGA7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdnaXQnLCBbJ2xzLXJlbW90ZScsIHJlcG9VcmwsICdIRUFEJ10sIHByb2Nlc3MuY3dkKCkpO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBvdXRwdXQuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoIWNvbW1pdEhhc2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb21taXRIYXNoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0cyBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb306ICR7U3RyaW5nKGVycm9yKX1gKSk7XG4gIH1cbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5pbnRlcmZhY2UgTGVmdGhvb2tTZXR0aW5ncyB7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdwcmVwYXJlLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJztcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgY29tbWFuZHM6IHtcbiAgICAgIGNsZWFudXA6IHtcbiAgICAgICAgZ2xvYjogc3RyaW5nO1xuICAgICAgICBydW46IHN0cmluZztcbiAgICAgIH07XG4gICAgICAnY2hlY2stbWlncmF0aW9ucyc6IHtcbiAgICAgICAgZ2xvYjogc3RyaW5nO1xuICAgICAgICBydW46IHN0cmluZztcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbiAgJ3ByZS1wdXNoJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdjaGVjay5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCc7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG59XG5cbmNvbnN0IGJhc2VTZXR0aW5nczogT21pdDxMZWZ0aG9va1NldHRpbmdzLCAncHJlLWNvbW1pdCc+ID0ge1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAncHJlcGFyZS5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAnY2hlY2suc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3QgcHJlQ29tbWl0U2V0dGluZ3M6IExlZnRob29rU2V0dGluZ3NbJ3ByZS1jb21taXQnXSA9IHtcbiAgY29tbWFuZHM6IHtcbiAgICBjbGVhbnVwOiB7XG4gICAgICBnbG9iOiAnJyxcbiAgICAgIHJ1bjogJycsXG4gICAgfSxcbiAgICAnY2hlY2stbWlncmF0aW9ucyc6IHtcbiAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgIHJ1bjogYFxuaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyB7c3RhZ2VkX2ZpbGVzfTsgdGhlblxuICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlcyAoe3N0YWdlZF9maWxlc30pIGNvbnRhaW4gd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICBleGl0IDFcbmZpXG5gLnRyaW0oKSxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBjb25zdCBodXNreURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3knKTtcbiAgY29uc3QgaGFzSHVza3lEaXIgPSBmcy5leGlzdHNTeW5jKGh1c2t5RGlyUGF0aCk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICAuLi5wcmVDb21taXRTZXR0aW5ncyxcbiAgICAgIGNvbW1hbmRzOiB7XG4gICAgICAgIC4uLnByZUNvbW1pdFNldHRpbmdzLmNvbW1hbmRzLFxuICAgICAgICBjbGVhbnVwOiB7XG4gICAgICAgICAgLi4ucHJlQ29tbWl0U2V0dGluZ3MuY29tbWFuZHMuY2xlYW51cCxcbiAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICBydW46IGdldENsZWFudXBDb21tYW5kKGNvbmZpZyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG4gIGlmICghbGludCkge1xuICAgIGRlbGV0ZSBzZXR0aW5nc1sncHJlLXB1c2gnXTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAoc2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuICBpZiAoaGFzSHVza3lEaXIpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5wcm9taXNlcy5ybShodXNreURpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSxcbiAgICBdKTtcbiAgICBzcGF3blN5bmMoJ2dpdCcsIFsnY29uZmlnJywgJy0tdW5zZXQnLCAnY29yZS5ob29rc1BhdGgnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGxpbnQpIHtcbiAgICBjb25zdCBwcmVQdXNoID0gZ2V0UHJlUHVzaFNjcmlwdChjb25maWcpO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBsZXQgbGludENvbW1hbmQ6IHN0cmluZztcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGxpbnRDb21tYW5kID0gY29uZmlnLmRlcGVuZGluZy53YiA/ICdidW4gLS1idW4gd2IgbGludCcgOiAnYnVuIHJ1biBsaW50JztcbiAgfSBlbHNlIHtcbiAgICBsaW50Q29tbWFuZCA9IGNvbmZpZy5kZXBlbmRpbmcud2IgPyAneWFybiB3YiBsaW50JyA6ICd5YXJuIHJ1biBsaW50JztcbiAgfVxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHtsaW50Q29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiBsaW50Q29tbWFuZDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN1cHBvcnRlZEV4dGVuc2lvbnMgPSBbLi4uZXh0ZW5zaW9ucy5wcmV0dGllck9ubHldO1xuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCguLi5leHRlbnNpb25zLm94Zm10LCAuLi5leHRlbnNpb25zLm94bGludCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ3B5Jyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdkYXJ0Jyk7XG4gIH1cbiAgY29uc3QgZmlsdGVyZWRFeHRlbnNpb25zID0gWy4uLm5ldyBTZXQoc3VwcG9ydGVkRXh0ZW5zaW9ucyldLnRvU29ydGVkKCk7XG4gIHJldHVybiBgKiovKi57JHtmaWx0ZXJlZEV4dGVuc2lvbnMuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWcpKSB7XG4gICAgcmV0dXJuICd5YXJuIHdvcmtzcGFjZSBAd2lsbGJvb3N0ZXIvd2Igc3RhcnQgLS13b3JraW5nLWRpciBcIiQoZ2l0IHJldi1wYXJzZSAtLXNob3ctdG9wbGV2ZWwpXCIgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfSAmJiBnaXQgYWRkIC0tIHtzdGFnZWRfZmlsZXN9JztcbiAgfVxuICBpZiAoY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIGNvbnN0IGNvbW1hbmQgPSBjb25maWcuZGVwZW5kaW5nLndiXG4gICAgICA/IGAke2NvbmZpZy5pc0J1biA/ICdidW4gLS1idW4gd2InIDogJ3lhcm4gd2InfSBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9YFxuICAgICAgOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGZvcm1hdCAmJiAke3BhY2thZ2VNYW5hZ2VyfSBydW4gbGludC1maXhgO1xuICAgIHJldHVybiBgJHtjb21tYW5kfSAmJiBnaXQgYWRkIC0tIHtzdGFnZWRfZmlsZXN9YDtcbiAgfVxuXG4gIGNvbnN0IG94bGludFBhdHRlcm4gPSBleHRlbnNpb25zLm94bGludC5tYXAoKGV4dGVuc2lvbikgPT4gU3RyaW5nLnJhd2BcXC4ke2V4dGVuc2lvbn0kYCkuam9pbignfCcpO1xuICBjb25zdCBveGZtdFBhdHRlcm4gPSBleHRlbnNpb25zLm94Zm10Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IHByZXR0aWVyUGF0dGVybiA9IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG5cbiAgcmV0dXJuIFN0cmluZy5yYXdgXG4ke2hhc0pzT3JUcyA/IFN0cmluZy5yYXdgb3hsaW50X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke294bGludFBhdHRlcm59KScgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7aGFzSnNPclRzID8gU3RyaW5nLnJhd2BveGZtdF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtveGZtdFBhdHRlcm59KScgfHwgdHJ1ZSlcImAgOiAnJ31cbnByZXR0aWVyX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke3ByZXR0aWVyUGF0dGVybn0pJyB8fCB0cnVlKVwiXG5wYWNrYWdlX2pzb25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJcbiR7Y29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayA/IFN0cmluZy5yYXdgcHl0aG9uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLnB5JCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7Y29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgPyBTdHJpbmcucmF3YGRhcnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwuZGFydCQnIHwgZ3JlcCAtdiAnZ2VuZXJhdGVkJyB8IGdyZXAgLXYgJ1xcLmZyZWV6ZWRcXC5kYXJ0JCcgfCBncmVwIC12ICdcXC5nXFwuZGFydCQnIHx8IHRydWUpXCJgIDogJyd9XG5cbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hmbXRfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICRveGZtdF9maWxlc1xuZmlcbmBcbiAgICA6ICcnXG59XG5pZiBbIC1uIFwiJHByZXR0aWVyX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSAtLWlnbm9yZS11bmtub3duIC0tICRwcmV0dGllcl9maWxlc1xuZmlcbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hsaW50X2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL294bGludCAtLWZpeCAkb3hsaW50X2ZpbGVzXG5maVxuYFxuICAgIDogJydcbn1cbmlmIFsgLW4gXCIkcGFja2FnZV9qc29uX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3NvcnQtcGFja2FnZS1qc29uIC0tICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gIHBvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzICRweXRob25fZmlsZXNcbiAgcG9ldHJ5IHJ1biBibGFjayAkcHl0aG9uX2ZpbGVzXG4gIHBvZXRyeSBydW4gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuZ2l0IGFkZCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5oYXNWZXJzaW9uU2V0dGluZ3MpIHtcbiAgICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWx8XFwudG9vbC12ZXJzaW9uc3xcXC4uKy12ZXJzaW9uKWA7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmNqc2AsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmpzYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuanNvbmAsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgIF0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGZtdENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsZWdhY3lDb25maWdQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm94Zm10cmMuanNvbicpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hmbXQuY29uZmlnLnRzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGxlZ2FjeUNvbmZpZ1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBjb25maWdDb250ZW50ID0gYGltcG9ydCBjb25maWcgZnJvbSAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbmZpZztcbmA7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIF9yb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGxpbnRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGxpbnQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMueWFtbCcpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMueW1sJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5tanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy50cycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICBdO1xuICAgIGlmICghZXhpc3RpbmdDb250ZW50KSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWdDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5jb25zdCBjb25maWdDb250ZW50ID0gYGltcG9ydCBjb25maWcgZnJvbSAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjb25maWc7XG5gO1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbnRlc3QvZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgdmVudlBhdGg6ICcuJyxcbiAgdmVudjogJy52ZW52Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmMoYCR7Y29uZmlnLmRpclBhdGh9Ly5naXRodWIvd29ya2Zsb3dzYCk7XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IChiYWRnZU5hbWVbMF0gfHwgJycpLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBpZiAoIXJlcG9zaXRvcnkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYmFkZ2UgPSBgWyFbJHtiYWRnZU5hbWV9XShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfSlgO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLmdpdGh1Yi93b3JrZmxvd3MvJHtmaWxlTmFtZX1gKSkpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIGJhZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g5pei44GrYmFkZ2XjgYzjgYLjgovloLTlkIjjga/liYrpmaRcbiAgcmVhZG1lID0gcmVhZG1lLnJlcGxhY2UoYmFkZ2UsICcnKS5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRtZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZWFkbWVbaSAtIDFdID09PSAnXFxuJyAmJiByZWFkbWVbaV0gPT09ICdcXG4nKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSByZWFkbWUuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgbGV0IGFmdGVyID0gcmVhZG1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIGlmICghYWZ0ZXIuc3RhcnRzV2l0aCgnWycpICYmICFhZnRlci5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgYWZ0ZXIgPSBgXFxuJHthZnRlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2JlZm9yZX0ke2JhZGdlfVxcbiR7YWZ0ZXJ9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3JlYWRtZX1cXG4ke2JhZGdlfVxcbmA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luRW50cnkgPSBwbHVnaW5zW2ldO1xuICAgICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocGx1Z2luRW50cnkpO1xuICAgICAgY29uc3QgcGx1Z2luID0gaXNBcnJheSA/IHBsdWdpbkVudHJ5WzBdIDogcGx1Z2luRW50cnk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoaXNBcnJheSAmJiBwbHVnaW5FbnRyeVsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uNSddLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IHR5cGVvZiBqc29uT2JqICYgeyBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoanNvbk9iaikgYXMgU2V0dGluZ3M7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdyZW5vdmF0ZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7ZmlsZVBhdGh9NWApKSB7XG4gICAgICAvLyBTaW5jZSBpdCBpcyBkaWZmaWN1bHQgZm9yIHBhcnNpbmcgcmVub3ZhdGUuanNvbjUsIHdlIGRvIG5vdGhpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBEb24ndCB1cGdyYWRlIE5leHQuanMgYXV0b21hdGljYWxseVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMgPz89IFtdO1xuICAgICAgaWYgKFxuICAgICAgICAhbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnNvbWUoKHJ1bGU6IHsgbWF0Y2hQYWNrYWdlTmFtZXM/OiBzdHJpbmdbXSB9KSA9PlxuICAgICAgICAgIHJ1bGUubWF0Y2hQYWNrYWdlTmFtZXM/LmluY2x1ZGVzKCduZXh0JylcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5wdXNoKHsgbWF0Y2hQYWNrYWdlTmFtZXM6IFsnbmV4dCddLCBlbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRlcGVuZGFib3QnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZW5vdmF0ZXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdpbnN0YWxsQWdlbnRTa2lsbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVE9ETzogV2UgYXJlIHRlbXBvcmFyaWx5IHJlbW92aW5nIGFnZW50IHNraWxscyBmcm9tIHRoZSByZXBvXG4gICAgLy8gYXdhaXQgcnVuSW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZzLnJtKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuYWdlbnRzJyksIHtcbiAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgZnMucm0ocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jbGF1ZGUnKSwge1xuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSksXG4gICAgICBmcy5ybShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnc2tpbGxzLWxvY2suanNvbicpLCB7XG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgfSksXG4gICAgXSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IHRydWUsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsncGFja2FnZXMvKi90ZXN0L2ZpeHR1cmVzJywgJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogW1xuICAgICdwYWNrYWdlcy8qL3NjcmlwdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc3JjLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3Rlc3QvKiovKicsXG4gICAgJ3NjcmlwdHMvKiovKicsXG4gICAgJ3NyYy8qKi8qJyxcbiAgICAndGVzdC8qKi8qJyxcbiAgXSxcbn07XG5cbmNvbnN0IHN1Ykpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IHRydWUsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSByZXR1cm47XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpciA9IGdldFJvb3REaXIoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHR5cGVzOiBnZW5lcmF0ZWRUeXBlcyB9O1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNCdW4gJiYgIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBqc3g6ICdyZWFjdC1qc3gnIH07XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgICBuZXdTZXR0aW5ncy5leGNsdWRlID0gbmV3U2V0dGluZ3MuZXhjbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVHlwZXMgPSBub3JtYWxpemVTdHJpbmdBcnJheShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW1pdE9wdGlvbnMgPSBwaWNrRXhpc3RpbmdFbWl0T3B0aW9ucyhvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG1lcmdlVHNjb25maWdFeHRlbmRzKG5ld1NldHRpbmdzLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMpO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgICAgLy8gS2VlcCBleHBsaWNpdCBlbWl0IHNldHRpbmdzIGJlY2F1c2Ugc29tZSByZXBvcyBoYXZlIHRzY29uZmlnLmJ1aWxkLmpzb24gZmlsZXNcbiAgICAgIC8vIHRoYXQgZXh0ZW5kIHRoaXMgY29uZmlnIGFuZCByZWx5IG9uIHRob3NlIG9wdGlvbnMgZm9yIHRyYWNrZWQgLmQudHMgb3V0cHV0cy5cbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCAuLi5leGlzdGluZ0VtaXRPcHRpb25zIH07XG4gICAgICBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IG1lcmdlZFR5cGVzID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlcywgZ2VuZXJhdGVkVHlwZXMpLCAuLi5nZW5lcmF0ZWRUeXBlc10pXTtcbiAgICAgIGlmIChtZXJnZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IG1lcmdlZFR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGREZWxldGVUeXBlUm9vdHMoZ2VuZXJhdGVkVHlwZXMpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZVJvb3RzO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICAvLyBUeXBlU2NyaXB0IG5vIGxvbmdlciByZXF1aXJlcyBiYXNlVXJsIGZvciBwYXRocywgYW5kIHRzZ29saW50IHJlamVjdHMgaXQuXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybDtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udmVyYmF0aW1Nb2R1bGVTeW50YXg7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdERpcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnLmlzUm9vdCkgcmV0dXJuICcuJztcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpID8gJy4uLy4uJyA6ICcuJztcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxldGVUeXBlUm9vdHModHlwZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGdlbmVyYXRlZCBwYWNrYWdlLW93bmVkIHRlc3QgdHlwZXMgc2hvdWxkIHRyaWdnZXIgdGhpcy4gVXNlci1kZWZpbmVkIHNsYXNoLWJhc2VkXG4gIC8vIGVudHJpZXMgbWF5IGludGVudGlvbmFsbHkgcmVseSBvbiBjdXN0b20gdHlwZVJvb3RzIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIGFzLWlzLlxuICByZXR1cm4gdHlwZU5hbWVzLnNvbWUoKHR5cGVOYW1lKSA9PiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lLmluY2x1ZGVzKCcvJykpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXM6IHN0cmluZ1tdLCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdlbmVyYXRlZFR5cGVTZXQgPSBuZXcgU2V0KGdlbmVyYXRlZFR5cGVzKTtcbiAgcmV0dXJuIGV4aXN0aW5nVHlwZXMuZmlsdGVyKCh0eXBlTmFtZSkgPT4ge1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBwYWNrYWdlLXByb3ZpZGVkIHRlc3QgZ2xvYmFscy4gRHJvcCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlXG4gICAgLy8gY29ycmVzcG9uZGluZyBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBwcmVzZW50IHNvIFR5cGVTY3JpcHQgd29uJ3QgcmVxdWlyZVxuICAgIC8vIG1pc3NpbmcgcGFja2FnZXMgc3VjaCBhcyB2aXRlc3QuXG4gICAgaWYgKGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWUpICYmICFnZW5lcmF0ZWRUeXBlU2V0Lmhhcyh0eXBlTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZSA9PT0gJ2plc3QnIHx8IHR5cGVOYW1lID09PSAnbW9jaGEnIHx8IHR5cGVOYW1lID09PSAndml0ZXN0L2dsb2JhbHMnO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuICBpZiAoY29tcGlsZXJPcHRpb25zLm5vRW1pdCAhPT0gZmFsc2UgfHwgY29tcGlsZXJPcHRpb25zLmVtaXREZWNsYXJhdGlvbk9ubHkgPT09IHRydWUpIHJldHVybjtcblxuICAvLyBAdHNjb25maWcvYnVuIGVuYWJsZXMgYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnMsIHdoaWNoIFR5cGVTY3JpcHQgcGVybWl0c1xuICAvLyBkdXJpbmcgZW1pdCBvbmx5IHdoZW4gcmVsYXRpdmUgVFMgZXh0ZW5zaW9ucyBhcmUgcmV3cml0dGVuLlxuICBjb21waWxlck9wdGlvbnMucmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9ucyA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHBpY2tFeGlzdGluZ0VtaXRPcHRpb25zKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ11cbik6IFBpY2s8XG4gIE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LFxuICAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdlbWl0RGVjbGFyYXRpb25Pbmx5JyB8ICdub0VtaXQnIHwgJ3NvdXJjZU1hcCdcbj4ge1xuICBjb25zdCBlbWl0T3B0aW9ucyA9IHt9IGFzIFBpY2s8XG4gICAgTm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sXG4gICAgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnZW1pdERlY2xhcmF0aW9uT25seScgfCAnbm9FbWl0JyB8ICdzb3VyY2VNYXAnXG4gID47XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnZGVjbGFyYXRpb24nLCAnZGVjbGFyYXRpb25NYXAnLCAnZW1pdERlY2xhcmF0aW9uT25seScsICdub0VtaXQnLCAnc291cmNlTWFwJ10gYXMgY29uc3QpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXBpbGVyT3B0aW9ucz8uW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVtaXRPcHRpb25zW2tleV0gPSB2YWx1ZSBhcyBuZXZlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVtaXRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2J1bicpO1xuICB9IGVsc2UgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbm9kZScpO1xuICB9XG4gIGlmIChcbiAgICBkZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgIGRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgZGVwZW5kZW5jaWVzWydqZXN0LWVudmlyb25tZW50LWpzZG9tJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICApIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdqZXN0Jyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy52aXRlc3QpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCd2aXRlc3QvZ2xvYmFscycpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMubW9jaGEpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdtb2NoYScpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMuY3lwcmVzcykge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2N5cHJlc3MnKTtcbiAgfVxuXG4gIHJldHVybiBbLi4udHlwZU5hbWVzXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy52ZW52LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLm5leHQvKionKV0pO1xuICAgICAgfVxuICAgICAgLy8gTExN44Gr44KI44KLdmliZSBjb2Rpbmfjgafjga/jgIHoh6rli5Xjg5Xjgqnjg7zjg57jg4Pjg4jjgoTjgrPjg7zjg4njgqLjgq/jgrfjg6fjg7PjgpLnhKHlirnljJbjgZnjgovjgZPjgajjgadcbiAgICAgIC8vIOeUn+aIkOOBleOCjOOBn+OCs+ODvOODieOBruWFg+OBruW9ouW8j+OCkue2reaMgeOBp+OBjeOCi1xuICAgICAgaWYgKCdlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJ107XG4gICAgICB9XG4gICAgICBpZiAoJ2VkaXRvci5mb3JtYXRPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmZvcm1hdE9uU2F2ZSddO1xuICAgICAgfVxuICAgICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm46IHN0cmluZyk6IG9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgJ2ZpbGVzLndhdGNoZXJFeGNsdWRlJzoge1xuICAgICAgW2V4Y2x1ZGVGaWxlUGF0dGVybl06IHRydWUsXG4gICAgfSxcbiAgfTtcbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG50eXBlIFNldHRpbmdzID0ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgbnBtTWluaW1hbEFnZUdhdGU/OiBzdHJpbmc7XG4gIG5wbVByZWFwcHJvdmVkUGFja2FnZXM/OiBzdHJpbmdbXTtcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufSAmIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPjtcblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGlzTmV3ZXJWZXJzaW9uKGxhdGVzdFZlcnNpb24sIGN1cnJlbnRWZXJzaW9uKSkge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGxldCBzZXR0aW5ncyA9IHt9IGFzIFNldHRpbmdzO1xuICAgIHRyeSB7XG4gICAgICBzZXR0aW5ncyA9ICh5YW1sLmxvYWQoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoeWFybnJjWW1sUGF0aCwgJ3V0ZjgnKSkgYXMgU2V0dGluZ3MgfCB1bmRlZmluZWQpID8/IHNldHRpbmdzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzZXR0aW5ncy5kZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXggPSAnJztcbiAgICBzZXR0aW5ncy5ub2RlTGlua2VyID0gJ25vZGUtbW9kdWxlcyc7XG4gICAgc2V0dGluZ3Mubm1Nb2RlID0gJ2hhcmRsaW5rcy1nbG9iYWwnO1xuICAgIHNldHRpbmdzLm5wbU1pbmltYWxBZ2VHYXRlID0gJzVkJztcbiAgICBzZXR0aW5ncy5ucG1QcmVhcHByb3ZlZFBhY2thZ2VzID0gW1xuICAgICAgLy8gLS0tLS0tLS0tLSBXZSBiZWxpZXZlIG91ciBwYWNrYWdlcyBhcmUgc2FmZSAtLS0tLS0tLS0tXG4gICAgICAnQGV4ZXJjb2RlLyonLFxuICAgICAgJ0B3aWxsYm9vc3Rlci8qJyxcbiAgICAgICdhZ2VudC1ydW50aW1lLWtpdCcsXG4gICAgICAnb25lLXdheS1naXQtc3luYycsXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8vIFRvIGRlYWwgd2l0aCBDVkUgbGlrZSBodHRwczovL25leHRqcy5vcmcvYmxvZy9DVkUtMjAyNS02NjQ3OFxuICAgICAgJ25leHQnLFxuICAgICAgJ0BuZXh0LyonLFxuICAgICAgJ0B0eXBlc2NyaXB0LyonLFxuICAgICAgJ0BveGZtdC8qJyxcbiAgICAgICdAb3hsaW50LyonLFxuICAgICAgJ0BveGxpbnQtdHNnb2xpbnQvKicsXG4gICAgICAnb3hmbXQnLFxuICAgICAgJ294bGludCcsXG4gICAgICAnb3hsaW50LXRzZ29saW50JyxcbiAgICAgICdyZWFjdCcsXG4gICAgICAncmVhY3QtZG9tJyxcbiAgICBdO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3BsdWdpbnMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAvLyBUaGUgdGFyZ2V0IHJlcG8gbWF5IG5vdCBoYXZlIHByZXR0aWVyIGluc3RhbGxlZCB5ZXQsIGFuZCB5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwgZWRpdHMgdGhpcyBmaWxlIGFmdGVyIGpzLXlhbWwuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAncHJldHRpZXInLCAnLS13cml0ZScsIHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIHlhcm5yY1ltbFBhdGgpXSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9uJ10sIGRpclBhdGgpIHx8ICcwLjAuMCc7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJWZXJzaW9uKG5ld1ZlcnNpb246IHN0cmluZywgb2xkVmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTmV3VmVyc2lvbiA9IHNlbXZlci52YWxpZChuZXdWZXJzaW9uKTtcbiAgaWYgKCF2YWxpZE5ld1ZlcnNpb24pIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gc2VtdmVyLmd0KHZhbGlkTmV3VmVyc2lvbiwgc2VtdmVyLnZhbGlkKG9sZFZlcnNpb24pID8/ICcwLjAuMCcpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1hbGwgOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY2xhdWRlIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNvZGV4IDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWdlbWluaSA6cm9ib3Q6JywgJzAwQjREOCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdsbG0tcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdhaS1wciA6cm9ib3Q6Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCIvLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBMaWJTb2RpdW0ncyBuYW1lc3BhY2UgQVBJIGtlZXBzIGNyeXB0byBoZWxwZXJzIGdyb3VwZWQuXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgc29kaXVtIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IERFUFJFQ0FURURfU0VDUkVUX05BTUVTID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJywgJ0dIX0JPVF9QQVQnLCAnUFVCTElDX0dIX0JPVF9QQVQnXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVudicpIH0pLnBhcnNlZCA/PyB7fTtcbiAgICBpZiAoT2JqZWN0LmtleXMocGFyc2VkKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHNlY3JldE5hbWUgb2YgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBzZWNyZXRfbmFtZTogc2VjcmV0TmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUicgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUInXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCBTZWNyZXQgJiBCYXNlNjQga2V5IHRvIFVpbnQ4QXJyYXkuXG4gICAgICAgIGNvbnN0IHJhd0tleSA9IHNvZGl1bS5mcm9tX2Jhc2U2NChrZXksIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuICAgICAgICBjb25zdCByYXdTZWMgPSBzb2RpdW0uZnJvbV9zdHJpbmcoc2VjcmV0KTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBzZWNyZXQgdXNpbmcgTGliU29kaXVtXG4gICAgICAgIGNvbnN0IGVuY0J5dGVzID0gc29kaXVtLmNyeXB0b19ib3hfc2VhbChyYXdTZWMsIHJhd0tleSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBlbmNyeXB0ZWQgVWludDhBcnJheSB0byBCYXNlNjRcbiAgICAgICAgY29uc3QgZW5jQmFzZTY0ID0gc29kaXVtLnRvX2Jhc2U2NChlbmNCeXRlcywgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG5cbiAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAvLyBBZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uXG4gIGF3YWl0IHdpdGhSZXRyeSgoKSA9PlxuICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSxcbiAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgYWxsb3dfdXBkYXRlX2JyYW5jaDogdHJ1ZSxcbiAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICB9LFxuICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyID0gJ19fUE1fUlVOX18nO1xuXG5jb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG4jIyBTZWxmIENoZWNrXG5cbi0gWyBdIEkndmUgY29uZmlybWVkIFxcYEFsbCBjaGVja3MgaGF2ZSBwYXNzZWRcXGAgb24gdGhpcyBwYWdlLlxuICAtIFBSIHRpdGxlIGZvbGxvd3MgW0FuZ3VsYXIncyBjb21taXQgbWVzc2FnZSBmb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYWluL0NPTlRSSUJVVElORy5tZCMtY29tbWl0LW1lc3NhZ2UtZm9ybWF0KS5cbiAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBUaGUgdGVzdCBjb21tYW5kIChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXJ9IHRlc3RcXGApIHBhc3NlZC5cbiAgLSBUaGUgbGludCBjb21tYW5kIChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXJ9IGxpbnRcXGApIHBhc3NlZC5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBkdWUgdG8gbG9uZyB3b3JrZmxvd3MuXG4tIFsgXSBJJ3ZlIHJldmlld2VkIG15IGNoYW5nZXMgb24gdGhlIEdpdEh1YiBkaWZmIHZpZXcuXG4tIFsgXSBJJ3ZlIHdyaXR0ZW4gdGhlIHN0ZXBzIHRvIHRlc3QgbXkgY2hhbmdlcy5cbi0gWyBdIEkndmUgYWRkZWQgc2NyZWVuc2hvdHMgKGlmIHRoZSBVSSBjaGFuZ2VkKS5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBpZiB5b3UgZGlkbid0IG1vZGlmeSB0aGUgVUkuXG5cbjwhLS0gUGxlYXNlIGFkZCBzY3JlZW5zaG90cyBpZiB5b3UgbW9kaWZ5IHRoZSBVSS5cbnwgQ3VycmVudCAgICAgICAgICAgICAgICAgIHwgSW4gY29taW5nICAgICAgICAgICAgICAgIHxcbnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbnwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfFxuLS0+XG5cbjwhLS0gUGxlYXNlIGFkZCBzdGVwcyB0byB0ZXN0IHlvdXIgY2hhbmdlcy5cbiMjIFN0ZXBzIHRvIFRlc3RcblxuMS4gT3BlbiBodHRwOi8vbG9jYWxob3N0LWV4ZXJjb2RlLndpbGxib29zdGVyLm5ldDozMDAwL2phLUpQL2NvdXJzZXMvX2V4YW1wbGUvbGVzc29ucy9fZXhhbXBsZV9hX3BsdXNfYi9wcm9ibGVtcy9fZXhhbXBsZV9hX3BsdXNfYiBhZnRlciBsb2dpbi5cbjIuIFNlbGVjdCB0aGUgbGFuZ3VhZ2UgXFxgQ1xcYC5cbjMuIFdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZTpcbiAgIFxcYFxcYFxcYGNcbiAgICNpbmNsdWRlIDxzdGRpby5oPlxuXG4gICBpbnQgbWFpbih2b2lkKSB7XG4gICAgIGludCBhLCBiO1xuXG4gICAgIHNjYW5mKFwiJWQgJWRcIiwgJmEsICZiKTtcbiAgICAgcHJpbnRmKFwiJWRcIiwgYSArIGIpO1xuICAgICByZXR1cm4gMDtcbiAgIH1cbiAgIFxcYFxcYFxcYFxuNC4gUHVzaCBcXGBTdWJtaXRcXGAgYnV0dG9uLlxuNS4gLi4uXG4tLT5cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBuZXdDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKG5ld0NvbnRlbnQsIGNvbmZpZyk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBpZiAoZGlzdGFuY2Uob2xkQ29udGVudCwgY29udGVudCkgPiBjb250ZW50Lmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUodGVtcGxhdGU6IHN0cmluZywgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZUFsbChwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyLCBwYWNrYWdlTWFuYWdlckNvbW1hbmQpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgc2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsIH0gZnJvbSAnLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNCdW46IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIC8vIGRlcGVuZGVuY3kgaW5mb3JtYXRpb25cbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9tWG1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIC8vIHNvdXJjZSBjb2RlIGZpbGVzXG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcblxuICBoYXNTdGFydFRlc3RTZXJ2ZXI6IGJvb2xlYW47XG5cbiAgZGVwZW5kaW5nOiB7XG4gICAgYmxpdHo6IGJvb2xlYW47XG4gICAgZmlyZWJhc2U6IGJvb2xlYW47XG4gICAgZ2VuSTE4blRzOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGhhc1ZlcnNpb25TZXR0aW5nczogYm9vbGVhbjtcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcGx1Z2lucz86IHN0cmluZ1tdW107XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzID8/IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgPz8gW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IGhhc1ZlcnNpb25TZXR0aW5ncyA9IGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBwcmVmaXggb2YgWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ10pIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCkpKSB7XG4gICAgICAgIGhhc1ZlcnNpb25TZXR0aW5ncyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0Z1bGxOYW1lID8gYGdpdGh1Yjoke3JlcG9GdWxsTmFtZX1gIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcygnL3dpbGxib29zdGVyLWNvbmZpZ3MnKSxcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgaGFzU3RhcnRUZXN0U2VydmVyOiAhIXBhY2thZ2VKc29uLnNjcmlwdHM/Llsnc3RhcnQtdGVzdC1zZXJ2ZXInXSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXMuYmxpdHosXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucHJpc21hLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llcy5weXJpZ2h0LFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgaGFzVmVyc2lvblNldHRpbmdzLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHJldHVybiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJ21pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcubWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy50b29sLXZlcnNpb25zJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcy5mZXRjaCA/PyBvcmlnaW4/LnJlZnMucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgY29uc3QgcmV0ID0geyBmdWxsX25hbWU6IGAke29yZ30vJHtuYW1lfWAgfTtcbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KCkucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24ocmV0LCByZXNwb25zZS5kYXRhKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWRpcmVjdGVkRnVsbE5hbWUgPSBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yKTtcbiAgICBpZiAocmVkaXJlY3RlZEZ1bGxOYW1lKSB7XG4gICAgICByZXQuZnVsbF9uYW1lID0gcmVkaXJlY3RlZEZ1bGxOYW1lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IFdJTExCT09TVEVSX0NPTkZJR19QQUNLQUdFX05BTUVTID0gbmV3IFNldChbJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnXSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBjb25maWcucGFja2FnZUpzb24/Lm5hbWU7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmIHR5cGVvZiBwYWNrYWdlTmFtZSA9PT0gJ3N0cmluZycgJiYgV0lMTEJPT1NURVJfQ09ORklHX1BBQ0tBR0VfTkFNRVMuaGFzKHBhY2thZ2VOYW1lKVxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlbW92ZUdlbWluaVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGluc3RhbGxBZ2VudFNraWxscyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9za2lsbHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIH0gZnJvbSAnLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZW52OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzZWNyZXRzIHRvIEdpdEh1YicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZScsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdTa2lwIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCB5YXJuIGJlcnJ5XG4gICAgYXdhaXQgZ2VuZXJhdGVZYXJucmNZbWwocm9vdENvbmZpZyk7XG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSdW5Xb3JrZmxvd3MgPVxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgIChyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fFxuICAgICAgICByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZml4UHJpc21hRW52RmlsZXMocm9vdENvbmZpZyksXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHZW1pbmlDb25maWcocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgcmVtb3ZlR2VtaW5pU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZW5vdmF0ZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihzaG91bGRSdW5Xb3JrZmxvd3MgPyBbZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyldIDogW10pLFxuICAgICAgc2V0dXBMYWJlbHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cFNlY3JldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWcpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdyZWZyZXNoQnVuTG9jaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCcsICctLW5vLWltbXV0YWJsZSddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcblxuICAgIGF3YWl0IGluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGxvY2tGaWxlUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ2J1bi5sb2NrJyk7XG4gIGNvbnN0IGJhY2t1cExvY2tGaWxlUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJy5idW4ubG9jay53YmZ5LWJhY2t1cCcpO1xuICBmcy5ybVN5bmMoYmFja3VwTG9ja0ZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NrRmlsZVBhdGgpKSB7XG4gICAgLy8gUmVnZW5lcmF0ZSBmcm9tIHNjcmF0Y2gsIGJ1dCBrZWVwIHRoZSBwcmV2aW91cyBsb2NrZmlsZSBzbyBhIHJlZ2lzdHJ5IG9yXG4gICAgLy8gcmVzb2x2ZXIgZmFpbHVyZSBjYW5ub3QgbGVhdmUgdGhlIHJlcG9zaXRvcnkgd2l0aG91dCBhIGxvY2tmaWxlLlxuICAgIGZzLmNvcHlGaWxlU3luYyhsb2NrRmlsZVBhdGgsIGJhY2t1cExvY2tGaWxlUGF0aCk7XG4gICAgZnMucm1TeW5jKGxvY2tGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWyd1cGRhdGUnXSwgcm9vdERpclBhdGgpO1xuICBpZiAoc3RhdHVzID09PSAwICYmIGZzLmV4aXN0c1N5bmMobG9ja0ZpbGVQYXRoKSkge1xuICAgIGZzLnJtU3luYyhiYWNrdXBMb2NrRmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMoYmFja3VwTG9ja0ZpbGVQYXRoKSkge1xuICAgIGZzLmNvcHlGaWxlU3luYyhiYWNrdXBMb2NrRmlsZVBhdGgsIGxvY2tGaWxlUGF0aCk7XG4gICAgZnMucm1TeW5jKGJhY2t1cExvY2tGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWdlbmVyYXRlICR7bG9ja0ZpbGVQYXRofTogYnVuIHVwZGF0ZSBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJhc3luYyIsInNsZWVwIiwibWlsbGlzZWNvbmRzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwiaWdub3JlRXJyb3JBc3luYyIsImZuIiwiaWdub3JlRW5vZW50QXN5bmMiLCJlcnJvciIsImNvZGUiLCJvcHRpb25zIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsIkVycm9yIiwic3RhY2siLCJTdHJpbmciLCJmc1V0aWwiLCJyZWFkRmlsZUlnbm9yaW5nRXJyb3IiLCJmaWxlUGF0aCIsImZzIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJta2RpciIsInBhdGgiLCJkaXJuYW1lIiwicmVjdXJzaXZlIiwibm9ybWFsaXplZENvbnRlbnQiLCJ0cmltIiwid3JpdGVGaWxlIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImZpeE5leHRDb25maWdKc29uIiwiY29uZmlnIiwibWFwIiwiZXh0IiwiZGlyUGF0aCIsImZpbmQiLCJwIiwiZXhpc3RzU3luYyIsIm9sZENvbnRlbnQiLCJvYmplY3RMaXRlcmFsIiwic291cmNlIiwidHMiLCJjcmVhdGVTb3VyY2VGaWxlIiwiU2NyaXB0VGFyZ2V0IiwiTGF0ZXN0IiwiU2NyaXB0S2luZCIsIkpTIiwidmlzaXQiLCJub2RlIiwiaXNFeHBvcnRBc3NpZ25tZW50IiwiaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsImV4cHJlc3Npb24iLCJpc0JpbmFyeUV4cHJlc3Npb24iLCJvcGVyYXRvclRva2VuIiwia2luZCIsIlN5bnRheEtpbmQiLCJFcXVhbHNUb2tlbiIsImxlZnQiLCJnZXRUZXh0IiwicmlnaHQiLCJmb3JFYWNoQ2hpbGQiLCJnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbCIsInByb3BlcnR5VGV4dHMiLCJTZXQiLCJwcm9wZXJ0aWVzIiwicHJvcGVydHkiLCJoYXMiLCJwdXNoIiwibGVuZ3RoIiwiaW5zZXJ0aW9uUG9pbnQiLCJnZXRFbmQiLCJsYXN0UHJvcGVydHkiLCJhdCIsImhhc1RyYWlsaW5nQ29tbWEiLCJzbGljZSIsImluY2x1ZGVzIiwicHJlZml4IiwibmV3Q29udGVudCIsImpvaW4iLCJydW4iLCJsaXRlcmFsIiwidmFsdWUiLCJhc09iamVjdCIsImV4dHJhTWVtYmVycyIsInRvUGFyc2VkT2JqZWN0IiwiZGVmYXVsdENvbmZpZyIsImZvcmJpZE9ubHkiLCJyZXRyaWVzIiwidXNlIiwiYmFzZVVSTCIsInRyYWNlIiwic2NyZWVuc2hvdCIsInZpZGVvIiwid2ViU2VydmVyIiwiY29tbWFuZCIsInVybCIsInJldXNlRXhpc3RpbmdTZXJ2ZXIiLCJ0aW1lb3V0Iiwic3Rkb3V0Iiwic3RkZXJyIiwiZW52IiwiZ3JhY2VmdWxTaHV0ZG93biIsIm1lbWJlck9yZGVyIiwiT2JqZWN0Iiwia2V5cyIsImtleSIsIl8iLCJpbmRleCIsImZpeFBsYXl3cmlnaHRDb25maWciLCJlbnZGaWxlUGF0aCIsImVudkZpbGVOYW1lcyIsImVudkZpbGVQYXRocyIsImN1cnJlbnREaXJQYXRoIiwiZmlsZU5hbWUiLCJnZXRFbnZGaWxlUGF0aHMiLCJ0ZXN0IiwiYXNzZXJ0TmV4dFB1YmxpY0Jhc2VVcmwiLCJleHRyYWN0ZWRPYmplY3RMaXRlcmFsIiwiVFMiLCJmb3VuZCIsImlzQ2FsbEV4cHJlc3Npb24iLCJmaXJzdEFyZ3VtZW50IiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwiLCJwYXJzZWQiLCJwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uIiwibWVyZ2VkIiwibWVyZ2VQYXJzZWRPYmplY3RzIiwiaGFzU3RhcnRUZXN0U2VydmVyIiwiQm9vbGVhbiIsInBhY2thZ2VKc29uIiwic2NyaXB0cyIsImhhc0V4aXN0aW5nV2ViU2VydmVyIiwib2JqZWN0IiwiaXNCdW4iLCJzZXRXZWJTZXJ2ZXJDb21tYW5kIiwibmV3T2JqZWN0TGl0ZXJhbCIsInN0cmluZ2lmeVZhbHVlIiwic3RhcnQiLCJnZXRTdGFydCIsImVuZCIsImJhc2UiLCJvdmVycmlkZSIsIm92ZXJyaWRlUHJvcGVydHlLZXlzIiwiZmlsdGVyIiwibWVtYmVyIiwiZW50cmllcyIsIm1lcmdlUGFyc2VkVmFsdWUiLCJwYXJzZUV4cHJlc3Npb24iLCJwYXJzZWRPYmplY3QiLCJpc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24iLCJlbGVtZW50cyIsImVsZW1lbnQiLCJzb21lIiwiaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc1Byb3BlcnR5QXNzaWdubWVudCIsImlzSWRlbnRpZmllciIsImlzU3RyaW5nTGl0ZXJhbCIsImluaXRpYWxpemVyIiwibGV2ZWwiLCJjbG9zaW5nSW5kZW50IiwicmVwZWF0IiwiaW5kZW50IiwiaXRlbSIsInN0cmluZ2lmaWVkIiwic3BsaXQiLCJlbWl0dGVkUHJvcGVydGllcyIsImxhc3RQcm9wZXJ0eUluZGV4QnlLZXkiLCJNYXAiLCJzZXQiLCJnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5IiwibGluZXMiLCJmbGF0TWFwIiwic3RyaW5naWZ5T2JqZWN0TWVtYmVyIiwiZ2V0IiwiYWRkIiwic3RyaW5naWZ5T2JqZWN0UHJvcGVydHkiLCJsaW5lIiwiZ2xvYklnbm9yZSIsImZpeFByaXNtYUVudkZpbGVzIiwiZW52RmlsZXMiLCJmZyIsImdsb2IiLCJkb3QiLCJjd2QiLCJpZ25vcmUiLCJlbnZGaWxlIiwicmVwbGFjZUFsbCIsIm1hdGNoIiwic2VwYXJhdG9yIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwic29ydE9iamVjdEJ5S2V5TmFtZUxpc3QiLCJzb3J0V2l0aCIsInNvcnRGbiIsInRvdGFsIiwib2JqZWN0S2V5cyIsInNvcnQiLCJJTkRFTlRfUkVHRVgiLCJJTkRFTlRfVFlQRV9TUEFDRSIsInNob3VsZElnbm9yZVNpbmdsZVNwYWNlIiwiaWdub3JlU2luZ2xlU3BhY2VzIiwiaW5kZW50VHlwZSIsIm1ha2VJbmRlbnRzTWFwIiwic3RyaW5nIiwiaW5kZW50cyIsInByZXZpb3VzSW5kZW50VHlwZSIsInByZXZpb3VzU2l6ZSIsIm1hdGNoZXMiLCJ3ZWlnaHQiLCJpbmRlbnREaWZmZXJlbmNlIiwiYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlIiwiTWF0aCIsImFicyIsImVuY29kZUluZGVudHNLZXkiLCJlbnRyeSIsImluZGVudEFtb3VudCIsImRldGVjdEluZGVudCIsIlR5cGVFcnJvciIsInNpemUiLCJrZXlPZk1vc3RVc2VkSW5kZW50IiwicmVzdWx0IiwibWF4VXNlZCIsIm1heFdlaWdodCIsInVzZWRDb3VudCIsImdldE1vc3RVc2VkS2V5IiwidHlwZSIsImFtb3VudCIsImluZGVudHNLZXkiLCJOdW1iZXIiLCJtYWtlSW5kZW50U3RyaW5nIiwiZGV0ZWN0TmV3bGluZUdyYWNlZnVsIiwibmV3bGluZXMiLCJjcmxmIiwibmV3bGluZSIsImRldGVjdE5ld2xpbmUiLCJwaXBlIiwiZm5zIiwieCIsImFyZ3MiLCJyZWR1Y2UiLCJvbkFycmF5IiwiQXJyYXkiLCJpc0FycmF5Iiwib25TdHJpbmdBcnJheSIsImV2ZXJ5IiwidW5pcSIsInhzIiwic29ydEFycmF5IiwiYXJyYXkiLCJ0b1NvcnRlZCIsInVuaXFBbmRTb3J0QXJyYXkiLCJvbk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJpdGVyYXRvciIsImlzUGxhaW5PYmplY3QiLCJzb3J0T2JqZWN0QnkiLCJjb21wYXJhdG9yIiwiZGVlcCIsIm92ZXIiLCJmcm9tRW50cmllcyIsInNvcnRPYmplY3RLZXlzIiwib2JqZWN0R3JvdXBCeSIsImdyb3VwQnkiLCJjYWxsYmFjayIsImNyZWF0ZSIsInNvcnRPYmplY3QiLCJzb3J0VVJMT2JqZWN0Iiwic29ydFBlb3BsZU9iamVjdCIsInNvcnREaXJlY3RvcmllcyIsIm92ZXJQcm9wZXJ0eSIsImhhc093biIsInNvcnRHaXRIb29rcyIsInBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSIsInNwZWNpZmllciIsIm5hbWVBbmRWZXJzaW9uIiwiYXRNYXRjaGVzIiwibWF0Y2hBbGwiLCJzcGxpdEluZGV4IiwicG9wIiwic3Vic3RyaW5nIiwicmFuZ2UiLCJzb3J0T2JqZWN0QnlTZW12ZXIiLCJhIiwiYiIsImFOYW1lIiwiYVJhbmdlIiwiYk5hbWUiLCJiUmFuZ2UiLCJsb2NhbGVDb21wYXJlIiwic2VtdmVyQ29tcGFyZSIsInNlbXZlck1pblZlcnNpb24iLCJnZXRQYWNrYWdlTmFtZSIsImlkZW50IiwiaW5kZXhPZiIsInN0YXJ0c1dpdGgiLCJjYWNoZSIsInNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtIiwicGFja2FnZU1hbmFnZXIiLCJkZXZFbmdpbmVzIiwicG5wbSIsImVuZ2luZXMiLCJucG0iLCJwcm9jZXNzIiwiaGFzWWFybk9yUG5wbUZpbGVzIiwic29ydERlcGVuZGVuY2llcyIsImRlcGVuZGVuY2llcyIsInNvcnRXb3Jrc3BhY2VzIiwic29ydEVzbGludENvbmZpZyIsIm92ZXJyaWRlcyIsInJ1bGUxIiwicnVsZTIiLCJzb3J0VlNDb2RlQmFkZ2VPYmplY3QiLCJzb3J0UHJldHRpZXJDb25maWciLCJzb3J0Vm9sdGEiLCJzb3J0RGV2RW5naW5lcyIsInNvcnRQbnBtQ29uZmlnIiwiZGVmYXVsdE5wbVNjcmlwdHMiLCJoYXNEZXZEZXBlbmRlbmN5IiwiZGVwZW5kZW5jeSIsImRldkRlcGVuZGVuY2llcyIsInJ1blNSZWdFeHAiLCJoYXNTZXF1ZW50aWFsU2NyaXB0IiwiZmllbGQiLCJ2YWx1ZXMiLCJzY3JpcHQiLCJpc1NlcXVlbnRpYWxTY3JpcHQiLCJzb3J0U2NyaXB0TmFtZXMiLCJncm91cE1hcCIsImlkeCIsImZyb20iLCJncm91cEtleSIsImNoaWxkcmVuIiwiayIsInNvcnRTY3JpcHRzIiwibmFtZXMiLCJwcmVmaXhhYmxlIiwib21pdHRlZCIsInJlcGxhY2UiLCJzb3J0Q29uZGl0aW9ucyIsImNvbmRpdGlvbnMiLCJkZWZhdWx0Q29uZGl0aW9ucyIsInJlc3RDb25kaXRpb25zIiwiY29uZGl0aW9uIiwic29ydEV4cG9ydHMiLCJleHBvcnRzIiwicGF0aHMiLCJmaWVsZHMiLCJtYWludGFpbmVycyIsImNvbnRyaWJ1dG9ycyIsInBhY2thZ2VOYW1lQSIsInBhY2thZ2VOYW1lQiIsImJhZGdlIiwiZGVmYXVsdFNvcnRPcmRlciIsIm92ZXJGaWVsZHMiLCJzb3J0UGFja2FnZUpzb24iLCJqc29uSXNoIiwianNvbiIsImVuZENoYXJhY3RlcnMiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJlZGl0U3RyaW5nSlNPTiIsInNvcnRPcmRlciIsInByaXZhdGVLZXlzIiwicHVibGljS2V5cyIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJhbGwiLCJwYWNrYWdlSnNvblBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm5ld1Rlc3REaXJQYXRoIiwib2xkVGVzdERpck5hbWUiLCJvbGRUZXN0RGlyUGF0aCIsIm1vdmVUZXN0RGlyZWN0b3J5IiwiZGlkVXBkYXRlU2NyaXB0Iiwic2NyaXB0TmFtZSIsIm5ld1NjcmlwdCIsInJlbmFtZSIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9sZFBhdGgiLCJkaXJlbnQiLCJuZXdQYXRoIiwibmV3UGF0aFN0YXQiLCJzdGF0IiwiaXNEaXJlY3RvcnkiLCJybSIsImZpeFR5cGVEZWZpbml0aW9ucyIsImNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbiIsImxpYlR5cGVEaXJQYXRoIiwic3JjVHlwZURpclBhdGgiLCJpc1Jvb3QiLCJkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyIsImRpck5hbWUiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaGFzTGlicmFyeSIsImlzRmlsZSIsIm92ZXJ3cml0ZU1lcmdlIiwiZGVzdGluYXRpb25BcnJheSIsInNvdXJjZUFycmF5IiwiY29tYmluZU1lcmdlIiwidGFyZ2V0IiwiZGVzdGluYXRpb24iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwibWVyZ2UiLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsImtleTEiLCJrZXkyIiwicHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyIsIm9uIiwicHVsbF9yZXF1ZXN0IiwiYnJhbmNoZXMiLCJwZXJtaXNzaW9ucyIsImNvbnRlbnRzIiwiY29uY3VycmVuY3kiLCJncm91cCIsImpvYnMiLCJhdXRvZml4IiwicHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3ciLCJ1c2VzIiwid29ya2Zsb3dzIiwicmVsZWFzZSIsInB1bGxfcmVxdWVzdF90YXJnZXQiLCJ0eXBlcyIsInN5bmMiLCJpc3N1ZXMiLCJpZiIsIndpdGgiLCJzZWNyZXRzIiwiQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4iLCJPUEVOQUlfQVBJX0tFWSIsIkdFTUlOSV9BUElfS0VZIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJyb290Q29uZmlnIiwiaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8iLCJyZXBvc2l0b3J5Iiwid29ya2Zsb3dzUGF0aCIsInNlbWFudGljWW1sUGF0aCIsImZvcmNlIiwiZmlsZU5hbWVTZXQiLCJkZXBlbmRpbmciLCJzZW1hbnRpY1JlbGVhc2UiLCJiYXNlbmFtZSIsIndyaXRlV29ya2Zsb3dZYW1sIiwiZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzIiwid3JpdGVZYW1sIiwiaXNQdWJsaWNSZXBvIiwic3RydWN0dXJlZENsb25lIiwic3RlcHMiLCJidWlsZCIsImF1dG9maXhXb3JrZmxvdyIsImF1dG9maXhKb2IiLCJnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyIsIm5ld1NldHRpbmdzIiwib2xkU2V0dGluZ3MiLCJ5YW1sIiwibG9hZCIsImFycmF5TWVyZ2UiLCJtb3ZlVG9Cb3R0b20iLCJhY3Rpb25zIiwidHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3ciLCJpc1JldXNhYmxlV29ya2Zsb3ciLCJqb2IiLCJub3JtYWxpemVKb2IiLCJzY2hlZHVsZSIsImJyYW5jaCIsInBhcmFtcyIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIndvcmtmbG93X2Rpc3BhdGNoIiwiTlBNX1RPS0VOIiwiR0hfVE9LRU4iLCJGSVJFQkFTRV9UT0tFTiIsIkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UiLCJESVNDT1JEX1dFQkhPT0tfVVJMIiwic2VydmVyX3VybCIsImRvdF9lbnZfcGF0aCIsIkZMWV9BUElfVE9LRU4iLCJkZXBsb3lfY29tbWFuZCIsImRvZXNDb250YWluRG9ja2VyZmlsZSIsImNpX2xhYmVsIiwiZ2l0aHViX2hvc3RlZF9ydW5uZXIiLCJuZXdTZWNyZXRzIiwieWFtbFRleHQiLCJkdW1wIiwibGluZVdpZHRoIiwibm9Db21wYXRNb2RlIiwic3R5bGVzIiwiZml4VHlwb3MiLCJwYWNrYWdlQ29uZmlnIiwiZG9jRmlsZXMiLCJtZEZpbGUiLCJmaXhUeXBvc0luVGV4dCIsInJlcGxhY2VXaXRoQ29uZmlnIiwidHNGaWxlcyIsInRzRmlsZSIsImNvbW1lbnQiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIndiZnlKc29uIiwidHlwb3MiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIiwiYWxsQ29uZmlncyIsImFnZW50c0V4dHJhUGF0aCIsImV4dHJhQ29udGVudCIsInRvb2xOYW1lIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uIiwiY3Vyc29yUnVsZXNQYXRoIiwiY3Vyc29yUnVsZXNDb250ZW50IiwiZnJvbnRtYXR0ZXIiLCJib2R5IiwiZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudCIsImJhc2VDb250ZW50IiwiZGVzY3JpcHRpb24iLCJpc1dpbGxCb29zdGVyUmVwbyIsImMiLCJnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUiLCJoYXNOZXdTZWN0aW9uIiwiZ2VuSTE4blRzIiwicmVhY3QiLCJuZXh0IiwibWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyIsImdlbmVyYXRlQnVuZmlnVG9tbCIsImV4aXN0aW5nQ29udGVudCIsInJlYWRGaWxlU3luYyIsImJ1bmZpZ1RvbWwiLCJwYXJzZUJ1bmZpZ1RvbWwiLCJidW4iLCJnZW5lcmF0ZVJ1blNlY3Rpb24iLCJpbnN0YWxsIiwiZXhhY3QiLCJ1c2VyQ29udGVudEhlYWRlciIsInVzZXJDb250ZW50SGVhZGVyUmVnZXgiLCJkZWZhdWx0SGVhZFVzZXJDb250ZW50IiwiZGVmYXVsdFRhaWxVc2VyQ29udGVudCIsImlnbm9yZUZpbGVVdGlsIiwic2VwYXJhdG9yUHJlZml4IiwicmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzIiwibGFzdEhlYWRlckluZGV4IiwiZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlciIsImdldEhlYWRVc2VyQ29udGVudCIsInRoaXMiLCJnZXRUYWlsVXNlckNvbnRlbnQiLCJpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkIiwibGFzdEluZGV4IiwibGFzdEluZGV4T2YiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsIm94bGludCIsIm94Zm10IiwicHJldHRpZXJPbmx5IiwiZ2VuZXJhdGVFeHRlbnNpb25zIiwiZ2VuZXJhdGVFZGl0b3Jjb25maWciLCJoYXZlX2Z1biIsImNvZGVfcmV2aWV3IiwiZGlzYWJsZSIsImNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkIiwibWF4X3Jldmlld19jb21tZW50cyIsInB1bGxfcmVxdWVzdF9vcGVuZWQiLCJoZWxwIiwic3VtbWFyeSIsImlnbm9yZV9wYXR0ZXJucyIsImdlbmVyYXRlR2VtaW5pQ29uZmlnIiwiY29uZmlnRmlsZVBhdGgiLCJzdHlsZWd1aWRlRmlsZVBhdGgiLCJuZXdDb25maWciLCJvbGRDb25maWciLCJ5YW1sQ29udGVudCIsImNvZGluZ1J1bGVFeHRyYUNvbnRlbnQiLCJ0cmltU3RhcnQiLCJzdHlsZWd1aWRlQ29udGVudCIsInRyaW1FbmQiLCJyZW1vdmVHZW1pbmlTZXR0aW5ncyIsImdlbmVyYXRlR2l0YXR0cmlidXRlcyIsImRlZmF1bHROYW1lcyIsImdlbmVyYXRlR2l0aWdub3JlIiwiaGVhZFVzZXJDb250ZW50IiwidGFpbFVzZXJDb250ZW50IiwiZG9lc0NvbnRhaW5HZW1maWxlIiwiZG9lc0NvbnRhaW5Hb01vZCIsImRvZXNDb250YWluUGFja2FnZUpzb24iLCJkb2VzQ29udGFpblBvbVhtbCIsImRvZXNDb250YWluUHVic3BlY1lhbWwiLCJkb2VzQ29udGFpblRlbXBsYXRlWWFtbCIsImRvZXNDb250YWluUG9ldHJ5TG9jayIsImJsaXR6IiwiZmlyZWJhc2UiLCJwcmlzbWEiLCJwbGF5d3JpZ2h0VGVzdCIsInJlYWN0TmF0aXZlIiwic3Rvcnlib29rIiwibGl0ZXN0cmVhbSIsImdlbmVyYXRlZCIsInJlYWRDYWNoZSIsInJlc3BvbnNlIiwiZmV0Y2giLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwiRGF0ZSIsIm5vdyIsIm10aW1lTXMiLCJkb2VzQ29udGFpbkpzT3JUcyIsImRvZXNDb250YWluSmF2YVNjcmlwdCIsImRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpblR5cGVTY3JpcHQiLCJkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzIiwiZ2VuZXJhdGVJZGVhU2V0dGluZ3MiLCJveGxpbnRDb250ZW50IiwiY3JlYXRlVGFza09wdGlvbnMiLCJydW5uZXIiLCJleHRlbnNpb24iLCJzcGF3blN5bmMiLCJyZXRyeSIsInNwYXduU3luY0FuZFJldHVyblN0YXR1cyIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwic3RhdHVzIiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luY0FuZFJldHVyblN0ZG91dCIsInN0ZGlvIiwicHJvYyIsInRvU3RyaW5nIiwicyIsIm1lc3NhZ2UiLCJQQVRIIiwiQkVSUllfQklOX0ZPTERFUiIsImVuY29kaW5nIiwic2hlbGwiLCJnaXRIdWJVdGlsIiwiZ2V0T3JnQW5kTmFtZSIsInVybE9yRnVsbE5hbWUiLCJ1cmxXaXRob3V0UHJvdG9jb2wiLCJvY3Rva2l0Q2FjaGUiLCJnZXRPY3Rva2l0Iiwib3duZXIiLCJjYWNoZWQiLCJvY3Rva2l0IiwiT2N0b2tpdCIsImF1dGgiLCJnZXRHaXRIdWJUb2tlbiIsImhhc0dpdEh1YlRva2VuIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIiLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiIsIkdJVEhVQl9UT0tFTiIsIm94bGludERlcHMiLCJ0eXBlc2NyaXB0R29EZXBlbmRlbmN5Iiwib2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzIiwibGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSIsImdlbmVyYXRlUGFja2FnZUpzb24iLCJza2lwQWRkaW5nRGVwcyIsImpzb25PYmoiLCJqc29uVGV4dCIsInBlZXJEZXBlbmRlbmNpZXMiLCJyZWFkUGFja2FnZUpzb24iLCJhdXRob3IiLCJ0c2xpYiIsInR5cGVzY3JpcHQiLCJsZXJuYSIsInBpbnN0IiwicHJldHRpZXIiLCJyZW1vdmVPYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMiLCJyZW1vdmVEZXByZWNhdGVkU3R1ZmYiLCJyZW1vdmVMZWdhY3lJbnN0YWxsQ29tbWFuZHMiLCJnZW5lcmF0ZVNjcmlwdHMiLCJ3YiIsImFkZFN0YXJ0VGVzdFNlcnZlclNjcmlwdElmTmVlZGVkIiwiYWRkSW5zdGFsbFN0ZXBUb0NoZWNrRm9yQWkiLCJwcmV0dGlmeSIsIm9yaWdpbmFsQ29udGVudCIsIm5ld0xpbmUiLCJsIiwiZ2VuZXJhdGVQcmV0dGllclN1ZmZpeCIsIm5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyIsInVwZGF0ZVNjcmlwdHMiLCJkZXBlbmRlbmN5VXBkYXRlcyIsInBvZXRyeURldkRlcGVuZGVuY2llcyIsImh1c2t5IiwicG9zdGluc3RhbGwiLCJwb3N0cHVibGlzaCIsInByZXB1Ymxpc2hPbmx5IiwicHJlcGFjayIsInBvc3RwYWNrIiwicHJlcGFyZSIsInZlcnNpb24iLCJhcnRpbGxlcnkiLCJwbGF5d3JpZ2h0Iiwid29ya3NwYWNlcyIsIndvcmtzcGFjZSIsImdsb2JTeW5jIiwiZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwiamVzdCIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwiZGVwIiwiYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImRpcnMiLCJkaXIiLCJmb3JtYXQiLCJweXRob25GaWxlcyIsImRpck5hbWVTZXQiLCJweXRob25GaWxlIiwiZmlyc3QiLCJzZWNvbmQiLCJkaXJOYW1lc1N0ciIsImV4aXN0aW5nUmVwb3NpdG9yeSIsIm5vcm1hbGl6ZWRSZXBvc2l0b3J5Iiwibm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uIiwiYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uIiwibm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSIsImZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbiIsIm5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YSIsInBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIiwicGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMiLCJhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyIsImFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24iLCJwYWNrYWdlTmFtZXMiLCJwcml2YXRlUGFja2FnZXMiLCJyZXBvIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwib3RoZXJUYXJnZXQiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJjb21taXRIYXNoIiwib3JnYW5pemF0aW9uIiwicmVqZWN0IiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsImdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwic2VjdGlvbiIsInJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zIiwiaW5zdGFsbE5wbURlcGVuZGVuY2llcyIsImluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyIsImNvcmUiLCJkZXYiLCJkZXBlbmRlbmN5U3BlY2lmaWVycyIsImRlcGVuZGVuY2llc1RvSW5zdGFsbCIsInNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSIsInNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3kiLCJnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbiIsImNhY2hlZFZlcnNpb24iLCJjdXJyZW50VmVyc2lvbiIsInJlcG9zaXRvcnlVcmwiLCJtYXRjaGVkIiwiZXhlYyIsIm5vcm1hbGl6ZWRVcmwiLCJvbGRTY3JpcHRzIiwiY2xlYW51cCIsInR5cGVjaGVjayIsImhhc1R5cGVjaGVjayIsImhhc0pzT3JUcyIsIm9sZFRlc3QiLCJweXJpZ2h0IiwiYmFzZVNldHRpbmdzIiwicHJlQ29tbWl0U2V0dGluZ3MiLCJjb21tYW5kcyIsImdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIiwiaHVza3lEaXJQYXRoIiwiaGFzSHVza3lEaXIiLCJzZXR0aW5ncyIsImdldENsZWFudXBHbG9icyIsImdldENsZWFudXBDb21tYW5kIiwicHJlUHVzaCIsImxpbnRDb21tYW5kIiwiZ2V0UHJlUHVzaFNjcmlwdCIsIm1rZGlyU3luYyIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwicG9zdE1lcmdlQ29tbWFuZHMiLCJoYXNWZXJzaW9uU2V0dGluZ3MiLCJ0b29sc0NoYW5nZWRQYXR0ZXJuIiwicmF3IiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIiwic3VwcG9ydGVkRXh0ZW5zaW9ucyIsImxvY2FsV2JQYWNrYWdlSnNvblBhdGgiLCJoYXNMb2NhbFdiV29ya3NwYWNlIiwib3hsaW50UGF0dGVybiIsIm94Zm10UGF0dGVybiIsInByZXR0aWVyUGF0dGVybiIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwiZ2VuZXJhdGVPeGZtdENvbmZpZyIsImxlZ2FjeUNvbmZpZ1BhdGgiLCJjb25maWdDb250ZW50IiwiZ2VuZXJhdGVPeGxpbnRDb25maWciLCJfcm9vdENvbmZpZyIsImdlbmVyYXRlUHJldHRpZXJpZ25vcmUiLCJnaXRpZ25vcmVGaWxlUGF0aCIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJnZW5lcmF0ZVJlYWRtZSIsImluc2VydEJhZGdlIiwiZmlsZU5hbWVzIiwicmVhZGRpclN5bmMiLCJiYWRnZU5hbWUiLCJ0b1VwcGVyQ2FzZSIsInJlYWRtZSIsImkiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInBsdWdpbnMiLCJwbHVnaW5FbnRyeSIsInBsdWdpbiIsInByZXNldCIsInN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uIiwiZmFpbENvbW1lbnRDb25kaXRpb24iLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsIiRzY2hlbWEiLCJleHRlbmRzIiwiZ2VuZXJhdGVSZW5vdmF0ZUpzb24iLCJwYWNrYWdlUnVsZXMiLCJydWxlIiwibWF0Y2hQYWNrYWdlTmFtZXMiLCJlbmFibGVkIiwiaW5zdGFsbEFnZW50U2tpbGxzIiwicm9vdEpzb25PYmoiLCJjb21waWxlck9wdGlvbnMiLCJhbHdheXNTdHJpY3QiLCJub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3MiLCJhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzIiwiZXNNb2R1bGVJbnRlcm9wIiwicmVzb2x2ZUpzb25Nb2R1bGUiLCJpbXBvcnRIZWxwZXJzIiwibm9FbWl0IiwiZXhjbHVkZSIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImdlbmVyYXRlZFR5cGVzIiwidHlwZU5hbWVzIiwidml0ZXN0IiwibW9jaGEiLCJjeXByZXNzIiwiZ2V0R2VuZXJhdGVkVHlwZXMiLCJnZXRUc2NvbmZpZ0V4dGVuZHMiLCJyb290RGlyIiwiZ2V0Um9vdERpciIsImRvZXNDb250YWluSnN4T3JUc3giLCJkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcyIsImpzeCIsImV4aXN0aW5nVHlwZXMiLCJleGlzdGluZ0VtaXRPcHRpb25zIiwiZW1pdE9wdGlvbnMiLCJwaWNrRXhpc3RpbmdFbWl0T3B0aW9ucyIsImdlbmVyYXRlZEV4dGVuZHMiLCJleGlzdGluZ0V4dGVuZHMiLCJtZXJnZWRFeHRlbmRzIiwibm9ybWFsaXplRXh0ZW5kcyIsInVuaXF1ZUV4dGVuZHMiLCJtZXJnZVRzY29uZmlnRXh0ZW5kcyIsImVtaXREZWNsYXJhdGlvbk9ubHkiLCJyZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb25zIiwiZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eSIsIm1lcmdlZFR5cGVzIiwiZmlsdGVyRXhpc3RpbmdUeXBlcyIsInR5cGVOYW1lIiwidHlwZVJvb3RzIiwiZXhwZXJpbWVudGFsRGVjb3JhdG9ycyIsImJhc2VVcmwiLCJ2ZXJiYXRpbU1vZHVsZVN5bnRheCIsImdlbmVyYXRlZFR5cGVTZXQiLCJpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlIiwiZXhjbHVkZUZpbGVQYXR0ZXJucyIsImdlbmVyYXRlVnNjb2RlU2V0dGluZ3MiLCJleGNsdWRlRmlsZVBhdHRlcm4iLCJleGNsdWRlU2V0dGluZyIsImdlbmVyYXRlWWFybnJjWW1sIiwieWFybnJjWW1sUGF0aCIsImxhdGVzdFZlcnNpb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwibmV3VmVyc2lvbiIsIm9sZFZlcnNpb24iLCJ2YWxpZE5ld1ZlcnNpb24iLCJzZW12ZXIiLCJ2YWxpZCIsImd0IiwiaXNOZXdlclZlcnNpb24iLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsIm5wbU1pbmltYWxBZ2VHYXRlIiwibnBtUHJlYXBwcm92ZWRQYWNrYWdlcyIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJyZWxhdGl2ZSIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwicmVxdWVzdCIsIkRFUFJFQ0FURURfU0VDUkVUX05BTUVTIiwic2V0dXBTZWNyZXRzIiwiZG90ZW52Iiwic2VjcmV0TmFtZSIsInNlY3JldF9uYW1lIiwia2V5X2lkIiwia2V5SWQiLCJkYXRhIiwic29kaXVtIiwicmVhZHkiLCJzZWNyZXQiLCJyYXdLZXkiLCJmcm9tX2Jhc2U2NCIsImJhc2U2NF92YXJpYW50cyIsIk9SSUdJTkFMIiwicmF3U2VjIiwiZnJvbV9zdHJpbmciLCJlbmNCeXRlcyIsImNyeXB0b19ib3hfc2VhbCIsImVuY0Jhc2U2NCIsInRvX2Jhc2U2NCIsImVuY3J5cHRlZF92YWx1ZSIsInNldHVwR2l0SHViU2V0dGluZ3MiLCJiZWZvcmVSZXRyeSIsImhhbmRsZUVycm9yIiwicmV0cnlDb3VudCIsInJldHJ5TG9nZ2VyIiwic2hvdWxkUmV0cnkiLCJzbGVlcE1pbGxpc2Vjb25kcyIsInVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIiwiZmFpbGVkQ291bnQiLCJ3aXRoUmV0cnkiLCJhbGxvd19hdXRvX21lcmdlIiwiYWxsb3dfbWVyZ2VfY29tbWl0IiwiYWxsb3dfc3F1YXNoX21lcmdlIiwiYWxsb3dfcmViYXNlX21lcmdlIiwiYWxsb3dfdXBkYXRlX2JyYW5jaCIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsInBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIiLCJ0ZW1wbGF0ZXMiLCJnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyIsImFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZSIsImRpc3RhbmNlIiwidGVtcGxhdGUiLCJwYWNrYWdlTWFuYWdlckNvbW1hbmQiLCJ3YmZ5SnNvblNjaGVtYSIsInoiLCJyZWNvcmQiLCJvcHRpb25hbCIsImRvYyIsImdldFBhY2thZ2VDb25maWciLCJlc21QYWNrYWdlIiwicGFja2FnZUpzb25UZXh0IiwicmVsZWFzZUJyYW5jaGVzIiwicmVsZWFzZVBsdWdpbnMiLCJyZWxlYXNlcmNKc29uUGF0aCIsImZzcCIsImZsYXQiLCJyZXBvSW5mbyIsImdpdCIsInNpbXBsZUdpdCIsIm9yaWdpbiIsImdldFJlbW90ZXMiLCJyIiwicmVtb3RlVXJsIiwicmVmcyIsInJlcXVlc3RSZXBvSW5mbyIsImZldGNoUmVwb0luZm8iLCJjdXJyZW50IiwiaGFzVmVyc2lvblNldHRpbmdzRmlsZSIsImRvY2tlcmZpbGUiLCJ3YmZ5SnNvblBhdGgiLCJ3YmZ5SnNvblRleHQiLCJyZXBvRnVsbE5hbWUiLCJmdWxsX25hbWUiLCJyZXBvQXV0aG9yIiwicmVwb05hbWUiLCJyZXBvUGFydHMiLCJpc1JlZmVycmVkQnlPdGhlclJlcG8iLCJmaWxlcyIsImlzRXNtUGFja2FnZSIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24iLCJnaXRodWIiLCJwYXR0ZXJuIiwib3JnIiwicmV0IiwiYXNzaWduIiwicmVkaXJlY3RlZEZ1bGxOYW1lIiwibG9jYXRpb24iLCJnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lIiwiV0lMTEJPT1NURVJfQ09ORklHX1BBQ0tBR0VfTkFNRVMiLCJzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSIsInJlZnJlc2hCdW5Mb2NrIiwicm9vdERpclBhdGgiLCJsb2NrRmlsZVBhdGgiLCJiYWNrdXBMb2NrRmlsZVBhdGgiLCJybVN5bmMiLCJjb3B5RmlsZVN5bmMiLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJkZWZhdWx0IiwiYWxpYXMiLCJza2lwRGVwcyIsInZlcmJvc2UiLCJwYWNrYWdlSnNvbkRpciIsIlVSTCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsInN0cmljdCIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiZCIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJh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