wbfy 3.0.12 → 3.0.14
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 +6 -6
package/dist/index.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
import e from"node:fs";import t from"node:path";import{ignoreEnoentAsync as n,withRetry as s,ignoreErrorAsync as i}from"@willbooster/shared-lib";import o from"yargs";import r from"node:fs/promises";import a from"fast-glob";import{PromisePool as c}from"minimal-promise-pool";import{Octokit as l}from"@octokit/core";import p from"node:child_process";import d from"deepmerge";import u from"node:os";import m from"js-yaml";import f from"lodash.clonedeep";import g from"dotenv";import h from"libsodium-wrappers";import{distance as y}from"fastest-levenshtein";import{simpleGit as w}from"simple-git";import{z as b}from"zod";const v=new class{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const k=new class{async functionIgnoringException(e,t){v.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}v.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function j(e){return k.functionIgnoringException("fixDockerfile",async()=>{if(!e.doesContainsDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await r.writeFile(t.join(e.dirPath,"Dockerfile"),s)})}async function x(n){return k.functionIgnoringException("fixPlaywrightConfig",async()=>{const s=t.join(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),o=i.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");i!==o&&await e.promises.writeFile(s,o)})}const _=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function P(e){return k.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await a.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:_});for(const s of n){const n=t.resolve(e.dirPath,s),i=(await r.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await r.writeFile(n,i)}})}async function S(n){return k.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const s=t.join(n,"__tests__"),i=t.join(n,"tests");try{await e.promises.rename(s,i);const o=await e.promises.readFile(t.join(n,"package.json"),"utf8"),r=o.replaceAll("__tests__","tests");if(o===r)return;await e.promises.writeFile(t.join(n,"package.json"),r)}catch{}}))})}const $=new c;async function F(e,s){return k.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),o=e.isRoot&&e.doesContainsSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),a=await n(()=>r.readdir(i,{withFileTypes:!0}));if(a)for(const e of a){const a=e.name.slice(0,-5),c=e.name.endsWith(".d.ts");let l=c?a:e.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some(e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]);e.isFile()&&c?p?(await r.mkdir(t.join(i,a)),await $.run(()=>r.rename(t.join(i,e.name),t.join(i,a,"index.d.ts")))):o&&(await r.mkdir(o,{recursive:!0}),await $.run(()=>r.rename(t.join(i,e.name),t.join(o,e.name)))):e.isDirectory()&&o&&!p&&(await r.mkdir(o,{recursive:!0}),await $.run(()=>n(()=>r.rename(t.join(i,e.name,"index.d.ts"),t.join(o,`${e.name}.d.ts`)))))}})}const C={async readFileIgnoringError(e){try{return await r.readFile(e,"utf8")}catch{}},async generateFile(e,t){await r.writeFile(e,t)}};async function E(n){return k.functionIgnoringException("fixTypos",async()=>{const s=n.dirPath,i=await a.glob("**/*.md",{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const o of i){const i=t.join(s,o);await $.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=B(t);s=D(s,n,"doc"),t!==s&&await C.generateFile(i,s)})}const o=await a.glob(["{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${o.length} TypeScript files in ${s}`);for(const i of o){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=O(r);a=D(a,n,"ts"),r!==a&&await C.generateFile(o,a)}const r=await a.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${r.length} text-based files in ${s}`);for(const i of r){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=B(r);a=D(a,n,"text"),r!==a&&await C.generateFile(o,a)}await $.promiseAll()})}function B(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function O(e){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function D(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 T=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,I=!!T,A=new l({auth:T});const R=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}};function W(e,t,n,s=0){do{const[s,i,o]=J(e,t,n);if(0===p.spawnSync(s,i,o).status)break}while(--s>=0)}function L(e,t,n){const[s,i,o]=J(e,t,n);o.stdio="pipe";const r=p.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function 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",`${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:s,shell:!1,stdio:"inherit"}]}function N(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 z="3.9.19",G="zulu-11.74.15",U="2.0.4",H="14.2.5";async function M(n){return k.functionIgnoringException("generateToolVersions",async()=>{await async function(n){if(!n.versionsText)return;const s=n.versionsText.trim().split("\n").map(e=>{const[t,n]=e.trim().split(/\s+/);return`${q.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&&K(i,"poetry",n),K(i,"python",z,!0)}n.depending.firebase&&K(i,"java",G,!0);if(n.doesContainsPackageJson)if(n.isBun){const e=await async function(e,t){try{const n=(await A.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&&K(i,"bun",e)}else{const e=L("npm",["show","yarn","version"],n.dirPath);K(i,"yarn",e)}for(const s of Y){const i=t.resolve(n.dirPath,`.${s}-version`);e.promises.rm(i,{force:!0})}const o=t.resolve(n.dirPath,".tool-versions");await(i.length>0?$.run(()=>e.promises.writeFile(o,i.join("\n")+"\n")):$.run(()=>e.promises.rm(o,{force:!0}))),await $.promiseAll(),W("asdf",["plugin","update","--all"],n.dirPath),W("asdf",["install"],n.dirPath)}(n)})}const q=new Set(["java","nodejs","bun","python"]),Y=["java","node","python"];function K(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+/);N(n)>N(t)&&(e[i]=o)}}function V(e,t){return t}function X(e,t,n){const s=[...e];for(const[i,o]of t.entries())void 0===s[i]?s[i]=n.cloneUnlessOtherwiseSpecified(o,n):n.isMergeableObject(o)?s[i]=d(e[i],o,n):e.includes(o)||s.push(o);return s}async function Q(n){return k.functionIgnoringException("generateBiomeJsonc",async()=>{let s={root:n.isRoot,$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};const i=t.resolve(n.dirPath,"biome.jsonc");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:V})}catch{}const o=JSON.stringify(s);await $.run(()=>C.generateFile(i,o))})}async function Z(n){return k.functionIgnoringException("generateBunfigToml",async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)&&e.readFileSync(s,"utf8").includes("exact = false")?"telemetry = false\n\n[install]\nexact = false\n\n[run]\nbun = true\n":"telemetry = false\n\n[install]\nexact = true\n\n[run]\nbun = true\n";await $.run(()=>C.generateFile(s,i))})}const ee="# Project-specific settings",te=/# Project-specific settings[^\n]*\n/gm,ne="# Generated by wbfy",se=`${ee} (head)\n\n\n${ne}\n`,ie=`\n${ee} (tail)\n`,oe={separator:ne,separatorPrefix:"# Generated by ",defaultHeadUserContent:se,defaultTailUserContent:ie,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=re(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(te,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return-1!==t?e.slice(0,e.indexOf("\n",t)+1).replaceAll(te,`${ee} (head)\n`):se},getTailUserContent(e){const t=re(e);return t>0?e.slice(t-1):ie},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function re(e){const t=e.indexOf(ee),n=e.lastIndexOf(ee);return n>t?n:-1}async function ae(n){return k.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainsDockerfile){const e=await C.readFileIgnoringError(s)??"",t=oe.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+oe.getTailUserContent(e);await $.run(()=>C.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const ce={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].sort(),codeWith4IndentSize:["go","gradle","py"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].sort()},le=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${de(ce.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${de(ce.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${de(ce.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function pe(e){return k.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await $.run(()=>C.generateFile(n,le))})}function de(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function ue(n){return k.functionIgnoringException("generateEslintrc",async()=>{await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintignore"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0}));const s=t.resolve(n.dirPath,"eslint.config.mjs");if(n.isBun)await $.run(()=>e.promises.rm(s,{force:!0}));else if(n.eslintBase){try{if(!(await e.promises.readFile(s,"utf8")).includes("export { default }"))return}catch{}await $.run(()=>C.generateFile(s,`export { default } from '${n.eslintBase}';`))}})}const me=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...ce.codeWith2IndentSize,...ce.codeWith4IndentSize,...ce.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function fe(e){return k.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await $.run(()=>C.generateFile(n,me))})}const ge=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function he(e,n){return k.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await C.readFileIgnoringError(s)??"";let o=oe.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot/chatSessions/\n.devcontainer/\n*/mount/*.hash\n__generated__/\ndist/\ntemp/\n";const r=oe.getTailUserContent(i),a=[...ge];e.doesContainsGemfile&&a.push("ruby"),e.doesContainsGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainsPackageJson&&a.push("node"),e.doesContainsPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainsPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainsTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainsPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(o+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(o+="*.sqlite3*\n"),e.depending.playwrightTest&&(o+="test-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),o+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(o+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await be(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,s=await fetch(n),i=await s.text();if(!s.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await $.run(()=>we(e,t)),v.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await oe.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainsPomXml||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainsPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+"\n"+c+r;await $.run(()=>C.generateFile(s,l))})}const ye=t.join(u.homedir(),".cache","wbfy","gitignore");async function we(n,s){await e.promises.mkdir(ye,{recursive:!0}),await e.promises.writeFile(t.join(ye,n),s)}async function be(n){try{const s=await e.promises.stat(t.join(ye,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(ye,n),"utf8")}catch{}}async function ve(e,t){try{const{data:n}=await A.request("GET /repos/{owner}/{repo}/commits",{owner:e,repo:t,per_page:1});if(0===n.length)throw new Error(`No commits found for ${e}/${t}`);return n[0].sha}catch(n){throw new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`)}}const ke={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},je=["eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],xe=[...je,"typescript-eslint","eslint-import-resolver-typescript"],_e=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],Pe={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js","eslint-plugin-import-x",...je],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react","eslint-plugin-import-x",...je,..._e],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts","eslint-plugin-import-x",...xe],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react","eslint-plugin-import-x",...xe,..._e],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-plugin-import","eslint-config-next",...xe,..._e]};async function Se(n,s,i){return k.functionIgnoringException("generatePackageJson",async()=>{await async function(n,s,i){const o=t.resolve(n.dirPath,"package.json"),r=await e.promises.readFile(o,"utf8"),c=JSON.parse(r);c.scripts=c.scripts||{},c.dependencies=c.dependencies||{},c.devDependencies=c.devDependencies||{},c.peerDependencies=c.peerDependencies||{};const l=n.isBun?"bun":"yarn";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,delete n.scripts["check-all"],!t.isWillBoosterConfigs)for(const e of Object.values(Pe))for(const t of e)delete n.devDependencies[t];await $.run(()=>e.promises.rm("lerna.json",{force:!0})),delete n.devDependencies["@typescript-eslint/eslint-plugin"],delete n.devDependencies["@typescript-eslint/parser"],delete n.devDependencies["eslint-plugin-import"]}(s,c),"@willbooster/prettier-config"!==c.name&&(c.prettier="@willbooster/prettier-config");for(const[e,t]of Object.entries(c.scripts))t.includes("git clone")||(c.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));c.scripts=d(c.scripts,$e(n)),"check-for-ai"in c.scripts&&("gen-code"in c.scripts&&(c.scripts["check-for-ai"]=`${l} gen-code > /dev/null && ${c.scripts["check-for-ai"]}`),c.scripts["check-for-ai"]=`${l} install > /dev/null && ${c.scripts["check-for-ai"]}`);n.isBun?delete c.scripts.prettify:c.scripts.prettify+=await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),o=i.indexOf(oe.separatorPrefix);if(-1===o)return"";const r=i.slice(0,o);return r.split("\n").map(e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith("#")&&!e.includes("/")).map(e=>` "!**/${e}/**"`).join("")}(n.dirPath);for(const[e,t]of Object.entries(c.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(c.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],u=["prettier","sort-package-json","@willbooster/prettier-config"];const m=[];n.isBun?delete c.devDependencies["lint-staged"]:u.push("lint-staged");if(n.isRoot){if(n.isBun?(delete c.devDependencies.husky,delete c.devDependencies.pinst,c.scripts.prepare="lefthook install || true",u.push("lefthook")):(u.push("husky"),c.scripts.prepare="husky || true",c.scripts.postinstall="husky || true",(n.isPublicRepo||n.isReferredByOtherRepo)&&(u.push("pinst"),c.scripts.prepack="pinst --disable",c.scripts.postpack="pinst --enable")),n.depending.semanticRelease&&(c.devDependencies["semantic-release"]||c.devDependencies["multi-semantic-release"]||c.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),c.version="0.0.0-semantically-released"),n.depending.playwrightTest){c.dependencies.artillery||c.devDependencies.artillery||c.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete c.dependencies["@playwright/test"]),delete c.dependencies.playwright,delete c.devDependencies.playwright}n.doesContainsSubPackageJsons?c.workspaces=Array.isArray(c.workspaces)?d.all([c.workspaces,["packages/*"]],{arrayMerge:X}):["packages/*"]:Array.isArray(c.workspaces)&&(c.workspaces=c.workspaces.filter(e=>a.globSync(e,{dot:!0,cwd:n.dirPath,ignore:_}).length>0),0===c.workspaces.length&&delete c.workspaces)}if(n.depending.wb||n.isBun){c.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):u.push("@willbooster/wb");for(const[e,t]of Object.entries(c.scripts))c.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainsJavaScript||n.doesContainsJavaScriptInPackages||n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(n.isBun?(u.push("@biomejs/biome","@willbooster/biome-config"),delete c.devDependencies.eslint,delete c.devDependencies.micromatch,delete c.devDependencies["typescript-eslint"]):u.push("eslint","micromatch"));(n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(u.push("typescript"),n.isBun&&u.push("@types/bun"));n.eslintBase&&u.push(...Pe[n.eslintBase]);n.isWillBoosterConfigs&&(p=p.filter(e=>!e.includes("@willbooster/")),u=u.filter(e=>!e.includes("@willbooster/")));c.name||(c.name=t.basename(n.dirPath));n.doesContainsSubPackageJsons&&(c.private=!0);c.license||(c.license="UNLICENSED");!c.private&&"UNLICENSED"!==c.license&&s.isPublicRepo&&(c.publishConfig??={},c.publishConfig.access??="public");const[f]=R.getOrgAndName(n.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(c.author="WillBooster Inc.");n.isRoot||!c.private||c.main||(c.main="./src");if(delete c.resolutions?.["npm/chalk"],!n.doesContainsSubPackageJsons){if(n.isBun||(n.doesContainsJavaScript||n.doesContainsTypeScript?c.scripts["lint-fix"]+=ke.getLintFixSuffix(n):(delete c.scripts.lint,delete c.scripts["lint-fix"],c.scripts.cleanup=c.scripts.cleanup?.replace(" && yarn lint-fix",""))),n.doesContainsPubspecYaml){c.scripts.lint="flutter analyze",c.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter(s=>e.existsSync(t.resolve(n.dirPath,s)));s.length>0&&(c.scripts["format-code"]=`flutter format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,c.scripts.format+=" && yarn format-code")}if(n.doesContainsPoetryLock){"poetry install"===c.scripts.postinstall&&delete c.scripts.postinstall;const e=await a.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:_}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");c.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,c.scripts.lint?c.scripts.lint=`poetry run flake8 ${e} && ${c.scripts.lint}`:(c.scripts.lint=`poetry run flake8 ${e}`,c.scripts["lint-fix"]="yarn lint"),c.scripts.format+=" && yarn format-code",m.push("black","isort","flake8")}}n.repository&&(c.repository=n.repository)}n.depending.blitz?(p.push(`blitz@${U}`,`@blitzjs/auth@${U}`,`@blitzjs/next@${U}`,`@blitzjs/rpc@${U}`,`next@${H}`),u=u.filter(e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e),c.scripts["gen-code"]?.startsWith("blitz codegen")?c.scripts["gen-code"].includes("blitz prisma generate")||(c.scripts["gen-code"]=c.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):c.scripts["gen-code"]="blitz codegen"):n.depending.prisma&&!c.scripts["gen-code"]?.startsWith("prisma generate")&&(c.scripts["gen-code"]="prisma generate");c.dependencies?.prettier||delete c.devDependencies["@types/prettier"];0===Object.keys(c.dependencies).length&&delete c.dependencies;0===Object.keys(c.devDependencies).length&&delete c.devDependencies;0===Object.keys(c.peerDependencies).length&&delete c.peerDependencies;await async function(e){e.dependencies=e.dependencies||{},e.devDependencies=e.devDependencies||{};const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]);if(t.has("@willbooster/auth")&&!Fe(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await ve("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!Fe(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await ve("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!Fe(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await ve("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#workspace=@code-analyzer/client&commit=${t}`}if(t.has("@willbooster/judge")&&!Fe(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await ve("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!Fe(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await ve("WillBoosterLab","llm-proxy");e.dependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(c),n.isBun&&delete c.packageManager;let g=JSON.stringify(c);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.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:_});for(const n of r)await $.run(async()=>{const s=t.join(i.dirPath,n),r=await e.promises.readFile(s,"utf8");let a=r;for(const[e,t]of o)a=a.replaceAll(e,t);a!==r&&await e.promises.writeFile(s,a)});return await $.promiseAll(),s}(c.scripts,g,n),await e.promises.writeFile(o,g),i||(p=p.filter(e=>!c.devDependencies?.[e]),p.length>0&&W(l,["add",...new Set(p)],n.dirPath),u=u.filter(e=>!c.dependencies?.[e]),u.length>0&&W(l,["add","-D",...new Set(u)],n.dirPath),m.length>0&&W("poetry",["add","--group","dev",...new Set(m)],n.dirPath))}(n,s,i)})}function $e(e){if(e.isBun){const t={"check-for-ai":"bun run cleanup && bun run typecheck && bun run test --silent",cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun wb test",typecheck:"bun --bun wb typecheck"};return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||delete t.typecheck,t}{let t={"check-for-ai":"yarn format > /dev/null && yarn lint-fix --quiet && yarn typecheck && yarn test --silent",cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:"eslint --color","lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ce.prettier.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};if(e.doesContainsSubPackageJsons){const e=t.test;t=d({...t},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ce.prettier.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}),e?.includes("wb test")&&(t.test=e)}else e.depending.pyright&&(t.typecheck=t.typecheck?`${t.typecheck} && `:"",t.typecheck+="pyright");return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages?e.depending.wb&&(t.typecheck="wb typecheck"):delete t.typecheck,t}}function Fe(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const Ce={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nyarn typecheck\n'.trim(),postMerge:'\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function Ee(n){return k.functionIgnoringException("generateHuskyrcUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,"package.json"),i=await e.promises.readFile(s,"utf8"),o=JSON.parse(i);o.scripts||={},delete o.scripts.postinstall,delete o.scripts.postpublish,delete o.scripts.prepare,delete o.scripts.prepublishOnly,delete o.scripts.prepack,delete o.scripts.postpack;const r=t.resolve(n.dirPath,".husky");if(await Promise.all([e.promises.writeFile(s,JSON.stringify(o,void 0,2)),e.promises.rm(r,{force:!0,recursive:!0})]),n.isBun)return void W("git",["config","--unset","core.hooksPath"],n.dirPath);W("yarn",["dlx","husky-init","--yarn2"],n.dirPath);const a=t.resolve(r,"pre-commit");await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})),await $.run(()=>e.promises.writeFile(a,Ce.preCommit+"\n"));const{typecheck:c}=$e(n);if(c){let s=n.repository?.startsWith("github:WillBoosterLab/")&&!n.repository?.toLocaleLowerCase().includes("exercode")?Ce.prePushForLab:Ce.prePush;s=s.replace("yarn typecheck",c.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await $.run(()=>e.promises.writeFile(t.resolve(r,"pre-push"),s+"\n",{mode:493}))}const l=`${Ce.postMerge}\n\n${Be(n).join("\n")}\n`;await $.run(()=>e.promises.writeFile(t.resolve(r,"post-merge"),l,{mode:493}))}(n)})}function Be(e){const t=[];e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "awk '{print \$1}' .tool-versions | xargs -I{} asdf plugin add {}"`,String.raw`run_if_changed "\..+-version" "asdf plugin update --all"`),e.versionsText?.includes("python ")&&t.push(String.raw`run_if_changed "\..+-version" "asdf install python"`),e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "asdf install"`);const n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";return t.push(`run_if_changed "package\\.json" "${n}${s}"`),e.doesContainsPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`),t}function Oe(e,t,n,s){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${s}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${s})" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="${e}" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n`}const De=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ce.prettier.map(e=>Oe("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,Te=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ce.prettier.map(e=>Oe("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-errors","Biome",e)).join("")}\n </component>\n</project>\n`;async function Ie(n){return k.functionIgnoringException("generateIdeaSettings",async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainsJavaScript||n.doesContainsJavaScriptInPackages||n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages||n.doesContainsPackageJson&&!n.doesContainsPubspecYaml&&!n.doesContainsGemfile&&!n.doesContainsGoMod&&!n.doesContainsPomXml?$.run(()=>C.generateFile(i,n.isBun?Te:De)):$.run(()=>e.promises.rm(i,{force:!0})))}})}const Ae={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-commit":{commands:{cleanup:{glob:"*.{cjs,css,cts,htm,html,js,json,json5,jsonc,jsx,md,mjs,mts,scss,ts,tsx,vue,yaml,yml}",run:"bun --bun wb lint --fix --format {staged_files} && git add {staged_files}"},"check-migrations":{glob:"**/migration.sql",run:"\nif grep -q 'Warnings:' {staged_files}; then\n echo \"Migration SQL files ({staged_files}) contain warnings! Please solve the warnings and commit again.\"\n exit 1\nfi\n".trim()}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},Re={prePush:"bun --bun node_modules/.bin/wb typecheck",prePushForLab:'\n#!/bin/bash\n\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nbun --bun node_modules/.bin/wb typecheck\n'.trim(),postMerge:'\n#!/bin/bash\n\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function We(n){return k.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook");await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),m.dump(Ae,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]);const{typecheck:i}=$e(n);if(i){const i=n.repository?.startsWith("github:WillBoosterLab/")?Re.prePushForLab:Re.prePush;e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await $.run(()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493}))}const o=`${Re.postMerge}\n\n${Be(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await $.run(()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),o,{mode:493}))}(n)})}const Le={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};async function Je(n){return k.functionIgnoringException("generateLintstagedrc",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await $.run(()=>e.promises.rm(s,{force:!0}));const i=n.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",o=[];if(n.doesContainsJavaScript||n.doesContainsTypeScript){const e=`\n '${Ne(n)}': [${JSON.stringify(`${i}eslint --fix${ke.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;o.push(e)}const r=n.isRoot?" && !file.includes('/packages/')":"";o.push(`\n './**/*.{${ce.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/') && !file.includes('/test/fixtures/')${r});${function(e){return e.doesContainsJavaScript||e.doesContainsTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${Ne(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(n)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${i}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${i}sort-package-json');\n }\n return commands;\n },\n './**/migration.sql': (files) => {\n for (const file of files) {\n const content = fs.readFileSync(file, 'utf-8');\n if (content.includes('Warnings:')) {\n return [\n \`!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.\`,\n ];\n }\n }\n return [];\n},`),n.doesContainsPubspecYaml&&o.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`flutter format ${filteredFiles.join(' ')}`];\n },");n.doesContainsPoetryLock&&o.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const a=`const fs = require('fs');\nconst path = require('path');\n${n.doesContainsJavaScript||n.doesContainsTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${o.join("")}\n};\n`;await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0})),await $.run(()=>C.generateFile(s,a))}(n)})}function Ne(e){const t=function(e){return e.depending.blitz?Le.blitz:Le.node}(e).map(e=>`${e}/**/`);return`{,${t.join(",")}}*.{${ce.eslint.join(",")}}`}async function ze(n){return k.functionIgnoringException("generateNextConfigJson",async()=>{const s=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!s)return;const i=(await e.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,(e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`));await $.run(()=>C.generateFile(s,i))})}async function Ge(e){return k.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await C.readFileIgnoringError(n)??"",i=oe.getHeadUserContent(s),o=oe.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await oe.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainsPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await $.run(()=>C.generateFile(n,l))})}const Ue={venvPath:".",venv:".venv"};async function He(n){return k.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=f(Ue);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:V})}catch{}const o=JSON.stringify(s);await $.run(()=>C.generateFile(i,o))})}async function Me(n){return k.functionIgnoringException("generateReadme",async()=>{const s=t.resolve(n.dirPath,"README.md");let i=await e.promises.readFile(s,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(i=qe(i,"[](https://github.com/semantic-release/semantic-release)"));const o=n.repository?.slice(n.repository?.indexOf(":")+1),r=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const s of r){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let r=s;r=r[0].toUpperCase()+r.slice(1,r.indexOf(".")),r=r.replace("-"," ");const a=`[](https://github.com/${o}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=qe(i,a))}await $.run(()=>C.generateFile(s,i))})}function qe(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const s=e.slice(0,n+1);let i=e.slice(n+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${s}${t}\n${i}`}return`${e}\n${t}\n`}async function Ye(n){return k.functionIgnoringException("generateReleaserc",async()=>{const s=t.resolve(n.dirPath,".releaserc.json"),i=JSON.parse(await e.promises.readFile(s,"utf8")),o=i?.plugins||[];for(let e=0;e<o.length;e++){const t=Array.isArray(o[e])?o[e][0]:o[e],n=Array.isArray(o[e])&&o[e][1]||{};"@semantic-release/commit-analyzer"===t?o[e]=["@semantic-release/commit-analyzer",d.all([n,{preset:"conventionalcommits"}],{arrayMerge:V})]:"@semantic-release/github"===t&&(o[e]=["@semantic-release/github",d.all([n,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:V})])}const r=JSON.stringify(i);await $.run(()=>C.generateFile(s,r))})}const Ke={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function Ve(n){return k.functionIgnoringException("generateRenovateJson",async()=>{let s=f(Ke);const i=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${i}5`))return;try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:V}),s.extends=s.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(s.packageRules??=[],s.packageRules.some(e=>e.matchPackageNames.includes("next"))||s.packageRules.push({matchPackageNames:["next"],enabled:!1})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const o=JSON.stringify(s);await $.run(()=>C.generateFile(i,o))})}function Xe(e){const t=Object.entries(e).sort(([e],[t])=>e.localeCompare(t));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&Xe(s);return e}const Qe={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*","packages/*/src/**/*","packages/*/tests/**/*","packages/*/scripts/**/*"]},Ze={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*"]};async function et(n){return k.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=f(n.isRoot?Qe:Ze);n.doesContainsJsxOrTsx||n.doesContainsJsxOrTsxInPackages||delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainsSubPackageJsons&&(s.include=s.include?.filter(e=>!e.startsWith("packages/*/"))),n.isEsmPackage&&(s.compilerOptions={...s.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(i,"utf8"),o=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===o.extends&&delete o.extends,delete s.compilerOptions?.target,n.isEsmPackage||(delete s.compilerOptions?.module,delete s.compilerOptions?.moduleResolution),o.compilerOptions?.jsx&&delete s.compilerOptions?.jsx,s=d.all([s,o,s],{arrayMerge:X}),s.include=s.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__"))}catch{}Xe(s),s.include?.sort();const o=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await $.run(()=>C.generateFile(i,o))})}const tt=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function nt(n){return k.functionIgnoringException("generateVscodeSettings",async()=>{try{const s=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(s,"utf8");let o=JSON.parse(i);for(const e of tt)o=d.all([o,st(e)]);n.doesContainsPoetryLock&&(o=d.all([o,st("**/.venv/**")])),n.depending.next&&(o=d.all([o,st("**/.next/**")])),"editor.codeActionsOnSave"in o&&delete o["editor.codeActionsOnSave"],"editor.formatOnSave"in o&&delete o["editor.formatOnSave"],Xe(o??{});const r=JSON.stringify(o,void 0,2);await $.run(()=>C.generateFile(s,r))}catch{}})}function st(e){return{"files.watcherExclude":{[e]:!0}}}const it={test:{name:"Test",on:{pull_request:{"paths-ignore":["**.md","**/docs/**"]},push:{branches:["main","wbfy"],"paths-ignore":["**.md","**/docs/**"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},wbfy:{name:"Willboosterify",on:{workflow_dispatch:null},jobs:{wbfy:{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy.yml@main"}}},"wbfy-merge":{name:"Merge wbfy",on:{workflow_dispatch:null},jobs:{"wbfy-merge":{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy-merge.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"notify-ready":{name:"Notify ready",on:{issues:{types:["labeled"]}},jobs:{"notify-ready":{uses:"WillBooster/reusable-workflows/.github/workflows/notify-ready.yml@main",secrets:{DISCORD_WEBHOOK_URL:"${{ secrets.DISCORD_WEBHOOK_URL_FOR_READY }}"}}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"add-issue-to-project":{name:"Add issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",secrets:{GH_PROJECT_URL:"${{ secrets.GH_PROJECT_URL }}"}}}},"add-ready-issue-to-project":{name:"Add ready issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-ready-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",with:{labeled:"ready :rocket:"},secrets:{GH_PROJECT_URL:"https://github.com/orgs/WillBoosterLab/projects/5"}}}}};async function ot(n){return k.functionIgnoringException("generateWorkflow",async()=>{const s=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(s,{recursive:!0});const i=t.resolve(n.dirPath,".github","semantic.yml");await $.run(()=>e.promises.rm(i,{force:!0,recursive:!0}));const o=await e.promises.readdir(s,{withFileTypes:!0}),r=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml",...o.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&r.add("release.yml"),(n.isPublicRepo||n.repository?.startsWith("github:WillBoosterLab/"))&&(r.add("add-ready-issue-to-project.yml"),r.add("notify-ready.yml"));for(const e of r){const i=t.basename(e,".yml");await $.run(()=>rt(n,s,i))}await $.run(()=>e.promises.rm(t.join(s,"add-focused-issue-to-project.yml"),{force:!0,recursive:!0}))})}async function rt(n,s,i){let o=f(it[i]??{});const r=t.join(s,`${i}.yml`);try{const t=await e.promises.readFile(r,"utf8"),n=m.load(t);o=d.all([o,n,o],{arrayMerge:X})}catch{}i.startsWith("deploy")&&(o={...o,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},o.jobs&&function(e,t){const n=e[t];delete e[t],e[t]=n}(o,"jobs"),o.on?.push&&(o.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...o.on.push["paths-ignore"]??[]])]));for(const e of Object.values(o.jobs)){if(!e.uses?.includes?.("/reusable-workflows/"))return;at(n,e,i)}switch(i){case"release":if(o.on?.schedule)delete o.on.push;else{if(!(o.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});o.on.push.branches=n.release.branches}break;case"test":o.on?.push&&(o.on.push.branches=o.on.push.branches.filter(e=>"renovate/**"!==e));break;case"wbfy":o.on&&ct(o,20,24);break;case"wbfy-merge":ct(o,1,4)}if(function(e){delete e.jobs["add-to-project"]}(o),await lt(o,r),"release"===i)await e.promises.rm(t.join(s,"semantic-release.yml"),{force:!0});else if("sync"===i){if(await e.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!o.jobs.sync||!o.jobs.sync.with)return;o.jobs["sync-force"]=o.jobs.sync;const n=o.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;o.jobs.sync.with.sync_params_without_dest=`--force ${n}`,o.name="Force to Sync",o.on={workflow_dispatch:null},delete o.jobs.sync,await lt(o,t.join(s,"sync-force.yml"))}}function at(e,t,n){if(t.with||={},t.secrets||={},"test"!==n&&"release"!==n&&"wbfy"!==n&&"wbfy-merge"!==n&&"add-issue-to-project"!==n&&"add-ready-issue-to-project"!==n||(t.secrets.GH_TOKEN=e.isPublicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==n&&"test"!==n||(t.secrets.NPM_TOKEN="${{ secrets.NPM_TOKEN }}"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with?.sync_params_without_dest;"string"==typeof e&&(t.with.sync_params_without_dest=e.replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,function(e){if(!e.with)return;delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,delete e.with.cpu_arch,delete e.with.label,delete e.with.labelOperator}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&"string"==typeof t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,"")),e.doesContainsDockerfile&&("extra-large"!==t.with.ci_size&&(n.startsWith("deploy")||n.startsWith("test"))&&(t.with.ci_size="large"),n.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===n||"test"===n||"wbfy"===n||"wbfy-merge"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?Xe(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Xe(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function ct(e,t,n){const[s,i]=(e.on.schedule?.[0]?.cron||"").split(" ").map(Number);if(0!==s&&Number.isInteger(i)){const e=(i+9)%24;if(t<n?t<=e&&e<n:t<=e||e<n)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(n-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function lt(t,n){const s=m.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function pt(n){return k.functionIgnoringException("generateYarnrcYml",async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await $.run(()=>e.promises.rm(s,{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await $.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const i=L("yarn",["--version"],n.dirPath),o=function(e,t){const n=L("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);dt(i)<=dt(o)&&i!==o&&W("yarn",["set","version",o],n.dirPath,1);const r=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(r,{recursive:!0});for(const n of await e.promises.readdir(r))n.startsWith("yarn-")&&!n.startsWith(`yarn-${o}.`)&&await $.run(()=>e.promises.rm(t.join(r,n)));const a=t.resolve(n.dirPath,".yarnrc");await $.run(()=>e.promises.rm(a,{force:!0}));const c=m.load(await e.promises.readFile(s,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const s=t.resolve(n.dirPath,".yarnrc","undefined.cjs");await $.run(()=>e.promises.rm(s,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,m.dump(c,{lineWidth:-1})),W("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function dt(e){const[t]=e.split(".");return Number(t)}async function ut(e){return k.functionIgnoringException("setupLabels",async()=>{if(!I)return;const[t,n]=R.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await mt(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await mt(t,n,"d2: easy :rabbit2:","DDD6FE"),await mt(t,n,"d3: medium :ox:","C4B5FD"),await mt(t,n,"d4: hard :squid:","A78BFA"),await mt(t,n,"d5: x-hard :whale2:","8B5CF6"),await mt(t,n,"p1: critical :fire::fire::fire:","EF4444"),await mt(t,n,"p2: urgent :fire::fire:","F87171"),await mt(t,n,"p3: important :fire:","FCA5A5"),await mt(t,n,"p4: nice to have :droplet:","FECACA"),await mt(t,n,"r: blitz","5300bc"),await mt(t,n,"r: firebase","ffca28"),await mt(t,n,"r: prisma","0c344b"),await mt(t,n,"r: react","61dafb"),await mt(t,n,"r: svelte","ff3e00"),await mt(t,n,"r: semantic-release","494949"),await mt(t,n,"ready :rocket:","22C55E"),await mt(t,n,"review requested :mag:","FBCA04"),await mt(t,n,"released :bookmark:","6366F1"),await mt(t,n,"s: 0.5h :clock1230:","F3F4F6"),await mt(t,n,"s: 1h :clock1:","E5E7EB"),await mt(t,n,"s: 2h :clock2:","D1D5DB"),await mt(t,n,"s: 3h :clock3:","9CA3AF"),await mt(t,n,"s: 5h :clock5:","6B7280"),await mt(t,n,"s: 8h :clock8:","4B5563"),await mt(t,n,"s: 13h :clock1:","374151"),await mt(t,n,"t: build :hammer:","BFDBFE"),await mt(t,n,"t: chore :broom:","BFDBFE"),await mt(t,n,"t: ci :construction_worker:","BFDBFE"),await mt(t,n,"t: docs :memo:","BFDBFE"),await mt(t,n,"t: feat :sparkles:","BFDBFE"),await mt(t,n,"t: fix :bug:","BFDBFE"),await mt(t,n,"t: perf :zap:","BFDBFE"),await mt(t,n,"t: refactor :recycle:","BFDBFE"),await mt(t,n,"t: style :lipstick:","BFDBFE"),await mt(t,n,"t: test :test_tube:","BFDBFE"),await mt(t,n,"project","24292F"),await mt(t,n,"focused :dart:","22C55E"),await mt(t,n,"ai-pr :robot:","00B4D8"),await ft(t,n,"bug"),await ft(t,n,"documentation"),await ft(t,n,"duplicate"),await ft(t,n,"enhancement"),await ft(t,n,"good first issue"),await ft(t,n,"help wanted"),await ft(t,n,"invalid"),await ft(t,n,"question"),await ft(t,n,"wontfix"),await ft(t,n,"ready"),await ft(t,n,"review requested"),await ft(t,n,"released"),await ft(t,n,"semantic-release"),await ft(t,n,"llm-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function mt(e,t,n,s){try{await A.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:n,color:s})}catch{await A.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n,color:s})}}async function ft(e,t,n){try{await A.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const gt=["READY_DISCORD_WEBHOOK_URL"];async function ht(e){return k.functionIgnoringException("setupSecrets",async()=>{if(!I||!v.doesUploadEnvVars)return;const[t,n]=R.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const s=g.config().parsed||{};if(0!==Object.keys(s).length)try{for(const e of gt)try{await A.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const i=await A.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=i.data;await h.ready;for(const[i,a]of Object.entries(s)){if(e.isPublicRepo&&"GH_BOT_PAT"===i)continue;if(!e.isPublicRepo&&"PUBLIC_GH_BOT_PAT"===i)continue;const s=h.from_base64(o,h.base64_variants.ORIGINAL),c=h.from_string(a),l=h.crypto_box_seal(c,s),p=h.to_base64(l,h.base64_variants.ORIGINAL);await A.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:i,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function yt(e){const[t,n]=R.getOrgAndName(e.repository??"");t&&n&&("WillBooster"!==t&&"WillBoosterLab"!==t||await s(()=>A.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}})))}const wt={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on this page.\n - PR title follows [Angular\'s commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn\'t have `WIP:`.\n - The test command (e.g., `yarn test`) passed.\n - The lint command (e.g., `yarn lint`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I\'ve reviewed my changes on the GitHub diff view.\n- [ ] I\'ve written the steps to test my changes.\n- [ ] I\'ve added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn\'t modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language `C`.\n3. Write the following code:\n ```c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n ```\n4. Push `Submit` button.\n5. ...\n--\x3e\n'.trim()};async function bt(n){return k.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(wt)){const o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(y(t,i)>i.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await $.run(()=>C.generateFile(o,i))}})}const vt=b.object({typos:b.object({all:b.record(b.string()).optional(),doc:b.record(b.string()).optional(),ts:b.record(b.string()).optional(),text:b.record(b.string()).optional()}).optional()});async function kt(n,s){const i=t.resolve(n,"package.json");try{const o=e.existsSync(i);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),s=JSON.parse(await r.readFile(e,"utf8"));d=s?.branches||[],u=s?.plugins?.flat()||[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=w(e),s=(await n.getRemotes(!0)).find(e=>"origin"===e.name),i=s?.refs?.fetch??s?.refs?.push;if("string"==typeof i){const e=await xt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await xt(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g="";try{g+=(await r.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[e,s]of[["java","java"],["node","nodejs"],["python","python"]])try{const i=await r.readFile(t.resolve(n,`.${e}-version`),"utf8");g&&(g+="\n"),g+=s+" "+i.trim()}catch{}let h="";try{h=await r.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let b;try{const e=await r.readFile(y,"utf8");b=vt.parse(JSON.parse(e))}catch{}const v={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:f?.full_name?`github:${f.full_name}`:void 0,isBun:s?.isBun||e.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainsSubPackageJsons:jt("packages/**/package.json",n),doesContainsDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainsGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainsGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainsPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainsPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainsPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainsPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainsTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainsVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainsJavaScript:jt("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScript:jt("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsx:jt("{app,src,tests}/**/*.{t,j}sx",n),doesContainsJavaScriptInPackages:jt("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScriptInPackages:jt("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsxInPackages:jt("packages/**/{app,src,tests}/**/*.{t,j}sx",n),depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],litestream:h.includes("install-litestream.sh"),next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},versionsText:g,packageJson:l,wbfyJson:b};if(v.isBun||(v.eslintBase=function(e){if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainsTypeScript)return e.doesContainsJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainsJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainsJavaScript)return"@willbooster/eslint-config-js"}(v)),v.doesContainsGemfile||v.doesContainsGoMod||v.doesContainsPackageJson||v.doesContainsPoetryLock||v.doesContainsPomXml||v.doesContainsPubspecYaml||v.doesContainsTemplateYaml)return v}catch{}}function jt(e,t){return a.globSync(e,{dot:!0,cwd:t,ignore:_}).length>0}async function xt(e){const[t,n]=R.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await A.request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch{}return s}await async function(){const n=await o(process.argv.slice(2)).command("$0 [paths..]","Make a given project follow the WillBooster standard",e=>{e.positional("paths",{describe:"project paths to be wbfied",array:!0,type:"string",default:["."]})}).options({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).strict().argv;v.isVerbose=n.verbose,v.doesUploadEnvVars=n.env;for(const s of n.paths){const o=t.join(s,"packages"),r=(await i(()=>e.promises.readdir(o,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(o,e.name));await S([s,...r]);const a=await kt(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=E(a),l=(await Promise.all(r.map(e=>kt(e,a)))).filter(e=>!!e),p=[a,...l];if(v.isVerbose)for(const e of p)console.info(e);await M(a),await pt(a),await Promise.all([j(a),P(a),c.then(()=>Me(a)),ae(a),pe(a),fe(a),bt(a),Ie(a),Ve(a),Ye(a),ot(a),ut(a),ht(a),yt(a),...a.isBun?[Z(a),Ee(a).then(()=>We(a))]:[Ee(a)],Je(a)]),await $.promiseAll();const d=[];for(const e of p)(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(F(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(x(e)),e.depending.next&&d.push(ze(e)),await he(e,a),await $.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await Ge(e),await Se(e,a,n.skipDeps),d.push(Je(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(nt(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(et(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isBun&&d.push(Q(e)),a.isWillBoosterConfigs||d.push(ue(e))),e.depending.pyright&&d.push(He(e)));await Promise.all(d),await $.promiseAll();const u=a.isBun?"bun":"yarn";if(W(u,["cleanup"],s),a.isBun){W(u,["update"],s);const n=t.join(s,"bun.lockb");e.existsSync(n)&&(e.promises.rm(n),W(u,["install","--save-text-lockfile","--frozen-lockfile","--lockfile-only"],s))}else W(u,["install"],s)}}();
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy9maXhlcnMvcGxheXdyaWdodENvbmZpZy50cyIsIi4uL3NyYy91dGlscy9nbG9iVXRpbC50cyIsIi4uL3NyYy9maXhlcnMvcHJpc21hLnRzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbkNvbnN0YW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FzZGYudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYmlvbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRpZ25vcmUudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9odXNreXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbmV4dGNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHlyaWdodGNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi50cyIsIi4uL3NyYy91dGlscy9vYmplY3RVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMveWFybnJjLnRzIiwiLi4vc3JjL2dpdGh1Yi9sYWJlbC50cyIsIi4uL3NyYy9naXRodWIvc2VjcmV0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvdGVtcGxhdGUudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlOiBib29sZWFuO1xuICBkb2VzVXBsb2FkRW52VmFyczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlzVmVyYm9zZSA9IGZhbHNlO1xuICAgIHRoaXMuZG9lc1VwbG9hZEVudlZhcnMgPSBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4RG9ja2VyZmlsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhEb2NrZXJmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0RvY2tlcmZpbGUpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBjb25maWcuZG9ja2VyZmlsZTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudDtcblxuICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgbmV3Q29udGVudCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC9yZXRyaWVzOi4rLC8sICdyZXRyaWVzOiBwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEsJyk7XG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9EQVRBQkFTRV9VUkw9XCI/KC4rXFwuc3FsaXRlMylcIj9bXFxuJF0vLFxuICAgICAgICAnREFUQUJBU0VfVVJMPVwiJDE/Y29ubmVjdGlvbl9saW1pdD0xXCJcXG4nXG4gICAgICApO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24ocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlRGlyUGF0aHMubWFwKGFzeW5jIChwYWNrYWdlRGlyUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ19fdGVzdHNfXycpO1xuICAgICAgICBjb25zdCBuZXdUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3Rlc3RzJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpO1xuICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2VBbGwoJ19fdGVzdHNfXycsICd0ZXN0cycpO1xuICAgICAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG5cbiAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksIG5ld0NvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBlRGVmaW5pdGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuOiBQYWNrYWdlQ29uZmlnW11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cGVEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsaWJUeXBlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0B0eXBlcycpO1xuICAgIGNvbnN0IHNyY1R5cGVEaXJQYXRoID1cbiAgICAgIGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucyA/IHVuZGVmaW5lZCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3NyYycsICd0eXBlcycpO1xuXG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnJlYWRkaXIobGliVHlwZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSk7XG4gICAgaWYgKCFkaXJlbnRzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gZGlyZW50Lm5hbWUuc2xpY2UoMCwgLTUpO1xuICAgICAgY29uc3QgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID0gZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5kLnRzJyk7XG4gICAgICBsZXQgcGFja2FnZU5hbWUgPSBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPyBkaXJOYW1lIDogZGlyZW50Lm5hbWU7XG4gICAgICBpZiAocGFja2FnZU5hbWUuaW5jbHVkZXMoJ19fJykpIHtcbiAgICAgICAgcGFja2FnZU5hbWUgPSBgQCR7cGFja2FnZU5hbWUucmVwbGFjZSgnX18nLCAnLycpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNMaWJyYXJ5ID0gY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuLnNvbWUoXG4gICAgICAgIChjb25maWcpID0+XG4gICAgICAgICAgY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICAgICk7XG5cbiAgICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uKSB7XG4gICAgICAgIGlmIChoYXNMaWJyYXJ5KSB7XG4gICAgICAgICAgLy8gTW92ZSBAdHlwZXMvPG5hbWU+L2luZGV4LmQudHMgaWYgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lKSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSwgJ2luZGV4LmQudHMnKSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNyY1R5cGVEaXJQYXRoKSB7XG4gICAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+IGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgc3JjVHlwZURpclBhdGggJiYgIWhhc0xpYnJhcnkpIHtcbiAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+LmQudHMgaWYgbm90IGluc3RhbGxlZFxuICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgIGlnbm9yZUVub2VudEFzeW5jKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUoXG4gICAgICAgICAgICAgIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdpbmRleC5kLnRzJyksXG4gICAgICAgICAgICAgIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgYCR7ZGlyZW50Lm5hbWV9LmQudHNgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuZXhwb3J0IGNvbnN0IGZzVXRpbCA9IHtcbiAgYXN5bmMgcmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzcC53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cG9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luQ29kZShvbGRDb250ZW50KTtcbiAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKFteJF0pL2csICdjZi4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKFteJF0pL2csICdlLmcuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLihbXiRdKS9nLCAnaS5lLiQxJyk7XG59XG5cbmZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKiljXFwuZlxcLi9nLCAnLy8kMWNmLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKillZ1xcLi9nLCAnLy8kMWUuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopaWVcXC4vZywgJy8vJDFpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jb25zdCB0b2tlbiA9XG4gIHByb2Nlc3MuZW52LkdIX0JPVF9QQVQgfHwgcHJvY2Vzcy5lbnYuUFVCTElDX0dIX0JPVF9QQVQgfHwgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHwgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOO1xuZXhwb3J0IGNvbnN0IGhhc0dpdEh1YlRva2VuID0gISF0b2tlbjtcbmV4cG9ydCBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICBhdXRoOiB0b2tlbixcbn0pO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzPy5hdCgtMSk/LnJlcGxhY2UoLy5naXQkLywgJycpID8/ICcnO1xuICAgIHJldHVybiBbb3JnLCBuYW1lXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBpZiAocmV0LnN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICBjb25zdCBlcnJvciA9IHByb2Muc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBjYXVzZWQgdGhlIGZvbGxvd2luZyBlcnJvcjpcXG4gJHtlcnJvcn1gKTtcbiAgfVxuICByZXR1cm4gcHJvYy5zdGRvdXQudG9TdHJpbmcoKS50cmltKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICAvLyBSZW1vdmUgYmVycnkgZnJvbSBQQVRIXG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEgucmVwbGFjZShgJHtlbnYuQkVSUllfQklOX0ZPTERFUn06YCwgJycpO1xuICB9XG5cbiAgaWYgKGVudi5BU0RGX0RJUikge1xuICAgIGFyZ3MgPSBbJy1sJywgJy1jJywgYCR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gXTtcbiAgICBjb21tYW5kID0gJ2Jhc2gnO1xuICB9XG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIodmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgLy8gZS5nLiBqYXZhIGFkb3B0b3Blbmpkay0xMS4wLjE3KzhcbiAgY29uc3QgbnVtYmVycyA9IHZlcnNpb25cbiAgICAuc3BsaXQoL1srLi1dLylcbiAgICAubWFwKE51bWJlcilcbiAgICAuZmlsdGVyKChudW0pID0+ICFOdW1iZXIuaXNOYU4obnVtKSk7XG4gIGxldCB2ZXJzaW9uTnVtYmVyID0gMDtcbiAgbGV0IGRpdmlzb3IgPSAxO1xuICBmb3IgKGNvbnN0IG51bSBvZiBudW1iZXJzKSB7XG4gICAgdmVyc2lvbk51bWJlciArPSBudW0gKiBkaXZpc29yO1xuICAgIGRpdmlzb3IgLz0gMTAwMDtcbiAgfVxuICByZXR1cm4gdmVyc2lvbk51bWJlcjtcbn1cbiIsImV4cG9ydCBjb25zdCBQWVRIT05fVkVSU0lPTiA9ICczLjkuMTknO1xuZXhwb3J0IGNvbnN0IEpBVkFfVkVSU0lPTiA9ICd6dWx1LTExLjc0LjE1Jztcbi8vIEJlY2F1c2UgV2ViS2l0IGNhbm5vdCBsb2ctaW4gb24gQmxpdHogdjIuMC41K1xuZXhwb3J0IGNvbnN0IEJMSVRaX1ZFUlNJT04gPSAnMi4wLjQnO1xuZXhwb3J0IGNvbnN0IE5FWFRfVkVSU0lPTiA9ICcxNC4yLjUnO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgY29udmVydFZlcnNpb25JbnRvTnVtYmVyIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBKQVZBX1ZFUlNJT04sIFBZVEhPTl9WRVJTSU9OIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbkNvbnN0YW50cy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRvb2xWZXJzaW9ucyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRvb2xWZXJzaW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5jb25zdCBDT1JFX1RPT0xTID0gbmV3IFNldChbJ2phdmEnLCAnbm9kZWpzJywgJ2J1bicsICdweXRob24nXSk7XG5jb25zdCBERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMgPSBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXTtcblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjb25maWcudmVyc2lvbnNUZXh0KSByZXR1cm47XG5cbiAgY29uc3QgZHVwbGljYXRhYmxlTGluZXMgPSBjb25maWcudmVyc2lvbnNUZXh0XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBbbmFtZSwgdmVyc2lvbl0gPSBsaW5lLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgLy8gVG8gbW92ZSB0aGUgdG9wIG9mIHRoZSBzb3J0ZWQgbGlzdCwgd2UgbmVlZCB0byBhZGQgYSBzcGFjZS5cbiAgICAgIHJldHVybiBgJHtDT1JFX1RPT0xTLmhhcyhuYW1lKSA/ICcgJyA6ICcnfSR7bmFtZX0gJHt2ZXJzaW9ufWA7XG4gICAgfSlcbiAgICAuc29ydCgpXG4gICAgLy8gUmVtb3ZlIGFkZGVkIHNwYWNlcy5cbiAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSlcbiAgICAvLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGFmdGVyIGxlZnRob29rIGlzIGluc3RhbGxlZCB2aWEgbnBtLlxuICAgIC5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLnN0YXJ0c1dpdGgoJ2xlZnRob29rJykpO1xuICBjb25zdCBsaW5lcyA9IFsuLi5uZXcgU2V0KGR1cGxpY2F0YWJsZUxpbmVzKV07XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9weXBpLm9yZy9weXBpL3BvZXRyeS9qc29uJyk7XG4gICAgY29uc3QganNvbiA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgaW5mbz86IHsgdmVyc2lvbjogc3RyaW5nIH0gfSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwb2V0cnlWZXJzaW9uID0ganNvbj8uaW5mbz8udmVyc2lvbjtcbiAgICBpZiAocG9ldHJ5VmVyc2lvbikge1xuICAgICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3BvZXRyeScsIHBvZXRyeVZlcnNpb24pO1xuICAgIH1cbiAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAncHl0aG9uJywgUFlUSE9OX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ2phdmEnLCBKQVZBX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25zdCBidW5WZXJzaW9uID0gYXdhaXQgZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yignb3Zlbi1zaCcsICdidW4nKTtcbiAgICAgIGlmIChidW5WZXJzaW9uKSB1cGRhdGVWZXJzaW9uKGxpbmVzLCAnYnVuJywgYnVuVmVyc2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCducG0nLCBbJ3Nob3cnLCAneWFybicsICd2ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICd5YXJuJywgdmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwcmVmaXggb2YgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTKSB7XG4gICAgY29uc3QgdmVyc2lvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKTtcbiAgICB2b2lkIGZzLnByb21pc2VzLnJtKHZlcnNpb25QYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgdG9vbFZlcnNpb25zUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyk7XG4gIGF3YWl0IChsaW5lcy5sZW5ndGggPiAwXG4gICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHRvb2xWZXJzaW9uc1BhdGgsIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbicpKVxuICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHRvb2xWZXJzaW9uc1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ3BsdWdpbicsICd1cGRhdGUnLCAnLS1hbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ2luc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVWZXJzaW9uKGxpbmVzOiBzdHJpbmdbXSwgdG9vbE5hbWU6IHN0cmluZywgbmV3VmVyc2lvbjogc3RyaW5nLCBoZWFkID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc3QgaW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGwpID0+IGwuc3BsaXQoL1xccysvKVswXSA9PT0gdG9vbE5hbWUpO1xuICBjb25zdCBuZXdMaW5lID0gYCR7dG9vbE5hbWV9ICR7bmV3VmVyc2lvbn1gO1xuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgbGluZXMuc3BsaWNlKGhlYWQgPyAwIDogbGluZXMubGVuZ3RoLCAwLCBuZXdMaW5lKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGxpbmVzW2luZGV4XS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIobmV3VmVyc2lvbikgPiBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIodmVyc2lvbikpIHtcbiAgICAgIGxpbmVzW2luZGV4XSA9IG5ld0xpbmU7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG9zaXRvcnk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgLy8gRmV0Y2ggdGhlIGxhdGVzdCByZWxlYXNlIGZyb20gdGhlIHJlcG9zaXRvcnlcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9sYXRlc3QnLCB7XG4gICAgICBvd25lcjogb3JnYW5pemF0aW9uLFxuICAgICAgcmVwbzogcmVwb3NpdG9yeSxcbiAgICB9KTtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVzcG9uc2UuZGF0YS50YWdfbmFtZTtcbiAgICBjb25zdCBpbmRleCA9IHZlcnNpb24ubGFzdEluZGV4T2YoJ3YnKTtcbiAgICBjb25zdCB2ZXJzaW9uTnVtYmVyVGV4dCA9IGluZGV4ID09PSAtMSA/IHZlcnNpb24gOiB2ZXJzaW9uLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgLy8gQ2hlY2sgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhIG51bWJlclxuICAgIHJldHVybiAvXlxcZC8udGVzdCh2ZXJzaW9uTnVtYmVyVGV4dCkgPyB2ZXJzaW9uTnVtYmVyVGV4dCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggQnVuIHRhZ3MgZHVlIHRvOicsIGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnQgKi9cblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogb2JqZWN0W10sIHNvdXJjZTogb2JqZWN0W10sIG9wdGlvbnM6IGFueSk6IG9iamVjdFtdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJpb21lSnNvbmMnLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSB7XG4gICAgICByb290OiBjb25maWcuaXNSb290LFxuICAgICAgJHNjaGVtYTogJy4vbm9kZV9tb2R1bGVzL0BiaW9tZWpzL2Jpb21lL2NvbmZpZ3VyYXRpb25fc2NoZW1hLmpzb24nLFxuICAgICAgZXh0ZW5kczogWydAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJ10sXG4gICAgfTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlID0gYHRlbGVtZXRyeSA9IGZhbHNlXG5cbltpbnN0YWxsXVxuZXhhY3QgPSB0cnVlXG5cbltydW5dXG5idW4gPSB0cnVlXG5gO1xuXG5jb25zdCBuZXdDb250ZW50V2l0aEV4YWN0RmFsc2UgPSBgdGVsZW1ldHJ5ID0gZmFsc2VcblxuW2luc3RhbGxdXG5leGFjdCA9IGZhbHNlXG5cbltydW5dXG5idW4gPSB0cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgY29uc3QgY29udGVudCA9XG4gICAgICBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSAmJiBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykuaW5jbHVkZXMoJ2V4YWN0ID0gZmFsc2UnKVxuICAgICAgICA/IG5ld0NvbnRlbnRXaXRoRXhhY3RGYWxzZVxuICAgICAgICA6IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnNvcnQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAncHknXS5zb3J0KCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnNvcnQoKSxcbiAgZXNsaW50OiBbJ2NqcycsICdtanMnLCAnanMnLCAnY3RzJywgJ210cycsICd0cycsICd0c3gnLCAnanN4J10uc29ydCgpLFxuICBwcmV0dGllcjogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjc3MnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnbWQnLFxuICAgICdzY3NzJyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0uc29ydCgpLFxuICAvLyBjZi4gaHR0cHM6Ly9iaW9tZWpzLmRldi9pbnRlcm5hbHMvbGFuZ3VhZ2Utc3VwcG9ydC9cbiAgYmlvbWU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ2FzdHJvJyxcbiAgICAnY3NzJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ2dxbCcsXG4gIF0uc29ydCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50cmMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgZmlsZXNcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRpZ25vcmUnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5lc2xpbnRCYXNlKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKCFvbGRDb250ZW50LmluY2x1ZGVzKCdleHBvcnQgeyBkZWZhdWx0IH0nKSkgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJyR7Y29uZmlnLmVzbGludEJhc2V9JztgKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuIS5rZWVwXG4uYWlkZXIqXG4uZW52LnByb2R1Y3Rpb25cbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLmRldmNvbnRhaW5lci9cbiovbW91bnQvKi5oYXNoXG5fX2dlbmVyYXRlZF9fL1xuZGlzdC9cbnRlbXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc0dlbWZpbGUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1YnknKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNHb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ21hdmVuJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5pZGVhL2dvb2dsZS1qYXZhLWZvcm1hdC54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1RlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnlcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3B5dGhvbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAudmVudi9cbmA7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmJsaXR6L1xuLmJsaXR6KipcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIG5hbWVzLnB1c2goJ25leHRqcycpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UgfHwgY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgICAgbmFtZXMucHVzaCgnZmlyZWJhc2UnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHRlc3QtcmVzdWx0cy9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2FydGlmYWN0cyQvZ20sICcuaWRlYS9hcnRpZmFjdHMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9jb21waWxlci54bWwkL2dtLCAnLmlkZWEvY29tcGlsZXIueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvamFyUmVwb3NpdG9yaWVzLnhtbCQvZ20sICcuaWRlYS9qYXJSZXBvc2l0b3JpZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnLmlkZWEvbW9kdWxlcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC8qLmltbCQvZ20sICcuaWRlYS8qLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMkL2dtLCAnLmlkZWEvbW9kdWxlcycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmltbCQvZ20sICcqLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmlwciQvZ20sICcqLmlwcicpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB7IG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBkYXRhOiBjb21taXRzIH0gPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cycsIHtcbiAgICAgIG93bmVyOiBvcmdhbml6YXRpb24sXG4gICAgICByZXBvLFxuICAgICAgcGVyX3BhZ2U6IDEsXG4gICAgfSk7XG4gICAgaWYgKGNvbW1pdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBjb21taXRzWzBdLnNoYTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IEVzbGludFV0aWwgPSB7XG4gIGdldExpbnRGaXhTdWZmaXgoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4ID8gJyAtLXJ1bGUgXCJ7IHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwczogMCB9XCInIDogJyc7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgRXNsaW50RXh0ZW5zaW9uQmFzZSwgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgRXNsaW50VXRpbCB9IGZyb20gJy4uL3V0aWxzL2VzbGludFV0aWwuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IEJMSVRaX1ZFUlNJT04sIE5FWFRfVkVSU0lPTiB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb25Db25zdGFudHMuanMnO1xuXG5jb25zdCBqc0NvbW1vbkRlcHMgPSBbXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG4gICdlc2xpbnQtcGx1Z2luLXVudXNlZC1pbXBvcnRzJyxcbiAgJ2dsb2JhbHMnLFxuXTtcblxuY29uc3QgdHNDb21tb25EZXBzID0gWy4uLmpzQ29tbW9uRGVwcywgJ3R5cGVzY3JpcHQtZXNsaW50JywgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItdHlwZXNjcmlwdCddO1xuXG5jb25zdCByZWFjdENvbW1vbkRlcHMgPSBbJ2VzbGludC1wbHVnaW4tcmVhY3QnLCAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcycsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJ107XG5cbmNvbnN0IGVzbGludERlcHM6IFJlY29yZDxFc2xpbnRFeHRlbnNpb25CYXNlLCBzdHJpbmdbXT4gPSB7XG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLCAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAgICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JyxcbiAgICAuLi5qc0NvbW1vbkRlcHMsXG4gICAgLi4ucmVhY3RDb21tb25EZXBzLFxuICBdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJywgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyxcbiAgICAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICdlc2xpbnQtcGx1Z2luLWltcG9ydCcsXG4gICAgJ2VzbGludC1jb25maWctbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgfHwge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyB8fCB7fTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqIGFzIFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuICApO1xuXG4gIGlmIChqc29uT2JqLm5hbWUgIT09ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJykge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAvLyBGcmVzaCByZXBvIHN0aWxsIHJlcXVpcmVzICd5YXJuIGluc3RhbGwnXG4gICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnZ2l0IGNsb25lJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgveWFyblxccyomJlxccyovLCAnJykucmVwbGFjZSgveWFyblxccyppbnN0YWxsXFxzKiYmXFxzKi8sICcnKTtcbiAgICB9XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPSBtZXJnZShqc29uT2JqLnNjcmlwdHMsIGdlbmVyYXRlU2NyaXB0cyhjb25maWcpKTtcblxuICBpZiAoJ2NoZWNrLWZvci1haScgaW4ganNvbk9iai5zY3JpcHRzKSB7XG4gICAgaWYgKCdnZW4tY29kZScgaW4ganNvbk9iai5zY3JpcHRzKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddID0gYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlID4gL2Rldi9udWxsICYmICR7anNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXX1gO1xuICAgIH1cbiAgICBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddID0gYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGwgPiAvZGV2L251bGwgJiYgJHtqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeTtcbiAgfSBlbHNlIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucHJldHRpZnkgKz0gYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCk7XG4gIH1cbiAgLy8gRGVhbCB3aXRoIGJyZWFraW5nIGNoYW5nZXMgaW4geWFybiBiZXJyeSA0LjAuMC1yYy40OVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMpKSB7XG4gICAgaWYgKCF2YWx1ZT8uaW5jbHVkZXMoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJykpIGNvbnRpbnVlO1xuICAgIGlmIChcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLWFsbCcpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1yZWN1cnNpdmUnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tc2luY2UnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0td29ya3RyZWUnKVxuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnLCAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnKTtcbiAgfVxuXG4gIGxldCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3ByZXR0aWVyJywgJ3NvcnQtcGFja2FnZS1qc29uJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnXTtcbiAgY29uc3QgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIH0gZWxzZSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xpbnQtc3RhZ2VkJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snaHVza3knXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sncGluc3QnXTtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnbGVmdGhvb2snKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IGh1c2t5XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnaHVza3knKTtcbiAgICAgIC8vICd8fCB0cnVlJyBhdm9pZHMgZXJyb3JzIHdoZW4gaHVza3kgaXMgbm90IGluc3RhbGxlZC5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2h1c2t5IHx8IHRydWUnOyAvLyBmb3Igbm9uLXlhcm4gcGFja2FnZSBtYW5hZ2Vycy5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9ICdodXNreSB8fCB0cnVlJzsgLy8gZm9yIHlhcm4uXG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbyB8fCBjb25maWcuaXNSZWZlcnJlZEJ5T3RoZXJSZXBvKSB7XG4gICAgICAgIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICAgICAgICAvLyBodHRwczovL3R5cGljb2RlLmdpdGh1Yi5pby9odXNreS8jLz9pZD1pbnN0YWxsLTFcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3BpbnN0Jyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYWNrID0gJ3BpbnN0IC0tZGlzYWJsZSc7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5wb3N0cGFjayA9ICdwaW5zdCAtLWVuYWJsZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzWydhcnRpbGxlcnknXSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snYXJ0aWxsZXJ5J107XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ3BsYXl3cmlnaHQnXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sncGxheXdyaWdodCddO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby5cbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKVxuICAgICAgICA/IG1lcmdlLmFsbChbanNvbk9iai53b3Jrc3BhY2VzLCBbJ3BhY2thZ2VzLyonXV0sIHtcbiAgICAgICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFsncGFja2FnZXMvKiddO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy53YiB8fCBjb25maWcuaXNCdW4pIHtcbiAgICBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoL3diXFxzK2RiLywgJ3diIHByaXNtYScpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzXG4gICkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAYmlvbWVqcy9iaW9tZScsICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyk7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludCddO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtaWNyb21hdGNoJ107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3R5cGVzY3JpcHQtZXNsaW50J107XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdlc2xpbnQnLCAnbWljcm9tYXRjaCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgndHlwZXNjcmlwdCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5lc2xpbnRCYXNlKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4uZXNsaW50RGVwc1tjb25maWcuZXNsaW50QmFzZV0pO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIH1cblxuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIEJlY2F1c2UgYFwicmVzb2x1dGlvbnNcIjogeyBcIm5wbS9jaGFsa1wiOiBcIl40LjEuMlwiIH0sYCBjYXVzZXMgXCJJbnZhbGlkIG5wbSB0b2tlblwiXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5jbGVhbnVwID0ganNvbk9iai5zY3JpcHRzLmNsZWFudXA/LnJlcGxhY2UoJyAmJiB5YXJuIGxpbnQtZml4JywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddICs9IEVzbGludFV0aWwuZ2V0TGludEZpeFN1ZmZpeChjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBmbHV0dGVyIGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgKz0gYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KC9bL1xcXFxdLyk7XG4gICAgICAgIGlmIChzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgcG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgcG9ldHJ5IHJ1biBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCArPSBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgICBwb2V0cnlEZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5KSB7XG4gICAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIGRlcGVuZGVuY2llcy5wdXNoKFxuICAgICAgYGJsaXR6QCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYEBibGl0empzL2F1dGhAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgQGJsaXR6anMvbmV4dEAke0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBAYmxpdHpqcy9ycGNAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgbmV4dEAke05FWFRfVkVSU0lPTn1gXG4gICAgKTtcbiAgICAvLyBQcmVmZXIgZXNsaW50LWNvbmZpZy1uZXh0J3MgZGVwZW5kZW5jaWVzXG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZCkgPT4gZCAhPT0gJ2VzbGludC1wbHVnaW4tcmVhY3QnICYmIGQgIT09ICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJyk7XG4gICAgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ2JsaXR6IGNvZGVnZW4nKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ2JsaXR6IGNvZGVnZW4nO1xuICAgIH0gZWxzZSBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5pbmNsdWRlcygnYmxpdHogcHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5yZXBsYWNlKFxuICAgICAgICAnYmxpdHogY29kZWdlbicsXG4gICAgICAgICdibGl0eiBjb2RlZ2VuICYmIGJsaXR6IHByaXNtYSBnZW5lcmF0ZSdcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hICYmICFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ3ByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ3ByaXNtYSBnZW5lcmF0ZSc7XG4gIH1cblxuICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzPy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXM7XG4gIH1cblxuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIGxldCBuZXdKc29uVGV4dCA9IEpTT04uc3RyaW5naWZ5KGpzb25PYmopO1xuICBuZXdKc29uVGV4dCA9IGF3YWl0IGZpeFNjcmlwdE5hbWVzKGpzb25PYmouc2NyaXB0cywgbmV3SnNvblRleHQsIGNvbmZpZyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3SnNvblRleHQpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXZEZXBlbmRlbmNpZXMuXG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGV2RGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRlcGVuZGVuY2llcy5cbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctRCcsIC4uLm5ldyBTZXQoZGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gICAgaWYgKHBvZXRyeURldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4ubmV3IFNldChwb2V0cnlEZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBtaWdyYXRpb24gY29kZSBpbiBmdXR1cmVcbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0c2xpYiddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LXBsdWdpbi1wcmV0dGllciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xlcm5hJ107XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3BpbnN0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydwcmV0dGllciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwnXTtcbiAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZm9yIChjb25zdCBkZXBzIG9mIE9iamVjdC52YWx1ZXMoZXNsaW50RGVwcykpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSgnbGVybmEuanNvbicsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gIC8vIE1pZ3JhdGUgZnJvbSBFU0xpbnQgbGVnYWN5IGNvbmZpZ3MgdG8gZmxhdCBjb25maWdzLFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4taW1wb3J0J107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2NoZWNrLWZvci1haSc6ICdidW4gcnVuIGNsZWFudXAgJiYgYnVuIHJ1biB0eXBlY2hlY2sgJiYgYnVuIHJ1biB0ZXN0IC0tc2lsZW50JyxcbiAgICAgIGNsZWFudXA6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gLS1idW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIC0tYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyxcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1mb3ItYWknOiAneWFybiBmb3JtYXQgPiAvZGV2L251bGwgJiYgeWFybiBsaW50LWZpeCAtLXF1aWV0ICYmIHlhcm4gdHlwZWNoZWNrICYmIHlhcm4gdGVzdCAtLXNpbGVudCcsXG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5YCxcbiAgICAgIGxpbnQ6IGBlc2xpbnQgLS1jb2xvcmAsXG4gICAgICAnbGludC1maXgnOiAneWFybiBsaW50IC0tZml4JyxcbiAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX1cIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgIHR5cGVjaGVjazogJ3RzYyAtLW5vRW1pdCAtLVByZXR0eScsXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgICAgY29uc3Qgb2xkVGVzdCA9IHNjcmlwdHMudGVzdDtcbiAgICAgIHNjcmlwdHMgPSBtZXJnZShcbiAgICAgICAgeyAuLi5zY3JpcHRzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKFxuICAgICAgICAgICAgJywnXG4gICAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLlxuICAgICAgICAgIC8vIEZPUkNFX0NPTE9SPTMgbWFrZSB3YiBlbmFibGUgY29sb3Igb3V0cHV0LlxuICAgICAgICAgIHRlc3Q6ICdDST0xIEZPUkNFX0NPTE9SPTMgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICAgIHNjcmlwdHMudGVzdCA9IG9sZFRlc3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gc2NyaXB0cy50eXBlY2hlY2sgPyBgJHtzY3JpcHRzLnR5cGVjaGVja30gJiYgYCA6ICcnO1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJ3B5cmlnaHQnO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSAnd2IgdHlwZWNoZWNrJztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBpbmRleCA9IGV4aXN0aW5nQ29udGVudC5pbmRleE9mKGlnbm9yZUZpbGVVdGlsLnNlcGFyYXRvclByZWZpeCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiAnJztcblxuICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQuc2xpY2UoMCwgaW5kZXgpO1xuICBjb25zdCBsaW5lcyA9IG9yaWdpbmFsQ29udGVudFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBuZXdMaW5lID0gbGluZS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3TGluZS5lbmRzV2l0aCgnLycpID8gbmV3TGluZS5zbGljZSgwLCAtMSkgOiBuZXdMaW5lO1xuICAgIH0pXG4gICAgLmZpbHRlcigobCkgPT4gbCAmJiAhbC5zdGFydHNXaXRoKCcjJykgJiYgIWwuaW5jbHVkZXMoJy8nKSk7XG5cbiAgcmV0dXJuIGxpbmVzLm1hcCgobGluZSkgPT4gYCBcIiEqKi8ke2xpbmV9LyoqXCJgKS5qb2luKCcnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4U2NyaXB0TmFtZXMoXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5ld0pzb25UZXh0OiBzdHJpbmcsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgb2xkQW5kTmV3U2NyaXB0TmFtZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXldIG9mIE9iamVjdC5rZXlzKHNjcmlwdHMpKSB7XG4gICAgaWYgKGtleVswXSAhPT0gJzonICYmIGtleS5pbmNsdWRlcygnOicpKSB7XG4gICAgICBvbGRBbmROZXdTY3JpcHROYW1lcy5wdXNoKFtrZXksIGtleS5yZXBsYWNlQWxsKCc6JywgJy0nKV0pO1xuICAgIH1cbiAgfVxuICBpZiAob2xkQW5kTmV3U2NyaXB0TmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3SnNvblRleHQ7XG5cbiAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICBuZXdKc29uVGV4dCA9IG5ld0pzb25UZXh0LnJlcGxhY2VBbGwob2xkTmFtZSwgbmV3TmFtZSk7XG4gIH1cbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBmZy5nbG9iKFsnKiovKi57bWQsY2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JywgJyoqL0RvY2tlcmZpbGUnXSwge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IG9sZENvbnRlbnQ7XG4gICAgICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBvbGRBbmROZXdTY3JpcHROYW1lcykge1xuICAgICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG5ld0NvbnRlbnQgIT09IG9sZENvbnRlbnQpIHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIHJldHVybiBuZXdKc29uVGV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmo6IFBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKSwgLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpXSk7XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvYXV0aCcpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9hdXRoJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9hdXRoJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2F1dGgnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2F1dGgnXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9hdXRoLmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQGRpc2NvcmQtYm90L3NoYXJlZCcpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0BkaXNjb3JkLWJvdC9zaGFyZWQnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdkaXNjb3JkLWJvdCcpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAZGlzY29yZC1ib3Qvc2hhcmVkJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvZGlzY29yZC1ib3QuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG5cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnY29kZS1hbmFseXplcicpO1xuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplciddID1cbiAgICAgIGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9jb2RlLWFuYWx5emVyLmdpdCN3b3Jrc3BhY2U9QGNvZGUtYW5hbHl6ZXIvY2xpZW50JmNvbW1pdD0ke2NvbW1pdEhhc2h9YDtcbiAgfVxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2p1ZGdlJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2p1ZGdlJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9qdWRnZSddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdqdWRnZScpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9qdWRnZS5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnbGxtLXByb3h5Jyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9sbG0tcHJveHkuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqOiBQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGpzb25PYmouZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8ICcnKS5pbmNsdWRlcygnd29ya3NwYWNlJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcHJlQ29tbWl0OiAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi9saW50LXN0YWdlZCcsXG4gIHByZVB1c2g6IGB5YXJuIHR5cGVjaGVja2AsXG4gIHByZVB1c2hGb3JMYWI6IGBcbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG55YXJuIHR5cGVjaGVja1xuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIHBhY2thZ2VKc29uLnNjcmlwdHMgfHw9IHt9O1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdGluc3RhbGwnXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3Bvc3RwdWJsaXNoJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwYXJlJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwdWJsaXNoT25seSddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncHJlcGFjayddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdHBhY2snXTtcblxuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5Jyk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKSksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHNwYXduU3luYygnZ2l0JywgWydjb25maWcnLCAnLS11bnNldCcsICdjb3JlLmhvb2tzUGF0aCddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAnaHVza3ktaW5pdCcsICctLXlhcm4yJ10sIGNvbmZpZy5kaXJQYXRoKTtcblxuICBjb25zdCBwcmVDb21taXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLWNvbW1pdCcpO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHByZUNvbW1pdEZpbGVQYXRoLCBzY3JpcHRzLnByZUNvbW1pdCArICdcXG4nKSk7XG5cbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcpO1xuICBpZiAodHlwZWNoZWNrKSB7XG4gICAgbGV0IHByZVB1c2ggPVxuICAgICAgY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSAmJlxuICAgICAgIWNvbmZpZy5yZXBvc2l0b3J5Py50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKCdleGVyY29kZScpXG4gICAgICAgID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiXG4gICAgICAgIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIHByZVB1c2ggPSBwcmVQdXNoLnJlcGxhY2UoXG4gICAgICAneWFybiB0eXBlY2hlY2snLFxuICAgICAgdHlwZWNoZWNrXG4gICAgICAgIC5yZXBsYWNlKCd0c2MgJywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vdHNjICcpXG4gICAgICAgIC5yZXBsYWNlKCd3YiAnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi93YiAnKVxuICAgICAgICAvLyBweXJpZ2h0IGhhcyBubyBhcmd1bWVudHNcbiAgICAgICAgLnJlcGxhY2UoJ3B5cmlnaHQnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi9weXJpZ2h0JylcbiAgICApO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLXB1c2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhd2sgJ3twcmludCBcXCQxfScgLnRvb2wtdmVyc2lvbnMgfCB4YXJncyAtSXt9IGFzZGYgcGx1Z2luIGFkZCB7fVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIHBsdWdpbiB1cGRhdGUgLS1hbGxcImBcbiAgICApO1xuICB9XG4gIC8vIFB5dGhvbuOBjOOBquOBhOOBqOOCpOODs+OCueODiOODvOODq+OBp+OBjeOBquOBhOWHpueQhuezu+OBjOWtmOWcqOOBmeOCi+OBn+OCgeOAgeW8t+WItueahOOBq+acgOWIneOBq+OCpOODs+OCueODiOODvOODq+OBmeOCi+OAglxuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dD8uaW5jbHVkZXMoJ3B5dGhvbiAnKSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgaW5zdGFsbCBweXRob25cImApO1xuICB9XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goYHJ1bl9pZl9jaGFuZ2VkIFwicGFja2FnZVxcXFwuanNvblwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yeX1cImApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgZ2VuZXJhdGVcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogY29kZWdlblwiYFxuICAgICk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG5cbmNvbnN0IHByZXR0aWVyQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ25vZGUnLCAnbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlJywgJ1ByZXR0aWVyJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuY29uc3QgYmlvbWVDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnYnVuJywgJy0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL2Jpb21lIGNoZWNrIC0tZml4IC0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCAtLXNraXAtZXJyb3JzJywgJ0Jpb21lJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIChjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24gJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc0dlbWZpbGUgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNHb01vZCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc1BvbVhtbClcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29uZmlnLmlzQnVuID8gYmlvbWVDb250ZW50IDogcHJldHRpZXJDb250ZW50KSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIH0gZnJvbSAnLi9odXNreXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5jb25zdCBuZXdTZXR0aW5ncyA9IHtcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ3ByZXBhcmUuc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAncHJlLWNvbW1pdCc6IHtcbiAgICBjb21tYW5kczoge1xuICAgICAgY2xlYW51cDoge1xuICAgICAgICBnbG9iOiAnKi57Y2pzLGNzcyxjdHMsaHRtLGh0bWwsanMsanNvbixqc29uNSxqc29uYyxqc3gsbWQsbWpzLG10cyxzY3NzLHRzLHRzeCx2dWUseWFtbCx5bWx9JyxcbiAgICAgICAgcnVuOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQge3N0YWdlZF9maWxlc30gJiYgZ2l0IGFkZCB7c3RhZ2VkX2ZpbGVzfScsXG4gICAgICB9LFxuICAgICAgJ2NoZWNrLW1pZ3JhdGlvbnMnOiB7XG4gICAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgICAgcnVuOiBgXG5pZiBncmVwIC1xICdXYXJuaW5nczonIHtzdGFnZWRfZmlsZXN9OyB0aGVuXG4gIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGVzICh7c3RhZ2VkX2ZpbGVzfSkgY29udGFpbiB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gIGV4aXQgMVxuZmlcbmAudHJpbSgpLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ2NoZWNrLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHByZVB1c2g6IGBidW4gLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vd2IgdHlwZWNoZWNrYCxcbiAgcHJlUHVzaEZvckxhYjogYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbmJ1biAtLWJ1biBub2RlX21vZHVsZXMvLmJpbi93YiB0eXBlY2hlY2tcbmAudHJpbSgpLFxuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdsZWZ0aG9vay55bWwnKSxcbiAgICAgIHlhbWwuZHVtcChuZXdTZXR0aW5ncywge1xuICAgICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG5cbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcpO1xuICBpZiAodHlwZWNoZWNrKSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykgPyBzY3JpcHRzLnByZVB1c2hGb3JMYWIgOiBzY3JpcHRzLnByZVB1c2g7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgICAgbW9kZTogMG83NTUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnLCAncHJlcGFyZS5zaCcpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IHNyY0RpcmVjdG9yaWVzID0ge1xuICBub2RlOiBbJ3NyYycsICd0ZXN0cycsICdzY3JpcHRzJ10uc29ydCgpLFxuICBibGl0ejogWydzcmMnLCAndGVzdHMnLCAnc2NyaXB0cycsICdkYicsICdpbnRlZ3JhdGlvbnMnLCAnbWFpbGVycyddLnNvcnQoKSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcmNEaXJzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICByZXR1cm4gc3JjRGlyZWN0b3JpZXMuYmxpdHo7XG4gIH1cbiAgcmV0dXJuIHNyY0RpcmVjdG9yaWVzLm5vZGU7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRTcmNEaXJzIH0gZnJvbSAnLi4vdXRpbHMvc3JjRGlyZWN0b3JpZXMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmNqcycpO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYWNrYWdlUHJlZml4ID0gY29uZmlnLmlzUm9vdCA/ICdub2RlIG5vZGVfbW9kdWxlcy8uYmluLycgOiAnbm9kZSAuLi8uLi9ub2RlX21vZHVsZXMvLmJpbi8nO1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgY29uc3QgZXNsaW50ID0gYFxuICAnJHtnZXRFc2xpbnRLZXkoY29uZmlnKX0nOiBbJHtKU09OLnN0cmluZ2lmeShcbiAgICBgJHtwYWNrYWdlUHJlZml4fWVzbGludCAtLWZpeCR7RXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyl9YFxuICApfSwgJyR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnXSxgO1xuICAgIGxpbmVzLnB1c2goZXNsaW50KTtcbiAgfVxuICBjb25zdCBwYWNrYWdlc0ZpbHRlciA9IGNvbmZpZy5pc1Jvb3QgPyBcIiAmJiAhZmlsZS5pbmNsdWRlcygnL3BhY2thZ2VzLycpXCIgOiAnJztcbiAgbGluZXMucHVzaChgXG4gICcuLyoqLyoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fSc6IGZpbGVzID0+IHtcbiAgICBsZXQgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKSAmJiAhZmlsZS5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykke3BhY2thZ2VzRmlsdGVyfSk7JHtnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWcpfVxuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gW1xcYCR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMuc29tZShmaWxlID0+IGZpbGUuZW5kc1dpdGgoJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnJHtwYWNrYWdlUHJlZml4fXNvcnQtcGFja2FnZS1qc29uJyk7XG4gICAgfVxuICAgIHJldHVybiBjb21tYW5kcztcbiAgfSxcbiAgJy4vKiovbWlncmF0aW9uLnNxbCc6IChmaWxlcykgPT4ge1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpO1xuICAgIGlmIChjb250ZW50LmluY2x1ZGVzKCdXYXJuaW5nczonKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXFxgISEhIE1pZ3JhdGlvbiBTUUwgZmlsZSAoXFwke3BhdGgucmVsYXRpdmUoJycsIGZpbGUpfSkgY29udGFpbnMgd2FybmluZ3MgISEhIFNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlxcYCxcbiAgICAgIF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn0sYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4ve2xpYix0ZXN0LHRlc3RfZHJpdmVyfS8qKi8qLmRhcnQnOiBmaWxlcyA9PiB7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCdnZW5lcmF0ZWQnKSlcbiAgICAgIC5maWx0ZXIoZmlsZSA9PiAhZmlsZS5lbmRzV2l0aCgnLmZyZWV6ZWQuZGFydCcpICYmICFmaWxlLmVuZHNXaXRoKCcuZy5kYXJ0JykpO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBbXFxgZmx1dHRlciBmb3JtYXQgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gIH0sYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgbGluZXMucHVzaChgXG4gICcuLyoqLyoucHknOiBbXG4gICAgJ3BvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzJyxcbiAgICAncG9ldHJ5IHJ1biBibGFjaycsXG4gICAgJ3BvZXRyeSBydW4gZmxha2U4J1xuICBdLGApO1xuICB9XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuJHtjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCA/IFwiY29uc3QgbWljcm9tYXRjaCA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcXG5cIiA6ICcnfVxubW9kdWxlLmV4cG9ydHMgPSB7JHtsaW5lcy5qb2luKCcnKX1cbn07XG5gO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRLZXkoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgZGlycyA9IGdldFNyY0RpcnMoY29uZmlnKS5tYXAoKGRpcikgPT4gYCR7ZGlyfS8qKi9gKTtcbiAgcmV0dXJuIGB7LCR7ZGlycy5qb2luKCcsJyl9fSoueyR7ZXh0ZW5zaW9ucy5lc2xpbnQuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRcbiAgICA/IGBcXG5cbiAgICBmaWx0ZXJlZEZpbGVzID0gZmlsdGVyZWRGaWxlcy5tYXAoKGZpbGUpID0+IHBhdGgucmVsYXRpdmUoJycsIGZpbGUpKTtcbiAgICBmaWx0ZXJlZEZpbGVzID0gbWljcm9tYXRjaC5ub3QoZmlsdGVyZWRGaWxlcywgJyR7Z2V0RXNsaW50S2V5KGNvbmZpZyl9Jyk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlc29sdmUoZmlsZSkpO2BcbiAgICA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWydqcycsICdtanMnLCAnY2pzJ11cbiAgICAgIC5tYXAoKGV4dCkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgbmV4dC5jb25maWcuJHtleHR9YCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIC8vIFJlcGxhY2UgdGhlIEpTT04gb2JqZWN0IGZyb20gdGhlIGZpbGVcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC89XFxzKnsoW1xcU1xcc10qKX07LywgKF8sIHNldHRpbmdzVGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIXNldHRpbmdzVGV4dC5pbmNsdWRlcygnZXNsaW50OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAnZXNsaW50OiB7IGlnbm9yZUR1cmluZ0J1aWxkczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICBpZiAoIXNldHRpbmdzVGV4dC5pbmNsdWRlcygndHlwZXNjcmlwdDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ3R5cGVzY3JpcHQ6IHsgaWdub3JlQnVpbGRFcnJvcnM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGA9IHske3NldHRpbmdzVGV4dH19O2A7XG4gICAgfSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0gY2xvbmVEZWVwKGpzb25PYmopO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncHlyaWdodGNvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlYWRtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlYWRtZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ1JFQURNRS5tZCcpO1xuICAgIGxldCBuZXdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBzZW1hbnRpY1JlbGVhc2VCYWRnZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zbGljZShjb25maWcucmVwb3NpdG9yeT8uaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmMoYCR7Y29uZmlnLmRpclBhdGh9Ly5naXRodWIvd29ya2Zsb3dzYCk7XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IGJhZGdlTmFtZVswXS50b1VwcGVyQ2FzZSgpICsgYmFkZ2VOYW1lLnNsaWNlKDEsIGJhZGdlTmFtZS5pbmRleE9mKCcuJykpO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgICAgY29uc3QgYmFkZ2UgPSBgWyFbJHtiYWRnZU5hbWV9XShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfSlgO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLmdpdGh1Yi93b3JrZmxvd3MvJHtmaWxlTmFtZX1gKSkpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIGJhZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g5pei44GrYmFkZ2XjgYzjgYLjgovloLTlkIjjga/liYrpmaRcbiAgcmVhZG1lID0gcmVhZG1lLnJlcGxhY2UoYmFkZ2UsICcnKS5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRtZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZWFkbWVbaSAtIDFdID09PSAnXFxuJyAmJiByZWFkbWVbaV0gPT09ICdcXG4nKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSByZWFkbWUuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgbGV0IGFmdGVyID0gcmVhZG1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIGlmICghYWZ0ZXIuc3RhcnRzV2l0aCgnWycpICYmICFhZnRlci5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgYWZ0ZXIgPSBgXFxuJHthZnRlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2JlZm9yZX0ke2JhZGdlfVxcbiR7YWZ0ZXJ9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3JlYWRtZX1cXG4ke2JhZGdlfVxcbmA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2luczogKHN0cmluZyB8IFtzdHJpbmcsIHVua25vd25dKVtdO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzPy5wbHVnaW5zIHx8IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luID0gQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSA/IHBsdWdpbnNbaV1bMF0gOiBwbHVnaW5zW2ldO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKEFycmF5LmlzQXJyYXkocGx1Z2luc1tpXSkgJiYgcGx1Z2luc1tpXVsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb241J10sXG59O1xuXG50eXBlIFNldHRpbmdzID0gdHlwZW9mIGpzb25PYmogJiB7IHBhY2thZ2VSdWxlczogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXSB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSAnQHdpbGxib29zdGVyJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdXBncmFkZSBOZXh0LmpzIGF1dG9tYXRpY2FsbHlcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzID8/PSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgIW5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5zb21lKChydWxlOiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXSB9KSA9PlxuICAgICAgICAgIHJ1bGUubWF0Y2hQYWNrYWdlTmFtZXMuaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICBkZWxldGUgb2JqW2tleV07XG4gIChvYmogYXMgUmVjb3JkPFRLZXksIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICBjb25zdCBrZXlBbmRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyhvYmopLnNvcnQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIHRhcmdldDogJ0VTMjAyMicsIC8vIGJlY2F1c2UgZGVjb3JhdG9ycyBzaG91bGQgYmUgdHJhbnNwaWxlZCB0byBFUzIwMjIgb24gTm9kZS5qc1xuICAgIG1vZHVsZTogJ0VTTmV4dCcsXG4gICAgbW9kdWxlUmVzb2x1dGlvbjogJ05vZGUnLFxuICAgIGpzeDogJ3JlYWN0LWpzeCcsXG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgICBza2lwTGliQ2hlY2s6IHRydWUsIC8vIGJlY2F1c2UgbGlicmFyaWVzIG1heSBoYXZlIGJyb2tlbiB0eXBlc1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgZXJhc2FibGVTeW50YXhPbmx5OiB0cnVlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICAgIHR5cGVSb290czogWycuL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgaW5jbHVkZTogW1xuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3RzLyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgdGFyZ2V0OiAnRVMyMDIyJywgLy8gYmVjYXVzZSBkZWNvcmF0b3JzIHNob3VsZCBiZSB0cmFuc3BpbGVkIHRvIEVTMjAyMiBvbiBOb2RlLmpzXG4gICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZScsXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBlcmFzYWJsZVN5bnRheE9ubHk6IHRydWUsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4uLy4uL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi4vLi4vQHR5cGVzJywgJy4vQHR5cGVzJ10sXG4gIH0sXG4gIGluY2x1ZGU6IFsnc3JjLyoqLyonLCAndGVzdHMvKiovKicsICdzY3JpcHRzLyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSByZXR1cm47XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0ge1xuICAgICAgICAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsXG4gICAgICAgIG1vZHVsZTogJ05vZGVOZXh0JyxcbiAgICAgICAgbW9kdWxlUmVzb2x1dGlvbjogJ05vZGVOZXh0JyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgVHNDb25maWdKc29uO1xuICAgICAgaWYgKG9sZFNldHRpbmdzLmV4dGVuZHMgPT09ICcuL25vZGVfbW9kdWxlcy9Ad2lsbGJvb3N0ZXIvdHNjb25maWcvdHNjb25maWcuanNvbicpIHtcbiAgICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICB9XG4gICAgICAvLyBEb24ndCBtb2RpZnkgXCJ0YXJnZXRcIiwgXCJtb2R1bGVcIiBhbmQgXCJtb2R1bGVSZXNvbHV0aW9uXCIuXG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50YXJnZXQ7XG4gICAgICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ubW9kdWxlO1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5tb2R1bGVSZXNvbHV0aW9uO1xuICAgICAgfVxuICAgICAgaWYgKG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4KSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIH1cbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXycpXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgLy8gRG9uJ3QgdXNlIG9sZCBkZWNvcmF0b3JcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5leHBlcmltZW50YWxEZWNvcmF0b3JzO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy52ZW52LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLm5leHQvKionKV0pO1xuICAgICAgfVxuICAgICAgLy8gTExN44Gr44KI44KLdmliZSBjb2Rpbmfjgafjga/jgIHoh6rli5Xjg5Xjgqnjg7zjg57jg4Pjg4jjgoTjgrPjg7zjg4njgqLjgq/jgrfjg6fjg7PjgpLnhKHlirnljJbjgZnjgovjgZPjgajjgadcbiAgICAgIC8vIOeUn+aIkOOBleOCjOOBn+OCs+ODvOODieOBruWFg+OBruW9ouW8j+OCkue2reaMgeOBp+OBjeOCi1xuICAgICAgaWYgKCdlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJ107XG4gICAgICB9XG4gICAgICBpZiAoJ2VkaXRvci5mb3JtYXRPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmZvcm1hdE9uU2F2ZSddO1xuICAgICAgfVxuICAgICAgc29ydEtleXMoKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA/PyB7fSk7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU6IHN0cmluZztcbiAgb246IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBqb2JzOiB7IFtrZXk6IHN0cmluZ106IEpvYiB9O1xufVxuXG5pbnRlcmZhY2UgQ29uY3VycmVuY3kge1xuICBncm91cDogc3RyaW5nO1xuICAnY2FuY2VsLWluLXByb2dyZXNzJzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgaXNzdWVzPzogVHlwZXM7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0O1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXM7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgdXNlczogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddLFxuICAgICAgfSxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICAgICdwYXRocy1pZ25vcmUnOiBbJyoqLm1kJywgJyoqL2RvY3MvKionXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICB3YmZ5OiB7XG4gICAgbmFtZTogJ1dpbGxib29zdGVyaWZ5JyxcbiAgICBvbjoge1xuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB3YmZ5OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvd2JmeS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICd3YmZ5LW1lcmdlJzoge1xuICAgIG5hbWU6ICdNZXJnZSB3YmZ5JyxcbiAgICBvbjoge1xuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnd2JmeS1tZXJnZSc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy93YmZ5LW1lcmdlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ25vdGlmeS1yZWFkeSc6IHtcbiAgICBuYW1lOiAnTm90aWZ5IHJlYWR5JyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnbm90aWZ5LXJlYWR5Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL25vdGlmeS1yZWFkeS55bWxAbWFpbicsXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBESVNDT1JEX1dFQkhPT0tfVVJMOiAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVBRFkgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICBuYW1lOiAnQWRkIGNsb3NlIGNvbW1lbnQnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvY2xvc2UtY29tbWVudC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdhZGQtaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICBuYW1lOiAnQWRkIGlzc3VlIHRvIEdpdEh1YiBwcm9qZWN0JyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnYWRkLWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvYWRkLWlzc3VlLXRvLXByb2plY3QueW1sQG1haW4nLFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0hfUFJPSkVDVF9VUkw6ICcke3sgc2VjcmV0cy5HSF9QUk9KRUNUX1VSTCB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICBuYW1lOiAnQWRkIHJlYWR5IGlzc3VlIHRvIEdpdEh1YiBwcm9qZWN0JyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvYWRkLWlzc3VlLXRvLXByb2plY3QueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgbGFiZWxlZDogJ3JlYWR5IDpyb2NrZXQ6JyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIEdIX1BST0pFQ1RfVVJMOiAnaHR0cHM6Ly9naXRodWIuY29tL29yZ3MvV2lsbEJvb3N0ZXJMYWIvcHJvamVjdHMvNScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICd3YmZ5LnltbCcsXG4gICAgICAnd2JmeS1tZXJnZS55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgJ2FkZC1pc3N1ZS10by1wcm9qZWN0LnltbCcsXG4gICAgICAuLi5lbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKSxcbiAgICBdKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ3JlbGVhc2UueW1sJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmlzUHVibGljUmVwbyB8fCByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdC55bWwnKTtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgnbm90aWZ5LXJlYWR5LnltbCcpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2FkZC1mb2N1c2VkLWlzc3VlLXRvLXByb2plY3QueW1sJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChjb25maWc6IFBhY2thZ2VDb25maWcsIHdvcmtmbG93c1BhdGg6IHN0cmluZywga2luZDogS25vd25LaW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcCh3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA/PyB7fSkgYXMgV29ya2Zsb3c7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGAke2tpbmR9LnltbGApO1xuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBpZiAobmV3U2V0dGluZ3Muam9icykge1xuICAgICAgbW92ZVRvQm90dG9tKG5ld1NldHRpbmdzLCAnam9icycpO1xuICAgIH1cbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBub24tcmV1c2FibGUgd29ya2Zsb3dzXG4gICAgaWYgKCFqb2IudXNlcz8uaW5jbHVkZXM/LignL3JldXNhYmxlLXdvcmtmbG93cy8nKSkgcmV0dXJuO1xuXG4gICAgbm9ybWFsaXplSm9iKGNvbmZpZywgam9iLCBraW5kKTtcbiAgfVxuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ3JlbGVhc2UnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnNjaGVkdWxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoO1xuICAgICAgfSBlbHNlIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCAmJiBjb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBjb25maWcucmVsZWFzZS5icmFuY2hlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERvbid0IHVzZSByZWxlYXNlLnltbCBpZiByZWxlYXNlIGJyYW5jaCBpcyBub3Qgc3BlY2lmaWVkXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAncmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMuZmlsdGVyKChicmFuY2gpID0+IGJyYW5jaCAhPT0gJ3Jlbm92YXRlLyoqJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnd2JmeSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbikgc2V0U2NoZWR1bGUobmV3U2V0dGluZ3MsIDIwLCAyNCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnd2JmeS1tZXJnZSc6IHtcbiAgICAgIHNldFNjaGVkdWxlKG5ld1NldHRpbmdzLCAxLCA0KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBObyBkZWZhdWx0XG4gIH1cbiAgbWlncmF0ZVdvcmtmbG93KG5ld1NldHRpbmdzKTtcbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc2VtYW50aWMtcmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBlbHNlIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYyB8fCAhbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGgpIHJldHVybjtcblxuICAgIC8vIEdlbmVyYXRlIHN5bmMtZm9yY2UueW1sIGJhc2VkIG9uIHN5bmMueW1sIGlmIGl0IGV4aXN0cy5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUpvYihjb25maWc6IFBhY2thZ2VDb25maWcsIGpvYjogSm9iLCBraW5kOiBLbm93bktpbmQpOiB2b2lkIHtcbiAgam9iLndpdGggfHw9IHt9O1xuICBqb2Iuc2VjcmV0cyB8fD0ge307XG5cbiAgaWYgKFxuICAgIGtpbmQgPT09ICd0ZXN0JyB8fFxuICAgIGtpbmQgPT09ICdyZWxlYXNlJyB8fFxuICAgIGtpbmQgPT09ICd3YmZ5JyB8fFxuICAgIGtpbmQgPT09ICd3YmZ5LW1lcmdlJyB8fFxuICAgIGtpbmQgPT09ICdhZGQtaXNzdWUtdG8tcHJvamVjdCcgfHxcbiAgICBraW5kID09PSAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QnXG4gICkge1xuICAgIGpvYi5zZWNyZXRzWydHSF9UT0tFTiddID0gY29uZmlnLmlzUHVibGljUmVwbyA/ICcke3sgc2VjcmV0cy5QVUJMSUNfR0hfQk9UX1BBVCB9fScgOiAnJHt7IHNlY3JldHMuR0hfQk9UX1BBVCB9fSc7XG4gIH1cbiAgaWYgKGNvbmZpZy5yZWxlYXNlLm5wbSAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JykpIHtcbiAgICBqb2Iuc2VjcmV0c1snTlBNX1RPS0VOJ10gPSAnJHt7IHNlY3JldHMuTlBNX1RPS0VOIH19JztcbiAgfVxuICBpZiAoam9iLnNlY3JldHNbJ0ZJUkVCQVNFX1RPS0VOJ10pIHtcbiAgICBqb2Iuc2VjcmV0c1snR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSddID0gJyR7eyBzZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgfX0nO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0c1snRklSRUJBU0VfVE9LRU4nXTtcbiAgfVxuICBpZiAoXG4gICAgKGpvYi5zZWNyZXRzWydESVNDT1JEX1dFQkhPT0tfVVJMJ10gJiYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSkgfHxcbiAgICAoam9iLndpdGguc2VydmVyX3VybCAmJiBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKVxuICApIHtcbiAgICBqb2Iuc2VjcmV0c1snRElTQ09SRF9XRUJIT09LX1VSTCddID0gJyR7eyBzZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkxfRk9SX1JFTEVBU0UgfX0nO1xuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGpvYi53aXRoPy5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzLnJlcGxhY2UoJ1dpbGxCb29zdGVyTGFiLycsICdXaWxsQm9vc3Rlci8nKTtcbiAgfSBlbHNlIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoWydkb3RfZW52X3BhdGgnXSA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoWydkb3RfZW52X3BhdGgnXTtcbiAgfVxuICAvLyBSZW1vdmUgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzXG4gIG1pZ3JhdGVKb2Ioam9iKTtcblxuICAvLyBEb24ndCB1c2UgYGZseSBkZXBsb3kgLS1qc29uYCBzaW5jZSBpdCBjYXVzZXMgYW4gZXJyb3JcbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgam9iLnNlY3JldHNbJ0ZMWV9BUElfVE9LRU4nXSAmJiB0eXBlb2Ygam9iLndpdGhbJ2RlcGxveV9jb21tYW5kJ10gPT09ICdzdHJpbmcnKSB7XG4gICAgam9iLndpdGhbJ2RlcGxveV9jb21tYW5kJ10gPSBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXS5yZXBsYWNlKC9cXHMrLS1qc29uLywgJycpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSkge1xuICAgIGlmIChqb2Iud2l0aFsnY2lfc2l6ZSddICE9PSAnZXh0cmEtbGFyZ2UnICYmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpIHx8IGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSkge1xuICAgICAgam9iLndpdGhbJ2NpX3NpemUnXSA9ICdsYXJnZSc7XG4gICAgfVxuICAgIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgICBqb2Iud2l0aFsnY3B1X2FyY2gnXSA9ICdYNjQnO1xuICAgIH1cbiAgfVxuICAvLyBCZWNhdXNlIGdpdGh1Yi5ldmVudC5yZXBvc2l0b3J5LnByaXZhdGUgaXMgYWx3YXlzIHRydWUgaWYgam9iIGlzIHNjaGVkdWxlZFxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kID09PSAnd2JmeScgfHwga2luZCA9PT0gJ3diZnktbWVyZ2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGhbJ2dpdGh1Yl9ob3N0ZWRfcnVubmVyJ10gPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGhbJ2dpdGh1Yl9ob3N0ZWRfcnVubmVyJ107XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0U2NoZWR1bGUobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBpbmNsdXNpdmVNaW5Ib3VySnN0OiBudW1iZXIsIGV4Y2x1c2l2ZU1heEhvdXJKc3Q6IG51bWJlcik6IHZvaWQge1xuICBjb25zdCBbbWludXRlVXRjLCBob3VyVXRjXSA9ICgobmV3U2V0dGluZ3Mub24uc2NoZWR1bGU/LlswXT8uY3JvbiBhcyBzdHJpbmcpIHx8ICcnKS5zcGxpdCgnICcpLm1hcChOdW1iZXIpO1xuICBpZiAobWludXRlVXRjICE9PSAwICYmIE51bWJlci5pc0ludGVnZXIoaG91clV0YykpIHtcbiAgICBjb25zdCBob3VySnN0ID0gKGhvdXJVdGMgKyA5KSAlIDI0O1xuICAgIGNvbnN0IGluUmFuZ2UgPVxuICAgICAgaW5jbHVzaXZlTWluSG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3RcbiAgICAgICAgPyBpbmNsdXNpdmVNaW5Ib3VySnN0IDw9IGhvdXJKc3QgJiYgaG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3RcbiAgICAgICAgOiBpbmNsdXNpdmVNaW5Ib3VySnN0IDw9IGhvdXJKc3QgfHwgaG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3Q7XG4gICAgaWYgKGluUmFuZ2UpIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1pbkpzdCA9IDEgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1OSk7XG4gIGNvbnN0IGhvdXJKc3QgPSBpbmNsdXNpdmVNaW5Ib3VySnN0ICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGV4Y2x1c2l2ZU1heEhvdXJKc3QgLSBpbmNsdXNpdmVNaW5Ib3VySnN0KSk7XG4gIGNvbnN0IGNyb24gPSBgJHttaW5Kc3R9ICR7KGhvdXJKc3QgLSA5ICsgMjQpICUgMjR9ICogKiAqYDtcbiAgbmV3U2V0dGluZ3Mub24uc2NoZWR1bGUgPSBbeyBjcm9uIH1dO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7XG4gICAgbGluZVdpZHRoOiAtMSxcbiAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgc3R5bGVzOiB7XG4gICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICB9LFxuICB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGVXb3JrZmxvdyhuZXdTZXR0aW5nczogV29ya2Zsb3cpOiB2b2lkIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZW0gYWZ0ZXIgMjAyMy0wMy0zMVxuICBkZWxldGUgbmV3U2V0dGluZ3Muam9ic1snYWRkLXRvLXByb2plY3QnXTtcbn1cblxuZnVuY3Rpb24gbWlncmF0ZUpvYihqb2I6IEpvYik6IHZvaWQge1xuICAvLyBUT0RPOiBSZW1vdmUgdGhlbSBhZnRlciAyMDIzLTAzLTMxXG4gIGlmICgham9iLndpdGgpIHJldHVybjtcbiAgZGVsZXRlIGpvYi53aXRoWydub25fc2VsZl9ob3N0ZWQnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydub3RpZnlfZGlzY29yZCddO1xuICBkZWxldGUgam9iLndpdGhbJ3JlcXVpcmVfZmx5J107XG4gIGRlbGV0ZSBqb2Iud2l0aFsncmVxdWlyZV9nY2xvdWQnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydjcHVfYXJjaCddO1xuICBkZWxldGUgam9iLndpdGhbJ2xhYmVsJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbGFiZWxPcGVyYXRvciddO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uVmFsdWVNYXAgfSBmcm9tICdAeWFybnBrZy9jb3JlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmludGVyZmFjZSBTZXR0aW5ncyBleHRlbmRzIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPiB7XG4gIGRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeDogc3RyaW5nO1xuICBubU1vZGU6IHN0cmluZztcbiAgbm9kZUxpbmtlcjogc3RyaW5nO1xuICBwbHVnaW5zPzogUGx1Z2luW107XG59XG5cbmludGVyZmFjZSBQbHVnaW4ge1xuICBjaGVja3N1bTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNwZWM6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWWFybnJjWW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlWWFybnJjWW1sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhcm5yY1ltbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjLnltbCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoJ3lhcm4nLCBbJy0tdmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdFZlcnNpb24oJ0B5YXJucGtnL2NsaScsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoZ2V0TWFqb3JOdW1iZXIoY3VycmVudFZlcnNpb24pIDw9IGdldE1ham9yTnVtYmVyKGxhdGVzdFZlcnNpb24pICYmIGN1cnJlbnRWZXJzaW9uICE9PSBsYXRlc3RWZXJzaW9uKSB7XG4gICAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ3NldCcsICd2ZXJzaW9uJywgbGF0ZXN0VmVyc2lvbl0sIGNvbmZpZy5kaXJQYXRoLCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxlYXNlc1BhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcueWFybicsICdyZWxlYXNlcycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHJlbGVhc2VzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocmVsZWFzZXNQYXRoKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgneWFybi0nKSAmJiAhZmlsZS5zdGFydHNXaXRoKGB5YXJuLSR7bGF0ZXN0VmVyc2lvbn0uYCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmVkJywgcGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhcm5yY1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB5YW1sLmxvYWQoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoeWFybnJjWW1sUGF0aCwgJ3V0ZjgnKSkgYXMgU2V0dGluZ3M7XG4gICAgc2V0dGluZ3MuZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4ID0gJyc7XG4gICAgc2V0dGluZ3Mubm9kZUxpbmtlciA9ICdub2RlLW1vZHVsZXMnO1xuICAgIHNldHRpbmdzLm5tTW9kZSA9ICdoYXJkbGlua3MtZ2xvYmFsJztcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB2ZXJzaW9uc0pzb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCducG0nLCBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3ZlcnNpb25zJywgJy0tanNvbiddLCBkaXJQYXRoKTtcbiAgY29uc3QgdmVyc2lvbnMgPSBKU09OLnBhcnNlKHZlcnNpb25zSnNvbikgYXMgc3RyaW5nW107XG4gIHJldHVybiB2ZXJzaW9ucy5hdCgtMSkgYXMgc3RyaW5nO1xufVxuZnVuY3Rpb24gZ2V0TWFqb3JOdW1iZXIodmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgW21ham9yXSA9IHZlcnNpb24uc3BsaXQoJy4nKTtcbiAgcmV0dXJuIE51bWJlcihtYWpvcik7XG59XG4iLCJpbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiwgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbikgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogc3ZlbHRlJywgJ2ZmM2UwMCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnYWktcHIgOnJvYm90OicsICcwMEI0RDgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdyZWFkeScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3JlbGVhc2VkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnbGxtLXByIDpyb2JvdDonKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC14L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCBzb2RpdW0gZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4sIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgZGVwcmVjYXRlZFNlY3JldE5hbWVzID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJ107XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4gfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoKS5wYXJzZWQgfHwge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIGRlcHJlY2F0ZWRTZWNyZXROYW1lcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvICYmIG5hbWUgPT09ICdQVUJMSUNfR0hfQk9UX1BBVCcpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgIH0sXG4gICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYHlhcm4gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYHlhcm4gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBuZXdDb250ZW50KSA+IG5ld0NvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdpdEh1YlV0aWwsIG9jdG9raXQgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgaXNCdW46IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1N1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1BhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1B1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcblxuICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGVzbGludEJhc2U/OiBFc2xpbnRFeHRlbnNpb25CYXNlO1xuICB2ZXJzaW9uc1RleHQ/OiBzdHJpbmc7XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VDb25maWcoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdENvbmZpZz86IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluc1BhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcGx1Z2lucz86IHN0cmluZ1tdW107XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzIHx8IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgfHwgW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IHZlcnNpb25zVGV4dCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgJ3V0ZjgnKTtcbiAgICAgIHZlcnNpb25zVGV4dCArPSBjb250ZW50LnRyaW0oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJlZml4LCBuYW1lXSBvZiBbXG4gICAgICBbJ2phdmEnLCAnamF2YSddLFxuICAgICAgWydub2RlJywgJ25vZGVqcyddLFxuICAgICAgWydweXRob24nLCAncHl0aG9uJ10sXG4gICAgXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgbm9kZVZlcnNpb25Db250ZW50ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCksICd1dGY4Jyk7XG4gICAgICAgIGlmICh2ZXJzaW9uc1RleHQpIHtcbiAgICAgICAgICB2ZXJzaW9uc1RleHQgKz0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgdmVyc2lvbnNUZXh0ICs9IG5hbWUgKyAnICcgKyBub2RlVmVyc2lvbkNvbnRlbnQudHJpbSgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIFJlYWQgd2JmeS5qc29uXG4gICAgY29uc3Qgd2JmeUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YmZ5Lmpzb24nKTtcbiAgICBsZXQgd2JmeUpzb246IFdiZnlKc29uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3YmZ5SnNvblRleHQgPSBhd2FpdCBmc3AucmVhZEZpbGUod2JmeUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgd2JmeUpzb24gPSB3YmZ5SnNvblNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHdiZnlKc29uVGV4dCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5OiByZXBvSW5mbz8uZnVsbF9uYW1lID8gYGdpdGh1Yjoke3JlcG9JbmZvLmZ1bGxfbmFtZSBhcyBzdHJpbmd9YCA6IHVuZGVmaW5lZCxcbiAgICAgIGlzQnVuOiByb290Q29uZmlnPy5pc0J1biB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuZmlnLnRvbWwnKSksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogcGFja2FnZUpzb25QYXRoLmluY2x1ZGVzKGAke3BhdGguc2VwfXdpbGxib29zdGVyLWNvbmZpZ3NgKSxcbiAgICAgIGRvZXNDb250YWluc1N1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNHZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluc0dvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUGFja2FnZUpzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbnNQb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpbnNQb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0c30vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLFxuICAgICAgICBkaXJQYXRoXG4gICAgICApLFxuICAgICAgZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3RzfS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXNbJ2JsaXR6J10sXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIG5leHQ6ICEhZGVwZW5kZW5jaWVzWyduZXh0J10sXG4gICAgICAgIHBsYXl3cmlnaHRUZXN0OlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ3BsYXl3cmlnaHQnXSxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llc1sncHJpc21hJ10sXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzWydweXJpZ2h0J10sXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSxcbiAgICAgIH0sXG4gICAgICB2ZXJzaW9uc1RleHQsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGNvbmZpZy5lc2xpbnRCYXNlID0gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWcpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc0dvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWxcbiAgICApIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KS5sZW5ndGggPiAwO1xufVxuXG5leHBvcnQgdHlwZSBFc2xpbnRFeHRlbnNpb25CYXNlID1cbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuXG5mdW5jdGlvbiBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IEVzbGludEV4dGVuc2lvbkJhc2UgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JztcbiAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCkge1xuICAgIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3ggPyAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnIDogJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJztcbiAgfSBlbHNlIHtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJztcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcz8uZmV0Y2ggPz8gb3JpZ2luPy5yZWZzPy5wdXNoO1xuICBpZiAodHlwZW9mIHJlbW90ZVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICBjb25zdCByZXQgPSB7IGZ1bGxfbmFtZTogYCR7b3JnfS8ke25hbWV9YCB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihyZXQsIHJlc3BvbnNlLmRhdGEpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhEb2NrZXJmaWxlIH0gZnJvbSAnLi9maXhlcnMvZG9ja2VyZmlsZS5qcyc7XG5pbXBvcnQgeyBmaXhQbGF5d3JpZ2h0Q29uZmlnIH0gZnJvbSAnLi9maXhlcnMvcGxheXdyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQcmlzbWFFbnZGaWxlcyB9IGZyb20gJy4vZml4ZXJzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9maXhlcnMvdGVzdERpcmVjdG9yeS5qcyc7XG5pbXBvcnQgeyBmaXhUeXBlRGVmaW5pdGlvbnMgfSBmcm9tICcuL2ZpeGVycy90eXBlRGVmaW5pdGlvbi5qcyc7XG5pbXBvcnQgeyBmaXhUeXBvcyB9IGZyb20gJy4vZml4ZXJzL3R5cG9zLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVG9vbFZlcnNpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FzZGYuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCaW9tZUpzb25jIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2Jpb21lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQnVuZmlnVG9tbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVzbGludHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VzbGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9odXNreXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMaW50c3RhZ2VkcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbmV4dGNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Y29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCB0b29scyB2aWEgYXNkZiBhdCBmaXJzdFxuICAgIGF3YWl0IGdlbmVyYXRlVG9vbFZlcnNpb25zKHJvb3RDb25maWcpO1xuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeERvY2tlcmZpbGUocm9vdENvbmZpZyksXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihyb290Q29uZmlnLmlzQnVuXG4gICAgICAgID8gW1xuICAgICAgICAgICAgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpLFxuICAgICAgICAgICAgZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKS50aGVuKCgpID0+IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpKSxcbiAgICAgICAgICBdXG4gICAgICAgIDogW2dlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZyldKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBhcmd2LnNraXBEZXBzKTtcblxuICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWcpKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlc1xuICAgICAgKSB7XG4gICAgICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUVzbGludHJjKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgICAvLyAneWFybiBpbnN0YWxsJyBzaG91bGQgYmUgYWZ0ZXIgYHlhcm4gY2xlYW51cGAgYmVjYXVzZSB5YXJuIGJlcnJ5IGdlbmVyYXRlcyB5YXJuLmxvY2tcbiAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb250ZW50cyBvZiBkZXBlbmRhbnQgc3ViLXBhY2thZ2UgaW4gbW9ub3JlcG9cbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3VwZGF0ZSddLCByb290RGlyUGF0aCk7XG4gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGFmdGVyIHRoZXJlIGlzIG5vIGJ1bi5sb2NrYlxuICAgICAgY29uc3QgYnVuTG9ja2JQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnYnVuLmxvY2tiJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhidW5Mb2NrYlBhdGgpKSB7XG4gICAgICAgIHZvaWQgZnMucHJvbWlzZXMucm0oYnVuTG9ja2JQYXRoKTtcbiAgICAgICAgc3Bhd25TeW5jKFxuICAgICAgICAgIHBhY2thZ2VNYW5hZ2VyLFxuICAgICAgICAgIFsnaW5zdGFsbCcsICctLXNhdmUtdGV4dC1sb2NrZmlsZScsICctLWZyb3plbi1sb2NrZmlsZScsICctLWxvY2tmaWxlLW9ubHknXSxcbiAgICAgICAgICByb290RGlyUGF0aFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJvcHRpb25zIiwiY29uc3RydWN0b3IiLCJ0aGlzIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsImVycm9yIiwiRXJyb3IiLCJzdGFjayIsIlN0cmluZyIsImFzeW5jIiwiZml4RG9ja2VyZmlsZSIsImNvbmZpZyIsImRvZXNDb250YWluc0RvY2tlcmZpbGUiLCJvbGRDb250ZW50IiwiZG9ja2VyZmlsZSIsIm5ld0NvbnRlbnQiLCJmcyIsIndyaXRlRmlsZSIsInBhdGgiLCJqb2luIiwiZGlyUGF0aCIsImZpeFBsYXl3cmlnaHRDb25maWciLCJmaWxlUGF0aCIsImV4aXN0c1N5bmMiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwicmVwbGFjZSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsImVudkZpbGVQYXRoIiwicmVzb2x2ZSIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwib2xkVGVzdERpclBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm5ld1Rlc3REaXJQYXRoIiwicmVuYW1lIiwicmVwbGFjZUFsbCIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zIiwidW5kZWZpbmVkIiwiZGlyZW50cyIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJkaXJlbnQiLCJkaXJOYW1lIiwic2xpY2UiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaW5jbHVkZXMiLCJoYXNMaWJyYXJ5Iiwic29tZSIsInBhY2thZ2VKc29uIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiaXNGaWxlIiwibWtkaXIiLCJydW4iLCJyZWN1cnNpdmUiLCJpc0RpcmVjdG9yeSIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZzcCIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsImxlbmd0aCIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiZml4VHlwb3NJbkNvZGUiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIk9iamVjdCIsImVudHJpZXMiLCJ3YmZ5SnNvbiIsInR5cG9zIiwidG9rZW4iLCJwcm9jZXNzIiwiZW52IiwiR0hfQk9UX1BBVCIsIlBVQkxJQ19HSF9CT1RfUEFUIiwiR0hfVE9LRU4iLCJHSVRIVUJfVE9LRU4iLCJoYXNHaXRIdWJUb2tlbiIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsInNwbGl0IiwiYXQiLCJuYW1lcyIsInNwYXduU3luYyIsImNvbW1hbmQiLCJhcmdzIiwicmV0cnkiLCJuZXdDbWQiLCJuZXdBcmdzIiwiZ2V0U3Bhd25TeW5jQXJncyIsImNoaWxkX3Byb2Nlc3MiLCJzdGF0dXMiLCJzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0Iiwic3RkaW8iLCJwcm9jIiwic3RkZXJyIiwidG9TdHJpbmciLCJ0cmltIiwicyIsInN0ZG91dCIsIlBBVEgiLCJCRVJSWV9CSU5fRk9MREVSIiwiQVNERl9ESVIiLCJzaGVsbCIsImNvbnZlcnRWZXJzaW9uSW50b051bWJlciIsInZlcnNpb24iLCJudW1iZXJzIiwiTnVtYmVyIiwiZmlsdGVyIiwibnVtIiwiaXNOYU4iLCJ2ZXJzaW9uTnVtYmVyIiwiZGl2aXNvciIsIlBZVEhPTl9WRVJTSU9OIiwiSkFWQV9WRVJTSU9OIiwiQkxJVFpfVkVSU0lPTiIsIk5FWFRfVkVSU0lPTiIsImdlbmVyYXRlVG9vbFZlcnNpb25zIiwidmVyc2lvbnNUZXh0IiwiZHVwbGljYXRhYmxlTGluZXMiLCJsaW5lIiwiQ09SRV9UT09MUyIsImhhcyIsInNvcnQiLCJzdGFydHNXaXRoIiwibGluZXMiLCJTZXQiLCJkb2VzQ29udGFpbnNQb2V0cnlMb2NrIiwicmVzcG9uc2UiLCJmZXRjaCIsImpzb24iLCJwb2V0cnlWZXJzaW9uIiwidXBkYXRlVmVyc2lvbiIsImRlcGVuZGluZyIsImZpcmViYXNlIiwiZG9lc0NvbnRhaW5zUGFja2FnZUpzb24iLCJpc0J1biIsImJ1blZlcnNpb24iLCJvcmdhbml6YXRpb24iLCJyZXBvc2l0b3J5IiwicmVxdWVzdCIsIm93bmVyIiwicmVwbyIsImRhdGEiLCJ0YWdfbmFtZSIsImluZGV4IiwibGFzdEluZGV4T2YiLCJ2ZXJzaW9uTnVtYmVyVGV4dCIsInRlc3QiLCJnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViIiwicHJlZml4IiwiREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTIiwidmVyc2lvblBhdGgiLCJybSIsImZvcmNlIiwidG9vbFZlcnNpb25zUGF0aCIsImNvcmUiLCJ0b29sTmFtZSIsIm5ld1ZlcnNpb24iLCJoZWFkIiwiZmluZEluZGV4IiwibCIsIm5ld0xpbmUiLCJzcGxpY2UiLCJvdmVyd3JpdGVNZXJnZSIsImRlc3RpbmF0aW9uQXJyYXkiLCJzb3VyY2VBcnJheSIsImNvbWJpbmVNZXJnZSIsInRhcmdldCIsInNvdXJjZSIsImRlc3RpbmF0aW9uIiwiaXRlbSIsImNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkIiwiaXNNZXJnZWFibGVPYmplY3QiLCJtZXJnZSIsInB1c2giLCJnZW5lcmF0ZUJpb21lSnNvbmMiLCJuZXdTZXR0aW5ncyIsInJvb3QiLCIkc2NoZW1hIiwiZXh0ZW5kcyIsIm9sZFNldHRpbmdzIiwiSlNPTiIsInBhcnNlIiwiYXJyYXlNZXJnZSIsInN0cmluZ2lmeSIsImdlbmVyYXRlQnVuZmlnVG9tbCIsInJlYWRGaWxlU3luYyIsInVzZXJDb250ZW50SGVhZGVyIiwidXNlckNvbnRlbnRIZWFkZXJSZWdleCIsInNlcGFyYXRvciIsImRlZmF1bHRIZWFkVXNlckNvbnRlbnQiLCJkZWZhdWx0VGFpbFVzZXJDb250ZW50IiwiaWdub3JlRmlsZVV0aWwiLCJzZXBhcmF0b3JQcmVmaXgiLCJyZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMiLCJsYXN0SGVhZGVySW5kZXgiLCJnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyIiwiZ2V0SGVhZFVzZXJDb250ZW50IiwiaW5kZXhPZiIsImdldFRhaWxVc2VyQ29udGVudCIsImlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQiLCJsYXN0SW5kZXgiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsImVzbGludCIsInByZXR0aWVyIiwiZ2VuZXJhdGVFeHRlbnNpb25zIiwiZ2VuZXJhdGVFZGl0b3Jjb25maWciLCJnZW5lcmF0ZUVzbGludHJjIiwiZXNsaW50QmFzZSIsImV4dCIsImdlbmVyYXRlR2l0YXR0cmlidXRlcyIsImRlZmF1bHROYW1lcyIsImdlbmVyYXRlR2l0aWdub3JlIiwicm9vdENvbmZpZyIsImhlYWRVc2VyQ29udGVudCIsInRhaWxVc2VyQ29udGVudCIsImRvZXNDb250YWluc0dlbWZpbGUiLCJkb2VzQ29udGFpbnNHb01vZCIsImJhc2VuYW1lIiwiZG9lc0NvbnRhaW5zUG9tWG1sIiwiZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwiLCJkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWwiLCJibGl0eiIsIm5leHQiLCJwcmlzbWEiLCJwbGF5d3JpZ2h0VGVzdCIsInJlYWN0TmF0aXZlIiwic3Rvcnlib29rIiwibGl0ZXN0cmVhbSIsImdlbmVyYXRlZCIsInJlYWRDYWNoZSIsInVybCIsInJlc3BvbnNlVGV4dCIsInRleHQiLCJvayIsIndyaXRlQ2FjaGUiLCJvcyIsImhvbWVkaXIiLCJzdGF0IiwiRGF0ZSIsIm5vdyIsIm10aW1lTXMiLCJnZXRMYXRlc3RDb21taXRIYXNoIiwiY29tbWl0cyIsInBlcl9wYWdlIiwic2hhIiwiRXNsaW50VXRpbCIsImdldExpbnRGaXhTdWZmaXgiLCJkb2VzQ29udGFpbnNKc3hPclRzeCIsImpzQ29tbW9uRGVwcyIsInRzQ29tbW9uRGVwcyIsInJlYWN0Q29tbW9uRGVwcyIsImVzbGludERlcHMiLCJnZW5lcmF0ZVBhY2thZ2VKc29uIiwic2tpcEFkZGluZ0RlcHMiLCJqc29uVGV4dCIsImpzb25PYmoiLCJzY3JpcHRzIiwicGVlckRlcGVuZGVuY2llcyIsInBhY2thZ2VNYW5hZ2VyIiwiYXV0aG9yIiwiaXNXaWxsQm9vc3RlckNvbmZpZ3MiLCJkZXBzIiwidmFsdWVzIiwiZGVwIiwicmVtb3ZlRGVwcmVjYXRlZFN0dWZmIiwia2V5IiwidmFsdWUiLCJnZW5lcmF0ZVNjcmlwdHMiLCJwcmV0dGlmeSIsImV4aXN0aW5nQ29udGVudCIsIm9yaWdpbmFsQ29udGVudCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJwb2V0cnlEZXZEZXBlbmRlbmNpZXMiLCJwcmVwYXJlIiwicG9zdGluc3RhbGwiLCJpc1B1YmxpY1JlcG8iLCJpc1JlZmVycmVkQnlPdGhlclJlcG8iLCJwcmVwYWNrIiwicG9zdHBhY2siLCJzZW1hbnRpY1JlbGVhc2UiLCJ3b3Jrc3BhY2VzIiwiQXJyYXkiLCJpc0FycmF5Iiwid29ya3NwYWNlIiwiZ2xvYlN5bmMiLCJ3YiIsImRvZXNDb250YWluc0phdmFTY3JpcHQiLCJkb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluc1R5cGVTY3JpcHQiLCJkb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcyIsInByaXZhdGUiLCJsaWNlbnNlIiwicHVibGlzaENvbmZpZyIsImFjY2VzcyIsIm1haW4iLCJyZXNvbHV0aW9ucyIsImxpbnQiLCJjbGVhbnVwIiwiZGlycyIsImRpciIsImZvcm1hdCIsInB5dGhvbkZpbGVzIiwiZGlyTmFtZVNldCIsInB5dGhvbkZpbGUiLCJmaXJzdCIsInNlY29uZCIsImFkZCIsInNpemUiLCJkaXJOYW1lc1N0ciIsImQiLCJrZXlzIiwicGFja2FnZU5hbWVzIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwiY29tbWl0SGFzaCIsInVwZGF0ZVByaXZhdGVQYWNrYWdlcyIsIm5ld0pzb25UZXh0Iiwib2xkQW5kTmV3U2NyaXB0TmFtZXMiLCJvbGROYW1lIiwibmV3TmFtZSIsImZpbGVzIiwiZml4U2NyaXB0TmFtZXMiLCJ0eXBlY2hlY2siLCJvbGRUZXN0IiwicHlyaWdodCIsInByZUNvbW1pdCIsInByZVB1c2giLCJwcmVQdXNoRm9yTGFiIiwicG9zdE1lcmdlIiwiZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbiIsInBhY2thZ2VKc29uUGF0aCIsInByZUNvbW1pdEZpbGVQYXRoIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJtb2RlIiwicG9zdE1lcmdlQ29tbWFuZCIsImdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMiLCJwb3N0TWVyZ2VDb21tYW5kcyIsInJhdyIsImluc3RhbGxDb21tYW5kIiwicm1OZXh0RGlyZWN0b3J5IiwiY3JlYXRlVGFza09wdGlvbnMiLCJydW5uZXIiLCJleHRlbnNpb24iLCJwcmV0dGllckNvbnRlbnQiLCJiaW9tZUNvbnRlbnQiLCJnZW5lcmF0ZUlkZWFTZXR0aW5ncyIsImNvbW1hbmRzIiwiZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24iLCJ5YW1sIiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsIm1rZGlyU3luYyIsInNyY0RpcmVjdG9yaWVzIiwibm9kZSIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwicGFja2FnZVByZWZpeCIsImdldEVzbGludEtleSIsInBhY2thZ2VzRmlsdGVyIiwiZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIiLCJnZXRTcmNEaXJzIiwiZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbiIsImZpbmQiLCJwIiwiXyIsInNldHRpbmdzVGV4dCIsImdlbmVyYXRlUHJldHRpZXJpZ25vcmUiLCJnaXRpZ25vcmVGaWxlUGF0aCIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJjbG9uZURlZXAiLCJnZW5lcmF0ZVJlYWRtZSIsImluc2VydEJhZGdlIiwiZmlsZU5hbWVzIiwicmVhZGRpclN5bmMiLCJmaWxlTmFtZSIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwiYmFkZ2UiLCJyZWFkbWUiLCJpIiwiZ2VuZXJhdGVSZWxlYXNlcmMiLCJzZXR0aW5ncyIsInBsdWdpbnMiLCJwbHVnaW4iLCJvbGRDb25maWciLCJwcmVzZXQiLCJzdWNjZXNzQ29tbWVudCIsImZhaWxDb21tZW50IiwibGFiZWxzIiwicmVsZWFzZWRMYWJlbHMiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwibW9kdWxlIiwibW9kdWxlUmVzb2x1dGlvbiIsImpzeCIsImFsd2F5c1N0cmljdCIsInN0cmljdCIsInNraXBMaWJDaGVjayIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsImRlY2xhcmF0aW9uIiwic291cmNlTWFwIiwiaW1wb3J0SGVscGVycyIsImVyYXNhYmxlU3ludGF4T25seSIsIm91dERpciIsInR5cGVSb290cyIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlcyIsImlzRXNtUGFja2FnZSIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwid29ya2Zsb3dzIiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwidXNlcyIsInJlbGVhc2UiLCJ3YmZ5Iiwid29ya2Zsb3dfZGlzcGF0Y2giLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwic2VjcmV0cyIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJHSF9QUk9KRUNUX1VSTCIsIndpdGgiLCJsYWJlbGVkIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwiZmlsZU5hbWVTZXQiLCJraW5kIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJsb2FkIiwibW92ZVRvQm90dG9tIiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJzZXRTY2hlZHVsZSIsIm1pZ3JhdGVXb3JrZmxvdyIsIndyaXRlWWFtbCIsInBhcmFtcyIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIm5wbSIsInNlcnZlcl91cmwiLCJtaWdyYXRlSm9iIiwibmV3U2VjcmV0cyIsImluY2x1c2l2ZU1pbkhvdXJKc3QiLCJleGNsdXNpdmVNYXhIb3VySnN0IiwibWludXRlVXRjIiwiaG91clV0YyIsImNyb24iLCJpc0ludGVnZXIiLCJob3VySnN0IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwieWFtbFRleHQiLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJjdXJyZW50VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJ2ZXJzaW9uc0pzb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwiZ2V0TWFqb3JOdW1iZXIiLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJtYWpvciIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwiZGVwcmVjYXRlZFNlY3JldE5hbWVzIiwic2V0dXBTZWNyZXRzIiwicGFyc2VkIiwiZG90ZW52Iiwic2VjcmV0TmFtZSIsInNlY3JldF9uYW1lIiwia2V5X2lkIiwia2V5SWQiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsIndpdGhSZXRyeSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsImFsbG93X2F1dG9fbWVyZ2UiLCJ0ZW1wbGF0ZXMiLCJnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyIsImRpc3RhbmNlIiwid2JmeUpzb25TY2hlbWEiLCJ6Iiwib2JqZWN0IiwicmVjb3JkIiwic3RyaW5nIiwib3B0aW9uYWwiLCJkb2MiLCJ0cyIsImdldFBhY2thZ2VDb25maWciLCJlc21QYWNrYWdlIiwicGFja2FnZUpzb25UZXh0IiwidHlwZSIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJtZXNzYWdlIiwiZmV0Y2hSZXBvSW5mbyIsIm5vZGVWZXJzaW9uQ29udGVudCIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsImZ1bGxfbmFtZSIsInNlcCIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uIiwiZ2l0aHViIiwiZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZSIsInBhdHRlcm4iLCJvcmciLCJyZXQiLCJhc3NpZ24iLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJhcnJheSIsImRlZmF1bHQiLCJkZXNjcmlwdGlvbiIsImFsaWFzIiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicm9vdERpclBhdGgiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInRoZW4iLCJidW5Mb2NrYlBhdGgiXSwibWFwcGluZ3MiOiJ5bUJBVU8sTUFBTUEsRUFBVSxJQVZ2QixNQUlFQyxXQUFBQSxHQUNFQyxLQUFLQyxXQUFZLEVBQ2pCRCxLQUFLRSxtQkFBb0IsQ0FDM0IsR0NXSyxNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENSLEVBQVFHLFdBQ1ZNLFFBQVFDLEtBQUssYUFBYUgscUJBRTVCLFVBQ1FDLElBQ04sTUFBT0csR0FDUEYsUUFBUUMsS0FBSyxxQkFBcUJILE1BQVNJLGFBQWlCQyxNQUFRRCxFQUFNRSxNQUFRQyxPQUFPSCxNQUMzRixDQUNJWCxFQUFRRyxXQUNWTSxRQUFRQyxLQUFLLGNBQWNILG1CQUUvQixHQ1RLUSxlQUFlQyxFQUFjQyxHQUNsQyxPQUFPWixFQUFPQywwQkFBMEIsZ0JBQWlCUyxVQUN2RCxJQUFLRSxFQUFPQyx1QkFBd0IsT0FFcEMsTUFBTUMsRUFBYUYsRUFBT0csV0FDcEJDLEVBQWFGLEVBRWZBLElBQWVFLFNBQ2JDLEVBQUdDLFVBQVVDLEVBQUtDLEtBQUtSLEVBQU9TLFFBQVMsY0FBZUwsSUFFaEUsQ0NWT04sZUFBZVksRUFBb0JWLEdBQ3hDLE9BQU9aLEVBQU9DLDBCQUEwQixzQkFBdUJTLFVBQzdELE1BQU1hLEVBQVdKLEVBQUtDLEtBQUtSLEVBQU9TLFFBQVMsd0JBQzNDLElBQUtKLEVBQUdPLFdBQVdELEdBQVcsT0FFOUIsTUFBTVQsUUFBbUJHLEVBQUdRLFNBQVNDLFNBQVNILEVBQVUsUUFFbERQLEVBQWFGLEVBQVdhLFFB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
|
1
|
+
import e from"node:fs";import t from"node:path";import{ignoreEnoentAsync as n,withRetry as s,ignoreErrorAsync as i}from"@willbooster/shared-lib";import o from"yargs";import r from"node:fs/promises";import a from"fast-glob";import{PromisePool as c}from"minimal-promise-pool";import{Octokit as l}from"@octokit/core";import p from"node:child_process";import d from"deepmerge";import u from"node:os";import m from"js-yaml";import f from"lodash.clonedeep";import g from"dotenv";import h from"libsodium-wrappers";import{distance as y}from"fastest-levenshtein";import{simpleGit as w}from"simple-git";import{z as b}from"zod";const v=new class{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const k=new class{async functionIgnoringException(e,t){v.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}v.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function j(e){return k.functionIgnoringException("fixDockerfile",async()=>{if(!e.doesContainsDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await r.writeFile(t.join(e.dirPath,"Dockerfile"),s)})}async function x(n){return k.functionIgnoringException("fixPlaywrightConfig",async()=>{const s=t.join(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),o=i.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");i!==o&&await e.promises.writeFile(s,o)})}const _=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function P(e){return k.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await a.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:_});for(const s of n){const n=t.resolve(e.dirPath,s),i=(await r.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await r.writeFile(n,i)}})}async function S(n){return k.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const s=t.join(n,"__tests__"),i=t.join(n,"tests");try{await e.promises.rename(s,i);const o=await e.promises.readFile(t.join(n,"package.json"),"utf8"),r=o.replaceAll("__tests__","tests");if(o===r)return;await e.promises.writeFile(t.join(n,"package.json"),r)}catch{}}))})}const $=new c;async function F(e,s){return k.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),o=e.isRoot&&e.doesContainsSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),a=await n(()=>r.readdir(i,{withFileTypes:!0}));if(a)for(const e of a){const a=e.name.slice(0,-5),c=e.name.endsWith(".d.ts");let l=c?a:e.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some(e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]);e.isFile()&&c?p?(await r.mkdir(t.join(i,a)),await $.run(()=>r.rename(t.join(i,e.name),t.join(i,a,"index.d.ts")))):o&&(await r.mkdir(o,{recursive:!0}),await $.run(()=>r.rename(t.join(i,e.name),t.join(o,e.name)))):e.isDirectory()&&o&&!p&&(await r.mkdir(o,{recursive:!0}),await $.run(()=>n(()=>r.rename(t.join(i,e.name,"index.d.ts"),t.join(o,`${e.name}.d.ts`)))))}})}const C={async readFileIgnoringError(e){try{return await r.readFile(e,"utf8")}catch{}},async generateFile(e,t){await r.writeFile(e,t)}};async function E(n){return k.functionIgnoringException("fixTypos",async()=>{const s=n.dirPath,i=await a.glob("**/*.md",{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const o of i){const i=t.join(s,o);await $.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=B(t);s=D(s,n,"doc"),t!==s&&await C.generateFile(i,s)})}const o=await a.glob(["{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${o.length} TypeScript files in ${s}`);for(const i of o){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=O(r);a=D(a,n,"ts"),r!==a&&await C.generateFile(o,a)}const r=await a.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${r.length} text-based files in ${s}`);for(const i of r){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=B(r);a=D(a,n,"text"),r!==a&&await C.generateFile(o,a)}await $.promiseAll()})}function B(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function O(e){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function D(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 T=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,I=!!T,A=new l({auth:T});const R=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}};function W(e,t,n,s=0){do{const[s,i,o]=J(e,t,n);if(0===p.spawnSync(s,i,o).status)break}while(--s>=0)}function L(e,t,n){const[s,i,o]=J(e,t,n);o.stdio="pipe";const r=p.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function 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",`${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:s,shell:!1,stdio:"inherit"}]}function N(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 z="3.9.19",G="zulu-11.74.15",U="2.0.4",H="14.2.5";async function M(n){return k.functionIgnoringException("generateToolVersions",async()=>{await async function(n){if(!n.versionsText)return;const s=n.versionsText.trim().split("\n").map(e=>{const[t,n]=e.trim().split(/\s+/);return`${q.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&&K(i,"poetry",n),K(i,"python",z,!0)}n.depending.firebase&&K(i,"java",G,!0);if(n.doesContainsPackageJson)if(n.isBun){const e=await async function(e,t){try{const n=(await A.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&&K(i,"bun",e)}else{const e=L("npm",["show","yarn","version"],n.dirPath);K(i,"yarn",e)}for(const s of Y){const i=t.resolve(n.dirPath,`.${s}-version`);e.promises.rm(i,{force:!0})}const o=t.resolve(n.dirPath,".tool-versions");await(i.length>0?$.run(()=>e.promises.writeFile(o,i.join("\n")+"\n")):$.run(()=>e.promises.rm(o,{force:!0}))),await $.promiseAll(),W("asdf",["plugin","update","--all"],n.dirPath),W("asdf",["install"],n.dirPath)}(n)})}const q=new Set(["java","nodejs","bun","python"]),Y=["java","node","python"];function K(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+/);N(n)>N(t)&&(e[i]=o)}}function V(e,t){return t}function X(e,t,n){const s=[...e];for(const[i,o]of t.entries())void 0===s[i]?s[i]=n.cloneUnlessOtherwiseSpecified(o,n):n.isMergeableObject(o)?s[i]=d(e[i],o,n):e.includes(o)||s.push(o);return s}async function Q(n){return k.functionIgnoringException("generateBiomeJsonc",async()=>{let s={root:n.isRoot,$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};const i=t.resolve(n.dirPath,"biome.jsonc");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:V})}catch{}const o=JSON.stringify(s);await $.run(()=>C.generateFile(i,o))})}async function Z(n){return k.functionIgnoringException("generateBunfigToml",async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)&&e.readFileSync(s,"utf8").includes("exact = false")?"telemetry = false\n\n[install]\nexact = false\n\n[run]\nbun = true\n":"telemetry = false\n\n[install]\nexact = true\n\n[run]\nbun = true\n";await $.run(()=>C.generateFile(s,i))})}const ee="# Project-specific settings",te=/# Project-specific settings[^\n]*\n/gm,ne="# Generated by wbfy",se=`${ee} (head)\n\n\n${ne}\n`,ie=`\n${ee} (tail)\n`,oe={separator:ne,separatorPrefix:"# Generated by ",defaultHeadUserContent:se,defaultTailUserContent:ie,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=re(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(te,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return-1!==t?e.slice(0,e.indexOf("\n",t)+1).replaceAll(te,`${ee} (head)\n`):se},getTailUserContent(e){const t=re(e);return t>0?e.slice(t-1):ie},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function re(e){const t=e.indexOf(ee),n=e.lastIndexOf(ee);return n>t?n:-1}async function ae(n){return k.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainsDockerfile){const e=await C.readFileIgnoringError(s)??"",t=oe.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+oe.getTailUserContent(e);await $.run(()=>C.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const ce={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].sort(),codeWith4IndentSize:["go","gradle","py"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].sort()},le=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${de(ce.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${de(ce.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${de(ce.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function pe(e){return k.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await $.run(()=>C.generateFile(n,le))})}function de(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function ue(n){return k.functionIgnoringException("generateEslintrc",async()=>{await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintignore"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0}));const s=t.resolve(n.dirPath,"eslint.config.mjs");if(n.isBun)await $.run(()=>e.promises.rm(s,{force:!0}));else if(n.eslintBase){try{if(!(await e.promises.readFile(s,"utf8")).includes("export { default }"))return}catch{}await $.run(()=>C.generateFile(s,`export { default } from '${n.eslintBase}';`))}})}const me=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...ce.codeWith2IndentSize,...ce.codeWith4IndentSize,...ce.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function fe(e){return k.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await $.run(()=>C.generateFile(n,me))})}const ge=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function he(e,n){return k.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await C.readFileIgnoringError(s)??"";let o=oe.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot/chatSessions/\n.devcontainer/\n*/mount/*.hash\n__generated__/\ndist/\ntemp/\n";const r=oe.getTailUserContent(i),a=[...ge];e.doesContainsGemfile&&a.push("ruby"),e.doesContainsGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainsPackageJson&&a.push("node"),e.doesContainsPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainsPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainsTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainsPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(o+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(o+="*.sqlite3*\n"),e.depending.playwrightTest&&(o+="test-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),o+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(o+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await be(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,s=await fetch(n),i=await s.text();if(!s.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await $.run(()=>we(e,t)),v.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await oe.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainsPomXml||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainsPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+"\n"+c+r;await $.run(()=>C.generateFile(s,l))})}const ye=t.join(u.homedir(),".cache","wbfy","gitignore");async function we(n,s){await e.promises.mkdir(ye,{recursive:!0}),await e.promises.writeFile(t.join(ye,n),s)}async function be(n){try{const s=await e.promises.stat(t.join(ye,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(ye,n),"utf8")}catch{}}async function ve(e,t){try{const{data:n}=await A.request("GET /repos/{owner}/{repo}/commits",{owner:e,repo:t,per_page:1});if(0===n.length)throw new Error(`No commits found for ${e}/${t}`);return n[0].sha}catch(n){throw new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`)}}const ke={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},je=["eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],xe=[...je,"typescript-eslint","eslint-import-resolver-typescript"],_e=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],Pe={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js","eslint-plugin-import-x",...je],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react","eslint-plugin-import-x",...je,..._e],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts","eslint-plugin-import-x",...xe],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react","eslint-plugin-import-x",...xe,..._e],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-plugin-import","eslint-config-next",...xe,..._e]};async function Se(n,s,i){return k.functionIgnoringException("generatePackageJson",async()=>{await async function(n,s,i){const o=t.resolve(n.dirPath,"package.json"),r=await e.promises.readFile(o,"utf8"),c=JSON.parse(r);c.scripts=c.scripts||{},c.dependencies=c.dependencies||{},c.devDependencies=c.devDependencies||{},c.peerDependencies=c.peerDependencies||{};const l=n.isBun?"bun":"yarn";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,delete n.scripts["check-all"],!t.isWillBoosterConfigs)for(const e of Object.values(Pe))for(const t of e)delete n.devDependencies[t];await $.run(()=>e.promises.rm("lerna.json",{force:!0})),delete n.devDependencies["@typescript-eslint/eslint-plugin"],delete n.devDependencies["@typescript-eslint/parser"],delete n.devDependencies["eslint-plugin-import"]}(s,c),"@willbooster/prettier-config"!==c.name&&(c.prettier="@willbooster/prettier-config");for(const[e,t]of Object.entries(c.scripts))t.includes("git clone")||(c.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));c.scripts=d(c.scripts,$e(n)),"check-for-ai"in c.scripts&&("gen-code"in c.scripts&&(c.scripts["check-for-ai"]=`${l} gen-code > /dev/null && ${c.scripts["check-for-ai"]}`),c.scripts["check-for-ai"]=`${l} install > /dev/null && ${c.scripts["check-for-ai"]}`);n.isBun?delete c.scripts.prettify:c.scripts.prettify+=await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),o=i.indexOf(oe.separatorPrefix);if(-1===o)return"";const r=i.slice(0,o);return r.split("\n").map(e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith("#")&&!e.includes("/")).map(e=>` "!**/${e}/**"`).join("")}(n.dirPath);for(const[e,t]of Object.entries(c.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(c.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],u=["prettier","sort-package-json","@willbooster/prettier-config"];const m=[];n.isBun?delete c.devDependencies["lint-staged"]:u.push("lint-staged");if(n.isRoot){if(n.isBun?(delete c.devDependencies.husky,delete c.devDependencies.pinst,c.scripts.prepare="lefthook install || true",u.push("lefthook")):(u.push("husky"),c.scripts.prepare="husky || true",c.scripts.postinstall="husky || true",(n.isPublicRepo||n.isReferredByOtherRepo)&&(u.push("pinst"),c.scripts.prepack="pinst --disable",c.scripts.postpack="pinst --enable")),n.depending.semanticRelease&&(c.devDependencies["semantic-release"]||c.devDependencies["multi-semantic-release"]||c.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),c.version="0.0.0-semantically-released"),n.depending.playwrightTest){c.dependencies.artillery||c.devDependencies.artillery||c.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete c.dependencies["@playwright/test"]),delete c.dependencies.playwright,delete c.devDependencies.playwright}n.doesContainsSubPackageJsons?c.workspaces=Array.isArray(c.workspaces)?d.all([c.workspaces,["packages/*"]],{arrayMerge:X}):["packages/*"]:Array.isArray(c.workspaces)&&(c.workspaces=c.workspaces.filter(e=>a.globSync(e,{dot:!0,cwd:n.dirPath,ignore:_}).length>0),0===c.workspaces.length&&delete c.workspaces)}if(n.depending.wb||n.isBun){c.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):u.push("@willbooster/wb");for(const[e,t]of Object.entries(c.scripts))c.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainsJavaScript||n.doesContainsJavaScriptInPackages||n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(n.isBun?(u.push("@biomejs/biome","@willbooster/biome-config"),delete c.devDependencies.eslint,delete c.devDependencies.micromatch,delete c.devDependencies["typescript-eslint"]):u.push("eslint","micromatch"));(n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(u.push("typescript"),n.isBun&&u.push("@types/bun"));n.eslintBase&&u.push(...Pe[n.eslintBase]);n.isWillBoosterConfigs&&(p=p.filter(e=>!e.includes("@willbooster/")),u=u.filter(e=>!e.includes("@willbooster/")));c.name||(c.name=t.basename(n.dirPath));n.doesContainsSubPackageJsons&&(c.private=!0);c.license||(c.license="UNLICENSED");!c.private&&"UNLICENSED"!==c.license&&s.isPublicRepo&&(c.publishConfig??={},c.publishConfig.access??="public");const[f]=R.getOrgAndName(n.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(c.author="WillBooster Inc.");n.isRoot||!c.private||c.main||(c.main="./src");if(delete c.resolutions?.["npm/chalk"],!n.doesContainsSubPackageJsons){if(n.isBun||(n.doesContainsJavaScript||n.doesContainsTypeScript?c.scripts["lint-fix"]+=ke.getLintFixSuffix(n):(delete c.scripts.lint,delete c.scripts["lint-fix"],c.scripts.cleanup=c.scripts.cleanup?.replace(" && yarn lint-fix",""))),n.doesContainsPubspecYaml){c.scripts.lint="flutter analyze",c.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter(s=>e.existsSync(t.resolve(n.dirPath,s)));s.length>0&&(c.scripts["format-code"]=`flutter format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,c.scripts.format+=" && yarn format-code")}if(n.doesContainsPoetryLock){"poetry install"===c.scripts.postinstall&&delete c.scripts.postinstall;const e=await a.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:_}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");c.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,c.scripts.lint?c.scripts.lint=`poetry run flake8 ${e} && ${c.scripts.lint}`:(c.scripts.lint=`poetry run flake8 ${e}`,c.scripts["lint-fix"]="yarn lint"),c.scripts.format+=" && yarn format-code",m.push("black","isort","flake8")}}n.repository&&(c.repository=n.repository)}n.depending.blitz?(p.push(`blitz@${U}`,`@blitzjs/auth@${U}`,`@blitzjs/next@${U}`,`@blitzjs/rpc@${U}`,`next@${H}`),u=u.filter(e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e),c.scripts["gen-code"]?.startsWith("blitz codegen")?c.scripts["gen-code"].includes("blitz prisma generate")||(c.scripts["gen-code"]=c.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):c.scripts["gen-code"]="blitz codegen"):n.depending.prisma&&!c.scripts["gen-code"]?.startsWith("prisma generate")&&(c.scripts["gen-code"]="prisma generate");c.dependencies?.prettier||delete c.devDependencies["@types/prettier"];0===Object.keys(c.dependencies).length&&delete c.dependencies;0===Object.keys(c.devDependencies).length&&delete c.devDependencies;0===Object.keys(c.peerDependencies).length&&delete c.peerDependencies;await async function(e){e.dependencies=e.dependencies||{},e.devDependencies=e.devDependencies||{};const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]);if(t.has("@willbooster/auth")&&!Fe(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await ve("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!Fe(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await ve("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!Fe(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await ve("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#workspace=@code-analyzer/client&commit=${t}`}if(t.has("@willbooster/judge")&&!Fe(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await ve("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!Fe(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await ve("WillBoosterLab","llm-proxy");e.dependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(c),n.isBun&&delete c.packageManager;let g=JSON.stringify(c);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.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:_});for(const n of r)await $.run(async()=>{const s=t.join(i.dirPath,n),r=await e.promises.readFile(s,"utf8");let a=r;for(const[e,t]of o)a=a.replaceAll(e,t);a!==r&&await e.promises.writeFile(s,a)});return await $.promiseAll(),s}(c.scripts,g,n),await e.promises.writeFile(o,g),i||(p=p.filter(e=>!c.devDependencies?.[e]),p.length>0&&W(l,["add",...new Set(p)],n.dirPath),u=u.filter(e=>!c.dependencies?.[e]),u.length>0&&W(l,["add","-D",...new Set(u)],n.dirPath),m.length>0&&W("poetry",["add","--group","dev",...new Set(m)],n.dirPath))}(n,s,i)})}function $e(e){if(e.isBun){const t={"check-for-ai":"bun run cleanup && bun run typecheck && bun run test --silent",cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun wb test",typecheck:"bun --bun wb typecheck"};return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||delete t.typecheck,t}{let t={"check-for-ai":"yarn format > /dev/null && yarn lint-fix --quiet && yarn typecheck && yarn test --silent",cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:"eslint --color","lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ce.prettier.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};if(e.doesContainsSubPackageJsons){const e=t.test;t=d({...t},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ce.prettier.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}),e?.includes("wb test")&&(t.test=e)}else e.depending.pyright&&(t.typecheck=t.typecheck?`${t.typecheck} && `:"",t.typecheck+="pyright");return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages?e.depending.wb&&(t.typecheck="wb typecheck"):delete t.typecheck,t}}function Fe(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const Ce={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\nif [ $(git branch --show-current) = "main" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nyarn typecheck\n'.trim(),prePushForLabExceptAdmin:'\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nyarn typecheck\n'.trim(),postMerge:'\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function Ee(n){return k.functionIgnoringException("generateHuskyrcUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,"package.json"),i=await e.promises.readFile(s,"utf8"),o=JSON.parse(i);o.scripts||={},delete o.scripts.postinstall,delete o.scripts.postpublish,delete o.scripts.prepare,delete o.scripts.prepublishOnly,delete o.scripts.prepack,delete o.scripts.postpack;const r=t.resolve(n.dirPath,".husky");if(await Promise.all([e.promises.writeFile(s,JSON.stringify(o,void 0,2)),e.promises.rm(r,{force:!0,recursive:!0})]),n.isBun)return void W("git",["config","--unset","core.hooksPath"],n.dirPath);W("yarn",["dlx","husky-init","--yarn2"],n.dirPath);const a=t.resolve(r,"pre-commit");await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})),await $.run(()=>e.promises.writeFile(a,Ce.preCommit+"\n"));const{typecheck:c}=$e(n);if(c){let s=n.repository?.startsWith("github:WillBoosterLab/")?n.repository?.toLocaleLowerCase().includes("exercode")?Ce.prePushForLab:Ce.prePushForLabExceptAdmin:Ce.prePush;s=s.replace("yarn typecheck",c.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await $.run(()=>e.promises.writeFile(t.resolve(r,"pre-push"),s+"\n",{mode:493}))}const l=`${Ce.postMerge}\n\n${Be(n).join("\n")}\n`;await $.run(()=>e.promises.writeFile(t.resolve(r,"post-merge"),l,{mode:493}))}(n)})}function Be(e){const t=[];e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "awk '{print \$1}' .tool-versions | xargs -I{} asdf plugin add {}"`,String.raw`run_if_changed "\..+-version" "asdf plugin update --all"`),e.versionsText?.includes("python ")&&t.push(String.raw`run_if_changed "\..+-version" "asdf install python"`),e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "asdf install"`);const n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";return t.push(`run_if_changed "package\\.json" "${n}${s}"`),e.doesContainsPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`),t}function Oe(e,t,n,s){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${s}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${s})" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="${e}" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n`}const De=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ce.prettier.map(e=>Oe("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,Te=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ce.prettier.map(e=>Oe("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-errors","Biome",e)).join("")}\n </component>\n</project>\n`;async function Ie(n){return k.functionIgnoringException("generateIdeaSettings",async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainsJavaScript||n.doesContainsJavaScriptInPackages||n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages||n.doesContainsPackageJson&&!n.doesContainsPubspecYaml&&!n.doesContainsGemfile&&!n.doesContainsGoMod&&!n.doesContainsPomXml?$.run(()=>C.generateFile(i,n.isBun?Te:De)):$.run(()=>e.promises.rm(i,{force:!0})))}})}const Ae={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-commit":{commands:{cleanup:{glob:"*.{cjs,css,cts,htm,html,js,json,json5,jsonc,jsx,md,mjs,mts,scss,ts,tsx,vue,yaml,yml}",run:"bun --bun wb lint --fix --format {staged_files} && git add {staged_files}"},"check-migrations":{glob:"**/migration.sql",run:"\nif grep -q 'Warnings:' {staged_files}; then\n echo \"Migration SQL files ({staged_files}) contain warnings! Please solve the warnings and commit again.\"\n exit 1\nfi\n".trim()}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},Re={prePush:"bun --bun node_modules/.bin/wb typecheck",prePushForLab:'\n#!/bin/bash\n\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nbun --bun node_modules/.bin/wb typecheck\n'.trim(),postMerge:'\n#!/bin/bash\n\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function We(n){return k.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook");await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),m.dump(Ae,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]);const{typecheck:i}=$e(n);if(i){const i=n.repository?.startsWith("github:WillBoosterLab/")?Re.prePushForLab:Re.prePush;e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await $.run(()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493}))}const o=`${Re.postMerge}\n\n${Be(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await $.run(()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),o,{mode:493}))}(n)})}const Le={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};async function Je(n){return k.functionIgnoringException("generateLintstagedrc",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await $.run(()=>e.promises.rm(s,{force:!0}));const i=n.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",o=[];if(n.doesContainsJavaScript||n.doesContainsTypeScript){const e=`\n '${Ne(n)}': [${JSON.stringify(`${i}eslint --fix${ke.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;o.push(e)}const r=n.isRoot?" && !file.includes('/packages/')":"";o.push(`\n './**/*.{${ce.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/') && !file.includes('/test/fixtures/')${r});${function(e){return e.doesContainsJavaScript||e.doesContainsTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${Ne(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(n)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${i}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${i}sort-package-json');\n }\n return commands;\n },\n './**/migration.sql': (files) => {\n for (const file of files) {\n const content = fs.readFileSync(file, 'utf-8');\n if (content.includes('Warnings:')) {\n return [\n \`!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.\`,\n ];\n }\n }\n return [];\n},`),n.doesContainsPubspecYaml&&o.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`flutter format ${filteredFiles.join(' ')}`];\n },");n.doesContainsPoetryLock&&o.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const a=`const fs = require('fs');\nconst path = require('path');\n${n.doesContainsJavaScript||n.doesContainsTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${o.join("")}\n};\n`;await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0})),await $.run(()=>C.generateFile(s,a))}(n)})}function Ne(e){const t=function(e){return e.depending.blitz?Le.blitz:Le.node}(e).map(e=>`${e}/**/`);return`{,${t.join(",")}}*.{${ce.eslint.join(",")}}`}async function ze(n){return k.functionIgnoringException("generateNextConfigJson",async()=>{const s=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!s)return;const i=(await e.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,(e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`));await $.run(()=>C.generateFile(s,i))})}async function Ge(e){return k.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await C.readFileIgnoringError(n)??"",i=oe.getHeadUserContent(s),o=oe.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await oe.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainsPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await $.run(()=>C.generateFile(n,l))})}const Ue={venvPath:".",venv:".venv"};async function He(n){return k.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=f(Ue);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:V})}catch{}const o=JSON.stringify(s);await $.run(()=>C.generateFile(i,o))})}async function Me(n){return k.functionIgnoringException("generateReadme",async()=>{const s=t.resolve(n.dirPath,"README.md");let i=await e.promises.readFile(s,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(i=qe(i,"[](https://github.com/semantic-release/semantic-release)"));const o=n.repository?.slice(n.repository?.indexOf(":")+1),r=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const s of r){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let r=s;r=r[0].toUpperCase()+r.slice(1,r.indexOf(".")),r=r.replace("-"," ");const a=`[](https://github.com/${o}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=qe(i,a))}await $.run(()=>C.generateFile(s,i))})}function qe(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const s=e.slice(0,n+1);let i=e.slice(n+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${s}${t}\n${i}`}return`${e}\n${t}\n`}async function Ye(n){return k.functionIgnoringException("generateReleaserc",async()=>{const s=t.resolve(n.dirPath,".releaserc.json"),i=JSON.parse(await e.promises.readFile(s,"utf8")),o=i?.plugins||[];for(let e=0;e<o.length;e++){const t=Array.isArray(o[e])?o[e][0]:o[e],n=Array.isArray(o[e])&&o[e][1]||{};"@semantic-release/commit-analyzer"===t?o[e]=["@semantic-release/commit-analyzer",d.all([n,{preset:"conventionalcommits"}],{arrayMerge:V})]:"@semantic-release/github"===t&&(o[e]=["@semantic-release/github",d.all([n,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:V})])}const r=JSON.stringify(i);await $.run(()=>C.generateFile(s,r))})}const Ke={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function Ve(n){return k.functionIgnoringException("generateRenovateJson",async()=>{let s=f(Ke);const i=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${i}5`))return;try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:V}),s.extends=s.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(s.packageRules??=[],s.packageRules.some(e=>e.matchPackageNames.includes("next"))||s.packageRules.push({matchPackageNames:["next"],enabled:!1})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const o=JSON.stringify(s);await $.run(()=>C.generateFile(i,o))})}function Xe(e){const t=Object.entries(e).sort(([e],[t])=>e.localeCompare(t));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&Xe(s);return e}const Qe={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*","packages/*/src/**/*","packages/*/tests/**/*","packages/*/scripts/**/*"]},Ze={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*"]};async function et(n){return k.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=f(n.isRoot?Qe:Ze);n.doesContainsJsxOrTsx||n.doesContainsJsxOrTsxInPackages||delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainsSubPackageJsons&&(s.include=s.include?.filter(e=>!e.startsWith("packages/*/"))),n.isEsmPackage&&(s.compilerOptions={...s.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(i,"utf8"),o=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===o.extends&&delete o.extends,delete s.compilerOptions?.target,n.isEsmPackage||(delete s.compilerOptions?.module,delete s.compilerOptions?.moduleResolution),o.compilerOptions?.jsx&&delete s.compilerOptions?.jsx,s=d.all([s,o,s],{arrayMerge:X}),s.include=s.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__"))}catch{}Xe(s),s.include?.sort();const o=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await $.run(()=>C.generateFile(i,o))})}const tt=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function nt(n){return k.functionIgnoringException("generateVscodeSettings",async()=>{try{const s=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(s,"utf8");let o=JSON.parse(i);for(const e of tt)o=d.all([o,st(e)]);n.doesContainsPoetryLock&&(o=d.all([o,st("**/.venv/**")])),n.depending.next&&(o=d.all([o,st("**/.next/**")])),"editor.codeActionsOnSave"in o&&delete o["editor.codeActionsOnSave"],"editor.formatOnSave"in o&&delete o["editor.formatOnSave"],Xe(o??{});const r=JSON.stringify(o,void 0,2);await $.run(()=>C.generateFile(s,r))}catch{}})}function st(e){return{"files.watcherExclude":{[e]:!0}}}const it={test:{name:"Test",on:{pull_request:"",push:{branches:["main","wbfy"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},wbfy:{name:"Willboosterify",on:{workflow_dispatch:null},jobs:{wbfy:{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy.yml@main"}}},"wbfy-merge":{name:"Merge wbfy",on:{workflow_dispatch:null},jobs:{"wbfy-merge":{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy-merge.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"notify-ready":{name:"Notify ready",on:{issues:{types:["labeled"]}},jobs:{"notify-ready":{uses:"WillBooster/reusable-workflows/.github/workflows/notify-ready.yml@main",secrets:{DISCORD_WEBHOOK_URL:"${{ secrets.DISCORD_WEBHOOK_URL_FOR_READY }}"}}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"add-issue-to-project":{name:"Add issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",secrets:{GH_PROJECT_URL:"${{ secrets.GH_PROJECT_URL }}"}}}},"add-ready-issue-to-project":{name:"Add ready issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-ready-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",with:{labeled:"ready :rocket:"},secrets:{GH_PROJECT_URL:"https://github.com/orgs/WillBoosterLab/projects/5"}}}}};async function ot(n){return k.functionIgnoringException("generateWorkflow",async()=>{const s=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(s,{recursive:!0});const i=t.resolve(n.dirPath,".github","semantic.yml");await $.run(()=>e.promises.rm(i,{force:!0,recursive:!0}));const o=await e.promises.readdir(s,{withFileTypes:!0}),r=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml",...o.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&r.add("release.yml"),(n.isPublicRepo||n.repository?.startsWith("github:WillBoosterLab/"))&&(r.add("add-ready-issue-to-project.yml"),r.add("notify-ready.yml"));for(const e of r){const i=t.basename(e,".yml");await $.run(()=>rt(n,s,i))}await $.run(()=>e.promises.rm(t.join(s,"add-focused-issue-to-project.yml"),{force:!0,recursive:!0}))})}async function rt(n,s,i){let o=f(it[i]??{});const r=t.join(s,`${i}.yml`);try{const t=await e.promises.readFile(r,"utf8"),n=m.load(t);o=d.all([o,n,o],{arrayMerge:X})}catch{}i.startsWith("deploy")&&(o={...o,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},o.jobs&&function(e,t){const n=e[t];delete e[t],e[t]=n}(o,"jobs"),o.on?.push&&(o.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...o.on.push["paths-ignore"]??[]])]));for(const e of Object.values(o.jobs)){if(!e.uses?.includes?.("/reusable-workflows/"))return;at(n,e,i)}switch(i){case"release":if(o.on?.schedule)delete o.on.push;else{if(!(o.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});o.on.push.branches=n.release.branches}break;case"test":delete o.on?.pull_request?.["paths-ignore"],delete o.on?.push?.["paths-ignore"],o.on?.push&&(o.on.push.branches=o.on.push.branches.filter(e=>"renovate/**"!==e));break;case"wbfy":o.on&&ct(o,20,24);break;case"wbfy-merge":ct(o,1,4)}if(function(e){delete e.jobs["add-to-project"]}(o),await lt(o,r),"release"===i)await e.promises.rm(t.join(s,"semantic-release.yml"),{force:!0});else if("sync"===i){if(await e.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!o.jobs.sync||!o.jobs.sync.with)return;o.jobs["sync-force"]=o.jobs.sync;const n=o.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;o.jobs.sync.with.sync_params_without_dest=`--force ${n}`,o.name="Force to Sync",o.on={workflow_dispatch:null},delete o.jobs.sync,await lt(o,t.join(s,"sync-force.yml"))}}function at(e,t,n){if(t.with||={},t.secrets||={},"test"!==n&&"release"!==n&&"wbfy"!==n&&"wbfy-merge"!==n&&"add-issue-to-project"!==n&&"add-ready-issue-to-project"!==n||(t.secrets.GH_TOKEN=e.isPublicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==n&&"test"!==n||(t.secrets.NPM_TOKEN="${{ secrets.NPM_TOKEN }}"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with?.sync_params_without_dest;"string"==typeof e&&(t.with.sync_params_without_dest=e.replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,function(e){if(!e.with)return;delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,delete e.with.cpu_arch,delete e.with.label,delete e.with.labelOperator}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&"string"==typeof t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,"")),e.doesContainsDockerfile&&("extra-large"!==t.with.ci_size&&(n.startsWith("deploy")||n.startsWith("test"))&&(t.with.ci_size="large"),n.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===n||"test"===n||"wbfy"===n||"wbfy-merge"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?Xe(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Xe(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function ct(e,t,n){const[s,i]=(e.on.schedule?.[0]?.cron||"").split(" ").map(Number);if(0!==s&&Number.isInteger(i)){const e=(i+9)%24;if(t<n?t<=e&&e<n:t<=e||e<n)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(n-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function lt(t,n){const s=m.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function pt(n){return k.functionIgnoringException("generateYarnrcYml",async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await $.run(()=>e.promises.rm(s,{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await $.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const i=L("yarn",["--version"],n.dirPath),o=function(e,t){const n=L("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);dt(i)<=dt(o)&&i!==o&&W("yarn",["set","version",o],n.dirPath,1);const r=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(r,{recursive:!0});for(const n of await e.promises.readdir(r))n.startsWith("yarn-")&&!n.startsWith(`yarn-${o}.`)&&await $.run(()=>e.promises.rm(t.join(r,n)));const a=t.resolve(n.dirPath,".yarnrc");await $.run(()=>e.promises.rm(a,{force:!0}));const c=m.load(await e.promises.readFile(s,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const s=t.resolve(n.dirPath,".yarnrc","undefined.cjs");await $.run(()=>e.promises.rm(s,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,m.dump(c,{lineWidth:-1})),W("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function dt(e){const[t]=e.split(".");return Number(t)}async function ut(e){return k.functionIgnoringException("setupLabels",async()=>{if(!I)return;const[t,n]=R.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await mt(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await mt(t,n,"d2: easy :rabbit2:","DDD6FE"),await mt(t,n,"d3: medium :ox:","C4B5FD"),await mt(t,n,"d4: hard :squid:","A78BFA"),await mt(t,n,"d5: x-hard :whale2:","8B5CF6"),await mt(t,n,"p1: critical :fire::fire::fire:","EF4444"),await mt(t,n,"p2: urgent :fire::fire:","F87171"),await mt(t,n,"p3: important :fire:","FCA5A5"),await mt(t,n,"p4: nice to have :droplet:","FECACA"),await mt(t,n,"r: blitz","5300bc"),await mt(t,n,"r: firebase","ffca28"),await mt(t,n,"r: prisma","0c344b"),await mt(t,n,"r: react","61dafb"),await mt(t,n,"r: svelte","ff3e00"),await mt(t,n,"r: semantic-release","494949"),await mt(t,n,"ready :rocket:","22C55E"),await mt(t,n,"review requested :mag:","FBCA04"),await mt(t,n,"released :bookmark:","6366F1"),await mt(t,n,"s: 0.5h :clock1230:","F3F4F6"),await mt(t,n,"s: 1h :clock1:","E5E7EB"),await mt(t,n,"s: 2h :clock2:","D1D5DB"),await mt(t,n,"s: 3h :clock3:","9CA3AF"),await mt(t,n,"s: 5h :clock5:","6B7280"),await mt(t,n,"s: 8h :clock8:","4B5563"),await mt(t,n,"s: 13h :clock1:","374151"),await mt(t,n,"t: build :hammer:","BFDBFE"),await mt(t,n,"t: chore :broom:","BFDBFE"),await mt(t,n,"t: ci :construction_worker:","BFDBFE"),await mt(t,n,"t: docs :memo:","BFDBFE"),await mt(t,n,"t: feat :sparkles:","BFDBFE"),await mt(t,n,"t: fix :bug:","BFDBFE"),await mt(t,n,"t: perf :zap:","BFDBFE"),await mt(t,n,"t: refactor :recycle:","BFDBFE"),await mt(t,n,"t: style :lipstick:","BFDBFE"),await mt(t,n,"t: test :test_tube:","BFDBFE"),await mt(t,n,"project","24292F"),await mt(t,n,"focused :dart:","22C55E"),await mt(t,n,"ai-pr :robot:","00B4D8"),await ft(t,n,"bug"),await ft(t,n,"documentation"),await ft(t,n,"duplicate"),await ft(t,n,"enhancement"),await ft(t,n,"good first issue"),await ft(t,n,"help wanted"),await ft(t,n,"invalid"),await ft(t,n,"question"),await ft(t,n,"wontfix"),await ft(t,n,"ready"),await ft(t,n,"review requested"),await ft(t,n,"released"),await ft(t,n,"semantic-release"),await ft(t,n,"llm-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function mt(e,t,n,s){try{await A.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:n,color:s})}catch{await A.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n,color:s})}}async function ft(e,t,n){try{await A.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const gt=["READY_DISCORD_WEBHOOK_URL"];async function ht(e){return k.functionIgnoringException("setupSecrets",async()=>{if(!I||!v.doesUploadEnvVars)return;const[t,n]=R.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const s=g.config().parsed||{};if(0!==Object.keys(s).length)try{for(const e of gt)try{await A.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const i=await A.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=i.data;await h.ready;for(const[i,a]of Object.entries(s)){if(e.isPublicRepo&&"GH_BOT_PAT"===i)continue;if(!e.isPublicRepo&&"PUBLIC_GH_BOT_PAT"===i)continue;const s=h.from_base64(o,h.base64_variants.ORIGINAL),c=h.from_string(a),l=h.crypto_box_seal(c,s),p=h.to_base64(l,h.base64_variants.ORIGINAL);await A.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:i,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function yt(e){const[t,n]=R.getOrgAndName(e.repository??"");t&&n&&("WillBooster"!==t&&"WillBoosterLab"!==t||await s(()=>A.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}})))}const wt={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on this page.\n - PR title follows [Angular\'s commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn\'t have `WIP:`.\n - The test command (e.g., `yarn test`) passed.\n - The lint command (e.g., `yarn lint`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I\'ve reviewed my changes on the GitHub diff view.\n- [ ] I\'ve written the steps to test my changes.\n- [ ] I\'ve added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn\'t modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language `C`.\n3. Write the following code:\n ```c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n ```\n4. Push `Submit` button.\n5. ...\n--\x3e\n'.trim()};async function bt(n){return k.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(wt)){const o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(y(t,i)>i.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await $.run(()=>C.generateFile(o,i))}})}const vt=b.object({typos:b.object({all:b.record(b.string()).optional(),doc:b.record(b.string()).optional(),ts:b.record(b.string()).optional(),text:b.record(b.string()).optional()}).optional()});async function kt(n,s){const i=t.resolve(n,"package.json");try{const o=e.existsSync(i);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),s=JSON.parse(await r.readFile(e,"utf8"));d=s?.branches||[],u=s?.plugins?.flat()||[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=w(e),s=(await n.getRemotes(!0)).find(e=>"origin"===e.name),i=s?.refs?.fetch??s?.refs?.push;if("string"==typeof i){const e=await xt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await xt(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g="";try{g+=(await r.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[e,s]of[["java","java"],["node","nodejs"],["python","python"]])try{const i=await r.readFile(t.resolve(n,`.${e}-version`),"utf8");g&&(g+="\n"),g+=s+" "+i.trim()}catch{}let h="";try{h=await r.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let b;try{const e=await r.readFile(y,"utf8");b=vt.parse(JSON.parse(e))}catch{}const v={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:f?.full_name?`github:${f.full_name}`:void 0,isBun:s?.isBun||e.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainsSubPackageJsons:jt("packages/**/package.json",n),doesContainsDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainsGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainsGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainsPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainsPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainsPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainsPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainsTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainsVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainsJavaScript:jt("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScript:jt("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsx:jt("{app,src,tests}/**/*.{t,j}sx",n),doesContainsJavaScriptInPackages:jt("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScriptInPackages:jt("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsxInPackages:jt("packages/**/{app,src,tests}/**/*.{t,j}sx",n),depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],litestream:h.includes("install-litestream.sh"),next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},versionsText:g,packageJson:l,wbfyJson:b};if(v.isBun||(v.eslintBase=function(e){if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainsTypeScript)return e.doesContainsJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainsJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainsJavaScript)return"@willbooster/eslint-config-js"}(v)),v.doesContainsGemfile||v.doesContainsGoMod||v.doesContainsPackageJson||v.doesContainsPoetryLock||v.doesContainsPomXml||v.doesContainsPubspecYaml||v.doesContainsTemplateYaml)return v}catch{}}function jt(e,t){return a.globSync(e,{dot:!0,cwd:t,ignore:_}).length>0}async function xt(e){const[t,n]=R.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await A.request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch{}return s}await async function(){const n=await o(process.argv.slice(2)).command("$0 [paths..]","Make a given project follow the WillBooster standard",e=>{e.positional("paths",{describe:"project paths to be wbfied",array:!0,type:"string",default:["."]})}).options({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).strict().argv;v.isVerbose=n.verbose,v.doesUploadEnvVars=n.env;for(const s of n.paths){const o=t.join(s,"packages"),r=(await i(()=>e.promises.readdir(o,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(o,e.name));await S([s,...r]);const a=await kt(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=E(a),l=(await Promise.all(r.map(e=>kt(e,a)))).filter(e=>!!e),p=[a,...l];if(v.isVerbose)for(const e of p)console.info(e);await M(a),await pt(a),await Promise.all([j(a),P(a),c.then(()=>Me(a)),ae(a),pe(a),fe(a),bt(a),Ie(a),Ve(a),Ye(a),ot(a),ut(a),ht(a),yt(a),...a.isBun?[Z(a),Ee(a).then(()=>We(a))]:[Ee(a)],Je(a)]),await $.promiseAll();const d=[];for(const e of p)(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(F(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(x(e)),e.depending.next&&d.push(ze(e)),await he(e,a),await $.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await Ge(e),await Se(e,a,n.skipDeps),d.push(Je(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(nt(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(et(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isBun&&d.push(Q(e)),a.isWillBoosterConfigs||d.push(ue(e))),e.depending.pyright&&d.push(He(e)));await Promise.all(d),await $.promiseAll();const u=a.isBun?"bun":"yarn";if(W(u,["cleanup"],s),a.isBun){W(u,["update"],s);const n=t.join(s,"bun.lockb");e.existsSync(n)&&(e.promises.rm(n),W(u,["install","--save-text-lockfile","--frozen-lockfile","--lockfile-only"],s))}else W(u,["install"],s)}}();
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy9maXhlcnMvcGxheXdyaWdodENvbmZpZy50cyIsIi4uL3NyYy91dGlscy9nbG9iVXRpbC50cyIsIi4uL3NyYy9maXhlcnMvcHJpc21hLnRzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbkNvbnN0YW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FzZGYudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYmlvbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRpZ25vcmUudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9odXNreXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbmV4dGNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHlyaWdodGNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi50cyIsIi4uL3NyYy91dGlscy9vYmplY3RVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMveWFybnJjLnRzIiwiLi4vc3JjL2dpdGh1Yi9sYWJlbC50cyIsIi4uL3NyYy9naXRodWIvc2VjcmV0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvdGVtcGxhdGUudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlOiBib29sZWFuO1xuICBkb2VzVXBsb2FkRW52VmFyczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlzVmVyYm9zZSA9IGZhbHNlO1xuICAgIHRoaXMuZG9lc1VwbG9hZEVudlZhcnMgPSBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4RG9ja2VyZmlsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhEb2NrZXJmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0RvY2tlcmZpbGUpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBjb25maWcuZG9ja2VyZmlsZTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudDtcblxuICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgbmV3Q29udGVudCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC9yZXRyaWVzOi4rLC8sICdyZXRyaWVzOiBwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEsJyk7XG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9EQVRBQkFTRV9VUkw9XCI/KC4rXFwuc3FsaXRlMylcIj9bXFxuJF0vLFxuICAgICAgICAnREFUQUJBU0VfVVJMPVwiJDE/Y29ubmVjdGlvbl9saW1pdD0xXCJcXG4nXG4gICAgICApO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24ocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlRGlyUGF0aHMubWFwKGFzeW5jIChwYWNrYWdlRGlyUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ19fdGVzdHNfXycpO1xuICAgICAgICBjb25zdCBuZXdUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3Rlc3RzJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpO1xuICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2VBbGwoJ19fdGVzdHNfXycsICd0ZXN0cycpO1xuICAgICAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG5cbiAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksIG5ld0NvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBlRGVmaW5pdGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuOiBQYWNrYWdlQ29uZmlnW11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cGVEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsaWJUeXBlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0B0eXBlcycpO1xuICAgIGNvbnN0IHNyY1R5cGVEaXJQYXRoID1cbiAgICAgIGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucyA/IHVuZGVmaW5lZCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3NyYycsICd0eXBlcycpO1xuXG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnJlYWRkaXIobGliVHlwZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSk7XG4gICAgaWYgKCFkaXJlbnRzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gZGlyZW50Lm5hbWUuc2xpY2UoMCwgLTUpO1xuICAgICAgY29uc3QgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID0gZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5kLnRzJyk7XG4gICAgICBsZXQgcGFja2FnZU5hbWUgPSBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPyBkaXJOYW1lIDogZGlyZW50Lm5hbWU7XG4gICAgICBpZiAocGFja2FnZU5hbWUuaW5jbHVkZXMoJ19fJykpIHtcbiAgICAgICAgcGFja2FnZU5hbWUgPSBgQCR7cGFja2FnZU5hbWUucmVwbGFjZSgnX18nLCAnLycpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNMaWJyYXJ5ID0gY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuLnNvbWUoXG4gICAgICAgIChjb25maWcpID0+XG4gICAgICAgICAgY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICAgICk7XG5cbiAgICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uKSB7XG4gICAgICAgIGlmIChoYXNMaWJyYXJ5KSB7XG4gICAgICAgICAgLy8gTW92ZSBAdHlwZXMvPG5hbWU+L2luZGV4LmQudHMgaWYgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lKSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSwgJ2luZGV4LmQudHMnKSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNyY1R5cGVEaXJQYXRoKSB7XG4gICAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+IGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgc3JjVHlwZURpclBhdGggJiYgIWhhc0xpYnJhcnkpIHtcbiAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+LmQudHMgaWYgbm90IGluc3RhbGxlZFxuICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgIGlnbm9yZUVub2VudEFzeW5jKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUoXG4gICAgICAgICAgICAgIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdpbmRleC5kLnRzJyksXG4gICAgICAgICAgICAgIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgYCR7ZGlyZW50Lm5hbWV9LmQudHNgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuZXhwb3J0IGNvbnN0IGZzVXRpbCA9IHtcbiAgYXN5bmMgcmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzcC53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cG9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luQ29kZShvbGRDb250ZW50KTtcbiAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKFteJF0pL2csICdjZi4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKFteJF0pL2csICdlLmcuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLihbXiRdKS9nLCAnaS5lLiQxJyk7XG59XG5cbmZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKiljXFwuZlxcLi9nLCAnLy8kMWNmLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKillZ1xcLi9nLCAnLy8kMWUuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopaWVcXC4vZywgJy8vJDFpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jb25zdCB0b2tlbiA9XG4gIHByb2Nlc3MuZW52LkdIX0JPVF9QQVQgfHwgcHJvY2Vzcy5lbnYuUFVCTElDX0dIX0JPVF9QQVQgfHwgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHwgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOO1xuZXhwb3J0IGNvbnN0IGhhc0dpdEh1YlRva2VuID0gISF0b2tlbjtcbmV4cG9ydCBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICBhdXRoOiB0b2tlbixcbn0pO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzPy5hdCgtMSk/LnJlcGxhY2UoLy5naXQkLywgJycpID8/ICcnO1xuICAgIHJldHVybiBbb3JnLCBuYW1lXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBpZiAocmV0LnN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICBjb25zdCBlcnJvciA9IHByb2Muc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBjYXVzZWQgdGhlIGZvbGxvd2luZyBlcnJvcjpcXG4gJHtlcnJvcn1gKTtcbiAgfVxuICByZXR1cm4gcHJvYy5zdGRvdXQudG9TdHJpbmcoKS50cmltKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICAvLyBSZW1vdmUgYmVycnkgZnJvbSBQQVRIXG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEgucmVwbGFjZShgJHtlbnYuQkVSUllfQklOX0ZPTERFUn06YCwgJycpO1xuICB9XG5cbiAgaWYgKGVudi5BU0RGX0RJUikge1xuICAgIGFyZ3MgPSBbJy1sJywgJy1jJywgYCR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gXTtcbiAgICBjb21tYW5kID0gJ2Jhc2gnO1xuICB9XG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIodmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgLy8gZS5nLiBqYXZhIGFkb3B0b3Blbmpkay0xMS4wLjE3KzhcbiAgY29uc3QgbnVtYmVycyA9IHZlcnNpb25cbiAgICAuc3BsaXQoL1srLi1dLylcbiAgICAubWFwKE51bWJlcilcbiAgICAuZmlsdGVyKChudW0pID0+ICFOdW1iZXIuaXNOYU4obnVtKSk7XG4gIGxldCB2ZXJzaW9uTnVtYmVyID0gMDtcbiAgbGV0IGRpdmlzb3IgPSAxO1xuICBmb3IgKGNvbnN0IG51bSBvZiBudW1iZXJzKSB7XG4gICAgdmVyc2lvbk51bWJlciArPSBudW0gKiBkaXZpc29yO1xuICAgIGRpdmlzb3IgLz0gMTAwMDtcbiAgfVxuICByZXR1cm4gdmVyc2lvbk51bWJlcjtcbn1cbiIsImV4cG9ydCBjb25zdCBQWVRIT05fVkVSU0lPTiA9ICczLjkuMTknO1xuZXhwb3J0IGNvbnN0IEpBVkFfVkVSU0lPTiA9ICd6dWx1LTExLjc0LjE1Jztcbi8vIEJlY2F1c2UgV2ViS2l0IGNhbm5vdCBsb2ctaW4gb24gQmxpdHogdjIuMC41K1xuZXhwb3J0IGNvbnN0IEJMSVRaX1ZFUlNJT04gPSAnMi4wLjQnO1xuZXhwb3J0IGNvbnN0IE5FWFRfVkVSU0lPTiA9ICcxNC4yLjUnO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgY29udmVydFZlcnNpb25JbnRvTnVtYmVyIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBKQVZBX1ZFUlNJT04sIFBZVEhPTl9WRVJTSU9OIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbkNvbnN0YW50cy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRvb2xWZXJzaW9ucyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRvb2xWZXJzaW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5jb25zdCBDT1JFX1RPT0xTID0gbmV3IFNldChbJ2phdmEnLCAnbm9kZWpzJywgJ2J1bicsICdweXRob24nXSk7XG5jb25zdCBERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMgPSBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXTtcblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjb25maWcudmVyc2lvbnNUZXh0KSByZXR1cm47XG5cbiAgY29uc3QgZHVwbGljYXRhYmxlTGluZXMgPSBjb25maWcudmVyc2lvbnNUZXh0XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBbbmFtZSwgdmVyc2lvbl0gPSBsaW5lLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgLy8gVG8gbW92ZSB0aGUgdG9wIG9mIHRoZSBzb3J0ZWQgbGlzdCwgd2UgbmVlZCB0byBhZGQgYSBzcGFjZS5cbiAgICAgIHJldHVybiBgJHtDT1JFX1RPT0xTLmhhcyhuYW1lKSA/ICcgJyA6ICcnfSR7bmFtZX0gJHt2ZXJzaW9ufWA7XG4gICAgfSlcbiAgICAuc29ydCgpXG4gICAgLy8gUmVtb3ZlIGFkZGVkIHNwYWNlcy5cbiAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSlcbiAgICAvLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGFmdGVyIGxlZnRob29rIGlzIGluc3RhbGxlZCB2aWEgbnBtLlxuICAgIC5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLnN0YXJ0c1dpdGgoJ2xlZnRob29rJykpO1xuICBjb25zdCBsaW5lcyA9IFsuLi5uZXcgU2V0KGR1cGxpY2F0YWJsZUxpbmVzKV07XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9weXBpLm9yZy9weXBpL3BvZXRyeS9qc29uJyk7XG4gICAgY29uc3QganNvbiA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgaW5mbz86IHsgdmVyc2lvbjogc3RyaW5nIH0gfSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwb2V0cnlWZXJzaW9uID0ganNvbj8uaW5mbz8udmVyc2lvbjtcbiAgICBpZiAocG9ldHJ5VmVyc2lvbikge1xuICAgICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3BvZXRyeScsIHBvZXRyeVZlcnNpb24pO1xuICAgIH1cbiAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAncHl0aG9uJywgUFlUSE9OX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ2phdmEnLCBKQVZBX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25zdCBidW5WZXJzaW9uID0gYXdhaXQgZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yignb3Zlbi1zaCcsICdidW4nKTtcbiAgICAgIGlmIChidW5WZXJzaW9uKSB1cGRhdGVWZXJzaW9uKGxpbmVzLCAnYnVuJywgYnVuVmVyc2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCducG0nLCBbJ3Nob3cnLCAneWFybicsICd2ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICd5YXJuJywgdmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwcmVmaXggb2YgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTKSB7XG4gICAgY29uc3QgdmVyc2lvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKTtcbiAgICB2b2lkIGZzLnByb21pc2VzLnJtKHZlcnNpb25QYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgdG9vbFZlcnNpb25zUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyk7XG4gIGF3YWl0IChsaW5lcy5sZW5ndGggPiAwXG4gICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHRvb2xWZXJzaW9uc1BhdGgsIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbicpKVxuICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHRvb2xWZXJzaW9uc1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ3BsdWdpbicsICd1cGRhdGUnLCAnLS1hbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ2luc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVWZXJzaW9uKGxpbmVzOiBzdHJpbmdbXSwgdG9vbE5hbWU6IHN0cmluZywgbmV3VmVyc2lvbjogc3RyaW5nLCBoZWFkID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc3QgaW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGwpID0+IGwuc3BsaXQoL1xccysvKVswXSA9PT0gdG9vbE5hbWUpO1xuICBjb25zdCBuZXdMaW5lID0gYCR7dG9vbE5hbWV9ICR7bmV3VmVyc2lvbn1gO1xuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgbGluZXMuc3BsaWNlKGhlYWQgPyAwIDogbGluZXMubGVuZ3RoLCAwLCBuZXdMaW5lKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGxpbmVzW2luZGV4XS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIobmV3VmVyc2lvbikgPiBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIodmVyc2lvbikpIHtcbiAgICAgIGxpbmVzW2luZGV4XSA9IG5ld0xpbmU7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG9zaXRvcnk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgLy8gRmV0Y2ggdGhlIGxhdGVzdCByZWxlYXNlIGZyb20gdGhlIHJlcG9zaXRvcnlcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9sYXRlc3QnLCB7XG4gICAgICBvd25lcjogb3JnYW5pemF0aW9uLFxuICAgICAgcmVwbzogcmVwb3NpdG9yeSxcbiAgICB9KTtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVzcG9uc2UuZGF0YS50YWdfbmFtZTtcbiAgICBjb25zdCBpbmRleCA9IHZlcnNpb24ubGFzdEluZGV4T2YoJ3YnKTtcbiAgICBjb25zdCB2ZXJzaW9uTnVtYmVyVGV4dCA9IGluZGV4ID09PSAtMSA/IHZlcnNpb24gOiB2ZXJzaW9uLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgLy8gQ2hlY2sgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhIG51bWJlclxuICAgIHJldHVybiAvXlxcZC8udGVzdCh2ZXJzaW9uTnVtYmVyVGV4dCkgPyB2ZXJzaW9uTnVtYmVyVGV4dCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggQnVuIHRhZ3MgZHVlIHRvOicsIGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnQgKi9cblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogb2JqZWN0W10sIHNvdXJjZTogb2JqZWN0W10sIG9wdGlvbnM6IGFueSk6IG9iamVjdFtdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJpb21lSnNvbmMnLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSB7XG4gICAgICByb290OiBjb25maWcuaXNSb290LFxuICAgICAgJHNjaGVtYTogJy4vbm9kZV9tb2R1bGVzL0BiaW9tZWpzL2Jpb21lL2NvbmZpZ3VyYXRpb25fc2NoZW1hLmpzb24nLFxuICAgICAgZXh0ZW5kczogWydAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJ10sXG4gICAgfTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlID0gYHRlbGVtZXRyeSA9IGZhbHNlXG5cbltpbnN0YWxsXVxuZXhhY3QgPSB0cnVlXG5cbltydW5dXG5idW4gPSB0cnVlXG5gO1xuXG5jb25zdCBuZXdDb250ZW50V2l0aEV4YWN0RmFsc2UgPSBgdGVsZW1ldHJ5ID0gZmFsc2VcblxuW2luc3RhbGxdXG5leGFjdCA9IGZhbHNlXG5cbltydW5dXG5idW4gPSB0cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgY29uc3QgY29udGVudCA9XG4gICAgICBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSAmJiBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykuaW5jbHVkZXMoJ2V4YWN0ID0gZmFsc2UnKVxuICAgICAgICA/IG5ld0NvbnRlbnRXaXRoRXhhY3RGYWxzZVxuICAgICAgICA6IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnNvcnQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAncHknXS5zb3J0KCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnNvcnQoKSxcbiAgZXNsaW50OiBbJ2NqcycsICdtanMnLCAnanMnLCAnY3RzJywgJ210cycsICd0cycsICd0c3gnLCAnanN4J10uc29ydCgpLFxuICBwcmV0dGllcjogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjc3MnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnbWQnLFxuICAgICdzY3NzJyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0uc29ydCgpLFxuICAvLyBjZi4gaHR0cHM6Ly9iaW9tZWpzLmRldi9pbnRlcm5hbHMvbGFuZ3VhZ2Utc3VwcG9ydC9cbiAgYmlvbWU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ2FzdHJvJyxcbiAgICAnY3NzJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ2dxbCcsXG4gIF0uc29ydCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50cmMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgZmlsZXNcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRpZ25vcmUnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5lc2xpbnRCYXNlKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKCFvbGRDb250ZW50LmluY2x1ZGVzKCdleHBvcnQgeyBkZWZhdWx0IH0nKSkgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJyR7Y29uZmlnLmVzbGludEJhc2V9JztgKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuIS5rZWVwXG4uYWlkZXIqXG4uZW52LnByb2R1Y3Rpb25cbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLmRldmNvbnRhaW5lci9cbiovbW91bnQvKi5oYXNoXG5fX2dlbmVyYXRlZF9fL1xuZGlzdC9cbnRlbXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc0dlbWZpbGUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1YnknKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNHb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ21hdmVuJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5pZGVhL2dvb2dsZS1qYXZhLWZvcm1hdC54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1RlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnlcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3B5dGhvbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAudmVudi9cbmA7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmJsaXR6L1xuLmJsaXR6KipcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIG5hbWVzLnB1c2goJ25leHRqcycpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UgfHwgY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgICAgbmFtZXMucHVzaCgnZmlyZWJhc2UnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHRlc3QtcmVzdWx0cy9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2FydGlmYWN0cyQvZ20sICcuaWRlYS9hcnRpZmFjdHMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9jb21waWxlci54bWwkL2dtLCAnLmlkZWEvY29tcGlsZXIueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvamFyUmVwb3NpdG9yaWVzLnhtbCQvZ20sICcuaWRlYS9qYXJSZXBvc2l0b3JpZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnLmlkZWEvbW9kdWxlcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC8qLmltbCQvZ20sICcuaWRlYS8qLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMkL2dtLCAnLmlkZWEvbW9kdWxlcycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmltbCQvZ20sICcqLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmlwciQvZ20sICcqLmlwcicpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB7IG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBkYXRhOiBjb21taXRzIH0gPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cycsIHtcbiAgICAgIG93bmVyOiBvcmdhbml6YXRpb24sXG4gICAgICByZXBvLFxuICAgICAgcGVyX3BhZ2U6IDEsXG4gICAgfSk7XG4gICAgaWYgKGNvbW1pdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBjb21taXRzWzBdLnNoYTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IEVzbGludFV0aWwgPSB7XG4gIGdldExpbnRGaXhTdWZmaXgoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4ID8gJyAtLXJ1bGUgXCJ7IHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwczogMCB9XCInIDogJyc7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgRXNsaW50RXh0ZW5zaW9uQmFzZSwgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgRXNsaW50VXRpbCB9IGZyb20gJy4uL3V0aWxzL2VzbGludFV0aWwuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IEJMSVRaX1ZFUlNJT04sIE5FWFRfVkVSU0lPTiB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb25Db25zdGFudHMuanMnO1xuXG5jb25zdCBqc0NvbW1vbkRlcHMgPSBbXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG4gICdlc2xpbnQtcGx1Z2luLXVudXNlZC1pbXBvcnRzJyxcbiAgJ2dsb2JhbHMnLFxuXTtcblxuY29uc3QgdHNDb21tb25EZXBzID0gWy4uLmpzQ29tbW9uRGVwcywgJ3R5cGVzY3JpcHQtZXNsaW50JywgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItdHlwZXNjcmlwdCddO1xuXG5jb25zdCByZWFjdENvbW1vbkRlcHMgPSBbJ2VzbGludC1wbHVnaW4tcmVhY3QnLCAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcycsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJ107XG5cbmNvbnN0IGVzbGludERlcHM6IFJlY29yZDxFc2xpbnRFeHRlbnNpb25CYXNlLCBzdHJpbmdbXT4gPSB7XG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLCAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAgICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JyxcbiAgICAuLi5qc0NvbW1vbkRlcHMsXG4gICAgLi4ucmVhY3RDb21tb25EZXBzLFxuICBdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJywgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyxcbiAgICAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICdlc2xpbnQtcGx1Z2luLWltcG9ydCcsXG4gICAgJ2VzbGludC1jb25maWctbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgfHwge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyB8fCB7fTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqIGFzIFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuICApO1xuXG4gIGlmIChqc29uT2JqLm5hbWUgIT09ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJykge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAvLyBGcmVzaCByZXBvIHN0aWxsIHJlcXVpcmVzICd5YXJuIGluc3RhbGwnXG4gICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnZ2l0IGNsb25lJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgveWFyblxccyomJlxccyovLCAnJykucmVwbGFjZSgveWFyblxccyppbnN0YWxsXFxzKiYmXFxzKi8sICcnKTtcbiAgICB9XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPSBtZXJnZShqc29uT2JqLnNjcmlwdHMsIGdlbmVyYXRlU2NyaXB0cyhjb25maWcpKTtcblxuICBpZiAoJ2NoZWNrLWZvci1haScgaW4ganNvbk9iai5zY3JpcHRzKSB7XG4gICAgaWYgKCdnZW4tY29kZScgaW4ganNvbk9iai5zY3JpcHRzKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddID0gYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlID4gL2Rldi9udWxsICYmICR7anNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXX1gO1xuICAgIH1cbiAgICBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddID0gYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGwgPiAvZGV2L251bGwgJiYgJHtqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeTtcbiAgfSBlbHNlIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucHJldHRpZnkgKz0gYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCk7XG4gIH1cbiAgLy8gRGVhbCB3aXRoIGJyZWFraW5nIGNoYW5nZXMgaW4geWFybiBiZXJyeSA0LjAuMC1yYy40OVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMpKSB7XG4gICAgaWYgKCF2YWx1ZT8uaW5jbHVkZXMoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJykpIGNvbnRpbnVlO1xuICAgIGlmIChcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLWFsbCcpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1yZWN1cnNpdmUnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tc2luY2UnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0td29ya3RyZWUnKVxuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnLCAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnKTtcbiAgfVxuXG4gIGxldCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3ByZXR0aWVyJywgJ3NvcnQtcGFja2FnZS1qc29uJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnXTtcbiAgY29uc3QgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIH0gZWxzZSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xpbnQtc3RhZ2VkJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snaHVza3knXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sncGluc3QnXTtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnbGVmdGhvb2snKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IGh1c2t5XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnaHVza3knKTtcbiAgICAgIC8vICd8fCB0cnVlJyBhdm9pZHMgZXJyb3JzIHdoZW4gaHVza3kgaXMgbm90IGluc3RhbGxlZC5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2h1c2t5IHx8IHRydWUnOyAvLyBmb3Igbm9uLXlhcm4gcGFja2FnZSBtYW5hZ2Vycy5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9ICdodXNreSB8fCB0cnVlJzsgLy8gZm9yIHlhcm4uXG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbyB8fCBjb25maWcuaXNSZWZlcnJlZEJ5T3RoZXJSZXBvKSB7XG4gICAgICAgIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICAgICAgICAvLyBodHRwczovL3R5cGljb2RlLmdpdGh1Yi5pby9odXNreS8jLz9pZD1pbnN0YWxsLTFcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3BpbnN0Jyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYWNrID0gJ3BpbnN0IC0tZGlzYWJsZSc7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5wb3N0cGFjayA9ICdwaW5zdCAtLWVuYWJsZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzWydhcnRpbGxlcnknXSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snYXJ0aWxsZXJ5J107XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ3BsYXl3cmlnaHQnXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sncGxheXdyaWdodCddO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby5cbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKVxuICAgICAgICA/IG1lcmdlLmFsbChbanNvbk9iai53b3Jrc3BhY2VzLCBbJ3BhY2thZ2VzLyonXV0sIHtcbiAgICAgICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFsncGFja2FnZXMvKiddO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy53YiB8fCBjb25maWcuaXNCdW4pIHtcbiAgICBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoL3diXFxzK2RiLywgJ3diIHByaXNtYScpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzXG4gICkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAYmlvbWVqcy9iaW9tZScsICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyk7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludCddO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtaWNyb21hdGNoJ107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3R5cGVzY3JpcHQtZXNsaW50J107XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdlc2xpbnQnLCAnbWljcm9tYXRjaCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgndHlwZXNjcmlwdCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5lc2xpbnRCYXNlKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4uZXNsaW50RGVwc1tjb25maWcuZXNsaW50QmFzZV0pO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIH1cblxuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIEJlY2F1c2UgYFwicmVzb2x1dGlvbnNcIjogeyBcIm5wbS9jaGFsa1wiOiBcIl40LjEuMlwiIH0sYCBjYXVzZXMgXCJJbnZhbGlkIG5wbSB0b2tlblwiXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5jbGVhbnVwID0ganNvbk9iai5zY3JpcHRzLmNsZWFudXA/LnJlcGxhY2UoJyAmJiB5YXJuIGxpbnQtZml4JywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddICs9IEVzbGludFV0aWwuZ2V0TGludEZpeFN1ZmZpeChjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBmbHV0dGVyIGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgKz0gYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KC9bL1xcXFxdLyk7XG4gICAgICAgIGlmIChzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgcG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgcG9ldHJ5IHJ1biBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCArPSBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgICBwb2V0cnlEZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5KSB7XG4gICAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIGRlcGVuZGVuY2llcy5wdXNoKFxuICAgICAgYGJsaXR6QCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYEBibGl0empzL2F1dGhAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgQGJsaXR6anMvbmV4dEAke0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBAYmxpdHpqcy9ycGNAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgbmV4dEAke05FWFRfVkVSU0lPTn1gXG4gICAgKTtcbiAgICAvLyBQcmVmZXIgZXNsaW50LWNvbmZpZy1uZXh0J3MgZGVwZW5kZW5jaWVzXG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZCkgPT4gZCAhPT0gJ2VzbGludC1wbHVnaW4tcmVhY3QnICYmIGQgIT09ICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJyk7XG4gICAgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ2JsaXR6IGNvZGVnZW4nKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ2JsaXR6IGNvZGVnZW4nO1xuICAgIH0gZWxzZSBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5pbmNsdWRlcygnYmxpdHogcHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5yZXBsYWNlKFxuICAgICAgICAnYmxpdHogY29kZWdlbicsXG4gICAgICAgICdibGl0eiBjb2RlZ2VuICYmIGJsaXR6IHByaXNtYSBnZW5lcmF0ZSdcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hICYmICFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ3ByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ3ByaXNtYSBnZW5lcmF0ZSc7XG4gIH1cblxuICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzPy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXM7XG4gIH1cblxuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIGxldCBuZXdKc29uVGV4dCA9IEpTT04uc3RyaW5naWZ5KGpzb25PYmopO1xuICBuZXdKc29uVGV4dCA9IGF3YWl0IGZpeFNjcmlwdE5hbWVzKGpzb25PYmouc2NyaXB0cywgbmV3SnNvblRleHQsIGNvbmZpZyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3SnNvblRleHQpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXZEZXBlbmRlbmNpZXMuXG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGV2RGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRlcGVuZGVuY2llcy5cbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctRCcsIC4uLm5ldyBTZXQoZGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gICAgaWYgKHBvZXRyeURldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4ubmV3IFNldChwb2V0cnlEZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBtaWdyYXRpb24gY29kZSBpbiBmdXR1cmVcbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0c2xpYiddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LXBsdWdpbi1wcmV0dGllciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xlcm5hJ107XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3BpbnN0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydwcmV0dGllciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwnXTtcbiAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZm9yIChjb25zdCBkZXBzIG9mIE9iamVjdC52YWx1ZXMoZXNsaW50RGVwcykpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSgnbGVybmEuanNvbicsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gIC8vIE1pZ3JhdGUgZnJvbSBFU0xpbnQgbGVnYWN5IGNvbmZpZ3MgdG8gZmxhdCBjb25maWdzLFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4taW1wb3J0J107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2NoZWNrLWZvci1haSc6ICdidW4gcnVuIGNsZWFudXAgJiYgYnVuIHJ1biB0eXBlY2hlY2sgJiYgYnVuIHJ1biB0ZXN0IC0tc2lsZW50JyxcbiAgICAgIGNsZWFudXA6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gLS1idW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIC0tYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyxcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1mb3ItYWknOiAneWFybiBmb3JtYXQgPiAvZGV2L251bGwgJiYgeWFybiBsaW50LWZpeCAtLXF1aWV0ICYmIHlhcm4gdHlwZWNoZWNrICYmIHlhcm4gdGVzdCAtLXNpbGVudCcsXG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5YCxcbiAgICAgIGxpbnQ6IGBlc2xpbnQgLS1jb2xvcmAsXG4gICAgICAnbGludC1maXgnOiAneWFybiBsaW50IC0tZml4JyxcbiAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX1cIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgIHR5cGVjaGVjazogJ3RzYyAtLW5vRW1pdCAtLVByZXR0eScsXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgICAgY29uc3Qgb2xkVGVzdCA9IHNjcmlwdHMudGVzdDtcbiAgICAgIHNjcmlwdHMgPSBtZXJnZShcbiAgICAgICAgeyAuLi5zY3JpcHRzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKFxuICAgICAgICAgICAgJywnXG4gICAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLlxuICAgICAgICAgIC8vIEZPUkNFX0NPTE9SPTMgbWFrZSB3YiBlbmFibGUgY29sb3Igb3V0cHV0LlxuICAgICAgICAgIHRlc3Q6ICdDST0xIEZPUkNFX0NPTE9SPTMgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICAgIHNjcmlwdHMudGVzdCA9IG9sZFRlc3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gc2NyaXB0cy50eXBlY2hlY2sgPyBgJHtzY3JpcHRzLnR5cGVjaGVja30gJiYgYCA6ICcnO1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJ3B5cmlnaHQnO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSAnd2IgdHlwZWNoZWNrJztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBpbmRleCA9IGV4aXN0aW5nQ29udGVudC5pbmRleE9mKGlnbm9yZUZpbGVVdGlsLnNlcGFyYXRvclByZWZpeCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiAnJztcblxuICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQuc2xpY2UoMCwgaW5kZXgpO1xuICBjb25zdCBsaW5lcyA9IG9yaWdpbmFsQ29udGVudFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBuZXdMaW5lID0gbGluZS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3TGluZS5lbmRzV2l0aCgnLycpID8gbmV3TGluZS5zbGljZSgwLCAtMSkgOiBuZXdMaW5lO1xuICAgIH0pXG4gICAgLmZpbHRlcigobCkgPT4gbCAmJiAhbC5zdGFydHNXaXRoKCcjJykgJiYgIWwuaW5jbHVkZXMoJy8nKSk7XG5cbiAgcmV0dXJuIGxpbmVzLm1hcCgobGluZSkgPT4gYCBcIiEqKi8ke2xpbmV9LyoqXCJgKS5qb2luKCcnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4U2NyaXB0TmFtZXMoXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5ld0pzb25UZXh0OiBzdHJpbmcsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgb2xkQW5kTmV3U2NyaXB0TmFtZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXldIG9mIE9iamVjdC5rZXlzKHNjcmlwdHMpKSB7XG4gICAgaWYgKGtleVswXSAhPT0gJzonICYmIGtleS5pbmNsdWRlcygnOicpKSB7XG4gICAgICBvbGRBbmROZXdTY3JpcHROYW1lcy5wdXNoKFtrZXksIGtleS5yZXBsYWNlQWxsKCc6JywgJy0nKV0pO1xuICAgIH1cbiAgfVxuICBpZiAob2xkQW5kTmV3U2NyaXB0TmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3SnNvblRleHQ7XG5cbiAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICBuZXdKc29uVGV4dCA9IG5ld0pzb25UZXh0LnJlcGxhY2VBbGwob2xkTmFtZSwgbmV3TmFtZSk7XG4gIH1cbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBmZy5nbG9iKFsnKiovKi57bWQsY2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JywgJyoqL0RvY2tlcmZpbGUnXSwge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IG9sZENvbnRlbnQ7XG4gICAgICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBvbGRBbmROZXdTY3JpcHROYW1lcykge1xuICAgICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG5ld0NvbnRlbnQgIT09IG9sZENvbnRlbnQpIHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIHJldHVybiBuZXdKc29uVGV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmo6IFBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKSwgLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpXSk7XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvYXV0aCcpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9hdXRoJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9hdXRoJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2F1dGgnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2F1dGgnXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9hdXRoLmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQGRpc2NvcmQtYm90L3NoYXJlZCcpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0BkaXNjb3JkLWJvdC9zaGFyZWQnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdkaXNjb3JkLWJvdCcpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAZGlzY29yZC1ib3Qvc2hhcmVkJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvZGlzY29yZC1ib3QuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG5cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnY29kZS1hbmFseXplcicpO1xuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplciddID1cbiAgICAgIGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9jb2RlLWFuYWx5emVyLmdpdCN3b3Jrc3BhY2U9QGNvZGUtYW5hbHl6ZXIvY2xpZW50JmNvbW1pdD0ke2NvbW1pdEhhc2h9YDtcbiAgfVxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2p1ZGdlJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2p1ZGdlJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9qdWRnZSddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdqdWRnZScpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9qdWRnZS5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnbGxtLXByb3h5Jyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9sbG0tcHJveHkuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqOiBQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGpzb25PYmouZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8ICcnKS5pbmNsdWRlcygnd29ya3NwYWNlJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcHJlQ29tbWl0OiAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi9saW50LXN0YWdlZCcsXG4gIHByZVB1c2g6IGB5YXJuIHR5cGVjaGVja2AsXG4gIHByZVB1c2hGb3JMYWI6IGBcbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG55YXJuIHR5cGVjaGVja1xuYC50cmltKCksXG4gIHByZVB1c2hGb3JMYWJFeGNlcHRBZG1pbjogYFxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbnlhcm4gdHlwZWNoZWNrXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgcGFja2FnZUpzb24uc2NyaXB0cyB8fD0ge307XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwb3N0aW5zdGFsbCddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdHB1Ymxpc2gnXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3ByZXBhcmUnXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3ByZXB1Ymxpc2hPbmx5J107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwYWNrJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwb3N0cGFjayddO1xuXG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3knKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYWNrYWdlSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCB1bmRlZmluZWQsIDIpKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgc3Bhd25TeW5jKCdnaXQnLCBbJ2NvbmZpZycsICctLXVuc2V0JywgJ2NvcmUuaG9va3NQYXRoJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICdodXNreS1pbml0JywgJy0teWFybjInXSwgY29uZmlnLmRpclBhdGgpO1xuXG4gIGNvbnN0IHByZUNvbW1pdEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwcmUtY29tbWl0Jyk7XG5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy53cml0ZUZpbGUocHJlQ29tbWl0RmlsZVBhdGgsIHNjcmlwdHMucHJlQ29tbWl0ICsgJ1xcbicpKTtcblxuICBjb25zdCB7IHR5cGVjaGVjayB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZyk7XG4gIGlmICh0eXBlY2hlY2spIHtcbiAgICBsZXQgcHJlUHVzaCA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgID8gY29uZmlnLnJlcG9zaXRvcnk/LnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2V4ZXJjb2RlJylcbiAgICAgICAgPyBzY3JpcHRzLnByZVB1c2hGb3JMYWJcbiAgICAgICAgOiBzY3JpcHRzLnByZVB1c2hGb3JMYWJFeGNlcHRBZG1pblxuICAgICAgOiBzY3JpcHRzLnByZVB1c2g7XG4gICAgcHJlUHVzaCA9IHByZVB1c2gucmVwbGFjZShcbiAgICAgICd5YXJuIHR5cGVjaGVjaycsXG4gICAgICB0eXBlY2hlY2tcbiAgICAgICAgLnJlcGxhY2UoJ3RzYyAnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi90c2MgJylcbiAgICAgICAgLnJlcGxhY2UoJ3diICcsICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL3diICcpXG4gICAgICAgIC8vIHB5cmlnaHQgaGFzIG5vIGFyZ3VtZW50c1xuICAgICAgICAucmVwbGFjZSgncHlyaWdodCcsICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL3B5cmlnaHQnKVxuICAgICk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwcmUtcHVzaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgICAgbW9kZTogMG83NTUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy52ZXJzaW9uc1RleHQpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImF3ayAne3ByaW50IFxcJDF9JyAudG9vbC12ZXJzaW9ucyB8IHhhcmdzIC1Je30gYXNkZiBwbHVnaW4gYWRkIHt9XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgcGx1Z2luIHVwZGF0ZSAtLWFsbFwiYFxuICAgICk7XG4gIH1cbiAgLy8gUHl0aG9u44GM44Gq44GE44Go44Kk44Oz44K544OI44O844Or44Gn44GN44Gq44GE5Yem55CG57O744GM5a2Y5Zyo44GZ44KL44Gf44KB44CB5by35Yi255qE44Gr5pyA5Yid44Gr44Kk44Oz44K544OI44O844Or44GZ44KL44CCXG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0Py5pbmNsdWRlcygncHl0aG9uICcpKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBpbnN0YWxsIHB5dGhvblwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy52ZXJzaW9uc1RleHQpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIGluc3RhbGxcImApO1xuICB9XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBpbnN0YWxsJyA6ICd5YXJuJztcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3J5ID0gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQgPyAnICYmIHJtIC1SZiAubmV4dCcgOiAnJztcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChgcnVuX2lmX2NoYW5nZWQgXCJwYWNrYWdlXFxcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBnZW5lcmF0ZVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBjb2RlZ2VuXCJgXG4gICAgKTtcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cblxuY29uc3QgcHJldHRpZXJDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnLCAnUHJldHRpZXInLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5jb25zdCBiaW9tZUNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdidW4nLCAnLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vYmlvbWUgY2hlY2sgLS1maXggLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tc2tpcC1lcnJvcnMnLCAnQmlvbWUnLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgKGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbiAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zR2VtZmlsZSAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc0dvTW9kICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWcuaXNCdW4gPyBiaW9tZUNvbnRlbnQgOiBwcmV0dGllckNvbnRlbnQpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMgfSBmcm9tICcuL2h1c2t5cmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmNvbnN0IG5ld1NldHRpbmdzID0ge1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAncHJlcGFyZS5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGNvbW1hbmRzOiB7XG4gICAgICBjbGVhbnVwOiB7XG4gICAgICAgIGdsb2I6ICcqLntjanMsY3NzLGN0cyxodG0saHRtbCxqcyxqc29uLGpzb241LGpzb25jLGpzeCxtZCxtanMsbXRzLHNjc3MsdHMsdHN4LHZ1ZSx5YW1sLHltbH0nLFxuICAgICAgICBydW46ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCB7c3RhZ2VkX2ZpbGVzfSAmJiBnaXQgYWRkIHtzdGFnZWRfZmlsZXN9JyxcbiAgICAgIH0sXG4gICAgICAnY2hlY2stbWlncmF0aW9ucyc6IHtcbiAgICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgICBydW46IGBcbmlmIGdyZXAgLXEgJ1dhcm5pbmdzOicge3N0YWdlZF9maWxlc307IHRoZW5cbiAgZWNobyBcIk1pZ3JhdGlvbiBTUUwgZmlsZXMgKHtzdGFnZWRfZmlsZXN9KSBjb250YWluIHdhcm5pbmdzISBQbGVhc2Ugc29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXCJcbiAgZXhpdCAxXG5maVxuYC50cmltKCksXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAnY2hlY2suc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcHJlUHVzaDogYGJ1biAtLWJ1biBub2RlX21vZHVsZXMvLmJpbi93YiB0eXBlY2hlY2tgLFxuICBwcmVQdXNoRm9yTGFiOiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuYnVuIC0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL3diIHR5cGVjaGVja1xuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGVmdGhvb2snKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLFxuICAgICAgeWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7XG4gICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcblxuICBjb25zdCB7IHR5cGVjaGVjayB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZyk7XG4gIGlmICh0eXBlY2hlY2spIHtcbiAgICBjb25zdCBwcmVQdXNoID0gY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSA/IHNjcmlwdHMucHJlUHVzaEZvckxhYiA6IHNjcmlwdHMucHJlUHVzaDtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgICBtb2RlOiAwbzc1NSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3Qgc3JjRGlyZWN0b3JpZXMgPSB7XG4gIG5vZGU6IFsnc3JjJywgJ3Rlc3RzJywgJ3NjcmlwdHMnXS5zb3J0KCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0cycsICdzY3JpcHRzJywgJ2RiJywgJ2ludGVncmF0aW9ucycsICdtYWlsZXJzJ10uc29ydCgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNyY0RpcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ibGl0ejtcbiAgfVxuICByZXR1cm4gc3JjRGlyZWN0b3JpZXMubm9kZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFNyY0RpcnMgfSBmcm9tICcuLi91dGlscy9zcmNEaXJlY3Rvcmllcy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuY2pzJyk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VQcmVmaXggPSBjb25maWcuaXNSb290ID8gJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vJyA6ICdub2RlIC4uLy4uL25vZGVfbW9kdWxlcy8uYmluLyc7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQpIHtcbiAgICBjb25zdCBlc2xpbnQgPSBgXG4gICcke2dldEVzbGludEtleShjb25maWcpfSc6IFske0pTT04uc3RyaW5naWZ5KFxuICAgIGAke3BhY2thZ2VQcmVmaXh9ZXNsaW50IC0tZml4JHtFc2xpbnRVdGlsLmdldExpbnRGaXhTdWZmaXgoY29uZmlnKX1gXG4gICl9LCAnJHtwYWNrYWdlUHJlZml4fXByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSddLGA7XG4gICAgbGluZXMucHVzaChlc2xpbnQpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VzRmlsdGVyID0gY29uZmlnLmlzUm9vdCA/IFwiICYmICFmaWxlLmluY2x1ZGVzKCcvcGFja2FnZXMvJylcIiA6ICcnO1xuICBsaW5lcy5wdXNoKGBcbiAgJy4vKiovKi57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oJywnKX19JzogZmlsZXMgPT4ge1xuICAgIGxldCBmaWx0ZXJlZEZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gIWZpbGUuaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpICYmICFmaWxlLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSR7cGFja2FnZXNGaWx0ZXJ9KTske2dldEVzbGludEZpbHRlckZvclByZXR0aWVyKGNvbmZpZyl9XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgY29tbWFuZHMgPSBbXFxgJHtwYWNrYWdlUHJlZml4fXByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSBcXCR7ZmlsdGVyZWRGaWxlcy5qb2luKCcgJyl9XFxgXTtcbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5zb21lKGZpbGUgPT4gZmlsZS5lbmRzV2l0aCgncGFja2FnZS5qc29uJykpKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKCcke3BhY2thZ2VQcmVmaXh9c29ydC1wYWNrYWdlLWpzb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1hbmRzO1xuICB9LFxuICAnLi8qKi9taWdyYXRpb24uc3FsJzogKGZpbGVzKSA9PiB7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04Jyk7XG4gICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoJ1dhcm5pbmdzOicpKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcXGAhISEgTWlncmF0aW9uIFNRTCBmaWxlIChcXCR7cGF0aC5yZWxhdGl2ZSgnJywgZmlsZSl9KSBjb250YWlucyB3YXJuaW5ncyAhISEgU29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXFxgLFxuICAgICAgXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufSxgKTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgIGxpbmVzLnB1c2goYFxuICAnLi97bGliLHRlc3QsdGVzdF9kcml2ZXJ9LyoqLyouZGFydCc6IGZpbGVzID0+IHtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gIWZpbGUuaW5jbHVkZXMoJ2dlbmVyYXRlZCcpKVxuICAgICAgLmZpbHRlcihmaWxlID0+ICFmaWxlLmVuZHNXaXRoKCcuZnJlZXplZC5kYXJ0JykgJiYgIWZpbGUuZW5kc1dpdGgoJy5nLmRhcnQnKSk7XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcXGBmbHV0dGVyIGZvcm1hdCBcXCR7ZmlsdGVyZWRGaWxlcy5qb2luKCcgJyl9XFxgXTtcbiAgfSxgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4vKiovKi5weSc6IFtcbiAgICAncG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMnLFxuICAgICdwb2V0cnkgcnVuIGJsYWNrJyxcbiAgICAncG9ldHJ5IHJ1biBmbGFrZTgnXG4gIF0sYCk7XG4gIH1cblxuICBjb25zdCBuZXdDb250ZW50ID0gYGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG4ke2NvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0ID8gXCJjb25zdCBtaWNyb21hdGNoID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xcblwiIDogJyd9XG5tb2R1bGUuZXhwb3J0cyA9IHske2xpbmVzLmpvaW4oJycpfVxufTtcbmA7XG5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG59XG5cbmZ1bmN0aW9uIGdldEVzbGludEtleShjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBkaXJzID0gZ2V0U3JjRGlycyhjb25maWcpLm1hcCgoZGlyKSA9PiBgJHtkaXJ9LyoqL2ApO1xuICByZXR1cm4gYHssJHtkaXJzLmpvaW4oJywnKX19Ki57JHtleHRlbnNpb25zLmVzbGludC5qb2luKCcsJyl9fWA7XG59XG5cbmZ1bmN0aW9uIGdldEVzbGludEZpbHRlckZvclByZXR0aWVyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdFxuICAgID8gYFxcblxuICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZWxhdGl2ZSgnJywgZmlsZSkpO1xuICAgIGZpbHRlcmVkRmlsZXMgPSBtaWNyb21hdGNoLm5vdChmaWx0ZXJlZEZpbGVzLCAnJHtnZXRFc2xpbnRLZXkoY29uZmlnKX0nKTtcbiAgICBmaWx0ZXJlZEZpbGVzID0gZmlsdGVyZWRGaWxlcy5tYXAoKGZpbGUpID0+IHBhdGgucmVzb2x2ZShmaWxlKSk7YFxuICAgIDogJyc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU5leHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgLy8gUmVwbGFjZSB0aGUgSlNPTiBvYmplY3QgZnJvbSB0aGUgZmlsZVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoLz1cXHMqeyhbXFxTXFxzXSopfTsvLCAoXywgc2V0dGluZ3NUZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCdlc2xpbnQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICdlc2xpbnQ6IHsgaWdub3JlRHVyaW5nQnVpbGRzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCd0eXBlc2NyaXB0OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gYD0geyR7c2V0dGluZ3NUZXh0fX07YDtcbiAgICB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgdmVudlBhdGg6ICcuJyxcbiAgdmVudjogJy52ZW52Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSBjbG9uZURlZXAoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkge1xuICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5Py5pbmRleE9mKCc6JykgKyAxKTtcbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5yZWFkZGlyU3luYyhgJHtjb25maWcuZGlyUGF0aH0vLmdpdGh1Yi93b3JrZmxvd3NgKTtcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lcykge1xuICAgICAgaWYgKCFmaWxlTmFtZS5zdGFydHNXaXRoKCd0ZXN0JykgJiYgIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSBjb250aW51ZTtcblxuICAgICAgbGV0IGJhZGdlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBjb25zdCBiYWRnZSA9IGBbIVske2JhZGdlTmFtZX1dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9L2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9KWA7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuZ2l0aHViL3dvcmtmbG93cy8ke2ZpbGVOYW1lfWApKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgYmFkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0QmFkZ2UocmVhZG1lOiBzdHJpbmcsIGJhZGdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDml6LjgatiYWRnZeOBjOOBguOCi+WgtOWQiOOBr+WJiumZpFxuICByZWFkbWUgPSByZWFkbWUucmVwbGFjZShiYWRnZSwgJycpLnJlcGxhY2VBbGwoL1xcblxcblxcbisvZywgJ1xcblxcbicpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVhZG1lLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlYWRtZVtpIC0gMV0gPT09ICdcXG4nICYmIHJlYWRtZVtpXSA9PT0gJ1xcbicpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHJlYWRtZS5zbGljZSgwLCBpICsgMSk7XG4gICAgICBsZXQgYWZ0ZXIgPSByZWFkbWUuc2xpY2UoaSArIDEpO1xuICAgICAgaWYgKCFhZnRlci5zdGFydHNXaXRoKCdbJykgJiYgIWFmdGVyLnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICBhZnRlciA9IGBcXG4ke2FmdGVyfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7YmVmb3JlfSR7YmFkZ2V9XFxuJHthZnRlcn1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7cmVhZG1lfVxcbiR7YmFkZ2V9XFxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICBwbHVnaW5zOiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3M/LnBsdWdpbnMgfHwgW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW4gPSBBcnJheS5pc0FycmF5KHBsdWdpbnNbaV0pID8gcGx1Z2luc1tpXVswXSA6IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSAmJiBwbHVnaW5zW2ldWzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFsnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbjUnXSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSB0eXBlb2YganNvbk9iaiAmIHsgcGFja2FnZVJ1bGVzOiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoanNvbk9iaikgYXMgU2V0dGluZ3M7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdyZW5vdmF0ZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7ZmlsZVBhdGh9NWApKSB7XG4gICAgICAvLyBTaW5jZSBpdCBpcyBkaWZmaWN1bHQgZm9yIHBhcnNpbmcgcmVub3ZhdGUuanNvbjUsIHdlIGRvIG5vdGhpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBEb24ndCB1cGdyYWRlIE5leHQuanMgYXV0b21hdGljYWxseVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMgPz89IFtdO1xuICAgICAgaWYgKFxuICAgICAgICAhbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnNvbWUoKHJ1bGU6IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcy5pbmNsdWRlcygnbmV4dCcpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMucHVzaCh7IG1hdGNoUGFja2FnZU5hbWVzOiBbJ25leHQnXSwgZW5hYmxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kZXBlbmRhYm90JyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVub3ZhdGVyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikuc29ydCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG5cbiAgICAvLyBpZiB2YWx1ZSBpcyBhbiBvYmplY3QsIHNvcnQgdGhlIGtleXMgb2YgdGhlIG9iamVjdFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCByb290SnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgdGFyZ2V0OiAnRVMyMDIyJywgLy8gYmVjYXVzZSBkZWNvcmF0b3JzIHNob3VsZCBiZSB0cmFuc3BpbGVkIHRvIEVTMjAyMiBvbiBOb2RlLmpzXG4gICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZScsXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBlcmFzYWJsZVN5bnRheE9ubHk6IHRydWUsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuL0B0eXBlcyddLFxuICB9LFxuICBpbmNsdWRlOiBbXG4gICAgJ3NyYy8qKi8qJyxcbiAgICAndGVzdHMvKiovKicsXG4gICAgJ3NjcmlwdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc3JjLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3Rlc3RzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NjcmlwdHMvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICB0YXJnZXQ6ICdFUzIwMjInLCAvLyBiZWNhdXNlIGRlY29yYXRvcnMgc2hvdWxkIGJlIHRyYW5zcGlsZWQgdG8gRVMyMDIyIG9uIE5vZGUuanNcbiAgICBtb2R1bGU6ICdFU05leHQnLFxuICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlJyxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgc2tpcExpYkNoZWNrOiB0cnVlLCAvLyBiZWNhdXNlIGxpYnJhcmllcyBtYXkgaGF2ZSBicm9rZW4gdHlwZXNcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIGVyYXNhYmxlU3ludGF4T25seTogdHJ1ZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgICB0eXBlUm9vdHM6IFsnLi4vLi4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuLi8uLi9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgaW5jbHVkZTogWydzcmMvKiovKicsICd0ZXN0cy8qKi8qJywgJ3NjcmlwdHMvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHJldHVybjtcblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChjb25maWcuaXNSb290ID8gcm9vdEpzb25PYmogOiBzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgbW9kdWxlOiAnTm9kZU5leHQnLFxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZU5leHQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBpZiAob2xkU2V0dGluZ3MuZXh0ZW5kcyA9PT0gJy4vbm9kZV9tb2R1bGVzL0B3aWxsYm9vc3Rlci90c2NvbmZpZy90c2NvbmZpZy5qc29uJykge1xuICAgICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IG1vZGlmeSBcInRhcmdldFwiLCBcIm1vZHVsZVwiIGFuZCBcIm1vZHVsZVJlc29sdXRpb25cIi5cbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnRhcmdldDtcbiAgICAgIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5tb2R1bGU7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZVJlc29sdXRpb247XG4gICAgICB9XG4gICAgICBpZiAob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgfVxuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fJylcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgICB9XG4gICAgICAvLyBMTE3jgavjgojjgot2aWJlIGNvZGluZ+OBp+OBr+OAgeiHquWLleODleOCqeODvOODnuODg+ODiOOChOOCs+ODvOODieOCouOCr+OCt+ODp+ODs+OCkueEoeWKueWMluOBmeOCi+OBk+OBqOOBp1xuICAgICAgLy8g55Sf5oiQ44GV44KM44Gf44Kz44O844OJ44Gu5YWD44Gu5b2i5byP44KS57at5oyB44Gn44GN44KLXG4gICAgICBpZiAoJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIGlmICgnZWRpdG9yLmZvcm1hdE9uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuZm9ybWF0T25TYXZlJ107XG4gICAgICB9XG4gICAgICBzb3J0S2V5cygoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID8/IHt9KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvbjogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIGpvYnM6IHsgW2tleTogc3RyaW5nXTogSm9iIH07XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICBpc3N1ZXM/OiBUeXBlcztcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3Q7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcztcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICB1c2VzOiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogJycsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHdiZnk6IHtcbiAgICBuYW1lOiAnV2lsbGJvb3N0ZXJpZnknLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHdiZnk6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy93YmZ5LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3diZnktbWVyZ2UnOiB7XG4gICAgbmFtZTogJ01lcmdlIHdiZnknLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICd3YmZ5LW1lcmdlJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3diZnktbWVyZ2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxuICAnbm90aWZ5LXJlYWR5Jzoge1xuICAgIG5hbWU6ICdOb3RpZnkgcmVhZHknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdub3RpZnktcmVhZHknOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvbm90aWZ5LXJlYWR5LnltbEBtYWluJyxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIERJU0NPUkRfV0VCSE9PS19VUkw6ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUFEWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2FkZC1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgIG5hbWU6ICdBZGQgaXNzdWUgdG8gR2l0SHViIHByb2plY3QnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdhZGQtaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hZGQtaXNzdWUtdG8tcHJvamVjdC55bWxAbWFpbicsXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBHSF9QUk9KRUNUX1VSTDogJyR7eyBzZWNyZXRzLkdIX1BST0pFQ1RfVVJMIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgIG5hbWU6ICdBZGQgcmVhZHkgaXNzdWUgdG8gR2l0SHViIHByb2plY3QnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hZGQtaXNzdWUtdG8tcHJvamVjdC55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICBsYWJlbGVkOiAncmVhZHkgOnJvY2tldDonLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0hfUFJPSkVDVF9VUkw6ICdodHRwczovL2dpdGh1Yi5jb20vb3Jncy9XaWxsQm9vc3RlckxhYi9wcm9qZWN0cy81JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZpZyBvZiBzZW1hbnRpYyBwdWxsIHJlcXVlc3RcbiAgICBjb25zdCBzZW1hbnRpY1ltbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICdzZW1hbnRpYy55bWwnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oc2VtYW50aWNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGZpbGVOYW1lU2V0ID0gbmV3IFNldChbXG4gICAgICAndGVzdC55bWwnLFxuICAgICAgJ3diZnkueW1sJyxcbiAgICAgICd3YmZ5LW1lcmdlLnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAnYWRkLWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAgIC4uLmVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuaXNQdWJsaWNSZXBvIHx8IHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0LnltbCcpO1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdub3RpZnktcmVhZHkueW1sJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZVNldCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBjb25zdCBraW5kID0gcGF0aC5iYXNlbmFtZShmaWxlTmFtZSwgJy55bWwnKSBhcyBLbm93bktpbmQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCkpO1xuICAgIH1cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnYWRkLWZvY3VzZWQtaXNzdWUtdG8tcHJvamVjdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKHdvcmtmbG93c1traW5kIGFzIGtleW9mIHR5cGVvZiB3b3JrZmxvd3NdID8/IHt9KSBhcyBXb3JrZmxvdztcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIGlmIChuZXdTZXR0aW5ncy5qb2JzKSB7XG4gICAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgfVxuICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPSBbXG4gICAgICAgIC4uLm5ldyBTZXQoWycqKi5tZCcsICcqKi9kb2NzLyoqJywgLi4uKG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID8/IFtdKV0pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcz8uKCcvcmV1c2FibGUtd29ya2Zsb3dzLycpKSByZXR1cm47XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICB9XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3Q/LlsncGF0aHMtaWdub3JlJ107XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24/LnB1c2g/LlsncGF0aHMtaWdub3JlJ107XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMuZmlsdGVyKChicmFuY2gpID0+IGJyYW5jaCAhPT0gJ3Jlbm92YXRlLyoqJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnd2JmeSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbikgc2V0U2NoZWR1bGUobmV3U2V0dGluZ3MsIDIwLCAyNCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnd2JmeS1tZXJnZSc6IHtcbiAgICAgIHNldFNjaGVkdWxlKG5ld1NldHRpbmdzLCAxLCA0KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBObyBkZWZhdWx0XG4gIH1cbiAgbWlncmF0ZVdvcmtmbG93KG5ld1NldHRpbmdzKTtcbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc2VtYW50aWMtcmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBlbHNlIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYyB8fCAhbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGgpIHJldHVybjtcblxuICAgIC8vIEdlbmVyYXRlIHN5bmMtZm9yY2UueW1sIGJhc2VkIG9uIHN5bmMueW1sIGlmIGl0IGV4aXN0cy5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUpvYihjb25maWc6IFBhY2thZ2VDb25maWcsIGpvYjogSm9iLCBraW5kOiBLbm93bktpbmQpOiB2b2lkIHtcbiAgam9iLndpdGggfHw9IHt9O1xuICBqb2Iuc2VjcmV0cyB8fD0ge307XG5cbiAgaWYgKFxuICAgIGtpbmQgPT09ICd0ZXN0JyB8fFxuICAgIGtpbmQgPT09ICdyZWxlYXNlJyB8fFxuICAgIGtpbmQgPT09ICd3YmZ5JyB8fFxuICAgIGtpbmQgPT09ICd3YmZ5LW1lcmdlJyB8fFxuICAgIGtpbmQgPT09ICdhZGQtaXNzdWUtdG8tcHJvamVjdCcgfHxcbiAgICBraW5kID09PSAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QnXG4gICkge1xuICAgIGpvYi5zZWNyZXRzWydHSF9UT0tFTiddID0gY29uZmlnLmlzUHVibGljUmVwbyA/ICcke3sgc2VjcmV0cy5QVUJMSUNfR0hfQk9UX1BBVCB9fScgOiAnJHt7IHNlY3JldHMuR0hfQk9UX1BBVCB9fSc7XG4gIH1cbiAgaWYgKGNvbmZpZy5yZWxlYXNlLm5wbSAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JykpIHtcbiAgICBqb2Iuc2VjcmV0c1snTlBNX1RPS0VOJ10gPSAnJHt7IHNlY3JldHMuTlBNX1RPS0VOIH19JztcbiAgfVxuICBpZiAoam9iLnNlY3JldHNbJ0ZJUkVCQVNFX1RPS0VOJ10pIHtcbiAgICBqb2Iuc2VjcmV0c1snR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSddID0gJyR7eyBzZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgfX0nO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0c1snRklSRUJBU0VfVE9LRU4nXTtcbiAgfVxuICBpZiAoXG4gICAgKGpvYi5zZWNyZXRzWydESVNDT1JEX1dFQkhPT0tfVVJMJ10gJiYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSkgfHxcbiAgICAoam9iLndpdGguc2VydmVyX3VybCAmJiBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKVxuICApIHtcbiAgICBqb2Iuc2VjcmV0c1snRElTQ09SRF9XRUJIT09LX1VSTCddID0gJyR7eyBzZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkxfRk9SX1JFTEVBU0UgfX0nO1xuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGpvYi53aXRoPy5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzLnJlcGxhY2UoJ1dpbGxCb29zdGVyTGFiLycsICdXaWxsQm9vc3Rlci8nKTtcbiAgfSBlbHNlIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoWydkb3RfZW52X3BhdGgnXSA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoWydkb3RfZW52X3BhdGgnXTtcbiAgfVxuICAvLyBSZW1vdmUgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzXG4gIG1pZ3JhdGVKb2Ioam9iKTtcblxuICAvLyBEb24ndCB1c2UgYGZseSBkZXBsb3kgLS1qc29uYCBzaW5jZSBpdCBjYXVzZXMgYW4gZXJyb3JcbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgam9iLnNlY3JldHNbJ0ZMWV9BUElfVE9LRU4nXSAmJiB0eXBlb2Ygam9iLndpdGhbJ2RlcGxveV9jb21tYW5kJ10gPT09ICdzdHJpbmcnKSB7XG4gICAgam9iLndpdGhbJ2RlcGxveV9jb21tYW5kJ10gPSBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXS5yZXBsYWNlKC9cXHMrLS1qc29uLywgJycpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSkge1xuICAgIGlmIChqb2Iud2l0aFsnY2lfc2l6ZSddICE9PSAnZXh0cmEtbGFyZ2UnICYmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpIHx8IGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSkge1xuICAgICAgam9iLndpdGhbJ2NpX3NpemUnXSA9ICdsYXJnZSc7XG4gICAgfVxuICAgIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgICBqb2Iud2l0aFsnY3B1X2FyY2gnXSA9ICdYNjQnO1xuICAgIH1cbiAgfVxuICAvLyBCZWNhdXNlIGdpdGh1Yi5ldmVudC5yZXBvc2l0b3J5LnByaXZhdGUgaXMgYWx3YXlzIHRydWUgaWYgam9iIGlzIHNjaGVkdWxlZFxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kID09PSAnd2JmeScgfHwga2luZCA9PT0gJ3diZnktbWVyZ2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGhbJ2dpdGh1Yl9ob3N0ZWRfcnVubmVyJ10gPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGhbJ2dpdGh1Yl9ob3N0ZWRfcnVubmVyJ107XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0U2NoZWR1bGUobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBpbmNsdXNpdmVNaW5Ib3VySnN0OiBudW1iZXIsIGV4Y2x1c2l2ZU1heEhvdXJKc3Q6IG51bWJlcik6IHZvaWQge1xuICBjb25zdCBbbWludXRlVXRjLCBob3VyVXRjXSA9ICgobmV3U2V0dGluZ3Mub24uc2NoZWR1bGU/LlswXT8uY3JvbiBhcyBzdHJpbmcpIHx8ICcnKS5zcGxpdCgnICcpLm1hcChOdW1iZXIpO1xuICBpZiAobWludXRlVXRjICE9PSAwICYmIE51bWJlci5pc0ludGVnZXIoaG91clV0YykpIHtcbiAgICBjb25zdCBob3VySnN0ID0gKGhvdXJVdGMgKyA5KSAlIDI0O1xuICAgIGNvbnN0IGluUmFuZ2UgPVxuICAgICAgaW5jbHVzaXZlTWluSG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3RcbiAgICAgICAgPyBpbmNsdXNpdmVNaW5Ib3VySnN0IDw9IGhvdXJKc3QgJiYgaG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3RcbiAgICAgICAgOiBpbmNsdXNpdmVNaW5Ib3VySnN0IDw9IGhvdXJKc3QgfHwgaG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3Q7XG4gICAgaWYgKGluUmFuZ2UpIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1pbkpzdCA9IDEgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1OSk7XG4gIGNvbnN0IGhvdXJKc3QgPSBpbmNsdXNpdmVNaW5Ib3VySnN0ICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGV4Y2x1c2l2ZU1heEhvdXJKc3QgLSBpbmNsdXNpdmVNaW5Ib3VySnN0KSk7XG4gIGNvbnN0IGNyb24gPSBgJHttaW5Kc3R9ICR7KGhvdXJKc3QgLSA5ICsgMjQpICUgMjR9ICogKiAqYDtcbiAgbmV3U2V0dGluZ3Mub24uc2NoZWR1bGUgPSBbeyBjcm9uIH1dO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7XG4gICAgbGluZVdpZHRoOiAtMSxcbiAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgc3R5bGVzOiB7XG4gICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICB9LFxuICB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGVXb3JrZmxvdyhuZXdTZXR0aW5nczogV29ya2Zsb3cpOiB2b2lkIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZW0gYWZ0ZXIgMjAyMy0wMy0zMVxuICBkZWxldGUgbmV3U2V0dGluZ3Muam9ic1snYWRkLXRvLXByb2plY3QnXTtcbn1cblxuZnVuY3Rpb24gbWlncmF0ZUpvYihqb2I6IEpvYik6IHZvaWQge1xuICAvLyBUT0RPOiBSZW1vdmUgdGhlbSBhZnRlciAyMDIzLTAzLTMxXG4gIGlmICgham9iLndpdGgpIHJldHVybjtcbiAgZGVsZXRlIGpvYi53aXRoWydub25fc2VsZl9ob3N0ZWQnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydub3RpZnlfZGlzY29yZCddO1xuICBkZWxldGUgam9iLndpdGhbJ3JlcXVpcmVfZmx5J107XG4gIGRlbGV0ZSBqb2Iud2l0aFsncmVxdWlyZV9nY2xvdWQnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydjcHVfYXJjaCddO1xuICBkZWxldGUgam9iLndpdGhbJ2xhYmVsJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbGFiZWxPcGVyYXRvciddO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uVmFsdWVNYXAgfSBmcm9tICdAeWFybnBrZy9jb3JlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmludGVyZmFjZSBTZXR0aW5ncyBleHRlbmRzIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPiB7XG4gIGRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeDogc3RyaW5nO1xuICBubU1vZGU6IHN0cmluZztcbiAgbm9kZUxpbmtlcjogc3RyaW5nO1xuICBwbHVnaW5zPzogUGx1Z2luW107XG59XG5cbmludGVyZmFjZSBQbHVnaW4ge1xuICBjaGVja3N1bTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNwZWM6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWWFybnJjWW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlWWFybnJjWW1sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhcm5yY1ltbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjLnltbCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoJ3lhcm4nLCBbJy0tdmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdFZlcnNpb24oJ0B5YXJucGtnL2NsaScsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoZ2V0TWFqb3JOdW1iZXIoY3VycmVudFZlcnNpb24pIDw9IGdldE1ham9yTnVtYmVyKGxhdGVzdFZlcnNpb24pICYmIGN1cnJlbnRWZXJzaW9uICE9PSBsYXRlc3RWZXJzaW9uKSB7XG4gICAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ3NldCcsICd2ZXJzaW9uJywgbGF0ZXN0VmVyc2lvbl0sIGNvbmZpZy5kaXJQYXRoLCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxlYXNlc1BhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcueWFybicsICdyZWxlYXNlcycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHJlbGVhc2VzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocmVsZWFzZXNQYXRoKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgneWFybi0nKSAmJiAhZmlsZS5zdGFydHNXaXRoKGB5YXJuLSR7bGF0ZXN0VmVyc2lvbn0uYCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmVkJywgcGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhcm5yY1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB5YW1sLmxvYWQoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoeWFybnJjWW1sUGF0aCwgJ3V0ZjgnKSkgYXMgU2V0dGluZ3M7XG4gICAgc2V0dGluZ3MuZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4ID0gJyc7XG4gICAgc2V0dGluZ3Mubm9kZUxpbmtlciA9ICdub2RlLW1vZHVsZXMnO1xuICAgIHNldHRpbmdzLm5tTW9kZSA9ICdoYXJkbGlua3MtZ2xvYmFsJztcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB2ZXJzaW9uc0pzb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCducG0nLCBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3ZlcnNpb25zJywgJy0tanNvbiddLCBkaXJQYXRoKTtcbiAgY29uc3QgdmVyc2lvbnMgPSBKU09OLnBhcnNlKHZlcnNpb25zSnNvbikgYXMgc3RyaW5nW107XG4gIHJldHVybiB2ZXJzaW9ucy5hdCgtMSkgYXMgc3RyaW5nO1xufVxuZnVuY3Rpb24gZ2V0TWFqb3JOdW1iZXIodmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgW21ham9yXSA9IHZlcnNpb24uc3BsaXQoJy4nKTtcbiAgcmV0dXJuIE51bWJlcihtYWpvcik7XG59XG4iLCJpbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiwgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbikgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogc3ZlbHRlJywgJ2ZmM2UwMCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnYWktcHIgOnJvYm90OicsICcwMEI0RDgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdyZWFkeScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3JlbGVhc2VkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnbGxtLXByIDpyb2JvdDonKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC14L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCBzb2RpdW0gZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4sIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgZGVwcmVjYXRlZFNlY3JldE5hbWVzID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJ107XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4gfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoKS5wYXJzZWQgfHwge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIGRlcHJlY2F0ZWRTZWNyZXROYW1lcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvICYmIG5hbWUgPT09ICdQVUJMSUNfR0hfQk9UX1BBVCcpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgIH0sXG4gICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYHlhcm4gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYHlhcm4gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBuZXdDb250ZW50KSA+IG5ld0NvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdpdEh1YlV0aWwsIG9jdG9raXQgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgaXNCdW46IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1N1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1BhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1B1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcblxuICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGVzbGludEJhc2U/OiBFc2xpbnRFeHRlbnNpb25CYXNlO1xuICB2ZXJzaW9uc1RleHQ/OiBzdHJpbmc7XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VDb25maWcoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdENvbmZpZz86IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluc1BhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcGx1Z2lucz86IHN0cmluZ1tdW107XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzIHx8IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgfHwgW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IHZlcnNpb25zVGV4dCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgJ3V0ZjgnKTtcbiAgICAgIHZlcnNpb25zVGV4dCArPSBjb250ZW50LnRyaW0oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJlZml4LCBuYW1lXSBvZiBbXG4gICAgICBbJ2phdmEnLCAnamF2YSddLFxuICAgICAgWydub2RlJywgJ25vZGVqcyddLFxuICAgICAgWydweXRob24nLCAncHl0aG9uJ10sXG4gICAgXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgbm9kZVZlcnNpb25Db250ZW50ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCksICd1dGY4Jyk7XG4gICAgICAgIGlmICh2ZXJzaW9uc1RleHQpIHtcbiAgICAgICAgICB2ZXJzaW9uc1RleHQgKz0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgdmVyc2lvbnNUZXh0ICs9IG5hbWUgKyAnICcgKyBub2RlVmVyc2lvbkNvbnRlbnQudHJpbSgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIFJlYWQgd2JmeS5qc29uXG4gICAgY29uc3Qgd2JmeUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YmZ5Lmpzb24nKTtcbiAgICBsZXQgd2JmeUpzb246IFdiZnlKc29uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3YmZ5SnNvblRleHQgPSBhd2FpdCBmc3AucmVhZEZpbGUod2JmeUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgd2JmeUpzb24gPSB3YmZ5SnNvblNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHdiZnlKc29uVGV4dCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5OiByZXBvSW5mbz8uZnVsbF9uYW1lID8gYGdpdGh1Yjoke3JlcG9JbmZvLmZ1bGxfbmFtZSBhcyBzdHJpbmd9YCA6IHVuZGVmaW5lZCxcbiAgICAgIGlzQnVuOiByb290Q29uZmlnPy5pc0J1biB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuZmlnLnRvbWwnKSksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogcGFja2FnZUpzb25QYXRoLmluY2x1ZGVzKGAke3BhdGguc2VwfXdpbGxib29zdGVyLWNvbmZpZ3NgKSxcbiAgICAgIGRvZXNDb250YWluc1N1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNHZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluc0dvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUGFja2FnZUpzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbnNQb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpbnNQb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0c30vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLFxuICAgICAgICBkaXJQYXRoXG4gICAgICApLFxuICAgICAgZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3RzfS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXNbJ2JsaXR6J10sXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIG5leHQ6ICEhZGVwZW5kZW5jaWVzWyduZXh0J10sXG4gICAgICAgIHBsYXl3cmlnaHRUZXN0OlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ3BsYXl3cmlnaHQnXSxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llc1sncHJpc21hJ10sXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzWydweXJpZ2h0J10sXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSxcbiAgICAgIH0sXG4gICAgICB2ZXJzaW9uc1RleHQsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGNvbmZpZy5lc2xpbnRCYXNlID0gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWcpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc0dvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWxcbiAgICApIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KS5sZW5ndGggPiAwO1xufVxuXG5leHBvcnQgdHlwZSBFc2xpbnRFeHRlbnNpb25CYXNlID1cbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuXG5mdW5jdGlvbiBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IEVzbGludEV4dGVuc2lvbkJhc2UgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JztcbiAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCkge1xuICAgIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3ggPyAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnIDogJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJztcbiAgfSBlbHNlIHtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJztcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcz8uZmV0Y2ggPz8gb3JpZ2luPy5yZWZzPy5wdXNoO1xuICBpZiAodHlwZW9mIHJlbW90ZVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICBjb25zdCByZXQgPSB7IGZ1bGxfbmFtZTogYCR7b3JnfS8ke25hbWV9YCB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihyZXQsIHJlc3BvbnNlLmRhdGEpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhEb2NrZXJmaWxlIH0gZnJvbSAnLi9maXhlcnMvZG9ja2VyZmlsZS5qcyc7XG5pbXBvcnQgeyBmaXhQbGF5d3JpZ2h0Q29uZmlnIH0gZnJvbSAnLi9maXhlcnMvcGxheXdyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQcmlzbWFFbnZGaWxlcyB9IGZyb20gJy4vZml4ZXJzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9maXhlcnMvdGVzdERpcmVjdG9yeS5qcyc7XG5pbXBvcnQgeyBmaXhUeXBlRGVmaW5pdGlvbnMgfSBmcm9tICcuL2ZpeGVycy90eXBlRGVmaW5pdGlvbi5qcyc7XG5pbXBvcnQgeyBmaXhUeXBvcyB9IGZyb20gJy4vZml4ZXJzL3R5cG9zLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVG9vbFZlcnNpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FzZGYuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCaW9tZUpzb25jIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2Jpb21lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQnVuZmlnVG9tbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVzbGludHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VzbGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9odXNreXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMaW50c3RhZ2VkcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbmV4dGNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Y29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCB0b29scyB2aWEgYXNkZiBhdCBmaXJzdFxuICAgIGF3YWl0IGdlbmVyYXRlVG9vbFZlcnNpb25zKHJvb3RDb25maWcpO1xuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeERvY2tlcmZpbGUocm9vdENvbmZpZyksXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihyb290Q29uZmlnLmlzQnVuXG4gICAgICAgID8gW1xuICAgICAgICAgICAgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpLFxuICAgICAgICAgICAgZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKS50aGVuKCgpID0+IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpKSxcbiAgICAgICAgICBdXG4gICAgICAgIDogW2dlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZyldKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBhcmd2LnNraXBEZXBzKTtcblxuICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWcpKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlc1xuICAgICAgKSB7XG4gICAgICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUVzbGludHJjKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgICAvLyAneWFybiBpbnN0YWxsJyBzaG91bGQgYmUgYWZ0ZXIgYHlhcm4gY2xlYW51cGAgYmVjYXVzZSB5YXJuIGJlcnJ5IGdlbmVyYXRlcyB5YXJuLmxvY2tcbiAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb250ZW50cyBvZiBkZXBlbmRhbnQgc3ViLXBhY2thZ2UgaW4gbW9ub3JlcG9cbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3VwZGF0ZSddLCByb290RGlyUGF0aCk7XG4gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGFmdGVyIHRoZXJlIGlzIG5vIGJ1bi5sb2NrYlxuICAgICAgY29uc3QgYnVuTG9ja2JQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnYnVuLmxvY2tiJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhidW5Mb2NrYlBhdGgpKSB7XG4gICAgICAgIHZvaWQgZnMucHJvbWlzZXMucm0oYnVuTG9ja2JQYXRoKTtcbiAgICAgICAgc3Bhd25TeW5jKFxuICAgICAgICAgIHBhY2thZ2VNYW5hZ2VyLFxuICAgICAgICAgIFsnaW5zdGFsbCcsICctLXNhdmUtdGV4dC1sb2NrZmlsZScsICctLWZyb3plbi1sb2NrZmlsZScsICctLWxvY2tmaWxlLW9ubHknXSxcbiAgICAgICAgICByb290RGlyUGF0aFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJvcHRpb25zIiwiY29uc3RydWN0b3IiLCJ0aGlzIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsImVycm9yIiwiRXJyb3IiLCJzdGFjayIsIlN0cmluZyIsImFzeW5jIiwiZml4RG9ja2VyZmlsZSIsImNvbmZpZyIsImRvZXNDb250YWluc0RvY2tlcmZpbGUiLCJvbGRDb250ZW50IiwiZG9ja2VyZmlsZSIsIm5ld0NvbnRlbnQiLCJmcyIsIndyaXRlRmlsZSIsInBhdGgiLCJqb2luIiwiZGlyUGF0aCIsImZpeFBsYXl3cmlnaHRDb25maWciLCJmaWxlUGF0aCIsImV4aXN0c1N5bmMiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwicmVwbGFjZSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsImVudkZpbGVQYXRoIiwicmVzb2x2ZSIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwib2xkVGVzdERpclBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm5ld1Rlc3REaXJQYXRoIiwicmVuYW1lIiwicmVwbGFjZUFsbCIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zIiwidW5kZWZpbmVkIiwiZGlyZW50cyIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJkaXJlbnQiLCJkaXJOYW1lIiwic2xpY2UiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaW5jbHVkZXMiLCJoYXNMaWJyYXJ5Iiwic29tZSIsInBhY2thZ2VKc29uIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiaXNGaWxlIiwibWtkaXIiLCJydW4iLCJyZWN1cnNpdmUiLCJpc0RpcmVjdG9yeSIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZzcCIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsImxlbmd0aCIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiZml4VHlwb3NJbkNvZGUiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIk9iamVjdCIsImVudHJpZXMiLCJ3YmZ5SnNvbiIsInR5cG9zIiwidG9rZW4iLCJwcm9jZXNzIiwiZW52IiwiR0hfQk9UX1BBVCIsIlBVQkxJQ19HSF9CT1RfUEFUIiwiR0hfVE9LRU4iLCJHSVRIVUJfVE9LRU4iLCJoYXNHaXRIdWJUb2tlbiIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsInNwbGl0IiwiYXQiLCJuYW1lcyIsInNwYXduU3luYyIsImNvbW1hbmQiLCJhcmdzIiwicmV0cnkiLCJuZXdDbWQiLCJuZXdBcmdzIiwiZ2V0U3Bhd25TeW5jQXJncyIsImNoaWxkX3Byb2Nlc3MiLCJzdGF0dXMiLCJzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0Iiwic3RkaW8iLCJwcm9jIiwic3RkZXJyIiwidG9TdHJpbmciLCJ0cmltIiwicyIsInN0ZG91dCIsIlBBVEgiLCJCRVJSWV9CSU5fRk9MREVSIiwiQVNERl9ESVIiLCJzaGVsbCIsImNvbnZlcnRWZXJzaW9uSW50b051bWJlciIsInZlcnNpb24iLCJudW1iZXJzIiwiTnVtYmVyIiwiZmlsdGVyIiwibnVtIiwiaXNOYU4iLCJ2ZXJzaW9uTnVtYmVyIiwiZGl2aXNvciIsIlBZVEhPTl9WRVJTSU9OIiwiSkFWQV9WRVJTSU9OIiwiQkxJVFpfVkVSU0lPTiIsIk5FWFRfVkVSU0lPTiIsImdlbmVyYXRlVG9vbFZlcnNpb25zIiwidmVyc2lvbnNUZXh0IiwiZHVwbGljYXRhYmxlTGluZXMiLCJsaW5lIiwiQ09SRV9UT09MUyIsImhhcyIsInNvcnQiLCJzdGFydHNXaXRoIiwibGluZXMiLCJTZXQiLCJkb2VzQ29udGFpbnNQb2V0cnlMb2NrIiwicmVzcG9uc2UiLCJmZXRjaCIsImpzb24iLCJwb2V0cnlWZXJzaW9uIiwidXBkYXRlVmVyc2lvbiIsImRlcGVuZGluZyIsImZpcmViYXNlIiwiZG9lc0NvbnRhaW5zUGFja2FnZUpzb24iLCJpc0J1biIsImJ1blZlcnNpb24iLCJvcmdhbml6YXRpb24iLCJyZXBvc2l0b3J5IiwicmVxdWVzdCIsIm93bmVyIiwicmVwbyIsImRhdGEiLCJ0YWdfbmFtZSIsImluZGV4IiwibGFzdEluZGV4T2YiLCJ2ZXJzaW9uTnVtYmVyVGV4dCIsInRlc3QiLCJnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViIiwicHJlZml4IiwiREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTIiwidmVyc2lvblBhdGgiLCJybSIsImZvcmNlIiwidG9vbFZlcnNpb25zUGF0aCIsImNvcmUiLCJ0b29sTmFtZSIsIm5ld1ZlcnNpb24iLCJoZWFkIiwiZmluZEluZGV4IiwibCIsIm5ld0xpbmUiLCJzcGxpY2UiLCJvdmVyd3JpdGVNZXJnZSIsImRlc3RpbmF0aW9uQXJyYXkiLCJzb3VyY2VBcnJheSIsImNvbWJpbmVNZXJnZSIsInRhcmdldCIsInNvdXJjZSIsImRlc3RpbmF0aW9uIiwiaXRlbSIsImNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkIiwiaXNNZXJnZWFibGVPYmplY3QiLCJtZXJnZSIsInB1c2giLCJnZW5lcmF0ZUJpb21lSnNvbmMiLCJuZXdTZXR0aW5ncyIsInJvb3QiLCIkc2NoZW1hIiwiZXh0ZW5kcyIsIm9sZFNldHRpbmdzIiwiSlNPTiIsInBhcnNlIiwiYXJyYXlNZXJnZSIsInN0cmluZ2lmeSIsImdlbmVyYXRlQnVuZmlnVG9tbCIsInJlYWRGaWxlU3luYyIsInVzZXJDb250ZW50SGVhZGVyIiwidXNlckNvbnRlbnRIZWFkZXJSZWdleCIsInNlcGFyYXRvciIsImRlZmF1bHRIZWFkVXNlckNvbnRlbnQiLCJkZWZhdWx0VGFpbFVzZXJDb250ZW50IiwiaWdub3JlRmlsZVV0aWwiLCJzZXBhcmF0b3JQcmVmaXgiLCJyZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMiLCJsYXN0SGVhZGVySW5kZXgiLCJnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyIiwiZ2V0SGVhZFVzZXJDb250ZW50IiwiaW5kZXhPZiIsImdldFRhaWxVc2VyQ29udGVudCIsImlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQiLCJsYXN0SW5kZXgiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsImVzbGludCIsInByZXR0aWVyIiwiZ2VuZXJhdGVFeHRlbnNpb25zIiwiZ2VuZXJhdGVFZGl0b3Jjb25maWciLCJnZW5lcmF0ZUVzbGludHJjIiwiZXNsaW50QmFzZSIsImV4dCIsImdlbmVyYXRlR2l0YXR0cmlidXRlcyIsImRlZmF1bHROYW1lcyIsImdlbmVyYXRlR2l0aWdub3JlIiwicm9vdENvbmZpZyIsImhlYWRVc2VyQ29udGVudCIsInRhaWxVc2VyQ29udGVudCIsImRvZXNDb250YWluc0dlbWZpbGUiLCJkb2VzQ29udGFpbnNHb01vZCIsImJhc2VuYW1lIiwiZG9lc0NvbnRhaW5zUG9tWG1sIiwiZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwiLCJkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWwiLCJibGl0eiIsIm5leHQiLCJwcmlzbWEiLCJwbGF5d3JpZ2h0VGVzdCIsInJlYWN0TmF0aXZlIiwic3Rvcnlib29rIiwibGl0ZXN0cmVhbSIsImdlbmVyYXRlZCIsInJlYWRDYWNoZSIsInVybCIsInJlc3BvbnNlVGV4dCIsInRleHQiLCJvayIsIndyaXRlQ2FjaGUiLCJvcyIsImhvbWVkaXIiLCJzdGF0IiwiRGF0ZSIsIm5vdyIsIm10aW1lTXMiLCJnZXRMYXRlc3RDb21taXRIYXNoIiwiY29tbWl0cyIsInBlcl9wYWdlIiwic2hhIiwiRXNsaW50VXRpbCIsImdldExpbnRGaXhTdWZmaXgiLCJkb2VzQ29udGFpbnNKc3hPclRzeCIsImpzQ29tbW9uRGVwcyIsInRzQ29tbW9uRGVwcyIsInJlYWN0Q29tbW9uRGVwcyIsImVzbGludERlcHMiLCJnZW5lcmF0ZVBhY2thZ2VKc29uIiwic2tpcEFkZGluZ0RlcHMiLCJqc29uVGV4dCIsImpzb25PYmoiLCJzY3JpcHRzIiwicGVlckRlcGVuZGVuY2llcyIsInBhY2thZ2VNYW5hZ2VyIiwiYXV0aG9yIiwiaXNXaWxsQm9vc3RlckNvbmZpZ3MiLCJkZXBzIiwidmFsdWVzIiwiZGVwIiwicmVtb3ZlRGVwcmVjYXRlZFN0dWZmIiwia2V5IiwidmFsdWUiLCJnZW5lcmF0ZVNjcmlwdHMiLCJwcmV0dGlmeSIsImV4aXN0aW5nQ29udGVudCIsIm9yaWdpbmFsQ29udGVudCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJwb2V0cnlEZXZEZXBlbmRlbmNpZXMiLCJwcmVwYXJlIiwicG9zdGluc3RhbGwiLCJpc1B1YmxpY1JlcG8iLCJpc1JlZmVycmVkQnlPdGhlclJlcG8iLCJwcmVwYWNrIiwicG9zdHBhY2siLCJzZW1hbnRpY1JlbGVhc2UiLCJ3b3Jrc3BhY2VzIiwiQXJyYXkiLCJpc0FycmF5Iiwid29ya3NwYWNlIiwiZ2xvYlN5bmMiLCJ3YiIsImRvZXNDb250YWluc0phdmFTY3JpcHQiLCJkb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluc1R5cGVTY3JpcHQiLCJkb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcyIsInByaXZhdGUiLCJsaWNlbnNlIiwicHVibGlzaENvbmZpZyIsImFjY2VzcyIsIm1haW4iLCJyZXNvbHV0aW9ucyIsImxpbnQiLCJjbGVhbnVwIiwiZGlycyIsImRpciIsImZvcm1hdCIsInB5dGhvbkZpbGVzIiwiZGlyTmFtZVNldCIsInB5dGhvbkZpbGUiLCJmaXJzdCIsInNlY29uZCIsImFkZCIsInNpemUiLCJkaXJOYW1lc1N0ciIsImQiLCJrZXlzIiwicGFja2FnZU5hbWVzIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwiY29tbWl0SGFzaCIsInVwZGF0ZVByaXZhdGVQYWNrYWdlcyIsIm5ld0pzb25UZXh0Iiwib2xkQW5kTmV3U2NyaXB0TmFtZXMiLCJvbGROYW1lIiwibmV3TmFtZSIsImZpbGVzIiwiZml4U2NyaXB0TmFtZXMiLCJ0eXBlY2hlY2siLCJvbGRUZXN0IiwicHlyaWdodCIsInByZUNvbW1pdCIsInByZVB1c2giLCJwcmVQdXNoRm9yTGFiIiwicHJlUHVzaEZvckxhYkV4Y2VwdEFkbWluIiwicG9zdE1lcmdlIiwiZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbiIsInBhY2thZ2VKc29uUGF0aCIsInByZUNvbW1pdEZpbGVQYXRoIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJtb2RlIiwicG9zdE1lcmdlQ29tbWFuZCIsImdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMiLCJwb3N0TWVyZ2VDb21tYW5kcyIsInJhdyIsImluc3RhbGxDb21tYW5kIiwicm1OZXh0RGlyZWN0b3J5IiwiY3JlYXRlVGFza09wdGlvbnMiLCJydW5uZXIiLCJleHRlbnNpb24iLCJwcmV0dGllckNvbnRlbnQiLCJiaW9tZUNvbnRlbnQiLCJnZW5lcmF0ZUlkZWFTZXR0aW5ncyIsImNvbW1hbmRzIiwiZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24iLCJ5YW1sIiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsIm1rZGlyU3luYyIsInNyY0RpcmVjdG9yaWVzIiwibm9kZSIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwicGFja2FnZVByZWZpeCIsImdldEVzbGludEtleSIsInBhY2thZ2VzRmlsdGVyIiwiZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIiLCJnZXRTcmNEaXJzIiwiZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbiIsImZpbmQiLCJwIiwiXyIsInNldHRpbmdzVGV4dCIsImdlbmVyYXRlUHJldHRpZXJpZ25vcmUiLCJnaXRpZ25vcmVGaWxlUGF0aCIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJjbG9uZURlZXAiLCJnZW5lcmF0ZVJlYWRtZSIsImluc2VydEJhZGdlIiwiZmlsZU5hbWVzIiwicmVhZGRpclN5bmMiLCJmaWxlTmFtZSIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwiYmFkZ2UiLCJyZWFkbWUiLCJpIiwiZ2VuZXJhdGVSZWxlYXNlcmMiLCJzZXR0aW5ncyIsInBsdWdpbnMiLCJwbHVnaW4iLCJvbGRDb25maWciLCJwcmVzZXQiLCJzdWNjZXNzQ29tbWVudCIsImZhaWxDb21tZW50IiwibGFiZWxzIiwicmVsZWFzZWRMYWJlbHMiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwibW9kdWxlIiwibW9kdWxlUmVzb2x1dGlvbiIsImpzeCIsImFsd2F5c1N0cmljdCIsInN0cmljdCIsInNraXBMaWJDaGVjayIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsImRlY2xhcmF0aW9uIiwic291cmNlTWFwIiwiaW1wb3J0SGVscGVycyIsImVyYXNhYmxlU3ludGF4T25seSIsIm91dERpciIsInR5cGVSb290cyIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlcyIsImlzRXNtUGFja2FnZSIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwid29ya2Zsb3dzIiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwidXNlcyIsInJlbGVhc2UiLCJ3YmZ5Iiwid29ya2Zsb3dfZGlzcGF0Y2giLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwic2VjcmV0cyIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJHSF9QUk9KRUNUX1VSTCIsIndpdGgiLCJsYWJlbGVkIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwiZmlsZU5hbWVTZXQiLCJraW5kIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJsb2FkIiwibW92ZVRvQm90dG9tIiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJzZXRTY2hlZHVsZSIsIm1pZ3JhdGVXb3JrZmxvdyIsIndyaXRlWWFtbCIsInBhcmFtcyIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIm5wbSIsInNlcnZlcl91cmwiLCJtaWdyYXRlSm9iIiwibmV3U2VjcmV0cyIsImluY2x1c2l2ZU1pbkhvdXJKc3QiLCJleGNsdXNpdmVNYXhIb3VySnN0IiwibWludXRlVXRjIiwiaG91clV0YyIsImNyb24iLCJpc0ludGVnZXIiLCJob3VySnN0IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwieWFtbFRleHQiLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJjdXJyZW50VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJ2ZXJzaW9uc0pzb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwiZ2V0TWFqb3JOdW1iZXIiLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJtYWpvciIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwiZGVwcmVjYXRlZFNlY3JldE5hbWVzIiwic2V0dXBTZWNyZXRzIiwicGFyc2VkIiwiZG90ZW52Iiwic2VjcmV0TmFtZSIsInNlY3JldF9uYW1lIiwia2V5X2lkIiwia2V5SWQiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsIndpdGhSZXRyeSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsImFsbG93X2F1dG9fbWVyZ2UiLCJ0ZW1wbGF0ZXMiLCJnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyIsImRpc3RhbmNlIiwid2JmeUpzb25TY2hlbWEiLCJ6Iiwib2JqZWN0IiwicmVjb3JkIiwic3RyaW5nIiwib3B0aW9uYWwiLCJkb2MiLCJ0cyIsImdldFBhY2thZ2VDb25maWciLCJlc21QYWNrYWdlIiwicGFja2FnZUpzb25UZXh0IiwidHlwZSIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJtZXNzYWdlIiwiZmV0Y2hSZXBvSW5mbyIsIm5vZGVWZXJzaW9uQ29udGVudCIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsImZ1bGxfbmFtZSIsInNlcCIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uIiwiZ2l0aHViIiwiZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZSIsInBhdHRlcm4iLCJvcmciLCJyZXQiLCJhc3NpZ24iLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJhcnJheSIsImRlZmF1bHQiLCJkZXNjcmlwdGlvbiIsImFsaWFzIiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicm9vdERpclBhdGgiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInRoZW4iLCJidW5Mb2NrYlBhdGgiXSwibWFwcGluZ3MiOiJ5bUJBVU8sTUFBTUEsRUFBVSxJQVZ2QixNQUlFQyxXQUFBQSxHQUNFQyxLQUFLQyxXQUFZLEVBQ2pCRCxLQUFLRSxtQkFBb0IsQ0FDM0IsR0NXSyxNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENSLEVBQVFHLFdBQ1ZNLFFBQVFDLEtBQUssYUFBYUgscUJBRTVC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
|