wbfy 2.22.11 → 2.23.0
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.
- package/dist/index.js +2 -2
- package/package.json +23 -23
- package/dist/index.js.map +0 -1
package/dist/index.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
import e from"node:fs/promises";import t from"node:path";import{ignoreEnoentAsync as s,withRetry as n,ignoreErrorAsync as i}from"@willbooster/shared-lib";import o from"yargs";import r from"node:fs";import{globby as a,globbySync as c}from"globby";import{PromisePool as l}from"minimal-promise-pool";import p from"node:child_process";import d from"deepmerge";import u from"node:os";import{Octokit as m}from"@octokit/core";import f from"lodash.clonedeep";import g from"js-yaml";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const j=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:t}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function x(s){return j.functionIgnoringException("fixDockerfile",(async()=>{if(!s.doesContainsDockerfile)return;const n=s.dockerfile,i=n;n!==i&&await e.writeFile(t.join(s.dirPath,"Dockerfile"),i)}))}async function _(e){return j.functionIgnoringException("fixPlaywrightConfig",(async()=>{const s=t.join(e.dirPath,"playwright.config.ts");if(!r.existsSync(s))return;const n=await r.promises.readFile(s,"utf8"),i=n.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");n!==i&&await r.promises.writeFile(s,i)}))}async function P(s){return j.functionIgnoringException("fixPrismaEnvFiles",(async()=>{const n=await a(["*.env","*.env.*"],{dot:!0,cwd:s.dirPath});for(const i of n){const n=t.resolve(s.dirPath,i),o=(await e.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await e.writeFile(n,o)}}))}async function S(e){return j.functionIgnoringException("fixTestDirectories",(async()=>{await Promise.all(e.map((async e=>{const s=t.join(e,"__tests__"),n=t.join(e,"tests");try{await r.promises.rename(s,n);const i=await r.promises.readFile(t.join(e,"package.json"),"utf8"),o=i.replaceAll("__tests__","tests");if(i===o)return;await r.promises.writeFile(t.join(e,"package.json"),o)}catch{}})))}))}const $=new l;async function C(n,i){return j.functionIgnoringException("fixTypeDefinitions",(async()=>{const o=t.resolve(n.dirPath,"@types"),r=n.isRoot&&n.doesContainsSubPackageJsons?void 0:t.resolve(n.dirPath,"src","types"),a=await s((()=>e.readdir(o,{withFileTypes:!0})));if(a)for(const n of a){const a=n.name.slice(0,-5),c=n.name.endsWith(".d.ts");let l=c?a:n.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=i.some((e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]));n.isFile()&&c?p?(await e.mkdir(t.join(o,a)),await $.run((()=>e.rename(t.join(o,n.name),t.join(o,a,"index.d.ts"))))):r&&(await e.mkdir(r,{recursive:!0}),await $.run((()=>e.rename(t.join(o,n.name),t.join(r,n.name))))):n.isDirectory()&&r&&!p&&(await e.mkdir(r,{recursive:!0}),await $.run((()=>s((()=>e.rename(t.join(o,n.name,"index.d.ts"),t.join(r,`${n.name}.d.ts`)))))))}}))}const F={async readFileIgnoringError(t){try{return await e.readFile(t,"utf8")}catch{}},async generateFile(t,s){await e.writeFile(t,s)}};async function E(e){return j.functionIgnoringException("fixAbbreviations",(async()=>{const s=e.dirPath,n=await a("**/*.md",{dot:!0,cwd:s,gitignore:!0});k.isVerbose&&console.info(`Found ${n.length} markdown files in ${s}`);for(const i of n){const n=t.join(s,i);await $.run((async()=>{const t=await r.promises.readFile(n,"utf8");let s=O(t);s=A(s,e,"doc"),t!==s&&await F.generateFile(n,s)}))}const i=await a(["{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,gitignore:!0});k.isVerbose&&console.info(`Found ${i.length} TypeScript files in ${s}`);for(const n of i){const i=t.join(s,n),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=A(a,e,"ts"),o!==a&&await F.generateFile(i,a)}const o=await a("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,gitignore:!0});k.isVerbose&&console.info(`Found ${o.length} text-based files in ${s}`);for(const n of o){const i=t.join(s,n),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=A(a,e,"text"),o!==a&&await F.generateFile(i,a)}await $.promiseAll()}))}function O(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function A(e,t,s){for(const[s,n]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(s,n);for(const[n,i]of Object.entries(t.wbfyJson?.typos?.[s]??{}))e=e.replaceAll(n,i);return e}function B(e,t,s,n=0){do{const[n,i,o]=T(e,t,s);if(0===p.spawnSync(n,i,o).status)break}while(--n>=0)}function I(e,t,s){const[n,i,o]=T(e,t,s);o.stdio="pipe";const r=p.spawnSync(n,i,o),a=r.stderr.toString().trim();return a&&console.error(`${n} [${i.map((e=>`"${e}"`))}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function T(e,t,s){const n={...process.env};return n.PATH&&n.BERRY_BIN_FOLDER&&(n.PATH=n.PATH.replace(`${n.BERRY_BIN_FOLDER}:`,"")),n.ASDF_DIR&&(t=["-l","-c",`. ${n.ASDF_DIR}/asdf.sh && ${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:s,env:n,shell:!1,stdio:"inherit"}]}function R(e){const t=e.split(/[+.-]/).map(Number).filter(Number.isNaN);let s=0,n=1;for(const e of t)s+=e*n,n/=1e3;return s}const D="3.9.19",W="zulu-11.72.19",N="2.0.10",J="14.2.3";async function L(e){return j.functionIgnoringException("generateVersionConfigs",(async()=>{await async function(e){if(!e.versionsText)return;const s=e.versionsText.trim().split("\n").map((e=>{const[t,s]=e.trim().split(/\s+/);return`${z.has(t)?" ":""}${t} ${s}`})).sort().map((e=>e.trim())),n=[...new Set(s)];if(e.doesContainsPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),s=t?.info?.version;s&&U(n,"poetry",t?.info?.version),U(n,"python",D,!0)}e.depending.firebase&&U(n,"java",W,!0);if(e.doesContainsPackageJson){const t=I("npm",["show","yarn","version"],e.dirPath);U(n,"yarn",t)}for(const s of G){const n=t.resolve(e.dirPath,`.${s}-version`);r.promises.rm(n,{force:!0})}const i=t.resolve(e.dirPath,".tool-versions");await(n.length>0?$.run((()=>r.promises.writeFile(i,n.join("\n")+"\n"))):$.run((()=>r.promises.rm(i,{force:!0})))),await $.promiseAll(),B("asdf",["plugin","update","--all"],e.dirPath),B("asdf",["install"],e.dirPath)}(e)}))}const z=new Set(["java","nodejs","python"]),G=["java","node","python"];function U(e,t,s,n=!1){const i=e.findIndex((e=>e.split(/\s+/)[0]===t)),o=`${t} ${s}`;if(i>=0){const[,t]=e[i].split(/\s+/);R(s)>R(t)&&(e[i]=o)}else e.splice(n?0:e.length,0,o)}const H="# Project-specific settings",M=/# Project-specific settings[^\n]*\n/gm,q="# Generated by wbfy",Y=`${H} (head)\n\n\n${q}\n`,K=`\n${H} (tail)\n`,V={separator:q,separatorPrefix:"# Generated by ",defaultHeadUserContent:Y,defaultTailUserContent:K,async readGitignoreWithoutSeparators(e){try{let t=await r.promises.readFile(e,"utf8");const s=X(t);return s>0&&(t=t.slice(0,s-1)),t.replaceAll(M,"").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 t>=0?e.slice(0,e.indexOf("\n",t)+1).replaceAll(M,`${H} (head)\n`):Y},getTailUserContent(e){const t=X(e);return t>0?e.slice(t-1):K},async isBerryZeroInstallEnabled(e){try{return(await r.promises.readFile(e,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function X(e){const t=e.indexOf(H),s=e.lastIndexOf(H);return s>t?s:-1}const Z="\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n";async function Q(e){return j.functionIgnoringException("generateDockerignore",(async()=>{const s=t.resolve(e.dirPath,".dockerignore");if(e.doesContainsDockerfile){const e=await F.readFileIgnoringError(s)??"",t=V.getHeadUserContent(e),n=V.getTailUserContent(e),i=t+Z+n;await $.run((()=>F.generateFile(s,i)))}else await r.promises.rm(s,{force:!0})}))}const ee={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml"].sort(),codeWith4IndentSize:["go","gradle","py"].sort(),codeWith8IndentSize:["sh"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].sort(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].sort()},te=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${ne(ee.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${ne(ee.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${ne(ee.codeWith8IndentSize)}\nindent_size = 8\nindent_style = space\n\n${ne(ee.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function se(e){return j.functionIgnoringException("generateEditorconfig",(async()=>{const s=t.resolve(e.dirPath,".editorconfig");await $.run((()=>F.generateFile(s,te)))}))}function ne(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}const ie="\n3rd-party/\n@types/\n__generated__/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.config.*js\n*.d.ts\n*.min.*js\n.yarn/\n.pnp.js\n";async function oe(e){return j.functionIgnoringException("generateEslintignore",(async()=>{const s=t.resolve(e.dirPath,".eslintignore"),n=await F.readFileIgnoringError(s)??"",i=V.getHeadUserContent(n),o=V.getTailUserContent(n),r=t.resolve(e.dirPath,".gitignore"),a=await V.readGitignoreWithoutSeparators(r)||"",c=i+ie+a+o;await $.run((()=>F.generateFile(s,c)))}))}function re(e,t){return t}function ae(e,t,s){const n=[...e];for(const[i,o]of t.entries())void 0===n[i]?n[i]=s.cloneUnlessOtherwiseSpecified(o,s):s.isMergeableObject(o)?n[i]=d(e[i],o,s):e.includes(o)||n.push(o);return n}async function ce(e,s){return j.functionIgnoringException("generateEslintrc",(async()=>{const n=[];e.eslintBase&&n.push(e.eslintBase),e!==s&&n.push("../../.eslintrc.json");let i={root:!0,extends:n};const o=t.resolve(e.dirPath,".eslintrc.json");try{const t=await r.promises.readFile(o,"utf8"),s=JSON.parse(t);s.extends&&(s.extends=s.extends.filter((e=>!e.startsWith("@willbooster/")&&"../../.eslintrc.json"!==e))),0===n.length&&(s.extends=[]);const a=i.extends;i.extends=s.extends,s.extends=a,i=d.all([i,s,i],{arrayMerge:ae}),e.depending.blitz&&(i.extends=i.extends.filter((e=>"./node_modules/@blitzjs/next/eslint"!==e)))}catch{}const a=JSON.stringify(i);await $.run((()=>F.generateFile(o,a)))}))}const le=`* text=auto\n\n*.vcproj text eol=crlf\n\n${[...ee.codeWith2IndentSize,...ee.codeWith4IndentSize,...ee.markdownLike].map((e=>`*.${e} text eol=lf`)).join("\n")}\n\ndist/** linguist-generated=true\n`;async function pe(e){return j.functionIgnoringException("generateGitattributes",(async()=>{const s=t.resolve(e.dirPath,".gitattributes");await $.run((()=>F.generateFile(s,le)))}))}const de=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"],ue="\n!.keep\n.env.production\n*/mount/*.hash\n.idea/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\n\n";async function me(e,s){return j.functionIgnoringException("generateGitignore",(async()=>{const n=t.resolve(e.dirPath,".gitignore"),i=await F.readFileIgnoringError(n)??"";let o=V.getHeadUserContent(i)+ue;const r=V.getTailUserContent(i),a=[...de];e.doesContainsGemfile&&a.push("ruby"),e.doesContainsGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainsPackageJson&&a.push("node"),e.doesContainsPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainsPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainsTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainsPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(o+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(s.depending.firebase||e.depending.firebase)&&a.push("firebase"),s.depending.prisma&&(o+="*.sqlite3*\n*.sqlite3-journal\n"),e.depending.playwrightTest&&(o+="test-results/\n"),(s.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),o+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(o+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await he(e)??"";if(!t){const s=`https://www.toptal.com/developers/gitignore/api/${e}`,n=await fetch(s),i=await n.text();if(!n.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${s}`);t=i.trim(),await $.run((()=>ge(e,t))),k.isVerbose&&console.info(`Fetched ${s}`)}c&&(c+="\n"),c+=t+"\n"}await V.isBerryZeroInstallEnabled(n)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainsPomXml||e.doesContainsPubspecYaml)&&(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.doesContainsPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(s.depending.reactNative||e.depending.reactNative||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+c+r;await $.run((()=>F.generateFile(n,l)))}))}const fe=t.join(u.homedir(),".cache","wbfy","gitignore");async function ge(e,s){await r.promises.mkdir(fe,{recursive:!0}),await r.promises.writeFile(t.join(fe,e),s)}async function he(e){try{const s=await r.promises.stat(t.join(fe,e));if(Date.now()-s.mtimeMs>216e5)return;return await r.promises.readFile(t.join(fe,e),"utf8")}catch{}}const ye={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},we=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,be=!!we,ve=new m({auth:we});const ke=new class{getOrgAndName(e){const t=e.split(":").at(-1),s=t?.split("/");return[s?.at(-2)??"",s?.at(-1)?.replace(/.git$/,"")??""]}},je={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};function xe(e){return e.depending.blitz?je.blitz:je.node}const _e=["eslint@8.57.0","eslint-config-prettier","eslint-plugin-import","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn"],Pe=[..._e,"@typescript-eslint/eslint-plugin","@typescript-eslint/parser","eslint-import-resolver-typescript"],Se=["eslint-plugin-react","eslint-plugin-react-hooks"],$e={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",..._e],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",..._e,...Se],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...Pe],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...Pe,...Se],"@willbooster/eslint-config-blitz-next":["@willbooster/eslint-config-blitz-next","eslint-config-next",...Pe,...Se],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...Pe,...Se]};async function Ce(e,s,n){return j.functionIgnoringException("generatePackageJson",(async()=>{await async function(e,s,n){const i=t.resolve(e.dirPath,"package.json"),o=await r.promises.readFile(i,"utf8"),l=JSON.parse(o);l.scripts=l.scripts||{},l.dependencies=l.dependencies||{},l.devDependencies=l.devDependencies||{},l.peerDependencies=l.peerDependencies||{},await async function(e,t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");if(delete t.scripts["sort-package-json"],delete t.scripts["sort-all-package-json"],delete t.scripts["typecheck/warn"],delete t.scripts["typecheck:gen-code"],delete t.scripts["typecheck:codegen"],delete t.dependencies["@willbooster/shared-scripts"],delete t.dependencies.tslib,delete t.devDependencies["@willbooster/eslint-config"],delete t.devDependencies["@willbooster/eslint-config-react"],delete t.devDependencies["@willbooster/renovate-config"],delete t.devDependencies["@willbooster/shared-scripts"],delete t.devDependencies["@willbooster/tsconfig"],delete t.devDependencies["eslint-import-resolver-node"],delete t.devDependencies["eslint-plugin-prettier"],delete t.devDependencies.lerna,delete t.devDependencies.pinst,delete t.scripts["flutter-format"],delete t.scripts["format-flutter"],delete t.scripts["python-format"],delete t.scripts["format-python"],delete t.scripts.prettier,!e.isWillBoosterConfigs)for(const e of Object.values($e))for(const s of e)delete t.devDependencies[s];await $.run((()=>r.promises.rm("lerna.json",{force:!0})))}(s,l),"@willbooster/prettier-config"!==l.name&&(l.prettier="@willbooster/prettier-config");for(const[e,t]of Object.entries(l.scripts))t.includes("git clone")||(l.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));l.scripts=d(l.scripts,Fe(e)),l.scripts.prettify+=await async function(e){const s=t.resolve(e,".prettierignore"),n=await r.promises.readFile(s,"utf8"),i=n.indexOf(V.separatorPrefix);if(i<0)return"";const o=n.slice(0,i);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("")}(e.dirPath);for(const[e,t]of Object.entries(l.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(l.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],u=["lint-staged","prettier","sort-package-json","@willbooster/prettier-config"];const m=[];if(e.isRoot){if(u.push("husky"),l.scripts.prepare="husky || true",l.scripts.postinstall="husky || true",(e.isPublicRepo||e.isReferredByOtherRepo)&&(u.push("pinst"),l.scripts.prepack="pinst --disable",l.scripts.postpack="pinst --enable"),e.depending.semanticRelease){const e=l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]?"@6.1.0":"";u.push(`conventional-changelog-conventionalcommits${e}`),l.devDependencies["semantic-release"]||l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),l.version="0.0.0-semantically-released"}e.depending.playwrightTest&&(l.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete l.dependencies["@playwright/test"]),delete l.dependencies.playwright,delete l.devDependencies.playwright),e.doesContainsSubPackageJsons?l.workspaces=Array.isArray(l.workspaces)?d.all([l.workspaces,["packages/*"]],{arrayMerge:ae}):["packages/*"]:Array.isArray(l.workspaces)&&(l.workspaces=l.workspaces.filter((t=>c(t,{dot:!0,cwd:e.dirPath,gitignore:!0}).length>0)),0===l.workspaces.length&&delete l.workspaces)}if(e.depending.wb){l.dependencies["@willbooster/shared-scripts"]||l.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):u.push("@willbooster/wb");for(const[e,t]of Object.entries(l.scripts))l.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(u.push("eslint@8.57.0","micromatch"),e.doesContainsTypeScriptInPackages&&u.push("@typescript-eslint/parser"));(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&u.push("typescript");e.eslintBase&&u.push(...$e[e.eslintBase]);e.isWillBoosterConfigs&&(p=p.filter((e=>!e.includes("@willbooster/"))),u=u.filter((e=>!e.includes("@willbooster/"))));l.name||(l.name=t.basename(e.dirPath));e.doesContainsSubPackageJsons&&(l.private=!0);l.license||(l.license="UNLICENSED");!l.private&&"UNLICENSED"!==l.license&&s.isPublicRepo&&(l.publishConfig??={},l.publishConfig.access??="public");const[f]=ke.getOrgAndName(e.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(l.author="WillBooster Inc.");e.isRoot||!l.private||l.main||(l.main="./src");if(delete l.resolutions?.["npm/chalk"],!e.doesContainsSubPackageJsons){if(e.doesContainsJavaScript||e.doesContainsTypeScript?l.scripts["lint-fix"]+=ye.getLintFixSuffix(e):(delete l.scripts.lint,delete l.scripts["lint-fix"],l.scripts.cleanup=l.scripts.cleanup?.replace(" && yarn lint-fix","")),e.doesContainsPubspecYaml){l.scripts.lint="flutter analyze",l.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter((s=>r.existsSync(t.resolve(e.dirPath,s))));s.length>0&&(l.scripts["format-code"]=`flutter format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,l.scripts.format+=" && yarn format-code")}if(e.doesContainsPoetryLock){"poetry install"===l.scripts.postinstall&&delete l.scripts.postinstall;const t=await a("**/*.py",{cwd:e.dirPath,dot:!0,gitignore:!0,ignore:["test-fixtures"]}),s=new Set;for(const e of t){const[t,n]=e.split(/[/\\]/);n&&s.add(t)}if(s.size>0){const e=[...s].join(" ");l.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,l.scripts.lint?l.scripts.lint=`poetry run flake8 ${e} && ${l.scripts.lint}`:(l.scripts.lint=`poetry run flake8 ${e}`,l.scripts["lint-fix"]="yarn lint"),l.scripts.format+=" && yarn format-code",m.push("black","isort","flake8")}}e.repository&&(l.repository=e.repository)}e.depending.blitz?(p.push(`blitz@${N}`,`@blitzjs/auth@${N}`,`@blitzjs/next@${N}`,`@blitzjs/rpc@${N}`,`next@${J}`),u=u.filter((e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e)),l.scripts["gen-code"]?.startsWith("blitz codegen")?l.scripts["gen-code"].includes("blitz prisma generate")||(l.scripts["gen-code"]=l.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):l.scripts["gen-code"]="blitz codegen"):e.depending.prisma&&!l.scripts["gen-code"]?.startsWith("prisma generate")&&(l.scripts["gen-code"]="prisma generate");e.depending.next&&delete l.devDependencies["@types/react"];l.dependencies?.prettier||delete l.devDependencies["@types/prettier"];0===Object.keys(l.dependencies).length&&delete l.dependencies;0===Object.keys(l.devDependencies).length&&delete l.devDependencies;0===Object.keys(l.peerDependencies).length&&delete l.peerDependencies;let g=JSON.stringify(l);g=await async function(e,s,n){const i=[];for(const[t]of Object.keys(e))":"!==t[0]&&t.includes(":")&&i.push([t,t.replaceAll(":","-")]);if(0===i.length)return s;for(const[e,t]of i)s=s.replaceAll(e,t);const o=await a(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:n.dirPath,dot:!0,gitignore:!0});for(const e of o)await $.run((async()=>{const s=t.join(n.dirPath,e),o=await r.promises.readFile(s,"utf8");let a=o;for(const[e,t]of i)a=a.replaceAll(e,t);a!==o&&await r.promises.writeFile(s,a)}));return await $.promiseAll(),s}(l.scripts,g,e),await r.promises.writeFile(i,g),n||(p=p.filter((e=>!l.devDependencies?.[e])),p.length>0&&B("yarn",["add",...new Set(p)],e.dirPath),u=u.filter((e=>!l.dependencies?.[e])),u.length>0&&B("yarn",["add","-D",...new Set(u)],e.dirPath),m.length>0&&B("poetry",["add","--group","dev",...new Set(m)],e.dirPath))}(e,s,n)}))}function Fe(e){let t={cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:`eslint --color "./{${xe(e)}}/**/*.{${ee.eslint.join(",")}}"`,"lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ee.prettier.join(",")}}" "!**/test-fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};if(e.doesContainsSubPackageJsons){const e=t.test;t=d({...t},{format:"sort-package-json && 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 --write "**/{.*/,}*.{${ee.prettier.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?.includes("wb test")&&(t.test=e)}else e.depending.pyright&&(t.typecheck=t.typecheck?`${t.typecheck} && `:"",t.typecheck+="pyright");return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages?e.depending.wb&&(t.typecheck="wb typecheck"):delete t.typecheck,t}const Ee={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\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\nyarn typecheck\n'.trim(),postMerge:'\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 Oe(e){return j.functionIgnoringException("generateHuskyrc",(async()=>{await async function(e){const s=t.resolve(e.dirPath,"package.json"),n=await r.promises.readFile(s,"utf8"),i=JSON.parse(n);i.scripts||={},delete i.scripts.postinstall,delete i.scripts.postpublish,delete i.scripts.prepare,delete i.scripts.prepublishOnly,delete i.scripts.prepack,delete i.scripts.postpack;const o=t.resolve(e.dirPath,".husky");await Promise.all([r.promises.writeFile(s,JSON.stringify(i,void 0,2)),r.promises.rm(o,{force:!0,recursive:!0})]),B("yarn",["dlx","husky-init","--yarn2"],e.dirPath);const a=t.resolve(o,"pre-commit");await $.run((()=>r.promises.rm(t.resolve(e.dirPath,".huskyrc.json"),{force:!0}))),await $.run((()=>r.promises.writeFile(a,Ee.preCommit+"\n")));const{typecheck:c}=Fe(e);if(c){let s=e.repository?.startsWith("github:WillBoosterLab/")?Ee.prePushForLab:Ee.prePush;s=s.replace("yarn typecheck",c.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await $.run((()=>r.promises.writeFile(t.resolve(o,"pre-push"),s+"\n",{mode:493})))}const l=[];e.versionsText&&l.push(String.raw`run_if_changed "\..+-version" "asdf plugin update --all"`);e.versionsText?.includes("python ")&&l.push(String.raw`run_if_changed "\..+-version" "asdf install python"`);e.versionsText&&l.push(String.raw`run_if_changed "\..+-version" "asdf install"`);const p=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";l.push(`run_if_changed "package\\.json" "yarn${p}"`),e.doesContainsPoetryLock&&l.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`);e.depending.blitz?l.push('run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma migrate deploy"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma generate"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz codegen"'):e.depending.prisma&&l.push('run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"','run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"');const d=`${Ee.postMerge}\n\n${l.join("\n")}\n`;await $.run((()=>r.promises.writeFile(t.resolve(o,"post-merge"),d,{mode:493})))}(e)}))}function Ae(e,t,s,n){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="${n}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${s} (.${n})" />\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 Be=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ee.prettier.map((e=>Ae("node","node_modules/.bin/prettier --cache --write","Prettier",e))).join("")}\n </component>\n</project>\n`,Ie=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ee.prettier.map((e=>Ae("bun","node_modules/.bin/biome check --apply","Biome",e))).join("")}\n </component>\n</project>\n`;async function Te(e){return j.functionIgnoringException("generateIdeaSettings",(async()=>{const s=t.resolve(e.dirPath,".idea");if(r.existsSync(s)){const n=t.resolve(s,"watcherTasks.xml");await(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||e.doesContainsPackageJson&&!e.doesContainsPubspecYaml&&!e.doesContainsGemfile&&!e.doesContainsGoMod&&!e.doesContainsPomXml?$.run((()=>F.generateFile(n,e.isBun?Ie:Be))):$.run((()=>r.promises.rm(n,{force:!0}))))}}))}async function Re(e){return j.functionIgnoringException("generateLintstagedrc",(async()=>{await async function(e){const s=e.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",n=[];if(e.doesContainsJavaScript||e.doesContainsTypeScript){const t=`\n '${De(e)}': [${JSON.stringify(`${s}eslint --fix${ye.getLintFixSuffix(e)}`)}, '${s}prettier --cache --write'],`;n.push(t)}const i=e.isRoot?" && !file.includes('/packages/')":"";n.push(`\n './**/*.{${ee.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${i});${function(e){return e.doesContainsJavaScript||e.doesContainsTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${De(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(e)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${s}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${s}sort-package-json');\n }\n return commands;\n },`),e.doesContainsPubspecYaml&&n.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`flutter format ${filteredFiles.join(' ')}`];\n },");e.doesContainsPoetryLock&&n.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const o=`const path = require('path');\n${e.doesContainsJavaScript||e.doesContainsTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${n.join("")}\n};\n`,a=t.resolve(e.dirPath,".lintstagedrc.cjs");await $.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.js"),{force:!0}))),await $.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.json"),{force:!0}))),await $.run((()=>F.generateFile(a,o)))}(e)}))}function De(e){return`./{${xe(e).join(",")}}/**/*.{${ee.eslint.join(",")}}`}async function We(e){return j.functionIgnoringException("generateNextConfigJson",(async()=>{const s=["js","mjs","cjs"].map((s=>t.resolve(e.dirPath,`next.config.${s}`))).find((e=>r.existsSync(e)));if(!s)return;const n=(await r.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,((e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`)));await $.run((()=>F.generateFile(s,n)))}))}const Ne="\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n";async function Je(e){return j.functionIgnoringException("generatePrettierignore",(async()=>{const s=t.resolve(e.dirPath,".prettierignore"),n=await F.readFileIgnoringError(s)??"",i=V.getHeadUserContent(n),o=V.getTailUserContent(n),r=t.resolve(e.dirPath,".gitignore"),a=await V.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainsPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+Ne+c+a+o;await $.run((()=>F.generateFile(s,l)))}))}const Le={venvPath:".",venv:".venv"};async function ze(e){return j.functionIgnoringException("generatePyrightConfigJson",(async()=>{let s=f(Le);const n=t.resolve(e.dirPath,"pyrightconfig.json");try{const e=await r.promises.readFile(n,"utf8"),t=JSON.parse(e);s=d.all([s,t,s],{arrayMerge:re})}catch{}const i=JSON.stringify(s);await $.run((()=>F.generateFile(n,i)))}))}const Ge="[](https://github.com/semantic-release/semantic-release)";async function Ue(e){return j.functionIgnoringException("generateReadme",(async()=>{const s=t.resolve(e.dirPath,"README.md");let n=await r.promises.readFile(s,"utf8");r.existsSync(t.resolve(e.dirPath,".releaserc.json"))&&(n=He(n,Ge));const i=e.repository?.slice(e.repository?.indexOf(":")+1),o=r.readdirSync(`${e.dirPath}/.github/workflows`);for(const s of o){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let o=s;o=o[0].toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," ");const a=`[](https://github.com/${i}/actions/workflows/${s})`;r.existsSync(t.resolve(e.dirPath,`.github/workflows/${s}`))&&(n=He(n,a))}await $.run((()=>F.generateFile(s,n)))}))}function He(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let s=0;s<e.length;s++)if("\n"===e[s-1]&&"\n"===e[s]){const n=e.slice(0,s+1);let i=e.slice(s+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${n}${t}\n${i}`}return`${e}\n${t}\n`}async function Me(e){return j.functionIgnoringException("generateReleaserc",(async()=>{const s=t.resolve(e.dirPath,".releaserc.json"),n=JSON.parse(await r.promises.readFile(s,"utf8")),i=n?.plugins||[];for(let e=0;e<i.length;e++){const t=Array.isArray(i[e])?i[e][0]:i[e],s=Array.isArray(i[e])&&i[e][1]||{};"@semantic-release/commit-analyzer"===t?i[e]=["@semantic-release/commit-analyzer",d.all([s,{preset:"conventionalcommits"}],{arrayMerge:re})]:"@semantic-release/github"===t&&(i[e]=["@semantic-release/github",d.all([s,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:re})])}const o=JSON.stringify(n);await $.run((()=>F.generateFile(s,o)))}))}const qe={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function Ye(e){return j.functionIgnoringException("generateRenovateJson",(async()=>{let s=f(qe);const n=t.resolve(e.dirPath,"renovate.json");if(r.existsSync(`${n}5`))return;try{const e=await r.promises.readFile(n,"utf8"),t=JSON.parse(e);s=d.all([s,t,s],{arrayMerge:re}),s.extends=s.extends.filter((e=>"@willbooster"!==e))}catch{}e.depending.blitz&&(s.packageRules??=[],s.packageRules.some((e=>e.packageNames.includes("next")))||s.packageRules.push({packageNames:["next"],enabled:!1})),await $.run((()=>r.promises.rm(t.resolve(e.dirPath,".dependabot"),{force:!0}))),await $.run((()=>r.promises.rm(t.resolve(e.dirPath,".renovaterc.json"),{force:!0})));const i=JSON.stringify(s);await $.run((()=>F.generateFile(n,i)))}))}function Ke(e){const t=Object.entries(e).sort((([e],[t])=>e.localeCompare(t)));for(const[s,n]of t)delete e[s],e[s]=n,"object"==typeof n&&null!==n&&Ke(n);return e}const Ve={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*","packages/*/src/**/*","packages/*/tests/**/*","packages/*/scripts/**/*"]},Xe={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*"]};async function Ze(e){return j.functionIgnoringException("generateTsconfig",(async()=>{if(e.depending.blitz||e.depending.next)return;let s=f(e.isRoot?Ve:Xe);e.doesContainsJsxOrTsx||e.doesContainsJsxOrTsxInPackages||delete s.compilerOptions?.jsx,e.isRoot&&!e.doesContainsSubPackageJsons&&(s.include=s.include?.filter((e=>!e.startsWith("packages/*/")))),e.isEsmPackage&&(s.compilerOptions={...s.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const n=t.resolve(e.dirPath,"tsconfig.json");try{const t=await r.promises.readFile(n,"utf8"),i=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===i.extends&&delete i.extends,delete s.compilerOptions?.target,e.isEsmPackage||(delete s.compilerOptions?.module,delete s.compilerOptions?.moduleResolution),i.compilerOptions?.jsx&&delete s.compilerOptions?.jsx,s=d.all([s,i,s],{arrayMerge:ae}),s.include=s.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}Ke(s),s.include?.sort();const i=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await $.run((()=>F.generateFile(n,i)))}))}const Qe=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function et(e){return j.functionIgnoringException("generateVscodeSettings",(async()=>{try{const s=t.resolve(e.dirPath,".vscode","settings.json"),n=await r.promises.readFile(s,"utf8");let i=JSON.parse(n);for(const e of Qe)i=d.all([i,tt(e)]);e.doesContainsPoetryLock&&(i=d.all([i,tt("**/.venv/**")])),e.depending.next&&(i=d.all([i,tt("**/.next/**")])),Ke(i??{});const o=JSON.stringify(i,void 0,2);await $.run((()=>F.generateFile(s,o)))}catch{}}))}function tt(e){return{"files.watcherExclude":{[e]:!0}}}const st={test:{name:"Test",on:{pull_request:{"paths-ignore":["**.md","**/docs/**"]},push:{branches:["main","wbfy"],"paths-ignore":["**.md","**/docs/**"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},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},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},wbfy:{name:"Willboosterify",on:{workflow_dispatch:null},jobs:{wbfy:{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy.yml@main"}}},"wbfy-merge":{name:"Merge wbfy",on:{workflow_dispatch:null},jobs:{"wbfy-merge":{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy-merge.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:{},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"notify-ready":{name:"Notify ready",on:{issues:{types:["labeled"]}},jobs:{"notify-ready":{uses:"WillBooster/reusable-workflows/.github/workflows/notify-ready.yml@main",secrets:{DISCORD_WEBHOOK_URL:"${{ secrets.DISCORD_WEBHOOK_URL_FOR_READY }}"}}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"add-issue-to-project":{name:"Add issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",secrets:{GH_PROJECT_URL:"${{ secrets.GH_PROJECT_URL }}"}}}},"add-ready-issue-to-project":{name:"Add ready issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-ready-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",with:{labeled:"ready :rocket:"},secrets:{GH_PROJECT_URL:"https://github.com/orgs/WillBoosterLab/projects/5"}}}}};async function nt(e){return j.functionIgnoringException("generateWorkflow",(async()=>{const s=t.resolve(e.dirPath,".github","workflows");await r.promises.mkdir(s,{recursive:!0});const n=t.resolve(e.dirPath,".github","semantic.yml");await $.run((()=>r.promises.rm(n,{force:!0,recursive:!0})));const i=await r.promises.readdir(s,{withFileTypes:!0}),o=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml",...i.filter((e=>e.isFile()&&e.name.endsWith(".yml"))).map((e=>e.name))]);e.depending.semanticRelease&&o.add("release.yml"),(e.isPublicRepo||e.repository?.startsWith("github:WillBoosterLab/"))&&(o.add("add-ready-issue-to-project.yml"),o.add("notify-ready.yml"));for(const n of o){const i=t.basename(n,".yml");await $.run((()=>it(e,s,i)))}await $.run((()=>r.promises.rm(t.join(s,"add-focused-issue-to-project.yml"),{force:!0,recursive:!0})))}))}async function it(e,s,n){let i=f(st[n]??{});const o=t.join(s,`${n}.yml`);try{const e=await r.promises.readFile(o,"utf8"),t=g.load(e);i=d.all([i,t,i],{arrayMerge:ae})}catch{}n.startsWith("deploy")&&(i={...i,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},i.jobs&&function(e,t){const s=e[t];delete e[t],e[t]=s}(i,"jobs"),i.on?.push&&(i.on.push["paths-ignore"]=[...new Set([...i.on.push["paths-ignore"]??[],"**.md","**/docs/**"])]));for(const t of Object.values(i.jobs)){if(!t.uses?.includes?.("/reusable-workflows/"))return;ot(e,t,n)}switch(n){case"release":if(i.on?.schedule)delete i.on.push;else{if(!(i.on?.push&&e.release.branches.length>0))return void await r.promises.rm(t.join(s,"release.yml"),{force:!0});i.on.push.branches=e.release.branches}break;case"test":i.on?.push&&(i.on.push.branches=i.on.push.branches.filter((e=>"renovate/**"!==e)));break;case"wbfy":i.on&&rt(i,20,24);break;case"wbfy-merge":rt(i,1,4)}if(function(e){delete e.jobs["add-to-project"]}(i),await at(i,o),"release"===n)await r.promises.rm(t.join(s,"semantic-release.yml"),{force:!0});else if("sync"===n){if(await r.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!i.jobs.sync||!i.jobs.sync.with)return;i.jobs["sync-force"]=i.jobs.sync;const e=i.jobs.sync.with.sync_params_without_dest;if(!e)return;i.jobs.sync.with.sync_params_without_dest=`--force ${e}`,i.name="Force to Sync",i.on={workflow_dispatch:null},delete i.jobs.sync,await at(i,t.join(s,"sync-force.yml"))}}function ot(e,t,s){if(t.with||={},t.secrets||={},"test"!==s&&"release"!==s&&"wbfy"!==s&&"wbfy-merge"!==s&&"add-issue-to-project"!==s&&"add-ready-issue-to-project"!==s||(t.secrets.GH_TOKEN=e.isPublicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==s&&"test"!==s||(t.secrets.NPM_TOKEN="${{ secrets.NPM_TOKEN }}"),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"===s||s.startsWith("deploy"))||t.with.server_url&&s.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===s){const e=t.with?.sync_params_without_dest;e&&(t.with.sync_params_without_dest=e.toString().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/")),function(e){if(!e.with)return;delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,".env"===e.with.dot_env_path&&delete e.with.dot_env_path;delete e.with.cpu_arch,delete e.with.label,delete e.with.labelOperator}(t),s.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.toString().replace(/\s+--json/,"")),e.doesContainsDockerfile&&("extra-large"!==t.with.ci_size&&(s.startsWith("deploy")||s.startsWith("test"))&&(t.with.ci_size="large"),s.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===s||"test"===s||"wbfy"===s||"wbfy-merge"===s||s.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?Ke(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Ke(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function rt(e,t,s){const[n,i]=(e.on.schedule?.[0]?.cron??"").split(" ").map(Number);if(0!==n&&Number.isInteger(i)){const e=(i+9)%24;if(t<s?t<=e&&e<s:t<=e||e<s)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(s-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function at(e,t){const s=g.dump(e,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await r.promises.writeFile(t,s)}async function ct(e){return j.functionIgnoringException("generateYarnrcYml",(async()=>{const s=I("yarn",["--version"],e.dirPath),n=function(e,t){const s=I("npm",["show",e,"versions","--json"],t);return JSON.parse(s).at(-1)}("@yarnpkg/cli",e.dirPath);lt(s)<=lt(n)&&s!==n&&B("yarn",["set","version",n],e.dirPath,1);const i=t.join(e.dirPath,".yarn","releases");await r.promises.mkdir(i,{recursive:!0});for(const e of await r.promises.readdir(i))e.startsWith("yarn-")&&!e.startsWith(`yarn-${n}.`)&&await $.run((()=>r.promises.rm(t.join(i,e))));const o=t.resolve(e.dirPath,".yarnrc");await $.run((()=>r.promises.rm(o,{force:!0})));const a=t.resolve(e.dirPath,".yarnrc.yml"),c=g.load(await r.promises.readFile(a,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",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 s=t.resolve(e.dirPath,".yarnrc","undefined.cjs");await $.run((()=>r.promises.rm(s,{force:!0})))}0===c.plugins.length&&delete c.plugins,await r.promises.writeFile(a,g.dump(c,{lineWidth:-1})),B("yarn",["dlx","yarn-plugin-auto-install"],e.dirPath)}))}function lt(e){const[t]=e.split(".");return Number(t)}async function pt(e){return j.functionIgnoringException("setupLabels",(async()=>{if(!be)return;const[t,s]=ke.getOrgAndName(e.repository??"");if(t&&s&&("WillBooster"===t||"WillBoosterLab"===t))try{await dt(t,s,"d1: x-easy :hedgehog:","EDE9FE"),await dt(t,s,"d2: easy :rabbit2:","DDD6FE"),await dt(t,s,"d3: medium :ox:","C4B5FD"),await dt(t,s,"d4: hard :squid:","A78BFA"),await dt(t,s,"d5: x-hard :whale2:","8B5CF6"),await dt(t,s,"p1: critical :fire::fire::fire:","EF4444"),await dt(t,s,"p2: urgent :fire::fire:","F87171"),await dt(t,s,"p3: important :fire:","FCA5A5"),await dt(t,s,"p4: nice to have :droplet:","FECACA"),await dt(t,s,"r: blitz","5300bc"),await dt(t,s,"r: firebase","ffca28"),await dt(t,s,"r: prisma","0c344b"),await dt(t,s,"r: react","61dafb"),await dt(t,s,"r: svelte","ff3e00"),await dt(t,s,"r: semantic-release","494949"),await dt(t,s,"ready :rocket:","22C55E"),await dt(t,s,"review requested :mag:","FBCA04"),await dt(t,s,"released :bookmark:","6366F1"),await dt(t,s,"s: 0.5h :clock1230:","F3F4F6"),await dt(t,s,"s: 1h :clock1:","E5E7EB"),await dt(t,s,"s: 2h :clock2:","D1D5DB"),await dt(t,s,"s: 3h :clock3:","9CA3AF"),await dt(t,s,"s: 5h :clock5:","6B7280"),await dt(t,s,"s: 8h :clock8:","4B5563"),await dt(t,s,"s: 13h :clock1:","374151"),await dt(t,s,"t: build :hammer:","BFDBFE"),await dt(t,s,"t: chore :broom:","BFDBFE"),await dt(t,s,"t: ci :construction_worker:","BFDBFE"),await dt(t,s,"t: docs :memo:","BFDBFE"),await dt(t,s,"t: feat :sparkles:","BFDBFE"),await dt(t,s,"t: fix :bug:","BFDBFE"),await dt(t,s,"t: perf :zap:","BFDBFE"),await dt(t,s,"t: refactor :recycle:","BFDBFE"),await dt(t,s,"t: style :lipstick:","BFDBFE"),await dt(t,s,"t: test :test_tube:","BFDBFE"),await dt(t,s,"project","24292F"),await dt(t,s,"focused :dart:","22C55E"),await ut(t,s,"bug"),await ut(t,s,"documentation"),await ut(t,s,"duplicate"),await ut(t,s,"enhancement"),await ut(t,s,"good first issue"),await ut(t,s,"help wanted"),await ut(t,s,"invalid"),await ut(t,s,"question"),await ut(t,s,"wontfix"),await ut(t,s,"ready"),await ut(t,s,"review requested"),await ut(t,s,"released"),await ut(t,s,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function dt(e,t,s,n){try{await ve.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:s,color:n})}catch{await ve.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:s,color:n})}}async function ut(e,t,s){try{await ve.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:s})}catch{}}const mt=["READY_DISCORD_WEBHOOK_URL"];async function ft(e){return j.functionIgnoringException("setupSecrets",(async()=>{if(!be||!k.doesUploadEnvVars)return;const[t,s]=ke.getOrgAndName(e.repository??"");if(!t||!s||"WillBoosterLab"!==t)return;const n=h.config().parsed||{};if(0!==Object.keys(n).length)try{for(const e of mt)try{await ve.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:s,secret_name:e})}catch{}const i=await ve.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:s}),{key:o,key_id:r}=i.data;await y.ready;for(const[i,a]of Object.entries(n)){if(e.isPublicRepo&&"GH_BOT_PAT"===i)continue;if(!e.isPublicRepo&&"PUBLIC_GH_BOT_PAT"===i)continue;const n=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,n),p=y.to_base64(l,y.base64_variants.ORIGINAL);await ve.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:s,secret_name:i,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}}))}async function gt(e){const[t,s]=ke.getOrgAndName(e.repository??"");t&&s&&("WillBooster"!==t&&"WillBoosterLab"!==t||await n((()=>ve.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:s,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,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 ht={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on PR page. (You may leave this box unchecked due to long workflows.)\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 - All tests are passed.\n - Test command (e.g., `yarn test`) is passed.\n - Lint command (e.g., `yarn lint`) is passed.\n- [ ] I\'ve reviewed my changes on PR\'s diff view.\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'.trim()};async function yt(e){return j.functionIgnoringException("generateGitHubTemplates",(async()=>{for(const[s,n]of Object.entries(ht)){const i=t.resolve(e.dirPath,".github",s);if(r.existsSync(i)){const e=await r.promises.readFile(i,"utf8");if(w(e,n)>n.length/2)continue}await r.promises.mkdir(t.resolve(e.dirPath,".github"),{recursive:!0}),await $.run((()=>F.generateFile(i,n)))}}))}const wt=v.object({typos:v.object({all:v.record(v.string()).optional(),doc:v.record(v.string()).optional(),ts:v.record(v.string()).optional(),text:v.record(v.string()).optional()}).optional()});async function bt(s){const n=t.resolve(s,"package.json");try{const i=r.existsSync(n);let o={},a={},c={},l=!1;if(i){const e=r.readFileSync(n,"utf8");c=JSON.parse(e),o=c.dependencies??{},a=c.devDependencies??{},l="module"===c.type}let p=[],d=[];try{const n=t.resolve(s,".releaserc.json"),i=JSON.parse(await e.readFile(n,"utf8"));p=i?.branches||[],d=i?.plugins?.flat()||[]}catch{}const u="packages"!==t.basename(t.resolve(s,".."))||!r.existsSync(t.resolve(s,"..","..","package.json"));let m;u&&(m=await async function(e,t){const s=b(e),n=(await s.getRemotes(!0)).find((e=>"origin"===e.name)),i=n?.refs?.fetch??n?.refs?.push;if("string"==typeof i){const e=await kt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await kt(o);if(e&&"Not Found"!==e.message)return e}}(s,c));let f="";try{f+=(await e.readFile(t.resolve(s,".tool-versions"),"utf8")).trim()}catch{}for(const[n,i]of[["java","java"],["node","nodejs"],["python","python"]])try{const o=await e.readFile(t.resolve(s,`.${n}-version`),"utf8");f&&(f+="\n"),f+=i+" "+o.trim()}catch{}let g="";try{g=await e.readFile(t.resolve(s,"Dockerfile"),"utf8")}catch{}const h=t.resolve(s,"wbfy.json");let y;try{const t=await e.readFile(h,"utf8");y=wt.parse(JSON.parse(t))}catch{}const w={dirPath:s,dockerfile:g,isRoot:u,isPublicRepo:!1===m?.private,isReferredByOtherRepo:!!c.files,repository:m?.full_name?`github:${m?.full_name}`:void 0,isBun:r.existsSync(t.join(s,"bunfig.toml")),isEsmPackage:l,isWillBoosterConfigs:n.includes(`${t.sep}willbooster-configs`),doesContainsSubPackageJsons:vt("packages/**/package.json",s),doesContainsDockerfile:!!g||r.existsSync(t.resolve(s,"docker-compose.yml")),doesContainsGemfile:r.existsSync(t.resolve(s,"Gemfile")),doesContainsGoMod:r.existsSync(t.resolve(s,"go.mod")),doesContainsPackageJson:r.existsSync(t.resolve(s,"package.json")),doesContainsPoetryLock:r.existsSync(t.resolve(s,"poetry.lock")),doesContainsPomXml:r.existsSync(t.resolve(s,"pom.xml")),doesContainsPubspecYaml:r.existsSync(t.resolve(s,"pubspec.yaml")),doesContainsTemplateYaml:r.existsSync(t.resolve(s,"template.yaml")),doesContainsVscodeSettingsJson:r.existsSync(t.resolve(s,".vscode","settings.json")),doesContainsJavaScript:vt("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",s),doesContainsTypeScript:vt("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",s),doesContainsJsxOrTsx:vt("{app,src,tests}/**/*.{t,j}sx",s),doesContainsJavaScriptInPackages:vt("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",s),doesContainsTypeScriptInPackages:vt("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",s),doesContainsJsxOrTsxInPackages:vt("packages/**/{app,src,tests}/**/*.{t,j}sx",s),depending:{blitz:!!o.blitz,firebase:!!a["firebase-tools"],litestream:g.includes("install-litestream.sh"),next:!!o.next,playwrightTest:!!o["@playwright/test"]||!!a["@playwright/test"]||!!a.playwright,prisma:!!o["@prisma/client"]||!!a.prisma,pyright:!!a.pyright,reactNative:!!o["react-native"],semanticRelease:!!(a["semantic-release"]||p.length>0||d.length>0),storybook:!!a["@storybook/react"],wb:!!(o["@willbooster/wb"]||a["@willbooster/wb"]||o["@willbooster/shared-scripts"]||a["@willbooster/shared-scripts"])},release:{branches:p,github:d.includes("@semantic-release/github"),npm:d.includes("@semantic-release/npm")},versionsText:f,packageJson:c,wbfyJson:y};if(w.eslintBase=function(e){if(e.depending.blitz)return"@willbooster/eslint-config-blitz-next";if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainsTypeScript)return e.doesContainsJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainsJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainsJavaScript)return"@willbooster/eslint-config-js"}(w),w.doesContainsGemfile||w.doesContainsGoMod||w.doesContainsPackageJson||w.doesContainsPoetryLock||w.doesContainsPomXml||w.doesContainsPubspecYaml||w.doesContainsTemplateYaml)return w}catch{}}function vt(e,t){return c(e,{dot:!0,cwd:t}).length>0}async function kt(e){const[t,s]=ke.getOrgAndName(e);if(!t||!s)return;const n={full_name:`${t}/${s}`};try{const e=await ve.request("GET /repos/{owner}/{repo}",{owner:t,repo:s});Object.assign(n,e.data)}catch{}return n}await async function(){const s=await o(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"}}).strict().argv;k.isVerbose=s.verbose,k.doesUploadEnvVars=s.env;for(const n of s.paths){const o=t.join(n,"packages"),r=(await i((()=>e.readdir(o,{withFileTypes:!0})))??[]).filter((e=>e.isDirectory())).map((e=>t.join(o,e.name)));await S([n,...r]);const a=await bt(n);if(!a){console.error(`there is no valid package.json in ${n}`);continue}const c=E(a),l=(await Promise.all(r.map((e=>bt(e))))).filter((e=>!!e)),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await L(a),await ct(a),await Promise.all([x(a),P(a),c.then((()=>Ue(a))),Q(a),se(a),pe(a),yt(a),Oe(a),Te(a),Re(a),Ye(a),Me(a),nt(a),pt(a),ft(a),gt(a)]),await $.promiseAll();const d=[];for(const e of p)(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(C(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(_(e)),e.depending.next&&d.push(We(e)),await me(e,a),await $.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await Je(e),await Ce(e,a,s.skipDeps),d.push(Re(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(et(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(Ze(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isWillBoosterConfigs||d.push(ce(e,a)),d.push(oe(e))),e.depending.pyright&&d.push(ze(e)));await Promise.all(d),await $.promiseAll(),B("yarn",["cleanup"],n),B("yarn",["install"],n)}}();
|
2
|
-
//# sourceMappingURL=index.js.map
|
1
|
+
import e from"node:fs/promises";import t from"node:path";import{ignoreEnoentAsync as s,withRetry as n,ignoreErrorAsync as i}from"@willbooster/shared-lib";import o from"yargs";import r from"node:fs";import{globby as a,globbySync as c}from"globby";import{PromisePool as l}from"minimal-promise-pool";import{Octokit as p}from"@octokit/core";import d from"node:child_process";import u from"deepmerge";import m from"lodash.clonedeep";import f from"node:os";import g from"js-yaml";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const j=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:t}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function x(s){return j.functionIgnoringException("fixDockerfile",(async()=>{if(!s.doesContainsDockerfile)return;const n=s.dockerfile,i=n;n!==i&&await e.writeFile(t.join(s.dirPath,"Dockerfile"),i)}))}async function _(e){return j.functionIgnoringException("fixPlaywrightConfig",(async()=>{const s=t.join(e.dirPath,"playwright.config.ts");if(!r.existsSync(s))return;const n=await r.promises.readFile(s,"utf8"),i=n.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");n!==i&&await r.promises.writeFile(s,i)}))}async function P(s){return j.functionIgnoringException("fixPrismaEnvFiles",(async()=>{const n=await a(["*.env","*.env.*"],{dot:!0,cwd:s.dirPath});for(const i of n){const n=t.resolve(s.dirPath,i),o=(await e.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await e.writeFile(n,o)}}))}async function $(e){return j.functionIgnoringException("fixTestDirectories",(async()=>{await Promise.all(e.map((async e=>{const s=t.join(e,"__tests__"),n=t.join(e,"tests");try{await r.promises.rename(s,n);const i=await r.promises.readFile(t.join(e,"package.json"),"utf8"),o=i.replaceAll("__tests__","tests");if(i===o)return;await r.promises.writeFile(t.join(e,"package.json"),o)}catch{}})))}))}const F=new l;async function S(n,i){return j.functionIgnoringException("fixTypeDefinitions",(async()=>{const o=t.resolve(n.dirPath,"@types"),r=n.isRoot&&n.doesContainsSubPackageJsons?void 0:t.resolve(n.dirPath,"src","types"),a=await s((()=>e.readdir(o,{withFileTypes:!0})));if(a)for(const n of a){const a=n.name.slice(0,-5),c=n.name.endsWith(".d.ts");let l=c?a:n.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=i.some((e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]));n.isFile()&&c?p?(await e.mkdir(t.join(o,a)),await F.run((()=>e.rename(t.join(o,n.name),t.join(o,a,"index.d.ts"))))):r&&(await e.mkdir(r,{recursive:!0}),await F.run((()=>e.rename(t.join(o,n.name),t.join(r,n.name))))):n.isDirectory()&&r&&!p&&(await e.mkdir(r,{recursive:!0}),await F.run((()=>s((()=>e.rename(t.join(o,n.name,"index.d.ts"),t.join(r,`${n.name}.d.ts`)))))))}}))}const C={async readFileIgnoringError(t){try{return await e.readFile(t,"utf8")}catch{}},async generateFile(t,s){await e.writeFile(t,s)}};async function E(e){return j.functionIgnoringException("fixAbbreviations",(async()=>{const s=e.dirPath,n=await a("**/*.md",{dot:!0,cwd:s,gitignore:!0});k.isVerbose&&console.info(`Found ${n.length} markdown files in ${s}`);for(const i of n){const n=t.join(s,i);await F.run((async()=>{const t=await r.promises.readFile(n,"utf8");let s=O(t);s=B(s,e,"doc"),t!==s&&await C.generateFile(n,s)}))}const i=await a(["{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,gitignore:!0});k.isVerbose&&console.info(`Found ${i.length} TypeScript files in ${s}`);for(const n of i){const i=t.join(s,n),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=B(a,e,"ts"),o!==a&&await C.generateFile(i,a)}const o=await a("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,gitignore:!0});k.isVerbose&&console.info(`Found ${o.length} text-based files in ${s}`);for(const n of o){const i=t.join(s,n),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=B(a,e,"text"),o!==a&&await C.generateFile(i,a)}await F.promiseAll()}))}function O(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function B(e,t,s){for(const[s,n]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(s,n);for(const[n,i]of Object.entries(t.wbfyJson?.typos?.[s]??{}))e=e.replaceAll(n,i);return e}const I=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,T=!!I,A=new p({auth:I});const D=new class{getOrgAndName(e){const t=e.split(":").at(-1),s=t?.split("/");return[s?.at(-2)??"",s?.at(-1)?.replace(/.git$/,"")??""]}};function R(e,t,s,n=0){do{const[n,i,o]=N(e,t,s);if(0===d.spawnSync(n,i,o).status)break}while(--n>=0)}function W(e,t,s){const[n,i,o]=N(e,t,s);o.stdio="pipe";const r=d.spawnSync(n,i,o),a=r.stderr.toString().trim();return a&&console.error(`${n} [${i.map((e=>`"${e}"`))}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function N(e,t,s){const n={...process.env};return n.PATH&&n.BERRY_BIN_FOLDER&&(n.PATH=n.PATH.replace(`${n.BERRY_BIN_FOLDER}:`,"")),n.ASDF_DIR&&(t=["-l","-c",`. ${n.ASDF_DIR}/asdf.sh && ${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:s,env:n,shell:!1,stdio:"inherit"}]}function J(e){const t=e.split(/[+.-]/).map(Number).filter((e=>!Number.isNaN(e)));let s=0,n=1;for(const e of t)s+=e*n,n/=1e3;return s}const L="3.9.19",z="zulu-11.72.19",G="2.0.10",U="14.2.4";async function H(e){return j.functionIgnoringException("generateToolVersions",(async()=>{await async function(e){if(!e.versionsText)return;const s=e.versionsText.trim().split("\n").map((e=>{const[t,s]=e.trim().split(/\s+/);return`${M.has(t)?" ":""}${t} ${s}`})).sort().map((e=>e.trim())),n=[...new Set(s)];if(e.doesContainsPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),s=t?.info?.version;s&&Y(n,"poetry",t?.info?.version),Y(n,"python",L,!0)}e.depending.firebase&&Y(n,"java",z,!0);if(e.doesContainsPackageJson)if(e.isBun){const e=await K("evilmartians","lefthook");e&&Y(n,"lefthook",e);const t=await K("oven-sh","bun");t&&Y(n,"bun",t)}else{const t=W("npm",["show","yarn","version"],e.dirPath);Y(n,"yarn",t)}for(const s of q){const n=t.resolve(e.dirPath,`.${s}-version`);r.promises.rm(n,{force:!0})}const i=t.resolve(e.dirPath,".tool-versions");await(n.length>0?F.run((()=>r.promises.writeFile(i,n.join("\n")+"\n"))):F.run((()=>r.promises.rm(i,{force:!0})))),await F.promiseAll(),R("asdf",["plugin","update","--all"],e.dirPath),R("asdf",["install"],e.dirPath)}(e)}))}const M=new Set(["java","nodejs","bun","python"]),q=["java","node","python"];function Y(e,t,s,n=!1){const i=e.findIndex((e=>e.split(/\s+/)[0]===t)),o=`${t} ${s}`;if(i>=0){const[,t]=e[i].split(/\s+/);J(s)>J(t)&&(e[i]=o)}else e.splice(n?0:e.length,0,o)}async function K(e,t){try{const s=(await A.request("GET /repos/{owner}/{repo}/releases/latest",{owner:e,repo:t})).data.tag_name,n=s.lastIndexOf("v"),i=n>=0?s.slice(n+1):s;return/^\d/.test(i)?i:void 0}catch(e){return void console.error("Failed to fetch Bun tags due to:",e)}}function V(e,t){return t}function X(e,t,s){const n=[...e];for(const[i,o]of t.entries())void 0===n[i]?n[i]=s.cloneUnlessOtherwiseSpecified(o,s):s.isMergeableObject(o)?n[i]=u(e[i],o,s):e.includes(o)||n.push(o);return n}const Z={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};async function Q(e){return j.functionIgnoringException("generateBiomeJsonc",(async()=>{let s=m(Z);const n=t.resolve(e.dirPath,"biome.jsonc");try{const e=await r.promises.readFile(n,"utf8"),t=JSON.parse(e);s=u.all([s,t,s],{arrayMerge:V})}catch{}const i=JSON.stringify(s);await F.run((()=>C.generateFile(n,i)))}))}const ee="telemetry = false\n\n[install]\nexact = true\n\n[run]\nbun = true\n\n";async function te(e){return j.functionIgnoringException("generateBunfigToml",(async()=>{const s=t.resolve(e.dirPath,"bunfig.toml");await F.run((()=>C.generateFile(s,ee)))}))}const se="# Project-specific settings",ne=/# Project-specific settings[^\n]*\n/gm,ie="# Generated by wbfy",oe=`${se} (head)\n\n\n${ie}\n`,re=`\n${se} (tail)\n`,ae={separator:ie,separatorPrefix:"# Generated by ",defaultHeadUserContent:oe,defaultTailUserContent:re,async readGitignoreWithoutSeparators(e){try{let t=await r.promises.readFile(e,"utf8");const s=ce(t);return s>0&&(t=t.slice(0,s-1)),t.replaceAll(ne,"").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 t>=0?e.slice(0,e.indexOf("\n",t)+1).replaceAll(ne,`${se} (head)\n`):oe},getTailUserContent(e){const t=ce(e);return t>0?e.slice(t-1):re},async isBerryZeroInstallEnabled(e){try{return(await r.promises.readFile(e,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function ce(e){const t=e.indexOf(se),s=e.lastIndexOf(se);return s>t?s:-1}const le="\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n";async function pe(e){return j.functionIgnoringException("generateDockerignore",(async()=>{const s=t.resolve(e.dirPath,".dockerignore");if(e.doesContainsDockerfile){const e=await C.readFileIgnoringError(s)??"",t=ae.getHeadUserContent(e),n=ae.getTailUserContent(e),i=t+le+n;await F.run((()=>C.generateFile(s,i)))}else await r.promises.rm(s,{force:!0})}))}const de={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml"].sort(),codeWith4IndentSize:["go","gradle","py"].sort(),codeWith8IndentSize:["sh"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].sort(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].sort()},ue=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${fe(de.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${fe(de.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${fe(de.codeWith8IndentSize)}\nindent_size = 8\nindent_style = space\n\n${fe(de.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function me(e){return j.functionIgnoringException("generateEditorconfig",(async()=>{const s=t.resolve(e.dirPath,".editorconfig");await F.run((()=>C.generateFile(s,ue)))}))}function fe(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}const ge="\n3rd-party/\n@types/\n__generated__/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.config.*js\n*.d.ts\n*.min.*js\n.yarn/\n.pnp.js\n";async function he(e){return j.functionIgnoringException("generateEslintignore",(async()=>{const s=t.resolve(e.dirPath,".eslintignore"),n=await C.readFileIgnoringError(s)??"",i=ae.getHeadUserContent(n),o=ae.getTailUserContent(n),r=t.resolve(e.dirPath,".gitignore"),a=await ae.readGitignoreWithoutSeparators(r)||"",c=i+ge+a+o;await F.run((()=>C.generateFile(s,c)))}))}async function ye(e,s){return j.functionIgnoringException("generateEslintrc",(async()=>{const n=[];e.eslintBase&&n.push(e.eslintBase),e!==s&&n.push("../../.eslintrc.json");let i={root:!0,extends:n};const o=t.resolve(e.dirPath,".eslintrc.json");try{const t=await r.promises.readFile(o,"utf8"),s=JSON.parse(t);s.extends&&(s.extends=s.extends.filter((e=>!e.startsWith("@willbooster/")&&"../../.eslintrc.json"!==e))),0===n.length&&(s.extends=[]);const a=i.extends;i.extends=s.extends,s.extends=a,i=u.all([i,s,i],{arrayMerge:X}),e.depending.blitz&&(i.extends=i.extends.filter((e=>"./node_modules/@blitzjs/next/eslint"!==e)))}catch{}const a=JSON.stringify(i);await F.run((()=>C.generateFile(o,a)))}))}const we=`* text=auto\n\n*.vcproj text eol=crlf\n\n${[...de.codeWith2IndentSize,...de.codeWith4IndentSize,...de.markdownLike].map((e=>`*.${e} text eol=lf`)).join("\n")}\n\ndist/** linguist-generated=true\n`;async function be(e){return j.functionIgnoringException("generateGitattributes",(async()=>{const s=t.resolve(e.dirPath,".gitattributes");await F.run((()=>C.generateFile(s,we)))}))}const ve=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"],ke="\n!.keep\n.env.production\n*/mount/*.hash\n.idea/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\n\n";async function je(e,s){return j.functionIgnoringException("generateGitignore",(async()=>{const n=t.resolve(e.dirPath,".gitignore"),i=await C.readFileIgnoringError(n)??"";let o=ae.getHeadUserContent(i)+ke;const r=ae.getTailUserContent(i),a=[...ve];e.doesContainsGemfile&&a.push("ruby"),e.doesContainsGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainsPackageJson&&a.push("node"),e.doesContainsPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainsPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainsTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainsPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(o+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(s.depending.firebase||e.depending.firebase)&&a.push("firebase"),s.depending.prisma&&(o+="*.sqlite3*\n*.sqlite3-journal\n"),e.depending.playwrightTest&&(o+="test-results/\n"),(s.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),o+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(o+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Pe(e)??"";if(!t){const s=`https://www.toptal.com/developers/gitignore/api/${e}`,n=await fetch(s),i=await n.text();if(!n.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${s}`);t=i.trim(),await F.run((()=>_e(e,t))),k.isVerbose&&console.info(`Fetched ${s}`)}c&&(c+="\n"),c+=t+"\n"}await ae.isBerryZeroInstallEnabled(n)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainsPomXml||e.doesContainsPubspecYaml)&&(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.doesContainsPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(s.depending.reactNative||e.depending.reactNative||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+c+r;await F.run((()=>C.generateFile(n,l)))}))}const xe=t.join(f.homedir(),".cache","wbfy","gitignore");async function _e(e,s){await r.promises.mkdir(xe,{recursive:!0}),await r.promises.writeFile(t.join(xe,e),s)}async function Pe(e){try{const s=await r.promises.stat(t.join(xe,e));if(Date.now()-s.mtimeMs>216e5)return;return await r.promises.readFile(t.join(xe,e),"utf8")}catch{}}const $e={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},Fe={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};function Se(e){return e.depending.blitz?Fe.blitz:Fe.node}const Ce=["eslint@8.57.0","eslint-config-prettier","eslint-plugin-import","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn"],Ee=[...Ce,"@typescript-eslint/eslint-plugin","@typescript-eslint/parser","eslint-import-resolver-typescript"],Oe=["eslint-plugin-react","eslint-plugin-react-hooks"],Be={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...Ce],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...Ce,...Oe],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...Ee],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...Ee,...Oe],"@willbooster/eslint-config-blitz-next":["@willbooster/eslint-config-blitz-next","eslint-config-next",...Ee,...Oe],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...Ee,...Oe]};async function Ie(e,s,n){return j.functionIgnoringException("generatePackageJson",(async()=>{await async function(e,s,n){const i=t.resolve(e.dirPath,"package.json"),o=await r.promises.readFile(i,"utf8"),l=JSON.parse(o);l.scripts=l.scripts||{},l.dependencies=l.dependencies||{},l.devDependencies=l.devDependencies||{},l.peerDependencies=l.peerDependencies||{},await async function(e,t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");if(delete t.scripts["sort-package-json"],delete t.scripts["sort-all-package-json"],delete t.scripts["typecheck/warn"],delete t.scripts["typecheck:gen-code"],delete t.scripts["typecheck:codegen"],delete t.dependencies["@willbooster/shared-scripts"],delete t.dependencies.tslib,delete t.devDependencies["@willbooster/eslint-config"],delete t.devDependencies["@willbooster/eslint-config-react"],delete t.devDependencies["@willbooster/renovate-config"],delete t.devDependencies["@willbooster/shared-scripts"],delete t.devDependencies["@willbooster/tsconfig"],delete t.devDependencies["eslint-import-resolver-node"],delete t.devDependencies["eslint-plugin-prettier"],delete t.devDependencies.lerna,delete t.devDependencies.pinst,delete t.scripts["flutter-format"],delete t.scripts["format-flutter"],delete t.scripts["python-format"],delete t.scripts["format-python"],delete t.scripts.prettier,!e.isWillBoosterConfigs)for(const e of Object.values(Be))for(const s of e)delete t.devDependencies[s];await F.run((()=>r.promises.rm("lerna.json",{force:!0})))}(s,l),"@willbooster/prettier-config"!==l.name&&(l.prettier="@willbooster/prettier-config");for(const[e,t]of Object.entries(l.scripts))t.includes("git clone")||(l.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));l.scripts=u(l.scripts,Te(e)),e.isBun?delete l.scripts.prettify:l.scripts.prettify+=await async function(e){const s=t.resolve(e,".prettierignore"),n=await r.promises.readFile(s,"utf8"),i=n.indexOf(ae.separatorPrefix);if(i<0)return"";const o=n.slice(0,i);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("")}(e.dirPath);for(const[e,t]of Object.entries(l.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(l.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],d=["prettier","sort-package-json","@willbooster/prettier-config"];const m=[];e.isBun?delete l.devDependencies["lint-staged"]:d.push("lint-staged");if(e.isRoot){if(e.isBun?(l.scripts.prepare="lefthook install || true",delete l.devDependencies.husky,delete l.devDependencies.pinst,delete l.scripts.postinstall,delete l.scripts.prepack,delete l.scripts.postpack):(d.push("husky"),l.scripts.prepare="husky || true",l.scripts.postinstall="husky || true",(e.isPublicRepo||e.isReferredByOtherRepo)&&(d.push("pinst"),l.scripts.prepack="pinst --disable",l.scripts.postpack="pinst --enable")),e.depending.semanticRelease){const e=l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]?"@6.1.0":"";d.push(`conventional-changelog-conventionalcommits${e}`),l.devDependencies["semantic-release"]||l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]||d.push("semantic-release"),l.version="0.0.0-semantically-released"}e.depending.playwrightTest&&(l.dependencies["@playwright/test"]||(d.push("@playwright/test"),delete l.dependencies["@playwright/test"]),delete l.dependencies.playwright,delete l.devDependencies.playwright),e.doesContainsSubPackageJsons?l.workspaces=Array.isArray(l.workspaces)?u.all([l.workspaces,["packages/*"]],{arrayMerge:X}):["packages/*"]:Array.isArray(l.workspaces)&&(l.workspaces=l.workspaces.filter((t=>c(t,{dot:!0,cwd:e.dirPath,gitignore:!0}).length>0)),0===l.workspaces.length&&delete l.workspaces)}if(e.depending.wb){l.dependencies["@willbooster/shared-scripts"]||l.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):d.push("@willbooster/wb");for(const[e,t]of Object.entries(l.scripts))l.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(e.isBun?d.push("@biomejs/biome","@willbooster/biome-config"):(d.push("eslint@8.57.0","micromatch"),e.doesContainsTypeScriptInPackages&&d.push("@typescript-eslint/parser")));(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(d.push("typescript"),e.isBun&&d.push("@types/bun"));e.eslintBase&&d.push(...Be[e.eslintBase]);e.isWillBoosterConfigs&&(p=p.filter((e=>!e.includes("@willbooster/"))),d=d.filter((e=>!e.includes("@willbooster/"))));l.name||(l.name=t.basename(e.dirPath));e.doesContainsSubPackageJsons&&(l.private=!0);l.license||(l.license="UNLICENSED");!l.private&&"UNLICENSED"!==l.license&&s.isPublicRepo&&(l.publishConfig??={},l.publishConfig.access??="public");const[f]=D.getOrgAndName(e.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(l.author="WillBooster Inc.");e.isRoot||!l.private||l.main||(l.main="./src");if(delete l.resolutions?.["npm/chalk"],!e.doesContainsSubPackageJsons){if(e.doesContainsJavaScript||e.doesContainsTypeScript?l.scripts["lint-fix"]+=$e.getLintFixSuffix(e):(delete l.scripts.lint,delete l.scripts["lint-fix"],l.scripts.cleanup=l.scripts.cleanup?.replace(" && yarn lint-fix","")),e.doesContainsPubspecYaml){l.scripts.lint="flutter analyze",l.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter((s=>r.existsSync(t.resolve(e.dirPath,s))));s.length>0&&(l.scripts["format-code"]=`flutter format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,l.scripts.format+=" && yarn format-code")}if(e.doesContainsPoetryLock){"poetry install"===l.scripts.postinstall&&delete l.scripts.postinstall;const t=await a("**/*.py",{cwd:e.dirPath,dot:!0,gitignore:!0,ignore:["test-fixtures"]}),s=new Set;for(const e of t){const[t,n]=e.split(/[/\\]/);n&&s.add(t)}if(s.size>0){const e=[...s].join(" ");l.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,l.scripts.lint?l.scripts.lint=`poetry run flake8 ${e} && ${l.scripts.lint}`:(l.scripts.lint=`poetry run flake8 ${e}`,l.scripts["lint-fix"]="yarn lint"),l.scripts.format+=" && yarn format-code",m.push("black","isort","flake8")}}e.repository&&(l.repository=e.repository)}e.depending.blitz?(p.push(`blitz@${G}`,`@blitzjs/auth@${G}`,`@blitzjs/next@${G}`,`@blitzjs/rpc@${G}`,`next@${U}`),d=d.filter((e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e)),l.scripts["gen-code"]?.startsWith("blitz codegen")?l.scripts["gen-code"].includes("blitz prisma generate")||(l.scripts["gen-code"]=l.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):l.scripts["gen-code"]="blitz codegen"):e.depending.prisma&&!l.scripts["gen-code"]?.startsWith("prisma generate")&&(l.scripts["gen-code"]="prisma generate");e.depending.next&&delete l.devDependencies["@types/react"];l.dependencies?.prettier||delete l.devDependencies["@types/prettier"];0===Object.keys(l.dependencies).length&&delete l.dependencies;0===Object.keys(l.devDependencies).length&&delete l.devDependencies;0===Object.keys(l.peerDependencies).length&&delete l.peerDependencies;let g=JSON.stringify(l);if(g=await async function(e,s,n){const i=[];for(const[t]of Object.keys(e))":"!==t[0]&&t.includes(":")&&i.push([t,t.replaceAll(":","-")]);if(0===i.length)return s;for(const[e,t]of i)s=s.replaceAll(e,t);const o=await a(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:n.dirPath,dot:!0,gitignore:!0});for(const e of o)await F.run((async()=>{const s=t.join(n.dirPath,e),o=await r.promises.readFile(s,"utf8");let a=o;for(const[e,t]of i)a=a.replaceAll(e,t);a!==o&&await r.promises.writeFile(s,a)}));return await F.promiseAll(),s}(l.scripts,g,e),await r.promises.writeFile(i,g),!n){p=p.filter((e=>!l.devDependencies?.[e]));const t=s.isBun?"bun":"yarn";p.length>0&&R(t,["add",...new Set(p)],e.dirPath),d=d.filter((e=>!l.dependencies?.[e])),d.length>0&&R(t,["add","-D",...new Set(d)],e.dirPath),m.length>0&&R("poetry",["add","--group","dev",...new Set(m)],e.dirPath)}}(e,s,n)}))}function Te(e){if(e.isBun){const t={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 --bun wb test",typecheck:"bun --bun wb typecheck"};return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||delete t.typecheck,t}{let t={cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:`eslint --color "./{${Se(e)}}/**/*.{${de.eslint.join(",")}}"`,"lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${de.prettier.join(",")}}" "!**/test-fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};if(e.doesContainsSubPackageJsons){const e=t.test;t=u({...t},{format:"sort-package-json && 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 --write "**/{.*/,}*.{${de.prettier.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?.includes("wb test")&&(t.test=e)}else e.depending.pyright&&(t.typecheck=t.typecheck?`${t.typecheck} && `:"",t.typecheck+="pyright");return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages?e.depending.wb&&(t.typecheck="wb typecheck"):delete t.typecheck,t}}const Ae={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\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\nyarn typecheck\n'.trim(),postMerge:'\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 De(e){return j.functionIgnoringException("generateHuskyrc",(async()=>{await async function(e){const s=t.resolve(e.dirPath,"package.json"),n=await r.promises.readFile(s,"utf8"),i=JSON.parse(n);i.scripts||={},delete i.scripts.postinstall,delete i.scripts.postpublish,delete i.scripts.prepare,delete i.scripts.prepublishOnly,delete i.scripts.prepack,delete i.scripts.postpack;const o=t.resolve(e.dirPath,".husky");await Promise.all([r.promises.writeFile(s,JSON.stringify(i,void 0,2)),r.promises.rm(o,{force:!0,recursive:!0})]),R("yarn",["dlx","husky-init","--yarn2"],e.dirPath);const a=t.resolve(o,"pre-commit");await F.run((()=>r.promises.rm(t.resolve(e.dirPath,".huskyrc.json"),{force:!0}))),await F.run((()=>r.promises.writeFile(a,Ae.preCommit+"\n")));const{typecheck:c}=Te(e);if(c){let s=e.repository?.startsWith("github:WillBoosterLab/")?Ae.prePushForLab:Ae.prePush;s=s.replace("yarn typecheck",c.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await F.run((()=>r.promises.writeFile(t.resolve(o,"pre-push"),s+"\n",{mode:493})))}const l=`${Ae.postMerge}\n\n${Re(e).join("\n")}\n`;await F.run((()=>r.promises.writeFile(t.resolve(o,"post-merge"),l,{mode:493})))}(e)}))}function Re(e){const t=[];e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "awk '{print \$1}' .tool-versions | xargs -I{} asdf plugin add {}"`,String.raw`run_if_changed "\..+-version" "asdf plugin update --all"`),e.versionsText?.includes("python ")&&t.push(String.raw`run_if_changed "\..+-version" "asdf install python"`),e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "asdf install"`);const s=e.isBun?"bun install":"yarn",n=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";return t.push(`run_if_changed "package\\.json" "${s}${n}"`),e.doesContainsPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.depending.blitz?t.push('run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma migrate deploy"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma generate"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz codegen"'):e.depending.prisma&&t.push('run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"','run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"'),t}function We(e,t,s,n){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="${n}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${s} (.${n})" />\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 Ne=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${de.prettier.map((e=>We("node","node_modules/.bin/prettier --cache --write","Prettier",e))).join("")}\n </component>\n</project>\n`,Je=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${de.prettier.map((e=>We("bun","node_modules/.bin/biome check --fix","Biome",e))).join("")}\n </component>\n</project>\n`;async function Le(e){return j.functionIgnoringException("generateIdeaSettings",(async()=>{const s=t.resolve(e.dirPath,".idea");if(r.existsSync(s)){const n=t.resolve(s,"watcherTasks.xml");await(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||e.doesContainsPackageJson&&!e.doesContainsPubspecYaml&&!e.doesContainsGemfile&&!e.doesContainsGoMod&&!e.doesContainsPomXml?F.run((()=>C.generateFile(n,e.isBun?Je:Ne))):F.run((()=>r.promises.rm(n,{force:!0}))))}}))}const ze={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-commit":{commands:{cleanup:{glob:"*.{cjs,css,cts,htm,html,js,json,json5,jsonc,jsx,md,mjs,mts,scss,ts,tsx,vue,yaml,yml}",run:"bun --bun wb lint --fix --format {staged_files} && git add {staged_files}"}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},Ge={prePush:"bun --bun node_modules/.bin/wb typecheck",prePushForLab:'\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\nbun --bun node_modules/.bin/wb typecheck\n'.trim(),postMerge:'\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 Ue(e){return j.functionIgnoringException("generateLefthook",(async()=>{await async function(e){const s=t.resolve(e.dirPath,"package.json"),n=await r.promises.readFile(s,"utf8"),i=JSON.parse(n);i.scripts||={},i.scripts.prepare="lefthook install || true";const o=t.resolve(e.dirPath,".lefthook");await Promise.all([r.promises.writeFile(s,JSON.stringify(i,void 0,2)),r.promises.writeFile(t.join(e.dirPath,"lefthook.yml"),g.dump(ze,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),r.promises.rm(o,{force:!0,recursive:!0})]);const{typecheck:a}=Te(e);if(a){const s=e.repository?.startsWith("github:WillBoosterLab/")?Ge.prePushForLab:Ge.prePush;r.mkdirSync(t.join(o,"pre-push"),{recursive:!0}),await F.run((()=>r.promises.writeFile(t.join(o,"pre-push","check.sh"),s+"\n",{mode:493})))}const c=`${Ge.postMerge}\n\n${Re(e).join("\n")}\n`;r.mkdirSync(t.join(o,"post-merge"),{recursive:!0}),await F.run((()=>r.promises.writeFile(t.resolve(o,"post-merge","prepare.sh"),c,{mode:493})))}(e)}))}async function He(e){return j.functionIgnoringException("generateLintstagedrc",(async()=>{await async function(e){const s=e.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",n=[];if(e.doesContainsJavaScript||e.doesContainsTypeScript){const t=`\n '${Me(e)}': [${JSON.stringify(`${s}eslint --fix${$e.getLintFixSuffix(e)}`)}, '${s}prettier --cache --write'],`;n.push(t)}const i=e.isRoot?" && !file.includes('/packages/')":"";n.push(`\n './**/*.{${de.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${i});${function(e){return e.doesContainsJavaScript||e.doesContainsTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${Me(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(e)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${s}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${s}sort-package-json');\n }\n return commands;\n },`),e.doesContainsPubspecYaml&&n.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`flutter format ${filteredFiles.join(' ')}`];\n },");e.doesContainsPoetryLock&&n.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const o=`const path = require('path');\n${e.doesContainsJavaScript||e.doesContainsTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${n.join("")}\n};\n`,a=t.resolve(e.dirPath,".lintstagedrc.cjs");await F.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.js"),{force:!0}))),await F.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.json"),{force:!0}))),await F.run((()=>C.generateFile(a,o)))}(e)}))}function Me(e){return`./{${Se(e).join(",")}}/**/*.{${de.eslint.join(",")}}`}async function qe(e){return j.functionIgnoringException("generateNextConfigJson",(async()=>{const s=["js","mjs","cjs"].map((s=>t.resolve(e.dirPath,`next.config.${s}`))).find((e=>r.existsSync(e)));if(!s)return;const n=(await r.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,((e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`)));await F.run((()=>C.generateFile(s,n)))}))}const Ye="\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n";async function Ke(e){return j.functionIgnoringException("generatePrettierignore",(async()=>{const s=t.resolve(e.dirPath,".prettierignore"),n=await C.readFileIgnoringError(s)??"",i=ae.getHeadUserContent(n),o=ae.getTailUserContent(n),r=t.resolve(e.dirPath,".gitignore"),a=await ae.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainsPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+Ye+c+a+o;await F.run((()=>C.generateFile(s,l)))}))}const Ve={venvPath:".",venv:".venv"};async function Xe(e){return j.functionIgnoringException("generatePyrightConfigJson",(async()=>{let s=m(Ve);const n=t.resolve(e.dirPath,"pyrightconfig.json");try{const e=await r.promises.readFile(n,"utf8"),t=JSON.parse(e);s=u.all([s,t,s],{arrayMerge:V})}catch{}const i=JSON.stringify(s);await F.run((()=>C.generateFile(n,i)))}))}const Ze="[](https://github.com/semantic-release/semantic-release)";async function Qe(e){return j.functionIgnoringException("generateReadme",(async()=>{const s=t.resolve(e.dirPath,"README.md");let n=await r.promises.readFile(s,"utf8");r.existsSync(t.resolve(e.dirPath,".releaserc.json"))&&(n=et(n,Ze));const i=e.repository?.slice(e.repository?.indexOf(":")+1),o=r.readdirSync(`${e.dirPath}/.github/workflows`);for(const s of o){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let o=s;o=o[0].toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," ");const a=`[](https://github.com/${i}/actions/workflows/${s})`;r.existsSync(t.resolve(e.dirPath,`.github/workflows/${s}`))&&(n=et(n,a))}await F.run((()=>C.generateFile(s,n)))}))}function et(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let s=0;s<e.length;s++)if("\n"===e[s-1]&&"\n"===e[s]){const n=e.slice(0,s+1);let i=e.slice(s+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${n}${t}\n${i}`}return`${e}\n${t}\n`}async function tt(e){return j.functionIgnoringException("generateReleaserc",(async()=>{const s=t.resolve(e.dirPath,".releaserc.json"),n=JSON.parse(await r.promises.readFile(s,"utf8")),i=n?.plugins||[];for(let e=0;e<i.length;e++){const t=Array.isArray(i[e])?i[e][0]:i[e],s=Array.isArray(i[e])&&i[e][1]||{};"@semantic-release/commit-analyzer"===t?i[e]=["@semantic-release/commit-analyzer",u.all([s,{preset:"conventionalcommits"}],{arrayMerge:V})]:"@semantic-release/github"===t&&(i[e]=["@semantic-release/github",u.all([s,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:V})])}const o=JSON.stringify(n);await F.run((()=>C.generateFile(s,o)))}))}const st={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function nt(e){return j.functionIgnoringException("generateRenovateJson",(async()=>{let s=m(st);const n=t.resolve(e.dirPath,"renovate.json");if(r.existsSync(`${n}5`))return;try{const e=await r.promises.readFile(n,"utf8"),t=JSON.parse(e);s=u.all([s,t,s],{arrayMerge:V}),s.extends=s.extends.filter((e=>"@willbooster"!==e))}catch{}e.depending.blitz&&(s.packageRules??=[],s.packageRules.some((e=>e.packageNames.includes("next")))||s.packageRules.push({packageNames:["next"],enabled:!1})),await F.run((()=>r.promises.rm(t.resolve(e.dirPath,".dependabot"),{force:!0}))),await F.run((()=>r.promises.rm(t.resolve(e.dirPath,".renovaterc.json"),{force:!0})));const i=JSON.stringify(s);await F.run((()=>C.generateFile(n,i)))}))}function it(e){const t=Object.entries(e).sort((([e],[t])=>e.localeCompare(t)));for(const[s,n]of t)delete e[s],e[s]=n,"object"==typeof n&&null!==n&&it(n);return e}const ot={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*","packages/*/src/**/*","packages/*/tests/**/*","packages/*/scripts/**/*"]},rt={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*"]};async function at(e){return j.functionIgnoringException("generateTsconfig",(async()=>{if(e.depending.blitz||e.depending.next)return;let s=m(e.isRoot?ot:rt);e.doesContainsJsxOrTsx||e.doesContainsJsxOrTsxInPackages||delete s.compilerOptions?.jsx,e.isRoot&&!e.doesContainsSubPackageJsons&&(s.include=s.include?.filter((e=>!e.startsWith("packages/*/")))),e.isEsmPackage&&(s.compilerOptions={...s.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const n=t.resolve(e.dirPath,"tsconfig.json");try{const t=await r.promises.readFile(n,"utf8"),i=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===i.extends&&delete i.extends,delete s.compilerOptions?.target,e.isEsmPackage||(delete s.compilerOptions?.module,delete s.compilerOptions?.moduleResolution),i.compilerOptions?.jsx&&delete s.compilerOptions?.jsx,s=u.all([s,i,s],{arrayMerge:X}),s.include=s.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}it(s),s.include?.sort();const i=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await F.run((()=>C.generateFile(n,i)))}))}const ct=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function lt(e){return j.functionIgnoringException("generateVscodeSettings",(async()=>{try{const s=t.resolve(e.dirPath,".vscode","settings.json"),n=await r.promises.readFile(s,"utf8");let i=JSON.parse(n);for(const e of ct)i=u.all([i,pt(e)]);e.doesContainsPoetryLock&&(i=u.all([i,pt("**/.venv/**")])),e.depending.next&&(i=u.all([i,pt("**/.next/**")])),it(i??{});const o=JSON.stringify(i,void 0,2);await F.run((()=>C.generateFile(s,o)))}catch{}}))}function pt(e){return{"files.watcherExclude":{[e]:!0}}}const dt={test:{name:"Test",on:{pull_request:{"paths-ignore":["**.md","**/docs/**"]},push:{branches:["main","wbfy"],"paths-ignore":["**.md","**/docs/**"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},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},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},wbfy:{name:"Willboosterify",on:{workflow_dispatch:null},jobs:{wbfy:{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy.yml@main"}}},"wbfy-merge":{name:"Merge wbfy",on:{workflow_dispatch:null},jobs:{"wbfy-merge":{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy-merge.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:{},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"notify-ready":{name:"Notify ready",on:{issues:{types:["labeled"]}},jobs:{"notify-ready":{uses:"WillBooster/reusable-workflows/.github/workflows/notify-ready.yml@main",secrets:{DISCORD_WEBHOOK_URL:"${{ secrets.DISCORD_WEBHOOK_URL_FOR_READY }}"}}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"add-issue-to-project":{name:"Add issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",secrets:{GH_PROJECT_URL:"${{ secrets.GH_PROJECT_URL }}"}}}},"add-ready-issue-to-project":{name:"Add ready issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-ready-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",with:{labeled:"ready :rocket:"},secrets:{GH_PROJECT_URL:"https://github.com/orgs/WillBoosterLab/projects/5"}}}}};async function ut(e){return j.functionIgnoringException("generateWorkflow",(async()=>{const s=t.resolve(e.dirPath,".github","workflows");await r.promises.mkdir(s,{recursive:!0});const n=t.resolve(e.dirPath,".github","semantic.yml");await F.run((()=>r.promises.rm(n,{force:!0,recursive:!0})));const i=await r.promises.readdir(s,{withFileTypes:!0}),o=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml",...i.filter((e=>e.isFile()&&e.name.endsWith(".yml"))).map((e=>e.name))]);e.depending.semanticRelease&&o.add("release.yml"),(e.isPublicRepo||e.repository?.startsWith("github:WillBoosterLab/"))&&(o.add("add-ready-issue-to-project.yml"),o.add("notify-ready.yml"));for(const n of o){const i=t.basename(n,".yml");await F.run((()=>mt(e,s,i)))}await F.run((()=>r.promises.rm(t.join(s,"add-focused-issue-to-project.yml"),{force:!0,recursive:!0})))}))}async function mt(e,s,n){let i=m(dt[n]??{});const o=t.join(s,`${n}.yml`);try{const e=await r.promises.readFile(o,"utf8"),t=g.load(e);i=u.all([i,t,i],{arrayMerge:X})}catch{}n.startsWith("deploy")&&(i={...i,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},i.jobs&&function(e,t){const s=e[t];delete e[t],e[t]=s}(i,"jobs"),i.on?.push&&(i.on.push["paths-ignore"]=[...new Set([...i.on.push["paths-ignore"]??[],"**.md","**/docs/**"])]));for(const t of Object.values(i.jobs)){if(!t.uses?.includes?.("/reusable-workflows/"))return;ft(e,t,n)}switch(n){case"release":if(i.on?.schedule)delete i.on.push;else{if(!(i.on?.push&&e.release.branches.length>0))return void await r.promises.rm(t.join(s,"release.yml"),{force:!0});i.on.push.branches=e.release.branches}break;case"test":i.on?.push&&(i.on.push.branches=i.on.push.branches.filter((e=>"renovate/**"!==e)));break;case"wbfy":i.on&>(i,20,24);break;case"wbfy-merge":gt(i,1,4)}if(function(e){delete e.jobs["add-to-project"]}(i),await ht(i,o),"release"===n)await r.promises.rm(t.join(s,"semantic-release.yml"),{force:!0});else if("sync"===n){if(await r.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!i.jobs.sync||!i.jobs.sync.with)return;i.jobs["sync-force"]=i.jobs.sync;const e=i.jobs.sync.with.sync_params_without_dest;if(!e)return;i.jobs.sync.with.sync_params_without_dest=`--force ${e}`,i.name="Force to Sync",i.on={workflow_dispatch:null},delete i.jobs.sync,await ht(i,t.join(s,"sync-force.yml"))}}function ft(e,t,s){if(t.with||={},t.secrets||={},"test"!==s&&"release"!==s&&"wbfy"!==s&&"wbfy-merge"!==s&&"add-issue-to-project"!==s&&"add-ready-issue-to-project"!==s||(t.secrets.GH_TOKEN=e.isPublicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==s&&"test"!==s||(t.secrets.NPM_TOKEN="${{ secrets.NPM_TOKEN }}"),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"===s||s.startsWith("deploy"))||t.with.server_url&&s.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===s){const e=t.with?.sync_params_without_dest;e&&(t.with.sync_params_without_dest=e.toString().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,function(e){if(!e.with)return;delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,delete e.with.cpu_arch,delete e.with.label,delete e.with.labelOperator}(t),s.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.toString().replace(/\s+--json/,"")),e.doesContainsDockerfile&&("extra-large"!==t.with.ci_size&&(s.startsWith("deploy")||s.startsWith("test"))&&(t.with.ci_size="large"),s.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===s||"test"===s||"wbfy"===s||"wbfy-merge"===s||s.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?it(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=it(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function gt(e,t,s){const[n,i]=(e.on.schedule?.[0]?.cron??"").split(" ").map(Number);if(0!==n&&Number.isInteger(i)){const e=(i+9)%24;if(t<s?t<=e&&e<s:t<=e||e<s)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(s-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function ht(e,t){const s=g.dump(e,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await r.promises.writeFile(t,s)}async function yt(e){return j.functionIgnoringException("generateYarnrcYml",(async()=>{const s=W("yarn",["--version"],e.dirPath),n=function(e,t){const s=W("npm",["show",e,"versions","--json"],t);return JSON.parse(s).at(-1)}("@yarnpkg/cli",e.dirPath);wt(s)<=wt(n)&&s!==n&&R("yarn",["set","version",n],e.dirPath,1);const i=t.join(e.dirPath,".yarn","releases");await r.promises.mkdir(i,{recursive:!0});for(const e of await r.promises.readdir(i))e.startsWith("yarn-")&&!e.startsWith(`yarn-${n}.`)&&await F.run((()=>r.promises.rm(t.join(i,e))));const o=t.resolve(e.dirPath,".yarnrc");await F.run((()=>r.promises.rm(o,{force:!0})));const a=t.resolve(e.dirPath,".yarnrc.yml"),c=g.load(await r.promises.readFile(a,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",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 s=t.resolve(e.dirPath,".yarnrc","undefined.cjs");await F.run((()=>r.promises.rm(s,{force:!0})))}0===c.plugins.length&&delete c.plugins,await r.promises.writeFile(a,g.dump(c,{lineWidth:-1})),R("yarn",["dlx","yarn-plugin-auto-install"],e.dirPath)}))}function wt(e){const[t]=e.split(".");return Number(t)}async function bt(e){return j.functionIgnoringException("setupLabels",(async()=>{if(!T)return;const[t,s]=D.getOrgAndName(e.repository??"");if(t&&s&&("WillBooster"===t||"WillBoosterLab"===t))try{await vt(t,s,"d1: x-easy :hedgehog:","EDE9FE"),await vt(t,s,"d2: easy :rabbit2:","DDD6FE"),await vt(t,s,"d3: medium :ox:","C4B5FD"),await vt(t,s,"d4: hard :squid:","A78BFA"),await vt(t,s,"d5: x-hard :whale2:","8B5CF6"),await vt(t,s,"p1: critical :fire::fire::fire:","EF4444"),await vt(t,s,"p2: urgent :fire::fire:","F87171"),await vt(t,s,"p3: important :fire:","FCA5A5"),await vt(t,s,"p4: nice to have :droplet:","FECACA"),await vt(t,s,"r: blitz","5300bc"),await vt(t,s,"r: firebase","ffca28"),await vt(t,s,"r: prisma","0c344b"),await vt(t,s,"r: react","61dafb"),await vt(t,s,"r: svelte","ff3e00"),await vt(t,s,"r: semantic-release","494949"),await vt(t,s,"ready :rocket:","22C55E"),await vt(t,s,"review requested :mag:","FBCA04"),await vt(t,s,"released :bookmark:","6366F1"),await vt(t,s,"s: 0.5h :clock1230:","F3F4F6"),await vt(t,s,"s: 1h :clock1:","E5E7EB"),await vt(t,s,"s: 2h :clock2:","D1D5DB"),await vt(t,s,"s: 3h :clock3:","9CA3AF"),await vt(t,s,"s: 5h :clock5:","6B7280"),await vt(t,s,"s: 8h :clock8:","4B5563"),await vt(t,s,"s: 13h :clock1:","374151"),await vt(t,s,"t: build :hammer:","BFDBFE"),await vt(t,s,"t: chore :broom:","BFDBFE"),await vt(t,s,"t: ci :construction_worker:","BFDBFE"),await vt(t,s,"t: docs :memo:","BFDBFE"),await vt(t,s,"t: feat :sparkles:","BFDBFE"),await vt(t,s,"t: fix :bug:","BFDBFE"),await vt(t,s,"t: perf :zap:","BFDBFE"),await vt(t,s,"t: refactor :recycle:","BFDBFE"),await vt(t,s,"t: style :lipstick:","BFDBFE"),await vt(t,s,"t: test :test_tube:","BFDBFE"),await vt(t,s,"project","24292F"),await vt(t,s,"focused :dart:","22C55E"),await kt(t,s,"bug"),await kt(t,s,"documentation"),await kt(t,s,"duplicate"),await kt(t,s,"enhancement"),await kt(t,s,"good first issue"),await kt(t,s,"help wanted"),await kt(t,s,"invalid"),await kt(t,s,"question"),await kt(t,s,"wontfix"),await kt(t,s,"ready"),await kt(t,s,"review requested"),await kt(t,s,"released"),await kt(t,s,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function vt(e,t,s,n){try{await A.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:s,color:n})}catch{await A.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:s,color:n})}}async function kt(e,t,s){try{await A.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:s})}catch{}}const jt=["READY_DISCORD_WEBHOOK_URL"];async function xt(e){return j.functionIgnoringException("setupSecrets",(async()=>{if(!T||!k.doesUploadEnvVars)return;const[t,s]=D.getOrgAndName(e.repository??"");if(!t||!s||"WillBoosterLab"!==t)return;const n=h.config().parsed||{};if(0!==Object.keys(n).length)try{for(const e of jt)try{await A.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:s,secret_name:e})}catch{}const i=await A.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:s}),{key:o,key_id:r}=i.data;await y.ready;for(const[i,a]of Object.entries(n)){if(e.isPublicRepo&&"GH_BOT_PAT"===i)continue;if(!e.isPublicRepo&&"PUBLIC_GH_BOT_PAT"===i)continue;const n=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,n),p=y.to_base64(l,y.base64_variants.ORIGINAL);await A.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:s,secret_name:i,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}}))}async function _t(e){const[t,s]=D.getOrgAndName(e.repository??"");t&&s&&("WillBooster"!==t&&"WillBoosterLab"!==t||await n((()=>A.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:s,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,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 Pt={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on PR page. (You may leave this box unchecked due to long workflows.)\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 - All tests are passed.\n - Test command (e.g., `yarn test`) is passed.\n - Lint command (e.g., `yarn lint`) is passed.\n- [ ] I\'ve reviewed my changes on PR\'s diff view.\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'.trim()};async function $t(e){return j.functionIgnoringException("generateGitHubTemplates",(async()=>{for(const[s,n]of Object.entries(Pt)){const i=t.resolve(e.dirPath,".github",s);if(r.existsSync(i)){const e=await r.promises.readFile(i,"utf8");if(w(e,n)>n.length/2)continue}await r.promises.mkdir(t.resolve(e.dirPath,".github"),{recursive:!0}),await F.run((()=>C.generateFile(i,n)))}}))}const Ft=v.object({typos:v.object({all:v.record(v.string()).optional(),doc:v.record(v.string()).optional(),ts:v.record(v.string()).optional(),text:v.record(v.string()).optional()}).optional()});async function St(s){const n=t.resolve(s,"package.json");try{const i=r.existsSync(n);let o={},a={},c={},l=!1;if(i){const e=r.readFileSync(n,"utf8");c=JSON.parse(e),o=c.dependencies??{},a=c.devDependencies??{},l="module"===c.type}let p=[],d=[];try{const n=t.resolve(s,".releaserc.json"),i=JSON.parse(await e.readFile(n,"utf8"));p=i?.branches||[],d=i?.plugins?.flat()||[]}catch{}const u="packages"!==t.basename(t.resolve(s,".."))||!r.existsSync(t.resolve(s,"..","..","package.json"));let m;u&&(m=await async function(e,t){const s=b(e),n=(await s.getRemotes(!0)).find((e=>"origin"===e.name)),i=n?.refs?.fetch??n?.refs?.push;if("string"==typeof i){const e=await Et(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await Et(o);if(e&&"Not Found"!==e.message)return e}}(s,c));let f="";try{f+=(await e.readFile(t.resolve(s,".tool-versions"),"utf8")).trim()}catch{}for(const[n,i]of[["java","java"],["node","nodejs"],["python","python"]])try{const o=await e.readFile(t.resolve(s,`.${n}-version`),"utf8");f&&(f+="\n"),f+=i+" "+o.trim()}catch{}let g="";try{g=await e.readFile(t.resolve(s,"Dockerfile"),"utf8")}catch{}const h=t.resolve(s,"wbfy.json");let y;try{const t=await e.readFile(h,"utf8");y=Ft.parse(JSON.parse(t))}catch{}const w={dirPath:s,dockerfile:g,isRoot:u,isPublicRepo:!1===m?.private,isReferredByOtherRepo:!!c.files,repository:m?.full_name?`github:${m?.full_name}`:void 0,isBun:r.existsSync(t.join(s,"bunfig.toml")),isEsmPackage:l,isWillBoosterConfigs:n.includes(`${t.sep}willbooster-configs`),doesContainsSubPackageJsons:Ct("packages/**/package.json",s),doesContainsDockerfile:!!g||r.existsSync(t.resolve(s,"docker-compose.yml")),doesContainsGemfile:r.existsSync(t.resolve(s,"Gemfile")),doesContainsGoMod:r.existsSync(t.resolve(s,"go.mod")),doesContainsPackageJson:r.existsSync(t.resolve(s,"package.json")),doesContainsPoetryLock:r.existsSync(t.resolve(s,"poetry.lock")),doesContainsPomXml:r.existsSync(t.resolve(s,"pom.xml")),doesContainsPubspecYaml:r.existsSync(t.resolve(s,"pubspec.yaml")),doesContainsTemplateYaml:r.existsSync(t.resolve(s,"template.yaml")),doesContainsVscodeSettingsJson:r.existsSync(t.resolve(s,".vscode","settings.json")),doesContainsJavaScript:Ct("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",s),doesContainsTypeScript:Ct("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",s),doesContainsJsxOrTsx:Ct("{app,src,tests}/**/*.{t,j}sx",s),doesContainsJavaScriptInPackages:Ct("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",s),doesContainsTypeScriptInPackages:Ct("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",s),doesContainsJsxOrTsxInPackages:Ct("packages/**/{app,src,tests}/**/*.{t,j}sx",s),depending:{blitz:!!o.blitz,firebase:!!a["firebase-tools"],litestream:g.includes("install-litestream.sh"),next:!!o.next,playwrightTest:!!o["@playwright/test"]||!!a["@playwright/test"]||!!a.playwright,prisma:!!o["@prisma/client"]||!!a.prisma,pyright:!!a.pyright,reactNative:!!o["react-native"],semanticRelease:!!(a["semantic-release"]||p.length>0||d.length>0),storybook:!!a["@storybook/react"],wb:!!(o["@willbooster/wb"]||a["@willbooster/wb"]||o["@willbooster/shared-scripts"]||a["@willbooster/shared-scripts"])},release:{branches:p,github:d.includes("@semantic-release/github"),npm:d.includes("@semantic-release/npm")},versionsText:f,packageJson:c,wbfyJson:y};if(w.isBun||(w.eslintBase=function(e){if(e.depending.blitz)return"@willbooster/eslint-config-blitz-next";if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainsTypeScript)return e.doesContainsJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainsJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainsJavaScript)return"@willbooster/eslint-config-js"}(w)),w.doesContainsGemfile||w.doesContainsGoMod||w.doesContainsPackageJson||w.doesContainsPoetryLock||w.doesContainsPomXml||w.doesContainsPubspecYaml||w.doesContainsTemplateYaml)return w}catch{}}function Ct(e,t){return c(e,{dot:!0,cwd:t}).length>0}async function Et(e){const[t,s]=D.getOrgAndName(e);if(!t||!s)return;const n={full_name:`${t}/${s}`};try{const e=await A.request("GET /repos/{owner}/{repo}",{owner:t,repo:s});Object.assign(n,e.data)}catch{}return n}await async function(){const s=await o(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"}}).strict().argv;k.isVerbose=s.verbose,k.doesUploadEnvVars=s.env;for(const n of s.paths){const o=t.join(n,"packages"),r=(await i((()=>e.readdir(o,{withFileTypes:!0})))??[]).filter((e=>e.isDirectory())).map((e=>t.join(o,e.name)));await $([n,...r]);const a=await St(n);if(!a){console.error(`there is no valid package.json in ${n}`);continue}const c=E(a),l=(await Promise.all(r.map((e=>St(e))))).filter((e=>!!e)),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await H(a),Math.random()>0&&process.exit(0),a.isBun||await yt(a),await Promise.all([x(a),P(a),c.then((()=>Qe(a))),pe(a),me(a),be(a),$t(a),Le(a),nt(a),tt(a),ut(a),bt(a),xt(a),_t(a),...a.isBun?[te(a),Ue(a)]:[De(a),He(a)]]),await F.promiseAll();const d=[];for(const e of p)(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(S(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(_(e)),e.depending.next&&d.push(qe(e)),await je(e,a),await F.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await Ke(e),await Ie(e,a,s.skipDeps),a.isBun||d.push(He(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(lt(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(at(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isBun?d.push(Q(e)):(a.isWillBoosterConfigs||d.push(ye(e,a)),d.push(he(e)))),e.depending.pyright&&d.push(Xe(e)));await Promise.all(d),await F.promiseAll();const u=a.isBun?"bun":"yarn";R(u,["cleanup"],n),R(u,["install"],n)}}();
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy9maXhlcnMvcGxheXdyaWdodENvbmZpZy50cyIsIi4uL3NyYy9maXhlcnMvcHJpc21hLnRzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbkNvbnN0YW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FzZGYudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYmlvbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludGlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9odXNreXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbmV4dGNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHlyaWdodGNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlcmMudHMiLCIuLi9zcmMvdXRpbHMvb2JqZWN0VXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3RzY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZTogYm9vbGVhbjtcbiAgZG9lc1VwbG9hZEVudlZhcnM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5pc1ZlcmJvc2UgPSBmYWxzZTtcbiAgICB0aGlzLmRvZXNVcGxvYWRFbnZWYXJzID0gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpO1xuIiwiaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5cbmNsYXNzIExvZ2dlciB7XG4gIGFzeW5jIGZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24obmFtZTogc3RyaW5nLCBmdW5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLSAke25hbWV9IHN0YXJ0IC0tLS0tLS0tLWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnVuYygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEVycm9yIG9jY3VycmVkIGluICR7bmFtZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogZXJyb3J9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhEb2NrZXJmaWxlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeERvY2tlcmZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGNvbmZpZy5kb2NrZXJmaWxlO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuXG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnRG9ja2VyZmlsZScpLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoL3JldHJpZXM6LissLywgJ3JldHJpZXM6IHByb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMSwnKTtcbiAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQcmlzbWFFbnZGaWxlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQcmlzbWFFbnZGaWxlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbnZGaWxlcyA9IGF3YWl0IGdsb2JieShbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGggfSk7XG4gICAgZm9yIChjb25zdCBlbnZGaWxlIG9mIGVudkZpbGVzKSB7XG4gICAgICBjb25zdCBlbnZGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZW52RmlsZSk7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKFxuICAgICAgICAvREFUQUJBU0VfVVJMPVwiPyguK1xcLnNxbGl0ZTMpXCI/W1xcbiRdLyxcbiAgICAgICAgJ0RBVEFCQVNFX1VSTD1cIiQxP2Nvbm5lY3Rpb25fbGltaXQ9MVwiXFxuJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShlbnZGaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUZXN0RGlyZWN0b3JpZXMocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3RvcmllcycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZFRlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnX190ZXN0c19fJyk7XG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdHMnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4Jyk7XG4gICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZUFsbCgnX190ZXN0c19fJywgJ3Rlc3RzJyk7XG4gICAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgbmV3Q29udGVudCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpKTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmc3AucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBhc3luYyBnZW5lcmF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZnNwLndyaXRlRmlsZShmaWxlUGF0aCwgY29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeEFiYnJldmlhdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGdsb2JieSgnKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGdpdGlnbm9yZTogdHJ1ZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4QWJicmV2aWF0aW9uc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGdsb2JieShcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgXSxcbiAgICAgIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGdpdGlnbm9yZTogdHJ1ZSB9XG4gICAgKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0c0ZpbGVzLmxlbmd0aH0gVHlwZVNjcmlwdCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHNGaWxlIG9mIHRzRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIHRzRmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IG9sZENvbnRlbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKiljXFwuZlxcLi9nLCAnLy8kMWNmLicpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopZWdcXC4vZywgJy8vJDFlLmcuJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKilpZVxcLi9nLCAnLy8kMWkuZS4nKTtcbiAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBnbG9iYnkoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGdpdGlnbm9yZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgICAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWVnXFwuL2csICcvLyQxZS5nLicpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopaWVcXC4vZywgJy8vJDFpLmUuJyk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeEFiYnJldmlhdGlvbnNJblRleHQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFxiY1xcLmZcXC4oW14kXSkvZywgJ2NmLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oW14kXSkvZywgJ2UuZy4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKFteJF0pL2csICdpLmUuJDEnKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmNvbnN0IHRva2VuID1cbiAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVCB8fCBwcm9jZXNzLmVudi5QVUJMSUNfR0hfQk9UX1BBVCB8fCBwcm9jZXNzLmVudi5HSF9UT0tFTiB8fCBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU47XG5leHBvcnQgY29uc3QgaGFzR2l0SHViVG9rZW4gPSAhIXRva2VuO1xuZXhwb3J0IGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gIGF1dGg6IHRva2VuLFxufSk7XG5cbmNsYXNzIEdpdEh1YlV0aWwge1xuICBnZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVybFdpdGhvdXRQcm90b2NvbCA9IHVybE9yRnVsbE5hbWUuc3BsaXQoJzonKS5hdCgtMSk7XG4gICAgY29uc3QgbmFtZXMgPSB1cmxXaXRob3V0UHJvdG9jb2w/LnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgb3JnID0gbmFtZXM/LmF0KC0yKSA/PyAnJztcbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvLmdpdCQvLCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke29wdGlvbnMuY3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgaWYgKHJldC5zdGF0dXMgPT09IDApIGJyZWFrO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgY29uc3QgZXJyb3IgPSBwcm9jLnN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKX1dIGNhdXNlZCB0aGUgZm9sbG93aW5nIGVycm9yOlxcbiAke2Vycm9yfWApO1xuICB9XG4gIHJldHVybiBwcm9jLnN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5yZXBsYWNlKGAke2Vudi5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJyk7XG4gIH1cblxuICBpZiAoZW52LkFTREZfRElSKSB7XG4gICAgYXJncyA9IFsnLWwnLCAnLWMnLCBgLiAke2Vudi5BU0RGX0RJUn0vYXNkZi5zaCAmJiAke2NvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9YF07XG4gICAgY29tbWFuZCA9ICdiYXNoJztcbiAgfVxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gY29udmVydFZlcnNpb25JbnRvTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIGUuZy4gamF2YSBhZG9wdG9wZW5qZGstMTEuMC4xNys4XG4gIGNvbnN0IG51bWJlcnMgPSB2ZXJzaW9uXG4gICAgLnNwbGl0KC9bKy4tXS8pXG4gICAgLm1hcChOdW1iZXIpXG4gICAgLmZpbHRlcigobnVtKSA9PiAhTnVtYmVyLmlzTmFOKG51bSkpO1xuICBsZXQgdmVyc2lvbk51bWJlciA9IDA7XG4gIGxldCBkaXZpc29yID0gMTtcbiAgZm9yIChjb25zdCBudW0gb2YgbnVtYmVycykge1xuICAgIHZlcnNpb25OdW1iZXIgKz0gbnVtICogZGl2aXNvcjtcbiAgICBkaXZpc29yIC89IDEwMDA7XG4gIH1cbiAgcmV0dXJuIHZlcnNpb25OdW1iZXI7XG59XG4iLCJleHBvcnQgY29uc3QgUFlUSE9OX1ZFUlNJT04gPSAnMy45LjE5JztcbmV4cG9ydCBjb25zdCBKQVZBX1ZFUlNJT04gPSAnenVsdS0xMS43Mi4xOSc7XG5leHBvcnQgY29uc3QgQkxJVFpfVkVSU0lPTiA9ICcyLjAuMTAnO1xuZXhwb3J0IGNvbnN0IE5FWFRfVkVSU0lPTiA9ICcxNC4yLjQnO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgY29udmVydFZlcnNpb25JbnRvTnVtYmVyIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBKQVZBX1ZFUlNJT04sIFBZVEhPTl9WRVJTSU9OIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbkNvbnN0YW50cy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRvb2xWZXJzaW9ucyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRvb2xWZXJzaW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5jb25zdCBDT1JFX1RPT0xTID0gbmV3IFNldChbJ2phdmEnLCAnbm9kZWpzJywgJ2J1bicsICdweXRob24nXSk7XG5jb25zdCBERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMgPSBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXTtcblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjb25maWcudmVyc2lvbnNUZXh0KSByZXR1cm47XG5cbiAgY29uc3QgZHVwbGljYXRhYmxlTGluZXMgPSBjb25maWcudmVyc2lvbnNUZXh0XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBbbmFtZSwgdmVyc2lvbl0gPSBsaW5lLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgLy8gVG8gbW92ZSB0aGUgdG9wIG9mIHRoZSBsaXN0LCB3ZSBuZWVkIHRvIGFkZCBhIHNwYWNlLlxuICAgICAgcmV0dXJuIGAke0NPUkVfVE9PTFMuaGFzKG5hbWUpID8gJyAnIDogJyd9JHtuYW1lfSAke3ZlcnNpb259YDtcbiAgICB9KVxuICAgIC5zb3J0KClcbiAgICAvLyBSZW1vdmUgYWRkZWQgc3BhY2VzLlxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKTtcbiAgY29uc3QgbGluZXMgPSBbLi4ubmV3IFNldChkdXBsaWNhdGFibGVMaW5lcyldO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vcHlwaS5vcmcvcHlwaS9wb2V0cnkvanNvbicpO1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgY29uc3QgcG9ldHJ5VmVyc2lvbiA9IGpzb24/LmluZm8/LnZlcnNpb247XG4gICAgaWYgKHBvZXRyeVZlcnNpb24pIHtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdwb2V0cnknLCBqc29uPy5pbmZvPy52ZXJzaW9uKTtcbiAgICB9XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3B5dGhvbicsIFBZVEhPTl9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdqYXZhJywgSkFWQV9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgY29uc3QgbGVmdGhvb2tWZXJzaW9uID0gYXdhaXQgZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1YignZXZpbG1hcnRpYW5zJywgJ2xlZnRob29rJyk7XG4gICAgICBpZiAobGVmdGhvb2tWZXJzaW9uKSB1cGRhdGVWZXJzaW9uKGxpbmVzLCAnbGVmdGhvb2snLCBsZWZ0aG9va1ZlcnNpb24pO1xuXG4gICAgICBjb25zdCBidW5WZXJzaW9uID0gYXdhaXQgZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yignb3Zlbi1zaCcsICdidW4nKTtcbiAgICAgIGlmIChidW5WZXJzaW9uKSB1cGRhdGVWZXJzaW9uKGxpbmVzLCAnYnVuJywgYnVuVmVyc2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCducG0nLCBbJ3Nob3cnLCAneWFybicsICd2ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICd5YXJuJywgdmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwcmVmaXggb2YgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTKSB7XG4gICAgY29uc3QgdmVyc2lvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKTtcbiAgICB2b2lkIGZzLnByb21pc2VzLnJtKHZlcnNpb25QYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgdG9vbFZlcnNpb25zUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyk7XG4gIGF3YWl0IChsaW5lcy5sZW5ndGggPiAwXG4gICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHRvb2xWZXJzaW9uc1BhdGgsIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbicpKVxuICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHRvb2xWZXJzaW9uc1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ3BsdWdpbicsICd1cGRhdGUnLCAnLS1hbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ2luc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVWZXJzaW9uKGxpbmVzOiBzdHJpbmdbXSwgdG9vbE5hbWU6IHN0cmluZywgbmV3VmVyc2lvbjogc3RyaW5nLCBoZWFkID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc3QgaW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGwpID0+IGwuc3BsaXQoL1xccysvKVswXSA9PT0gdG9vbE5hbWUpO1xuICBjb25zdCBuZXdMaW5lID0gYCR7dG9vbE5hbWV9ICR7bmV3VmVyc2lvbn1gO1xuICBpZiAoaW5kZXggPj0gMCkge1xuICAgIGNvbnN0IFssIHZlcnNpb25dID0gbGluZXNbaW5kZXhdLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKGNvbnZlcnRWZXJzaW9uSW50b051bWJlcihuZXdWZXJzaW9uKSA+IGNvbnZlcnRWZXJzaW9uSW50b051bWJlcih2ZXJzaW9uKSkge1xuICAgICAgbGluZXNbaW5kZXhdID0gbmV3TGluZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGluZXMuc3BsaWNlKGhlYWQgPyAwIDogbGluZXMubGVuZ3RoLCAwLCBuZXdMaW5lKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvc2l0b3J5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIC8vIEZldGNoIHRoZSBsYXRlc3QgcmVsZWFzZSBmcm9tIHRoZSByZXBvc2l0b3J5XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvbGF0ZXN0Jywge1xuICAgICAgb3duZXI6IG9yZ2FuaXphdGlvbixcbiAgICAgIHJlcG86IHJlcG9zaXRvcnksXG4gICAgfSk7XG4gICAgY29uc3QgdmVyc2lvbiA9IHJlc3BvbnNlLmRhdGEudGFnX25hbWU7XG4gICAgY29uc3QgaW5kZXggPSB2ZXJzaW9uLmxhc3RJbmRleE9mKCd2Jyk7XG4gICAgY29uc3QgdmVyc2lvbk51bWJlclRleHQgPSBpbmRleCA+PSAwID8gdmVyc2lvbi5zbGljZShpbmRleCArIDEpIDogdmVyc2lvbjtcbiAgICAvLyBDaGVjayB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGEgbnVtYmVyXG4gICAgcmV0dXJuIC9eXFxkLy50ZXN0KHZlcnNpb25OdW1iZXJUZXh0KSA/IHZlcnNpb25OdW1iZXJUZXh0IDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBCdW4gdGFncyBkdWUgdG86JywgZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxufVxuIiwiaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogYW55W10sIHNvdXJjZTogYW55W10sIG9wdGlvbnM6IGFueSk6IGFueVtdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICcuL25vZGVfbW9kdWxlcy9AYmlvbWVqcy9iaW9tZS9jb25maWd1cmF0aW9uX3NjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQmlvbWVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IHVua25vd24gPSBjbG9uZURlZXAoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgdGVsZW1ldHJ5ID0gZmFsc2VcblxuW2luc3RhbGxdXG5leGFjdCA9IHRydWVcblxuW3J1bl1cbmJ1biA9IHRydWVcblxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZeOBp+OBr25vZGVfbW9kdWxlc+OCkkNPUFnjgZnjgovlv4XopoHjgYzjgYLjgovjgZ/jgoHjgIFub2RlX21vZHVsZXPjgpLpmaTlpJbjgZfjgabjga/jgYTjgZHjgarjgYTjgIJcbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4qKi8uaWRlYVxuKiovKi5zcWxpdGUzKlxuKiovLnlhcm4vaW5zdGFsbC1zdGF0ZS5nelxuKiovLnZlbnZcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURvY2tlcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZURvY2tlcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kb2NrZXJpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc0RvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IHtcbiAgY29kZVdpdGgySW5kZW50U2l6ZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjcHAnLFxuICAgICdkYXJ0JyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3B1JyxcbiAgICAncHVtbCcsXG4gICAgJ3JiJyxcbiAgICAndnVlJyxcbiAgICAneG1sJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0uc29ydCgpLFxuICBjb2RlV2l0aDRJbmRlbnRTaXplOiBbJ2dvJywgJ2dyYWRsZScsICdweSddLnNvcnQoKSxcbiAgY29kZVdpdGg4SW5kZW50U2l6ZTogWydzaCddLnNvcnQoKSxcbiAgbWFya2Rvd25MaWtlOiBbJ21kJ10uc29ydCgpLFxuICBlc2xpbnQ6IFsnY2pzJywgJ21qcycsICdqcycsICdjdHMnLCAnbXRzJywgJ3RzJywgJ3RzeCcsICdqc3gnXS5zb3J0KCksXG4gIHByZXR0aWVyOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NzcycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdtZCcsXG4gICAgJ3Njc3MnLFxuICAgICd2dWUnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS5zb3J0KCksXG4gIC8vIGNmLiBodHRwczovL2Jpb21lanMuZGV2L2ludGVybmFscy9sYW5ndWFnZS1zdXBwb3J0L1xuICBiaW9tZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAndnVlJyxcbiAgICAnc3ZlbHRlJyxcbiAgICAnYXN0cm8nLFxuICAgICdjc3MnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnZ3FsJyxcbiAgXS5zb3J0KCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDhJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gOFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuQHR5cGVzL1xuX19nZW5lcmF0ZWRfXy9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xuKi5jb25maWcuKmpzXG4qLmQudHNcbioubWluLipqc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFc2xpbnRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFc2xpbnRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRXNsaW50cmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFc2xpbnRyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiYXNlcyA9IFtdO1xuICAgIGlmIChjb25maWcuZXNsaW50QmFzZSkge1xuICAgICAgYmFzZXMucHVzaChjb25maWcuZXNsaW50QmFzZSk7XG4gICAgfVxuICAgIGlmIChjb25maWcgIT09IHJvb3RDb25maWcpIHtcbiAgICAgIGJhc2VzLnB1c2goJy4uLy4uLy5lc2xpbnRyYy5qc29uJyk7XG4gICAgfVxuICAgIGxldCBuZXdTZXR0aW5ncyA9IHsgcm9vdDogdHJ1ZSwgZXh0ZW5kczogYmFzZXMgfTtcblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgaWYgKG9sZFNldHRpbmdzLmV4dGVuZHMpIHtcbiAgICAgICAgb2xkU2V0dGluZ3MuZXh0ZW5kcyA9IG9sZFNldHRpbmdzLmV4dGVuZHMuZmlsdGVyKFxuICAgICAgICAgIChleHQ6IHN0cmluZykgPT4gIWV4dC5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykgJiYgZXh0ICE9PSAnLi4vLi4vLmVzbGludHJjLmpzb24nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoYmFzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG9sZFNldHRpbmdzLmV4dGVuZHMgPSBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld0V4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBvbGRTZXR0aW5ncy5leHRlbmRzID0gbmV3RXh0ZW5kcztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICB9KSBhcyB0eXBlb2YgbmV3U2V0dGluZ3M7XG4gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBjb2RlIGFmdGVyIGFsbCBCbGl0ei5qcyBwcm9qZWN0cyBhcmUgdXBkYXRlZC5cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzLmZpbHRlcihcbiAgICAgICAgICAoZXh0OiBzdHJpbmcpID0+IGV4dCAhPT0gJy4vbm9kZV9tb2R1bGVzL0BibGl0empzL25leHQvZXNsaW50J1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuIS5rZWVwXG4uZW52LnByb2R1Y3Rpb25cbiovbW91bnQvKi5oYXNoXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5kZXZjb250YWluZXIvXG5kaXN0L1xudGVtcC9cblxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGxldCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCkgKyBjb21tb25Db250ZW50O1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IG5hbWVzID0gWy4uLmRlZmF1bHROYW1lc107XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgICBuYW1lcy5wdXNoKCdub2RlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWwpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmF3cy1zYW0vXG5wYWNrYWdlZC55YW1sXG5gO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIC52ZW52IHNob3VsZCBiZSBpZ25vcmVkIG9uIHJvb3QgZGlyZWN0b3J5XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuKi5zcWxpdGUzLWpvdXJuYWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHRlc3QtcmVzdWx0cy9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2FydGlmYWN0cyQvZ20sICcuaWRlYS9hcnRpZmFjdHMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9jb21waWxlci54bWwkL2dtLCAnLmlkZWEvY29tcGlsZXIueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvamFyUmVwb3NpdG9yaWVzLnhtbCQvZ20sICcuaWRlYS9qYXJSZXBvc2l0b3JpZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnLmlkZWEvbW9kdWxlcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC8qLmltbCQvZ20sICcuaWRlYS8qLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMkL2dtLCAnLmlkZWEvbW9kdWxlcycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmltbCQvZ20sICcqLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmlwciQvZ20sICcqLmlwcicpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGdlbmVyYXRlZCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY2FjaGUnLCAnd2JmeScsICdnaXRpZ25vcmUnKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDYWNoZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgY29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSk7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGF0Lm10aW1lTXMgPiA2ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IEVzbGludFV0aWwgPSB7XG4gIGdldExpbnRGaXhTdWZmaXgoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4ID8gJyAtLXJ1bGUgXCJ7IHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwczogMCB9XCInIDogJyc7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IHNyY0RpcmVjdG9yaWVzID0ge1xuICBub2RlOiBbJ3NyYycsICd0ZXN0cycsICdzY3JpcHRzJ10uc29ydCgpLFxuICBibGl0ejogWydzcmMnLCAndGVzdHMnLCAnc2NyaXB0cycsICdkYicsICdpbnRlZ3JhdGlvbnMnLCAnbWFpbGVycyddLnNvcnQoKSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcmNEaXJzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICByZXR1cm4gc3JjRGlyZWN0b3JpZXMuYmxpdHo7XG4gIH1cbiAgcmV0dXJuIHNyY0RpcmVjdG9yaWVzLm5vZGU7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB7IGdsb2JieSwgZ2xvYmJ5U3luYyB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVzbGludEV4dGVuc2lvbkJhc2UsIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFNyY0RpcnMgfSBmcm9tICcuLi91dGlscy9zcmNEaXJlY3Rvcmllcy5qcyc7XG5pbXBvcnQgeyBCTElUWl9WRVJTSU9OLCBORVhUX1ZFUlNJT04gfSBmcm9tICcuLi91dGlscy92ZXJzaW9uQ29uc3RhbnRzLmpzJztcblxuY29uc3QganNDb21tb25EZXBzID0gW1xuICAnZXNsaW50QDguNTcuMCcsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0JyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG5dO1xuXG5jb25zdCB0c0NvbW1vbkRlcHMgPSBbXG4gIC4uLmpzQ29tbW9uRGVwcyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0Jyxcbl07XG5cbmNvbnN0IHJlYWN0Q29tbW9uRGVwcyA9IFsnZXNsaW50LXBsdWdpbi1yZWFjdCcsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJ107XG5cbmNvbnN0IGVzbGludERlcHM6IFJlY29yZDxFc2xpbnRFeHRlbnNpb25CYXNlLCBzdHJpbmdbXT4gPSB7XG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLCAuLi5qc0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JywgLi4uanNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJywgLi4udHNDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsIC4uLnRzQ29tbW9uRGVwcywgLi4ucmVhY3RDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnLFxuICAgICdlc2xpbnQtY29uZmlnLW5leHQnLFxuICAgIC4uLnRzQ29tbW9uRGVwcyxcbiAgICAuLi5yZWFjdENvbW1vbkRlcHMsXG4gIF0sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JzogW1xuICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgICAnZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgICAuLi50c0NvbW1vbkRlcHMsXG4gICAgLi4ucmVhY3RDb21tb25EZXBzLFxuICBdLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyB8fCB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzIHx8IHt9O1xuXG4gIGF3YWl0IHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmogYXMgU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+XG4gICk7XG5cbiAgaWYgKGpzb25PYmoubmFtZSAhPT0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgIC8vIEZyZXNoIHJlcG8gc3RpbGwgcmVxdWlyZXMgJ3lhcm4gaW5zdGFsbCdcbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC95YXJuXFxzKiYmXFxzKi8sICcnKS5yZXBsYWNlKC95YXJuXFxzKmluc3RhbGxcXHMqJiZcXHMqLywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGpzb25PYmouc2NyaXB0cyA9IG1lcmdlKGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZykpO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeTtcbiAgfSBlbHNlIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucHJldHRpZnkgKz0gYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCk7XG4gIH1cbiAgLy8gRGVhbCB3aXRoIGJyZWFraW5nIGNoYW5nZXMgaW4geWFybiBiZXJyeSA0LjAuMC1yYy40OVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMpKSB7XG4gICAgaWYgKCF2YWx1ZT8uaW5jbHVkZXMoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJykpIGNvbnRpbnVlO1xuICAgIGlmIChcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLWFsbCcpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1yZWN1cnNpdmUnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tc2luY2UnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0td29ya3RyZWUnKVxuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnLCAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnKTtcbiAgfVxuXG4gIGxldCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3ByZXR0aWVyJywgJ3NvcnQtcGFja2FnZS1qc29uJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnXTtcbiAgY29uc3QgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIH0gZWxzZSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xpbnQtc3RhZ2VkJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2h1c2t5J107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3BpbnN0J107XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmVwYWNrO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cGFjaztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IGh1c2t5XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnaHVza3knKTtcbiAgICAgIC8vICd8fCB0cnVlJyBhdm9pZHMgZXJyb3JzIHdoZW4gaHVza3kgaXMgbm90IGluc3RhbGxlZC5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2h1c2t5IHx8IHRydWUnOyAvLyBmb3Igbm9uLXlhcm4gcGFja2FnZSBtYW5hZ2Vycy5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9ICdodXNreSB8fCB0cnVlJzsgLy8gZm9yIHlhcm4uXG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbyB8fCBjb25maWcuaXNSZWZlcnJlZEJ5T3RoZXJSZXBvKSB7XG4gICAgICAgIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICAgICAgICAvLyBodHRwczovL3R5cGljb2RlLmdpdGh1Yi5pby9odXNreS8jLz9pZD1pbnN0YWxsLTFcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3BpbnN0Jyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYWNrID0gJ3BpbnN0IC0tZGlzYWJsZSc7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5wb3N0cGFjayA9ICdwaW5zdCAtLWVuYWJsZSc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgY29uc3QgdmVyc2lvbiA9XG4gICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gfHwganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXVxuICAgICAgICAgID8gLy8gVE9ETzogcmVtb3ZlIHRoZSB2ZXJzaW9uIHNwZWNpZmljYXRpb24gYWZ0ZXIgbXVsdGktc2VtYW50aWMtcmVsZWFzZSBzdXBwb3J0cyB2ZXJzaW9uIDcrXG4gICAgICAgICAgICAnQDYuMS4wJ1xuICAgICAgICAgIDogJyc7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChgY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJHt2ZXJzaW9ufWApO1xuICAgICAgaWYgKFxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXVxuICAgICAgKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnZlcnNpb24gPSAnMC4wLjAtc2VtYW50aWNhbGx5LXJlbGVhc2VkJztcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ3BsYXl3cmlnaHQnXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sncGxheXdyaWdodCddO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBnbG9iYnlTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGdpdGlnbm9yZTogdHJ1ZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9zaGFyZWQtc2NyaXB0cyddIHx8IGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC93YlxccytkYi8sICd3YiBwcmlzbWEnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlc1xuICApIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQGJpb21lanMvYmlvbWUnLCAnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnZXNsaW50QDguNTcuMCcsICdtaWNyb21hdGNoJyk7XG4gICAgICAvLyBUT0RPOiBub3QgbmVlZGVkIGFueW1vcmU/XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCd0eXBlc2NyaXB0Jyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmVzbGludEJhc2UpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5lc2xpbnREZXBzW2NvbmZpZy5lc2xpbnRCYXNlXSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgfVxuXG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gU2luY2UgYFwicmVzb2x1dGlvbnNcIjogeyBcIm5wbS9jaGFsa1wiOiBcIl40LjEuMlwiIH0sYCBjYXVzZXMgXCJJbnZhbGlkIG5wbSB0b2tlblwiXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddO1xuICAgICAganNvbk9iai5zY3JpcHRzLmNsZWFudXAgPSBqc29uT2JqLnNjcmlwdHMuY2xlYW51cD8ucmVwbGFjZSgnICYmIHlhcm4gbGludC1maXgnLCAnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSArPSBFc2xpbnRVdGlsLmdldExpbnRGaXhTdWZmaXgoY29uZmlnKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZmx1dHRlciBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ICs9IGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgICBpZiAoanNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID09PSAncG9ldHJ5IGluc3RhbGwnKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgICB9XG4gICAgICBjb25zdCBweXRob25GaWxlcyA9IGF3YWl0IGdsb2JieSgnKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBnaXRpZ25vcmU6IHRydWUsXG4gICAgICAgIGlnbm9yZTogWyd0ZXN0LWZpeHR1cmVzJ10sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KC9bL1xcXFxdLyk7XG4gICAgICAgIGlmIChzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgcG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgcG9ldHJ5IHJ1biBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCArPSBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgICBwb2V0cnlEZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5KSB7XG4gICAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIGRlcGVuZGVuY2llcy5wdXNoKFxuICAgICAgYGJsaXR6QCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYEBibGl0empzL2F1dGhAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgQGJsaXR6anMvbmV4dEAke0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBAYmxpdHpqcy9ycGNAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgbmV4dEAke05FWFRfVkVSU0lPTn1gXG4gICAgKTtcbiAgICAvLyBQcmVmZXIgZXNsaW50LWNvbmZpZy1uZXh0J3MgZGVwZW5kZW5jaWVzXG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZCkgPT4gZCAhPT0gJ2VzbGludC1wbHVnaW4tcmVhY3QnICYmIGQgIT09ICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJyk7XG4gICAgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ2JsaXR6IGNvZGVnZW4nKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ2JsaXR6IGNvZGVnZW4nO1xuICAgIH0gZWxzZSBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5pbmNsdWRlcygnYmxpdHogcHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5yZXBsYWNlKFxuICAgICAgICAnYmxpdHogY29kZWdlbicsXG4gICAgICAgICdibGl0eiBjb2RlZ2VuICYmIGJsaXR6IHByaXNtYSBnZW5lcmF0ZSdcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hICYmICFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ3ByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ3ByaXNtYSBnZW5lcmF0ZSc7XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgLy8gVG8gcHJldmVudCBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBAdHlwZXMvcmVhY3QgZnJvbSBtaXhpbmcuXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcmVhY3QnXTtcbiAgfVxuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXM/LnByZXR0aWVyKSB7XG4gICAgLy8gQmVjYXVzZSBAdHlwZXMvcHJldHRpZXIgYmxvY2tzIHByZXR0aWVyIGV4ZWN1dGlvbi5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9wcmV0dGllciddO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmoucGVlckRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmoucGVlckRlcGVuZGVuY2llcztcbiAgfVxuXG4gIGxldCBuZXdKc29uVGV4dCA9IEpTT04uc3RyaW5naWZ5KGpzb25PYmopO1xuICBuZXdKc29uVGV4dCA9IGF3YWl0IGZpeFNjcmlwdE5hbWVzKGpzb25PYmouc2NyaXB0cywgbmV3SnNvblRleHQsIGNvbmZpZyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3SnNvblRleHQpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXZEZXBlbmRlbmNpZXMuXG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGV2RGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRlcGVuZGVuY2llcy5cbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctRCcsIC4uLm5ldyBTZXQoZGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gICAgaWYgKHBvZXRyeURldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4ubmV3IFNldChwb2V0cnlEZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBtaWdyYXRpb24gY29kZSBpbiBmdXR1cmVcbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvc2hhcmVkLXNjcmlwdHMnXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0c2xpYiddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3NoYXJlZC1zY3JpcHRzJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LXBsdWdpbi1wcmV0dGllciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xlcm5hJ107XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3BpbnN0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydwcmV0dGllciddO1xuICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICBmb3IgKGNvbnN0IGRlcHMgb2YgT2JqZWN0LnZhbHVlcyhlc2xpbnREZXBzKSkge1xuICAgICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKCdsZXJuYS5qc29uJywgeyBmb3JjZTogdHJ1ZSB9KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgY2xlYW51cDogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0JyxcbiAgICAgIGZvcm1hdDogYGJ1biAtLWJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICAgIGxpbnQ6IGBidW4gLS1idW4gd2IgbGludGAsXG4gICAgICAnbGludC1maXgnOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXgnLFxuICAgICAgdGVzdDogJ2J1biAtLWJ1biB3YiB0ZXN0JyxcbiAgICAgIHR5cGVjaGVjazogJ2J1biAtLWJ1biB3YiB0eXBlY2hlY2snLFxuICAgIH07XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9IGVsc2Uge1xuICAgIGxldCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgY2xlYW51cDogJ3lhcm4gZm9ybWF0ICYmIHlhcm4gbGludC1maXgnLFxuICAgICAgZm9ybWF0OiBgc29ydC1wYWNrYWdlLWpzb24gJiYgeWFybiBwcmV0dGlmeWAsXG4gICAgICBsaW50OiBgZXNsaW50IC0tY29sb3IgXCIuL3ske2dldFNyY0RpcnMoY29uZmlnKX19LyoqLyoueyR7ZXh0ZW5zaW9ucy5lc2xpbnQuam9pbignLCcpfX1cImAsXG4gICAgICAnbGludC1maXgnOiAneWFybiBsaW50IC0tZml4JyxcbiAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX1cIiBcIiEqKi90ZXN0LWZpeHR1cmVzLyoqXCJgLFxuICAgICAgdHlwZWNoZWNrOiAndHNjIC0tbm9FbWl0IC0tUHJldHR5JyxcbiAgICB9O1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBjb25zdCBvbGRUZXN0ID0gc2NyaXB0cy50ZXN0O1xuICAgICAgc2NyaXB0cyA9IG1lcmdlKFxuICAgICAgICB7IC4uLnNjcmlwdHMgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnkgJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oXG4gICAgICAgICAgICAnLCdcbiAgICAgICAgICApfX1cIiBcIiEqKi9wYWNrYWdlcy8qKlwiIFwiISoqL3Rlc3QtZml4dHVyZXMvKipcImAsXG4gICAgICAgICAgLy8gQ0k9MSBwcmV2ZW50cyB2aXRlc3QgZnJvbSBlbmFibGluZyB3YXRjaC5cbiAgICAgICAgICAvLyBGT1JDRV9DT0xPUj0zIG1ha2Ugd2IgZW5hYmxlIGNvbG9yIG91dHB1dC5cbiAgICAgICAgICB0ZXN0OiAnQ0k9MSBGT1JDRV9DT0xPUj0zIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tdmVyYm9zZSBydW4gdGVzdCcsXG4gICAgICAgICAgdHlwZWNoZWNrOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIHR5cGVjaGVjaycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAob2xkVGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9IHNjcmlwdHMudHlwZWNoZWNrID8gYCR7c2NyaXB0cy50eXBlY2hlY2t9ICYmIGAgOiAnJztcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICdweXJpZ2h0JztcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gJ3diIHR5cGVjaGVjayc7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPCAwKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeFNjcmlwdE5hbWVzKFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuZXdKc29uVGV4dDogc3RyaW5nLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG9sZEFuZE5ld1NjcmlwdE5hbWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5XSBvZiBPYmplY3Qua2V5cyhzY3JpcHRzKSkge1xuICAgIGlmIChrZXlbMF0gIT09ICc6JyAmJiBrZXkuaW5jbHVkZXMoJzonKSkge1xuICAgICAgb2xkQW5kTmV3U2NyaXB0TmFtZXMucHVzaChba2V5LCBrZXkucmVwbGFjZUFsbCgnOicsICctJyldKTtcbiAgICB9XG4gIH1cbiAgaWYgKG9sZEFuZE5ld1NjcmlwdE5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ld0pzb25UZXh0O1xuXG4gIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgbmV3SnNvblRleHQgPSBuZXdKc29uVGV4dC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICB9XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZ2xvYmJ5KFsnKiovKi57bWQsY2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JywgJyoqL0RvY2tlcmZpbGUnXSwge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGdpdGlnbm9yZTogdHJ1ZSxcbiAgfSk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IG9sZENvbnRlbnQ7XG4gICAgICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBvbGRBbmROZXdTY3JpcHROYW1lcykge1xuICAgICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG5ld0NvbnRlbnQgIT09IG9sZENvbnRlbnQpIHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIHJldHVybiBuZXdKc29uVGV4dDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHByZUNvbW1pdDogJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vbGludC1zdGFnZWQnLFxuICBwcmVQdXNoOiBgeWFybiB0eXBlY2hlY2tgLFxuICBwcmVQdXNoRm9yTGFiOiBgXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxueWFybiB0eXBlY2hlY2tcbmAudHJpbSgpLFxuICBwb3N0TWVyZ2U6IGBcbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUh1c2t5cmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVIdXNreXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGpzb25UZXh0KTtcbiAgcGFja2FnZUpzb24uc2NyaXB0cyB8fD0ge307XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwb3N0aW5zdGFsbCddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdHB1Ymxpc2gnXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3ByZXBhcmUnXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3ByZXB1Ymxpc2hPbmx5J107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwYWNrJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwb3N0cGFjayddO1xuXG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3knKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYWNrYWdlSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCB1bmRlZmluZWQsIDIpKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICdodXNreS1pbml0JywgJy0teWFybjInXSwgY29uZmlnLmRpclBhdGgpO1xuXG4gIGNvbnN0IHByZUNvbW1pdEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwcmUtY29tbWl0Jyk7XG5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy53cml0ZUZpbGUocHJlQ29tbWl0RmlsZVBhdGgsIHNjcmlwdHMucHJlQ29tbWl0ICsgJ1xcbicpKTtcblxuICBjb25zdCB7IHR5cGVjaGVjayB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZyk7XG4gIGlmICh0eXBlY2hlY2spIHtcbiAgICBsZXQgcHJlUHVzaCA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykgPyBzY3JpcHRzLnByZVB1c2hGb3JMYWIgOiBzY3JpcHRzLnByZVB1c2g7XG4gICAgcHJlUHVzaCA9IHByZVB1c2gucmVwbGFjZShcbiAgICAgICd5YXJuIHR5cGVjaGVjaycsXG4gICAgICB0eXBlY2hlY2tcbiAgICAgICAgLnJlcGxhY2UoJ3RzYyAnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi90c2MgJylcbiAgICAgICAgLnJlcGxhY2UoJ3diICcsICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL3diICcpXG4gICAgICAgIC8vIHB5cmlnaHQgaGFzIG5vIGFyZ3VtZW50c1xuICAgICAgICAucmVwbGFjZSgncHlyaWdodCcsICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL3B5cmlnaHQnKVxuICAgICk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwcmUtcHVzaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgICAgbW9kZTogMG83NTUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy52ZXJzaW9uc1RleHQpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImF3ayAne3ByaW50IFxcJDF9JyAudG9vbC12ZXJzaW9ucyB8IHhhcmdzIC1Je30gYXNkZiBwbHVnaW4gYWRkIHt9XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgcGx1Z2luIHVwZGF0ZSAtLWFsbFwiYFxuICAgICk7XG4gIH1cbiAgLy8gUHl0aG9u44GM44Gq44GE44Go44Kk44Oz44K544OI44O844Or44Gn44GN44Gq44GE5Yem55CG57O744GM5a2Y5Zyo44GZ44KL44Gf44KB44CB5by35Yi255qE44Gr5pyA5Yid44Gr44Kk44Oz44K544OI44O844Or44GZ44KL44CCXG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0Py5pbmNsdWRlcygncHl0aG9uICcpKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBpbnN0YWxsIHB5dGhvblwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy52ZXJzaW9uc1RleHQpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIGluc3RhbGxcImApO1xuICB9XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBpbnN0YWxsJyA6ICd5YXJuJztcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3J5ID0gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQgPyAnICYmIHJtIC1SZiAubmV4dCcgOiAnJztcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChgcnVuX2lmX2NoYW5nZWQgXCJwYWNrYWdlXFxcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICAncnVuX2lmX2NoYW5nZWQgXCJkYi9zY2hlbWEucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBtaWdyYXRlIGRlcGxveVwiJyxcbiAgICAgICdydW5faWZfY2hhbmdlZCBcImRiL3NjaGVtYS5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCInLFxuICAgICAgJ3J1bl9pZl9jaGFuZ2VkIFwiZGIvc2NoZW1hLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBjb2RlZ2VuXCInXG4gICAgKTtcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICAncnVuX2lmX2NoYW5nZWQgXCJwcmlzbWEvc2NoZW1hLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcIicsXG4gICAgICAncnVuX2lmX2NoYW5nZWQgXCJwcmlzbWEvc2NoZW1hLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgZ2VuZXJhdGVcIidcbiAgICApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG5cbmNvbnN0IHByZXR0aWVyQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ25vZGUnLCAnbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlJywgJ1ByZXR0aWVyJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuY29uc3QgYmlvbWVDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnYnVuJywgJ25vZGVfbW9kdWxlcy8uYmluL2Jpb21lIGNoZWNrIC0tZml4JywgJ0Jpb21lJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIChjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24gJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc0dlbWZpbGUgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNHb01vZCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc1BvbVhtbClcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29uZmlnLmlzQnVuID8gYmlvbWVDb250ZW50IDogcHJldHRpZXJDb250ZW50KSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIH0gZnJvbSAnLi9odXNreXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5jb25zdCBuZXdTZXR0aW5ncyA9IHtcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ3ByZXBhcmUuc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAncHJlLWNvbW1pdCc6IHtcbiAgICBjb21tYW5kczoge1xuICAgICAgY2xlYW51cDoge1xuICAgICAgICBnbG9iOiAnKi57Y2pzLGNzcyxjdHMsaHRtLGh0bWwsanMsanNvbixqc29uNSxqc29uYyxqc3gsbWQsbWpzLG10cyxzY3NzLHRzLHRzeCx2dWUseWFtbCx5bWx9JyxcbiAgICAgICAgcnVuOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQge3N0YWdlZF9maWxlc30gJiYgZ2l0IGFkZCB7c3RhZ2VkX2ZpbGVzfScsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAnY2hlY2suc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcHJlUHVzaDogYGJ1biAtLWJ1biBub2RlX21vZHVsZXMvLmJpbi93YiB0eXBlY2hlY2tgLFxuICBwcmVQdXNoRm9yTGFiOiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuYnVuIC0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL3diIHR5cGVjaGVja1xuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2soY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9vaycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XG4gIHBhY2thZ2VKc29uLnNjcmlwdHMgfHw9IHt9O1xuICBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwYXJlJ10gPSAnbGVmdGhvb2sgaW5zdGFsbCB8fCB0cnVlJztcblxuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKSksXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGNvbnN0IHsgdHlwZWNoZWNrIH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnKTtcbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGNvbnN0IHByZVB1c2ggPSBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFNyY0RpcnMgfSBmcm9tICcuLi91dGlscy9zcmNEaXJlY3Rvcmllcy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlUHJlZml4ID0gY29uZmlnLmlzUm9vdCA/ICdub2RlIG5vZGVfbW9kdWxlcy8uYmluLycgOiAnbm9kZSAuLi8uLi9ub2RlX21vZHVsZXMvLmJpbi8nO1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgY29uc3QgZXNsaW50ID0gYFxuICAnJHtnZXRFc2xpbnRLZXkoY29uZmlnKX0nOiBbJHtKU09OLnN0cmluZ2lmeShcbiAgICBgJHtwYWNrYWdlUHJlZml4fWVzbGludCAtLWZpeCR7RXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyl9YFxuICApfSwgJyR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnXSxgO1xuICAgIGxpbmVzLnB1c2goZXNsaW50KTtcbiAgfVxuICBjb25zdCBwYWNrYWdlc0ZpbHRlciA9IGNvbmZpZy5pc1Jvb3QgPyBcIiAmJiAhZmlsZS5pbmNsdWRlcygnL3BhY2thZ2VzLycpXCIgOiAnJztcbiAgbGluZXMucHVzaChgXG4gICcuLyoqLyoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fSc6IGZpbGVzID0+IHtcbiAgICBsZXQgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKSR7cGFja2FnZXNGaWx0ZXJ9KTske2dldEVzbGludEZpbHRlckZvclByZXR0aWVyKGNvbmZpZyl9XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgY29tbWFuZHMgPSBbXFxgJHtwYWNrYWdlUHJlZml4fXByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSBcXCR7ZmlsdGVyZWRGaWxlcy5qb2luKCcgJyl9XFxgXTtcbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5zb21lKGZpbGUgPT4gZmlsZS5lbmRzV2l0aCgncGFja2FnZS5qc29uJykpKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKCcke3BhY2thZ2VQcmVmaXh9c29ydC1wYWNrYWdlLWpzb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1hbmRzO1xuICB9LGApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgbGluZXMucHVzaChgXG4gICcuL3tsaWIsdGVzdCx0ZXN0X2RyaXZlcn0vKiovKi5kYXJ0JzogZmlsZXMgPT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhZmlsZS5pbmNsdWRlcygnZ2VuZXJhdGVkJykpXG4gICAgICAuZmlsdGVyKGZpbGUgPT4gIWZpbGUuZW5kc1dpdGgoJy5mcmVlemVkLmRhcnQnKSAmJiAhZmlsZS5lbmRzV2l0aCgnLmcuZGFydCcpKTtcbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gW1xcYGZsdXR0ZXIgZm9ybWF0IFxcJHtmaWx0ZXJlZEZpbGVzLmpvaW4oJyAnKX1cXGBdO1xuICB9LGApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgIGxpbmVzLnB1c2goYFxuICAnLi8qKi8qLnB5JzogW1xuICAgICdwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcycsXG4gICAgJ3BvZXRyeSBydW4gYmxhY2snLFxuICAgICdwb2V0cnkgcnVuIGZsYWtlOCdcbiAgXSxgKTtcbiAgfVxuXG4gIGNvbnN0IG5ld0NvbnRlbnQgPSBgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbiR7Y29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgPyBcImNvbnN0IG1pY3JvbWF0Y2ggPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XFxuXCIgOiAnJ31cbm1vZHVsZS5leHBvcnRzID0geyR7bGluZXMuam9pbignJyl9XG59O1xuYDtcblxuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuY2pzJyk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRLZXkoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgZGlycyA9IGdldFNyY0RpcnMoY29uZmlnKTtcbiAgcmV0dXJuIGAuL3ske2RpcnMuam9pbignLCcpfX0vKiovKi57JHtleHRlbnNpb25zLmVzbGludC5qb2luKCcsJyl9fWA7XG59XG5cbmZ1bmN0aW9uIGdldEVzbGludEZpbHRlckZvclByZXR0aWVyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdFxuICAgID8gYFxcblxuICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZWxhdGl2ZSgnJywgZmlsZSkpO1xuICAgIGZpbHRlcmVkRmlsZXMgPSBtaWNyb21hdGNoLm5vdChmaWx0ZXJlZEZpbGVzLCAnJHtnZXRFc2xpbnRLZXkoY29uZmlnKX0nKTtcbiAgICBmaWx0ZXJlZEZpbGVzID0gZmlsdGVyZWRGaWxlcy5tYXAoKGZpbGUpID0+IHBhdGgucmVzb2x2ZShmaWxlKSk7YFxuICAgIDogJyc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU5leHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgLy8gUmVwbGFjZSB0aGUgSlNPTiBvYmplY3QgZnJvbSB0aGUgZmlsZVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoLz1cXHMqeyhbXFxTXFxzXSopfTsvLCAoXywgc2V0dGluZ3NUZXh0KSA9PiB7XG4gICAgICBpZiAoIXNldHRpbmdzVGV4dC5pbmNsdWRlcygnZXNsaW50OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAnZXNsaW50OiB7IGlnbm9yZUR1cmluZ0J1aWxkczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICBpZiAoIXNldHRpbmdzVGV4dC5pbmNsdWRlcygndHlwZXNjcmlwdDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ3R5cGVzY3JpcHQ6IHsgaWdub3JlQnVpbGRFcnJvcnM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGA9IHske3NldHRpbmdzVGV4dH19O2A7XG4gICAgfSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgdmVudlBhdGg6ICcuJyxcbiAgdmVudjogJy52ZW52Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiB1bmtub3duID0gY2xvbmVEZWVwKGpzb25PYmopO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncHlyaWdodGNvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KTtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkge1xuICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5Py5pbmRleE9mKCc6JykgKyAxKTtcbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5yZWFkZGlyU3luYyhgJHtjb25maWcuZGlyUGF0aH0vLmdpdGh1Yi93b3JrZmxvd3NgKTtcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lcykge1xuICAgICAgaWYgKCFmaWxlTmFtZS5zdGFydHNXaXRoKCd0ZXN0JykgJiYgIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSBjb250aW51ZTtcblxuICAgICAgbGV0IGJhZGdlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBjb25zdCBiYWRnZSA9IGBbIVske2JhZGdlTmFtZX1dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9L2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9KWA7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuZ2l0aHViL3dvcmtmbG93cy8ke2ZpbGVOYW1lfWApKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgYmFkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0QmFkZ2UocmVhZG1lOiBzdHJpbmcsIGJhZGdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDml6LjgatiYWRnZeOBjOOBguOCi+WgtOWQiOOBr+WJiumZpFxuICByZWFkbWUgPSByZWFkbWUucmVwbGFjZShiYWRnZSwgJycpLnJlcGxhY2VBbGwoL1xcblxcblxcbisvZywgJ1xcblxcbicpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVhZG1lLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlYWRtZVtpIC0gMV0gPT09ICdcXG4nICYmIHJlYWRtZVtpXSA9PT0gJ1xcbicpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHJlYWRtZS5zbGljZSgwLCBpICsgMSk7XG4gICAgICBsZXQgYWZ0ZXIgPSByZWFkbWUuc2xpY2UoaSArIDEpO1xuICAgICAgaWYgKCFhZnRlci5zdGFydHNXaXRoKCdbJykgJiYgIWFmdGVyLnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICBhZnRlciA9IGBcXG4ke2FmdGVyfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7YmVmb3JlfSR7YmFkZ2V9XFxuJHthZnRlcn1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7cmVhZG1lfVxcbiR7YmFkZ2V9XFxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3M/LnBsdWdpbnMgfHwgW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW4gPSBBcnJheS5pc0FycmF5KHBsdWdpbnNbaV0pID8gcGx1Z2luc1tpXVswXSA6IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSAmJiBwbHVnaW5zW2ldWzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFsnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbjUnXSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSB0eXBlb2YganNvbk9iaiAmIHsgcGFja2FnZVJ1bGVzOiB7IHBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXSB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSAnQHdpbGxib29zdGVyJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdXBncmFkZSBOZXh0LmpzIGF1dG9tYXRpY2FsbHlcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzID8/PSBbXTtcbiAgICAgIGlmICghbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnNvbWUoKHJ1bGU6IHsgcGFja2FnZU5hbWVzOiBzdHJpbmdbXSB9KSA9PiBydWxlLnBhY2thZ2VOYW1lcy5pbmNsdWRlcygnbmV4dCcpKSkge1xuICAgICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMucHVzaCh7IHBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICBkZWxldGUgb2JqW2tleV07XG4gIChvYmogYXMgUmVjb3JkPFRLZXksIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICBjb25zdCBrZXlBbmRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyhvYmopLnNvcnQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIHRhcmdldDogJ0VTMjAyMicsIC8vIGJlY2F1c2UgZGVjb3JhdG9ycyBzaG91bGQgYmUgdHJhbnNwaWxlZCB0byBFUzIwMjIgb24gTm9kZS5qc1xuICAgIG1vZHVsZTogJ0VTTmV4dCcsXG4gICAgbW9kdWxlUmVzb2x1dGlvbjogJ05vZGUnLFxuICAgIGpzeDogJ3JlYWN0LWpzeCcsXG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgICBza2lwTGliQ2hlY2s6IHRydWUsIC8vIGJlY2F1c2UgbGlicmFyaWVzIG1heSBoYXZlIGJyb2tlbiB0eXBlc1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuL0B0eXBlcyddLFxuICB9LFxuICBpbmNsdWRlOiBbXG4gICAgJ3NyYy8qKi8qJyxcbiAgICAndGVzdHMvKiovKicsXG4gICAgJ3NjcmlwdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc3JjLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3Rlc3RzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NjcmlwdHMvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICB0YXJnZXQ6ICdFUzIwMjInLCAvLyBiZWNhdXNlIGRlY29yYXRvcnMgc2hvdWxkIGJlIHRyYW5zcGlsZWQgdG8gRVMyMDIyIG9uIE5vZGUuanNcbiAgICBtb2R1bGU6ICdFU05leHQnLFxuICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlJyxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgc2tpcExpYkNoZWNrOiB0cnVlLCAvLyBiZWNhdXNlIGxpYnJhcmllcyBtYXkgaGF2ZSBicm9rZW4gdHlwZXNcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICAgIHR5cGVSb290czogWycuLi8uLi9ub2RlX21vZHVsZXMvQHR5cGVzJywgJy4uLy4uL0B0eXBlcycsICcuL0B0eXBlcyddLFxuICB9LFxuICBpbmNsdWRlOiBbJ3NyYy8qKi8qJywgJ3Rlc3RzLyoqLyonLCAnc2NyaXB0cy8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkgcmV0dXJuO1xuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGNvbmZpZy5pc1Jvb3QgPyByb290SnNvbk9iaiA6IHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLFxuICAgICAgICBtb2R1bGU6ICdOb2RlTmV4dCcsXG4gICAgICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlTmV4dCcsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICAgIGlmIChvbGRTZXR0aW5ncy5leHRlbmRzID09PSAnLi9ub2RlX21vZHVsZXMvQHdpbGxib29zdGVyL3RzY29uZmlnL3RzY29uZmlnLmpzb24nKSB7XG4gICAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgbW9kaWZ5IFwidGFyZ2V0XCIsIFwibW9kdWxlXCIgYW5kIFwibW9kdWxlUmVzb2x1dGlvblwiLlxuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udGFyZ2V0O1xuICAgICAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZTtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ubW9kdWxlUmVzb2x1dGlvbjtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICB9XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18nKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCk7XG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy52ZW52LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLm5leHQvKionKV0pO1xuICAgICAgfVxuICAgICAgc29ydEtleXMoc2V0dGluZ3MgPz8ge30pO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm46IHN0cmluZyk6IHVua25vd24ge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvbjogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIGpvYnM6IHsgW2tleTogc3RyaW5nXTogSm9iIH07XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICBpc3N1ZXM/OiBUeXBlcztcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3Q7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcztcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICB1c2VzOiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICAncGF0aHMtaWdub3JlJzogWycqKi5tZCcsICcqKi9kb2NzLyoqJ10sXG4gICAgICB9LFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJywgJ3diZnknXSxcbiAgICAgICAgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHdiZnk6IHtcbiAgICBuYW1lOiAnV2lsbGJvb3N0ZXJpZnknLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHdiZnk6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy93YmZ5LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3diZnktbWVyZ2UnOiB7XG4gICAgbmFtZTogJ01lcmdlIHdiZnknLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICd3YmZ5LW1lcmdlJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3diZnktbWVyZ2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxuICAnbm90aWZ5LXJlYWR5Jzoge1xuICAgIG5hbWU6ICdOb3RpZnkgcmVhZHknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdub3RpZnktcmVhZHknOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvbm90aWZ5LXJlYWR5LnltbEBtYWluJyxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIERJU0NPUkRfV0VCSE9PS19VUkw6ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUFEWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2FkZC1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgIG5hbWU6ICdBZGQgaXNzdWUgdG8gR2l0SHViIHByb2plY3QnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdhZGQtaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hZGQtaXNzdWUtdG8tcHJvamVjdC55bWxAbWFpbicsXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBHSF9QUk9KRUNUX1VSTDogJyR7eyBzZWNyZXRzLkdIX1BST0pFQ1RfVVJMIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgIG5hbWU6ICdBZGQgcmVhZHkgaXNzdWUgdG8gR2l0SHViIHByb2plY3QnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hZGQtaXNzdWUtdG8tcHJvamVjdC55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICBsYWJlbGVkOiAncmVhZHkgOnJvY2tldDonLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0hfUFJPSkVDVF9VUkw6ICdodHRwczovL2dpdGh1Yi5jb20vb3Jncy9XaWxsQm9vc3RlckxhYi9wcm9qZWN0cy81JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZpZyBvZiBzZW1hbnRpYyBwdWxsIHJlcXVlc3RcbiAgICBjb25zdCBzZW1hbnRpY1ltbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICdzZW1hbnRpYy55bWwnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oc2VtYW50aWNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGZpbGVOYW1lU2V0ID0gbmV3IFNldChbXG4gICAgICAndGVzdC55bWwnLFxuICAgICAgJ3diZnkueW1sJyxcbiAgICAgICd3YmZ5LW1lcmdlLnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAnYWRkLWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAgIC4uLmVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuaXNQdWJsaWNSZXBvIHx8IHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0LnltbCcpO1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdub3RpZnktcmVhZHkueW1sJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZVNldCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBjb25zdCBraW5kID0gcGF0aC5iYXNlbmFtZShmaWxlTmFtZSwgJy55bWwnKSBhcyBLbm93bktpbmQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCkpO1xuICAgIH1cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnYWRkLWZvY3VzZWQtaXNzdWUtdG8tcHJvamVjdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKHdvcmtmbG93c1traW5kIGFzIGtleW9mIHR5cGVvZiB3b3JrZmxvd3NdID8/IHt9KSBhcyBXb3JrZmxvdztcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIGlmIChuZXdTZXR0aW5ncy5qb2JzKSB7XG4gICAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgfVxuICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPSBbXG4gICAgICAgIC4uLm5ldyBTZXQ8c3RyaW5nPihbLi4uKG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID8/IFtdKSwgJyoqLm1kJywgJyoqL2RvY3MvKionXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgbm9uLXJldXNhYmxlIHdvcmtmbG93c1xuICAgIGlmICgham9iLnVzZXM/LmluY2x1ZGVzPy4oJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIHJldHVybjtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gIH1cblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3diZnknOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24pIHNldFNjaGVkdWxlKG5ld1NldHRpbmdzLCAyMCwgMjQpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3diZnktbWVyZ2UnOiB7XG4gICAgICBzZXRTY2hlZHVsZShuZXdTZXR0aW5ncywgMSwgNCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm8gZGVmYXVsdFxuICB9XG4gIG1pZ3JhdGVXb3JrZmxvdyhuZXdTZXR0aW5ncyk7XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3NlbWFudGljLXJlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gIH0gZWxzZSBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWluaXQueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgaWYgKCFuZXdTZXR0aW5ncy5qb2JzLnN5bmMgfHwgIW5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICghcGFyYW1zKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCB8fD0ge307XG4gIGpvYi5zZWNyZXRzIHx8PSB7fTtcblxuICBpZiAoXG4gICAga2luZCA9PT0gJ3Rlc3QnIHx8XG4gICAga2luZCA9PT0gJ3JlbGVhc2UnIHx8XG4gICAga2luZCA9PT0gJ3diZnknIHx8XG4gICAga2luZCA9PT0gJ3diZnktbWVyZ2UnIHx8XG4gICAga2luZCA9PT0gJ2FkZC1pc3N1ZS10by1wcm9qZWN0JyB8fFxuICAgIGtpbmQgPT09ICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCdcbiAgKSB7XG4gICAgam9iLnNlY3JldHNbJ0dIX1RPS0VOJ10gPSBjb25maWcuaXNQdWJsaWNSZXBvID8gJyR7eyBzZWNyZXRzLlBVQkxJQ19HSF9CT1RfUEFUIH19JyA6ICcke3sgc2VjcmV0cy5HSF9CT1RfUEFUIH19JztcbiAgfVxuICBpZiAoY29uZmlnLnJlbGVhc2UubnBtICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnKSkge1xuICAgIGpvYi5zZWNyZXRzWydOUE1fVE9LRU4nXSA9ICcke3sgc2VjcmV0cy5OUE1fVE9LRU4gfX0nO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0c1snRklSRUJBU0VfVE9LRU4nXSkge1xuICAgIGpvYi5zZWNyZXRzWydHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFJ10gPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzWydGSVJFQkFTRV9UT0tFTiddO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHNbJ0RJU0NPUkRfV0VCSE9PS19VUkwnXSAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzWydESVNDT1JEX1dFQkhPT0tfVVJMJ10gPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGg/LnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMudG9TdHJpbmcoKS5yZXBsYWNlKCdzeW5jICcsICcnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXMucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzLnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGhbJ2RvdF9lbnZfcGF0aCddID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGhbJ2RvdF9lbnZfcGF0aCddO1xuICB9XG4gIC8vIFJlbW92ZSBkZXByZWNhdGVkIHBhcmFtZXRlcnNcbiAgbWlncmF0ZUpvYihqb2IpO1xuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0c1snRkxZX0FQSV9UT0tFTiddICYmIGpvYi53aXRoWydkZXBsb3lfY29tbWFuZCddKSB7XG4gICAgam9iLndpdGhbJ2RlcGxveV9jb21tYW5kJ10gPSBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXS50b1N0cmluZygpLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNEb2NrZXJmaWxlKSB7XG4gICAgaWYgKGpvYi53aXRoWydjaV9zaXplJ10gIT09ICdleHRyYS1sYXJnZScgJiYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgfHwga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpKSB7XG4gICAgICBqb2Iud2l0aFsnY2lfc2l6ZSddID0gJ2xhcmdlJztcbiAgICB9XG4gICAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICAgIGpvYi53aXRoWydjcHVfYXJjaCddID0gJ1g2NCc7XG4gICAgfVxuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQgPT09ICd3YmZ5JyB8fCBraW5kID09PSAnd2JmeS1tZXJnZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aFsnZ2l0aHViX2hvc3RlZF9ydW5uZXInXSA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aFsnZ2l0aHViX2hvc3RlZF9ydW5uZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi5zZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gTW92ZSBzZWNyZXRzIHByb3AgYWZ0ZXIgd2l0aCBwcm9wXG4gICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKGpvYi5zZWNyZXRzKTtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRTY2hlZHVsZShuZXdTZXR0aW5nczogV29ya2Zsb3csIGluY2x1c2l2ZU1pbkhvdXJKc3Q6IG51bWJlciwgZXhjbHVzaXZlTWF4SG91ckpzdDogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IFttaW51dGVVdGMsIGhvdXJVdGNdID0gKChuZXdTZXR0aW5ncy5vbi5zY2hlZHVsZT8uWzBdPy5jcm9uIGFzIHN0cmluZykgPz8gJycpLnNwbGl0KCcgJykubWFwKE51bWJlcik7XG4gIGlmIChtaW51dGVVdGMgIT09IDAgJiYgTnVtYmVyLmlzSW50ZWdlcihob3VyVXRjKSkge1xuICAgIGNvbnN0IGhvdXJKc3QgPSAoaG91clV0YyArIDkpICUgMjQ7XG4gICAgY29uc3QgaW5SYW5nZSA9XG4gICAgICBpbmNsdXNpdmVNaW5Ib3VySnN0IDwgZXhjbHVzaXZlTWF4SG91ckpzdFxuICAgICAgICA/IGluY2x1c2l2ZU1pbkhvdXJKc3QgPD0gaG91ckpzdCAmJiBob3VySnN0IDwgZXhjbHVzaXZlTWF4SG91ckpzdFxuICAgICAgICA6IGluY2x1c2l2ZU1pbkhvdXJKc3QgPD0gaG91ckpzdCB8fCBob3VySnN0IDwgZXhjbHVzaXZlTWF4SG91ckpzdDtcbiAgICBpZiAoaW5SYW5nZSkgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbWluSnN0ID0gMSArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDU5KTtcbiAgY29uc3QgaG91ckpzdCA9IGluY2x1c2l2ZU1pbkhvdXJKc3QgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoZXhjbHVzaXZlTWF4SG91ckpzdCAtIGluY2x1c2l2ZU1pbkhvdXJKc3QpKTtcbiAgY29uc3QgY3JvbiA9IGAke21pbkpzdH0gJHsoaG91ckpzdCAtIDkgKyAyNCkgJSAyNH0gKiAqICpgO1xuICBuZXdTZXR0aW5ncy5vbi5zY2hlZHVsZSA9IFt7IGNyb24gfV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeWFtbFRleHQgPSB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHtcbiAgICBsaW5lV2lkdGg6IC0xLFxuICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICBzdHlsZXM6IHtcbiAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgIH0sXG4gIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gbWlncmF0ZVdvcmtmbG93KG5ld1NldHRpbmdzOiBXb3JrZmxvdyk6IHZvaWQge1xuICAvLyBUT0RPOiBSZW1vdmUgdGhlbSBhZnRlciAyMDIzLTAzLTMxXG4gIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzWydhZGQtdG8tcHJvamVjdCddO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlSm9iKGpvYjogSm9iKTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgaWYgKCFqb2Iud2l0aCkgcmV0dXJuO1xuICBkZWxldGUgam9iLndpdGhbJ25vbl9zZWxmX2hvc3RlZCddO1xuICBkZWxldGUgam9iLndpdGhbJ25vdGlmeV9kaXNjb3JkJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsncmVxdWlyZV9mbHknXTtcbiAgZGVsZXRlIGpvYi53aXRoWydyZXF1aXJlX2djbG91ZCddO1xuICBkZWxldGUgam9iLndpdGhbJ2NwdV9hcmNoJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbGFiZWwnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydsYWJlbE9wZXJhdG9yJ107XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW50ZXJmYWNlIFNldHRpbmdzIGV4dGVuZHMgUGFydGlhbDxDb25maWd1cmF0aW9uVmFsdWVNYXA+IHtcbiAgZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4OiBzdHJpbmc7XG4gIG5tTW9kZTogc3RyaW5nO1xuICBub2RlTGlua2VyOiBzdHJpbmc7XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbn1cblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGdldE1ham9yTnVtYmVyKGN1cnJlbnRWZXJzaW9uKSA8PSBnZXRNYWpvck51bWJlcihsYXRlc3RWZXJzaW9uKSAmJiBjdXJyZW50VmVyc2lvbiAhPT0gbGF0ZXN0VmVyc2lvbikge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IHlhcm5yY1ltbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjLnltbCcpO1xuICAgIGNvbnN0IHNldHRpbmdzID0geWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzO1xuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgZGVsZXRlIHNldHRpbmdzLmNvbXByZXNzaW9uTGV2ZWw7XG4gICAgaWYgKHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM7XG4gICAgfVxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20veWFybnBrZy9iZXJyeS9wdWxsLzQ2OThcbiAgICBzZXR0aW5ncy5lbmFibGVHbG9iYWxDYWNoZSA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSBzZXR0aW5ncy5wbHVnaW5zPy5sZW5ndGggPz8gMDtcbiAgICBzZXR0aW5ncy5wbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucz8uZmlsdGVyKChwKSA9PiBwLnBhdGggIT09ICcueWFybi9wbHVnaW5zL3VuZGVmaW5lZC5janMnKSA/PyBbXTtcbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggIT09IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBjb25zdCBwbHVnaW5QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycsICd1bmRlZmluZWQuY2pzJyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGx1Z2luUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLnBsdWdpbnM7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh5YXJucmNZbWxQYXRoLCB5YW1sLmR1bXAoc2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KSk7XG5cbiAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICd5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdmVyc2lvbnNKc29uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9ucycsICctLWpzb24nXSwgZGlyUGF0aCk7XG4gIGNvbnN0IHZlcnNpb25zID0gSlNPTi5wYXJzZSh2ZXJzaW9uc0pzb24pIGFzIHN0cmluZ1tdO1xuICByZXR1cm4gdmVyc2lvbnMuYXQoLTEpIGFzIHN0cmluZztcbn1cbmZ1bmN0aW9uIGdldE1ham9yTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IFttYWpvcl0gPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiBOdW1iZXIobWFqb3IpO1xufVxuIiwiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4sIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4pIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvcik/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCBzb2RpdW0gZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4sIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgZGVwcmVjYXRlZFNlY3JldE5hbWVzID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJ107XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4gfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoKS5wYXJzZWQgfHwge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIGRlcHJlY2F0ZWRTZWNyZXROYW1lcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvICYmIG5hbWUgPT09ICdQVUJMSUNfR0hfQk9UX1BBVCcpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgIH0sXG4gICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiBQUiBwYWdlLiAoWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgZHVlIHRvIGxvbmcgd29ya2Zsb3dzLilcbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gICAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBBbGwgdGVzdHMgYXJlIHBhc3NlZC5cbiAgICAtIFRlc3QgY29tbWFuZCAoZS5nLiwgXFxgeWFybiB0ZXN0XFxgKSBpcyBwYXNzZWQuXG4gICAgLSBMaW50IGNvbW1hbmQgKGUuZy4sIFxcYHlhcm4gbGludFxcYCkgaXMgcGFzc2VkLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIFBSJ3MgZGlmZiB2aWV3LlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBuZXdDb250ZW50KSA+IG5ld0NvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYmJ5U3luYyB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdpdEh1YlV0aWwsIG9jdG9raXQgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgaXNCdW46IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1N1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1BhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1B1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcblxuICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGVzbGludEJhc2U/OiBFc2xpbnRFeHRlbnNpb25CYXNlO1xuICB2ZXJzaW9uc1RleHQ/OiBzdHJpbmc7XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VDb25maWcoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5zUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCk7XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSBqc29uPy5icmFuY2hlcyB8fCBbXTtcbiAgICAgIHJlbGVhc2VQbHVnaW5zID0ganNvbj8ucGx1Z2lucz8uZmxhdCgpIHx8IFtdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IGlzUm9vdCA9XG4gICAgICBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nKSkgIT09ICdwYWNrYWdlcycgfHxcbiAgICAgICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNSb290KSB7XG4gICAgICByZXBvSW5mbyA9IGF3YWl0IGZldGNoUmVwb0luZm8oZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cblxuICAgIGxldCB2ZXJzaW9uc1RleHQgPSAnJztcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4Jyk7XG4gICAgICB2ZXJzaW9uc1RleHQgKz0gY29udGVudC50cmltKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGZvciAoY29uc3QgW3ByZWZpeCwgbmFtZV0gb2YgW1xuICAgICAgWydqYXZhJywgJ2phdmEnXSxcbiAgICAgIFsnbm9kZScsICdub2RlanMnXSxcbiAgICAgIFsncHl0aG9uJywgJ3B5dGhvbiddLFxuICAgIF0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG5vZGVWZXJzaW9uQ29udGVudCA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApLCAndXRmOCcpO1xuICAgICAgICBpZiAodmVyc2lvbnNUZXh0KSB7XG4gICAgICAgICAgdmVyc2lvbnNUZXh0ICs9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIHZlcnNpb25zVGV4dCArPSBuYW1lICsgJyAnICsgbm9kZVZlcnNpb25Db250ZW50LnRyaW0oKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiAhIXBhY2thZ2VKc29uLmZpbGVzLFxuICAgICAgcmVwb3NpdG9yeTogcmVwb0luZm8/LmZ1bGxfbmFtZSA/IGBnaXRodWI6JHtyZXBvSW5mbz8uZnVsbF9uYW1lfWAgOiB1bmRlZmluZWQsXG4gICAgICBpc0J1bjogZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bmZpZy50b21sJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcyhgJHtwYXRoLnNlcH13aWxsYm9vc3Rlci1jb25maWdzYCksXG4gICAgICBkb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc0RvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbnNHb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluc1BhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUG9tWG1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9tLnhtbCcpKSxcbiAgICAgIGRvZXNDb250YWluc1B1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluc0phdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc1R5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc0pzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdHN9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JyxcbiAgICAgICAgZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueShcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgIGRpclBhdGhcbiAgICAgICksXG4gICAgICBkb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0c30vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzWydibGl0eiddLFxuICAgICAgICBmaXJlYmFzZTogISFkZXZEZXBlbmRlbmNpZXNbJ2ZpcmViYXNlLXRvb2xzJ10sXG4gICAgICAgIGxpdGVzdHJlYW06IGRvY2tlcmZpbGUuaW5jbHVkZXMoJ2luc3RhbGwtbGl0ZXN0cmVhbS5zaCcpLFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llc1snbmV4dCddLFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydwbGF5d3JpZ2h0J10sXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ3ByaXNtYSddLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llc1sncHlyaWdodCddLFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgd2I6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8XG4gICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9zaGFyZWQtc2NyaXB0cyddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9zaGFyZWQtc2NyaXB0cyddLFxuICAgICAgfSxcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgYnJhbmNoZXM6IHJlbGVhc2VCcmFuY2hlcyxcbiAgICAgICAgZ2l0aHViOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyksXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpLFxuICAgICAgfSxcbiAgICAgIHZlcnNpb25zVGV4dCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgd2JmeUpzb24sXG4gICAgfTtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgY29uZmlnLmVzbGludEJhc2UgPSBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1RlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2xvYmJ5U3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoIH0pLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCB0eXBlIEVzbGludEV4dGVuc2lvbkJhc2UgPVxuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctYmxpdHotbmV4dCc7XG5cbmZ1bmN0aW9uIGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRXNsaW50RXh0ZW5zaW9uQmFzZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JztcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeCA/ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcgOiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnO1xuICB9IGVsc2Uge1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3gpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoZGlyUGF0aCk7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgY29uc3QgcmVtb3RlVXJsID0gb3JpZ2luPy5yZWZzPy5mZXRjaCA/PyBvcmlnaW4/LnJlZnM/LnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJldCA9IHsgZnVsbF9uYW1lOiBgJHtvcmd9LyR7bmFtZX1gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHJldCwgcmVzcG9uc2UuZGF0YSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeERvY2tlcmZpbGUgfSBmcm9tICcuL2ZpeGVycy9kb2NrZXJmaWxlLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFByaXNtYUVudkZpbGVzIH0gZnJvbSAnLi9maXhlcnMvcHJpc21hLmpzJztcbmltcG9ydCB7IGZpeFRlc3REaXJlY3RvcmllcyB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRvb2xWZXJzaW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hc2RmLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQmlvbWVKc29uYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9iaW9tZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFc2xpbnRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZXNsaW50aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRXNsaW50cmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZXNsaW50cmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSHVza3lyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9odXNreXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9vayB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9uZXh0Y29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcGFja2FnZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3B5cmlnaHRjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVhZG1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVsZWFzZXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlbGVhc2VyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbm92YXRlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdVcGxvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHNlY3JldHMgdG8gR2l0SHViJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdlJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1NraXAgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG4gIG9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMgPSBhcmd2LmVudjtcblxuICBmb3IgKGNvbnN0IHJvb3REaXJQYXRoIG9mIGFyZ3YucGF0aHMgYXMgc3RyaW5nW10pIHtcbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBkaXJlbnRzLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKS5tYXAoKGQpID0+IHBhdGguam9pbihwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuXG4gICAgYXdhaXQgZml4VGVzdERpcmVjdG9yaWVzKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCkpKTtcbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKSBhcyBQYWNrYWdlQ29uZmlnW107XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuXG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgICBjb25zb2xlLmluZm8oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIHRvb2xzIHZpYSBhc2RmIGF0IGZpcnN0XG4gICAgYXdhaXQgZ2VuZXJhdGVUb29sVmVyc2lvbnMocm9vdENvbmZpZyk7XG5cbiAgICBpZiAoTWF0aC5yYW5kb20oKSA+IDApIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG5cbiAgICBpZiAoIXJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgICAgYXdhaXQgZ2VuZXJhdGVZYXJucmNZbWwocm9vdENvbmZpZyk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeERvY2tlcmZpbGUocm9vdENvbmZpZyksXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihyb290Q29uZmlnLmlzQnVuXG4gICAgICAgID8gW2dlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnKSwgZ2VuZXJhdGVMZWZ0aG9vayhyb290Q29uZmlnKV1cbiAgICAgICAgOiBbZ2VuZXJhdGVIdXNreXJjKHJvb3RDb25maWcpLCBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKV0pLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBhcmd2LnNraXBEZXBzKTtcblxuICAgICAgaWYgKCFyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbiAmJiBjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgICAgICkge1xuICAgICAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUVzbGludHJjKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlRXNsaW50aWdub3JlKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgICAvLyAneWFybiBpbnN0YWxsJyBzaG91bGQgYmUgYWZ0ZXIgYHlhcm4gY2xlYW51cGAgYmVjYXVzZSB5YXJuIGJlcnJ5IGdlbmVyYXRlcyB5YXJuLmxvY2tcbiAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb250ZW50cyBvZiBkZXBlbmRhbnQgc3ViLXBhY2thZ2UgaW4gbW9ub3JlcG9cbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCk7XG4gIH1cbn1cblxuYXdhaXQgbWFpbigpO1xuIl0sIm5hbWVzIjpbIm9wdGlvbnMiLCJjb25zdHJ1Y3RvciIsInRoaXMiLCJpc1ZlcmJvc2UiLCJkb2VzVXBsb2FkRW52VmFycyIsImxvZ2dlciIsImZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24iLCJuYW1lIiwiZnVuYyIsImNvbnNvbGUiLCJpbmZvIiwiZXJyb3IiLCJFcnJvciIsInN0YWNrIiwiYXN5bmMiLCJmaXhEb2NrZXJmaWxlIiwiY29uZmlnIiwiZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSIsIm9sZENvbnRlbnQiLCJkb2NrZXJmaWxlIiwibmV3Q29udGVudCIsImZzIiwid3JpdGVGaWxlIiwicGF0aCIsImpvaW4iLCJkaXJQYXRoIiwiZml4UGxheXdyaWdodENvbmZpZyIsImZpbGVQYXRoIiwiZXhpc3RzU3luYyIsInByb21pc2VzIiwicmVhZEZpbGUiLCJyZXBsYWNlIiwiZml4UHJpc21hRW52RmlsZXMiLCJlbnZGaWxlcyIsImdsb2JieSIsImRvdCIsImN3ZCIsImVudkZpbGUiLCJlbnZGaWxlUGF0aCIsInJlc29sdmUiLCJmaXhUZXN0RGlyZWN0b3JpZXMiLCJwYWNrYWdlRGlyUGF0aHMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwib2xkVGVzdERpclBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm5ld1Rlc3REaXJQYXRoIiwicmVuYW1lIiwicmVwbGFjZUFsbCIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zIiwidW5kZWZpbmVkIiwiZGlyZW50cyIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJkaXJlbnQiLCJkaXJOYW1lIiwic2xpY2UiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaW5jbHVkZXMiLCJoYXNMaWJyYXJ5Iiwic29tZSIsInBhY2thZ2VKc29uIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiaXNGaWxlIiwibWtkaXIiLCJydW4iLCJyZWN1cnNpdmUiLCJpc0RpcmVjdG9yeSIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZzcCIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsImdpdGlnbm9yZSIsImxlbmd0aCIsIm1kRmlsZSIsImZpeEFiYnJldmlhdGlvbnNJblRleHQiLCJyZXBsYWNlV2l0aENvbmZpZyIsInRzRmlsZXMiLCJ0c0ZpbGUiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIk9iamVjdCIsImVudHJpZXMiLCJ3YmZ5SnNvbiIsInR5cG9zIiwidG9rZW4iLCJwcm9jZXNzIiwiZW52IiwiR0hfQk9UX1BBVCIsIlBVQkxJQ19HSF9CT1RfUEFUIiwiR0hfVE9LRU4iLCJHSVRIVUJfVE9LRU4iLCJoYXNHaXRIdWJUb2tlbiIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsInNwbGl0IiwiYXQiLCJuYW1lcyIsInNwYXduU3luYyIsImNvbW1hbmQiLCJhcmdzIiwicmV0cnkiLCJuZXdDbWQiLCJuZXdBcmdzIiwiZ2V0U3Bhd25TeW5jQXJncyIsImNoaWxkX3Byb2Nlc3MiLCJzdGF0dXMiLCJzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0Iiwic3RkaW8iLCJwcm9jIiwic3RkZXJyIiwidG9TdHJpbmciLCJ0cmltIiwicyIsInN0ZG91dCIsIlBBVEgiLCJCRVJSWV9CSU5fRk9MREVSIiwiQVNERl9ESVIiLCJzaGVsbCIsImNvbnZlcnRWZXJzaW9uSW50b051bWJlciIsInZlcnNpb24iLCJudW1iZXJzIiwiTnVtYmVyIiwiZmlsdGVyIiwibnVtIiwiaXNOYU4iLCJ2ZXJzaW9uTnVtYmVyIiwiZGl2aXNvciIsIlBZVEhPTl9WRVJTSU9OIiwiSkFWQV9WRVJTSU9OIiwiQkxJVFpfVkVSU0lPTiIsIk5FWFRfVkVSU0lPTiIsImdlbmVyYXRlVG9vbFZlcnNpb25zIiwidmVyc2lvbnNUZXh0IiwiZHVwbGljYXRhYmxlTGluZXMiLCJsaW5lIiwiQ09SRV9UT09MUyIsImhhcyIsInNvcnQiLCJsaW5lcyIsIlNldCIsImRvZXNDb250YWluc1BvZXRyeUxvY2siLCJyZXNwb25zZSIsImZldGNoIiwianNvbiIsInBvZXRyeVZlcnNpb24iLCJ1cGRhdGVWZXJzaW9uIiwiZGVwZW5kaW5nIiwiZmlyZWJhc2UiLCJkb2VzQ29udGFpbnNQYWNrYWdlSnNvbiIsImlzQnVuIiwibGVmdGhvb2tWZXJzaW9uIiwiZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1YiIsImJ1blZlcnNpb24iLCJwcmVmaXgiLCJERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMiLCJ2ZXJzaW9uUGF0aCIsInJtIiwiZm9yY2UiLCJ0b29sVmVyc2lvbnNQYXRoIiwiY29yZSIsInRvb2xOYW1lIiwibmV3VmVyc2lvbiIsImhlYWQiLCJpbmRleCIsImZpbmRJbmRleCIsImwiLCJuZXdMaW5lIiwic3BsaWNlIiwib3JnYW5pemF0aW9uIiwicmVwb3NpdG9yeSIsInJlcXVlc3QiLCJvd25lciIsInJlcG8iLCJkYXRhIiwidGFnX25hbWUiLCJsYXN0SW5kZXhPZiIsInZlcnNpb25OdW1iZXJUZXh0IiwidGVzdCIsIm92ZXJ3cml0ZU1lcmdlIiwiZGVzdGluYXRpb25BcnJheSIsInNvdXJjZUFycmF5IiwiY29tYmluZU1lcmdlIiwidGFyZ2V0Iiwic291cmNlIiwiZGVzdGluYXRpb24iLCJpdGVtIiwiY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQiLCJpc01lcmdlYWJsZU9iamVjdCIsIm1lcmdlIiwicHVzaCIsImpzb25PYmoiLCIkc2NoZW1hIiwiZXh0ZW5kcyIsImdlbmVyYXRlQmlvbWVKc29uYyIsIm5ld1NldHRpbmdzIiwiY2xvbmVEZWVwIiwib2xkU2V0dGluZ3MiLCJKU09OIiwicGFyc2UiLCJhcnJheU1lcmdlIiwic3RyaW5naWZ5IiwiZ2VuZXJhdGVCdW5maWdUb21sIiwidXNlckNvbnRlbnRIZWFkZXIiLCJ1c2VyQ29udGVudEhlYWRlclJlZ2V4Iiwic2VwYXJhdG9yIiwiZGVmYXVsdEhlYWRVc2VyQ29udGVudCIsImRlZmF1bHRUYWlsVXNlckNvbnRlbnQiLCJpZ25vcmVGaWxlVXRpbCIsInNlcGFyYXRvclByZWZpeCIsInJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyIsImxhc3RIZWFkZXJJbmRleCIsImdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIiLCJnZXRIZWFkVXNlckNvbnRlbnQiLCJpbmRleE9mIiwiZ2V0VGFpbFVzZXJDb250ZW50IiwiaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZCIsImxhc3RJbmRleCIsImNvbW1vbkNvbnRlbnQiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImhlYWRVc2VyQ29udGVudCIsInRhaWxVc2VyQ29udGVudCIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsImNvZGVXaXRoOEluZGVudFNpemUiLCJtYXJrZG93bkxpa2UiLCJlc2xpbnQiLCJwcmV0dGllciIsImJpb21lIiwiZ2VuZXJhdGVFeHRlbnNpb25zIiwiZ2VuZXJhdGVFZGl0b3Jjb25maWciLCJnZW5lcmF0ZUVzbGludGlnbm9yZSIsImdpdGlnbm9yZUZpbGVQYXRoIiwiZ2l0aWdub3JlQ29udGVudCIsImdlbmVyYXRlRXNsaW50cmMiLCJyb290Q29uZmlnIiwiYmFzZXMiLCJlc2xpbnRCYXNlIiwicm9vdCIsImV4dCIsInN0YXJ0c1dpdGgiLCJuZXdFeHRlbmRzIiwiYmxpdHoiLCJnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMiLCJkZWZhdWx0TmFtZXMiLCJnZW5lcmF0ZUdpdGlnbm9yZSIsImRvZXNDb250YWluc0dlbWZpbGUiLCJkb2VzQ29udGFpbnNHb01vZCIsImJhc2VuYW1lIiwiZG9lc0NvbnRhaW5zUG9tWG1sIiwiZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwiLCJkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWwiLCJuZXh0IiwicHJpc21hIiwicGxheXdyaWdodFRlc3QiLCJyZWFjdE5hdGl2ZSIsInN0b3J5Ym9vayIsImxpdGVzdHJlYW0iLCJnZW5lcmF0ZWQiLCJyZWFkQ2FjaGUiLCJ1cmwiLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwic3RhdCIsIkRhdGUiLCJub3ciLCJtdGltZU1zIiwiRXNsaW50VXRpbCIsImdldExpbnRGaXhTdWZmaXgiLCJkb2VzQ29udGFpbnNKc3hPclRzeCIsInNyY0RpcmVjdG9yaWVzIiwibm9kZSIsImdldFNyY0RpcnMiLCJqc0NvbW1vbkRlcHMiLCJ0c0NvbW1vbkRlcHMiLCJyZWFjdENvbW1vbkRlcHMiLCJlc2xpbnREZXBzIiwiZ2VuZXJhdGVQYWNrYWdlSnNvbiIsInNraXBBZGRpbmdEZXBzIiwianNvblRleHQiLCJzY3JpcHRzIiwicGVlckRlcGVuZGVuY2llcyIsImF1dGhvciIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwiZGVwcyIsInZhbHVlcyIsImRlcCIsInJlbW92ZURlcHJlY2F0ZWRTdHVmZiIsImtleSIsInZhbHVlIiwiZ2VuZXJhdGVTY3JpcHRzIiwicHJldHRpZnkiLCJleGlzdGluZ0NvbnRlbnQiLCJvcmlnaW5hbENvbnRlbnQiLCJnZW5lcmF0ZVByZXR0aWVyU3VmZml4IiwicG9ldHJ5RGV2RGVwZW5kZW5jaWVzIiwicHJlcGFyZSIsInBvc3RpbnN0YWxsIiwicHJlcGFjayIsInBvc3RwYWNrIiwiaXNQdWJsaWNSZXBvIiwiaXNSZWZlcnJlZEJ5T3RoZXJSZXBvIiwic2VtYW50aWNSZWxlYXNlIiwid29ya3NwYWNlcyIsIkFycmF5IiwiaXNBcnJheSIsIndvcmtzcGFjZSIsImdsb2JieVN5bmMiLCJ3YiIsImRvZXNDb250YWluc0phdmFTY3JpcHQiLCJkb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluc1R5cGVTY3JpcHQiLCJkb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcyIsInByaXZhdGUiLCJsaWNlbnNlIiwicHVibGlzaENvbmZpZyIsImFjY2VzcyIsIm1haW4iLCJyZXNvbHV0aW9ucyIsImxpbnQiLCJjbGVhbnVwIiwiZGlycyIsImRpciIsImZvcm1hdCIsInB5dGhvbkZpbGVzIiwiaWdub3JlIiwiZGlyTmFtZVNldCIsInB5dGhvbkZpbGUiLCJmaXJzdCIsInNlY29uZCIsImFkZCIsInNpemUiLCJkaXJOYW1lc1N0ciIsImQiLCJrZXlzIiwibmV3SnNvblRleHQiLCJvbGRBbmROZXdTY3JpcHROYW1lcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiZmlsZXMiLCJmaXhTY3JpcHROYW1lcyIsInBhY2thZ2VNYW5hZ2VyIiwidHlwZWNoZWNrIiwib2xkVGVzdCIsInB5cmlnaHQiLCJwcmVDb21taXQiLCJwcmVQdXNoIiwicHJlUHVzaEZvckxhYiIsInBvc3RNZXJnZSIsImdlbmVyYXRlSHVza3lyYyIsInBhY2thZ2VKc29uUGF0aCIsInByZUNvbW1pdEZpbGVQYXRoIiwibW9kZSIsInBvc3RNZXJnZUNvbW1hbmQiLCJnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIiwicG9zdE1lcmdlQ29tbWFuZHMiLCJTdHJpbmciLCJyYXciLCJpbnN0YWxsQ29tbWFuZCIsInJtTmV4dERpcmVjdG9yeSIsImNyZWF0ZVRhc2tPcHRpb25zIiwicnVubmVyIiwiZXh0ZW5zaW9uIiwicHJldHRpZXJDb250ZW50IiwiYmlvbWVDb250ZW50IiwiZ2VuZXJhdGVJZGVhU2V0dGluZ3MiLCJjb21tYW5kcyIsImdsb2IiLCJnZW5lcmF0ZUxlZnRob29rIiwieWFtbCIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0NvbXBhdE1vZGUiLCJzdHlsZXMiLCJta2RpclN5bmMiLCJnZW5lcmF0ZUxpbnRzdGFnZWRyYyIsInBhY2thZ2VQcmVmaXgiLCJnZXRFc2xpbnRLZXkiLCJwYWNrYWdlc0ZpbHRlciIsImdldEVzbGludEZpbHRlckZvclByZXR0aWVyIiwiZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbiIsImZpbmQiLCJwIiwiXyIsInNldHRpbmdzVGV4dCIsImdlbmVyYXRlUHJldHRpZXJpZ25vcmUiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJzZW1hbnRpY1JlbGVhc2VCYWRnZSIsImdlbmVyYXRlUmVhZG1lIiwiaW5zZXJ0QmFkZ2UiLCJmaWxlTmFtZXMiLCJyZWFkZGlyU3luYyIsImZpbGVOYW1lIiwiYmFkZ2VOYW1lIiwidG9VcHBlckNhc2UiLCJiYWRnZSIsInJlYWRtZSIsImkiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInNldHRpbmdzIiwicGx1Z2lucyIsInBsdWdpbiIsIm9sZENvbmZpZyIsInByZXNldCIsInN1Y2Nlc3NDb21tZW50IiwiZmFpbENvbW1lbnQiLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsImdlbmVyYXRlUmVub3ZhdGVKc29uIiwicGFja2FnZVJ1bGVzIiwicnVsZSIsInBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwibW9kdWxlIiwibW9kdWxlUmVzb2x1dGlvbiIsImpzeCIsImFsd2F5c1N0cmljdCIsInN0cmljdCIsInNraXBMaWJDaGVjayIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsImRlY2xhcmF0aW9uIiwic291cmNlTWFwIiwiaW1wb3J0SGVscGVycyIsIm91dERpciIsInR5cGVSb290cyIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlcyIsImlzRXNtUGFja2FnZSIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwid29ya2Zsb3dzIiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwidXNlcyIsInJlbGVhc2UiLCJ3YmZ5Iiwid29ya2Zsb3dfZGlzcGF0Y2giLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwic2VjcmV0cyIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJHSF9QUk9KRUNUX1VSTCIsIndpdGgiLCJsYWJlbGVkIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwiZmlsZU5hbWVTZXQiLCJraW5kIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJsb2FkIiwibW92ZVRvQm90dG9tIiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJzZXRTY2hlZHVsZSIsIm1pZ3JhdGVXb3JrZmxvdyIsIndyaXRlWWFtbCIsInBhcmFtcyIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIm5wbSIsInNlcnZlcl91cmwiLCJtaWdyYXRlSm9iIiwibmV3U2VjcmV0cyIsImluY2x1c2l2ZU1pbkhvdXJKc3QiLCJleGNsdXNpdmVNYXhIb3VySnN0IiwibWludXRlVXRjIiwiaG91clV0YyIsImNyb24iLCJpc0ludGVnZXIiLCJob3VySnN0IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwieWFtbFRleHQiLCJnZW5lcmF0ZVlhcm5yY1ltbCIsImN1cnJlbnRWZXJzaW9uIiwibGF0ZXN0VmVyc2lvbiIsInZlcnNpb25zSnNvbiIsImdldExhdGVzdFZlcnNpb24iLCJnZXRNYWpvck51bWJlciIsInJlbGVhc2VzUGF0aCIsInlhcm5yY1BhdGgiLCJ5YXJucmNZbWxQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJtYWpvciIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwiZGVwcmVjYXRlZFNlY3JldE5hbWVzIiwic2V0dXBTZWNyZXRzIiwicGFyc2VkIiwiZG90ZW52Iiwic2VjcmV0TmFtZSIsInNlY3JldF9uYW1lIiwia2V5X2lkIiwia2V5SWQiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsIndpdGhSZXRyeSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsImFsbG93X2F1dG9fbWVyZ2UiLCJ0ZW1wbGF0ZXMiLCJnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyIsImRpc3RhbmNlIiwid2JmeUpzb25TY2hlbWEiLCJ6Iiwib2JqZWN0IiwicmVjb3JkIiwic3RyaW5nIiwib3B0aW9uYWwiLCJkb2MiLCJ0cyIsImdldFBhY2thZ2VDb25maWciLCJlc21QYWNrYWdlIiwicGFja2FnZUpzb25UZXh0IiwicmVhZEZpbGVTeW5jIiwidHlwZSIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJtZXNzYWdlIiwiZmV0Y2hSZXBvSW5mbyIsIm5vZGVWZXJzaW9uQ29udGVudCIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsImZ1bGxfbmFtZSIsInNlcCIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uIiwiZ2l0aHViIiwiZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZSIsInBhdHRlcm4iLCJvcmciLCJyZXQiLCJhc3NpZ24iLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJhcnJheSIsImRlZmF1bHQiLCJkZXNjcmlwdGlvbiIsImFsaWFzIiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicm9vdERpclBhdGgiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsImV4aXQiLCJ0aGVuIl0sIm1hcHBpbmdzIjoiZ29CQVVPLE1BQU1BLEVBQVUsSUFWdkIsTUFJRUMsV0FBQUEsR0FDRUMsS0FBS0MsV0FBWSxFQUNqQkQsS0FBS0UsbUJBQW9CLENBQzNCLEdDV0ssTUFBTUMsRUFBUyxJQWhCdEIsTUFDRSwrQkFBTUMsQ0FBMEJDLEVBQWNDLEdBQ3hDUixFQUFRRyxXQUNWTSxRQUFRQyxLQUFLLGFBQWFILHFCQUU1QixVQUNRQyxHQUNQLENBQUMsTUFBT0csR0FDUEYsUUFBUUMsS0FBSyxxQkFBcUJILE1BQVNJLGFBQWlCQyxNQUFRRCxFQUFNRSxNQUFRRixLQUNwRixDQUNJWCxFQUFRRyxXQUNWTSxRQUFRQyxLQUFLLGNBQWNILG1CQUUvQixHQ1RLTyxlQUFlQyxFQUFjQyxHQUNsQyxPQUFPWCxFQUFPQywwQkFBMEIsaUJBQWlCUSxVQUN2RCxJQUFLRSxFQUFPQyx1QkFBd0IsT0FFcEMsTUFBTUMsRUFBYUYsRUFBT0csV0FDcEJDLEVBQWFGLEVBRWZBLElBQWVFLFNBQ2JDLEVBQUdDLFVBQVVDLEVBQUtDLEtBQUtSLEVBQU9TLFFBQVMsY0FBZUwsRUFBVyxHQUUzRSxDQ1ZPTixlQUFlWSxFQUFvQlYsR0FDeEMsT0FBT1gsRUFBT0MsMEJBQTBCLHVCQUF1QlEsVUFDN0QsTUFBTWEsRUFBV0osRUFBS0MsS0FBS1IsRUFBT1MsUUFBUyx3QkFDM0MsSUFBS0osRUFBR08sV0FBV0QsR0FBVyxPQUU5QixNQUFNVCxRQUFtQkcsRUFBR1EsU0FBU0MsU0FBU0gsRUFBVSxRQUVsRFAsRUFBYUYsRUFBV2EsUUFBUSxjQUFlLDhEQUNqRGIsSUFBZUUsU0FFYkMsRUFBR1EsU0FBU1AsVUFBVUssRUFBVVAsRUFBVyxHQUVyRCxDQ1ZPTixlQUFla0IsRUFBa0JoQixHQUN0QyxPQUFPWCxFQUFPQywwQkFBMEIscUJBQXFCUSxVQUMzRCxNQUFNbUIsUUFBaUJDLEVBQU8sQ0FBQyxRQUFTLFdBQVks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
|