wbfy 5.5.0 → 5.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +2 -2
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{PromisePool as a}from"minimal-promise-pool";import c from"deepmerge";import l from"typescript";import p from"fast-glob";import d from"js-yaml";import u from"lodash.clonedeep";import{Octokit as m}from"@octokit/core";import f from"node:child_process";import g from"node:os";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{isVerbose=!1;doesUploadEnvVars=!1};const x=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function _(e){return x.functionIgnoringException("fixDockerfile",async()=>{if(!e.doesContainDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await r.writeFile(t.join(e.dirPath,"Dockerfile"),s)})}const j={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,s){await e.promises.mkdir(t.dirname(n),{recursive:!0});let i=s.replaceAll("\r\n","\n").trim();i&&(i+="\n"),await e.promises.writeFile(n,i)}},S=new a;async function P(n){return x.functionIgnoringException("fixNextConfigJson",async()=>{const s=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!s)return;const i=(await e.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,(e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`));await S.run(()=>j.generateFile(s,i))})}const $=e=>({kind:"literal",value:e}),C=e=>({kind:"object",value:e}),F={forbidOnly:$("!!process.env.CI"),retries:$("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:C({baseURL:$("process.env.NEXT_PUBLIC_BASE_URL"),trace:$("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:$("process.env.CI ? 'only-on-failure' : 'only-on-failure'"),video:$("process.env.CI ? 'retain-on-failure' : 'retain-on-failure'")}),webServer:C({command:$("'yarn start-test-server'"),url:$("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:$("!!process.env.CI"),timeout:$("300_000"),stdout:$("'ignore'"),stderr:$("'pipe'"),env:$("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:$("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})};async function E(n){return x.functionIgnoringException("fixPlaywrightConfig",async()=>{const s=t.resolve(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),o=/defineConfig\s*\(\s*(\{[\s\S]*?})\s*\);?/.exec(i),r=o?.[1];if(!r)return;const a=function(e){const t=l.createSourceFile("playwright-config.ts",`const config = ${e};`,l.ScriptTarget.Latest,!0,l.ScriptKind.TS),n=t.statements[0];if(!n||!l.isVariableStatement(n))return;const s=n.declarationList.declarations[0];if(!s?.initializer||!l.isObjectLiteralExpression(s.initializer))return;return B(s.initializer,t)}(r);if(!a)return;const p=A(c.all([F,a,F]),0),d=i.replace(r,p);await S.run(()=>j.generateFile(s,d))})}function B(e,t){const n={};for(const s of e.properties){if(!l.isPropertyAssignment(s)||!l.isIdentifier(s.name)&&!l.isStringLiteral(s.name))return;const e=O(s.initializer,t);if(void 0===e)return;n[s.name.getText(t)]=e}return n}function O(e,t){if(l.isObjectLiteralExpression(e)){const n=B(e,t);return n?C(n):$(e.getText(t))}if(l.isArrayLiteralExpression(e)){const n=e.elements.map(e=>O(e,t));return n.some(e=>void 0===e)?$(e.getText(t)):{kind:"array",value:n}}return $(e.getText(t))}function I(e,t){return"array"===e.kind?function(e,t){if(0===e.length)return"[]";const n=" ".repeat(t+1),s=e.map(e=>{const s=I(e,t+1).split("\n");if(s[s.length-1]=`${s.at(-1)},`,"literal"===e.kind)for(let e=1;e<s.length;e+=1)s[e]=`${n}${s[e]}`;return s[0]=`${n}${s[0]}`,s.join("\n")}),i=" ".repeat(t);return`[\n${s.join("\n")}\n${i}]`}(e.value,t):"literal"===e.kind?e.value:A(e.value,t)}function A(e,t){const n=" ".repeat(t+1),s=Object.entries(e).map(([e,s])=>{const i=I(s,t+1).split("\n");if(i[i.length-1]=`${i.at(-1)},`,"literal"===s.kind)for(let e=1;e<i.length;e+=1)i[e]=`${n}${i[e]}`;return i[0]=`${n}${e}: ${i[0]}`,i.join("\n")}),i=" ".repeat(t);return 0===s.length?`{\n${i}}`:`{\n${s.join("\n")}\n${i}}`}const T=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function R(e){return x.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await p.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:T});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 D(n){return x.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const s=t.join(n,"test");for(const i of["__tests__","tests"]){const o=t.join(n,i);try{await e.promises.rename(o,s);const r=await e.promises.readFile(t.join(n,"package.json"),"utf8"),a=r.replaceAll(i,"test");if(r===a)return;await e.promises.writeFile(t.join(n,"package.json"),a)}catch{}}}))})}async function W(e,s){return x.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),o=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),a=await n(()=>r.readdir(i,{withFileTypes:!0}));if(a)for(const e of a){const a=e.name.slice(0,-5),c=e.name.endsWith(".d.ts");let l=c?a:e.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some(e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]);e.isFile()&&c?p?(await r.mkdir(t.join(i,a)),await S.run(()=>r.rename(t.join(i,e.name),t.join(i,a,"index.d.ts")))):o&&(await r.mkdir(o,{recursive:!0}),await S.run(()=>r.rename(t.join(i,e.name),t.join(o,e.name)))):e.isDirectory()&&o&&!p&&(await r.mkdir(o,{recursive:!0}),await S.run(()=>n(()=>r.rename(t.join(i,e.name,"index.d.ts"),t.join(o,`${e.name}.d.ts`)))))}})}function L(e,t){return t}function N(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]=c(e[i],o,n):e.includes(o)||s.push(o);return s}function J(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&J(s);return e}const G={name:"autofix.ci",on:{pull_request:null,push:{branches:["main"]}},permissions:{contents:"read"},concurrency:{group:"autofix-${{ github.head_ref }}","cancel-in-progress":!0},jobs:{autofix:{"runs-on":"ubuntu-latest"}}},U={name:"Fix code automatically",on:{pull_request:null},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{autofix:{uses:"WillBooster/reusable-workflows/.github/workflows/autofix.yml@main"}}},z={test:{name:"Test",on:{pull_request:null,push:{branches:["main","wbfy"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:"write"},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{"id-token":"write",contents:"write"},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},permissions:{contents:"write"},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"gen-pr-claude":{name:"Generate PR with Claude Code",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-claude')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"claude-code","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{CLAUDE_CODE_OAUTH_TOKEN:"${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}"}}}},"gen-pr-codex":{name:"Generate PR with Codex CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-codex')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"codex-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{OPENAI_API_KEY:"${{ secrets.OPENAI_API_KEY }}"}}}},"gen-pr-gemini":{name:"Generate PR with Gemini CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-gemini')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"gemini-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{GEMINI_API_KEY:"${{ secrets.GEMINI_API_KEY }}"}}}}};async function q(n){const s=["add-focused-issue-to-project.yml","add-issue-to-project.yml","add-ready-issue-to-project.yml","notify-ready.yml","wbfy.yml","wbfy-merge.yml"];return x.functionIgnoringException("generateWorkflow",async()=>{if(M(n.repository))return;const i=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(i,{recursive:!0});const o=t.resolve(n.dirPath,".github","semantic.yml");await S.run(()=>e.promises.rm(o,{force:!0,recursive:!0}));const r=await e.promises.readdir(i,{withFileTypes:!0}),a=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml","gen-pr-claude.yml","gen-pr-codex.yml","gen-pr-gemini.yml",...r.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&a.add("release.yml"),a.delete("add-issue-to-project.yml"),a.delete("add-ready-issue-to-project.yml"),a.delete("notify-ready.yml");for(const e of a){const s=t.basename(e,".yml");await S.run(()=>H(n,i,s))}for(const n of s)await S.run(()=>e.promises.rm(t.join(i,n),{force:!0,recursive:!0}))})}function M(e){return e?.endsWith("/reusable-workflows")??!1}async function H(n,s,i){const o=t.join(s,`${i}.yml`),r=e.existsSync(t.join(s,"deploy-production.yml"));if("autofix"===i)return void await K(function(e){if(!e.isPublicRepo)return u(U);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0}},...e.isBun?[{uses:"oven-sh/setup-bun@v1",with:{"bun-version":"latest"}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`});n.push({uses:"autofix-ci/action@v1"});const s=u(G),i=s.jobs.autofix??{"runs-on":"ubuntu-latest"};return s.jobs.autofix={...i,steps:n},s}(n),o);let a=u(i in z?z[i]:{});if(!("jobs"in a))return;try{const t=await e.promises.readFile(o,"utf8"),n=d.load(t);a=c.all([a,n,a],{arrayMerge:N})}catch{}i.startsWith("deploy")&&(a={...a,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(a,"jobs"),a.on?.push&&(a.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...a.on.push["paths-ignore"]??[]])])),"release"===i&&a.jobs.release&&r&&(a.permissions??={},a.permissions.actions="write",a.jobs.release.with??={},a.jobs.release.with.trigger_deploy_workflow="deploy-production.yml");let l=!1;for(const e of Object.values(a.jobs))e.uses?.includes("/reusable-workflows/")&&(Y(n,e,i),l=!0);if(l){switch(i){case"release":if(a.on?.schedule)delete a.on.push;else{if(!(a.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});a.on.push.branches=n.release.branches}n.isPublicRepo?(a.permissions??={},a.permissions["id-token"]="write"):delete a.permissions?.["id-token"];break;case"test":a.on?.pull_request&&delete a.on.pull_request["paths-ignore"],a.on?.push&&(delete a.on.push["paths-ignore"],a.on.push.branches=a.on.push.branches.filter(e=>"renovate/**"!==e))}if(function(e){delete e.jobs["add-to-project"]}(a),await K(a,o),"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}),!a.jobs.sync?.with)return;a.jobs["sync-force"]=a.jobs.sync;const n=a.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;a.jobs.sync.with.sync_params_without_dest=`--force ${n}`,a.name="Force to Sync",a.on={workflow_dispatch:null},delete a.jobs.sync,await K(a,t.join(s,"sync-force.yml"))}}}function Y(e,t,n){if(t.with??={},t.secrets??={},delete t.secrets.NPM_TOKEN,"test"!==n&&"release"!==n&&"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.with["test-command"]=e.isBun?"bun run check-all-for-ai":"yarn check-all-for-ai"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with.sync_params_without_dest;"string"==typeof e&&(t.with.sync_params_without_dest=e.replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses?.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses?.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,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.label,delete e.with.labelOperator,e.with.ci_size&&(e.with.ci_label=e.with.ci_size,delete e.with.ci_size)}(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.doesContainDockerfile&&!t.with.ci_label&&n.startsWith("test")&&(t.with.ci_label="large"),"release"===n||"test"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?J(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=J(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function K(t,n){const s=d.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function V(n){return x.functionIgnoringException("fixTypos",async()=>{if(M(n.repository))return;const s=n.dirPath,i=await p.glob("**/*.md",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const o of i){const i=t.join(s,o);await S.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=X(t);s=Z(s,n,"doc"),t!==s&&await j.generateFile(i,s)})}const o=await p.glob(["{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${o.length} TypeScript files in ${s}`);for(const i of o){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=Q(r);a=Z(a,n,"ts"),r!==a&&await j.generateFile(o,a)}const r=await p.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${r.length} text-based files in ${s}`);for(const i of r){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=X(r);a=Z(a,n,"text"),r!==a&&await j.generateFile(o,a)}await S.promiseAll()})}function X(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function Q(e){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function Z(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}async function ee(e,n){return x.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const s=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),i=await j.readFileIgnoringError(s);for(const[s,o]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const r=te(e,n,o,i),a=t.resolve(e.dirPath,s);await S.run(()=>j.generateFile(a,r))}const o=t.resolve(e.dirPath,".cursor/rules/general.mdc"),r=function(e,t,n){const s="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",i=te(e,t,"Cursor",n);return`${s}\n\n${i}`}(e,n,i);await S.run(()=>j.generateFile(o,r))})}function te(e,t,n,s){const i=e.isBun?"bun":"yarn",o=`\n## Project Information\n\n- Name: ${e.packageJson?.name}\n- Description: ${e.packageJson?.description}\n- Package Manager: ${i}\n\n## Development Workflow\n\n1. If the current branch is \`main\`, create a new branch.\n - Include unexpected changes since they are mine.\n2. Make code changes as needed.\n3. If possible, write e2e tests for your changes.\n4. Run \`${i} check-all-for-ai\` to execute all tests (note: this may take up to 30 minutes), or run \`${i} check-for-ai\` for type checking and linting only.\n - If you are confident your changes will not break any tests, you may use \`check-for-ai\`.\n5. Commit your changes to the current branch and push.\n - Follow conventional commits, i.e., your commit message should start with \`feat:\`, \`fix:\`, \`test:\`, etc.\n - Make sure to add a new line at the end of your commit message${e.isWillBoosterRepo?` with: \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\``:""}.\n - When pre-commit hooks prevent your changes, fix your code, then re-commit and re-push.\n6. Create a pull request using \`gh\`.\n - The pull request title should match your commit message.\n7. Repeat the following steps until all tests pass:\n 1. Wait for CI to run all tests.\n 2. If tests fail, identify the root causes by gathering debug information through logging and screenshots, then fix the code and/or tests.\n 3. Fetch unresolved review comments from the pull request using \`gh\` and address them.\n - e.g., \`gh api graphql -f query='{ repository(owner: "${e.repoAuthor||"WillBooster"}", name: "${e.repoName||"wbfy"}") { pullRequest(number: 24) { reviewThreads(first: 100) { nodes { isResolved comments(first: 100) { nodes { body author { login } path line } } } } } } }' | jq '.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false)'\`\n 4. Commit your changes and push.\n 5. Write \`/gemini review\` in the pull request.\n\n## Coding Style\n\n- Write comments that explain "why" rather than "what". Avoid explanations that can be understood from the code itself.\n- Use stderr for logging debug messages temporarily since stdout output is sometimes omitted.\n- When adding new functions or classes, define them below any functions or classes that call them to maintain clear call order.\n- Prefer \`undefined\` over \`null\` unless explicitly dealing with APIs or libraries that require \`null\`.\n- Always perform existence checks on array due to \`noUncheckedIndexedAccess: true\`.\n${t.some(e=>e.depending.genI18nTs)?'- When introducing new string literals in React components, update the language resource files in the `i18n` directory (e.g., `i18n/ja-JP.json`). Reference these strings using the `i18n` utility. For example, use `i18n.pages.home.title()` for `{ "pages": { "home": { "title": "My App" } } }`.':""}\n${t.some(e=>e.depending.react||e.depending.next)?"- Prefer `useImmer` for storing an array or an object to `useState`.":""}\n${t.some(e=>e.depending.next)?"- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim();return s?o+"\n"+s.trimEnd():o}const ne=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},se=new Map;function ie(e){const t=e??"",n=se.get(t);if(n)return n;const s=new m({auth:re(e)||void 0});return se.set(t,s),s}function oe(e){return!!re(e)}function re(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER:"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB:process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN}let ae=!1;const ce=new Map;function le(e,t,n,s=0){do{const[s,i,o]=de(e,t,n);if(0===f.spawnSync(s,i,o).status)break}while(--s>=0)}function pe(e,t,n){const[s,i,o]=de(e,t,n);o.stdio="pipe";const r=f.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${a}`),r.stdout.toString().trim()}function de(n,s,i){const o={...process.env};o.PATH&&o.BERRY_BIN_FOLDER&&(o.PATH=o.PATH.replace(`${o.BERRY_BIN_FOLDER}:`,""));const r=o.ASDF_DIR??t.join(g.homedir(),".asdf");if(e.existsSync(r)){const e=[t.join(r,"shims"),t.join(r,"bin")],n=o.PATH?.split(":")??[];o.PATH=[...e,...n.filter(t=>!e.includes(t))].join(":"),o.ASDF_DIR||=r;const s=ue(i),a=s?.split(/\r?\n/).some(e=>e.trim().startsWith("nodejs "));a||(o.ASDF_NODEJS_VERSION="lts",ae||(f.spawnSync("asdf",["install","nodejs","lts"],{cwd:i,env:o,encoding:"utf8",shell:!1,stdio:"inherit"}),ae=!0))}return[n,s,{cwd:i,env:o,encoding:"utf8",shell:!1,stdio:"inherit"}]}function ue(n){if(ce.has(n))return ce.get(n);const s=function(n){let s=t.resolve(n);for(;;){const n=t.join(s,".tool-versions");if(e.existsSync(n))return n;const i=t.dirname(s);if(i===s)return;s=i}}(n);if(!s)return void ce.set(n,void 0);const i=e.readFileSync(s,"utf8");return ce.set(n,i),i}function me(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 fe="3.9.19",ge="zulu-11.74.15";async function he(n){return x.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`${ye.has(t??"")?" ":""}${t??""} ${n??""}`}).toSorted().map(e=>e.trim()).filter(e=>!e.startsWith("lefthook")),i=[...new Set(s)];if(n.doesContainPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&be(i,"poetry",n),be(i,"python",fe,!0)}n.depending.firebase&&be(i,"java",ge,!0);if(n.doesContainPackageJson)if(n.isBun){const e=await async function(e,t){try{const n=(await ie().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&&be(i,"bun",e)}else{const e=pe("npm",["show","yarn","version"],n.dirPath);be(i,"yarn",e)}for(const s of we){const i=t.resolve(n.dirPath,`.${s}-version`);e.promises.rm(i,{force:!0})}const o=t.resolve(n.dirPath,".tool-versions");await(i.length>0?S.run(()=>e.promises.writeFile(o,i.join("\n")+"\n")):S.run(()=>e.promises.rm(o,{force:!0}))),await S.promiseAll(),le("asdf",["plugin","update","--all"],n.dirPath),le("asdf",["install"],n.dirPath)}(n)})}const ye=new Set(["java","nodejs","bun","python"]),we=["java","node","python"];function be(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+/);me(n)>me(t??"")&&(e[i]=o)}}async function ve(n){return x.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=c.all([s,n,s],{arrayMerge:L})}catch{}const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}const ke='env = false\ntelemetry = false\n\n[install]\nexact = true\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n "@exercode/problem-utils",\n "@willbooster/babel-configs",\n "@willbooster/biome-config",\n "@willbooster/eslint-config-js",\n "@willbooster/eslint-config-js-react",\n "@willbooster/eslint-config-next",\n "@willbooster/eslint-config-ts",\n "@willbooster/eslint-config-ts-react",\n "@willbooster/prettier-config",\n "@willbooster/shared-lib",\n "@willbooster/wb",\n "next",\n "@next/*",\n "react",\n "react-dom"\n]\n',xe=ke.replace("exact = true","exact = false");async function _e(n){return x.functionIgnoringException("generateBunfigToml",async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)&&e.readFileSync(s,"utf8").includes("exact = false")?xe:ke;await S.run(()=>j.generateFile(s,i))})}const je="# Project-specific settings",Se=/# Project-specific settings[^\n]*\n/gm,Pe="# Generated by wbfy",$e=`${je} (head)\n\n\n${Pe}\n`,Ce=`\n${je} (tail)\n`,Fe={separator:Pe,separatorPrefix:"# Generated by ",defaultHeadUserContent:$e,defaultTailUserContent:Ce,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=Ee(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(Se,"").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(Se,`${je} (head)\n`):$e},getTailUserContent(e){const t=Ee(e);return t>0?e.slice(t-1):Ce},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function Ee(e){const t=e.indexOf(je),n=e.lastIndexOf(je);return n>t?n:-1}async function Be(n){return x.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await j.readFileIgnoringError(s)??"",t=Fe.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+Fe.getTailUserContent(e);await S.run(()=>j.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const Oe={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].toSorted(),codeWith4IndentSize:["go","gradle","java","py"].toSorted(),markdownLike:["md"].toSorted(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].toSorted(),prettier:["cjs","mjs","java","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].toSorted(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].toSorted()},Ie=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${Te(Oe.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${Te(Oe.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${Te(Oe.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function Ae(e){return x.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run(()=>j.generateFile(n,Ie))})}function Te(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function Re(n){return x.functionIgnoringException("generateEslintrc",async()=>{await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintignore"),{force:!0})),await S.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 S.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 S.run(()=>j.generateFile(s,`export { default } from '${n.eslintBase}';`))}})}const De={have_fun:!0,code_review:{disable:!1,comment_severity_threshold:"MEDIUM",max_review_comments:-1,pull_request_opened:{help:!1,summary:!0,code_review:!0}},ignore_patterns:["**/__generated__"]};async function We(n){return x.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"config.yml"),o=t.resolve(s,"styleguide.md");let r=u(De);try{const t=await e.promises.readFile(i,"utf8"),n=d.load(t);r=c.all([r,n,r],{arrayMerge:L})}catch{}const a=d.dump(r,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),l=[S.run(()=>j.generateFile(i,a))];e.existsSync(o)||l.push(S.run(()=>j.generateFile(o,"日本語でレビューしてください。"))),await Promise.all(l)})}async function Le(n){return x.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"settings.json");await e.promises.rm(i,{force:!0})})}const Ne=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...Oe.codeWith2IndentSize,...Oe.codeWith4IndentSize,...Oe.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function Je(e){return x.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run(()=>j.generateFile(n,Ne))})}const Ge=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Ue(e,n){return x.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await j.readFileIgnoringError(s)??"";let o=Fe.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n*/mount/*.hash\n.devcontainer/\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot.*\n.idea/copilot/chatSessions/\n.serena/\n.tmp/\n__generated__/\n@willbooster/\ndist/\ntemp/\ntmp/\n";const r=Fe.getTailUserContent(i),a=[...Ge];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainPoetryLock&&(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+="playwright-report/\ntest-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 Me(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,s=await fetch(n),i=await s.text();if(!s.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await S.run(()=>qe(e,t)),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await Fe.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+"\n"+c+r;await S.run(()=>j.generateFile(s,l))})}const ze=t.join(g.homedir(),".cache","wbfy","gitignore");async function qe(n,s){await e.promises.mkdir(ze,{recursive:!0}),await e.promises.writeFile(t.join(ze,n),s)}async function Me(n){try{const s=await e.promises.stat(t.join(ze,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(ze,n),"utf8")}catch{}}function He(e,t){try{const n=`git@github.com:${e}/${t}.git`,s=pe("git",["ls-remote",n,"HEAD"],process.cwd()).split(/\s+/)[0];if(!s)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(s)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}const Ye={getLintFixSuffix:e=>e.doesContainJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},Ke=["eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-import-x","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],Ve=[...Ke,"typescript-eslint","eslint-import-resolver-typescript"],Xe=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],Qe={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...Ke],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...Ke,...Xe],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...Ve],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...Ve,...Xe],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...Ve,...Xe]};async function Ze(n,s,i){return x.functionIgnoringException("generatePackageJson",async()=>{await async function(n,s,i){const o=t.resolve(n.dirPath,"package.json"),r=await e.promises.readFile(o,"utf8"),a=JSON.parse(r);a.scripts=a.scripts??{},a.dependencies=a.dependencies??{},a.devDependencies=a.devDependencies??{},a.peerDependencies=a.peerDependencies??{};const l=n.isBun?"bun":"yarn";await async function(t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");delete t.scripts["sort-package-json"],delete t.scripts["sort-all-package-json"],delete t.scripts["typecheck/warn"],delete t.scripts["typecheck:gen-code"],delete t.scripts["typecheck:codegen"],delete t.dependencies.tslib,delete t.devDependencies["@willbooster/eslint-config"],delete t.devDependencies["@willbooster/eslint-config-react"],delete t.devDependencies["@willbooster/renovate-config"],delete t.devDependencies["@willbooster/tsconfig"],delete t.devDependencies["eslint-import-resolver-node"],delete t.devDependencies["eslint-plugin-prettier"],delete t.devDependencies.lerna,delete t.devDependencies.pinst,delete t.scripts["flutter-format"],delete t.scripts["format-flutter"],delete t.scripts["python-format"],delete t.scripts["format-python"],delete t.scripts.prettier,delete t.scripts["check-all"],await S.run(()=>e.promises.rm("lerna.json",{force:!0})),delete t.devDependencies["@typescript-eslint/eslint-plugin"],delete t.devDependencies["@typescript-eslint/parser"],delete t.devDependencies["eslint-plugin-import"]}(a);for(const[e,t]of Object.entries(a.scripts))t.includes("git clone")||(a.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));a.scripts=c(a.scripts,et(n,a.scripts)),"check-for-ai"in a.scripts&&("gen-code"in a.scripts&&(a.scripts["check-for-ai"]=`${l} gen-code > /dev/null && ${a.scripts["check-for-ai"]}`),a.scripts["check-for-ai"]=`${l} install > /dev/null && ${a.scripts["check-for-ai"]}`);n.isBun?delete a.scripts.prettify:a.scripts.prettify=(a.scripts.prettify??"")+await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),o=i.indexOf(Fe.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("")} || true`}(n.dirPath);for(const[e,t]of Object.entries(a.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(a.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let d=[],u=["prettier","sort-package-json@3.5.0"];const m=[];e.existsSync(t.join(s.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(a.prettier="@willbooster/prettier-config",u.push("prettier-plugin-java","@willbooster/prettier-config"));n.isBun?delete a.devDependencies["lint-staged"]:u.push("lint-staged");if(n.isRoot){if(n.isBun?(delete a.devDependencies.husky,delete a.devDependencies.pinst,a.scripts.prepare="lefthook install || true",u.push("lefthook")):(u.push("husky"),a.scripts.prepare="husky || true",a.scripts.postinstall="husky || true",(n.isPublicRepo||n.isReferredByOtherRepo)&&(u.push("pinst"),a.scripts.prepack="pinst --disable",a.scripts.postpack="pinst --enable")),n.depending.semanticRelease&&(a.devDependencies["semantic-release"]||a.devDependencies["multi-semantic-release"]||a.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),a.version="0.0.0-semantically-released"),n.depending.playwrightTest){a.dependencies.artillery||a.devDependencies.artillery||a.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete a.dependencies["@playwright/test"]),delete a.dependencies.playwright,delete a.devDependencies.playwright}n.doesContainSubPackageJsons?a.workspaces=Array.isArray(a.workspaces)?c.all([a.workspaces,["packages/*"]],{arrayMerge:N}):["packages/*"]:Array.isArray(a.workspaces)&&(a.workspaces=a.workspaces.filter(e=>p.globSync(e,{dot:!0,cwd:n.dirPath,ignore:T}).length>0),0===a.workspaces.length&&delete a.workspaces)}if(n.depending.wb||n.isBun){a.dependencies["@willbooster/wb"]?d.push("@willbooster/wb"):u.push("@willbooster/wb");for(const[e,t]of Object.entries(a.scripts))a.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(n.isBun?(u.push("@biomejs/biome","@willbooster/biome-config"),delete a.devDependencies.eslint,delete a.devDependencies.micromatch,delete a.devDependencies["typescript-eslint"]):u.push("eslint","micromatch"));(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(u.push("typescript"),n.isBun&&u.push("@types/bun"));n.eslintBase&&u.push(...Qe[n.eslintBase]);n.isWillBoosterConfigs&&(d=d.filter(e=>!e.includes("@willbooster/")),u=u.filter(e=>!e.includes("@willbooster/")));a.name||(a.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(a.private=!0);a.license||(a.license="UNLICENSED");!a.private&&"UNLICENSED"!==a.license&&s.isPublicRepo&&(a.publishConfig??={},a.publishConfig.access??="public");const[f]=ne.getOrgAndName(n.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(a.author="WillBooster Inc.");n.isRoot||!a.private||a.main||(a.main="./src");if(delete a.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)a.scripts["lint-fix"]=(a.scripts["lint-fix"]??"")+Ye.getLintFixSuffix(n);else{delete a.scripts.lint,delete a.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=a.scripts[e];t&&(a.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){a.scripts.lint="flutter analyze",a.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter(s=>e.existsSync(t.resolve(n.dirPath,s)));s.length>0&&(a.scripts["format-code"]=`dart format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,a.scripts.format=(a.scripts.format??"")+" && yarn format-code")}if(n.doesContainPoetryLock){"poetry install"===a.scripts.postinstall&&delete a.scripts.postinstall;const e=await p.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:T}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);e&&s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");a.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,a.scripts.lint?a.scripts.lint=`poetry run flake8 ${e} && ${a.scripts.lint}`:(a.scripts.lint=`poetry run flake8 ${e}`,a.scripts["lint-fix"]="yarn lint"),a.scripts.format=(a.scripts.format??"")+" && yarn format-code",m.push("black","isort","flake8")}}n.repository&&(a.repository=n.repository)}n.depending.blitz?a.scripts["gen-code"]?.startsWith("blitz codegen")?a.scripts["gen-code"].includes("blitz prisma generate")||(a.scripts["gen-code"]=a.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):a.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!a.scripts["gen-code"]?.startsWith("prisma generate")&&(a.scripts["gen-code"]="prisma generate");a.dependencies.prettier||delete a.devDependencies["@types/prettier"];0===Object.keys(a.dependencies).length&&delete a.dependencies;0===Object.keys(a.devDependencies).length&&delete a.devDependencies;0===Object.keys(a.peerDependencies).length&&delete a.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")&&!tt(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await He("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!tt(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await He("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!tt(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await He("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#${t}`}if(t.has("@willbooster/judge")&&!tt(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await He("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!tt(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await He("WillBoosterLab","llm-proxy");e.dependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(a),n.isBun&&delete a.packageManager;let g=JSON.stringify(a);g=await async function(n,s,i){const o=[];for(const[e]of Object.keys(n))e&&!e.startsWith(":")&&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 p.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:T});for(const n of r)await S.run(async()=>{const s=t.join(i.dirPath,n),r=await e.promises.readFile(s,"utf8");let a=r;for(const[e,t]of o)a=a.replaceAll(e,t);a!==r&&await e.promises.writeFile(s,a)});return await S.promiseAll(),s}(a.scripts,g,n),await e.promises.writeFile(o,g),i||(d=d.filter(e=>!a.devDependencies?.[e]),d.length>0&&(n.isBun?(le(l,["remove",...new Set(d)],n.dirPath),le(l,["add","--exact",...new Set(d)],n.dirPath)):le(l,["add",...new Set(d)],n.dirPath)),u=u.filter(e=>!a.dependencies?.[e]),u.length>0&&(n.isBun?(le(l,["remove",...new Set(u)],n.dirPath),le(l,["add","-D","--exact",...new Set(u)],n.dirPath)):le(l,["add","-D",...new Set(u)],n.dirPath)),m.length>0&&le("poetry",["add","--group","dev",...new Set(m)],n.dirPath))}(n,s,i)})}function et(e,t){if(e.isBun){const t=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,n={"check-all-for-ai":"bun run check-for-ai && bun run test --silent","check-for-ai":"bun run cleanup"+(t?" && bun run typecheck":""),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 t||delete n.typecheck,n}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,s=t.test;let i={"check-all-for-ai":"yarn check-for-ai && yarn test","check-for-ai":`yarn format > /dev/null 2> /dev/null || true${n?" && yarn typecheck":""} && yarn lint-fix --quiet`,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 "**/{.*/,}*.{${Oe.prettier.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};return e.doesContainSubPackageJsons?i=c({...i},{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 "**/{.*/,}*.{${Oe.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.depending.pyright&&(i.typecheck=i.typecheck?`${i.typecheck} && `:"",i.typecheck+="pyright"),s?.includes("wb test")&&(i.test=s,i["check-all-for-ai"]=(i["check-all-for-ai"]??"")+" --silent"),n?e.depending.wb&&(i.typecheck="wb typecheck"):delete i.typecheck,i}}function tt(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const nt={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 st(n){return x.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 e.promises.writeFile(s,JSON.stringify(o,void 0,2)),n.isBun)return await e.promises.rm(r,{force:!0,recursive:!0}),void le("git",["config","--unset","core.hooksPath"],n.dirPath);le("yarn",["dlx","husky","init"],n.dirPath);const a=t.resolve(r,"pre-commit");await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})),await S.run(()=>e.promises.writeFile(a,nt.preCommit+"\n"));const{typecheck:c}=et(n,{});if(c){let s=n.repository?.startsWith("github:WillBoosterLab/")?n.repository.toLocaleLowerCase().includes("exercode")?nt.prePushForLab:nt.prePushForLabExceptAdmin:nt.prePush;s=s.replace("yarn typecheck",c.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await S.run(()=>e.promises.writeFile(t.resolve(r,"pre-push"),s+"\n",{mode:493}))}const l=`${nt.postMerge}\n\n${it(n).join("\n")}\n`;await S.run(()=>e.promises.writeFile(t.resolve(r,"post-merge"),l,{mode:493}))}(n)})}function it(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(String.raw`run_if_changed "package\.json" "${n}${s}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`),t}function ot(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 rt=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${Oe.prettier.map(e=>ot("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,at=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${Oe.prettier.map(e=>ot("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-parse-errors","Biome",e)).join("")}\n </component>\n</project>\n`;async function ct(n){return x.functionIgnoringException("generateIdeaSettings",async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages||n.doesContainPackageJson&&!n.doesContainPubspecYaml&&!n.doesContainGemfile&&!n.doesContainGoMod&&!n.doesContainPomXml?S.run(()=>j.generateFile(i,n.isBun?at:rt)):S.run(()=>e.promises.rm(i,{force:!0})))}})}const lt={"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"}}}},pt={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 dt(n){return x.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook"),{typecheck:i}=et(n,{}),o={...lt};i||delete o["pre-push"];if(await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),d.dump(o,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]),i){const i=n.repository?.startsWith("github:WillBoosterLab/")?pt.prePushForLab:pt.prePush;e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493}))}const r=`${pt.postMerge}\n\n${it(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),r,{mode:493}))}(n)})}const ut={node:["src","test","scripts"].toSorted(),blitz:["src","test","scripts","db","integrations","mailers"].toSorted()};async function mt(n){return x.functionIgnoringException("generateLintstagedrc",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await S.run(()=>e.promises.rm(s,{force:!0}));const i=n.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",o=[];if(n.doesContainJavaScript||n.doesContainTypeScript){const e=`\n '${ft(n)}': [${JSON.stringify(`${i}eslint --fix${Ye.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;o.push(e)}const r=n.isRoot?" && !file.includes('/packages/')":"";o.push(`\n './**/*.{${Oe.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/') && !file.includes('/test/fixtures/')${r});${function(e){return e.doesContainJavaScript||e.doesContainTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${ft(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 \`echo '!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.'\`,\n 'false',\n ];\n }\n }\n return [];\n},`),n.doesContainPubspecYaml&&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 [`dart format ${filteredFiles.join(' ')}`];\n },");n.doesContainPoetryLock&&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.doesContainJavaScript||n.doesContainTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${o.join("")}\n};\n`;await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0})),await S.run(()=>j.generateFile(s,a))}(n)})}function ft(e){const t=function(e){return e.depending.blitz?ut.blitz:ut.node}(e).map(e=>`${e}/**/`);return`{,${t.join(",")}}*.{${Oe.eslint.join(",")}}`}async function gt(e){return x.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await j.readFileIgnoringError(n)??"",i=Fe.getHeadUserContent(s),o=Fe.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await Fe.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await S.run(()=>j.generateFile(n,l))})}const ht={venvPath:".",venv:".venv"};async function yt(n){return x.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=u(ht);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:L})}catch{}const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}async function wt(n){return x.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=bt(i,"[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)"));const 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=`[![${r}](https://github.com/${o}/actions/workflows/${s}/badge.svg)](https://github.com/${o}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=bt(i,a))}await S.run(()=>j.generateFile(s,i))})}function bt(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 vt(n){return x.functionIgnoringException("generateReleaserc",async()=>{const s=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(s))return;const 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]||{};if("@semantic-release/commit-analyzer"===t)o[e]=["@semantic-release/commit-analyzer",c.all([n,{preset:"conventionalcommits"}],{arrayMerge:L})];else if("@semantic-release/github"===t){const{failComment:t,successComment:s,...i}=n;o[e]=["@semantic-release/github",c.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:L})]}}const r=JSON.stringify(i);await S.run(()=>j.generateFile(s,r))})}const kt={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function xt(n){return x.functionIgnoringException("generateRenovateJson",async()=>{let s=u(kt);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=c.all([s,n,s],{arrayMerge:L}),s.extends=s.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(s.packageRules??=[],s.packageRules.some(e=>e.matchPackageNames?.includes("next"))||s.packageRules.push({matchPackageNames:["next"],enabled:!1})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}const _t={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,noUncheckedIndexedAccess:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},jt={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,noUncheckedIndexedAccess:!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"]},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function St(n){return x.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?_t:jt);n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages||delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(s.include=s.include?.filter(e=>!e.startsWith("packages/*/")),s.exclude=s.exclude?.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=c.all([s,o,s],{arrayMerge:N}),s.include=s.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/"))}catch{}J(s),s.include?.sort();const o=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await S.run(()=>j.generateFile(i,o))})}const Pt=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function $t(n){return x.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 Pt)o=c.all([o,Ct(e)]);n.doesContainPoetryLock&&(o=c.all([o,Ct("**/.venv/**")])),n.depending.next&&(o=c.all([o,Ct("**/.next/**")])),"editor.codeActionsOnSave"in o&&delete o["editor.codeActionsOnSave"],"editor.formatOnSave"in o&&delete o["editor.formatOnSave"],J(o);const r=JSON.stringify(o,void 0,2);await S.run(()=>j.generateFile(s,r))}catch{}})}function Ct(e){return{"files.watcherExclude":{[e]:!0}}}async function Ft(n){return x.functionIgnoringException("generateYarnrcYml",async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await S.run(()=>e.promises.rm(s,{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await S.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const i=pe("yarn",["--version"],n.dirPath),o=function(e,t){const n=pe("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);Et(i)<=Et(o)&&i!==o&&le("yarn",["set","version",o],n.dirPath,1);const r=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(r,{recursive:!0});for(const n of await e.promises.readdir(r))n.startsWith("yarn-")&&!n.startsWith(`yarn-${o}.`)&&await S.run(()=>e.promises.rm(t.join(r,n)));const a=t.resolve(n.dirPath,".yarnrc");await S.run(()=>e.promises.rm(a,{force:!0}));const c=d.load(await e.promises.readFile(s,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.npmPreapprovedPackages=["@exercode/problem-utils","@willbooster/babel-configs","@willbooster/biome-config","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","@willbooster/prettier-config","@willbooster/shared-lib","@willbooster/wb","next","@next/*","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const s=t.resolve(n.dirPath,".yarnrc","undefined.cjs");await S.run(()=>e.promises.rm(s,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,d.dump(c,{lineWidth:-1})),le("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function Et(e){const[t]=e.split(".");return Number(t)}async function Bt(e){return x.functionIgnoringException("setupLabels",async()=>{const[t,n]=ne.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!oe(t))return;const s=ie(t);try{await Ot(s,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await Ot(s,t,n,"d2: easy :rabbit2:","DDD6FE"),await Ot(s,t,n,"d3: medium :ox:","C4B5FD"),await Ot(s,t,n,"d4: hard :squid:","A78BFA"),await Ot(s,t,n,"d5: x-hard :whale2:","8B5CF6"),await Ot(s,t,n,"p1: critical :fire::fire::fire:","EF4444"),await Ot(s,t,n,"p2: urgent :fire::fire:","F87171"),await Ot(s,t,n,"p3: important :fire:","FCA5A5"),await Ot(s,t,n,"p4: nice to have :droplet:","FECACA"),await Ot(s,t,n,"r: blitz","5300bc"),await Ot(s,t,n,"r: firebase","ffca28"),await Ot(s,t,n,"r: prisma","0c344b"),await Ot(s,t,n,"r: react","61dafb"),await Ot(s,t,n,"r: svelte","ff3e00"),await Ot(s,t,n,"r: semantic-release","494949"),await Ot(s,t,n,"ready :rocket:","22C55E"),await Ot(s,t,n,"review requested :mag:","FBCA04"),await Ot(s,t,n,"released :bookmark:","6366F1"),await Ot(s,t,n,"s: 0.5h :clock1230:","F3F4F6"),await Ot(s,t,n,"s: 1h :clock1:","E5E7EB"),await Ot(s,t,n,"s: 2h :clock2:","D1D5DB"),await Ot(s,t,n,"s: 3h :clock3:","9CA3AF"),await Ot(s,t,n,"s: 5h :clock5:","6B7280"),await Ot(s,t,n,"s: 8h :clock8:","4B5563"),await Ot(s,t,n,"s: 13h :clock1:","374151"),await Ot(s,t,n,"t: build :hammer:","BFDBFE"),await Ot(s,t,n,"t: chore :broom:","BFDBFE"),await Ot(s,t,n,"t: ci :construction_worker:","BFDBFE"),await Ot(s,t,n,"t: docs :memo:","BFDBFE"),await Ot(s,t,n,"t: feat :sparkles:","BFDBFE"),await Ot(s,t,n,"t: fix :bug:","BFDBFE"),await Ot(s,t,n,"t: perf :zap:","BFDBFE"),await Ot(s,t,n,"t: refactor :recycle:","BFDBFE"),await Ot(s,t,n,"t: style :lipstick:","BFDBFE"),await Ot(s,t,n,"t: test :test_tube:","BFDBFE"),await Ot(s,t,n,"project","24292F"),await Ot(s,t,n,"focused :dart:","22C55E"),await Ot(s,t,n,"gen-pr-all :robot:","00B4D8"),await Ot(s,t,n,"gen-pr-claude :robot:","00B4D8"),await Ot(s,t,n,"gen-pr-codex :robot:","00B4D8"),await Ot(s,t,n,"gen-pr-gemini :robot:","00B4D8"),await It(s,t,n,"bug"),await It(s,t,n,"documentation"),await It(s,t,n,"duplicate"),await It(s,t,n,"enhancement"),await It(s,t,n,"good first issue"),await It(s,t,n,"help wanted"),await It(s,t,n,"invalid"),await It(s,t,n,"question"),await It(s,t,n,"wontfix"),await It(s,t,n,"ready"),await It(s,t,n,"review requested"),await It(s,t,n,"released"),await It(s,t,n,"semantic-release"),await It(s,t,n,"llm-pr :robot:"),await It(s,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function Ot(e,t,n,s,i){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:s,color:i})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s,color:i})}}async function It(e,t,n,s){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s})}catch{}}const At=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function Tt(e){return x.functionIgnoringException("setupSecrets",async()=>{const[t,n]=ne.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;if(!oe(t)||!k.doesUploadEnvVars)return;const s=h.config().parsed??{};if(0===Object.keys(s).length)return;const i=ie(t);try{for(const e of At)try{await i.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const e=await i.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=e.data;await y.ready;for(const[e,a]of Object.entries(s)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const s=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,s),p=y.to_base64(l,y.base64_variants.ORIGINAL);await i.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Rt(e){const[t,n]=ne.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!oe(t))return;const i=ie(t);await s(()=>i.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}))}const Dt={"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 Wt(n){return x.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(Dt)){const o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(w(t,i)>i.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await S.run(()=>j.generateFile(o,i))}})}const Lt=v.object({typos:v.object({all:v.record(v.string(),v.string()).optional(),doc:v.record(v.string(),v.string()).optional(),ts:v.record(v.string(),v.string()).optional(),text:v.record(v.string(),v.string()).optional()}).optional()});async function Nt(n,s){const i=t.resolve(n,"package.json");try{const o=e.existsSync(i);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),s=JSON.parse(await r.readFile(e,"utf8"));d=s?.branches??[],u=s?.plugins?.flat()??[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=b(e),s=(await n.getRemotes(!0)).find(e=>"origin"===e.name),i=s?.refs.fetch??s?.refs.push;if("string"==typeof i){const e=await Gt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await Gt(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g=ue(n)?.trim()??"";for(const[e,s]of[["java","java"],["node","nodejs"],["python","python"]])try{const i=await r.readFile(t.resolve(n,`.${e}-version`),"utf8");g&&(g+="\n"),g+=`${s} ${i.trim()}`}catch{}let h="";try{h=await r.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let w;try{const e=await r.readFile(y,"utf8");w=Lt.parse(JSON.parse(e))}catch{}const v="string"==typeof f?.full_name?f.full_name:void 0;let k,x;if(v){const e=v.split("/");e.length>=2&&(k=e[0],x=e[1])}const _=v?`github:${v}`:void 0,j={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:_,repoAuthor:k,repoName:x,isWillBoosterRepo:Boolean(_?.startsWith("github:WillBooster/")||_?.startsWith("github:WillBoosterLab/")),isBun:s?.isBun||e.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainSubPackageJsons:Jt("packages/**/package.json",n),doesContainDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:Jt("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Jt("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Jt("{app,src,test}/**/*.{t,j}sx",n),doesContainJavaScriptInPackages:Jt("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Jt("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Jt("packages/**/{app,src,test}/**/*.{t,j}sx",n),hasStartTest:!!l.scripts?.["start-test"],depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!c["gen-i18n-ts"],litestream:h.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},versionsText:g,packageJson:l,wbfyJson:w};if(j.isBun||(j.eslintBase=function(e){if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainTypeScript)return e.doesContainJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainJavaScript)return"@willbooster/eslint-config-js"}(j)),j.doesContainGemfile||j.doesContainGoMod||j.doesContainPackageJson||j.doesContainPoetryLock||j.doesContainPomXml||j.doesContainPubspecYaml||j.doesContainTemplateYaml)return j}catch{}}function Jt(e,t){return p.globSync(e,{dot:!0,cwd:t,ignore:T}).length>0}async function Gt(e){const[t,n]=ne.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await ie().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch{}return s}function Ut(e){return e.isWillBoosterConfigs&&!0===e.packageJson?.name?.startsWith("@willbooster/eslint-config-")}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"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;k.isVerbose=n.verbose,k.doesUploadEnvVars=n.env;for(const s of n.paths){const o=t.join(s,"packages"),r=(await i(()=>e.promises.readdir(o,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(o,e.name));await D([s,...r]);const a=await Nt(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=V(a),l=(await Promise.all(r.map(e=>Nt(e,a)))).filter(e=>!!e),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await he(a),await Ft(a),a.isBun&&await _e(a);const d=!M(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([_(a),R(a),c.then(()=>wt(a)),ee(a,p),Be(a),Ae(a),We(a),Le(a),Je(a),Wt(a),ct(a),xt(a),vt(a),...d?[q(a)]:[],Bt(a),Tt(a),Rt(a),a.isBun?st(a).then(()=>dt(a)):st(a),mt(a)]),await S.promiseAll();const u=[];for(const e of p)Ut(e)||((e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(W(e,e.isRoot?p:[e])),e.depending.playwrightTest&&u.push(E(e)),e.depending.next&&u.push(P(e)),await Ue(e,a),await S.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await gt(e),await Ze(e,a,n.skipDeps),u.push(mt(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push($t(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(St(e)),(e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&(a.isBun&&u.push(ve(e)),a.isWillBoosterConfigs||u.push(Re(e))),e.depending.pyright&&u.push(yt(e))));await Promise.all(u),await S.promiseAll();const m=a.isBun?"bun":"yarn";a.isBun?(e.rmSync(t.join(s,"bun.lock"),{force:!0}),le(m,["update"],s)):(e.rmSync(t.join(s,"yarn.lock"),{force:!0}),le(m,["install","--no-immutable"],s)),le(m,["cleanup"],s),a.isBun||le(m,["install","--no-immutable"],s)}}();
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbi50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uQ29uc3RhbnRzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYXNkZi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2Jpb21lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYnVuZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2lnbm9yZUZpbGVVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLnRzIiwiLi4vc3JjL3V0aWxzL2V4dGVuc2lvbnMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9lc2xpbnRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRpZ25vcmUudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9odXNreXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG4gIGRvZXNVcGxvYWRFbnZWYXJzID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhEb2NrZXJmaWxlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeERvY2tlcmZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gY29uZmlnLmRvY2tlcmZpbGU7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQ7XG5cbiAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdEb2NrZXJmaWxlJyksIG5ld0NvbnRlbnQpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIGFzeW5jIHJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLnRyaW0oKTtcbiAgICBpZiAobm9ybWFsaXplZENvbnRlbnQpIHtcbiAgICAgIG5vcm1hbGl6ZWRDb250ZW50ICs9ICdcXG4nO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGVkL1VwZGF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBSZXBsYWNlIHRoZSBKU09OIG9iamVjdCBmcm9tIHRoZSBmaWxlXG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvPVxccyp7KFtcXFNcXHNdKil9Oy8sIChfLCBzZXR0aW5nc1RleHQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ2VzbGludDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ2VzbGludDogeyBpZ25vcmVEdXJpbmdCdWlsZHM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ3R5cGVzY3JpcHQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgPSB7JHtzZXR0aW5nc1RleHR9fTtgO1xuICAgIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxudHlwZSBQYXJzZWRWYWx1ZSA9XG4gIHwgeyBraW5kOiAnYXJyYXknOyB2YWx1ZTogUGFyc2VkVmFsdWVbXSB9XG4gIHwgeyBraW5kOiAnbGl0ZXJhbCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ29iamVjdCc7IHZhbHVlOiBQYXJzZWRPYmplY3QgfTtcbnR5cGUgUGFyc2VkT2JqZWN0ID0gUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+O1xuXG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAodmFsdWU6IFBhcnNlZE9iamVjdCk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZSB9KTtcblxuY29uc3QgZGVmYXVsdENvbmZpZzogUGFyc2VkT2JqZWN0ID0ge1xuICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICB1c2U6IGFzT2JqZWN0KHtcbiAgICBiYXNlVVJMOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgIHRyYWNlOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICBzY3JlZW5zaG90OiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb25seS1vbi1mYWlsdXJlJyA6ICdvbmx5LW9uLWZhaWx1cmUnXCIpLFxuICAgIHZpZGVvOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAncmV0YWluLW9uLWZhaWx1cmUnIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgfSksXG4gIHdlYlNlcnZlcjogYXNPYmplY3Qoe1xuICAgIGNvbW1hbmQ6IGxpdGVyYWwoXCIneWFybiBzdGFydC10ZXN0LXNlcnZlcidcIiksXG4gICAgdXJsOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICB0aW1lb3V0OiBsaXRlcmFsKCczMDBfMDAwJyksXG4gICAgc3Rkb3V0OiBsaXRlcmFsKFwiJ2lnbm9yZSdcIiksXG4gICAgc3RkZXJyOiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgIGdyYWNlZnVsU2h1dGRvd246IGxpdGVyYWwoYHtcbiAgc2lnbmFsOiAnU0lHVEVSTScsXG4gIHRpbWVvdXQ6IDUwMCxcbn1gKSxcbiAgfSksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgcGxheXdyaWdodC5jb25maWcudHNgKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgbWF0Y2ggPSAvZGVmaW5lQ29uZmlnXFxzKlxcKFxccyooXFx7W1xcc1xcU10qP30pXFxzKlxcKTs/Ly5leGVjKG9sZENvbnRlbnQpO1xuICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSBtYXRjaD8uWzFdO1xuICAgIGlmICghb2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VPYmplY3RMaXRlcmFsKG9iamVjdExpdGVyYWwpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZS5hbGw8UGFyc2VkT2JqZWN0PihbZGVmYXVsdENvbmZpZywgcGFyc2VkLCBkZWZhdWx0Q29uZmlnXSk7XG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeU9iamVjdChtZXJnZWQsIDApO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2Uob2JqZWN0TGl0ZXJhbCwgbmV3T2JqZWN0TGl0ZXJhbCk7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsKG9iamVjdExpdGVyYWw6IHN0cmluZyk6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgJ3BsYXl3cmlnaHQtY29uZmlnLnRzJyxcbiAgICBgY29uc3QgY29uZmlnID0gJHtvYmplY3RMaXRlcmFsfTtgLFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgICB0cy5TY3JpcHRLaW5kLlRTXG4gICk7XG4gIGNvbnN0IHN0YXRlbWVudCA9IHNvdXJjZS5zdGF0ZW1lbnRzWzBdO1xuICBpZiAoIXN0YXRlbWVudCB8fCAhdHMuaXNWYXJpYWJsZVN0YXRlbWVudChzdGF0ZW1lbnQpKSByZXR1cm47XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gc3RhdGVtZW50LmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbMF07XG4gIGlmICghZGVjbGFyYXRpb24/LmluaXRpYWxpemVyIHx8ICF0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXRpYWxpemVyKSkgcmV0dXJuO1xuICByZXR1cm4gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihkZWNsYXJhdGlvbi5pbml0aWFsaXplciwgc291cmNlKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogdHMuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoIXRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fCAoIXRzLmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhdHMuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHBhcnNlZFtwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbiwgc291cmNlOiB0cy5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8gYXNPYmplY3QocGFyc2VkT2JqZWN0KSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmICh0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUudmFsdWUsIGxldmVsKTtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG4gIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUudmFsdWUsIGxldmVsKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkodmFsdWVzOiBQYXJzZWRWYWx1ZVtdLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZSh2YWx1ZSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgfSk7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3Qob2JqZWN0OiBQYXJzZWRPYmplY3QsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKHZhbHVlLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gIH0pO1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9EQVRBQkFTRV9VUkw9XCI/KC4rXFwuc3FsaXRlMylcIj9bXFxuJF0vLFxuICAgICAgICAnREFUQUJBU0VfVVJMPVwiJDE/Y29ubmVjdGlvbl9saW1pdD0xXCJcXG4nXG4gICAgICApO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24ocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlRGlyUGF0aHMubWFwKGFzeW5jIChwYWNrYWdlRGlyUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3Rlc3QnKTtcbiAgICAgICAgZm9yIChjb25zdCBvbGRUZXN0RGlyTmFtZSBvZiBbJ19fdGVzdHNfXycsICd0ZXN0cyddKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsIG9sZFRlc3REaXJOYW1lKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4Jyk7XG4gICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlQWxsKG9sZFRlc3REaXJOYW1lLCAndGVzdCcpO1xuICAgICAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBuZXdDb250ZW50KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBlRGVmaW5pdGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuOiBQYWNrYWdlQ29uZmlnW11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cGVEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsaWJUeXBlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0B0eXBlcycpO1xuICAgIGNvbnN0IHNyY1R5cGVEaXJQYXRoID1cbiAgICAgIGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpKTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50ICovXG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVNZXJnZSh0YXJnZXQ6IG9iamVjdFtdLCBzb3VyY2U6IG9iamVjdFtdLCBvcHRpb25zOiBhbnkpOiBvYmplY3RbXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdIGFzIG9iamVjdCwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCBwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ2F1dG9maXguY2knLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICBwdXNoOiB7XG4gICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgfSxcbiAgfSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBjb250ZW50czogJ3JlYWQnLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnYXV0b2ZpeC0ke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ0ZpeCBjb2RlIGF1dG9tYXRpY2FsbHknLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDoge1xuICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hdXRvZml4LnltbEBtYWluJyxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jbGF1ZGUnOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggQ2xhdWRlIENvZGUnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY2xhdWRlJylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2NsYXVkZS1jb2RlJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogJyR7eyBzZWNyZXRzLkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jb2RleCc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDb2RleCBDTEknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY29kZXgnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY29kZXgtY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBPUEVOQUlfQVBJX0tFWTogJyR7eyBzZWNyZXRzLk9QRU5BSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1nZW1pbmknOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggR2VtaW5pIENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1nZW1pbmknKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnZ2VtaW5pLWNsaScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0VNSU5JX0FQSV9LRVk6ICcke3sgc2VjcmV0cy5HRU1JTklfQVBJX0tFWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JyB8ICdhdXRvZml4JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZU5hbWVzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FkZC1mb2N1c2VkLWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAnYWRkLWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAnbm90aWZ5LXJlYWR5LnltbCcsXG4gICAgJ3diZnkueW1sJyxcbiAgICAnd2JmeS1tZXJnZS55bWwnLFxuICBdO1xuXG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSkge1xuICAgICAgLy8gRG9uJ3QgdG91Y2ggcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gYmVjYXVzZSBpdCBob3N0cyB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZW1vdmUgY29uZmlnIG9mIHNlbWFudGljIHB1bGwgcmVxdWVzdFxuICAgIGNvbnN0IHNlbWFudGljWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3NlbWFudGljLnltbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShzZW1hbnRpY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29uc3QgZmlsZU5hbWVTZXQgPSBuZXcgU2V0KFtcbiAgICAgICd0ZXN0LnltbCcsXG4gICAgICAnYXV0b2ZpeC55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgJ2dlbi1wci1jbGF1ZGUueW1sJyxcbiAgICAgICdnZW4tcHItY29kZXgueW1sJyxcbiAgICAgICdnZW4tcHItZ2VtaW5pLnltbCcsXG4gICAgICAuLi5lbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKSxcbiAgICBdKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ3JlbGVhc2UueW1sJyk7XG4gICAgfVxuICAgIGZpbGVOYW1lU2V0LmRlbGV0ZSgnYWRkLWlzc3VlLXRvLXByb2plY3QueW1sJyk7XG4gICAgZmlsZU5hbWVTZXQuZGVsZXRlKCdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdC55bWwnKTtcbiAgICBmaWxlTmFtZVNldC5kZWxldGUoJ25vdGlmeS1yZWFkeS55bWwnKTtcblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlcHJlY2F0ZWRGaWxlTmFtZSBvZiBmaWxlTmFtZXNUb0JlUmVtb3ZlZCkge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBkZXByZWNhdGVkRmlsZU5hbWUpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG4gIGNvbnN0IGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnKSk7XG5cbiAgaWYgKGtpbmQgPT09ICdhdXRvZml4Jykge1xuICAgIGF3YWl0IHdyaXRlWWFtbChnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWcpLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG4gIC8vIFNraXAgYSBicm9rZW4gd29ya2Zsb3dcbiAgaWYgKCEoJ2pvYnMnIGluIG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9ICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnO1xuICB9XG5cbiAgbGV0IGlzUmV1c2FibGVXb3JrZmxvdyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcygnL3JldXNhYmxlLXdvcmtmbG93cy8nKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBObyBkZWZhdWx0XG4gIH1cbiAgbWlncmF0ZVdvcmtmbG93KG5ld1NldHRpbmdzKTtcbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc2VtYW50aWMtcmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBlbHNlIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIGpvYi5zZWNyZXRzID8/PSB7fTtcbiAgLy8gVXNlIHRydXN0ZWQgcHVibGlzaGluZyBpbnN0ZWFkIG9mIE5QTV9UT0tFTlxuICBkZWxldGUgam9iLnNlY3JldHMuTlBNX1RPS0VOO1xuXG4gIGlmIChcbiAgICBraW5kID09PSAndGVzdCcgfHxcbiAgICBraW5kID09PSAncmVsZWFzZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNsYXVkZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJ1xuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgLy8gU2V0IHRlc3QtY29tbWFuZCBmb3IgZ2VuLXByIHdvcmtmbG93cyBiYXNlZCBvbiBwYWNrYWdlIG1hbmFnZXJcbiAgaWYgKGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fCBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fCBraW5kID09PSAnZ2VuLXByLWdlbWluaScpIHtcbiAgICBqb2Iud2l0aFsndGVzdC1jb21tYW5kJ10gPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1biBjaGVjay1hbGwtZm9yLWFpJyA6ICd5YXJuIGNoZWNrLWFsbC1mb3ItYWknO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTikge1xuICAgIGpvYi5zZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgICAgam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gcGFyYW1zLnJlcGxhY2UoJ3N5bmMgJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoLmRvdF9lbnZfcGF0aCA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmRvdF9lbnZfcGF0aDtcbiAgfVxuICAvLyBSZW1vdmUgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzXG4gIG1pZ3JhdGVKb2Ioam9iKTtcblxuICAvLyBEb24ndCB1c2UgYGZseSBkZXBsb3kgLS1qc29uYCBzaW5jZSBpdCBjYXVzZXMgYW4gZXJyb3JcbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgam9iLnNlY3JldHMuRkxZX0FQSV9UT0tFTiAmJiB0eXBlb2Ygam9iLndpdGguZGVwbG95X2NvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgam9iLndpdGguZGVwbG95X2NvbW1hbmQgPSBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZC5yZXBsYWNlKC9cXHMrLS1qc29uLywgJycpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlICYmICFqb2Iud2l0aC5jaV9sYWJlbCAmJiBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSkge1xuICAgIGpvYi53aXRoLmNpX2xhYmVsID0gJ2xhcmdlJztcbiAgfVxuICAvLyBCZWNhdXNlIGdpdGh1Yi5ldmVudC5yZXBvc2l0b3J5LnByaXZhdGUgaXMgYWx3YXlzIHRydWUgaWYgam9iIGlzIHNjaGVkdWxlZFxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoam9iLnNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAvLyBNb3ZlIHNlY3JldHMgcHJvcCBhZnRlciB3aXRoIHByb3BcbiAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoam9iLnNlY3JldHMpO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFdvcmtmbG93IHtcbiAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgcmV0dXJuIGNsb25lRGVlcChwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdyk7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBzdGVwczogU3RlcFtdID0gW1xuICAgIHsgdXNlczogJ2FjdGlvbnMvY2hlY2tvdXRAdjYnIH0sXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9zZXR1cC1ub2RlQHY2Jywgd2l0aDogeyAnY2hlY2stbGF0ZXN0JzogdHJ1ZSB9IH0sXG4gICAgLi4uKGNvbmZpZy5pc0J1biA/IFt7IHVzZXM6ICdvdmVuLXNoL3NldHVwLWJ1bkB2MScsIHdpdGg6IHsgJ2J1bi12ZXJzaW9uJzogJ2xhdGVzdCcgfSB9XSA6IFtdKSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgIH0sXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gY2xlYW51cGAgfSxcbiAgXTtcbiAgaWYgKGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uYnVpbGQpIHtcbiAgICBzdGVwcy5wdXNoKHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGJ1aWxkYCB9KTtcbiAgfVxuICBzdGVwcy5wdXNoKHsgdXNlczogJ2F1dG9maXgtY2kvYWN0aW9uQHYxJyB9KTtcblxuICBjb25zdCBhdXRvZml4V29ya2Zsb3cgPSBjbG9uZURlZXAocHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyk7XG4gIGNvbnN0IGF1dG9maXhKb2IgPSBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID8/IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfTtcbiAgYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA9IHsgLi4uYXV0b2ZpeEpvYiwgc3RlcHMgfTtcbiAgcmV0dXJuIGF1dG9maXhXb3JrZmxvdztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcChuZXdTZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xLCBub0NvbXBhdE1vZGU6IHRydWUsIHN0eWxlczogeyAnISFudWxsJzogJ2VtcHR5JyB9IH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gbWlncmF0ZVdvcmtmbG93KG5ld1NldHRpbmdzOiBXb3JrZmxvdyk6IHZvaWQge1xuICAvLyBUT0RPOiBSZW1vdmUgdGhlbSBhZnRlciAyMDIzLTAzLTMxXG4gIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzWydhZGQtdG8tcHJvamVjdCddO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlSm9iKGpvYjogSm9iKTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgaWYgKCFqb2Iud2l0aCkgcmV0dXJuO1xuICBkZWxldGUgam9iLndpdGgubm9uX3NlbGZfaG9zdGVkO1xuICBkZWxldGUgam9iLndpdGgubm90aWZ5X2Rpc2NvcmQ7XG4gIGRlbGV0ZSBqb2Iud2l0aC5yZXF1aXJlX2ZseTtcbiAgZGVsZXRlIGpvYi53aXRoLnJlcXVpcmVfZ2Nsb3VkO1xuICBkZWxldGUgam9iLndpdGgubGFiZWw7XG4gIGRlbGV0ZSBqb2Iud2l0aC5sYWJlbE9wZXJhdG9yO1xuICAvLyBBZGRlZCAyMDI1LTA4LTA2XG4gIGlmIChqb2Iud2l0aC5jaV9zaXplKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSBqb2Iud2l0aC5jaV9zaXplO1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5jaV9zaXplO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLihbXiRdKS9nLCAnY2YuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLihbXiRdKS9nLCAnZS5nLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oW14kXSkvZywgJ2kuZS4kMScpO1xufVxuXG5mdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopZWdcXC4vZywgJy8vJDFlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWllXFwuL2csICcvLyQxaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXJvb3RDb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiBBR0VOVFNfRVhUUkEubWQgZXhpc3RzIGFuZCByZWFkIGl0cyBjb250ZW50XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiAke3Jvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWV9XG4tIERlc2NyaXB0aW9uOiAke3Jvb3RDb25maWcucGFja2FnZUpzb24/LmRlc2NyaXB0aW9ufVxuLSBQYWNrYWdlIE1hbmFnZXI6ICR7cGFja2FnZU1hbmFnZXJ9XG5cbiMjIERldmVsb3BtZW50IFdvcmtmbG93XG5cbjEuIElmIHRoZSBjdXJyZW50IGJyYW5jaCBpcyBcXGBtYWluXFxgLCBjcmVhdGUgYSBuZXcgYnJhbmNoLlxuICAgLSBJbmNsdWRlIHVuZXhwZWN0ZWQgY2hhbmdlcyBzaW5jZSB0aGV5IGFyZSBtaW5lLlxuMi4gTWFrZSBjb2RlIGNoYW5nZXMgYXMgbmVlZGVkLlxuMy4gSWYgcG9zc2libGUsIHdyaXRlIGUyZSB0ZXN0cyBmb3IgeW91ciBjaGFuZ2VzLlxuNC4gUnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IGNoZWNrLWFsbC1mb3ItYWlcXGAgdG8gZXhlY3V0ZSBhbGwgdGVzdHMgKG5vdGU6IHRoaXMgbWF5IHRha2UgdXAgdG8gMzAgbWludXRlcyksIG9yIHJ1biBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1mb3ItYWlcXGAgZm9yIHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmcgb25seS5cbiAgIC0gSWYgeW91IGFyZSBjb25maWRlbnQgeW91ciBjaGFuZ2VzIHdpbGwgbm90IGJyZWFrIGFueSB0ZXN0cywgeW91IG1heSB1c2UgXFxgY2hlY2stZm9yLWFpXFxgLlxuNS4gQ29tbWl0IHlvdXIgY2hhbmdlcyB0byB0aGUgY3VycmVudCBicmFuY2ggYW5kIHB1c2guXG4gICAtIEZvbGxvdyBjb252ZW50aW9uYWwgY29tbWl0cywgaS5lLiwgeW91ciBjb21taXQgbWVzc2FnZSBzaG91bGQgc3RhcnQgd2l0aCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgXFxgdGVzdDpcXGAsIGV0Yy5cbiAgIC0gTWFrZSBzdXJlIHRvIGFkZCBhIG5ldyBsaW5lIGF0IHRoZSBlbmQgb2YgeW91ciBjb21taXQgbWVzc2FnZSR7cm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwbyA/IGAgd2l0aDogXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGBgIDogJyd9LlxuICAgLSBXaGVuIHByZS1jb21taXQgaG9va3MgcHJldmVudCB5b3VyIGNoYW5nZXMsIGZpeCB5b3VyIGNvZGUsIHRoZW4gcmUtY29tbWl0IGFuZCByZS1wdXNoLlxuNi4gQ3JlYXRlIGEgcHVsbCByZXF1ZXN0IHVzaW5nIFxcYGdoXFxgLlxuICAgLSBUaGUgcHVsbCByZXF1ZXN0IHRpdGxlIHNob3VsZCBtYXRjaCB5b3VyIGNvbW1pdCBtZXNzYWdlLlxuNy4gUmVwZWF0IHRoZSBmb2xsb3dpbmcgc3RlcHMgdW50aWwgYWxsIHRlc3RzIHBhc3M6XG4gICAxLiBXYWl0IGZvciBDSSB0byBydW4gYWxsIHRlc3RzLlxuICAgMi4gSWYgdGVzdHMgZmFpbCwgaWRlbnRpZnkgdGhlIHJvb3QgY2F1c2VzIGJ5IGdhdGhlcmluZyBkZWJ1ZyBpbmZvcm1hdGlvbiB0aHJvdWdoIGxvZ2dpbmcgYW5kIHNjcmVlbnNob3RzLCB0aGVuIGZpeCB0aGUgY29kZSBhbmQvb3IgdGVzdHMuXG4gICAzLiBGZXRjaCB1bnJlc29sdmVkIHJldmlldyBjb21tZW50cyBmcm9tIHRoZSBwdWxsIHJlcXVlc3QgdXNpbmcgXFxgZ2hcXGAgYW5kIGFkZHJlc3MgdGhlbS5cbiAgICAgIC0gZS5nLiwgXFxgZ2ggYXBpIGdyYXBocWwgLWYgcXVlcnk9J3sgcmVwb3NpdG9yeShvd25lcjogXCIke3Jvb3RDb25maWcucmVwb0F1dGhvciB8fCAnV2lsbEJvb3N0ZXInfVwiLCBuYW1lOiBcIiR7cm9vdENvbmZpZy5yZXBvTmFtZSB8fCAnd2JmeSd9XCIpIHsgcHVsbFJlcXVlc3QobnVtYmVyOiAyNCkgeyByZXZpZXdUaHJlYWRzKGZpcnN0OiAxMDApIHsgbm9kZXMgeyBpc1Jlc29sdmVkIGNvbW1lbnRzKGZpcnN0OiAxMDApIHsgbm9kZXMgeyBib2R5IGF1dGhvciB7IGxvZ2luIH0gcGF0aCBsaW5lIH0gfSB9IH0gfSB9IH0nIHwganEgJy5kYXRhLnJlcG9zaXRvcnkucHVsbFJlcXVlc3QucmV2aWV3VGhyZWFkcy5ub2Rlc1tdIHwgc2VsZWN0KC5pc1Jlc29sdmVkID09IGZhbHNlKSdcXGBcbiAgIDQuIENvbW1pdCB5b3VyIGNoYW5nZXMgYW5kIHB1c2guXG4gICA1LiBXcml0ZSBcXGAvZ2VtaW5pIHJldmlld1xcYCBpbiB0aGUgcHVsbCByZXF1ZXN0LlxuXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBXcml0ZSBjb21tZW50cyB0aGF0IGV4cGxhaW4gXCJ3aHlcIiByYXRoZXIgdGhhbiBcIndoYXRcIi4gQXZvaWQgZXhwbGFuYXRpb25zIHRoYXQgY2FuIGJlIHVuZGVyc3Rvb2QgZnJvbSB0aGUgY29kZSBpdHNlbGYuXG4tIFVzZSBzdGRlcnIgZm9yIGxvZ2dpbmcgZGVidWcgbWVzc2FnZXMgdGVtcG9yYXJpbHkgc2luY2Ugc3Rkb3V0IG91dHB1dCBpcyBzb21ldGltZXMgb21pdHRlZC5cbi0gV2hlbiBhZGRpbmcgbmV3IGZ1bmN0aW9ucyBvciBjbGFzc2VzLCBkZWZpbmUgdGhlbSBiZWxvdyBhbnkgZnVuY3Rpb25zIG9yIGNsYXNzZXMgdGhhdCBjYWxsIHRoZW0gdG8gbWFpbnRhaW4gY2xlYXIgY2FsbCBvcmRlci5cbi0gUHJlZmVyIFxcYHVuZGVmaW5lZFxcYCBvdmVyIFxcYG51bGxcXGAgdW5sZXNzIGV4cGxpY2l0bHkgZGVhbGluZyB3aXRoIEFQSXMgb3IgbGlicmFyaWVzIHRoYXQgcmVxdWlyZSBcXGBudWxsXFxgLlxuLSBBbHdheXMgcGVyZm9ybSBleGlzdGVuY2UgY2hlY2tzIG9uIGFycmF5IGR1ZSB0byBcXGBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWVcXGAuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLmdlbkkxOG5UcylcbiAgICA/IGAtIFdoZW4gaW50cm9kdWNpbmcgbmV3IHN0cmluZyBsaXRlcmFscyBpbiBSZWFjdCBjb21wb25lbnRzLCB1cGRhdGUgdGhlIGxhbmd1YWdlIHJlc291cmNlIGZpbGVzIGluIHRoZSBcXGBpMThuXFxgIGRpcmVjdG9yeSAoZS5nLiwgXFxgaTE4bi9qYS1KUC5qc29uXFxgKS4gUmVmZXJlbmNlIHRoZXNlIHN0cmluZ3MgdXNpbmcgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eS4gRm9yIGV4YW1wbGUsIHVzZSBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgLmBcbiAgICA6ICcnXG59XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgLSBQcmVmZXIgXFxgdXNlSW1tZXJcXGAgZm9yIHN0b3JpbmcgYW4gYXJyYXkgb3IgYW4gb2JqZWN0IHRvIFxcYHVzZVN0YXRlXFxgLmBcbiAgICA6ICcnXG59XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgLSBTaW5jZSB0aGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgXFxgdXNlQ2FsbGJhY2tcXGAgb3IgXFxgdXNlTWVtb1xcYCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLmBcbiAgICA6ICcnXG59XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICByZXR1cm4gZXh0cmFDb250ZW50ID8gYmFzZUNvbnRlbnQgKyAnXFxuJyArIGV4dHJhQ29udGVudC50cmltRW5kKCkgOiBiYXNlQ29udGVudDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBgLS0tXFxuZGVzY3JpcHRpb246IEdlbmVyYWwgQ29kaW5nIFJ1bGVzXFxuZ2xvYnM6XFxuYWx3YXlzQXBwbHk6IHRydWVcXG4tLS1gO1xuICBjb25zdCBib2R5ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKGNvbmZpZywgYWxsQ29uZmlncywgJ0N1cnNvcicsIGV4dHJhQ29udGVudCk7XG4gIHJldHVybiBgJHtmcm9udG1hdHRlcn1cXG5cXG4ke2JvZHl9YDtcbn1cbiIsImltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUjtcbiAgfVxuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUI7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU5cbiAgKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLy8gQXZvaWQgcmVwZWF0aW5nIHRoZSBzYW1lIGluc3RhbGwgd2hlbiBtdWx0aXBsZSBjb21tYW5kcyBydW4gaW4gYSByb3cuXG5sZXQgaW5zdGFsbGVkTHRzTm9kZWpzID0gZmFsc2U7XG5jb25zdCB0b29sVmVyc2lvbnNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgaWYgKHJldC5zdGF0dXMgPT09IDApIGJyZWFrO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICBjb25zdCBlcnJvciA9IHByb2Muc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIHJldHVybiBwcm9jLnN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5yZXBsYWNlKGAke2Vudi5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJyk7XG4gIH1cbiAgLy8gRW5zdXJlIGFzZGYgc2hpbXMvYmluIGFyZSBvbiBQQVRIIGV2ZW4gd2hlbiBwYXJlbnQgc2hlbGwgZG9lc24ndCBsb2FkIHRoZW1cbiAgY29uc3QgYXNkZkRpciA9IGVudi5BU0RGX0RJUiA/PyBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmFzZGYnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoYXNkZkRpcikpIHtcbiAgICBjb25zdCBhc2RmUGF0aHMgPSBbcGF0aC5qb2luKGFzZGZEaXIsICdzaGltcycpLCBwYXRoLmpvaW4oYXNkZkRpciwgJ2JpbicpXTtcbiAgICBjb25zdCBjdXJyZW50UGF0aHMgPSBlbnYuUEFUSD8uc3BsaXQoJzonKSA/PyBbXTtcbiAgICBlbnYuUEFUSCA9IFsuLi5hc2RmUGF0aHMsIC4uLmN1cnJlbnRQYXRocy5maWx0ZXIoKHApID0+ICFhc2RmUGF0aHMuaW5jbHVkZXMocCkpXS5qb2luKCc6Jyk7XG4gICAgZW52LkFTREZfRElSIHx8PSBhc2RmRGlyO1xuXG4gICAgY29uc3QgdG9vbFZlcnNpb25zID0gZ2V0VG9vbFZlcnNpb25zQ29udGVudChjd2QpO1xuICAgIGNvbnN0IGhhc05vZGVFbnRyeSA9IHRvb2xWZXJzaW9ucz8uc3BsaXQoL1xccj9cXG4vKS5zb21lKChsaW5lKSA9PiBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCdub2RlanMgJykpO1xuICAgIGlmICghaGFzTm9kZUVudHJ5KSB7XG4gICAgICBlbnYuQVNERl9OT0RFSlNfVkVSU0lPTiA9ICdsdHMnO1xuICAgICAgaWYgKCFpbnN0YWxsZWRMdHNOb2RlanMpIHtcbiAgICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2FzZGYnLCBbJ2luc3RhbGwnLCAnbm9kZWpzJywgJ2x0cyddLCB7XG4gICAgICAgICAgY3dkLFxuICAgICAgICAgIGVudixcbiAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgICB9KTtcbiAgICAgICAgaW5zdGFsbGVkTHRzTm9kZWpzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9vbFZlcnNpb25zQ29udGVudChjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0b29sVmVyc2lvbnNDYWNoZS5oYXMoY3dkKSkgcmV0dXJuIHRvb2xWZXJzaW9uc0NhY2hlLmdldChjd2QpO1xuICBjb25zdCB0b29sVmVyc2lvbnNQYXRoID0gZmluZFRvb2xWZXJzaW9uc1BhdGgoY3dkKTtcbiAgaWYgKCF0b29sVmVyc2lvbnNQYXRoKSB7XG4gICAgdG9vbFZlcnNpb25zQ2FjaGUuc2V0KGN3ZCwgdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModG9vbFZlcnNpb25zUGF0aCwgJ3V0ZjgnKTtcbiAgdG9vbFZlcnNpb25zQ2FjaGUuc2V0KGN3ZCwgY29udGVudCk7XG4gIHJldHVybiBjb250ZW50O1xufVxuXG5mdW5jdGlvbiBmaW5kVG9vbFZlcnNpb25zUGF0aChjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGN3ZCk7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLmpvaW4oY3VycmVudCwgJy50b29sLXZlcnNpb25zJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2FuZGlkYXRlKSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoY3VycmVudCk7XG4gICAgaWYgKHBhcmVudCA9PT0gY3VycmVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdXJyZW50ID0gcGFyZW50O1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gY29udmVydFZlcnNpb25JbnRvTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIGUuZy4gamF2YSBhZG9wdG9wZW5qZGstMTEuMC4xNys4XG4gIGNvbnN0IG51bWJlcnMgPSB2ZXJzaW9uXG4gICAgLnNwbGl0KC9bKy4tXS8pXG4gICAgLm1hcChOdW1iZXIpXG4gICAgLmZpbHRlcigobnVtKSA9PiAhTnVtYmVyLmlzTmFOKG51bSkpO1xuICBsZXQgdmVyc2lvbk51bWJlciA9IDA7XG4gIGxldCBkaXZpc29yID0gMTtcbiAgZm9yIChjb25zdCBudW0gb2YgbnVtYmVycykge1xuICAgIHZlcnNpb25OdW1iZXIgKz0gbnVtICogZGl2aXNvcjtcbiAgICBkaXZpc29yIC89IDEwMDA7XG4gIH1cbiAgcmV0dXJuIHZlcnNpb25OdW1iZXI7XG59XG4iLCJleHBvcnQgY29uc3QgUFlUSE9OX1ZFUlNJT04gPSAnMy45LjE5JztcbmV4cG9ydCBjb25zdCBKQVZBX1ZFUlNJT04gPSAnenVsdS0xMS43NC4xNSc7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGNvbnZlcnRWZXJzaW9uSW50b051bWJlciB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgSkFWQV9WRVJTSU9OLCBQWVRIT05fVkVSU0lPTiB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb25Db25zdGFudHMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUb29sVmVyc2lvbnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUb29sVmVyc2lvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuY29uc3QgQ09SRV9UT09MUyA9IG5ldyBTZXQoWydqYXZhJywgJ25vZGVqcycsICdidW4nLCAncHl0aG9uJ10pO1xuY29uc3QgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTID0gWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ107XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY29uZmlnLnZlcnNpb25zVGV4dCkgcmV0dXJuO1xuXG4gIGNvbnN0IGR1cGxpY2F0YWJsZUxpbmVzID0gY29uZmlnLnZlcnNpb25zVGV4dFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgW25hbWUsIHZlcnNpb25dID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIC8vIFRvIG1vdmUgdGhlIHRvcCBvZiB0aGUgc29ydGVkIGxpc3QsIHdlIG5lZWQgdG8gYWRkIGEgc3BhY2UuXG4gICAgICByZXR1cm4gYCR7Q09SRV9UT09MUy5oYXMobmFtZSA/PyAnJykgPyAnICcgOiAnJ30ke25hbWUgPz8gJyd9ICR7dmVyc2lvbiA/PyAnJ31gO1xuICAgIH0pXG4gICAgLnRvU29ydGVkKClcbiAgICAvLyBSZW1vdmUgYWRkZWQgc3BhY2VzLlxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC8vIFRPRE86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgYWZ0ZXIgbGVmdGhvb2sgaXMgaW5zdGFsbGVkIHZpYSBucG0uXG4gICAgLmZpbHRlcigobGluZSkgPT4gIWxpbmUuc3RhcnRzV2l0aCgnbGVmdGhvb2snKSk7XG4gIGNvbnN0IGxpbmVzID0gWy4uLm5ldyBTZXQoZHVwbGljYXRhYmxlTGluZXMpXTtcblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vcHlwaS5vcmcvcHlwaS9wb2V0cnkvanNvbicpO1xuICAgIGNvbnN0IGpzb24gPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGluZm8/OiB7IHZlcnNpb246IHN0cmluZyB9IH0gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcG9ldHJ5VmVyc2lvbiA9IGpzb24/LmluZm8/LnZlcnNpb247XG4gICAgaWYgKHBvZXRyeVZlcnNpb24pIHtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdwb2V0cnknLCBwb2V0cnlWZXJzaW9uKTtcbiAgICB9XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3B5dGhvbicsIFBZVEhPTl9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdqYXZhJywgSkFWQV9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25zdCBidW5WZXJzaW9uID0gYXdhaXQgZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yignb3Zlbi1zaCcsICdidW4nKTtcbiAgICAgIGlmIChidW5WZXJzaW9uKSB1cGRhdGVWZXJzaW9uKGxpbmVzLCAnYnVuJywgYnVuVmVyc2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsICd5YXJuJywgJ3ZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3lhcm4nLCB2ZXJzaW9uKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMpIHtcbiAgICBjb25zdCB2ZXJzaW9uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApO1xuICAgIHZvaWQgZnMucHJvbWlzZXMucm0odmVyc2lvblBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdCB0b29sVmVyc2lvbnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKTtcbiAgYXdhaXQgKGxpbmVzLmxlbmd0aCA+IDBcbiAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy53cml0ZUZpbGUodG9vbFZlcnNpb25zUGF0aCwgbGluZXMuam9pbignXFxuJykgKyAnXFxuJykpXG4gICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0odG9vbFZlcnNpb25zUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIHNwYXduU3luYygnYXNkZicsIFsncGx1Z2luJywgJ3VwZGF0ZScsICctLWFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gIHNwYXduU3luYygnYXNkZicsIFsnaW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVZlcnNpb24obGluZXM6IHN0cmluZ1tdLCB0b29sTmFtZTogc3RyaW5nLCBuZXdWZXJzaW9uOiBzdHJpbmcsIGhlYWQgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zdCBpbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobCkgPT4gbC5zcGxpdCgvXFxzKy8pWzBdID09PSB0b29sTmFtZSk7XG4gIGNvbnN0IG5ld0xpbmUgPSBgJHt0b29sTmFtZX0gJHtuZXdWZXJzaW9ufWA7XG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICBsaW5lcy5zcGxpY2UoaGVhZCA/IDAgOiBsaW5lcy5sZW5ndGgsIDAsIG5ld0xpbmUpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFssIHZlcnNpb25dID0gKGxpbmVzW2luZGV4XSBhcyBzdHJpbmcpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKGNvbnZlcnRWZXJzaW9uSW50b051bWJlcihuZXdWZXJzaW9uKSA+IGNvbnZlcnRWZXJzaW9uSW50b051bWJlcih2ZXJzaW9uID8/ICcnKSkge1xuICAgICAgbGluZXNbaW5kZXhdID0gbmV3TGluZTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yihvcmdhbml6YXRpb246IHN0cmluZywgcmVwb3NpdG9yeTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBGZXRjaCB0aGUgbGF0ZXN0IHJlbGVhc2UgZnJvbSB0aGUgcmVwb3NpdG9yeSAobm8gcmVxdWlyZWQgcGVybWlzc2lvbnMpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KCkucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9sYXRlc3QnLCB7XG4gICAgICBvd25lcjogb3JnYW5pemF0aW9uLFxuICAgICAgcmVwbzogcmVwb3NpdG9yeSxcbiAgICB9KTtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVzcG9uc2UuZGF0YS50YWdfbmFtZTtcbiAgICBjb25zdCBpbmRleCA9IHZlcnNpb24ubGFzdEluZGV4T2YoJ3YnKTtcbiAgICBjb25zdCB2ZXJzaW9uTnVtYmVyVGV4dCA9IGluZGV4ID09PSAtMSA/IHZlcnNpb24gOiB2ZXJzaW9uLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgLy8gQ2hlY2sgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhIG51bWJlclxuICAgIHJldHVybiAvXlxcZC8udGVzdCh2ZXJzaW9uTnVtYmVyVGV4dCkgPyB2ZXJzaW9uTnVtYmVyVGV4dCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggQnVuIHRhZ3MgZHVlIHRvOicsIGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCaW9tZUpzb25jJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0ge1xuICAgICAgcm9vdDogY29uZmlnLmlzUm9vdCxcbiAgICAgICRzY2hlbWE6ICcuL25vZGVfbW9kdWxlcy9AYmlvbWVqcy9iaW9tZS9jb25maWd1cmF0aW9uX3NjaGVtYS5qc29uJyxcbiAgICAgIGV4dGVuZHM6IFsnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZyddLFxuICAgIH07XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50V2l0aEV4YWN0VHJ1ZSA9IGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuW2luc3RhbGxdXG5leGFjdCA9IHRydWVcbmxpbmtlciA9IFwiaG9pc3RlZFwiXG5taW5pbXVtUmVsZWFzZUFnZSA9IDQzMjAwMCAjIDUgZGF5c1xubWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiAgICBcIkBleGVyY29kZS9wcm9ibGVtLXV0aWxzXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlnc1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZ1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanNcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0XCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0XCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10c1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3RcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWdcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9zaGFyZWQtbGliXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvd2JcIixcbiAgICBcIm5leHRcIixcbiAgICBcIkBuZXh0LypcIixcbiAgICBcInJlYWN0XCIsXG4gICAgXCJyZWFjdC1kb21cIlxuXVxuYDtcblxuY29uc3QgbmV3Q29udGVudFdpdGhFeGFjdEZhbHNlID0gbmV3Q29udGVudFdpdGhFeGFjdFRydWUucmVwbGFjZSgnZXhhY3QgPSB0cnVlJywgJ2V4YWN0ID0gZmFsc2UnKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGNvbnRlbnQgPVxuICAgICAgZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgJiYgZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpLmluY2x1ZGVzKCdleGFjdCA9IGZhbHNlJylcbiAgICAgICAgPyBuZXdDb250ZW50V2l0aEV4YWN0RmFsc2VcbiAgICAgICAgOiBuZXdDb250ZW50V2l0aEV4YWN0VHJ1ZTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZeOBp+OBr25vZGVfbW9kdWxlc+OCkkNPUFnjgZnjgovlv4XopoHjgYzjgYLjgovjgZ/jgoHjgIFub2RlX21vZHVsZXPjgpLpmaTlpJbjgZfjgabjga/jgYTjgZHjgarjgYTjgIJcbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4qKi8uaWRlYVxuKiovKi5zcWxpdGUzKlxuKiovLnlhcm4vaW5zdGFsbC1zdGF0ZS5nelxuKiovLnZlbnZcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURvY2tlcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZURvY2tlcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kb2NrZXJpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBlc2xpbnQ6IFsnY2pzJywgJ21qcycsICdqcycsICdjdHMnLCAnbXRzJywgJ3RzJywgJ3RzeCcsICdqc3gnXS50b1NvcnRlZCgpLFxuICBwcmV0dGllcjogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqYXZhJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3NzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ21kJyxcbiAgICAnc2NzcycsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIC8vIGNmLiBodHRwczovL2Jpb21lanMuZGV2L2ludGVybmFscy9sYW5ndWFnZS1zdXBwb3J0L1xuICBiaW9tZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAndnVlJyxcbiAgICAnc3ZlbHRlJyxcbiAgICAnYXN0cm8nLFxuICAgICdjc3MnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnZ3FsJyxcbiAgXS50b1NvcnRlZCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50cmMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgZmlsZXNcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRpZ25vcmUnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5lc2xpbnRCYXNlKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKCFvbGRDb250ZW50LmluY2x1ZGVzKCdleHBvcnQgeyBkZWZhdWx0IH0nKSkgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJyR7Y29uZmlnLmVzbGludEJhc2V9JztgKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBjbG9uZURlZXAoZGVmYXVsdENvbmZpZyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjb25maWdGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSBwYXJzZWRcbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChuZXdDb25maWcsIHtcbiAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3R5bGVndWlkZUNvbnRlbnQgPSAn5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCJztcblxuICAgIGNvbnN0IHByb21pc2VzID0gW3Byb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGNvbmZpZ0ZpbGVQYXRoLCB5YW1sQ29udGVudCkpXTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc3R5bGVndWlkZUZpbGVQYXRoKSkge1xuICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VtaW5pU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4hLmtlZXBcbi5haWRlcipcbi5lbnYucHJvZHVjdGlvblxuKi9tb3VudC8qLmhhc2hcbi5kZXZjb250YWluZXIvXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90Lipcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLnNlcmVuYS9cbi50bXAvXG5fX2dlbmVyYXRlZF9fL1xuQHdpbGxib29zdGVyL1xuZGlzdC9cbnRlbXAvXG50bXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnlcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG9VcmwgPSBgZ2l0QGdpdGh1Yi5jb206JHtvcmdhbml6YXRpb259LyR7cmVwb30uZ2l0YDtcbiAgICBjb25zdCBvdXRwdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtcmVtb3RlJywgcmVwb1VybCwgJ0hFQUQnXSwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IG91dHB1dC5zcGxpdCgvXFxzKy8pWzBdO1xuICAgIGlmICghY29tbWl0SGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbW1pdEhhc2gpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBFc2xpbnRVdGlsID0ge1xuICBnZXRMaW50Rml4U3VmZml4KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ID8gJyAtLXJ1bGUgXCJ7IHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwczogMCB9XCInIDogJyc7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgRXNsaW50RXh0ZW5zaW9uQmFzZSwgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgRXNsaW50VXRpbCB9IGZyb20gJy4uL3V0aWxzL2VzbGludFV0aWwuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuY29uc3QganNDb21tb25EZXBzID0gW1xuICAnZXNsaW50JyxcbiAgJ2VzbGludC1jb25maWctZmxhdC1naXRpZ25vcmUnLFxuICAnZXNsaW50LWNvbmZpZy1wcmV0dGllcicsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG4gICdlc2xpbnQtcGx1Z2luLXVudXNlZC1pbXBvcnRzJyxcbiAgJ2dsb2JhbHMnLFxuXTtcblxuY29uc3QgdHNDb21tb25EZXBzID0gWy4uLmpzQ29tbW9uRGVwcywgJ3R5cGVzY3JpcHQtZXNsaW50JywgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItdHlwZXNjcmlwdCddO1xuXG5jb25zdCByZWFjdENvbW1vbkRlcHMgPSBbJ2VzbGludC1wbHVnaW4tcmVhY3QnLCAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcycsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJ107XG5cbmNvbnN0IGVzbGludERlcHM6IFJlY29yZDxFc2xpbnRFeHRlbnNpb25CYXNlLCBzdHJpbmdbXT4gPSB7XG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLCAuLi5qc0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JywgLi4uanNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJywgLi4udHNDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsIC4uLnRzQ29tbW9uRGVwcywgLi4ucmVhY3RDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICdlc2xpbnQtY29uZmlnLW5leHQnLFxuICAgIC4uLnRzQ29tbW9uRGVwcyxcbiAgICAuLi5yZWFjdENvbW1vbkRlcHMsXG4gIF0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzID8/IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG5cbiAgYXdhaXQgcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKGpzb25PYmogYXMgU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+KTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAvLyBGcmVzaCByZXBvIHN0aWxsIHJlcXVpcmVzICd5YXJuIGluc3RhbGwnXG4gICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnZ2l0IGNsb25lJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgveWFyblxccyomJlxccyovLCAnJykucmVwbGFjZSgveWFyblxccyppbnN0YWxsXFxzKiYmXFxzKi8sICcnKTtcbiAgICB9XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPSBtZXJnZShqc29uT2JqLnNjcmlwdHMsIGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmouc2NyaXB0cykpO1xuXG4gIGlmICgnY2hlY2stZm9yLWFpJyBpbiBqc29uT2JqLnNjcmlwdHMpIHtcbiAgICBpZiAoJ2dlbi1jb2RlJyBpbiBqc29uT2JqLnNjcmlwdHMpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ10gPSBgJHtwYWNrYWdlTWFuYWdlcn0gZ2VuLWNvZGUgPiAvZGV2L251bGwgJiYgJHtqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG4gICAgfVxuICAgIGpzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ10gPSBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbCA+IC9kZXYvbnVsbCAmJiAke2pzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5O1xuICB9IGVsc2Uge1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSA9IChqc29uT2JqLnNjcmlwdHMucHJldHRpZnkgPz8gJycpICsgKGF3YWl0IGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoY29uZmlnLmRpclBhdGgpKTtcbiAgfVxuICAvLyBEZWFsIHdpdGggYnJlYWtpbmcgY2hhbmdlcyBpbiB5YXJuIGJlcnJ5IDQuMC4wLXJjLjQ5XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgaWYgKFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tYWxsJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXJlY3Vyc2l2ZScpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1zaW5jZScpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS13b3JrdHJlZScpXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcsICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCcpO1xuICB9XG5cbiAgbGV0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgLy8gVE9ETzogVW5waW4gc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBhZnRlciBodHRwczovL2dpdGh1Yi5jb20va2VpdGhhbXVzL3NvcnQtcGFja2FnZS1qc29uL2lzc3Vlcy8zODggaXMgZml4ZWQuXG4gIGxldCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3ByZXR0aWVyJywgJ3NvcnQtcGFja2FnZS1qc29uQDMuNS4wJ107XG4gIGNvbnN0IHBvZXRyeURldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RDb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpXG4gICkge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIH0gZWxzZSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xpbnQtc3RhZ2VkJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5odXNreTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5waW5zdDtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnbGVmdGhvb2snKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IGh1c2t5XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnaHVza3knKTtcbiAgICAgIC8vICd8fCB0cnVlJyBhdm9pZHMgZXJyb3JzIHdoZW4gaHVza3kgaXMgbm90IGluc3RhbGxlZC5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2h1c2t5IHx8IHRydWUnOyAvLyBmb3Igbm9uLXlhcm4gcGFja2FnZSBtYW5hZ2Vycy5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9ICdodXNreSB8fCB0cnVlJzsgLy8gZm9yIHlhcm4uXG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbyB8fCBjb25maWcuaXNSZWZlcnJlZEJ5T3RoZXJSZXBvKSB7XG4gICAgICAgIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICAgICAgICAvLyBodHRwczovL3R5cGljb2RlLmdpdGh1Yi5pby9odXNreS8jLz9pZD1pbnN0YWxsLTFcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3BpbnN0Jyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYWNrID0gJ3BpbnN0IC0tZGlzYWJsZSc7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5wb3N0cGFjayA9ICdwaW5zdCAtLWVuYWJsZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzLmFydGlsbGVyeSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5hcnRpbGxlcnk7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLlxuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpXG4gICAgICAgID8gbWVyZ2UuYWxsKFtqc29uT2JqLndvcmtzcGFjZXMsIFsncGFja2FnZXMvKiddXSwge1xuICAgICAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogWydwYWNrYWdlcy8qJ107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLndiIHx8IGNvbmZpZy5pc0J1bikge1xuICAgIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10pIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgvd2JcXHMrZGIvLCAnd2IgcHJpc21hJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICApIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQGJpb21lanMvYmlvbWUnLCAnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZycpO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmVzbGludDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5taWNyb21hdGNoO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0eXBlc2NyaXB0LWVzbGludCddO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnZXNsaW50JywgJ21pY3JvbWF0Y2gnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCd0eXBlc2NyaXB0Jyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmVzbGludEJhc2UpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5lc2xpbnREZXBzW2NvbmZpZy5lc2xpbnRCYXNlXSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgfVxuXG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAganNvbk9iai5wcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWpzb25PYmoubGljZW5zZSkge1xuICAgIGpzb25PYmoubGljZW5zZSA9ICdVTkxJQ0VOU0VEJztcbiAgfVxuICBpZiAoIWpzb25PYmoucHJpdmF0ZSAmJiBqc29uT2JqLmxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJyAmJiByb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZyA/Pz0ge307XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLmFjY2VzcyA/Pz0gJ3B1YmxpYyc7XG4gIH1cbiAgY29uc3QgW293bmVyXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJyB8fCBvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGlmICghY29uZmlnLmlzUm9vdCAmJiBqc29uT2JqLnByaXZhdGUgJiYgIWpzb25PYmoubWFpbikge1xuICAgIC8vIE1ha2UgVlNDb2RlIHBvc3NpYmxlIHRvIHJlZmFjdG9yIGNvZGUgYWNyb3NzIHN1YnBhY2thZ2VzLlxuICAgIGpzb25PYmoubWFpbiA9ICcuL3NyYyc7XG4gIH1cblxuICAvLyBCZWNhdXNlIGBcInJlc29sdXRpb25zXCI6IHsgXCJucG0vY2hhbGtcIjogXCJeNC4xLjJcIiB9LGAgY2F1c2VzIFwiSW52YWxpZCBucG0gdG9rZW5cIlxuICBkZWxldGUganNvbk9iai5yZXNvbHV0aW9ucz8uWyducG0vY2hhbGsnXTtcblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5saW50O1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddO1xuICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdE5hbWUgb2YgWydjbGVhbnVwJywgJ2NoZWNrLWZvci1haSddKSB7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0ganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgICAgICAgIGlmICghc2NyaXB0KSBjb250aW51ZTtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV0gPSBzY3JpcHQucmVwbGFjZSgvID8mJiA/eWFybiBsaW50LWZpeCg/OiAtLXF1aWV0KT8vLCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9IChqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPz8gJycpICsgRXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gKGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPz8gJycpICsgYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoL1svXFxcXF0vKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGBwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiBwb2V0cnkgcnVuIGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gKGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPz8gJycpICsgYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgICAgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcucmVwb3NpdG9yeSkge1xuICAgICAganNvbk9iai5yZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXMucHJldHRpZXIpIHtcbiAgICAvLyBCZWNhdXNlIEB0eXBlcy9wcmV0dGllciBibG9ja3MgcHJldHRpZXIgZXhlY3V0aW9uLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzO1xuICB9XG5cbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICBsZXQgbmV3SnNvblRleHQgPSBKU09OLnN0cmluZ2lmeShqc29uT2JqKTtcbiAgbmV3SnNvblRleHQgPSBhd2FpdCBmaXhTY3JpcHROYW1lcyhqc29uT2JqLnNjcmlwdHMsIG5ld0pzb25UZXh0LCBjb25maWcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0pzb25UZXh0KTtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgLy8gV2UgY2Fubm90IGFkZCBkZXBlbmRlbmNpZXMgd2hpY2ggYXJlIGFscmVhZHkgaW5jbHVkZWQgaW4gZGV2RGVwZW5kZW5jaWVzLlxuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydyZW1vdmUnLCAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLS1leGFjdCcsIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGV2RGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRlcGVuZGVuY2llcy5cbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsncmVtb3ZlJywgLi4ubmV3IFNldChkZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy1EJywgJy0tZXhhY3QnLCAuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy1EJywgLi4ubmV3IFNldChkZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9ldHJ5RGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5uZXcgU2V0KHBvZXRyeURldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0aGUgZm9sbG93aW5nIG1pZ3JhdGlvbiBjb2RlIGluIGZ1dHVyZVxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoanNvbk9iai5hdXRob3IgPT09ICdXaWxsQm9vc3RlciBMTEMnKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1hbGwtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjay93YXJuJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpnZW4tY29kZSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Y29kZWdlbiddO1xuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMudHNsaWI7XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1yZWFjdCddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvdHNjb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtaW1wb3J0LXJlc29sdmVyLW5vZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtcGx1Z2luLXByZXR0aWVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5sZXJuYTtcbiAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5waW5zdDtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZmx1dHRlci1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWZsdXR0ZXInXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHl0aG9uLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtcHl0aG9uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZXI7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWFsbCddO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oJ2xlcm5hLmpzb24nLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAvLyBNaWdyYXRlIGZyb20gRVNMaW50IGxlZ2FjeSBjb25maWdzIHRvIGZsYXQgY29uZmlncyxcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbiddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtcGx1Z2luLWltcG9ydCddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2NoZWNrLWFsbC1mb3ItYWknOiAnYnVuIHJ1biBjaGVjay1mb3ItYWkgJiYgYnVuIHJ1biB0ZXN0IC0tc2lsZW50JyxcbiAgICAgICdjaGVjay1mb3ItYWknOiBgYnVuIHJ1biBjbGVhbnVwJHtoYXNUeXBlY2hlY2sgPyAnICYmIGJ1biBydW4gdHlwZWNoZWNrJyA6ICcnfWAsXG4gICAgICBjbGVhbnVwOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIC0tYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biAtLWJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgfTtcbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IG9sZFRlc3QgPSBvbGRTY3JpcHRzLnRlc3Q7XG4gICAgbGV0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY2hlY2stYWxsLWZvci1haSc6ICd5YXJuIGNoZWNrLWZvci1haSAmJiB5YXJuIHRlc3QnLFxuICAgICAgJ2NoZWNrLWZvci1haSc6IGB5YXJuIGZvcm1hdCA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwgfHwgdHJ1ZSR7XG4gICAgICAgIGhhc1R5cGVjaGVjayA/ICcgJiYgeWFybiB0eXBlY2hlY2snIDogJydcbiAgICAgIH0gJiYgeWFybiBsaW50LWZpeCAtLXF1aWV0YCxcbiAgICAgIGNsZWFudXA6ICd5YXJuIGZvcm1hdCAmJiB5YXJuIGxpbnQtZml4JyxcbiAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnlgLFxuICAgICAgbGludDogYGVzbGludCAtLWNvbG9yYCxcbiAgICAgICdsaW50LWZpeCc6ICd5YXJuIGxpbnQgLS1maXgnLFxuICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgLFxuICAgICAgdHlwZWNoZWNrOiAndHNjIC0tbm9FbWl0IC0tUHJldHR5JyxcbiAgICB9O1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIHNjcmlwdHMgPSBtZXJnZShcbiAgICAgICAgeyAuLi5zY3JpcHRzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKFxuICAgICAgICAgICAgJywnXG4gICAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLlxuICAgICAgICAgIC8vIEZPUkNFX0NPTE9SPTMgbWFrZSB3YiBlbmFibGUgY29sb3Igb3V0cHV0LlxuICAgICAgICAgIHRlc3Q6ICdDST0xIEZPUkNFX0NPTE9SPTMgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgICAgLy8gYHdiYCBzdXBwb3J0cyBgLS1zaWxlbnRgIG9wdGlvblxuICAgICAgc2NyaXB0c1snY2hlY2stYWxsLWZvci1haSddID0gKHNjcmlwdHNbJ2NoZWNrLWFsbC1mb3ItYWknXSA/PyAnJykgKyAnIC0tc2lsZW50JztcbiAgICB9XG5cbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSAnd2IgdHlwZWNoZWNrJztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBpbmRleCA9IGV4aXN0aW5nQ29udGVudC5pbmRleE9mKGlnbm9yZUZpbGVVdGlsLnNlcGFyYXRvclByZWZpeCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiAnJztcblxuICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQuc2xpY2UoMCwgaW5kZXgpO1xuICBjb25zdCBsaW5lcyA9IG9yaWdpbmFsQ29udGVudFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBuZXdMaW5lID0gbGluZS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3TGluZS5lbmRzV2l0aCgnLycpID8gbmV3TGluZS5zbGljZSgwLCAtMSkgOiBuZXdMaW5lO1xuICAgIH0pXG4gICAgLmZpbHRlcigobCkgPT4gbCAmJiAhbC5zdGFydHNXaXRoKCcjJykgJiYgIWwuaW5jbHVkZXMoJy8nKSk7XG5cbiAgcmV0dXJuIGAke2xpbmVzLm1hcCgobGluZSkgPT4gYCBcIiEqKi8ke2xpbmV9LyoqXCJgKS5qb2luKCcnKX0gfHwgdHJ1ZWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeFNjcmlwdE5hbWVzKFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuZXdKc29uVGV4dDogc3RyaW5nLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG9sZEFuZE5ld1NjcmlwdE5hbWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5XSBvZiBPYmplY3Qua2V5cyhzY3JpcHRzKSkge1xuICAgIGlmIChrZXkgJiYgIWtleS5zdGFydHNXaXRoKCc6JykgJiYga2V5LmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIG9sZEFuZE5ld1NjcmlwdE5hbWVzLnB1c2goW2tleSwga2V5LnJlcGxhY2VBbGwoJzonLCAnLScpXSk7XG4gICAgfVxuICB9XG4gIGlmIChvbGRBbmROZXdTY3JpcHROYW1lcy5sZW5ndGggPT09IDApIHJldHVybiBuZXdKc29uVGV4dDtcblxuICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBvbGRBbmROZXdTY3JpcHROYW1lcykge1xuICAgIG5ld0pzb25UZXh0ID0gbmV3SnNvblRleHQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgfVxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGZnLmdsb2IoWycqKi8qLnttZCxjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLCAnKiovRG9ja2VyZmlsZSddLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gb2xkQ29udGVudDtcbiAgICAgIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwob2xkTmFtZSwgbmV3TmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAobmV3Q29udGVudCAhPT0gb2xkQ29udGVudCkge1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgcmV0dXJuIG5ld0pzb25UZXh0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLCAuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcyldKTtcbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9hdXRoJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2F1dGgnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2F1dGgnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnYXV0aCcpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2F1dGguZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAZGlzY29yZC1ib3Qvc2hhcmVkJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQGRpc2NvcmQtYm90L3NoYXJlZCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAZGlzY29yZC1ib3Qvc2hhcmVkJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2Rpc2NvcmQtYm90Jyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9kaXNjb3JkLWJvdC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cblxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplciddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdjb2RlLWFuYWx5emVyJyk7XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ10gPVxuICAgICAgYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2NvZGUtYW5hbHl6ZXIuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvanVkZ2UnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvanVkZ2UnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2p1ZGdlJyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9qdWRnZSddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2p1ZGdlLmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2xsbS1wcm94eScpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2xsbS1wcm94eSddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdsbG0tcHJveHknKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2xsbS1wcm94eSddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2xsbS1wcm94eS5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmo6IFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwganNvbk9iai5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwcmVDb21taXQ6ICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL2xpbnQtc3RhZ2VkJyxcbiAgcHJlUHVzaDogYHlhcm4gdHlwZWNoZWNrYCxcbiAgcHJlUHVzaEZvckxhYjogYFxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbnlhcm4gdHlwZWNoZWNrXG5gLnRyaW0oKSxcbiAgcHJlUHVzaEZvckxhYkV4Y2VwdEFkbWluOiBgXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxueWFybiB0eXBlY2hlY2tcbmAudHJpbSgpLFxuICBwb3N0TWVyZ2U6IGBcbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBwYWNrYWdlSnNvbi5zY3JpcHRzID8/PSB7fTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzLnBvc3RwdWJsaXNoO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cy5wcmVwYXJlO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cy5wcmVwdWJsaXNoT25seTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHMucHJlcGFjaztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHMucG9zdHBhY2s7XG5cbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreScpO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKSk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgc3Bhd25TeW5jKCdnaXQnLCBbJ2NvbmZpZycsICctLXVuc2V0JywgJ2NvcmUuaG9va3NQYXRoJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICdodXNreScsICdpbml0J10sIGNvbmZpZy5kaXJQYXRoKTtcblxuICBjb25zdCBwcmVDb21taXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLWNvbW1pdCcpO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHByZUNvbW1pdEZpbGVQYXRoLCBzY3JpcHRzLnByZUNvbW1pdCArICdcXG4nKSk7XG5cbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIHt9KTtcbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGxldCBwcmVQdXNoID0gY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgPyBjb25maWcucmVwb3NpdG9yeS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKCdleGVyY29kZScpXG4gICAgICAgID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiXG4gICAgICAgIDogc2NyaXB0cy5wcmVQdXNoRm9yTGFiRXhjZXB0QWRtaW5cbiAgICAgIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIHByZVB1c2ggPSBwcmVQdXNoLnJlcGxhY2UoXG4gICAgICAneWFybiB0eXBlY2hlY2snLFxuICAgICAgdHlwZWNoZWNrXG4gICAgICAgIC5yZXBsYWNlKCd0c2MgJywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vdHNjICcpXG4gICAgICAgIC5yZXBsYWNlKCd3YiAnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi93YiAnKVxuICAgICAgICAvLyBweXJpZ2h0IGhhcyBubyBhcmd1bWVudHNcbiAgICAgICAgLnJlcGxhY2UoJ3B5cmlnaHQnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi9weXJpZ2h0JylcbiAgICApO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLXB1c2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhd2sgJ3twcmludCBcXCQxfScgLnRvb2wtdmVyc2lvbnMgfCB4YXJncyAtSXt9IGFzZGYgcGx1Z2luIGFkZCB7fVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIHBsdWdpbiB1cGRhdGUgLS1hbGxcImBcbiAgICApO1xuICB9XG4gIC8vIFB5dGhvbuOBjOOBquOBhOOBqOOCpOODs+OCueODiOODvOODq+OBp+OBjeOBquOBhOWHpueQhuezu+OBjOWtmOWcqOOBmeOCi+OBn+OCgeOAgeW8t+WItueahOOBq+acgOWIneOBq+OCpOODs+OCueODiOODvOODq+OBmeOCi+OAglxuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dD8uaW5jbHVkZXMoJ3B5dGhvbiAnKSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgaW5zdGFsbCBweXRob25cImApO1xuICB9XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuXG5jb25zdCBwcmV0dGllckNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdub2RlJywgJ25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZScsICdQcmV0dGllcicsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmNvbnN0IGJpb21lQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ2J1bicsICctLWJ1biBub2RlX21vZHVsZXMvLmJpbi9iaW9tZSBjaGVjayAtLWZpeCAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1za2lwLXBhcnNlLWVycm9ycycsICdCaW9tZScsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbkdvTW9kICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbmZpZy5pc0J1biA/IGJpb21lQ29udGVudCA6IHByZXR0aWVyQ29udGVudCkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyB9IGZyb20gJy4vaHVza3lyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuY29uc3QgbmV3U2V0dGluZ3MgPSB7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdwcmVwYXJlLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgY29tbWFuZHM6IHtcbiAgICAgIGNsZWFudXA6IHtcbiAgICAgICAgZ2xvYjogJyoue2Nqcyxjc3MsY3RzLGh0bSxodG1sLGpzLGpzb24sanNvbjUsanNvbmMsanN4LG1kLG1qcyxtdHMsc2Nzcyx0cyx0c3gsdnVlLHlhbWwseW1sfScsXG4gICAgICAgIHJ1bjogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IHtzdGFnZWRfZmlsZXN9ICYmIGdpdCBhZGQge3N0YWdlZF9maWxlc30nLFxuICAgICAgfSxcbiAgICAgICdjaGVjay1taWdyYXRpb25zJzoge1xuICAgICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICAgIHJ1bjogYFxuaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyB7c3RhZ2VkX2ZpbGVzfTsgdGhlblxuICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlcyAoe3N0YWdlZF9maWxlc30pIGNvbnRhaW4gd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICBleGl0IDFcbmZpXG5gLnRyaW0oKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdjaGVjay5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwcmVQdXNoOiBgYnVuIC0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL3diIHR5cGVjaGVja2AsXG4gIHByZVB1c2hGb3JMYWI6IGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG5idW4gLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vd2IgdHlwZWNoZWNrXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBjb25zdCB7IHR5cGVjaGVjayB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDx0eXBlb2YgbmV3U2V0dGluZ3M+ID0geyAuLi5uZXdTZXR0aW5ncyB9O1xuICBpZiAoIXR5cGVjaGVjaykge1xuICAgIGRlbGV0ZSBzZXR0aW5nc1sncHJlLXB1c2gnXTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAoc2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGlmICh0eXBlY2hlY2spIHtcbiAgICBjb25zdCBwcmVQdXNoID0gY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSA/IHNjcmlwdHMucHJlUHVzaEZvckxhYiA6IHNjcmlwdHMucHJlUHVzaDtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgICBtb2RlOiAwbzc1NSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3Qgc3JjRGlyZWN0b3JpZXMgPSB7XG4gIG5vZGU6IFsnc3JjJywgJ3Rlc3QnLCAnc2NyaXB0cyddLnRvU29ydGVkKCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS50b1NvcnRlZCgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNyY0RpcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ibGl0ejtcbiAgfVxuICByZXR1cm4gc3JjRGlyZWN0b3JpZXMubm9kZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFNyY0RpcnMgfSBmcm9tICcuLi91dGlscy9zcmNEaXJlY3Rvcmllcy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuY2pzJyk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VQcmVmaXggPSBjb25maWcuaXNSb290ID8gJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vJyA6ICdub2RlIC4uLy4uL25vZGVfbW9kdWxlcy8uYmluLyc7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgY29uc3QgZXNsaW50ID0gYFxuICAnJHtnZXRFc2xpbnRLZXkoY29uZmlnKX0nOiBbJHtKU09OLnN0cmluZ2lmeShcbiAgICBgJHtwYWNrYWdlUHJlZml4fWVzbGludCAtLWZpeCR7RXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyl9YFxuICApfSwgJyR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnXSxgO1xuICAgIGxpbmVzLnB1c2goZXNsaW50KTtcbiAgfVxuICBjb25zdCBwYWNrYWdlc0ZpbHRlciA9IGNvbmZpZy5pc1Jvb3QgPyBcIiAmJiAhZmlsZS5pbmNsdWRlcygnL3BhY2thZ2VzLycpXCIgOiAnJztcbiAgbGluZXMucHVzaChgXG4gICcuLyoqLyoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fSc6IGZpbGVzID0+IHtcbiAgICBsZXQgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKSAmJiAhZmlsZS5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykke3BhY2thZ2VzRmlsdGVyfSk7JHtnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWcpfVxuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gW1xcYCR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMuc29tZShmaWxlID0+IGZpbGUuZW5kc1dpdGgoJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnJHtwYWNrYWdlUHJlZml4fXNvcnQtcGFja2FnZS1qc29uJyk7XG4gICAgfVxuICAgIHJldHVybiBjb21tYW5kcztcbiAgfSxcbiAgJy4vKiovbWlncmF0aW9uLnNxbCc6IChmaWxlcykgPT4ge1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpO1xuICAgIGlmIChjb250ZW50LmluY2x1ZGVzKCdXYXJuaW5nczonKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXFxgZWNobyAnISEhIE1pZ3JhdGlvbiBTUUwgZmlsZSAoXFwke3BhdGgucmVsYXRpdmUoJycsIGZpbGUpfSkgY29udGFpbnMgd2FybmluZ3MgISEhIFNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLidcXGAsXG4gICAgICAgICdmYWxzZScsXG4gICAgICBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59LGApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4ve2xpYix0ZXN0LHRlc3RfZHJpdmVyfS8qKi8qLmRhcnQnOiBmaWxlcyA9PiB7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCdnZW5lcmF0ZWQnKSlcbiAgICAgIC5maWx0ZXIoZmlsZSA9PiAhZmlsZS5lbmRzV2l0aCgnLmZyZWV6ZWQuZGFydCcpICYmICFmaWxlLmVuZHNXaXRoKCcuZy5kYXJ0JykpO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBbXFxgZGFydCBmb3JtYXQgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gIH0sYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4vKiovKi5weSc6IFtcbiAgICAncG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMnLFxuICAgICdwb2V0cnkgcnVuIGJsYWNrJyxcbiAgICAncG9ldHJ5IHJ1biBmbGFrZTgnXG4gIF0sYCk7XG4gIH1cblxuICBjb25zdCBuZXdDb250ZW50ID0gYGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG4ke2NvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCA/IFwiY29uc3QgbWljcm9tYXRjaCA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcXG5cIiA6ICcnfVxubW9kdWxlLmV4cG9ydHMgPSB7JHtsaW5lcy5qb2luKCcnKX1cbn07XG5gO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRLZXkoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgZGlycyA9IGdldFNyY0RpcnMoY29uZmlnKS5tYXAoKGRpcikgPT4gYCR7ZGlyfS8qKi9gKTtcbiAgcmV0dXJuIGB7LCR7ZGlycy5qb2luKCcsJyl9fSoueyR7ZXh0ZW5zaW9ucy5lc2xpbnQuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0XG4gICAgPyBgXFxuXG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKSk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IG1pY3JvbWF0Y2gubm90KGZpbHRlcmVkRmlsZXMsICcke2dldEVzbGludEtleShjb25maWcpfScpO1xuICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZXNvbHZlKGZpbGUpKTtgXG4gICAgOiAnJztcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmMoYCR7Y29uZmlnLmRpclBhdGh9Ly5naXRodWIvd29ya2Zsb3dzYCk7XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IChiYWRnZU5hbWVbMF0gfHwgJycpLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBjb25zdCBiYWRnZSA9IGBbIVske2JhZGdlTmFtZX1dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9L2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9KWA7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuZ2l0aHViL3dvcmtmbG93cy8ke2ZpbGVOYW1lfWApKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgYmFkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0QmFkZ2UocmVhZG1lOiBzdHJpbmcsIGJhZGdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDml6LjgatiYWRnZeOBjOOBguOCi+WgtOWQiOOBr+WJiumZpFxuICByZWFkbWUgPSByZWFkbWUucmVwbGFjZShiYWRnZSwgJycpLnJlcGxhY2VBbGwoL1xcblxcblxcbisvZywgJ1xcblxcbicpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVhZG1lLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlYWRtZVtpIC0gMV0gPT09ICdcXG4nICYmIHJlYWRtZVtpXSA9PT0gJ1xcbicpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHJlYWRtZS5zbGljZSgwLCBpICsgMSk7XG4gICAgICBsZXQgYWZ0ZXIgPSByZWFkbWUuc2xpY2UoaSArIDEpO1xuICAgICAgaWYgKCFhZnRlci5zdGFydHNXaXRoKCdbJykgJiYgIWFmdGVyLnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICBhZnRlciA9IGBcXG4ke2FmdGVyfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7YmVmb3JlfSR7YmFkZ2V9XFxuJHthZnRlcn1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7cmVhZG1lfVxcbiR7YmFkZ2V9XFxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIHVua25vd25dKVtdO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW4gPSBBcnJheS5pc0FycmF5KHBsdWdpbnNbaV0pID8gcGx1Z2luc1tpXT8uWzBdIDogcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChBcnJheS5pc0FycmF5KHBsdWdpbnNbaV0pICYmIHBsdWdpbnNbaV0/LlsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICAvLyBSZW1vdmUgZGVwcmVjYXRlZCBzdWNjZXNzQ29tbWVudCBhbmQgZmFpbENvbW1lbnQgcHJvcGVydGllcyBmcm9tIG9sZENvbmZpZ1xuICAgICAgICBjb25zdCB7IGZhaWxDb21tZW50OiBfMSwgc3VjY2Vzc0NvbW1lbnQ6IF8yLCAuLi5jbGVhbk9sZENvbmZpZyB9ID0gb2xkQ29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgY2xlYW5PbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFsnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbjUnXSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSB0eXBlb2YganNvbk9iaiAmIHsgcGFja2FnZVJ1bGVzPzogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXSB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSAnQHdpbGxib29zdGVyJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdXBncmFkZSBOZXh0LmpzIGF1dG9tYXRpY2FsbHlcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzID8/PSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgIW5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5zb21lKChydWxlOiB7IG1hdGNoUGFja2FnZU5hbWVzPzogc3RyaW5nW10gfSkgPT5cbiAgICAgICAgICBydWxlLm1hdGNoUGFja2FnZU5hbWVzPy5pbmNsdWRlcygnbmV4dCcpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMucHVzaCh7IG1hdGNoUGFja2FnZU5hbWVzOiBbJ25leHQnXSwgZW5hYmxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kZXBlbmRhYm90JyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVub3ZhdGVyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCByb290SnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgdGFyZ2V0OiAnRVMyMDIyJywgLy8gYmVjYXVzZSBkZWNvcmF0b3JzIHNob3VsZCBiZSB0cmFuc3BpbGVkIHRvIEVTMjAyMiBvbiBOb2RlLmpzXG4gICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZScsXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgc2tpcExpYkNoZWNrOiB0cnVlLCAvLyBiZWNhdXNlIGxpYnJhcmllcyBtYXkgaGF2ZSBicm9rZW4gdHlwZXNcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIGVyYXNhYmxlU3ludGF4T25seTogdHJ1ZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgICB0eXBlUm9vdHM6IFsnLi9ub2RlX21vZHVsZXMvQHR5cGVzJywgJy4vQHR5cGVzJ10sXG4gIH0sXG4gIGV4Y2x1ZGU6IFsncGFja2FnZXMvKi90ZXN0L2ZpeHR1cmVzJywgJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogW1xuICAgICdwYWNrYWdlcy8qL3NjcmlwdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc3JjLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3Rlc3QvKiovKicsXG4gICAgJ3NjcmlwdHMvKiovKicsXG4gICAgJ3NyYy8qKi8qJyxcbiAgICAndGVzdC8qKi8qJyxcbiAgXSxcbn07XG5cbmNvbnN0IHN1Ykpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIHRhcmdldDogJ0VTMjAyMicsIC8vIGJlY2F1c2UgZGVjb3JhdG9ycyBzaG91bGQgYmUgdHJhbnNwaWxlZCB0byBFUzIwMjIgb24gTm9kZS5qc1xuICAgIG1vZHVsZTogJ0VTTmV4dCcsXG4gICAgbW9kdWxlUmVzb2x1dGlvbjogJ05vZGUnLFxuICAgIGpzeDogJ3JlYWN0LWpzeCcsXG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBlcmFzYWJsZVN5bnRheE9ubHk6IHRydWUsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4uLy4uL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi4vLi4vQHR5cGVzJywgJy4vQHR5cGVzJ10sXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSByZXR1cm47XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgICAgbmV3U2V0dGluZ3MuZXhjbHVkZSA9IG5ld1NldHRpbmdzLmV4Y2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLFxuICAgICAgICBtb2R1bGU6ICdOb2RlTmV4dCcsXG4gICAgICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlTmV4dCcsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICAgIGlmIChvbGRTZXR0aW5ncy5leHRlbmRzID09PSAnLi9ub2RlX21vZHVsZXMvQHdpbGxib29zdGVyL3RzY29uZmlnL3RzY29uZmlnLmpzb24nKSB7XG4gICAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgbW9kaWZ5IFwidGFyZ2V0XCIsIFwibW9kdWxlXCIgYW5kIFwibW9kdWxlUmVzb2x1dGlvblwiLlxuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udGFyZ2V0O1xuICAgICAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZTtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ubW9kdWxlUmVzb2x1dGlvbjtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICB9XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG50eXBlIFNldHRpbmdzID0ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgbnBtTWluaW1hbEFnZUdhdGU/OiBzdHJpbmc7XG4gIG5wbVByZWFwcHJvdmVkUGFja2FnZXM/OiBzdHJpbmdbXTtcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufSAmIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPjtcblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGdldE1ham9yTnVtYmVyKGN1cnJlbnRWZXJzaW9uKSA8PSBnZXRNYWpvck51bWJlcihsYXRlc3RWZXJzaW9uKSAmJiBjdXJyZW50VmVyc2lvbiAhPT0gbGF0ZXN0VmVyc2lvbikge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0geWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzO1xuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgc2V0dGluZ3MubnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuICAgIHNldHRpbmdzLm5wbVByZWFwcHJvdmVkUGFja2FnZXMgPSBbXG4gICAgICAnQGV4ZXJjb2RlL3Byb2JsZW0tdXRpbHMnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9iYWJlbC1jb25maWdzJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsXG4gICAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsXG4gICAgICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gICAgICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInLFxuICAgICAgJ0B3aWxsYm9vc3Rlci93YicsXG4gICAgICAvLyBUbyBkZWFsIHdpdGggQ1ZFIGxpa2UgaHR0cHM6Ly9uZXh0anMub3JnL2Jsb2cvQ1ZFLTIwMjUtNjY0NzhcbiAgICAgICduZXh0JyxcbiAgICAgICdAbmV4dC8qJyxcbiAgICAgICdyZWFjdCcsXG4gICAgICAncmVhY3QtZG9tJyxcbiAgICBdO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb25zSnNvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9ucycsICctLWpzb24nXSwgZGlyUGF0aCk7XG4gIGNvbnN0IHZlcnNpb25zID0gSlNPTi5wYXJzZSh2ZXJzaW9uc0pzb24pIGFzIHN0cmluZ1tdO1xuICByZXR1cm4gdmVyc2lvbnMuYXQoLTEpIGFzIHN0cmluZztcbn1cbmZ1bmN0aW9uIGdldE1ham9yTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IFttYWpvcl0gPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiBOdW1iZXIobWFqb3IpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1hbGwgOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY2xhdWRlIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNvZGV4IDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWdlbWluaSA6cm9ib3Q6JywgJzAwQjREOCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdsbG0tcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdhaS1wciA6cm9ib3Q6Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQteC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAqL1xuXG5pbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgc29kaXVtIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IERFUFJFQ0FURURfU0VDUkVUX05BTUVTID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJywgJ0dIX0JPVF9QQVQnLCAnUFVCTElDX0dIX0JPVF9QQVQnXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKCkucGFyc2VkID8/IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBhd2FpdCBzb2RpdW0ucmVhZHk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNlY3JldF0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQidcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IFNlY3JldCAmIEJhc2U2NCBrZXkgdG8gVWludDhBcnJheS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID0gc29kaXVtLmZyb21fYmFzZTY0KGtleSwgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG4gICAgICAgIGNvbnN0IHJhd1NlYyA9IHNvZGl1bS5mcm9tX3N0cmluZyhzZWNyZXQpO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIHNlY3JldCB1c2luZyBMaWJTb2RpdW1cbiAgICAgICAgY29uc3QgZW5jQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKHJhd1NlYywgcmF3S2V5KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGVuY3J5cHRlZCBVaW50OEFycmF5IHRvIEJhc2U2NFxuICAgICAgICBjb25zdCBlbmNCYXNlNjQgPSBzb2RpdW0udG9fYmFzZTY0KGVuY0J5dGVzLCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcblxuICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgc2VjcmV0X25hbWU6IG5hbWUsXG4gICAgICAgICAgZW5jcnlwdGVkX3ZhbHVlOiBlbmNCYXNlNjQsXG4gICAgICAgICAga2V5X2lkOiBrZXlJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFNlY3JldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgLy8gQWRtaW5pc3RyYXRpb24gcGVybWlzc2lvblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgfSxcbiAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuIyMgU2VsZiBDaGVja1xuXG4tIFsgXSBJJ3ZlIGNvbmZpcm1lZCBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIG9uIHRoaXMgcGFnZS5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gIC0gUFIgdGl0bGUgZG9lc24ndCBoYXZlIFxcYFdJUDpcXGAuXG4gIC0gVGhlIHRlc3QgY29tbWFuZCAoZS5nLiwgXFxgeWFybiB0ZXN0XFxgKSBwYXNzZWQuXG4gIC0gVGhlIGxpbnQgY29tbWFuZCAoZS5nLiwgXFxgeWFybiBsaW50XFxgKSBwYXNzZWQuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgZHVlIHRvIGxvbmcgd29ya2Zsb3dzLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIHRoZSBHaXRIdWIgZGlmZiB2aWV3LlxuLSBbIF0gSSd2ZSB3cml0dGVuIHRoZSBzdGVwcyB0byB0ZXN0IG15IGNoYW5nZXMuXG4tIFsgXSBJJ3ZlIGFkZGVkIHNjcmVlbnNob3RzIChpZiB0aGUgVUkgY2hhbmdlZCkuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlKG9sZENvbnRlbnQsIG5ld0NvbnRlbnQpID4gbmV3Q29udGVudC5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IHNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRUb29sVmVyc2lvbnNDb250ZW50IH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0J1bjogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLy8gZGVwZW5kZW5jeSBpbmZvcm1hdGlvblxuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgLy8gc291cmNlIGNvZGUgZmlsZXNcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGhhc1N0YXJ0VGVzdDogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgZXNsaW50QmFzZT86IEVzbGludEV4dGVuc2lvbkJhc2U7XG4gIHZlcnNpb25zVGV4dD86IHN0cmluZztcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcGx1Z2lucz86IHN0cmluZ1tdW107XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzID8/IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgPz8gW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IHZlcnNpb25zVGV4dCA9IGdldFRvb2xWZXJzaW9uc0NvbnRlbnQoZGlyUGF0aCk/LnRyaW0oKSA/PyAnJztcbiAgICBmb3IgKGNvbnN0IFtwcmVmaXgsIG5hbWVdIG9mIFtcbiAgICAgIFsnamF2YScsICdqYXZhJ10sXG4gICAgICBbJ25vZGUnLCAnbm9kZWpzJ10sXG4gICAgICBbJ3B5dGhvbicsICdweXRob24nXSxcbiAgICBdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBub2RlVmVyc2lvbkNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKHZlcnNpb25zVGV4dCkge1xuICAgICAgICAgIHZlcnNpb25zVGV4dCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB2ZXJzaW9uc1RleHQgKz0gYCR7bmFtZX0gJHtub2RlVmVyc2lvbkNvbnRlbnQudHJpbSgpfWA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0Z1bGxOYW1lID8gYGdpdGh1Yjoke3JlcG9GdWxsTmFtZX1gIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bmZpZy50b21sJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcyhgJHtwYXRoLnNlcH13aWxsYm9vc3Rlci1jb25maWdzYCksXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbkdvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGhhc1N0YXJ0VGVzdDogISFwYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3QnXSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXMuYmxpdHosXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucHJpc21hLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llcy5weXJpZ2h0LFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgdmVyc2lvbnNUZXh0LFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25maWcuZXNsaW50QmFzZSA9IGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWxcbiAgICApIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KS5sZW5ndGggPiAwO1xufVxuXG5leHBvcnQgdHlwZSBFc2xpbnRFeHRlbnNpb25CYXNlID1cbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuXG5mdW5jdGlvbiBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IEVzbGludEV4dGVuc2lvbkJhc2UgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JztcbiAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ID8gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyA6ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoZGlyUGF0aCk7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgY29uc3QgcmVtb3RlVXJsID0gb3JpZ2luPy5yZWZzLmZldGNoID8/IG9yaWdpbj8ucmVmcy5wdXNoO1xuICBpZiAodHlwZW9mIHJlbW90ZVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICBjb25zdCByZXQgPSB7IGZ1bGxfbmFtZTogYCR7b3JnfS8ke25hbWV9YCB9O1xuICB0cnkge1xuICAgIC8vIE1ldGFkYXRhIHBlcm1pc3Npb25cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQoKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihyZXQsIHJlc3BvbnNlLmRhdGEpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBFU0xJTlRfQ09ORklHX1BSRUZJWCA9ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy0nO1xuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiYgY29uZmlnLnBhY2thZ2VKc29uPy5uYW1lPy5zdGFydHNXaXRoKEVTTElOVF9DT05GSUdfUFJFRklYKSA9PT0gdHJ1ZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhEb2NrZXJmaWxlIH0gZnJvbSAnLi9maXhlcnMvZG9ja2VyZmlsZS5qcyc7XG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRvb2xWZXJzaW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hc2RmLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQmlvbWVKc29uYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9iaW9tZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFc2xpbnRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lc2xpbnRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlbW92ZUdlbWluaVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2h1c2t5cmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRzY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3RzY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlWWFybnJjWW1sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3lhcm5yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwU2VjcmV0cyB9IGZyb20gJy4vZ2l0aHViL3NlY3JldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VDb25maWcgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlIH0gZnJvbSAnLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZW52OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzZWNyZXRzIHRvIEdpdEh1YicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZScsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdTa2lwIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCB0b29scyB2aWEgYXNkZiBhdCBmaXJzdFxuICAgIGF3YWl0IGdlbmVyYXRlVG9vbFZlcnNpb25zKHJvb3RDb25maWcpO1xuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeERvY2tlcmZpbGUocm9vdENvbmZpZyksXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICAuLi4oc2hvdWxkUnVuV29ya2Zsb3dzID8gW2dlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIHJvb3RDb25maWcuaXNCdW5cbiAgICAgICAgPyBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLnRoZW4oKCkgPT4gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZykpXG4gICAgICAgIDogZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlKGNvbmZpZykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBhcmd2LnNraXBEZXBzKTtcblxuICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWcpKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24gJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgICAgICkge1xuICAgICAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVFc2xpbnRyYyhjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgZnMucm1TeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ2J1bi5sb2NrJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsndXBkYXRlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnMucm1TeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnLCAnLS1uby1pbW11dGFibGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gICAgLy8gJ3lhcm4gaW5zdGFsbCcgc2hvdWxkIGJlIGFmdGVyIGB5YXJuIGNsZWFudXBgIGJlY2F1c2UgeWFybiBiZXJyeSBnZW5lcmF0ZXMgeWFybi5sb2NrXG4gICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgY29udGVudHMgb2YgZGVwZW5kYW50IHN1Yi1wYWNrYWdlIGluIG1vbm9yZXBvXG4gICAgaWYgKCFyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCcsICctLW5vLWltbXV0YWJsZSddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJvcHRpb25zIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsImVycm9yIiwiRXJyb3IiLCJzdGFjayIsIlN0cmluZyIsImFzeW5jIiwiZml4RG9ja2VyZmlsZSIsImNvbmZpZyIsImRvZXNDb250YWluRG9ja2VyZmlsZSIsIm9sZENvbnRlbnQiLCJkb2NrZXJmaWxlIiwibmV3Q29udGVudCIsImZzIiwid3JpdGVGaWxlIiwicGF0aCIsImpvaW4iLCJkaXJQYXRoIiwiZnNVdGlsIiwicmVhZEZpbGVJZ25vcmluZ0Vycm9yIiwiZmlsZVBhdGgiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwiZ2VuZXJhdGVGaWxlIiwiY29udGVudCIsIm1rZGlyIiwiZGlybmFtZSIsInJlY3Vyc2l2ZSIsIm5vcm1hbGl6ZWRDb250ZW50IiwicmVwbGFjZUFsbCIsInRyaW0iLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZml4TmV4dENvbmZpZ0pzb24iLCJtYXAiLCJleHQiLCJyZXNvbHZlIiwiZmluZCIsInAiLCJleGlzdHNTeW5jIiwicmVwbGFjZSIsIl8iLCJzZXR0aW5nc1RleHQiLCJpbmNsdWRlcyIsInJ1biIsImxpdGVyYWwiLCJ2YWx1ZSIsImtpbmQiLCJhc09iamVjdCIsImRlZmF1bHRDb25maWciLCJmb3JiaWRPbmx5IiwicmV0cmllcyIsInVzZSIsImJhc2VVUkwiLCJ0cmFjZSIsInNjcmVlbnNob3QiLCJ2aWRlbyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwidGltZW91dCIsInN0ZG91dCIsInN0ZGVyciIsImVudiIsImdyYWNlZnVsU2h1dGRvd24iLCJmaXhQbGF5d3JpZ2h0Q29uZmlnIiwibWF0Y2giLCJleGVjIiwib2JqZWN0TGl0ZXJhbCIsInBhcnNlZCIsInNvdXJjZSIsInRzIiwiY3JlYXRlU291cmNlRmlsZSIsIlNjcmlwdFRhcmdldCIsIkxhdGVzdCIsIlNjcmlwdEtpbmQiLCJUUyIsInN0YXRlbWVudCIsInN0YXRlbWVudHMiLCJpc1ZhcmlhYmxlU3RhdGVtZW50IiwiZGVjbGFyYXRpb24iLCJkZWNsYXJhdGlvbkxpc3QiLCJkZWNsYXJhdGlvbnMiLCJpbml0aWFsaXplciIsImlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uIiwicGFyc2VPYmplY3RMaXRlcmFsIiwibmV3T2JqZWN0TGl0ZXJhbCIsInN0cmluZ2lmeU9iamVjdCIsIm1lcmdlIiwiYWxsIiwicHJvcGVydHkiLCJwcm9wZXJ0aWVzIiwiaXNQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc0lkZW50aWZpZXIiLCJpc1N0cmluZ0xpdGVyYWwiLCJwYXJzZUV4cHJlc3Npb24iLCJ1bmRlZmluZWQiLCJnZXRUZXh0IiwiZXhwcmVzc2lvbiIsInBhcnNlZE9iamVjdCIsImlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbiIsImVsZW1lbnRzIiwiZWxlbWVudCIsInNvbWUiLCJzdHJpbmdpZnlWYWx1ZSIsImxldmVsIiwidmFsdWVzIiwibGVuZ3RoIiwiaW5kZW50IiwicmVwZWF0IiwibGluZXMiLCJzdHJpbmdpZmllZCIsInNwbGl0IiwiYXQiLCJpbmRleCIsImNsb3NpbmdJbmRlbnQiLCJzdHJpbmdpZnlBcnJheSIsIm9iamVjdCIsIk9iamVjdCIsImVudHJpZXMiLCJrZXkiLCJnbG9iSWdub3JlIiwiZml4UHJpc21hRW52RmlsZXMiLCJlbnZGaWxlcyIsImZnIiwiZ2xvYiIsImRvdCIsImN3ZCIsImlnbm9yZSIsImVudkZpbGUiLCJlbnZGaWxlUGF0aCIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJQcm9taXNlIiwibmV3VGVzdERpclBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm9sZFRlc3REaXJOYW1lIiwib2xkVGVzdERpclBhdGgiLCJyZW5hbWUiLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMiLCJkaXJlbnRzIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsImRpcmVudCIsImRpck5hbWUiLCJzbGljZSIsImhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiIsImVuZHNXaXRoIiwicGFja2FnZU5hbWUiLCJoYXNMaWJyYXJ5IiwicGFja2FnZUpzb24iLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJpc0ZpbGUiLCJpc0RpcmVjdG9yeSIsIm92ZXJ3cml0ZU1lcmdlIiwiZGVzdGluYXRpb25BcnJheSIsInNvdXJjZUFycmF5IiwiY29tYmluZU1lcmdlIiwidGFyZ2V0IiwiZGVzdGluYXRpb24iLCJpdGVtIiwiY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQiLCJpc01lcmdlYWJsZU9iamVjdCIsInB1c2giLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsInRvU29ydGVkIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwicHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyIsIm9uIiwicHVsbF9yZXF1ZXN0IiwiYnJhbmNoZXMiLCJwZXJtaXNzaW9ucyIsImNvbnRlbnRzIiwiY29uY3VycmVuY3kiLCJncm91cCIsImpvYnMiLCJhdXRvZml4IiwicHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3ciLCJ1c2VzIiwid29ya2Zsb3dzIiwidGVzdCIsInJlbGVhc2UiLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwiaWYiLCJ3aXRoIiwic2VjcmV0cyIsIkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIiwiT1BFTkFJX0FQSV9LRVkiLCJHRU1JTklfQVBJX0tFWSIsImdlbmVyYXRlV29ya2Zsb3dzIiwicm9vdENvbmZpZyIsImZpbGVOYW1lc1RvQmVSZW1vdmVkIiwiaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8iLCJyZXBvc2l0b3J5Iiwid29ya2Zsb3dzUGF0aCIsInNlbWFudGljWW1sUGF0aCIsInJtIiwiZm9yY2UiLCJmaWxlTmFtZVNldCIsIlNldCIsImZpbHRlciIsImRlcGVuZGluZyIsInNlbWFudGljUmVsZWFzZSIsImFkZCIsImRlbGV0ZSIsImZpbGVOYW1lIiwiYmFzZW5hbWUiLCJ3cml0ZVdvcmtmbG93WWFtbCIsImRlcHJlY2F0ZWRGaWxlTmFtZSIsImRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyIsIndyaXRlWWFtbCIsImlzUHVibGljUmVwbyIsImNsb25lRGVlcCIsInBhY2thZ2VNYW5hZ2VyIiwiaXNCdW4iLCJzdGVwcyIsInNjcmlwdHMiLCJidWlsZCIsImF1dG9maXhXb3JrZmxvdyIsImF1dG9maXhKb2IiLCJnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyIsIm5ld1NldHRpbmdzIiwib2xkU2V0dGluZ3MiLCJ5YW1sIiwibG9hZCIsImFycmF5TWVyZ2UiLCJzdGFydHNXaXRoIiwibW92ZVRvQm90dG9tIiwiYWN0aW9ucyIsInRyaWdnZXJfZGVwbG95X3dvcmtmbG93IiwiaXNSZXVzYWJsZVdvcmtmbG93Iiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJtaWdyYXRlV29ya2Zsb3ciLCJwYXJhbXMiLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJ3b3JrZmxvd19kaXNwYXRjaCIsIk5QTV9UT0tFTiIsIkdIX1RPS0VOIiwiRklSRUJBU0VfVE9LRU4iLCJHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIiwiRElTQ09SRF9XRUJIT09LX1VSTCIsInNlcnZlcl91cmwiLCJkb3RfZW52X3BhdGgiLCJub25fc2VsZl9ob3N0ZWQiLCJub3RpZnlfZGlzY29yZCIsInJlcXVpcmVfZmx5IiwicmVxdWlyZV9nY2xvdWQiLCJsYWJlbCIsImxhYmVsT3BlcmF0b3IiLCJjaV9zaXplIiwiY2lfbGFiZWwiLCJtaWdyYXRlSm9iIiwiRkxZX0FQSV9UT0tFTiIsImRlcGxveV9jb21tYW5kIiwiZ2l0aHViX2hvc3RlZF9ydW5uZXIiLCJrZXlzIiwibmV3U2VjcmV0cyIsInlhbWxUZXh0IiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsImZpeFR5cG9zIiwicGFja2FnZUNvbmZpZyIsImRvY0ZpbGVzIiwibWRGaWxlIiwiZml4VHlwb3NJblRleHQiLCJyZXBsYWNlV2l0aENvbmZpZyIsInRzRmlsZXMiLCJ0c0ZpbGUiLCJmaXhUeXBvc0luQ29kZSIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwid2JmeUpzb24iLCJ0eXBvcyIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMiLCJhbGxDb25maWdzIiwiYWdlbnRzRXh0cmFQYXRoIiwiZXh0cmFDb250ZW50IiwidG9vbE5hbWUiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24iLCJjdXJzb3JSdWxlc1BhdGgiLCJjdXJzb3JSdWxlc0NvbnRlbnQiLCJmcm9udG1hdHRlciIsImJvZHkiLCJnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50IiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImlzV2lsbEJvb3N0ZXJSZXBvIiwicmVwb0F1dGhvciIsInJlcG9OYW1lIiwiYyIsImdlbkkxOG5UcyIsInJlYWN0IiwibmV4dCIsInRyaW1FbmQiLCJnaXRIdWJVdGlsIiwiZ2V0T3JnQW5kTmFtZSIsInVybE9yRnVsbE5hbWUiLCJ1cmxXaXRob3V0UHJvdG9jb2wiLCJuYW1lcyIsIm9jdG9raXRDYWNoZSIsIk1hcCIsImdldE9jdG9raXQiLCJvd25lciIsImNhY2hlZCIsImdldCIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdldEdpdEh1YlRva2VuIiwic2V0IiwiaGFzR2l0SHViVG9rZW4iLCJwcm9jZXNzIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIiLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiIsIkdJVEhVQl9UT0tFTiIsImluc3RhbGxlZEx0c05vZGVqcyIsInRvb2xWZXJzaW9uc0NhY2hlIiwic3Bhd25TeW5jIiwiYXJncyIsInJldHJ5IiwibmV3Q21kIiwibmV3QXJncyIsImdldFNwYXduU3luY0FyZ3MiLCJjaGlsZF9wcm9jZXNzIiwic3RhdHVzIiwic3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0Iiwic3RkaW8iLCJwcm9jIiwidG9TdHJpbmciLCJzIiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJhc2RmRGlyIiwiQVNERl9ESVIiLCJvcyIsImhvbWVkaXIiLCJhc2RmUGF0aHMiLCJjdXJyZW50UGF0aHMiLCJ0b29sVmVyc2lvbnMiLCJnZXRUb29sVmVyc2lvbnNDb250ZW50IiwiaGFzTm9kZUVudHJ5IiwibGluZSIsIkFTREZfTk9ERUpTX1ZFUlNJT04iLCJlbmNvZGluZyIsInNoZWxsIiwiaGFzIiwidG9vbFZlcnNpb25zUGF0aCIsImN1cnJlbnQiLCJjYW5kaWRhdGUiLCJwYXJlbnQiLCJmaW5kVG9vbFZlcnNpb25zUGF0aCIsInJlYWRGaWxlU3luYyIsImNvbnZlcnRWZXJzaW9uSW50b051bWJlciIsInZlcnNpb24iLCJudW1iZXJzIiwiTnVtYmVyIiwibnVtIiwiaXNOYU4iLCJ2ZXJzaW9uTnVtYmVyIiwiZGl2aXNvciIsIlBZVEhPTl9WRVJTSU9OIiwiSkFWQV9WRVJTSU9OIiwiZ2VuZXJhdGVUb29sVmVyc2lvbnMiLCJ2ZXJzaW9uc1RleHQiLCJkdXBsaWNhdGFibGVMaW5lcyIsIkNPUkVfVE9PTFMiLCJkb2VzQ29udGFpblBvZXRyeUxvY2siLCJyZXNwb25zZSIsImZldGNoIiwianNvbiIsInBvZXRyeVZlcnNpb24iLCJ1cGRhdGVWZXJzaW9uIiwiZmlyZWJhc2UiLCJkb2VzQ29udGFpblBhY2thZ2VKc29uIiwiYnVuVmVyc2lvbiIsIm9yZ2FuaXphdGlvbiIsInJlcXVlc3QiLCJyZXBvIiwiZGF0YSIsInRhZ19uYW1lIiwibGFzdEluZGV4T2YiLCJ2ZXJzaW9uTnVtYmVyVGV4dCIsImdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIiLCJwcmVmaXgiLCJERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMiLCJ2ZXJzaW9uUGF0aCIsImNvcmUiLCJuZXdWZXJzaW9uIiwiaGVhZCIsImZpbmRJbmRleCIsImwiLCJuZXdMaW5lIiwic3BsaWNlIiwiZ2VuZXJhdGVCaW9tZUpzb25jIiwicm9vdCIsIiRzY2hlbWEiLCJleHRlbmRzIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwibmV3Q29udGVudFdpdGhFeGFjdFRydWUiLCJuZXdDb250ZW50V2l0aEV4YWN0RmFsc2UiLCJnZW5lcmF0ZUJ1bmZpZ1RvbWwiLCJ1c2VyQ29udGVudEhlYWRlciIsInVzZXJDb250ZW50SGVhZGVyUmVnZXgiLCJzZXBhcmF0b3IiLCJkZWZhdWx0SGVhZFVzZXJDb250ZW50IiwiZGVmYXVsdFRhaWxVc2VyQ29udGVudCIsImlnbm9yZUZpbGVVdGlsIiwic2VwYXJhdG9yUHJlZml4IiwicmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzIiwibGFzdEhlYWRlckluZGV4IiwiZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlciIsImdldEhlYWRVc2VyQ29udGVudCIsImluZGV4T2YiLCJ0aGlzIiwiZ2V0VGFpbFVzZXJDb250ZW50IiwiaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZCIsImxhc3RJbmRleCIsImdlbmVyYXRlRG9ja2VyaWdub3JlIiwiZXh0ZW5zaW9ucyIsImNvZGVXaXRoMkluZGVudFNpemUiLCJjb2RlV2l0aDRJbmRlbnRTaXplIiwibWFya2Rvd25MaWtlIiwiZXNsaW50IiwicHJldHRpZXIiLCJiaW9tZSIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImdlbmVyYXRlRWRpdG9yY29uZmlnIiwiZ2VuZXJhdGVFc2xpbnRyYyIsImVzbGludEJhc2UiLCJoYXZlX2Z1biIsImNvZGVfcmV2aWV3IiwiZGlzYWJsZSIsImNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkIiwibWF4X3Jldmlld19jb21tZW50cyIsInB1bGxfcmVxdWVzdF9vcGVuZWQiLCJoZWxwIiwic3VtbWFyeSIsImlnbm9yZV9wYXR0ZXJucyIsImdlbmVyYXRlR2VtaW5pQ29uZmlnIiwiY29uZmlnRmlsZVBhdGgiLCJzdHlsZWd1aWRlRmlsZVBhdGgiLCJuZXdDb25maWciLCJvbGRDb25maWciLCJ5YW1sQ29udGVudCIsInJlbW92ZUdlbWluaVNldHRpbmdzIiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJoZWFkVXNlckNvbnRlbnQiLCJ0YWlsVXNlckNvbnRlbnQiLCJkb2VzQ29udGFpbkdlbWZpbGUiLCJkb2VzQ29udGFpbkdvTW9kIiwiZG9lc0NvbnRhaW5Qb21YbWwiLCJkb2VzQ29udGFpblB1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwiLCJibGl0eiIsInByaXNtYSIsInBsYXl3cmlnaHRUZXN0IiwicmVhY3ROYXRpdmUiLCJzdG9yeWJvb2siLCJsaXRlc3RyZWFtIiwiZ2VuZXJhdGVkIiwicmVhZENhY2hlIiwicmVzcG9uc2VUZXh0IiwidGV4dCIsIm9rIiwid3JpdGVDYWNoZSIsInN0YXQiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsImdldExhdGVzdENvbW1pdEhhc2giLCJyZXBvVXJsIiwiY29tbWl0SGFzaCIsInJlamVjdCIsIkVzbGludFV0aWwiLCJnZXRMaW50Rml4U3VmZml4IiwiZG9lc0NvbnRhaW5Kc3hPclRzeCIsImpzQ29tbW9uRGVwcyIsInRzQ29tbW9uRGVwcyIsInJlYWN0Q29tbW9uRGVwcyIsImVzbGludERlcHMiLCJnZW5lcmF0ZVBhY2thZ2VKc29uIiwic2tpcEFkZGluZ0RlcHMiLCJqc29uVGV4dCIsImpzb25PYmoiLCJwZWVyRGVwZW5kZW5jaWVzIiwiYXV0aG9yIiwidHNsaWIiLCJsZXJuYSIsInBpbnN0IiwicmVtb3ZlRGVwcmVjYXRlZFN0dWZmIiwiZ2VuZXJhdGVTY3JpcHRzIiwicHJldHRpZnkiLCJleGlzdGluZ0NvbnRlbnQiLCJvcmlnaW5hbENvbnRlbnQiLCJnZW5lcmF0ZVByZXR0aWVyU3VmZml4IiwicG9ldHJ5RGV2RGVwZW5kZW5jaWVzIiwiaHVza3kiLCJwcmVwYXJlIiwicG9zdGluc3RhbGwiLCJpc1JlZmVycmVkQnlPdGhlclJlcG8iLCJwcmVwYWNrIiwicG9zdHBhY2siLCJhcnRpbGxlcnkiLCJwbGF5d3JpZ2h0Iiwid29ya3NwYWNlcyIsIkFycmF5IiwiaXNBcnJheSIsIndvcmtzcGFjZSIsImdsb2JTeW5jIiwid2IiLCJkb2VzQ29udGFpbkphdmFTY3JpcHQiLCJkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5UeXBlU2NyaXB0IiwiZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcyIsIm1pY3JvbWF0Y2giLCJpc1dpbGxCb29zdGVyQ29uZmlncyIsImRlcCIsInByaXZhdGUiLCJsaWNlbnNlIiwicHVibGlzaENvbmZpZyIsImFjY2VzcyIsIm1haW4iLCJyZXNvbHV0aW9ucyIsImxpbnQiLCJzY3JpcHROYW1lIiwic2NyaXB0IiwiZGlycyIsImRpciIsImZvcm1hdCIsInB5dGhvbkZpbGVzIiwiZGlyTmFtZVNldCIsInB5dGhvbkZpbGUiLCJmaXJzdCIsInNlY29uZCIsInNpemUiLCJkaXJOYW1lc1N0ciIsInBhY2thZ2VOYW1lcyIsImlzV29ya3NwYWNlUGFja2FnZSIsInVwZGF0ZVByaXZhdGVQYWNrYWdlcyIsIm5ld0pzb25UZXh0Iiwib2xkQW5kTmV3U2NyaXB0TmFtZXMiLCJvbGROYW1lIiwibmV3TmFtZSIsImZpbGVzIiwiZml4U2NyaXB0TmFtZXMiLCJvbGRTY3JpcHRzIiwiaGFzVHlwZWNoZWNrIiwiY2xlYW51cCIsInR5cGVjaGVjayIsIm9sZFRlc3QiLCJweXJpZ2h0IiwicHJlQ29tbWl0IiwicHJlUHVzaCIsInByZVB1c2hGb3JMYWIiLCJwcmVQdXNoRm9yTGFiRXhjZXB0QWRtaW4iLCJwb3N0TWVyZ2UiLCJnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uIiwicGFja2FnZUpzb25QYXRoIiwicG9zdHB1Ymxpc2giLCJwcmVwdWJsaXNoT25seSIsInByZUNvbW1pdEZpbGVQYXRoIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJtb2RlIiwicG9zdE1lcmdlQ29tbWFuZCIsImdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMiLCJwb3N0TWVyZ2VDb21tYW5kcyIsInJhdyIsImluc3RhbGxDb21tYW5kIiwicm1OZXh0RGlyZWN0b3J5IiwiY3JlYXRlVGFza09wdGlvbnMiLCJydW5uZXIiLCJleHRlbnNpb24iLCJwcmV0dGllckNvbnRlbnQiLCJiaW9tZUNvbnRlbnQiLCJnZW5lcmF0ZUlkZWFTZXR0aW5ncyIsImNvbW1hbmRzIiwiZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24iLCJzZXR0aW5ncyIsIm1rZGlyU3luYyIsInNyY0RpcmVjdG9yaWVzIiwibm9kZSIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwicGFja2FnZVByZWZpeCIsImdldEVzbGludEtleSIsInBhY2thZ2VzRmlsdGVyIiwiZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIiLCJnZXRTcmNEaXJzIiwiZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSIsImdpdGlnbm9yZUZpbGVQYXRoIiwiZ2l0aWdub3JlQ29udGVudCIsImFkZGl0aW9uYWxDb250ZW50IiwidmVudlBhdGgiLCJ2ZW52IiwiZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiIsImdlbmVyYXRlUmVhZG1lIiwiaW5zZXJ0QmFkZ2UiLCJmaWxlTmFtZXMiLCJyZWFkZGlyU3luYyIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwiYmFkZ2UiLCJyZWFkbWUiLCJpIiwiZ2VuZXJhdGVSZWxlYXNlcmMiLCJwbHVnaW5zIiwicGx1Z2luIiwicHJlc2V0IiwiZmFpbENvbW1lbnQiLCJfMSIsInN1Y2Nlc3NDb21tZW50IiwiXzIiLCJjbGVhbk9sZENvbmZpZyIsInN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uIiwiZmFpbENvbW1lbnRDb25kaXRpb24iLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsImdlbmVyYXRlUmVub3ZhdGVKc29uIiwicGFja2FnZVJ1bGVzIiwicnVsZSIsIm1hdGNoUGFja2FnZU5hbWVzIiwiZW5hYmxlZCIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwibW9kdWxlIiwibW9kdWxlUmVzb2x1dGlvbiIsImpzeCIsImFsd2F5c1N0cmljdCIsInN0cmljdCIsIm5vVW5jaGVja2VkSW5kZXhlZEFjY2VzcyIsInNraXBMaWJDaGVjayIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsInNvdXJjZU1hcCIsImltcG9ydEhlbHBlcnMiLCJlcmFzYWJsZVN5bnRheE9ubHkiLCJvdXREaXIiLCJ0eXBlUm9vdHMiLCJleGNsdWRlIiwiaW5jbHVkZSIsInN1Ykpzb25PYmoiLCJnZW5lcmF0ZVRzY29uZmlnIiwiZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMiLCJpc0VzbVBhY2thZ2UiLCJzb3J0IiwiZXhwZXJpbWVudGFsRGVjb3JhdG9ycyIsImV4Y2x1ZGVGaWxlUGF0dGVybnMiLCJnZW5lcmF0ZVZzY29kZVNldHRpbmdzIiwiZXhjbHVkZUZpbGVQYXR0ZXJuIiwiZXhjbHVkZVNldHRpbmciLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJjdXJyZW50VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJ2ZXJzaW9uc0pzb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwiZ2V0TWFqb3JOdW1iZXIiLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsIm5wbU1pbmltYWxBZ2VHYXRlIiwibnBtUHJlYXBwcm92ZWRQYWNrYWdlcyIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJtYWpvciIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwiREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMiLCJzZXR1cFNlY3JldHMiLCJkb3RlbnYiLCJzZWNyZXROYW1lIiwic2VjcmV0X25hbWUiLCJrZXlfaWQiLCJrZXlJZCIsInNvZGl1bSIsInJlYWR5Iiwic2VjcmV0IiwicmF3S2V5IiwiZnJvbV9iYXNlNjQiLCJiYXNlNjRfdmFyaWFudHMiLCJPUklHSU5BTCIsInJhd1NlYyIsImZyb21fc3RyaW5nIiwiZW5jQnl0ZXMiLCJjcnlwdG9fYm94X3NlYWwiLCJlbmNCYXNlNjQiLCJ0b19iYXNlNjQiLCJlbmNyeXB0ZWRfdmFsdWUiLCJzZXR1cEdpdEh1YlNldHRpbmdzIiwid2l0aFJldHJ5IiwiYWxsb3dfYXV0b19tZXJnZSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImFsbG93X3VwZGF0ZV9icmFuY2giLCJkZWxldGVfYnJhbmNoX29uX21lcmdlIiwic3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZSIsInNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZSIsImhlYWRlcnMiLCJ0ZW1wbGF0ZXMiLCJnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyIsImRpc3RhbmNlIiwid2JmeUpzb25TY2hlbWEiLCJ6IiwicmVjb3JkIiwic3RyaW5nIiwib3B0aW9uYWwiLCJkb2MiLCJnZXRQYWNrYWdlQ29uZmlnIiwiZXNtUGFja2FnZSIsInBhY2thZ2VKc29uVGV4dCIsInR5cGUiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwiZnNwIiwiZmxhdCIsInJlcG9JbmZvIiwiZ2l0Iiwic2ltcGxlR2l0Iiwib3JpZ2luIiwiZ2V0UmVtb3RlcyIsInIiLCJyZW1vdGVVcmwiLCJyZWZzIiwicmVxdWVzdFJlcG9JbmZvIiwibWVzc2FnZSIsImZldGNoUmVwb0luZm8iLCJub2RlVmVyc2lvbkNvbnRlbnQiLCJ3YmZ5SnNvblBhdGgiLCJ3YmZ5SnNvblRleHQiLCJyZXBvRnVsbE5hbWUiLCJmdWxsX25hbWUiLCJyZXBvUGFydHMiLCJCb29sZWFuIiwic2VwIiwiY29udGFpbnNBbnkiLCJkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiIsImhhc1N0YXJ0VGVzdCIsImdpdGh1YiIsIm5wbSIsImdldEVzbGludEV4dGVuc2lvbkJhc2UiLCJwYXR0ZXJuIiwib3JnIiwicmV0IiwiYXNzaWduIiwic2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UiLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJhcnJheSIsImRlZmF1bHQiLCJhbGlhcyIsInNraXBEZXBzIiwidmVyYm9zZSIsInBhY2thZ2VKc29uRGlyIiwiVVJMIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwicm9vdERpclBhdGgiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImQiLCJhYmJyZXZpYXRpb25Qcm9taXNlIiwic3ViUGFja2FnZUNvbmZpZ3MiLCJzdWJEaXJQYXRoIiwiYWxsUGFja2FnZUNvbmZpZ3MiLCJzaG91bGRSdW5Xb3JrZmxvd3MiLCJ0aGVuIiwicm1TeW5jIl0sIm1hcHBpbmdzIjoibW9CQUtPLE1BQU1BLEVBQVUsSUFMdkIsTUFDRUMsV0FBWSxFQUNaQyxtQkFBb0IsR0NnQmYsTUFBTUMsRUFBUyxJQWhCdEIsTUFDRSwrQkFBTUMsQ0FBMEJDLEVBQWNDLEdBQ3hDTixFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLGFBQWFILHFCQUU1QixVQUNRQyxHQUNSLENBQUUsTUFBT0csR0FDUEYsUUFBUUMsS0FBSyxxQkFBcUJILE1BQVNJLGFBQWlCQyxNQUFRRCxFQUFNRSxNQUFRQyxPQUFPSCxNQUMzRixDQUNJVCxFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLGNBQWNILG1CQUUvQixHQ1RLUSxlQUFlQyxFQUFjQyxHQUNsQyxPQUFPWixFQUFPQywwQkFBMEIsZ0JBQWlCUyxVQUN2RCxJQUFLRSxFQUFPQyxzQkFBdUIsT0FFbkMsTUFBTUMsRUFBYUYsRUFBT0csV0FDcEJDLEVB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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{PromisePool as a}from"minimal-promise-pool";import c from"deepmerge";import l from"typescript";import p from"fast-glob";import d from"js-yaml";import u from"lodash.clonedeep";import{Octokit as m}from"@octokit/core";import f from"node:child_process";import g from"node:os";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{isVerbose=!1;doesUploadEnvVars=!1};const x=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function _(e){return x.functionIgnoringException("fixDockerfile",async()=>{if(!e.doesContainDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await r.writeFile(t.join(e.dirPath,"Dockerfile"),s)})}const j={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,s){await e.promises.mkdir(t.dirname(n),{recursive:!0});let i=s.replaceAll("\r\n","\n").trim();i&&(i+="\n"),await e.promises.writeFile(n,i)}},S=new a;async function P(n){return x.functionIgnoringException("fixNextConfigJson",async()=>{const s=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!s)return;const i=(await e.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,(e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`));await S.run(()=>j.generateFile(s,i))})}const $=e=>({kind:"literal",value:e}),C=e=>({kind:"object",value:e}),F={forbidOnly:$("!!process.env.CI"),retries:$("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:C({baseURL:$("process.env.NEXT_PUBLIC_BASE_URL"),trace:$("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:$("process.env.CI ? 'only-on-failure' : 'only-on-failure'"),video:$("process.env.CI ? 'retain-on-failure' : 'retain-on-failure'")}),webServer:C({command:$("'yarn start-test-server'"),url:$("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:$("!!process.env.CI"),timeout:$("300_000"),stdout:$("'ignore'"),stderr:$("'pipe'"),env:$("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:$("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})};async function E(n){return x.functionIgnoringException("fixPlaywrightConfig",async()=>{const s=t.resolve(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),o=/defineConfig\s*\(\s*(\{[\s\S]*?})\s*\);?/.exec(i),r=o?.[1];if(!r)return;const a=function(e){const t=l.createSourceFile("playwright-config.ts",`const config = ${e};`,l.ScriptTarget.Latest,!0,l.ScriptKind.TS),n=t.statements[0];if(!n||!l.isVariableStatement(n))return;const s=n.declarationList.declarations[0];if(!s?.initializer||!l.isObjectLiteralExpression(s.initializer))return;return B(s.initializer,t)}(r);if(!a)return;const p=A(c.all([F,a,F]),0),d=i.replace(r,p);await S.run(()=>j.generateFile(s,d))})}function B(e,t){const n={};for(const s of e.properties){if(!l.isPropertyAssignment(s)||!l.isIdentifier(s.name)&&!l.isStringLiteral(s.name))return;const e=O(s.initializer,t);if(void 0===e)return;n[s.name.getText(t)]=e}return n}function O(e,t){if(l.isObjectLiteralExpression(e)){const n=B(e,t);return n?C(n):$(e.getText(t))}if(l.isArrayLiteralExpression(e)){const n=e.elements.map(e=>O(e,t));return n.some(e=>void 0===e)?$(e.getText(t)):{kind:"array",value:n}}return $(e.getText(t))}function I(e,t){return"array"===e.kind?function(e,t){if(0===e.length)return"[]";const n=" ".repeat(t+1),s=e.map(e=>{const s=I(e,t+1).split("\n");if(s[s.length-1]=`${s.at(-1)},`,"literal"===e.kind)for(let e=1;e<s.length;e+=1)s[e]=`${n}${s[e]}`;return s[0]=`${n}${s[0]}`,s.join("\n")}),i=" ".repeat(t);return`[\n${s.join("\n")}\n${i}]`}(e.value,t):"literal"===e.kind?e.value:A(e.value,t)}function A(e,t){const n=" ".repeat(t+1),s=Object.entries(e).map(([e,s])=>{const i=I(s,t+1).split("\n");if(i[i.length-1]=`${i.at(-1)},`,"literal"===s.kind)for(let e=1;e<i.length;e+=1)i[e]=`${n}${i[e]}`;return i[0]=`${n}${e}: ${i[0]}`,i.join("\n")}),i=" ".repeat(t);return 0===s.length?`{\n${i}}`:`{\n${s.join("\n")}\n${i}}`}const T=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function R(e){return x.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await p.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:T});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 D(n){return x.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const s=t.join(n,"test");for(const i of["__tests__","tests"]){const o=t.join(n,i);try{await e.promises.rename(o,s);const r=await e.promises.readFile(t.join(n,"package.json"),"utf8"),a=r.replaceAll(i,"test");if(r===a)return;await e.promises.writeFile(t.join(n,"package.json"),a)}catch{}}}))})}async function W(e,s){return x.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),o=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),a=await n(()=>r.readdir(i,{withFileTypes:!0}));if(a)for(const e of a){const a=e.name.slice(0,-5),c=e.name.endsWith(".d.ts");let l=c?a:e.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some(e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]);e.isFile()&&c?p?(await r.mkdir(t.join(i,a)),await S.run(()=>r.rename(t.join(i,e.name),t.join(i,a,"index.d.ts")))):o&&(await r.mkdir(o,{recursive:!0}),await S.run(()=>r.rename(t.join(i,e.name),t.join(o,e.name)))):e.isDirectory()&&o&&!p&&(await r.mkdir(o,{recursive:!0}),await S.run(()=>n(()=>r.rename(t.join(i,e.name,"index.d.ts"),t.join(o,`${e.name}.d.ts`)))))}})}function L(e,t){return t}function N(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]=c(e[i],o,n):e.includes(o)||s.push(o);return s}function J(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&J(s);return e}const G={name:"autofix.ci",on:{pull_request:null,push:{branches:["main"]}},permissions:{contents:"read"},concurrency:{group:"autofix-${{ github.head_ref }}","cancel-in-progress":!0},jobs:{autofix:{"runs-on":"ubuntu-latest"}}},U={name:"Fix code automatically",on:{pull_request:null},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{autofix:{uses:"WillBooster/reusable-workflows/.github/workflows/autofix.yml@main"}}},z={test:{name:"Test",on:{pull_request:null,push:{branches:["main","wbfy"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:"write"},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{"id-token":"write",contents:"write"},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},permissions:{contents:"write"},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"gen-pr-claude":{name:"Generate PR with Claude Code",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-claude')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"claude-code","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{CLAUDE_CODE_OAUTH_TOKEN:"${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}"}}}},"gen-pr-codex":{name:"Generate PR with Codex CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-codex')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"codex-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{OPENAI_API_KEY:"${{ secrets.OPENAI_API_KEY }}"}}}},"gen-pr-gemini":{name:"Generate PR with Gemini CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-gemini')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"gemini-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{GEMINI_API_KEY:"${{ secrets.GEMINI_API_KEY }}"}}}}};async function q(n){const s=["add-focused-issue-to-project.yml","add-issue-to-project.yml","add-ready-issue-to-project.yml","notify-ready.yml","wbfy.yml","wbfy-merge.yml"];return x.functionIgnoringException("generateWorkflow",async()=>{if(M(n.repository))return;const i=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(i,{recursive:!0});const o=t.resolve(n.dirPath,".github","semantic.yml");await S.run(()=>e.promises.rm(o,{force:!0,recursive:!0}));const r=await e.promises.readdir(i,{withFileTypes:!0}),a=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml","gen-pr-claude.yml","gen-pr-codex.yml","gen-pr-gemini.yml",...r.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&a.add("release.yml"),a.delete("add-issue-to-project.yml"),a.delete("add-ready-issue-to-project.yml"),a.delete("notify-ready.yml");for(const e of a){const s=t.basename(e,".yml");await S.run(()=>H(n,i,s))}for(const n of s)await S.run(()=>e.promises.rm(t.join(i,n),{force:!0,recursive:!0}))})}function M(e){return e?.endsWith("/reusable-workflows")??!1}async function H(n,s,i){const o=t.join(s,`${i}.yml`),r=e.existsSync(t.join(s,"deploy-production.yml"));if("autofix"===i)return void await K(function(e){if(!e.isPublicRepo)return u(U);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0}},...e.isBun?[{uses:"oven-sh/setup-bun@v1",with:{"bun-version":"latest"}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`});n.push({uses:"autofix-ci/action@v1"});const s=u(G),i=s.jobs.autofix??{"runs-on":"ubuntu-latest"};return s.jobs.autofix={...i,steps:n},s}(n),o);let a=u(i in z?z[i]:{});if(!("jobs"in a))return;try{const t=await e.promises.readFile(o,"utf8"),n=d.load(t);a=c.all([a,n,a],{arrayMerge:N})}catch{}i.startsWith("deploy")&&(a={...a,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(a,"jobs"),a.on?.push&&(a.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...a.on.push["paths-ignore"]??[]])])),"release"===i&&a.jobs.release&&r&&(a.permissions??={},a.permissions.actions="write",a.jobs.release.with??={},a.jobs.release.with.trigger_deploy_workflow="deploy-production.yml");let l=!1;for(const e of Object.values(a.jobs))e.uses?.includes("/reusable-workflows/")&&(Y(n,e,i),l=!0);if(l){switch(i){case"release":if(a.on?.schedule)delete a.on.push;else{if(!(a.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});a.on.push.branches=n.release.branches}n.isPublicRepo?(a.permissions??={},a.permissions["id-token"]="write"):delete a.permissions?.["id-token"];break;case"test":a.on?.pull_request&&delete a.on.pull_request["paths-ignore"],a.on?.push&&(delete a.on.push["paths-ignore"],a.on.push.branches=a.on.push.branches.filter(e=>"renovate/**"!==e))}if(function(e){delete e.jobs["add-to-project"]}(a),await K(a,o),"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}),!a.jobs.sync?.with)return;a.jobs["sync-force"]=a.jobs.sync;const n=a.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;a.jobs.sync.with.sync_params_without_dest=`--force ${n}`,a.name="Force to Sync",a.on={workflow_dispatch:null},delete a.jobs.sync,await K(a,t.join(s,"sync-force.yml"))}}}function Y(e,t,n){if(t.with??={},t.secrets??={},delete t.secrets.NPM_TOKEN,"test"!==n&&"release"!==n&&"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.with["test-command"]=e.isBun?"bun run check-all-for-ai":"yarn check-all-for-ai"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with.sync_params_without_dest;"string"==typeof e&&(t.with.sync_params_without_dest=e.replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses?.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses?.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,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.label,delete e.with.labelOperator,e.with.ci_size&&(e.with.ci_label=e.with.ci_size,delete e.with.ci_size)}(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.doesContainDockerfile&&!t.with.ci_label&&n.startsWith("test")&&(t.with.ci_label="large"),"release"===n||"test"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?J(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=J(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function K(t,n){const s=d.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function V(n){return x.functionIgnoringException("fixTypos",async()=>{if(M(n.repository))return;const s=n.dirPath,i=await p.glob("**/*.md",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const o of i){const i=t.join(s,o);await S.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=X(t);s=Z(s,n,"doc"),t!==s&&await j.generateFile(i,s)})}const o=await p.glob(["{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${o.length} TypeScript files in ${s}`);for(const i of o){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=Q(r);a=Z(a,n,"ts"),r!==a&&await j.generateFile(o,a)}const r=await p.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${r.length} text-based files in ${s}`);for(const i of r){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=X(r);a=Z(a,n,"text"),r!==a&&await j.generateFile(o,a)}await S.promiseAll()})}function X(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function Q(e){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function Z(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}async function ee(e,n){return x.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const s=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),i=await j.readFileIgnoringError(s);for(const[s,o]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const r=te(e,n,o,i),a=t.resolve(e.dirPath,s);await S.run(()=>j.generateFile(a,r))}const o=t.resolve(e.dirPath,".cursor/rules/general.mdc"),r=function(e,t,n){const s="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",i=te(e,t,"Cursor",n);return`${s}\n\n${i}`}(e,n,i);await S.run(()=>j.generateFile(o,r))})}function te(e,t,n,s){const i=e.isBun?"bun":"yarn",o=`\n## Project Information\n\n- Name: ${e.packageJson?.name}\n- Description: ${e.packageJson?.description}\n- Package Manager: ${i}\n\n## Development Workflow\n\nWhen changing code, complete these steps before responding to the user.\n\n1. If the current branch is \`main\`, create a new branch.\n - Include unexpected changes since they are mine.\n2. Make code changes as needed.\n3. If possible, write e2e tests for your changes.\n4. Run \`${i} check-all-for-ai\` to execute all tests (note: this may take up to 30 minutes), or run \`${i} check-for-ai\` for type checking and linting only.\n - If you are confident your changes will not break any tests, you may use \`check-for-ai\`.\n5. Commit your changes to the current branch and push.\n - Follow conventional commits, i.e., your commit message should start with \`feat:\`, \`fix:\`, \`test:\`, etc.\n - Make sure to add a new line at the end of your commit message${e.isWillBoosterRepo?` with: \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\``:""}.\n - When pre-commit hooks prevent your changes, fix your code, then re-commit and re-push.\n6. Create a pull request using \`gh\`.\n - The pull request title should match your commit message.\n7. Repeat the following steps until all tests pass:\n 1. Wait for CI to run all tests.\n 2. If tests fail, identify the root causes by gathering debug information through logging and screenshots, then fix the code and/or tests.\n 3. Fetch unresolved review comments from the pull request using \`gh\` and address them.\n - e.g., \`gh api graphql -f query='{ repository(owner: "${e.repoAuthor||"WillBooster"}", name: "${e.repoName||"wbfy"}") { pullRequest(number: 24) { reviewThreads(first: 100) { nodes { isResolved comments(first: 100) { nodes { body author { login } path line } } } } } } }' | jq '.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false)'\`\n 4. Commit your changes and push.\n 5. Write \`/gemini review\` in the pull request.\n\n## Coding Style\n\n- Write comments that explain "why" rather than "what". Avoid explanations that can be understood from the code itself.\n- Use stderr for logging debug messages temporarily since stdout output is sometimes omitted.\n- When adding new functions or classes, define them below any functions or classes that call them to maintain clear call order.\n- Prefer \`undefined\` over \`null\` unless explicitly dealing with APIs or libraries that require \`null\`.\n- Always perform existence checks on array due to \`noUncheckedIndexedAccess: true\`.\n${t.some(e=>e.depending.genI18nTs)?'- When introducing new string literals in React components, update the language resource files in the `i18n` directory (e.g., `i18n/ja-JP.json`). Reference these strings using the `i18n` utility. For example, use `i18n.pages.home.title()` for `{ "pages": { "home": { "title": "My App" } } }`.':""}\n${t.some(e=>e.depending.react||e.depending.next)?"- Prefer `useImmer` for storing an array or an object to `useState`.":""}\n${t.some(e=>e.depending.next)?"- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim();return s?o+"\n"+s.trimEnd():o}const ne=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},se=new Map;function ie(e){const t=e??"",n=se.get(t);if(n)return n;const s=new m({auth:re(e)||void 0});return se.set(t,s),s}function oe(e){return!!re(e)}function re(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER:"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB:process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN}let ae=!1;const ce=new Map;function le(e,t,n,s=0){do{const[s,i,o]=de(e,t,n);if(0===f.spawnSync(s,i,o).status)break}while(--s>=0)}function pe(e,t,n){const[s,i,o]=de(e,t,n);o.stdio="pipe";const r=f.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${a}`),r.stdout.toString().trim()}function de(n,s,i){const o={...process.env};o.PATH&&o.BERRY_BIN_FOLDER&&(o.PATH=o.PATH.replace(`${o.BERRY_BIN_FOLDER}:`,""));const r=o.ASDF_DIR??t.join(g.homedir(),".asdf");if(e.existsSync(r)){const e=[t.join(r,"shims"),t.join(r,"bin")],n=o.PATH?.split(":")??[];o.PATH=[...e,...n.filter(t=>!e.includes(t))].join(":"),o.ASDF_DIR||=r;const s=ue(i),a=s?.split(/\r?\n/).some(e=>e.trim().startsWith("nodejs "));a||(o.ASDF_NODEJS_VERSION="lts",ae||(f.spawnSync("asdf",["install","nodejs","lts"],{cwd:i,env:o,encoding:"utf8",shell:!1,stdio:"inherit"}),ae=!0))}return[n,s,{cwd:i,env:o,encoding:"utf8",shell:!1,stdio:"inherit"}]}function ue(n){if(ce.has(n))return ce.get(n);const s=function(n){let s=t.resolve(n);for(;;){const n=t.join(s,".tool-versions");if(e.existsSync(n))return n;const i=t.dirname(s);if(i===s)return;s=i}}(n);if(!s)return void ce.set(n,void 0);const i=e.readFileSync(s,"utf8");return ce.set(n,i),i}function me(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 fe="3.9.19",ge="zulu-11.74.15";async function he(n){return x.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`${ye.has(t??"")?" ":""}${t??""} ${n??""}`}).toSorted().map(e=>e.trim()).filter(e=>!e.startsWith("lefthook")),i=[...new Set(s)];if(n.doesContainPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&be(i,"poetry",n),be(i,"python",fe,!0)}n.depending.firebase&&be(i,"java",ge,!0);if(n.doesContainPackageJson)if(n.isBun){const e=await async function(e,t){try{const n=(await ie().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&&be(i,"bun",e)}else{const e=pe("npm",["show","yarn","version"],n.dirPath);be(i,"yarn",e)}for(const s of we){const i=t.resolve(n.dirPath,`.${s}-version`);e.promises.rm(i,{force:!0})}const o=t.resolve(n.dirPath,".tool-versions");await(i.length>0?S.run(()=>e.promises.writeFile(o,i.join("\n")+"\n")):S.run(()=>e.promises.rm(o,{force:!0}))),await S.promiseAll(),le("asdf",["plugin","update","--all"],n.dirPath),le("asdf",["install"],n.dirPath)}(n)})}const ye=new Set(["java","nodejs","bun","python"]),we=["java","node","python"];function be(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+/);me(n)>me(t??"")&&(e[i]=o)}}async function ve(n){return x.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=c.all([s,n,s],{arrayMerge:L})}catch{}const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}const ke='env = false\ntelemetry = false\n\n[install]\nexact = true\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n "@exercode/problem-utils",\n "@willbooster/babel-configs",\n "@willbooster/biome-config",\n "@willbooster/eslint-config-js",\n "@willbooster/eslint-config-js-react",\n "@willbooster/eslint-config-next",\n "@willbooster/eslint-config-ts",\n "@willbooster/eslint-config-ts-react",\n "@willbooster/prettier-config",\n "@willbooster/shared-lib",\n "@willbooster/wb",\n "next",\n "@next/*",\n "react",\n "react-dom"\n]\n',xe=ke.replace("exact = true","exact = false");async function _e(n){return x.functionIgnoringException("generateBunfigToml",async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)&&e.readFileSync(s,"utf8").includes("exact = false")?xe:ke;await S.run(()=>j.generateFile(s,i))})}const je="# Project-specific settings",Se=/# Project-specific settings[^\n]*\n/gm,Pe="# Generated by wbfy",$e=`${je} (head)\n\n\n${Pe}\n`,Ce=`\n${je} (tail)\n`,Fe={separator:Pe,separatorPrefix:"# Generated by ",defaultHeadUserContent:$e,defaultTailUserContent:Ce,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=Ee(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(Se,"").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(Se,`${je} (head)\n`):$e},getTailUserContent(e){const t=Ee(e);return t>0?e.slice(t-1):Ce},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function Ee(e){const t=e.indexOf(je),n=e.lastIndexOf(je);return n>t?n:-1}async function Be(n){return x.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await j.readFileIgnoringError(s)??"",t=Fe.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+Fe.getTailUserContent(e);await S.run(()=>j.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const Oe={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].toSorted(),codeWith4IndentSize:["go","gradle","java","py"].toSorted(),markdownLike:["md"].toSorted(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].toSorted(),prettier:["cjs","mjs","java","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].toSorted(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].toSorted()},Ie=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${Te(Oe.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${Te(Oe.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${Te(Oe.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function Ae(e){return x.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run(()=>j.generateFile(n,Ie))})}function Te(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function Re(n){return x.functionIgnoringException("generateEslintrc",async()=>{await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintignore"),{force:!0})),await S.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 S.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 S.run(()=>j.generateFile(s,`export { default } from '${n.eslintBase}';`))}})}const De={have_fun:!0,code_review:{disable:!1,comment_severity_threshold:"MEDIUM",max_review_comments:-1,pull_request_opened:{help:!1,summary:!0,code_review:!0}},ignore_patterns:["**/__generated__"]};async function We(n){return x.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"config.yml"),o=t.resolve(s,"styleguide.md");let r=u(De);try{const t=await e.promises.readFile(i,"utf8"),n=d.load(t);r=c.all([r,n,r],{arrayMerge:L})}catch{}const a=d.dump(r,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),l=[S.run(()=>j.generateFile(i,a))];e.existsSync(o)||l.push(S.run(()=>j.generateFile(o,"日本語でレビューしてください。"))),await Promise.all(l)})}async function Le(n){return x.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"settings.json");await e.promises.rm(i,{force:!0})})}const Ne=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...Oe.codeWith2IndentSize,...Oe.codeWith4IndentSize,...Oe.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function Je(e){return x.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run(()=>j.generateFile(n,Ne))})}const Ge=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Ue(e,n){return x.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await j.readFileIgnoringError(s)??"";let o=Fe.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n*/mount/*.hash\n.devcontainer/\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot.*\n.idea/copilot/chatSessions/\n.serena/\n.tmp/\n__generated__/\n@willbooster/\ndist/\ntemp/\ntmp/\n";const r=Fe.getTailUserContent(i),a=[...Ge];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainPoetryLock&&(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+="playwright-report/\ntest-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 Me(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,s=await fetch(n),i=await s.text();if(!s.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await S.run(()=>qe(e,t)),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await Fe.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+"\n"+c+r;await S.run(()=>j.generateFile(s,l))})}const ze=t.join(g.homedir(),".cache","wbfy","gitignore");async function qe(n,s){await e.promises.mkdir(ze,{recursive:!0}),await e.promises.writeFile(t.join(ze,n),s)}async function Me(n){try{const s=await e.promises.stat(t.join(ze,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(ze,n),"utf8")}catch{}}function He(e,t){try{const n=`git@github.com:${e}/${t}.git`,s=pe("git",["ls-remote",n,"HEAD"],process.cwd()).split(/\s+/)[0];if(!s)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(s)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}const Ye={getLintFixSuffix:e=>e.doesContainJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},Ke=["eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-import-x","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],Ve=[...Ke,"typescript-eslint","eslint-import-resolver-typescript"],Xe=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],Qe={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...Ke],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...Ke,...Xe],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...Ve],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...Ve,...Xe],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...Ve,...Xe]};async function Ze(n,s,i){return x.functionIgnoringException("generatePackageJson",async()=>{await async function(n,s,i){const o=t.resolve(n.dirPath,"package.json"),r=await e.promises.readFile(o,"utf8"),a=JSON.parse(r);a.scripts=a.scripts??{},a.dependencies=a.dependencies??{},a.devDependencies=a.devDependencies??{},a.peerDependencies=a.peerDependencies??{};const l=n.isBun?"bun":"yarn";await async function(t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");delete t.scripts["sort-package-json"],delete t.scripts["sort-all-package-json"],delete t.scripts["typecheck/warn"],delete t.scripts["typecheck:gen-code"],delete t.scripts["typecheck:codegen"],delete t.dependencies.tslib,delete t.devDependencies["@willbooster/eslint-config"],delete t.devDependencies["@willbooster/eslint-config-react"],delete t.devDependencies["@willbooster/renovate-config"],delete t.devDependencies["@willbooster/tsconfig"],delete t.devDependencies["eslint-import-resolver-node"],delete t.devDependencies["eslint-plugin-prettier"],delete t.devDependencies.lerna,delete t.devDependencies.pinst,delete t.scripts["flutter-format"],delete t.scripts["format-flutter"],delete t.scripts["python-format"],delete t.scripts["format-python"],delete t.scripts.prettier,delete t.scripts["check-all"],await S.run(()=>e.promises.rm("lerna.json",{force:!0})),delete t.devDependencies["@typescript-eslint/eslint-plugin"],delete t.devDependencies["@typescript-eslint/parser"],delete t.devDependencies["eslint-plugin-import"]}(a);for(const[e,t]of Object.entries(a.scripts))t.includes("git clone")||(a.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));a.scripts=c(a.scripts,et(n,a.scripts)),"check-for-ai"in a.scripts&&("gen-code"in a.scripts&&(a.scripts["check-for-ai"]=`${l} gen-code > /dev/null && ${a.scripts["check-for-ai"]}`),a.scripts["check-for-ai"]=`${l} install > /dev/null && ${a.scripts["check-for-ai"]}`);n.isBun?delete a.scripts.prettify:a.scripts.prettify=(a.scripts.prettify??"")+await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),o=i.indexOf(Fe.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("")} || true`}(n.dirPath);for(const[e,t]of Object.entries(a.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(a.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let d=[],u=["prettier","sort-package-json@3.5.0"];const m=[];e.existsSync(t.join(s.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(a.prettier="@willbooster/prettier-config",u.push("prettier-plugin-java","@willbooster/prettier-config"));n.isBun?delete a.devDependencies["lint-staged"]:u.push("lint-staged");if(n.isRoot){if(n.isBun?(delete a.devDependencies.husky,delete a.devDependencies.pinst,a.scripts.prepare="lefthook install || true",u.push("lefthook")):(u.push("husky"),a.scripts.prepare="husky || true",a.scripts.postinstall="husky || true",(n.isPublicRepo||n.isReferredByOtherRepo)&&(u.push("pinst"),a.scripts.prepack="pinst --disable",a.scripts.postpack="pinst --enable")),n.depending.semanticRelease&&(a.devDependencies["semantic-release"]||a.devDependencies["multi-semantic-release"]||a.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),a.version="0.0.0-semantically-released"),n.depending.playwrightTest){a.dependencies.artillery||a.devDependencies.artillery||a.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete a.dependencies["@playwright/test"]),delete a.dependencies.playwright,delete a.devDependencies.playwright}n.doesContainSubPackageJsons?a.workspaces=Array.isArray(a.workspaces)?c.all([a.workspaces,["packages/*"]],{arrayMerge:N}):["packages/*"]:Array.isArray(a.workspaces)&&(a.workspaces=a.workspaces.filter(e=>p.globSync(e,{dot:!0,cwd:n.dirPath,ignore:T}).length>0),0===a.workspaces.length&&delete a.workspaces)}if(n.depending.wb||n.isBun){a.dependencies["@willbooster/wb"]?d.push("@willbooster/wb"):u.push("@willbooster/wb");for(const[e,t]of Object.entries(a.scripts))a.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(n.isBun?(u.push("@biomejs/biome","@willbooster/biome-config"),delete a.devDependencies.eslint,delete a.devDependencies.micromatch,delete a.devDependencies["typescript-eslint"]):u.push("eslint","micromatch"));(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(u.push("typescript"),n.isBun&&u.push("@types/bun"));n.eslintBase&&u.push(...Qe[n.eslintBase]);n.isWillBoosterConfigs&&(d=d.filter(e=>!e.includes("@willbooster/")),u=u.filter(e=>!e.includes("@willbooster/")));a.name||(a.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(a.private=!0);a.license||(a.license="UNLICENSED");!a.private&&"UNLICENSED"!==a.license&&s.isPublicRepo&&(a.publishConfig??={},a.publishConfig.access??="public");const[f]=ne.getOrgAndName(n.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(a.author="WillBooster Inc.");n.isRoot||!a.private||a.main||(a.main="./src");if(delete a.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)a.scripts["lint-fix"]=(a.scripts["lint-fix"]??"")+Ye.getLintFixSuffix(n);else{delete a.scripts.lint,delete a.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=a.scripts[e];t&&(a.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){a.scripts.lint="flutter analyze",a.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter(s=>e.existsSync(t.resolve(n.dirPath,s)));s.length>0&&(a.scripts["format-code"]=`dart format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,a.scripts.format=(a.scripts.format??"")+" && yarn format-code")}if(n.doesContainPoetryLock){"poetry install"===a.scripts.postinstall&&delete a.scripts.postinstall;const e=await p.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:T}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);e&&s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");a.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,a.scripts.lint?a.scripts.lint=`poetry run flake8 ${e} && ${a.scripts.lint}`:(a.scripts.lint=`poetry run flake8 ${e}`,a.scripts["lint-fix"]="yarn lint"),a.scripts.format=(a.scripts.format??"")+" && yarn format-code",m.push("black","isort","flake8")}}n.repository&&(a.repository=n.repository)}n.depending.blitz?a.scripts["gen-code"]?.startsWith("blitz codegen")?a.scripts["gen-code"].includes("blitz prisma generate")||(a.scripts["gen-code"]=a.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):a.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!a.scripts["gen-code"]?.startsWith("prisma generate")&&(a.scripts["gen-code"]="prisma generate");a.dependencies.prettier||delete a.devDependencies["@types/prettier"];0===Object.keys(a.dependencies).length&&delete a.dependencies;0===Object.keys(a.devDependencies).length&&delete a.devDependencies;0===Object.keys(a.peerDependencies).length&&delete a.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")&&!tt(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await He("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!tt(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await He("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!tt(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await He("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#${t}`}if(t.has("@willbooster/judge")&&!tt(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await He("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!tt(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await He("WillBoosterLab","llm-proxy");e.dependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(a),n.isBun&&delete a.packageManager;let g=JSON.stringify(a);g=await async function(n,s,i){const o=[];for(const[e]of Object.keys(n))e&&!e.startsWith(":")&&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 p.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:T});for(const n of r)await S.run(async()=>{const s=t.join(i.dirPath,n),r=await e.promises.readFile(s,"utf8");let a=r;for(const[e,t]of o)a=a.replaceAll(e,t);a!==r&&await e.promises.writeFile(s,a)});return await S.promiseAll(),s}(a.scripts,g,n),await e.promises.writeFile(o,g),i||(d=d.filter(e=>!a.devDependencies?.[e]),d.length>0&&(n.isBun?(le(l,["remove",...new Set(d)],n.dirPath),le(l,["add","--exact",...new Set(d)],n.dirPath)):le(l,["add",...new Set(d)],n.dirPath)),u=u.filter(e=>!a.dependencies?.[e]),u.length>0&&(n.isBun?(le(l,["remove",...new Set(u)],n.dirPath),le(l,["add","-D","--exact",...new Set(u)],n.dirPath)):le(l,["add","-D",...new Set(u)],n.dirPath)),m.length>0&&le("poetry",["add","--group","dev",...new Set(m)],n.dirPath))}(n,s,i)})}function et(e,t){if(e.isBun){const t=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,n={"check-all-for-ai":"bun run check-for-ai && bun run test --silent","check-for-ai":"bun run cleanup"+(t?" && bun run typecheck":""),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 t||delete n.typecheck,n}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,s=t.test;let i={"check-all-for-ai":"yarn check-for-ai && yarn test","check-for-ai":`yarn format > /dev/null 2> /dev/null || true${n?" && yarn typecheck":""} && yarn lint-fix --quiet`,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 "**/{.*/,}*.{${Oe.prettier.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};return e.doesContainSubPackageJsons?i=c({...i},{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 "**/{.*/,}*.{${Oe.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.depending.pyright&&(i.typecheck=i.typecheck?`${i.typecheck} && `:"",i.typecheck+="pyright"),s?.includes("wb test")&&(i.test=s,i["check-all-for-ai"]=(i["check-all-for-ai"]??"")+" --silent"),n?e.depending.wb&&(i.typecheck="wb typecheck"):delete i.typecheck,i}}function tt(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const nt={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 st(n){return x.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 e.promises.writeFile(s,JSON.stringify(o,void 0,2)),n.isBun)return await e.promises.rm(r,{force:!0,recursive:!0}),void le("git",["config","--unset","core.hooksPath"],n.dirPath);le("yarn",["dlx","husky","init"],n.dirPath);const a=t.resolve(r,"pre-commit");await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})),await S.run(()=>e.promises.writeFile(a,nt.preCommit+"\n"));const{typecheck:c}=et(n,{});if(c){let s=n.repository?.startsWith("github:WillBoosterLab/")?n.repository.toLocaleLowerCase().includes("exercode")?nt.prePushForLab:nt.prePushForLabExceptAdmin:nt.prePush;s=s.replace("yarn typecheck",c.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await S.run(()=>e.promises.writeFile(t.resolve(r,"pre-push"),s+"\n",{mode:493}))}const l=`${nt.postMerge}\n\n${it(n).join("\n")}\n`;await S.run(()=>e.promises.writeFile(t.resolve(r,"post-merge"),l,{mode:493}))}(n)})}function it(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(String.raw`run_if_changed "package\.json" "${n}${s}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`),t}function ot(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 rt=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${Oe.prettier.map(e=>ot("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,at=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${Oe.prettier.map(e=>ot("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-parse-errors","Biome",e)).join("")}\n </component>\n</project>\n`;async function ct(n){return x.functionIgnoringException("generateIdeaSettings",async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages||n.doesContainPackageJson&&!n.doesContainPubspecYaml&&!n.doesContainGemfile&&!n.doesContainGoMod&&!n.doesContainPomXml?S.run(()=>j.generateFile(i,n.isBun?at:rt)):S.run(()=>e.promises.rm(i,{force:!0})))}})}const lt={"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"}}}},pt={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 dt(n){return x.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook"),{typecheck:i}=et(n,{}),o={...lt};i||delete o["pre-push"];if(await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),d.dump(o,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]),i){const i=n.repository?.startsWith("github:WillBoosterLab/")?pt.prePushForLab:pt.prePush;e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493}))}const r=`${pt.postMerge}\n\n${it(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),r,{mode:493}))}(n)})}const ut={node:["src","test","scripts"].toSorted(),blitz:["src","test","scripts","db","integrations","mailers"].toSorted()};async function mt(n){return x.functionIgnoringException("generateLintstagedrc",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await S.run(()=>e.promises.rm(s,{force:!0}));const i=n.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",o=[];if(n.doesContainJavaScript||n.doesContainTypeScript){const e=`\n '${ft(n)}': [${JSON.stringify(`${i}eslint --fix${Ye.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;o.push(e)}const r=n.isRoot?" && !file.includes('/packages/')":"";o.push(`\n './**/*.{${Oe.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/') && !file.includes('/test/fixtures/')${r});${function(e){return e.doesContainJavaScript||e.doesContainTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${ft(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 \`echo '!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.'\`,\n 'false',\n ];\n }\n }\n return [];\n},`),n.doesContainPubspecYaml&&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 [`dart format ${filteredFiles.join(' ')}`];\n },");n.doesContainPoetryLock&&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.doesContainJavaScript||n.doesContainTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${o.join("")}\n};\n`;await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0})),await S.run(()=>j.generateFile(s,a))}(n)})}function ft(e){const t=function(e){return e.depending.blitz?ut.blitz:ut.node}(e).map(e=>`${e}/**/`);return`{,${t.join(",")}}*.{${Oe.eslint.join(",")}}`}async function gt(e){return x.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await j.readFileIgnoringError(n)??"",i=Fe.getHeadUserContent(s),o=Fe.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await Fe.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await S.run(()=>j.generateFile(n,l))})}const ht={venvPath:".",venv:".venv"};async function yt(n){return x.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=u(ht);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:L})}catch{}const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}async function wt(n){return x.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=bt(i,"[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)"));const 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=`[![${r}](https://github.com/${o}/actions/workflows/${s}/badge.svg)](https://github.com/${o}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=bt(i,a))}await S.run(()=>j.generateFile(s,i))})}function bt(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 vt(n){return x.functionIgnoringException("generateReleaserc",async()=>{const s=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(s))return;const 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]||{};if("@semantic-release/commit-analyzer"===t)o[e]=["@semantic-release/commit-analyzer",c.all([n,{preset:"conventionalcommits"}],{arrayMerge:L})];else if("@semantic-release/github"===t){const{failComment:t,successComment:s,...i}=n;o[e]=["@semantic-release/github",c.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:L})]}}const r=JSON.stringify(i);await S.run(()=>j.generateFile(s,r))})}const kt={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function xt(n){return x.functionIgnoringException("generateRenovateJson",async()=>{let s=u(kt);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=c.all([s,n,s],{arrayMerge:L}),s.extends=s.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(s.packageRules??=[],s.packageRules.some(e=>e.matchPackageNames?.includes("next"))||s.packageRules.push({matchPackageNames:["next"],enabled:!1})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}const _t={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,noUncheckedIndexedAccess:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},jt={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,noUncheckedIndexedAccess:!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"]},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function St(n){return x.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?_t:jt);n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages||delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(s.include=s.include?.filter(e=>!e.startsWith("packages/*/")),s.exclude=s.exclude?.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=c.all([s,o,s],{arrayMerge:N}),s.include=s.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/"))}catch{}J(s),s.include?.sort();const o=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await S.run(()=>j.generateFile(i,o))})}const Pt=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function $t(n){return x.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 Pt)o=c.all([o,Ct(e)]);n.doesContainPoetryLock&&(o=c.all([o,Ct("**/.venv/**")])),n.depending.next&&(o=c.all([o,Ct("**/.next/**")])),"editor.codeActionsOnSave"in o&&delete o["editor.codeActionsOnSave"],"editor.formatOnSave"in o&&delete o["editor.formatOnSave"],J(o);const r=JSON.stringify(o,void 0,2);await S.run(()=>j.generateFile(s,r))}catch{}})}function Ct(e){return{"files.watcherExclude":{[e]:!0}}}async function Ft(n){return x.functionIgnoringException("generateYarnrcYml",async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await S.run(()=>e.promises.rm(s,{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await S.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const i=pe("yarn",["--version"],n.dirPath),o=function(e,t){const n=pe("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);Et(i)<=Et(o)&&i!==o&&le("yarn",["set","version",o],n.dirPath,1);const r=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(r,{recursive:!0});for(const n of await e.promises.readdir(r))n.startsWith("yarn-")&&!n.startsWith(`yarn-${o}.`)&&await S.run(()=>e.promises.rm(t.join(r,n)));const a=t.resolve(n.dirPath,".yarnrc");await S.run(()=>e.promises.rm(a,{force:!0}));const c=d.load(await e.promises.readFile(s,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.npmPreapprovedPackages=["@exercode/problem-utils","@willbooster/babel-configs","@willbooster/biome-config","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","@willbooster/prettier-config","@willbooster/shared-lib","@willbooster/wb","next","@next/*","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const s=t.resolve(n.dirPath,".yarnrc","undefined.cjs");await S.run(()=>e.promises.rm(s,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,d.dump(c,{lineWidth:-1})),le("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function Et(e){const[t]=e.split(".");return Number(t)}async function Bt(e){return x.functionIgnoringException("setupLabels",async()=>{const[t,n]=ne.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!oe(t))return;const s=ie(t);try{await Ot(s,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await Ot(s,t,n,"d2: easy :rabbit2:","DDD6FE"),await Ot(s,t,n,"d3: medium :ox:","C4B5FD"),await Ot(s,t,n,"d4: hard :squid:","A78BFA"),await Ot(s,t,n,"d5: x-hard :whale2:","8B5CF6"),await Ot(s,t,n,"p1: critical :fire::fire::fire:","EF4444"),await Ot(s,t,n,"p2: urgent :fire::fire:","F87171"),await Ot(s,t,n,"p3: important :fire:","FCA5A5"),await Ot(s,t,n,"p4: nice to have :droplet:","FECACA"),await Ot(s,t,n,"r: blitz","5300bc"),await Ot(s,t,n,"r: firebase","ffca28"),await Ot(s,t,n,"r: prisma","0c344b"),await Ot(s,t,n,"r: react","61dafb"),await Ot(s,t,n,"r: svelte","ff3e00"),await Ot(s,t,n,"r: semantic-release","494949"),await Ot(s,t,n,"ready :rocket:","22C55E"),await Ot(s,t,n,"review requested :mag:","FBCA04"),await Ot(s,t,n,"released :bookmark:","6366F1"),await Ot(s,t,n,"s: 0.5h :clock1230:","F3F4F6"),await Ot(s,t,n,"s: 1h :clock1:","E5E7EB"),await Ot(s,t,n,"s: 2h :clock2:","D1D5DB"),await Ot(s,t,n,"s: 3h :clock3:","9CA3AF"),await Ot(s,t,n,"s: 5h :clock5:","6B7280"),await Ot(s,t,n,"s: 8h :clock8:","4B5563"),await Ot(s,t,n,"s: 13h :clock1:","374151"),await Ot(s,t,n,"t: build :hammer:","BFDBFE"),await Ot(s,t,n,"t: chore :broom:","BFDBFE"),await Ot(s,t,n,"t: ci :construction_worker:","BFDBFE"),await Ot(s,t,n,"t: docs :memo:","BFDBFE"),await Ot(s,t,n,"t: feat :sparkles:","BFDBFE"),await Ot(s,t,n,"t: fix :bug:","BFDBFE"),await Ot(s,t,n,"t: perf :zap:","BFDBFE"),await Ot(s,t,n,"t: refactor :recycle:","BFDBFE"),await Ot(s,t,n,"t: style :lipstick:","BFDBFE"),await Ot(s,t,n,"t: test :test_tube:","BFDBFE"),await Ot(s,t,n,"project","24292F"),await Ot(s,t,n,"focused :dart:","22C55E"),await Ot(s,t,n,"gen-pr-all :robot:","00B4D8"),await Ot(s,t,n,"gen-pr-claude :robot:","00B4D8"),await Ot(s,t,n,"gen-pr-codex :robot:","00B4D8"),await Ot(s,t,n,"gen-pr-gemini :robot:","00B4D8"),await It(s,t,n,"bug"),await It(s,t,n,"documentation"),await It(s,t,n,"duplicate"),await It(s,t,n,"enhancement"),await It(s,t,n,"good first issue"),await It(s,t,n,"help wanted"),await It(s,t,n,"invalid"),await It(s,t,n,"question"),await It(s,t,n,"wontfix"),await It(s,t,n,"ready"),await It(s,t,n,"review requested"),await It(s,t,n,"released"),await It(s,t,n,"semantic-release"),await It(s,t,n,"llm-pr :robot:"),await It(s,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function Ot(e,t,n,s,i){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:s,color:i})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s,color:i})}}async function It(e,t,n,s){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s})}catch{}}const At=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function Tt(e){return x.functionIgnoringException("setupSecrets",async()=>{const[t,n]=ne.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;if(!oe(t)||!k.doesUploadEnvVars)return;const s=h.config().parsed??{};if(0===Object.keys(s).length)return;const i=ie(t);try{for(const e of At)try{await i.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const e=await i.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=e.data;await y.ready;for(const[e,a]of Object.entries(s)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const s=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,s),p=y.to_base64(l,y.base64_variants.ORIGINAL);await i.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Rt(e){const[t,n]=ne.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!oe(t))return;const i=ie(t);await s(()=>i.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}))}const Dt={"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 Wt(n){return x.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(Dt)){const o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(w(t,i)>i.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await S.run(()=>j.generateFile(o,i))}})}const Lt=v.object({typos:v.object({all:v.record(v.string(),v.string()).optional(),doc:v.record(v.string(),v.string()).optional(),ts:v.record(v.string(),v.string()).optional(),text:v.record(v.string(),v.string()).optional()}).optional()});async function Nt(n,s){const i=t.resolve(n,"package.json");try{const o=e.existsSync(i);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),s=JSON.parse(await r.readFile(e,"utf8"));d=s?.branches??[],u=s?.plugins?.flat()??[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=b(e),s=(await n.getRemotes(!0)).find(e=>"origin"===e.name),i=s?.refs.fetch??s?.refs.push;if("string"==typeof i){const e=await Gt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await Gt(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g=ue(n)?.trim()??"";for(const[e,s]of[["java","java"],["node","nodejs"],["python","python"]])try{const i=await r.readFile(t.resolve(n,`.${e}-version`),"utf8");g&&(g+="\n"),g+=`${s} ${i.trim()}`}catch{}let h="";try{h=await r.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let w;try{const e=await r.readFile(y,"utf8");w=Lt.parse(JSON.parse(e))}catch{}const v="string"==typeof f?.full_name?f.full_name:void 0;let k,x;if(v){const e=v.split("/");e.length>=2&&(k=e[0],x=e[1])}const _=v?`github:${v}`:void 0,j={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:_,repoAuthor:k,repoName:x,isWillBoosterRepo:Boolean(_?.startsWith("github:WillBooster/")||_?.startsWith("github:WillBoosterLab/")),isBun:s?.isBun||e.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainSubPackageJsons:Jt("packages/**/package.json",n),doesContainDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:Jt("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Jt("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Jt("{app,src,test}/**/*.{t,j}sx",n),doesContainJavaScriptInPackages:Jt("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Jt("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Jt("packages/**/{app,src,test}/**/*.{t,j}sx",n),hasStartTest:!!l.scripts?.["start-test"],depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!c["gen-i18n-ts"],litestream:h.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},versionsText:g,packageJson:l,wbfyJson:w};if(j.isBun||(j.eslintBase=function(e){if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainTypeScript)return e.doesContainJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainJavaScript)return"@willbooster/eslint-config-js"}(j)),j.doesContainGemfile||j.doesContainGoMod||j.doesContainPackageJson||j.doesContainPoetryLock||j.doesContainPomXml||j.doesContainPubspecYaml||j.doesContainTemplateYaml)return j}catch{}}function Jt(e,t){return p.globSync(e,{dot:!0,cwd:t,ignore:T}).length>0}async function Gt(e){const[t,n]=ne.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await ie().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch{}return s}function Ut(e){return e.isWillBoosterConfigs&&!0===e.packageJson?.name?.startsWith("@willbooster/eslint-config-")}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"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;k.isVerbose=n.verbose,k.doesUploadEnvVars=n.env;for(const s of n.paths){const o=t.join(s,"packages"),r=(await i(()=>e.promises.readdir(o,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(o,e.name));await D([s,...r]);const a=await Nt(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=V(a),l=(await Promise.all(r.map(e=>Nt(e,a)))).filter(e=>!!e),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await he(a),await Ft(a),a.isBun&&await _e(a);const d=!M(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([_(a),R(a),c.then(()=>wt(a)),ee(a,p),Be(a),Ae(a),We(a),Le(a),Je(a),Wt(a),ct(a),xt(a),vt(a),...d?[q(a)]:[],Bt(a),Tt(a),Rt(a),a.isBun?st(a).then(()=>dt(a)):st(a),mt(a)]),await S.promiseAll();const u=[];for(const e of p)Ut(e)||((e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(W(e,e.isRoot?p:[e])),e.depending.playwrightTest&&u.push(E(e)),e.depending.next&&u.push(P(e)),await Ue(e,a),await S.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await gt(e),await Ze(e,a,n.skipDeps),u.push(mt(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push($t(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(St(e)),(e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&(a.isBun&&u.push(ve(e)),a.isWillBoosterConfigs||u.push(Re(e))),e.depending.pyright&&u.push(yt(e))));await Promise.all(u),await S.promiseAll();const m=a.isBun?"bun":"yarn";a.isBun?(e.rmSync(t.join(s,"bun.lock"),{force:!0}),le(m,["update"],s)):(e.rmSync(t.join(s,"yarn.lock"),{force:!0}),le(m,["install","--no-immutable"],s)),le(m,["cleanup"],s),a.isBun||le(m,["install","--no-immutable"],s)}}();
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbi50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uQ29uc3RhbnRzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYXNkZi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2Jpb21lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYnVuZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2lnbm9yZUZpbGVVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLnRzIiwiLi4vc3JjL3V0aWxzL2V4dGVuc2lvbnMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9lc2xpbnRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRpZ25vcmUudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9odXNreXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG4gIGRvZXNVcGxvYWRFbnZWYXJzID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhEb2NrZXJmaWxlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeERvY2tlcmZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gY29uZmlnLmRvY2tlcmZpbGU7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQ7XG5cbiAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdEb2NrZXJmaWxlJyksIG5ld0NvbnRlbnQpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIGFzeW5jIHJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLnRyaW0oKTtcbiAgICBpZiAobm9ybWFsaXplZENvbnRlbnQpIHtcbiAgICAgIG5vcm1hbGl6ZWRDb250ZW50ICs9ICdcXG4nO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGVkL1VwZGF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBSZXBsYWNlIHRoZSBKU09OIG9iamVjdCBmcm9tIHRoZSBmaWxlXG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvPVxccyp7KFtcXFNcXHNdKil9Oy8sIChfLCBzZXR0aW5nc1RleHQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ2VzbGludDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ2VzbGludDogeyBpZ25vcmVEdXJpbmdCdWlsZHM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ3R5cGVzY3JpcHQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgPSB7JHtzZXR0aW5nc1RleHR9fTtgO1xuICAgIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxudHlwZSBQYXJzZWRWYWx1ZSA9XG4gIHwgeyBraW5kOiAnYXJyYXknOyB2YWx1ZTogUGFyc2VkVmFsdWVbXSB9XG4gIHwgeyBraW5kOiAnbGl0ZXJhbCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ29iamVjdCc7IHZhbHVlOiBQYXJzZWRPYmplY3QgfTtcbnR5cGUgUGFyc2VkT2JqZWN0ID0gUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+O1xuXG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAodmFsdWU6IFBhcnNlZE9iamVjdCk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZSB9KTtcblxuY29uc3QgZGVmYXVsdENvbmZpZzogUGFyc2VkT2JqZWN0ID0ge1xuICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICB1c2U6IGFzT2JqZWN0KHtcbiAgICBiYXNlVVJMOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgIHRyYWNlOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICBzY3JlZW5zaG90OiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb25seS1vbi1mYWlsdXJlJyA6ICdvbmx5LW9uLWZhaWx1cmUnXCIpLFxuICAgIHZpZGVvOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAncmV0YWluLW9uLWZhaWx1cmUnIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgfSksXG4gIHdlYlNlcnZlcjogYXNPYmplY3Qoe1xuICAgIGNvbW1hbmQ6IGxpdGVyYWwoXCIneWFybiBzdGFydC10ZXN0LXNlcnZlcidcIiksXG4gICAgdXJsOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICB0aW1lb3V0OiBsaXRlcmFsKCczMDBfMDAwJyksXG4gICAgc3Rkb3V0OiBsaXRlcmFsKFwiJ2lnbm9yZSdcIiksXG4gICAgc3RkZXJyOiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgIGdyYWNlZnVsU2h1dGRvd246IGxpdGVyYWwoYHtcbiAgc2lnbmFsOiAnU0lHVEVSTScsXG4gIHRpbWVvdXQ6IDUwMCxcbn1gKSxcbiAgfSksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgcGxheXdyaWdodC5jb25maWcudHNgKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgbWF0Y2ggPSAvZGVmaW5lQ29uZmlnXFxzKlxcKFxccyooXFx7W1xcc1xcU10qP30pXFxzKlxcKTs/Ly5leGVjKG9sZENvbnRlbnQpO1xuICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSBtYXRjaD8uWzFdO1xuICAgIGlmICghb2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VPYmplY3RMaXRlcmFsKG9iamVjdExpdGVyYWwpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZS5hbGw8UGFyc2VkT2JqZWN0PihbZGVmYXVsdENvbmZpZywgcGFyc2VkLCBkZWZhdWx0Q29uZmlnXSk7XG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeU9iamVjdChtZXJnZWQsIDApO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2Uob2JqZWN0TGl0ZXJhbCwgbmV3T2JqZWN0TGl0ZXJhbCk7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsKG9iamVjdExpdGVyYWw6IHN0cmluZyk6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgJ3BsYXl3cmlnaHQtY29uZmlnLnRzJyxcbiAgICBgY29uc3QgY29uZmlnID0gJHtvYmplY3RMaXRlcmFsfTtgLFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgICB0cy5TY3JpcHRLaW5kLlRTXG4gICk7XG4gIGNvbnN0IHN0YXRlbWVudCA9IHNvdXJjZS5zdGF0ZW1lbnRzWzBdO1xuICBpZiAoIXN0YXRlbWVudCB8fCAhdHMuaXNWYXJpYWJsZVN0YXRlbWVudChzdGF0ZW1lbnQpKSByZXR1cm47XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gc3RhdGVtZW50LmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbMF07XG4gIGlmICghZGVjbGFyYXRpb24/LmluaXRpYWxpemVyIHx8ICF0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXRpYWxpemVyKSkgcmV0dXJuO1xuICByZXR1cm4gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihkZWNsYXJhdGlvbi5pbml0aWFsaXplciwgc291cmNlKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogdHMuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoIXRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fCAoIXRzLmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhdHMuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHBhcnNlZFtwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbiwgc291cmNlOiB0cy5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8gYXNPYmplY3QocGFyc2VkT2JqZWN0KSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmICh0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUudmFsdWUsIGxldmVsKTtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG4gIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUudmFsdWUsIGxldmVsKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkodmFsdWVzOiBQYXJzZWRWYWx1ZVtdLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZSh2YWx1ZSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgfSk7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3Qob2JqZWN0OiBQYXJzZWRPYmplY3QsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKHZhbHVlLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gIH0pO1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9EQVRBQkFTRV9VUkw9XCI/KC4rXFwuc3FsaXRlMylcIj9bXFxuJF0vLFxuICAgICAgICAnREFUQUJBU0VfVVJMPVwiJDE/Y29ubmVjdGlvbl9saW1pdD0xXCJcXG4nXG4gICAgICApO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24ocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlRGlyUGF0aHMubWFwKGFzeW5jIChwYWNrYWdlRGlyUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3Rlc3QnKTtcbiAgICAgICAgZm9yIChjb25zdCBvbGRUZXN0RGlyTmFtZSBvZiBbJ19fdGVzdHNfXycsICd0ZXN0cyddKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsIG9sZFRlc3REaXJOYW1lKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4Jyk7XG4gICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlQWxsKG9sZFRlc3REaXJOYW1lLCAndGVzdCcpO1xuICAgICAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBuZXdDb250ZW50KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBlRGVmaW5pdGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuOiBQYWNrYWdlQ29uZmlnW11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cGVEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsaWJUeXBlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0B0eXBlcycpO1xuICAgIGNvbnN0IHNyY1R5cGVEaXJQYXRoID1cbiAgICAgIGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpKTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50ICovXG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVNZXJnZSh0YXJnZXQ6IG9iamVjdFtdLCBzb3VyY2U6IG9iamVjdFtdLCBvcHRpb25zOiBhbnkpOiBvYmplY3RbXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdIGFzIG9iamVjdCwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCBwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ2F1dG9maXguY2knLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICBwdXNoOiB7XG4gICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgfSxcbiAgfSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBjb250ZW50czogJ3JlYWQnLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnYXV0b2ZpeC0ke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ0ZpeCBjb2RlIGF1dG9tYXRpY2FsbHknLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDoge1xuICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hdXRvZml4LnltbEBtYWluJyxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jbGF1ZGUnOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggQ2xhdWRlIENvZGUnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY2xhdWRlJylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2NsYXVkZS1jb2RlJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogJyR7eyBzZWNyZXRzLkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jb2RleCc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDb2RleCBDTEknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY29kZXgnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY29kZXgtY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBPUEVOQUlfQVBJX0tFWTogJyR7eyBzZWNyZXRzLk9QRU5BSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1nZW1pbmknOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggR2VtaW5pIENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1nZW1pbmknKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnZ2VtaW5pLWNsaScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0VNSU5JX0FQSV9LRVk6ICcke3sgc2VjcmV0cy5HRU1JTklfQVBJX0tFWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JyB8ICdhdXRvZml4JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZU5hbWVzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FkZC1mb2N1c2VkLWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAnYWRkLWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAnbm90aWZ5LXJlYWR5LnltbCcsXG4gICAgJ3diZnkueW1sJyxcbiAgICAnd2JmeS1tZXJnZS55bWwnLFxuICBdO1xuXG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSkge1xuICAgICAgLy8gRG9uJ3QgdG91Y2ggcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gYmVjYXVzZSBpdCBob3N0cyB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZW1vdmUgY29uZmlnIG9mIHNlbWFudGljIHB1bGwgcmVxdWVzdFxuICAgIGNvbnN0IHNlbWFudGljWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3NlbWFudGljLnltbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShzZW1hbnRpY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29uc3QgZmlsZU5hbWVTZXQgPSBuZXcgU2V0KFtcbiAgICAgICd0ZXN0LnltbCcsXG4gICAgICAnYXV0b2ZpeC55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgJ2dlbi1wci1jbGF1ZGUueW1sJyxcbiAgICAgICdnZW4tcHItY29kZXgueW1sJyxcbiAgICAgICdnZW4tcHItZ2VtaW5pLnltbCcsXG4gICAgICAuLi5lbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKSxcbiAgICBdKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ3JlbGVhc2UueW1sJyk7XG4gICAgfVxuICAgIGZpbGVOYW1lU2V0LmRlbGV0ZSgnYWRkLWlzc3VlLXRvLXByb2plY3QueW1sJyk7XG4gICAgZmlsZU5hbWVTZXQuZGVsZXRlKCdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdC55bWwnKTtcbiAgICBmaWxlTmFtZVNldC5kZWxldGUoJ25vdGlmeS1yZWFkeS55bWwnKTtcblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlcHJlY2F0ZWRGaWxlTmFtZSBvZiBmaWxlTmFtZXNUb0JlUmVtb3ZlZCkge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBkZXByZWNhdGVkRmlsZU5hbWUpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG4gIGNvbnN0IGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnKSk7XG5cbiAgaWYgKGtpbmQgPT09ICdhdXRvZml4Jykge1xuICAgIGF3YWl0IHdyaXRlWWFtbChnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWcpLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG4gIC8vIFNraXAgYSBicm9rZW4gd29ya2Zsb3dcbiAgaWYgKCEoJ2pvYnMnIGluIG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9ICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnO1xuICB9XG5cbiAgbGV0IGlzUmV1c2FibGVXb3JrZmxvdyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcygnL3JldXNhYmxlLXdvcmtmbG93cy8nKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBObyBkZWZhdWx0XG4gIH1cbiAgbWlncmF0ZVdvcmtmbG93KG5ld1NldHRpbmdzKTtcbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc2VtYW50aWMtcmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBlbHNlIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIGpvYi5zZWNyZXRzID8/PSB7fTtcbiAgLy8gVXNlIHRydXN0ZWQgcHVibGlzaGluZyBpbnN0ZWFkIG9mIE5QTV9UT0tFTlxuICBkZWxldGUgam9iLnNlY3JldHMuTlBNX1RPS0VOO1xuXG4gIGlmIChcbiAgICBraW5kID09PSAndGVzdCcgfHxcbiAgICBraW5kID09PSAncmVsZWFzZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNsYXVkZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJ1xuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgLy8gU2V0IHRlc3QtY29tbWFuZCBmb3IgZ2VuLXByIHdvcmtmbG93cyBiYXNlZCBvbiBwYWNrYWdlIG1hbmFnZXJcbiAgaWYgKGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fCBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fCBraW5kID09PSAnZ2VuLXByLWdlbWluaScpIHtcbiAgICBqb2Iud2l0aFsndGVzdC1jb21tYW5kJ10gPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1biBjaGVjay1hbGwtZm9yLWFpJyA6ICd5YXJuIGNoZWNrLWFsbC1mb3ItYWknO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTikge1xuICAgIGpvYi5zZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgICAgam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gcGFyYW1zLnJlcGxhY2UoJ3N5bmMgJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoLmRvdF9lbnZfcGF0aCA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmRvdF9lbnZfcGF0aDtcbiAgfVxuICAvLyBSZW1vdmUgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzXG4gIG1pZ3JhdGVKb2Ioam9iKTtcblxuICAvLyBEb24ndCB1c2UgYGZseSBkZXBsb3kgLS1qc29uYCBzaW5jZSBpdCBjYXVzZXMgYW4gZXJyb3JcbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgam9iLnNlY3JldHMuRkxZX0FQSV9UT0tFTiAmJiB0eXBlb2Ygam9iLndpdGguZGVwbG95X2NvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgam9iLndpdGguZGVwbG95X2NvbW1hbmQgPSBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZC5yZXBsYWNlKC9cXHMrLS1qc29uLywgJycpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlICYmICFqb2Iud2l0aC5jaV9sYWJlbCAmJiBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSkge1xuICAgIGpvYi53aXRoLmNpX2xhYmVsID0gJ2xhcmdlJztcbiAgfVxuICAvLyBCZWNhdXNlIGdpdGh1Yi5ldmVudC5yZXBvc2l0b3J5LnByaXZhdGUgaXMgYWx3YXlzIHRydWUgaWYgam9iIGlzIHNjaGVkdWxlZFxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoam9iLnNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAvLyBNb3ZlIHNlY3JldHMgcHJvcCBhZnRlciB3aXRoIHByb3BcbiAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoam9iLnNlY3JldHMpO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFdvcmtmbG93IHtcbiAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgcmV0dXJuIGNsb25lRGVlcChwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdyk7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBzdGVwczogU3RlcFtdID0gW1xuICAgIHsgdXNlczogJ2FjdGlvbnMvY2hlY2tvdXRAdjYnIH0sXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9zZXR1cC1ub2RlQHY2Jywgd2l0aDogeyAnY2hlY2stbGF0ZXN0JzogdHJ1ZSB9IH0sXG4gICAgLi4uKGNvbmZpZy5pc0J1biA/IFt7IHVzZXM6ICdvdmVuLXNoL3NldHVwLWJ1bkB2MScsIHdpdGg6IHsgJ2J1bi12ZXJzaW9uJzogJ2xhdGVzdCcgfSB9XSA6IFtdKSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgIH0sXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gY2xlYW51cGAgfSxcbiAgXTtcbiAgaWYgKGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uYnVpbGQpIHtcbiAgICBzdGVwcy5wdXNoKHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGJ1aWxkYCB9KTtcbiAgfVxuICBzdGVwcy5wdXNoKHsgdXNlczogJ2F1dG9maXgtY2kvYWN0aW9uQHYxJyB9KTtcblxuICBjb25zdCBhdXRvZml4V29ya2Zsb3cgPSBjbG9uZURlZXAocHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyk7XG4gIGNvbnN0IGF1dG9maXhKb2IgPSBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID8/IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfTtcbiAgYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA9IHsgLi4uYXV0b2ZpeEpvYiwgc3RlcHMgfTtcbiAgcmV0dXJuIGF1dG9maXhXb3JrZmxvdztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcChuZXdTZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xLCBub0NvbXBhdE1vZGU6IHRydWUsIHN0eWxlczogeyAnISFudWxsJzogJ2VtcHR5JyB9IH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gbWlncmF0ZVdvcmtmbG93KG5ld1NldHRpbmdzOiBXb3JrZmxvdyk6IHZvaWQge1xuICAvLyBUT0RPOiBSZW1vdmUgdGhlbSBhZnRlciAyMDIzLTAzLTMxXG4gIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzWydhZGQtdG8tcHJvamVjdCddO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlSm9iKGpvYjogSm9iKTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgaWYgKCFqb2Iud2l0aCkgcmV0dXJuO1xuICBkZWxldGUgam9iLndpdGgubm9uX3NlbGZfaG9zdGVkO1xuICBkZWxldGUgam9iLndpdGgubm90aWZ5X2Rpc2NvcmQ7XG4gIGRlbGV0ZSBqb2Iud2l0aC5yZXF1aXJlX2ZseTtcbiAgZGVsZXRlIGpvYi53aXRoLnJlcXVpcmVfZ2Nsb3VkO1xuICBkZWxldGUgam9iLndpdGgubGFiZWw7XG4gIGRlbGV0ZSBqb2Iud2l0aC5sYWJlbE9wZXJhdG9yO1xuICAvLyBBZGRlZCAyMDI1LTA4LTA2XG4gIGlmIChqb2Iud2l0aC5jaV9zaXplKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSBqb2Iud2l0aC5jaV9zaXplO1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5jaV9zaXplO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLihbXiRdKS9nLCAnY2YuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLihbXiRdKS9nLCAnZS5nLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oW14kXSkvZywgJ2kuZS4kMScpO1xufVxuXG5mdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopZWdcXC4vZywgJy8vJDFlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWllXFwuL2csICcvLyQxaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXJvb3RDb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiBBR0VOVFNfRVhUUkEubWQgZXhpc3RzIGFuZCByZWFkIGl0cyBjb250ZW50XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiAke3Jvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWV9XG4tIERlc2NyaXB0aW9uOiAke3Jvb3RDb25maWcucGFja2FnZUpzb24/LmRlc2NyaXB0aW9ufVxuLSBQYWNrYWdlIE1hbmFnZXI6ICR7cGFja2FnZU1hbmFnZXJ9XG5cbiMjIERldmVsb3BtZW50IFdvcmtmbG93XG5cbldoZW4gY2hhbmdpbmcgY29kZSwgY29tcGxldGUgdGhlc2Ugc3RlcHMgYmVmb3JlIHJlc3BvbmRpbmcgdG8gdGhlIHVzZXIuXG5cbjEuIElmIHRoZSBjdXJyZW50IGJyYW5jaCBpcyBcXGBtYWluXFxgLCBjcmVhdGUgYSBuZXcgYnJhbmNoLlxuICAgLSBJbmNsdWRlIHVuZXhwZWN0ZWQgY2hhbmdlcyBzaW5jZSB0aGV5IGFyZSBtaW5lLlxuMi4gTWFrZSBjb2RlIGNoYW5nZXMgYXMgbmVlZGVkLlxuMy4gSWYgcG9zc2libGUsIHdyaXRlIGUyZSB0ZXN0cyBmb3IgeW91ciBjaGFuZ2VzLlxuNC4gUnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IGNoZWNrLWFsbC1mb3ItYWlcXGAgdG8gZXhlY3V0ZSBhbGwgdGVzdHMgKG5vdGU6IHRoaXMgbWF5IHRha2UgdXAgdG8gMzAgbWludXRlcyksIG9yIHJ1biBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1mb3ItYWlcXGAgZm9yIHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmcgb25seS5cbiAgIC0gSWYgeW91IGFyZSBjb25maWRlbnQgeW91ciBjaGFuZ2VzIHdpbGwgbm90IGJyZWFrIGFueSB0ZXN0cywgeW91IG1heSB1c2UgXFxgY2hlY2stZm9yLWFpXFxgLlxuNS4gQ29tbWl0IHlvdXIgY2hhbmdlcyB0byB0aGUgY3VycmVudCBicmFuY2ggYW5kIHB1c2guXG4gICAtIEZvbGxvdyBjb252ZW50aW9uYWwgY29tbWl0cywgaS5lLiwgeW91ciBjb21taXQgbWVzc2FnZSBzaG91bGQgc3RhcnQgd2l0aCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgXFxgdGVzdDpcXGAsIGV0Yy5cbiAgIC0gTWFrZSBzdXJlIHRvIGFkZCBhIG5ldyBsaW5lIGF0IHRoZSBlbmQgb2YgeW91ciBjb21taXQgbWVzc2FnZSR7cm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwbyA/IGAgd2l0aDogXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGBgIDogJyd9LlxuICAgLSBXaGVuIHByZS1jb21taXQgaG9va3MgcHJldmVudCB5b3VyIGNoYW5nZXMsIGZpeCB5b3VyIGNvZGUsIHRoZW4gcmUtY29tbWl0IGFuZCByZS1wdXNoLlxuNi4gQ3JlYXRlIGEgcHVsbCByZXF1ZXN0IHVzaW5nIFxcYGdoXFxgLlxuICAgLSBUaGUgcHVsbCByZXF1ZXN0IHRpdGxlIHNob3VsZCBtYXRjaCB5b3VyIGNvbW1pdCBtZXNzYWdlLlxuNy4gUmVwZWF0IHRoZSBmb2xsb3dpbmcgc3RlcHMgdW50aWwgYWxsIHRlc3RzIHBhc3M6XG4gICAxLiBXYWl0IGZvciBDSSB0byBydW4gYWxsIHRlc3RzLlxuICAgMi4gSWYgdGVzdHMgZmFpbCwgaWRlbnRpZnkgdGhlIHJvb3QgY2F1c2VzIGJ5IGdhdGhlcmluZyBkZWJ1ZyBpbmZvcm1hdGlvbiB0aHJvdWdoIGxvZ2dpbmcgYW5kIHNjcmVlbnNob3RzLCB0aGVuIGZpeCB0aGUgY29kZSBhbmQvb3IgdGVzdHMuXG4gICAzLiBGZXRjaCB1bnJlc29sdmVkIHJldmlldyBjb21tZW50cyBmcm9tIHRoZSBwdWxsIHJlcXVlc3QgdXNpbmcgXFxgZ2hcXGAgYW5kIGFkZHJlc3MgdGhlbS5cbiAgICAgIC0gZS5nLiwgXFxgZ2ggYXBpIGdyYXBocWwgLWYgcXVlcnk9J3sgcmVwb3NpdG9yeShvd25lcjogXCIke3Jvb3RDb25maWcucmVwb0F1dGhvciB8fCAnV2lsbEJvb3N0ZXInfVwiLCBuYW1lOiBcIiR7cm9vdENvbmZpZy5yZXBvTmFtZSB8fCAnd2JmeSd9XCIpIHsgcHVsbFJlcXVlc3QobnVtYmVyOiAyNCkgeyByZXZpZXdUaHJlYWRzKGZpcnN0OiAxMDApIHsgbm9kZXMgeyBpc1Jlc29sdmVkIGNvbW1lbnRzKGZpcnN0OiAxMDApIHsgbm9kZXMgeyBib2R5IGF1dGhvciB7IGxvZ2luIH0gcGF0aCBsaW5lIH0gfSB9IH0gfSB9IH0nIHwganEgJy5kYXRhLnJlcG9zaXRvcnkucHVsbFJlcXVlc3QucmV2aWV3VGhyZWFkcy5ub2Rlc1tdIHwgc2VsZWN0KC5pc1Jlc29sdmVkID09IGZhbHNlKSdcXGBcbiAgIDQuIENvbW1pdCB5b3VyIGNoYW5nZXMgYW5kIHB1c2guXG4gICA1LiBXcml0ZSBcXGAvZ2VtaW5pIHJldmlld1xcYCBpbiB0aGUgcHVsbCByZXF1ZXN0LlxuXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBXcml0ZSBjb21tZW50cyB0aGF0IGV4cGxhaW4gXCJ3aHlcIiByYXRoZXIgdGhhbiBcIndoYXRcIi4gQXZvaWQgZXhwbGFuYXRpb25zIHRoYXQgY2FuIGJlIHVuZGVyc3Rvb2QgZnJvbSB0aGUgY29kZSBpdHNlbGYuXG4tIFVzZSBzdGRlcnIgZm9yIGxvZ2dpbmcgZGVidWcgbWVzc2FnZXMgdGVtcG9yYXJpbHkgc2luY2Ugc3Rkb3V0IG91dHB1dCBpcyBzb21ldGltZXMgb21pdHRlZC5cbi0gV2hlbiBhZGRpbmcgbmV3IGZ1bmN0aW9ucyBvciBjbGFzc2VzLCBkZWZpbmUgdGhlbSBiZWxvdyBhbnkgZnVuY3Rpb25zIG9yIGNsYXNzZXMgdGhhdCBjYWxsIHRoZW0gdG8gbWFpbnRhaW4gY2xlYXIgY2FsbCBvcmRlci5cbi0gUHJlZmVyIFxcYHVuZGVmaW5lZFxcYCBvdmVyIFxcYG51bGxcXGAgdW5sZXNzIGV4cGxpY2l0bHkgZGVhbGluZyB3aXRoIEFQSXMgb3IgbGlicmFyaWVzIHRoYXQgcmVxdWlyZSBcXGBudWxsXFxgLlxuLSBBbHdheXMgcGVyZm9ybSBleGlzdGVuY2UgY2hlY2tzIG9uIGFycmF5IGR1ZSB0byBcXGBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWVcXGAuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLmdlbkkxOG5UcylcbiAgICA/IGAtIFdoZW4gaW50cm9kdWNpbmcgbmV3IHN0cmluZyBsaXRlcmFscyBpbiBSZWFjdCBjb21wb25lbnRzLCB1cGRhdGUgdGhlIGxhbmd1YWdlIHJlc291cmNlIGZpbGVzIGluIHRoZSBcXGBpMThuXFxgIGRpcmVjdG9yeSAoZS5nLiwgXFxgaTE4bi9qYS1KUC5qc29uXFxgKS4gUmVmZXJlbmNlIHRoZXNlIHN0cmluZ3MgdXNpbmcgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eS4gRm9yIGV4YW1wbGUsIHVzZSBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgLmBcbiAgICA6ICcnXG59XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgLSBQcmVmZXIgXFxgdXNlSW1tZXJcXGAgZm9yIHN0b3JpbmcgYW4gYXJyYXkgb3IgYW4gb2JqZWN0IHRvIFxcYHVzZVN0YXRlXFxgLmBcbiAgICA6ICcnXG59XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgLSBTaW5jZSB0aGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgXFxgdXNlQ2FsbGJhY2tcXGAgb3IgXFxgdXNlTWVtb1xcYCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLmBcbiAgICA6ICcnXG59XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICByZXR1cm4gZXh0cmFDb250ZW50ID8gYmFzZUNvbnRlbnQgKyAnXFxuJyArIGV4dHJhQ29udGVudC50cmltRW5kKCkgOiBiYXNlQ29udGVudDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBgLS0tXFxuZGVzY3JpcHRpb246IEdlbmVyYWwgQ29kaW5nIFJ1bGVzXFxuZ2xvYnM6XFxuYWx3YXlzQXBwbHk6IHRydWVcXG4tLS1gO1xuICBjb25zdCBib2R5ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKGNvbmZpZywgYWxsQ29uZmlncywgJ0N1cnNvcicsIGV4dHJhQ29udGVudCk7XG4gIHJldHVybiBgJHtmcm9udG1hdHRlcn1cXG5cXG4ke2JvZHl9YDtcbn1cbiIsImltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUjtcbiAgfVxuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUI7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU5cbiAgKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLy8gQXZvaWQgcmVwZWF0aW5nIHRoZSBzYW1lIGluc3RhbGwgd2hlbiBtdWx0aXBsZSBjb21tYW5kcyBydW4gaW4gYSByb3cuXG5sZXQgaW5zdGFsbGVkTHRzTm9kZWpzID0gZmFsc2U7XG5jb25zdCB0b29sVmVyc2lvbnNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgaWYgKHJldC5zdGF0dXMgPT09IDApIGJyZWFrO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICBjb25zdCBlcnJvciA9IHByb2Muc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIHJldHVybiBwcm9jLnN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5yZXBsYWNlKGAke2Vudi5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJyk7XG4gIH1cbiAgLy8gRW5zdXJlIGFzZGYgc2hpbXMvYmluIGFyZSBvbiBQQVRIIGV2ZW4gd2hlbiBwYXJlbnQgc2hlbGwgZG9lc24ndCBsb2FkIHRoZW1cbiAgY29uc3QgYXNkZkRpciA9IGVudi5BU0RGX0RJUiA/PyBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmFzZGYnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoYXNkZkRpcikpIHtcbiAgICBjb25zdCBhc2RmUGF0aHMgPSBbcGF0aC5qb2luKGFzZGZEaXIsICdzaGltcycpLCBwYXRoLmpvaW4oYXNkZkRpciwgJ2JpbicpXTtcbiAgICBjb25zdCBjdXJyZW50UGF0aHMgPSBlbnYuUEFUSD8uc3BsaXQoJzonKSA/PyBbXTtcbiAgICBlbnYuUEFUSCA9IFsuLi5hc2RmUGF0aHMsIC4uLmN1cnJlbnRQYXRocy5maWx0ZXIoKHApID0+ICFhc2RmUGF0aHMuaW5jbHVkZXMocCkpXS5qb2luKCc6Jyk7XG4gICAgZW52LkFTREZfRElSIHx8PSBhc2RmRGlyO1xuXG4gICAgY29uc3QgdG9vbFZlcnNpb25zID0gZ2V0VG9vbFZlcnNpb25zQ29udGVudChjd2QpO1xuICAgIGNvbnN0IGhhc05vZGVFbnRyeSA9IHRvb2xWZXJzaW9ucz8uc3BsaXQoL1xccj9cXG4vKS5zb21lKChsaW5lKSA9PiBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCdub2RlanMgJykpO1xuICAgIGlmICghaGFzTm9kZUVudHJ5KSB7XG4gICAgICBlbnYuQVNERl9OT0RFSlNfVkVSU0lPTiA9ICdsdHMnO1xuICAgICAgaWYgKCFpbnN0YWxsZWRMdHNOb2RlanMpIHtcbiAgICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2FzZGYnLCBbJ2luc3RhbGwnLCAnbm9kZWpzJywgJ2x0cyddLCB7XG4gICAgICAgICAgY3dkLFxuICAgICAgICAgIGVudixcbiAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgICB9KTtcbiAgICAgICAgaW5zdGFsbGVkTHRzTm9kZWpzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9vbFZlcnNpb25zQ29udGVudChjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0b29sVmVyc2lvbnNDYWNoZS5oYXMoY3dkKSkgcmV0dXJuIHRvb2xWZXJzaW9uc0NhY2hlLmdldChjd2QpO1xuICBjb25zdCB0b29sVmVyc2lvbnNQYXRoID0gZmluZFRvb2xWZXJzaW9uc1BhdGgoY3dkKTtcbiAgaWYgKCF0b29sVmVyc2lvbnNQYXRoKSB7XG4gICAgdG9vbFZlcnNpb25zQ2FjaGUuc2V0KGN3ZCwgdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModG9vbFZlcnNpb25zUGF0aCwgJ3V0ZjgnKTtcbiAgdG9vbFZlcnNpb25zQ2FjaGUuc2V0KGN3ZCwgY29udGVudCk7XG4gIHJldHVybiBjb250ZW50O1xufVxuXG5mdW5jdGlvbiBmaW5kVG9vbFZlcnNpb25zUGF0aChjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGN3ZCk7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLmpvaW4oY3VycmVudCwgJy50b29sLXZlcnNpb25zJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2FuZGlkYXRlKSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoY3VycmVudCk7XG4gICAgaWYgKHBhcmVudCA9PT0gY3VycmVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdXJyZW50ID0gcGFyZW50O1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gY29udmVydFZlcnNpb25JbnRvTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIGUuZy4gamF2YSBhZG9wdG9wZW5qZGstMTEuMC4xNys4XG4gIGNvbnN0IG51bWJlcnMgPSB2ZXJzaW9uXG4gICAgLnNwbGl0KC9bKy4tXS8pXG4gICAgLm1hcChOdW1iZXIpXG4gICAgLmZpbHRlcigobnVtKSA9PiAhTnVtYmVyLmlzTmFOKG51bSkpO1xuICBsZXQgdmVyc2lvbk51bWJlciA9IDA7XG4gIGxldCBkaXZpc29yID0gMTtcbiAgZm9yIChjb25zdCBudW0gb2YgbnVtYmVycykge1xuICAgIHZlcnNpb25OdW1iZXIgKz0gbnVtICogZGl2aXNvcjtcbiAgICBkaXZpc29yIC89IDEwMDA7XG4gIH1cbiAgcmV0dXJuIHZlcnNpb25OdW1iZXI7XG59XG4iLCJleHBvcnQgY29uc3QgUFlUSE9OX1ZFUlNJT04gPSAnMy45LjE5JztcbmV4cG9ydCBjb25zdCBKQVZBX1ZFUlNJT04gPSAnenVsdS0xMS43NC4xNSc7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGNvbnZlcnRWZXJzaW9uSW50b051bWJlciB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgSkFWQV9WRVJTSU9OLCBQWVRIT05fVkVSU0lPTiB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb25Db25zdGFudHMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUb29sVmVyc2lvbnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUb29sVmVyc2lvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuY29uc3QgQ09SRV9UT09MUyA9IG5ldyBTZXQoWydqYXZhJywgJ25vZGVqcycsICdidW4nLCAncHl0aG9uJ10pO1xuY29uc3QgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTID0gWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ107XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY29uZmlnLnZlcnNpb25zVGV4dCkgcmV0dXJuO1xuXG4gIGNvbnN0IGR1cGxpY2F0YWJsZUxpbmVzID0gY29uZmlnLnZlcnNpb25zVGV4dFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgW25hbWUsIHZlcnNpb25dID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIC8vIFRvIG1vdmUgdGhlIHRvcCBvZiB0aGUgc29ydGVkIGxpc3QsIHdlIG5lZWQgdG8gYWRkIGEgc3BhY2UuXG4gICAgICByZXR1cm4gYCR7Q09SRV9UT09MUy5oYXMobmFtZSA/PyAnJykgPyAnICcgOiAnJ30ke25hbWUgPz8gJyd9ICR7dmVyc2lvbiA/PyAnJ31gO1xuICAgIH0pXG4gICAgLnRvU29ydGVkKClcbiAgICAvLyBSZW1vdmUgYWRkZWQgc3BhY2VzLlxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC8vIFRPRE86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgYWZ0ZXIgbGVmdGhvb2sgaXMgaW5zdGFsbGVkIHZpYSBucG0uXG4gICAgLmZpbHRlcigobGluZSkgPT4gIWxpbmUuc3RhcnRzV2l0aCgnbGVmdGhvb2snKSk7XG4gIGNvbnN0IGxpbmVzID0gWy4uLm5ldyBTZXQoZHVwbGljYXRhYmxlTGluZXMpXTtcblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vcHlwaS5vcmcvcHlwaS9wb2V0cnkvanNvbicpO1xuICAgIGNvbnN0IGpzb24gPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGluZm8/OiB7IHZlcnNpb246IHN0cmluZyB9IH0gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcG9ldHJ5VmVyc2lvbiA9IGpzb24/LmluZm8/LnZlcnNpb247XG4gICAgaWYgKHBvZXRyeVZlcnNpb24pIHtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdwb2V0cnknLCBwb2V0cnlWZXJzaW9uKTtcbiAgICB9XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3B5dGhvbicsIFBZVEhPTl9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdqYXZhJywgSkFWQV9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25zdCBidW5WZXJzaW9uID0gYXdhaXQgZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yignb3Zlbi1zaCcsICdidW4nKTtcbiAgICAgIGlmIChidW5WZXJzaW9uKSB1cGRhdGVWZXJzaW9uKGxpbmVzLCAnYnVuJywgYnVuVmVyc2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsICd5YXJuJywgJ3ZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3lhcm4nLCB2ZXJzaW9uKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMpIHtcbiAgICBjb25zdCB2ZXJzaW9uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApO1xuICAgIHZvaWQgZnMucHJvbWlzZXMucm0odmVyc2lvblBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdCB0b29sVmVyc2lvbnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKTtcbiAgYXdhaXQgKGxpbmVzLmxlbmd0aCA+IDBcbiAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy53cml0ZUZpbGUodG9vbFZlcnNpb25zUGF0aCwgbGluZXMuam9pbignXFxuJykgKyAnXFxuJykpXG4gICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0odG9vbFZlcnNpb25zUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIHNwYXduU3luYygnYXNkZicsIFsncGx1Z2luJywgJ3VwZGF0ZScsICctLWFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gIHNwYXduU3luYygnYXNkZicsIFsnaW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVZlcnNpb24obGluZXM6IHN0cmluZ1tdLCB0b29sTmFtZTogc3RyaW5nLCBuZXdWZXJzaW9uOiBzdHJpbmcsIGhlYWQgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zdCBpbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobCkgPT4gbC5zcGxpdCgvXFxzKy8pWzBdID09PSB0b29sTmFtZSk7XG4gIGNvbnN0IG5ld0xpbmUgPSBgJHt0b29sTmFtZX0gJHtuZXdWZXJzaW9ufWA7XG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICBsaW5lcy5zcGxpY2UoaGVhZCA/IDAgOiBsaW5lcy5sZW5ndGgsIDAsIG5ld0xpbmUpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFssIHZlcnNpb25dID0gKGxpbmVzW2luZGV4XSBhcyBzdHJpbmcpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKGNvbnZlcnRWZXJzaW9uSW50b051bWJlcihuZXdWZXJzaW9uKSA+IGNvbnZlcnRWZXJzaW9uSW50b051bWJlcih2ZXJzaW9uID8/ICcnKSkge1xuICAgICAgbGluZXNbaW5kZXhdID0gbmV3TGluZTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yihvcmdhbml6YXRpb246IHN0cmluZywgcmVwb3NpdG9yeTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBGZXRjaCB0aGUgbGF0ZXN0IHJlbGVhc2UgZnJvbSB0aGUgcmVwb3NpdG9yeSAobm8gcmVxdWlyZWQgcGVybWlzc2lvbnMpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KCkucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9sYXRlc3QnLCB7XG4gICAgICBvd25lcjogb3JnYW5pemF0aW9uLFxuICAgICAgcmVwbzogcmVwb3NpdG9yeSxcbiAgICB9KTtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVzcG9uc2UuZGF0YS50YWdfbmFtZTtcbiAgICBjb25zdCBpbmRleCA9IHZlcnNpb24ubGFzdEluZGV4T2YoJ3YnKTtcbiAgICBjb25zdCB2ZXJzaW9uTnVtYmVyVGV4dCA9IGluZGV4ID09PSAtMSA/IHZlcnNpb24gOiB2ZXJzaW9uLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgLy8gQ2hlY2sgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhIG51bWJlclxuICAgIHJldHVybiAvXlxcZC8udGVzdCh2ZXJzaW9uTnVtYmVyVGV4dCkgPyB2ZXJzaW9uTnVtYmVyVGV4dCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggQnVuIHRhZ3MgZHVlIHRvOicsIGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCaW9tZUpzb25jJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0ge1xuICAgICAgcm9vdDogY29uZmlnLmlzUm9vdCxcbiAgICAgICRzY2hlbWE6ICcuL25vZGVfbW9kdWxlcy9AYmlvbWVqcy9iaW9tZS9jb25maWd1cmF0aW9uX3NjaGVtYS5qc29uJyxcbiAgICAgIGV4dGVuZHM6IFsnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZyddLFxuICAgIH07XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50V2l0aEV4YWN0VHJ1ZSA9IGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuW2luc3RhbGxdXG5leGFjdCA9IHRydWVcbmxpbmtlciA9IFwiaG9pc3RlZFwiXG5taW5pbXVtUmVsZWFzZUFnZSA9IDQzMjAwMCAjIDUgZGF5c1xubWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiAgICBcIkBleGVyY29kZS9wcm9ibGVtLXV0aWxzXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlnc1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZ1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanNcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0XCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0XCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10c1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3RcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWdcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9zaGFyZWQtbGliXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvd2JcIixcbiAgICBcIm5leHRcIixcbiAgICBcIkBuZXh0LypcIixcbiAgICBcInJlYWN0XCIsXG4gICAgXCJyZWFjdC1kb21cIlxuXVxuYDtcblxuY29uc3QgbmV3Q29udGVudFdpdGhFeGFjdEZhbHNlID0gbmV3Q29udGVudFdpdGhFeGFjdFRydWUucmVwbGFjZSgnZXhhY3QgPSB0cnVlJywgJ2V4YWN0ID0gZmFsc2UnKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGNvbnRlbnQgPVxuICAgICAgZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgJiYgZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpLmluY2x1ZGVzKCdleGFjdCA9IGZhbHNlJylcbiAgICAgICAgPyBuZXdDb250ZW50V2l0aEV4YWN0RmFsc2VcbiAgICAgICAgOiBuZXdDb250ZW50V2l0aEV4YWN0VHJ1ZTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZeOBp+OBr25vZGVfbW9kdWxlc+OCkkNPUFnjgZnjgovlv4XopoHjgYzjgYLjgovjgZ/jgoHjgIFub2RlX21vZHVsZXPjgpLpmaTlpJbjgZfjgabjga/jgYTjgZHjgarjgYTjgIJcbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4qKi8uaWRlYVxuKiovKi5zcWxpdGUzKlxuKiovLnlhcm4vaW5zdGFsbC1zdGF0ZS5nelxuKiovLnZlbnZcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURvY2tlcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZURvY2tlcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kb2NrZXJpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBlc2xpbnQ6IFsnY2pzJywgJ21qcycsICdqcycsICdjdHMnLCAnbXRzJywgJ3RzJywgJ3RzeCcsICdqc3gnXS50b1NvcnRlZCgpLFxuICBwcmV0dGllcjogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqYXZhJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3NzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ21kJyxcbiAgICAnc2NzcycsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIC8vIGNmLiBodHRwczovL2Jpb21lanMuZGV2L2ludGVybmFscy9sYW5ndWFnZS1zdXBwb3J0L1xuICBiaW9tZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAndnVlJyxcbiAgICAnc3ZlbHRlJyxcbiAgICAnYXN0cm8nLFxuICAgICdjc3MnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnZ3FsJyxcbiAgXS50b1NvcnRlZCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50cmMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgZmlsZXNcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRpZ25vcmUnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5lc2xpbnRCYXNlKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKCFvbGRDb250ZW50LmluY2x1ZGVzKCdleHBvcnQgeyBkZWZhdWx0IH0nKSkgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJyR7Y29uZmlnLmVzbGludEJhc2V9JztgKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBjbG9uZURlZXAoZGVmYXVsdENvbmZpZyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjb25maWdGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSBwYXJzZWRcbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChuZXdDb25maWcsIHtcbiAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3R5bGVndWlkZUNvbnRlbnQgPSAn5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCJztcblxuICAgIGNvbnN0IHByb21pc2VzID0gW3Byb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGNvbmZpZ0ZpbGVQYXRoLCB5YW1sQ29udGVudCkpXTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc3R5bGVndWlkZUZpbGVQYXRoKSkge1xuICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VtaW5pU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4hLmtlZXBcbi5haWRlcipcbi5lbnYucHJvZHVjdGlvblxuKi9tb3VudC8qLmhhc2hcbi5kZXZjb250YWluZXIvXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90Lipcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLnNlcmVuYS9cbi50bXAvXG5fX2dlbmVyYXRlZF9fL1xuQHdpbGxib29zdGVyL1xuZGlzdC9cbnRlbXAvXG50bXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnlcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG9VcmwgPSBgZ2l0QGdpdGh1Yi5jb206JHtvcmdhbml6YXRpb259LyR7cmVwb30uZ2l0YDtcbiAgICBjb25zdCBvdXRwdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtcmVtb3RlJywgcmVwb1VybCwgJ0hFQUQnXSwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IG91dHB1dC5zcGxpdCgvXFxzKy8pWzBdO1xuICAgIGlmICghY29tbWl0SGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbW1pdEhhc2gpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBFc2xpbnRVdGlsID0ge1xuICBnZXRMaW50Rml4U3VmZml4KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ID8gJyAtLXJ1bGUgXCJ7IHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwczogMCB9XCInIDogJyc7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgRXNsaW50RXh0ZW5zaW9uQmFzZSwgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgRXNsaW50VXRpbCB9IGZyb20gJy4uL3V0aWxzL2VzbGludFV0aWwuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuY29uc3QganNDb21tb25EZXBzID0gW1xuICAnZXNsaW50JyxcbiAgJ2VzbGludC1jb25maWctZmxhdC1naXRpZ25vcmUnLFxuICAnZXNsaW50LWNvbmZpZy1wcmV0dGllcicsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG4gICdlc2xpbnQtcGx1Z2luLXVudXNlZC1pbXBvcnRzJyxcbiAgJ2dsb2JhbHMnLFxuXTtcblxuY29uc3QgdHNDb21tb25EZXBzID0gWy4uLmpzQ29tbW9uRGVwcywgJ3R5cGVzY3JpcHQtZXNsaW50JywgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItdHlwZXNjcmlwdCddO1xuXG5jb25zdCByZWFjdENvbW1vbkRlcHMgPSBbJ2VzbGludC1wbHVnaW4tcmVhY3QnLCAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcycsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJ107XG5cbmNvbnN0IGVzbGludERlcHM6IFJlY29yZDxFc2xpbnRFeHRlbnNpb25CYXNlLCBzdHJpbmdbXT4gPSB7XG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLCAuLi5qc0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JywgLi4uanNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJywgLi4udHNDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsIC4uLnRzQ29tbW9uRGVwcywgLi4ucmVhY3RDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICdlc2xpbnQtY29uZmlnLW5leHQnLFxuICAgIC4uLnRzQ29tbW9uRGVwcyxcbiAgICAuLi5yZWFjdENvbW1vbkRlcHMsXG4gIF0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzID8/IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG5cbiAgYXdhaXQgcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKGpzb25PYmogYXMgU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+KTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAvLyBGcmVzaCByZXBvIHN0aWxsIHJlcXVpcmVzICd5YXJuIGluc3RhbGwnXG4gICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnZ2l0IGNsb25lJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgveWFyblxccyomJlxccyovLCAnJykucmVwbGFjZSgveWFyblxccyppbnN0YWxsXFxzKiYmXFxzKi8sICcnKTtcbiAgICB9XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPSBtZXJnZShqc29uT2JqLnNjcmlwdHMsIGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmouc2NyaXB0cykpO1xuXG4gIGlmICgnY2hlY2stZm9yLWFpJyBpbiBqc29uT2JqLnNjcmlwdHMpIHtcbiAgICBpZiAoJ2dlbi1jb2RlJyBpbiBqc29uT2JqLnNjcmlwdHMpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ10gPSBgJHtwYWNrYWdlTWFuYWdlcn0gZ2VuLWNvZGUgPiAvZGV2L251bGwgJiYgJHtqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG4gICAgfVxuICAgIGpzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ10gPSBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbCA+IC9kZXYvbnVsbCAmJiAke2pzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5O1xuICB9IGVsc2Uge1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSA9IChqc29uT2JqLnNjcmlwdHMucHJldHRpZnkgPz8gJycpICsgKGF3YWl0IGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoY29uZmlnLmRpclBhdGgpKTtcbiAgfVxuICAvLyBEZWFsIHdpdGggYnJlYWtpbmcgY2hhbmdlcyBpbiB5YXJuIGJlcnJ5IDQuMC4wLXJjLjQ5XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgaWYgKFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tYWxsJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXJlY3Vyc2l2ZScpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1zaW5jZScpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS13b3JrdHJlZScpXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcsICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCcpO1xuICB9XG5cbiAgbGV0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgLy8gVE9ETzogVW5waW4gc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBhZnRlciBodHRwczovL2dpdGh1Yi5jb20va2VpdGhhbXVzL3NvcnQtcGFja2FnZS1qc29uL2lzc3Vlcy8zODggaXMgZml4ZWQuXG4gIGxldCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3ByZXR0aWVyJywgJ3NvcnQtcGFja2FnZS1qc29uQDMuNS4wJ107XG4gIGNvbnN0IHBvZXRyeURldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RDb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpXG4gICkge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIH0gZWxzZSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xpbnQtc3RhZ2VkJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5odXNreTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5waW5zdDtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnbGVmdGhvb2snKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IGh1c2t5XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnaHVza3knKTtcbiAgICAgIC8vICd8fCB0cnVlJyBhdm9pZHMgZXJyb3JzIHdoZW4gaHVza3kgaXMgbm90IGluc3RhbGxlZC5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2h1c2t5IHx8IHRydWUnOyAvLyBmb3Igbm9uLXlhcm4gcGFja2FnZSBtYW5hZ2Vycy5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9ICdodXNreSB8fCB0cnVlJzsgLy8gZm9yIHlhcm4uXG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbyB8fCBjb25maWcuaXNSZWZlcnJlZEJ5T3RoZXJSZXBvKSB7XG4gICAgICAgIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICAgICAgICAvLyBodHRwczovL3R5cGljb2RlLmdpdGh1Yi5pby9odXNreS8jLz9pZD1pbnN0YWxsLTFcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3BpbnN0Jyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYWNrID0gJ3BpbnN0IC0tZGlzYWJsZSc7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5wb3N0cGFjayA9ICdwaW5zdCAtLWVuYWJsZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzLmFydGlsbGVyeSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5hcnRpbGxlcnk7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLlxuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpXG4gICAgICAgID8gbWVyZ2UuYWxsKFtqc29uT2JqLndvcmtzcGFjZXMsIFsncGFja2FnZXMvKiddXSwge1xuICAgICAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogWydwYWNrYWdlcy8qJ107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLndiIHx8IGNvbmZpZy5pc0J1bikge1xuICAgIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10pIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgvd2JcXHMrZGIvLCAnd2IgcHJpc21hJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICApIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQGJpb21lanMvYmlvbWUnLCAnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZycpO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmVzbGludDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5taWNyb21hdGNoO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0eXBlc2NyaXB0LWVzbGludCddO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnZXNsaW50JywgJ21pY3JvbWF0Y2gnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCd0eXBlc2NyaXB0Jyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmVzbGludEJhc2UpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5lc2xpbnREZXBzW2NvbmZpZy5lc2xpbnRCYXNlXSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgfVxuXG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAganNvbk9iai5wcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWpzb25PYmoubGljZW5zZSkge1xuICAgIGpzb25PYmoubGljZW5zZSA9ICdVTkxJQ0VOU0VEJztcbiAgfVxuICBpZiAoIWpzb25PYmoucHJpdmF0ZSAmJiBqc29uT2JqLmxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJyAmJiByb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZyA/Pz0ge307XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLmFjY2VzcyA/Pz0gJ3B1YmxpYyc7XG4gIH1cbiAgY29uc3QgW293bmVyXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJyB8fCBvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGlmICghY29uZmlnLmlzUm9vdCAmJiBqc29uT2JqLnByaXZhdGUgJiYgIWpzb25PYmoubWFpbikge1xuICAgIC8vIE1ha2UgVlNDb2RlIHBvc3NpYmxlIHRvIHJlZmFjdG9yIGNvZGUgYWNyb3NzIHN1YnBhY2thZ2VzLlxuICAgIGpzb25PYmoubWFpbiA9ICcuL3NyYyc7XG4gIH1cblxuICAvLyBCZWNhdXNlIGBcInJlc29sdXRpb25zXCI6IHsgXCJucG0vY2hhbGtcIjogXCJeNC4xLjJcIiB9LGAgY2F1c2VzIFwiSW52YWxpZCBucG0gdG9rZW5cIlxuICBkZWxldGUganNvbk9iai5yZXNvbHV0aW9ucz8uWyducG0vY2hhbGsnXTtcblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5saW50O1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddO1xuICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdE5hbWUgb2YgWydjbGVhbnVwJywgJ2NoZWNrLWZvci1haSddKSB7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0ganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgICAgICAgIGlmICghc2NyaXB0KSBjb250aW51ZTtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV0gPSBzY3JpcHQucmVwbGFjZSgvID8mJiA/eWFybiBsaW50LWZpeCg/OiAtLXF1aWV0KT8vLCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9IChqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPz8gJycpICsgRXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gKGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPz8gJycpICsgYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoL1svXFxcXF0vKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGBwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiBwb2V0cnkgcnVuIGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gKGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPz8gJycpICsgYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgICAgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcucmVwb3NpdG9yeSkge1xuICAgICAganNvbk9iai5yZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXMucHJldHRpZXIpIHtcbiAgICAvLyBCZWNhdXNlIEB0eXBlcy9wcmV0dGllciBibG9ja3MgcHJldHRpZXIgZXhlY3V0aW9uLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzO1xuICB9XG5cbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICBsZXQgbmV3SnNvblRleHQgPSBKU09OLnN0cmluZ2lmeShqc29uT2JqKTtcbiAgbmV3SnNvblRleHQgPSBhd2FpdCBmaXhTY3JpcHROYW1lcyhqc29uT2JqLnNjcmlwdHMsIG5ld0pzb25UZXh0LCBjb25maWcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0pzb25UZXh0KTtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgLy8gV2UgY2Fubm90IGFkZCBkZXBlbmRlbmNpZXMgd2hpY2ggYXJlIGFscmVhZHkgaW5jbHVkZWQgaW4gZGV2RGVwZW5kZW5jaWVzLlxuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydyZW1vdmUnLCAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLS1leGFjdCcsIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGV2RGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRlcGVuZGVuY2llcy5cbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsncmVtb3ZlJywgLi4ubmV3IFNldChkZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy1EJywgJy0tZXhhY3QnLCAuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy1EJywgLi4ubmV3IFNldChkZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9ldHJ5RGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5uZXcgU2V0KHBvZXRyeURldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0aGUgZm9sbG93aW5nIG1pZ3JhdGlvbiBjb2RlIGluIGZ1dHVyZVxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoanNvbk9iai5hdXRob3IgPT09ICdXaWxsQm9vc3RlciBMTEMnKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1hbGwtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjay93YXJuJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpnZW4tY29kZSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Y29kZWdlbiddO1xuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMudHNsaWI7XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1yZWFjdCddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvdHNjb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtaW1wb3J0LXJlc29sdmVyLW5vZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtcGx1Z2luLXByZXR0aWVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5sZXJuYTtcbiAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5waW5zdDtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZmx1dHRlci1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWZsdXR0ZXInXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHl0aG9uLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtcHl0aG9uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZXI7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWFsbCddO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oJ2xlcm5hLmpzb24nLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAvLyBNaWdyYXRlIGZyb20gRVNMaW50IGxlZ2FjeSBjb25maWdzIHRvIGZsYXQgY29uZmlncyxcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbiddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtcGx1Z2luLWltcG9ydCddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2NoZWNrLWFsbC1mb3ItYWknOiAnYnVuIHJ1biBjaGVjay1mb3ItYWkgJiYgYnVuIHJ1biB0ZXN0IC0tc2lsZW50JyxcbiAgICAgICdjaGVjay1mb3ItYWknOiBgYnVuIHJ1biBjbGVhbnVwJHtoYXNUeXBlY2hlY2sgPyAnICYmIGJ1biBydW4gdHlwZWNoZWNrJyA6ICcnfWAsXG4gICAgICBjbGVhbnVwOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIC0tYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biAtLWJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgfTtcbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IG9sZFRlc3QgPSBvbGRTY3JpcHRzLnRlc3Q7XG4gICAgbGV0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY2hlY2stYWxsLWZvci1haSc6ICd5YXJuIGNoZWNrLWZvci1haSAmJiB5YXJuIHRlc3QnLFxuICAgICAgJ2NoZWNrLWZvci1haSc6IGB5YXJuIGZvcm1hdCA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwgfHwgdHJ1ZSR7XG4gICAgICAgIGhhc1R5cGVjaGVjayA/ICcgJiYgeWFybiB0eXBlY2hlY2snIDogJydcbiAgICAgIH0gJiYgeWFybiBsaW50LWZpeCAtLXF1aWV0YCxcbiAgICAgIGNsZWFudXA6ICd5YXJuIGZvcm1hdCAmJiB5YXJuIGxpbnQtZml4JyxcbiAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnlgLFxuICAgICAgbGludDogYGVzbGludCAtLWNvbG9yYCxcbiAgICAgICdsaW50LWZpeCc6ICd5YXJuIGxpbnQgLS1maXgnLFxuICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgLFxuICAgICAgdHlwZWNoZWNrOiAndHNjIC0tbm9FbWl0IC0tUHJldHR5JyxcbiAgICB9O1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIHNjcmlwdHMgPSBtZXJnZShcbiAgICAgICAgeyAuLi5zY3JpcHRzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKFxuICAgICAgICAgICAgJywnXG4gICAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLlxuICAgICAgICAgIC8vIEZPUkNFX0NPTE9SPTMgbWFrZSB3YiBlbmFibGUgY29sb3Igb3V0cHV0LlxuICAgICAgICAgIHRlc3Q6ICdDST0xIEZPUkNFX0NPTE9SPTMgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgICAgLy8gYHdiYCBzdXBwb3J0cyBgLS1zaWxlbnRgIG9wdGlvblxuICAgICAgc2NyaXB0c1snY2hlY2stYWxsLWZvci1haSddID0gKHNjcmlwdHNbJ2NoZWNrLWFsbC1mb3ItYWknXSA/PyAnJykgKyAnIC0tc2lsZW50JztcbiAgICB9XG5cbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSAnd2IgdHlwZWNoZWNrJztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBpbmRleCA9IGV4aXN0aW5nQ29udGVudC5pbmRleE9mKGlnbm9yZUZpbGVVdGlsLnNlcGFyYXRvclByZWZpeCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiAnJztcblxuICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQuc2xpY2UoMCwgaW5kZXgpO1xuICBjb25zdCBsaW5lcyA9IG9yaWdpbmFsQ29udGVudFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBuZXdMaW5lID0gbGluZS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3TGluZS5lbmRzV2l0aCgnLycpID8gbmV3TGluZS5zbGljZSgwLCAtMSkgOiBuZXdMaW5lO1xuICAgIH0pXG4gICAgLmZpbHRlcigobCkgPT4gbCAmJiAhbC5zdGFydHNXaXRoKCcjJykgJiYgIWwuaW5jbHVkZXMoJy8nKSk7XG5cbiAgcmV0dXJuIGAke2xpbmVzLm1hcCgobGluZSkgPT4gYCBcIiEqKi8ke2xpbmV9LyoqXCJgKS5qb2luKCcnKX0gfHwgdHJ1ZWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeFNjcmlwdE5hbWVzKFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuZXdKc29uVGV4dDogc3RyaW5nLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG9sZEFuZE5ld1NjcmlwdE5hbWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5XSBvZiBPYmplY3Qua2V5cyhzY3JpcHRzKSkge1xuICAgIGlmIChrZXkgJiYgIWtleS5zdGFydHNXaXRoKCc6JykgJiYga2V5LmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIG9sZEFuZE5ld1NjcmlwdE5hbWVzLnB1c2goW2tleSwga2V5LnJlcGxhY2VBbGwoJzonLCAnLScpXSk7XG4gICAgfVxuICB9XG4gIGlmIChvbGRBbmROZXdTY3JpcHROYW1lcy5sZW5ndGggPT09IDApIHJldHVybiBuZXdKc29uVGV4dDtcblxuICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBvbGRBbmROZXdTY3JpcHROYW1lcykge1xuICAgIG5ld0pzb25UZXh0ID0gbmV3SnNvblRleHQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgfVxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGZnLmdsb2IoWycqKi8qLnttZCxjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLCAnKiovRG9ja2VyZmlsZSddLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gb2xkQ29udGVudDtcbiAgICAgIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwob2xkTmFtZSwgbmV3TmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAobmV3Q29udGVudCAhPT0gb2xkQ29udGVudCkge1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgcmV0dXJuIG5ld0pzb25UZXh0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLCAuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcyldKTtcbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9hdXRoJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2F1dGgnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2F1dGgnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnYXV0aCcpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2F1dGguZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAZGlzY29yZC1ib3Qvc2hhcmVkJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQGRpc2NvcmQtYm90L3NoYXJlZCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAZGlzY29yZC1ib3Qvc2hhcmVkJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2Rpc2NvcmQtYm90Jyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9kaXNjb3JkLWJvdC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cblxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplciddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdjb2RlLWFuYWx5emVyJyk7XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ10gPVxuICAgICAgYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2NvZGUtYW5hbHl6ZXIuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvanVkZ2UnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvanVkZ2UnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2p1ZGdlJyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9qdWRnZSddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2p1ZGdlLmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2xsbS1wcm94eScpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2xsbS1wcm94eSddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdsbG0tcHJveHknKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2xsbS1wcm94eSddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2xsbS1wcm94eS5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmo6IFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwganNvbk9iai5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwcmVDb21taXQ6ICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL2xpbnQtc3RhZ2VkJyxcbiAgcHJlUHVzaDogYHlhcm4gdHlwZWNoZWNrYCxcbiAgcHJlUHVzaEZvckxhYjogYFxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbnlhcm4gdHlwZWNoZWNrXG5gLnRyaW0oKSxcbiAgcHJlUHVzaEZvckxhYkV4Y2VwdEFkbWluOiBgXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxueWFybiB0eXBlY2hlY2tcbmAudHJpbSgpLFxuICBwb3N0TWVyZ2U6IGBcbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBwYWNrYWdlSnNvbi5zY3JpcHRzID8/PSB7fTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzLnBvc3RwdWJsaXNoO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cy5wcmVwYXJlO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cy5wcmVwdWJsaXNoT25seTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHMucHJlcGFjaztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHMucG9zdHBhY2s7XG5cbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreScpO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKSk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgc3Bhd25TeW5jKCdnaXQnLCBbJ2NvbmZpZycsICctLXVuc2V0JywgJ2NvcmUuaG9va3NQYXRoJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICdodXNreScsICdpbml0J10sIGNvbmZpZy5kaXJQYXRoKTtcblxuICBjb25zdCBwcmVDb21taXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLWNvbW1pdCcpO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHByZUNvbW1pdEZpbGVQYXRoLCBzY3JpcHRzLnByZUNvbW1pdCArICdcXG4nKSk7XG5cbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIHt9KTtcbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGxldCBwcmVQdXNoID0gY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgPyBjb25maWcucmVwb3NpdG9yeS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKCdleGVyY29kZScpXG4gICAgICAgID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiXG4gICAgICAgIDogc2NyaXB0cy5wcmVQdXNoRm9yTGFiRXhjZXB0QWRtaW5cbiAgICAgIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIHByZVB1c2ggPSBwcmVQdXNoLnJlcGxhY2UoXG4gICAgICAneWFybiB0eXBlY2hlY2snLFxuICAgICAgdHlwZWNoZWNrXG4gICAgICAgIC5yZXBsYWNlKCd0c2MgJywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vdHNjICcpXG4gICAgICAgIC5yZXBsYWNlKCd3YiAnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi93YiAnKVxuICAgICAgICAvLyBweXJpZ2h0IGhhcyBubyBhcmd1bWVudHNcbiAgICAgICAgLnJlcGxhY2UoJ3B5cmlnaHQnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi9weXJpZ2h0JylcbiAgICApO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLXB1c2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhd2sgJ3twcmludCBcXCQxfScgLnRvb2wtdmVyc2lvbnMgfCB4YXJncyAtSXt9IGFzZGYgcGx1Z2luIGFkZCB7fVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIHBsdWdpbiB1cGRhdGUgLS1hbGxcImBcbiAgICApO1xuICB9XG4gIC8vIFB5dGhvbuOBjOOBquOBhOOBqOOCpOODs+OCueODiOODvOODq+OBp+OBjeOBquOBhOWHpueQhuezu+OBjOWtmOWcqOOBmeOCi+OBn+OCgeOAgeW8t+WItueahOOBq+acgOWIneOBq+OCpOODs+OCueODiOODvOODq+OBmeOCi+OAglxuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dD8uaW5jbHVkZXMoJ3B5dGhvbiAnKSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgaW5zdGFsbCBweXRob25cImApO1xuICB9XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuXG5jb25zdCBwcmV0dGllckNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdub2RlJywgJ25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZScsICdQcmV0dGllcicsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmNvbnN0IGJpb21lQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ2J1bicsICctLWJ1biBub2RlX21vZHVsZXMvLmJpbi9iaW9tZSBjaGVjayAtLWZpeCAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1za2lwLXBhcnNlLWVycm9ycycsICdCaW9tZScsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbkdvTW9kICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbmZpZy5pc0J1biA/IGJpb21lQ29udGVudCA6IHByZXR0aWVyQ29udGVudCkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyB9IGZyb20gJy4vaHVza3lyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuY29uc3QgbmV3U2V0dGluZ3MgPSB7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdwcmVwYXJlLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgY29tbWFuZHM6IHtcbiAgICAgIGNsZWFudXA6IHtcbiAgICAgICAgZ2xvYjogJyoue2Nqcyxjc3MsY3RzLGh0bSxodG1sLGpzLGpzb24sanNvbjUsanNvbmMsanN4LG1kLG1qcyxtdHMsc2Nzcyx0cyx0c3gsdnVlLHlhbWwseW1sfScsXG4gICAgICAgIHJ1bjogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IHtzdGFnZWRfZmlsZXN9ICYmIGdpdCBhZGQge3N0YWdlZF9maWxlc30nLFxuICAgICAgfSxcbiAgICAgICdjaGVjay1taWdyYXRpb25zJzoge1xuICAgICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICAgIHJ1bjogYFxuaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyB7c3RhZ2VkX2ZpbGVzfTsgdGhlblxuICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlcyAoe3N0YWdlZF9maWxlc30pIGNvbnRhaW4gd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICBleGl0IDFcbmZpXG5gLnRyaW0oKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdjaGVjay5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwcmVQdXNoOiBgYnVuIC0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL3diIHR5cGVjaGVja2AsXG4gIHByZVB1c2hGb3JMYWI6IGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG5idW4gLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vd2IgdHlwZWNoZWNrXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBjb25zdCB7IHR5cGVjaGVjayB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDx0eXBlb2YgbmV3U2V0dGluZ3M+ID0geyAuLi5uZXdTZXR0aW5ncyB9O1xuICBpZiAoIXR5cGVjaGVjaykge1xuICAgIGRlbGV0ZSBzZXR0aW5nc1sncHJlLXB1c2gnXTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAoc2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGlmICh0eXBlY2hlY2spIHtcbiAgICBjb25zdCBwcmVQdXNoID0gY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSA/IHNjcmlwdHMucHJlUHVzaEZvckxhYiA6IHNjcmlwdHMucHJlUHVzaDtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgICBtb2RlOiAwbzc1NSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3Qgc3JjRGlyZWN0b3JpZXMgPSB7XG4gIG5vZGU6IFsnc3JjJywgJ3Rlc3QnLCAnc2NyaXB0cyddLnRvU29ydGVkKCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS50b1NvcnRlZCgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNyY0RpcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ibGl0ejtcbiAgfVxuICByZXR1cm4gc3JjRGlyZWN0b3JpZXMubm9kZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFNyY0RpcnMgfSBmcm9tICcuLi91dGlscy9zcmNEaXJlY3Rvcmllcy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuY2pzJyk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VQcmVmaXggPSBjb25maWcuaXNSb290ID8gJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vJyA6ICdub2RlIC4uLy4uL25vZGVfbW9kdWxlcy8uYmluLyc7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgY29uc3QgZXNsaW50ID0gYFxuICAnJHtnZXRFc2xpbnRLZXkoY29uZmlnKX0nOiBbJHtKU09OLnN0cmluZ2lmeShcbiAgICBgJHtwYWNrYWdlUHJlZml4fWVzbGludCAtLWZpeCR7RXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyl9YFxuICApfSwgJyR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnXSxgO1xuICAgIGxpbmVzLnB1c2goZXNsaW50KTtcbiAgfVxuICBjb25zdCBwYWNrYWdlc0ZpbHRlciA9IGNvbmZpZy5pc1Jvb3QgPyBcIiAmJiAhZmlsZS5pbmNsdWRlcygnL3BhY2thZ2VzLycpXCIgOiAnJztcbiAgbGluZXMucHVzaChgXG4gICcuLyoqLyoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fSc6IGZpbGVzID0+IHtcbiAgICBsZXQgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKSAmJiAhZmlsZS5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykke3BhY2thZ2VzRmlsdGVyfSk7JHtnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWcpfVxuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gW1xcYCR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMuc29tZShmaWxlID0+IGZpbGUuZW5kc1dpdGgoJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnJHtwYWNrYWdlUHJlZml4fXNvcnQtcGFja2FnZS1qc29uJyk7XG4gICAgfVxuICAgIHJldHVybiBjb21tYW5kcztcbiAgfSxcbiAgJy4vKiovbWlncmF0aW9uLnNxbCc6IChmaWxlcykgPT4ge1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpO1xuICAgIGlmIChjb250ZW50LmluY2x1ZGVzKCdXYXJuaW5nczonKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXFxgZWNobyAnISEhIE1pZ3JhdGlvbiBTUUwgZmlsZSAoXFwke3BhdGgucmVsYXRpdmUoJycsIGZpbGUpfSkgY29udGFpbnMgd2FybmluZ3MgISEhIFNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLidcXGAsXG4gICAgICAgICdmYWxzZScsXG4gICAgICBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59LGApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4ve2xpYix0ZXN0LHRlc3RfZHJpdmVyfS8qKi8qLmRhcnQnOiBmaWxlcyA9PiB7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCdnZW5lcmF0ZWQnKSlcbiAgICAgIC5maWx0ZXIoZmlsZSA9PiAhZmlsZS5lbmRzV2l0aCgnLmZyZWV6ZWQuZGFydCcpICYmICFmaWxlLmVuZHNXaXRoKCcuZy5kYXJ0JykpO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBbXFxgZGFydCBmb3JtYXQgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gIH0sYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4vKiovKi5weSc6IFtcbiAgICAncG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMnLFxuICAgICdwb2V0cnkgcnVuIGJsYWNrJyxcbiAgICAncG9ldHJ5IHJ1biBmbGFrZTgnXG4gIF0sYCk7XG4gIH1cblxuICBjb25zdCBuZXdDb250ZW50ID0gYGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG4ke2NvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCA/IFwiY29uc3QgbWljcm9tYXRjaCA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcXG5cIiA6ICcnfVxubW9kdWxlLmV4cG9ydHMgPSB7JHtsaW5lcy5qb2luKCcnKX1cbn07XG5gO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRLZXkoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgZGlycyA9IGdldFNyY0RpcnMoY29uZmlnKS5tYXAoKGRpcikgPT4gYCR7ZGlyfS8qKi9gKTtcbiAgcmV0dXJuIGB7LCR7ZGlycy5qb2luKCcsJyl9fSoueyR7ZXh0ZW5zaW9ucy5lc2xpbnQuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0XG4gICAgPyBgXFxuXG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKSk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IG1pY3JvbWF0Y2gubm90KGZpbHRlcmVkRmlsZXMsICcke2dldEVzbGludEtleShjb25maWcpfScpO1xuICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZXNvbHZlKGZpbGUpKTtgXG4gICAgOiAnJztcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmMoYCR7Y29uZmlnLmRpclBhdGh9Ly5naXRodWIvd29ya2Zsb3dzYCk7XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IChiYWRnZU5hbWVbMF0gfHwgJycpLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBjb25zdCBiYWRnZSA9IGBbIVske2JhZGdlTmFtZX1dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9L2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9KWA7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuZ2l0aHViL3dvcmtmbG93cy8ke2ZpbGVOYW1lfWApKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgYmFkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0QmFkZ2UocmVhZG1lOiBzdHJpbmcsIGJhZGdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDml6LjgatiYWRnZeOBjOOBguOCi+WgtOWQiOOBr+WJiumZpFxuICByZWFkbWUgPSByZWFkbWUucmVwbGFjZShiYWRnZSwgJycpLnJlcGxhY2VBbGwoL1xcblxcblxcbisvZywgJ1xcblxcbicpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVhZG1lLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlYWRtZVtpIC0gMV0gPT09ICdcXG4nICYmIHJlYWRtZVtpXSA9PT0gJ1xcbicpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHJlYWRtZS5zbGljZSgwLCBpICsgMSk7XG4gICAgICBsZXQgYWZ0ZXIgPSByZWFkbWUuc2xpY2UoaSArIDEpO1xuICAgICAgaWYgKCFhZnRlci5zdGFydHNXaXRoKCdbJykgJiYgIWFmdGVyLnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICBhZnRlciA9IGBcXG4ke2FmdGVyfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7YmVmb3JlfSR7YmFkZ2V9XFxuJHthZnRlcn1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7cmVhZG1lfVxcbiR7YmFkZ2V9XFxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIHVua25vd25dKVtdO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW4gPSBBcnJheS5pc0FycmF5KHBsdWdpbnNbaV0pID8gcGx1Z2luc1tpXT8uWzBdIDogcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChBcnJheS5pc0FycmF5KHBsdWdpbnNbaV0pICYmIHBsdWdpbnNbaV0/LlsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICAvLyBSZW1vdmUgZGVwcmVjYXRlZCBzdWNjZXNzQ29tbWVudCBhbmQgZmFpbENvbW1lbnQgcHJvcGVydGllcyBmcm9tIG9sZENvbmZpZ1xuICAgICAgICBjb25zdCB7IGZhaWxDb21tZW50OiBfMSwgc3VjY2Vzc0NvbW1lbnQ6IF8yLCAuLi5jbGVhbk9sZENvbmZpZyB9ID0gb2xkQ29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgY2xlYW5PbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFsnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbjUnXSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSB0eXBlb2YganNvbk9iaiAmIHsgcGFja2FnZVJ1bGVzPzogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXSB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSAnQHdpbGxib29zdGVyJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdXBncmFkZSBOZXh0LmpzIGF1dG9tYXRpY2FsbHlcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzID8/PSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgIW5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5zb21lKChydWxlOiB7IG1hdGNoUGFja2FnZU5hbWVzPzogc3RyaW5nW10gfSkgPT5cbiAgICAgICAgICBydWxlLm1hdGNoUGFja2FnZU5hbWVzPy5pbmNsdWRlcygnbmV4dCcpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMucHVzaCh7IG1hdGNoUGFja2FnZU5hbWVzOiBbJ25leHQnXSwgZW5hYmxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kZXBlbmRhYm90JyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVub3ZhdGVyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCByb290SnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgdGFyZ2V0OiAnRVMyMDIyJywgLy8gYmVjYXVzZSBkZWNvcmF0b3JzIHNob3VsZCBiZSB0cmFuc3BpbGVkIHRvIEVTMjAyMiBvbiBOb2RlLmpzXG4gICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZScsXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgc2tpcExpYkNoZWNrOiB0cnVlLCAvLyBiZWNhdXNlIGxpYnJhcmllcyBtYXkgaGF2ZSBicm9rZW4gdHlwZXNcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIGVyYXNhYmxlU3ludGF4T25seTogdHJ1ZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgICB0eXBlUm9vdHM6IFsnLi9ub2RlX21vZHVsZXMvQHR5cGVzJywgJy4vQHR5cGVzJ10sXG4gIH0sXG4gIGV4Y2x1ZGU6IFsncGFja2FnZXMvKi90ZXN0L2ZpeHR1cmVzJywgJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogW1xuICAgICdwYWNrYWdlcy8qL3NjcmlwdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc3JjLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3Rlc3QvKiovKicsXG4gICAgJ3NjcmlwdHMvKiovKicsXG4gICAgJ3NyYy8qKi8qJyxcbiAgICAndGVzdC8qKi8qJyxcbiAgXSxcbn07XG5cbmNvbnN0IHN1Ykpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIHRhcmdldDogJ0VTMjAyMicsIC8vIGJlY2F1c2UgZGVjb3JhdG9ycyBzaG91bGQgYmUgdHJhbnNwaWxlZCB0byBFUzIwMjIgb24gTm9kZS5qc1xuICAgIG1vZHVsZTogJ0VTTmV4dCcsXG4gICAgbW9kdWxlUmVzb2x1dGlvbjogJ05vZGUnLFxuICAgIGpzeDogJ3JlYWN0LWpzeCcsXG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBlcmFzYWJsZVN5bnRheE9ubHk6IHRydWUsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4uLy4uL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi4vLi4vQHR5cGVzJywgJy4vQHR5cGVzJ10sXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSByZXR1cm47XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgICAgbmV3U2V0dGluZ3MuZXhjbHVkZSA9IG5ld1NldHRpbmdzLmV4Y2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLFxuICAgICAgICBtb2R1bGU6ICdOb2RlTmV4dCcsXG4gICAgICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlTmV4dCcsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICAgIGlmIChvbGRTZXR0aW5ncy5leHRlbmRzID09PSAnLi9ub2RlX21vZHVsZXMvQHdpbGxib29zdGVyL3RzY29uZmlnL3RzY29uZmlnLmpzb24nKSB7XG4gICAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgbW9kaWZ5IFwidGFyZ2V0XCIsIFwibW9kdWxlXCIgYW5kIFwibW9kdWxlUmVzb2x1dGlvblwiLlxuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udGFyZ2V0O1xuICAgICAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZTtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ubW9kdWxlUmVzb2x1dGlvbjtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICB9XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG50eXBlIFNldHRpbmdzID0ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgbnBtTWluaW1hbEFnZUdhdGU/OiBzdHJpbmc7XG4gIG5wbVByZWFwcHJvdmVkUGFja2FnZXM/OiBzdHJpbmdbXTtcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufSAmIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPjtcblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGdldE1ham9yTnVtYmVyKGN1cnJlbnRWZXJzaW9uKSA8PSBnZXRNYWpvck51bWJlcihsYXRlc3RWZXJzaW9uKSAmJiBjdXJyZW50VmVyc2lvbiAhPT0gbGF0ZXN0VmVyc2lvbikge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0geWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzO1xuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgc2V0dGluZ3MubnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuICAgIHNldHRpbmdzLm5wbVByZWFwcHJvdmVkUGFja2FnZXMgPSBbXG4gICAgICAnQGV4ZXJjb2RlL3Byb2JsZW0tdXRpbHMnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9iYWJlbC1jb25maWdzJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsXG4gICAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsXG4gICAgICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gICAgICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInLFxuICAgICAgJ0B3aWxsYm9vc3Rlci93YicsXG4gICAgICAvLyBUbyBkZWFsIHdpdGggQ1ZFIGxpa2UgaHR0cHM6Ly9uZXh0anMub3JnL2Jsb2cvQ1ZFLTIwMjUtNjY0NzhcbiAgICAgICduZXh0JyxcbiAgICAgICdAbmV4dC8qJyxcbiAgICAgICdyZWFjdCcsXG4gICAgICAncmVhY3QtZG9tJyxcbiAgICBdO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb25zSnNvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9ucycsICctLWpzb24nXSwgZGlyUGF0aCk7XG4gIGNvbnN0IHZlcnNpb25zID0gSlNPTi5wYXJzZSh2ZXJzaW9uc0pzb24pIGFzIHN0cmluZ1tdO1xuICByZXR1cm4gdmVyc2lvbnMuYXQoLTEpIGFzIHN0cmluZztcbn1cbmZ1bmN0aW9uIGdldE1ham9yTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IFttYWpvcl0gPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiBOdW1iZXIobWFqb3IpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1hbGwgOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY2xhdWRlIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNvZGV4IDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWdlbWluaSA6cm9ib3Q6JywgJzAwQjREOCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdsbG0tcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdhaS1wciA6cm9ib3Q6Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQteC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAqL1xuXG5pbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgc29kaXVtIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IERFUFJFQ0FURURfU0VDUkVUX05BTUVTID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJywgJ0dIX0JPVF9QQVQnLCAnUFVCTElDX0dIX0JPVF9QQVQnXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKCkucGFyc2VkID8/IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBhd2FpdCBzb2RpdW0ucmVhZHk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNlY3JldF0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQidcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IFNlY3JldCAmIEJhc2U2NCBrZXkgdG8gVWludDhBcnJheS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID0gc29kaXVtLmZyb21fYmFzZTY0KGtleSwgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG4gICAgICAgIGNvbnN0IHJhd1NlYyA9IHNvZGl1bS5mcm9tX3N0cmluZyhzZWNyZXQpO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIHNlY3JldCB1c2luZyBMaWJTb2RpdW1cbiAgICAgICAgY29uc3QgZW5jQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKHJhd1NlYywgcmF3S2V5KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGVuY3J5cHRlZCBVaW50OEFycmF5IHRvIEJhc2U2NFxuICAgICAgICBjb25zdCBlbmNCYXNlNjQgPSBzb2RpdW0udG9fYmFzZTY0KGVuY0J5dGVzLCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcblxuICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgc2VjcmV0X25hbWU6IG5hbWUsXG4gICAgICAgICAgZW5jcnlwdGVkX3ZhbHVlOiBlbmNCYXNlNjQsXG4gICAgICAgICAga2V5X2lkOiBrZXlJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFNlY3JldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgLy8gQWRtaW5pc3RyYXRpb24gcGVybWlzc2lvblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgfSxcbiAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuIyMgU2VsZiBDaGVja1xuXG4tIFsgXSBJJ3ZlIGNvbmZpcm1lZCBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIG9uIHRoaXMgcGFnZS5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gIC0gUFIgdGl0bGUgZG9lc24ndCBoYXZlIFxcYFdJUDpcXGAuXG4gIC0gVGhlIHRlc3QgY29tbWFuZCAoZS5nLiwgXFxgeWFybiB0ZXN0XFxgKSBwYXNzZWQuXG4gIC0gVGhlIGxpbnQgY29tbWFuZCAoZS5nLiwgXFxgeWFybiBsaW50XFxgKSBwYXNzZWQuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgZHVlIHRvIGxvbmcgd29ya2Zsb3dzLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIHRoZSBHaXRIdWIgZGlmZiB2aWV3LlxuLSBbIF0gSSd2ZSB3cml0dGVuIHRoZSBzdGVwcyB0byB0ZXN0IG15IGNoYW5nZXMuXG4tIFsgXSBJJ3ZlIGFkZGVkIHNjcmVlbnNob3RzIChpZiB0aGUgVUkgY2hhbmdlZCkuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlKG9sZENvbnRlbnQsIG5ld0NvbnRlbnQpID4gbmV3Q29udGVudC5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IHNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRUb29sVmVyc2lvbnNDb250ZW50IH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0J1bjogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLy8gZGVwZW5kZW5jeSBpbmZvcm1hdGlvblxuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgLy8gc291cmNlIGNvZGUgZmlsZXNcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGhhc1N0YXJ0VGVzdDogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgZXNsaW50QmFzZT86IEVzbGludEV4dGVuc2lvbkJhc2U7XG4gIHZlcnNpb25zVGV4dD86IHN0cmluZztcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcGx1Z2lucz86IHN0cmluZ1tdW107XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzID8/IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgPz8gW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IHZlcnNpb25zVGV4dCA9IGdldFRvb2xWZXJzaW9uc0NvbnRlbnQoZGlyUGF0aCk/LnRyaW0oKSA/PyAnJztcbiAgICBmb3IgKGNvbnN0IFtwcmVmaXgsIG5hbWVdIG9mIFtcbiAgICAgIFsnamF2YScsICdqYXZhJ10sXG4gICAgICBbJ25vZGUnLCAnbm9kZWpzJ10sXG4gICAgICBbJ3B5dGhvbicsICdweXRob24nXSxcbiAgICBdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBub2RlVmVyc2lvbkNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKHZlcnNpb25zVGV4dCkge1xuICAgICAgICAgIHZlcnNpb25zVGV4dCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB2ZXJzaW9uc1RleHQgKz0gYCR7bmFtZX0gJHtub2RlVmVyc2lvbkNvbnRlbnQudHJpbSgpfWA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0Z1bGxOYW1lID8gYGdpdGh1Yjoke3JlcG9GdWxsTmFtZX1gIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bmZpZy50b21sJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcyhgJHtwYXRoLnNlcH13aWxsYm9vc3Rlci1jb25maWdzYCksXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbkdvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGhhc1N0YXJ0VGVzdDogISFwYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3QnXSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXMuYmxpdHosXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucHJpc21hLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llcy5weXJpZ2h0LFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgdmVyc2lvbnNUZXh0LFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25maWcuZXNsaW50QmFzZSA9IGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWxcbiAgICApIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KS5sZW5ndGggPiAwO1xufVxuXG5leHBvcnQgdHlwZSBFc2xpbnRFeHRlbnNpb25CYXNlID1cbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuXG5mdW5jdGlvbiBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IEVzbGludEV4dGVuc2lvbkJhc2UgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JztcbiAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ID8gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyA6ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoZGlyUGF0aCk7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgY29uc3QgcmVtb3RlVXJsID0gb3JpZ2luPy5yZWZzLmZldGNoID8/IG9yaWdpbj8ucmVmcy5wdXNoO1xuICBpZiAodHlwZW9mIHJlbW90ZVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICBjb25zdCByZXQgPSB7IGZ1bGxfbmFtZTogYCR7b3JnfS8ke25hbWV9YCB9O1xuICB0cnkge1xuICAgIC8vIE1ldGFkYXRhIHBlcm1pc3Npb25cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQoKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihyZXQsIHJlc3BvbnNlLmRhdGEpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBFU0xJTlRfQ09ORklHX1BSRUZJWCA9ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy0nO1xuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiYgY29uZmlnLnBhY2thZ2VKc29uPy5uYW1lPy5zdGFydHNXaXRoKEVTTElOVF9DT05GSUdfUFJFRklYKSA9PT0gdHJ1ZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhEb2NrZXJmaWxlIH0gZnJvbSAnLi9maXhlcnMvZG9ja2VyZmlsZS5qcyc7XG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRvb2xWZXJzaW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hc2RmLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQmlvbWVKc29uYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9iaW9tZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFc2xpbnRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lc2xpbnRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlbW92ZUdlbWluaVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2h1c2t5cmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRzY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3RzY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlWWFybnJjWW1sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3lhcm5yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwU2VjcmV0cyB9IGZyb20gJy4vZ2l0aHViL3NlY3JldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VDb25maWcgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlIH0gZnJvbSAnLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZW52OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzZWNyZXRzIHRvIEdpdEh1YicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZScsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdTa2lwIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCB0b29scyB2aWEgYXNkZiBhdCBmaXJzdFxuICAgIGF3YWl0IGdlbmVyYXRlVG9vbFZlcnNpb25zKHJvb3RDb25maWcpO1xuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeERvY2tlcmZpbGUocm9vdENvbmZpZyksXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICAuLi4oc2hvdWxkUnVuV29ya2Zsb3dzID8gW2dlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIHJvb3RDb25maWcuaXNCdW5cbiAgICAgICAgPyBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLnRoZW4oKCkgPT4gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZykpXG4gICAgICAgIDogZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlKGNvbmZpZykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBhcmd2LnNraXBEZXBzKTtcblxuICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWcpKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24gJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgICAgICkge1xuICAgICAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVFc2xpbnRyYyhjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgZnMucm1TeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ2J1bi5sb2NrJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsndXBkYXRlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnMucm1TeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnLCAnLS1uby1pbW11dGFibGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gICAgLy8gJ3lhcm4gaW5zdGFsbCcgc2hvdWxkIGJlIGFmdGVyIGB5YXJuIGNsZWFudXBgIGJlY2F1c2UgeWFybiBiZXJyeSBnZW5lcmF0ZXMgeWFybi5sb2NrXG4gICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgY29udGVudHMgb2YgZGVwZW5kYW50IHN1Yi1wYWNrYWdlIGluIG1vbm9yZXBvXG4gICAgaWYgKCFyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCcsICctLW5vLWltbXV0YWJsZSddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJvcHRpb25zIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsImVycm9yIiwiRXJyb3IiLCJzdGFjayIsIlN0cmluZyIsImFzeW5jIiwiZml4RG9ja2VyZmlsZSIsImNvbmZpZyIsImRvZXNDb250YWluRG9ja2VyZmlsZSIsIm9sZENvbnRlbnQiLCJkb2NrZXJmaWxlIiwibmV3Q29udGVudCIsImZzIiwid3JpdGVGaWxlIiwicGF0aCIsImpvaW4iLCJkaXJQYXRoIiwiZnNVdGlsIiwicmVhZEZpbGVJZ25vcmluZ0Vycm9yIiwiZmlsZVBhdGgiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwiZ2VuZXJhdGVGaWxlIiwiY29udGVudCIsIm1rZGlyIiwiZGlybmFtZSIsInJlY3Vyc2l2ZSIsIm5vcm1hbGl6ZWRDb250ZW50IiwicmVwbGFjZUFsbCIsInRyaW0iLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZml4TmV4dENvbmZpZ0pzb24iLCJtYXAiLCJleHQiLCJyZXNvbHZlIiwiZmluZCIsInAiLCJleGlzdHNTeW5jIiwicmVwbGFjZSIsIl8iLCJzZXR0aW5nc1RleHQiLCJpbmNsdWRlcyIsInJ1biIsImxpdGVyYWwiLCJ2YWx1ZSIsImtpbmQiLCJhc09iamVjdCIsImRlZmF1bHRDb25maWciLCJmb3JiaWRPbmx5IiwicmV0cmllcyIsInVzZSIsImJhc2VVUkwiLCJ0cmFjZSIsInNjcmVlbnNob3QiLCJ2aWRlbyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwidGltZW91dCIsInN0ZG91dCIsInN0ZGVyciIsImVudiIsImdyYWNlZnVsU2h1dGRvd24iLCJmaXhQbGF5d3JpZ2h0Q29uZmlnIiwibWF0Y2giLCJleGVjIiwib2JqZWN0TGl0ZXJhbCIsInBhcnNlZCIsInNvdXJjZSIsInRzIiwiY3JlYXRlU291cmNlRmlsZSIsIlNjcmlwdFRhcmdldCIsIkxhdGVzdCIsIlNjcmlwdEtpbmQiLCJUUyIsInN0YXRlbWVudCIsInN0YXRlbWVudHMiLCJpc1ZhcmlhYmxlU3RhdGVtZW50IiwiZGVjbGFyYXRpb24iLCJkZWNsYXJhdGlvbkxpc3QiLCJkZWNsYXJhdGlvbnMiLCJpbml0aWFsaXplciIsImlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uIiwicGFyc2VPYmplY3RMaXRlcmFsIiwibmV3T2JqZWN0TGl0ZXJhbCIsInN0cmluZ2lmeU9iamVjdCIsIm1lcmdlIiwiYWxsIiwicHJvcGVydHkiLCJwcm9wZXJ0aWVzIiwiaXNQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc0lkZW50aWZpZXIiLCJpc1N0cmluZ0xpdGVyYWwiLCJwYXJzZUV4cHJlc3Npb24iLCJ1bmRlZmluZWQiLCJnZXRUZXh0IiwiZXhwcmVzc2lvbiIsInBhcnNlZE9iamVjdCIsImlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbiIsImVsZW1lbnRzIiwiZWxlbWVudCIsInNvbWUiLCJzdHJpbmdpZnlWYWx1ZSIsImxldmVsIiwidmFsdWVzIiwibGVuZ3RoIiwiaW5kZW50IiwicmVwZWF0IiwibGluZXMiLCJzdHJpbmdpZmllZCIsInNwbGl0IiwiYXQiLCJpbmRleCIsImNsb3NpbmdJbmRlbnQiLCJzdHJpbmdpZnlBcnJheSIsIm9iamVjdCIsIk9iamVjdCIsImVudHJpZXMiLCJrZXkiLCJnbG9iSWdub3JlIiwiZml4UHJpc21hRW52RmlsZXMiLCJlbnZGaWxlcyIsImZnIiwiZ2xvYiIsImRvdCIsImN3ZCIsImlnbm9yZSIsImVudkZpbGUiLCJlbnZGaWxlUGF0aCIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJQcm9taXNlIiwibmV3VGVzdERpclBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm9sZFRlc3REaXJOYW1lIiwib2xkVGVzdERpclBhdGgiLCJyZW5hbWUiLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMiLCJkaXJlbnRzIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsImRpcmVudCIsImRpck5hbWUiLCJzbGljZSIsImhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiIsImVuZHNXaXRoIiwicGFja2FnZU5hbWUiLCJoYXNMaWJyYXJ5IiwicGFja2FnZUpzb24iLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJpc0ZpbGUiLCJpc0RpcmVjdG9yeSIsIm92ZXJ3cml0ZU1lcmdlIiwiZGVzdGluYXRpb25BcnJheSIsInNvdXJjZUFycmF5IiwiY29tYmluZU1lcmdlIiwidGFyZ2V0IiwiZGVzdGluYXRpb24iLCJpdGVtIiwiY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQiLCJpc01lcmdlYWJsZU9iamVjdCIsInB1c2giLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsInRvU29ydGVkIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwicHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyIsIm9uIiwicHVsbF9yZXF1ZXN0IiwiYnJhbmNoZXMiLCJwZXJtaXNzaW9ucyIsImNvbnRlbnRzIiwiY29uY3VycmVuY3kiLCJncm91cCIsImpvYnMiLCJhdXRvZml4IiwicHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3ciLCJ1c2VzIiwid29ya2Zsb3dzIiwidGVzdCIsInJlbGVhc2UiLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwiaWYiLCJ3aXRoIiwic2VjcmV0cyIsIkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIiwiT1BFTkFJX0FQSV9LRVkiLCJHRU1JTklfQVBJX0tFWSIsImdlbmVyYXRlV29ya2Zsb3dzIiwicm9vdENvbmZpZyIsImZpbGVOYW1lc1RvQmVSZW1vdmVkIiwiaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8iLCJyZXBvc2l0b3J5Iiwid29ya2Zsb3dzUGF0aCIsInNlbWFudGljWW1sUGF0aCIsInJtIiwiZm9yY2UiLCJmaWxlTmFtZVNldCIsIlNldCIsImZpbHRlciIsImRlcGVuZGluZyIsInNlbWFudGljUmVsZWFzZSIsImFkZCIsImRlbGV0ZSIsImZpbGVOYW1lIiwiYmFzZW5hbWUiLCJ3cml0ZVdvcmtmbG93WWFtbCIsImRlcHJlY2F0ZWRGaWxlTmFtZSIsImRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyIsIndyaXRlWWFtbCIsImlzUHVibGljUmVwbyIsImNsb25lRGVlcCIsInBhY2thZ2VNYW5hZ2VyIiwiaXNCdW4iLCJzdGVwcyIsInNjcmlwdHMiLCJidWlsZCIsImF1dG9maXhXb3JrZmxvdyIsImF1dG9maXhKb2IiLCJnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyIsIm5ld1NldHRpbmdzIiwib2xkU2V0dGluZ3MiLCJ5YW1sIiwibG9hZCIsImFycmF5TWVyZ2UiLCJzdGFydHNXaXRoIiwibW92ZVRvQm90dG9tIiwiYWN0aW9ucyIsInRyaWdnZXJfZGVwbG95X3dvcmtmbG93IiwiaXNSZXVzYWJsZVdvcmtmbG93Iiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJtaWdyYXRlV29ya2Zsb3ciLCJwYXJhbXMiLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJ3b3JrZmxvd19kaXNwYXRjaCIsIk5QTV9UT0tFTiIsIkdIX1RPS0VOIiwiRklSRUJBU0VfVE9LRU4iLCJHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIiwiRElTQ09SRF9XRUJIT09LX1VSTCIsInNlcnZlcl91cmwiLCJkb3RfZW52X3BhdGgiLCJub25fc2VsZl9ob3N0ZWQiLCJub3RpZnlfZGlzY29yZCIsInJlcXVpcmVfZmx5IiwicmVxdWlyZV9nY2xvdWQiLCJsYWJlbCIsImxhYmVsT3BlcmF0b3IiLCJjaV9zaXplIiwiY2lfbGFiZWwiLCJtaWdyYXRlSm9iIiwiRkxZX0FQSV9UT0tFTiIsImRlcGxveV9jb21tYW5kIiwiZ2l0aHViX2hvc3RlZF9ydW5uZXIiLCJrZXlzIiwibmV3U2VjcmV0cyIsInlhbWxUZXh0IiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsImZpeFR5cG9zIiwicGFja2FnZUNvbmZpZyIsImRvY0ZpbGVzIiwibWRGaWxlIiwiZml4VHlwb3NJblRleHQiLCJyZXBsYWNlV2l0aENvbmZpZyIsInRzRmlsZXMiLCJ0c0ZpbGUiLCJmaXhUeXBvc0luQ29kZSIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwid2JmeUpzb24iLCJ0eXBvcyIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMiLCJhbGxDb25maWdzIiwiYWdlbnRzRXh0cmFQYXRoIiwiZXh0cmFDb250ZW50IiwidG9vbE5hbWUiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24iLCJjdXJzb3JSdWxlc1BhdGgiLCJjdXJzb3JSdWxlc0NvbnRlbnQiLCJmcm9udG1hdHRlciIsImJvZHkiLCJnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50IiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImlzV2lsbEJvb3N0ZXJSZXBvIiwicmVwb0F1dGhvciIsInJlcG9OYW1lIiwiYyIsImdlbkkxOG5UcyIsInJlYWN0IiwibmV4dCIsInRyaW1FbmQiLCJnaXRIdWJVdGlsIiwiZ2V0T3JnQW5kTmFtZSIsInVybE9yRnVsbE5hbWUiLCJ1cmxXaXRob3V0UHJvdG9jb2wiLCJuYW1lcyIsIm9jdG9raXRDYWNoZSIsIk1hcCIsImdldE9jdG9raXQiLCJvd25lciIsImNhY2hlZCIsImdldCIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdldEdpdEh1YlRva2VuIiwic2V0IiwiaGFzR2l0SHViVG9rZW4iLCJwcm9jZXNzIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIiLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiIsIkdJVEhVQl9UT0tFTiIsImluc3RhbGxlZEx0c05vZGVqcyIsInRvb2xWZXJzaW9uc0NhY2hlIiwic3Bhd25TeW5jIiwiYXJncyIsInJldHJ5IiwibmV3Q21kIiwibmV3QXJncyIsImdldFNwYXduU3luY0FyZ3MiLCJjaGlsZF9wcm9jZXNzIiwic3RhdHVzIiwic3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0Iiwic3RkaW8iLCJwcm9jIiwidG9TdHJpbmciLCJzIiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJhc2RmRGlyIiwiQVNERl9ESVIiLCJvcyIsImhvbWVkaXIiLCJhc2RmUGF0aHMiLCJjdXJyZW50UGF0aHMiLCJ0b29sVmVyc2lvbnMiLCJnZXRUb29sVmVyc2lvbnNDb250ZW50IiwiaGFzTm9kZUVudHJ5IiwibGluZSIsIkFTREZfTk9ERUpTX1ZFUlNJT04iLCJlbmNvZGluZyIsInNoZWxsIiwiaGFzIiwidG9vbFZlcnNpb25zUGF0aCIsImN1cnJlbnQiLCJjYW5kaWRhdGUiLCJwYXJlbnQiLCJmaW5kVG9vbFZlcnNpb25zUGF0aCIsInJlYWRGaWxlU3luYyIsImNvbnZlcnRWZXJzaW9uSW50b051bWJlciIsInZlcnNpb24iLCJudW1iZXJzIiwiTnVtYmVyIiwibnVtIiwiaXNOYU4iLCJ2ZXJzaW9uTnVtYmVyIiwiZGl2aXNvciIsIlBZVEhPTl9WRVJTSU9OIiwiSkFWQV9WRVJTSU9OIiwiZ2VuZXJhdGVUb29sVmVyc2lvbnMiLCJ2ZXJzaW9uc1RleHQiLCJkdXBsaWNhdGFibGVMaW5lcyIsIkNPUkVfVE9PTFMiLCJkb2VzQ29udGFpblBvZXRyeUxvY2siLCJyZXNwb25zZSIsImZldGNoIiwianNvbiIsInBvZXRyeVZlcnNpb24iLCJ1cGRhdGVWZXJzaW9uIiwiZmlyZWJhc2UiLCJkb2VzQ29udGFpblBhY2thZ2VKc29uIiwiYnVuVmVyc2lvbiIsIm9yZ2FuaXphdGlvbiIsInJlcXVlc3QiLCJyZXBvIiwiZGF0YSIsInRhZ19uYW1lIiwibGFzdEluZGV4T2YiLCJ2ZXJzaW9uTnVtYmVyVGV4dCIsImdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIiLCJwcmVmaXgiLCJERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMiLCJ2ZXJzaW9uUGF0aCIsImNvcmUiLCJuZXdWZXJzaW9uIiwiaGVhZCIsImZpbmRJbmRleCIsImwiLCJuZXdMaW5lIiwic3BsaWNlIiwiZ2VuZXJhdGVCaW9tZUpzb25jIiwicm9vdCIsIiRzY2hlbWEiLCJleHRlbmRzIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwibmV3Q29udGVudFdpdGhFeGFjdFRydWUiLCJuZXdDb250ZW50V2l0aEV4YWN0RmFsc2UiLCJnZW5lcmF0ZUJ1bmZpZ1RvbWwiLCJ1c2VyQ29udGVudEhlYWRlciIsInVzZXJDb250ZW50SGVhZGVyUmVnZXgiLCJzZXBhcmF0b3IiLCJkZWZhdWx0SGVhZFVzZXJDb250ZW50IiwiZGVmYXVsdFRhaWxVc2VyQ29udGVudCIsImlnbm9yZUZpbGVVdGlsIiwic2VwYXJhdG9yUHJlZml4IiwicmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzIiwibGFzdEhlYWRlckluZGV4IiwiZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlciIsImdldEhlYWRVc2VyQ29udGVudCIsImluZGV4T2YiLCJ0aGlzIiwiZ2V0VGFpbFVzZXJDb250ZW50IiwiaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZCIsImxhc3RJbmRleCIsImdlbmVyYXRlRG9ja2VyaWdub3JlIiwiZXh0ZW5zaW9ucyIsImNvZGVXaXRoMkluZGVudFNpemUiLCJjb2RlV2l0aDRJbmRlbnRTaXplIiwibWFya2Rvd25MaWtlIiwiZXNsaW50IiwicHJldHRpZXIiLCJiaW9tZSIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImdlbmVyYXRlRWRpdG9yY29uZmlnIiwiZ2VuZXJhdGVFc2xpbnRyYyIsImVzbGludEJhc2UiLCJoYXZlX2Z1biIsImNvZGVfcmV2aWV3IiwiZGlzYWJsZSIsImNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkIiwibWF4X3Jldmlld19jb21tZW50cyIsInB1bGxfcmVxdWVzdF9vcGVuZWQiLCJoZWxwIiwic3VtbWFyeSIsImlnbm9yZV9wYXR0ZXJucyIsImdlbmVyYXRlR2VtaW5pQ29uZmlnIiwiY29uZmlnRmlsZVBhdGgiLCJzdHlsZWd1aWRlRmlsZVBhdGgiLCJuZXdDb25maWciLCJvbGRDb25maWciLCJ5YW1sQ29udGVudCIsInJlbW92ZUdlbWluaVNldHRpbmdzIiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJoZWFkVXNlckNvbnRlbnQiLCJ0YWlsVXNlckNvbnRlbnQiLCJkb2VzQ29udGFpbkdlbWZpbGUiLCJkb2VzQ29udGFpbkdvTW9kIiwiZG9lc0NvbnRhaW5Qb21YbWwiLCJkb2VzQ29udGFpblB1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwiLCJibGl0eiIsInByaXNtYSIsInBsYXl3cmlnaHRUZXN0IiwicmVhY3ROYXRpdmUiLCJzdG9yeWJvb2siLCJsaXRlc3RyZWFtIiwiZ2VuZXJhdGVkIiwicmVhZENhY2hlIiwicmVzcG9uc2VUZXh0IiwidGV4dCIsIm9rIiwid3JpdGVDYWNoZSIsInN0YXQiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsImdldExhdGVzdENvbW1pdEhhc2giLCJyZXBvVXJsIiwiY29tbWl0SGFzaCIsInJlamVjdCIsIkVzbGludFV0aWwiLCJnZXRMaW50Rml4U3VmZml4IiwiZG9lc0NvbnRhaW5Kc3hPclRzeCIsImpzQ29tbW9uRGVwcyIsInRzQ29tbW9uRGVwcyIsInJlYWN0Q29tbW9uRGVwcyIsImVzbGludERlcHMiLCJnZW5lcmF0ZVBhY2thZ2VKc29uIiwic2tpcEFkZGluZ0RlcHMiLCJqc29uVGV4dCIsImpzb25PYmoiLCJwZWVyRGVwZW5kZW5jaWVzIiwiYXV0aG9yIiwidHNsaWIiLCJsZXJuYSIsInBpbnN0IiwicmVtb3ZlRGVwcmVjYXRlZFN0dWZmIiwiZ2VuZXJhdGVTY3JpcHRzIiwicHJldHRpZnkiLCJleGlzdGluZ0NvbnRlbnQiLCJvcmlnaW5hbENvbnRlbnQiLCJnZW5lcmF0ZVByZXR0aWVyU3VmZml4IiwicG9ldHJ5RGV2RGVwZW5kZW5jaWVzIiwiaHVza3kiLCJwcmVwYXJlIiwicG9zdGluc3RhbGwiLCJpc1JlZmVycmVkQnlPdGhlclJlcG8iLCJwcmVwYWNrIiwicG9zdHBhY2siLCJhcnRpbGxlcnkiLCJwbGF5d3JpZ2h0Iiwid29ya3NwYWNlcyIsIkFycmF5IiwiaXNBcnJheSIsIndvcmtzcGFjZSIsImdsb2JTeW5jIiwid2IiLCJkb2VzQ29udGFpbkphdmFTY3JpcHQiLCJkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5UeXBlU2NyaXB0IiwiZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcyIsIm1pY3JvbWF0Y2giLCJpc1dpbGxCb29zdGVyQ29uZmlncyIsImRlcCIsInByaXZhdGUiLCJsaWNlbnNlIiwicHVibGlzaENvbmZpZyIsImFjY2VzcyIsIm1haW4iLCJyZXNvbHV0aW9ucyIsImxpbnQiLCJzY3JpcHROYW1lIiwic2NyaXB0IiwiZGlycyIsImRpciIsImZvcm1hdCIsInB5dGhvbkZpbGVzIiwiZGlyTmFtZVNldCIsInB5dGhvbkZpbGUiLCJmaXJzdCIsInNlY29uZCIsInNpemUiLCJkaXJOYW1lc1N0ciIsInBhY2thZ2VOYW1lcyIsImlzV29ya3NwYWNlUGFja2FnZSIsInVwZGF0ZVByaXZhdGVQYWNrYWdlcyIsIm5ld0pzb25UZXh0Iiwib2xkQW5kTmV3U2NyaXB0TmFtZXMiLCJvbGROYW1lIiwibmV3TmFtZSIsImZpbGVzIiwiZml4U2NyaXB0TmFtZXMiLCJvbGRTY3JpcHRzIiwiaGFzVHlwZWNoZWNrIiwiY2xlYW51cCIsInR5cGVjaGVjayIsIm9sZFRlc3QiLCJweXJpZ2h0IiwicHJlQ29tbWl0IiwicHJlUHVzaCIsInByZVB1c2hGb3JMYWIiLCJwcmVQdXNoRm9yTGFiRXhjZXB0QWRtaW4iLCJwb3N0TWVyZ2UiLCJnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uIiwicGFja2FnZUpzb25QYXRoIiwicG9zdHB1Ymxpc2giLCJwcmVwdWJsaXNoT25seSIsInByZUNvbW1pdEZpbGVQYXRoIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJtb2RlIiwicG9zdE1lcmdlQ29tbWFuZCIsImdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMiLCJwb3N0TWVyZ2VDb21tYW5kcyIsInJhdyIsImluc3RhbGxDb21tYW5kIiwicm1OZXh0RGlyZWN0b3J5IiwiY3JlYXRlVGFza09wdGlvbnMiLCJydW5uZXIiLCJleHRlbnNpb24iLCJwcmV0dGllckNvbnRlbnQiLCJiaW9tZUNvbnRlbnQiLCJnZW5lcmF0ZUlkZWFTZXR0aW5ncyIsImNvbW1hbmRzIiwiZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24iLCJzZXR0aW5ncyIsIm1rZGlyU3luYyIsInNyY0RpcmVjdG9yaWVzIiwibm9kZSIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwicGFja2FnZVByZWZpeCIsImdldEVzbGludEtleSIsInBhY2thZ2VzRmlsdGVyIiwiZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIiLCJnZXRTcmNEaXJzIiwiZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSIsImdpdGlnbm9yZUZpbGVQYXRoIiwiZ2l0aWdub3JlQ29udGVudCIsImFkZGl0aW9uYWxDb250ZW50IiwidmVudlBhdGgiLCJ2ZW52IiwiZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiIsImdlbmVyYXRlUmVhZG1lIiwiaW5zZXJ0QmFkZ2UiLCJmaWxlTmFtZXMiLCJyZWFkZGlyU3luYyIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwiYmFkZ2UiLCJyZWFkbWUiLCJpIiwiZ2VuZXJhdGVSZWxlYXNlcmMiLCJwbHVnaW5zIiwicGx1Z2luIiwicHJlc2V0IiwiZmFpbENvbW1lbnQiLCJfMSIsInN1Y2Nlc3NDb21tZW50IiwiXzIiLCJjbGVhbk9sZENvbmZpZyIsInN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uIiwiZmFpbENvbW1lbnRDb25kaXRpb24iLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsImdlbmVyYXRlUmVub3ZhdGVKc29uIiwicGFja2FnZVJ1bGVzIiwicnVsZSIsIm1hdGNoUGFja2FnZU5hbWVzIiwiZW5hYmxlZCIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwibW9kdWxlIiwibW9kdWxlUmVzb2x1dGlvbiIsImpzeCIsImFsd2F5c1N0cmljdCIsInN0cmljdCIsIm5vVW5jaGVja2VkSW5kZXhlZEFjY2VzcyIsInNraXBMaWJDaGVjayIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsInNvdXJjZU1hcCIsImltcG9ydEhlbHBlcnMiLCJlcmFzYWJsZVN5bnRheE9ubHkiLCJvdXREaXIiLCJ0eXBlUm9vdHMiLCJleGNsdWRlIiwiaW5jbHVkZSIsInN1Ykpzb25PYmoiLCJnZW5lcmF0ZVRzY29uZmlnIiwiZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMiLCJpc0VzbVBhY2thZ2UiLCJzb3J0IiwiZXhwZXJpbWVudGFsRGVjb3JhdG9ycyIsImV4Y2x1ZGVGaWxlUGF0dGVybnMiLCJnZW5lcmF0ZVZzY29kZVNldHRpbmdzIiwiZXhjbHVkZUZpbGVQYXR0ZXJuIiwiZXhjbHVkZVNldHRpbmciLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJjdXJyZW50VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJ2ZXJzaW9uc0pzb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwiZ2V0TWFqb3JOdW1iZXIiLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsIm5wbU1pbmltYWxBZ2VHYXRlIiwibnBtUHJlYXBwcm92ZWRQYWNrYWdlcyIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJtYWpvciIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwiREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMiLCJzZXR1cFNlY3JldHMiLCJkb3RlbnYiLCJzZWNyZXROYW1lIiwic2VjcmV0X25hbWUiLCJrZXlfaWQiLCJrZXlJZCIsInNvZGl1bSIsInJlYWR5Iiwic2VjcmV0IiwicmF3S2V5IiwiZnJvbV9iYXNlNjQiLCJiYXNlNjRfdmFyaWFudHMiLCJPUklHSU5BTCIsInJhd1NlYyIsImZyb21fc3RyaW5nIiwiZW5jQnl0ZXMiLCJjcnlwdG9fYm94X3NlYWwiLCJlbmNCYXNlNjQiLCJ0b19iYXNlNjQiLCJlbmNyeXB0ZWRfdmFsdWUiLCJzZXR1cEdpdEh1YlNldHRpbmdzIiwid2l0aFJldHJ5IiwiYWxsb3dfYXV0b19tZXJnZSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImFsbG93X3VwZGF0ZV9icmFuY2giLCJkZWxldGVfYnJhbmNoX29uX21lcmdlIiwic3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZSIsInNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZSIsImhlYWRlcnMiLCJ0ZW1wbGF0ZXMiLCJnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyIsImRpc3RhbmNlIiwid2JmeUpzb25TY2hlbWEiLCJ6IiwicmVjb3JkIiwic3RyaW5nIiwib3B0aW9uYWwiLCJkb2MiLCJnZXRQYWNrYWdlQ29uZmlnIiwiZXNtUGFja2FnZSIsInBhY2thZ2VKc29uVGV4dCIsInR5cGUiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwiZnNwIiwiZmxhdCIsInJlcG9JbmZvIiwiZ2l0Iiwic2ltcGxlR2l0Iiwib3JpZ2luIiwiZ2V0UmVtb3RlcyIsInIiLCJyZW1vdGVVcmwiLCJyZWZzIiwicmVxdWVzdFJlcG9JbmZvIiwibWVzc2FnZSIsImZldGNoUmVwb0luZm8iLCJub2RlVmVyc2lvbkNvbnRlbnQiLCJ3YmZ5SnNvblBhdGgiLCJ3YmZ5SnNvblRleHQiLCJyZXBvRnVsbE5hbWUiLCJmdWxsX25hbWUiLCJyZXBvUGFydHMiLCJCb29sZWFuIiwic2VwIiwiY29udGFpbnNBbnkiLCJkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiIsImhhc1N0YXJ0VGVzdCIsImdpdGh1YiIsIm5wbSIsImdldEVzbGludEV4dGVuc2lvbkJhc2UiLCJwYXR0ZXJuIiwib3JnIiwicmV0IiwiYXNzaWduIiwic2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UiLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJhcnJheSIsImRlZmF1bHQiLCJhbGlhcyIsInNraXBEZXBzIiwidmVyYm9zZSIsInBhY2thZ2VKc29uRGlyIiwiVVJMIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwicm9vdERpclBhdGgiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImQiLCJhYmJyZXZpYXRpb25Qcm9taXNlIiwic3ViUGFja2FnZUNvbmZpZ3MiLCJzdWJEaXJQYXRoIiwiYWxsUGFja2FnZUNvbmZpZ3MiLCJzaG91bGRSdW5Xb3JrZmxvd3MiLCJ0aGVuIiwicm1TeW5jIl0sIm1hcHBpbmdzIjoibW9CQUtPLE1BQU1BLEVBQVUsSUFMdkIsTUFDRUMsV0FBWSxFQUNaQyxtQkFBb0IsR0NnQmYsTUFBTUMsRUFBUyxJQWhCdEIsTUFDRSwrQkFBTUMsQ0FBMEJDLEVBQWNDLEdBQ3hDTixFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLGFBQWFILHFCQUU1QixVQUNRQyxHQUNSLENBQUUsTUFBT0csR0FDUEYsUUFBUUMsS0FBSyxxQkFBcUJILE1BQVNJLGFBQWlCQyxNQUFRRCxFQUFNRSxNQUFRQyxPQUFPSCxNQUMzRixDQUNJVCxFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLGNBQWNILG1CQUUvQixHQ1RLUSxlQUFlQyxFQUFjQyxHQUNsQyxPQUFPWixFQUFP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