wbfy 2.30.1 → 2.31.1
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 +5 -5
package/dist/index.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
import e from"node:fs";import t from"node:path";import{ignoreEnoentAsync as n,withRetry as s,ignoreErrorAsync as i}from"@willbooster/shared-lib";import o from"yargs";import r from"node:fs/promises";import a from"fast-glob";import{PromisePool as c}from"minimal-promise-pool";import{Octokit as l}from"@octokit/core";import p from"node:child_process";import d from"deepmerge";import u from"lodash.clonedeep";import m from"node:os";import f from"js-yaml";import g from"dotenv";import h from"libsodium-wrappers";import{distance as y}from"fastest-levenshtein";import{simpleGit as w}from"simple-git";import{z as b}from"zod";const v=new class{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const k=new class{async functionIgnoringException(e,t){v.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}v.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function j(e){return k.functionIgnoringException("fixDockerfile",(async()=>{if(!e.doesContainsDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await r.writeFile(t.join(e.dirPath,"Dockerfile"),s)}))}async function x(n){return k.functionIgnoringException("fixPlaywrightConfig",(async()=>{const s=t.join(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),o=i.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");i!==o&&await e.promises.writeFile(s,o)}))}const _=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function P(e){return k.functionIgnoringException("fixPrismaEnvFiles",(async()=>{const n=await a.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:_});for(const s of n){const n=t.resolve(e.dirPath,s),i=(await r.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await r.writeFile(n,i)}}))}async function S(n){return k.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",(async()=>{await Promise.all(n.map((async n=>{const s=t.join(n,"__tests__"),i=t.join(n,"tests");try{await e.promises.rename(s,i);const o=await e.promises.readFile(t.join(n,"package.json"),"utf8"),r=o.replaceAll("__tests__","tests");if(o===r)return;await e.promises.writeFile(t.join(n,"package.json"),r)}catch{}})))}))}const $=new c;async function F(e,s){return k.functionIgnoringException("fixTypeDefinitions",(async()=>{const i=t.resolve(e.dirPath,"@types"),o=e.isRoot&&e.doesContainsSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),a=await n((()=>r.readdir(i,{withFileTypes:!0})));if(a)for(const e of a){const a=e.name.slice(0,-5),c=e.name.endsWith(".d.ts");let l=c?a:e.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some((e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]));e.isFile()&&c?p?(await r.mkdir(t.join(i,a)),await $.run((()=>r.rename(t.join(i,e.name),t.join(i,a,"index.d.ts"))))):o&&(await r.mkdir(o,{recursive:!0}),await $.run((()=>r.rename(t.join(i,e.name),t.join(o,e.name))))):e.isDirectory()&&o&&!p&&(await r.mkdir(o,{recursive:!0}),await $.run((()=>n((()=>r.rename(t.join(i,e.name,"index.d.ts"),t.join(o,`${e.name}.d.ts`)))))))}}))}const C={async readFileIgnoringError(e){try{return await r.readFile(e,"utf8")}catch{}},async generateFile(e,t){await r.writeFile(e,t)}};async function E(n){return k.functionIgnoringException("fixTypos",(async()=>{const s=n.dirPath,i=await a.glob("**/*.md",{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const o of i){const i=t.join(s,o);await $.run((async()=>{const t=await e.promises.readFile(i,"utf8");let s=O(t);s=B(s,n,"doc"),t!==s&&await C.generateFile(i,s)}))}const o=await a.glob(["{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,ignore:_});v.isVerbose&&console.info(`Found ${o.length} TypeScript files in ${s}`);for(const i of o){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=r.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=B(a,n,"ts"),r!==a&&await C.generateFile(o,a)}const r=await a.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${r.length} text-based files in ${s}`);for(const i of r){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=O(r);a=B(a,n,"text"),r!==a&&await C.generateFile(o,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 B(e,t,n){for(const[n,s]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,s);for(const[s,i]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(s,i);return e}const D=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,I=!!D,T=new l({auth:D});const A=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}};function R(e,t,n,s=0){do{const[s,i,o]=L(e,t,n);if(0===p.spawnSync(s,i,o).status)break}while(--s>=0)}function W(e,t,n){const[s,i,o]=L(e,t,n);o.stdio="pipe";const r=p.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map((e=>`"${e}"`)).join(", ")}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function L(e,t,n){const s={...process.env};return s.PATH&&s.BERRY_BIN_FOLDER&&(s.PATH=s.PATH.replace(`${s.BERRY_BIN_FOLDER}:`,"")),s.ASDF_DIR&&(t=["-l","-c",`. ${s.ASDF_DIR}/asdf.sh && ${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:s,shell:!1,stdio:"inherit"}]}function J(e){const t=e.split(/[+.-]/).map(Number).filter((e=>!Number.isNaN(e)));let n=0,s=1;for(const e of t)n+=e*s,s/=1e3;return n}const N="3.9.19",z="zulu-11.74.15",G="2.0.4",U="14.2.5";async function H(n){return k.functionIgnoringException("generateToolVersions",(async()=>{await async function(n){if(!n.versionsText)return;const s=n.versionsText.trim().split("\n").map((e=>{const[t,n]=e.trim().split(/\s+/);return`${M.has(t)?" ":""}${t} ${n}`})).sort().map((e=>e.trim())).filter((e=>!e.startsWith("lefthook"))),i=[...new Set(s)];if(n.doesContainsPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&Y(i,"poetry",n),Y(i,"python",N,!0)}n.depending.firebase&&Y(i,"java",z,!0);if(n.doesContainsPackageJson)if(n.isBun){const e=await async function(e,t){try{const n=(await T.request("GET /repos/{owner}/{repo}/releases/latest",{owner:e,repo:t})).data.tag_name,s=n.lastIndexOf("v"),i=-1===s?n:n.slice(s+1);return/^\d/.test(i)?i:void 0}catch(e){return void console.error("Failed to fetch Bun tags due to:",e)}}("oven-sh","bun");e&&Y(i,"bun",e)}else{const e=W("npm",["show","yarn","version"],n.dirPath);Y(i,"yarn",e)}for(const s of q){const i=t.resolve(n.dirPath,`.${s}-version`);e.promises.rm(i,{force:!0})}const o=t.resolve(n.dirPath,".tool-versions");await(i.length>0?$.run((()=>e.promises.writeFile(o,i.join("\n")+"\n"))):$.run((()=>e.promises.rm(o,{force:!0})))),await $.promiseAll(),R("asdf",["plugin","update","--all"],n.dirPath),R("asdf",["install"],n.dirPath)}(n)}))}const M=new Set(["java","nodejs","bun","python"]),q=["java","node","python"];function Y(e,t,n,s=!1){const i=e.findIndex((e=>e.split(/\s+/)[0]===t)),o=`${t} ${n}`;if(-1===i)e.splice(s?0:e.length,0,o);else{const[,t]=e[i].split(/\s+/);J(n)>J(t)&&(e[i]=o)}}function K(e,t){return t}function V(e,t,n){const s=[...e];for(const[i,o]of t.entries())void 0===s[i]?s[i]=n.cloneUnlessOtherwiseSpecified(o,n):n.isMergeableObject(o)?s[i]=d(e[i],o,n):e.includes(o)||s.push(o);return s}const X={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};async function Q(n){return k.functionIgnoringException("generateBiomeJsonc",(async()=>{let s=u(X);const i=t.resolve(n.dirPath,"biome.jsonc");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:K})}catch{}const o=JSON.stringify(s);await $.run((()=>C.generateFile(i,o)))}))}async function Z(n){return k.functionIgnoringException("generateBunfigToml",(async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)&&e.readFileSync(s,"utf8").includes("exact = false")?"telemetry = false\n\n[install]\nexact = false\n\n[run]\nbun = true\n":"telemetry = false\n\n[install]\nexact = true\n\n[run]\nbun = true\n";await $.run((()=>C.generateFile(s,i)))}))}const ee="# Project-specific settings",te=/# Project-specific settings[^\n]*\n/gm,ne="# Generated by wbfy",se=`${ee} (head)\n\n\n${ne}\n`,ie=`\n${ee} (tail)\n`,oe={separator:ne,separatorPrefix:"# Generated by ",defaultHeadUserContent:se,defaultTailUserContent:ie,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=re(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(te,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return-1!==t?e.slice(0,e.indexOf("\n",t)+1).replaceAll(te,`${ee} (head)\n`):se},getTailUserContent(e){const t=re(e);return t>0?e.slice(t-1):ie},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function re(e){const t=e.indexOf(ee),n=e.lastIndexOf(ee);return n>t?n:-1}async function ae(n){return k.functionIgnoringException("generateDockerignore",(async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainsDockerfile){const e=await C.readFileIgnoringError(s)??"",t=oe.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+oe.getTailUserContent(e);await $.run((()=>C.generateFile(s,t)))}else await e.promises.rm(s,{force:!0})}))}const ce={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].sort(),codeWith4IndentSize:["go","gradle","py"].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()},le=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${de(ce.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${de(ce.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${de(ce.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function pe(e){return k.functionIgnoringException("generateEditorconfig",(async()=>{const n=t.resolve(e.dirPath,".editorconfig");await $.run((()=>C.generateFile(n,le)))}))}function de(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function ue(n){return k.functionIgnoringException("generateEslintrc",(async()=>{await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0}))),await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".eslintignore"),{force:!0}))),await $.run((()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0})));const s=t.resolve(n.dirPath,"eslint.config.mjs");if(n.isBun)await $.run((()=>e.promises.rm(s,{force:!0})));else if(n.eslintBase){try{if(!(await e.promises.readFile(s,"utf8")).includes("export { default }"))return}catch{}await $.run((()=>C.generateFile(s,`export { default } from '${n.eslintBase}';`)))}}))}const me=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...ce.codeWith2IndentSize,...ce.codeWith4IndentSize,...ce.markdownLike].map((e=>`*.${e} text eol=lf`)).join("\n")}\n\ndist/** linguist-generated=true\n`;async function fe(e){return k.functionIgnoringException("generateGitattributes",(async()=>{const n=t.resolve(e.dirPath,".gitattributes");await $.run((()=>C.generateFile(n,me)))}))}const ge=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function he(e,n){return k.functionIgnoringException("generateGitignore",(async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await C.readFileIgnoringError(s)??"";let o=oe.getHeadUserContent(i)+"\n!.keep\n.env.production\n*/mount/*.hash\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\n";const r=oe.getTailUserContent(i),a=[...ge];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"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(o+="*.sqlite3*\n"),e.depending.playwrightTest&&(o+="test-results/\n"),(n.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 be(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,s=await fetch(n),i=await s.text();if(!s.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await $.run((()=>we(e,t))),v.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await oe.isBerryZeroInstallEnabled(s)||(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"),(n.depending.reactNative||e.depending.reactNative||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+"\n"+c+r;await $.run((()=>C.generateFile(s,l)))}))}const ye=t.join(m.homedir(),".cache","wbfy","gitignore");async function we(n,s){await e.promises.mkdir(ye,{recursive:!0}),await e.promises.writeFile(t.join(ye,n),s)}async function be(n){try{const s=await e.promises.stat(t.join(ye,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(ye,n),"utf8")}catch{}}async function ve(e,t){try{const{data:n}=await T.request("GET /repos/{owner}/{repo}/commits",{owner:e,repo:t,per_page:1});if(0===n.length)throw new Error(`No commits found for ${e}/${t}`);return n[0].sha}catch(n){throw new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`)}}const ke={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},je=["eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],xe=[...je,"typescript-eslint","eslint-import-resolver-typescript"],_e=["eslint-plugin-react","eslint-plugin-react-hooks"],Pe={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js","eslint-plugin-import-x",...je],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react","eslint-plugin-import-x",...je,..._e],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts","eslint-plugin-import-x",...xe],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react","eslint-plugin-import-x",...xe,..._e],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-plugin-import","eslint-config-next",...xe,..._e]};async function Se(n,s,i){return k.functionIgnoringException("generatePackageJson",(async()=>{await async function(n,s,i){const o=t.resolve(n.dirPath,"package.json"),r=await e.promises.readFile(o,"utf8"),c=JSON.parse(r);c.scripts=c.scripts||{},c.dependencies=c.dependencies||{},c.devDependencies=c.devDependencies||{},c.peerDependencies=c.peerDependencies||{},await async function(t,n){"WillBooster LLC"===n.author&&(n.author="WillBooster Inc.");if(delete n.scripts["sort-package-json"],delete n.scripts["sort-all-package-json"],delete n.scripts["typecheck/warn"],delete n.scripts["typecheck:gen-code"],delete n.scripts["typecheck:codegen"],delete n.dependencies.tslib,delete n.devDependencies["@willbooster/eslint-config"],delete n.devDependencies["@willbooster/eslint-config-react"],delete n.devDependencies["@willbooster/renovate-config"],delete n.devDependencies["@willbooster/tsconfig"],delete n.devDependencies["eslint-import-resolver-node"],delete n.devDependencies["eslint-plugin-prettier"],delete n.devDependencies.lerna,delete n.devDependencies.pinst,delete n.scripts["flutter-format"],delete n.scripts["format-flutter"],delete n.scripts["python-format"],delete n.scripts["format-python"],delete n.scripts.prettier,!t.isWillBoosterConfigs)for(const e of Object.values(Pe))for(const t of e)delete n.devDependencies[t];await $.run((()=>e.promises.rm("lerna.json",{force:!0}))),delete n.devDependencies["@typescript-eslint/eslint-plugin"],delete n.devDependencies["@typescript-eslint/parser"],delete n.devDependencies["eslint-plugin-import"]}(s,c),"@willbooster/prettier-config"!==c.name&&(c.prettier="@willbooster/prettier-config");for(const[e,t]of Object.entries(c.scripts))t.includes("git clone")||(c.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));c.scripts=d(c.scripts,$e(n)),n.isBun?delete c.scripts.prettify:c.scripts.prettify+=await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),o=i.indexOf(oe.separatorPrefix);if(-1===o)return"";const r=i.slice(0,o);return r.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("")}(n.dirPath);for(const[e,t]of Object.entries(c.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(c.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let l=[],p=["prettier","sort-package-json","@willbooster/prettier-config"];const u=[];n.isBun?delete c.devDependencies["lint-staged"]:p.push("lint-staged");if(n.isRoot){if(n.isBun?(delete c.devDependencies.husky,delete c.devDependencies.pinst,c.scripts.prepare="lefthook install || true",p.push("lefthook")):(p.push("husky"),c.scripts.prepare="husky || true",c.scripts.postinstall="husky || true",(n.isPublicRepo||n.isReferredByOtherRepo)&&(p.push("pinst"),c.scripts.prepack="pinst --disable",c.scripts.postpack="pinst --enable")),n.depending.semanticRelease){const e=c.devDependencies["multi-semantic-release"]||c.devDependencies["@qiwi/multi-semantic-release"]?"@6.1.0":"";p.push(`conventional-changelog-conventionalcommits${e}`),c.devDependencies["semantic-release"]||c.devDependencies["multi-semantic-release"]||c.devDependencies["@qiwi/multi-semantic-release"]||p.push("semantic-release"),c.version="0.0.0-semantically-released"}if(n.depending.playwrightTest){c.dependencies.artillery||c.devDependencies.artillery||c.dependencies["@playwright/test"]||(p.push("@playwright/test"),delete c.dependencies["@playwright/test"]),delete c.dependencies.playwright,delete c.devDependencies.playwright}n.doesContainsSubPackageJsons?c.workspaces=Array.isArray(c.workspaces)?d.all([c.workspaces,["packages/*"]],{arrayMerge:V}):["packages/*"]:Array.isArray(c.workspaces)&&(c.workspaces=c.workspaces.filter((e=>a.globSync(e,{dot:!0,cwd:n.dirPath,ignore:_}).length>0)),0===c.workspaces.length&&delete c.workspaces)}if(n.depending.wb||n.isBun){c.dependencies["@willbooster/wb"]?l.push("@willbooster/wb"):p.push("@willbooster/wb");for(const[e,t]of Object.entries(c.scripts))c.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainsJavaScript||n.doesContainsJavaScriptInPackages||n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(n.isBun?(p.push("@biomejs/biome","@willbooster/biome-config"),delete c.devDependencies.eslint,delete c.devDependencies.micromatch,delete c.devDependencies["typescript-eslint"]):p.push("eslint","micromatch"));(n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(p.push("typescript"),n.isBun&&p.push("@types/bun"));n.eslintBase&&p.push(...Pe[n.eslintBase]);n.isWillBoosterConfigs&&(l=l.filter((e=>!e.includes("@willbooster/"))),p=p.filter((e=>!e.includes("@willbooster/"))));c.name||(c.name=t.basename(n.dirPath));n.doesContainsSubPackageJsons&&(c.private=!0);c.license||(c.license="UNLICENSED");!c.private&&"UNLICENSED"!==c.license&&s.isPublicRepo&&(c.publishConfig??={},c.publishConfig.access??="public");const[m]=A.getOrgAndName(n.repository??"");"WillBooster"!==m&&"WillBoosterLab"!==m||(c.author="WillBooster Inc.");n.isRoot||!c.private||c.main||(c.main="./src");if(delete c.resolutions?.["npm/chalk"],!n.doesContainsSubPackageJsons){if(n.isBun||(n.doesContainsJavaScript||n.doesContainsTypeScript?c.scripts["lint-fix"]+=ke.getLintFixSuffix(n):(delete c.scripts.lint,delete c.scripts["lint-fix"],c.scripts.cleanup=c.scripts.cleanup?.replace(" && yarn lint-fix",""))),n.doesContainsPubspecYaml){c.scripts.lint="flutter analyze",c.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter((s=>e.existsSync(t.resolve(n.dirPath,s))));s.length>0&&(c.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)`,c.scripts.format+=" && yarn format-code")}if(n.doesContainsPoetryLock){"poetry install"===c.scripts.postinstall&&delete c.scripts.postinstall;const e=await a.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:_}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");c.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,c.scripts.lint?c.scripts.lint=`poetry run flake8 ${e} && ${c.scripts.lint}`:(c.scripts.lint=`poetry run flake8 ${e}`,c.scripts["lint-fix"]="yarn lint"),c.scripts.format+=" && yarn format-code",u.push("black","isort","flake8")}}n.repository&&(c.repository=n.repository)}n.depending.blitz?(l.push(`blitz@${G}`,`@blitzjs/auth@${G}`,`@blitzjs/next@${G}`,`@blitzjs/rpc@${G}`,`next@${U}`),p=p.filter((e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e)),c.scripts["gen-code"]?.startsWith("blitz codegen")?c.scripts["gen-code"].includes("blitz prisma generate")||(c.scripts["gen-code"]=c.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):c.scripts["gen-code"]="blitz codegen"):n.depending.prisma&&!c.scripts["gen-code"]?.startsWith("prisma generate")&&(c.scripts["gen-code"]="prisma generate");c.dependencies?.prettier||delete c.devDependencies["@types/prettier"];0===Object.keys(c.dependencies).length&&delete c.dependencies;0===Object.keys(c.devDependencies).length&&delete c.devDependencies;0===Object.keys(c.peerDependencies).length&&delete c.peerDependencies;await async function(e){e.dependencies=e.dependencies||{},e.devDependencies=e.devDependencies||{};const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]);if(t.has("@willbooster/auth")&&!Fe(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await ve("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!Fe(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await ve("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!Fe(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await ve("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#workspace=@code-analyzer/client&commit=${t}`}if(t.has("@willbooster/judge")&&!Fe(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await ve("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!Fe(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await ve("WillBoosterLab","llm-proxy");e.dependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(c),n.isBun&&delete c.packageManager;let f=JSON.stringify(c);if(f=await async function(n,s,i){const o=[];for(const[e]of Object.keys(n))":"!==e[0]&&e.includes(":")&&o.push([e,e.replaceAll(":","-")]);if(0===o.length)return s;for(const[e,t]of o)s=s.replaceAll(e,t);const r=await a.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:_});for(const n of r)await $.run((async()=>{const s=t.join(i.dirPath,n),r=await e.promises.readFile(s,"utf8");let a=r;for(const[e,t]of o)a=a.replaceAll(e,t);a!==r&&await e.promises.writeFile(s,a)}));return await $.promiseAll(),s}(c.scripts,f,n),await e.promises.writeFile(o,f),!i){l=l.filter((e=>!c.devDependencies?.[e]));const e=n.isBun?"bun":"yarn";l.length>0&&R(e,["add",...new Set(l)],n.dirPath),p=p.filter((e=>!c.dependencies?.[e])),p.length>0&&R(e,["add","-D",...new Set(p)],n.dirPath),u.length>0&&R("poetry",["add","--group","dev",...new Set(u)],n.dirPath)}}(n,s,i)}))}function $e(e){if(e.isBun){const t={"check-all":"bun run cleanup && bun run typecheck && bun run test",cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun wb test",typecheck:"bun --bun wb typecheck"};return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||delete t.typecheck,t}{let t={"check-all":"yarn cleanup && yarn typecheck && yarn test",cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:"eslint --color","lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ce.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 "**/{.*/,}*.{${ce.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}}function Fe(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const Ce={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 Ee(n){return k.functionIgnoringException("generateHuskyrcUpdatingPackageJson",(async()=>{await async function(n){const s=t.resolve(n.dirPath,"package.json"),i=await e.promises.readFile(s,"utf8"),o=JSON.parse(i);o.scripts||={},delete o.scripts.postinstall,delete o.scripts.postpublish,delete o.scripts.prepare,delete o.scripts.prepublishOnly,delete o.scripts.prepack,delete o.scripts.postpack;const r=t.resolve(n.dirPath,".husky");if(await Promise.all([e.promises.writeFile(s,JSON.stringify(o,void 0,2)),e.promises.rm(r,{force:!0,recursive:!0})]),n.isBun)return void R("git",["config","--unset","core.hooksPath"],n.dirPath);R("yarn",["dlx","husky-init","--yarn2"],n.dirPath);const a=t.resolve(r,"pre-commit");await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0}))),await $.run((()=>e.promises.writeFile(a,Ce.preCommit+"\n")));const{typecheck:c}=$e(n);if(c){let s=n.repository?.startsWith("github:WillBoosterLab/")?Ce.prePushForLab:Ce.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((()=>e.promises.writeFile(t.resolve(r,"pre-push"),s+"\n",{mode:493})))}const l=`${Ce.postMerge}\n\n${Oe(n).join("\n")}\n`;await $.run((()=>e.promises.writeFile(t.resolve(r,"post-merge"),l,{mode:493})))}(n)}))}function Oe(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 n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";return t.push(`run_if_changed "package\\.json" "${n}${s}"`),e.doesContainsPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`),t}function Be(e,t,n,s){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="${s}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${s})" />\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 De=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ce.prettier.map((e=>Be("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${ce.prettier.map((e=>Be("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-errors","Biome",e))).join("")}\n </component>\n</project>\n`;async function Te(n){return k.functionIgnoringException("generateIdeaSettings",(async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainsJavaScript||n.doesContainsJavaScriptInPackages||n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages||n.doesContainsPackageJson&&!n.doesContainsPubspecYaml&&!n.doesContainsGemfile&&!n.doesContainsGoMod&&!n.doesContainsPomXml?$.run((()=>C.generateFile(i,n.isBun?Ie:De))):$.run((()=>e.promises.rm(i,{force:!0}))))}}))}const Ae={"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}"},"check-migrations":{glob:"**/migration.sql",run:"\nif grep -q 'Warnings:' {staged_files}; then\n echo \"Migration SQL files ({staged_files}) contain warnings! Please solve the warnings and commit again.\"\n exit 1\nfi\n".trim()}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},Re={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 We(n){return k.functionIgnoringException("generateLefthookUpdatingPackageJson",(async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook");await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),f.dump(Ae,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]);const{typecheck:i}=$e(n);if(i){const i=n.repository?.startsWith("github:WillBoosterLab/")?Re.prePushForLab:Re.prePush;e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await $.run((()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493})))}const o=`${Re.postMerge}\n\n${Oe(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await $.run((()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),o,{mode:493})))}(n)}))}const Le={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};async function Je(n){return k.functionIgnoringException("generateLintstagedrc",(async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await $.run((()=>e.promises.rm(s,{force:!0})));const i=n.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",o=[];if(n.doesContainsJavaScript||n.doesContainsTypeScript){const e=`\n '${Ne(n)}': [${JSON.stringify(`${i}eslint --fix${ke.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;o.push(e)}const r=n.isRoot?" && !file.includes('/packages/')":"";o.push(`\n './**/*.{${ce.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${r});${function(e){return e.doesContainsJavaScript||e.doesContainsTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${Ne(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(n)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${i}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${i}sort-package-json');\n }\n return commands;\n },\n './**/migration.sql': (files) => {\n for (const file of files) {\n const content = fs.readFileSync(file, 'utf-8');\n if (content.includes('Warnings:')) {\n return [\n \`!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.\`,\n ];\n }\n }\n return [];\n},`),n.doesContainsPubspecYaml&&o.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 },");n.doesContainsPoetryLock&&o.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const a=`const fs = require('fs');\nconst path = require('path');\n${n.doesContainsJavaScript||n.doesContainsTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${o.join("")}\n};\n`;await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0}))),await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0}))),await $.run((()=>C.generateFile(s,a)))}(n)}))}function Ne(e){const t=function(e){return e.depending.blitz?Le.blitz:Le.node}(e).map((e=>`${e}/**/`));return`{,${t.join(",")}}*.{${ce.eslint.join(",")}}`}async function ze(n){return k.functionIgnoringException("generateNextConfigJson",(async()=>{const s=["js","mjs","cjs"].map((e=>t.resolve(n.dirPath,`next.config.${e}`))).find((t=>e.existsSync(t)));if(!s)return;const i=(await e.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((()=>C.generateFile(s,i)))}))}async function Ge(e){return k.functionIgnoringException("generatePrettierignore",(async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await C.readFileIgnoringError(n)??"",i=oe.getHeadUserContent(s),o=oe.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await oe.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainsPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await $.run((()=>C.generateFile(n,l)))}))}const Ue={venvPath:".",venv:".venv"};async function He(n){return k.functionIgnoringException("generatePyrightConfigJson",(async()=>{let s=u(Ue);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:K})}catch{}const o=JSON.stringify(s);await $.run((()=>C.generateFile(i,o)))}))}async function Me(n){return k.functionIgnoringException("generateReadme",(async()=>{const s=t.resolve(n.dirPath,"README.md");let i=await e.promises.readFile(s,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(i=qe(i,"[](https://github.com/semantic-release/semantic-release)"));const o=n.repository?.slice(n.repository?.indexOf(":")+1),r=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const s of r){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let r=s;r=r[0].toUpperCase()+r.slice(1,r.indexOf(".")),r=r.replace("-"," ");const a=`[](https://github.com/${o}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=qe(i,a))}await $.run((()=>C.generateFile(s,i)))}))}function qe(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const s=e.slice(0,n+1);let i=e.slice(n+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${s}${t}\n${i}`}return`${e}\n${t}\n`}async function Ye(n){return k.functionIgnoringException("generateReleaserc",(async()=>{const s=t.resolve(n.dirPath,".releaserc.json"),i=JSON.parse(await e.promises.readFile(s,"utf8")),o=i?.plugins||[];for(let e=0;e<o.length;e++){const t=Array.isArray(o[e])?o[e][0]:o[e],n=Array.isArray(o[e])&&o[e][1]||{};"@semantic-release/commit-analyzer"===t?o[e]=["@semantic-release/commit-analyzer",d.all([n,{preset:"conventionalcommits"}],{arrayMerge:K})]:"@semantic-release/github"===t&&(o[e]=["@semantic-release/github",d.all([n,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:K})])}const r=JSON.stringify(i);await $.run((()=>C.generateFile(s,r)))}))}const Ke={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function Ve(n){return k.functionIgnoringException("generateRenovateJson",(async()=>{let s=u(Ke);const i=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${i}5`))return;try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:K}),s.extends=s.extends.filter((e=>"@willbooster"!==e))}catch{}n.depending.blitz&&(s.packageRules??=[],s.packageRules.some((e=>e.matchPackageNames.includes("next")))||s.packageRules.push({matchPackageNames:["next"],enabled:!1})),await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0}))),await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0})));const o=JSON.stringify(s);await $.run((()=>C.generateFile(i,o)))}))}function Xe(e){const t=Object.entries(e).sort((([e],[t])=>e.localeCompare(t)));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&Xe(s);return e}const Qe={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,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*","packages/*/src/**/*","packages/*/tests/**/*","packages/*/scripts/**/*"]},Ze={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,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*"]};async function et(n){return k.functionIgnoringException("generateTsconfig",(async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?Qe:Ze);n.doesContainsJsxOrTsx||n.doesContainsJsxOrTsxInPackages||delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainsSubPackageJsons&&(s.include=s.include?.filter((e=>!e.startsWith("packages/*/")))),n.isEsmPackage&&(s.compilerOptions={...s.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(i,"utf8"),o=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===o.extends&&delete o.extends,delete s.compilerOptions?.target,n.isEsmPackage||(delete s.compilerOptions?.module,delete s.compilerOptions?.moduleResolution),o.compilerOptions?.jsx&&delete s.compilerOptions?.jsx,s=d.all([s,o,s],{arrayMerge:V}),s.include=s.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}Xe(s),s.include?.sort();const o=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await $.run((()=>C.generateFile(i,o)))}))}const tt=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function nt(n){return k.functionIgnoringException("generateVscodeSettings",(async()=>{try{const s=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(s,"utf8");let o=JSON.parse(i);for(const e of tt)o=d.all([o,st(e)]);n.doesContainsPoetryLock&&(o=d.all([o,st("**/.venv/**")])),n.depending.next&&(o=d.all([o,st("**/.next/**")])),"editor.codeActionsOnSave"in o&&delete o["editor.codeActionsOnSave"],"editor.formatOnSave"in o&&delete o["editor.formatOnSave"],Xe(o??{});const r=JSON.stringify(o,void 0,2);await $.run((()=>C.generateFile(s,r)))}catch{}}))}function st(e){return{"files.watcherExclude":{[e]:!0}}}const it={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 ot(n){return k.functionIgnoringException("generateWorkflow",(async()=>{const s=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(s,{recursive:!0});const i=t.resolve(n.dirPath,".github","semantic.yml");await $.run((()=>e.promises.rm(i,{force:!0,recursive:!0})));const o=await e.promises.readdir(s,{withFileTypes:!0}),r=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml",...o.filter((e=>e.isFile()&&e.name.endsWith(".yml"))).map((e=>e.name))]);n.depending.semanticRelease&&r.add("release.yml"),(n.isPublicRepo||n.repository?.startsWith("github:WillBoosterLab/"))&&(r.add("add-ready-issue-to-project.yml"),r.add("notify-ready.yml"));for(const e of r){const i=t.basename(e,".yml");await $.run((()=>rt(n,s,i)))}await $.run((()=>e.promises.rm(t.join(s,"add-focused-issue-to-project.yml"),{force:!0,recursive:!0})))}))}async function rt(n,s,i){let o=u(it[i]??{});const r=t.join(s,`${i}.yml`);try{const t=await e.promises.readFile(r,"utf8"),n=f.load(t);o=d.all([o,n,o],{arrayMerge:V})}catch{}i.startsWith("deploy")&&(o={...o,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},o.jobs&&function(e,t){const n=e[t];delete e[t],e[t]=n}(o,"jobs"),o.on?.push&&(o.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...o.on.push["paths-ignore"]??[]])]));for(const e of Object.values(o.jobs)){if(!e.uses?.includes?.("/reusable-workflows/"))return;at(n,e,i)}switch(i){case"release":if(o.on?.schedule)delete o.on.push;else{if(!(o.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});o.on.push.branches=n.release.branches}break;case"test":o.on?.push&&(o.on.push.branches=o.on.push.branches.filter((e=>"renovate/**"!==e)));break;case"wbfy":o.on&&ct(o,20,24);break;case"wbfy-merge":ct(o,1,4)}if(function(e){delete e.jobs["add-to-project"]}(o),await lt(o,r),"release"===i)await e.promises.rm(t.join(s,"semantic-release.yml"),{force:!0});else if("sync"===i){if(await e.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!o.jobs.sync||!o.jobs.sync.with)return;o.jobs["sync-force"]=o.jobs.sync;const n=o.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;o.jobs.sync.with.sync_params_without_dest=`--force ${n}`,o.name="Force to Sync",o.on={workflow_dispatch:null},delete o.jobs.sync,await lt(o,t.join(s,"sync-force.yml"))}}function at(e,t,n){if(t.with||={},t.secrets||={},"test"!==n&&"release"!==n&&"wbfy"!==n&&"wbfy-merge"!==n&&"add-issue-to-project"!==n&&"add-ready-issue-to-project"!==n||(t.secrets.GH_TOKEN=e.isPublicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==n&&"test"!==n||(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"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with?.sync_params_without_dest;"string"==typeof e&&(t.with.sync_params_without_dest=e.replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,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),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&"string"==typeof t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,"")),e.doesContainsDockerfile&&("extra-large"!==t.with.ci_size&&(n.startsWith("deploy")||n.startsWith("test"))&&(t.with.ci_size="large"),n.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===n||"test"===n||"wbfy"===n||"wbfy-merge"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?Xe(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Xe(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function ct(e,t,n){const[s,i]=(e.on.schedule?.[0]?.cron||"").split(" ").map(Number);if(0!==s&&Number.isInteger(i)){const e=(i+9)%24;if(t<n?t<=e&&e<n:t<=e||e<n)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(n-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function lt(t,n){const s=f.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function pt(n){return k.functionIgnoringException("generateYarnrcYml",(async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await $.run((()=>e.promises.rm(s,{force:!0}))),await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0}))),void await $.run((()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0})));const i=W("yarn",["--version"],n.dirPath),o=function(e,t){const n=W("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);dt(i)<=dt(o)&&i!==o&&R("yarn",["set","version",o],n.dirPath,1);const r=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(r,{recursive:!0});for(const n of await e.promises.readdir(r))n.startsWith("yarn-")&&!n.startsWith(`yarn-${o}.`)&&await $.run((()=>e.promises.rm(t.join(r,n))));const a=t.resolve(n.dirPath,".yarnrc");await $.run((()=>e.promises.rm(a,{force:!0})));const c=f.load(await e.promises.readFile(s,"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(n.dirPath,".yarnrc","undefined.cjs");await $.run((()=>e.promises.rm(s,{force:!0})))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,f.dump(c,{lineWidth:-1})),R("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)}))}function dt(e){const[t]=e.split(".");return Number(t)}async function ut(e){return k.functionIgnoringException("setupLabels",(async()=>{if(!I)return;const[t,n]=A.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await mt(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await mt(t,n,"d2: easy :rabbit2:","DDD6FE"),await mt(t,n,"d3: medium :ox:","C4B5FD"),await mt(t,n,"d4: hard :squid:","A78BFA"),await mt(t,n,"d5: x-hard :whale2:","8B5CF6"),await mt(t,n,"p1: critical :fire::fire::fire:","EF4444"),await mt(t,n,"p2: urgent :fire::fire:","F87171"),await mt(t,n,"p3: important :fire:","FCA5A5"),await mt(t,n,"p4: nice to have :droplet:","FECACA"),await mt(t,n,"r: blitz","5300bc"),await mt(t,n,"r: firebase","ffca28"),await mt(t,n,"r: prisma","0c344b"),await mt(t,n,"r: react","61dafb"),await mt(t,n,"r: svelte","ff3e00"),await mt(t,n,"r: semantic-release","494949"),await mt(t,n,"ready :rocket:","22C55E"),await mt(t,n,"review requested :mag:","FBCA04"),await mt(t,n,"released :bookmark:","6366F1"),await mt(t,n,"s: 0.5h :clock1230:","F3F4F6"),await mt(t,n,"s: 1h :clock1:","E5E7EB"),await mt(t,n,"s: 2h :clock2:","D1D5DB"),await mt(t,n,"s: 3h :clock3:","9CA3AF"),await mt(t,n,"s: 5h :clock5:","6B7280"),await mt(t,n,"s: 8h :clock8:","4B5563"),await mt(t,n,"s: 13h :clock1:","374151"),await mt(t,n,"t: build :hammer:","BFDBFE"),await mt(t,n,"t: chore :broom:","BFDBFE"),await mt(t,n,"t: ci :construction_worker:","BFDBFE"),await mt(t,n,"t: docs :memo:","BFDBFE"),await mt(t,n,"t: feat :sparkles:","BFDBFE"),await mt(t,n,"t: fix :bug:","BFDBFE"),await mt(t,n,"t: perf :zap:","BFDBFE"),await mt(t,n,"t: refactor :recycle:","BFDBFE"),await mt(t,n,"t: style :lipstick:","BFDBFE"),await mt(t,n,"t: test :test_tube:","BFDBFE"),await mt(t,n,"project","24292F"),await mt(t,n,"focused :dart:","22C55E"),await ft(t,n,"bug"),await ft(t,n,"documentation"),await ft(t,n,"duplicate"),await ft(t,n,"enhancement"),await ft(t,n,"good first issue"),await ft(t,n,"help wanted"),await ft(t,n,"invalid"),await ft(t,n,"question"),await ft(t,n,"wontfix"),await ft(t,n,"ready"),await ft(t,n,"review requested"),await ft(t,n,"released"),await ft(t,n,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function mt(e,t,n,s){try{await T.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:n,color:s})}catch{await T.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n,color:s})}}async function ft(e,t,n){try{await T.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const gt=["READY_DISCORD_WEBHOOK_URL"];async function ht(e){return k.functionIgnoringException("setupSecrets",(async()=>{if(!I||!v.doesUploadEnvVars)return;const[t,n]=A.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const s=g.config().parsed||{};if(0!==Object.keys(s).length)try{for(const e of gt)try{await T.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const i=await T.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=i.data;await h.ready;for(const[i,a]of Object.entries(s)){if(e.isPublicRepo&&"GH_BOT_PAT"===i)continue;if(!e.isPublicRepo&&"PUBLIC_GH_BOT_PAT"===i)continue;const s=h.from_base64(o,h.base64_variants.ORIGINAL),c=h.from_string(a),l=h.crypto_box_seal(c,s),p=h.to_base64(l,h.base64_variants.ORIGINAL);await T.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:i,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}}))}async function yt(e){const[t,n]=A.getOrgAndName(e.repository??"");t&&n&&("WillBooster"!==t&&"WillBoosterLab"!==t||await s((()=>T.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,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 wt={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on this page. (このページで `All checks have passed` が表示されていることを確認した。)\n - 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 GitHub PR\'s diff view. (GitHub上で自分の変更内容を確認した。)\n- [ ] I\'ve written the steps to test your changes. (テスト手順を記載した。)\n- [ ] I\'ve added screenshots. (UIを変更した場合、スクリーンショットを追加した。)\n - You may leave this box unchecked if you didn\'t modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language `C`.\n3. Write the following code:\n ```c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n ```\n4. Push `Submit` button.\n5. ...\n--\x3e\n\n\x3c!-- 日本語で記述しても大丈夫です。 --\x3e\n'.trim()};async function bt(n){return k.functionIgnoringException("generateGitHubTemplates",(async()=>{for(const[s,i]of Object.entries(wt)){const o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(y(t,i)>i.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await $.run((()=>C.generateFile(o,i)))}}))}const vt=b.object({typos:b.object({all:b.record(b.string()).optional(),doc:b.record(b.string()).optional(),ts:b.record(b.string()).optional(),text:b.record(b.string()).optional()}).optional()});async function kt(n,s){const i=t.resolve(n,"package.json");try{const o=e.existsSync(i);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),s=JSON.parse(await r.readFile(e,"utf8"));d=s?.branches||[],u=s?.plugins?.flat()||[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=w(e),s=(await n.getRemotes(!0)).find((e=>"origin"===e.name)),i=s?.refs?.fetch??s?.refs?.push;if("string"==typeof i){const e=await xt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await xt(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g="";try{g+=(await r.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[e,s]of[["java","java"],["node","nodejs"],["python","python"]])try{const i=await r.readFile(t.resolve(n,`.${e}-version`),"utf8");g&&(g+="\n"),g+=s+" "+i.trim()}catch{}let h="";try{h=await r.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let b;try{const e=await r.readFile(y,"utf8");b=vt.parse(JSON.parse(e))}catch{}const v={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:f?.full_name?`github:${f.full_name}`:void 0,isBun:s?.isBun||e.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainsSubPackageJsons:jt("packages/**/package.json",n),doesContainsDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainsGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainsGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainsPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainsPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainsPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainsPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainsTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainsVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainsJavaScript:jt("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScript:jt("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsx:jt("{app,src,tests}/**/*.{t,j}sx",n),doesContainsJavaScriptInPackages:jt("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScriptInPackages:jt("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsxInPackages:jt("packages/**/{app,src,tests}/**/*.{t,j}sx",n),depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],litestream:h.includes("install-litestream.sh"),next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},versionsText:g,packageJson:l,wbfyJson:b};if(v.isBun||(v.eslintBase=function(e){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"}(v)),v.doesContainsGemfile||v.doesContainsGoMod||v.doesContainsPackageJson||v.doesContainsPoetryLock||v.doesContainsPomXml||v.doesContainsPubspecYaml||v.doesContainsTemplateYaml)return v}catch{}}function jt(e,t){return a.globSync(e,{dot:!0,cwd:t,ignore:_}).length>0}async function xt(e){const[t,n]=A.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await T.request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch{}return s}await async function(){const n=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;v.isVerbose=n.verbose,v.doesUploadEnvVars=n.env;for(const s of n.paths){const o=t.join(s,"packages"),r=(await i((()=>e.promises.readdir(o,{withFileTypes:!0})))??[]).filter((e=>e.isDirectory())).map((e=>t.join(o,e.name)));await S([s,...r]);const a=await kt(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=E(a),l=(await Promise.all(r.map((e=>kt(e,a))))).filter((e=>!!e)),p=[a,...l];if(v.isVerbose)for(const e of p)console.info(e);await H(a),await pt(a),await Promise.all([j(a),P(a),c.then((()=>Me(a))),ae(a),pe(a),fe(a),bt(a),Te(a),Ve(a),Ye(a),ot(a),ut(a),ht(a),yt(a),...a.isBun?[Z(a),Ee(a).then((()=>We(a)))]:[Ee(a)],Je(a)]),await $.promiseAll();const d=[];for(const e of p)(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(F(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(x(e)),e.depending.next&&d.push(ze(e)),await he(e,a),await $.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await Ge(e),await Se(e,a,n.skipDeps),d.push(Je(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(nt(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(et(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isBun&&d.push(Q(e)),a.isWillBoosterConfigs||d.push(ue(e))),e.depending.pyright&&d.push(He(e)));await Promise.all(d),await $.promiseAll();const u=a.isBun?"bun":"yarn";if(R(u,["cleanup"],s),a.isBun){R(u,["update"],s);const n=t.join(s,"bun.lockb");e.existsSync(n)&&(e.promises.rm(n),R(u,["install","--save-text-lockfile","--frozen-lockfile","--lockfile-only"],s))}else R(u,["install"],s)}}();
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy9maXhlcnMvcGxheXdyaWdodENvbmZpZy50cyIsIi4uL3NyYy91dGlscy9nbG9iVXRpbC50cyIsIi4uL3NyYy9maXhlcnMvcHJpc21hLnRzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbkNvbnN0YW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FzZGYudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYmlvbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRpZ25vcmUudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9odXNreXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbmV4dGNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHlyaWdodGNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi50cyIsIi4uL3NyYy91dGlscy9vYmplY3RVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMveWFybnJjLnRzIiwiLi4vc3JjL2dpdGh1Yi9sYWJlbC50cyIsIi4uL3NyYy9naXRodWIvc2VjcmV0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvdGVtcGxhdGUudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlOiBib29sZWFuO1xuICBkb2VzVXBsb2FkRW52VmFyczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlzVmVyYm9zZSA9IGZhbHNlO1xuICAgIHRoaXMuZG9lc1VwbG9hZEVudlZhcnMgPSBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4RG9ja2VyZmlsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhEb2NrZXJmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0RvY2tlcmZpbGUpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBjb25maWcuZG9ja2VyZmlsZTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudDtcblxuICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgbmV3Q29udGVudCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC9yZXRyaWVzOi4rLC8sICdyZXRyaWVzOiBwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEsJyk7XG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQcmlzbWFFbnZGaWxlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQcmlzbWFFbnZGaWxlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbnZGaWxlcyA9IGF3YWl0IGZnLmdsb2IoWycqLmVudicsICcqLmVudi4qJ10sIHsgZG90OiB0cnVlLCBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgZm9yIChjb25zdCBlbnZGaWxlIG9mIGVudkZpbGVzKSB7XG4gICAgICBjb25zdCBlbnZGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZW52RmlsZSk7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKFxuICAgICAgICAvREFUQUJBU0VfVVJMPVwiPyguK1xcLnNxbGl0ZTMpXCI/W1xcbiRdLyxcbiAgICAgICAgJ0RBVEFCQVNFX1VSTD1cIiQxP2Nvbm5lY3Rpb25fbGltaXQ9MVwiXFxuJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShlbnZGaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcGFja2FnZURpclBhdGhzLm1hcChhc3luYyAocGFja2FnZURpclBhdGgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkVGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdfX3Rlc3RzX18nKTtcbiAgICAgICAgY29uc3QgbmV3VGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICd0ZXN0cycpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKTtcbiAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlQWxsKCdfX3Rlc3RzX18nLCAndGVzdHMnKTtcbiAgICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuXG4gICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBuZXdDb250ZW50KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwZURlZmluaXRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbjogUGFja2FnZUNvbmZpZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBlRGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGliVHlwZURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdAdHlwZXMnKTtcbiAgICBjb25zdCBzcmNUeXBlRGlyUGF0aCA9XG4gICAgICBjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMgPyB1bmRlZmluZWQgOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdzcmMnLCAndHlwZXMnKTtcblxuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5yZWFkZGlyKGxpYlR5cGVEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpO1xuICAgIGlmICghZGlyZW50cykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgZGlyTmFtZSA9IGRpcmVudC5uYW1lLnNsaWNlKDAsIC01KTtcbiAgICAgIGNvbnN0IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA9IGRpcmVudC5uYW1lLmVuZHNXaXRoKCcuZC50cycpO1xuICAgICAgbGV0IHBhY2thZ2VOYW1lID0gaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID8gZGlyTmFtZSA6IGRpcmVudC5uYW1lO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lLmluY2x1ZGVzKCdfXycpKSB7XG4gICAgICAgIHBhY2thZ2VOYW1lID0gYEAke3BhY2thZ2VOYW1lLnJlcGxhY2UoJ19fJywgJy8nKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzTGlicmFyeSA9IGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbi5zb21lKFxuICAgICAgICAoY29uZmlnKSA9PlxuICAgICAgICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgICApO1xuXG4gICAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaGFzTGlicmFyeSkge1xuICAgICAgICAgIC8vIE1vdmUgQHR5cGVzLzxuYW1lPi9pbmRleC5kLnRzIGlmIGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSkpO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUsICdpbmRleC5kLnRzJykpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzcmNUeXBlRGlyUGF0aCkge1xuICAgICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPiBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIHNyY1R5cGVEaXJQYXRoICYmICFoYXNMaWJyYXJ5KSB7XG4gICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPi5kLnRzIGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICBpZ25vcmVFbm9lbnRBc3luYygoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lLCAnaW5kZXguZC50cycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGAke2RpcmVudC5uYW1lfS5kLnRzYClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIGFzeW5jIHJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzcC5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmc3Aud3JpdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGVkL1VwZGF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGFja2FnZUNvbmZpZy5kaXJQYXRoO1xuICAgIGNvbnN0IGRvY0ZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQoY29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAnZG9jJyk7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRzRmlsZXMgPSBhd2FpdCBmZy5nbG9iKFxuICAgICAgW1xuICAgICAgICAne2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLihbXiRdKS9nLCAnY2YuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLihbXiRdKS9nLCAnZS5nLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oW14kXSkvZywgJ2kuZS4kMScpO1xufVxuXG5mdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopZWdcXC4vZywgJy8vJDFlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWllXFwuL2csICcvLyQxaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY29uc3QgdG9rZW4gPVxuICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUIHx8IHByb2Nlc3MuZW52LlBVQkxJQ19HSF9CT1RfUEFUIHx8IHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8IHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTjtcbmV4cG9ydCBjb25zdCBoYXNHaXRIdWJUb2tlbiA9ICEhdG9rZW47XG5leHBvcnQgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgYXV0aDogdG9rZW4sXG59KTtcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViVXRpbCgpO1xuIiwiaW1wb3J0IHR5cGUgeyBTcGF3blN5bmNPcHRpb25zIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgaWYgKHJldC5zdGF0dXMgPT09IDApIGJyZWFrO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgY29uc3QgZXJyb3IgPSBwcm9jLnN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gY2F1c2VkIHRoZSBmb2xsb3dpbmcgZXJyb3I6XFxuICR7ZXJyb3J9YCk7XG4gIH1cbiAgcmV0dXJuIHByb2Muc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgLy8gUmVtb3ZlIGJlcnJ5IGZyb20gUEFUSFxuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnJlcGxhY2UoYCR7ZW52LkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKTtcbiAgfVxuXG4gIGlmIChlbnYuQVNERl9ESVIpIHtcbiAgICBhcmdzID0gWyctbCcsICctYycsIGAuICR7ZW52LkFTREZfRElSfS9hc2RmLnNoICYmICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gXTtcbiAgICBjb21tYW5kID0gJ2Jhc2gnO1xuICB9XG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIodmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgLy8gZS5nLiBqYXZhIGFkb3B0b3Blbmpkay0xMS4wLjE3KzhcbiAgY29uc3QgbnVtYmVycyA9IHZlcnNpb25cbiAgICAuc3BsaXQoL1srLi1dLylcbiAgICAubWFwKE51bWJlcilcbiAgICAuZmlsdGVyKChudW0pID0+ICFOdW1iZXIuaXNOYU4obnVtKSk7XG4gIGxldCB2ZXJzaW9uTnVtYmVyID0gMDtcbiAgbGV0IGRpdmlzb3IgPSAxO1xuICBmb3IgKGNvbnN0IG51bSBvZiBudW1iZXJzKSB7XG4gICAgdmVyc2lvbk51bWJlciArPSBudW0gKiBkaXZpc29yO1xuICAgIGRpdmlzb3IgLz0gMTAwMDtcbiAgfVxuICByZXR1cm4gdmVyc2lvbk51bWJlcjtcbn1cbiIsImV4cG9ydCBjb25zdCBQWVRIT05fVkVSU0lPTiA9ICczLjkuMTknO1xuZXhwb3J0IGNvbnN0IEpBVkFfVkVSU0lPTiA9ICd6dWx1LTExLjc0LjE1Jztcbi8vIEJlY2F1c2UgV2ViS2l0IGNhbm5vdCBsb2ctaW4gb24gQmxpdHogdjIuMC41K1xuZXhwb3J0IGNvbnN0IEJMSVRaX1ZFUlNJT04gPSAnMi4wLjQnO1xuZXhwb3J0IGNvbnN0IE5FWFRfVkVSU0lPTiA9ICcxNC4yLjUnO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgY29udmVydFZlcnNpb25JbnRvTnVtYmVyIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBKQVZBX1ZFUlNJT04sIFBZVEhPTl9WRVJTSU9OIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbkNvbnN0YW50cy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRvb2xWZXJzaW9ucyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRvb2xWZXJzaW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5jb25zdCBDT1JFX1RPT0xTID0gbmV3IFNldChbJ2phdmEnLCAnbm9kZWpzJywgJ2J1bicsICdweXRob24nXSk7XG5jb25zdCBERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMgPSBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXTtcblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjb25maWcudmVyc2lvbnNUZXh0KSByZXR1cm47XG5cbiAgY29uc3QgZHVwbGljYXRhYmxlTGluZXMgPSBjb25maWcudmVyc2lvbnNUZXh0XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBbbmFtZSwgdmVyc2lvbl0gPSBsaW5lLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgLy8gVG8gbW92ZSB0aGUgdG9wIG9mIHRoZSBzb3J0ZWQgbGlzdCwgd2UgbmVlZCB0byBhZGQgYSBzcGFjZS5cbiAgICAgIHJldHVybiBgJHtDT1JFX1RPT0xTLmhhcyhuYW1lKSA/ICcgJyA6ICcnfSR7bmFtZX0gJHt2ZXJzaW9ufWA7XG4gICAgfSlcbiAgICAuc29ydCgpXG4gICAgLy8gUmVtb3ZlIGFkZGVkIHNwYWNlcy5cbiAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSlcbiAgICAvLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGFmdGVyIGxlZnRob29rIGlzIGluc3RhbGxlZCB2aWEgbnBtLlxuICAgIC5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLnN0YXJ0c1dpdGgoJ2xlZnRob29rJykpO1xuICBjb25zdCBsaW5lcyA9IFsuLi5uZXcgU2V0KGR1cGxpY2F0YWJsZUxpbmVzKV07XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9weXBpLm9yZy9weXBpL3BvZXRyeS9qc29uJyk7XG4gICAgY29uc3QganNvbiA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgaW5mbz86IHsgdmVyc2lvbjogc3RyaW5nIH0gfSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwb2V0cnlWZXJzaW9uID0ganNvbj8uaW5mbz8udmVyc2lvbjtcbiAgICBpZiAocG9ldHJ5VmVyc2lvbikge1xuICAgICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3BvZXRyeScsIHBvZXRyeVZlcnNpb24pO1xuICAgIH1cbiAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAncHl0aG9uJywgUFlUSE9OX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ2phdmEnLCBKQVZBX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25zdCBidW5WZXJzaW9uID0gYXdhaXQgZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yignb3Zlbi1zaCcsICdidW4nKTtcbiAgICAgIGlmIChidW5WZXJzaW9uKSB1cGRhdGVWZXJzaW9uKGxpbmVzLCAnYnVuJywgYnVuVmVyc2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCducG0nLCBbJ3Nob3cnLCAneWFybicsICd2ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICd5YXJuJywgdmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwcmVmaXggb2YgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTKSB7XG4gICAgY29uc3QgdmVyc2lvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKTtcbiAgICB2b2lkIGZzLnByb21pc2VzLnJtKHZlcnNpb25QYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgdG9vbFZlcnNpb25zUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyk7XG4gIGF3YWl0IChsaW5lcy5sZW5ndGggPiAwXG4gICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHRvb2xWZXJzaW9uc1BhdGgsIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbicpKVxuICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHRvb2xWZXJzaW9uc1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ3BsdWdpbicsICd1cGRhdGUnLCAnLS1hbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ2luc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVWZXJzaW9uKGxpbmVzOiBzdHJpbmdbXSwgdG9vbE5hbWU6IHN0cmluZywgbmV3VmVyc2lvbjogc3RyaW5nLCBoZWFkID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc3QgaW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGwpID0+IGwuc3BsaXQoL1xccysvKVswXSA9PT0gdG9vbE5hbWUpO1xuICBjb25zdCBuZXdMaW5lID0gYCR7dG9vbE5hbWV9ICR7bmV3VmVyc2lvbn1gO1xuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgbGluZXMuc3BsaWNlKGhlYWQgPyAwIDogbGluZXMubGVuZ3RoLCAwLCBuZXdMaW5lKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGxpbmVzW2luZGV4XS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIobmV3VmVyc2lvbikgPiBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIodmVyc2lvbikpIHtcbiAgICAgIGxpbmVzW2luZGV4XSA9IG5ld0xpbmU7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG9zaXRvcnk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgLy8gRmV0Y2ggdGhlIGxhdGVzdCByZWxlYXNlIGZyb20gdGhlIHJlcG9zaXRvcnlcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9sYXRlc3QnLCB7XG4gICAgICBvd25lcjogb3JnYW5pemF0aW9uLFxuICAgICAgcmVwbzogcmVwb3NpdG9yeSxcbiAgICB9KTtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVzcG9uc2UuZGF0YS50YWdfbmFtZTtcbiAgICBjb25zdCBpbmRleCA9IHZlcnNpb24ubGFzdEluZGV4T2YoJ3YnKTtcbiAgICBjb25zdCB2ZXJzaW9uTnVtYmVyVGV4dCA9IGluZGV4ID09PSAtMSA/IHZlcnNpb24gOiB2ZXJzaW9uLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgLy8gQ2hlY2sgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhIG51bWJlclxuICAgIHJldHVybiAvXlxcZC8udGVzdCh2ZXJzaW9uTnVtYmVyVGV4dCkgPyB2ZXJzaW9uTnVtYmVyVGV4dCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggQnVuIHRhZ3MgZHVlIHRvOicsIGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnQgKi9cblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogb2JqZWN0W10sIHNvdXJjZTogb2JqZWN0W10sIG9wdGlvbnM6IGFueSk6IG9iamVjdFtdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICcuL25vZGVfbW9kdWxlcy9AYmlvbWVqcy9iaW9tZS9jb25maWd1cmF0aW9uX3NjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQmlvbWVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlID0gYHRlbGVtZXRyeSA9IGZhbHNlXG5cbltpbnN0YWxsXVxuZXhhY3QgPSB0cnVlXG5cbltydW5dXG5idW4gPSB0cnVlXG5gO1xuXG5jb25zdCBuZXdDb250ZW50V2l0aEV4YWN0RmFsc2UgPSBgdGVsZW1ldHJ5ID0gZmFsc2VcblxuW2luc3RhbGxdXG5leGFjdCA9IGZhbHNlXG5cbltydW5dXG5idW4gPSB0cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgY29uc3QgY29udGVudCA9XG4gICAgICBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSAmJiBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykuaW5jbHVkZXMoJ2V4YWN0ID0gZmFsc2UnKVxuICAgICAgICA/IG5ld0NvbnRlbnRXaXRoRXhhY3RGYWxzZVxuICAgICAgICA6IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnNvcnQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAncHknXS5zb3J0KCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnNvcnQoKSxcbiAgZXNsaW50OiBbJ2NqcycsICdtanMnLCAnanMnLCAnY3RzJywgJ210cycsICd0cycsICd0c3gnLCAnanN4J10uc29ydCgpLFxuICBwcmV0dGllcjogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjc3MnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnbWQnLFxuICAgICdzY3NzJyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0uc29ydCgpLFxuICAvLyBjZi4gaHR0cHM6Ly9iaW9tZWpzLmRldi9pbnRlcm5hbHMvbGFuZ3VhZ2Utc3VwcG9ydC9cbiAgYmlvbWU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ2FzdHJvJyxcbiAgICAnY3NzJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ2dxbCcsXG4gIF0uc29ydCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50cmMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgZmlsZXNcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRpZ25vcmUnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5lc2xpbnRCYXNlKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKCFvbGRDb250ZW50LmluY2x1ZGVzKCdleHBvcnQgeyBkZWZhdWx0IH0nKSkgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJyR7Y29uZmlnLmVzbGludEJhc2V9JztgKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuIS5rZWVwXG4uZW52LnByb2R1Y3Rpb25cbiovbW91bnQvKi5oYXNoXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5kZXZjb250YWluZXIvXG5kaXN0L1xudGVtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc0dvTW9kKSB7XG4gICAgICBuYW1lcy5wdXNoKCdnbycpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAke3BhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpfVxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgbmFtZXMucHVzaCgnZmx1dHRlcicsICdBbmRyb2lkU3R1ZGlvJywgJ3J1YnknKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmZsdXR0ZXItcGx1Z2lucy1kZXBlbmRlbmNpZXNcbmFuZHJvaWQva2V5LnByb3BlcnRpZXNcbmlvcy8uYnVuZGxlXG4uaWRlYS9ydW5Db25maWd1cmF0aW9ucy54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgdGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmxpdGVzdHJlYW0pIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ2NwLXNhLWtleS5qc29uXG5gO1xuICAgIH1cblxuICAgIGxldCBnZW5lcmF0ZWQgPSAnJztcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGxldCBjb250ZW50ID0gKGF3YWl0IHJlYWRDYWNoZShuYW1lKSkgPz8gJyc7XG4gICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3LnRvcHRhbC5jb20vZGV2ZWxvcGVycy9naXRpZ25vcmUvYXBpLyR7bmFtZX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJ0F0dGVudGlvbiBSZXF1aXJlZCEnKSB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJzx0aXRsZT4nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IHJlc3BvbnNlVGV4dC50cmltKCk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZUNhY2hlKG5hbWUsIGNvbnRlbnQpKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBGZXRjaGVkICR7dXJsfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2VuZXJhdGVkKSBnZW5lcmF0ZWQgKz0gJ1xcbic7XG4gICAgICBnZW5lcmF0ZWQgKz0gY29udGVudCArICdcXG4nO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBpZ25vcmVGaWxlVXRpbC5pc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoKSkpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlKCchLnlhcm4vY2FjaGUnLCAnIyAhLnlhcm4vY2FjaGUnKS5yZXBsYWNlKCcjIC5wbnAuKicsICcucG5wLionKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwgfHwgY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcjIC5pZGVhL21vZHVsZXMueG1sJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eKC5pZGVhXFwvLispJC9nbSwgJyQxXFxuYW5kcm9pZC8kMScpO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgJ1xcbicgKyBnZW5lcmF0ZWQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNhY2hlJywgJ3diZnknLCAnZ2l0aWdub3JlJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FjaGUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHsgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmdhbml6YXRpb246IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IGRhdGE6IGNvbW1pdHMgfSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzJywge1xuICAgICAgb3duZXI6IG9yZ2FuaXphdGlvbixcbiAgICAgIHJlcG8sXG4gICAgICBwZXJfcGFnZTogMSxcbiAgICB9KTtcbiAgICBpZiAoY29tbWl0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1pdHNbMF0uc2hhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgRXNsaW50VXRpbCA9IHtcbiAgZ2V0TGludEZpeFN1ZmZpeChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3ggPyAnIC0tcnVsZSBcInsgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzOiAwIH1cIicgOiAnJztcbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFc2xpbnRFeHRlbnNpb25CYXNlLCBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgQkxJVFpfVkVSU0lPTiwgTkVYVF9WRVJTSU9OIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbkNvbnN0YW50cy5qcyc7XG5cbmNvbnN0IGpzQ29tbW9uRGVwcyA9IFtcbiAgJ2VzbGludCcsXG4gICdlc2xpbnQtY29uZmlnLWZsYXQtZ2l0aWdub3JlJyxcbiAgJ2VzbGludC1jb25maWctcHJldHRpZXInLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbiAgJ2VzbGludC1wbHVnaW4tdW51c2VkLWltcG9ydHMnLFxuICAnZ2xvYmFscycsXG5dO1xuXG5jb25zdCB0c0NvbW1vbkRlcHMgPSBbLi4uanNDb21tb25EZXBzLCAndHlwZXNjcmlwdC1lc2xpbnQnLCAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0J107XG5cbmNvbnN0IHJlYWN0Q29tbW9uRGVwcyA9IFsnZXNsaW50LXBsdWdpbi1yZWFjdCcsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJ107XG5cbmNvbnN0IGVzbGludERlcHM6IFJlY29yZDxFc2xpbnRFeHRlbnNpb25CYXNlLCBzdHJpbmdbXT4gPSB7XG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLCAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAgICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JyxcbiAgICAuLi5qc0NvbW1vbkRlcHMsXG4gICAgLi4ucmVhY3RDb21tb25EZXBzLFxuICBdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJywgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyxcbiAgICAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICdlc2xpbnQtcGx1Z2luLWltcG9ydCcsXG4gICAgJ2VzbGludC1jb25maWctbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgfHwge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyB8fCB7fTtcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqIGFzIFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuICApO1xuXG4gIGlmIChqc29uT2JqLm5hbWUgIT09ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJykge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAvLyBGcmVzaCByZXBvIHN0aWxsIHJlcXVpcmVzICd5YXJuIGluc3RhbGwnXG4gICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnZ2l0IGNsb25lJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgveWFyblxccyomJlxccyovLCAnJykucmVwbGFjZSgveWFyblxccyppbnN0YWxsXFxzKiYmXFxzKi8sICcnKTtcbiAgICB9XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPSBtZXJnZShqc29uT2JqLnNjcmlwdHMsIGdlbmVyYXRlU2NyaXB0cyhjb25maWcpKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5ICs9IGF3YWl0IGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoY29uZmlnLmRpclBhdGgpO1xuICB9XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1hbGwnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tcmVjdXJzaXZlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXNpbmNlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXdvcmt0cmVlJylcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJywgJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsJyk7XG4gIH1cblxuICBsZXQgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZGV2RGVwZW5kZW5jaWVzID0gWydwcmV0dGllcicsICdzb3J0LXBhY2thZ2UtanNvbicsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJ107XG4gIGNvbnN0IHBvZXRyeURldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICB9IGVsc2Uge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsaW50LXN0YWdlZCcpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2h1c2t5J107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3BpbnN0J107XG4gICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdsZWZ0aG9vayBpbnN0YWxsIHx8IHRydWUnO1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBodXNreVxuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2h1c2t5Jyk7XG4gICAgICAvLyAnfHwgdHJ1ZScgYXZvaWRzIGVycm9ycyB3aGVuIGh1c2t5IGlzIG5vdCBpbnN0YWxsZWQuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdodXNreSB8fCB0cnVlJzsgLy8gZm9yIG5vbi15YXJuIHBhY2thZ2UgbWFuYWdlcnMuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPSAnaHVza3kgfHwgdHJ1ZSc7IC8vIGZvciB5YXJuLlxuICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gfHwgY29uZmlnLmlzUmVmZXJyZWRCeU90aGVyUmVwbykge1xuICAgICAgICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgICAgICAgLy8gaHR0cHM6Ly90eXBpY29kZS5naXRodWIuaW8vaHVza3kvIy8/aWQ9aW5zdGFsbC0xXG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwaW5zdCcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFjayA9ICdwaW5zdCAtLWRpc2FibGUnO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMucG9zdHBhY2sgPSAncGluc3QgLS1lbmFibGUnO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPVxuICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddIHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICAgICA/IC8vIFRPRE86IHJlbW92ZSB0aGUgdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGFmdGVyIG11bHRpLXNlbWFudGljLXJlbGVhc2Ugc3VwcG9ydHMgdmVyc2lvbiA3K1xuICAgICAgICAgICAgJ0A2LjEuMCdcbiAgICAgICAgICA6ICcnO1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goYGNvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cyR7dmVyc2lvbn1gKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzWydhcnRpbGxlcnknXSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snYXJ0aWxsZXJ5J107XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ3BsYXl3cmlnaHQnXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sncGxheXdyaWdodCddO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLndiIHx8IGNvbmZpZy5pc0J1bikge1xuICAgIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10pIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgvd2JcXHMrZGIvLCAnd2IgcHJpc21hJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BiaW9tZWpzL2Jpb21lJywgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnKTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50J107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ21pY3JvbWF0Y2gnXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sndHlwZXNjcmlwdC1lc2xpbnQnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2VzbGludCcsICdtaWNyb21hdGNoJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCd0eXBlc2NyaXB0Jyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmVzbGludEJhc2UpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5lc2xpbnREZXBzW2NvbmZpZy5lc2xpbnRCYXNlXSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgfVxuXG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gQmVjYXVzZSBgXCJyZXNvbHV0aW9uc1wiOiB7IFwibnBtL2NoYWxrXCI6IFwiXjQuMS4yXCIgfSxgIGNhdXNlcyBcIkludmFsaWQgbnBtIHRva2VuXCJcbiAgZGVsZXRlIGpzb25PYmoucmVzb2x1dGlvbnM/LlsnbnBtL2NoYWxrJ107XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMubGludDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmNsZWFudXAgPSBqc29uT2JqLnNjcmlwdHMuY2xlYW51cD8ucmVwbGFjZSgnICYmIHlhcm4gbGludC1maXgnLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gKz0gRXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGZsdXR0ZXIgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCArPSBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoL1svXFxcXF0vKTtcbiAgICAgICAgaWYgKHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGBwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiBwb2V0cnkgcnVuIGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ICs9IGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICAgIHBvZXRyeURldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnJlcG9zaXRvcnkpIHtcbiAgICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5O1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICBgYmxpdHpAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgQGJsaXR6anMvYXV0aEAke0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBAYmxpdHpqcy9uZXh0QCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYEBibGl0empzL3JwY0Ake0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBuZXh0QCR7TkVYVF9WRVJTSU9OfWBcbiAgICApO1xuICAgIC8vIFByZWZlciBlc2xpbnQtY29uZmlnLW5leHQncyBkZXBlbmRlbmNpZXNcbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkKSA9PiBkICE9PSAnZXNsaW50LXBsdWdpbi1yZWFjdCcgJiYgZCAhPT0gJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnKTtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXM/LnByZXR0aWVyKSB7XG4gICAgLy8gQmVjYXVzZSBAdHlwZXMvcHJldHRpZXIgYmxvY2tzIHByZXR0aWVyIGV4ZWN1dGlvbi5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9wcmV0dGllciddO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmoucGVlckRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmoucGVlckRlcGVuZGVuY2llcztcbiAgfVxuXG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgbGV0IG5ld0pzb25UZXh0ID0gSlNPTi5zdHJpbmdpZnkoanNvbk9iaik7XG4gIG5ld0pzb25UZXh0ID0gYXdhaXQgZml4U2NyaXB0TmFtZXMoanNvbk9iai5zY3JpcHRzLCBuZXdKc29uVGV4dCwgY29uZmlnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdKc29uVGV4dCk7XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRldkRlcGVuZGVuY2llcy5cbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRldkRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXBlbmRlbmNpZXMuXG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLUQnLCAuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICAgIGlmIChwb2V0cnlEZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLm5ldyBTZXQocG9ldHJ5RGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChqc29uT2JqLmF1dGhvciA9PT0gJ1dpbGxCb29zdGVyIExMQycpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LWFsbC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrL3dhcm4nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmdlbi1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpjb2RlZ2VuJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1sndHNsaWInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXJlYWN0J107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci90c2NvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZSddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4tcHJldHRpZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsZXJuYSddO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydwaW5zdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHJldHRpZXInXTtcbiAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZm9yIChjb25zdCBkZXBzIG9mIE9iamVjdC52YWx1ZXMoZXNsaW50RGVwcykpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSgnbGVybmEuanNvbicsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gIC8vIE1pZ3JhdGUgZnJvbSBFU0xpbnQgbGVnYWN5IGNvbmZpZ3MgdG8gZmxhdCBjb25maWdzLFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4taW1wb3J0J107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2NoZWNrLWFsbCc6ICdidW4gcnVuIGNsZWFudXAgJiYgYnVuIHJ1biB0eXBlY2hlY2sgJiYgYnVuIHJ1biB0ZXN0JyxcbiAgICAgIGNsZWFudXA6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gLS1idW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIC0tYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyxcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwnOiAneWFybiBjbGVhbnVwICYmIHlhcm4gdHlwZWNoZWNrICYmIHlhcm4gdGVzdCcsXG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5YCxcbiAgICAgIGxpbnQ6IGBlc2xpbnQgLS1jb2xvcmAsXG4gICAgICAnbGludC1maXgnOiAneWFybiBsaW50IC0tZml4JyxcbiAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX1cIiBcIiEqKi90ZXN0LWZpeHR1cmVzLyoqXCJgLFxuICAgICAgdHlwZWNoZWNrOiAndHNjIC0tbm9FbWl0IC0tUHJldHR5JyxcbiAgICB9O1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBjb25zdCBvbGRUZXN0ID0gc2NyaXB0cy50ZXN0O1xuICAgICAgc2NyaXB0cyA9IG1lcmdlKFxuICAgICAgICB7IC4uLnNjcmlwdHMgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnkgJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oXG4gICAgICAgICAgICAnLCdcbiAgICAgICAgICApfX1cIiBcIiEqKi9wYWNrYWdlcy8qKlwiIFwiISoqL3Rlc3QtZml4dHVyZXMvKipcImAsXG4gICAgICAgICAgLy8gQ0k9MSBwcmV2ZW50cyB2aXRlc3QgZnJvbSBlbmFibGluZyB3YXRjaC5cbiAgICAgICAgICAvLyBGT1JDRV9DT0xPUj0zIG1ha2Ugd2IgZW5hYmxlIGNvbG9yIG91dHB1dC5cbiAgICAgICAgICB0ZXN0OiAnQ0k9MSBGT1JDRV9DT0xPUj0zIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tdmVyYm9zZSBydW4gdGVzdCcsXG4gICAgICAgICAgdHlwZWNoZWNrOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIHR5cGVjaGVjaycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAob2xkVGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9IHNjcmlwdHMudHlwZWNoZWNrID8gYCR7c2NyaXB0cy50eXBlY2hlY2t9ICYmIGAgOiAnJztcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICdweXJpZ2h0JztcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gJ3diIHR5cGVjaGVjayc7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeFNjcmlwdE5hbWVzKFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuZXdKc29uVGV4dDogc3RyaW5nLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG9sZEFuZE5ld1NjcmlwdE5hbWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5XSBvZiBPYmplY3Qua2V5cyhzY3JpcHRzKSkge1xuICAgIGlmIChrZXlbMF0gIT09ICc6JyAmJiBrZXkuaW5jbHVkZXMoJzonKSkge1xuICAgICAgb2xkQW5kTmV3U2NyaXB0TmFtZXMucHVzaChba2V5LCBrZXkucmVwbGFjZUFsbCgnOicsICctJyldKTtcbiAgICB9XG4gIH1cbiAgaWYgKG9sZEFuZE5ld1NjcmlwdE5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ld0pzb25UZXh0O1xuXG4gIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgbmV3SnNvblRleHQgPSBuZXdKc29uVGV4dC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICB9XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyoqLyoue21kLGNqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsICcqKi9Eb2NrZXJmaWxlJ10sIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuICAgICAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBvbGRDb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICByZXR1cm4gbmV3SnNvblRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzIHx8IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2F1dGgnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvYXV0aCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdhdXRoJyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9hdXRoJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvYXV0aC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0BkaXNjb3JkLWJvdC9zaGFyZWQnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAZGlzY29yZC1ib3Qvc2hhcmVkJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnZGlzY29yZC1ib3QnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2Rpc2NvcmQtYm90LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuXG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2NvZGUtYW5hbHl6ZXInKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXSA9XG4gICAgICBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvY29kZS1hbmFseXplci5naXQjd29ya3NwYWNlPUBjb2RlLWFuYWx5emVyL2NsaWVudCZjb21taXQ9JHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9qdWRnZScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnanVkZ2UnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvanVkZ2UuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2xsbS1wcm94eScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2xsbS1wcm94eScpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvbGxtLXByb3h5LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHByZUNvbW1pdDogJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vbGludC1zdGFnZWQnLFxuICBwcmVQdXNoOiBgeWFybiB0eXBlY2hlY2tgLFxuICBwcmVQdXNoRm9yTGFiOiBgXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxueWFybiB0eXBlY2hlY2tcbmAudHJpbSgpLFxuICBwb3N0TWVyZ2U6IGBcbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBwYWNrYWdlSnNvbi5zY3JpcHRzIHx8PSB7fTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3Bvc3RpbnN0YWxsJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwb3N0cHVibGlzaCddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncHJlcGFyZSddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncHJlcHVibGlzaE9ubHknXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3ByZXBhY2snXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3Bvc3RwYWNrJ107XG5cbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreScpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIHVuZGVmaW5lZCwgMikpLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBzcGF3blN5bmMoJ2dpdCcsIFsnY29uZmlnJywgJy0tdW5zZXQnLCAnY29yZS5ob29rc1BhdGgnXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ2h1c2t5LWluaXQnLCAnLS15YXJuMiddLCBjb25maWcuZGlyUGF0aCk7XG5cbiAgY29uc3QgcHJlQ29tbWl0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3ByZS1jb21taXQnKTtcblxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLndyaXRlRmlsZShwcmVDb21taXRGaWxlUGF0aCwgc2NyaXB0cy5wcmVDb21taXQgKyAnXFxuJykpO1xuXG4gIGNvbnN0IHsgdHlwZWNoZWNrIH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnKTtcbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGxldCBwcmVQdXNoID0gY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSA/IHNjcmlwdHMucHJlUHVzaEZvckxhYiA6IHNjcmlwdHMucHJlUHVzaDtcbiAgICBwcmVQdXNoID0gcHJlUHVzaC5yZXBsYWNlKFxuICAgICAgJ3lhcm4gdHlwZWNoZWNrJyxcbiAgICAgIHR5cGVjaGVja1xuICAgICAgICAucmVwbGFjZSgndHNjICcsICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL3RzYyAnKVxuICAgICAgICAucmVwbGFjZSgnd2IgJywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vd2IgJylcbiAgICAgICAgLy8gcHlyaWdodCBoYXMgbm8gYXJndW1lbnRzXG4gICAgICAgIC5yZXBsYWNlKCdweXJpZ2h0JywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHlyaWdodCcpXG4gICAgKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgICBtb2RlOiAwbzc1NSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dCkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXdrICd7cHJpbnQgXFwkMX0nIC50b29sLXZlcnNpb25zIHwgeGFyZ3MgLUl7fSBhc2RmIHBsdWdpbiBhZGQge31cImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBwbHVnaW4gdXBkYXRlIC0tYWxsXCJgXG4gICAgKTtcbiAgfVxuICAvLyBQeXRob27jgYzjgarjgYTjgajjgqTjg7Pjgrnjg4jjg7zjg6vjgafjgY3jgarjgYTlh6bnkIbns7vjgYzlrZjlnKjjgZnjgovjgZ/jgoHjgIHlvLfliLbnmoTjgavmnIDliJ3jgavjgqTjg7Pjgrnjg4jjg7zjg6vjgZnjgovjgIJcbiAgaWYgKGNvbmZpZy52ZXJzaW9uc1RleHQ/LmluY2x1ZGVzKCdweXRob24gJykpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIGluc3RhbGwgcHl0aG9uXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dCkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgaW5zdGFsbFwiYCk7XG4gIH1cbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIGluc3RhbGwnIDogJ3lhcm4nO1xuICBjb25zdCBybU5leHREaXJlY3RvcnkgPSBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCA/ICcgJiYgcm0gLVJmIC5uZXh0JyA6ICcnO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKGBydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXFxcLmpzb25cIiBcIiR7aW5zdGFsbENvbW1hbmR9JHtybU5leHREaXJlY3Rvcnl9XCJgKTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuXG5jb25zdCBwcmV0dGllckNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdub2RlJywgJ25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZScsICdQcmV0dGllcicsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmNvbnN0IGJpb21lQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ2J1bicsICctLWJ1biBub2RlX21vZHVsZXMvLmJpbi9iaW9tZSBjaGVjayAtLWZpeCAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1za2lwLWVycm9ycycsICdCaW9tZScsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAoY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbmZpZy5pc0J1biA/IGJpb21lQ29udGVudCA6IHByZXR0aWVyQ29udGVudCkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyB9IGZyb20gJy4vaHVza3lyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuY29uc3QgbmV3U2V0dGluZ3MgPSB7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdwcmVwYXJlLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgY29tbWFuZHM6IHtcbiAgICAgIGNsZWFudXA6IHtcbiAgICAgICAgZ2xvYjogJyoue2Nqcyxjc3MsY3RzLGh0bSxodG1sLGpzLGpzb24sanNvbjUsanNvbmMsanN4LG1kLG1qcyxtdHMsc2Nzcyx0cyx0c3gsdnVlLHlhbWwseW1sfScsXG4gICAgICAgIHJ1bjogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IHtzdGFnZWRfZmlsZXN9ICYmIGdpdCBhZGQge3N0YWdlZF9maWxlc30nLFxuICAgICAgfSxcbiAgICAgICdjaGVjay1taWdyYXRpb25zJzoge1xuICAgICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICAgIHJ1bjogYFxuaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyB7c3RhZ2VkX2ZpbGVzfTsgdGhlblxuICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlcyAoe3N0YWdlZF9maWxlc30pIGNvbnRhaW4gd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICBleGl0IDFcbmZpXG5gLnRyaW0oKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdjaGVjay5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwcmVQdXNoOiBgYnVuIC0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL3diIHR5cGVjaGVja2AsXG4gIHByZVB1c2hGb3JMYWI6IGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG5idW4gLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vd2IgdHlwZWNoZWNrXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGNvbnN0IHsgdHlwZWNoZWNrIH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnKTtcbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGNvbnN0IHByZVB1c2ggPSBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBzcmNEaXJlY3RvcmllcyA9IHtcbiAgbm9kZTogWydzcmMnLCAndGVzdHMnLCAnc2NyaXB0cyddLnNvcnQoKSxcbiAgYmxpdHo6IFsnc3JjJywgJ3Rlc3RzJywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS5zb3J0KCksXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3JjRGlycyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcmV0dXJuIHNyY0RpcmVjdG9yaWVzLmJsaXR6O1xuICB9XG4gIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ub2RlO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgRXNsaW50VXRpbCB9IGZyb20gJy4uL3V0aWxzL2VzbGludFV0aWwuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0U3JjRGlycyB9IGZyb20gJy4uL3V0aWxzL3NyY0RpcmVjdG9yaWVzLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGludHN0YWdlZHJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5janMnKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZVByZWZpeCA9IGNvbmZpZy5pc1Jvb3QgPyAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi8nIDogJ25vZGUgLi4vLi4vbm9kZV9tb2R1bGVzLy5iaW4vJztcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCkge1xuICAgIGNvbnN0IGVzbGludCA9IGBcbiAgJyR7Z2V0RXNsaW50S2V5KGNvbmZpZyl9JzogWyR7SlNPTi5zdHJpbmdpZnkoXG4gICAgYCR7cGFja2FnZVByZWZpeH1lc2xpbnQgLS1maXgke0VzbGludFV0aWwuZ2V0TGludEZpeFN1ZmZpeChjb25maWcpfWBcbiAgKX0sICcke3BhY2thZ2VQcmVmaXh9cHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlJ10sYDtcbiAgICBsaW5lcy5wdXNoKGVzbGludCk7XG4gIH1cbiAgY29uc3QgcGFja2FnZXNGaWx0ZXIgPSBjb25maWcuaXNSb290ID8gXCIgJiYgIWZpbGUuaW5jbHVkZXMoJy9wYWNrYWdlcy8nKVwiIDogJyc7XG4gIGxpbmVzLnB1c2goYFxuICAnLi8qKi8qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX0nOiBmaWxlcyA9PiB7XG4gICAgbGV0IGZpbHRlcmVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhZmlsZS5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJykke3BhY2thZ2VzRmlsdGVyfSk7JHtnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWcpfVxuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gW1xcYCR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMuc29tZShmaWxlID0+IGZpbGUuZW5kc1dpdGgoJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnJHtwYWNrYWdlUHJlZml4fXNvcnQtcGFja2FnZS1qc29uJyk7XG4gICAgfVxuICAgIHJldHVybiBjb21tYW5kcztcbiAgfSxcbiAgJy4vKiovbWlncmF0aW9uLnNxbCc6IChmaWxlcykgPT4ge1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpO1xuICAgIGlmIChjb250ZW50LmluY2x1ZGVzKCdXYXJuaW5nczonKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXFxgISEhIE1pZ3JhdGlvbiBTUUwgZmlsZSAoXFwke3BhdGgucmVsYXRpdmUoJycsIGZpbGUpfSkgY29udGFpbnMgd2FybmluZ3MgISEhIFNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlxcYCxcbiAgICAgIF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn0sYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4ve2xpYix0ZXN0LHRlc3RfZHJpdmVyfS8qKi8qLmRhcnQnOiBmaWxlcyA9PiB7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCdnZW5lcmF0ZWQnKSlcbiAgICAgIC5maWx0ZXIoZmlsZSA9PiAhZmlsZS5lbmRzV2l0aCgnLmZyZWV6ZWQuZGFydCcpICYmICFmaWxlLmVuZHNXaXRoKCcuZy5kYXJ0JykpO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBbXFxgZmx1dHRlciBmb3JtYXQgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gIH0sYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgbGluZXMucHVzaChgXG4gICcuLyoqLyoucHknOiBbXG4gICAgJ3BvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzJyxcbiAgICAncG9ldHJ5IHJ1biBibGFjaycsXG4gICAgJ3BvZXRyeSBydW4gZmxha2U4J1xuICBdLGApO1xuICB9XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuJHtjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCA/IFwiY29uc3QgbWljcm9tYXRjaCA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcXG5cIiA6ICcnfVxubW9kdWxlLmV4cG9ydHMgPSB7JHtsaW5lcy5qb2luKCcnKX1cbn07XG5gO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRLZXkoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgZGlycyA9IGdldFNyY0RpcnMoY29uZmlnKS5tYXAoKGRpcikgPT4gYCR7ZGlyfS8qKi9gKTtcbiAgcmV0dXJuIGB7LCR7ZGlycy5qb2luKCcsJyl9fSoueyR7ZXh0ZW5zaW9ucy5lc2xpbnQuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRcbiAgICA/IGBcXG5cbiAgICBmaWx0ZXJlZEZpbGVzID0gZmlsdGVyZWRGaWxlcy5tYXAoKGZpbGUpID0+IHBhdGgucmVsYXRpdmUoJycsIGZpbGUpKTtcbiAgICBmaWx0ZXJlZEZpbGVzID0gbWljcm9tYXRjaC5ub3QoZmlsdGVyZWRGaWxlcywgJyR7Z2V0RXNsaW50S2V5KGNvbmZpZyl9Jyk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlc29sdmUoZmlsZSkpO2BcbiAgICA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWydqcycsICdtanMnLCAnY2pzJ11cbiAgICAgIC5tYXAoKGV4dCkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgbmV4dC5jb25maWcuJHtleHR9YCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIC8vIFJlcGxhY2UgdGhlIEpTT04gb2JqZWN0IGZyb20gdGhlIGZpbGVcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC89XFxzKnsoW1xcU1xcc10qKX07LywgKF8sIHNldHRpbmdzVGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIXNldHRpbmdzVGV4dC5pbmNsdWRlcygnZXNsaW50OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAnZXNsaW50OiB7IGlnbm9yZUR1cmluZ0J1aWxkczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICBpZiAoIXNldHRpbmdzVGV4dC5pbmNsdWRlcygndHlwZXNjcmlwdDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ3R5cGVzY3JpcHQ6IHsgaWdub3JlQnVpbGRFcnJvcnM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGA9IHske3NldHRpbmdzVGV4dH19O2A7XG4gICAgfSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgdmVudlBhdGg6ICcuJyxcbiAgdmVudjogJy52ZW52Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSBjbG9uZURlZXAoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkge1xuICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5Py5pbmRleE9mKCc6JykgKyAxKTtcbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5yZWFkZGlyU3luYyhgJHtjb25maWcuZGlyUGF0aH0vLmdpdGh1Yi93b3JrZmxvd3NgKTtcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lcykge1xuICAgICAgaWYgKCFmaWxlTmFtZS5zdGFydHNXaXRoKCd0ZXN0JykgJiYgIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSBjb250aW51ZTtcblxuICAgICAgbGV0IGJhZGdlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBjb25zdCBiYWRnZSA9IGBbIVske2JhZGdlTmFtZX1dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9L2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9KWA7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuZ2l0aHViL3dvcmtmbG93cy8ke2ZpbGVOYW1lfWApKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgYmFkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0QmFkZ2UocmVhZG1lOiBzdHJpbmcsIGJhZGdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDml6LjgatiYWRnZeOBjOOBguOCi+WgtOWQiOOBr+WJiumZpFxuICByZWFkbWUgPSByZWFkbWUucmVwbGFjZShiYWRnZSwgJycpLnJlcGxhY2VBbGwoL1xcblxcblxcbisvZywgJ1xcblxcbicpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVhZG1lLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlYWRtZVtpIC0gMV0gPT09ICdcXG4nICYmIHJlYWRtZVtpXSA9PT0gJ1xcbicpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHJlYWRtZS5zbGljZSgwLCBpICsgMSk7XG4gICAgICBsZXQgYWZ0ZXIgPSByZWFkbWUuc2xpY2UoaSArIDEpO1xuICAgICAgaWYgKCFhZnRlci5zdGFydHNXaXRoKCdbJykgJiYgIWFmdGVyLnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICBhZnRlciA9IGBcXG4ke2FmdGVyfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7YmVmb3JlfSR7YmFkZ2V9XFxuJHthZnRlcn1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7cmVhZG1lfVxcbiR7YmFkZ2V9XFxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICBwbHVnaW5zOiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3M/LnBsdWdpbnMgfHwgW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW4gPSBBcnJheS5pc0FycmF5KHBsdWdpbnNbaV0pID8gcGx1Z2luc1tpXVswXSA6IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSAmJiBwbHVnaW5zW2ldWzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFsnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbjUnXSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSB0eXBlb2YganNvbk9iaiAmIHsgcGFja2FnZVJ1bGVzOiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoanNvbk9iaikgYXMgU2V0dGluZ3M7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdyZW5vdmF0ZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7ZmlsZVBhdGh9NWApKSB7XG4gICAgICAvLyBTaW5jZSBpdCBpcyBkaWZmaWN1bHQgZm9yIHBhcnNpbmcgcmVub3ZhdGUuanNvbjUsIHdlIGRvIG5vdGhpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBEb24ndCB1cGdyYWRlIE5leHQuanMgYXV0b21hdGljYWxseVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMgPz89IFtdO1xuICAgICAgaWYgKFxuICAgICAgICAhbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnNvbWUoKHJ1bGU6IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcy5pbmNsdWRlcygnbmV4dCcpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMucHVzaCh7IG1hdGNoUGFja2FnZU5hbWVzOiBbJ25leHQnXSwgZW5hYmxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kZXBlbmRhYm90JyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVub3ZhdGVyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikuc29ydCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG5cbiAgICAvLyBpZiB2YWx1ZSBpcyBhbiBvYmplY3QsIHNvcnQgdGhlIGtleXMgb2YgdGhlIG9iamVjdFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCByb290SnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgdGFyZ2V0OiAnRVMyMDIyJywgLy8gYmVjYXVzZSBkZWNvcmF0b3JzIHNob3VsZCBiZSB0cmFuc3BpbGVkIHRvIEVTMjAyMiBvbiBOb2RlLmpzXG4gICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZScsXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBlcmFzYWJsZVN5bnRheE9ubHk6IHRydWUsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuL0B0eXBlcyddLFxuICB9LFxuICBpbmNsdWRlOiBbXG4gICAgJ3NyYy8qKi8qJyxcbiAgICAndGVzdHMvKiovKicsXG4gICAgJ3NjcmlwdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc3JjLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3Rlc3RzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NjcmlwdHMvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICB0YXJnZXQ6ICdFUzIwMjInLCAvLyBiZWNhdXNlIGRlY29yYXRvcnMgc2hvdWxkIGJlIHRyYW5zcGlsZWQgdG8gRVMyMDIyIG9uIE5vZGUuanNcbiAgICBtb2R1bGU6ICdFU05leHQnLFxuICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlJyxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgc2tpcExpYkNoZWNrOiB0cnVlLCAvLyBiZWNhdXNlIGxpYnJhcmllcyBtYXkgaGF2ZSBicm9rZW4gdHlwZXNcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIGVyYXNhYmxlU3ludGF4T25seTogdHJ1ZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgICB0eXBlUm9vdHM6IFsnLi4vLi4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuLi8uLi9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgaW5jbHVkZTogWydzcmMvKiovKicsICd0ZXN0cy8qKi8qJywgJ3NjcmlwdHMvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHJldHVybjtcblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChjb25maWcuaXNSb290ID8gcm9vdEpzb25PYmogOiBzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgbW9kdWxlOiAnTm9kZU5leHQnLFxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZU5leHQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBpZiAob2xkU2V0dGluZ3MuZXh0ZW5kcyA9PT0gJy4vbm9kZV9tb2R1bGVzL0B3aWxsYm9vc3Rlci90c2NvbmZpZy90c2NvbmZpZy5qc29uJykge1xuICAgICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IG1vZGlmeSBcInRhcmdldFwiLCBcIm1vZHVsZVwiIGFuZCBcIm1vZHVsZVJlc29sdXRpb25cIi5cbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnRhcmdldDtcbiAgICAgIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5tb2R1bGU7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZVJlc29sdXRpb247XG4gICAgICB9XG4gICAgICBpZiAob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgfVxuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fJylcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgICB9XG4gICAgICAvLyBMTE3jgavjgojjgot2aWJlIGNvZGluZ+OBp+OBr+OAgeiHquWLleODleOCqeODvOODnuODg+ODiOOChOOCs+ODvOODieOCouOCr+OCt+ODp+ODs+OCkueEoeWKueWMluOBmeOCi+OBk+OBqOOBp1xuICAgICAgLy8g55Sf5oiQ44GV44KM44Gf44Kz44O844OJ44Gu5YWD44Gu5b2i5byP44KS57at5oyB44Gn44GN44KLXG4gICAgICBpZiAoJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIGlmICgnZWRpdG9yLmZvcm1hdE9uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuZm9ybWF0T25TYXZlJ107XG4gICAgICB9XG4gICAgICBzb3J0S2V5cygoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID8/IHt9KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvbjogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIGpvYnM6IHsgW2tleTogc3RyaW5nXTogSm9iIH07XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICBpc3N1ZXM/OiBUeXBlcztcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3Q7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcztcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICB1c2VzOiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICAncGF0aHMtaWdub3JlJzogWycqKi5tZCcsICcqKi9kb2NzLyoqJ10sXG4gICAgICB9LFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJywgJ3diZnknXSxcbiAgICAgICAgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHdiZnk6IHtcbiAgICBuYW1lOiAnV2lsbGJvb3N0ZXJpZnknLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHdiZnk6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy93YmZ5LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3diZnktbWVyZ2UnOiB7XG4gICAgbmFtZTogJ01lcmdlIHdiZnknLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICd3YmZ5LW1lcmdlJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3diZnktbWVyZ2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxuICAnbm90aWZ5LXJlYWR5Jzoge1xuICAgIG5hbWU6ICdOb3RpZnkgcmVhZHknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdub3RpZnktcmVhZHknOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvbm90aWZ5LXJlYWR5LnltbEBtYWluJyxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIERJU0NPUkRfV0VCSE9PS19VUkw6ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUFEWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2FkZC1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgIG5hbWU6ICdBZGQgaXNzdWUgdG8gR2l0SHViIHByb2plY3QnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdhZGQtaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hZGQtaXNzdWUtdG8tcHJvamVjdC55bWxAbWFpbicsXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBHSF9QUk9KRUNUX1VSTDogJyR7eyBzZWNyZXRzLkdIX1BST0pFQ1RfVVJMIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgIG5hbWU6ICdBZGQgcmVhZHkgaXNzdWUgdG8gR2l0SHViIHByb2plY3QnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hZGQtaXNzdWUtdG8tcHJvamVjdC55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICBsYWJlbGVkOiAncmVhZHkgOnJvY2tldDonLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0hfUFJPSkVDVF9VUkw6ICdodHRwczovL2dpdGh1Yi5jb20vb3Jncy9XaWxsQm9vc3RlckxhYi9wcm9qZWN0cy81JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZpZyBvZiBzZW1hbnRpYyBwdWxsIHJlcXVlc3RcbiAgICBjb25zdCBzZW1hbnRpY1ltbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICdzZW1hbnRpYy55bWwnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oc2VtYW50aWNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGZpbGVOYW1lU2V0ID0gbmV3IFNldChbXG4gICAgICAndGVzdC55bWwnLFxuICAgICAgJ3diZnkueW1sJyxcbiAgICAgICd3YmZ5LW1lcmdlLnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAnYWRkLWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAgIC4uLmVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuaXNQdWJsaWNSZXBvIHx8IHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0LnltbCcpO1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdub3RpZnktcmVhZHkueW1sJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZVNldCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBjb25zdCBraW5kID0gcGF0aC5iYXNlbmFtZShmaWxlTmFtZSwgJy55bWwnKSBhcyBLbm93bktpbmQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCkpO1xuICAgIH1cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnYWRkLWZvY3VzZWQtaXNzdWUtdG8tcHJvamVjdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKHdvcmtmbG93c1traW5kIGFzIGtleW9mIHR5cGVvZiB3b3JrZmxvd3NdID8/IHt9KSBhcyBXb3JrZmxvdztcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIGlmIChuZXdTZXR0aW5ncy5qb2JzKSB7XG4gICAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgfVxuICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPSBbXG4gICAgICAgIC4uLm5ldyBTZXQoWycqKi5tZCcsICcqKi9kb2NzLyoqJywgLi4uKG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID8/IFtdKV0pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcz8uKCcvcmV1c2FibGUtd29ya2Zsb3dzLycpKSByZXR1cm47XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICB9XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5Jzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uKSBzZXRTY2hlZHVsZShuZXdTZXR0aW5ncywgMjAsIDI0KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5LW1lcmdlJzoge1xuICAgICAgc2V0U2NoZWR1bGUobmV3U2V0dGluZ3MsIDEsIDQpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3MpO1xuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzZW1hbnRpYy1yZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jIHx8ICFuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCB8fD0ge307XG4gIGpvYi5zZWNyZXRzIHx8PSB7fTtcblxuICBpZiAoXG4gICAga2luZCA9PT0gJ3Rlc3QnIHx8XG4gICAga2luZCA9PT0gJ3JlbGVhc2UnIHx8XG4gICAga2luZCA9PT0gJ3diZnknIHx8XG4gICAga2luZCA9PT0gJ3diZnktbWVyZ2UnIHx8XG4gICAga2luZCA9PT0gJ2FkZC1pc3N1ZS10by1wcm9qZWN0JyB8fFxuICAgIGtpbmQgPT09ICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCdcbiAgKSB7XG4gICAgam9iLnNlY3JldHNbJ0dIX1RPS0VOJ10gPSBjb25maWcuaXNQdWJsaWNSZXBvID8gJyR7eyBzZWNyZXRzLlBVQkxJQ19HSF9CT1RfUEFUIH19JyA6ICcke3sgc2VjcmV0cy5HSF9CT1RfUEFUIH19JztcbiAgfVxuICBpZiAoY29uZmlnLnJlbGVhc2UubnBtICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnKSkge1xuICAgIGpvYi5zZWNyZXRzWydOUE1fVE9LRU4nXSA9ICcke3sgc2VjcmV0cy5OUE1fVE9LRU4gfX0nO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0c1snRklSRUJBU0VfVE9LRU4nXSkge1xuICAgIGpvYi5zZWNyZXRzWydHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFJ10gPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzWydGSVJFQkFTRV9UT0tFTiddO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHNbJ0RJU0NPUkRfV0VCSE9PS19VUkwnXSAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzWydESVNDT1JEX1dFQkhPT0tfVVJMJ10gPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGg/LnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IHBhcmFtcy5yZXBsYWNlKCdzeW5jICcsICcnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXMucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzLnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGhbJ2RvdF9lbnZfcGF0aCddID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGhbJ2RvdF9lbnZfcGF0aCddO1xuICB9XG4gIC8vIFJlbW92ZSBkZXByZWNhdGVkIHBhcmFtZXRlcnNcbiAgbWlncmF0ZUpvYihqb2IpO1xuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0c1snRkxZX0FQSV9UT0tFTiddICYmIHR5cGVvZiBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXSA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXSA9IGpvYi53aXRoWydkZXBsb3lfY29tbWFuZCddLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNEb2NrZXJmaWxlKSB7XG4gICAgaWYgKGpvYi53aXRoWydjaV9zaXplJ10gIT09ICdleHRyYS1sYXJnZScgJiYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgfHwga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpKSB7XG4gICAgICBqb2Iud2l0aFsnY2lfc2l6ZSddID0gJ2xhcmdlJztcbiAgICB9XG4gICAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICAgIGpvYi53aXRoWydjcHVfYXJjaCddID0gJ1g2NCc7XG4gICAgfVxuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQgPT09ICd3YmZ5JyB8fCBraW5kID09PSAnd2JmeS1tZXJnZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aFsnZ2l0aHViX2hvc3RlZF9ydW5uZXInXSA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aFsnZ2l0aHViX2hvc3RlZF9ydW5uZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi5zZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gTW92ZSBzZWNyZXRzIHByb3AgYWZ0ZXIgd2l0aCBwcm9wXG4gICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKGpvYi5zZWNyZXRzKTtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRTY2hlZHVsZShuZXdTZXR0aW5nczogV29ya2Zsb3csIGluY2x1c2l2ZU1pbkhvdXJKc3Q6IG51bWJlciwgZXhjbHVzaXZlTWF4SG91ckpzdDogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IFttaW51dGVVdGMsIGhvdXJVdGNdID0gKChuZXdTZXR0aW5ncy5vbi5zY2hlZHVsZT8uWzBdPy5jcm9uIGFzIHN0cmluZykgfHwgJycpLnNwbGl0KCcgJykubWFwKE51bWJlcik7XG4gIGlmIChtaW51dGVVdGMgIT09IDAgJiYgTnVtYmVyLmlzSW50ZWdlcihob3VyVXRjKSkge1xuICAgIGNvbnN0IGhvdXJKc3QgPSAoaG91clV0YyArIDkpICUgMjQ7XG4gICAgY29uc3QgaW5SYW5nZSA9XG4gICAgICBpbmNsdXNpdmVNaW5Ib3VySnN0IDwgZXhjbHVzaXZlTWF4SG91ckpzdFxuICAgICAgICA/IGluY2x1c2l2ZU1pbkhvdXJKc3QgPD0gaG91ckpzdCAmJiBob3VySnN0IDwgZXhjbHVzaXZlTWF4SG91ckpzdFxuICAgICAgICA6IGluY2x1c2l2ZU1pbkhvdXJKc3QgPD0gaG91ckpzdCB8fCBob3VySnN0IDwgZXhjbHVzaXZlTWF4SG91ckpzdDtcbiAgICBpZiAoaW5SYW5nZSkgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbWluSnN0ID0gMSArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDU5KTtcbiAgY29uc3QgaG91ckpzdCA9IGluY2x1c2l2ZU1pbkhvdXJKc3QgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoZXhjbHVzaXZlTWF4SG91ckpzdCAtIGluY2x1c2l2ZU1pbkhvdXJKc3QpKTtcbiAgY29uc3QgY3JvbiA9IGAke21pbkpzdH0gJHsoaG91ckpzdCAtIDkgKyAyNCkgJSAyNH0gKiAqICpgO1xuICBuZXdTZXR0aW5ncy5vbi5zY2hlZHVsZSA9IFt7IGNyb24gfV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeWFtbFRleHQgPSB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHtcbiAgICBsaW5lV2lkdGg6IC0xLFxuICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICBzdHlsZXM6IHtcbiAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgIH0sXG4gIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gbWlncmF0ZVdvcmtmbG93KG5ld1NldHRpbmdzOiBXb3JrZmxvdyk6IHZvaWQge1xuICAvLyBUT0RPOiBSZW1vdmUgdGhlbSBhZnRlciAyMDIzLTAzLTMxXG4gIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzWydhZGQtdG8tcHJvamVjdCddO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlSm9iKGpvYjogSm9iKTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgaWYgKCFqb2Iud2l0aCkgcmV0dXJuO1xuICBkZWxldGUgam9iLndpdGhbJ25vbl9zZWxmX2hvc3RlZCddO1xuICBkZWxldGUgam9iLndpdGhbJ25vdGlmeV9kaXNjb3JkJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsncmVxdWlyZV9mbHknXTtcbiAgZGVsZXRlIGpvYi53aXRoWydyZXF1aXJlX2djbG91ZCddO1xuICBkZWxldGUgam9iLndpdGhbJ2NwdV9hcmNoJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbGFiZWwnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydsYWJlbE9wZXJhdG9yJ107XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW50ZXJmYWNlIFNldHRpbmdzIGV4dGVuZHMgUGFydGlhbDxDb25maWd1cmF0aW9uVmFsdWVNYXA+IHtcbiAgZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4OiBzdHJpbmc7XG4gIG5tTW9kZTogc3RyaW5nO1xuICBub2RlTGlua2VyOiBzdHJpbmc7XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbn1cblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgneWFybicsIFsnLS12ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0VmVyc2lvbignQHlhcm5wa2cvY2xpJywgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmIChnZXRNYWpvck51bWJlcihjdXJyZW50VmVyc2lvbikgPD0gZ2V0TWFqb3JOdW1iZXIobGF0ZXN0VmVyc2lvbikgJiYgY3VycmVudFZlcnNpb24gIT09IGxhdGVzdFZlcnNpb24pIHtcbiAgICAgIHNwYXduU3luYygneWFybicsIFsnc2V0JywgJ3ZlcnNpb24nLCBsYXRlc3RWZXJzaW9uXSwgY29uZmlnLmRpclBhdGgsIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3JlbGVhc2VzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocmVsZWFzZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihyZWxlYXNlc1BhdGgpKSB7XG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCd5YXJuLScpICYmICFmaWxlLnN0YXJ0c1dpdGgoYHlhcm4tJHtsYXRlc3RWZXJzaW9ufS5gKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZWQnLCBwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFybnJjUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHlhbWwubG9hZChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh5YXJucmNZbWxQYXRoLCAndXRmOCcpKSBhcyBTZXR0aW5ncztcbiAgICBzZXR0aW5ncy5kZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXggPSAnJztcbiAgICBzZXR0aW5ncy5ub2RlTGlua2VyID0gJ25vZGUtbW9kdWxlcyc7XG4gICAgc2V0dGluZ3Mubm1Nb2RlID0gJ2hhcmRsaW5rcy1nbG9iYWwnO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb25zSnNvbiA9IHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoJ25wbScsIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndmVyc2lvbnMnLCAnLS1qc29uJ10sIGRpclBhdGgpO1xuICBjb25zdCB2ZXJzaW9ucyA9IEpTT04ucGFyc2UodmVyc2lvbnNKc29uKSBhcyBzdHJpbmdbXTtcbiAgcmV0dXJuIHZlcnNpb25zLmF0KC0xKSBhcyBzdHJpbmc7XG59XG5mdW5jdGlvbiBnZXRNYWpvck51bWJlcih2ZXJzaW9uOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBbbWFqb3JdID0gdmVyc2lvbi5zcGxpdCgnLicpO1xuICByZXR1cm4gTnVtYmVyKG1ham9yKTtcbn1cbiIsImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuLCBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKSByZXR1cm47XG5cbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2QxOiB4LWVhc3kgOmhlZGdlaG9nOicsICdFREU5RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkMjogZWFzeSA6cmFiYml0MjonLCAnRERENkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDM6IG1lZGl1bSA6b3g6JywgJ0M0QjVGRCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2Q0OiBoYXJkIDpzcXVpZDonLCAnQTc4QkZBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDU6IHgtaGFyZCA6d2hhbGUyOicsICc4QjVDRjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwMTogY3JpdGljYWwgOmZpcmU6OmZpcmU6OmZpcmU6JywgJ0VGNDQ0NCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3AyOiB1cmdlbnQgOmZpcmU6OmZpcmU6JywgJ0Y4NzE3MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3AzOiBpbXBvcnRhbnQgOmZpcmU6JywgJ0ZDQTVBNScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3A0OiBuaWNlIHRvIGhhdmUgOmRyb3BsZXQ6JywgJ0ZFQ0FDQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IGJsaXR6JywgJzUzMDBiYycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IGZpcmViYXNlJywgJ2ZmY2EyOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHByaXNtYScsICcwYzM0NGInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiByZWFjdCcsICc2MWRhZmInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBzdmVsdGUnLCAnZmYzZTAwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdyZWFkeScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3JlbGVhc2VkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC14L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCBzb2RpdW0gZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4sIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgZGVwcmVjYXRlZFNlY3JldE5hbWVzID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJ107XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4gfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoKS5wYXJzZWQgfHwge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIGRlcHJlY2F0ZWRTZWNyZXROYW1lcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvICYmIG5hbWUgPT09ICdQVUJMSUNfR0hfQk9UX1BBVCcpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgIH0sXG4gICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuIO+8iOOBk+OBruODmuODvOOCuOOBpyBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIOOBjOihqOekuuOBleOCjOOBpuOBhOOCi+OBk+OBqOOCkueiuuiqjeOBl+OBn+OAgu+8iVxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gICAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBBbGwgdGVzdHMgYXJlIHBhc3NlZC5cbiAgICAtIFRlc3QgY29tbWFuZCAoZS5nLiwgXFxgeWFybiB0ZXN0XFxgKSBpcyBwYXNzZWQuXG4gICAgLSBMaW50IGNvbW1hbmQgKGUuZy4sIFxcYHlhcm4gbGludFxcYCkgaXMgcGFzc2VkLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIEdpdEh1YiBQUidzIGRpZmYgdmlldy4g77yIR2l0SHVi5LiK44Gn6Ieq5YiG44Gu5aSJ5pu05YaF5a6544KS56K66KqN44GX44Gf44CC77yJXG4tIFsgXSBJJ3ZlIHdyaXR0ZW4gdGhlIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLiDvvIjjg4bjgrnjg4jmiYvpoIbjgpLoqJjovInjgZfjgZ/jgILvvIlcbi0gWyBdIEkndmUgYWRkZWQgc2NyZWVuc2hvdHMuIO+8iFVJ44KS5aSJ5pu044GX44Gf5aC05ZCI44CB44K544Kv44Oq44O844Oz44K344On44OD44OI44KS6L+95Yqg44GX44Gf44CC77yJXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5cbjwhLS0g5pel5pys6Kqe44Gn6KiY6L+w44GX44Gm44KC5aSn5LiI5aSr44Gn44GZ44CCIC0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBuZXdDb250ZW50KSA+IG5ld0NvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdpdEh1YlV0aWwsIG9jdG9raXQgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgaXNCdW46IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1N1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1BhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1B1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcblxuICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGVzbGludEJhc2U/OiBFc2xpbnRFeHRlbnNpb25CYXNlO1xuICB2ZXJzaW9uc1RleHQ/OiBzdHJpbmc7XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VDb25maWcoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdENvbmZpZz86IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluc1BhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcGx1Z2lucz86IHN0cmluZ1tdW107XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzIHx8IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgfHwgW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IHZlcnNpb25zVGV4dCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgJ3V0ZjgnKTtcbiAgICAgIHZlcnNpb25zVGV4dCArPSBjb250ZW50LnRyaW0oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJlZml4LCBuYW1lXSBvZiBbXG4gICAgICBbJ2phdmEnLCAnamF2YSddLFxuICAgICAgWydub2RlJywgJ25vZGVqcyddLFxuICAgICAgWydweXRob24nLCAncHl0aG9uJ10sXG4gICAgXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgbm9kZVZlcnNpb25Db250ZW50ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCksICd1dGY4Jyk7XG4gICAgICAgIGlmICh2ZXJzaW9uc1RleHQpIHtcbiAgICAgICAgICB2ZXJzaW9uc1RleHQgKz0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgdmVyc2lvbnNUZXh0ICs9IG5hbWUgKyAnICcgKyBub2RlVmVyc2lvbkNvbnRlbnQudHJpbSgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIFJlYWQgd2JmeS5qc29uXG4gICAgY29uc3Qgd2JmeUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YmZ5Lmpzb24nKTtcbiAgICBsZXQgd2JmeUpzb246IFdiZnlKc29uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3YmZ5SnNvblRleHQgPSBhd2FpdCBmc3AucmVhZEZpbGUod2JmeUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgd2JmeUpzb24gPSB3YmZ5SnNvblNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHdiZnlKc29uVGV4dCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5OiByZXBvSW5mbz8uZnVsbF9uYW1lID8gYGdpdGh1Yjoke3JlcG9JbmZvLmZ1bGxfbmFtZSBhcyBzdHJpbmd9YCA6IHVuZGVmaW5lZCxcbiAgICAgIGlzQnVuOiByb290Q29uZmlnPy5pc0J1biB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuZmlnLnRvbWwnKSksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogcGFja2FnZUpzb25QYXRoLmluY2x1ZGVzKGAke3BhdGguc2VwfXdpbGxib29zdGVyLWNvbmZpZ3NgKSxcbiAgICAgIGRvZXNDb250YWluc1N1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNHZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluc0dvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUGFja2FnZUpzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbnNQb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpbnNQb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0c30vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLFxuICAgICAgICBkaXJQYXRoXG4gICAgICApLFxuICAgICAgZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3RzfS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXNbJ2JsaXR6J10sXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIG5leHQ6ICEhZGVwZW5kZW5jaWVzWyduZXh0J10sXG4gICAgICAgIHBsYXl3cmlnaHRUZXN0OlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ3BsYXl3cmlnaHQnXSxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llc1sncHJpc21hJ10sXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzWydweXJpZ2h0J10sXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSxcbiAgICAgIH0sXG4gICAgICB2ZXJzaW9uc1RleHQsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGNvbmZpZy5lc2xpbnRCYXNlID0gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWcpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc0dvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWxcbiAgICApIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KS5sZW5ndGggPiAwO1xufVxuXG5leHBvcnQgdHlwZSBFc2xpbnRFeHRlbnNpb25CYXNlID1cbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuXG5mdW5jdGlvbiBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IEVzbGludEV4dGVuc2lvbkJhc2UgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JztcbiAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCkge1xuICAgIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3ggPyAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnIDogJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJztcbiAgfSBlbHNlIHtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJztcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcz8uZmV0Y2ggPz8gb3JpZ2luPy5yZWZzPy5wdXNoO1xuICBpZiAodHlwZW9mIHJlbW90ZVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICBjb25zdCByZXQgPSB7IGZ1bGxfbmFtZTogYCR7b3JnfS8ke25hbWV9YCB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihyZXQsIHJlc3BvbnNlLmRhdGEpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhEb2NrZXJmaWxlIH0gZnJvbSAnLi9maXhlcnMvZG9ja2VyZmlsZS5qcyc7XG5pbXBvcnQgeyBmaXhQbGF5d3JpZ2h0Q29uZmlnIH0gZnJvbSAnLi9maXhlcnMvcGxheXdyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQcmlzbWFFbnZGaWxlcyB9IGZyb20gJy4vZml4ZXJzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9maXhlcnMvdGVzdERpcmVjdG9yeS5qcyc7XG5pbXBvcnQgeyBmaXhUeXBlRGVmaW5pdGlvbnMgfSBmcm9tICcuL2ZpeGVycy90eXBlRGVmaW5pdGlvbi5qcyc7XG5pbXBvcnQgeyBmaXhUeXBvcyB9IGZyb20gJy4vZml4ZXJzL3R5cG9zLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVG9vbFZlcnNpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FzZGYuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCaW9tZUpzb25jIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2Jpb21lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQnVuZmlnVG9tbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVzbGludHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VzbGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9odXNreXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMaW50c3RhZ2VkcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbmV4dGNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Y29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCB0b29scyB2aWEgYXNkZiBhdCBmaXJzdFxuICAgIGF3YWl0IGdlbmVyYXRlVG9vbFZlcnNpb25zKHJvb3RDb25maWcpO1xuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeERvY2tlcmZpbGUocm9vdENvbmZpZyksXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihyb290Q29uZmlnLmlzQnVuXG4gICAgICAgID8gW1xuICAgICAgICAgICAgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpLFxuICAgICAgICAgICAgZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKS50aGVuKCgpID0+IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpKSxcbiAgICAgICAgICBdXG4gICAgICAgIDogW2dlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZyldKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBhcmd2LnNraXBEZXBzKTtcblxuICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWcpKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlc1xuICAgICAgKSB7XG4gICAgICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUVzbGludHJjKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgICAvLyAneWFybiBpbnN0YWxsJyBzaG91bGQgYmUgYWZ0ZXIgYHlhcm4gY2xlYW51cGAgYmVjYXVzZSB5YXJuIGJlcnJ5IGdlbmVyYXRlcyB5YXJuLmxvY2tcbiAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb250ZW50cyBvZiBkZXBlbmRhbnQgc3ViLXBhY2thZ2UgaW4gbW9ub3JlcG9cbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3VwZGF0ZSddLCByb290RGlyUGF0aCk7XG4gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGFmdGVyIHRoZXJlIGlzIG5vIGJ1bi5sb2NrYlxuICAgICAgY29uc3QgYnVuTG9ja2JQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnYnVuLmxvY2tiJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhidW5Mb2NrYlBhdGgpKSB7XG4gICAgICAgIHZvaWQgZnMucHJvbWlzZXMucm0oYnVuTG9ja2JQYXRoKTtcbiAgICAgICAgc3Bhd25TeW5jKFxuICAgICAgICAgIHBhY2thZ2VNYW5hZ2VyLFxuICAgICAgICAgIFsnaW5zdGFsbCcsICctLXNhdmUtdGV4dC1sb2NrZmlsZScsICctLWZyb3plbi1sb2NrZmlsZScsICctLWxvY2tmaWxlLW9ubHknXSxcbiAgICAgICAgICByb290RGlyUGF0aFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJvcHRpb25zIiwiY29uc3RydWN0b3IiLCJ0aGlzIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsImVycm9yIiwiRXJyb3IiLCJzdGFjayIsIlN0cmluZyIsImFzeW5jIiwiZml4RG9ja2VyZmlsZSIsImNvbmZpZyIsImRvZXNDb250YWluc0RvY2tlcmZpbGUiLCJvbGRDb250ZW50IiwiZG9ja2VyZmlsZSIsIm5ld0NvbnRlbnQiLCJmcyIsIndyaXRlRmlsZSIsInBhdGgiLCJqb2luIiwiZGlyUGF0aCIsImZpeFBsYXl3cmlnaHRDb25maWciLCJmaWxlUGF0aCIsImV4aXN0c1N5bmMiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwicmVwbGFjZSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsImVudkZpbGVQYXRoIiwicmVzb2x2ZSIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwib2xkVGVzdERpclBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm5ld1Rlc3REaXJQYXRoIiwicmVuYW1lIiwicmVwbGFjZUFsbCIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zIiwidW5kZWZpbmVkIiwiZGlyZW50cyIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJkaXJlbnQiLCJkaXJOYW1lIiwic2xpY2UiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaW5jbHVkZXMiLCJoYXNMaWJyYXJ5Iiwic29tZSIsInBhY2thZ2VKc29uIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiaXNGaWxlIiwibWtkaXIiLCJydW4iLCJyZWN1cnNpdmUiLCJpc0RpcmVjdG9yeSIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZzcCIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsImxlbmd0aCIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwidGV4dEJhc2VkRmlsZXMiLCJmaWxlIiwicHJvbWlzZUFsbCIsInByb3BOYW1lIiwiYmVmb3JlIiwiYWZ0ZXIiLCJPYmplY3QiLCJlbnRyaWVzIiwid2JmeUpzb24iLCJ0eXBvcyIsInRva2VuIiwicHJvY2VzcyIsImVudiIsIkdIX0JPVF9QQVQiLCJQVUJMSUNfR0hfQk9UX1BBVCIsIkdIX1RPS0VOIiwiR0lUSFVCX1RPS0VOIiwiaGFzR2l0SHViVG9rZW4iLCJvY3Rva2l0IiwiT2N0b2tpdCIsImF1dGgiLCJnaXRIdWJVdGlsIiwiZ2V0T3JnQW5kTmFtZSIsInVybE9yRnVsbE5hbWUiLCJ1cmxXaXRob3V0UHJvdG9jb2wiLCJzcGxpdCIsImF0IiwibmFtZXMiLCJzcGF3blN5bmMiLCJjb21tYW5kIiwiYXJncyIsInJldHJ5IiwibmV3Q21kIiwibmV3QXJncyIsImdldFNwYXduU3luY0FyZ3MiLCJjaGlsZF9wcm9jZXNzIiwic3RhdHVzIiwic3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCIsInN0ZGlvIiwicHJvYyIsInN0ZGVyciIsInRvU3RyaW5nIiwidHJpbSIsInMiLCJzdGRvdXQiLCJQQVRIIiwiQkVSUllfQklOX0ZPTERFUiIsIkFTREZfRElSIiwic2hlbGwiLCJjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIiLCJ2ZXJzaW9uIiwibnVtYmVycyIsIk51bWJlciIsImZpbHRlciIsIm51bSIsImlzTmFOIiwidmVyc2lvbk51bWJlciIsImRpdmlzb3IiLCJQWVRIT05fVkVSU0lPTiIsIkpBVkFfVkVSU0lPTiIsIkJMSVRaX1ZFUlNJT04iLCJORVhUX1ZFUlNJT04iLCJnZW5lcmF0ZVRvb2xWZXJzaW9ucyIsInZlcnNpb25zVGV4dCIsImR1cGxpY2F0YWJsZUxpbmVzIiwibGluZSIsIkNPUkVfVE9PTFMiLCJoYXMiLCJzb3J0Iiwic3RhcnRzV2l0aCIsImxpbmVzIiwiU2V0IiwiZG9lc0NvbnRhaW5zUG9ldHJ5TG9jayIsInJlc3BvbnNlIiwiZmV0Y2giLCJqc29uIiwicG9ldHJ5VmVyc2lvbiIsInVwZGF0ZVZlcnNpb24iLCJkZXBlbmRpbmciLCJmaXJlYmFzZSIsImRvZXNDb250YWluc1BhY2thZ2VKc29uIiwiaXNCdW4iLCJidW5WZXJzaW9uIiwib3JnYW5pemF0aW9uIiwicmVwb3NpdG9yeSIsInJlcXVlc3QiLCJvd25lciIsInJlcG8iLCJkYXRhIiwidGFnX25hbWUiLCJpbmRleCIsImxhc3RJbmRleE9mIiwidmVyc2lvbk51bWJlclRleHQiLCJ0ZXN0IiwiZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1YiIsInByZWZpeCIsIkRFUFJFQ0FURURfVkVSU0lPTl9QUkVGSVhFUyIsInZlcnNpb25QYXRoIiwicm0iLCJmb3JjZSIsInRvb2xWZXJzaW9uc1BhdGgiLCJjb3JlIiwidG9vbE5hbWUiLCJuZXdWZXJzaW9uIiwiaGVhZCIsImZpbmRJbmRleCIsImwiLCJuZXdMaW5lIiwic3BsaWNlIiwib3ZlcndyaXRlTWVyZ2UiLCJkZXN0aW5hdGlvbkFycmF5Iiwic291cmNlQXJyYXkiLCJjb21iaW5lTWVyZ2UiLCJ0YXJnZXQiLCJzb3VyY2UiLCJkZXN0aW5hdGlvbiIsIml0ZW0iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwibWVyZ2UiLCJwdXNoIiwianNvbk9iaiIsIiRzY2hlbWEiLCJleHRlbmRzIiwiZ2VuZXJhdGVCaW9tZUpzb25jIiwibmV3U2V0dGluZ3MiLCJjbG9uZURlZXAiLCJvbGRTZXR0aW5ncyIsIkpTT04iLCJwYXJzZSIsImFycmF5TWVyZ2UiLCJzdHJpbmdpZnkiLCJnZW5lcmF0ZUJ1bmZpZ1RvbWwiLCJyZWFkRmlsZVN5bmMiLCJ1c2VyQ29udGVudEhlYWRlciIsInVzZXJDb250ZW50SGVhZGVyUmVnZXgiLCJzZXBhcmF0b3IiLCJkZWZhdWx0SGVhZFVzZXJDb250ZW50IiwiZGVmYXVsdFRhaWxVc2VyQ29udGVudCIsImlnbm9yZUZpbGVVdGlsIiwic2VwYXJhdG9yUHJlZml4IiwicmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzIiwibGFzdEhlYWRlckluZGV4IiwiZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlciIsImdldEhlYWRVc2VyQ29udGVudCIsImluZGV4T2YiLCJnZXRUYWlsVXNlckNvbnRlbnQiLCJpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkIiwibGFzdEluZGV4IiwiZ2VuZXJhdGVEb2NrZXJpZ25vcmUiLCJleHRlbnNpb25zIiwiY29kZVdpdGgySW5kZW50U2l6ZSIsImNvZGVXaXRoNEluZGVudFNpemUiLCJtYXJrZG93bkxpa2UiLCJlc2xpbnQiLCJwcmV0dGllciIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImdlbmVyYXRlRWRpdG9yY29uZmlnIiwiZ2VuZXJhdGVFc2xpbnRyYyIsImVzbGludEJhc2UiLCJleHQiLCJnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMiLCJkZWZhdWx0TmFtZXMiLCJnZW5lcmF0ZUdpdGlnbm9yZSIsInJvb3RDb25maWciLCJoZWFkVXNlckNvbnRlbnQiLCJ0YWlsVXNlckNvbnRlbnQiLCJkb2VzQ29udGFpbnNHZW1maWxlIiwiZG9lc0NvbnRhaW5zR29Nb2QiLCJiYXNlbmFtZSIsImRvZXNDb250YWluc1BvbVhtbCIsImRvZXNDb250YWluc1B1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sIiwiYmxpdHoiLCJuZXh0IiwicHJpc21hIiwicGxheXdyaWdodFRlc3QiLCJyZWFjdE5hdGl2ZSIsInN0b3J5Ym9vayIsImxpdGVzdHJlYW0iLCJnZW5lcmF0ZWQiLCJyZWFkQ2FjaGUiLCJ1cmwiLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwic3RhdCIsIkRhdGUiLCJub3ciLCJtdGltZU1zIiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsImNvbW1pdHMiLCJwZXJfcGFnZSIsInNoYSIsIkVzbGludFV0aWwiLCJnZXRMaW50Rml4U3VmZml4IiwiZG9lc0NvbnRhaW5zSnN4T3JUc3giLCJqc0NvbW1vbkRlcHMiLCJ0c0NvbW1vbkRlcHMiLCJyZWFjdENvbW1vbkRlcHMiLCJlc2xpbnREZXBzIiwiZ2VuZXJhdGVQYWNrYWdlSnNvbiIsInNraXBBZGRpbmdEZXBzIiwianNvblRleHQiLCJzY3JpcHRzIiwicGVlckRlcGVuZGVuY2llcyIsImF1dGhvciIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwiZGVwcyIsInZhbHVlcyIsImRlcCIsInJlbW92ZURlcHJlY2F0ZWRTdHVmZiIsImtleSIsInZhbHVlIiwiZ2VuZXJhdGVTY3JpcHRzIiwicHJldHRpZnkiLCJleGlzdGluZ0NvbnRlbnQiLCJvcmlnaW5hbENvbnRlbnQiLCJnZW5lcmF0ZVByZXR0aWVyU3VmZml4IiwicG9ldHJ5RGV2RGVwZW5kZW5jaWVzIiwicHJlcGFyZSIsInBvc3RpbnN0YWxsIiwiaXNQdWJsaWNSZXBvIiwiaXNSZWZlcnJlZEJ5T3RoZXJSZXBvIiwicHJlcGFjayIsInBvc3RwYWNrIiwic2VtYW50aWNSZWxlYXNlIiwid29ya3NwYWNlcyIsIkFycmF5IiwiaXNBcnJheSIsIndvcmtzcGFjZSIsImdsb2JTeW5jIiwid2IiLCJkb2VzQ29udGFpbnNKYXZhU2NyaXB0IiwiZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpbnNUeXBlU2NyaXB0IiwiZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMiLCJwcml2YXRlIiwibGljZW5zZSIsInB1Ymxpc2hDb25maWciLCJhY2Nlc3MiLCJtYWluIiwicmVzb2x1dGlvbnMiLCJsaW50IiwiY2xlYW51cCIsImRpcnMiLCJkaXIiLCJmb3JtYXQiLCJweXRob25GaWxlcyIsImRpck5hbWVTZXQiLCJweXRob25GaWxlIiwiZmlyc3QiLCJzZWNvbmQiLCJhZGQiLCJzaXplIiwiZGlyTmFtZXNTdHIiLCJkIiwia2V5cyIsInBhY2thZ2VOYW1lcyIsImlzV29ya3NwYWNlUGFja2FnZSIsImNvbW1pdEhhc2giLCJ1cGRhdGVQcml2YXRlUGFja2FnZXMiLCJwYWNrYWdlTWFuYWdlciIsIm5ld0pzb25UZXh0Iiwib2xkQW5kTmV3U2NyaXB0TmFtZXMiLCJvbGROYW1lIiwibmV3TmFtZSIsImZpbGVzIiwiZml4U2NyaXB0TmFtZXMiLCJ0eXBlY2hlY2siLCJvbGRUZXN0IiwicHlyaWdodCIsInByZUNvbW1pdCIsInByZVB1c2giLCJwcmVQdXNoRm9yTGFiIiwicG9zdE1lcmdlIiwiZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbiIsInBhY2thZ2VKc29uUGF0aCIsInByZUNvbW1pdEZpbGVQYXRoIiwibW9kZSIsInBvc3RNZXJnZUNvbW1hbmQiLCJnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIiwicG9zdE1lcmdlQ29tbWFuZHMiLCJyYXciLCJpbnN0YWxsQ29tbWFuZCIsInJtTmV4dERpcmVjdG9yeSIsImNyZWF0ZVRhc2tPcHRpb25zIiwicnVubmVyIiwiZXh0ZW5zaW9uIiwicHJldHRpZXJDb250ZW50IiwiYmlvbWVDb250ZW50IiwiZ2VuZXJhdGVJZGVhU2V0dGluZ3MiLCJjb21tYW5kcyIsImdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIiwieWFtbCIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0NvbXBhdE1vZGUiLCJzdHlsZXMiLCJta2RpclN5bmMiLCJzcmNEaXJlY3RvcmllcyIsIm5vZGUiLCJnZW5lcmF0ZUxpbnRzdGFnZWRyYyIsInBhY2thZ2VQcmVmaXgiLCJnZXRFc2xpbnRLZXkiLCJwYWNrYWdlc0ZpbHRlciIsImdldEVzbGludEZpbHRlckZvclByZXR0aWVyIiwiZ2V0U3JjRGlycyIsImdlbmVyYXRlTmV4dENvbmZpZ0pzb24iLCJmaW5kIiwicCIsIl8iLCJzZXR0aW5nc1RleHQiLCJnZW5lcmF0ZVByZXR0aWVyaWdub3JlIiwiZ2l0aWdub3JlRmlsZVBhdGgiLCJnaXRpZ25vcmVDb250ZW50IiwiYWRkaXRpb25hbENvbnRlbnQiLCJ2ZW52UGF0aCIsInZlbnYiLCJnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIiwiZ2VuZXJhdGVSZWFkbWUiLCJpbnNlcnRCYWRnZSIsImZpbGVOYW1lcyIsInJlYWRkaXJTeW5jIiwiZmlsZU5hbWUiLCJiYWRnZU5hbWUiLCJ0b1VwcGVyQ2FzZSIsImJhZGdlIiwicmVhZG1lIiwiaSIsImdlbmVyYXRlUmVsZWFzZXJjIiwic2V0dGluZ3MiLCJwbHVnaW5zIiwicGx1Z2luIiwib2xkQ29uZmlnIiwicHJlc2V0Iiwic3VjY2Vzc0NvbW1lbnQiLCJmYWlsQ29tbWVudCIsImxhYmVscyIsInJlbGVhc2VkTGFiZWxzIiwiZ2VuZXJhdGVSZW5vdmF0ZUpzb24iLCJwYWNrYWdlUnVsZXMiLCJydWxlIiwibWF0Y2hQYWNrYWdlTmFtZXMiLCJlbmFibGVkIiwic29ydEtleXMiLCJvYmoiLCJrZXlBbmRWYWx1ZXMiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJyb290SnNvbk9iaiIsImNvbXBpbGVyT3B0aW9ucyIsIm1vZHVsZSIsIm1vZHVsZVJlc29sdXRpb24iLCJqc3giLCJhbHdheXNTdHJpY3QiLCJzdHJpY3QiLCJza2lwTGliQ2hlY2siLCJhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzIiwiZXNNb2R1bGVJbnRlcm9wIiwicmVzb2x2ZUpzb25Nb2R1bGUiLCJkZWNsYXJhdGlvbiIsInNvdXJjZU1hcCIsImltcG9ydEhlbHBlcnMiLCJlcmFzYWJsZVN5bnRheE9ubHkiLCJvdXREaXIiLCJ0eXBlUm9vdHMiLCJpbmNsdWRlIiwic3ViSnNvbk9iaiIsImdlbmVyYXRlVHNjb25maWciLCJkb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXMiLCJpc0VzbVBhY2thZ2UiLCJleHBlcmltZW50YWxEZWNvcmF0b3JzIiwiZXhjbHVkZUZpbGVQYXR0ZXJucyIsImdlbmVyYXRlVnNjb2RlU2V0dGluZ3MiLCJleGNsdWRlRmlsZVBhdHRlcm4iLCJleGNsdWRlU2V0dGluZyIsIndvcmtmbG93cyIsIm9uIiwicHVsbF9yZXF1ZXN0IiwiYnJhbmNoZXMiLCJjb25jdXJyZW5jeSIsImdyb3VwIiwiam9icyIsInVzZXMiLCJyZWxlYXNlIiwid2JmeSIsIndvcmtmbG93X2Rpc3BhdGNoIiwicHVsbF9yZXF1ZXN0X3RhcmdldCIsInR5cGVzIiwic3luYyIsImlzc3VlcyIsInNlY3JldHMiLCJESVNDT1JEX1dFQkhPT0tfVVJMIiwiR0hfUFJPSkVDVF9VUkwiLCJ3aXRoIiwibGFiZWxlZCIsImdlbmVyYXRlV29ya2Zsb3dzIiwid29ya2Zsb3dzUGF0aCIsInNlbWFudGljWW1sUGF0aCIsImZpbGVOYW1lU2V0Iiwia2luZCIsIndyaXRlV29ya2Zsb3dZYW1sIiwibG9hZCIsIm1vdmVUb0JvdHRvbSIsImpvYiIsIm5vcm1hbGl6ZUpvYiIsInNjaGVkdWxlIiwiYnJhbmNoIiwic2V0U2NoZWR1bGUiLCJtaWdyYXRlV29ya2Zsb3ciLCJ3cml0ZVlhbWwiLCJwYXJhbXMiLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJucG0iLCJzZXJ2ZXJfdXJsIiwibWlncmF0ZUpvYiIsIm5ld1NlY3JldHMiLCJpbmNsdXNpdmVNaW5Ib3VySnN0IiwiZXhjbHVzaXZlTWF4SG91ckpzdCIsIm1pbnV0ZVV0YyIsImhvdXJVdGMiLCJjcm9uIiwiaXNJbnRlZ2VyIiwiaG91ckpzdCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsInlhbWxUZXh0IiwiZ2VuZXJhdGVZYXJucmNZbWwiLCJ5YXJucmNZbWxQYXRoIiwiY3VycmVudFZlcnNpb24iLCJsYXRlc3RWZXJzaW9uIiwidmVyc2lvbnNKc29uIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldE1ham9yTnVtYmVyIiwicmVsZWFzZXNQYXRoIiwieWFybnJjUGF0aCIsImRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCIsIm5vZGVMaW5rZXIiLCJubU1vZGUiLCJjb21wcmVzc2lvbkxldmVsIiwiaW5qZWN0RW52aXJvbm1lbnRGaWxlcyIsImVuYWJsZUdsb2JhbENhY2hlIiwib3JpZ2luYWxMZW5ndGgiLCJwbHVnaW5QYXRoIiwibWFqb3IiLCJzZXR1cExhYmVscyIsInNldHVwTGFiZWwiLCJkZWxldGVMYWJlbCIsIndhcm4iLCJjb2xvciIsImRlcHJlY2F0ZWRTZWNyZXROYW1lcyIsInNldHVwU2VjcmV0cyIsInBhcnNlZCIsImRvdGVudiIsInNlY3JldE5hbWUiLCJzZWNyZXRfbmFtZSIsImtleV9pZCIsImtleUlkIiwic29kaXVtIiwicmVhZHkiLCJzZWNyZXQiLCJyYXdLZXkiLCJmcm9tX2Jhc2U2NCIsImJhc2U2NF92YXJpYW50cyIsIk9SSUdJTkFMIiwicmF3U2VjIiwiZnJvbV9zdHJpbmciLCJlbmNCeXRlcyIsImNyeXB0b19ib3hfc2VhbCIsImVuY0Jhc2U2NCIsInRvX2Jhc2U2NCIsImVuY3J5cHRlZF92YWx1ZSIsInNldHVwR2l0SHViU2V0dGluZ3MiLCJ3aXRoUmV0cnkiLCJhbGxvd19tZXJnZV9jb21taXQiLCJhbGxvd19zcXVhc2hfbWVyZ2UiLCJhbGxvd19yZWJhc2VfbWVyZ2UiLCJkZWxldGVfYnJhbmNoX29uX21lcmdlIiwic3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZSIsInNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZSIsImhlYWRlcnMiLCJhbGxvd19hdXRvX21lcmdlIiwidGVtcGxhdGVzIiwiZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMiLCJkaXN0YW5jZSIsIndiZnlKc29uU2NoZW1hIiwieiIsIm9iamVjdCIsInJlY29yZCIsInN0cmluZyIsIm9wdGlvbmFsIiwiZG9jIiwidHMiLCJnZXRQYWNrYWdlQ29uZmlnIiwiZXNtUGFja2FnZSIsInBhY2thZ2VKc29uVGV4dCIsInR5cGUiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwiZmxhdCIsInJlcG9JbmZvIiwiZ2l0Iiwic2ltcGxlR2l0Iiwib3JpZ2luIiwiZ2V0UmVtb3RlcyIsInIiLCJyZW1vdGVVcmwiLCJyZWZzIiwicmVxdWVzdFJlcG9JbmZvIiwibWVzc2FnZSIsImZldGNoUmVwb0luZm8iLCJub2RlVmVyc2lvbkNvbnRlbnQiLCJ3YmZ5SnNvblBhdGgiLCJ3YmZ5SnNvblRleHQiLCJmdWxsX25hbWUiLCJzZXAiLCJjb250YWluc0FueSIsImRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbiIsImdpdGh1YiIsImdldEVzbGludEV4dGVuc2lvbkJhc2UiLCJwYXR0ZXJuIiwib3JnIiwicmV0IiwiYXNzaWduIiwiYXJndiIsInlhcmdzIiwicG9zaXRpb25hbCIsImRlc2NyaWJlIiwiYXJyYXkiLCJkZWZhdWx0IiwiZGVzY3JpcHRpb24iLCJhbGlhcyIsInNraXBEZXBzIiwidmVyYm9zZSIsInJvb3REaXJQYXRoIiwicGF0aHMiLCJwYWNrYWdlc0RpclBhdGgiLCJzdWJEaXJQYXRocyIsImlnbm9yZUVycm9yQXN5bmMiLCJhYmJyZXZpYXRpb25Qcm9taXNlIiwic3ViUGFja2FnZUNvbmZpZ3MiLCJzdWJEaXJQYXRoIiwiYWxsUGFja2FnZUNvbmZpZ3MiLCJ0aGVuIiwiYnVuTG9ja2JQYXRoIl0sIm1hcHBpbmdzIjoieW1CQVVPLE1BQU1BLEVBQVUsSUFWdkIsTUFJRUMsV0FBQUEsR0FDRUMsS0FBS0MsV0FBWSxFQUNqQkQsS0FBS0UsbUJBQW9CLENBQzNCLEdDV0ssTUFBTUMsRUFBUyxJQWhCdEIsTUFDRSwrQkFBTUMsQ0FBMEJDLEVBQWNDLEdBQ3hDUixFQUFRRyxXQUNWTSxRQUFRQyxLQUFLLGFBQWFILHFCQUU1QixVQUNRQyxHQUNQLENBQUMsTUFBT0csR0FDUEYsUUFBUUMsS0FBSyxxQkFBcUJILE1BQVNJLGFBQWlCQyxNQUFRRCxFQUFNRSxNQUFRQyxPQUFPSCxNQUMzRixDQUNJWCxFQUFRRyxXQUNWTSxRQUFRQyxLQUFLLGNBQWNILG1CQUUvQixHQ1RLUSxlQUFlQyxFQUFjQyxHQUNsQyxPQUFPWixFQUFPQywwQkFBMEIsaUJBQWlCUyxVQUN2RCxJQUFLRSxFQUFPQyx1QkFBd0IsT0FFcEMsTUFBTUMsRUFBYUYsRUFBT0csV0FDcEJDLEVBQWFGLEVBRWZBLElBQWVFLFNBQ2JDLEVBQUdDLFVBQVVDLEVBQUtDLEtBQUtSLEVBQU9TLFFBQVMsY0FBZUwsRUFBVyxHQUUzRSxDQ1ZPTixlQUFlWSxFQUFvQlYsR0FDeEMsT0FBT1osRUFBT0MsMEJBQTBCLHVCQUF1QlMsVUFDN0QsTUFBTWEsRUFBV0osRUFBS0MsS0FBS1IsRUFBT1MsUUFBUyx3QkFDM0MsSUFBS0osRUFBR08sV0FBV0QsR0FBVyxPQUU5QixNQUFNVCxRQUFtQkcsRUFBR1EsU0FBU0MsU0FBU0gsRUFBVSxRQUVsRFAsRUFBYUYsRUFBV2EsUUFBUSxjQUFlLDhEQUNqRGIsSUFBZUUsU0FFYkMsRUFBR1EsU0FBU1AsVUFBVUssRUFBVVAs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
|
1
|
+
import e from"node:fs";import t from"node:path";import{ignoreEnoentAsync as n,withRetry as s,ignoreErrorAsync as i}from"@willbooster/shared-lib";import o from"yargs";import r from"node:fs/promises";import a from"fast-glob";import{PromisePool as c}from"minimal-promise-pool";import{Octokit as l}from"@octokit/core";import p from"node:child_process";import d from"deepmerge";import u from"lodash.clonedeep";import m from"node:os";import f from"js-yaml";import g from"dotenv";import h from"libsodium-wrappers";import{distance as y}from"fastest-levenshtein";import{simpleGit as w}from"simple-git";import{z as b}from"zod";const v=new class{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const k=new class{async functionIgnoringException(e,t){v.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}v.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function j(e){return k.functionIgnoringException("fixDockerfile",(async()=>{if(!e.doesContainsDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await r.writeFile(t.join(e.dirPath,"Dockerfile"),s)}))}async function x(n){return k.functionIgnoringException("fixPlaywrightConfig",(async()=>{const s=t.join(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),o=i.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");i!==o&&await e.promises.writeFile(s,o)}))}const _=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function P(e){return k.functionIgnoringException("fixPrismaEnvFiles",(async()=>{const n=await a.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:_});for(const s of n){const n=t.resolve(e.dirPath,s),i=(await r.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await r.writeFile(n,i)}}))}async function S(n){return k.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",(async()=>{await Promise.all(n.map((async n=>{const s=t.join(n,"__tests__"),i=t.join(n,"tests");try{await e.promises.rename(s,i);const o=await e.promises.readFile(t.join(n,"package.json"),"utf8"),r=o.replaceAll("__tests__","tests");if(o===r)return;await e.promises.writeFile(t.join(n,"package.json"),r)}catch{}})))}))}const $=new c;async function F(e,s){return k.functionIgnoringException("fixTypeDefinitions",(async()=>{const i=t.resolve(e.dirPath,"@types"),o=e.isRoot&&e.doesContainsSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),a=await n((()=>r.readdir(i,{withFileTypes:!0})));if(a)for(const e of a){const a=e.name.slice(0,-5),c=e.name.endsWith(".d.ts");let l=c?a:e.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some((e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]));e.isFile()&&c?p?(await r.mkdir(t.join(i,a)),await $.run((()=>r.rename(t.join(i,e.name),t.join(i,a,"index.d.ts"))))):o&&(await r.mkdir(o,{recursive:!0}),await $.run((()=>r.rename(t.join(i,e.name),t.join(o,e.name))))):e.isDirectory()&&o&&!p&&(await r.mkdir(o,{recursive:!0}),await $.run((()=>n((()=>r.rename(t.join(i,e.name,"index.d.ts"),t.join(o,`${e.name}.d.ts`)))))))}}))}const C={async readFileIgnoringError(e){try{return await r.readFile(e,"utf8")}catch{}},async generateFile(e,t){await r.writeFile(e,t)}};async function E(n){return k.functionIgnoringException("fixTypos",(async()=>{const s=n.dirPath,i=await a.glob("**/*.md",{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const o of i){const i=t.join(s,o);await $.run((async()=>{const t=await e.promises.readFile(i,"utf8");let s=B(t);s=O(s,n,"doc"),t!==s&&await C.generateFile(i,s)}))}const o=await a.glob(["{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,ignore:_});v.isVerbose&&console.info(`Found ${o.length} TypeScript files in ${s}`);for(const i of o){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=r.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=O(a,n,"ts"),r!==a&&await C.generateFile(o,a)}const r=await a.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${r.length} text-based files in ${s}`);for(const i of r){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=B(r);a=O(a,n,"text"),r!==a&&await C.generateFile(o,a)}await $.promiseAll()}))}function B(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function O(e,t,n){for(const[n,s]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,s);for(const[s,i]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(s,i);return e}const D=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,T=!!D,I=new l({auth:D});const A=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}};function R(e,t,n,s=0){do{const[s,i,o]=L(e,t,n);if(0===p.spawnSync(s,i,o).status)break}while(--s>=0)}function W(e,t,n){const[s,i,o]=L(e,t,n);o.stdio="pipe";const r=p.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map((e=>`"${e}"`)).join(", ")}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function L(e,t,n){const s={...process.env};return s.PATH&&s.BERRY_BIN_FOLDER&&(s.PATH=s.PATH.replace(`${s.BERRY_BIN_FOLDER}:`,"")),s.ASDF_DIR&&(t=["-l","-c",`. ${s.ASDF_DIR}/asdf.sh && ${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:s,shell:!1,stdio:"inherit"}]}function J(e){const t=e.split(/[+.-]/).map(Number).filter((e=>!Number.isNaN(e)));let n=0,s=1;for(const e of t)n+=e*s,s/=1e3;return n}const N="3.9.19",z="zulu-11.74.15",G="2.0.4",U="14.2.5";async function H(n){return k.functionIgnoringException("generateToolVersions",(async()=>{await async function(n){if(!n.versionsText)return;const s=n.versionsText.trim().split("\n").map((e=>{const[t,n]=e.trim().split(/\s+/);return`${M.has(t)?" ":""}${t} ${n}`})).sort().map((e=>e.trim())).filter((e=>!e.startsWith("lefthook"))),i=[...new Set(s)];if(n.doesContainsPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&Y(i,"poetry",n),Y(i,"python",N,!0)}n.depending.firebase&&Y(i,"java",z,!0);if(n.doesContainsPackageJson)if(n.isBun){const e=await async function(e,t){try{const n=(await I.request("GET /repos/{owner}/{repo}/releases/latest",{owner:e,repo:t})).data.tag_name,s=n.lastIndexOf("v"),i=-1===s?n:n.slice(s+1);return/^\d/.test(i)?i:void 0}catch(e){return void console.error("Failed to fetch Bun tags due to:",e)}}("oven-sh","bun");e&&Y(i,"bun",e)}else{const e=W("npm",["show","yarn","version"],n.dirPath);Y(i,"yarn",e)}for(const s of q){const i=t.resolve(n.dirPath,`.${s}-version`);e.promises.rm(i,{force:!0})}const o=t.resolve(n.dirPath,".tool-versions");await(i.length>0?$.run((()=>e.promises.writeFile(o,i.join("\n")+"\n"))):$.run((()=>e.promises.rm(o,{force:!0})))),await $.promiseAll(),R("asdf",["plugin","update","--all"],n.dirPath),R("asdf",["install"],n.dirPath)}(n)}))}const M=new Set(["java","nodejs","bun","python"]),q=["java","node","python"];function Y(e,t,n,s=!1){const i=e.findIndex((e=>e.split(/\s+/)[0]===t)),o=`${t} ${n}`;if(-1===i)e.splice(s?0:e.length,0,o);else{const[,t]=e[i].split(/\s+/);J(n)>J(t)&&(e[i]=o)}}function K(e,t){return t}function V(e,t,n){const s=[...e];for(const[i,o]of t.entries())void 0===s[i]?s[i]=n.cloneUnlessOtherwiseSpecified(o,n):n.isMergeableObject(o)?s[i]=d(e[i],o,n):e.includes(o)||s.push(o);return s}const X={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};async function Q(n){return k.functionIgnoringException("generateBiomeJsonc",(async()=>{let s=u(X);const i=t.resolve(n.dirPath,"biome.jsonc");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:K})}catch{}const o=JSON.stringify(s);await $.run((()=>C.generateFile(i,o)))}))}async function Z(n){return k.functionIgnoringException("generateBunfigToml",(async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)&&e.readFileSync(s,"utf8").includes("exact = false")?"telemetry = false\n\n[install]\nexact = false\n\n[run]\nbun = true\n":"telemetry = false\n\n[install]\nexact = true\n\n[run]\nbun = true\n";await $.run((()=>C.generateFile(s,i)))}))}const ee="# Project-specific settings",te=/# Project-specific settings[^\n]*\n/gm,ne="# Generated by wbfy",se=`${ee} (head)\n\n\n${ne}\n`,ie=`\n${ee} (tail)\n`,oe={separator:ne,separatorPrefix:"# Generated by ",defaultHeadUserContent:se,defaultTailUserContent:ie,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=re(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(te,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return-1!==t?e.slice(0,e.indexOf("\n",t)+1).replaceAll(te,`${ee} (head)\n`):se},getTailUserContent(e){const t=re(e);return t>0?e.slice(t-1):ie},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function re(e){const t=e.indexOf(ee),n=e.lastIndexOf(ee);return n>t?n:-1}async function ae(n){return k.functionIgnoringException("generateDockerignore",(async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainsDockerfile){const e=await C.readFileIgnoringError(s)??"",t=oe.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+oe.getTailUserContent(e);await $.run((()=>C.generateFile(s,t)))}else await e.promises.rm(s,{force:!0})}))}const ce={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].sort(),codeWith4IndentSize:["go","gradle","py"].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()},le=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${de(ce.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${de(ce.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${de(ce.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function pe(e){return k.functionIgnoringException("generateEditorconfig",(async()=>{const n=t.resolve(e.dirPath,".editorconfig");await $.run((()=>C.generateFile(n,le)))}))}function de(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function ue(n){return k.functionIgnoringException("generateEslintrc",(async()=>{await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0}))),await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".eslintignore"),{force:!0}))),await $.run((()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0})));const s=t.resolve(n.dirPath,"eslint.config.mjs");if(n.isBun)await $.run((()=>e.promises.rm(s,{force:!0})));else if(n.eslintBase){try{if(!(await e.promises.readFile(s,"utf8")).includes("export { default }"))return}catch{}await $.run((()=>C.generateFile(s,`export { default } from '${n.eslintBase}';`)))}}))}const me=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...ce.codeWith2IndentSize,...ce.codeWith4IndentSize,...ce.markdownLike].map((e=>`*.${e} text eol=lf`)).join("\n")}\n\ndist/** linguist-generated=true\n`;async function fe(e){return k.functionIgnoringException("generateGitattributes",(async()=>{const n=t.resolve(e.dirPath,".gitattributes");await $.run((()=>C.generateFile(n,me)))}))}const ge=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function he(e,n){return k.functionIgnoringException("generateGitignore",(async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await C.readFileIgnoringError(s)??"";let o=oe.getHeadUserContent(i)+"\n!.keep\n.env.production\n*/mount/*.hash\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\n";const r=oe.getTailUserContent(i),a=[...ge];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"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(o+="*.sqlite3*\n"),e.depending.playwrightTest&&(o+="test-results/\n"),(n.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 be(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,s=await fetch(n),i=await s.text();if(!s.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await $.run((()=>we(e,t))),v.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await oe.isBerryZeroInstallEnabled(s)||(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"),(n.depending.reactNative||e.depending.reactNative||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+"\n"+c+r;await $.run((()=>C.generateFile(s,l)))}))}const ye=t.join(m.homedir(),".cache","wbfy","gitignore");async function we(n,s){await e.promises.mkdir(ye,{recursive:!0}),await e.promises.writeFile(t.join(ye,n),s)}async function be(n){try{const s=await e.promises.stat(t.join(ye,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(ye,n),"utf8")}catch{}}async function ve(e,t){try{const{data:n}=await I.request("GET /repos/{owner}/{repo}/commits",{owner:e,repo:t,per_page:1});if(0===n.length)throw new Error(`No commits found for ${e}/${t}`);return n[0].sha}catch(n){throw new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`)}}const ke={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},je=["eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],xe=[...je,"typescript-eslint","eslint-import-resolver-typescript"],_e=["eslint-plugin-react","eslint-plugin-react-hooks"],Pe={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js","eslint-plugin-import-x",...je],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react","eslint-plugin-import-x",...je,..._e],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts","eslint-plugin-import-x",...xe],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react","eslint-plugin-import-x",...xe,..._e],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-plugin-import","eslint-config-next",...xe,..._e]};async function Se(n,s,i){return k.functionIgnoringException("generatePackageJson",(async()=>{await async function(n,s,i){const o=t.resolve(n.dirPath,"package.json"),r=await e.promises.readFile(o,"utf8"),c=JSON.parse(r);c.scripts=c.scripts||{},c.dependencies=c.dependencies||{},c.devDependencies=c.devDependencies||{},c.peerDependencies=c.peerDependencies||{},await async function(t,n){"WillBooster LLC"===n.author&&(n.author="WillBooster Inc.");if(delete n.scripts["sort-package-json"],delete n.scripts["sort-all-package-json"],delete n.scripts["typecheck/warn"],delete n.scripts["typecheck:gen-code"],delete n.scripts["typecheck:codegen"],delete n.dependencies.tslib,delete n.devDependencies["@willbooster/eslint-config"],delete n.devDependencies["@willbooster/eslint-config-react"],delete n.devDependencies["@willbooster/renovate-config"],delete n.devDependencies["@willbooster/tsconfig"],delete n.devDependencies["eslint-import-resolver-node"],delete n.devDependencies["eslint-plugin-prettier"],delete n.devDependencies.lerna,delete n.devDependencies.pinst,delete n.scripts["flutter-format"],delete n.scripts["format-flutter"],delete n.scripts["python-format"],delete n.scripts["format-python"],delete n.scripts.prettier,!t.isWillBoosterConfigs)for(const e of Object.values(Pe))for(const t of e)delete n.devDependencies[t];await $.run((()=>e.promises.rm("lerna.json",{force:!0}))),delete n.devDependencies["@typescript-eslint/eslint-plugin"],delete n.devDependencies["@typescript-eslint/parser"],delete n.devDependencies["eslint-plugin-import"]}(s,c),"@willbooster/prettier-config"!==c.name&&(c.prettier="@willbooster/prettier-config");for(const[e,t]of Object.entries(c.scripts))t.includes("git clone")||(c.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));c.scripts=d(c.scripts,$e(n)),n.isBun?delete c.scripts.prettify:c.scripts.prettify+=await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),o=i.indexOf(oe.separatorPrefix);if(-1===o)return"";const r=i.slice(0,o);return r.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("")}(n.dirPath);for(const[e,t]of Object.entries(c.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(c.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let l=[],p=["prettier","sort-package-json","@willbooster/prettier-config"];const u=[];n.isBun?delete c.devDependencies["lint-staged"]:p.push("lint-staged");if(n.isRoot){if(n.isBun?(delete c.devDependencies.husky,delete c.devDependencies.pinst,c.scripts.prepare="lefthook install || true",p.push("lefthook")):(p.push("husky"),c.scripts.prepare="husky || true",c.scripts.postinstall="husky || true",(n.isPublicRepo||n.isReferredByOtherRepo)&&(p.push("pinst"),c.scripts.prepack="pinst --disable",c.scripts.postpack="pinst --enable")),n.depending.semanticRelease){const e=c.devDependencies["multi-semantic-release"]||c.devDependencies["@qiwi/multi-semantic-release"]?"@6.1.0":"";p.push(`conventional-changelog-conventionalcommits${e}`),c.devDependencies["semantic-release"]||c.devDependencies["multi-semantic-release"]||c.devDependencies["@qiwi/multi-semantic-release"]||p.push("semantic-release"),c.version="0.0.0-semantically-released"}if(n.depending.playwrightTest){c.dependencies.artillery||c.devDependencies.artillery||c.dependencies["@playwright/test"]||(p.push("@playwright/test"),delete c.dependencies["@playwright/test"]),delete c.dependencies.playwright,delete c.devDependencies.playwright}n.doesContainsSubPackageJsons?c.workspaces=Array.isArray(c.workspaces)?d.all([c.workspaces,["packages/*"]],{arrayMerge:V}):["packages/*"]:Array.isArray(c.workspaces)&&(c.workspaces=c.workspaces.filter((e=>a.globSync(e,{dot:!0,cwd:n.dirPath,ignore:_}).length>0)),0===c.workspaces.length&&delete c.workspaces)}if(n.depending.wb||n.isBun){c.dependencies["@willbooster/wb"]?l.push("@willbooster/wb"):p.push("@willbooster/wb");for(const[e,t]of Object.entries(c.scripts))c.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainsJavaScript||n.doesContainsJavaScriptInPackages||n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(n.isBun?(p.push("@biomejs/biome","@willbooster/biome-config"),delete c.devDependencies.eslint,delete c.devDependencies.micromatch,delete c.devDependencies["typescript-eslint"]):p.push("eslint","micromatch"));(n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(p.push("typescript"),n.isBun&&p.push("@types/bun"));n.eslintBase&&p.push(...Pe[n.eslintBase]);n.isWillBoosterConfigs&&(l=l.filter((e=>!e.includes("@willbooster/"))),p=p.filter((e=>!e.includes("@willbooster/"))));c.name||(c.name=t.basename(n.dirPath));n.doesContainsSubPackageJsons&&(c.private=!0);c.license||(c.license="UNLICENSED");!c.private&&"UNLICENSED"!==c.license&&s.isPublicRepo&&(c.publishConfig??={},c.publishConfig.access??="public");const[m]=A.getOrgAndName(n.repository??"");"WillBooster"!==m&&"WillBoosterLab"!==m||(c.author="WillBooster Inc.");n.isRoot||!c.private||c.main||(c.main="./src");if(delete c.resolutions?.["npm/chalk"],!n.doesContainsSubPackageJsons){if(n.isBun||(n.doesContainsJavaScript||n.doesContainsTypeScript?c.scripts["lint-fix"]+=ke.getLintFixSuffix(n):(delete c.scripts.lint,delete c.scripts["lint-fix"],c.scripts.cleanup=c.scripts.cleanup?.replace(" && yarn lint-fix",""))),n.doesContainsPubspecYaml){c.scripts.lint="flutter analyze",c.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter((s=>e.existsSync(t.resolve(n.dirPath,s))));s.length>0&&(c.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)`,c.scripts.format+=" && yarn format-code")}if(n.doesContainsPoetryLock){"poetry install"===c.scripts.postinstall&&delete c.scripts.postinstall;const e=await a.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:_}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");c.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,c.scripts.lint?c.scripts.lint=`poetry run flake8 ${e} && ${c.scripts.lint}`:(c.scripts.lint=`poetry run flake8 ${e}`,c.scripts["lint-fix"]="yarn lint"),c.scripts.format+=" && yarn format-code",u.push("black","isort","flake8")}}n.repository&&(c.repository=n.repository)}n.depending.blitz?(l.push(`blitz@${G}`,`@blitzjs/auth@${G}`,`@blitzjs/next@${G}`,`@blitzjs/rpc@${G}`,`next@${U}`),p=p.filter((e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e)),c.scripts["gen-code"]?.startsWith("blitz codegen")?c.scripts["gen-code"].includes("blitz prisma generate")||(c.scripts["gen-code"]=c.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):c.scripts["gen-code"]="blitz codegen"):n.depending.prisma&&!c.scripts["gen-code"]?.startsWith("prisma generate")&&(c.scripts["gen-code"]="prisma generate");c.dependencies?.prettier||delete c.devDependencies["@types/prettier"];0===Object.keys(c.dependencies).length&&delete c.dependencies;0===Object.keys(c.devDependencies).length&&delete c.devDependencies;0===Object.keys(c.peerDependencies).length&&delete c.peerDependencies;await async function(e){e.dependencies=e.dependencies||{},e.devDependencies=e.devDependencies||{};const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]);if(t.has("@willbooster/auth")&&!Fe(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await ve("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!Fe(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await ve("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!Fe(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await ve("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#workspace=@code-analyzer/client&commit=${t}`}if(t.has("@willbooster/judge")&&!Fe(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await ve("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!Fe(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await ve("WillBoosterLab","llm-proxy");e.dependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(c),n.isBun&&delete c.packageManager;let f=JSON.stringify(c);if(f=await async function(n,s,i){const o=[];for(const[e]of Object.keys(n))":"!==e[0]&&e.includes(":")&&o.push([e,e.replaceAll(":","-")]);if(0===o.length)return s;for(const[e,t]of o)s=s.replaceAll(e,t);const r=await a.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:_});for(const n of r)await $.run((async()=>{const s=t.join(i.dirPath,n),r=await e.promises.readFile(s,"utf8");let a=r;for(const[e,t]of o)a=a.replaceAll(e,t);a!==r&&await e.promises.writeFile(s,a)}));return await $.promiseAll(),s}(c.scripts,f,n),await e.promises.writeFile(o,f),!i){l=l.filter((e=>!c.devDependencies?.[e]));const e=n.isBun?"bun":"yarn";l.length>0&&R(e,["add",...new Set(l)],n.dirPath),p=p.filter((e=>!c.dependencies?.[e])),p.length>0&&R(e,["add","-D",...new Set(p)],n.dirPath),u.length>0&&R("poetry",["add","--group","dev",...new Set(u)],n.dirPath)}}(n,s,i)}))}function $e(e){if(e.isBun){const t={"check-all":"bun run cleanup && bun run typecheck && bun run test",cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun wb test",typecheck:"bun --bun wb typecheck"};return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||delete t.typecheck,t}{let t={"check-all":"yarn cleanup && yarn typecheck && yarn test",cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:"eslint --color","lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ce.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 "**/{.*/,}*.{${ce.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}}function Fe(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const Ce={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 Ee(n){return k.functionIgnoringException("generateHuskyrcUpdatingPackageJson",(async()=>{await async function(n){const s=t.resolve(n.dirPath,"package.json"),i=await e.promises.readFile(s,"utf8"),o=JSON.parse(i);o.scripts||={},delete o.scripts.postinstall,delete o.scripts.postpublish,delete o.scripts.prepare,delete o.scripts.prepublishOnly,delete o.scripts.prepack,delete o.scripts.postpack;const r=t.resolve(n.dirPath,".husky");if(await Promise.all([e.promises.writeFile(s,JSON.stringify(o,void 0,2)),e.promises.rm(r,{force:!0,recursive:!0})]),n.isBun)return void R("git",["config","--unset","core.hooksPath"],n.dirPath);R("yarn",["dlx","husky-init","--yarn2"],n.dirPath);const a=t.resolve(r,"pre-commit");await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0}))),await $.run((()=>e.promises.writeFile(a,Ce.preCommit+"\n")));const{typecheck:c}=$e(n);if(c){let s=n.repository?.startsWith("github:WillBoosterLab/")?Ce.prePushForLab:Ce.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((()=>e.promises.writeFile(t.resolve(r,"pre-push"),s+"\n",{mode:493})))}const l=`${Ce.postMerge}\n\n${Be(n).join("\n")}\n`;await $.run((()=>e.promises.writeFile(t.resolve(r,"post-merge"),l,{mode:493})))}(n)}))}function Be(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 n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";return t.push(`run_if_changed "package\\.json" "${n}${s}"`),e.doesContainsPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`),t}function Oe(e,t,n,s){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="${s}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${s})" />\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 De=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ce.prettier.map((e=>Oe("node","node_modules/.bin/prettier --cache --write","Prettier",e))).join("")}\n </component>\n</project>\n`,Te=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ce.prettier.map((e=>Oe("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-errors","Biome",e))).join("")}\n </component>\n</project>\n`;async function Ie(n){return k.functionIgnoringException("generateIdeaSettings",(async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainsJavaScript||n.doesContainsJavaScriptInPackages||n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages||n.doesContainsPackageJson&&!n.doesContainsPubspecYaml&&!n.doesContainsGemfile&&!n.doesContainsGoMod&&!n.doesContainsPomXml?$.run((()=>C.generateFile(i,n.isBun?Te:De))):$.run((()=>e.promises.rm(i,{force:!0}))))}}))}const Ae={"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}"},"check-migrations":{glob:"**/migration.sql",run:"\nif grep -q 'Warnings:' {staged_files}; then\n echo \"Migration SQL files ({staged_files}) contain warnings! Please solve the warnings and commit again.\"\n exit 1\nfi\n".trim()}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},Re={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 We(n){return k.functionIgnoringException("generateLefthookUpdatingPackageJson",(async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook");await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),f.dump(Ae,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]);const{typecheck:i}=$e(n);if(i){const i=n.repository?.startsWith("github:WillBoosterLab/")?Re.prePushForLab:Re.prePush;e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await $.run((()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493})))}const o=`${Re.postMerge}\n\n${Be(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await $.run((()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),o,{mode:493})))}(n)}))}const Le={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};async function Je(n){return k.functionIgnoringException("generateLintstagedrc",(async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await $.run((()=>e.promises.rm(s,{force:!0})));const i=n.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",o=[];if(n.doesContainsJavaScript||n.doesContainsTypeScript){const e=`\n '${Ne(n)}': [${JSON.stringify(`${i}eslint --fix${ke.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;o.push(e)}const r=n.isRoot?" && !file.includes('/packages/')":"";o.push(`\n './**/*.{${ce.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${r});${function(e){return e.doesContainsJavaScript||e.doesContainsTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${Ne(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(n)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${i}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${i}sort-package-json');\n }\n return commands;\n },\n './**/migration.sql': (files) => {\n for (const file of files) {\n const content = fs.readFileSync(file, 'utf-8');\n if (content.includes('Warnings:')) {\n return [\n \`!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.\`,\n ];\n }\n }\n return [];\n},`),n.doesContainsPubspecYaml&&o.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 },");n.doesContainsPoetryLock&&o.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const a=`const fs = require('fs');\nconst path = require('path');\n${n.doesContainsJavaScript||n.doesContainsTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${o.join("")}\n};\n`;await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0}))),await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0}))),await $.run((()=>C.generateFile(s,a)))}(n)}))}function Ne(e){const t=function(e){return e.depending.blitz?Le.blitz:Le.node}(e).map((e=>`${e}/**/`));return`{,${t.join(",")}}*.{${ce.eslint.join(",")}}`}async function ze(n){return k.functionIgnoringException("generateNextConfigJson",(async()=>{const s=["js","mjs","cjs"].map((e=>t.resolve(n.dirPath,`next.config.${e}`))).find((t=>e.existsSync(t)));if(!s)return;const i=(await e.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((()=>C.generateFile(s,i)))}))}async function Ge(e){return k.functionIgnoringException("generatePrettierignore",(async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await C.readFileIgnoringError(n)??"",i=oe.getHeadUserContent(s),o=oe.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await oe.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainsPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await $.run((()=>C.generateFile(n,l)))}))}const Ue={venvPath:".",venv:".venv"};async function He(n){return k.functionIgnoringException("generatePyrightConfigJson",(async()=>{let s=u(Ue);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:K})}catch{}const o=JSON.stringify(s);await $.run((()=>C.generateFile(i,o)))}))}async function Me(n){return k.functionIgnoringException("generateReadme",(async()=>{const s=t.resolve(n.dirPath,"README.md");let i=await e.promises.readFile(s,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(i=qe(i,"[](https://github.com/semantic-release/semantic-release)"));const o=n.repository?.slice(n.repository?.indexOf(":")+1),r=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const s of r){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let r=s;r=r[0].toUpperCase()+r.slice(1,r.indexOf(".")),r=r.replace("-"," ");const a=`[](https://github.com/${o}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=qe(i,a))}await $.run((()=>C.generateFile(s,i)))}))}function qe(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const s=e.slice(0,n+1);let i=e.slice(n+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${s}${t}\n${i}`}return`${e}\n${t}\n`}async function Ye(n){return k.functionIgnoringException("generateReleaserc",(async()=>{const s=t.resolve(n.dirPath,".releaserc.json"),i=JSON.parse(await e.promises.readFile(s,"utf8")),o=i?.plugins||[];for(let e=0;e<o.length;e++){const t=Array.isArray(o[e])?o[e][0]:o[e],n=Array.isArray(o[e])&&o[e][1]||{};"@semantic-release/commit-analyzer"===t?o[e]=["@semantic-release/commit-analyzer",d.all([n,{preset:"conventionalcommits"}],{arrayMerge:K})]:"@semantic-release/github"===t&&(o[e]=["@semantic-release/github",d.all([n,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:K})])}const r=JSON.stringify(i);await $.run((()=>C.generateFile(s,r)))}))}const Ke={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function Ve(n){return k.functionIgnoringException("generateRenovateJson",(async()=>{let s=u(Ke);const i=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${i}5`))return;try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:K}),s.extends=s.extends.filter((e=>"@willbooster"!==e))}catch{}n.depending.blitz&&(s.packageRules??=[],s.packageRules.some((e=>e.matchPackageNames.includes("next")))||s.packageRules.push({matchPackageNames:["next"],enabled:!1})),await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0}))),await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0})));const o=JSON.stringify(s);await $.run((()=>C.generateFile(i,o)))}))}function Xe(e){const t=Object.entries(e).sort((([e],[t])=>e.localeCompare(t)));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&Xe(s);return e}const Qe={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,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*","packages/*/src/**/*","packages/*/tests/**/*","packages/*/scripts/**/*"]},Ze={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,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*"]};async function et(n){return k.functionIgnoringException("generateTsconfig",(async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?Qe:Ze);n.doesContainsJsxOrTsx||n.doesContainsJsxOrTsxInPackages||delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainsSubPackageJsons&&(s.include=s.include?.filter((e=>!e.startsWith("packages/*/")))),n.isEsmPackage&&(s.compilerOptions={...s.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(i,"utf8"),o=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===o.extends&&delete o.extends,delete s.compilerOptions?.target,n.isEsmPackage||(delete s.compilerOptions?.module,delete s.compilerOptions?.moduleResolution),o.compilerOptions?.jsx&&delete s.compilerOptions?.jsx,s=d.all([s,o,s],{arrayMerge:V}),s.include=s.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}Xe(s),s.include?.sort();const o=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await $.run((()=>C.generateFile(i,o)))}))}const tt=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function nt(n){return k.functionIgnoringException("generateVscodeSettings",(async()=>{try{const s=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(s,"utf8");let o=JSON.parse(i);for(const e of tt)o=d.all([o,st(e)]);n.doesContainsPoetryLock&&(o=d.all([o,st("**/.venv/**")])),n.depending.next&&(o=d.all([o,st("**/.next/**")])),"editor.codeActionsOnSave"in o&&delete o["editor.codeActionsOnSave"],"editor.formatOnSave"in o&&delete o["editor.formatOnSave"],Xe(o??{});const r=JSON.stringify(o,void 0,2);await $.run((()=>C.generateFile(s,r)))}catch{}}))}function st(e){return{"files.watcherExclude":{[e]:!0}}}const it={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 ot(n){return k.functionIgnoringException("generateWorkflow",(async()=>{const s=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(s,{recursive:!0});const i=t.resolve(n.dirPath,".github","semantic.yml");await $.run((()=>e.promises.rm(i,{force:!0,recursive:!0})));const o=await e.promises.readdir(s,{withFileTypes:!0}),r=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml",...o.filter((e=>e.isFile()&&e.name.endsWith(".yml"))).map((e=>e.name))]);n.depending.semanticRelease&&r.add("release.yml"),(n.isPublicRepo||n.repository?.startsWith("github:WillBoosterLab/"))&&(r.add("add-ready-issue-to-project.yml"),r.add("notify-ready.yml"));for(const e of r){const i=t.basename(e,".yml");await $.run((()=>rt(n,s,i)))}await $.run((()=>e.promises.rm(t.join(s,"add-focused-issue-to-project.yml"),{force:!0,recursive:!0})))}))}async function rt(n,s,i){let o=u(it[i]??{});const r=t.join(s,`${i}.yml`);try{const t=await e.promises.readFile(r,"utf8"),n=f.load(t);o=d.all([o,n,o],{arrayMerge:V})}catch{}i.startsWith("deploy")&&(o={...o,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},o.jobs&&function(e,t){const n=e[t];delete e[t],e[t]=n}(o,"jobs"),o.on?.push&&(o.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...o.on.push["paths-ignore"]??[]])]));for(const e of Object.values(o.jobs)){if(!e.uses?.includes?.("/reusable-workflows/"))return;at(n,e,i)}switch(i){case"release":if(o.on?.schedule)delete o.on.push;else{if(!(o.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});o.on.push.branches=n.release.branches}break;case"test":o.on?.push&&(o.on.push.branches=o.on.push.branches.filter((e=>"renovate/**"!==e)));break;case"wbfy":o.on&&ct(o,20,24);break;case"wbfy-merge":ct(o,1,4)}if(function(e){delete e.jobs["add-to-project"]}(o),await lt(o,r),"release"===i)await e.promises.rm(t.join(s,"semantic-release.yml"),{force:!0});else if("sync"===i){if(await e.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!o.jobs.sync||!o.jobs.sync.with)return;o.jobs["sync-force"]=o.jobs.sync;const n=o.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;o.jobs.sync.with.sync_params_without_dest=`--force ${n}`,o.name="Force to Sync",o.on={workflow_dispatch:null},delete o.jobs.sync,await lt(o,t.join(s,"sync-force.yml"))}}function at(e,t,n){if(t.with||={},t.secrets||={},"test"!==n&&"release"!==n&&"wbfy"!==n&&"wbfy-merge"!==n&&"add-issue-to-project"!==n&&"add-ready-issue-to-project"!==n||(t.secrets.GH_TOKEN=e.isPublicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==n&&"test"!==n||(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"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with?.sync_params_without_dest;"string"==typeof e&&(t.with.sync_params_without_dest=e.replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,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),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&"string"==typeof t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,"")),e.doesContainsDockerfile&&("extra-large"!==t.with.ci_size&&(n.startsWith("deploy")||n.startsWith("test"))&&(t.with.ci_size="large"),n.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===n||"test"===n||"wbfy"===n||"wbfy-merge"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?Xe(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Xe(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function ct(e,t,n){const[s,i]=(e.on.schedule?.[0]?.cron||"").split(" ").map(Number);if(0!==s&&Number.isInteger(i)){const e=(i+9)%24;if(t<n?t<=e&&e<n:t<=e||e<n)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(n-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function lt(t,n){const s=f.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function pt(n){return k.functionIgnoringException("generateYarnrcYml",(async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await $.run((()=>e.promises.rm(s,{force:!0}))),await $.run((()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0}))),void await $.run((()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0})));const i=W("yarn",["--version"],n.dirPath),o=function(e,t){const n=W("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);dt(i)<=dt(o)&&i!==o&&R("yarn",["set","version",o],n.dirPath,1);const r=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(r,{recursive:!0});for(const n of await e.promises.readdir(r))n.startsWith("yarn-")&&!n.startsWith(`yarn-${o}.`)&&await $.run((()=>e.promises.rm(t.join(r,n))));const a=t.resolve(n.dirPath,".yarnrc");await $.run((()=>e.promises.rm(a,{force:!0})));const c=f.load(await e.promises.readFile(s,"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(n.dirPath,".yarnrc","undefined.cjs");await $.run((()=>e.promises.rm(s,{force:!0})))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,f.dump(c,{lineWidth:-1})),R("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)}))}function dt(e){const[t]=e.split(".");return Number(t)}async function ut(e){return k.functionIgnoringException("setupLabels",(async()=>{if(!T)return;const[t,n]=A.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await mt(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await mt(t,n,"d2: easy :rabbit2:","DDD6FE"),await mt(t,n,"d3: medium :ox:","C4B5FD"),await mt(t,n,"d4: hard :squid:","A78BFA"),await mt(t,n,"d5: x-hard :whale2:","8B5CF6"),await mt(t,n,"p1: critical :fire::fire::fire:","EF4444"),await mt(t,n,"p2: urgent :fire::fire:","F87171"),await mt(t,n,"p3: important :fire:","FCA5A5"),await mt(t,n,"p4: nice to have :droplet:","FECACA"),await mt(t,n,"r: blitz","5300bc"),await mt(t,n,"r: firebase","ffca28"),await mt(t,n,"r: prisma","0c344b"),await mt(t,n,"r: react","61dafb"),await mt(t,n,"r: svelte","ff3e00"),await mt(t,n,"r: semantic-release","494949"),await mt(t,n,"ready :rocket:","22C55E"),await mt(t,n,"review requested :mag:","FBCA04"),await mt(t,n,"released :bookmark:","6366F1"),await mt(t,n,"s: 0.5h :clock1230:","F3F4F6"),await mt(t,n,"s: 1h :clock1:","E5E7EB"),await mt(t,n,"s: 2h :clock2:","D1D5DB"),await mt(t,n,"s: 3h :clock3:","9CA3AF"),await mt(t,n,"s: 5h :clock5:","6B7280"),await mt(t,n,"s: 8h :clock8:","4B5563"),await mt(t,n,"s: 13h :clock1:","374151"),await mt(t,n,"t: build :hammer:","BFDBFE"),await mt(t,n,"t: chore :broom:","BFDBFE"),await mt(t,n,"t: ci :construction_worker:","BFDBFE"),await mt(t,n,"t: docs :memo:","BFDBFE"),await mt(t,n,"t: feat :sparkles:","BFDBFE"),await mt(t,n,"t: fix :bug:","BFDBFE"),await mt(t,n,"t: perf :zap:","BFDBFE"),await mt(t,n,"t: refactor :recycle:","BFDBFE"),await mt(t,n,"t: style :lipstick:","BFDBFE"),await mt(t,n,"t: test :test_tube:","BFDBFE"),await mt(t,n,"project","24292F"),await mt(t,n,"focused :dart:","22C55E"),await mt(t,n,"llm-pr :robot:","8B5CF6"),await ft(t,n,"bug"),await ft(t,n,"documentation"),await ft(t,n,"duplicate"),await ft(t,n,"enhancement"),await ft(t,n,"good first issue"),await ft(t,n,"help wanted"),await ft(t,n,"invalid"),await ft(t,n,"question"),await ft(t,n,"wontfix"),await ft(t,n,"ready"),await ft(t,n,"review requested"),await ft(t,n,"released"),await ft(t,n,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function mt(e,t,n,s){try{await I.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:n,color:s})}catch{await I.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n,color:s})}}async function ft(e,t,n){try{await I.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const gt=["READY_DISCORD_WEBHOOK_URL"];async function ht(e){return k.functionIgnoringException("setupSecrets",(async()=>{if(!T||!v.doesUploadEnvVars)return;const[t,n]=A.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const s=g.config().parsed||{};if(0!==Object.keys(s).length)try{for(const e of gt)try{await I.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const i=await I.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=i.data;await h.ready;for(const[i,a]of Object.entries(s)){if(e.isPublicRepo&&"GH_BOT_PAT"===i)continue;if(!e.isPublicRepo&&"PUBLIC_GH_BOT_PAT"===i)continue;const s=h.from_base64(o,h.base64_variants.ORIGINAL),c=h.from_string(a),l=h.crypto_box_seal(c,s),p=h.to_base64(l,h.base64_variants.ORIGINAL);await I.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:i,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}}))}async function yt(e){const[t,n]=A.getOrgAndName(e.repository??"");t&&n&&("WillBooster"!==t&&"WillBoosterLab"!==t||await s((()=>I.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,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 wt={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on this page.\n - PR title follows [Angular\'s commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn\'t have `WIP:`.\n - The test command (e.g., `yarn test`) passed.\n - The lint command (e.g., `yarn lint`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I\'ve reviewed my changes on the GitHub diff view.\n- [ ] I\'ve written the steps to test my changes.\n- [ ] I\'ve added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn\'t modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language `C`.\n3. Write the following code:\n ```c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n ```\n4. Push `Submit` button.\n5. ...\n--\x3e\n\n\x3c!-- 日本語で記述しても大丈夫です。 --\x3e\n'.trim()};async function bt(n){return k.functionIgnoringException("generateGitHubTemplates",(async()=>{for(const[s,i]of Object.entries(wt)){const o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(y(t,i)>i.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await $.run((()=>C.generateFile(o,i)))}}))}const vt=b.object({typos:b.object({all:b.record(b.string()).optional(),doc:b.record(b.string()).optional(),ts:b.record(b.string()).optional(),text:b.record(b.string()).optional()}).optional()});async function kt(n,s){const i=t.resolve(n,"package.json");try{const o=e.existsSync(i);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),s=JSON.parse(await r.readFile(e,"utf8"));d=s?.branches||[],u=s?.plugins?.flat()||[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=w(e),s=(await n.getRemotes(!0)).find((e=>"origin"===e.name)),i=s?.refs?.fetch??s?.refs?.push;if("string"==typeof i){const e=await xt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await xt(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g="";try{g+=(await r.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[e,s]of[["java","java"],["node","nodejs"],["python","python"]])try{const i=await r.readFile(t.resolve(n,`.${e}-version`),"utf8");g&&(g+="\n"),g+=s+" "+i.trim()}catch{}let h="";try{h=await r.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let b;try{const e=await r.readFile(y,"utf8");b=vt.parse(JSON.parse(e))}catch{}const v={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:f?.full_name?`github:${f.full_name}`:void 0,isBun:s?.isBun||e.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainsSubPackageJsons:jt("packages/**/package.json",n),doesContainsDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainsGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainsGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainsPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainsPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainsPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainsPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainsTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainsVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainsJavaScript:jt("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScript:jt("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsx:jt("{app,src,tests}/**/*.{t,j}sx",n),doesContainsJavaScriptInPackages:jt("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScriptInPackages:jt("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsxInPackages:jt("packages/**/{app,src,tests}/**/*.{t,j}sx",n),depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],litestream:h.includes("install-litestream.sh"),next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},versionsText:g,packageJson:l,wbfyJson:b};if(v.isBun||(v.eslintBase=function(e){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"}(v)),v.doesContainsGemfile||v.doesContainsGoMod||v.doesContainsPackageJson||v.doesContainsPoetryLock||v.doesContainsPomXml||v.doesContainsPubspecYaml||v.doesContainsTemplateYaml)return v}catch{}}function jt(e,t){return a.globSync(e,{dot:!0,cwd:t,ignore:_}).length>0}async function xt(e){const[t,n]=A.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await I.request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch{}return s}await async function(){const n=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;v.isVerbose=n.verbose,v.doesUploadEnvVars=n.env;for(const s of n.paths){const o=t.join(s,"packages"),r=(await i((()=>e.promises.readdir(o,{withFileTypes:!0})))??[]).filter((e=>e.isDirectory())).map((e=>t.join(o,e.name)));await S([s,...r]);const a=await kt(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=E(a),l=(await Promise.all(r.map((e=>kt(e,a))))).filter((e=>!!e)),p=[a,...l];if(v.isVerbose)for(const e of p)console.info(e);await H(a),await pt(a),await Promise.all([j(a),P(a),c.then((()=>Me(a))),ae(a),pe(a),fe(a),bt(a),Ie(a),Ve(a),Ye(a),ot(a),ut(a),ht(a),yt(a),...a.isBun?[Z(a),Ee(a).then((()=>We(a)))]:[Ee(a)],Je(a)]),await $.promiseAll();const d=[];for(const e of p)(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(F(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(x(e)),e.depending.next&&d.push(ze(e)),await he(e,a),await $.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await Ge(e),await Se(e,a,n.skipDeps),d.push(Je(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(nt(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(et(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isBun&&d.push(Q(e)),a.isWillBoosterConfigs||d.push(ue(e))),e.depending.pyright&&d.push(He(e)));await Promise.all(d),await $.promiseAll();const u=a.isBun?"bun":"yarn";if(R(u,["cleanup"],s),a.isBun){R(u,["update"],s);const n=t.join(s,"bun.lockb");e.existsSync(n)&&(e.promises.rm(n),R(u,["install","--save-text-lockfile","--frozen-lockfile","--lockfile-only"],s))}else R(u,["install"],s)}}();
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy9maXhlcnMvcGxheXdyaWdodENvbmZpZy50cyIsIi4uL3NyYy91dGlscy9nbG9iVXRpbC50cyIsIi4uL3NyYy9maXhlcnMvcHJpc21hLnRzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbkNvbnN0YW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FzZGYudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYmlvbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRpZ25vcmUudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9odXNreXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbmV4dGNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHlyaWdodGNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi50cyIsIi4uL3NyYy91dGlscy9vYmplY3RVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMveWFybnJjLnRzIiwiLi4vc3JjL2dpdGh1Yi9sYWJlbC50cyIsIi4uL3NyYy9naXRodWIvc2VjcmV0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvdGVtcGxhdGUudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlOiBib29sZWFuO1xuICBkb2VzVXBsb2FkRW52VmFyczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlzVmVyYm9zZSA9IGZhbHNlO1xuICAgIHRoaXMuZG9lc1VwbG9hZEVudlZhcnMgPSBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4RG9ja2VyZmlsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhEb2NrZXJmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0RvY2tlcmZpbGUpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBjb25maWcuZG9ja2VyZmlsZTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudDtcblxuICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgbmV3Q29udGVudCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC9yZXRyaWVzOi4rLC8sICdyZXRyaWVzOiBwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEsJyk7XG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQcmlzbWFFbnZGaWxlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQcmlzbWFFbnZGaWxlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbnZGaWxlcyA9IGF3YWl0IGZnLmdsb2IoWycqLmVudicsICcqLmVudi4qJ10sIHsgZG90OiB0cnVlLCBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgZm9yIChjb25zdCBlbnZGaWxlIG9mIGVudkZpbGVzKSB7XG4gICAgICBjb25zdCBlbnZGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZW52RmlsZSk7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKFxuICAgICAgICAvREFUQUJBU0VfVVJMPVwiPyguK1xcLnNxbGl0ZTMpXCI/W1xcbiRdLyxcbiAgICAgICAgJ0RBVEFCQVNFX1VSTD1cIiQxP2Nvbm5lY3Rpb25fbGltaXQ9MVwiXFxuJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShlbnZGaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcGFja2FnZURpclBhdGhzLm1hcChhc3luYyAocGFja2FnZURpclBhdGgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkVGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdfX3Rlc3RzX18nKTtcbiAgICAgICAgY29uc3QgbmV3VGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICd0ZXN0cycpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKTtcbiAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlQWxsKCdfX3Rlc3RzX18nLCAndGVzdHMnKTtcbiAgICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuXG4gICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBuZXdDb250ZW50KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwZURlZmluaXRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbjogUGFja2FnZUNvbmZpZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBlRGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGliVHlwZURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdAdHlwZXMnKTtcbiAgICBjb25zdCBzcmNUeXBlRGlyUGF0aCA9XG4gICAgICBjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMgPyB1bmRlZmluZWQgOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdzcmMnLCAndHlwZXMnKTtcblxuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5yZWFkZGlyKGxpYlR5cGVEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpO1xuICAgIGlmICghZGlyZW50cykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgZGlyTmFtZSA9IGRpcmVudC5uYW1lLnNsaWNlKDAsIC01KTtcbiAgICAgIGNvbnN0IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA9IGRpcmVudC5uYW1lLmVuZHNXaXRoKCcuZC50cycpO1xuICAgICAgbGV0IHBhY2thZ2VOYW1lID0gaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID8gZGlyTmFtZSA6IGRpcmVudC5uYW1lO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lLmluY2x1ZGVzKCdfXycpKSB7XG4gICAgICAgIHBhY2thZ2VOYW1lID0gYEAke3BhY2thZ2VOYW1lLnJlcGxhY2UoJ19fJywgJy8nKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzTGlicmFyeSA9IGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbi5zb21lKFxuICAgICAgICAoY29uZmlnKSA9PlxuICAgICAgICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgICApO1xuXG4gICAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaGFzTGlicmFyeSkge1xuICAgICAgICAgIC8vIE1vdmUgQHR5cGVzLzxuYW1lPi9pbmRleC5kLnRzIGlmIGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSkpO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUsICdpbmRleC5kLnRzJykpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzcmNUeXBlRGlyUGF0aCkge1xuICAgICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPiBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIHNyY1R5cGVEaXJQYXRoICYmICFoYXNMaWJyYXJ5KSB7XG4gICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPi5kLnRzIGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICBpZ25vcmVFbm9lbnRBc3luYygoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lLCAnaW5kZXguZC50cycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGAke2RpcmVudC5uYW1lfS5kLnRzYClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIGFzeW5jIHJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzcC5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmc3Aud3JpdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGVkL1VwZGF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGFja2FnZUNvbmZpZy5kaXJQYXRoO1xuICAgIGNvbnN0IGRvY0ZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQoY29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAnZG9jJyk7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRzRmlsZXMgPSBhd2FpdCBmZy5nbG9iKFxuICAgICAgW1xuICAgICAgICAne2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLihbXiRdKS9nLCAnY2YuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLihbXiRdKS9nLCAnZS5nLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oW14kXSkvZywgJ2kuZS4kMScpO1xufVxuXG5mdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopZWdcXC4vZywgJy8vJDFlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWllXFwuL2csICcvLyQxaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY29uc3QgdG9rZW4gPVxuICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUIHx8IHByb2Nlc3MuZW52LlBVQkxJQ19HSF9CT1RfUEFUIHx8IHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8IHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTjtcbmV4cG9ydCBjb25zdCBoYXNHaXRIdWJUb2tlbiA9ICEhdG9rZW47XG5leHBvcnQgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgYXV0aDogdG9rZW4sXG59KTtcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViVXRpbCgpO1xuIiwiaW1wb3J0IHR5cGUgeyBTcGF3blN5bmNPcHRpb25zIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgaWYgKHJldC5zdGF0dXMgPT09IDApIGJyZWFrO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgY29uc3QgZXJyb3IgPSBwcm9jLnN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gY2F1c2VkIHRoZSBmb2xsb3dpbmcgZXJyb3I6XFxuICR7ZXJyb3J9YCk7XG4gIH1cbiAgcmV0dXJuIHByb2Muc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgLy8gUmVtb3ZlIGJlcnJ5IGZyb20gUEFUSFxuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnJlcGxhY2UoYCR7ZW52LkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKTtcbiAgfVxuXG4gIGlmIChlbnYuQVNERl9ESVIpIHtcbiAgICBhcmdzID0gWyctbCcsICctYycsIGAuICR7ZW52LkFTREZfRElSfS9hc2RmLnNoICYmICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gXTtcbiAgICBjb21tYW5kID0gJ2Jhc2gnO1xuICB9XG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIodmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgLy8gZS5nLiBqYXZhIGFkb3B0b3Blbmpkay0xMS4wLjE3KzhcbiAgY29uc3QgbnVtYmVycyA9IHZlcnNpb25cbiAgICAuc3BsaXQoL1srLi1dLylcbiAgICAubWFwKE51bWJlcilcbiAgICAuZmlsdGVyKChudW0pID0+ICFOdW1iZXIuaXNOYU4obnVtKSk7XG4gIGxldCB2ZXJzaW9uTnVtYmVyID0gMDtcbiAgbGV0IGRpdmlzb3IgPSAxO1xuICBmb3IgKGNvbnN0IG51bSBvZiBudW1iZXJzKSB7XG4gICAgdmVyc2lvbk51bWJlciArPSBudW0gKiBkaXZpc29yO1xuICAgIGRpdmlzb3IgLz0gMTAwMDtcbiAgfVxuICByZXR1cm4gdmVyc2lvbk51bWJlcjtcbn1cbiIsImV4cG9ydCBjb25zdCBQWVRIT05fVkVSU0lPTiA9ICczLjkuMTknO1xuZXhwb3J0IGNvbnN0IEpBVkFfVkVSU0lPTiA9ICd6dWx1LTExLjc0LjE1Jztcbi8vIEJlY2F1c2UgV2ViS2l0IGNhbm5vdCBsb2ctaW4gb24gQmxpdHogdjIuMC41K1xuZXhwb3J0IGNvbnN0IEJMSVRaX1ZFUlNJT04gPSAnMi4wLjQnO1xuZXhwb3J0IGNvbnN0IE5FWFRfVkVSU0lPTiA9ICcxNC4yLjUnO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgY29udmVydFZlcnNpb25JbnRvTnVtYmVyIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBKQVZBX1ZFUlNJT04sIFBZVEhPTl9WRVJTSU9OIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbkNvbnN0YW50cy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRvb2xWZXJzaW9ucyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRvb2xWZXJzaW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5jb25zdCBDT1JFX1RPT0xTID0gbmV3IFNldChbJ2phdmEnLCAnbm9kZWpzJywgJ2J1bicsICdweXRob24nXSk7XG5jb25zdCBERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMgPSBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXTtcblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjb25maWcudmVyc2lvbnNUZXh0KSByZXR1cm47XG5cbiAgY29uc3QgZHVwbGljYXRhYmxlTGluZXMgPSBjb25maWcudmVyc2lvbnNUZXh0XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBbbmFtZSwgdmVyc2lvbl0gPSBsaW5lLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgLy8gVG8gbW92ZSB0aGUgdG9wIG9mIHRoZSBzb3J0ZWQgbGlzdCwgd2UgbmVlZCB0byBhZGQgYSBzcGFjZS5cbiAgICAgIHJldHVybiBgJHtDT1JFX1RPT0xTLmhhcyhuYW1lKSA/ICcgJyA6ICcnfSR7bmFtZX0gJHt2ZXJzaW9ufWA7XG4gICAgfSlcbiAgICAuc29ydCgpXG4gICAgLy8gUmVtb3ZlIGFkZGVkIHNwYWNlcy5cbiAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSlcbiAgICAvLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGFmdGVyIGxlZnRob29rIGlzIGluc3RhbGxlZCB2aWEgbnBtLlxuICAgIC5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLnN0YXJ0c1dpdGgoJ2xlZnRob29rJykpO1xuICBjb25zdCBsaW5lcyA9IFsuLi5uZXcgU2V0KGR1cGxpY2F0YWJsZUxpbmVzKV07XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9weXBpLm9yZy9weXBpL3BvZXRyeS9qc29uJyk7XG4gICAgY29uc3QganNvbiA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgaW5mbz86IHsgdmVyc2lvbjogc3RyaW5nIH0gfSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwb2V0cnlWZXJzaW9uID0ganNvbj8uaW5mbz8udmVyc2lvbjtcbiAgICBpZiAocG9ldHJ5VmVyc2lvbikge1xuICAgICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3BvZXRyeScsIHBvZXRyeVZlcnNpb24pO1xuICAgIH1cbiAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAncHl0aG9uJywgUFlUSE9OX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ2phdmEnLCBKQVZBX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25zdCBidW5WZXJzaW9uID0gYXdhaXQgZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yignb3Zlbi1zaCcsICdidW4nKTtcbiAgICAgIGlmIChidW5WZXJzaW9uKSB1cGRhdGVWZXJzaW9uKGxpbmVzLCAnYnVuJywgYnVuVmVyc2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCducG0nLCBbJ3Nob3cnLCAneWFybicsICd2ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICd5YXJuJywgdmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwcmVmaXggb2YgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTKSB7XG4gICAgY29uc3QgdmVyc2lvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKTtcbiAgICB2b2lkIGZzLnByb21pc2VzLnJtKHZlcnNpb25QYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgdG9vbFZlcnNpb25zUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyk7XG4gIGF3YWl0IChsaW5lcy5sZW5ndGggPiAwXG4gICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHRvb2xWZXJzaW9uc1BhdGgsIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbicpKVxuICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHRvb2xWZXJzaW9uc1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ3BsdWdpbicsICd1cGRhdGUnLCAnLS1hbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ2luc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVWZXJzaW9uKGxpbmVzOiBzdHJpbmdbXSwgdG9vbE5hbWU6IHN0cmluZywgbmV3VmVyc2lvbjogc3RyaW5nLCBoZWFkID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc3QgaW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGwpID0+IGwuc3BsaXQoL1xccysvKVswXSA9PT0gdG9vbE5hbWUpO1xuICBjb25zdCBuZXdMaW5lID0gYCR7dG9vbE5hbWV9ICR7bmV3VmVyc2lvbn1gO1xuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgbGluZXMuc3BsaWNlKGhlYWQgPyAwIDogbGluZXMubGVuZ3RoLCAwLCBuZXdMaW5lKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGxpbmVzW2luZGV4XS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIobmV3VmVyc2lvbikgPiBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIodmVyc2lvbikpIHtcbiAgICAgIGxpbmVzW2luZGV4XSA9IG5ld0xpbmU7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG9zaXRvcnk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgLy8gRmV0Y2ggdGhlIGxhdGVzdCByZWxlYXNlIGZyb20gdGhlIHJlcG9zaXRvcnlcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9sYXRlc3QnLCB7XG4gICAgICBvd25lcjogb3JnYW5pemF0aW9uLFxuICAgICAgcmVwbzogcmVwb3NpdG9yeSxcbiAgICB9KTtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVzcG9uc2UuZGF0YS50YWdfbmFtZTtcbiAgICBjb25zdCBpbmRleCA9IHZlcnNpb24ubGFzdEluZGV4T2YoJ3YnKTtcbiAgICBjb25zdCB2ZXJzaW9uTnVtYmVyVGV4dCA9IGluZGV4ID09PSAtMSA/IHZlcnNpb24gOiB2ZXJzaW9uLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgLy8gQ2hlY2sgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhIG51bWJlclxuICAgIHJldHVybiAvXlxcZC8udGVzdCh2ZXJzaW9uTnVtYmVyVGV4dCkgPyB2ZXJzaW9uTnVtYmVyVGV4dCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggQnVuIHRhZ3MgZHVlIHRvOicsIGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnQgKi9cblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogb2JqZWN0W10sIHNvdXJjZTogb2JqZWN0W10sIG9wdGlvbnM6IGFueSk6IG9iamVjdFtdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICcuL25vZGVfbW9kdWxlcy9AYmlvbWVqcy9iaW9tZS9jb25maWd1cmF0aW9uX3NjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQmlvbWVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlID0gYHRlbGVtZXRyeSA9IGZhbHNlXG5cbltpbnN0YWxsXVxuZXhhY3QgPSB0cnVlXG5cbltydW5dXG5idW4gPSB0cnVlXG5gO1xuXG5jb25zdCBuZXdDb250ZW50V2l0aEV4YWN0RmFsc2UgPSBgdGVsZW1ldHJ5ID0gZmFsc2VcblxuW2luc3RhbGxdXG5leGFjdCA9IGZhbHNlXG5cbltydW5dXG5idW4gPSB0cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgY29uc3QgY29udGVudCA9XG4gICAgICBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSAmJiBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykuaW5jbHVkZXMoJ2V4YWN0ID0gZmFsc2UnKVxuICAgICAgICA/IG5ld0NvbnRlbnRXaXRoRXhhY3RGYWxzZVxuICAgICAgICA6IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnNvcnQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAncHknXS5zb3J0KCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnNvcnQoKSxcbiAgZXNsaW50OiBbJ2NqcycsICdtanMnLCAnanMnLCAnY3RzJywgJ210cycsICd0cycsICd0c3gnLCAnanN4J10uc29ydCgpLFxuICBwcmV0dGllcjogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjc3MnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnbWQnLFxuICAgICdzY3NzJyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0uc29ydCgpLFxuICAvLyBjZi4gaHR0cHM6Ly9iaW9tZWpzLmRldi9pbnRlcm5hbHMvbGFuZ3VhZ2Utc3VwcG9ydC9cbiAgYmlvbWU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ2FzdHJvJyxcbiAgICAnY3NzJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ2dxbCcsXG4gIF0uc29ydCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50cmMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgZmlsZXNcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRpZ25vcmUnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5lc2xpbnRCYXNlKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKCFvbGRDb250ZW50LmluY2x1ZGVzKCdleHBvcnQgeyBkZWZhdWx0IH0nKSkgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJyR7Y29uZmlnLmVzbGludEJhc2V9JztgKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuIS5rZWVwXG4uZW52LnByb2R1Y3Rpb25cbiovbW91bnQvKi5oYXNoXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5kZXZjb250YWluZXIvXG5kaXN0L1xudGVtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc0dvTW9kKSB7XG4gICAgICBuYW1lcy5wdXNoKCdnbycpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAke3BhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpfVxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgbmFtZXMucHVzaCgnZmx1dHRlcicsICdBbmRyb2lkU3R1ZGlvJywgJ3J1YnknKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmZsdXR0ZXItcGx1Z2lucy1kZXBlbmRlbmNpZXNcbmFuZHJvaWQva2V5LnByb3BlcnRpZXNcbmlvcy8uYnVuZGxlXG4uaWRlYS9ydW5Db25maWd1cmF0aW9ucy54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgdGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmxpdGVzdHJlYW0pIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ2NwLXNhLWtleS5qc29uXG5gO1xuICAgIH1cblxuICAgIGxldCBnZW5lcmF0ZWQgPSAnJztcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGxldCBjb250ZW50ID0gKGF3YWl0IHJlYWRDYWNoZShuYW1lKSkgPz8gJyc7XG4gICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3LnRvcHRhbC5jb20vZGV2ZWxvcGVycy9naXRpZ25vcmUvYXBpLyR7bmFtZX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJ0F0dGVudGlvbiBSZXF1aXJlZCEnKSB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJzx0aXRsZT4nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IHJlc3BvbnNlVGV4dC50cmltKCk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZUNhY2hlKG5hbWUsIGNvbnRlbnQpKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBGZXRjaGVkICR7dXJsfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2VuZXJhdGVkKSBnZW5lcmF0ZWQgKz0gJ1xcbic7XG4gICAgICBnZW5lcmF0ZWQgKz0gY29udGVudCArICdcXG4nO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBpZ25vcmVGaWxlVXRpbC5pc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoKSkpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlKCchLnlhcm4vY2FjaGUnLCAnIyAhLnlhcm4vY2FjaGUnKS5yZXBsYWNlKCcjIC5wbnAuKicsICcucG5wLionKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwgfHwgY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcjIC5pZGVhL21vZHVsZXMueG1sJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eKC5pZGVhXFwvLispJC9nbSwgJyQxXFxuYW5kcm9pZC8kMScpO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgJ1xcbicgKyBnZW5lcmF0ZWQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNhY2hlJywgJ3diZnknLCAnZ2l0aWdub3JlJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FjaGUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHsgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmdhbml6YXRpb246IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IGRhdGE6IGNvbW1pdHMgfSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzJywge1xuICAgICAgb3duZXI6IG9yZ2FuaXphdGlvbixcbiAgICAgIHJlcG8sXG4gICAgICBwZXJfcGFnZTogMSxcbiAgICB9KTtcbiAgICBpZiAoY29tbWl0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1pdHNbMF0uc2hhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgRXNsaW50VXRpbCA9IHtcbiAgZ2V0TGludEZpeFN1ZmZpeChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3ggPyAnIC0tcnVsZSBcInsgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzOiAwIH1cIicgOiAnJztcbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFc2xpbnRFeHRlbnNpb25CYXNlLCBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgQkxJVFpfVkVSU0lPTiwgTkVYVF9WRVJTSU9OIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbkNvbnN0YW50cy5qcyc7XG5cbmNvbnN0IGpzQ29tbW9uRGVwcyA9IFtcbiAgJ2VzbGludCcsXG4gICdlc2xpbnQtY29uZmlnLWZsYXQtZ2l0aWdub3JlJyxcbiAgJ2VzbGludC1jb25maWctcHJldHRpZXInLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbiAgJ2VzbGludC1wbHVnaW4tdW51c2VkLWltcG9ydHMnLFxuICAnZ2xvYmFscycsXG5dO1xuXG5jb25zdCB0c0NvbW1vbkRlcHMgPSBbLi4uanNDb21tb25EZXBzLCAndHlwZXNjcmlwdC1lc2xpbnQnLCAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0J107XG5cbmNvbnN0IHJlYWN0Q29tbW9uRGVwcyA9IFsnZXNsaW50LXBsdWdpbi1yZWFjdCcsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJ107XG5cbmNvbnN0IGVzbGludERlcHM6IFJlY29yZDxFc2xpbnRFeHRlbnNpb25CYXNlLCBzdHJpbmdbXT4gPSB7XG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLCAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAgICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JyxcbiAgICAuLi5qc0NvbW1vbkRlcHMsXG4gICAgLi4ucmVhY3RDb21tb25EZXBzLFxuICBdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJywgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyxcbiAgICAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICdlc2xpbnQtcGx1Z2luLWltcG9ydCcsXG4gICAgJ2VzbGludC1jb25maWctbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgfHwge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyB8fCB7fTtcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqIGFzIFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuICApO1xuXG4gIGlmIChqc29uT2JqLm5hbWUgIT09ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJykge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAvLyBGcmVzaCByZXBvIHN0aWxsIHJlcXVpcmVzICd5YXJuIGluc3RhbGwnXG4gICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnZ2l0IGNsb25lJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgveWFyblxccyomJlxccyovLCAnJykucmVwbGFjZSgveWFyblxccyppbnN0YWxsXFxzKiYmXFxzKi8sICcnKTtcbiAgICB9XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPSBtZXJnZShqc29uT2JqLnNjcmlwdHMsIGdlbmVyYXRlU2NyaXB0cyhjb25maWcpKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5ICs9IGF3YWl0IGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoY29uZmlnLmRpclBhdGgpO1xuICB9XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1hbGwnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tcmVjdXJzaXZlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXNpbmNlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXdvcmt0cmVlJylcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJywgJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsJyk7XG4gIH1cblxuICBsZXQgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZGV2RGVwZW5kZW5jaWVzID0gWydwcmV0dGllcicsICdzb3J0LXBhY2thZ2UtanNvbicsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJ107XG4gIGNvbnN0IHBvZXRyeURldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICB9IGVsc2Uge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsaW50LXN0YWdlZCcpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2h1c2t5J107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3BpbnN0J107XG4gICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdsZWZ0aG9vayBpbnN0YWxsIHx8IHRydWUnO1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBodXNreVxuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2h1c2t5Jyk7XG4gICAgICAvLyAnfHwgdHJ1ZScgYXZvaWRzIGVycm9ycyB3aGVuIGh1c2t5IGlzIG5vdCBpbnN0YWxsZWQuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdodXNreSB8fCB0cnVlJzsgLy8gZm9yIG5vbi15YXJuIHBhY2thZ2UgbWFuYWdlcnMuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPSAnaHVza3kgfHwgdHJ1ZSc7IC8vIGZvciB5YXJuLlxuICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gfHwgY29uZmlnLmlzUmVmZXJyZWRCeU90aGVyUmVwbykge1xuICAgICAgICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgICAgICAgLy8gaHR0cHM6Ly90eXBpY29kZS5naXRodWIuaW8vaHVza3kvIy8/aWQ9aW5zdGFsbC0xXG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwaW5zdCcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFjayA9ICdwaW5zdCAtLWRpc2FibGUnO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMucG9zdHBhY2sgPSAncGluc3QgLS1lbmFibGUnO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPVxuICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddIHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICAgICA/IC8vIFRPRE86IHJlbW92ZSB0aGUgdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGFmdGVyIG11bHRpLXNlbWFudGljLXJlbGVhc2Ugc3VwcG9ydHMgdmVyc2lvbiA3K1xuICAgICAgICAgICAgJ0A2LjEuMCdcbiAgICAgICAgICA6ICcnO1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goYGNvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cyR7dmVyc2lvbn1gKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzWydhcnRpbGxlcnknXSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snYXJ0aWxsZXJ5J107XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ3BsYXl3cmlnaHQnXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sncGxheXdyaWdodCddO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLndiIHx8IGNvbmZpZy5pc0J1bikge1xuICAgIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10pIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgvd2JcXHMrZGIvLCAnd2IgcHJpc21hJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BiaW9tZWpzL2Jpb21lJywgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnKTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50J107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ21pY3JvbWF0Y2gnXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sndHlwZXNjcmlwdC1lc2xpbnQnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2VzbGludCcsICdtaWNyb21hdGNoJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCd0eXBlc2NyaXB0Jyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmVzbGludEJhc2UpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5lc2xpbnREZXBzW2NvbmZpZy5lc2xpbnRCYXNlXSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgfVxuXG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gQmVjYXVzZSBgXCJyZXNvbHV0aW9uc1wiOiB7IFwibnBtL2NoYWxrXCI6IFwiXjQuMS4yXCIgfSxgIGNhdXNlcyBcIkludmFsaWQgbnBtIHRva2VuXCJcbiAgZGVsZXRlIGpzb25PYmoucmVzb2x1dGlvbnM/LlsnbnBtL2NoYWxrJ107XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMubGludDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmNsZWFudXAgPSBqc29uT2JqLnNjcmlwdHMuY2xlYW51cD8ucmVwbGFjZSgnICYmIHlhcm4gbGludC1maXgnLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gKz0gRXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGZsdXR0ZXIgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCArPSBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoL1svXFxcXF0vKTtcbiAgICAgICAgaWYgKHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGBwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiBwb2V0cnkgcnVuIGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ICs9IGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICAgIHBvZXRyeURldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnJlcG9zaXRvcnkpIHtcbiAgICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5O1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICBgYmxpdHpAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgQGJsaXR6anMvYXV0aEAke0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBAYmxpdHpqcy9uZXh0QCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYEBibGl0empzL3JwY0Ake0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBuZXh0QCR7TkVYVF9WRVJTSU9OfWBcbiAgICApO1xuICAgIC8vIFByZWZlciBlc2xpbnQtY29uZmlnLW5leHQncyBkZXBlbmRlbmNpZXNcbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkKSA9PiBkICE9PSAnZXNsaW50LXBsdWdpbi1yZWFjdCcgJiYgZCAhPT0gJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnKTtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXM/LnByZXR0aWVyKSB7XG4gICAgLy8gQmVjYXVzZSBAdHlwZXMvcHJldHRpZXIgYmxvY2tzIHByZXR0aWVyIGV4ZWN1dGlvbi5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9wcmV0dGllciddO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmoucGVlckRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmoucGVlckRlcGVuZGVuY2llcztcbiAgfVxuXG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgbGV0IG5ld0pzb25UZXh0ID0gSlNPTi5zdHJpbmdpZnkoanNvbk9iaik7XG4gIG5ld0pzb25UZXh0ID0gYXdhaXQgZml4U2NyaXB0TmFtZXMoanNvbk9iai5zY3JpcHRzLCBuZXdKc29uVGV4dCwgY29uZmlnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdKc29uVGV4dCk7XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRldkRlcGVuZGVuY2llcy5cbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRldkRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXBlbmRlbmNpZXMuXG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLUQnLCAuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICAgIGlmIChwb2V0cnlEZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLm5ldyBTZXQocG9ldHJ5RGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChqc29uT2JqLmF1dGhvciA9PT0gJ1dpbGxCb29zdGVyIExMQycpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LWFsbC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrL3dhcm4nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmdlbi1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpjb2RlZ2VuJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1sndHNsaWInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXJlYWN0J107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci90c2NvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZSddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4tcHJldHRpZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsZXJuYSddO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydwaW5zdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHJldHRpZXInXTtcbiAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZm9yIChjb25zdCBkZXBzIG9mIE9iamVjdC52YWx1ZXMoZXNsaW50RGVwcykpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSgnbGVybmEuanNvbicsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gIC8vIE1pZ3JhdGUgZnJvbSBFU0xpbnQgbGVnYWN5IGNvbmZpZ3MgdG8gZmxhdCBjb25maWdzLFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4taW1wb3J0J107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2NoZWNrLWFsbCc6ICdidW4gcnVuIGNsZWFudXAgJiYgYnVuIHJ1biB0eXBlY2hlY2sgJiYgYnVuIHJ1biB0ZXN0JyxcbiAgICAgIGNsZWFudXA6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gLS1idW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIC0tYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyxcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwnOiAneWFybiBjbGVhbnVwICYmIHlhcm4gdHlwZWNoZWNrICYmIHlhcm4gdGVzdCcsXG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5YCxcbiAgICAgIGxpbnQ6IGBlc2xpbnQgLS1jb2xvcmAsXG4gICAgICAnbGludC1maXgnOiAneWFybiBsaW50IC0tZml4JyxcbiAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX1cIiBcIiEqKi90ZXN0LWZpeHR1cmVzLyoqXCJgLFxuICAgICAgdHlwZWNoZWNrOiAndHNjIC0tbm9FbWl0IC0tUHJldHR5JyxcbiAgICB9O1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBjb25zdCBvbGRUZXN0ID0gc2NyaXB0cy50ZXN0O1xuICAgICAgc2NyaXB0cyA9IG1lcmdlKFxuICAgICAgICB7IC4uLnNjcmlwdHMgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnkgJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oXG4gICAgICAgICAgICAnLCdcbiAgICAgICAgICApfX1cIiBcIiEqKi9wYWNrYWdlcy8qKlwiIFwiISoqL3Rlc3QtZml4dHVyZXMvKipcImAsXG4gICAgICAgICAgLy8gQ0k9MSBwcmV2ZW50cyB2aXRlc3QgZnJvbSBlbmFibGluZyB3YXRjaC5cbiAgICAgICAgICAvLyBGT1JDRV9DT0xPUj0zIG1ha2Ugd2IgZW5hYmxlIGNvbG9yIG91dHB1dC5cbiAgICAgICAgICB0ZXN0OiAnQ0k9MSBGT1JDRV9DT0xPUj0zIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tdmVyYm9zZSBydW4gdGVzdCcsXG4gICAgICAgICAgdHlwZWNoZWNrOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIHR5cGVjaGVjaycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAob2xkVGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9IHNjcmlwdHMudHlwZWNoZWNrID8gYCR7c2NyaXB0cy50eXBlY2hlY2t9ICYmIGAgOiAnJztcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICdweXJpZ2h0JztcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gJ3diIHR5cGVjaGVjayc7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeFNjcmlwdE5hbWVzKFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuZXdKc29uVGV4dDogc3RyaW5nLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG9sZEFuZE5ld1NjcmlwdE5hbWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5XSBvZiBPYmplY3Qua2V5cyhzY3JpcHRzKSkge1xuICAgIGlmIChrZXlbMF0gIT09ICc6JyAmJiBrZXkuaW5jbHVkZXMoJzonKSkge1xuICAgICAgb2xkQW5kTmV3U2NyaXB0TmFtZXMucHVzaChba2V5LCBrZXkucmVwbGFjZUFsbCgnOicsICctJyldKTtcbiAgICB9XG4gIH1cbiAgaWYgKG9sZEFuZE5ld1NjcmlwdE5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ld0pzb25UZXh0O1xuXG4gIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgbmV3SnNvblRleHQgPSBuZXdKc29uVGV4dC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICB9XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyoqLyoue21kLGNqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsICcqKi9Eb2NrZXJmaWxlJ10sIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuICAgICAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBvbGRDb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICByZXR1cm4gbmV3SnNvblRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzIHx8IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2F1dGgnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvYXV0aCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdhdXRoJyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9hdXRoJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvYXV0aC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0BkaXNjb3JkLWJvdC9zaGFyZWQnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAZGlzY29yZC1ib3Qvc2hhcmVkJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnZGlzY29yZC1ib3QnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2Rpc2NvcmQtYm90LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuXG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2NvZGUtYW5hbHl6ZXInKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXSA9XG4gICAgICBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvY29kZS1hbmFseXplci5naXQjd29ya3NwYWNlPUBjb2RlLWFuYWx5emVyL2NsaWVudCZjb21taXQ9JHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9qdWRnZScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnanVkZ2UnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvanVkZ2UuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2xsbS1wcm94eScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2xsbS1wcm94eScpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvbGxtLXByb3h5LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHByZUNvbW1pdDogJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vbGludC1zdGFnZWQnLFxuICBwcmVQdXNoOiBgeWFybiB0eXBlY2hlY2tgLFxuICBwcmVQdXNoRm9yTGFiOiBgXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxueWFybiB0eXBlY2hlY2tcbmAudHJpbSgpLFxuICBwb3N0TWVyZ2U6IGBcbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBwYWNrYWdlSnNvbi5zY3JpcHRzIHx8PSB7fTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3Bvc3RpbnN0YWxsJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwb3N0cHVibGlzaCddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncHJlcGFyZSddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncHJlcHVibGlzaE9ubHknXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3ByZXBhY2snXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3Bvc3RwYWNrJ107XG5cbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreScpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIHVuZGVmaW5lZCwgMikpLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBzcGF3blN5bmMoJ2dpdCcsIFsnY29uZmlnJywgJy0tdW5zZXQnLCAnY29yZS5ob29rc1BhdGgnXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ2h1c2t5LWluaXQnLCAnLS15YXJuMiddLCBjb25maWcuZGlyUGF0aCk7XG5cbiAgY29uc3QgcHJlQ29tbWl0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3ByZS1jb21taXQnKTtcblxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLndyaXRlRmlsZShwcmVDb21taXRGaWxlUGF0aCwgc2NyaXB0cy5wcmVDb21taXQgKyAnXFxuJykpO1xuXG4gIGNvbnN0IHsgdHlwZWNoZWNrIH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnKTtcbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGxldCBwcmVQdXNoID0gY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSA/IHNjcmlwdHMucHJlUHVzaEZvckxhYiA6IHNjcmlwdHMucHJlUHVzaDtcbiAgICBwcmVQdXNoID0gcHJlUHVzaC5yZXBsYWNlKFxuICAgICAgJ3lhcm4gdHlwZWNoZWNrJyxcbiAgICAgIHR5cGVjaGVja1xuICAgICAgICAucmVwbGFjZSgndHNjICcsICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL3RzYyAnKVxuICAgICAgICAucmVwbGFjZSgnd2IgJywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vd2IgJylcbiAgICAgICAgLy8gcHlyaWdodCBoYXMgbm8gYXJndW1lbnRzXG4gICAgICAgIC5yZXBsYWNlKCdweXJpZ2h0JywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHlyaWdodCcpXG4gICAgKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgICBtb2RlOiAwbzc1NSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dCkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXdrICd7cHJpbnQgXFwkMX0nIC50b29sLXZlcnNpb25zIHwgeGFyZ3MgLUl7fSBhc2RmIHBsdWdpbiBhZGQge31cImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBwbHVnaW4gdXBkYXRlIC0tYWxsXCJgXG4gICAgKTtcbiAgfVxuICAvLyBQeXRob27jgYzjgarjgYTjgajjgqTjg7Pjgrnjg4jjg7zjg6vjgafjgY3jgarjgYTlh6bnkIbns7vjgYzlrZjlnKjjgZnjgovjgZ/jgoHjgIHlvLfliLbnmoTjgavmnIDliJ3jgavjgqTjg7Pjgrnjg4jjg7zjg6vjgZnjgovjgIJcbiAgaWYgKGNvbmZpZy52ZXJzaW9uc1RleHQ/LmluY2x1ZGVzKCdweXRob24gJykpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIGluc3RhbGwgcHl0aG9uXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dCkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgaW5zdGFsbFwiYCk7XG4gIH1cbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIGluc3RhbGwnIDogJ3lhcm4nO1xuICBjb25zdCBybU5leHREaXJlY3RvcnkgPSBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCA/ICcgJiYgcm0gLVJmIC5uZXh0JyA6ICcnO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKGBydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXFxcLmpzb25cIiBcIiR7aW5zdGFsbENvbW1hbmR9JHtybU5leHREaXJlY3Rvcnl9XCJgKTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuXG5jb25zdCBwcmV0dGllckNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdub2RlJywgJ25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZScsICdQcmV0dGllcicsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmNvbnN0IGJpb21lQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ2J1bicsICctLWJ1biBub2RlX21vZHVsZXMvLmJpbi9iaW9tZSBjaGVjayAtLWZpeCAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1za2lwLWVycm9ycycsICdCaW9tZScsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAoY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbmZpZy5pc0J1biA/IGJpb21lQ29udGVudCA6IHByZXR0aWVyQ29udGVudCkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyB9IGZyb20gJy4vaHVza3lyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuY29uc3QgbmV3U2V0dGluZ3MgPSB7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdwcmVwYXJlLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgY29tbWFuZHM6IHtcbiAgICAgIGNsZWFudXA6IHtcbiAgICAgICAgZ2xvYjogJyoue2Nqcyxjc3MsY3RzLGh0bSxodG1sLGpzLGpzb24sanNvbjUsanNvbmMsanN4LG1kLG1qcyxtdHMsc2Nzcyx0cyx0c3gsdnVlLHlhbWwseW1sfScsXG4gICAgICAgIHJ1bjogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IHtzdGFnZWRfZmlsZXN9ICYmIGdpdCBhZGQge3N0YWdlZF9maWxlc30nLFxuICAgICAgfSxcbiAgICAgICdjaGVjay1taWdyYXRpb25zJzoge1xuICAgICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICAgIHJ1bjogYFxuaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyB7c3RhZ2VkX2ZpbGVzfTsgdGhlblxuICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlcyAoe3N0YWdlZF9maWxlc30pIGNvbnRhaW4gd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICBleGl0IDFcbmZpXG5gLnRyaW0oKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdjaGVjay5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwcmVQdXNoOiBgYnVuIC0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL3diIHR5cGVjaGVja2AsXG4gIHByZVB1c2hGb3JMYWI6IGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG5idW4gLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vd2IgdHlwZWNoZWNrXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGNvbnN0IHsgdHlwZWNoZWNrIH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnKTtcbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGNvbnN0IHByZVB1c2ggPSBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBzcmNEaXJlY3RvcmllcyA9IHtcbiAgbm9kZTogWydzcmMnLCAndGVzdHMnLCAnc2NyaXB0cyddLnNvcnQoKSxcbiAgYmxpdHo6IFsnc3JjJywgJ3Rlc3RzJywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS5zb3J0KCksXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3JjRGlycyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcmV0dXJuIHNyY0RpcmVjdG9yaWVzLmJsaXR6O1xuICB9XG4gIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ub2RlO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgRXNsaW50VXRpbCB9IGZyb20gJy4uL3V0aWxzL2VzbGludFV0aWwuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0U3JjRGlycyB9IGZyb20gJy4uL3V0aWxzL3NyY0RpcmVjdG9yaWVzLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGludHN0YWdlZHJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5janMnKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZVByZWZpeCA9IGNvbmZpZy5pc1Jvb3QgPyAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi8nIDogJ25vZGUgLi4vLi4vbm9kZV9tb2R1bGVzLy5iaW4vJztcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCkge1xuICAgIGNvbnN0IGVzbGludCA9IGBcbiAgJyR7Z2V0RXNsaW50S2V5KGNvbmZpZyl9JzogWyR7SlNPTi5zdHJpbmdpZnkoXG4gICAgYCR7cGFja2FnZVByZWZpeH1lc2xpbnQgLS1maXgke0VzbGludFV0aWwuZ2V0TGludEZpeFN1ZmZpeChjb25maWcpfWBcbiAgKX0sICcke3BhY2thZ2VQcmVmaXh9cHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlJ10sYDtcbiAgICBsaW5lcy5wdXNoKGVzbGludCk7XG4gIH1cbiAgY29uc3QgcGFja2FnZXNGaWx0ZXIgPSBjb25maWcuaXNSb290ID8gXCIgJiYgIWZpbGUuaW5jbHVkZXMoJy9wYWNrYWdlcy8nKVwiIDogJyc7XG4gIGxpbmVzLnB1c2goYFxuICAnLi8qKi8qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX0nOiBmaWxlcyA9PiB7XG4gICAgbGV0IGZpbHRlcmVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhZmlsZS5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJykke3BhY2thZ2VzRmlsdGVyfSk7JHtnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWcpfVxuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gW1xcYCR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMuc29tZShmaWxlID0+IGZpbGUuZW5kc1dpdGgoJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnJHtwYWNrYWdlUHJlZml4fXNvcnQtcGFja2FnZS1qc29uJyk7XG4gICAgfVxuICAgIHJldHVybiBjb21tYW5kcztcbiAgfSxcbiAgJy4vKiovbWlncmF0aW9uLnNxbCc6IChmaWxlcykgPT4ge1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpO1xuICAgIGlmIChjb250ZW50LmluY2x1ZGVzKCdXYXJuaW5nczonKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXFxgISEhIE1pZ3JhdGlvbiBTUUwgZmlsZSAoXFwke3BhdGgucmVsYXRpdmUoJycsIGZpbGUpfSkgY29udGFpbnMgd2FybmluZ3MgISEhIFNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlxcYCxcbiAgICAgIF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn0sYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4ve2xpYix0ZXN0LHRlc3RfZHJpdmVyfS8qKi8qLmRhcnQnOiBmaWxlcyA9PiB7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCdnZW5lcmF0ZWQnKSlcbiAgICAgIC5maWx0ZXIoZmlsZSA9PiAhZmlsZS5lbmRzV2l0aCgnLmZyZWV6ZWQuZGFydCcpICYmICFmaWxlLmVuZHNXaXRoKCcuZy5kYXJ0JykpO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBbXFxgZmx1dHRlciBmb3JtYXQgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gIH0sYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgbGluZXMucHVzaChgXG4gICcuLyoqLyoucHknOiBbXG4gICAgJ3BvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzJyxcbiAgICAncG9ldHJ5IHJ1biBibGFjaycsXG4gICAgJ3BvZXRyeSBydW4gZmxha2U4J1xuICBdLGApO1xuICB9XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuJHtjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCA/IFwiY29uc3QgbWljcm9tYXRjaCA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcXG5cIiA6ICcnfVxubW9kdWxlLmV4cG9ydHMgPSB7JHtsaW5lcy5qb2luKCcnKX1cbn07XG5gO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRLZXkoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgZGlycyA9IGdldFNyY0RpcnMoY29uZmlnKS5tYXAoKGRpcikgPT4gYCR7ZGlyfS8qKi9gKTtcbiAgcmV0dXJuIGB7LCR7ZGlycy5qb2luKCcsJyl9fSoueyR7ZXh0ZW5zaW9ucy5lc2xpbnQuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRcbiAgICA/IGBcXG5cbiAgICBmaWx0ZXJlZEZpbGVzID0gZmlsdGVyZWRGaWxlcy5tYXAoKGZpbGUpID0+IHBhdGgucmVsYXRpdmUoJycsIGZpbGUpKTtcbiAgICBmaWx0ZXJlZEZpbGVzID0gbWljcm9tYXRjaC5ub3QoZmlsdGVyZWRGaWxlcywgJyR7Z2V0RXNsaW50S2V5KGNvbmZpZyl9Jyk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlc29sdmUoZmlsZSkpO2BcbiAgICA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWydqcycsICdtanMnLCAnY2pzJ11cbiAgICAgIC5tYXAoKGV4dCkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgbmV4dC5jb25maWcuJHtleHR9YCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIC8vIFJlcGxhY2UgdGhlIEpTT04gb2JqZWN0IGZyb20gdGhlIGZpbGVcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC89XFxzKnsoW1xcU1xcc10qKX07LywgKF8sIHNldHRpbmdzVGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIXNldHRpbmdzVGV4dC5pbmNsdWRlcygnZXNsaW50OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAnZXNsaW50OiB7IGlnbm9yZUR1cmluZ0J1aWxkczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICBpZiAoIXNldHRpbmdzVGV4dC5pbmNsdWRlcygndHlwZXNjcmlwdDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ3R5cGVzY3JpcHQ6IHsgaWdub3JlQnVpbGRFcnJvcnM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGA9IHske3NldHRpbmdzVGV4dH19O2A7XG4gICAgfSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgdmVudlBhdGg6ICcuJyxcbiAgdmVudjogJy52ZW52Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSBjbG9uZURlZXAoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkge1xuICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5Py5pbmRleE9mKCc6JykgKyAxKTtcbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5yZWFkZGlyU3luYyhgJHtjb25maWcuZGlyUGF0aH0vLmdpdGh1Yi93b3JrZmxvd3NgKTtcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lcykge1xuICAgICAgaWYgKCFmaWxlTmFtZS5zdGFydHNXaXRoKCd0ZXN0JykgJiYgIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSBjb250aW51ZTtcblxuICAgICAgbGV0IGJhZGdlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBjb25zdCBiYWRnZSA9IGBbIVske2JhZGdlTmFtZX1dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9L2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9KWA7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuZ2l0aHViL3dvcmtmbG93cy8ke2ZpbGVOYW1lfWApKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgYmFkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0QmFkZ2UocmVhZG1lOiBzdHJpbmcsIGJhZGdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDml6LjgatiYWRnZeOBjOOBguOCi+WgtOWQiOOBr+WJiumZpFxuICByZWFkbWUgPSByZWFkbWUucmVwbGFjZShiYWRnZSwgJycpLnJlcGxhY2VBbGwoL1xcblxcblxcbisvZywgJ1xcblxcbicpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVhZG1lLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlYWRtZVtpIC0gMV0gPT09ICdcXG4nICYmIHJlYWRtZVtpXSA9PT0gJ1xcbicpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHJlYWRtZS5zbGljZSgwLCBpICsgMSk7XG4gICAgICBsZXQgYWZ0ZXIgPSByZWFkbWUuc2xpY2UoaSArIDEpO1xuICAgICAgaWYgKCFhZnRlci5zdGFydHNXaXRoKCdbJykgJiYgIWFmdGVyLnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICBhZnRlciA9IGBcXG4ke2FmdGVyfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7YmVmb3JlfSR7YmFkZ2V9XFxuJHthZnRlcn1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7cmVhZG1lfVxcbiR7YmFkZ2V9XFxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICBwbHVnaW5zOiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3M/LnBsdWdpbnMgfHwgW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW4gPSBBcnJheS5pc0FycmF5KHBsdWdpbnNbaV0pID8gcGx1Z2luc1tpXVswXSA6IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSAmJiBwbHVnaW5zW2ldWzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFsnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbjUnXSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSB0eXBlb2YganNvbk9iaiAmIHsgcGFja2FnZVJ1bGVzOiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoanNvbk9iaikgYXMgU2V0dGluZ3M7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdyZW5vdmF0ZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7ZmlsZVBhdGh9NWApKSB7XG4gICAgICAvLyBTaW5jZSBpdCBpcyBkaWZmaWN1bHQgZm9yIHBhcnNpbmcgcmVub3ZhdGUuanNvbjUsIHdlIGRvIG5vdGhpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBEb24ndCB1cGdyYWRlIE5leHQuanMgYXV0b21hdGljYWxseVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMgPz89IFtdO1xuICAgICAgaWYgKFxuICAgICAgICAhbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnNvbWUoKHJ1bGU6IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcy5pbmNsdWRlcygnbmV4dCcpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMucHVzaCh7IG1hdGNoUGFja2FnZU5hbWVzOiBbJ25leHQnXSwgZW5hYmxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kZXBlbmRhYm90JyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVub3ZhdGVyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikuc29ydCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG5cbiAgICAvLyBpZiB2YWx1ZSBpcyBhbiBvYmplY3QsIHNvcnQgdGhlIGtleXMgb2YgdGhlIG9iamVjdFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCByb290SnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgdGFyZ2V0OiAnRVMyMDIyJywgLy8gYmVjYXVzZSBkZWNvcmF0b3JzIHNob3VsZCBiZSB0cmFuc3BpbGVkIHRvIEVTMjAyMiBvbiBOb2RlLmpzXG4gICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZScsXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBlcmFzYWJsZVN5bnRheE9ubHk6IHRydWUsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuL0B0eXBlcyddLFxuICB9LFxuICBpbmNsdWRlOiBbXG4gICAgJ3NyYy8qKi8qJyxcbiAgICAndGVzdHMvKiovKicsXG4gICAgJ3NjcmlwdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc3JjLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3Rlc3RzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NjcmlwdHMvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICB0YXJnZXQ6ICdFUzIwMjInLCAvLyBiZWNhdXNlIGRlY29yYXRvcnMgc2hvdWxkIGJlIHRyYW5zcGlsZWQgdG8gRVMyMDIyIG9uIE5vZGUuanNcbiAgICBtb2R1bGU6ICdFU05leHQnLFxuICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlJyxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgc2tpcExpYkNoZWNrOiB0cnVlLCAvLyBiZWNhdXNlIGxpYnJhcmllcyBtYXkgaGF2ZSBicm9rZW4gdHlwZXNcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIGVyYXNhYmxlU3ludGF4T25seTogdHJ1ZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgICB0eXBlUm9vdHM6IFsnLi4vLi4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuLi8uLi9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgaW5jbHVkZTogWydzcmMvKiovKicsICd0ZXN0cy8qKi8qJywgJ3NjcmlwdHMvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHJldHVybjtcblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChjb25maWcuaXNSb290ID8gcm9vdEpzb25PYmogOiBzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgbW9kdWxlOiAnTm9kZU5leHQnLFxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZU5leHQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBpZiAob2xkU2V0dGluZ3MuZXh0ZW5kcyA9PT0gJy4vbm9kZV9tb2R1bGVzL0B3aWxsYm9vc3Rlci90c2NvbmZpZy90c2NvbmZpZy5qc29uJykge1xuICAgICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IG1vZGlmeSBcInRhcmdldFwiLCBcIm1vZHVsZVwiIGFuZCBcIm1vZHVsZVJlc29sdXRpb25cIi5cbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnRhcmdldDtcbiAgICAgIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5tb2R1bGU7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZVJlc29sdXRpb247XG4gICAgICB9XG4gICAgICBpZiAob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgfVxuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fJylcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgICB9XG4gICAgICAvLyBMTE3jgavjgojjgot2aWJlIGNvZGluZ+OBp+OBr+OAgeiHquWLleODleOCqeODvOODnuODg+ODiOOChOOCs+ODvOODieOCouOCr+OCt+ODp+ODs+OCkueEoeWKueWMluOBmeOCi+OBk+OBqOOBp1xuICAgICAgLy8g55Sf5oiQ44GV44KM44Gf44Kz44O844OJ44Gu5YWD44Gu5b2i5byP44KS57at5oyB44Gn44GN44KLXG4gICAgICBpZiAoJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIGlmICgnZWRpdG9yLmZvcm1hdE9uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuZm9ybWF0T25TYXZlJ107XG4gICAgICB9XG4gICAgICBzb3J0S2V5cygoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID8/IHt9KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvbjogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIGpvYnM6IHsgW2tleTogc3RyaW5nXTogSm9iIH07XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICBpc3N1ZXM/OiBUeXBlcztcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3Q7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcztcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICB1c2VzOiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICAncGF0aHMtaWdub3JlJzogWycqKi5tZCcsICcqKi9kb2NzLyoqJ10sXG4gICAgICB9LFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJywgJ3diZnknXSxcbiAgICAgICAgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHdiZnk6IHtcbiAgICBuYW1lOiAnV2lsbGJvb3N0ZXJpZnknLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHdiZnk6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy93YmZ5LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3diZnktbWVyZ2UnOiB7XG4gICAgbmFtZTogJ01lcmdlIHdiZnknLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICd3YmZ5LW1lcmdlJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3diZnktbWVyZ2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxuICAnbm90aWZ5LXJlYWR5Jzoge1xuICAgIG5hbWU6ICdOb3RpZnkgcmVhZHknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdub3RpZnktcmVhZHknOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvbm90aWZ5LXJlYWR5LnltbEBtYWluJyxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIERJU0NPUkRfV0VCSE9PS19VUkw6ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUFEWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2FkZC1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgIG5hbWU6ICdBZGQgaXNzdWUgdG8gR2l0SHViIHByb2plY3QnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdhZGQtaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hZGQtaXNzdWUtdG8tcHJvamVjdC55bWxAbWFpbicsXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBHSF9QUk9KRUNUX1VSTDogJyR7eyBzZWNyZXRzLkdIX1BST0pFQ1RfVVJMIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgIG5hbWU6ICdBZGQgcmVhZHkgaXNzdWUgdG8gR2l0SHViIHByb2plY3QnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hZGQtaXNzdWUtdG8tcHJvamVjdC55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICBsYWJlbGVkOiAncmVhZHkgOnJvY2tldDonLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0hfUFJPSkVDVF9VUkw6ICdodHRwczovL2dpdGh1Yi5jb20vb3Jncy9XaWxsQm9vc3RlckxhYi9wcm9qZWN0cy81JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZpZyBvZiBzZW1hbnRpYyBwdWxsIHJlcXVlc3RcbiAgICBjb25zdCBzZW1hbnRpY1ltbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICdzZW1hbnRpYy55bWwnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oc2VtYW50aWNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGZpbGVOYW1lU2V0ID0gbmV3IFNldChbXG4gICAgICAndGVzdC55bWwnLFxuICAgICAgJ3diZnkueW1sJyxcbiAgICAgICd3YmZ5LW1lcmdlLnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAnYWRkLWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAgIC4uLmVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuaXNQdWJsaWNSZXBvIHx8IHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0LnltbCcpO1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdub3RpZnktcmVhZHkueW1sJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZVNldCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBjb25zdCBraW5kID0gcGF0aC5iYXNlbmFtZShmaWxlTmFtZSwgJy55bWwnKSBhcyBLbm93bktpbmQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCkpO1xuICAgIH1cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnYWRkLWZvY3VzZWQtaXNzdWUtdG8tcHJvamVjdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKHdvcmtmbG93c1traW5kIGFzIGtleW9mIHR5cGVvZiB3b3JrZmxvd3NdID8/IHt9KSBhcyBXb3JrZmxvdztcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIGlmIChuZXdTZXR0aW5ncy5qb2JzKSB7XG4gICAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgfVxuICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPSBbXG4gICAgICAgIC4uLm5ldyBTZXQoWycqKi5tZCcsICcqKi9kb2NzLyoqJywgLi4uKG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID8/IFtdKV0pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcz8uKCcvcmV1c2FibGUtd29ya2Zsb3dzLycpKSByZXR1cm47XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICB9XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5Jzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uKSBzZXRTY2hlZHVsZShuZXdTZXR0aW5ncywgMjAsIDI0KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5LW1lcmdlJzoge1xuICAgICAgc2V0U2NoZWR1bGUobmV3U2V0dGluZ3MsIDEsIDQpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3MpO1xuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzZW1hbnRpYy1yZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jIHx8ICFuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCB8fD0ge307XG4gIGpvYi5zZWNyZXRzIHx8PSB7fTtcblxuICBpZiAoXG4gICAga2luZCA9PT0gJ3Rlc3QnIHx8XG4gICAga2luZCA9PT0gJ3JlbGVhc2UnIHx8XG4gICAga2luZCA9PT0gJ3diZnknIHx8XG4gICAga2luZCA9PT0gJ3diZnktbWVyZ2UnIHx8XG4gICAga2luZCA9PT0gJ2FkZC1pc3N1ZS10by1wcm9qZWN0JyB8fFxuICAgIGtpbmQgPT09ICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCdcbiAgKSB7XG4gICAgam9iLnNlY3JldHNbJ0dIX1RPS0VOJ10gPSBjb25maWcuaXNQdWJsaWNSZXBvID8gJyR7eyBzZWNyZXRzLlBVQkxJQ19HSF9CT1RfUEFUIH19JyA6ICcke3sgc2VjcmV0cy5HSF9CT1RfUEFUIH19JztcbiAgfVxuICBpZiAoY29uZmlnLnJlbGVhc2UubnBtICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnKSkge1xuICAgIGpvYi5zZWNyZXRzWydOUE1fVE9LRU4nXSA9ICcke3sgc2VjcmV0cy5OUE1fVE9LRU4gfX0nO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0c1snRklSRUJBU0VfVE9LRU4nXSkge1xuICAgIGpvYi5zZWNyZXRzWydHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFJ10gPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzWydGSVJFQkFTRV9UT0tFTiddO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHNbJ0RJU0NPUkRfV0VCSE9PS19VUkwnXSAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzWydESVNDT1JEX1dFQkhPT0tfVVJMJ10gPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGg/LnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IHBhcmFtcy5yZXBsYWNlKCdzeW5jICcsICcnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXMucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzLnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGhbJ2RvdF9lbnZfcGF0aCddID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGhbJ2RvdF9lbnZfcGF0aCddO1xuICB9XG4gIC8vIFJlbW92ZSBkZXByZWNhdGVkIHBhcmFtZXRlcnNcbiAgbWlncmF0ZUpvYihqb2IpO1xuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0c1snRkxZX0FQSV9UT0tFTiddICYmIHR5cGVvZiBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXSA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXSA9IGpvYi53aXRoWydkZXBsb3lfY29tbWFuZCddLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNEb2NrZXJmaWxlKSB7XG4gICAgaWYgKGpvYi53aXRoWydjaV9zaXplJ10gIT09ICdleHRyYS1sYXJnZScgJiYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgfHwga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpKSB7XG4gICAgICBqb2Iud2l0aFsnY2lfc2l6ZSddID0gJ2xhcmdlJztcbiAgICB9XG4gICAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICAgIGpvYi53aXRoWydjcHVfYXJjaCddID0gJ1g2NCc7XG4gICAgfVxuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQgPT09ICd3YmZ5JyB8fCBraW5kID09PSAnd2JmeS1tZXJnZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aFsnZ2l0aHViX2hvc3RlZF9ydW5uZXInXSA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aFsnZ2l0aHViX2hvc3RlZF9ydW5uZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi5zZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gTW92ZSBzZWNyZXRzIHByb3AgYWZ0ZXIgd2l0aCBwcm9wXG4gICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKGpvYi5zZWNyZXRzKTtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRTY2hlZHVsZShuZXdTZXR0aW5nczogV29ya2Zsb3csIGluY2x1c2l2ZU1pbkhvdXJKc3Q6IG51bWJlciwgZXhjbHVzaXZlTWF4SG91ckpzdDogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IFttaW51dGVVdGMsIGhvdXJVdGNdID0gKChuZXdTZXR0aW5ncy5vbi5zY2hlZHVsZT8uWzBdPy5jcm9uIGFzIHN0cmluZykgfHwgJycpLnNwbGl0KCcgJykubWFwKE51bWJlcik7XG4gIGlmIChtaW51dGVVdGMgIT09IDAgJiYgTnVtYmVyLmlzSW50ZWdlcihob3VyVXRjKSkge1xuICAgIGNvbnN0IGhvdXJKc3QgPSAoaG91clV0YyArIDkpICUgMjQ7XG4gICAgY29uc3QgaW5SYW5nZSA9XG4gICAgICBpbmNsdXNpdmVNaW5Ib3VySnN0IDwgZXhjbHVzaXZlTWF4SG91ckpzdFxuICAgICAgICA/IGluY2x1c2l2ZU1pbkhvdXJKc3QgPD0gaG91ckpzdCAmJiBob3VySnN0IDwgZXhjbHVzaXZlTWF4SG91ckpzdFxuICAgICAgICA6IGluY2x1c2l2ZU1pbkhvdXJKc3QgPD0gaG91ckpzdCB8fCBob3VySnN0IDwgZXhjbHVzaXZlTWF4SG91ckpzdDtcbiAgICBpZiAoaW5SYW5nZSkgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbWluSnN0ID0gMSArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDU5KTtcbiAgY29uc3QgaG91ckpzdCA9IGluY2x1c2l2ZU1pbkhvdXJKc3QgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoZXhjbHVzaXZlTWF4SG91ckpzdCAtIGluY2x1c2l2ZU1pbkhvdXJKc3QpKTtcbiAgY29uc3QgY3JvbiA9IGAke21pbkpzdH0gJHsoaG91ckpzdCAtIDkgKyAyNCkgJSAyNH0gKiAqICpgO1xuICBuZXdTZXR0aW5ncy5vbi5zY2hlZHVsZSA9IFt7IGNyb24gfV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeWFtbFRleHQgPSB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHtcbiAgICBsaW5lV2lkdGg6IC0xLFxuICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICBzdHlsZXM6IHtcbiAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgIH0sXG4gIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gbWlncmF0ZVdvcmtmbG93KG5ld1NldHRpbmdzOiBXb3JrZmxvdyk6IHZvaWQge1xuICAvLyBUT0RPOiBSZW1vdmUgdGhlbSBhZnRlciAyMDIzLTAzLTMxXG4gIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzWydhZGQtdG8tcHJvamVjdCddO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlSm9iKGpvYjogSm9iKTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgaWYgKCFqb2Iud2l0aCkgcmV0dXJuO1xuICBkZWxldGUgam9iLndpdGhbJ25vbl9zZWxmX2hvc3RlZCddO1xuICBkZWxldGUgam9iLndpdGhbJ25vdGlmeV9kaXNjb3JkJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsncmVxdWlyZV9mbHknXTtcbiAgZGVsZXRlIGpvYi53aXRoWydyZXF1aXJlX2djbG91ZCddO1xuICBkZWxldGUgam9iLndpdGhbJ2NwdV9hcmNoJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbGFiZWwnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydsYWJlbE9wZXJhdG9yJ107XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW50ZXJmYWNlIFNldHRpbmdzIGV4dGVuZHMgUGFydGlhbDxDb25maWd1cmF0aW9uVmFsdWVNYXA+IHtcbiAgZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4OiBzdHJpbmc7XG4gIG5tTW9kZTogc3RyaW5nO1xuICBub2RlTGlua2VyOiBzdHJpbmc7XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbn1cblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgneWFybicsIFsnLS12ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0VmVyc2lvbignQHlhcm5wa2cvY2xpJywgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmIChnZXRNYWpvck51bWJlcihjdXJyZW50VmVyc2lvbikgPD0gZ2V0TWFqb3JOdW1iZXIobGF0ZXN0VmVyc2lvbikgJiYgY3VycmVudFZlcnNpb24gIT09IGxhdGVzdFZlcnNpb24pIHtcbiAgICAgIHNwYXduU3luYygneWFybicsIFsnc2V0JywgJ3ZlcnNpb24nLCBsYXRlc3RWZXJzaW9uXSwgY29uZmlnLmRpclBhdGgsIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3JlbGVhc2VzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocmVsZWFzZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihyZWxlYXNlc1BhdGgpKSB7XG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCd5YXJuLScpICYmICFmaWxlLnN0YXJ0c1dpdGgoYHlhcm4tJHtsYXRlc3RWZXJzaW9ufS5gKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZWQnLCBwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFybnJjUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHlhbWwubG9hZChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh5YXJucmNZbWxQYXRoLCAndXRmOCcpKSBhcyBTZXR0aW5ncztcbiAgICBzZXR0aW5ncy5kZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXggPSAnJztcbiAgICBzZXR0aW5ncy5ub2RlTGlua2VyID0gJ25vZGUtbW9kdWxlcyc7XG4gICAgc2V0dGluZ3Mubm1Nb2RlID0gJ2hhcmRsaW5rcy1nbG9iYWwnO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb25zSnNvbiA9IHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoJ25wbScsIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndmVyc2lvbnMnLCAnLS1qc29uJ10sIGRpclBhdGgpO1xuICBjb25zdCB2ZXJzaW9ucyA9IEpTT04ucGFyc2UodmVyc2lvbnNKc29uKSBhcyBzdHJpbmdbXTtcbiAgcmV0dXJuIHZlcnNpb25zLmF0KC0xKSBhcyBzdHJpbmc7XG59XG5mdW5jdGlvbiBnZXRNYWpvck51bWJlcih2ZXJzaW9uOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBbbWFqb3JdID0gdmVyc2lvbi5zcGxpdCgnLicpO1xuICByZXR1cm4gTnVtYmVyKG1ham9yKTtcbn1cbiIsImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuLCBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKSByZXR1cm47XG5cbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2QxOiB4LWVhc3kgOmhlZGdlaG9nOicsICdFREU5RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkMjogZWFzeSA6cmFiYml0MjonLCAnRERENkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDM6IG1lZGl1bSA6b3g6JywgJ0M0QjVGRCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2Q0OiBoYXJkIDpzcXVpZDonLCAnQTc4QkZBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDU6IHgtaGFyZCA6d2hhbGUyOicsICc4QjVDRjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwMTogY3JpdGljYWwgOmZpcmU6OmZpcmU6OmZpcmU6JywgJ0VGNDQ0NCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3AyOiB1cmdlbnQgOmZpcmU6OmZpcmU6JywgJ0Y4NzE3MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3AzOiBpbXBvcnRhbnQgOmZpcmU6JywgJ0ZDQTVBNScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3A0OiBuaWNlIHRvIGhhdmUgOmRyb3BsZXQ6JywgJ0ZFQ0FDQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IGJsaXR6JywgJzUzMDBiYycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IGZpcmViYXNlJywgJ2ZmY2EyOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHByaXNtYScsICcwYzM0NGInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiByZWFjdCcsICc2MWRhZmInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBzdmVsdGUnLCAnZmYzZTAwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdsbG0tcHIgOnJvYm90OicsICc4QjVDRjYnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdyZWFkeScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3JlbGVhc2VkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC14L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCBzb2RpdW0gZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4sIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgZGVwcmVjYXRlZFNlY3JldE5hbWVzID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJ107XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4gfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoKS5wYXJzZWQgfHwge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIGRlcHJlY2F0ZWRTZWNyZXROYW1lcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvICYmIG5hbWUgPT09ICdQVUJMSUNfR0hfQk9UX1BBVCcpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgIH0sXG4gICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYHlhcm4gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYHlhcm4gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuXG48IS0tIOaXpeacrOiqnuOBp+iomOi/sOOBl+OBpuOCguWkp+S4iOWkq+OBp+OBmeOAgiAtLT5cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBuZXdDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBpZiAoZGlzdGFuY2Uob2xkQ29udGVudCwgbmV3Q29udGVudCkgPiBuZXdDb250ZW50Lmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgc2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBvY3Rva2l0IH0gZnJvbSAnLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0RvY2tlcmZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0dlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0dvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQYWNrYWdlSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zUG9tWG1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNWc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG5cbiAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHN0b3J5Ym9vazogYm9vbGVhbjtcbiAgICB3YjogYm9vbGVhbjtcbiAgfTtcbiAgcmVsZWFzZToge1xuICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICBnaXRodWI6IGJvb2xlYW47XG4gICAgbnBtOiBib29sZWFuO1xuICB9O1xuICBlc2xpbnRCYXNlPzogRXNsaW50RXh0ZW5zaW9uQmFzZTtcbiAgdmVyc2lvbnNUZXh0Pzogc3RyaW5nO1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpbnNQYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZUJyYW5jaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luczogc3RyaW5nW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVsZWFzZXJjSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKHJlbGVhc2VyY0pzb25QYXRoLCAndXRmOCcpKSBhc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICAgICAgICAgIHBsdWdpbnM/OiBzdHJpbmdbXVtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSBqc29uPy5icmFuY2hlcyB8fCBbXTtcbiAgICAgIHJlbGVhc2VQbHVnaW5zID0ganNvbj8ucGx1Z2lucz8uZmxhdCgpIHx8IFtdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IGlzUm9vdCA9XG4gICAgICBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nKSkgIT09ICdwYWNrYWdlcycgfHxcbiAgICAgICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNSb290KSB7XG4gICAgICByZXBvSW5mbyA9IGF3YWl0IGZldGNoUmVwb0luZm8oZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cblxuICAgIGxldCB2ZXJzaW9uc1RleHQgPSAnJztcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4Jyk7XG4gICAgICB2ZXJzaW9uc1RleHQgKz0gY29udGVudC50cmltKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGZvciAoY29uc3QgW3ByZWZpeCwgbmFtZV0gb2YgW1xuICAgICAgWydqYXZhJywgJ2phdmEnXSxcbiAgICAgIFsnbm9kZScsICdub2RlanMnXSxcbiAgICAgIFsncHl0aG9uJywgJ3B5dGhvbiddLFxuICAgIF0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG5vZGVWZXJzaW9uQ29udGVudCA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApLCAndXRmOCcpO1xuICAgICAgICBpZiAodmVyc2lvbnNUZXh0KSB7XG4gICAgICAgICAgdmVyc2lvbnNUZXh0ICs9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIHZlcnNpb25zVGV4dCArPSBuYW1lICsgJyAnICsgbm9kZVZlcnNpb25Db250ZW50LnRyaW0oKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiAhIXBhY2thZ2VKc29uLmZpbGVzLFxuICAgICAgcmVwb3NpdG9yeTogcmVwb0luZm8/LmZ1bGxfbmFtZSA/IGBnaXRodWI6JHtyZXBvSW5mby5mdWxsX25hbWUgYXMgc3RyaW5nfWAgOiB1bmRlZmluZWQsXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bmZpZy50b21sJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcyhgJHtwYXRoLnNlcH13aWxsYm9vc3Rlci1jb25maWdzYCksXG4gICAgICBkb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc0RvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbnNHb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluc1BhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUG9tWG1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9tLnhtbCcpKSxcbiAgICAgIGRvZXNDb250YWluc1B1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluc0phdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc1R5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc0pzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdHN9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JyxcbiAgICAgICAgZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueShcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgIGRpclBhdGhcbiAgICAgICksXG4gICAgICBkb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0c30vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzWydibGl0eiddLFxuICAgICAgICBmaXJlYmFzZTogISFkZXZEZXBlbmRlbmNpZXNbJ2ZpcmViYXNlLXRvb2xzJ10sXG4gICAgICAgIGxpdGVzdHJlYW06IGRvY2tlcmZpbGUuaW5jbHVkZXMoJ2luc3RhbGwtbGl0ZXN0cmVhbS5zaCcpLFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llc1snbmV4dCddLFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydwbGF5d3JpZ2h0J10sXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ3ByaXNtYSddLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llc1sncHlyaWdodCddLFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgdmVyc2lvbnNUZXh0LFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25maWcuZXNsaW50QmFzZSA9IGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc0dlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNHb01vZCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1BvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuZXhwb3J0IHR5cGUgRXNsaW50RXh0ZW5zaW9uQmFzZSA9XG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JztcblxuZnVuY3Rpb24gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBFc2xpbnRFeHRlbnNpb25CYXNlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQpIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4ID8gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyA6ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeCkge1xuICAgICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCkge1xuICAgICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGdpdCA9IHNpbXBsZUdpdChkaXJQYXRoKTtcbiAgY29uc3QgcmVtb3RlcyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVzKHRydWUpO1xuICBjb25zdCBvcmlnaW4gPSByZW1vdGVzLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gJ29yaWdpbicpO1xuICBjb25zdCByZW1vdGVVcmwgPSBvcmlnaW4/LnJlZnM/LmZldGNoID8/IG9yaWdpbj8ucmVmcz8ucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgY29uc3QgcmV0ID0geyBmdWxsX25hbWU6IGAke29yZ30vJHtuYW1lfWAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24ocmV0LCByZXNwb25zZS5kYXRhKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG4gIHJldHVybiByZXQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4RG9ja2VyZmlsZSB9IGZyb20gJy4vZml4ZXJzL2RvY2tlcmZpbGUuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRvb2xWZXJzaW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hc2RmLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQmlvbWVKc29uYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9iaW9tZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFc2xpbnRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lc2xpbnRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvaHVza3lyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU5leHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL25leHRjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodGNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRzY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3RzY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVZYXJucmNZbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMveWFybnJjLmpzJztcbmltcG9ydCB7IHNldHVwTGFiZWxzIH0gZnJvbSAnLi9naXRodWIvbGFiZWwuanMnO1xuaW1wb3J0IHsgc2V0dXBTZWNyZXRzIH0gZnJvbSAnLi9naXRodWIvc2VjcmV0LmpzJztcbmltcG9ydCB7IHNldHVwR2l0SHViU2V0dGluZ3MgfSBmcm9tICcuL2dpdGh1Yi9zZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyB9IGZyb20gJy4vZ2l0aHViL3RlbXBsYXRlLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdVcGxvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHNlY3JldHMgdG8gR2l0SHViJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdlJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1NraXAgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG4gIG9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMgPSBhcmd2LmVudjtcblxuICBmb3IgKGNvbnN0IHJvb3REaXJQYXRoIG9mIGFyZ3YucGF0aHMgYXMgc3RyaW5nW10pIHtcbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBkaXJlbnRzLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKS5tYXAoKGQpID0+IHBhdGguam9pbihwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuXG4gICAgYXdhaXQgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXSk7XG5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhYmJyZXZpYXRpb25Qcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgcm9vdENvbmZpZykpXG4gICAgKTtcbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluc3RhbGwgdG9vbHMgdmlhIGFzZGYgYXQgZmlyc3RcbiAgICBhd2FpdCBnZW5lcmF0ZVRvb2xWZXJzaW9ucyhyb290Q29uZmlnKTtcbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhEb2NrZXJmaWxlKHJvb3RDb25maWcpLFxuICAgICAgZml4UHJpc21hRW52RmlsZXMocm9vdENvbmZpZyksXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICAuLi4ocm9vdENvbmZpZy5pc0J1blxuICAgICAgICA/IFtcbiAgICAgICAgICAgIGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnKSxcbiAgICAgICAgICAgIGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZykudGhlbigoKSA9PiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSksXG4gICAgICAgICAgXVxuICAgICAgICA6IFtnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpXSksXG4gICAgICBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbiAmJiBjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgICAgICkge1xuICAgICAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVFc2xpbnRyYyhjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gICAgLy8gJ3lhcm4gaW5zdGFsbCcgc2hvdWxkIGJlIGFmdGVyIGB5YXJuIGNsZWFudXBgIGJlY2F1c2UgeWFybiBiZXJyeSBnZW5lcmF0ZXMgeWFybi5sb2NrXG4gICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgY29udGVudHMgb2YgZGVwZW5kYW50IHN1Yi1wYWNrYWdlIGluIG1vbm9yZXBvXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWyd1cGRhdGUnXSwgcm9vdERpclBhdGgpO1xuICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBhZnRlciB0aGVyZSBpcyBubyBidW4ubG9ja2JcbiAgICAgIGNvbnN0IGJ1bkxvY2tiUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ2J1bi5sb2NrYicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYnVuTG9ja2JQYXRoKSkge1xuICAgICAgICB2b2lkIGZzLnByb21pc2VzLnJtKGJ1bkxvY2tiUGF0aCk7XG4gICAgICAgIHNwYXduU3luYyhcbiAgICAgICAgICBwYWNrYWdlTWFuYWdlcixcbiAgICAgICAgICBbJ2luc3RhbGwnLCAnLS1zYXZlLXRleHQtbG9ja2ZpbGUnLCAnLS1mcm96ZW4tbG9ja2ZpbGUnLCAnLS1sb2NrZmlsZS1vbmx5J10sXG4gICAgICAgICAgcm9vdERpclBhdGhcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsib3B0aW9ucyIsImNvbnN0cnVjdG9yIiwidGhpcyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJlcnJvciIsIkVycm9yIiwic3RhY2siLCJTdHJpbmciLCJhc3luYyIsImZpeERvY2tlcmZpbGUiLCJjb25maWciLCJkb2VzQ29udGFpbnNEb2NrZXJmaWxlIiwib2xkQ29udGVudCIsImRvY2tlcmZpbGUiLCJuZXdDb250ZW50IiwiZnMiLCJ3cml0ZUZpbGUiLCJwYXRoIiwiam9pbiIsImRpclBhdGgiLCJmaXhQbGF5d3JpZ2h0Q29uZmlnIiwiZmlsZVBhdGgiLCJleGlzdHNTeW5jIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsInJlcGxhY2UiLCJnbG9iSWdub3JlIiwiZml4UHJpc21hRW52RmlsZXMiLCJlbnZGaWxlcyIsImZnIiwiZ2xvYiIsImRvdCIsImN3ZCIsImlnbm9yZSIsImVudkZpbGUiLCJlbnZGaWxlUGF0aCIsInJlc29sdmUiLCJmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIiwicGFja2FnZURpclBhdGhzIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsIm9sZFRlc3REaXJQYXRoIiwicGFja2FnZURpclBhdGgiLCJuZXdUZXN0RGlyUGF0aCIsInJlbmFtZSIsInJlcGxhY2VBbGwiLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZml4VHlwZURlZmluaXRpb25zIiwiY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuIiwibGliVHlwZURpclBhdGgiLCJzcmNUeXBlRGlyUGF0aCIsImlzUm9vdCIsImRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucyIsInVuZGVmaW5lZCIsImRpcmVudHMiLCJpZ25vcmVFbm9lbnRBc3luYyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwiZGlyZW50IiwiZGlyTmFtZSIsInNsaWNlIiwiaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uIiwiZW5kc1dpdGgiLCJwYWNrYWdlTmFtZSIsImluY2x1ZGVzIiwiaGFzTGlicmFyeSIsInNvbWUiLCJwYWNrYWdlSnNvbiIsImRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY2llcyIsImlzRmlsZSIsIm1rZGlyIiwicnVuIiwicmVjdXJzaXZlIiwiaXNEaXJlY3RvcnkiLCJmc1V0aWwiLCJyZWFkRmlsZUlnbm9yaW5nRXJyb3IiLCJmc3AiLCJnZW5lcmF0ZUZpbGUiLCJjb250ZW50IiwiZml4VHlwb3MiLCJwYWNrYWdlQ29uZmlnIiwiZG9jRmlsZXMiLCJsZW5ndGgiLCJtZEZpbGUiLCJmaXhUeXBvc0luVGV4dCIsInJlcGxhY2VXaXRoQ29uZmlnIiwidHNGaWxlcyIsInRzRmlsZSIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwiT2JqZWN0IiwiZW50cmllcyIsIndiZnlKc29uIiwidHlwb3MiLCJ0b2tlbiIsInByb2Nlc3MiLCJlbnYiLCJHSF9CT1RfUEFUIiwiUFVCTElDX0dIX0JPVF9QQVQiLCJHSF9UT0tFTiIsIkdJVEhVQl9UT0tFTiIsImhhc0dpdEh1YlRva2VuIiwib2N0b2tpdCIsIk9jdG9raXQiLCJhdXRoIiwiZ2l0SHViVXRpbCIsImdldE9yZ0FuZE5hbWUiLCJ1cmxPckZ1bGxOYW1lIiwidXJsV2l0aG91dFByb3RvY29sIiwic3BsaXQiLCJhdCIsIm5hbWVzIiwic3Bhd25TeW5jIiwiY29tbWFuZCIsImFyZ3MiLCJyZXRyeSIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwiY2hpbGRfcHJvY2VzcyIsInN0YXR1cyIsInNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQiLCJzdGRpbyIsInByb2MiLCJzdGRlcnIiLCJ0b1N0cmluZyIsInRyaW0iLCJzIiwic3Rkb3V0IiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJBU0RGX0RJUiIsInNoZWxsIiwiY29udmVydFZlcnNpb25JbnRvTnVtYmVyIiwidmVyc2lvbiIsIm51bWJlcnMiLCJOdW1iZXIiLCJmaWx0ZXIiLCJudW0iLCJpc05hTiIsInZlcnNpb25OdW1iZXIiLCJkaXZpc29yIiwiUFlUSE9OX1ZFUlNJT04iLCJKQVZBX1ZFUlNJT04iLCJCTElUWl9WRVJTSU9OIiwiTkVYVF9WRVJTSU9OIiwiZ2VuZXJhdGVUb29sVmVyc2lvbnMiLCJ2ZXJzaW9uc1RleHQiLCJkdXBsaWNhdGFibGVMaW5lcyIsImxpbmUiLCJDT1JFX1RPT0xTIiwiaGFzIiwic29ydCIsInN0YXJ0c1dpdGgiLCJsaW5lcyIsIlNldCIsImRvZXNDb250YWluc1BvZXRyeUxvY2siLCJyZXNwb25zZSIsImZldGNoIiwianNvbiIsInBvZXRyeVZlcnNpb24iLCJ1cGRhdGVWZXJzaW9uIiwiZGVwZW5kaW5nIiwiZmlyZWJhc2UiLCJkb2VzQ29udGFpbnNQYWNrYWdlSnNvbiIsImlzQnVuIiwiYnVuVmVyc2lvbiIsIm9yZ2FuaXphdGlvbiIsInJlcG9zaXRvcnkiLCJyZXF1ZXN0Iiwib3duZXIiLCJyZXBvIiwiZGF0YSIsInRhZ19uYW1lIiwiaW5kZXgiLCJsYXN0SW5kZXhPZiIsInZlcnNpb25OdW1iZXJUZXh0IiwidGVzdCIsImdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIiLCJwcmVmaXgiLCJERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMiLCJ2ZXJzaW9uUGF0aCIsInJtIiwiZm9yY2UiLCJ0b29sVmVyc2lvbnNQYXRoIiwiY29yZSIsInRvb2xOYW1lIiwibmV3VmVyc2lvbiIsImhlYWQiLCJmaW5kSW5kZXgiLCJsIiwibmV3TGluZSIsInNwbGljZSIsIm92ZXJ3cml0ZU1lcmdlIiwiZGVzdGluYXRpb25BcnJheSIsInNvdXJjZUFycmF5IiwiY29tYmluZU1lcmdlIiwidGFyZ2V0Iiwic291cmNlIiwiZGVzdGluYXRpb24iLCJpdGVtIiwiY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQiLCJpc01lcmdlYWJsZU9iamVjdCIsIm1lcmdlIiwicHVzaCIsImpzb25PYmoiLCIkc2NoZW1hIiwiZXh0ZW5kcyIsImdlbmVyYXRlQmlvbWVKc29uYyIsIm5ld1NldHRpbmdzIiwiY2xvbmVEZWVwIiwib2xkU2V0dGluZ3MiLCJKU09OIiwicGFyc2UiLCJhcnJheU1lcmdlIiwic3RyaW5naWZ5IiwiZ2VuZXJhdGVCdW5maWdUb21sIiwicmVhZEZpbGVTeW5jIiwidXNlckNvbnRlbnRIZWFkZXIiLCJ1c2VyQ29udGVudEhlYWRlclJlZ2V4Iiwic2VwYXJhdG9yIiwiZGVmYXVsdEhlYWRVc2VyQ29udGVudCIsImRlZmF1bHRUYWlsVXNlckNvbnRlbnQiLCJpZ25vcmVGaWxlVXRpbCIsInNlcGFyYXRvclByZWZpeCIsInJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyIsImxhc3RIZWFkZXJJbmRleCIsImdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIiLCJnZXRIZWFkVXNlckNvbnRlbnQiLCJpbmRleE9mIiwiZ2V0VGFpbFVzZXJDb250ZW50IiwiaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZCIsImxhc3RJbmRleCIsImdlbmVyYXRlRG9ja2VyaWdub3JlIiwiZXh0ZW5zaW9ucyIsImNvZGVXaXRoMkluZGVudFNpemUiLCJjb2RlV2l0aDRJbmRlbnRTaXplIiwibWFya2Rvd25MaWtlIiwiZXNsaW50IiwicHJldHRpZXIiLCJnZW5lcmF0ZUV4dGVuc2lvbnMiLCJnZW5lcmF0ZUVkaXRvcmNvbmZpZyIsImdlbmVyYXRlRXNsaW50cmMiLCJlc2xpbnRCYXNlIiwiZXh0IiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJyb290Q29uZmlnIiwiaGVhZFVzZXJDb250ZW50IiwidGFpbFVzZXJDb250ZW50IiwiZG9lc0NvbnRhaW5zR2VtZmlsZSIsImRvZXNDb250YWluc0dvTW9kIiwiYmFzZW5hbWUiLCJkb2VzQ29udGFpbnNQb21YbWwiLCJkb2VzQ29udGFpbnNQdWJzcGVjWWFtbCIsImRvZXNDb250YWluc1RlbXBsYXRlWWFtbCIsImJsaXR6IiwibmV4dCIsInByaXNtYSIsInBsYXl3cmlnaHRUZXN0IiwicmVhY3ROYXRpdmUiLCJzdG9yeWJvb2siLCJsaXRlc3RyZWFtIiwiZ2VuZXJhdGVkIiwicmVhZENhY2hlIiwidXJsIiwicmVzcG9uc2VUZXh0IiwidGV4dCIsIm9rIiwid3JpdGVDYWNoZSIsIm9zIiwiaG9tZWRpciIsInN0YXQiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsImdldExhdGVzdENvbW1pdEhhc2giLCJjb21taXRzIiwicGVyX3BhZ2UiLCJzaGEiLCJFc2xpbnRVdGlsIiwiZ2V0TGludEZpeFN1ZmZpeCIsImRvZXNDb250YWluc0pzeE9yVHN4IiwianNDb21tb25EZXBzIiwidHNDb21tb25EZXBzIiwicmVhY3RDb21tb25EZXBzIiwiZXNsaW50RGVwcyIsImdlbmVyYXRlUGFja2FnZUpzb24iLCJza2lwQWRkaW5nRGVwcyIsImpzb25UZXh0Iiwic2NyaXB0cyIsInBlZXJEZXBlbmRlbmNpZXMiLCJhdXRob3IiLCJpc1dpbGxCb29zdGVyQ29uZmlncyIsImRlcHMiLCJ2YWx1ZXMiLCJkZXAiLCJyZW1vdmVEZXByZWNhdGVkU3R1ZmYiLCJrZXkiLCJ2YWx1ZSIsImdlbmVyYXRlU2NyaXB0cyIsInByZXR0aWZ5IiwiZXhpc3RpbmdDb250ZW50Iiwib3JpZ2luYWxDb250ZW50IiwiZ2VuZXJhdGVQcmV0dGllclN1ZmZpeCIsInBvZXRyeURldkRlcGVuZGVuY2llcyIsInByZXBhcmUiLCJwb3N0aW5zdGFsbCIsImlzUHVibGljUmVwbyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsInByZXBhY2siLCJwb3N0cGFjayIsInNlbWFudGljUmVsZWFzZSIsIndvcmtzcGFjZXMiLCJBcnJheSIsImlzQXJyYXkiLCJ3b3Jrc3BhY2UiLCJnbG9iU3luYyIsIndiIiwiZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCIsImRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCIsImRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImNsZWFudXAiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwicHl0aG9uRmlsZXMiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwiYWRkIiwic2l6ZSIsImRpck5hbWVzU3RyIiwiZCIsImtleXMiLCJwYWNrYWdlTmFtZXMiLCJpc1dvcmtzcGFjZVBhY2thZ2UiLCJjb21taXRIYXNoIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwicGFja2FnZU1hbmFnZXIiLCJuZXdKc29uVGV4dCIsIm9sZEFuZE5ld1NjcmlwdE5hbWVzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJmaWxlcyIsImZpeFNjcmlwdE5hbWVzIiwidHlwZWNoZWNrIiwib2xkVGVzdCIsInB5cmlnaHQiLCJwcmVDb21taXQiLCJwcmVQdXNoIiwicHJlUHVzaEZvckxhYiIsInBvc3RNZXJnZSIsImdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlSnNvblBhdGgiLCJwcmVDb21taXRGaWxlUGF0aCIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwiZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyIsInBvc3RNZXJnZUNvbW1hbmRzIiwicmF3IiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJjcmVhdGVUYXNrT3B0aW9ucyIsInJ1bm5lciIsImV4dGVuc2lvbiIsInByZXR0aWVyQ29udGVudCIsImJpb21lQ29udGVudCIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiY29tbWFuZHMiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsInlhbWwiLCJkdW1wIiwibGluZVdpZHRoIiwibm9Db21wYXRNb2RlIiwic3R5bGVzIiwibWtkaXJTeW5jIiwic3JjRGlyZWN0b3JpZXMiLCJub2RlIiwiZ2VuZXJhdGVMaW50c3RhZ2VkcmMiLCJwYWNrYWdlUHJlZml4IiwiZ2V0RXNsaW50S2V5IiwicGFja2FnZXNGaWx0ZXIiLCJnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllciIsImdldFNyY0RpcnMiLCJnZW5lcmF0ZU5leHRDb25maWdKc29uIiwiZmluZCIsInAiLCJfIiwic2V0dGluZ3NUZXh0IiwiZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSIsImdpdGlnbm9yZUZpbGVQYXRoIiwiZ2l0aWdub3JlQ29udGVudCIsImFkZGl0aW9uYWxDb250ZW50IiwidmVudlBhdGgiLCJ2ZW52IiwiZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiIsImdlbmVyYXRlUmVhZG1lIiwiaW5zZXJ0QmFkZ2UiLCJmaWxlTmFtZXMiLCJyZWFkZGlyU3luYyIsImZpbGVOYW1lIiwiYmFkZ2VOYW1lIiwidG9VcHBlckNhc2UiLCJiYWRnZSIsInJlYWRtZSIsImkiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInNldHRpbmdzIiwicGx1Z2lucyIsInBsdWdpbiIsIm9sZENvbmZpZyIsInByZXNldCIsInN1Y2Nlc3NDb21tZW50IiwiZmFpbENvbW1lbnQiLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsImdlbmVyYXRlUmVub3ZhdGVKc29uIiwicGFja2FnZVJ1bGVzIiwicnVsZSIsIm1hdGNoUGFja2FnZU5hbWVzIiwiZW5hYmxlZCIsInNvcnRLZXlzIiwib2JqIiwia2V5QW5kVmFsdWVzIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwicm9vdEpzb25PYmoiLCJjb21waWxlck9wdGlvbnMiLCJtb2R1bGUiLCJtb2R1bGVSZXNvbHV0aW9uIiwianN4IiwiYWx3YXlzU3RyaWN0Iiwic3RyaWN0Iiwic2tpcExpYkNoZWNrIiwiYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cyIsImVzTW9kdWxlSW50ZXJvcCIsInJlc29sdmVKc29uTW9kdWxlIiwiZGVjbGFyYXRpb24iLCJzb3VyY2VNYXAiLCJpbXBvcnRIZWxwZXJzIiwiZXJhc2FibGVTeW50YXhPbmx5Iiwib3V0RGlyIiwidHlwZVJvb3RzIiwiaW5jbHVkZSIsInN1Ykpzb25PYmoiLCJnZW5lcmF0ZVRzY29uZmlnIiwiZG9lc0NvbnRhaW5zSnN4T3JUc3hJblBhY2thZ2VzIiwiaXNFc21QYWNrYWdlIiwiZXhwZXJpbWVudGFsRGVjb3JhdG9ycyIsImV4Y2x1ZGVGaWxlUGF0dGVybnMiLCJnZW5lcmF0ZVZzY29kZVNldHRpbmdzIiwiZXhjbHVkZUZpbGVQYXR0ZXJuIiwiZXhjbHVkZVNldHRpbmciLCJ3b3JrZmxvd3MiLCJvbiIsInB1bGxfcmVxdWVzdCIsImJyYW5jaGVzIiwiY29uY3VycmVuY3kiLCJncm91cCIsImpvYnMiLCJ1c2VzIiwicmVsZWFzZSIsIndiZnkiLCJ3b3JrZmxvd19kaXNwYXRjaCIsInB1bGxfcmVxdWVzdF90YXJnZXQiLCJ0eXBlcyIsInN5bmMiLCJpc3N1ZXMiLCJzZWNyZXRzIiwiRElTQ09SRF9XRUJIT09LX1VSTCIsIkdIX1BST0pFQ1RfVVJMIiwid2l0aCIsImxhYmVsZWQiLCJnZW5lcmF0ZVdvcmtmbG93cyIsIndvcmtmbG93c1BhdGgiLCJzZW1hbnRpY1ltbFBhdGgiLCJmaWxlTmFtZVNldCIsImtpbmQiLCJ3cml0ZVdvcmtmbG93WWFtbCIsImxvYWQiLCJtb3ZlVG9Cb3R0b20iLCJqb2IiLCJub3JtYWxpemVKb2IiLCJzY2hlZHVsZSIsImJyYW5jaCIsInNldFNjaGVkdWxlIiwibWlncmF0ZVdvcmtmbG93Iiwid3JpdGVZYW1sIiwicGFyYW1zIiwic3luY19wYXJhbXNfd2l0aG91dF9kZXN0IiwibnBtIiwic2VydmVyX3VybCIsIm1pZ3JhdGVKb2IiLCJuZXdTZWNyZXRzIiwiaW5jbHVzaXZlTWluSG91ckpzdCIsImV4Y2x1c2l2ZU1heEhvdXJKc3QiLCJtaW51dGVVdGMiLCJob3VyVXRjIiwiY3JvbiIsImlzSW50ZWdlciIsImhvdXJKc3QiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJ5YW1sVGV4dCIsImdlbmVyYXRlWWFybnJjWW1sIiwieWFybnJjWW1sUGF0aCIsImN1cnJlbnRWZXJzaW9uIiwibGF0ZXN0VmVyc2lvbiIsInZlcnNpb25zSnNvbiIsImdldExhdGVzdFZlcnNpb24iLCJnZXRNYWpvck51bWJlciIsInJlbGVhc2VzUGF0aCIsInlhcm5yY1BhdGgiLCJkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXgiLCJub2RlTGlua2VyIiwibm1Nb2RlIiwiY29tcHJlc3Npb25MZXZlbCIsImluamVjdEVudmlyb25tZW50RmlsZXMiLCJlbmFibGVHbG9iYWxDYWNoZSIsIm9yaWdpbmFsTGVuZ3RoIiwicGx1Z2luUGF0aCIsIm1ham9yIiwic2V0dXBMYWJlbHMiLCJzZXR1cExhYmVsIiwiZGVsZXRlTGFiZWwiLCJ3YXJuIiwiY29sb3IiLCJkZXByZWNhdGVkU2VjcmV0TmFtZXMiLCJzZXR1cFNlY3JldHMiLCJwYXJzZWQiLCJkb3RlbnYiLCJzZWNyZXROYW1lIiwic2VjcmV0X25hbWUiLCJrZXlfaWQiLCJrZXlJZCIsInNvZGl1bSIsInJlYWR5Iiwic2VjcmV0IiwicmF3S2V5IiwiZnJvbV9iYXNlNjQiLCJiYXNlNjRfdmFyaWFudHMiLCJPUklHSU5BTCIsInJhd1NlYyIsImZyb21fc3RyaW5nIiwiZW5jQnl0ZXMiLCJjcnlwdG9fYm94X3NlYWwiLCJlbmNCYXNlNjQiLCJ0b19iYXNlNjQiLCJlbmNyeXB0ZWRfdmFsdWUiLCJzZXR1cEdpdEh1YlNldHRpbmdzIiwid2l0aFJldHJ5IiwiYWxsb3dfbWVyZ2VfY29tbWl0IiwiYWxsb3dfc3F1YXNoX21lcmdlIiwiYWxsb3dfcmViYXNlX21lcmdlIiwiZGVsZXRlX2JyYW5jaF9vbl9tZXJnZSIsInNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGUiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2UiLCJoZWFkZXJzIiwiYWxsb3dfYXV0b19tZXJnZSIsInRlbXBsYXRlcyIsImdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIiwiZGlzdGFuY2UiLCJ3YmZ5SnNvblNjaGVtYSIsInoiLCJvYmplY3QiLCJyZWNvcmQiLCJzdHJpbmciLCJvcHRpb25hbCIsImRvYyIsInRzIiwiZ2V0UGFja2FnZUNvbmZpZyIsImVzbVBhY2thZ2UiLCJwYWNrYWdlSnNvblRleHQiLCJ0eXBlIiwicmVsZWFzZUJyYW5jaGVzIiwicmVsZWFzZVBsdWdpbnMiLCJyZWxlYXNlcmNKc29uUGF0aCIsImZsYXQiLCJyZXBvSW5mbyIsImdpdCIsInNpbXBsZUdpdCIsIm9yaWdpbiIsImdldFJlbW90ZXMiLCJyIiwicmVtb3RlVXJsIiwicmVmcyIsInJlcXVlc3RSZXBvSW5mbyIsIm1lc3NhZ2UiLCJmZXRjaFJlcG9JbmZvIiwibm9kZVZlcnNpb25Db250ZW50Iiwid2JmeUpzb25QYXRoIiwid2JmeUpzb25UZXh0IiwiZnVsbF9uYW1lIiwic2VwIiwiY29udGFpbnNBbnkiLCJkb2VzQ29udGFpbnNWc2NvZGVTZXR0aW5nc0pzb24iLCJnaXRodWIiLCJnZXRFc2xpbnRFeHRlbnNpb25CYXNlIiwicGF0dGVybiIsIm9yZyIsInJldCIsImFzc2lnbiIsImFyZ3YiLCJ5YXJncyIsInBvc2l0aW9uYWwiLCJkZXNjcmliZSIsImFycmF5IiwiZGVmYXVsdCIsImRlc2NyaXB0aW9uIiwiYWxpYXMiLCJza2lwRGVwcyIsInZlcmJvc2UiLCJyb290RGlyUGF0aCIsInBhdGhzIiwicGFja2FnZXNEaXJQYXRoIiwic3ViRGlyUGF0aHMiLCJpZ25vcmVFcnJvckFzeW5jIiwiYWJicmV2aWF0aW9uUHJvbWlzZSIsInN1YlBhY2thZ2VDb25maWdzIiwic3ViRGlyUGF0aCIsImFsbFBhY2thZ2VDb25maWdzIiwidGhlbiIsImJ1bkxvY2tiUGF0aCJdLCJtYXBwaW5ncyI6InltQkFVTyxNQUFNQSxFQUFVLElBVnZCLE1BSUVDLFdBQUFBLEdBQ0VDLEtBQUtDLFdB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
|