wbfy 2.27.2 → 2.27.3
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 +1 -1
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{globby as a,globbySync as c}from"globby";import{PromisePool as l}from"minimal-promise-pool";import{Octokit as p}from"@octokit/core";import d from"node:child_process";import u from"deepmerge";import m from"lodash.clonedeep";import f from"node:os";import g from"js-yaml";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const j=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:t}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function x(e){return j.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 _(n){return j.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)}))}async function P(e){return j.functionIgnoringException("fixPrismaEnvFiles",(async()=>{const n=await a(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath});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 $(n){return j.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 S=new l;async function F(e,s){return j.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 S.run((()=>r.rename(t.join(i,e.name),t.join(i,a,"index.d.ts"))))):o&&(await r.mkdir(o,{recursive:!0}),await S.run((()=>r.rename(t.join(i,e.name),t.join(o,e.name))))):e.isDirectory()&&o&&!p&&(await r.mkdir(o,{recursive:!0}),await S.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 j.functionIgnoringException("fixAbbreviations",(async()=>{const s=n.dirPath,i=await a("**/*.md",{dot:!0,cwd:s,gitignore:!0});k.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const o of i){const i=t.join(s,o);await S.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(["{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,gitignore:!0});k.isVerbose&&console.info(`Found ${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("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,gitignore:!0});k.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=r.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=O(a,n,"text"),r!==a&&await C.generateFile(o,a)}await S.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,I=!!D,T=new p({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]=J(e,t,n);if(0===d.spawnSync(s,i,o).status)break}while(--s>=0)}function W(e,t,n){const[s,i,o]=J(e,t,n);o.stdio="pipe";const r=d.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map((e=>`"${e}"`))}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function J(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 L(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 j.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",t?.info?.version),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?S.run((()=>e.promises.writeFile(o,i.join("\n")+"\n"))):S.run((()=>e.promises.rm(o,{force:!0})))),await S.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+/);L(n)>L(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]=u(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 j.functionIgnoringException("generateBiomeJsonc",(async()=>{let s=m(X);const i=t.resolve(n.dirPath,"biome.jsonc");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=u.all([s,n,s],{arrayMerge:K})}catch{}const o=JSON.stringify(s);await S.run((()=>C.generateFile(i,o)))}))}async function Z(e){return j.functionIgnoringException("generateBunfigToml",(async()=>{const n=t.resolve(e.dirPath,"bunfig.toml");await S.run((()=>C.generateFile(n,"telemetry = false\n\n[install]\nexact = true\n\n[run]\nbun = true\n\n")))}))}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 j.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 S.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"].sort(),codeWith4IndentSize:["go","gradle","py"].sort(),codeWith8IndentSize:["sh"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].sort(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].sort()},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.codeWith8IndentSize)}\nindent_size = 8\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 j.functionIgnoringException("generateEditorconfig",(async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run((()=>C.generateFile(n,le)))}))}function de(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function ue(n){return j.functionIgnoringException("generateEslintignore",(async()=>{const s=t.resolve(n.dirPath,".eslintignore");if(n.isBun)return void await S.run((()=>e.promises.rm(s,{force:!0})));const i=await C.readFileIgnoringError(s)??"",o=oe.getHeadUserContent(i),r=oe.getTailUserContent(i),a=t.resolve(n.dirPath,".gitignore"),c=o+"\n3rd-party/\n@types/\n__generated__/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.config.*js\n*.d.ts\n*.min.*js\n.yarn/\n.pnp.js\n"+(await oe.readGitignoreWithoutSeparators(a)||"")+r;await S.run((()=>C.generateFile(s,c)))}))}async function me(n,s){return j.functionIgnoringException("generateEslintrc",(async()=>{const i=t.resolve(n.dirPath,".eslintrc.json");if(n.isBun)return void await S.run((()=>e.promises.rm(i,{force:!0})));const o=[];n.eslintBase&&o.push(n.eslintBase),n!==s&&o.push("../../.eslintrc.json");let r={root:!0,extends:o};try{const t=await e.promises.readFile(i,"utf8"),s=JSON.parse(t);s.extends&&(s.extends=s.extends.filter((e=>!e.startsWith("@willbooster/")&&"../../.eslintrc.json"!==e))),0===o.length&&(s.extends=[]);const a=r.extends;r.extends=s.extends,s.extends=a,r=u.all([r,s,r],{arrayMerge:V}),n.depending.blitz&&(r.extends=r.extends.filter((e=>"./node_modules/@blitzjs/next/eslint"!==e)))}catch{}const a=JSON.stringify(r);await S.run((()=>C.generateFile(i,a)))}))}const fe=`* 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 ge(e){return j.functionIgnoringException("generateGitattributes",(async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run((()=>C.generateFile(n,fe)))}))}const he=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function ye(e,n){return j.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/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\n";const r=oe.getTailUserContent(i),a=[...he];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 ve(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 S.run((()=>be(e,t))),k.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 S.run((()=>C.generateFile(s,l)))}))}const we=t.join(f.homedir(),".cache","wbfy","gitignore");async function be(n,s){await e.promises.mkdir(we,{recursive:!0}),await e.promises.writeFile(t.join(we,n),s)}async function ve(n){try{const s=await e.promises.stat(t.join(we,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(we,n),"utf8")}catch{}}async function ke(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}: ${n}`)}}const je={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},xe={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};function _e(e){return e.depending.blitz?xe.blitz:xe.node}const Pe=["eslint@8.57.0","eslint-config-prettier","eslint-plugin-import","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn"],$e=[...Pe,"@typescript-eslint/eslint-plugin","@typescript-eslint/parser","eslint-import-resolver-typescript"],Se=["eslint-plugin-react","eslint-plugin-react-hooks"],Fe={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...Pe],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...Pe,...Se],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...$e],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...$e,...Se],"@willbooster/eslint-config-blitz-next":["@willbooster/eslint-config-blitz-next","eslint-config-next",...$e,...Se],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...$e,...Se]};async function Ce(n,s,i){return j.functionIgnoringException("generatePackageJson",(async()=>{await async function(n,s,i){const o=t.resolve(n.dirPath,"package.json"),r=await e.promises.readFile(o,"utf8"),l=JSON.parse(r);l.scripts=l.scripts||{},l.dependencies=l.dependencies||{},l.devDependencies=l.devDependencies||{},l.peerDependencies=l.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(Fe))for(const t of e)delete n.devDependencies[t];await S.run((()=>e.promises.rm("lerna.json",{force:!0})))}(s,l),"@willbooster/prettier-config"!==l.name&&(l.prettier="@willbooster/prettier-config");for(const[e,t]of Object.entries(l.scripts))t.includes("git clone")||(l.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));l.scripts=u(l.scripts,Ee(n)),n.isBun?delete l.scripts.prettify:l.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(l.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(l.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],d=["prettier","sort-package-json","@willbooster/prettier-config"];const m=[];n.isBun?delete l.devDependencies["lint-staged"]:d.push("lint-staged");if(n.isRoot){if(n.isBun?(delete l.devDependencies.husky,delete l.devDependencies.pinst,l.scripts.prepare="lefthook install || true",d.push("lefthook")):(d.push("husky"),l.scripts.prepare="husky || true",l.scripts.postinstall="husky || true",(n.isPublicRepo||n.isReferredByOtherRepo)&&(d.push("pinst"),l.scripts.prepack="pinst --disable",l.scripts.postpack="pinst --enable")),n.depending.semanticRelease){const e=l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]?"@6.1.0":"";d.push(`conventional-changelog-conventionalcommits${e}`),l.devDependencies["semantic-release"]||l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]||d.push("semantic-release"),l.version="0.0.0-semantically-released"}n.depending.playwrightTest&&(l.dependencies["@playwright/test"]||(d.push("@playwright/test"),delete l.dependencies["@playwright/test"]),delete l.dependencies.playwright,delete l.devDependencies.playwright),n.doesContainsSubPackageJsons?l.workspaces=Array.isArray(l.workspaces)?u.all([l.workspaces,["packages/*"]],{arrayMerge:V}):["packages/*"]:Array.isArray(l.workspaces)&&(l.workspaces=l.workspaces.filter((e=>c(e,{dot:!0,cwd:n.dirPath,gitignore:!0}).length>0)),0===l.workspaces.length&&delete l.workspaces)}if(n.depending.wb||n.isBun){l.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):d.push("@willbooster/wb");for(const[e,t]of Object.entries(l.scripts))l.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainsJavaScript||n.doesContainsJavaScriptInPackages||n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(n.isBun?(d.push("@biomejs/biome","@willbooster/biome-config"),delete l.devDependencies.eslint,delete l.devDependencies.micromatch,delete l.devDependencies["@typescript-eslint/parser"]):(d.push("eslint@8.57.0","micromatch"),n.doesContainsTypeScriptInPackages&&d.push("@typescript-eslint/parser")));(n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(d.push("typescript"),n.isBun&&d.push("@types/bun"));n.eslintBase&&d.push(...Fe[n.eslintBase]);n.isWillBoosterConfigs&&(p=p.filter((e=>!e.includes("@willbooster/"))),d=d.filter((e=>!e.includes("@willbooster/"))));l.name||(l.name=t.basename(n.dirPath));n.doesContainsSubPackageJsons&&(l.private=!0);l.license||(l.license="UNLICENSED");!l.private&&"UNLICENSED"!==l.license&&s.isPublicRepo&&(l.publishConfig??={},l.publishConfig.access??="public");const[f]=A.getOrgAndName(n.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(l.author="WillBooster Inc.");n.isRoot||!l.private||l.main||(l.main="./src");if(delete l.resolutions?.["npm/chalk"],!n.doesContainsSubPackageJsons){if(n.isBun||(n.doesContainsJavaScript||n.doesContainsTypeScript?l.scripts["lint-fix"]+=je.getLintFixSuffix(n):(delete l.scripts.lint,delete l.scripts["lint-fix"],l.scripts.cleanup=l.scripts.cleanup?.replace(" && yarn lint-fix",""))),n.doesContainsPubspecYaml){l.scripts.lint="flutter analyze",l.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter((s=>e.existsSync(t.resolve(n.dirPath,s))));s.length>0&&(l.scripts["format-code"]=`flutter format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,l.scripts.format+=" && yarn format-code")}if(n.doesContainsPoetryLock){"poetry install"===l.scripts.postinstall&&delete l.scripts.postinstall;const e=await a("**/*.py",{cwd:n.dirPath,dot:!0,gitignore:!0,ignore:["test-fixtures"]}),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(" ");l.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,l.scripts.lint?l.scripts.lint=`poetry run flake8 ${e} && ${l.scripts.lint}`:(l.scripts.lint=`poetry run flake8 ${e}`,l.scripts["lint-fix"]="yarn lint"),l.scripts.format+=" && yarn format-code",m.push("black","isort","flake8")}}n.repository&&(l.repository=n.repository)}n.depending.blitz?(p.push(`blitz@${G}`,`@blitzjs/auth@${G}`,`@blitzjs/next@${G}`,`@blitzjs/rpc@${G}`,`next@${U}`),d=d.filter((e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e)),l.scripts["gen-code"]?.startsWith("blitz codegen")?l.scripts["gen-code"].includes("blitz prisma generate")||(l.scripts["gen-code"]=l.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):l.scripts["gen-code"]="blitz codegen"):n.depending.prisma&&!l.scripts["gen-code"]?.startsWith("prisma generate")&&(l.scripts["gen-code"]="prisma generate");n.depending.next&&delete l.devDependencies["@types/react"];l.dependencies?.prettier||delete l.devDependencies["@types/prettier"];0===Object.keys(l.dependencies).length&&delete l.dependencies;0===Object.keys(l.devDependencies).length&&delete l.devDependencies;0===Object.keys(l.peerDependencies).length&&delete l.peerDependencies;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")){delete e.devDependencies["@willbooster/auth"];const t=await ke("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await ke("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await ke("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")){delete e.dependencies["@willbooster/judge"];const t=await ke("WillBoosterLab","judge");e.devDependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")){delete e.dependencies["@willbooster/llm-proxy"];const t=await ke("WillBoosterLab","llm-proxy");e.devDependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#workspace=@llm-proxy/client&commit=${t}`}}(l),n.isBun&&delete l.packageManager;let g=JSON.stringify(l);if(g=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(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,gitignore:!0});for(const n of r)await S.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 S.promiseAll(),s}(l.scripts,g,n),await e.promises.writeFile(o,g),!i){p=p.filter((e=>!l.devDependencies?.[e]));const e=n.isBun?"bun":"yarn";p.length>0&&R(e,["add",...new Set(p)],n.dirPath),d=d.filter((e=>!l.dependencies?.[e])),d.length>0&&R(e,["add","-D",...new Set(d)],n.dirPath),m.length>0&&R("poetry",["add","--group","dev",...new Set(m)],n.dirPath)}}(n,s,i)}))}function Ee(e){if(e.isBun){const t={cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun wb test",typecheck:"bun --bun wb typecheck"};return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||delete t.typecheck,t}{let t={cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:`eslint --color "./{${_e(e)}}/**/*.{${ce.eslint.join(",")}}"`,"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=u({...t},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${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}}const Be={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nyarn typecheck\n'.trim(),postMerge:'\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function Oe(n){return j.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 S.run((()=>e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0}))),await S.run((()=>e.promises.writeFile(a,Be.preCommit+"\n")));const{typecheck:c}=Ee(n);if(c){let s=n.repository?.startsWith("github:WillBoosterLab/")?Be.prePushForLab:Be.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 S.run((()=>e.promises.writeFile(t.resolve(r,"pre-push"),s+"\n",{mode:493})))}const l=`${Be.postMerge}\n\n${De(n).join("\n")}\n`;await S.run((()=>e.promises.writeFile(t.resolve(r,"post-merge"),l,{mode:493})))}(n)}))}function De(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 Ie(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 Te=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ce.prettier.map((e=>Ie("node","node_modules/.bin/prettier --cache --write","Prettier",e))).join("")}\n </component>\n</project>\n`,Ae=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ce.prettier.map((e=>Ie("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-errors","Biome",e))).join("")}\n </component>\n</project>\n`;async function Re(n){return j.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?S.run((()=>C.generateFile(i,n.isBun?Ae:Te))):S.run((()=>e.promises.rm(i,{force:!0}))))}}))}const We={"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"}}}},Je={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 Le(n){return j.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"),g.dump(We,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]);const{typecheck:i}=Ee(n);if(i){const i=n.repository?.startsWith("github:WillBoosterLab/")?Je.prePushForLab:Je.prePush;e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await S.run((()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493})))}const o=`${Je.postMerge}\n\n${De(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await S.run((()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),o,{mode:493})))}(n)}))}async function Ne(n){return j.functionIgnoringException("generateLintstagedrc",(async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await S.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 '${ze(n)}': [${JSON.stringify(`${i}eslint --fix${je.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, '${ze(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 S.run((()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0}))),await S.run((()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0}))),await S.run((()=>C.generateFile(s,a)))}(n)}))}function ze(e){return`./{${_e(e).join(",")}}/**/*.{${ce.eslint.join(",")}}`}async function Ge(n){return j.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 S.run((()=>C.generateFile(s,i)))}))}async function Ue(e){return j.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 S.run((()=>C.generateFile(n,l)))}))}const He={venvPath:".",venv:".venv"};async function Me(n){return j.functionIgnoringException("generatePyrightConfigJson",(async()=>{let s=m(He);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=u.all([s,n,s],{arrayMerge:K})}catch{}const o=JSON.stringify(s);await S.run((()=>C.generateFile(i,o)))}))}async function qe(n){return j.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=Ye(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=Ye(i,a))}await S.run((()=>C.generateFile(s,i)))}))}function Ye(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 Ke(n){return j.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",u.all([n,{preset:"conventionalcommits"}],{arrayMerge:K})]:"@semantic-release/github"===t&&(o[e]=["@semantic-release/github",u.all([n,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:K})])}const r=JSON.stringify(i);await S.run((()=>C.generateFile(s,r)))}))}const Ve={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function Xe(n){return j.functionIgnoringException("generateRenovateJson",(async()=>{let s=m(Ve);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=u.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 S.run((()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0}))),await S.run((()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0})));const o=JSON.stringify(s);await S.run((()=>C.generateFile(i,o)))}))}function Qe(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&&Qe(s);return e}const 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,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*","packages/*/src/**/*","packages/*/tests/**/*","packages/*/scripts/**/*"]},et={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*"]};async function tt(n){return j.functionIgnoringException("generateTsconfig",(async()=>{if(n.depending.blitz||n.depending.next)return;let s=m(n.isRoot?Ze:et);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=u.all([s,o,s],{arrayMerge:V}),s.include=s.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}Qe(s),s.include?.sort();const o=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await S.run((()=>C.generateFile(i,o)))}))}const nt=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function st(n){return j.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 nt)o=u.all([o,it(e)]);n.doesContainsPoetryLock&&(o=u.all([o,it("**/.venv/**")])),n.depending.next&&(o=u.all([o,it("**/.next/**")])),Qe(o??{});const r=JSON.stringify(o,void 0,2);await S.run((()=>C.generateFile(s,r)))}catch{}}))}function it(e){return{"files.watcherExclude":{[e]:!0}}}const ot={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 rt(n){return j.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 S.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 S.run((()=>at(n,s,i)))}await S.run((()=>e.promises.rm(t.join(s,"add-focused-issue-to-project.yml"),{force:!0,recursive:!0})))}))}async function at(n,s,i){let o=m(ot[i]??{});const r=t.join(s,`${i}.yml`);try{const t=await e.promises.readFile(r,"utf8"),n=g.load(t);o=u.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([...o.on.push["paths-ignore"]??[],"**.md","**/docs/**"])]));for(const e of Object.values(o.jobs)){if(!e.uses?.includes?.("/reusable-workflows/"))return;ct(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&<(o,20,24);break;case"wbfy-merge":lt(o,1,4)}if(function(e){delete e.jobs["add-to-project"]}(o),await pt(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(!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 pt(o,t.join(s,"sync-force.yml"))}}function ct(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;e&&(t.with.sync_params_without_dest=e.toString().replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,function(e){if(!e.with)return;delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,delete e.with.cpu_arch,delete e.with.label,delete e.with.labelOperator}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.toString().replace(/\s+--json/,"")),e.doesContainsDockerfile&&("extra-large"!==t.with.ci_size&&(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?Qe(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Qe(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function lt(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 pt(t,n){const s=g.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function dt(n){return j.functionIgnoringException("generateYarnrcYml",(async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await S.run((()=>e.promises.rm(s,{force:!0}))),await S.run((()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0}))),void await S.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);ut(i)<=ut(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 S.run((()=>e.promises.rm(t.join(r,n))));const a=t.resolve(n.dirPath,".yarnrc");await S.run((()=>e.promises.rm(a,{force:!0})));const c=g.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 S.run((()=>e.promises.rm(s,{force:!0})))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,g.dump(c,{lineWidth:-1})),R("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)}))}function ut(e){const[t]=e.split(".");return Number(t)}async function mt(e){return j.functionIgnoringException("setupLabels",(async()=>{if(!I)return;const[t,n]=A.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await ft(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await ft(t,n,"d2: easy :rabbit2:","DDD6FE"),await ft(t,n,"d3: medium :ox:","C4B5FD"),await ft(t,n,"d4: hard :squid:","A78BFA"),await ft(t,n,"d5: x-hard :whale2:","8B5CF6"),await ft(t,n,"p1: critical :fire::fire::fire:","EF4444"),await ft(t,n,"p2: urgent :fire::fire:","F87171"),await ft(t,n,"p3: important :fire:","FCA5A5"),await ft(t,n,"p4: nice to have :droplet:","FECACA"),await ft(t,n,"r: blitz","5300bc"),await ft(t,n,"r: firebase","ffca28"),await ft(t,n,"r: prisma","0c344b"),await ft(t,n,"r: react","61dafb"),await ft(t,n,"r: svelte","ff3e00"),await ft(t,n,"r: semantic-release","494949"),await ft(t,n,"ready :rocket:","22C55E"),await ft(t,n,"review requested :mag:","FBCA04"),await ft(t,n,"released :bookmark:","6366F1"),await ft(t,n,"s: 0.5h :clock1230:","F3F4F6"),await ft(t,n,"s: 1h :clock1:","E5E7EB"),await ft(t,n,"s: 2h :clock2:","D1D5DB"),await ft(t,n,"s: 3h :clock3:","9CA3AF"),await ft(t,n,"s: 5h :clock5:","6B7280"),await ft(t,n,"s: 8h :clock8:","4B5563"),await ft(t,n,"s: 13h :clock1:","374151"),await ft(t,n,"t: build :hammer:","BFDBFE"),await ft(t,n,"t: chore :broom:","BFDBFE"),await ft(t,n,"t: ci :construction_worker:","BFDBFE"),await ft(t,n,"t: docs :memo:","BFDBFE"),await ft(t,n,"t: feat :sparkles:","BFDBFE"),await ft(t,n,"t: fix :bug:","BFDBFE"),await ft(t,n,"t: perf :zap:","BFDBFE"),await ft(t,n,"t: refactor :recycle:","BFDBFE"),await ft(t,n,"t: style :lipstick:","BFDBFE"),await ft(t,n,"t: test :test_tube:","BFDBFE"),await ft(t,n,"project","24292F"),await ft(t,n,"focused :dart:","22C55E"),await gt(t,n,"bug"),await gt(t,n,"documentation"),await gt(t,n,"duplicate"),await gt(t,n,"enhancement"),await gt(t,n,"good first issue"),await gt(t,n,"help wanted"),await gt(t,n,"invalid"),await gt(t,n,"question"),await gt(t,n,"wontfix"),await gt(t,n,"ready"),await gt(t,n,"review requested"),await gt(t,n,"released"),await gt(t,n,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function ft(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 gt(e,t,n){try{await T.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const ht=["READY_DISCORD_WEBHOOK_URL"];async function yt(e){return j.functionIgnoringException("setupSecrets",(async()=>{if(!I||!k.doesUploadEnvVars)return;const[t,n]=A.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const s=h.config().parsed||{};if(0!==Object.keys(s).length)try{for(const e of ht)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 y.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=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,s),p=y.to_base64(l,y.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 wt(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 bt={"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 vt(n){return j.functionIgnoringException("generateGitHubTemplates",(async()=>{for(const[s,i]of Object.entries(bt)){const o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(w(t,i)>i.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await S.run((()=>C.generateFile(o,i)))}}))}const kt=v.object({typos:v.object({all:v.record(v.string()).optional(),doc:v.record(v.string()).optional(),ts:v.record(v.string()).optional(),text:v.record(v.string()).optional()}).optional()});async function jt(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=b(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 _t(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await _t(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 w;try{const e=await r.readFile(y,"utf8");w=kt.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:xt("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:xt("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScript:xt("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsx:xt("{app,src,tests}/**/*.{t,j}sx",n),doesContainsJavaScriptInPackages:xt("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScriptInPackages:xt("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsxInPackages:xt("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:w};if(v.isBun||(v.eslintBase=function(e){if(e.depending.blitz)return"@willbooster/eslint-config-blitz-next";if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainsTypeScript)return e.doesContainsJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainsJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainsJavaScript)return"@willbooster/eslint-config-js"}(v)),v.doesContainsGemfile||v.doesContainsGoMod||v.doesContainsPackageJson||v.doesContainsPoetryLock||v.doesContainsPomXml||v.doesContainsPubspecYaml||v.doesContainsTemplateYaml)return v}catch{}}function xt(e,t){return c(e,{dot:!0,cwd:t}).length>0}async function _t(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;k.isVerbose=n.verbose,k.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,...r]);const a=await jt(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=>jt(e,a))))).filter((e=>!!e)),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await H(a),await dt(a),await Promise.all([x(a),P(a),c.then((()=>qe(a))),ae(a),pe(a),ge(a),vt(a),Re(a),Xe(a),Ke(a),rt(a),mt(a),yt(a),wt(a),...a.isBun?[Z(a),Oe(a).then((()=>Le(a)))]:[Oe(a)],Ne(a)]),await S.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(_(e)),e.depending.next&&d.push(Ge(e)),await ye(e,a),await S.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await Ue(e),await Ce(e,a,n.skipDeps),d.push(Ne(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(st(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(tt(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isBun&&d.push(Q(e)),a.isWillBoosterConfigs||d.push(me(e,a)),d.push(ue(e))),e.depending.pyright&&d.push(Me(e)));await Promise.all(d),await S.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy9maXhlcnMvcGxheXdyaWdodENvbmZpZy50cyIsIi4uL3NyYy9maXhlcnMvcHJpc21hLnRzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbkNvbnN0YW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FzZGYudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYmlvbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludGlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL3V0aWxzL2VzbGludFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3JjRGlyZWN0b3JpZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2h1c2t5cmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9pZGVhLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9uZXh0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd29ya2Zsb3cudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy95YXJucmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9zZWNyZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy9wYWNrYWdlQ29uZmlnLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIE9wdGlvbnMge1xuICBpc1ZlcmJvc2U6IGJvb2xlYW47XG4gIGRvZXNVcGxvYWRFbnZWYXJzOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaXNWZXJib3NlID0gZmFsc2U7XG4gICAgdGhpcy5kb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IGVycm9yfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4RG9ja2VyZmlsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhEb2NrZXJmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0RvY2tlcmZpbGUpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBjb25maWcuZG9ja2VyZmlsZTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudDtcblxuICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgbmV3Q29udGVudCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC9yZXRyaWVzOi4rLC8sICdyZXRyaWVzOiBwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEsJyk7XG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UHJpc21hRW52RmlsZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UHJpc21hRW52RmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW52RmlsZXMgPSBhd2FpdCBnbG9iYnkoWycqLmVudicsICcqLmVudi4qJ10sIHsgZG90OiB0cnVlLCBjd2Q6IGNvbmZpZy5kaXJQYXRoIH0pO1xuICAgIGZvciAoY29uc3QgZW52RmlsZSBvZiBlbnZGaWxlcykge1xuICAgICAgY29uc3QgZW52RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGVudkZpbGUpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL0RBVEFCQVNFX1VSTD1cIj8oLitcXC5zcWxpdGUzKVwiP1tcXG4kXS8sXG4gICAgICAgICdEQVRBQkFTRV9VUkw9XCIkMT9jb25uZWN0aW9uX2xpbWl0PTFcIlxcbidcbiAgICAgICk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZW52RmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZFRlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnX190ZXN0c19fJyk7XG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdHMnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4Jyk7XG4gICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZUFsbCgnX190ZXN0c19fJywgJ3Rlc3RzJyk7XG4gICAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgbmV3Q29udGVudCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpKTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmc3AucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBhc3luYyBnZW5lcmF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZnNwLndyaXRlRmlsZShmaWxlUGF0aCwgY29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeEFiYnJldmlhdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGdsb2JieSgnKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGdpdGlnbm9yZTogdHJ1ZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4QWJicmV2aWF0aW9uc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGdsb2JieShcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgXSxcbiAgICAgIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGdpdGlnbm9yZTogdHJ1ZSB9XG4gICAgKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0c0ZpbGVzLmxlbmd0aH0gVHlwZVNjcmlwdCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHNGaWxlIG9mIHRzRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIHRzRmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IG9sZENvbnRlbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKiljXFwuZlxcLi9nLCAnLy8kMWNmLicpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopZWdcXC4vZywgJy8vJDFlLmcuJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKilpZVxcLi9nLCAnLy8kMWkuZS4nKTtcbiAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBnbG9iYnkoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGdpdGlnbm9yZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgICAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWVnXFwuL2csICcvLyQxZS5nLicpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopaWVcXC4vZywgJy8vJDFpLmUuJyk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeEFiYnJldmlhdGlvbnNJblRleHQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFxiY1xcLmZcXC4oW14kXSkvZywgJ2NmLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oW14kXSkvZywgJ2UuZy4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKFteJF0pL2csICdpLmUuJDEnKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmNvbnN0IHRva2VuID1cbiAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVCB8fCBwcm9jZXNzLmVudi5QVUJMSUNfR0hfQk9UX1BBVCB8fCBwcm9jZXNzLmVudi5HSF9UT0tFTiB8fCBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU47XG5leHBvcnQgY29uc3QgaGFzR2l0SHViVG9rZW4gPSAhIXRva2VuO1xuZXhwb3J0IGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gIGF1dGg6IHRva2VuLFxufSk7XG5cbmNsYXNzIEdpdEh1YlV0aWwge1xuICBnZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVybFdpdGhvdXRQcm90b2NvbCA9IHVybE9yRnVsbE5hbWUuc3BsaXQoJzonKS5hdCgtMSk7XG4gICAgY29uc3QgbmFtZXMgPSB1cmxXaXRob3V0UHJvdG9jb2w/LnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgb3JnID0gbmFtZXM/LmF0KC0yKSA/PyAnJztcbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvLmdpdCQvLCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke29wdGlvbnMuY3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgaWYgKHJldC5zdGF0dXMgPT09IDApIGJyZWFrO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgY29uc3QgZXJyb3IgPSBwcm9jLnN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKX1dIGNhdXNlZCB0aGUgZm9sbG93aW5nIGVycm9yOlxcbiAke2Vycm9yfWApO1xuICB9XG4gIHJldHVybiBwcm9jLnN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5yZXBsYWNlKGAke2Vudi5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJyk7XG4gIH1cblxuICBpZiAoZW52LkFTREZfRElSKSB7XG4gICAgYXJncyA9IFsnLWwnLCAnLWMnLCBgLiAke2Vudi5BU0RGX0RJUn0vYXNkZi5zaCAmJiAke2NvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9YF07XG4gICAgY29tbWFuZCA9ICdiYXNoJztcbiAgfVxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gY29udmVydFZlcnNpb25JbnRvTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIGUuZy4gamF2YSBhZG9wdG9wZW5qZGstMTEuMC4xNys4XG4gIGNvbnN0IG51bWJlcnMgPSB2ZXJzaW9uXG4gICAgLnNwbGl0KC9bKy4tXS8pXG4gICAgLm1hcChOdW1iZXIpXG4gICAgLmZpbHRlcigobnVtKSA9PiAhTnVtYmVyLmlzTmFOKG51bSkpO1xuICBsZXQgdmVyc2lvbk51bWJlciA9IDA7XG4gIGxldCBkaXZpc29yID0gMTtcbiAgZm9yIChjb25zdCBudW0gb2YgbnVtYmVycykge1xuICAgIHZlcnNpb25OdW1iZXIgKz0gbnVtICogZGl2aXNvcjtcbiAgICBkaXZpc29yIC89IDEwMDA7XG4gIH1cbiAgcmV0dXJuIHZlcnNpb25OdW1iZXI7XG59XG4iLCJleHBvcnQgY29uc3QgUFlUSE9OX1ZFUlNJT04gPSAnMy45LjE5JztcbmV4cG9ydCBjb25zdCBKQVZBX1ZFUlNJT04gPSAnenVsdS0xMS43NC4xNSc7XG4vLyBCZWNhdXNlIFdlYktpdCBjYW5ub3QgbG9nLWluIG9uIEJsaXR6IHYyLjAuNStcbmV4cG9ydCBjb25zdCBCTElUWl9WRVJTSU9OID0gJzIuMC40JztcbmV4cG9ydCBjb25zdCBORVhUX1ZFUlNJT04gPSAnMTQuMi41JztcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGNvbnZlcnRWZXJzaW9uSW50b051bWJlciB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgSkFWQV9WRVJTSU9OLCBQWVRIT05fVkVSU0lPTiB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb25Db25zdGFudHMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUb29sVmVyc2lvbnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUb29sVmVyc2lvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuY29uc3QgQ09SRV9UT09MUyA9IG5ldyBTZXQoWydqYXZhJywgJ25vZGVqcycsICdidW4nLCAncHl0aG9uJ10pO1xuY29uc3QgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTID0gWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ107XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY29uZmlnLnZlcnNpb25zVGV4dCkgcmV0dXJuO1xuXG4gIGNvbnN0IGR1cGxpY2F0YWJsZUxpbmVzID0gY29uZmlnLnZlcnNpb25zVGV4dFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgW25hbWUsIHZlcnNpb25dID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIC8vIFRvIG1vdmUgdGhlIHRvcCBvZiB0aGUgc29ydGVkIGxpc3QsIHdlIG5lZWQgdG8gYWRkIGEgc3BhY2UuXG4gICAgICByZXR1cm4gYCR7Q09SRV9UT09MUy5oYXMobmFtZSkgPyAnICcgOiAnJ30ke25hbWV9ICR7dmVyc2lvbn1gO1xuICAgIH0pXG4gICAgLnNvcnQoKVxuICAgIC8vIFJlbW92ZSBhZGRlZCBzcGFjZXMuXG4gICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBhZnRlciBsZWZ0aG9vayBpcyBpbnN0YWxsZWQgdmlhIG5wbS5cbiAgICAuZmlsdGVyKChsaW5lKSA9PiAhbGluZS5zdGFydHNXaXRoKCdsZWZ0aG9vaycpKTtcbiAgY29uc3QgbGluZXMgPSBbLi4ubmV3IFNldChkdXBsaWNhdGFibGVMaW5lcyldO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vcHlwaS5vcmcvcHlwaS9wb2V0cnkvanNvbicpO1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgY29uc3QgcG9ldHJ5VmVyc2lvbiA9IGpzb24/LmluZm8/LnZlcnNpb247XG4gICAgaWYgKHBvZXRyeVZlcnNpb24pIHtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdwb2V0cnknLCBqc29uPy5pbmZvPy52ZXJzaW9uKTtcbiAgICB9XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3B5dGhvbicsIFBZVEhPTl9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdqYXZhJywgSkFWQV9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgY29uc3QgYnVuVmVyc2lvbiA9IGF3YWl0IGdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIoJ292ZW4tc2gnLCAnYnVuJyk7XG4gICAgICBpZiAoYnVuVmVyc2lvbikgdXBkYXRlVmVyc2lvbihsaW5lcywgJ2J1bicsIGJ1blZlcnNpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgnbnBtJywgWydzaG93JywgJ3lhcm4nLCAndmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAneWFybicsIHZlcnNpb24pO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcHJlZml4IG9mIERFUFJFQ0FURURfVkVSU0lPTl9QUkVGSVhFUykge1xuICAgIGNvbnN0IHZlcnNpb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCk7XG4gICAgdm9pZCBmcy5wcm9taXNlcy5ybSh2ZXJzaW9uUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHRvb2xWZXJzaW9uc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudG9vbC12ZXJzaW9ucycpO1xuICBhd2FpdCAobGluZXMubGVuZ3RoID4gMFxuICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLndyaXRlRmlsZSh0b29sVmVyc2lvbnNQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nKSlcbiAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh0b29sVmVyc2lvbnNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgc3Bhd25TeW5jKCdhc2RmJywgWydwbHVnaW4nLCAndXBkYXRlJywgJy0tYWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgc3Bhd25TeW5jKCdhc2RmJywgWydpbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVmVyc2lvbihsaW5lczogc3RyaW5nW10sIHRvb2xOYW1lOiBzdHJpbmcsIG5ld1ZlcnNpb246IHN0cmluZywgaGVhZCA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnN0IGluZGV4ID0gbGluZXMuZmluZEluZGV4KChsKSA9PiBsLnNwbGl0KC9cXHMrLylbMF0gPT09IHRvb2xOYW1lKTtcbiAgY29uc3QgbmV3TGluZSA9IGAke3Rvb2xOYW1lfSAke25ld1ZlcnNpb259YDtcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIGxpbmVzLnNwbGljZShoZWFkID8gMCA6IGxpbmVzLmxlbmd0aCwgMCwgbmV3TGluZSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgWywgdmVyc2lvbl0gPSBsaW5lc1tpbmRleF0uc3BsaXQoL1xccysvKTtcbiAgICBpZiAoY29udmVydFZlcnNpb25JbnRvTnVtYmVyKG5ld1ZlcnNpb24pID4gY29udmVydFZlcnNpb25JbnRvTnVtYmVyKHZlcnNpb24pKSB7XG4gICAgICBsaW5lc1tpbmRleF0gPSBuZXdMaW5lO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvc2l0b3J5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIC8vIEZldGNoIHRoZSBsYXRlc3QgcmVsZWFzZSBmcm9tIHRoZSByZXBvc2l0b3J5XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvbGF0ZXN0Jywge1xuICAgICAgb3duZXI6IG9yZ2FuaXphdGlvbixcbiAgICAgIHJlcG86IHJlcG9zaXRvcnksXG4gICAgfSk7XG4gICAgY29uc3QgdmVyc2lvbiA9IHJlc3BvbnNlLmRhdGEudGFnX25hbWU7XG4gICAgY29uc3QgaW5kZXggPSB2ZXJzaW9uLmxhc3RJbmRleE9mKCd2Jyk7XG4gICAgY29uc3QgdmVyc2lvbk51bWJlclRleHQgPSBpbmRleCA9PT0gLTEgPyB2ZXJzaW9uIDogdmVyc2lvbi5zbGljZShpbmRleCArIDEpO1xuICAgIC8vIENoZWNrIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSBudW1iZXJcbiAgICByZXR1cm4gL15cXGQvLnRlc3QodmVyc2lvbk51bWJlclRleHQpID8gdmVyc2lvbk51bWJlclRleHQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIEJ1biB0YWdzIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG59XG4iLCJpbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJ3cml0ZU1lcmdlPFQ+KGRlc3RpbmF0aW9uQXJyYXk6IFRbXSwgc291cmNlQXJyYXk6IFRbXSk6IFRbXSB7XG4gIHJldHVybiBzb3VyY2VBcnJheTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiBhbnlbXSwgc291cmNlOiBhbnlbXSwgb3B0aW9uczogYW55KTogYW55W10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdChpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gbWVyZ2UodGFyZ2V0W2luZGV4XSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJy4vbm9kZV9tb2R1bGVzL0BiaW9tZWpzL2Jpb21lL2NvbmZpZ3VyYXRpb25fc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCaW9tZUpzb25jJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogdW5rbm93biA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KTtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGB0ZWxlbWV0cnkgPSBmYWxzZVxuXG5baW5zdGFsbF1cbmV4YWN0ID0gdHJ1ZVxuXG5bcnVuXVxuYnVuID0gdHJ1ZVxuXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGXjgafjga9ub2RlX21vZHVsZXPjgpJDT1BZ44GZ44KL5b+F6KaB44GM44GC44KL44Gf44KB44CBbm9kZV9tb2R1bGVz44KS6Zmk5aSW44GX44Gm44Gv44GE44GR44Gq44GE44CCXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuKiovLmlkZWFcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNEb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnNvcnQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAncHknXS5zb3J0KCksXG4gIGNvZGVXaXRoOEluZGVudFNpemU6IFsnc2gnXS5zb3J0KCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnNvcnQoKSxcbiAgZXNsaW50OiBbJ2NqcycsICdtanMnLCAnanMnLCAnY3RzJywgJ210cycsICd0cycsICd0c3gnLCAnanN4J10uc29ydCgpLFxuICBwcmV0dGllcjogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjc3MnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnbWQnLFxuICAgICdzY3NzJyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0uc29ydCgpLFxuICAvLyBjZi4gaHR0cHM6Ly9iaW9tZWpzLmRldi9pbnRlcm5hbHMvbGFuZ3VhZ2Utc3VwcG9ydC9cbiAgYmlvbWU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ2FzdHJvJyxcbiAgICAnY3NzJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ2dxbCcsXG4gIF0uc29ydCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg4SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDhcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbkB0eXBlcy9cbl9fZ2VuZXJhdGVkX18vXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbiouY29uZmlnLipqc1xuKi5kLnRzXG4qLm1pbi4qanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRXNsaW50aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludGlnbm9yZScpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRXNsaW50cmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFc2xpbnRyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5qc29uJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlcyA9IFtdO1xuICAgIGlmIChjb25maWcuZXNsaW50QmFzZSkge1xuICAgICAgYmFzZXMucHVzaChjb25maWcuZXNsaW50QmFzZSk7XG4gICAgfVxuICAgIGlmIChjb25maWcgIT09IHJvb3RDb25maWcpIHtcbiAgICAgIGJhc2VzLnB1c2goJy4uLy4uLy5lc2xpbnRyYy5qc29uJyk7XG4gICAgfVxuICAgIGxldCBuZXdTZXR0aW5ncyA9IHsgcm9vdDogdHJ1ZSwgZXh0ZW5kczogYmFzZXMgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCk7XG4gICAgICBpZiAob2xkU2V0dGluZ3MuZXh0ZW5kcykge1xuICAgICAgICBvbGRTZXR0aW5ncy5leHRlbmRzID0gb2xkU2V0dGluZ3MuZXh0ZW5kcy5maWx0ZXIoXG4gICAgICAgICAgKGV4dDogc3RyaW5nKSA9PiAhZXh0LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSAmJiBleHQgIT09ICcuLi8uLi8uZXNsaW50cmMuanNvbidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChiYXNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgb2xkU2V0dGluZ3MuZXh0ZW5kcyA9IFtdO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3RXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHM7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIG9sZFNldHRpbmdzLmV4dGVuZHMgPSBuZXdFeHRlbmRzO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgIH0pIGFzIHR5cGVvZiBuZXdTZXR0aW5ncztcbiAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGUgZm9sbG93aW5nIGNvZGUgYWZ0ZXIgYWxsIEJsaXR6LmpzIHByb2plY3RzIGFyZSB1cGRhdGVkLlxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHMuZmlsdGVyKFxuICAgICAgICAgIChleHQ6IHN0cmluZykgPT4gZXh0ICE9PSAnLi9ub2RlX21vZHVsZXMvQGJsaXR6anMvbmV4dC9lc2xpbnQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4hLmtlZXBcbi5lbnYucHJvZHVjdGlvblxuKi9tb3VudC8qLmhhc2hcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLmRldmNvbnRhaW5lci9cbmRpc3QvXG50ZW1wL1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGxldCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCkgKyBjb21tb25Db250ZW50O1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IG5hbWVzID0gWy4uLmRlZmF1bHROYW1lc107XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgICBuYW1lcy5wdXNoKCdub2RlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWwpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmF3cy1zYW0vXG5wYWNrYWdlZC55YW1sXG5gO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIC52ZW52IHNob3VsZCBiZSBpZ25vcmVkIG9uIHJvb3QgZGlyZWN0b3J5XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAqLnNxbGl0ZTMqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGB0ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvbVhtbCB8fCBjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oLmlkZWFcXC8uKykkL2dtLCAnJDFcXG5hbmRyb2lkLyQxJyk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyAnXFxuJyArIGdlbmVyYXRlZCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY2FjaGUnLCAnd2JmeScsICdnaXRpZ25vcmUnKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDYWNoZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgY29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSk7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGF0Lm10aW1lTXMgPiA2ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgeyBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgZGF0YTogY29tbWl0cyB9ID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMnLCB7XG4gICAgICBvd25lcjogb3JnYW5pemF0aW9uLFxuICAgICAgcmVwbyxcbiAgICAgIHBlcl9wYWdlOiAxLFxuICAgIH0pO1xuICAgIGlmIChjb21taXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWl0c1swXS5zaGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0cyBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb306ICR7ZXJyb3J9YCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgRXNsaW50VXRpbCA9IHtcbiAgZ2V0TGludEZpeFN1ZmZpeChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3ggPyAnIC0tcnVsZSBcInsgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzOiAwIH1cIicgOiAnJztcbiAgfSxcbn07XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3Qgc3JjRGlyZWN0b3JpZXMgPSB7XG4gIG5vZGU6IFsnc3JjJywgJ3Rlc3RzJywgJ3NjcmlwdHMnXS5zb3J0KCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0cycsICdzY3JpcHRzJywgJ2RiJywgJ2ludGVncmF0aW9ucycsICdtYWlsZXJzJ10uc29ydCgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNyY0RpcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ibGl0ejtcbiAgfVxuICByZXR1cm4gc3JjRGlyZWN0b3JpZXMubm9kZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHsgZ2xvYmJ5LCBnbG9iYnlTeW5jIH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgRXNsaW50RXh0ZW5zaW9uQmFzZSwgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgRXNsaW50VXRpbCB9IGZyb20gJy4uL3V0aWxzL2VzbGludFV0aWwuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0U3JjRGlycyB9IGZyb20gJy4uL3V0aWxzL3NyY0RpcmVjdG9yaWVzLmpzJztcbmltcG9ydCB7IEJMSVRaX1ZFUlNJT04sIE5FWFRfVkVSU0lPTiB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb25Db25zdGFudHMuanMnO1xuXG5jb25zdCBqc0NvbW1vbkRlcHMgPSBbXG4gICdlc2xpbnRAOC41Ny4wJyxcbiAgJ2VzbGludC1jb25maWctcHJldHRpZXInLFxuICAnZXNsaW50LXBsdWdpbi1pbXBvcnQnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbl07XG5cbmNvbnN0IHRzQ29tbW9uRGVwcyA9IFtcbiAgLi4uanNDb21tb25EZXBzLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4nLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlcicsXG4gICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLXR5cGVzY3JpcHQnLFxuXTtcblxuY29uc3QgcmVhY3RDb21tb25EZXBzID0gWydlc2xpbnQtcGx1Z2luLXJlYWN0JywgJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnXTtcblxuY29uc3QgZXNsaW50RGVwczogUmVjb3JkPEVzbGludEV4dGVuc2lvbkJhc2UsIHN0cmluZ1tdPiA9IHtcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLCAuLi5qc0NvbW1vbkRlcHMsIC4uLnJlYWN0Q29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JywgLi4udHNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctYmxpdHotbmV4dCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctYmxpdHotbmV4dCcsXG4gICAgJ2VzbGludC1jb25maWctbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICdlc2xpbnQtY29uZmlnLW5leHQnLFxuICAgIC4uLnRzQ29tbW9uRGVwcyxcbiAgICAuLi5yZWFjdENvbW1vbkRlcHMsXG4gIF0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzIHx8IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzIHx8IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgfHwge307XG5cbiAgYXdhaXQgcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaiBhcyBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz5cbiAgKTtcblxuICBpZiAoanNvbk9iai5uYW1lICE9PSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKSB7XG4gICAgLy8gRnJlc2ggcmVwbyBzdGlsbCByZXF1aXJlcyAneWFybiBpbnN0YWxsJ1xuICAgIGlmICghdmFsdWUuaW5jbHVkZXMoJ2dpdCBjbG9uZScpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoL3lhcm5cXHMqJiZcXHMqLywgJycpLnJlcGxhY2UoL3lhcm5cXHMqaW5zdGFsbFxccyomJlxccyovLCAnJyk7XG4gICAgfVxuICB9XG5cbiAganNvbk9iai5zY3JpcHRzID0gbWVyZ2UoanNvbk9iai5zY3JpcHRzLCBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnKSk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5O1xuICB9IGVsc2Uge1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSArPSBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuICAvLyBEZWFsIHdpdGggYnJlYWtpbmcgY2hhbmdlcyBpbiB5YXJuIGJlcnJ5IDQuMC4wLXJjLjQ5XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgaWYgKFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tYWxsJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXJlY3Vyc2l2ZScpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1zaW5jZScpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS13b3JrdHJlZScpXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcsICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCcpO1xuICB9XG5cbiAgbGV0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGRldkRlcGVuZGVuY2llcyA9IFsncHJldHRpZXInLCAnc29ydC1wYWNrYWdlLWpzb24nLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyddO1xuICBjb25zdCBwb2V0cnlEZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbGludC1zdGFnZWQnXTtcbiAgfSBlbHNlIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnbGludC1zdGFnZWQnKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydodXNreSddO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydwaW5zdCddO1xuICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPSAnbGVmdGhvb2sgaW5zdGFsbCB8fCB0cnVlJztcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsZWZ0aG9vaycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgaHVza3lcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdodXNreScpO1xuICAgICAgLy8gJ3x8IHRydWUnIGF2b2lkcyBlcnJvcnMgd2hlbiBodXNreSBpcyBub3QgaW5zdGFsbGVkLlxuICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPSAnaHVza3kgfHwgdHJ1ZSc7IC8vIGZvciBub24teWFybiBwYWNrYWdlIG1hbmFnZXJzLlxuICAgICAganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID0gJ2h1c2t5IHx8IHRydWUnOyAvLyBmb3IgeWFybi5cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvIHx8IGNvbmZpZy5pc1JlZmVycmVkQnlPdGhlclJlcG8pIHtcbiAgICAgICAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gICAgICAgIC8vIGh0dHBzOi8vdHlwaWNvZGUuZ2l0aHViLmlvL2h1c2t5LyMvP2lkPWluc3RhbGwtMVxuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncGluc3QnKTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhY2sgPSAncGluc3QgLS1kaXNhYmxlJztcbiAgICAgICAganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrID0gJ3BpbnN0IC0tZW5hYmxlJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBjb25zdCB2ZXJzaW9uID1cbiAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICAgICAgPyAvLyBUT0RPOiByZW1vdmUgdGhlIHZlcnNpb24gc3BlY2lmaWNhdGlvbiBhZnRlciBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlIHN1cHBvcnRzIHZlcnNpb24gNytcbiAgICAgICAgICAgICdANi4xLjAnXG4gICAgICAgICAgOiAnJztcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGBjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMke3ZlcnNpb259YCk7XG4gICAgICBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1sncGxheXdyaWdodCddO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydwbGF5d3JpZ2h0J107XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby5cbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKVxuICAgICAgICA/IG1lcmdlLmFsbChbanNvbk9iai53b3Jrc3BhY2VzLCBbJ3BhY2thZ2VzLyonXV0sIHtcbiAgICAgICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFsncGFja2FnZXMvKiddO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGdsb2JieVN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgZ2l0aWdub3JlOiB0cnVlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy53YiB8fCBjb25maWcuaXNCdW4pIHtcbiAgICBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoL3diXFxzK2RiLywgJ3diIHByaXNtYScpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzXG4gICkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAYmlvbWVqcy9iaW9tZScsICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyk7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludCddO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtaWNyb21hdGNoJ107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2VzbGludEA4LjU3LjAnLCAnbWljcm9tYXRjaCcpO1xuICAgICAgLy8gVE9ETzogbm90IG5lZWRlZCBhbnltb3JlP1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlcicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgndHlwZXNjcmlwdCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5lc2xpbnRCYXNlKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4uZXNsaW50RGVwc1tjb25maWcuZXNsaW50QmFzZV0pO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIH1cblxuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIEJlY2F1c2UgYFwicmVzb2x1dGlvbnNcIjogeyBcIm5wbS9jaGFsa1wiOiBcIl40LjEuMlwiIH0sYCBjYXVzZXMgXCJJbnZhbGlkIG5wbSB0b2tlblwiXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5jbGVhbnVwID0ganNvbk9iai5zY3JpcHRzLmNsZWFudXA/LnJlcGxhY2UoJyAmJiB5YXJuIGxpbnQtZml4JywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddICs9IEVzbGludFV0aWwuZ2V0TGludEZpeFN1ZmZpeChjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBmbHV0dGVyIGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgKz0gYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZ2xvYmJ5KCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGdpdGlnbm9yZTogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBbJ3Rlc3QtZml4dHVyZXMnXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoL1svXFxcXF0vKTtcbiAgICAgICAgaWYgKHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGBwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiBwb2V0cnkgcnVuIGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ICs9IGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICAgIHBvZXRyeURldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnJlcG9zaXRvcnkpIHtcbiAgICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5O1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICBgYmxpdHpAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgQGJsaXR6anMvYXV0aEAke0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBAYmxpdHpqcy9uZXh0QCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYEBibGl0empzL3JwY0Ake0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBuZXh0QCR7TkVYVF9WRVJTSU9OfWBcbiAgICApO1xuICAgIC8vIFByZWZlciBlc2xpbnQtY29uZmlnLW5leHQncyBkZXBlbmRlbmNpZXNcbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkKSA9PiBkICE9PSAnZXNsaW50LXBsdWdpbi1yZWFjdCcgJiYgZCAhPT0gJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnKTtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAvLyBUbyBwcmV2ZW50IG11bHRpcGxlIHZlcnNpb25zIG9mIEB0eXBlcy9yZWFjdCBmcm9tIG1peGluZy5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9yZWFjdCddO1xuICB9XG5cbiAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llcz8ucHJldHRpZXIpIHtcbiAgICAvLyBCZWNhdXNlIEB0eXBlcy9wcmV0dGllciBibG9ja3MgcHJldHRpZXIgZXhlY3V0aW9uLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzO1xuICB9XG5cbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICBsZXQgbmV3SnNvblRleHQgPSBKU09OLnN0cmluZ2lmeShqc29uT2JqKTtcbiAgbmV3SnNvblRleHQgPSBhd2FpdCBmaXhTY3JpcHROYW1lcyhqc29uT2JqLnNjcmlwdHMsIG5ld0pzb25UZXh0LCBjb25maWcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0pzb25UZXh0KTtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgLy8gV2UgY2Fubm90IGFkZCBkZXBlbmRlbmNpZXMgd2hpY2ggYXJlIGFscmVhZHkgaW5jbHVkZWQgaW4gZGV2RGVwZW5kZW5jaWVzLlxuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGV2RGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRlcGVuZGVuY2llcy5cbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctRCcsIC4uLm5ldyBTZXQoZGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gICAgaWYgKHBvZXRyeURldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4ubmV3IFNldChwb2V0cnlEZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBtaWdyYXRpb24gY29kZSBpbiBmdXR1cmVcbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0c2xpYiddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LXBsdWdpbi1wcmV0dGllciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xlcm5hJ107XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3BpbnN0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydwcmV0dGllciddO1xuICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICBmb3IgKGNvbnN0IGRlcHMgb2YgT2JqZWN0LnZhbHVlcyhlc2xpbnREZXBzKSkge1xuICAgICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKCdsZXJuYS5qc29uJywgeyBmb3JjZTogdHJ1ZSB9KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgY2xlYW51cDogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0JyxcbiAgICAgIGZvcm1hdDogYGJ1biAtLWJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICAgIGxpbnQ6IGBidW4gLS1idW4gd2IgbGludGAsXG4gICAgICAnbGludC1maXgnOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXgnLFxuICAgICAgdGVzdDogJ2J1biB3YiB0ZXN0JyxcbiAgICAgIHR5cGVjaGVjazogJ2J1biAtLWJ1biB3YiB0eXBlY2hlY2snLFxuICAgIH07XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9IGVsc2Uge1xuICAgIGxldCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgY2xlYW51cDogJ3lhcm4gZm9ybWF0ICYmIHlhcm4gbGludC1maXgnLFxuICAgICAgZm9ybWF0OiBgc29ydC1wYWNrYWdlLWpzb24gJiYgeWFybiBwcmV0dGlmeWAsXG4gICAgICBsaW50OiBgZXNsaW50IC0tY29sb3IgXCIuL3ske2dldFNyY0RpcnMoY29uZmlnKX19LyoqLyoueyR7ZXh0ZW5zaW9ucy5lc2xpbnQuam9pbignLCcpfX1cImAsXG4gICAgICAnbGludC1maXgnOiAneWFybiBsaW50IC0tZml4JyxcbiAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX1cIiBcIiEqKi90ZXN0LWZpeHR1cmVzLyoqXCJgLFxuICAgICAgdHlwZWNoZWNrOiAndHNjIC0tbm9FbWl0IC0tUHJldHR5JyxcbiAgICB9O1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBjb25zdCBvbGRUZXN0ID0gc2NyaXB0cy50ZXN0O1xuICAgICAgc2NyaXB0cyA9IG1lcmdlKFxuICAgICAgICB7IC4uLnNjcmlwdHMgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnkgJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oXG4gICAgICAgICAgICAnLCdcbiAgICAgICAgICApfX1cIiBcIiEqKi9wYWNrYWdlcy8qKlwiIFwiISoqL3Rlc3QtZml4dHVyZXMvKipcImAsXG4gICAgICAgICAgLy8gQ0k9MSBwcmV2ZW50cyB2aXRlc3QgZnJvbSBlbmFibGluZyB3YXRjaC5cbiAgICAgICAgICAvLyBGT1JDRV9DT0xPUj0zIG1ha2Ugd2IgZW5hYmxlIGNvbG9yIG91dHB1dC5cbiAgICAgICAgICB0ZXN0OiAnQ0k9MSBGT1JDRV9DT0xPUj0zIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tdmVyYm9zZSBydW4gdGVzdCcsXG4gICAgICAgICAgdHlwZWNoZWNrOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIHR5cGVjaGVjaycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAob2xkVGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9IHNjcmlwdHMudHlwZWNoZWNrID8gYCR7c2NyaXB0cy50eXBlY2hlY2t9ICYmIGAgOiAnJztcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICdweXJpZ2h0JztcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gJ3diIHR5cGVjaGVjayc7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeFNjcmlwdE5hbWVzKFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuZXdKc29uVGV4dDogc3RyaW5nLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG9sZEFuZE5ld1NjcmlwdE5hbWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5XSBvZiBPYmplY3Qua2V5cyhzY3JpcHRzKSkge1xuICAgIGlmIChrZXlbMF0gIT09ICc6JyAmJiBrZXkuaW5jbHVkZXMoJzonKSkge1xuICAgICAgb2xkQW5kTmV3U2NyaXB0TmFtZXMucHVzaChba2V5LCBrZXkucmVwbGFjZUFsbCgnOicsICctJyldKTtcbiAgICB9XG4gIH1cbiAgaWYgKG9sZEFuZE5ld1NjcmlwdE5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ld0pzb25UZXh0O1xuXG4gIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgbmV3SnNvblRleHQgPSBuZXdKc29uVGV4dC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICB9XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZ2xvYmJ5KFsnKiovKi57bWQsY2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JywgJyoqL0RvY2tlcmZpbGUnXSwge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGdpdGlnbm9yZTogdHJ1ZSxcbiAgfSk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IG9sZENvbnRlbnQ7XG4gICAgICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBvbGRBbmROZXdTY3JpcHROYW1lcykge1xuICAgICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG5ld0NvbnRlbnQgIT09IG9sZENvbnRlbnQpIHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIHJldHVybiBuZXdKc29uVGV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmo6IFBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKSwgLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpXSk7XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvYXV0aCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdhdXRoJyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9hdXRoJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvYXV0aC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0BkaXNjb3JkLWJvdC9zaGFyZWQnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdkaXNjb3JkLWJvdCcpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAZGlzY29yZC1ib3Qvc2hhcmVkJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvZGlzY29yZC1ib3QuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG5cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2NvZGUtYW5hbHl6ZXInKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXSA9XG4gICAgICBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvY29kZS1hbmFseXplci5naXQjd29ya3NwYWNlPUBjb2RlLWFuYWx5emVyL2NsaWVudCZjb21taXQ9JHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnanVkZ2UnKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvanVkZ2UuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnbGxtLXByb3h5Jyk7XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXSA9XG4gICAgICBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvbGxtLXByb3h5LmdpdCN3b3Jrc3BhY2U9QGxsbS1wcm94eS9jbGllbnQmY29tbWl0PSR7Y29tbWl0SGFzaH1gO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwcmVDb21taXQ6ICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL2xpbnQtc3RhZ2VkJyxcbiAgcHJlUHVzaDogYHlhcm4gdHlwZWNoZWNrYCxcbiAgcHJlUHVzaEZvckxhYjogYFxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbnlhcm4gdHlwZWNoZWNrXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGpzb25UZXh0KTtcbiAgcGFja2FnZUpzb24uc2NyaXB0cyB8fD0ge307XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwb3N0aW5zdGFsbCddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdHB1Ymxpc2gnXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3ByZXBhcmUnXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3ByZXB1Ymxpc2hPbmx5J107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwYWNrJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwb3N0cGFjayddO1xuXG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3knKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYWNrYWdlSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCB1bmRlZmluZWQsIDIpKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgc3Bhd25TeW5jKCdnaXQnLCBbJ2NvbmZpZycsICctLXVuc2V0JywgJ2NvcmUuaG9va3NQYXRoJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICdodXNreS1pbml0JywgJy0teWFybjInXSwgY29uZmlnLmRpclBhdGgpO1xuXG4gIGNvbnN0IHByZUNvbW1pdEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwcmUtY29tbWl0Jyk7XG5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy53cml0ZUZpbGUocHJlQ29tbWl0RmlsZVBhdGgsIHNjcmlwdHMucHJlQ29tbWl0ICsgJ1xcbicpKTtcblxuICBjb25zdCB7IHR5cGVjaGVjayB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZyk7XG4gIGlmICh0eXBlY2hlY2spIHtcbiAgICBsZXQgcHJlUHVzaCA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykgPyBzY3JpcHRzLnByZVB1c2hGb3JMYWIgOiBzY3JpcHRzLnByZVB1c2g7XG4gICAgcHJlUHVzaCA9IHByZVB1c2gucmVwbGFjZShcbiAgICAgICd5YXJuIHR5cGVjaGVjaycsXG4gICAgICB0eXBlY2hlY2tcbiAgICAgICAgLnJlcGxhY2UoJ3RzYyAnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi90c2MgJylcbiAgICAgICAgLnJlcGxhY2UoJ3diICcsICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL3diICcpXG4gICAgICAgIC8vIHB5cmlnaHQgaGFzIG5vIGFyZ3VtZW50c1xuICAgICAgICAucmVwbGFjZSgncHlyaWdodCcsICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL3B5cmlnaHQnKVxuICAgICk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwcmUtcHVzaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgICAgbW9kZTogMG83NTUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy52ZXJzaW9uc1RleHQpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImF3ayAne3ByaW50IFxcJDF9JyAudG9vbC12ZXJzaW9ucyB8IHhhcmdzIC1Je30gYXNkZiBwbHVnaW4gYWRkIHt9XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgcGx1Z2luIHVwZGF0ZSAtLWFsbFwiYFxuICAgICk7XG4gIH1cbiAgLy8gUHl0aG9u44GM44Gq44GE44Go44Kk44Oz44K544OI44O844Or44Gn44GN44Gq44GE5Yem55CG57O744GM5a2Y5Zyo44GZ44KL44Gf44KB44CB5by35Yi255qE44Gr5pyA5Yid44Gr44Kk44Oz44K544OI44O844Or44GZ44KL44CCXG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0Py5pbmNsdWRlcygncHl0aG9uICcpKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBpbnN0YWxsIHB5dGhvblwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy52ZXJzaW9uc1RleHQpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIGluc3RhbGxcImApO1xuICB9XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBpbnN0YWxsJyA6ICd5YXJuJztcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3J5ID0gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQgPyAnICYmIHJtIC1SZiAubmV4dCcgOiAnJztcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChgcnVuX2lmX2NoYW5nZWQgXCJwYWNrYWdlXFxcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBnZW5lcmF0ZVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBjb2RlZ2VuXCJgXG4gICAgKTtcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cblxuY29uc3QgcHJldHRpZXJDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnLCAnUHJldHRpZXInLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5jb25zdCBiaW9tZUNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdidW4nLCAnLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vYmlvbWUgY2hlY2sgLS1maXggLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tc2tpcC1lcnJvcnMnLCAnQmlvbWUnLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgKGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbiAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zR2VtZmlsZSAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc0dvTW9kICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWcuaXNCdW4gPyBiaW9tZUNvbnRlbnQgOiBwcmV0dGllckNvbnRlbnQpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMgfSBmcm9tICcuL2h1c2t5cmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmNvbnN0IG5ld1NldHRpbmdzID0ge1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAncHJlcGFyZS5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGNvbW1hbmRzOiB7XG4gICAgICBjbGVhbnVwOiB7XG4gICAgICAgIGdsb2I6ICcqLntjanMsY3NzLGN0cyxodG0saHRtbCxqcyxqc29uLGpzb241LGpzb25jLGpzeCxtZCxtanMsbXRzLHNjc3MsdHMsdHN4LHZ1ZSx5YW1sLHltbH0nLFxuICAgICAgICBydW46ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCB7c3RhZ2VkX2ZpbGVzfSAmJiBnaXQgYWRkIHtzdGFnZWRfZmlsZXN9JyxcbiAgICAgIH0sXG4gICAgICAnY2hlY2stbWlncmF0aW9ucyc6IHtcbiAgICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgICBydW46IGBcbmlmIGdyZXAgLXEgJ1dhcm5pbmdzOicge3N0YWdlZF9maWxlc307IHRoZW5cbiAgZWNobyBcIk1pZ3JhdGlvbiBTUUwgZmlsZXMgKHtzdGFnZWRfZmlsZXN9KSBjb250YWluIHdhcm5pbmdzISBQbGVhc2Ugc29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXCJcbiAgZXhpdCAxXG5maVxuYC50cmltKCksXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAnY2hlY2suc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcHJlUHVzaDogYGJ1biAtLWJ1biBub2RlX21vZHVsZXMvLmJpbi93YiB0eXBlY2hlY2tgLFxuICBwcmVQdXNoRm9yTGFiOiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuYnVuIC0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL3diIHR5cGVjaGVja1xuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGVmdGhvb2snKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLFxuICAgICAgeWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7XG4gICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcblxuICBjb25zdCB7IHR5cGVjaGVjayB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZyk7XG4gIGlmICh0eXBlY2hlY2spIHtcbiAgICBjb25zdCBwcmVQdXNoID0gY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSA/IHNjcmlwdHMucHJlUHVzaEZvckxhYiA6IHNjcmlwdHMucHJlUHVzaDtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgICBtb2RlOiAwbzc1NSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRTcmNEaXJzIH0gZnJvbSAnLi4vdXRpbHMvc3JjRGlyZWN0b3JpZXMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmNqcycpO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYWNrYWdlUHJlZml4ID0gY29uZmlnLmlzUm9vdCA/ICdub2RlIG5vZGVfbW9kdWxlcy8uYmluLycgOiAnbm9kZSAuLi8uLi9ub2RlX21vZHVsZXMvLmJpbi8nO1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgY29uc3QgZXNsaW50ID0gYFxuICAnJHtnZXRFc2xpbnRLZXkoY29uZmlnKX0nOiBbJHtKU09OLnN0cmluZ2lmeShcbiAgICBgJHtwYWNrYWdlUHJlZml4fWVzbGludCAtLWZpeCR7RXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyl9YFxuICApfSwgJyR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnXSxgO1xuICAgIGxpbmVzLnB1c2goZXNsaW50KTtcbiAgfVxuICBjb25zdCBwYWNrYWdlc0ZpbHRlciA9IGNvbmZpZy5pc1Jvb3QgPyBcIiAmJiAhZmlsZS5pbmNsdWRlcygnL3BhY2thZ2VzLycpXCIgOiAnJztcbiAgbGluZXMucHVzaChgXG4gICcuLyoqLyoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fSc6IGZpbGVzID0+IHtcbiAgICBsZXQgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKSR7cGFja2FnZXNGaWx0ZXJ9KTske2dldEVzbGludEZpbHRlckZvclByZXR0aWVyKGNvbmZpZyl9XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgY29tbWFuZHMgPSBbXFxgJHtwYWNrYWdlUHJlZml4fXByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSBcXCR7ZmlsdGVyZWRGaWxlcy5qb2luKCcgJyl9XFxgXTtcbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5zb21lKGZpbGUgPT4gZmlsZS5lbmRzV2l0aCgncGFja2FnZS5qc29uJykpKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKCcke3BhY2thZ2VQcmVmaXh9c29ydC1wYWNrYWdlLWpzb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1hbmRzO1xuICB9LFxuICAnLi8qKi9taWdyYXRpb24uc3FsJzogKGZpbGVzKSA9PiB7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04Jyk7XG4gICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoJ1dhcm5pbmdzOicpKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcXGAhISEgTWlncmF0aW9uIFNRTCBmaWxlIChcXCR7cGF0aC5yZWxhdGl2ZSgnJywgZmlsZSl9KSBjb250YWlucyB3YXJuaW5ncyAhISEgU29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXFxgLFxuICAgICAgXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufSxgKTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgIGxpbmVzLnB1c2goYFxuICAnLi97bGliLHRlc3QsdGVzdF9kcml2ZXJ9LyoqLyouZGFydCc6IGZpbGVzID0+IHtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gIWZpbGUuaW5jbHVkZXMoJ2dlbmVyYXRlZCcpKVxuICAgICAgLmZpbHRlcihmaWxlID0+ICFmaWxlLmVuZHNXaXRoKCcuZnJlZXplZC5kYXJ0JykgJiYgIWZpbGUuZW5kc1dpdGgoJy5nLmRhcnQnKSk7XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcXGBmbHV0dGVyIGZvcm1hdCBcXCR7ZmlsdGVyZWRGaWxlcy5qb2luKCcgJyl9XFxgXTtcbiAgfSxgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4vKiovKi5weSc6IFtcbiAgICAncG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMnLFxuICAgICdwb2V0cnkgcnVuIGJsYWNrJyxcbiAgICAncG9ldHJ5IHJ1biBmbGFrZTgnXG4gIF0sYCk7XG4gIH1cblxuICBjb25zdCBuZXdDb250ZW50ID0gYGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG4ke2NvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0ID8gXCJjb25zdCBtaWNyb21hdGNoID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xcblwiIDogJyd9XG5tb2R1bGUuZXhwb3J0cyA9IHske2xpbmVzLmpvaW4oJycpfVxufTtcbmA7XG5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG59XG5cbmZ1bmN0aW9uIGdldEVzbGludEtleShjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBkaXJzID0gZ2V0U3JjRGlycyhjb25maWcpO1xuICByZXR1cm4gYC4veyR7ZGlycy5qb2luKCcsJyl9fS8qKi8qLnske2V4dGVuc2lvbnMuZXNsaW50LmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0XG4gICAgPyBgXFxuXG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKSk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IG1pY3JvbWF0Y2gubm90KGZpbHRlcmVkRmlsZXMsICcke2dldEVzbGludEtleShjb25maWcpfScpO1xuICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZXNvbHZlKGZpbGUpKTtgXG4gICAgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBSZXBsYWNlIHRoZSBKU09OIG9iamVjdCBmcm9tIHRoZSBmaWxlXG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvPVxccyp7KFtcXFNcXHNdKil9Oy8sIChfLCBzZXR0aW5nc1RleHQpID0+IHtcbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCdlc2xpbnQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICdlc2xpbnQ6IHsgaWdub3JlRHVyaW5nQnVpbGRzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCd0eXBlc2NyaXB0OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gYD0geyR7c2V0dGluZ3NUZXh0fX07YDtcbiAgICB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IHVua25vd24gPSBjbG9uZURlZXAoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnk/LmluZGV4T2YoJzonKSArIDEpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLnJlYWRkaXJTeW5jKGAke2NvbmZpZy5kaXJQYXRofS8uZ2l0aHViL3dvcmtmbG93c2ApO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgYmFkZ2VOYW1lID0gZmlsZU5hbWU7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWVbMF0udG9VcHBlckNhc2UoKSArIGJhZGdlTmFtZS5zbGljZSgxLCBiYWRnZU5hbWUuaW5kZXhPZignLicpKTtcbiAgICAgIGJhZGdlTmFtZSA9IGJhZGdlTmFtZS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICAgIGNvbnN0IGJhZGdlID0gYFshWyR7YmFkZ2VOYW1lfV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0vYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0pYDtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC5naXRodWIvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBiYWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOaXouOBq2JhZGdl44GM44GC44KL5aC05ZCI44Gv5YmK6ZmkXG4gIHJlYWRtZSA9IHJlYWRtZS5yZXBsYWNlKGJhZGdlLCAnJykucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFkbWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVhZG1lW2kgLSAxXSA9PT0gJ1xcbicgJiYgcmVhZG1lW2ldID09PSAnXFxuJykge1xuICAgICAgY29uc3QgYmVmb3JlID0gcmVhZG1lLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgIGxldCBhZnRlciA9IHJlYWRtZS5zbGljZShpICsgMSk7XG4gICAgICBpZiAoIWFmdGVyLnN0YXJ0c1dpdGgoJ1snKSAmJiAhYWZ0ZXIuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIGFmdGVyID0gYFxcbiR7YWZ0ZXJ9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtiZWZvcmV9JHtiYWRnZX1cXG4ke2FmdGVyfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHtyZWFkbWV9XFxuJHtiYWRnZX1cXG5gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpO1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncz8ucGx1Z2lucyB8fCBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IEFycmF5LmlzQXJyYXkocGx1Z2luc1tpXSkgPyBwbHVnaW5zW2ldWzBdIDogcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChBcnJheS5pc0FycmF5KHBsdWdpbnNbaV0pICYmIHBsdWdpbnNbaV1bMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uNSddLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IHR5cGVvZiBqc29uT2JqICYgeyBwYWNrYWdlUnVsZXM6IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W10gfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChqc29uT2JqKSBhcyBTZXR0aW5ncztcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3Jlbm92YXRlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhgJHtmaWxlUGF0aH01YCkpIHtcbiAgICAgIC8vIFNpbmNlIGl0IGlzIGRpZmZpY3VsdCBmb3IgcGFyc2luZyByZW5vdmF0ZS5qc29uNSwgd2UgZG8gbm90aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbmV3U2V0dGluZ3MuZXh0ZW5kcy5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gJ0B3aWxsYm9vc3RlcicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW10gfSkgPT5cbiAgICAgICAgICBydWxlLm1hdGNoUGFja2FnZU5hbWVzLmluY2x1ZGVzKCduZXh0JylcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5wdXNoKHsgbWF0Y2hQYWNrYWdlTmFtZXM6IFsnbmV4dCddLCBlbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRlcGVuZGFib3QnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZW5vdmF0ZXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBtb3ZlVG9Cb3R0b208VE9iaiBleHRlbmRzIFJlY29yZDxUS2V5LCB1bmtub3duPiwgVEtleSBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4oXG4gIG9iajogVE9iaixcbiAga2V5OiBUS2V5XG4pOiBUT2JqIHtcbiAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS5zb3J0KChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Yga2V5QW5kVmFsdWVzKSB7XG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIC8vIGlmIHZhbHVlIGlzIGFuIG9iamVjdCwgc29ydCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHNvcnRLZXlzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcbmltcG9ydCB0eXBlIHsgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHJvb3RKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICB0YXJnZXQ6ICdFUzIwMjInLCAvLyBiZWNhdXNlIGRlY29yYXRvcnMgc2hvdWxkIGJlIHRyYW5zcGlsZWQgdG8gRVMyMDIyIG9uIE5vZGUuanNcbiAgICBtb2R1bGU6ICdFU05leHQnLFxuICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlJyxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgc2tpcExpYkNoZWNrOiB0cnVlLCAvLyBiZWNhdXNlIGxpYnJhcmllcyBtYXkgaGF2ZSBicm9rZW4gdHlwZXNcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICAgIHR5cGVSb290czogWycuL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgaW5jbHVkZTogW1xuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3RzLyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgdGFyZ2V0OiAnRVMyMDIyJywgLy8gYmVjYXVzZSBkZWNvcmF0b3JzIHNob3VsZCBiZSB0cmFuc3BpbGVkIHRvIEVTMjAyMiBvbiBOb2RlLmpzXG4gICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZScsXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgICB0eXBlUm9vdHM6IFsnLi4vLi4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuLi8uLi9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgaW5jbHVkZTogWydzcmMvKiovKicsICd0ZXN0cy8qKi8qJywgJ3NjcmlwdHMvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHJldHVybjtcblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChjb25maWcuaXNSb290ID8gcm9vdEpzb25PYmogOiBzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgbW9kdWxlOiAnTm9kZU5leHQnLFxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZU5leHQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBpZiAob2xkU2V0dGluZ3MuZXh0ZW5kcyA9PT0gJy4vbm9kZV9tb2R1bGVzL0B3aWxsYm9vc3Rlci90c2NvbmZpZy90c2NvbmZpZy5qc29uJykge1xuICAgICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IG1vZGlmeSBcInRhcmdldFwiLCBcIm1vZHVsZVwiIGFuZCBcIm1vZHVsZVJlc29sdXRpb25cIi5cbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnRhcmdldDtcbiAgICAgIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5tb2R1bGU7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZVJlc29sdXRpb247XG4gICAgICB9XG4gICAgICBpZiAob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgfVxuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fJylcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpO1xuICAgICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzID8/IHt9KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU6IHN0cmluZztcbiAgb246IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBqb2JzOiB7IFtrZXk6IHN0cmluZ106IEpvYiB9O1xufVxuXG5pbnRlcmZhY2UgQ29uY3VycmVuY3kge1xuICBncm91cDogc3RyaW5nO1xuICAnY2FuY2VsLWluLXByb2dyZXNzJzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgaXNzdWVzPzogVHlwZXM7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0O1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXM7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgdXNlczogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddLFxuICAgICAgfSxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICAgICdwYXRocy1pZ25vcmUnOiBbJyoqLm1kJywgJyoqL2RvY3MvKionXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICB3YmZ5OiB7XG4gICAgbmFtZTogJ1dpbGxib29zdGVyaWZ5JyxcbiAgICBvbjoge1xuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB3YmZ5OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvd2JmeS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICd3YmZ5LW1lcmdlJzoge1xuICAgIG5hbWU6ICdNZXJnZSB3YmZ5JyxcbiAgICBvbjoge1xuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnd2JmeS1tZXJnZSc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy93YmZ5LW1lcmdlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ25vdGlmeS1yZWFkeSc6IHtcbiAgICBuYW1lOiAnTm90aWZ5IHJlYWR5JyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnbm90aWZ5LXJlYWR5Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL25vdGlmeS1yZWFkeS55bWxAbWFpbicsXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBESVNDT1JEX1dFQkhPT0tfVVJMOiAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVBRFkgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICBuYW1lOiAnQWRkIGNsb3NlIGNvbW1lbnQnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvY2xvc2UtY29tbWVudC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdhZGQtaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICBuYW1lOiAnQWRkIGlzc3VlIHRvIEdpdEh1YiBwcm9qZWN0JyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnYWRkLWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvYWRkLWlzc3VlLXRvLXByb2plY3QueW1sQG1haW4nLFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0hfUFJPSkVDVF9VUkw6ICcke3sgc2VjcmV0cy5HSF9QUk9KRUNUX1VSTCB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICBuYW1lOiAnQWRkIHJlYWR5IGlzc3VlIHRvIEdpdEh1YiBwcm9qZWN0JyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvYWRkLWlzc3VlLXRvLXByb2plY3QueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgbGFiZWxlZDogJ3JlYWR5IDpyb2NrZXQ6JyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIEdIX1BST0pFQ1RfVVJMOiAnaHR0cHM6Ly9naXRodWIuY29tL29yZ3MvV2lsbEJvb3N0ZXJMYWIvcHJvamVjdHMvNScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICd3YmZ5LnltbCcsXG4gICAgICAnd2JmeS1tZXJnZS55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgJ2FkZC1pc3N1ZS10by1wcm9qZWN0LnltbCcsXG4gICAgICAuLi5lbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKSxcbiAgICBdKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ3JlbGVhc2UueW1sJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmlzUHVibGljUmVwbyB8fCByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdC55bWwnKTtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgnbm90aWZ5LXJlYWR5LnltbCcpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2FkZC1mb2N1c2VkLWlzc3VlLXRvLXByb2plY3QueW1sJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChjb25maWc6IFBhY2thZ2VDb25maWcsIHdvcmtmbG93c1BhdGg6IHN0cmluZywga2luZDogS25vd25LaW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcCh3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA/PyB7fSkgYXMgV29ya2Zsb3c7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGAke2tpbmR9LnltbGApO1xuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBpZiAobmV3U2V0dGluZ3Muam9icykge1xuICAgICAgbW92ZVRvQm90dG9tKG5ld1NldHRpbmdzLCAnam9icycpO1xuICAgIH1cbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0PHN0cmluZz4oWy4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSksICcqKi5tZCcsICcqKi9kb2NzLyoqJ10pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcz8uKCcvcmV1c2FibGUtd29ya2Zsb3dzLycpKSByZXR1cm47XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICB9XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5Jzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uKSBzZXRTY2hlZHVsZShuZXdTZXR0aW5ncywgMjAsIDI0KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5LW1lcmdlJzoge1xuICAgICAgc2V0U2NoZWR1bGUobmV3U2V0dGluZ3MsIDEsIDQpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3MpO1xuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzZW1hbnRpYy1yZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jIHx8ICFuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKCFwYXJhbXMpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoIHx8PSB7fTtcbiAgam9iLnNlY3JldHMgfHw9IHt9O1xuXG4gIGlmIChcbiAgICBraW5kID09PSAndGVzdCcgfHxcbiAgICBraW5kID09PSAncmVsZWFzZScgfHxcbiAgICBraW5kID09PSAnd2JmeScgfHxcbiAgICBraW5kID09PSAnd2JmeS1tZXJnZScgfHxcbiAgICBraW5kID09PSAnYWRkLWlzc3VlLXRvLXByb2plY3QnIHx8XG4gICAga2luZCA9PT0gJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0J1xuICApIHtcbiAgICBqb2Iuc2VjcmV0c1snR0hfVE9LRU4nXSA9IGNvbmZpZy5pc1B1YmxpY1JlcG8gPyAnJHt7IHNlY3JldHMuUFVCTElDX0dIX0JPVF9QQVQgfX0nIDogJyR7eyBzZWNyZXRzLkdIX0JPVF9QQVQgfX0nO1xuICB9XG4gIGlmIChjb25maWcucmVsZWFzZS5ucG0gJiYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kID09PSAndGVzdCcpKSB7XG4gICAgam9iLnNlY3JldHNbJ05QTV9UT0tFTiddID0gJyR7eyBzZWNyZXRzLk5QTV9UT0tFTiB9fSc7XG4gIH1cbiAgaWYgKGpvYi5zZWNyZXRzWydGSVJFQkFTRV9UT0tFTiddKSB7XG4gICAgam9iLnNlY3JldHNbJ0dDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UnXSA9ICcke3sgc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIH19JztcbiAgICBkZWxldGUgam9iLnNlY3JldHNbJ0ZJUkVCQVNFX1RPS0VOJ107XG4gIH1cbiAgaWYgKFxuICAgIChqb2Iuc2VjcmV0c1snRElTQ09SRF9XRUJIT09LX1VSTCddICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkpIHx8XG4gICAgKGpvYi53aXRoLnNlcnZlcl91cmwgJiYga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSlcbiAgKSB7XG4gICAgam9iLnNlY3JldHNbJ0RJU0NPUkRfV0VCSE9PS19VUkwnXSA9ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUxFQVNFIH19JztcbiAgfVxuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBqb2Iud2l0aD8uc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IHBhcmFtcy50b1N0cmluZygpLnJlcGxhY2UoJ3N5bmMgJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcy5yZXBsYWNlKCdXaWxsQm9vc3RlckxhYi8nLCAnV2lsbEJvb3N0ZXIvJyk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXMucmVwbGFjZSgnV2lsbEJvb3N0ZXIvJywgJ1dpbGxCb29zdGVyTGFiLycpO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHJlZHVuZGFudCBwYXJhbWV0ZXJzXG4gIGlmIChqb2Iud2l0aFsnZG90X2Vudl9wYXRoJ10gPT09ICcuZW52Jykge1xuICAgIGRlbGV0ZSBqb2Iud2l0aFsnZG90X2Vudl9wYXRoJ107XG4gIH1cbiAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgcGFyYW1ldGVyc1xuICBtaWdyYXRlSm9iKGpvYik7XG5cbiAgLy8gRG9uJ3QgdXNlIGBmbHkgZGVwbG95IC0tanNvbmAgc2luY2UgaXQgY2F1c2VzIGFuIGVycm9yXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmIGpvYi5zZWNyZXRzWydGTFlfQVBJX1RPS0VOJ10gJiYgam9iLndpdGhbJ2RlcGxveV9jb21tYW5kJ10pIHtcbiAgICBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXSA9IGpvYi53aXRoWydkZXBsb3lfY29tbWFuZCddLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzKy0tanNvbi8sICcnKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc0RvY2tlcmZpbGUpIHtcbiAgICBpZiAoam9iLndpdGhbJ2NpX3NpemUnXSAhPT0gJ2V4dHJhLWxhcmdlJyAmJiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSB8fCBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSkpIHtcbiAgICAgIGpvYi53aXRoWydjaV9zaXplJ10gPSAnbGFyZ2UnO1xuICAgIH1cbiAgICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgICAgam9iLndpdGhbJ2NwdV9hcmNoJ10gPSAnWDY0JztcbiAgICB9XG4gIH1cbiAgLy8gQmVjYXVzZSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5wcml2YXRlIGlzIGFsd2F5cyB0cnVlIGlmIGpvYiBpcyBzY2hlZHVsZWRcbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kID09PSAndGVzdCcgfHwga2luZCA9PT0gJ3diZnknIHx8IGtpbmQgPT09ICd3YmZ5LW1lcmdlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIGpvYi53aXRoWydnaXRodWJfaG9zdGVkX3J1bm5lciddID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoWydnaXRodWJfaG9zdGVkX3J1bm5lciddO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoam9iLnNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAvLyBNb3ZlIHNlY3JldHMgcHJvcCBhZnRlciB3aXRoIHByb3BcbiAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoam9iLnNlY3JldHMpO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldFNjaGVkdWxlKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgaW5jbHVzaXZlTWluSG91ckpzdDogbnVtYmVyLCBleGNsdXNpdmVNYXhIb3VySnN0OiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgW21pbnV0ZVV0YywgaG91clV0Y10gPSAoKG5ld1NldHRpbmdzLm9uLnNjaGVkdWxlPy5bMF0/LmNyb24gYXMgc3RyaW5nKSA/PyAnJykuc3BsaXQoJyAnKS5tYXAoTnVtYmVyKTtcbiAgaWYgKG1pbnV0ZVV0YyAhPT0gMCAmJiBOdW1iZXIuaXNJbnRlZ2VyKGhvdXJVdGMpKSB7XG4gICAgY29uc3QgaG91ckpzdCA9IChob3VyVXRjICsgOSkgJSAyNDtcbiAgICBjb25zdCBpblJhbmdlID1cbiAgICAgIGluY2x1c2l2ZU1pbkhvdXJKc3QgPCBleGNsdXNpdmVNYXhIb3VySnN0XG4gICAgICAgID8gaW5jbHVzaXZlTWluSG91ckpzdCA8PSBob3VySnN0ICYmIGhvdXJKc3QgPCBleGNsdXNpdmVNYXhIb3VySnN0XG4gICAgICAgIDogaW5jbHVzaXZlTWluSG91ckpzdCA8PSBob3VySnN0IHx8IGhvdXJKc3QgPCBleGNsdXNpdmVNYXhIb3VySnN0O1xuICAgIGlmIChpblJhbmdlKSByZXR1cm47XG4gIH1cblxuICBjb25zdCBtaW5Kc3QgPSAxICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNTkpO1xuICBjb25zdCBob3VySnN0ID0gaW5jbHVzaXZlTWluSG91ckpzdCArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChleGNsdXNpdmVNYXhIb3VySnN0IC0gaW5jbHVzaXZlTWluSG91ckpzdCkpO1xuICBjb25zdCBjcm9uID0gYCR7bWluSnN0fSAkeyhob3VySnN0IC0gOSArIDI0KSAlIDI0fSAqICogKmA7XG4gIG5ld1NldHRpbmdzLm9uLnNjaGVkdWxlID0gW3sgY3JvbiB9XTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcChuZXdTZXR0aW5ncywge1xuICAgIGxpbmVXaWR0aDogLTEsXG4gICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgIHN0eWxlczoge1xuICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgfSxcbiAgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3M6IFdvcmtmbG93KTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnNbJ2FkZC10by1wcm9qZWN0J107XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGVKb2Ioam9iOiBKb2IpOiB2b2lkIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZW0gYWZ0ZXIgMjAyMy0wMy0zMVxuICBpZiAoIWpvYi53aXRoKSByZXR1cm47XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbm9uX3NlbGZfaG9zdGVkJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbm90aWZ5X2Rpc2NvcmQnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydyZXF1aXJlX2ZseSddO1xuICBkZWxldGUgam9iLndpdGhbJ3JlcXVpcmVfZ2Nsb3VkJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnY3B1X2FyY2gnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydsYWJlbCddO1xuICBkZWxldGUgam9iLndpdGhbJ2xhYmVsT3BlcmF0b3InXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvblZhbHVlTWFwIH0gZnJvbSAnQHlhcm5wa2cvY29yZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbnRlcmZhY2UgU2V0dGluZ3MgZXh0ZW5kcyBQYXJ0aWFsPENvbmZpZ3VyYXRpb25WYWx1ZU1hcD4ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luIHtcbiAgY2hlY2tzdW06IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzcGVjOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVlhcm5yY1ltbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVlhcm5yY1ltbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB5YXJucmNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYy55bWwnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGdldE1ham9yTnVtYmVyKGN1cnJlbnRWZXJzaW9uKSA8PSBnZXRNYWpvck51bWJlcihsYXRlc3RWZXJzaW9uKSAmJiBjdXJyZW50VmVyc2lvbiAhPT0gbGF0ZXN0VmVyc2lvbikge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0geWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzO1xuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgZGVsZXRlIHNldHRpbmdzLmNvbXByZXNzaW9uTGV2ZWw7XG4gICAgaWYgKHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM7XG4gICAgfVxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20veWFybnBrZy9iZXJyeS9wdWxsLzQ2OThcbiAgICBzZXR0aW5ncy5lbmFibGVHbG9iYWxDYWNoZSA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSBzZXR0aW5ncy5wbHVnaW5zPy5sZW5ndGggPz8gMDtcbiAgICBzZXR0aW5ncy5wbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucz8uZmlsdGVyKChwKSA9PiBwLnBhdGggIT09ICcueWFybi9wbHVnaW5zL3VuZGVmaW5lZC5janMnKSA/PyBbXTtcbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggIT09IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBjb25zdCBwbHVnaW5QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycsICd1bmRlZmluZWQuY2pzJyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGx1Z2luUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLnBsdWdpbnM7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh5YXJucmNZbWxQYXRoLCB5YW1sLmR1bXAoc2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KSk7XG5cbiAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICd5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdmVyc2lvbnNKc29uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9ucycsICctLWpzb24nXSwgZGlyUGF0aCk7XG4gIGNvbnN0IHZlcnNpb25zID0gSlNPTi5wYXJzZSh2ZXJzaW9uc0pzb24pIGFzIHN0cmluZ1tdO1xuICByZXR1cm4gdmVyc2lvbnMuYXQoLTEpIGFzIHN0cmluZztcbn1cbmZ1bmN0aW9uIGdldE1ham9yTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IFttYWpvcl0gPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiBOdW1iZXIobWFqb3IpO1xufVxuIiwiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4sIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4pIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvcik/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCBzb2RpdW0gZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4sIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgZGVwcmVjYXRlZFNlY3JldE5hbWVzID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJ107XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4gfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoKS5wYXJzZWQgfHwge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIGRlcHJlY2F0ZWRTZWNyZXROYW1lcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvICYmIG5hbWUgPT09ICdQVUJMSUNfR0hfQk9UX1BBVCcpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgIH0sXG4gICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuIO+8iOOBk+OBruODmuODvOOCuOOBpyBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIOOBjOihqOekuuOBleOCjOOBpuOBhOOCi+OBk+OBqOOCkueiuuiqjeOBl+OBn+OAgu+8iVxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gICAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBBbGwgdGVzdHMgYXJlIHBhc3NlZC5cbiAgICAtIFRlc3QgY29tbWFuZCAoZS5nLiwgXFxgeWFybiB0ZXN0XFxgKSBpcyBwYXNzZWQuXG4gICAgLSBMaW50IGNvbW1hbmQgKGUuZy4sIFxcYHlhcm4gbGludFxcYCkgaXMgcGFzc2VkLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIEdpdEh1YiBQUidzIGRpZmYgdmlldy4g77yIR2l0SHVi5LiK44Gn6Ieq5YiG44Gu5aSJ5pu05YaF5a6544KS56K66KqN44GX44Gf44CC77yJXG4tIFsgXSBJJ3ZlIHdyaXR0ZW4gdGhlIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLiDvvIjjg4bjgrnjg4jmiYvpoIbjgpLoqJjovInjgZfjgZ/jgILvvIlcbi0gWyBdIEkndmUgYWRkZWQgc2NyZWVuc2hvdHMuIO+8iFVJ44KS5aSJ5pu044GX44Gf5aC05ZCI44CB44K544Kv44Oq44O844Oz44K344On44OD44OI44KS6L+95Yqg44GX44Gf44CC77yJXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5cbjwhLS0g5pel5pys6Kqe44Gn6KiY6L+w44GX44Gm44KC5aSn5LiI5aSr44Gn44GZ44CCIC0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBuZXdDb250ZW50KSA+IG5ld0NvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYmJ5U3luYyB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdpdEh1YlV0aWwsIG9jdG9raXQgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgaXNCdW46IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1N1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1BhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1B1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcblxuICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGVzbGludEJhc2U/OiBFc2xpbnRFeHRlbnNpb25CYXNlO1xuICB2ZXJzaW9uc1RleHQ/OiBzdHJpbmc7XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VDb25maWcoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdENvbmZpZz86IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluc1BhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgfHwgW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSB8fCBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgdmVyc2lvbnNUZXh0ID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpO1xuICAgICAgdmVyc2lvbnNUZXh0ICs9IGNvbnRlbnQudHJpbSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcmVmaXgsIG5hbWVdIG9mIFtcbiAgICAgIFsnamF2YScsICdqYXZhJ10sXG4gICAgICBbJ25vZGUnLCAnbm9kZWpzJ10sXG4gICAgICBbJ3B5dGhvbicsICdweXRob24nXSxcbiAgICBdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBub2RlVmVyc2lvbkNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKHZlcnNpb25zVGV4dCkge1xuICAgICAgICAgIHZlcnNpb25zVGV4dCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB2ZXJzaW9uc1RleHQgKz0gbmFtZSArICcgJyArIG5vZGVWZXJzaW9uQ29udGVudC50cmltKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnk6IHJlcG9JbmZvPy5mdWxsX25hbWUgPyBgZ2l0aHViOiR7cmVwb0luZm8/LmZ1bGxfbmFtZX1gIDogdW5kZWZpbmVkLFxuICAgICAgaXNCdW46IHJvb3RDb25maWc/LmlzQnVuIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdidW5maWcudG9tbCcpKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBwYWNrYWdlSnNvblBhdGguaW5jbHVkZXMoYCR7cGF0aC5zZXB9d2lsbGJvb3N0ZXItY29uZmlnc2ApLFxuICAgICAgZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbnNEb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluc0dlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5zR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpbnNQYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluc1BvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluc1BvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNQdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluc1RlbXBsYXRlWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3RlbXBsYXRlLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNWc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbnNKc3hPclRzeDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3RzfS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueShcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsXG4gICAgICAgIGRpclBhdGhcbiAgICAgICksXG4gICAgICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICBkaXJQYXRoXG4gICAgICApLFxuICAgICAgZG9lc0NvbnRhaW5zSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHN9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llc1snYmxpdHonXSxcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXNbJ25leHQnXSxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1sncGxheXdyaWdodCddLFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydwcmlzbWEnXSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXNbJ3B5cmlnaHQnXSxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiAhIShcbiAgICAgICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVsZWFzZVBsdWdpbnMubGVuZ3RoID4gMFxuICAgICAgICApLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHdiOiAhIWRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddLFxuICAgICAgfSxcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgYnJhbmNoZXM6IHJlbGVhc2VCcmFuY2hlcyxcbiAgICAgICAgZ2l0aHViOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyksXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpLFxuICAgICAgfSxcbiAgICAgIHZlcnNpb25zVGV4dCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgd2JmeUpzb24sXG4gICAgfTtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgY29uZmlnLmVzbGludEJhc2UgPSBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1RlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2xvYmJ5U3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoIH0pLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCB0eXBlIEVzbGludEV4dGVuc2lvbkJhc2UgPVxuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctYmxpdHotbmV4dCc7XG5cbmZ1bmN0aW9uIGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRXNsaW50RXh0ZW5zaW9uQmFzZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JztcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeCA/ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcgOiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnO1xuICB9IGVsc2Uge1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3gpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoZGlyUGF0aCk7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgY29uc3QgcmVtb3RlVXJsID0gb3JpZ2luPy5yZWZzPy5mZXRjaCA/PyBvcmlnaW4/LnJlZnM/LnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJldCA9IHsgZnVsbF9uYW1lOiBgJHtvcmd9LyR7bmFtZX1gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHJldCwgcmVzcG9uc2UuZGF0YSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeERvY2tlcmZpbGUgfSBmcm9tICcuL2ZpeGVycy9kb2NrZXJmaWxlLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFByaXNtYUVudkZpbGVzIH0gZnJvbSAnLi9maXhlcnMvcHJpc21hLmpzJztcbmltcG9ydCB7IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2ZpeGVycy90ZXN0RGlyZWN0b3J5LmpzJztcbmltcG9ydCB7IGZpeFR5cGVEZWZpbml0aW9ucyB9IGZyb20gJy4vZml4ZXJzL3R5cGVEZWZpbml0aW9uLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUb29sVmVyc2lvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYXNkZi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJpb21lSnNvbmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYmlvbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRXNsaW50aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VzbGludGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVzbGludHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VzbGludHJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2h1c2t5cmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9uZXh0Y29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcGFja2FnZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3B5cmlnaHRjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVhZG1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVsZWFzZXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlbGVhc2VyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbm92YXRlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlWWFybnJjWW1sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3lhcm5yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwU2VjcmV0cyB9IGZyb20gJy4vZ2l0aHViL3NlY3JldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpIGFzIFBhY2thZ2VDb25maWdbXTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluc3RhbGwgdG9vbHMgdmlhIGFzZGYgYXQgZmlyc3RcbiAgICBhd2FpdCBnZW5lcmF0ZVRvb2xWZXJzaW9ucyhyb290Q29uZmlnKTtcbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhEb2NrZXJmaWxlKHJvb3RDb25maWcpLFxuICAgICAgZml4UHJpc21hRW52RmlsZXMocm9vdENvbmZpZyksXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICAuLi4ocm9vdENvbmZpZy5pc0J1blxuICAgICAgICA/IFtcbiAgICAgICAgICAgIGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnKSxcbiAgICAgICAgICAgIGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZykudGhlbigoKSA9PiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSksXG4gICAgICAgICAgXVxuICAgICAgICA6IFtnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpXSksXG4gICAgICBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbiAmJiBjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgICAgICkge1xuICAgICAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVFc2xpbnRyYyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlRXNsaW50aWdub3JlKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gICAgLy8gJ3lhcm4gaW5zdGFsbCcgc2hvdWxkIGJlIGFmdGVyIGB5YXJuIGNsZWFudXBgIGJlY2F1c2UgeWFybiBiZXJyeSBnZW5lcmF0ZXMgeWFybi5sb2NrXG4gICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgY29udGVudHMgb2YgZGVwZW5kYW50IHN1Yi1wYWNrYWdlIGluIG1vbm9yZXBvXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWyd1cGRhdGUnXSwgcm9vdERpclBhdGgpO1xuICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBhZnRlciB0aGVyZSBpcyBubyBidW4ubG9ja2JcbiAgICAgIGNvbnN0IGJ1bkxvY2tiUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ2J1bi5sb2NrYicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYnVuTG9ja2JQYXRoKSkge1xuICAgICAgICB2b2lkIGZzLnByb21pc2VzLnJtKGJ1bkxvY2tiUGF0aCk7XG4gICAgICAgIHNwYXduU3luYyhcbiAgICAgICAgICBwYWNrYWdlTWFuYWdlcixcbiAgICAgICAgICBbJ2luc3RhbGwnLCAnLS1zYXZlLXRleHQtbG9ja2ZpbGUnLCAnLS1mcm96ZW4tbG9ja2ZpbGUnLCAnLS1sb2NrZmlsZS1vbmx5J10sXG4gICAgICAgICAgcm9vdERpclBhdGhcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsib3B0aW9ucyIsImNvbnN0cnVjdG9yIiwidGhpcyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJlcnJvciIsIkVycm9yIiwic3RhY2siLCJhc3luYyIsImZpeERvY2tlcmZpbGUiLCJjb25maWciLCJkb2VzQ29udGFpbnNEb2NrZXJmaWxlIiwib2xkQ29udGVudCIsImRvY2tlcmZpbGUiLCJuZXdDb250ZW50IiwiZnMiLCJ3cml0ZUZpbGUiLCJwYXRoIiwiam9pbiIsImRpclBhdGgiLCJmaXhQbGF5d3JpZ2h0Q29uZmlnIiwiZmlsZVBhdGgiLCJleGlzdHNTeW5jIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsInJlcGxhY2UiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZ2xvYmJ5IiwiZG90IiwiY3dkIiwiZW52RmlsZSIsImVudkZpbGVQYXRoIiwicmVzb2x2ZSIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwib2xkVGVzdERpclBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm5ld1Rlc3REaXJQYXRoIiwicmVuYW1lIiwicmVwbGFjZUFsbCIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zIiwidW5kZWZpbmVkIiwiZGlyZW50cyIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJkaXJlbnQiLCJkaXJOYW1lIiwic2xpY2UiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaW5jbHVkZXMiLCJoYXNMaWJyYXJ5Iiwic29tZSIsInBhY2thZ2VKc29uIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiaXNGaWxlIiwibWtkaXIiLCJydW4iLCJyZWN1cnNpdmUiLCJpc0RpcmVjdG9yeSIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZzcCIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsImdpdGlnbm9yZSIsImxlbmd0aCIsIm1kRmlsZSIsImZpeEFiYnJldmlhdGlvbnNJblRleHQiLCJyZXBsYWNlV2l0aENvbmZpZyIsInRzRmlsZXMiLCJ0c0ZpbGUiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIk9iamVjdCIsImVudHJpZXMiLCJ3YmZ5SnNvbiIsInR5cG9zIiwidG9rZW4iLCJwcm9jZXNzIiwiZW52IiwiR0hfQk9UX1BBVCIsIlBVQkxJQ19HSF9CT1RfUEFUIiwiR0hfVE9LRU4iLCJHSVRIVUJfVE9LRU4iLCJoYXNHaXRIdWJUb2tlbiIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsInNwbGl0IiwiYXQiLCJuYW1lcyIsInNwYXduU3luYyIsImNvbW1hbmQiLCJhcmdzIiwicmV0cnkiLCJuZXdDbWQiLCJuZXdBcmdzIiwiZ2V0U3Bhd25TeW5jQXJncyIsImNoaWxkX3Byb2Nlc3MiLCJzdGF0dXMiLCJzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0Iiwic3RkaW8iLCJwcm9jIiwic3RkZXJyIiwidG9TdHJpbmciLCJ0cmltIiwicyIsInN0ZG91dCIsIlBBVEgiLCJCRVJSWV9CSU5fRk9MREVSIiwiQVNERl9ESVIiLCJzaGVsbCIsImNvbnZlcnRWZXJzaW9uSW50b051bWJlciIsInZlcnNpb24iLCJudW1iZXJzIiwiTnVtYmVyIiwiZmlsdGVyIiwibnVtIiwiaXNOYU4iLCJ2ZXJzaW9uTnVtYmVyIiwiZGl2aXNvciIsIlBZVEhPTl9WRVJTSU9OIiwiSkFWQV9WRVJTSU9OIiwiQkxJVFpfVkVSU0lPTiIsIk5FWFRfVkVSU0lPTiIsImdlbmVyYXRlVG9vbFZlcnNpb25zIiwidmVyc2lvbnNUZXh0IiwiZHVwbGljYXRhYmxlTGluZXMiLCJsaW5lIiwiQ09SRV9UT09MUyIsImhhcyIsInNvcnQiLCJzdGFydHNXaXRoIiwibGluZXMiLCJTZXQiLCJkb2VzQ29udGFpbnNQb2V0cnlMb2NrIiwicmVzcG9uc2UiLCJmZXRjaCIsImpzb24iLCJwb2V0cnlWZXJzaW9uIiwidXBkYXRlVmVyc2lvbiIsImRlcGVuZGluZyIsImZpcmViYXNlIiwiZG9lc0NvbnRhaW5zUGFja2FnZUpzb24iLCJpc0J1biIsImJ1blZlcnNpb24iLCJvcmdhbml6YXRpb24iLCJyZXBvc2l0b3J5IiwicmVxdWVzdCIsIm93bmVyIiwicmVwbyIsImRhdGEiLCJ0YWdfbmFtZSIsImluZGV4IiwibGFzdEluZGV4T2YiLCJ2ZXJzaW9uTnVtYmVyVGV4dCIsInRlc3QiLCJnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViIiwicHJlZml4IiwiREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTIiwidmVyc2lvblBhdGgiLCJybSIsImZvcmNlIiwidG9vbFZlcnNpb25zUGF0aCIsImNvcmUiLCJ0b29sTmFtZSIsIm5ld1ZlcnNpb24iLCJoZWFkIiwiZmluZEluZGV4IiwibCIsIm5ld0xpbmUiLCJzcGxpY2UiLCJvdmVyd3JpdGVNZXJnZSIsImRlc3RpbmF0aW9uQXJyYXkiLCJzb3VyY2VBcnJheSIsImNvbWJpbmVNZXJnZSIsInRhcmdldCIsInNvdXJjZSIsImRlc3RpbmF0aW9uIiwiaXRlbSIsImNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkIiwiaXNNZXJnZWFibGVPYmplY3QiLCJtZXJnZSIsInB1c2giLCJqc29uT2JqIiwiJHNjaGVtYSIsImV4dGVuZHMiLCJnZW5lcmF0ZUJpb21lSnNvbmMiLCJuZXdTZXR0aW5ncyIsImNsb25lRGVlcCIsIm9sZFNldHRpbmdzIiwiSlNPTiIsInBhcnNlIiwiYXJyYXlNZXJnZSIsInN0cmluZ2lmeSIsImdlbmVyYXRlQnVuZmlnVG9tbCIsInVzZXJDb250ZW50SGVhZGVyIiwidXNlckNvbnRlbnRIZWFkZXJSZWdleCIsInNlcGFyYXRvciIsImRlZmF1bHRIZWFkVXNlckNvbnRlbnQiLCJkZWZhdWx0VGFpbFVzZXJDb250ZW50IiwiaWdub3JlRmlsZVV0aWwiLCJzZXBhcmF0b3JQcmVmaXgiLCJyZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMiLCJsYXN0SGVhZGVySW5kZXgiLCJnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyIiwiZ2V0SGVhZFVzZXJDb250ZW50IiwiaW5kZXhPZiIsImdldFRhaWxVc2VyQ29udGVudCIsImlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQiLCJsYXN0SW5kZXgiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsImNvZGVXaXRoOEluZGVudFNpemUiLCJtYXJrZG93bkxpa2UiLCJlc2xpbnQiLCJwcmV0dGllciIsImJpb21lIiwiZ2VuZXJhdGVFeHRlbnNpb25zIiwiZ2VuZXJhdGVFZGl0b3Jjb25maWciLCJnZW5lcmF0ZUVzbGludGlnbm9yZSIsImhlYWRVc2VyQ29udGVudCIsInRhaWxVc2VyQ29udGVudCIsImdpdGlnbm9yZUZpbGVQYXRoIiwiZ2VuZXJhdGVFc2xpbnRyYyIsInJvb3RDb25maWciLCJiYXNlcyIsImVzbGludEJhc2UiLCJyb290IiwiZXh0IiwibmV3RXh0ZW5kcyIsImJsaXR6IiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJkb2VzQ29udGFpbnNHZW1maWxlIiwiZG9lc0NvbnRhaW5zR29Nb2QiLCJiYXNlbmFtZSIsImRvZXNDb250YWluc1BvbVhtbCIsImRvZXNDb250YWluc1B1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sIiwibmV4dCIsInByaXNtYSIsInBsYXl3cmlnaHRUZXN0IiwicmVhY3ROYXRpdmUiLCJzdG9yeWJvb2siLCJsaXRlc3RyZWFtIiwiZ2VuZXJhdGVkIiwicmVhZENhY2hlIiwidXJsIiwicmVzcG9uc2VUZXh0IiwidGV4dCIsIm9rIiwid3JpdGVDYWNoZSIsIm9zIiwiaG9tZWRpciIsInN0YXQiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsImdldExhdGVzdENvbW1pdEhhc2giLCJjb21taXRzIiwicGVyX3BhZ2UiLCJzaGEiLCJFc2xpbnRVdGlsIiwiZ2V0TGludEZpeFN1ZmZpeCIsImRvZXNDb250YWluc0pzeE9yVHN4Iiwic3JjRGlyZWN0b3JpZXMiLCJub2RlIiwiZ2V0U3JjRGlycyIsImpzQ29tbW9uRGVwcyIsInRzQ29tbW9uRGVwcyIsInJlYWN0Q29tbW9uRGVwcyIsImVzbGludERlcHMiLCJnZW5lcmF0ZVBhY2thZ2VKc29uIiwic2tpcEFkZGluZ0RlcHMiLCJqc29uVGV4dCIsInNjcmlwdHMiLCJwZWVyRGVwZW5kZW5jaWVzIiwiYXV0aG9yIiwiaXNXaWxsQm9vc3RlckNvbmZpZ3MiLCJkZXBzIiwidmFsdWVzIiwiZGVwIiwicmVtb3ZlRGVwcmVjYXRlZFN0dWZmIiwia2V5IiwidmFsdWUiLCJnZW5lcmF0ZVNjcmlwdHMiLCJwcmV0dGlmeSIsImV4aXN0aW5nQ29udGVudCIsIm9yaWdpbmFsQ29udGVudCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJwb2V0cnlEZXZEZXBlbmRlbmNpZXMiLCJwcmVwYXJlIiwicG9zdGluc3RhbGwiLCJpc1B1YmxpY1JlcG8iLCJpc1JlZmVycmVkQnlPdGhlclJlcG8iLCJwcmVwYWNrIiwicG9zdHBhY2siLCJzZW1hbnRpY1JlbGVhc2UiLCJ3b3Jrc3BhY2VzIiwiQXJyYXkiLCJpc0FycmF5Iiwid29ya3NwYWNlIiwiZ2xvYmJ5U3luYyIsIndiIiwiZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCIsImRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCIsImRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImNsZWFudXAiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwicHl0aG9uRmlsZXMiLCJpZ25vcmUiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwiYWRkIiwic2l6ZSIsImRpck5hbWVzU3RyIiwiZCIsImtleXMiLCJwYWNrYWdlTmFtZXMiLCJjb21taXRIYXNoIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwicGFja2FnZU1hbmFnZXIiLCJuZXdKc29uVGV4dCIsIm9sZEFuZE5ld1NjcmlwdE5hbWVzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJmaWxlcyIsImZpeFNjcmlwdE5hbWVzIiwidHlwZWNoZWNrIiwib2xkVGVzdCIsInB5cmlnaHQiLCJwcmVDb21taXQiLCJwcmVQdXNoIiwicHJlUHVzaEZvckxhYiIsInBvc3RNZXJnZSIsImdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlSnNvblBhdGgiLCJwcmVDb21taXRGaWxlUGF0aCIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwiZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyIsInBvc3RNZXJnZUNvbW1hbmRzIiwiU3RyaW5nIiwicmF3IiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJjcmVhdGVUYXNrT3B0aW9ucyIsInJ1bm5lciIsImV4dGVuc2lvbiIsInByZXR0aWVyQ29udGVudCIsImJpb21lQ29udGVudCIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiY29tbWFuZHMiLCJnbG9iIiwiZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24iLCJ5YW1sIiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsIm1rZGlyU3luYyIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwicGFja2FnZVByZWZpeCIsImdldEVzbGludEtleSIsInBhY2thZ2VzRmlsdGVyIiwiZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIiLCJnZW5lcmF0ZU5leHRDb25maWdKc29uIiwiZmluZCIsInAiLCJfIiwic2V0dGluZ3NUZXh0IiwiZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJnZW5lcmF0ZVJlYWRtZSIsImluc2VydEJhZGdlIiwiZmlsZU5hbWVzIiwicmVhZGRpclN5bmMiLCJmaWxlTmFtZSIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwiYmFkZ2UiLCJyZWFkbWUiLCJpIiwiZ2VuZXJhdGVSZWxlYXNlcmMiLCJzZXR0aW5ncyIsInBsdWdpbnMiLCJwbHVnaW4iLCJvbGRDb25maWciLCJwcmVzZXQiLCJzdWNjZXNzQ29tbWVudCIsImZhaWxDb21tZW50IiwibGFiZWxzIiwicmVsZWFzZWRMYWJlbHMiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwibW9kdWxlIiwibW9kdWxlUmVzb2x1dGlvbiIsImpzeCIsImFsd2F5c1N0cmljdCIsInN0cmljdCIsInNraXBMaWJDaGVjayIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsImRlY2xhcmF0aW9uIiwic291cmNlTWFwIiwiaW1wb3J0SGVscGVycyIsIm91dERpciIsInR5cGVSb290cyIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlcyIsImlzRXNtUGFja2FnZSIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwid29ya2Zsb3dzIiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwidXNlcyIsInJlbGVhc2UiLCJ3YmZ5Iiwid29ya2Zsb3dfZGlzcGF0Y2giLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwic2VjcmV0cyIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJHSF9QUk9KRUNUX1VSTCIsIndpdGgiLCJsYWJlbGVkIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwiZmlsZU5hbWVTZXQiLCJraW5kIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJsb2FkIiwibW92ZVRvQm90dG9tIiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJzZXRTY2hlZHVsZSIsIm1pZ3JhdGVXb3JrZmxvdyIsIndyaXRlWWFtbCIsInBhcmFtcyIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIm5wbSIsInNlcnZlcl91cmwiLCJtaWdyYXRlSm9iIiwibmV3U2VjcmV0cyIsImluY2x1c2l2ZU1pbkhvdXJKc3QiLCJleGNsdXNpdmVNYXhIb3VySnN0IiwibWludXRlVXRjIiwiaG91clV0YyIsImNyb24iLCJpc0ludGVnZXIiLCJob3VySnN0IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwieWFtbFRleHQiLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJjdXJyZW50VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJ2ZXJzaW9uc0pzb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwiZ2V0TWFqb3JOdW1iZXIiLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJtYWpvciIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwiZGVwcmVjYXRlZFNlY3JldE5hbWVzIiwic2V0dXBTZWNyZXRzIiwicGFyc2VkIiwiZG90ZW52Iiwic2VjcmV0TmFtZSIsInNlY3JldF9uYW1lIiwia2V5X2lkIiwia2V5SWQiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsIndpdGhSZXRyeSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsImFsbG93X2F1dG9fbWVyZ2UiLCJ0ZW1wbGF0ZXMiLCJnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyIsImRpc3RhbmNlIiwid2JmeUpzb25TY2hlbWEiLCJ6Iiwib2JqZWN0IiwicmVjb3JkIiwic3RyaW5nIiwib3B0aW9uYWwiLCJkb2MiLCJ0cyIsImdldFBhY2thZ2VDb25maWciLCJlc21QYWNrYWdlIiwicGFja2FnZUpzb25UZXh0IiwicmVhZEZpbGVTeW5jIiwidHlwZSIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJtZXNzYWdlIiwiZmV0Y2hSZXBvSW5mbyIsIm5vZGVWZXJzaW9uQ29udGVudCIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsImZ1bGxfbmFtZSIsInNlcCIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uIiwiZ2l0aHViIiwiZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZSIsInBhdHRlcm4iLCJvcmciLCJyZXQiLCJhc3NpZ24iLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJhcnJheSIsImRlZmF1bHQiLCJkZXNjcmlwdGlvbiIsImFsaWFzIiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicm9vdERpclBhdGgiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInRoZW4iLCJidW5Mb2NrYlBhdGgiXSwibWFwcGluZ3MiOiJnb0JBVU8sTUFBTUEsRUFBVSxJQVZ2QixNQUlFQyxXQUFBQSxHQUNFQyxLQUFLQyxXQUFZLEVBQ2pCRCxLQUFLRSxtQkFBb0IsQ0FDM0IsR0NXSyxNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENSLEVBQVFHLFdBQ1ZNLFFBQVFDLEtBQUssYUFBYUgscUJBRTVCLFVBQ1FDLEdBQ1AsQ0FBQyxNQUFPRyxHQUNQRixRQUFRQyxLQUFLLHFCQUFxQkgsTUFBU0ksYUFBaUJDLE1BQVFELEVBQU1FLE1BQVFGLEtBQ3BGLENBQ0lYLEVBQVFHLFdBQ1ZNLFFBQVFDLEtBQUssY0FBY0gsbUJBRS9CLEdDVEtPLGVBQWVDLEVBQWNDLEdBQ2xDLE9BQU9YLEVBQU9DLDBCQUEwQixpQkFBaUJRLFVBQ3ZELElBQUtFLEVBQU9DLHVCQUF3QixPQUVwQyxNQUFNQyxFQUFhRixFQUFPRyxX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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{globby as a,globbySync as c}from"globby";import{PromisePool as l}from"minimal-promise-pool";import{Octokit as p}from"@octokit/core";import d from"node:child_process";import u from"deepmerge";import m from"lodash.clonedeep";import f from"node:os";import g from"js-yaml";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const j=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:t}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function x(e){return j.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 _(n){return j.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)}))}async function P(e){return j.functionIgnoringException("fixPrismaEnvFiles",(async()=>{const n=await a(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath});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 $(n){return j.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 S=new l;async function F(e,s){return j.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 S.run((()=>r.rename(t.join(i,e.name),t.join(i,a,"index.d.ts"))))):o&&(await r.mkdir(o,{recursive:!0}),await S.run((()=>r.rename(t.join(i,e.name),t.join(o,e.name))))):e.isDirectory()&&o&&!p&&(await r.mkdir(o,{recursive:!0}),await S.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 j.functionIgnoringException("fixAbbreviations",(async()=>{const s=n.dirPath,i=await a("**/*.md",{dot:!0,cwd:s,gitignore:!0});k.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const o of i){const i=t.join(s,o);await S.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(["{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,gitignore:!0});k.isVerbose&&console.info(`Found ${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("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,gitignore:!0});k.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=r.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=O(a,n,"text"),r!==a&&await C.generateFile(o,a)}await S.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,I=!!D,T=new p({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]=J(e,t,n);if(0===d.spawnSync(s,i,o).status)break}while(--s>=0)}function W(e,t,n){const[s,i,o]=J(e,t,n);o.stdio="pipe";const r=d.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map((e=>`"${e}"`))}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function J(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 L(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 j.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",t?.info?.version),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?S.run((()=>e.promises.writeFile(o,i.join("\n")+"\n"))):S.run((()=>e.promises.rm(o,{force:!0})))),await S.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+/);L(n)>L(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]=u(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 j.functionIgnoringException("generateBiomeJsonc",(async()=>{let s=m(X);const i=t.resolve(n.dirPath,"biome.jsonc");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=u.all([s,n,s],{arrayMerge:K})}catch{}const o=JSON.stringify(s);await S.run((()=>C.generateFile(i,o)))}))}async function Z(e){return j.functionIgnoringException("generateBunfigToml",(async()=>{const n=t.resolve(e.dirPath,"bunfig.toml");await S.run((()=>C.generateFile(n,"telemetry = false\n\n[install]\nexact = true\n\n[run]\nbun = true\n\n")))}))}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 j.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 S.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"].sort(),codeWith4IndentSize:["go","gradle","py"].sort(),codeWith8IndentSize:["sh"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].sort(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].sort()},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.codeWith8IndentSize)}\nindent_size = 8\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 j.functionIgnoringException("generateEditorconfig",(async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run((()=>C.generateFile(n,le)))}))}function de(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function ue(n){return j.functionIgnoringException("generateEslintignore",(async()=>{const s=t.resolve(n.dirPath,".eslintignore");if(n.isBun)return void await S.run((()=>e.promises.rm(s,{force:!0})));const i=await C.readFileIgnoringError(s)??"",o=oe.getHeadUserContent(i),r=oe.getTailUserContent(i),a=t.resolve(n.dirPath,".gitignore"),c=o+"\n3rd-party/\n@types/\n__generated__/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.config.*js\n*.d.ts\n*.min.*js\n.yarn/\n.pnp.js\n"+(await oe.readGitignoreWithoutSeparators(a)||"")+r;await S.run((()=>C.generateFile(s,c)))}))}async function me(n,s){return j.functionIgnoringException("generateEslintrc",(async()=>{const i=t.resolve(n.dirPath,".eslintrc.json");if(n.isBun)return void await S.run((()=>e.promises.rm(i,{force:!0})));const o=[];n.eslintBase&&o.push(n.eslintBase),n!==s&&o.push("../../.eslintrc.json");let r={root:!0,extends:o};try{const t=await e.promises.readFile(i,"utf8"),s=JSON.parse(t);s.extends&&(s.extends=s.extends.filter((e=>!e.startsWith("@willbooster/")&&"../../.eslintrc.json"!==e))),0===o.length&&(s.extends=[]);const a=r.extends;r.extends=s.extends,s.extends=a,r=u.all([r,s,r],{arrayMerge:V}),n.depending.blitz&&(r.extends=r.extends.filter((e=>"./node_modules/@blitzjs/next/eslint"!==e)))}catch{}const a=JSON.stringify(r);await S.run((()=>C.generateFile(i,a)))}))}const fe=`* 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 ge(e){return j.functionIgnoringException("generateGitattributes",(async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run((()=>C.generateFile(n,fe)))}))}const he=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function ye(e,n){return j.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/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\n";const r=oe.getTailUserContent(i),a=[...he];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 ve(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 S.run((()=>be(e,t))),k.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 S.run((()=>C.generateFile(s,l)))}))}const we=t.join(f.homedir(),".cache","wbfy","gitignore");async function be(n,s){await e.promises.mkdir(we,{recursive:!0}),await e.promises.writeFile(t.join(we,n),s)}async function ve(n){try{const s=await e.promises.stat(t.join(we,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(we,n),"utf8")}catch{}}async function ke(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}: ${n}`)}}const je={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},xe={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};function _e(e){return e.depending.blitz?xe.blitz:xe.node}const Pe=["eslint@8.57.0","eslint-config-prettier","eslint-plugin-import","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn"],$e=[...Pe,"@typescript-eslint/eslint-plugin","@typescript-eslint/parser","eslint-import-resolver-typescript"],Se=["eslint-plugin-react","eslint-plugin-react-hooks"],Fe={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...Pe],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...Pe,...Se],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...$e],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...$e,...Se],"@willbooster/eslint-config-blitz-next":["@willbooster/eslint-config-blitz-next","eslint-config-next",...$e,...Se],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...$e,...Se]};async function Ce(n,s,i){return j.functionIgnoringException("generatePackageJson",(async()=>{await async function(n,s,i){const o=t.resolve(n.dirPath,"package.json"),r=await e.promises.readFile(o,"utf8"),l=JSON.parse(r);l.scripts=l.scripts||{},l.dependencies=l.dependencies||{},l.devDependencies=l.devDependencies||{},l.peerDependencies=l.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(Fe))for(const t of e)delete n.devDependencies[t];await S.run((()=>e.promises.rm("lerna.json",{force:!0})))}(s,l),"@willbooster/prettier-config"!==l.name&&(l.prettier="@willbooster/prettier-config");for(const[e,t]of Object.entries(l.scripts))t.includes("git clone")||(l.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));l.scripts=u(l.scripts,Ee(n)),n.isBun?delete l.scripts.prettify:l.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(l.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(l.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],d=["prettier","sort-package-json","@willbooster/prettier-config"];const m=[];n.isBun?delete l.devDependencies["lint-staged"]:d.push("lint-staged");if(n.isRoot){if(n.isBun?(delete l.devDependencies.husky,delete l.devDependencies.pinst,l.scripts.prepare="lefthook install || true",d.push("lefthook")):(d.push("husky"),l.scripts.prepare="husky || true",l.scripts.postinstall="husky || true",(n.isPublicRepo||n.isReferredByOtherRepo)&&(d.push("pinst"),l.scripts.prepack="pinst --disable",l.scripts.postpack="pinst --enable")),n.depending.semanticRelease){const e=l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]?"@6.1.0":"";d.push(`conventional-changelog-conventionalcommits${e}`),l.devDependencies["semantic-release"]||l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]||d.push("semantic-release"),l.version="0.0.0-semantically-released"}n.depending.playwrightTest&&(l.dependencies["@playwright/test"]||(d.push("@playwright/test"),delete l.dependencies["@playwright/test"]),delete l.dependencies.playwright,delete l.devDependencies.playwright),n.doesContainsSubPackageJsons?l.workspaces=Array.isArray(l.workspaces)?u.all([l.workspaces,["packages/*"]],{arrayMerge:V}):["packages/*"]:Array.isArray(l.workspaces)&&(l.workspaces=l.workspaces.filter((e=>c(e,{dot:!0,cwd:n.dirPath,gitignore:!0}).length>0)),0===l.workspaces.length&&delete l.workspaces)}if(n.depending.wb||n.isBun){l.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):d.push("@willbooster/wb");for(const[e,t]of Object.entries(l.scripts))l.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainsJavaScript||n.doesContainsJavaScriptInPackages||n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(n.isBun?(d.push("@biomejs/biome","@willbooster/biome-config"),delete l.devDependencies.eslint,delete l.devDependencies.micromatch,delete l.devDependencies["@typescript-eslint/parser"]):(d.push("eslint@8.57.0","micromatch"),n.doesContainsTypeScriptInPackages&&d.push("@typescript-eslint/parser")));(n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(d.push("typescript"),n.isBun&&d.push("@types/bun"));n.eslintBase&&d.push(...Fe[n.eslintBase]);n.isWillBoosterConfigs&&(p=p.filter((e=>!e.includes("@willbooster/"))),d=d.filter((e=>!e.includes("@willbooster/"))));l.name||(l.name=t.basename(n.dirPath));n.doesContainsSubPackageJsons&&(l.private=!0);l.license||(l.license="UNLICENSED");!l.private&&"UNLICENSED"!==l.license&&s.isPublicRepo&&(l.publishConfig??={},l.publishConfig.access??="public");const[f]=A.getOrgAndName(n.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(l.author="WillBooster Inc.");n.isRoot||!l.private||l.main||(l.main="./src");if(delete l.resolutions?.["npm/chalk"],!n.doesContainsSubPackageJsons){if(n.isBun||(n.doesContainsJavaScript||n.doesContainsTypeScript?l.scripts["lint-fix"]+=je.getLintFixSuffix(n):(delete l.scripts.lint,delete l.scripts["lint-fix"],l.scripts.cleanup=l.scripts.cleanup?.replace(" && yarn lint-fix",""))),n.doesContainsPubspecYaml){l.scripts.lint="flutter analyze",l.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter((s=>e.existsSync(t.resolve(n.dirPath,s))));s.length>0&&(l.scripts["format-code"]=`flutter format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,l.scripts.format+=" && yarn format-code")}if(n.doesContainsPoetryLock){"poetry install"===l.scripts.postinstall&&delete l.scripts.postinstall;const e=await a("**/*.py",{cwd:n.dirPath,dot:!0,gitignore:!0,ignore:["test-fixtures"]}),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(" ");l.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,l.scripts.lint?l.scripts.lint=`poetry run flake8 ${e} && ${l.scripts.lint}`:(l.scripts.lint=`poetry run flake8 ${e}`,l.scripts["lint-fix"]="yarn lint"),l.scripts.format+=" && yarn format-code",m.push("black","isort","flake8")}}n.repository&&(l.repository=n.repository)}n.depending.blitz?(p.push(`blitz@${G}`,`@blitzjs/auth@${G}`,`@blitzjs/next@${G}`,`@blitzjs/rpc@${G}`,`next@${U}`),d=d.filter((e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e)),l.scripts["gen-code"]?.startsWith("blitz codegen")?l.scripts["gen-code"].includes("blitz prisma generate")||(l.scripts["gen-code"]=l.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):l.scripts["gen-code"]="blitz codegen"):n.depending.prisma&&!l.scripts["gen-code"]?.startsWith("prisma generate")&&(l.scripts["gen-code"]="prisma generate");n.depending.next&&delete l.devDependencies["@types/react"];l.dependencies?.prettier||delete l.devDependencies["@types/prettier"];0===Object.keys(l.dependencies).length&&delete l.dependencies;0===Object.keys(l.devDependencies).length&&delete l.devDependencies;0===Object.keys(l.peerDependencies).length&&delete l.peerDependencies;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")){delete e.devDependencies["@willbooster/auth"];const t=await ke("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await ke("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await ke("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")){delete e.dependencies["@willbooster/judge"];const t=await ke("WillBoosterLab","judge");e.devDependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")){delete e.dependencies["@willbooster/llm-proxy"];const t=await ke("WillBoosterLab","llm-proxy");e.devDependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(l),n.isBun&&delete l.packageManager;let g=JSON.stringify(l);if(g=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(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,gitignore:!0});for(const n of r)await S.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 S.promiseAll(),s}(l.scripts,g,n),await e.promises.writeFile(o,g),!i){p=p.filter((e=>!l.devDependencies?.[e]));const e=n.isBun?"bun":"yarn";p.length>0&&R(e,["add",...new Set(p)],n.dirPath),d=d.filter((e=>!l.dependencies?.[e])),d.length>0&&R(e,["add","-D",...new Set(d)],n.dirPath),m.length>0&&R("poetry",["add","--group","dev",...new Set(m)],n.dirPath)}}(n,s,i)}))}function Ee(e){if(e.isBun){const t={cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun wb test",typecheck:"bun --bun wb typecheck"};return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||delete t.typecheck,t}{let t={cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:`eslint --color "./{${_e(e)}}/**/*.{${ce.eslint.join(",")}}"`,"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=u({...t},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${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}}const Be={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nyarn typecheck\n'.trim(),postMerge:'\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function Oe(n){return j.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 S.run((()=>e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0}))),await S.run((()=>e.promises.writeFile(a,Be.preCommit+"\n")));const{typecheck:c}=Ee(n);if(c){let s=n.repository?.startsWith("github:WillBoosterLab/")?Be.prePushForLab:Be.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 S.run((()=>e.promises.writeFile(t.resolve(r,"pre-push"),s+"\n",{mode:493})))}const l=`${Be.postMerge}\n\n${De(n).join("\n")}\n`;await S.run((()=>e.promises.writeFile(t.resolve(r,"post-merge"),l,{mode:493})))}(n)}))}function De(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 Ie(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 Te=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ce.prettier.map((e=>Ie("node","node_modules/.bin/prettier --cache --write","Prettier",e))).join("")}\n </component>\n</project>\n`,Ae=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ce.prettier.map((e=>Ie("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-errors","Biome",e))).join("")}\n </component>\n</project>\n`;async function Re(n){return j.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?S.run((()=>C.generateFile(i,n.isBun?Ae:Te))):S.run((()=>e.promises.rm(i,{force:!0}))))}}))}const We={"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"}}}},Je={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 Le(n){return j.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"),g.dump(We,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]);const{typecheck:i}=Ee(n);if(i){const i=n.repository?.startsWith("github:WillBoosterLab/")?Je.prePushForLab:Je.prePush;e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await S.run((()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493})))}const o=`${Je.postMerge}\n\n${De(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await S.run((()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),o,{mode:493})))}(n)}))}async function Ne(n){return j.functionIgnoringException("generateLintstagedrc",(async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await S.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 '${ze(n)}': [${JSON.stringify(`${i}eslint --fix${je.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, '${ze(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 S.run((()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0}))),await S.run((()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0}))),await S.run((()=>C.generateFile(s,a)))}(n)}))}function ze(e){return`./{${_e(e).join(",")}}/**/*.{${ce.eslint.join(",")}}`}async function Ge(n){return j.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 S.run((()=>C.generateFile(s,i)))}))}async function Ue(e){return j.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 S.run((()=>C.generateFile(n,l)))}))}const He={venvPath:".",venv:".venv"};async function Me(n){return j.functionIgnoringException("generatePyrightConfigJson",(async()=>{let s=m(He);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=u.all([s,n,s],{arrayMerge:K})}catch{}const o=JSON.stringify(s);await S.run((()=>C.generateFile(i,o)))}))}async function qe(n){return j.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=Ye(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=Ye(i,a))}await S.run((()=>C.generateFile(s,i)))}))}function Ye(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 Ke(n){return j.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",u.all([n,{preset:"conventionalcommits"}],{arrayMerge:K})]:"@semantic-release/github"===t&&(o[e]=["@semantic-release/github",u.all([n,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:K})])}const r=JSON.stringify(i);await S.run((()=>C.generateFile(s,r)))}))}const Ve={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function Xe(n){return j.functionIgnoringException("generateRenovateJson",(async()=>{let s=m(Ve);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=u.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 S.run((()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0}))),await S.run((()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0})));const o=JSON.stringify(s);await S.run((()=>C.generateFile(i,o)))}))}function Qe(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&&Qe(s);return e}const 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,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*","packages/*/src/**/*","packages/*/tests/**/*","packages/*/scripts/**/*"]},et={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*"]};async function tt(n){return j.functionIgnoringException("generateTsconfig",(async()=>{if(n.depending.blitz||n.depending.next)return;let s=m(n.isRoot?Ze:et);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=u.all([s,o,s],{arrayMerge:V}),s.include=s.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}Qe(s),s.include?.sort();const o=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await S.run((()=>C.generateFile(i,o)))}))}const nt=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function st(n){return j.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 nt)o=u.all([o,it(e)]);n.doesContainsPoetryLock&&(o=u.all([o,it("**/.venv/**")])),n.depending.next&&(o=u.all([o,it("**/.next/**")])),Qe(o??{});const r=JSON.stringify(o,void 0,2);await S.run((()=>C.generateFile(s,r)))}catch{}}))}function it(e){return{"files.watcherExclude":{[e]:!0}}}const ot={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 rt(n){return j.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 S.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 S.run((()=>at(n,s,i)))}await S.run((()=>e.promises.rm(t.join(s,"add-focused-issue-to-project.yml"),{force:!0,recursive:!0})))}))}async function at(n,s,i){let o=m(ot[i]??{});const r=t.join(s,`${i}.yml`);try{const t=await e.promises.readFile(r,"utf8"),n=g.load(t);o=u.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([...o.on.push["paths-ignore"]??[],"**.md","**/docs/**"])]));for(const e of Object.values(o.jobs)){if(!e.uses?.includes?.("/reusable-workflows/"))return;ct(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&<(o,20,24);break;case"wbfy-merge":lt(o,1,4)}if(function(e){delete e.jobs["add-to-project"]}(o),await pt(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(!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 pt(o,t.join(s,"sync-force.yml"))}}function ct(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;e&&(t.with.sync_params_without_dest=e.toString().replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,function(e){if(!e.with)return;delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,delete e.with.cpu_arch,delete e.with.label,delete e.with.labelOperator}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.toString().replace(/\s+--json/,"")),e.doesContainsDockerfile&&("extra-large"!==t.with.ci_size&&(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?Qe(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Qe(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function lt(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 pt(t,n){const s=g.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function dt(n){return j.functionIgnoringException("generateYarnrcYml",(async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await S.run((()=>e.promises.rm(s,{force:!0}))),await S.run((()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0}))),void await S.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);ut(i)<=ut(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 S.run((()=>e.promises.rm(t.join(r,n))));const a=t.resolve(n.dirPath,".yarnrc");await S.run((()=>e.promises.rm(a,{force:!0})));const c=g.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 S.run((()=>e.promises.rm(s,{force:!0})))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,g.dump(c,{lineWidth:-1})),R("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)}))}function ut(e){const[t]=e.split(".");return Number(t)}async function mt(e){return j.functionIgnoringException("setupLabels",(async()=>{if(!I)return;const[t,n]=A.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await ft(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await ft(t,n,"d2: easy :rabbit2:","DDD6FE"),await ft(t,n,"d3: medium :ox:","C4B5FD"),await ft(t,n,"d4: hard :squid:","A78BFA"),await ft(t,n,"d5: x-hard :whale2:","8B5CF6"),await ft(t,n,"p1: critical :fire::fire::fire:","EF4444"),await ft(t,n,"p2: urgent :fire::fire:","F87171"),await ft(t,n,"p3: important :fire:","FCA5A5"),await ft(t,n,"p4: nice to have :droplet:","FECACA"),await ft(t,n,"r: blitz","5300bc"),await ft(t,n,"r: firebase","ffca28"),await ft(t,n,"r: prisma","0c344b"),await ft(t,n,"r: react","61dafb"),await ft(t,n,"r: svelte","ff3e00"),await ft(t,n,"r: semantic-release","494949"),await ft(t,n,"ready :rocket:","22C55E"),await ft(t,n,"review requested :mag:","FBCA04"),await ft(t,n,"released :bookmark:","6366F1"),await ft(t,n,"s: 0.5h :clock1230:","F3F4F6"),await ft(t,n,"s: 1h :clock1:","E5E7EB"),await ft(t,n,"s: 2h :clock2:","D1D5DB"),await ft(t,n,"s: 3h :clock3:","9CA3AF"),await ft(t,n,"s: 5h :clock5:","6B7280"),await ft(t,n,"s: 8h :clock8:","4B5563"),await ft(t,n,"s: 13h :clock1:","374151"),await ft(t,n,"t: build :hammer:","BFDBFE"),await ft(t,n,"t: chore :broom:","BFDBFE"),await ft(t,n,"t: ci :construction_worker:","BFDBFE"),await ft(t,n,"t: docs :memo:","BFDBFE"),await ft(t,n,"t: feat :sparkles:","BFDBFE"),await ft(t,n,"t: fix :bug:","BFDBFE"),await ft(t,n,"t: perf :zap:","BFDBFE"),await ft(t,n,"t: refactor :recycle:","BFDBFE"),await ft(t,n,"t: style :lipstick:","BFDBFE"),await ft(t,n,"t: test :test_tube:","BFDBFE"),await ft(t,n,"project","24292F"),await ft(t,n,"focused :dart:","22C55E"),await gt(t,n,"bug"),await gt(t,n,"documentation"),await gt(t,n,"duplicate"),await gt(t,n,"enhancement"),await gt(t,n,"good first issue"),await gt(t,n,"help wanted"),await gt(t,n,"invalid"),await gt(t,n,"question"),await gt(t,n,"wontfix"),await gt(t,n,"ready"),await gt(t,n,"review requested"),await gt(t,n,"released"),await gt(t,n,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function ft(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 gt(e,t,n){try{await T.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const ht=["READY_DISCORD_WEBHOOK_URL"];async function yt(e){return j.functionIgnoringException("setupSecrets",(async()=>{if(!I||!k.doesUploadEnvVars)return;const[t,n]=A.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const s=h.config().parsed||{};if(0!==Object.keys(s).length)try{for(const e of ht)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 y.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=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,s),p=y.to_base64(l,y.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 wt(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 bt={"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 vt(n){return j.functionIgnoringException("generateGitHubTemplates",(async()=>{for(const[s,i]of Object.entries(bt)){const o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(w(t,i)>i.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await S.run((()=>C.generateFile(o,i)))}}))}const kt=v.object({typos:v.object({all:v.record(v.string()).optional(),doc:v.record(v.string()).optional(),ts:v.record(v.string()).optional(),text:v.record(v.string()).optional()}).optional()});async function jt(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=b(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 _t(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await _t(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 w;try{const e=await r.readFile(y,"utf8");w=kt.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:xt("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:xt("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScript:xt("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsx:xt("{app,src,tests}/**/*.{t,j}sx",n),doesContainsJavaScriptInPackages:xt("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScriptInPackages:xt("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsxInPackages:xt("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:w};if(v.isBun||(v.eslintBase=function(e){if(e.depending.blitz)return"@willbooster/eslint-config-blitz-next";if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainsTypeScript)return e.doesContainsJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainsJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainsJavaScript)return"@willbooster/eslint-config-js"}(v)),v.doesContainsGemfile||v.doesContainsGoMod||v.doesContainsPackageJson||v.doesContainsPoetryLock||v.doesContainsPomXml||v.doesContainsPubspecYaml||v.doesContainsTemplateYaml)return v}catch{}}function xt(e,t){return c(e,{dot:!0,cwd:t}).length>0}async function _t(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;k.isVerbose=n.verbose,k.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,...r]);const a=await jt(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=>jt(e,a))))).filter((e=>!!e)),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await H(a),await dt(a),await Promise.all([x(a),P(a),c.then((()=>qe(a))),ae(a),pe(a),ge(a),vt(a),Re(a),Xe(a),Ke(a),rt(a),mt(a),yt(a),wt(a),...a.isBun?[Z(a),Oe(a).then((()=>Le(a)))]:[Oe(a)],Ne(a)]),await S.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(_(e)),e.depending.next&&d.push(Ge(e)),await ye(e,a),await S.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await Ue(e),await Ce(e,a,n.skipDeps),d.push(Ne(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(st(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(tt(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isBun&&d.push(Q(e)),a.isWillBoosterConfigs||d.push(me(e,a)),d.push(ue(e))),e.depending.pyright&&d.push(Me(e)));await Promise.all(d),await S.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy9maXhlcnMvcGxheXdyaWdodENvbmZpZy50cyIsIi4uL3NyYy9maXhlcnMvcHJpc21hLnRzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbkNvbnN0YW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FzZGYudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYmlvbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludGlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL3V0aWxzL2VzbGludFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3JjRGlyZWN0b3JpZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2h1c2t5cmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9pZGVhLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9uZXh0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd29ya2Zsb3cudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy95YXJucmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9zZWNyZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy9wYWNrYWdlQ29uZmlnLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIE9wdGlvbnMge1xuICBpc1ZlcmJvc2U6IGJvb2xlYW47XG4gIGRvZXNVcGxvYWRFbnZWYXJzOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaXNWZXJib3NlID0gZmFsc2U7XG4gICAgdGhpcy5kb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IGVycm9yfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4RG9ja2VyZmlsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhEb2NrZXJmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0RvY2tlcmZpbGUpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBjb25maWcuZG9ja2VyZmlsZTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudDtcblxuICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgbmV3Q29udGVudCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC9yZXRyaWVzOi4rLC8sICdyZXRyaWVzOiBwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEsJyk7XG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UHJpc21hRW52RmlsZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UHJpc21hRW52RmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW52RmlsZXMgPSBhd2FpdCBnbG9iYnkoWycqLmVudicsICcqLmVudi4qJ10sIHsgZG90OiB0cnVlLCBjd2Q6IGNvbmZpZy5kaXJQYXRoIH0pO1xuICAgIGZvciAoY29uc3QgZW52RmlsZSBvZiBlbnZGaWxlcykge1xuICAgICAgY29uc3QgZW52RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGVudkZpbGUpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL0RBVEFCQVNFX1VSTD1cIj8oLitcXC5zcWxpdGUzKVwiP1tcXG4kXS8sXG4gICAgICAgICdEQVRBQkFTRV9VUkw9XCIkMT9jb25uZWN0aW9uX2xpbWl0PTFcIlxcbidcbiAgICAgICk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZW52RmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZFRlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnX190ZXN0c19fJyk7XG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdHMnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4Jyk7XG4gICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZUFsbCgnX190ZXN0c19fJywgJ3Rlc3RzJyk7XG4gICAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgbmV3Q29udGVudCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpKTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmc3AucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBhc3luYyBnZW5lcmF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZnNwLndyaXRlRmlsZShmaWxlUGF0aCwgY29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeEFiYnJldmlhdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGdsb2JieSgnKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGdpdGlnbm9yZTogdHJ1ZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4QWJicmV2aWF0aW9uc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGdsb2JieShcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgXSxcbiAgICAgIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGdpdGlnbm9yZTogdHJ1ZSB9XG4gICAgKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0c0ZpbGVzLmxlbmd0aH0gVHlwZVNjcmlwdCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHNGaWxlIG9mIHRzRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIHRzRmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IG9sZENvbnRlbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKiljXFwuZlxcLi9nLCAnLy8kMWNmLicpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopZWdcXC4vZywgJy8vJDFlLmcuJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKilpZVxcLi9nLCAnLy8kMWkuZS4nKTtcbiAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBnbG9iYnkoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGdpdGlnbm9yZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgICAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWVnXFwuL2csICcvLyQxZS5nLicpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopaWVcXC4vZywgJy8vJDFpLmUuJyk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeEFiYnJldmlhdGlvbnNJblRleHQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFxiY1xcLmZcXC4oW14kXSkvZywgJ2NmLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oW14kXSkvZywgJ2UuZy4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKFteJF0pL2csICdpLmUuJDEnKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmNvbnN0IHRva2VuID1cbiAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVCB8fCBwcm9jZXNzLmVudi5QVUJMSUNfR0hfQk9UX1BBVCB8fCBwcm9jZXNzLmVudi5HSF9UT0tFTiB8fCBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU47XG5leHBvcnQgY29uc3QgaGFzR2l0SHViVG9rZW4gPSAhIXRva2VuO1xuZXhwb3J0IGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gIGF1dGg6IHRva2VuLFxufSk7XG5cbmNsYXNzIEdpdEh1YlV0aWwge1xuICBnZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVybFdpdGhvdXRQcm90b2NvbCA9IHVybE9yRnVsbE5hbWUuc3BsaXQoJzonKS5hdCgtMSk7XG4gICAgY29uc3QgbmFtZXMgPSB1cmxXaXRob3V0UHJvdG9jb2w/LnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgb3JnID0gbmFtZXM/LmF0KC0yKSA/PyAnJztcbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvLmdpdCQvLCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke29wdGlvbnMuY3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgaWYgKHJldC5zdGF0dXMgPT09IDApIGJyZWFrO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgY29uc3QgZXJyb3IgPSBwcm9jLnN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKX1dIGNhdXNlZCB0aGUgZm9sbG93aW5nIGVycm9yOlxcbiAke2Vycm9yfWApO1xuICB9XG4gIHJldHVybiBwcm9jLnN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5yZXBsYWNlKGAke2Vudi5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJyk7XG4gIH1cblxuICBpZiAoZW52LkFTREZfRElSKSB7XG4gICAgYXJncyA9IFsnLWwnLCAnLWMnLCBgLiAke2Vudi5BU0RGX0RJUn0vYXNkZi5zaCAmJiAke2NvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9YF07XG4gICAgY29tbWFuZCA9ICdiYXNoJztcbiAgfVxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gY29udmVydFZlcnNpb25JbnRvTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIGUuZy4gamF2YSBhZG9wdG9wZW5qZGstMTEuMC4xNys4XG4gIGNvbnN0IG51bWJlcnMgPSB2ZXJzaW9uXG4gICAgLnNwbGl0KC9bKy4tXS8pXG4gICAgLm1hcChOdW1iZXIpXG4gICAgLmZpbHRlcigobnVtKSA9PiAhTnVtYmVyLmlzTmFOKG51bSkpO1xuICBsZXQgdmVyc2lvbk51bWJlciA9IDA7XG4gIGxldCBkaXZpc29yID0gMTtcbiAgZm9yIChjb25zdCBudW0gb2YgbnVtYmVycykge1xuICAgIHZlcnNpb25OdW1iZXIgKz0gbnVtICogZGl2aXNvcjtcbiAgICBkaXZpc29yIC89IDEwMDA7XG4gIH1cbiAgcmV0dXJuIHZlcnNpb25OdW1iZXI7XG59XG4iLCJleHBvcnQgY29uc3QgUFlUSE9OX1ZFUlNJT04gPSAnMy45LjE5JztcbmV4cG9ydCBjb25zdCBKQVZBX1ZFUlNJT04gPSAnenVsdS0xMS43NC4xNSc7XG4vLyBCZWNhdXNlIFdlYktpdCBjYW5ub3QgbG9nLWluIG9uIEJsaXR6IHYyLjAuNStcbmV4cG9ydCBjb25zdCBCTElUWl9WRVJTSU9OID0gJzIuMC40JztcbmV4cG9ydCBjb25zdCBORVhUX1ZFUlNJT04gPSAnMTQuMi41JztcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGNvbnZlcnRWZXJzaW9uSW50b051bWJlciB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgSkFWQV9WRVJTSU9OLCBQWVRIT05fVkVSU0lPTiB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb25Db25zdGFudHMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUb29sVmVyc2lvbnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUb29sVmVyc2lvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuY29uc3QgQ09SRV9UT09MUyA9IG5ldyBTZXQoWydqYXZhJywgJ25vZGVqcycsICdidW4nLCAncHl0aG9uJ10pO1xuY29uc3QgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTID0gWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ107XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY29uZmlnLnZlcnNpb25zVGV4dCkgcmV0dXJuO1xuXG4gIGNvbnN0IGR1cGxpY2F0YWJsZUxpbmVzID0gY29uZmlnLnZlcnNpb25zVGV4dFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgW25hbWUsIHZlcnNpb25dID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIC8vIFRvIG1vdmUgdGhlIHRvcCBvZiB0aGUgc29ydGVkIGxpc3QsIHdlIG5lZWQgdG8gYWRkIGEgc3BhY2UuXG4gICAgICByZXR1cm4gYCR7Q09SRV9UT09MUy5oYXMobmFtZSkgPyAnICcgOiAnJ30ke25hbWV9ICR7dmVyc2lvbn1gO1xuICAgIH0pXG4gICAgLnNvcnQoKVxuICAgIC8vIFJlbW92ZSBhZGRlZCBzcGFjZXMuXG4gICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBhZnRlciBsZWZ0aG9vayBpcyBpbnN0YWxsZWQgdmlhIG5wbS5cbiAgICAuZmlsdGVyKChsaW5lKSA9PiAhbGluZS5zdGFydHNXaXRoKCdsZWZ0aG9vaycpKTtcbiAgY29uc3QgbGluZXMgPSBbLi4ubmV3IFNldChkdXBsaWNhdGFibGVMaW5lcyldO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vcHlwaS5vcmcvcHlwaS9wb2V0cnkvanNvbicpO1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgY29uc3QgcG9ldHJ5VmVyc2lvbiA9IGpzb24/LmluZm8/LnZlcnNpb247XG4gICAgaWYgKHBvZXRyeVZlcnNpb24pIHtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdwb2V0cnknLCBqc29uPy5pbmZvPy52ZXJzaW9uKTtcbiAgICB9XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3B5dGhvbicsIFBZVEhPTl9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdqYXZhJywgSkFWQV9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgY29uc3QgYnVuVmVyc2lvbiA9IGF3YWl0IGdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIoJ292ZW4tc2gnLCAnYnVuJyk7XG4gICAgICBpZiAoYnVuVmVyc2lvbikgdXBkYXRlVmVyc2lvbihsaW5lcywgJ2J1bicsIGJ1blZlcnNpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgnbnBtJywgWydzaG93JywgJ3lhcm4nLCAndmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAneWFybicsIHZlcnNpb24pO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcHJlZml4IG9mIERFUFJFQ0FURURfVkVSU0lPTl9QUkVGSVhFUykge1xuICAgIGNvbnN0IHZlcnNpb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCk7XG4gICAgdm9pZCBmcy5wcm9taXNlcy5ybSh2ZXJzaW9uUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHRvb2xWZXJzaW9uc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudG9vbC12ZXJzaW9ucycpO1xuICBhd2FpdCAobGluZXMubGVuZ3RoID4gMFxuICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLndyaXRlRmlsZSh0b29sVmVyc2lvbnNQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nKSlcbiAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh0b29sVmVyc2lvbnNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgc3Bhd25TeW5jKCdhc2RmJywgWydwbHVnaW4nLCAndXBkYXRlJywgJy0tYWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgc3Bhd25TeW5jKCdhc2RmJywgWydpbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVmVyc2lvbihsaW5lczogc3RyaW5nW10sIHRvb2xOYW1lOiBzdHJpbmcsIG5ld1ZlcnNpb246IHN0cmluZywgaGVhZCA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnN0IGluZGV4ID0gbGluZXMuZmluZEluZGV4KChsKSA9PiBsLnNwbGl0KC9cXHMrLylbMF0gPT09IHRvb2xOYW1lKTtcbiAgY29uc3QgbmV3TGluZSA9IGAke3Rvb2xOYW1lfSAke25ld1ZlcnNpb259YDtcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIGxpbmVzLnNwbGljZShoZWFkID8gMCA6IGxpbmVzLmxlbmd0aCwgMCwgbmV3TGluZSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgWywgdmVyc2lvbl0gPSBsaW5lc1tpbmRleF0uc3BsaXQoL1xccysvKTtcbiAgICBpZiAoY29udmVydFZlcnNpb25JbnRvTnVtYmVyKG5ld1ZlcnNpb24pID4gY29udmVydFZlcnNpb25JbnRvTnVtYmVyKHZlcnNpb24pKSB7XG4gICAgICBsaW5lc1tpbmRleF0gPSBuZXdMaW5lO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvc2l0b3J5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIC8vIEZldGNoIHRoZSBsYXRlc3QgcmVsZWFzZSBmcm9tIHRoZSByZXBvc2l0b3J5XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvbGF0ZXN0Jywge1xuICAgICAgb3duZXI6IG9yZ2FuaXphdGlvbixcbiAgICAgIHJlcG86IHJlcG9zaXRvcnksXG4gICAgfSk7XG4gICAgY29uc3QgdmVyc2lvbiA9IHJlc3BvbnNlLmRhdGEudGFnX25hbWU7XG4gICAgY29uc3QgaW5kZXggPSB2ZXJzaW9uLmxhc3RJbmRleE9mKCd2Jyk7XG4gICAgY29uc3QgdmVyc2lvbk51bWJlclRleHQgPSBpbmRleCA9PT0gLTEgPyB2ZXJzaW9uIDogdmVyc2lvbi5zbGljZShpbmRleCArIDEpO1xuICAgIC8vIENoZWNrIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSBudW1iZXJcbiAgICByZXR1cm4gL15cXGQvLnRlc3QodmVyc2lvbk51bWJlclRleHQpID8gdmVyc2lvbk51bWJlclRleHQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIEJ1biB0YWdzIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG59XG4iLCJpbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJ3cml0ZU1lcmdlPFQ+KGRlc3RpbmF0aW9uQXJyYXk6IFRbXSwgc291cmNlQXJyYXk6IFRbXSk6IFRbXSB7XG4gIHJldHVybiBzb3VyY2VBcnJheTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiBhbnlbXSwgc291cmNlOiBhbnlbXSwgb3B0aW9uczogYW55KTogYW55W10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdChpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gbWVyZ2UodGFyZ2V0W2luZGV4XSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJy4vbm9kZV9tb2R1bGVzL0BiaW9tZWpzL2Jpb21lL2NvbmZpZ3VyYXRpb25fc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCaW9tZUpzb25jJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogdW5rbm93biA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KTtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGB0ZWxlbWV0cnkgPSBmYWxzZVxuXG5baW5zdGFsbF1cbmV4YWN0ID0gdHJ1ZVxuXG5bcnVuXVxuYnVuID0gdHJ1ZVxuXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGXjgafjga9ub2RlX21vZHVsZXPjgpJDT1BZ44GZ44KL5b+F6KaB44GM44GC44KL44Gf44KB44CBbm9kZV9tb2R1bGVz44KS6Zmk5aSW44GX44Gm44Gv44GE44GR44Gq44GE44CCXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuKiovLmlkZWFcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNEb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnNvcnQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAncHknXS5zb3J0KCksXG4gIGNvZGVXaXRoOEluZGVudFNpemU6IFsnc2gnXS5zb3J0KCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnNvcnQoKSxcbiAgZXNsaW50OiBbJ2NqcycsICdtanMnLCAnanMnLCAnY3RzJywgJ210cycsICd0cycsICd0c3gnLCAnanN4J10uc29ydCgpLFxuICBwcmV0dGllcjogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjc3MnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnbWQnLFxuICAgICdzY3NzJyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0uc29ydCgpLFxuICAvLyBjZi4gaHR0cHM6Ly9iaW9tZWpzLmRldi9pbnRlcm5hbHMvbGFuZ3VhZ2Utc3VwcG9ydC9cbiAgYmlvbWU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ2FzdHJvJyxcbiAgICAnY3NzJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ2dxbCcsXG4gIF0uc29ydCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg4SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDhcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbkB0eXBlcy9cbl9fZ2VuZXJhdGVkX18vXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbiouY29uZmlnLipqc1xuKi5kLnRzXG4qLm1pbi4qanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRXNsaW50aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludGlnbm9yZScpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRXNsaW50cmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFc2xpbnRyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5qc29uJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlcyA9IFtdO1xuICAgIGlmIChjb25maWcuZXNsaW50QmFzZSkge1xuICAgICAgYmFzZXMucHVzaChjb25maWcuZXNsaW50QmFzZSk7XG4gICAgfVxuICAgIGlmIChjb25maWcgIT09IHJvb3RDb25maWcpIHtcbiAgICAgIGJhc2VzLnB1c2goJy4uLy4uLy5lc2xpbnRyYy5qc29uJyk7XG4gICAgfVxuICAgIGxldCBuZXdTZXR0aW5ncyA9IHsgcm9vdDogdHJ1ZSwgZXh0ZW5kczogYmFzZXMgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCk7XG4gICAgICBpZiAob2xkU2V0dGluZ3MuZXh0ZW5kcykge1xuICAgICAgICBvbGRTZXR0aW5ncy5leHRlbmRzID0gb2xkU2V0dGluZ3MuZXh0ZW5kcy5maWx0ZXIoXG4gICAgICAgICAgKGV4dDogc3RyaW5nKSA9PiAhZXh0LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSAmJiBleHQgIT09ICcuLi8uLi8uZXNsaW50cmMuanNvbidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChiYXNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgb2xkU2V0dGluZ3MuZXh0ZW5kcyA9IFtdO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3RXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHM7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIG9sZFNldHRpbmdzLmV4dGVuZHMgPSBuZXdFeHRlbmRzO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgIH0pIGFzIHR5cGVvZiBuZXdTZXR0aW5ncztcbiAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGUgZm9sbG93aW5nIGNvZGUgYWZ0ZXIgYWxsIEJsaXR6LmpzIHByb2plY3RzIGFyZSB1cGRhdGVkLlxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHMuZmlsdGVyKFxuICAgICAgICAgIChleHQ6IHN0cmluZykgPT4gZXh0ICE9PSAnLi9ub2RlX21vZHVsZXMvQGJsaXR6anMvbmV4dC9lc2xpbnQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4hLmtlZXBcbi5lbnYucHJvZHVjdGlvblxuKi9tb3VudC8qLmhhc2hcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLmRldmNvbnRhaW5lci9cbmRpc3QvXG50ZW1wL1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGxldCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCkgKyBjb21tb25Db250ZW50O1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IG5hbWVzID0gWy4uLmRlZmF1bHROYW1lc107XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgICBuYW1lcy5wdXNoKCdub2RlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWwpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmF3cy1zYW0vXG5wYWNrYWdlZC55YW1sXG5gO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIC52ZW52IHNob3VsZCBiZSBpZ25vcmVkIG9uIHJvb3QgZGlyZWN0b3J5XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAqLnNxbGl0ZTMqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGB0ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvbVhtbCB8fCBjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oLmlkZWFcXC8uKykkL2dtLCAnJDFcXG5hbmRyb2lkLyQxJyk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyAnXFxuJyArIGdlbmVyYXRlZCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY2FjaGUnLCAnd2JmeScsICdnaXRpZ25vcmUnKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDYWNoZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgY29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSk7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGF0Lm10aW1lTXMgPiA2ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgeyBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgZGF0YTogY29tbWl0cyB9ID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMnLCB7XG4gICAgICBvd25lcjogb3JnYW5pemF0aW9uLFxuICAgICAgcmVwbyxcbiAgICAgIHBlcl9wYWdlOiAxLFxuICAgIH0pO1xuICAgIGlmIChjb21taXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWl0c1swXS5zaGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0cyBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb306ICR7ZXJyb3J9YCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgRXNsaW50VXRpbCA9IHtcbiAgZ2V0TGludEZpeFN1ZmZpeChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3ggPyAnIC0tcnVsZSBcInsgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzOiAwIH1cIicgOiAnJztcbiAgfSxcbn07XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3Qgc3JjRGlyZWN0b3JpZXMgPSB7XG4gIG5vZGU6IFsnc3JjJywgJ3Rlc3RzJywgJ3NjcmlwdHMnXS5zb3J0KCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0cycsICdzY3JpcHRzJywgJ2RiJywgJ2ludGVncmF0aW9ucycsICdtYWlsZXJzJ10uc29ydCgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNyY0RpcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ibGl0ejtcbiAgfVxuICByZXR1cm4gc3JjRGlyZWN0b3JpZXMubm9kZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHsgZ2xvYmJ5LCBnbG9iYnlTeW5jIH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgRXNsaW50RXh0ZW5zaW9uQmFzZSwgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgRXNsaW50VXRpbCB9IGZyb20gJy4uL3V0aWxzL2VzbGludFV0aWwuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0U3JjRGlycyB9IGZyb20gJy4uL3V0aWxzL3NyY0RpcmVjdG9yaWVzLmpzJztcbmltcG9ydCB7IEJMSVRaX1ZFUlNJT04sIE5FWFRfVkVSU0lPTiB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb25Db25zdGFudHMuanMnO1xuXG5jb25zdCBqc0NvbW1vbkRlcHMgPSBbXG4gICdlc2xpbnRAOC41Ny4wJyxcbiAgJ2VzbGludC1jb25maWctcHJldHRpZXInLFxuICAnZXNsaW50LXBsdWdpbi1pbXBvcnQnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbl07XG5cbmNvbnN0IHRzQ29tbW9uRGVwcyA9IFtcbiAgLi4uanNDb21tb25EZXBzLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4nLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlcicsXG4gICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLXR5cGVzY3JpcHQnLFxuXTtcblxuY29uc3QgcmVhY3RDb21tb25EZXBzID0gWydlc2xpbnQtcGx1Z2luLXJlYWN0JywgJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnXTtcblxuY29uc3QgZXNsaW50RGVwczogUmVjb3JkPEVzbGludEV4dGVuc2lvbkJhc2UsIHN0cmluZ1tdPiA9IHtcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLCAuLi5qc0NvbW1vbkRlcHMsIC4uLnJlYWN0Q29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JywgLi4udHNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctYmxpdHotbmV4dCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctYmxpdHotbmV4dCcsXG4gICAgJ2VzbGludC1jb25maWctbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICdlc2xpbnQtY29uZmlnLW5leHQnLFxuICAgIC4uLnRzQ29tbW9uRGVwcyxcbiAgICAuLi5yZWFjdENvbW1vbkRlcHMsXG4gIF0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzIHx8IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzIHx8IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgfHwge307XG5cbiAgYXdhaXQgcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaiBhcyBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz5cbiAgKTtcblxuICBpZiAoanNvbk9iai5uYW1lICE9PSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKSB7XG4gICAgLy8gRnJlc2ggcmVwbyBzdGlsbCByZXF1aXJlcyAneWFybiBpbnN0YWxsJ1xuICAgIGlmICghdmFsdWUuaW5jbHVkZXMoJ2dpdCBjbG9uZScpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoL3lhcm5cXHMqJiZcXHMqLywgJycpLnJlcGxhY2UoL3lhcm5cXHMqaW5zdGFsbFxccyomJlxccyovLCAnJyk7XG4gICAgfVxuICB9XG5cbiAganNvbk9iai5zY3JpcHRzID0gbWVyZ2UoanNvbk9iai5zY3JpcHRzLCBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnKSk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5O1xuICB9IGVsc2Uge1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSArPSBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuICAvLyBEZWFsIHdpdGggYnJlYWtpbmcgY2hhbmdlcyBpbiB5YXJuIGJlcnJ5IDQuMC4wLXJjLjQ5XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgaWYgKFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tYWxsJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXJlY3Vyc2l2ZScpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1zaW5jZScpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS13b3JrdHJlZScpXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcsICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCcpO1xuICB9XG5cbiAgbGV0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGRldkRlcGVuZGVuY2llcyA9IFsncHJldHRpZXInLCAnc29ydC1wYWNrYWdlLWpzb24nLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyddO1xuICBjb25zdCBwb2V0cnlEZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbGludC1zdGFnZWQnXTtcbiAgfSBlbHNlIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnbGludC1zdGFnZWQnKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydodXNreSddO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydwaW5zdCddO1xuICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPSAnbGVmdGhvb2sgaW5zdGFsbCB8fCB0cnVlJztcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsZWZ0aG9vaycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgaHVza3lcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdodXNreScpO1xuICAgICAgLy8gJ3x8IHRydWUnIGF2b2lkcyBlcnJvcnMgd2hlbiBodXNreSBpcyBub3QgaW5zdGFsbGVkLlxuICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPSAnaHVza3kgfHwgdHJ1ZSc7IC8vIGZvciBub24teWFybiBwYWNrYWdlIG1hbmFnZXJzLlxuICAgICAganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID0gJ2h1c2t5IHx8IHRydWUnOyAvLyBmb3IgeWFybi5cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvIHx8IGNvbmZpZy5pc1JlZmVycmVkQnlPdGhlclJlcG8pIHtcbiAgICAgICAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gICAgICAgIC8vIGh0dHBzOi8vdHlwaWNvZGUuZ2l0aHViLmlvL2h1c2t5LyMvP2lkPWluc3RhbGwtMVxuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncGluc3QnKTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhY2sgPSAncGluc3QgLS1kaXNhYmxlJztcbiAgICAgICAganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrID0gJ3BpbnN0IC0tZW5hYmxlJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBjb25zdCB2ZXJzaW9uID1cbiAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICAgICAgPyAvLyBUT0RPOiByZW1vdmUgdGhlIHZlcnNpb24gc3BlY2lmaWNhdGlvbiBhZnRlciBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlIHN1cHBvcnRzIHZlcnNpb24gNytcbiAgICAgICAgICAgICdANi4xLjAnXG4gICAgICAgICAgOiAnJztcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGBjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMke3ZlcnNpb259YCk7XG4gICAgICBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1sncGxheXdyaWdodCddO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydwbGF5d3JpZ2h0J107XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby5cbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKVxuICAgICAgICA/IG1lcmdlLmFsbChbanNvbk9iai53b3Jrc3BhY2VzLCBbJ3BhY2thZ2VzLyonXV0sIHtcbiAgICAgICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFsncGFja2FnZXMvKiddO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGdsb2JieVN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgZ2l0aWdub3JlOiB0cnVlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy53YiB8fCBjb25maWcuaXNCdW4pIHtcbiAgICBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoL3diXFxzK2RiLywgJ3diIHByaXNtYScpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzXG4gICkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAYmlvbWVqcy9iaW9tZScsICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyk7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludCddO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtaWNyb21hdGNoJ107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2VzbGludEA4LjU3LjAnLCAnbWljcm9tYXRjaCcpO1xuICAgICAgLy8gVE9ETzogbm90IG5lZWRlZCBhbnltb3JlP1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlcicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgndHlwZXNjcmlwdCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5lc2xpbnRCYXNlKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4uZXNsaW50RGVwc1tjb25maWcuZXNsaW50QmFzZV0pO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIH1cblxuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIEJlY2F1c2UgYFwicmVzb2x1dGlvbnNcIjogeyBcIm5wbS9jaGFsa1wiOiBcIl40LjEuMlwiIH0sYCBjYXVzZXMgXCJJbnZhbGlkIG5wbSB0b2tlblwiXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5jbGVhbnVwID0ganNvbk9iai5zY3JpcHRzLmNsZWFudXA/LnJlcGxhY2UoJyAmJiB5YXJuIGxpbnQtZml4JywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddICs9IEVzbGludFV0aWwuZ2V0TGludEZpeFN1ZmZpeChjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBmbHV0dGVyIGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgKz0gYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZ2xvYmJ5KCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGdpdGlnbm9yZTogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBbJ3Rlc3QtZml4dHVyZXMnXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoL1svXFxcXF0vKTtcbiAgICAgICAgaWYgKHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGBwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiBwb2V0cnkgcnVuIGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ICs9IGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICAgIHBvZXRyeURldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnJlcG9zaXRvcnkpIHtcbiAgICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5O1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICBgYmxpdHpAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgQGJsaXR6anMvYXV0aEAke0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBAYmxpdHpqcy9uZXh0QCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYEBibGl0empzL3JwY0Ake0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBuZXh0QCR7TkVYVF9WRVJTSU9OfWBcbiAgICApO1xuICAgIC8vIFByZWZlciBlc2xpbnQtY29uZmlnLW5leHQncyBkZXBlbmRlbmNpZXNcbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkKSA9PiBkICE9PSAnZXNsaW50LXBsdWdpbi1yZWFjdCcgJiYgZCAhPT0gJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnKTtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAvLyBUbyBwcmV2ZW50IG11bHRpcGxlIHZlcnNpb25zIG9mIEB0eXBlcy9yZWFjdCBmcm9tIG1peGluZy5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9yZWFjdCddO1xuICB9XG5cbiAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llcz8ucHJldHRpZXIpIHtcbiAgICAvLyBCZWNhdXNlIEB0eXBlcy9wcmV0dGllciBibG9ja3MgcHJldHRpZXIgZXhlY3V0aW9uLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzO1xuICB9XG5cbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICBsZXQgbmV3SnNvblRleHQgPSBKU09OLnN0cmluZ2lmeShqc29uT2JqKTtcbiAgbmV3SnNvblRleHQgPSBhd2FpdCBmaXhTY3JpcHROYW1lcyhqc29uT2JqLnNjcmlwdHMsIG5ld0pzb25UZXh0LCBjb25maWcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0pzb25UZXh0KTtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgLy8gV2UgY2Fubm90IGFkZCBkZXBlbmRlbmNpZXMgd2hpY2ggYXJlIGFscmVhZHkgaW5jbHVkZWQgaW4gZGV2RGVwZW5kZW5jaWVzLlxuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGV2RGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRlcGVuZGVuY2llcy5cbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctRCcsIC4uLm5ldyBTZXQoZGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gICAgaWYgKHBvZXRyeURldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4ubmV3IFNldChwb2V0cnlEZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBtaWdyYXRpb24gY29kZSBpbiBmdXR1cmVcbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0c2xpYiddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LXBsdWdpbi1wcmV0dGllciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xlcm5hJ107XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3BpbnN0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydwcmV0dGllciddO1xuICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICBmb3IgKGNvbnN0IGRlcHMgb2YgT2JqZWN0LnZhbHVlcyhlc2xpbnREZXBzKSkge1xuICAgICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKCdsZXJuYS5qc29uJywgeyBmb3JjZTogdHJ1ZSB9KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgY2xlYW51cDogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0JyxcbiAgICAgIGZvcm1hdDogYGJ1biAtLWJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICAgIGxpbnQ6IGBidW4gLS1idW4gd2IgbGludGAsXG4gICAgICAnbGludC1maXgnOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXgnLFxuICAgICAgdGVzdDogJ2J1biB3YiB0ZXN0JyxcbiAgICAgIHR5cGVjaGVjazogJ2J1biAtLWJ1biB3YiB0eXBlY2hlY2snLFxuICAgIH07XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9IGVsc2Uge1xuICAgIGxldCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgY2xlYW51cDogJ3lhcm4gZm9ybWF0ICYmIHlhcm4gbGludC1maXgnLFxuICAgICAgZm9ybWF0OiBgc29ydC1wYWNrYWdlLWpzb24gJiYgeWFybiBwcmV0dGlmeWAsXG4gICAgICBsaW50OiBgZXNsaW50IC0tY29sb3IgXCIuL3ske2dldFNyY0RpcnMoY29uZmlnKX19LyoqLyoueyR7ZXh0ZW5zaW9ucy5lc2xpbnQuam9pbignLCcpfX1cImAsXG4gICAgICAnbGludC1maXgnOiAneWFybiBsaW50IC0tZml4JyxcbiAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX1cIiBcIiEqKi90ZXN0LWZpeHR1cmVzLyoqXCJgLFxuICAgICAgdHlwZWNoZWNrOiAndHNjIC0tbm9FbWl0IC0tUHJldHR5JyxcbiAgICB9O1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBjb25zdCBvbGRUZXN0ID0gc2NyaXB0cy50ZXN0O1xuICAgICAgc2NyaXB0cyA9IG1lcmdlKFxuICAgICAgICB7IC4uLnNjcmlwdHMgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnkgJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oXG4gICAgICAgICAgICAnLCdcbiAgICAgICAgICApfX1cIiBcIiEqKi9wYWNrYWdlcy8qKlwiIFwiISoqL3Rlc3QtZml4dHVyZXMvKipcImAsXG4gICAgICAgICAgLy8gQ0k9MSBwcmV2ZW50cyB2aXRlc3QgZnJvbSBlbmFibGluZyB3YXRjaC5cbiAgICAgICAgICAvLyBGT1JDRV9DT0xPUj0zIG1ha2Ugd2IgZW5hYmxlIGNvbG9yIG91dHB1dC5cbiAgICAgICAgICB0ZXN0OiAnQ0k9MSBGT1JDRV9DT0xPUj0zIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tdmVyYm9zZSBydW4gdGVzdCcsXG4gICAgICAgICAgdHlwZWNoZWNrOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIHR5cGVjaGVjaycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAob2xkVGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9IHNjcmlwdHMudHlwZWNoZWNrID8gYCR7c2NyaXB0cy50eXBlY2hlY2t9ICYmIGAgOiAnJztcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICdweXJpZ2h0JztcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gJ3diIHR5cGVjaGVjayc7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeFNjcmlwdE5hbWVzKFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuZXdKc29uVGV4dDogc3RyaW5nLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG9sZEFuZE5ld1NjcmlwdE5hbWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5XSBvZiBPYmplY3Qua2V5cyhzY3JpcHRzKSkge1xuICAgIGlmIChrZXlbMF0gIT09ICc6JyAmJiBrZXkuaW5jbHVkZXMoJzonKSkge1xuICAgICAgb2xkQW5kTmV3U2NyaXB0TmFtZXMucHVzaChba2V5LCBrZXkucmVwbGFjZUFsbCgnOicsICctJyldKTtcbiAgICB9XG4gIH1cbiAgaWYgKG9sZEFuZE5ld1NjcmlwdE5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ld0pzb25UZXh0O1xuXG4gIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgbmV3SnNvblRleHQgPSBuZXdKc29uVGV4dC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICB9XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZ2xvYmJ5KFsnKiovKi57bWQsY2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JywgJyoqL0RvY2tlcmZpbGUnXSwge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGdpdGlnbm9yZTogdHJ1ZSxcbiAgfSk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IG9sZENvbnRlbnQ7XG4gICAgICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBvbGRBbmROZXdTY3JpcHROYW1lcykge1xuICAgICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG5ld0NvbnRlbnQgIT09IG9sZENvbnRlbnQpIHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIHJldHVybiBuZXdKc29uVGV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmo6IFBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKSwgLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpXSk7XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvYXV0aCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdhdXRoJyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9hdXRoJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvYXV0aC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0BkaXNjb3JkLWJvdC9zaGFyZWQnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdkaXNjb3JkLWJvdCcpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAZGlzY29yZC1ib3Qvc2hhcmVkJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvZGlzY29yZC1ib3QuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG5cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2NvZGUtYW5hbHl6ZXInKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXSA9XG4gICAgICBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvY29kZS1hbmFseXplci5naXQjd29ya3NwYWNlPUBjb2RlLWFuYWx5emVyL2NsaWVudCZjb21taXQ9JHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnanVkZ2UnKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvanVkZ2UuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnbGxtLXByb3h5Jyk7XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9sbG0tcHJveHkuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwcmVDb21taXQ6ICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL2xpbnQtc3RhZ2VkJyxcbiAgcHJlUHVzaDogYHlhcm4gdHlwZWNoZWNrYCxcbiAgcHJlUHVzaEZvckxhYjogYFxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbnlhcm4gdHlwZWNoZWNrXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGpzb25UZXh0KTtcbiAgcGFja2FnZUpzb24uc2NyaXB0cyB8fD0ge307XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwb3N0aW5zdGFsbCddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdHB1Ymxpc2gnXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3ByZXBhcmUnXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3ByZXB1Ymxpc2hPbmx5J107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwYWNrJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwb3N0cGFjayddO1xuXG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3knKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYWNrYWdlSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCB1bmRlZmluZWQsIDIpKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgc3Bhd25TeW5jKCdnaXQnLCBbJ2NvbmZpZycsICctLXVuc2V0JywgJ2NvcmUuaG9va3NQYXRoJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICdodXNreS1pbml0JywgJy0teWFybjInXSwgY29uZmlnLmRpclBhdGgpO1xuXG4gIGNvbnN0IHByZUNvbW1pdEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwcmUtY29tbWl0Jyk7XG5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy53cml0ZUZpbGUocHJlQ29tbWl0RmlsZVBhdGgsIHNjcmlwdHMucHJlQ29tbWl0ICsgJ1xcbicpKTtcblxuICBjb25zdCB7IHR5cGVjaGVjayB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZyk7XG4gIGlmICh0eXBlY2hlY2spIHtcbiAgICBsZXQgcHJlUHVzaCA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykgPyBzY3JpcHRzLnByZVB1c2hGb3JMYWIgOiBzY3JpcHRzLnByZVB1c2g7XG4gICAgcHJlUHVzaCA9IHByZVB1c2gucmVwbGFjZShcbiAgICAgICd5YXJuIHR5cGVjaGVjaycsXG4gICAgICB0eXBlY2hlY2tcbiAgICAgICAgLnJlcGxhY2UoJ3RzYyAnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi90c2MgJylcbiAgICAgICAgLnJlcGxhY2UoJ3diICcsICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL3diICcpXG4gICAgICAgIC8vIHB5cmlnaHQgaGFzIG5vIGFyZ3VtZW50c1xuICAgICAgICAucmVwbGFjZSgncHlyaWdodCcsICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL3B5cmlnaHQnKVxuICAgICk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwcmUtcHVzaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgICAgbW9kZTogMG83NTUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy52ZXJzaW9uc1RleHQpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImF3ayAne3ByaW50IFxcJDF9JyAudG9vbC12ZXJzaW9ucyB8IHhhcmdzIC1Je30gYXNkZiBwbHVnaW4gYWRkIHt9XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgcGx1Z2luIHVwZGF0ZSAtLWFsbFwiYFxuICAgICk7XG4gIH1cbiAgLy8gUHl0aG9u44GM44Gq44GE44Go44Kk44Oz44K544OI44O844Or44Gn44GN44Gq44GE5Yem55CG57O744GM5a2Y5Zyo44GZ44KL44Gf44KB44CB5by35Yi255qE44Gr5pyA5Yid44Gr44Kk44Oz44K544OI44O844Or44GZ44KL44CCXG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0Py5pbmNsdWRlcygncHl0aG9uICcpKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBpbnN0YWxsIHB5dGhvblwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy52ZXJzaW9uc1RleHQpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIGluc3RhbGxcImApO1xuICB9XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBpbnN0YWxsJyA6ICd5YXJuJztcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3J5ID0gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQgPyAnICYmIHJtIC1SZiAubmV4dCcgOiAnJztcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChgcnVuX2lmX2NoYW5nZWQgXCJwYWNrYWdlXFxcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBnZW5lcmF0ZVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBjb2RlZ2VuXCJgXG4gICAgKTtcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cblxuY29uc3QgcHJldHRpZXJDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnLCAnUHJldHRpZXInLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5jb25zdCBiaW9tZUNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdidW4nLCAnLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vYmlvbWUgY2hlY2sgLS1maXggLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tc2tpcC1lcnJvcnMnLCAnQmlvbWUnLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgKGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbiAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zR2VtZmlsZSAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc0dvTW9kICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWcuaXNCdW4gPyBiaW9tZUNvbnRlbnQgOiBwcmV0dGllckNvbnRlbnQpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMgfSBmcm9tICcuL2h1c2t5cmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmNvbnN0IG5ld1NldHRpbmdzID0ge1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAncHJlcGFyZS5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGNvbW1hbmRzOiB7XG4gICAgICBjbGVhbnVwOiB7XG4gICAgICAgIGdsb2I6ICcqLntjanMsY3NzLGN0cyxodG0saHRtbCxqcyxqc29uLGpzb241LGpzb25jLGpzeCxtZCxtanMsbXRzLHNjc3MsdHMsdHN4LHZ1ZSx5YW1sLHltbH0nLFxuICAgICAgICBydW46ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCB7c3RhZ2VkX2ZpbGVzfSAmJiBnaXQgYWRkIHtzdGFnZWRfZmlsZXN9JyxcbiAgICAgIH0sXG4gICAgICAnY2hlY2stbWlncmF0aW9ucyc6IHtcbiAgICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgICBydW46IGBcbmlmIGdyZXAgLXEgJ1dhcm5pbmdzOicge3N0YWdlZF9maWxlc307IHRoZW5cbiAgZWNobyBcIk1pZ3JhdGlvbiBTUUwgZmlsZXMgKHtzdGFnZWRfZmlsZXN9KSBjb250YWluIHdhcm5pbmdzISBQbGVhc2Ugc29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXCJcbiAgZXhpdCAxXG5maVxuYC50cmltKCksXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAnY2hlY2suc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcHJlUHVzaDogYGJ1biAtLWJ1biBub2RlX21vZHVsZXMvLmJpbi93YiB0eXBlY2hlY2tgLFxuICBwcmVQdXNoRm9yTGFiOiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuYnVuIC0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL3diIHR5cGVjaGVja1xuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGVmdGhvb2snKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLFxuICAgICAgeWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7XG4gICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcblxuICBjb25zdCB7IHR5cGVjaGVjayB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZyk7XG4gIGlmICh0eXBlY2hlY2spIHtcbiAgICBjb25zdCBwcmVQdXNoID0gY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSA/IHNjcmlwdHMucHJlUHVzaEZvckxhYiA6IHNjcmlwdHMucHJlUHVzaDtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgICBtb2RlOiAwbzc1NSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRTcmNEaXJzIH0gZnJvbSAnLi4vdXRpbHMvc3JjRGlyZWN0b3JpZXMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmNqcycpO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYWNrYWdlUHJlZml4ID0gY29uZmlnLmlzUm9vdCA/ICdub2RlIG5vZGVfbW9kdWxlcy8uYmluLycgOiAnbm9kZSAuLi8uLi9ub2RlX21vZHVsZXMvLmJpbi8nO1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgY29uc3QgZXNsaW50ID0gYFxuICAnJHtnZXRFc2xpbnRLZXkoY29uZmlnKX0nOiBbJHtKU09OLnN0cmluZ2lmeShcbiAgICBgJHtwYWNrYWdlUHJlZml4fWVzbGludCAtLWZpeCR7RXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyl9YFxuICApfSwgJyR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnXSxgO1xuICAgIGxpbmVzLnB1c2goZXNsaW50KTtcbiAgfVxuICBjb25zdCBwYWNrYWdlc0ZpbHRlciA9IGNvbmZpZy5pc1Jvb3QgPyBcIiAmJiAhZmlsZS5pbmNsdWRlcygnL3BhY2thZ2VzLycpXCIgOiAnJztcbiAgbGluZXMucHVzaChgXG4gICcuLyoqLyoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fSc6IGZpbGVzID0+IHtcbiAgICBsZXQgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKSR7cGFja2FnZXNGaWx0ZXJ9KTske2dldEVzbGludEZpbHRlckZvclByZXR0aWVyKGNvbmZpZyl9XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgY29tbWFuZHMgPSBbXFxgJHtwYWNrYWdlUHJlZml4fXByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSBcXCR7ZmlsdGVyZWRGaWxlcy5qb2luKCcgJyl9XFxgXTtcbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5zb21lKGZpbGUgPT4gZmlsZS5lbmRzV2l0aCgncGFja2FnZS5qc29uJykpKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKCcke3BhY2thZ2VQcmVmaXh9c29ydC1wYWNrYWdlLWpzb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1hbmRzO1xuICB9LFxuICAnLi8qKi9taWdyYXRpb24uc3FsJzogKGZpbGVzKSA9PiB7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04Jyk7XG4gICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoJ1dhcm5pbmdzOicpKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcXGAhISEgTWlncmF0aW9uIFNRTCBmaWxlIChcXCR7cGF0aC5yZWxhdGl2ZSgnJywgZmlsZSl9KSBjb250YWlucyB3YXJuaW5ncyAhISEgU29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXFxgLFxuICAgICAgXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufSxgKTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgIGxpbmVzLnB1c2goYFxuICAnLi97bGliLHRlc3QsdGVzdF9kcml2ZXJ9LyoqLyouZGFydCc6IGZpbGVzID0+IHtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gIWZpbGUuaW5jbHVkZXMoJ2dlbmVyYXRlZCcpKVxuICAgICAgLmZpbHRlcihmaWxlID0+ICFmaWxlLmVuZHNXaXRoKCcuZnJlZXplZC5kYXJ0JykgJiYgIWZpbGUuZW5kc1dpdGgoJy5nLmRhcnQnKSk7XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcXGBmbHV0dGVyIGZvcm1hdCBcXCR7ZmlsdGVyZWRGaWxlcy5qb2luKCcgJyl9XFxgXTtcbiAgfSxgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4vKiovKi5weSc6IFtcbiAgICAncG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMnLFxuICAgICdwb2V0cnkgcnVuIGJsYWNrJyxcbiAgICAncG9ldHJ5IHJ1biBmbGFrZTgnXG4gIF0sYCk7XG4gIH1cblxuICBjb25zdCBuZXdDb250ZW50ID0gYGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG4ke2NvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0ID8gXCJjb25zdCBtaWNyb21hdGNoID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xcblwiIDogJyd9XG5tb2R1bGUuZXhwb3J0cyA9IHske2xpbmVzLmpvaW4oJycpfVxufTtcbmA7XG5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG59XG5cbmZ1bmN0aW9uIGdldEVzbGludEtleShjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBkaXJzID0gZ2V0U3JjRGlycyhjb25maWcpO1xuICByZXR1cm4gYC4veyR7ZGlycy5qb2luKCcsJyl9fS8qKi8qLnske2V4dGVuc2lvbnMuZXNsaW50LmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0XG4gICAgPyBgXFxuXG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKSk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IG1pY3JvbWF0Y2gubm90KGZpbHRlcmVkRmlsZXMsICcke2dldEVzbGludEtleShjb25maWcpfScpO1xuICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZXNvbHZlKGZpbGUpKTtgXG4gICAgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBSZXBsYWNlIHRoZSBKU09OIG9iamVjdCBmcm9tIHRoZSBmaWxlXG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvPVxccyp7KFtcXFNcXHNdKil9Oy8sIChfLCBzZXR0aW5nc1RleHQpID0+IHtcbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCdlc2xpbnQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICdlc2xpbnQ6IHsgaWdub3JlRHVyaW5nQnVpbGRzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCd0eXBlc2NyaXB0OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gYD0geyR7c2V0dGluZ3NUZXh0fX07YDtcbiAgICB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IHVua25vd24gPSBjbG9uZURlZXAoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnk/LmluZGV4T2YoJzonKSArIDEpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLnJlYWRkaXJTeW5jKGAke2NvbmZpZy5kaXJQYXRofS8uZ2l0aHViL3dvcmtmbG93c2ApO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgYmFkZ2VOYW1lID0gZmlsZU5hbWU7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWVbMF0udG9VcHBlckNhc2UoKSArIGJhZGdlTmFtZS5zbGljZSgxLCBiYWRnZU5hbWUuaW5kZXhPZignLicpKTtcbiAgICAgIGJhZGdlTmFtZSA9IGJhZGdlTmFtZS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICAgIGNvbnN0IGJhZGdlID0gYFshWyR7YmFkZ2VOYW1lfV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0vYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0pYDtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC5naXRodWIvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBiYWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOaXouOBq2JhZGdl44GM44GC44KL5aC05ZCI44Gv5YmK6ZmkXG4gIHJlYWRtZSA9IHJlYWRtZS5yZXBsYWNlKGJhZGdlLCAnJykucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFkbWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVhZG1lW2kgLSAxXSA9PT0gJ1xcbicgJiYgcmVhZG1lW2ldID09PSAnXFxuJykge1xuICAgICAgY29uc3QgYmVmb3JlID0gcmVhZG1lLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgIGxldCBhZnRlciA9IHJlYWRtZS5zbGljZShpICsgMSk7XG4gICAgICBpZiAoIWFmdGVyLnN0YXJ0c1dpdGgoJ1snKSAmJiAhYWZ0ZXIuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIGFmdGVyID0gYFxcbiR7YWZ0ZXJ9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtiZWZvcmV9JHtiYWRnZX1cXG4ke2FmdGVyfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHtyZWFkbWV9XFxuJHtiYWRnZX1cXG5gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpO1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncz8ucGx1Z2lucyB8fCBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IEFycmF5LmlzQXJyYXkocGx1Z2luc1tpXSkgPyBwbHVnaW5zW2ldWzBdIDogcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChBcnJheS5pc0FycmF5KHBsdWdpbnNbaV0pICYmIHBsdWdpbnNbaV1bMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uNSddLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IHR5cGVvZiBqc29uT2JqICYgeyBwYWNrYWdlUnVsZXM6IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W10gfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChqc29uT2JqKSBhcyBTZXR0aW5ncztcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3Jlbm92YXRlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhgJHtmaWxlUGF0aH01YCkpIHtcbiAgICAgIC8vIFNpbmNlIGl0IGlzIGRpZmZpY3VsdCBmb3IgcGFyc2luZyByZW5vdmF0ZS5qc29uNSwgd2UgZG8gbm90aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbmV3U2V0dGluZ3MuZXh0ZW5kcy5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gJ0B3aWxsYm9vc3RlcicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW10gfSkgPT5cbiAgICAgICAgICBydWxlLm1hdGNoUGFja2FnZU5hbWVzLmluY2x1ZGVzKCduZXh0JylcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5wdXNoKHsgbWF0Y2hQYWNrYWdlTmFtZXM6IFsnbmV4dCddLCBlbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRlcGVuZGFib3QnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZW5vdmF0ZXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBtb3ZlVG9Cb3R0b208VE9iaiBleHRlbmRzIFJlY29yZDxUS2V5LCB1bmtub3duPiwgVEtleSBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4oXG4gIG9iajogVE9iaixcbiAga2V5OiBUS2V5XG4pOiBUT2JqIHtcbiAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS5zb3J0KChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Yga2V5QW5kVmFsdWVzKSB7XG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIC8vIGlmIHZhbHVlIGlzIGFuIG9iamVjdCwgc29ydCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHNvcnRLZXlzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcbmltcG9ydCB0eXBlIHsgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHJvb3RKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICB0YXJnZXQ6ICdFUzIwMjInLCAvLyBiZWNhdXNlIGRlY29yYXRvcnMgc2hvdWxkIGJlIHRyYW5zcGlsZWQgdG8gRVMyMDIyIG9uIE5vZGUuanNcbiAgICBtb2R1bGU6ICdFU05leHQnLFxuICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlJyxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgc2tpcExpYkNoZWNrOiB0cnVlLCAvLyBiZWNhdXNlIGxpYnJhcmllcyBtYXkgaGF2ZSBicm9rZW4gdHlwZXNcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICAgIHR5cGVSb290czogWycuL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgaW5jbHVkZTogW1xuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3RzLyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgdGFyZ2V0OiAnRVMyMDIyJywgLy8gYmVjYXVzZSBkZWNvcmF0b3JzIHNob3VsZCBiZSB0cmFuc3BpbGVkIHRvIEVTMjAyMiBvbiBOb2RlLmpzXG4gICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZScsXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgICB0eXBlUm9vdHM6IFsnLi4vLi4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuLi8uLi9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgaW5jbHVkZTogWydzcmMvKiovKicsICd0ZXN0cy8qKi8qJywgJ3NjcmlwdHMvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHJldHVybjtcblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChjb25maWcuaXNSb290ID8gcm9vdEpzb25PYmogOiBzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgbW9kdWxlOiAnTm9kZU5leHQnLFxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZU5leHQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBpZiAob2xkU2V0dGluZ3MuZXh0ZW5kcyA9PT0gJy4vbm9kZV9tb2R1bGVzL0B3aWxsYm9vc3Rlci90c2NvbmZpZy90c2NvbmZpZy5qc29uJykge1xuICAgICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IG1vZGlmeSBcInRhcmdldFwiLCBcIm1vZHVsZVwiIGFuZCBcIm1vZHVsZVJlc29sdXRpb25cIi5cbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnRhcmdldDtcbiAgICAgIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5tb2R1bGU7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZVJlc29sdXRpb247XG4gICAgICB9XG4gICAgICBpZiAob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgfVxuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fJylcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpO1xuICAgICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzID8/IHt9KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU6IHN0cmluZztcbiAgb246IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBqb2JzOiB7IFtrZXk6IHN0cmluZ106IEpvYiB9O1xufVxuXG5pbnRlcmZhY2UgQ29uY3VycmVuY3kge1xuICBncm91cDogc3RyaW5nO1xuICAnY2FuY2VsLWluLXByb2dyZXNzJzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgaXNzdWVzPzogVHlwZXM7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0O1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXM7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgdXNlczogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddLFxuICAgICAgfSxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICAgICdwYXRocy1pZ25vcmUnOiBbJyoqLm1kJywgJyoqL2RvY3MvKionXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICB3YmZ5OiB7XG4gICAgbmFtZTogJ1dpbGxib29zdGVyaWZ5JyxcbiAgICBvbjoge1xuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB3YmZ5OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvd2JmeS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICd3YmZ5LW1lcmdlJzoge1xuICAgIG5hbWU6ICdNZXJnZSB3YmZ5JyxcbiAgICBvbjoge1xuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnd2JmeS1tZXJnZSc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy93YmZ5LW1lcmdlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ25vdGlmeS1yZWFkeSc6IHtcbiAgICBuYW1lOiAnTm90aWZ5IHJlYWR5JyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnbm90aWZ5LXJlYWR5Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL25vdGlmeS1yZWFkeS55bWxAbWFpbicsXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBESVNDT1JEX1dFQkhPT0tfVVJMOiAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVBRFkgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICBuYW1lOiAnQWRkIGNsb3NlIGNvbW1lbnQnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvY2xvc2UtY29tbWVudC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdhZGQtaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICBuYW1lOiAnQWRkIGlzc3VlIHRvIEdpdEh1YiBwcm9qZWN0JyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnYWRkLWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvYWRkLWlzc3VlLXRvLXByb2plY3QueW1sQG1haW4nLFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0hfUFJPSkVDVF9VUkw6ICcke3sgc2VjcmV0cy5HSF9QUk9KRUNUX1VSTCB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICBuYW1lOiAnQWRkIHJlYWR5IGlzc3VlIHRvIEdpdEh1YiBwcm9qZWN0JyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvYWRkLWlzc3VlLXRvLXByb2plY3QueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgbGFiZWxlZDogJ3JlYWR5IDpyb2NrZXQ6JyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIEdIX1BST0pFQ1RfVVJMOiAnaHR0cHM6Ly9naXRodWIuY29tL29yZ3MvV2lsbEJvb3N0ZXJMYWIvcHJvamVjdHMvNScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICd3YmZ5LnltbCcsXG4gICAgICAnd2JmeS1tZXJnZS55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgJ2FkZC1pc3N1ZS10by1wcm9qZWN0LnltbCcsXG4gICAgICAuLi5lbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKSxcbiAgICBdKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ3JlbGVhc2UueW1sJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmlzUHVibGljUmVwbyB8fCByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdC55bWwnKTtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgnbm90aWZ5LXJlYWR5LnltbCcpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2FkZC1mb2N1c2VkLWlzc3VlLXRvLXByb2plY3QueW1sJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChjb25maWc6IFBhY2thZ2VDb25maWcsIHdvcmtmbG93c1BhdGg6IHN0cmluZywga2luZDogS25vd25LaW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcCh3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA/PyB7fSkgYXMgV29ya2Zsb3c7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGAke2tpbmR9LnltbGApO1xuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBpZiAobmV3U2V0dGluZ3Muam9icykge1xuICAgICAgbW92ZVRvQm90dG9tKG5ld1NldHRpbmdzLCAnam9icycpO1xuICAgIH1cbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0PHN0cmluZz4oWy4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSksICcqKi5tZCcsICcqKi9kb2NzLyoqJ10pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcz8uKCcvcmV1c2FibGUtd29ya2Zsb3dzLycpKSByZXR1cm47XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICB9XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5Jzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uKSBzZXRTY2hlZHVsZShuZXdTZXR0aW5ncywgMjAsIDI0KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5LW1lcmdlJzoge1xuICAgICAgc2V0U2NoZWR1bGUobmV3U2V0dGluZ3MsIDEsIDQpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3MpO1xuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzZW1hbnRpYy1yZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jIHx8ICFuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKCFwYXJhbXMpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoIHx8PSB7fTtcbiAgam9iLnNlY3JldHMgfHw9IHt9O1xuXG4gIGlmIChcbiAgICBraW5kID09PSAndGVzdCcgfHxcbiAgICBraW5kID09PSAncmVsZWFzZScgfHxcbiAgICBraW5kID09PSAnd2JmeScgfHxcbiAgICBraW5kID09PSAnd2JmeS1tZXJnZScgfHxcbiAgICBraW5kID09PSAnYWRkLWlzc3VlLXRvLXByb2plY3QnIHx8XG4gICAga2luZCA9PT0gJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0J1xuICApIHtcbiAgICBqb2Iuc2VjcmV0c1snR0hfVE9LRU4nXSA9IGNvbmZpZy5pc1B1YmxpY1JlcG8gPyAnJHt7IHNlY3JldHMuUFVCTElDX0dIX0JPVF9QQVQgfX0nIDogJyR7eyBzZWNyZXRzLkdIX0JPVF9QQVQgfX0nO1xuICB9XG4gIGlmIChjb25maWcucmVsZWFzZS5ucG0gJiYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kID09PSAndGVzdCcpKSB7XG4gICAgam9iLnNlY3JldHNbJ05QTV9UT0tFTiddID0gJyR7eyBzZWNyZXRzLk5QTV9UT0tFTiB9fSc7XG4gIH1cbiAgaWYgKGpvYi5zZWNyZXRzWydGSVJFQkFTRV9UT0tFTiddKSB7XG4gICAgam9iLnNlY3JldHNbJ0dDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UnXSA9ICcke3sgc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIH19JztcbiAgICBkZWxldGUgam9iLnNlY3JldHNbJ0ZJUkVCQVNFX1RPS0VOJ107XG4gIH1cbiAgaWYgKFxuICAgIChqb2Iuc2VjcmV0c1snRElTQ09SRF9XRUJIT09LX1VSTCddICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkpIHx8XG4gICAgKGpvYi53aXRoLnNlcnZlcl91cmwgJiYga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSlcbiAgKSB7XG4gICAgam9iLnNlY3JldHNbJ0RJU0NPUkRfV0VCSE9PS19VUkwnXSA9ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUxFQVNFIH19JztcbiAgfVxuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBqb2Iud2l0aD8uc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IHBhcmFtcy50b1N0cmluZygpLnJlcGxhY2UoJ3N5bmMgJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcy5yZXBsYWNlKCdXaWxsQm9vc3RlckxhYi8nLCAnV2lsbEJvb3N0ZXIvJyk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXMucmVwbGFjZSgnV2lsbEJvb3N0ZXIvJywgJ1dpbGxCb29zdGVyTGFiLycpO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHJlZHVuZGFudCBwYXJhbWV0ZXJzXG4gIGlmIChqb2Iud2l0aFsnZG90X2Vudl9wYXRoJ10gPT09ICcuZW52Jykge1xuICAgIGRlbGV0ZSBqb2Iud2l0aFsnZG90X2Vudl9wYXRoJ107XG4gIH1cbiAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgcGFyYW1ldGVyc1xuICBtaWdyYXRlSm9iKGpvYik7XG5cbiAgLy8gRG9uJ3QgdXNlIGBmbHkgZGVwbG95IC0tanNvbmAgc2luY2UgaXQgY2F1c2VzIGFuIGVycm9yXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmIGpvYi5zZWNyZXRzWydGTFlfQVBJX1RPS0VOJ10gJiYgam9iLndpdGhbJ2RlcGxveV9jb21tYW5kJ10pIHtcbiAgICBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXSA9IGpvYi53aXRoWydkZXBsb3lfY29tbWFuZCddLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzKy0tanNvbi8sICcnKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc0RvY2tlcmZpbGUpIHtcbiAgICBpZiAoam9iLndpdGhbJ2NpX3NpemUnXSAhPT0gJ2V4dHJhLWxhcmdlJyAmJiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSB8fCBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSkpIHtcbiAgICAgIGpvYi53aXRoWydjaV9zaXplJ10gPSAnbGFyZ2UnO1xuICAgIH1cbiAgICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgICAgam9iLndpdGhbJ2NwdV9hcmNoJ10gPSAnWDY0JztcbiAgICB9XG4gIH1cbiAgLy8gQmVjYXVzZSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5wcml2YXRlIGlzIGFsd2F5cyB0cnVlIGlmIGpvYiBpcyBzY2hlZHVsZWRcbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kID09PSAndGVzdCcgfHwga2luZCA9PT0gJ3diZnknIHx8IGtpbmQgPT09ICd3YmZ5LW1lcmdlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIGpvYi53aXRoWydnaXRodWJfaG9zdGVkX3J1bm5lciddID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoWydnaXRodWJfaG9zdGVkX3J1bm5lciddO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoam9iLnNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAvLyBNb3ZlIHNlY3JldHMgcHJvcCBhZnRlciB3aXRoIHByb3BcbiAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoam9iLnNlY3JldHMpO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldFNjaGVkdWxlKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgaW5jbHVzaXZlTWluSG91ckpzdDogbnVtYmVyLCBleGNsdXNpdmVNYXhIb3VySnN0OiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgW21pbnV0ZVV0YywgaG91clV0Y10gPSAoKG5ld1NldHRpbmdzLm9uLnNjaGVkdWxlPy5bMF0/LmNyb24gYXMgc3RyaW5nKSA/PyAnJykuc3BsaXQoJyAnKS5tYXAoTnVtYmVyKTtcbiAgaWYgKG1pbnV0ZVV0YyAhPT0gMCAmJiBOdW1iZXIuaXNJbnRlZ2VyKGhvdXJVdGMpKSB7XG4gICAgY29uc3QgaG91ckpzdCA9IChob3VyVXRjICsgOSkgJSAyNDtcbiAgICBjb25zdCBpblJhbmdlID1cbiAgICAgIGluY2x1c2l2ZU1pbkhvdXJKc3QgPCBleGNsdXNpdmVNYXhIb3VySnN0XG4gICAgICAgID8gaW5jbHVzaXZlTWluSG91ckpzdCA8PSBob3VySnN0ICYmIGhvdXJKc3QgPCBleGNsdXNpdmVNYXhIb3VySnN0XG4gICAgICAgIDogaW5jbHVzaXZlTWluSG91ckpzdCA8PSBob3VySnN0IHx8IGhvdXJKc3QgPCBleGNsdXNpdmVNYXhIb3VySnN0O1xuICAgIGlmIChpblJhbmdlKSByZXR1cm47XG4gIH1cblxuICBjb25zdCBtaW5Kc3QgPSAxICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNTkpO1xuICBjb25zdCBob3VySnN0ID0gaW5jbHVzaXZlTWluSG91ckpzdCArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChleGNsdXNpdmVNYXhIb3VySnN0IC0gaW5jbHVzaXZlTWluSG91ckpzdCkpO1xuICBjb25zdCBjcm9uID0gYCR7bWluSnN0fSAkeyhob3VySnN0IC0gOSArIDI0KSAlIDI0fSAqICogKmA7XG4gIG5ld1NldHRpbmdzLm9uLnNjaGVkdWxlID0gW3sgY3JvbiB9XTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcChuZXdTZXR0aW5ncywge1xuICAgIGxpbmVXaWR0aDogLTEsXG4gICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgIHN0eWxlczoge1xuICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgfSxcbiAgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3M6IFdvcmtmbG93KTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnNbJ2FkZC10by1wcm9qZWN0J107XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGVKb2Ioam9iOiBKb2IpOiB2b2lkIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZW0gYWZ0ZXIgMjAyMy0wMy0zMVxuICBpZiAoIWpvYi53aXRoKSByZXR1cm47XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbm9uX3NlbGZfaG9zdGVkJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbm90aWZ5X2Rpc2NvcmQnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydyZXF1aXJlX2ZseSddO1xuICBkZWxldGUgam9iLndpdGhbJ3JlcXVpcmVfZ2Nsb3VkJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnY3B1X2FyY2gnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydsYWJlbCddO1xuICBkZWxldGUgam9iLndpdGhbJ2xhYmVsT3BlcmF0b3InXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvblZhbHVlTWFwIH0gZnJvbSAnQHlhcm5wa2cvY29yZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbnRlcmZhY2UgU2V0dGluZ3MgZXh0ZW5kcyBQYXJ0aWFsPENvbmZpZ3VyYXRpb25WYWx1ZU1hcD4ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luIHtcbiAgY2hlY2tzdW06IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzcGVjOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVlhcm5yY1ltbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVlhcm5yY1ltbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB5YXJucmNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYy55bWwnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGdldE1ham9yTnVtYmVyKGN1cnJlbnRWZXJzaW9uKSA8PSBnZXRNYWpvck51bWJlcihsYXRlc3RWZXJzaW9uKSAmJiBjdXJyZW50VmVyc2lvbiAhPT0gbGF0ZXN0VmVyc2lvbikge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0geWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzO1xuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgZGVsZXRlIHNldHRpbmdzLmNvbXByZXNzaW9uTGV2ZWw7XG4gICAgaWYgKHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM7XG4gICAgfVxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20veWFybnBrZy9iZXJyeS9wdWxsLzQ2OThcbiAgICBzZXR0aW5ncy5lbmFibGVHbG9iYWxDYWNoZSA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSBzZXR0aW5ncy5wbHVnaW5zPy5sZW5ndGggPz8gMDtcbiAgICBzZXR0aW5ncy5wbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucz8uZmlsdGVyKChwKSA9PiBwLnBhdGggIT09ICcueWFybi9wbHVnaW5zL3VuZGVmaW5lZC5janMnKSA/PyBbXTtcbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggIT09IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBjb25zdCBwbHVnaW5QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycsICd1bmRlZmluZWQuY2pzJyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGx1Z2luUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLnBsdWdpbnM7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh5YXJucmNZbWxQYXRoLCB5YW1sLmR1bXAoc2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KSk7XG5cbiAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICd5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdmVyc2lvbnNKc29uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9ucycsICctLWpzb24nXSwgZGlyUGF0aCk7XG4gIGNvbnN0IHZlcnNpb25zID0gSlNPTi5wYXJzZSh2ZXJzaW9uc0pzb24pIGFzIHN0cmluZ1tdO1xuICByZXR1cm4gdmVyc2lvbnMuYXQoLTEpIGFzIHN0cmluZztcbn1cbmZ1bmN0aW9uIGdldE1ham9yTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IFttYWpvcl0gPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiBOdW1iZXIobWFqb3IpO1xufVxuIiwiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4sIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4pIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvcik/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCBzb2RpdW0gZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4sIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgZGVwcmVjYXRlZFNlY3JldE5hbWVzID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJ107XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4gfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoKS5wYXJzZWQgfHwge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIGRlcHJlY2F0ZWRTZWNyZXROYW1lcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvICYmIG5hbWUgPT09ICdQVUJMSUNfR0hfQk9UX1BBVCcpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgIH0sXG4gICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuIO+8iOOBk+OBruODmuODvOOCuOOBpyBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIOOBjOihqOekuuOBleOCjOOBpuOBhOOCi+OBk+OBqOOCkueiuuiqjeOBl+OBn+OAgu+8iVxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gICAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBBbGwgdGVzdHMgYXJlIHBhc3NlZC5cbiAgICAtIFRlc3QgY29tbWFuZCAoZS5nLiwgXFxgeWFybiB0ZXN0XFxgKSBpcyBwYXNzZWQuXG4gICAgLSBMaW50IGNvbW1hbmQgKGUuZy4sIFxcYHlhcm4gbGludFxcYCkgaXMgcGFzc2VkLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIEdpdEh1YiBQUidzIGRpZmYgdmlldy4g77yIR2l0SHVi5LiK44Gn6Ieq5YiG44Gu5aSJ5pu05YaF5a6544KS56K66KqN44GX44Gf44CC77yJXG4tIFsgXSBJJ3ZlIHdyaXR0ZW4gdGhlIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLiDvvIjjg4bjgrnjg4jmiYvpoIbjgpLoqJjovInjgZfjgZ/jgILvvIlcbi0gWyBdIEkndmUgYWRkZWQgc2NyZWVuc2hvdHMuIO+8iFVJ44KS5aSJ5pu044GX44Gf5aC05ZCI44CB44K544Kv44Oq44O844Oz44K344On44OD44OI44KS6L+95Yqg44GX44Gf44CC77yJXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5cbjwhLS0g5pel5pys6Kqe44Gn6KiY6L+w44GX44Gm44KC5aSn5LiI5aSr44Gn44GZ44CCIC0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBuZXdDb250ZW50KSA+IG5ld0NvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYmJ5U3luYyB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdpdEh1YlV0aWwsIG9jdG9raXQgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgaXNCdW46IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1N1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1BhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1B1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcblxuICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGVzbGludEJhc2U/OiBFc2xpbnRFeHRlbnNpb25CYXNlO1xuICB2ZXJzaW9uc1RleHQ/OiBzdHJpbmc7XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VDb25maWcoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdENvbmZpZz86IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluc1BhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgfHwgW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSB8fCBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgdmVyc2lvbnNUZXh0ID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpO1xuICAgICAgdmVyc2lvbnNUZXh0ICs9IGNvbnRlbnQudHJpbSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcmVmaXgsIG5hbWVdIG9mIFtcbiAgICAgIFsnamF2YScsICdqYXZhJ10sXG4gICAgICBbJ25vZGUnLCAnbm9kZWpzJ10sXG4gICAgICBbJ3B5dGhvbicsICdweXRob24nXSxcbiAgICBdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBub2RlVmVyc2lvbkNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKHZlcnNpb25zVGV4dCkge1xuICAgICAgICAgIHZlcnNpb25zVGV4dCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB2ZXJzaW9uc1RleHQgKz0gbmFtZSArICcgJyArIG5vZGVWZXJzaW9uQ29udGVudC50cmltKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnk6IHJlcG9JbmZvPy5mdWxsX25hbWUgPyBgZ2l0aHViOiR7cmVwb0luZm8/LmZ1bGxfbmFtZX1gIDogdW5kZWZpbmVkLFxuICAgICAgaXNCdW46IHJvb3RDb25maWc/LmlzQnVuIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdidW5maWcudG9tbCcpKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBwYWNrYWdlSnNvblBhdGguaW5jbHVkZXMoYCR7cGF0aC5zZXB9d2lsbGJvb3N0ZXItY29uZmlnc2ApLFxuICAgICAgZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbnNEb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluc0dlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5zR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpbnNQYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluc1BvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluc1BvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNQdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluc1RlbXBsYXRlWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3RlbXBsYXRlLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNWc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbnNKc3hPclRzeDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3RzfS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueShcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsXG4gICAgICAgIGRpclBhdGhcbiAgICAgICksXG4gICAgICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICBkaXJQYXRoXG4gICAgICApLFxuICAgICAgZG9lc0NvbnRhaW5zSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHN9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llc1snYmxpdHonXSxcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXNbJ25leHQnXSxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1sncGxheXdyaWdodCddLFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydwcmlzbWEnXSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXNbJ3B5cmlnaHQnXSxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiAhIShcbiAgICAgICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVsZWFzZVBsdWdpbnMubGVuZ3RoID4gMFxuICAgICAgICApLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHdiOiAhIWRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddLFxuICAgICAgfSxcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgYnJhbmNoZXM6IHJlbGVhc2VCcmFuY2hlcyxcbiAgICAgICAgZ2l0aHViOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyksXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpLFxuICAgICAgfSxcbiAgICAgIHZlcnNpb25zVGV4dCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgd2JmeUpzb24sXG4gICAgfTtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgY29uZmlnLmVzbGludEJhc2UgPSBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1RlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2xvYmJ5U3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoIH0pLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCB0eXBlIEVzbGludEV4dGVuc2lvbkJhc2UgPVxuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctYmxpdHotbmV4dCc7XG5cbmZ1bmN0aW9uIGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRXNsaW50RXh0ZW5zaW9uQmFzZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JztcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeCA/ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcgOiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnO1xuICB9IGVsc2Uge1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3gpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoZGlyUGF0aCk7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgY29uc3QgcmVtb3RlVXJsID0gb3JpZ2luPy5yZWZzPy5mZXRjaCA/PyBvcmlnaW4/LnJlZnM/LnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJldCA9IHsgZnVsbF9uYW1lOiBgJHtvcmd9LyR7bmFtZX1gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHJldCwgcmVzcG9uc2UuZGF0YSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeERvY2tlcmZpbGUgfSBmcm9tICcuL2ZpeGVycy9kb2NrZXJmaWxlLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFByaXNtYUVudkZpbGVzIH0gZnJvbSAnLi9maXhlcnMvcHJpc21hLmpzJztcbmltcG9ydCB7IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2ZpeGVycy90ZXN0RGlyZWN0b3J5LmpzJztcbmltcG9ydCB7IGZpeFR5cGVEZWZpbml0aW9ucyB9IGZyb20gJy4vZml4ZXJzL3R5cGVEZWZpbml0aW9uLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUb29sVmVyc2lvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYXNkZi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJpb21lSnNvbmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYmlvbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRXNsaW50aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VzbGludGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVzbGludHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VzbGludHJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2h1c2t5cmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9uZXh0Y29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcGFja2FnZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3B5cmlnaHRjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVhZG1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVsZWFzZXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlbGVhc2VyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbm92YXRlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlWWFybnJjWW1sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3lhcm5yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwU2VjcmV0cyB9IGZyb20gJy4vZ2l0aHViL3NlY3JldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpIGFzIFBhY2thZ2VDb25maWdbXTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluc3RhbGwgdG9vbHMgdmlhIGFzZGYgYXQgZmlyc3RcbiAgICBhd2FpdCBnZW5lcmF0ZVRvb2xWZXJzaW9ucyhyb290Q29uZmlnKTtcbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhEb2NrZXJmaWxlKHJvb3RDb25maWcpLFxuICAgICAgZml4UHJpc21hRW52RmlsZXMocm9vdENvbmZpZyksXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICAuLi4ocm9vdENvbmZpZy5pc0J1blxuICAgICAgICA/IFtcbiAgICAgICAgICAgIGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnKSxcbiAgICAgICAgICAgIGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZykudGhlbigoKSA9PiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSksXG4gICAgICAgICAgXVxuICAgICAgICA6IFtnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpXSksXG4gICAgICBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbiAmJiBjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgICAgICkge1xuICAgICAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVFc2xpbnRyYyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlRXNsaW50aWdub3JlKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gICAgLy8gJ3lhcm4gaW5zdGFsbCcgc2hvdWxkIGJlIGFmdGVyIGB5YXJuIGNsZWFudXBgIGJlY2F1c2UgeWFybiBiZXJyeSBnZW5lcmF0ZXMgeWFybi5sb2NrXG4gICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgY29udGVudHMgb2YgZGVwZW5kYW50IHN1Yi1wYWNrYWdlIGluIG1vbm9yZXBvXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWyd1cGRhdGUnXSwgcm9vdERpclBhdGgpO1xuICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBhZnRlciB0aGVyZSBpcyBubyBidW4ubG9ja2JcbiAgICAgIGNvbnN0IGJ1bkxvY2tiUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ2J1bi5sb2NrYicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYnVuTG9ja2JQYXRoKSkge1xuICAgICAgICB2b2lkIGZzLnByb21pc2VzLnJtKGJ1bkxvY2tiUGF0aCk7XG4gICAgICAgIHNwYXduU3luYyhcbiAgICAgICAgICBwYWNrYWdlTWFuYWdlcixcbiAgICAgICAgICBbJ2luc3RhbGwnLCAnLS1zYXZlLXRleHQtbG9ja2ZpbGUnLCAnLS1mcm96ZW4tbG9ja2ZpbGUnLCAnLS1sb2NrZmlsZS1vbmx5J10sXG4gICAgICAgICAgcm9vdERpclBhdGhcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsib3B0aW9ucyIsImNvbnN0cnVjdG9yIiwidGhpcyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJlcnJvciIsIkVycm9yIiwic3RhY2siLCJhc3luYyIsImZpeERvY2tlcmZpbGUiLCJjb25maWciLCJkb2VzQ29udGFpbnNEb2NrZXJmaWxlIiwib2xkQ29udGVudCIsImRvY2tlcmZpbGUiLCJuZXdDb250ZW50IiwiZnMiLCJ3cml0ZUZpbGUiLCJwYXRoIiwiam9pbiIsImRpclBhdGgiLCJmaXhQbGF5d3JpZ2h0Q29uZmlnIiwiZmlsZVBhdGgiLCJleGlzdHNTeW5jIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsInJlcGxhY2UiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZ2xvYmJ5IiwiZG90IiwiY3dkIiwiZW52RmlsZSIsImVudkZpbGVQYXRoIiwicmVzb2x2ZSIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwib2xkVGVzdERpclBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm5ld1Rlc3REaXJQYXRoIiwicmVuYW1lIiwicmVwbGFjZUFsbCIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zIiwidW5kZWZpbmVkIiwiZGlyZW50cyIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJkaXJlbnQiLCJkaXJOYW1lIiwic2xpY2UiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaW5jbHVkZXMiLCJoYXNMaWJyYXJ5Iiwic29tZSIsInBhY2thZ2VKc29uIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiaXNGaWxlIiwibWtkaXIiLCJydW4iLCJyZWN1cnNpdmUiLCJpc0RpcmVjdG9yeSIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZzcCIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsImdpdGlnbm9yZSIsImxlbmd0aCIsIm1kRmlsZSIsImZpeEFiYnJldmlhdGlvbnNJblRleHQiLCJyZXBsYWNlV2l0aENvbmZpZyIsInRzRmlsZXMiLCJ0c0ZpbGUiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIk9iamVjdCIsImVudHJpZXMiLCJ3YmZ5SnNvbiIsInR5cG9zIiwidG9rZW4iLCJwcm9jZXNzIiwiZW52IiwiR0hfQk9UX1BBVCIsIlBVQkxJQ19HSF9CT1RfUEFUIiwiR0hfVE9LRU4iLCJHSVRIVUJfVE9LRU4iLCJoYXNHaXRIdWJUb2tlbiIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsInNwbGl0IiwiYXQiLCJuYW1lcyIsInNwYXduU3luYyIsImNvbW1hbmQiLCJhcmdzIiwicmV0cnkiLCJuZXdDbWQiLCJuZXdBcmdzIiwiZ2V0U3Bhd25TeW5jQXJncyIsImNoaWxkX3Byb2Nlc3MiLCJzdGF0dXMiLCJzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0Iiwic3RkaW8iLCJwcm9jIiwic3RkZXJyIiwidG9TdHJpbmciLCJ0cmltIiwicyIsInN0ZG91dCIsIlBBVEgiLCJCRVJSWV9CSU5fRk9MREVSIiwiQVNERl9ESVIiLCJzaGVsbCIsImNvbnZlcnRWZXJzaW9uSW50b051bWJlciIsInZlcnNpb24iLCJudW1iZXJzIiwiTnVtYmVyIiwiZmlsdGVyIiwibnVtIiwiaXNOYU4iLCJ2ZXJzaW9uTnVtYmVyIiwiZGl2aXNvciIsIlBZVEhPTl9WRVJTSU9OIiwiSkFWQV9WRVJTSU9OIiwiQkxJVFpfVkVSU0lPTiIsIk5FWFRfVkVSU0lPTiIsImdlbmVyYXRlVG9vbFZlcnNpb25zIiwidmVyc2lvbnNUZXh0IiwiZHVwbGljYXRhYmxlTGluZXMiLCJsaW5lIiwiQ09SRV9UT09MUyIsImhhcyIsInNvcnQiLCJzdGFydHNXaXRoIiwibGluZXMiLCJTZXQiLCJkb2VzQ29udGFpbnNQb2V0cnlMb2NrIiwicmVzcG9uc2UiLCJmZXRjaCIsImpzb24iLCJwb2V0cnlWZXJzaW9uIiwidXBkYXRlVmVyc2lvbiIsImRlcGVuZGluZyIsImZpcmViYXNlIiwiZG9lc0NvbnRhaW5zUGFja2FnZUpzb24iLCJpc0J1biIsImJ1blZlcnNpb24iLCJvcmdhbml6YXRpb24iLCJyZXBvc2l0b3J5IiwicmVxdWVzdCIsIm93bmVyIiwicmVwbyIsImRhdGEiLCJ0YWdfbmFtZSIsImluZGV4IiwibGFzdEluZGV4T2YiLCJ2ZXJzaW9uTnVtYmVyVGV4dCIsInRlc3QiLCJnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViIiwicHJlZml4IiwiREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTIiwidmVyc2lvblBhdGgiLCJybSIsImZvcmNlIiwidG9vbFZlcnNpb25zUGF0aCIsImNvcmUiLCJ0b29sTmFtZSIsIm5ld1ZlcnNpb24iLCJoZWFkIiwiZmluZEluZGV4IiwibCIsIm5ld0xpbmUiLCJzcGxpY2UiLCJvdmVyd3JpdGVNZXJnZSIsImRlc3RpbmF0aW9uQXJyYXkiLCJzb3VyY2VBcnJheSIsImNvbWJpbmVNZXJnZSIsInRhcmdldCIsInNvdXJjZSIsImRlc3RpbmF0aW9uIiwiaXRlbSIsImNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkIiwiaXNNZXJnZWFibGVPYmplY3QiLCJtZXJnZSIsInB1c2giLCJqc29uT2JqIiwiJHNjaGVtYSIsImV4dGVuZHMiLCJnZW5lcmF0ZUJpb21lSnNvbmMiLCJuZXdTZXR0aW5ncyIsImNsb25lRGVlcCIsIm9sZFNldHRpbmdzIiwiSlNPTiIsInBhcnNlIiwiYXJyYXlNZXJnZSIsInN0cmluZ2lmeSIsImdlbmVyYXRlQnVuZmlnVG9tbCIsInVzZXJDb250ZW50SGVhZGVyIiwidXNlckNvbnRlbnRIZWFkZXJSZWdleCIsInNlcGFyYXRvciIsImRlZmF1bHRIZWFkVXNlckNvbnRlbnQiLCJkZWZhdWx0VGFpbFVzZXJDb250ZW50IiwiaWdub3JlRmlsZVV0aWwiLCJzZXBhcmF0b3JQcmVmaXgiLCJyZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMiLCJsYXN0SGVhZGVySW5kZXgiLCJnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyIiwiZ2V0SGVhZFVzZXJDb250ZW50IiwiaW5kZXhPZiIsImdldFRhaWxVc2VyQ29udGVudCIsImlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQiLCJsYXN0SW5kZXgiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsImNvZGVXaXRoOEluZGVudFNpemUiLCJtYXJrZG93bkxpa2UiLCJlc2xpbnQiLCJwcmV0dGllciIsImJpb21lIiwiZ2VuZXJhdGVFeHRlbnNpb25zIiwiZ2VuZXJhdGVFZGl0b3Jjb25maWciLCJnZW5lcmF0ZUVzbGludGlnbm9yZSIsImhlYWRVc2VyQ29udGVudCIsInRhaWxVc2VyQ29udGVudCIsImdpdGlnbm9yZUZpbGVQYXRoIiwiZ2VuZXJhdGVFc2xpbnRyYyIsInJvb3RDb25maWciLCJiYXNlcyIsImVzbGludEJhc2UiLCJyb290IiwiZXh0IiwibmV3RXh0ZW5kcyIsImJsaXR6IiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJkb2VzQ29udGFpbnNHZW1maWxlIiwiZG9lc0NvbnRhaW5zR29Nb2QiLCJiYXNlbmFtZSIsImRvZXNDb250YWluc1BvbVhtbCIsImRvZXNDb250YWluc1B1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sIiwibmV4dCIsInByaXNtYSIsInBsYXl3cmlnaHRUZXN0IiwicmVhY3ROYXRpdmUiLCJzdG9yeWJvb2siLCJsaXRlc3RyZWFtIiwiZ2VuZXJhdGVkIiwicmVhZENhY2hlIiwidXJsIiwicmVzcG9uc2VUZXh0IiwidGV4dCIsIm9rIiwid3JpdGVDYWNoZSIsIm9zIiwiaG9tZWRpciIsInN0YXQiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsImdldExhdGVzdENvbW1pdEhhc2giLCJjb21taXRzIiwicGVyX3BhZ2UiLCJzaGEiLCJFc2xpbnRVdGlsIiwiZ2V0TGludEZpeFN1ZmZpeCIsImRvZXNDb250YWluc0pzeE9yVHN4Iiwic3JjRGlyZWN0b3JpZXMiLCJub2RlIiwiZ2V0U3JjRGlycyIsImpzQ29tbW9uRGVwcyIsInRzQ29tbW9uRGVwcyIsInJlYWN0Q29tbW9uRGVwcyIsImVzbGludERlcHMiLCJnZW5lcmF0ZVBhY2thZ2VKc29uIiwic2tpcEFkZGluZ0RlcHMiLCJqc29uVGV4dCIsInNjcmlwdHMiLCJwZWVyRGVwZW5kZW5jaWVzIiwiYXV0aG9yIiwiaXNXaWxsQm9vc3RlckNvbmZpZ3MiLCJkZXBzIiwidmFsdWVzIiwiZGVwIiwicmVtb3ZlRGVwcmVjYXRlZFN0dWZmIiwia2V5IiwidmFsdWUiLCJnZW5lcmF0ZVNjcmlwdHMiLCJwcmV0dGlmeSIsImV4aXN0aW5nQ29udGVudCIsIm9yaWdpbmFsQ29udGVudCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJwb2V0cnlEZXZEZXBlbmRlbmNpZXMiLCJwcmVwYXJlIiwicG9zdGluc3RhbGwiLCJpc1B1YmxpY1JlcG8iLCJpc1JlZmVycmVkQnlPdGhlclJlcG8iLCJwcmVwYWNrIiwicG9zdHBhY2siLCJzZW1hbnRpY1JlbGVhc2UiLCJ3b3Jrc3BhY2VzIiwiQXJyYXkiLCJpc0FycmF5Iiwid29ya3NwYWNlIiwiZ2xvYmJ5U3luYyIsIndiIiwiZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCIsImRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCIsImRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImNsZWFudXAiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwicHl0aG9uRmlsZXMiLCJpZ25vcmUiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwiYWRkIiwic2l6ZSIsImRpck5hbWVzU3RyIiwiZCIsImtleXMiLCJwYWNrYWdlTmFtZXMiLCJjb21taXRIYXNoIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwicGFja2FnZU1hbmFnZXIiLCJuZXdKc29uVGV4dCIsIm9sZEFuZE5ld1NjcmlwdE5hbWVzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJmaWxlcyIsImZpeFNjcmlwdE5hbWVzIiwidHlwZWNoZWNrIiwib2xkVGVzdCIsInB5cmlnaHQiLCJwcmVDb21taXQiLCJwcmVQdXNoIiwicHJlUHVzaEZvckxhYiIsInBvc3RNZXJnZSIsImdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlSnNvblBhdGgiLCJwcmVDb21taXRGaWxlUGF0aCIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwiZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyIsInBvc3RNZXJnZUNvbW1hbmRzIiwiU3RyaW5nIiwicmF3IiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJjcmVhdGVUYXNrT3B0aW9ucyIsInJ1bm5lciIsImV4dGVuc2lvbiIsInByZXR0aWVyQ29udGVudCIsImJpb21lQ29udGVudCIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiY29tbWFuZHMiLCJnbG9iIiwiZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24iLCJ5YW1sIiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsIm1rZGlyU3luYyIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwicGFja2FnZVByZWZpeCIsImdldEVzbGludEtleSIsInBhY2thZ2VzRmlsdGVyIiwiZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIiLCJnZW5lcmF0ZU5leHRDb25maWdKc29uIiwiZmluZCIsInAiLCJfIiwic2V0dGluZ3NUZXh0IiwiZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJnZW5lcmF0ZVJlYWRtZSIsImluc2VydEJhZGdlIiwiZmlsZU5hbWVzIiwicmVhZGRpclN5bmMiLCJmaWxlTmFtZSIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwiYmFkZ2UiLCJyZWFkbWUiLCJpIiwiZ2VuZXJhdGVSZWxlYXNlcmMiLCJzZXR0aW5ncyIsInBsdWdpbnMiLCJwbHVnaW4iLCJvbGRDb25maWciLCJwcmVzZXQiLCJzdWNjZXNzQ29tbWVudCIsImZhaWxDb21tZW50IiwibGFiZWxzIiwicmVsZWFzZWRMYWJlbHMiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwibW9kdWxlIiwibW9kdWxlUmVzb2x1dGlvbiIsImpzeCIsImFsd2F5c1N0cmljdCIsInN0cmljdCIsInNraXBMaWJDaGVjayIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsImRlY2xhcmF0aW9uIiwic291cmNlTWFwIiwiaW1wb3J0SGVscGVycyIsIm91dERpciIsInR5cGVSb290cyIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlcyIsImlzRXNtUGFja2FnZSIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwid29ya2Zsb3dzIiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwidXNlcyIsInJlbGVhc2UiLCJ3YmZ5Iiwid29ya2Zsb3dfZGlzcGF0Y2giLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwic2VjcmV0cyIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJHSF9QUk9KRUNUX1VSTCIsIndpdGgiLCJsYWJlbGVkIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwiZmlsZU5hbWVTZXQiLCJraW5kIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJsb2FkIiwibW92ZVRvQm90dG9tIiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJzZXRTY2hlZHVsZSIsIm1pZ3JhdGVXb3JrZmxvdyIsIndyaXRlWWFtbCIsInBhcmFtcyIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIm5wbSIsInNlcnZlcl91cmwiLCJtaWdyYXRlSm9iIiwibmV3U2VjcmV0cyIsImluY2x1c2l2ZU1pbkhvdXJKc3QiLCJleGNsdXNpdmVNYXhIb3VySnN0IiwibWludXRlVXRjIiwiaG91clV0YyIsImNyb24iLCJpc0ludGVnZXIiLCJob3VySnN0IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwieWFtbFRleHQiLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJjdXJyZW50VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJ2ZXJzaW9uc0pzb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwiZ2V0TWFqb3JOdW1iZXIiLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJtYWpvciIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwiZGVwcmVjYXRlZFNlY3JldE5hbWVzIiwic2V0dXBTZWNyZXRzIiwicGFyc2VkIiwiZG90ZW52Iiwic2VjcmV0TmFtZSIsInNlY3JldF9uYW1lIiwia2V5X2lkIiwia2V5SWQiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsIndpdGhSZXRyeSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsImFsbG93X2F1dG9fbWVyZ2UiLCJ0ZW1wbGF0ZXMiLCJnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyIsImRpc3RhbmNlIiwid2JmeUpzb25TY2hlbWEiLCJ6Iiwib2JqZWN0IiwicmVjb3JkIiwic3RyaW5nIiwib3B0aW9uYWwiLCJkb2MiLCJ0cyIsImdldFBhY2thZ2VDb25maWciLCJlc21QYWNrYWdlIiwicGFja2FnZUpzb25UZXh0IiwicmVhZEZpbGVTeW5jIiwidHlwZSIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJtZXNzYWdlIiwiZmV0Y2hSZXBvSW5mbyIsIm5vZGVWZXJzaW9uQ29udGVudCIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsImZ1bGxfbmFtZSIsInNlcCIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uIiwiZ2l0aHViIiwiZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZSIsInBhdHRlcm4iLCJvcmciLCJyZXQiLCJhc3NpZ24iLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJhcnJheSIsImRlZmF1bHQiLCJkZXNjcmlwdGlvbiIsImFsaWFzIiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicm9vdERpclBhdGgiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInRoZW4iLCJidW5Mb2NrYlBhdGgiXSwibWFwcGluZ3MiOiJnb0JBVU8sTUFBTUEsRUFBVSxJQVZ2QixNQUlFQyxXQUFBQSxHQUNFQyxLQUFLQyxXQUFZLEVBQ2pCRCxLQUFLRSxtQkFBb0IsQ0FDM0IsR0NXSyxNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENSLEVBQVFHLFdBQ1ZNLFFBQVFDLEtBQUssYUFBYUgscUJBRTVCLFVBQ1FDLEdBQ1AsQ0FBQyxNQUFPRyxHQUNQRixRQUFRQyxLQUFLLHFCQUFxQkgsTUFBU0ksYUFBaUJDLE1BQVFELEVBQU1FLE1BQVFGLEtBQ3BGLENBQ0lYLEVBQVFHLFdBQ1ZNLFFBQVFDLEtBQUssY0FBY0gsbUJBRS9CLEdDVEtPLGVBQWVDLEVBQWNDLEdBQ2xDLE9BQU9YLEVBQU9DLDBCQUEwQixpQkFBaUJRLFVBQ3ZELElBQUtFLEVBQU9DLHVCQUF3QixPQUVwQyxNQUFNQyxFQUFhRixFQUFPRyxXQUNwQkMsRUFBYUYsRUFFZkEsSUFBZUUsU0FDYkMsRUFBR0MsVUFBVUMs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
|