@willbooster/wbfy 20.14.3 → 20.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +5 -5
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -75,14 +75,14 @@ ${Nr(n,r)}
|
|
|
75
75
|
`).trim(),te=a?.trim().startsWith(`#`);return b+(a?te?`
|
|
76
76
|
|
|
77
77
|
`+a.trim():`
|
|
78
|
-
`+a:``)}function Nr(e,t){let n=t.some(e=>e.depending.tauri||e.doesContainTauriConfigInPackages),r=e.isPublicRepo&&t.every(e=>!e.packageJson?.name?.startsWith(`@willbooster/`))?``:n?`- Ensure compatibility with Windows, macOS, and Linux.`:`- Ensure compatibility only with macOS and Linux; do not include Windows-specific code.`,
|
|
78
|
+
`+a:``)}function Nr(e,t){let n=t.some(e=>e.depending.tauri||e.doesContainTauriConfigInPackages),r=e.isPublicRepo&&t.every(e=>!e.packageJson?.name?.startsWith(`@willbooster/`)),i=`- Comments and JSDoc: every reader has the source, so never restate what the code, its names, or its types already say (e.g., \`@param name The name\`, \`@returns the result\`, a narration of the control flow). Write one only when a plausible edit (simplifying, deleting, reordering, replacing) would break something without that knowledge and no type check, lint rule, or existing test would catch the breakage; first try to encode the knowledge in code (a name such as \`timeoutMs\`, a type, an \`assert\`, a test) and comment only what cannot be encoded: a deliberately odd-looking workaround, a dependency on a fact outside the repository (an external API's behavior, an agreement with another system), or a rejected alternative and why. Put it in JSDoc when it is a contract of the declared symbol, so callers see it, and in an inline comment when it concerns specific lines. Delete comments that fail this test in files you touch.${e.isPublicRepo?` Exception: the exported API of a package published to npm may carry JSDoc describing what it does and how to call it, because its users read it without the source.`:``}`,a=r?``:n?`- Ensure compatibility with Windows, macOS, and Linux.`:`- Ensure compatibility only with macOS and Linux; do not include Windows-specific code.`,o=t.some(e=>e.doesContainWranglerConfig),s=t.some(e=>(e.depending.next||e.depending.vinext)&&!e.doesContainWranglerConfig),c=`- Cloudflare Workers run across many ephemeral isolates, so two requests may hit different instances: never let correctness depend on module-level mutable state; persist authoritative shared state in bindings (D1, KV, R2, Durable Objects). Best-effort isolate-local caches of non-request-scoped data are fine.`,l=o?s?`${c} This applies to all code running on Cloudflare Workers (the wrangler-configured packages and any workspace package they import); assume a single server instance for the other server apps.`:c:s?`- Assume a single server instance.`:``;return`
|
|
79
79
|
## Coding Style
|
|
80
80
|
|
|
81
81
|
- Use camelCase file names for JavaScript/TypeScript (PascalCase for React components).
|
|
82
82
|
- Simplify code as much as possible to eliminate redundancy.
|
|
83
83
|
- Design modules and directories with high cohesion and low coupling; split large modules when needed.
|
|
84
84
|
- Place calling functions above the functions they call (top-down order); place variable and type declarations above their usage.
|
|
85
|
-
|
|
85
|
+
${i}
|
|
86
86
|
- Never explain how WillBooster's in-house tools (e.g., \`wb\`, \`wbfy\`) work in code comments or documents outside the tool's own package, except in instructions for AI agents (e.g., do not note that \`PORT\` is unset because \`wb\` picks a free port).
|
|
87
87
|
- If lint errors or warnings cannot be fixed, use ignore comments with reasons (e.g., \`// oxlint-disable-next-line <rule> -- <reason>\`).
|
|
88
88
|
- Prefer \`undefined\` over \`null\` unless required by APIs or libraries.
|
|
@@ -90,12 +90,12 @@ ${Nr(n,r)}
|
|
|
90
90
|
- Build prompts as a single template literal instead of \`join()\` on a pre-computable array of strings.
|
|
91
91
|
- Assume all environment variables are defined; if validation is needed, \`assert\` them at startup to fail fast.
|
|
92
92
|
- Assume local tools such as \`git\`, \`gh\`, and \`ghq\` are installed and authenticated.
|
|
93
|
-
${
|
|
93
|
+
${a}
|
|
94
94
|
${t.some(e=>e.depending.genI18nTs)?'- Register string literals for React components in the `i18n` resource files (e.g., `i18n/ja-JP.json`) and reference them via the `i18n` utility (e.g., `i18n.pages.home.title()` for `{ "pages": { "home": { "title": "My App" } } }`).':``}
|
|
95
95
|
|
|
96
96
|
${t.some(e=>e.depending.react||e.depending.next||e.depending.vinext)?"- Prefer lambda over `function` for React components, e.g., `const Button: React.FC = () => {`.\n- Prefer `useImmer` over `useState` for arrays and objects.\n- Use `autoFocus` where it reduces user effort.":``}
|
|
97
97
|
${t.some(e=>e.depending.next||e.depending.vinext)?"\n- This project uses the React Compiler, so `useCallback` and `useMemo` are unnecessary for performance.\n":``}
|
|
98
|
-
${
|
|
98
|
+
${l}
|
|
99
99
|
`.replaceAll(/\.\n\n+-/g,`.
|
|
100
100
|
-`).replaceAll(/\n{3,}/g,`
|
|
101
101
|
|
|
@@ -512,4 +512,4 @@ ${se(oe)}
|
|
|
512
512
|
`);throw Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${r}`)}function Xl(e){let t=e.packageJson;if(!t)return[];let n=[];for(let r of Kl){let i=t[r];if(i)for(let[t,a]of Object.entries(i))a&&Zl(a)&&($l(a)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:r,specifier:a}))}return n}function Zl(e){return Ql(e)||/^(?:bitbucket|gist|github|gitlab):/u.test(e)||/^https?:\/\/(?:bitbucket\.org|github\.com|gitlab\.com)\//u.test(e)||/^(?:https?|ssh):\/\/\S+\.git(?:#\S+)?$/u.test(e)||/^[^@\s]+@[^:\s]+:\S+(?:#\S+)?$/u.test(e)||e.startsWith(`git:`)||e.startsWith(`git+`)||e.startsWith(`ssh://git@`)}function Ql(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}function $l(e){return Jl.some(t=>t.test(e))}const eu=`apply-release-age-gate`,tu=`generate-user-agent-configs`;async function nu(){let e=await o(process.argv.slice(2)).command(eu,`Apply only the organization's minimum-release-age policy to this machine's global package-manager configs`).command(tu,`Overwrite this user's agent instruction files (~/.codex/AGENTS.md, ~/.claude/CLAUDE.md, ~/.gemini/GEMINI.md) with the organization's fixed content and merge the organization's settings into ~/.claude/settings.json and ~/.gemini/settings.json`).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({force:{description:`Apply wbfy even when the repository already records this wbfy version`,type:`boolean`,default:!1,alias:`f`},skipDeps:{description:"Skip adding managed dependencies and the linker probe (the final `bun install` refreshing the lockfile still runs)",type:`boolean`,default:!1,alias:`d`},verbose:{description:`Whether or not to enable verbose mode`,type:`boolean`,default:!1,alias:`v`}}).version(pi()).strict().argv;if(T.isVerbose=e.verbose,e._[0]===eu){Oi()||(process.exitCode=1);return}if(e._[0]===tu){await nl()||(process.exitCode=1);return}let t=!1;try{t=await ru(e.paths,e.skipDeps,e.force)}finally{await Oe()}t&&(process.exitCode=1)}async function ru(n,r,i){Oi();let a=Bun.version;if(Bun.semver.order(a,`1.4.0`)<0)return console.error(`wbfy requires Bun >= 1.4.0 (found ${a}). Upgrade Bun and re-run.`),!0;let o=hi(),s=!i&&o&&!o.endsWith(`-dirty-local`)?o:void 0,c=!1;for(let i of n){let n=t.resolve(i);if(O.setRootDirPath(e.existsSync(n)?n:void 0),s&&await tc(n)===s){console.info(`Skip ${n}: wbfy ${s} is already applied. Pass --force to re-apply.`);continue}let a=t.join(n,`packages`),o=(await le(()=>e.promises.readdir(a,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.resolve(a,e.name)),l=Gt({dirPath:n,packageJson:C(()=>JSON.parse(e.readFileSync(t.resolve(n,`package.json`),`utf8`)))??{},doesContainSubPackageJsons:o.some(n=>e.existsSync(t.resolve(n,`package.json`)))}),u=[...new Set([...o,...l])].filter(e=>e!==t.resolve(n)),d=[...[`.gitattributes`,`bunfig.toml`,`lefthook.yml`,`package.json`,`tsconfig.json`].map(e=>t.resolve(n,e)),...u.flatMap(e=>[`package.json`,`tsconfig.json`].map(n=>t.resolve(e,n)))];if((await Promise.all(d.map(e=>O.isConfinedWritablePath(e)))).includes(!1)){console.error(`Skip ${n}: a managed config file is a symlink or resolves outside the repository.`),c=!0;continue}let f=[n,...u].flatMap(n=>{let r=t.resolve(n,`package.json`);if(!e.existsSync(r))return[];try{let t=tr({packageJson:JSON.parse(e.readFileSync(r,`utf8`))});return t?[`${n}: ${t}`]:[]}catch{return[`${r} is invalid`]}});if(f.length>0){console.error(`Skip ${n}:\n${f.join(`
|
|
513
513
|
`)}`),c=!0;continue}let p=await $n(n);if(T.isVerbose,!p){console.error(`there is no valid package.json in ${n}`),c=!0;continue}let m=await Promise.all(u.map(e=>$n(e,{isRoot:!1}))),h=u.find((n,r)=>!m[r]&&e.existsSync(t.join(n,`package.json`)));if(h){console.error(`Skip ${n}: ${h}/package.json is invalid.`),c=!0;continue}let g=[p,...m.filter(e=>!!e)],_=g.some(e=>e.isCloudflare)?R(`git`,[`-c`,`core.quotePath=false`,`ls-files`,`--`,`.env.cloudflare`,`*/.env.cloudflare`],p.dirPath).split(`
|
|
514
514
|
`).filter(Boolean).map(e=>t.resolve(p.dirPath,e)):[];if(_.length>0){console.error(`SECURITY ERROR: Cloudflare credentials must be untracked. Remove ${_.join(`, `)} from Git, purge the token from history, and rotate CLOUDFLARE_API_TOKEN before rerunning wbfy.`),c=!0;continue}let v=Tn(p);if(await jl(g),T.isVerbose)for(let e of g)console.info(e);Yl(g);let y=zr(n),ee=Br(g,y,r);await Hr(p,ee),await El(p),await dt(p),await cl(p,g),await k.promiseAll(),!r&&p.doesContainPackageJson&&!iu(n,p,y,ee)&&console.warn(`bun install currently fails in ${n} under the isolated linker.`);let b=!un(p.repository)&&(p.repository?.startsWith(`github:WillBooster/`)||p.repository?.startsWith(`github:WillBoosterLab/`)),te=!b&&!un(p.repository)&&!!p.repository?.startsWith(`github:`)&&p.isRoot;await Promise.all([v.then(()=>nc(p)),$r(p),ti(p),ii(p,g),oi(p),Gl(p),Ai(p),Js(p),Cc(p),yc(p),...b?[ln(p)]:[],...te?[_l(p,g)]:[],Nl(p),Ll(p),Vl(p),...p.isRoot?[Cs(p,g)]:[]]),await k.promiseAll(),await Or(p,g),await k.promiseAll();let x=[];for(let e of g)e.depending.playwrightTest&&x.push(Ue(e)),e.depending.next&&x.push(je(e)),e.depending.chakra&&x.push(Re(e)),await li(e,p),await k.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(ki(e)&&await Gs(e),await qa(e,p,r),e.doesContainVscodeSettingsJson&&x.push(al(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&x.push(Dc(e)),H(e)?(x.push(zs(e)),x.push(Hs(e,p))):!e.isRoot&&e.doesContainPackageJson&&H(p)&&x.push(Hs(e,p)),e.depending.pyright&&x.push(qs(e)));await Promise.all(x),await k.promiseAll(),si(n);try{ou(n)}catch(e){console.error(`Failed to refresh the Bun lockfile:`,e?.message??e),c=!0}try{let e=ye(n);e&&console.info(`Removed Takumi Guard proxy URLs from ${e} to keep it registry-agnostic.`)}catch(e){console.error(`Failed to normalize the Bun lockfile:`,e?.message??e),c=!0}Kn(`bun`,[`cleanup`],n)}return c}function iu(e,t,n,r){return n!==r&&au(e,t),qn(`bun`,[`install`],e,1)===0||(au(e,t),!1)}function au(n,r){let i=[t.resolve(n,`node_modules`),...[...Ko(r).values()].map(e=>t.resolve(n,e,`node_modules`))],a=e.realpathSync(n);for(let n of i){let r=C(()=>e.realpathSync(t.dirname(n)));r&&(r===a||r.startsWith(a+t.sep))&&e.rmSync(n,{recursive:!0,force:!0})}}function ou(e){let t=qn(`bun`,[`install`],e,1);if(t!==0)throw Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await nu();
|
|
515
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsImZzIiwicGFyc2VKc29uYyIsImZzcCIsInJlbGVhc2VBZ2VHYXRlLmRheXMiLCJyZWxlYXNlQWdlR2F0ZS5leGNsdWRlcyIsIm5ld0NvbnRlbnQiLCJjb21tb25Db250ZW50IiwibmV3Q29udGVudCIsImNoaWxkX3Byb2Nlc3MiLCJjb21tb25Db250ZW50IiwiY2hpbGRfcHJvY2VzcyIsInNvcnRPYmplY3RLZXlzIiwiZ2l0SG9va3MiLCJkZXRlY3ROZXdsaW5lIiwiZGVwZW5kZW5jeVNlY3Rpb25LZXlzIiwiY29yZSIsIm1hbmFnZWRDb25maWdCbG9ja3MiLCJnZXRDb25maWdDb250ZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZ2l0aHViVGVtcGxhdGVzLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvc2xlZXAudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL3Rlc3RpbmdSdWxlcy50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuV29ya3NwYWNlcy50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuTG9ja2ZpbGUudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2RvY2tlcmZpbGUudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2dsb2IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3V0aWxzL3R5cGVzY3JpcHRBcGkudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL2NoYWtyYVRvYXN0ZXIudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9mbm94VG9tbC50cyIsIi4uL3NyYy91dGlscy9tZXJnZVV0aWwudHMiLCIuLi9zcmMvdXRpbHMvb2JqZWN0VXRpbC50cyIsIi4uL3NyYy91dGlscy93b3Jrc3BhY2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ByaXZhdGVQYWNrYWdlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93UnVubmVyUG9saWN5LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd29ya2Zsb3cudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvanNvbmNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LnRzIiwiLi4vc3JjL3V0aWxzL3NwYXduVXRpbC50cyIsIi4uL3NyYy91dGlscy9zdHJpbmdVdGlsLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9jb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24iLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dsb2JhbFJlbGVhc2VBZ2VHYXRlLnRzIiwiLi4vc3JjL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9pZGVhLnRzIiwiLi4vc3JjL3V0aWxzL2dlbkkxOG5Ucy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9zb3J0LW9iamVjdC1rZXlzQDIuMS4wLTE4ZGYyZjgzN2U2ZWMyOWEvbm9kZV9tb2R1bGVzL3NvcnQtb2JqZWN0LWtleXMvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZGV0ZWN0LWluZGVudEA3LjAuMi02Yjc1ZGMwZjU2NTMzYmQ5L25vZGVfbW9kdWxlcy9kZXRlY3QtaW5kZW50L2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL2RldGVjdC1uZXdsaW5lQDQuMC4xLTVkYTlkZjY1MTI1ZWU3OTUvbm9kZV9tb2R1bGVzL2RldGVjdC1uZXdsaW5lL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL2dpdC1ob29rcy1saXN0QDQuMi4xLTZjYTJiMjY5ZDkxNjMzMmUvbm9kZV9tb2R1bGVzL2dpdC1ob29rcy1saXN0L2luZGV4Lmpzb24iLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvaXMtcGxhaW4tb2JqQDQuMS4wLTQ3ZmRkZDc3MDY0OGU1Nzcvbm9kZV9tb2R1bGVzL2lzLXBsYWluLW9iai9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9zb3J0LXBhY2thZ2UtanNvbkA0LjAuMC02MzUxYjkyZjgyNjE1NmY0L25vZGVfbW9kdWxlcy9zb3J0LXBhY2thZ2UtanNvbi9pbmRleC5qcyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL3V0aWxzL3RzY29uZmlnQmFzZS50cyIsIi4uL3NyYy91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9sZWZ0aG9vay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2NvbmZpZ0NvbnRlbnQudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9tYW5hZ2VkQ29uZmlnQmxvY2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGZtdENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294bGludENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JhaWx3YXlpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZWFkbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZWxlYXNlcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb25jLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy91c2VyQWdlbnRDb25maWdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93YkVudi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3NlbGZDb250YWluZWRXb3JrZmxvdy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21pc2VUb21sLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbnBtcmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9ydWxlc2V0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvdGVtcGxhdGUudHMiLCIuLi9zcmMvdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc2VjdGlvbiBvZiBhIFBSIG9yIGlzc3VlIGJvZHk6IGl0cyBoZWFkaW5nIGFuZCB3aGF0IHRoZSBzZWN0aW9uIG11c3Qgc3RhdGUuIGByZXF1aXJlbWVudGBcbiAqIHN0YXJ0cyBsb3dlcmNhc2UgYW5kIGVuZHMgd2l0aG91dCBwdW5jdHVhdGlvbiwgc28gdGhhdCBpdCByZWFkcyBib3RoIGFzIGEgcGxhY2Vob2xkZXIgc2VudGVuY2VcbiAqIChjYXBpdGFsaXplZCwgd2l0aCBhIHBlcmlvZCBhcHBlbmRlZCkgYW5kIGFzIGEgY2hlY2tsaXN0IGNsYXVzZSBhZnRlciB0aGUgaGVhZGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZVNlY3Rpb24ge1xuICByZWFkb25seSBoZWFkaW5nOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlcXVpcmVtZW50OiBzdHJpbmc7XG59XG5cbi8qKiBTZWN0aW9ucyBvZiBhIHB1bGwgcmVxdWVzdCBib2R5LCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIFBSIHRlbXBsYXRlLiAqL1xuZXhwb3J0IGNvbnN0IFBVTExfUkVRVUVTVF9TRUNUSU9OUzogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10gPSBbXG4gIHtcbiAgICBoZWFkaW5nOiAnV2h5JyxcbiAgICByZXF1aXJlbWVudDogJ3RoZSBwcm9ibGVtLCB3aXRoIHRoZSBudW1iZXJzIG9yIG9ic2VydmF0aW9ucyBiZWhpbmQgaXQsIGFuZCB3aHkgdGhpcyBhcHByb2FjaCBvdmVyIHRoZSBhbHRlcm5hdGl2ZXMnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1JlcXVpcmVtZW50cycsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICBcInRoZSByZXF1aXJlbWVudHMgdGhlIGNoYW5nZSBtdXN0IHNhdGlzZnkgYW5kIHRoZSBndWFyYW50ZWVzIGl0IG11c3Qga2VlcCwgb25lIHBlciBsaW5lLCBlYWNoIG1hcmtlZCBgcmVxdWlyZWRgIChhc2tlZCBmb3IgYnkgdGhlIHJlcXVlc3Rlciwgb3IgYW4gZXhpc3RpbmcgY29udHJhY3QgY2FsbGVycyBkZXBlbmQgb24pIG9yIGBjaG9zZW5gICh0aGUgaW1wbGVtZW50ZXIncyBvd24gZGVjaXNpb24sIHdoaWNoIGEgc2ltcGxlciBkZXNpZ24gbWF5IHJlcGxhY2UpOyBjb3B5IHRoZSByZXF1ZXN0ZXIncyBpbnN0cnVjdGlvbnMgaGVyZSBhcyBnaXZlbiwgd2hldGhlciB0aGV5IGNhbWUgZnJvbSBhbiBpc3N1ZSBvciBhIGNvbnZlcnNhdGlvbiwgYW5kIGtlZXAgdGhlIGxpc3Qgd2hlbiB0aGUgYm9keSBpcyBsYXRlciByZXdyaXR0ZW4gdW5sZXNzIHRoZSByZXF1ZXN0ZXIncyBpbnN0cnVjdGlvbnMgY2hhbmdlZFwiLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0N1c3RvbWVyIFN1bW1hcnknLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2JlaGF2aW9yLCB3b3JrZmxvdywgb3IgdXNlci12aXNpYmxlIGNoYW5nZXMsIHdyaXR0ZW4gZm9yIHJlYWRlcnMgd2hvIGtub3cgbm90aGluZyBhYm91dCB0aGUgaW1wbGVtZW50YXRpb24nLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1RlY2huaWNhbCBTdW1tYXJ5JyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICdkZWNpc2lvbnMgYW5kIHRoZWlyIHJlYXNvbnMsIGRhdGEgZmxvdywgd2hlcmUgdG8gbG9vayAodGhlIGZpbGVzIHRoYXQgbWF0dGVyIG1vc3QpLCBhbmQgd2hhdCB0byBjaGVjayBoYXJkZXN0OiB0aGUgcGFydHMgd2hvc2UgY29ycmVjdG5lc3MgaXMgYXJndWVkIHJhdGhlciB0aGFuIHByb3ZlbicsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnVGVzdGluZycsXG4gICAgcmVxdWlyZW1lbnQ6ICdjb21tYW5kcyBydW4sIHRlc3RzIGFkZGVkLCBhbmQgd2hhdCB3YXMgTk9UIGV4ZXJjaXNlZCBhbmQgd2h5JyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdOb3RlcycsXG4gICAgcmVxdWlyZW1lbnQ6ICdrbm93biBsaW1pdGF0aW9ucywgY29tcGF0aWJpbGl0eSBhbmQgbWlncmF0aW9uLCBmb2xsb3ctdXAgd29yazsgZGVsZXRlIHRoaXMgc2VjdGlvbiBpZiB0aGVyZSBpcyBub25lJyxcbiAgfSxcbl07XG5cbi8qKlxuICogSG93IGEgdG9vbCB0aGF0IHdyaXRlcyBvciByZXdyaXRlcyBhIFBSIGJvZHkgZGVyaXZlcyBpdCBmcm9tIHRoZSByZXBvc2l0b3J5J3MgUFIgdGVtcGxhdGUsIGFzXG4gKiBtYXJrZG93biBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9ucy4gU3RhdGVkIG9uY2UgaGVyZSBhbmQgcmVuZGVyZWQgYnkgZXZlcnkgd3JpdGVyICh0aGVcbiAqIGdlbmVyYXRlZCBhZ2VudCBpbnN0cnVjdGlvbnMsIHRoZSBQUi1kcmFmdGluZyBza2lsbHMpIHNvIHRoZSB3cml0ZXJzIGNhbm5vdCBkcmlmdCBhcGFydDsgdGhlXG4gKiB0ZW1wbGF0ZS1sZXNzIGJyYW5jaCBsZXRzIHRoZSBzYW1lIHRleHQgc2VydmUgcmVwb3NpdG9yaWVzIG91dHNpZGUgdGhlIG9yZ2FuaXphdGlvbi5cbiAqL1xuY29uc3QgUFVMTF9SRVFVRVNUX1RFTVBMQVRFX1JVTEVTID0gYC0gQmFzZSB0aGUgUFIgYm9keSBvbiBcXGAuZ2l0aHViL3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZFxcYCB3aGVuIGNyZWF0aW5nIG9yIHVwZGF0aW5nIGEgUFIsIGV2ZW4gd2hlbiBhIHNraWxsIG9yIHdvcmtmbG93IHN1cHBsaWVzIGl0cyBvd24gc2tlbGV0b246IGtlZXAgdGhlIHRlbXBsYXRlJ3MgaGVhZGluZ3MgaW4gb3JkZXIsIGZpbGwgZWFjaCBzZWN0aW9uIHdpdGggd2hhdCBpdHMgcGxhY2Vob2xkZXIgY29tbWVudCBhc2tzIGZvciBhdCBhIGxlbmd0aCBmaXR0aW5nIHRoZSBjaGFuZ2UgKGEgc2VudGVuY2UgZm9yIGEgc21hbGwgY2hhbmdlLCBudW1iZXJlZCBzdWJzZWN0aW9ucyBmb3IgYSBsYXJnZSBvbmUpLCBhbmQgZGVsZXRlIHRoZSBwbGFjZWhvbGRlciBjb21tZW50cyBhbmQgYW4gZW1wdHkgTm90ZXMgc2VjdGlvbi4gV2l0aG91dCBhIHRlbXBsYXRlLCB1c2Ugbm8gZml4ZWQgaGVhZGluZ3M6IHN0YXRlIHRoZSBzY29wZSwgdGhlIG1vdGl2YXRpb24sIGFuZCB0aGUgdmVyaWZpY2F0aW9uIGNvbmNpc2VseS5cbi0gU3RhcnQgdGhlIGJvZHkgd2l0aCBcXGBDbG9zZSAjPG4+XFxgIG9ubHkgd2hlbiB0aGUgUFIgcmVzb2x2ZXMgYW4gZXhpc3RpbmcgaXNzdWUuYDtcblxuLyoqXG4gKiBIb3cgYSB0b29sIHRoYXQgd3JpdGVzIG9yIHJld3JpdGVzIGEgUFIgYm9keSBmaWxscyB0aGUgUmVxdWlyZW1lbnRzIHNlY3Rpb24gb2ZcbiAqIGBQVUxMX1JFUVVFU1RfU0VDVElPTlNgLCBhcyBtYXJrZG93biBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9ucy4gU2tpbGxzIHRoYXQgZHJhZnQgUFJcbiAqIGJvZGllcyByZW5kZXIgdGhpcyB0ZXh0IGluc3RlYWQgb2YgcmVzdGF0aW5nIGl0LCBzbyB0aGUgd3JpdGVycyBhbmQgdGhlIHJldmlld2VycyB0aGF0IHJlYWQgdGhlXG4gKiBzZWN0aW9uIGFzIHRoZSBib3VuZGFyeSBhIGZpeCBtdXN0IGtlZXAgbmV2ZXIgZGlzYWdyZWUgb24gd2hhdCBhIGxpbmUgbWVhbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBQVUxMX1JFUVVFU1RfUkVRVUlSRU1FTlRTX1JVTEVTID0gYC0gUmVxdWlyZW1lbnRzIHNlY3Rpb246IG9uZSBsaW5lIHBlciByZXF1aXJlbWVudCwgdGFrZW4gZnJvbSB0aGUgcmVxdWVzdGVyJ3MgaW5zdHJ1Y3Rpb25zIGFzIHRoZXkgd2VyZSBnaXZlbiAodGhlIGlzc3VlLCB0aGUgY29udmVyc2F0aW9uIHRoYXQgYXNrZWQgZm9yIHRoZSBjaGFuZ2UpLCBlYWNoIG1hcmtlZCBcXGByZXF1aXJlZFxcYCAoYXNrZWQgZm9yLCBvciBhbiBleGlzdGluZyBjb250cmFjdCBjYWxsZXJzIGRlcGVuZCBvbikgb3IgXFxgY2hvc2VuXFxgICh5b3VyIG93biBkZWNpc2lvbiwgd2hpY2ggYSBzaW1wbGVyIGRlc2lnbiBtYXkgcmVwbGFjZSkuIE5ldmVyIGluZmVyIGEgcmVxdWlyZW1lbnQgZnJvbSB0aGUgZGlmZjogd2hlbiBubyBpc3N1ZSwgUFIgbWVzc2FnZSwgb3IgY29udmVyc2F0aW9uIHN0YXRlcyB0aGUgcmVxdWVzdCwgd3JpdGUgXFxgcmVxdWlyZWQ6IG5vdCByZWNvcmRlZCDigJQgYXNrIHRoZSByZXF1ZXN0ZXJcXGAgYXMgdGhlIG9ubHkgcmVxdWVzdC1kZXJpdmVkIGxpbmUgKGEgXFxgcmVxdWlyZWRcXGAgbGluZSBmb3IgYW4gZXhpc3RpbmcgY29udHJhY3QgY2FsbGVycyBkZXBlbmQgb24gbWF5IHN0aWxsIGJlIGxpc3RlZCkgYW5kIHNheSBzbyBpbiBOb3Rlcy5cbi0gUmVjb3JkIHJ1bGU6IGFuIGV4aXN0aW5nIFJlcXVpcmVtZW50cyBzZWN0aW9uIGlzIGEgcmVjb3JkLCBub3QgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZGlmZi4gS2VlcCBpdHMgXFxgcmVxdWlyZWRcXGAgbGluZXMgYXMgdGhleSBhcmUsIHJld3JpdGluZyB0aGVtIG9ubHkgd2hlbiB0aGUgcmVxdWVzdGVyJ3MgaW5zdHJ1Y3Rpb25zIGNoYW5nZWQgKHRoZW4gZnJvbSB0aGUgdXBkYXRlZCBpbnN0cnVjdGlvbnMsIGRyb3BwaW5nIGEgbGluZSBvbmx5IHdoZW4gdGhlIHJlcXVlc3RlciByZW1vdmVkIGl0OyB3aXRoIG5vIGluc3RydWN0aW9ucyBhdmFpbGFibGUsIGtlZXAgdGhlbSB1bmNoYW5nZWQpOyBhZGQgYSBcXGBjaG9zZW5cXGAgbGluZSBmb3IgYSBuZXcgZGVjaXNpb24sIGFuZCByZXBsYWNlIG9yIHJlbW92ZSBvbmUgd2hlbiB0aGUgZGVjaXNpb24gaXQgcmVjb3JkcyBjaGFuZ2VkLiBBIHNlY3Rpb24gdGhhdCBtZXJlbHkgZGVzY3JpYmVzIHRoZSBpbXBsZW1lbnRhdGlvbiwgb3IgaG9sZHMgb25seSB0aGUgdGVtcGxhdGUncyBwbGFjZWhvbGRlciBvciBhIFxcYHJlcXVpcmVkOiBub3QgcmVjb3JkZWRcXGAgbGluZSwgaXMgbm90IGEgcmVjb3JkOiB3cml0ZSBpdCBhZnJlc2ggYnkgdGhlIHJ1bGUgYWJvdmUuXG4tIFBsYWNlIHRoZSBzZWN0aW9uIHdoZXJlIHRoZSB0ZW1wbGF0ZSBwdXRzIGl0OyB3aGVuIHRoZSB0ZW1wbGF0ZSBoYXMgbm8gc3VjaCBoZWFkaW5nLCByaWdodCBhZnRlciB0aGUgaXNzdWUtY2xvc2luZyBsaW5lLCBvciBhdCB0aGUgdG9wIG9mIHRoZSBib2R5IHdoZW4gdGhlcmUgaXMgbm9uZS5cbi0gTmV2ZXIgZHJvcCBvciB3ZWFrZW4gYSBcXGByZXF1aXJlZFxcYCBsaW5lIHRvIGZpdCB3aGF0IHdhcyBpbXBsZW1lbnRlZDogd2hlbiBvbmUgY2Fubm90IGhvbGQgaW4gdGhlIGRpZmYsIGtlZXAgaXQgYW5kIHNheSBzbyBpbiBOb3Rlcy5gO1xuXG4vKiogVGhlIGNvbXBsZXRlIHJ1bGVzIGZvciB3cml0aW5nIGEgUFIgYm9keTogdGhlIHRlbXBsYXRlIHJ1bGVzIGZvbGxvd2VkIGJ5IHRoZSBSZXF1aXJlbWVudHMgcnVsZXMuICovXG5leHBvcnQgY29uc3QgUFVMTF9SRVFVRVNUX0JPRFlfUlVMRVMgPSBgJHtQVUxMX1JFUVVFU1RfVEVNUExBVEVfUlVMRVN9XFxuJHtQVUxMX1JFUVVFU1RfUkVRVUlSRU1FTlRTX1JVTEVTfWA7XG5cbi8qKlxuICogSG93IGEgdG9vbCB0aGF0IGNyZWF0ZXMgYW4gaXNzdWUgZGVyaXZlcyBpdCBmcm9tIHRoZSByZXBvc2l0b3J5J3MgaXNzdWUgdGVtcGxhdGVzLCBhcyBtYXJrZG93blxuICogYnVsbGV0cyBmb3IgYW4gYWdlbnQncyBpbnN0cnVjdGlvbnM7IHNoYXJlZCBieSB0aGUgc2FtZSB3cml0ZXJzIGFzIGBQVUxMX1JFUVVFU1RfQk9EWV9SVUxFU2AuXG4gKiBHdWlkYW5jZSB0aGUgdGVtcGxhdGVzIHN0YXRlIGluIHRoZWlyIG93biBwbGFjZWhvbGRlciBjb21tZW50cyAod2hpY2ggc2VjdGlvbnMgdG8ga2VlcCwgZGVsZXRpbmdcbiAqIHRoZSBjb21tZW50cykgaXMgZGVsaWJlcmF0ZWx5IG5vdCByZXBlYXRlZCBoZXJlLCBzaW5jZSB0aGUgd3JpdGVyIHJlYWRzIHRoZSB0ZW1wbGF0ZSBhbnl3YXkuXG4gKi9cbmV4cG9ydCBjb25zdCBJU1NVRV9URU1QTEFURV9SVUxFUyA9IGAtIEZvbGxvdyB0aGUgY2xvc2VzdCB0ZW1wbGF0ZSB1bmRlciBcXGAuZ2l0aHViL0lTU1VFX1RFTVBMQVRFL1xcYDogXFxgYnVnLm1kXFxgIGZvciB3cm9uZyBiZWhhdmlvciwgXFxgY2hhbmdlLm1kXFxgIGZvciBhbnl0aGluZyB0byBidWlsZCBvciBhbHRlcjsgYSBxdWVzdGlvbiBvciBub3RlIGZpdHRpbmcgbmVpdGhlciwgb3IgYSByZXBvc2l0b3J5IHdpdGhvdXQgdGVtcGxhdGVzLCBuZWVkcyBubyB0ZW1wbGF0ZS5cbi0gVGl0bGU6IGEgQ29udmVudGlvbmFsIENvbW1pdHMgcHJlZml4IGZvciB0aGUgdHlwZSB0aGF0IGZpdHMgdGhlIGNoYW5nZSAoXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGAsIFxcYHJlZmFjdG9yOlxcYCwgXFxgZG9jczpcXGAsIFxcYGNob3JlOlxcYCwgLi4uKTsgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIHRlbXBsYXRlJ3MgXFxgdGl0bGVcXGAgcHJlZml4LCByZXBsYWNlIHRoZSB0ZW1wbGF0ZSdzIHR5cGUgbGFiZWwgKFxcYHQ6IC4uLlxcYCkgd2l0aCB0aGUgb25lIG1hdGNoaW5nIHRoZSB0eXBlLlxuLSBUaGUgWUFNTCBmcm9udCBtYXR0ZXIgYmV0d2VlbiB0aGUgXFxgLS0tXFxgIGxpbmVzIGlzIG1ldGFkYXRhLCBub3QgYm9keSB0ZXh0OiBwYXNzIGl0cyBcXGBsYWJlbHNcXGAgdmlhIFxcYC0tbGFiZWxcXGAgYW5kIHN1Ym1pdCBvbmx5IHRoZSBjb250ZW50IGJlbG93IHRoZSBjbG9zaW5nIFxcYC0tLVxcYCBhcyB0aGUgYm9keS5gO1xuXG4vKiogU2VjdGlvbnMgb2YgYSBidWcgcmVwb3J0LCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIGlzc3VlIHRlbXBsYXRlLiAqL1xuZXhwb3J0IGNvbnN0IEJVR19JU1NVRV9TRUNUSU9OUzogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10gPSBbXG4gIHsgaGVhZGluZzogJ1Byb2JsZW0nLCByZXF1aXJlbWVudDogJ3doYXQgaGFwcGVucywgYW5kIHdoYXQgc2hvdWxkIGhhcHBlbiBpbnN0ZWFkJyB9LFxuICB7IGhlYWRpbmc6ICdFdmlkZW5jZScsIHJlcXVpcmVtZW50OiAncmVwcm9kdWN0aW9uIHN0ZXBzLCBsb2dzLCBydW4gSURzLCBvciBsaW5rcycgfSxcbiAgeyBoZWFkaW5nOiAnSW1wYWN0JywgcmVxdWlyZW1lbnQ6ICd3aG8gb3Igd2hhdCBpcyBhZmZlY3RlZCwgYW5kIGhvdyBiYWRseScgfSxcbiAgeyBoZWFkaW5nOiAnUHJvcG9zYWwnLCByZXF1aXJlbWVudDogJ3RoZSBmaXggeW91IGhhdmUgaW4gbWluZCwgYW5kIHRoZSByb290IGNhdXNlIGlmIGtub3duJyB9LFxuXTtcblxuLyoqXG4gKiBTZWN0aW9ucyBhIGNoYW5nZSBzcGVjaWZpY2F0aW9uIG11c3Qgc2V0dGxlIGJlZm9yZSBhIHRoaXJkIHBhcnR5IGNhbiBpbXBsZW1lbnQgaXQsIGRlZmluZWRcbiAqIG9uY2Ugc28gdGhhdCB0aGUgaXNzdWUgdGVtcGxhdGUgYW5kIGFueSB0b29sIHRoYXQgZHJhZnRzIG9yIHJldmlld3Mgc3BlY2lmaWNhdGlvbnMgYWdhaW5zdFxuICogdGhlc2Ugc2VjdGlvbnMgY2Fubm90IGRyaWZ0IGFwYXJ0OyBjaGVja2xpc3QgY29uc3VtZXJzIHJlbmRlciBpdCB3aXRoIGByZW5kZXJTZWN0aW9uQ2hlY2tsaXN0YC5cbiAqIFRoZSBmaXJzdCB0aHJlZSBzZWN0aW9ucyBzdWZmaWNlIGZvciBhIHNtYWxsIGNoYW5nZSwgc28gdGhleSBjb21lIGZpcnN0LlxuICovXG5leHBvcnQgY29uc3QgQ0hBTkdFX0lTU1VFX1NFQ1RJT05TOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSA9IFtcbiAge1xuICAgIGhlYWRpbmc6ICdCYWNrZ3JvdW5kIGFuZCBnb2FsJyxcbiAgICByZXF1aXJlbWVudDogJ3RoZSBwcm9ibGVtIGJlaW5nIHNvbHZlZCwgZm9yIHdob20sIGFuZCB3aGF0IG91dGNvbWUgY291bnRzIGFzIHN1Y2Nlc3MnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0JlaGF2aW9yJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICdldmVyeSB1c2VyLSBvciBjYWxsZXItb2JzZXJ2YWJsZSBiZWhhdmlvciwgaW5jbHVkaW5nIGlucHV0cywgb3V0cHV0cywgZXJyb3IgY2FzZXMsIGVkZ2UgY2FzZXMsIGFuZCBpbnRlcmFjdGlvbnMgd2l0aCBleGlzdGluZyBiZWhhdmlvciwgc3RhdGVkIHByZWNpc2VseSBlbm91Z2ggdGhhdCB0d28gaW1wbGVtZW50ZXJzIHdvdWxkIGJ1aWxkIHRoZSBzYW1lIHRoaW5nJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdBY2NlcHRhbmNlIGNyaXRlcmlhJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICdjaGVja2FibGUgY29uZGl0aW9ucyAoR2l2ZW4vV2hlbi9UaGVuIG9yIGFuIGVxdWl2YWxlbnQpIHRoYXQgZGVjaWRlIHdoZXRoZXIgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRvbmUnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1Njb3BlIGFuZCBub24tZ29hbHMnLFxuICAgIHJlcXVpcmVtZW50OiAnd2hhdCB0aGUgY2hhbmdlIGNvdmVycyBhbmQgd2hhdCBpdCBkZWxpYmVyYXRlbHkgbGVhdmVzIG91dCwgc28gYW4gaW1wbGVtZW50ZXIga25vd3Mgd2hlcmUgdG8gc3RvcCcsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnRGVzaWduIGNvbnN0cmFpbnRzJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICd0aGUgZGF0YSwgQVBJLCBzY2hlbWEsIFVJLCBhbmQgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBuYW1pbmcsIGFuZCB0aGUgZXhpc3RpbmcgY29kZSBvciBjb252ZW50aW9ucyB0aGUgaW1wbGVtZW50YXRpb24gbXVzdCBmaXQg4oCUIGFzIGZhciBhcyB0aGUgd3JpdGVyIGludGVuZHMgdG8gY29uc3RyYWluIHRoZW0sIHdpdGggZXZlcnl0aGluZyBlbHNlIGV4cGxpY2l0bHkgbGVmdCB0byB0aGUgaW1wbGVtZW50ZXInLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0NvbXBhdGliaWxpdHkgYW5kIG1pZ3JhdGlvbicsXG4gICAgcmVxdWlyZW1lbnQ6ICd3aGF0IGV4aXN0aW5nIGRhdGEsIHVzZXJzLCBjYWxsZXJzLCBvciBjb25maWd1cmF0aW9ucyBhcmUgYWZmZWN0ZWQgYW5kIGhvdyB0aGUgdHJhbnNpdGlvbiBoYXBwZW5zJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdWZXJpZmljYXRpb24nLFxuICAgIHJlcXVpcmVtZW50OiAnaG93IHRoZSBjaGFuZ2UgaXMgdGVzdGVkIG9yIGRlbW9uc3RyYXRlZCwgaW5jbHVkaW5nIHdoYXQgbmVlZHMgbm8gdGVzdCBhbmQgd2h5JyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdPcGVuIHF1ZXN0aW9ucycsXG4gICAgcmVxdWlyZW1lbnQ6ICd1bmRlY2lkZWQgcG9pbnRzLCBlYWNoIHdpdGggaXRzIG9wdGlvbnM7IGVtcHR5IG9uY2UgdGhlIHNwZWNpZmljYXRpb24gaXMgaW1wbGVtZW50YWJsZScsXG4gIH0sXG5dO1xuXG4vKiogUmVuZGVycyBzZWN0aW9ucyBhcyBtYXJrZG93biBidWxsZXRzIChgLSAqKkhlYWRpbmcqKjogcmVxdWlyZW1lbnRgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJTZWN0aW9uQ2hlY2tsaXN0KHNlY3Rpb25zOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSk6IHN0cmluZyB7XG4gIHJldHVybiBzZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+IGAtICoqJHtzZWN0aW9uLmhlYWRpbmd9Kio6ICR7c2VjdGlvbi5yZXF1aXJlbWVudH1gKS5qb2luKCdcXG4nKTtcbn1cblxuLyoqIFJlbmRlcnMgc2VjdGlvbnMgYXMgbWFya2Rvd24gaGVhZGluZ3MsIGVhY2ggZm9sbG93ZWQgYnkgaXRzIHJlcXVpcmVtZW50IGFzIGEgcGxhY2Vob2xkZXIgY29tbWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJTZWN0aW9uVGVtcGxhdGUoc2VjdGlvbnM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlY3Rpb25zXG4gICAgLm1hcChcbiAgICAgIChzZWN0aW9uKSA9PlxuICAgICAgICBgIyMgJHtzZWN0aW9uLmhlYWRpbmd9XFxuXFxuPCEtLSAke3NlY3Rpb24ucmVxdWlyZW1lbnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHtzZWN0aW9uLnJlcXVpcmVtZW50LnNsaWNlKDEpfS4gLS0+YFxuICAgIClcbiAgICAuam9pbignXFxuXFxuJyk7XG59XG4iLCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpc2Vjb25kcykpO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAgICogRm9yIGV4YW1wbGUsIGByZXRyeUNvdW50OiAzYCBydW5zIHRoZSBmdW5jdGlvbiBhdCBtb3N0IDMgdGltZXM6IDEgaW5pdGlhbCBhdHRlbXB0IGFuZCB1cCB0byAyIHJldHJpZXMuXG4gICAqL1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogV2hlbiB0byB3cml0ZSBhIHRlc3QgYW5kIHdoYXQgYSB0ZXN0IG1heSBhc3NlcnQsIGFzIG1hcmtkb3duIGJ1bGxldHMgZm9yIGFuIGFnZW50J3MgaW5zdHJ1Y3Rpb25zLlxuICogU3RhdGVkIG9uY2UgaGVyZSBhbmQgcmVuZGVyZWQgYnkgdGhlIGdlbmVyYXRlZCBhZ2VudCBpbnN0cnVjdGlvbnMgYW5kIHRoZSB0ZXN0aW5nIHNraWxsIHNvIHRoZVxuICogdHdvIGNhbm5vdCBkcmlmdCBhcGFydC5cbiAqL1xuZXhwb3J0IGNvbnN0IFRFU1RfV1JJVElOR19SVUxFUyA9IGAtIFdyaXRlIGEgdGVzdCBvbmx5IHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQsIG9yIHdoZW4gYSBiZWhhdmlvciBpcyBsaWtlbHkgdG8gcmVncmVzcyBhbmQgbm8gZXhpc3RpbmcgYXV0b21hdGljIGNoZWNrICh0eXBlIGNoZWNraW5nLCBsaW50aW5nLCBhbiBleGlzdGluZyB0ZXN0IG9yIENJIGNoZWNrKSB3b3VsZCBjYXRjaCB0aGUgYnJlYWthZ2UuIE5ldmVyIGFkZCBhIHRlc3QgdGhhdCBtZXJlbHkgcmVzdGF0ZXMgYSBtYXBwaW5nIGZyb20gY29uZGl0aW9ucyB0byBjb25zdGFudCBvdXRwdXRzIChpdCBmYWlscyBvbmx5IG9uIGludGVudGlvbmFsIGVkaXRzKSBvciB0aGF0IG9ubHkgY29uZmlybXMgYW4gZXh0ZXJuYWwgZmFjdCAoYSBsaWJyYXJ5J3MgYmVoYXZpb3IsIHdoZXRoZXIgYSB2ZXJzaW9uIGZpeGVzIGFuIGlzc3VlKTsgdmVyaWZ5IHRob3NlIG9uY2UgbWFudWFsbHkuXG4tIFRlc3QgZXh0ZXJuYWxseSBvYnNlcnZhYmxlIGJlaGF2aW9yIChlLmcuLCBlbWl0dGVkIGZpbGVzLCBDTEkgb3V0cHV0LCByZW5kZXJlZCByZXN1bHRzKSBhdCB0aGUgc3lzdGVtIGJvdW5kYXJ5LCBub3QgaW1wbGVtZW50YXRpb24gZGV0YWlsczogZG8gbm90IG1pcnJvciBwcm9kdWN0aW9uIGxvZ2ljLCBhc3NlcnQgdGhhdCBhIGJyYW5jaCBpcyB0YWtlbiwgb3IgZmVlZCBoYW5kLWFzc2VtYmxlZCBpbnRlcm5hbCBvYmplY3RzIHRvIGludGVybmFsIGZ1bmN0aW9ucy5cbi0gUHJlZmVyIGFjdHVhbCBBUEkgY2FsbHMgb3ZlciBtb2NrcywgdW5sZXNzIGFjdHVhbCBjYWxscyBhcmUgaW1wcmFjdGljYWwsIGhhdmUgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMsIG9yIG1vY2tzIGFyZSBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbi0gRW5zdXJlIHRlc3RzIGFyZSBpZGVtcG90ZW50IGFuZCBpbmRlcGVuZGVudCAoZS5nLiwgcmVzZXQgcGVyc2lzdGVudCBkYXRhKSBzbyB0aGV5IGNhbiBydW4gcmVwZWF0ZWRseSBvciBpbiBwYXJhbGxlbC5cbi0gQXZvaWQgZml4ZWQgd2FpdHMgaW4gRTJFIHRlc3RzOyB3YWl0IGZvciBjb25kaXRpb25zIGluc3RlYWQuYDtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG4vKiogVGhlIGB3b3Jrc3BhY2VzYCBmaWVsZCBvZiBhIHJvb3QgcGFja2FnZS5qc29uOiB0aGUgYXJyYXkgZm9ybSBvciBZYXJuIHYxJ3Mgb2JqZWN0IGZvcm0uICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VzRGVjbGFyYXRpb24gPSBzdHJpbmdbXSB8IHsgcGFja2FnZXM/OiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlLmpzb24gcGF0aCAocmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QsIHNvcnRlZCkgdGhhdCBCdW4gd291bGQgbGlua1xuICogZm9yIHRoZSBnaXZlbiByb290IHBhY2thZ2UuanNvbiBgd29ya3NwYWNlc2AgZGVjbGFyYXRpb24uIENhbm9uaWNhbGl6ZXMgdGhlIGRlY2xhcmVkIHBhdHRlcm5zXG4gKiAoc2VlIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKSwgZHJvcHMgcGF0dGVybnMgZXNjYXBpbmcgdGhlIHJlcG9zaXRvcnkgKHNlZVxuICogaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKSwgYW5kIHJlc29sdmVzIHRoZSByZXN0IHdpdGggQnVuJ3Mgc2VxdWVudGlhbCBzZW1hbnRpY3MgKHNlZVxuICogcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJ1bldvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoXG4gICAgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlcykuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PlxuICAgICAgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm4pXG4gICAgKSxcbiAgICByb290RGlyUGF0aFxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHdvcmtzcGFjZSBwYXR0ZXJucyB0byBwYWNrYWdlLmpzb24gcGF0aHMgbWltaWNraW5nIEJ1bidzIFNFUVVFTlRJQUwgZXZhbHVhdGlvbixcbiAqIGRlcml2ZWQgZW1waXJpY2FsbHkgd2l0aCBCdW4gMS4zLjE0IChmaXh0dXJlIHJlcG9zIG9ic2VydmVkIHZpYSBgYnVuIGluc3RhbGwgLS1sb2NrZmlsZS1vbmx5YDtcbiAqIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA0IC8gV2lsbEJvb3N0ZXIvc2hhcmVkIzEwMDUpOlxuICogMS4gUGF0dGVybnMgYXJlIGV2YWx1YXRlZCBpbiBkZWNsYXJhdGlvbiBvcmRlciBpbnRvIGFuIGFjY3VtdWxhdGluZyBzZXQ6IGEgcG9zaXRpdmUgZ2xvYlxuICogICAgcGF0dGVybiBhZGRzIGV2ZXJ5IHBhY2thZ2UuanNvbiBpdCBtYXRjaGVzOyBhIG5lZ2F0aW9uIGRlbGV0ZXMgaXRzIG1hdGNoZXMgZnJvbSB0aGUgc2V0XG4gKiAgICBhY2N1bXVsYXRlZCBTTyBGQVIsIHNvIGEgbGF0ZXIgcG9zaXRpdmUgcmUtYWRkcyB0aGVtIChgW1wiIWFwcHMvZXhjbHVkZWRcIiwgXCJhcHBzLypcIl1gIGxpbmtzXG4gKiAgICBhcHBzL2V4Y2x1ZGVkLCB3aGlsZSBgW1wiYXBwcy8qXCIsIFwiIWFwcHMvZXhjbHVkZWRcIl1gIGRvZXMgbm90KS5cbiAqIDIuIEEgbmVnYXRpb24gd2hvc2Ugbm9ybWFsaXplZCBib2R5IGhhcyBFWEFDVExZIHR3byBzZWdtZW50cywgd2hvc2UgbGFzdCBzZWdtZW50IGlzIGEgc3Rhci1ydW5cbiAqICAgIChgKmAsIGAqKmAsIGAqKipgLCDigKYpLCBhbmQgd2hvc2UgZmlyc3Qgc2VnbWVudCBpcyBOT1QgaXRzZWxmIGEgc3Rhci1ydW4gZmlyc3Qgc2VlZHMgdGhlXG4gKiAgICBpbXBsaWNpdCBiYXNlbGluZSBpbnRvIHRoZSBzZXQsIHRoZW4gZGVsZXRlcyBpdHMgb3duIG1hdGNoZXM6IGEgYCoqYCBsYXN0IHNlZ21lbnQgc2VlZHNcbiAqICAgIGAqKmAgKHBhY2thZ2VzIGF0IGFueSBkZXB0aCksIGFueSBvdGhlciBzdGFyLXJ1biBzZWVkcyBgKlxcLypgIChkZXB0aCAyIG9ubHkpLiBTZWVkaW5nXG4gKiAgICBoYXBwZW5zIGV2ZW4gYWxvbmdzaWRlIHBvc2l0aXZlIHBhdHRlcm5zIChgW1wiYXBwcy8qXCIsIFwiIW90aGVyLypcIl1gIGxpbmtzIGV2ZXJ5IGRlcHRoLTJcbiAqICAgIHBhY2thZ2Ugb3V0c2lkZSBvdGhlci8pLiBObyBvdGhlciBuZWdhdGlvbiBzaGFwZSBzZWVkczogYCEqYCwgYCEqKmAsIGAhKlxcLypgLCBgISpcXC8qKmAsXG4gKiAgICBgISoqXFwvKmAsIGAhYS9iLypgLCBgIWEvYi8qKmAsIGAhZGlyYCwgYW5kIGAhZGlyLyp4YCBlYWNoIGxpbmsgbm90aGluZyBvbiB0aGVpciBvd24uXG4gKiAgICBgP2AsIGJyYWNlLCBhbmQgY2hhcmFjdGVyLWNsYXNzIGxhc3Qgc2VnbWVudHMgYmVoYXZlIEVSUkFUSUNBTExZIChgW1wiIW90aGVyLz9cIl1gIGxpbmtzXG4gKiAgICBwYWNrYWdlcy9hIHlldCBub3QgdGhlIGVxdWFsbHkgYmFzZWxpbmUtc2hhcGVkIG90aGVyL3l5LCBgW1wiIW90aGVyLz8/XCJdYCBsaW5rcyBub3RoaW5nLCBhbmRcbiAqICAgIGBbXCIhPy8/XCJdYCBsaW5rcyB0aGUgdmVyeSBvdGhlci94IGl0IG1hdGNoZXMpLCBzbyBubyBjb25zaXN0ZW50IHJ1bGUgY2FuIG1vZGVsIHRoZW07IHRoZXlcbiAqICAgIGFyZSBkZWxpYmVyYXRlbHkgdHJlYXRlZCBhcyBub3Qgc2VlZGluZyDigJQgc2VlIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUgYW5kICMxMDA1LlxuICogMy4gQSBub24tZ2xvYiBwb3NpdGl2ZSBwYXR0ZXJuIFBJTlMgaXRzIGRpcmVjdG9yeTogaXQgc3RheXMgYSB3b3Jrc3BhY2UgcmVnYXJkbGVzcyBvZiB3aGVyZSBhXG4gKiAgICBtYXRjaGluZyBuZWdhdGlvbiBhcHBlYXJzIChgW1wib3RoZXIveFwiLCBcIiFvdGhlci94XCJdYCBhbmQgYFtcIiFvdGhlci94XCIsIFwib3RoZXIveFwiXWAgYm90aFxuICogICAgbGluayBvdGhlci94KS5cbiAqIDQuIGAqKmAgbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgcGF0aCBzZWdtZW50cyAoYFtcImFwcHMvKipcIl1gIGxpbmtzIHRoZSBwYWNrYWdlIGF0IGFwcHMgaXRzZWxmLCBhbmRcbiAqICAgIGAhYXBwcy8qKmAgZGVsZXRlcyBpdCksIG1hdGNoaW5nIGZhc3QtZ2xvYidzIGZpbGUtZ2xvYiBzZW1hbnRpY3MuXG4gKiBEbyBub3QgYXBwbHkgZ2xvYklnbm9yZSBoZXJlOiB3b3Jrc3BhY2UgbWVtYmVyc2hpcCBpcyBkZWZpbmVkIHNvbGVseSBieSB0aGUgZGVjbGFyZWQgcGF0dGVybnMsXG4gKiBhbmQgc291cmNlLXNjYW5uaW5nIGlnbm9yZXMgc3VjaCBhcyBgYnVpbGRgIG9yIGBkaXN0YCB3b3VsZCBoaWRlIGxlZ2l0aW1hdGVseSBuYW1lZCB3b3Jrc3BhY2VcbiAqIGRpcmVjdG9yaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMod29ya3NwYWNlUGF0dGVybnM6IHN0cmluZ1tdLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAvLyBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSBzdG9wcyBHTE9CIHRyYXZlcnNhbCB0aHJvdWdoIHN5bWxpbmtzLCBidXQgYSBub24tZ2xvYiBwYXR0ZXJuXG4gIC8vIG5hbWluZyBhIHN5bWxpbmtlZCBkaXJlY3RvcnkgKGUuZy4gYGxpbmtlZGAgd2l0aCBgbGlua2VkIC0+IC4uL290aGVyLXJlcG9gKSBzdGlsbCBtYXRjaGVzIOKAlFxuICAvLyBmYXN0LWdsb2IgcmVzb2x2ZXMgc3RhdGljIHBhdHRlcm5zIHdpdGggZGlyZWN0IGZzIGNoZWNrcywgYW5kIEJ1biBkb2VzIGxpbmsgc3VjaCBhIHdvcmtzcGFjZS5cbiAgLy8gRGVsaWJlcmF0ZWx5IGRpdmVyZ2UgZnJvbSBCdW4gdGhlcmU6IGNvbnN1bWVycyBzdWNoIGFzIG5vZGVfbW9kdWxlcyBjbGVhbnVwIGFuZCBtYW5pZmVzdFxuICAvLyByZXdyaXRpbmcgd291bGQgb3RoZXJ3aXNlIGRlbGV0ZSBhbmQgcmV3cml0ZSBmaWxlcyBpbiBBTk9USEVSIHJlcG9zaXRvcnkgdGhyb3VnaCB0aGUgc3ltbGluayxcbiAgLy8gc28ga2VlcCBvbmx5IG1hbmlmZXN0cyB3aG9zZSByZWFsIHBhdGggc3RheXMgaW5zaWRlIHRoZSByZXBvc2l0b3J5J3MgcmVhbCByb290LiBTY2FubmluZyBlYWNoXG4gIC8vIHBhdHRlcm4gc2VwYXJhdGVseSAobm8gY3Jvc3MtcGF0dGVybiBjYWNoaW5nKSBpcyBkZWxpYmVyYXRlOiBkZWNsYXJhdGlvbnMgaG9sZCBhIGhhbmRmdWwgb2ZcbiAgLy8gcGF0dGVybnMsIHNvIGEgY2FjaGUgd291bGQgY29tcGxpY2F0ZSB0aGlzIHNoYXJlZCBjb2RlIHdpdGhvdXQgbWVhc3VyYWJsZSBnYWluLlxuICBjb25zdCBnbG9iTWFuaWZlc3RQYXRocyA9IChwYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgLy8gQnVuIGxpbmtzIGRvdC1kaXJlY3RvcnkgcGFja2FnZXMgb25seSB0aHJvdWdoIGZ1bGx5IHN0YXRpYyBwYXR0ZXJuczogd2l0aCBCdW4gMS4zLjE0LFxuICAgIC8vIGAuaGlkZGVuL3hgIHBpbnMgdGhlIHBhY2thZ2Ugd2hpbGUgYC5oaWRkZW4vKmAsIGAuKi8qYCwgYW5kIGAqKmAgYWxsIGxpbmsgbm90aGluZyB1bmRlclxuICAgIC8vIC5oaWRkZW4g4oCUIGV2ZW4gd2hlbiB0aGUgZG90dGVkIHNlZ21lbnQgaXRzZWxmIGlzIGxpdGVyYWwg4oCUIHNvIGFueSBkeW5hbWljIHBhdHRlcm4gbXVzdFxuICAgIC8vIGRyb3AgbWF0Y2hlcyBjb250YWluaW5nIGEgZG90LWxlZCBzZWdtZW50IChmYXN0LWdsb2IncyBgZG90OiBmYWxzZWAgb25seSBjb3ZlcnMgc2VnbWVudHNcbiAgICAvLyBhIHdpbGRjYXJkIG1hdGNoZXMpLlxuICAgIGNvbnN0IGV4Y2x1ZGVzRG90U2VnbWVudHMgPSBmZy5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm4pO1xuICAgIGNvbnN0IGdsb2JPcHRpb25zID0geyBjd2Q6IHJvb3REaXJQYXRoLCBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSwgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddIH07XG4gICAgLy8gZmFzdC1nbG9iIDMuMy4zIHJldHVybnMgbm8gbWF0Y2hlcyBmb3IgZmlsZSBnbG9icyB3aXRoIGEgbG9uZS1gP2Agc2VnbWVudCAoZS5nLlxuICAgIC8vIGBwYWNrYWdlcy8/L3BhY2thZ2UuanNvbmApLCBhbHRob3VnaCBtaWNyb21hdGNoIG1hdGNoZXMgdGhlbSBhbmQgQnVuIDEuMy4xNCBsaW5rcyBzdWNoXG4gICAgLy8gd29ya3NwYWNlczsgZm9yIGA/YC1jYXJyeWluZyBwYXR0ZXJucyBvbmx5IChhIGRpcmVjdG9yeSBnbG9iIGZvciBlLmcuIGAqKmAgd291bGQgc2NhbiBldmVyeVxuICAgIC8vIGRpcmVjdG9yeSBpbiB0aGUgcmVwb3NpdG9yeSksIGdsb2JiaW5nIHRoZSBkaXJlY3RvcmllcyAod2hlcmUgYD9gIHdvcmtzKSBhbmQgY2hlY2tpbmcgdGhlaXJcbiAgICAvLyBtYW5pZmVzdHMgY29tcGxlbWVudHMgdGhlIG1hbmlmZXN0IGdsb2IsIHdoaWNoIHN0YXlzIG5lY2Vzc2FyeSBmb3IgYCoqYCdzIHplcm8tc2VnbWVudFxuICAgIC8vIG1hdGNoZXMg4oCUIGBkaXIvKipgIGRvZXMgbm90IHJldHVybiBkaXIgaXRzZWxmIGFzIGEgZGlyZWN0b3J5LlxuICAgIGNvbnN0IG1hbmlmZXN0UGF0aHMgPSBuZXcgU2V0KGZnLmdsb2JTeW5jKHBhdGgucG9zaXguam9pbihwYXR0ZXJuLCAncGFja2FnZS5qc29uJyksIGdsb2JPcHRpb25zKSk7XG4gICAgaWYgKHBhdHRlcm4uaW5jbHVkZXMoJz8nKSkge1xuICAgICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgLi4uZ2xvYk9wdGlvbnMsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnBvc2l4LmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsIHBhY2thZ2VKc29uUGF0aCkpKSBtYW5pZmVzdFBhdGhzLmFkZChwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBIHplcm8tc2VnbWVudCBgKipgIG1hdGNoIHJlYWNoZXMgdGhlIHJvb3QncyBvd24gbWFuaWZlc3QsIGJ1dCBCdW4gbmV2ZXIgdHJlYXRzIHRoZVxuICAgIC8vIG1vbm9yZXBvIHJvb3QgYXMgaXRzIG93biB3b3Jrc3BhY2UuXG4gICAgcmV0dXJuIFsuLi5tYW5pZmVzdFBhdGhzXS5maWx0ZXIoXG4gICAgICAocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgICBwYWNrYWdlSnNvblBhdGggIT09ICdwYWNrYWdlLmpzb24nICYmXG4gICAgICAgICghZXhjbHVkZXNEb3RTZWdtZW50cyB8fCAhcGFja2FnZUpzb25QYXRoLnNwbGl0KCcvJykuc29tZSgoc2VnbWVudCkgPT4gc2VnbWVudC5zdGFydHNXaXRoKCcuJykpKSAmJlxuICAgICAgICBpc0luc2lkZVJlYWxSb290KHBhY2thZ2VKc29uUGF0aClcbiAgICApO1xuICB9O1xuICBsZXQgcmVhbFJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGlzSW5zaWRlUmVhbFJvb3QgPSAocGFja2FnZUpzb25QYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICB0cnkge1xuICAgICAgcmVhbFJvb3REaXJQYXRoID8/PSBmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpO1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShyZWFsUm9vdERpclBhdGgsIGZzLnJlYWxwYXRoU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsIHBhY2thZ2VKc29uUGF0aCkpKTtcbiAgICAgIC8vIENvbXBhcmUgd2hvbGUgc2VnbWVudHMsIG5vdCBhIGAuLmAgcHJlZml4OiBhIGRpcmVjdG9yeSBsaXRlcmFsbHkgbmFtZWQgZS5nLiBgLi5wa2dgIGlzXG4gICAgICAvLyBpbnNpZGUgdGhlIHJvb3QsIHdoaWxlIGEgcGxhaW4gc3RhcnRzV2l0aCgnLi4nKSB3b3VsZCBtaXNyZWFkIGl0IGFzIHBhcmVudCB0cmF2ZXJzYWwuXG4gICAgICByZXR1cm4gcmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQSBtYW5pZmVzdCB0aGF0IHZhbmlzaGVkIGJldHdlZW4gdGhlIGdsb2IgYW5kIHRoZSByZWFscGF0aCBjYWxsIGlzIG5vdCBhIHdvcmtzcGFjZS5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGFjY3VtdWxhdGVkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgcGlubmVkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXR0ZXJuIG9mIHdvcmtzcGFjZVBhdHRlcm5zKSB7XG4gICAgY29uc3QgaXNOZWdhdGl2ZSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpO1xuICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkoaXNOZWdhdGl2ZSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuKTtcbiAgICBpZiAoaXNOZWdhdGl2ZSkge1xuICAgICAgY29uc3QgYmFzZWxpbmVHbG9iID0gZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKHBhdHRlcm5Cb2R5KTtcbiAgICAgIGlmIChiYXNlbGluZUdsb2IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhiYXNlbGluZUdsb2IpKSBhY2N1bXVsYXRlZFBhdGhzLmFkZChwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMocGF0dGVybkJvZHkpKSBhY2N1bXVsYXRlZFBhdGhzLmRlbGV0ZShwYWNrYWdlSnNvblBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YXJnZXRQYXRocyA9IGZnLmlzRHluYW1pY1BhdHRlcm4ocGF0dGVybkJvZHkpID8gYWNjdW11bGF0ZWRQYXRocyA6IHBpbm5lZFBhdGhzO1xuICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMocGF0dGVybkJvZHkpKSB7XG4gICAgICAgIHRhcmdldFBhdGhzLmFkZChwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmFjY3VtdWxhdGVkUGF0aHMsIC4uLnBpbm5lZFBhdGhzXSldLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZGVjbGFyYXRpb24gc2VlZHMgQnVuJ3MgaW1wbGljaXQgd29ya3NwYWNlIGJhc2VsaW5lOiBpdCBjb250YWlucyBhdCBsZWFzdCBvbmVcbiAqIG5lZ2F0aW9uIG9mIHRoZSBzZWVkaW5nIHNoYXBlIChzZWUgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMgcnVsZSAyKS4gTWVhc3VyZWQgd2l0aCBCdW5cbiAqIDEuMy4xNCwgc2VlZGluZyBpcyBwZXItbmVnYXRpb24gYW5kIGhhcHBlbnMgZXZlbiBhbG9uZ3NpZGUgcG9zaXRpdmUgcGF0dGVybnM7IGNvbmNyZXRlIG9yXG4gKiBtaXhlZC1saXRlcmFsIGxhc3Qgc2VnbWVudHMgKGAhYXBwcy9leGNsdWRlZGAsIGAhYXBwcy8qZGApIG5ldmVyIHNlZWQsIGFuZCBgP2AsIGJyYWNlLCBhbmRcbiAqIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZWQgaW5jb25zaXN0ZW50bHkgYWNyb3NzIGZpeHR1cmVzIChzb21ldGltZXMgZHJvcHBpbmcgZXZlblxuICogdW5yZWxhdGVkIHNpYmxpbmcgd29ya3NwYWNlcyksIHNvIHRoZXkgYXJlIGNvbnNlcnZhdGl2ZWx5IHRyZWF0ZWQgYXMgbm90IHNlZWRpbmc7IHNlZVxuICogV2lsbEJvb3N0ZXIvc2hhcmVkIzEwMDUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbik6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlcykuc29tZShcbiAgICAod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpICYmXG4gICAgICBnZXRTZWVkZWRCYXNlbGluZUdsb2Iobm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkod29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSkpICE9PSB1bmRlZmluZWRcbiAgKTtcbn1cblxuLyoqXG4gKiBEZWNsYXJlZCB3b3Jrc3BhY2UgcGF0dGVybnMgd2l0aG91dCBCdW4ncyBuby1vcCBvbmVzIChgXCJcImAsIGEgbG9uZSBgXCIhXCJgLCBhbmQgYFwiLlwiYCksIHdoaWNoIEJ1blxuICogaWdub3JlcyBlbnRpcmVseSDigJQgYSBsb25lIGBcIiFcImAgbXVzdCBub3QgYWN0aXZhdGUgdGhlIG5lZ2F0aXZlLW9ubHkgaW1wbGljaXQgYmFzZWxpbmUsIGFuZCBgXCJcImBcbiAqIG11c3Qgbm90IG1ha2UgdGhlIHJlcG9zaXRvcnkgcm9vdCBpdHNlbGYgYSBkaXNjb3ZlcmVkIHdvcmtzcGFjZS4gRGVjbGFyYXRpb24gb3JkZXIgYW5kXG4gKiBkdXBsaWNhdGVzIGFyZSBwcmVzZXJ2ZWQg4oCUIEJ1biBldmFsdWF0ZXMgdGhlIHBhdHRlcm5zIHNlcXVlbnRpYWxseSwgc28gcG9zaXRpb24gbWF0dGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlcylcbiAgICAubWFwKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiB7XG4gICAgICAvLyBCdW4gYXBwbGllcyBsZWFkaW5nLWJhbmcgUEFSSVRZICh2ZXJpZmllZCB3aXRoIEJ1biAxLjMuMTQpOiBgISFwYCBpcyB0aGUgcG9zaXRpdmUgYHBgXG4gICAgICAvLyBhbmQgYCEhIXBgIHRoZSBuZWdhdGlvbiBgIXBgLCBzbyBjYW5vbmljYWxpemUgdG8gYXQgbW9zdCBvbmUgYmFuZy5cbiAgICAgIGNvbnN0IGJhbmdDb3VudCA9IC9eISovdS5leGVjKHdvcmtzcGFjZVBhdHRlcm4pIVswXS5sZW5ndGg7XG4gICAgICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoYmFuZ0NvdW50KTtcbiAgICAgIHJldHVybiBiYW5nQ291bnQgJSAyID09PSAxID8gYCEke3BhdHRlcm5Cb2R5fWAgOiBwYXR0ZXJuQm9keTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKHdvcmtzcGFjZVBhdHRlcm4pID0+IHtcbiAgICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybjtcbiAgICAgIC8vIE5vcm1hbGl6ZSBzbyBzcGVsbGluZ3MgbGlrZSBgLi9gLCBgLi8uYCwgYW5kIGAhLi9gIGFyZSByZWNvZ25pemVkIGFzIHRoZSBzYW1lIG5vLW9wc1xuICAgICAgLy8gKHBhdGgucG9zaXgubm9ybWFsaXplKCcnKSA9PT0gJy4nLCBzbyB0aGUgZW1wdHkgcGF0dGVybiBpcyBjb3ZlcmVkIHRvbykuXG4gICAgICByZXR1cm4gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkocGF0dGVybkJvZHkpICE9PSAnLic7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQ29sbGFwc2VzIGAvL2AsIHJlc29sdmVzIGAuL2AsIGFuZCBzdHJpcHMgdHJhaWxpbmcgc2xhc2hlcywgbWlycm9yaW5nIEJ1bidzIHBhdGggaGFuZGxpbmcuXG4gKiBBIHB1cmUgc3Rhci1ydW4gc2VnbWVudCBvZiB0aHJlZSBvciBtb3JlIHN0YXJzIGJlaGF2ZXMgbGlrZSBgKmAgdW5kZXIgQnVuIChgIW90aGVyLyoqKmBcbiAqIG1hdGNoZXMgb3RoZXIveCkgYnV0IG5vdCB1bmRlciBmYXN0LWdsb2IsIHNvIGNhbm9uaWNhbGl6ZSBpdCB0byBgKmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShwYXR0ZXJuQm9keTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgucG9zaXhcbiAgICAubm9ybWFsaXplKHBhdHRlcm5Cb2R5KVxuICAgIC5yZXBsYWNlKC9cXC8rJC91LCAnJylcbiAgICAuc3BsaXQoJy8nKVxuICAgIC5tYXAoKHNlZ21lbnQpID0+ICgvXlxcKnszLH0kL3UudGVzdChzZWdtZW50KSA/ICcqJyA6IHNlZ21lbnQpKVxuICAgIC5qb2luKCcvJyk7XG59XG5cbi8qKiBUaGUgaW1wbGljaXQgYmFzZWxpbmUgZ2xvYiBhIG5lZ2F0aW9uIHNlZWRzIHVuZGVyIEJ1bidzIHJ1bGUgMiBhYm92ZSwgb3IgdW5kZWZpbmVkIGlmIG5vbmUuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKG5lZ2F0aW9uQm9keTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBuZWdhdGlvbkJvZHkuc3BsaXQoJy8nKTtcbiAgaWYgKHNlZ21lbnRzLmxlbmd0aCAhPT0gMikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgW2ZpcnN0U2VnbWVudCwgbGFzdFNlZ21lbnRdID0gc2VnbWVudHMgYXMgW3N0cmluZywgc3RyaW5nXTtcbiAgaWYgKCEvXlxcKiskL3UudGVzdChsYXN0U2VnbWVudCkgfHwgL15cXCorJC91LnRlc3QoZmlyc3RTZWdtZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGxhc3RTZWdtZW50ID09PSAnKionID8gJyoqJyA6ICcqLyonO1xufVxuXG4vKiogV29ya3NwYWNlIHBhdHRlcm5zIGZyb20gZWl0aGVyIHRoZSBhcnJheSBmb3JtIG9yIFlhcm4gdjEncyBgeyBwYWNrYWdlczogW+KApl0gfWAgb2JqZWN0IGZvcm0uICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBzdHJpbmdbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHdvcmtzcGFjZXMpKSByZXR1cm4gd29ya3NwYWNlcztcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkod29ya3NwYWNlcz8ucGFja2FnZXMpID8gd29ya3NwYWNlcy5wYWNrYWdlcyA6IFtdO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBkZWNsYXJlZCB3b3Jrc3BhY2UgcGF0dGVybiAobmVnYXRpdmUgb25lcyBpbmNsdWRlZCkgc3RheXMgaW5zaWRlIHRoZSByZXBvc2l0b3J5OlxuICogYWJzb2x1dGUgb3IgYC4uYC10cmF2ZXJzaW5nIHBhdHRlcm5zIHdvdWxkIG1ha2UgY29uc3VtZXJzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIGNsZWFudXAgb3BlcmF0ZVxuICogb24gYW5vdGhlciByZXBvc2l0b3J5J3MgZmlsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhdHRlcm5Cb2R5ID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybjtcbiAgcmV0dXJuICFwYXRoLnBvc2l4LmlzQWJzb2x1dGUocGF0dGVybkJvZHkpICYmICFwYXR0ZXJuQm9keS5zcGxpdCgnLycpLmluY2x1ZGVzKCcuLicpO1xufVxuIiwiaW1wb3J0IGNyeXB0byBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG4vKipcbiAqIEFuY2hvcmVkIHRvIGBcIiwgYCBzbyBvbmx5IGEgcmVnaXN0cnkgZW50cnkncyBgcmVzb2x2ZWRgIHNsb3QgaXMgY2xlYXJlZC4gQSBkaXJlY3QgdGFyYmFsbFxuICogZGVwZW5kZW5jeSBjYXJyaWVzIGl0cyBVUkwgaW4gdGhlIHdvcmtzcGFjZSBkZXNjcmlwdG9yIGFuZCB0dXBsZSBpZGVudGlmaWVyIGluc3RlYWQsIGFuZCB0aG9zZVxuICogVVJMcyBtdXN0IHJlbWFpbiBpbnRhY3QuXG4gKi9cbmNvbnN0IGd1YXJkUmVzb2x2ZWRVcmxQYXR0ZXJuID0gLyhcIiwgKVwiaHR0cHM6XFwvXFwvbnBtXFwuZmxhdHRcXC50ZWNoXFwvW15cIl0qXCIvZztcblxuLyoqXG4gKiBSZW1vdmUgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgYnVuLmxvY2suXG4gKlxuICogQnVuIHdyaXRlcyB0aGUgd29ya3NwYWNlIHJvb3QncyBsb2NrZmlsZSBldmVuIHdoZW4gYW4gaW5zdGFsbCBydW5zIGZyb20gYSBjaGlsZCBwYWNrYWdlLiBJbiBhXG4gKiBHaXQgY2hlY2tvdXQgdGhlIHNlYXJjaCBjbGltYnMgdG8gdGhhdCByb290OyB3aXRob3V0IGEgY2hlY2tvdXQgYm91bmRhcnkgaXQgaW5zcGVjdHMgb25seSB0aGVcbiAqIHN0YXJ0aW5nIGRpcmVjdG9yeSBzbyBpdCBjYW5ub3QgcmV3cml0ZSBhbiB1bnJlbGF0ZWQgYW5jZXN0b3IncyBsb2NrZmlsZS4gVGhlIHByb3h5IGlzXG4gKiBpbnN0YWxsLXRpbWUgcG9saWN5IHJhdGhlciB0aGFuIHJlcG9zaXRvcnkgc3RhdGU6IGFuIGVtcHR5IHJlc29sdmVkIHNsb3Qgc3RpbGwgbWFrZXMgQnVuIHVzZSB0aGVcbiAqIGNvbmZpZ3VyZWQgZGVmYXVsdCByZWdpc3RyeS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBsb2NrZmlsZSBwYXRoLCBvciB1bmRlZmluZWQgd2hlbiBubyBjaGFuZ2Ugd2FzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUJ1bkxvY2tmaWxlKHN0YXJ0RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbG9ja2ZpbGVQYXRoID0gZmluZEJ1bkxvY2tmaWxlUGF0aChzdGFydERpclBhdGgpO1xuICBpZiAoIWxvY2tmaWxlUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMobG9ja2ZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbChndWFyZFJlc29sdmVkVXJsUGF0dGVybiwgJyQxXCJcIicpO1xuICBpZiAobm9ybWFsaXplZENvbnRlbnQgPT09IGNvbnRlbnQpIHJldHVybjtcblxuICAvLyBBIHNpYmxpbmcgdGVtcCBmaWxlIG1ha2VzIHRoZSByZXBsYWNlbWVudCBhbiBhdG9taWMgc2FtZS1kaXJlY3RvcnkgcmVuYW1lLCBzbyBhbiBpbnRlcnJ1cHRlZFxuICAvLyB3cml0ZSBjYW5ub3QgbGVhdmUgYSB0cnVuY2F0ZWQgYnVuLmxvY2sgYmVoaW5kLlxuICBjb25zdCB0ZW1wb3JhcnlQYXRoID0gYCR7bG9ja2ZpbGVQYXRofS5ub3JtYWxpemluZy4ke3Byb2Nlc3MucGlkfS4ke2NyeXB0by5yYW5kb21VVUlEKCl9YDtcbiAgdHJ5IHtcbiAgICAvLyBzdGF0J3MgbW9kZSBpbmNsdWRlcyBmaWxlLXR5cGUgYml0cywgd2hpY2ggY2htb2QgaXMgbm90IHNwZWNpZmllZCB0byBhY2NlcHQuXG4gICAgY29uc3QgbW9kZSA9IGZzLnN0YXRTeW5jKGxvY2tmaWxlUGF0aCkubW9kZSAmIDBvNzc3O1xuICAgIGZzLndyaXRlRmlsZVN5bmModGVtcG9yYXJ5UGF0aCwgbm9ybWFsaXplZENvbnRlbnQsIHsgbW9kZSB9KTtcbiAgICAvLyB3cml0ZUZpbGVTeW5jJ3MgbW9kZSBpcyBtYXNrZWQgYnkgdGhlIHByb2Nlc3MgdW1hc2s7IGNobW9kIHJlc3RvcmVzIHRoZSBleGFjdCBvcmlnaW5hbCBiaXRzLlxuICAgIGZzLmNobW9kU3luYyh0ZW1wb3JhcnlQYXRoLCBtb2RlKTtcbiAgICBmcy5yZW5hbWVTeW5jKHRlbXBvcmFyeVBhdGgsIGxvY2tmaWxlUGF0aCk7XG4gIH0gZmluYWxseSB7XG4gICAgZnMucm1TeW5jKHRlbXBvcmFyeVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIGxvY2tmaWxlUGF0aDtcbn1cblxuZnVuY3Rpb24gZmluZEJ1bkxvY2tmaWxlUGF0aChzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkU3RhcnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKHN0YXJ0RGlyUGF0aCk7XG4gIGNvbnN0IHJlcG9zaXRvcnlSb290RGlyUGF0aCA9IGZpbmRSZXBvc2l0b3J5Um9vdERpclBhdGgocmVzb2x2ZWRTdGFydERpclBhdGgpO1xuICBpZiAoIXJlcG9zaXRvcnlSb290RGlyUGF0aCkge1xuICAgIGNvbnN0IGxvY2tmaWxlUGF0aCA9IHBhdGguam9pbihyZXNvbHZlZFN0YXJ0RGlyUGF0aCwgJ2J1bi5sb2NrJyk7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMobG9ja2ZpbGVQYXRoKSA/IGxvY2tmaWxlUGF0aCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGxldCBkaXJQYXRoID0gcmVzb2x2ZWRTdGFydERpclBhdGg7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgbG9ja2ZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsICdidW4ubG9jaycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2tmaWxlUGF0aCkpIHJldHVybiBsb2NrZmlsZVBhdGg7XG4gICAgaWYgKGRpclBhdGggPT09IHJlcG9zaXRvcnlSb290RGlyUGF0aCkgcmV0dXJuO1xuXG4gICAgZGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kUmVwb3NpdG9yeVJvb3REaXJQYXRoKHN0YXJ0RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGRpclBhdGggPSBzdGFydERpclBhdGg7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICcuZ2l0JykpKSByZXR1cm4gZGlyUGF0aDtcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGRpclBhdGgpIHJldHVybjtcbiAgICBkaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuIiwiLyoqIFdoZXRoZXIgYSBEb2NrZXJmaWxlIGNvbnN1bWVzIHdiJ3MgZ2VuZXJhdGVkIG5vbi1zZWNyZXQgZW52aXJvbm1lbnQgZGlyZWN0bHkgb3IgdGhyb3VnaCBpdHMgaGVscGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN1bWVzRG9ja2VyRW52KGRvY2tlcmZpbGVUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGRvY2tlcmZpbGVUZXh0XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5zb21lKChsaW5lKSA9PiAhL15cXHMqIy91LnRlc3QobGluZSkgJiYgKGxpbmUuaW5jbHVkZXMoJy5kb2NrZXIuZW52JykgfHwgbGluZS5pbmNsdWRlcygnYXBwbHktZG9ja2VyLWVudi5zaCcpKSk7XG59XG4iLCJleHBvcnQgY29uc3QgZ2xvYklnbm9yZSA9IFtcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi8uYW50aWdyYXZpdHljbGkvKionLFxuICAvLyBHaXQncyBvYmplY3Qgc3RvcmUgaG9sZHMgY29waWVzIG9mIHRyYWNrZWQgZmlsZXMgKGFuZCBgZG90OiB0cnVlYCBtYWtlcyB0aGVtIHZpc2libGUpLCBzb1xuICAvLyBzY2FubmluZyBpdCB3b3VsZCBib3RoIHNsb3cgZXZlcnkgZ2xvYiBkb3duIGFuZCBsZXQgc3RhbGUgYmxvYnMgaW5mbHVlbmNlIGRldGVjdGlvbi5cbiAgJyoqLy5naXQvKionLFxuICAvLyBUaGUgb3JnLXN0YW5kYXJkIHRlbXBvcmFyeSBkaXJlY3Rvcnk7IHN0YWxlIGNvcGllcyB1bmRlciBpdCAoZS5nLiByZXZpZXcgc2NyYXRjaCBkaXJzKSBtdXN0XG4gIC8vIG5vdCBpbmZsdWVuY2UgbGFuZ3VhZ2UgZGV0ZWN0aW9uLlxuICAnKiovLnRtcC8qKicsXG4gICcqKi8udG1wLSovKionLFxuICAvLyBMb2NhbCBjYWNoZXMgY2FuIGNvbnRhaW4gY29tcGxldGUgdGhpcmQtcGFydHkgc291cmNlIGNoZWNrb3V0cy4gVHJlYXRpbmcgdGhvc2UgYXMgcmVwb3NpdG9yeVxuICAvLyBjb2RlIGdlbmVyYXRlcyB3b3JrZmxvd3MgZm9yIHBhdGhzIHRoYXQgYXJlIGdpdGlnbm9yZWQgYW5kIGFic2VudCBmcm9tIGZyZXNoIENJIGNoZWNrb3V0cy5cbiAgJyoqLy5jYWNoZS8qKicsXG4gICcqKi8udmVudi8qKicsXG4gICcqKi90ZXN0LWZpeHR1cmVzLyoqJyxcbiAgJyoqL3Rlc3QvZml4dHVyZXMvKionLFxuICAnKiovZGlzdC8qKicsXG4gICcqKi9idWlsZC8qKicsXG4gICcqKi90YXJnZXQvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi90bXAvKionLFxuXTtcbiIsImNsYXNzIE9wdGlvbnMge1xuICBpc1ZlcmJvc2UgPSBmYWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpO1xuIiwiaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5cbmNsYXNzIExvZ2dlciB7XG4gIGFzeW5jIGZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24obmFtZTogc3RyaW5nLCBmdW5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLSAke25hbWV9IHN0YXJ0IC0tLS0tLS0tLWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnVuYygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEVycm9yIG9jY3VycmVkIGluICR7bmFtZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogU3RyaW5nKGVycm9yKX19YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0tICR7bmFtZX0gZW5kIC0tLS0tLS0tLS1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmxldCByZWFsUm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGNvbnN0IGZzVXRpbCA9IHtcbiAgLyoqIENvbmZpbmVzIGdlbmVyYXRlRmlsZSB3cml0ZXMgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdGVkIGF0IHJvb3REaXJQYXRoICh1bmRlZmluZWQgZGlzYWJsZXMgaXQpLiAqL1xuICBzZXRSb290RGlyUGF0aChyb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgcmVhbFJvb3REaXJQYXRoID0gcm9vdERpclBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBvbmx5IHdoZW4gdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QuIE90aGVyIGZhaWx1cmVzIChlLmcuIHBlcm1pc3Npb25zKSBhcmVcbiAgICogcmV0aHJvd24gc28gY2FsbGVycyByZWdlbmVyYXRpbmcgY29uZmlnIGZpbGVzIG5ldmVyIG92ZXJ3cml0ZSBjb250ZW50IHRoZXkgY291bGQgbm90IHJlYWQuXG4gICAqL1xuICBhc3luYyByZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfSxcbiAgLyoqIFRlbGxzIHdoZXRoZXIgYSB3cml0ZSB0byBmaWxlUGF0aCB3b3VsZCBwYXNzIHRoZSBzeW1saW5rL3JlcG9zaXRvcnktY29udGFpbm1lbnQgZ3VhcmRzLiAqL1xuICBhc3luYyBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gYXdhaXQgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZWFkcyBhIHNvdXJjZSBmaWxlLCByZXR1cm5pbmcgdW5kZWZpbmVkIHdoZW4gdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgT1Igd2hlbiBpdFxuICAgKiByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IOKAlCBhIGNvbW1pdHRlZCBzeW1saW5rIHBvaW50aW5nIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkgbXVzdFxuICAgKiBub3QgZ2V0IGl0cyB0YXJnZXQncyBjb250ZW50IGNvcGllZCBpbnRvIGEgdHJhY2tlZCBmaWxlLiBBIHN5bWxpbmsgd2hvc2UgcmVzb2x2ZWQgdGFyZ2V0XG4gICAqIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeSBpcyBsZWdpdGltYXRlIChlLmcuIGAubm9kZS12ZXJzaW9uIC0+IC5udm1yY2ApIGFuZCBpcyByZWFkLlxuICAgKi9cbiAgYXN5bmMgcmVhZEZpbGVDb25maW5lZElmRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBpZiAoIXN0YXRzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICBsZXQgcmVhbEZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICByZWFsRmlsZVBhdGggPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFscGF0aChmaWxlUGF0aCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlYWRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCBpcyBhIGRhbmdsaW5nIHN5bWJvbGljIGxpbmsuYCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHJlYWxSb290RGlyUGF0aCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHJlYWxGaWxlUGF0aCAhPT0gcmVhbFJvb3REaXJQYXRoICYmXG4gICAgICAgICFyZWFsRmlsZVBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcClcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgcmVhZGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgcmVhZGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICB9LFxuICAvKipcbiAgICogUmVtb3ZlcyBmaWxlUGF0aCAoZm9yY2UsIG9wdGlvbmFsbHkgcmVjdXJzaXZlKSBvbmx5IHdoZW4gaXRzIFBBUkVOVCBkaXJlY3RvcnkgcmVzb2x2ZXMgaW5zaWRlXG4gICAqIHRoZSByZXBvc2l0b3J5LCBzbyBhIHN5bWxpbmtlZCBkaXJlY3RvcnkgKGUuZy4gYSBjb21taXR0ZWQgLmdpdGh1Yi93b3JrZmxvd3MgbGluaykgY2FuIG5ldmVyXG4gICAqIG1ha2UgY2xlYW51cCBkZWxldGUgZmlsZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS4gUmVtb3ZpbmcgYSBzeW1saW5rIGVudHJ5IGl0c2VsZiBpcyBhbGxvd2VkOlxuICAgKiB0aGF0IGRlbGV0ZXMgb25seSB0aGUgbGluaywgbmV2ZXIgaXRzIHRhcmdldC4gUmV0dXJucyB3aGV0aGVyIHRoZSByZW1vdmFsIHdhcyBwZXJmb3JtZWQuXG4gICAqL1xuICBhc3luYyByZW1vdmVDb25maW5lZChmaWxlUGF0aDogc3RyaW5nLCBvcHRpb25zPzogeyByZWN1cnNpdmU/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIShhd2FpdCBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgcmVtb3ZpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiBvcHRpb25zPy5yZWN1cnNpdmUgPz8gZmFsc2UgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8qKiBXcml0ZXMgY29udGVudCB2ZXJiYXRpbSwgYXBwbHlpbmcgdGhlIHNhbWUgc3ltbGluay9yZXBvc2l0b3J5LWNvbnRhaW5tZW50IGd1YXJkcyBhcyBnZW5lcmF0ZUZpbGUuICovXG4gIGFzeW5jIHdyaXRlRmlsZUNvbmZpbmVkKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghKGF3YWl0IGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpKSkgcmV0dXJuIGZhbHNlO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgY29udGVudCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGZpbGUgd2FzIGFjdHVhbGx5IGdlbmVyYXRlZCAoZmFsc2Ugd2hlbiB0aGUgY29uZmluZW1lbnQgZ3VhcmRzIHNraXAgaXQpLiAqL1xuICBhc3luYyBnZW5lcmF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBsaW5lRW5kaW5nOiAnXFxuJyB8ICdcXHJcXG4nID0gJ1xcbicpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIShhd2FpdCBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKSkpIHJldHVybiBmYWxzZTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAvLyBgdHJpbWAgdHJlYXRzIGEgQk9NIGFzIHdoaXRlc3BhY2UsIHNvIGl0IGlzIHJlYXR0YWNoZWQgYXQgcG9zaXRpb24gMDogZHJvcHBpbmcgaXQgd291bGRcbiAgICAvLyByZXdyaXRlIHRoZSBlbmNvZGluZyBtYXJrZXIgb2YgYSBmaWxlIHRoZSBnZW5lcmF0b3Igd2FzIG9ubHkgYXNrZWQgdG8gdXBkYXRlLlxuICAgIGNvbnN0IGJ5dGVPcmRlck1hcmsgPSBjb250ZW50LnN0YXJ0c1dpdGgoJ++7vycpID8gJ++7vycgOiAnJztcbiAgICBsZXQgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnRyaW0oKTtcbiAgICBpZiAobm9ybWFsaXplZENvbnRlbnQpIHtcbiAgICAgIG5vcm1hbGl6ZWRDb250ZW50ID0gYCR7Ynl0ZU9yZGVyTWFya30ke25vcm1hbGl6ZWRDb250ZW50fSR7bGluZUVuZGluZ31gO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGVkL1VwZGF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBOZXZlciB3cml0ZSB0aHJvdWdoIGEgc3ltbGluazogYSAocG9zc2libHkgZGFuZ2xpbmcpIGxpbmsgY29tbWl0dGVkIGluIHRoZSB0YXJnZXQgcmVwb3NpdG9yeVxuICAvLyBjb3VsZCByZWRpcmVjdCB0aGUgd3JpdGUgb3V0c2lkZSBpdC5cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChmaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuICBpZiAoc3RhdHM/LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgd3JpdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IGlzIGEgc3ltYm9saWMgbGluay5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCEoYXdhaXQgaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGgpKSkge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB3cml0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIEEgc3ltbGlua2VkIHBhcmVudCBkaXJlY3Rvcnkgd291bGQgcmVkaXJlY3QgcmVhZHMsIHdyaXRlcywgYW5kIHJlbW92YWxzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnksXG4vLyBzbyByZXF1aXJlIHRoZSBjbG9zZXN0IGV4aXN0aW5nIGFuY2VzdG9yIHRvIHJlc29sdmUgaW5zaWRlIHRoZSByb290IHNldCBieSB0aGUgQ0xJIGVudHJ5IHBvaW50LlxuYXN5bmMgZnVuY3Rpb24gaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAocmVhbFJvb3REaXJQYXRoID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICBsZXQgYW5jZXN0b3JQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKGFuY2VzdG9yUGF0aCkpIHtcbiAgICBhbmNlc3RvclBhdGggPSBwYXRoLmRpcm5hbWUoYW5jZXN0b3JQYXRoKTtcbiAgfVxuICBjb25zdCByZWFsQW5jZXN0b3JQYXRoID0gYXdhaXQgZnMucHJvbWlzZXMucmVhbHBhdGgoYW5jZXN0b3JQYXRoKTtcbiAgcmV0dXJuIHJlYWxBbmNlc3RvclBhdGggPT09IHJlYWxSb290RGlyUGF0aCB8fCByZWFsQW5jZXN0b3JQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApO1xufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgQVBJIH0gZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3luYyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZUZpbGUgfSBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbi8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIChHbykgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGFuZCBub1xuLy8gbG9uZ2VyIGV4cG9zZXMgYW4gaW4tcHJvY2VzcyBwYXJzZXIgc3VjaCBhcyBgdHMuY3JlYXRlU291cmNlRmlsZWAuIFBhcnNpbmcgbm93XG4vLyBoYXBwZW5zIGluIGEgc3Bhd25lZCBjb21waWxlciBzZXJ2ZXIgcmVhY2hlZCB0aHJvdWdoIHRoZSBhc3luY2hyb25vdXMgQVBJLCBzbyB3ZVxuLy8ga2VlcCBhIHNpbmdsZSBsYXppbHktY3JlYXRlZCBpbnN0YW5jZSBhbmQgcmV1c2UgaXQgYWNyb3NzIGV2ZXJ5IGZpeGVyIHRvIGF2b2lkXG4vLyBwYXlpbmcgdGhlIHByb2Nlc3Mtc3Bhd24gY29zdCBwZXIgZmlsZS5cbmxldCBhcGk6IEFQSSB8IHVuZGVmaW5lZDtcbmxldCBjb25uZWN0ZWQ6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUGFyc2VzIGEgc291cmNlIGZpbGUgaW50byBhIFR5cGVTY3JpcHQgQVNUIHVzaW5nIHRoZSBidW5kbGVkIG5hdGl2ZSBjb21waWxlci5cbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgY29tcGlsZXIgY2Fubm90IGxvYWQgdGhlIGZpbGUgKGUuZy4gaXQgaXMgbWlzc2luZ1xuICogb3IgdW5wYXJzYWJsZSkgc28gY2FsbGVycyBjYW4gZmFsbCBiYWNrIHRvIGNvbnNlcnZhdGl2ZSBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxTb3VyY2VGaWxlIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgYXBpID0gYXdhaXQgZ2V0QXBpKCk7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBhcGkudXBkYXRlU25hcHNob3QoeyBvcGVuRmlsZXM6IFtmaWxlUGF0aF0gfSk7XG4gICAgY29uc3QgcHJvamVjdCA9IGF3YWl0IHNuYXBzaG90LmdldERlZmF1bHRQcm9qZWN0Rm9yRmlsZShmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHByb2plY3Q/LnByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlUGF0aCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaHV0cyBkb3duIHRoZSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlci4gVGhlIHNlcnZlciBrZWVwcyBhbiBvcGVuIElQQyBjaGFubmVsXG4gKiB0aGF0IHdvdWxkIG90aGVyd2lzZSBrZWVwIHRoZSBydW50aW1lIGV2ZW50IGxvb3AgYWxpdmUsIHNvIHdiZnkgbXVzdCBjYWxsIHRoaXNcbiAqIG9uY2UgaXRzIHJ1biBmaW5pc2hlcyBmb3IgdGhlIHByb2Nlc3MgdG8gZXhpdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc3Bvc2VUeXBlU2NyaXB0QXBpKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBhcGk/LmNsb3NlKCk7XG4gIGFwaSA9IHVuZGVmaW5lZDtcbiAgY29ubmVjdGVkID0gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcGkoKTogUHJvbWlzZTxBUEk+IHtcbiAgYXBpID8/PSBuZXcgQVBJKHsgY3dkOiBwcm9jZXNzLmN3ZCgpIH0pO1xuICAvLyBUaGUgY2xpZW50IG1hcmtzIGl0c2VsZiBjb25uZWN0ZWQgb25seSBvbmNlIGl0cyBmaXJzdCBzcGF3biBjb21wbGV0ZXMsIHNvIGNvbmN1cnJlbnRcbiAgLy8gZmlyc3QgcmVxdWVzdHMgKHRoZSBmaXhlcnMgcnVuIGluIHBhcmFsbGVsKSB3b3VsZCBlYWNoIHNwYXduIGEgY29tcGlsZXIgc2VydmVyOyB0aGVcbiAgLy8gZXh0cmEgc2VydmVycyBhcmUgbmV2ZXIgY2xvc2VkIGFuZCBrZWVwIHRoZSBwcm9jZXNzIGFsaXZlIGFmdGVyIGBkaXNwb3NlVHlwZVNjcmlwdEFwaWAuXG4gIC8vIFRoZSBmaXJzdCByZXF1ZXN0IGlzIHRoZXJlZm9yZSBhd2FpdGVkIG9uY2UgYmVmb3JlIGFueSBvdGhlciBpcyBzZW50OyBhIGZhaWxlZCBvbmUgaXNcbiAgLy8gZm9yZ290dGVuIHNvIHRoYXQgdGhlIG5leHQgcmVxdWVzdCBjb25uZWN0cyBhZ2FpbiBpbnN0ZWFkIG9mIGZhaWxpbmcgZm9yIHRoZSB3aG9sZSBydW4uXG4gIGNvbm5lY3RlZCA/Pz0gYXBpLnVwZGF0ZVNuYXBzaG90KCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgY29ubmVjdGVkID0gdW5kZWZpbmVkO1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbiAgYXdhaXQgY29ubmVjdGVkO1xuICByZXR1cm4gYXBpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5cbi8vIFNldHRpbmdzIGV2ZXJ5IFdpbGxCb29zdGVyIE5leHQuanMgcHJvamVjdCBzaG91bGQgY2FycnkuIGBuYW1lYCBpcyB0aGUgdG9wLWxldmVsXG4vLyBwcm9wZXJ0eSBrZXkgdXNlZCB0byBkZXRlY3Qgd2hldGhlciB0aGUgc2V0dGluZyBhbHJlYWR5IGV4aXN0czsgYHRleHRgIGlzIGluc2VydGVkXG4vLyB2ZXJiYXRpbSAoYSB3aG9sZSBga2V5OiB2YWx1ZWAgcGFpcikgd2hlbiB0aGUga2V5IGlzIG1pc3NpbmcuXG5jb25zdCBtYW5hZ2VkUHJvcGVydGllczogcmVhZG9ubHkgeyBuYW1lOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9W10gPSBbXG4gIHsgbmFtZTogJ3JlYWN0Q29tcGlsZXInLCB0ZXh0OiAncmVhY3RDb21waWxlcjogdHJ1ZScgfSxcbiAgeyBuYW1lOiAncmVhY3RTdHJpY3RNb2RlJywgdGV4dDogJ3JlYWN0U3RyaWN0TW9kZTogdHJ1ZScgfSxcbiAgeyBuYW1lOiAndHlwZXNjcmlwdCcsIHRleHQ6ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0nIH0sXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ3RzJywgJ210cycsICdjdHMnLCAnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhY3RlZCA9IGF3YWl0IGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoKTtcbiAgICBpZiAoIWV4dHJhY3RlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgc291cmNlLCBvYmplY3RMaXRlcmFsIH0gPSBleHRyYWN0ZWQ7XG5cbiAgICAvLyBgcHJvcGVydGllc2AgaW5jbHVkZXMgc3ByZWFkIGFzc2lnbm1lbnRzIChgLi4ucmVzdGApIHRoYXQgY2Fycnkgbm8gbmFtZSwgc28gZ3VhcmQgYmVmb3JlIHJlYWRpbmcgaXQuXG4gICAgY29uc3QgZXhpc3RpbmdQcm9wZXJ0aWVzID0gbmV3IFNldChcbiAgICAgIG9iamVjdExpdGVyYWwucHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PlxuICAgICAgICAnbmFtZScgaW4gcHJvcGVydHkgJiYgcHJvcGVydHkubmFtZSA/IGdldFByb3BlcnR5S2V5KHByb3BlcnR5Lm5hbWUsIHNvdXJjZSkgOiB1bmRlZmluZWRcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHByb3BlcnR5VGV4dHMgPSBtYW5hZ2VkUHJvcGVydGllc1xuICAgICAgLmZpbHRlcigocHJvcGVydHkpID0+ICFleGlzdGluZ1Byb3BlcnRpZXMuaGFzKHByb3BlcnR5Lm5hbWUpKVxuICAgICAgLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LnRleHQpO1xuICAgIGlmIChwcm9wZXJ0eVRleHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IHNvdXJjZS50ZXh0O1xuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gb2JqZWN0TGl0ZXJhbC5nZXRFbmQoKSAtIDE7XG4gICAgLy8gVGhlIG5hdGl2ZSBUUyBBU1QgZG9lcyBub3QgcmVsaWFibHkgZXhwb3NlIGBwcm9wZXJ0aWVzLmhhc1RyYWlsaW5nQ29tbWFgLCBzbyBzY2FuIHRoZSBzb3VyY2VcbiAgICAvLyBiZXR3ZWVuIHRoZSBsYXN0IHByb3BlcnR5IGFuZCB0aGUgY2xvc2luZyBicmFjZS4gU3RyaXAgY29tbWVudHMgZmlyc3Qgc28gYSBjb21tYSBpbnNpZGUgYVxuICAgIC8vIHRyYWlsaW5nIGNvbW1lbnQgKGUuZy4gYGZvbzogMSAvLyBhLCBiYCkgaXMgbm90IG1pc3Rha2VuIGZvciBhIHJlYWwgdHJhaWxpbmcgY29tbWEuXG4gICAgY29uc3QgbGFzdFByb3BlcnR5ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmF0KC0xKTtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NvbW1hID0gbGFzdFByb3BlcnR5XG4gICAgICA/IHN0cmlwQ29tbWVudHMob2xkQ29udGVudC5zbGljZShsYXN0UHJvcGVydHkuZ2V0RW5kKCksIGluc2VydGlvblBvaW50KSkuaW5jbHVkZXMoJywnKVxuICAgICAgOiBmYWxzZTtcbiAgICBjb25zdCBwcmVmaXggPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubGVuZ3RoID4gMCAmJiAhaGFzVHJhaWxpbmdDb21tYSA/ICcsICcgOiAnJztcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBpbnNlcnRpb25Qb2ludCl9JHtwcmVmaXh9JHtwcm9wZXJ0eVRleHRzLmpvaW4oJywgJyl9JHtvbGRDb250ZW50LnNsaWNlKFxuICAgICAgaW5zZXJ0aW9uUG9pbnRcbiAgICApfWA7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHsgc291cmNlOiBhc3QuU291cmNlRmlsZTsgb2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIH0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc291cmNlID0gYXdhaXQgcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkIGRlY2xhcmVzIHRoZSBjb25maWcgYXMgYGNvbnN0IG5leHRDb25maWc6IE5leHRDb25maWcgPSB7IC4uLiB9YCBhbmRcbiAgLy8gZXhwb3J0cyBpdCAocG9zc2libHkgd3JhcHBlZCwgZS5nLiBgd2l0aFNlbnRyeUNvbmZpZyguLi4pYCksIHNvIHRoZSBvYmplY3QgbGl0ZXJhbCBpcyByYXJlbHlcbiAgLy8gdGhlIGRpcmVjdCBvcGVyYW5kIG9mIGBleHBvcnQgZGVmYXVsdGAvYG1vZHVsZS5leHBvcnRzYC4gQ29sbGVjdCBldmVyeSBjYW5kaWRhdGUgYW5kIHBpY2sgdGhlXG4gIC8vIG1vc3QgYXV0aG9yaXRhdGl2ZSBvbmUgYmVsb3cuXG4gIGxldCBkaXJlY3RPYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGxldCBleHBvcnRlZElkZW50aWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmFyaWFibGVPYmplY3RMaXRlcmFscyA9IG5ldyBNYXA8c3RyaW5nLCBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24+KCk7XG4gIGNvbnN0IHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHM6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbltdID0gW107XG5cbiAgY29uc3QgdmlzaXQgPSAobm9kZTogYXN0Lk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoYXN0LmlzRXhwb3J0QXNzaWdubWVudChub2RlKSkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5leHByZXNzaW9uKTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz89IG9iamVjdExpdGVyYWw7XG4gICAgICB9IGVsc2UgaWYgKGFzdC5pc0lkZW50aWZpZXIobm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgICBleHBvcnRlZElkZW50aWZpZXIgPz89IG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGFzdC5pc0JpbmFyeUV4cHJlc3Npb24obm9kZSkgJiZcbiAgICAgIG5vZGUub3BlcmF0b3JUb2tlbi5raW5kID09PSBhc3QuU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgbm9kZS5sZWZ0LmdldFRleHQoc291cmNlKSA9PT0gJ21vZHVsZS5leHBvcnRzJ1xuICAgICkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5yaWdodCk7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/PSBvYmplY3RMaXRlcmFsO1xuICAgICAgfSBlbHNlIGlmIChhc3QuaXNJZGVudGlmaWVyKG5vZGUucmlnaHQpKSB7XG4gICAgICAgIGV4cG9ydGVkSWRlbnRpZmllciA/Pz0gbm9kZS5yaWdodC5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhc3QuaXNWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpICYmIG5vZGUuaW5pdGlhbGl6ZXIpIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUuaW5pdGlhbGl6ZXIpO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwgJiYgYXN0LmlzSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgICAgIHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuc2V0KG5vZGUubmFtZS5nZXRUZXh0KHNvdXJjZSksIG9iamVjdExpdGVyYWwpO1xuICAgICAgICAvLyBUaGUgYDogTmV4dENvbmZpZ2AgYW5ub3RhdGlvbiB3YmZ5IHdyaXRlcyBtYXJrcyB0aGUgY2Fub25pY2FsIGNvbmZpZyBvYmplY3QgKGFjY2VwdGluZ1xuICAgICAgICAvLyBxdWFsaWZpZWQgbmFtZXMgc3VjaCBhcyBgaW1wb3J0KCduZXh0JykuTmV4dENvbmZpZ2ApLlxuICAgICAgICBjb25zdCBhbm5vdGF0aW9uVHlwZSA9IG5vZGUudHlwZT8uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgICBpZiAoYW5ub3RhdGlvblR5cGUgIT09IHVuZGVmaW5lZCAmJiBpc05leHRDb25maWdUeXBlKGFubm90YXRpb25UeXBlKSkge1xuICAgICAgICAgIHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHMucHVzaChvYmplY3RMaXRlcmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH07XG4gIHNvdXJjZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuXG4gIGNvbnN0IG9iamVjdExpdGVyYWwgPVxuICAgIHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHNbMF0gPz9cbiAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/XG4gICAgKGV4cG9ydGVkSWRlbnRpZmllciA/IHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuZ2V0KGV4cG9ydGVkSWRlbnRpZmllcikgOiB1bmRlZmluZWQpID8/XG4gICAgdmFyaWFibGVPYmplY3RMaXRlcmFscy5nZXQoJ25leHRDb25maWcnKTtcbiAgcmV0dXJuIG9iamVjdExpdGVyYWwgPyB7IHNvdXJjZSwgb2JqZWN0TGl0ZXJhbCB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY3VycmVudCA9IHVud3JhcFBhcmVudGhlc2VzKG5vZGUpO1xuICByZXR1cm4gYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oY3VycmVudCkgPyBjdXJyZW50IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJlbnRoZXNlcyhub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5FeHByZXNzaW9uIHtcbiAgbGV0IGN1cnJlbnQgPSBub2RlO1xuICB3aGlsZSAoYXN0LmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oY3VycmVudCkpIHtcbiAgICBjdXJyZW50ID0gY3VycmVudC5leHByZXNzaW9uO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vLyBNYXRjaCBib3RoIHRoZSBiYXJlIGBOZXh0Q29uZmlnYCBhbmQgcXVhbGlmaWVkIGZvcm1zIGxpa2UgYGltcG9ydCgnbmV4dCcpLk5leHRDb25maWdgLlxuZnVuY3Rpb24gaXNOZXh0Q29uZmlnVHlwZSh0eXBlVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlVGV4dCA9PT0gJ05leHRDb25maWcnIHx8IHR5cGVUZXh0LmVuZHNXaXRoKCcuTmV4dENvbmZpZycpO1xufVxuXG4vLyBSZXR1cm4gYSBwcm9wZXJ0eSBrZXkgd2l0aG91dCBzdXJyb3VuZGluZyBxdW90ZXMsIHNvIGAncmVhY3RDb21waWxlcidgIG1hdGNoZXMgYHJlYWN0Q29tcGlsZXJgLlxuLy8gSWRlbnRpZmllciwgc3RyaW5nLWxpdGVyYWwgYW5kIG51bWVyaWMtbGl0ZXJhbCBuYW1lcyBhbGwgZXhwb3NlIHRoZSB1bnF1b3RlZCB2YWx1ZSB2aWEgYC50ZXh0YC5cbmZ1bmN0aW9uIGdldFByb3BlcnR5S2V5KG5hbWU6IGFzdC5Qcm9wZXJ0eU5hbWUsIHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmcge1xuICByZXR1cm4gJ3RleHQnIGluIG5hbWUgJiYgdHlwZW9mIG5hbWUudGV4dCA9PT0gJ3N0cmluZycgPyBuYW1lLnRleHQgOiBuYW1lLmdldFRleHQoc291cmNlKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBDb21tZW50cyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9cXC9cXC9bXlxcbl0qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgJycpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeENoYWtyYVRvYXN0ZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4Q2hha3JhVG9hc3RlcicsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuY2hha3JhKSByZXR1cm47XG5cbiAgICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZy5nbG9iKCcqKi90b2FzdGVyLnt0cyx0c3h9Jywge1xuICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgaWdub3JlOiBbJyoqLy4qLyoqJywgJyoqL25vZGVfbW9kdWxlcy8qKiddLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbnRlbnQuaW5jbHVkZXMoJ0NyZWF0ZVRvYXN0ZXJSZXR1cm4nKSB8fFxuICAgICAgICAhY29udGVudC5pbmNsdWRlcyhcImZyb20gJ0BjaGFrcmEtdWkvcmVhY3QnXCIpIHx8XG4gICAgICAgICFjb250ZW50LmluY2x1ZGVzKCdleHBvcnQgY29uc3QgdG9hc3RlciA9IGNyZWF0ZVRvYXN0ZXIoJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gY29udGVudFxuICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAvXmltcG9ydCAuKiBmcm9tICdAY2hha3JhLXVpXFwvcmVhY3QnOyQvbXUsXG4gICAgICAgICAgXCIkJlxcbmltcG9ydCB0eXBlIHsgQ3JlYXRlVG9hc3RlclJldHVybiB9IGZyb20gJ0BjaGFrcmEtdWkvcmVhY3QnO1wiXG4gICAgICAgIClcbiAgICAgICAgLnJlcGxhY2UoJ2V4cG9ydCBjb25zdCB0b2FzdGVyID0gY3JlYXRlVG9hc3RlcignLCAnZXhwb3J0IGNvbnN0IHRvYXN0ZXI6IENyZWF0ZVRvYXN0ZXJSZXR1cm4gPSBjcmVhdGVUb2FzdGVyKCcpO1xuICAgICAgaWYgKHVwZGF0ZWRDb250ZW50ICE9PSBjb250ZW50KSBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCB1cGRhdGVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG50eXBlIFBhcnNlZFZhbHVlID1cbiAgfCB7IGtpbmQ6ICdhcnJheSc7IHZhbHVlOiBQYXJzZWRWYWx1ZVtdIH1cbiAgfCB7IGtpbmQ6ICdsaXRlcmFsJzsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnb2JqZWN0JzsgdmFsdWU6IFBhcnNlZE9iamVjdCB9O1xudHlwZSBPYmplY3RNZW1iZXIgPSB7IGtpbmQ6ICdleHRyYSc7IGluZGV4OiBudW1iZXIgfSB8IHsga2luZDogJ3Byb3BlcnR5Jzsga2V5OiBzdHJpbmcgfTtcbmludGVyZmFjZSBQYXJzZWRPYmplY3Qge1xuICBleHRyYU1lbWJlcnM6IHN0cmluZ1tdO1xuICBtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW107XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcbn1cbmludGVyZmFjZSBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHtcbiAgc291cmNlOiBhc3QuU291cmNlRmlsZTtcbiAgbm9kZTogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uO1xufVxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkVmFsdWUgPT4gKHtcbiAga2luZDogJ29iamVjdCcsXG4gIHZhbHVlOiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzLCBleHRyYU1lbWJlcnMpLFxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0czogYm9vbGVhbik6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IHVzZSA9IHRvUGFyc2VkT2JqZWN0KHtcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb24nXCIpLFxuICAgIHZpZGVvOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgfSk7XG5cbiAgaWYgKHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzKSB7XG4gICAgdXNlLnByb3BlcnRpZXMuYmFzZVVSTCA9IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyk7XG4gICAgdXNlLm1lbWJlck9yZGVyLnVuc2hpZnQoeyBraW5kOiAncHJvcGVydHknLCBrZXk6ICdiYXNlVVJMJyB9KTtcbiAgfVxuXG4gIHJldHVybiB0b1BhcnNlZE9iamVjdCh7XG4gICAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICAgIHVzZTogeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHVzZSB9LFxuICAgIC4uLihzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0c1xuICAgICAgPyB7XG4gICAgICAgICAgd2ViU2VydmVyOiBhc09iamVjdCh7XG4gICAgICAgICAgICBjb21tYW5kOiBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpKSxcbiAgICAgICAgICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICAgICAgICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IGxpdGVyYWwoJzMwMF8wMDAnKSxcbiAgICAgICAgICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIHN0ZGVycjogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgICAgICAgICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICBleHRyYU1lbWJlcnMsXG4gICAgbWVtYmVyT3JkZXI6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHByb3BlcnRpZXMpLm1hcCgoa2V5KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KSksXG4gICAgICAuLi5leHRyYU1lbWJlcnMubWFwKChfLCBpbmRleCk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KSksXG4gICAgXSxcbiAgICBwcm9wZXJ0aWVzLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGV4dHJhY3RlZE9iamVjdExpdGVyYWwgPSBhd2FpdCBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aCk7XG4gICAgaWYgKCFleHRyYWN0ZWRPYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZSwgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICAvLyB3YiBkZXJpdmVzIE5FWFRfUFVCTElDX0JBU0VfVVJMIGZyb20gdGhlIHJlc29sdmVkIHBvcnQgZm9yIE5leHQuanMvdmluZXh0IGFwcHMgKHZpbmV4dFxuICAgIC8vIGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gYGRlcGVuZGluZy5uZXh0YCBjb3ZlcnMgYm90aCksIHNvIHRob3NlIG5lZWQgbm8gZGVjbGFyZWRcbiAgICAvLyB2YXJpYWJsZTsgb3RoZXIgcGFja2FnZXMgc3RpbGwgcmVxdWlyZSBhIGRlY2xhcmF0aW9uLlxuICAgIGNvbnN0IHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzID1cbiAgICAgIHNob3VsZE1hbmFnZUFwcFNlcnZlckRlZmF1bHRzKGNvbmZpZywgcGFyc2VkKSAmJlxuICAgICAgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCAoYXdhaXQgZG9lc0RlZmluZU5leHRQdWJsaWNCYXNlVXJsKGNvbmZpZy5kaXJQYXRoKSkpO1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSBjcmVhdGVEZWZhdWx0Q29uZmlnKGNvbmZpZywgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMpO1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlUGFyc2VkT2JqZWN0cyhkZWZhdWx0Q29uZmlnLCBwYXJzZWQpO1xuICAgIGFwcGx5TWFuYWdlZFVzZURlZmF1bHRzKG1lcmdlZCwgZGVmYXVsdENvbmZpZyk7XG4gICAgc2V0V2ViU2VydmVyQ29tbWFuZChtZXJnZWQpO1xuXG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeVZhbHVlKHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZWQgfSwgMCk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlLnRleHQ7XG4gICAgY29uc3Qgc3RhcnQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0U3RhcnQoZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGNvbnN0IGVuZCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRFbmQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBzdGFydCl9JHtuZXdPYmplY3RMaXRlcmFsfSR7b2xkQ29udGVudC5zbGljZShlbmQpfWA7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2U6IFBhcnNlZE9iamVjdCwgb3ZlcnJpZGU6IFBhcnNlZE9iamVjdCk6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IG92ZXJyaWRlUHJvcGVydHlLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhvdmVycmlkZS5wcm9wZXJ0aWVzKSk7XG4gIGNvbnN0IGV4dHJhTWVtYmVycyA9IFsuLi5iYXNlLmV4dHJhTWVtYmVycywgLi4ub3ZlcnJpZGUuZXh0cmFNZW1iZXJzXTtcbiAgLy8gS2VlcCBkZWZhdWx0LW9ubHkgbWVtYmVycyBiZWZvcmUgcGFyc2VkIG1lbWJlcnMgc28gc3ByZWFkcyBhbmQgZXhwbGljaXQgbG9jYWwgcHJvcGVydGllcyByZXRhaW4gcHJlY2VkZW5jZS5cbiAgY29uc3QgbWVtYmVyT3JkZXIgPSBbXG4gICAgLi4uYmFzZS5tZW1iZXJPcmRlci5maWx0ZXIoKG1lbWJlcikgPT4gbWVtYmVyLmtpbmQgIT09ICdwcm9wZXJ0eScgfHwgIW92ZXJyaWRlUHJvcGVydHlLZXlzLmhhcyhtZW1iZXIua2V5KSksXG4gICAgLi4ub3ZlcnJpZGUubWVtYmVyT3JkZXIubWFwKChtZW1iZXIpOiBPYmplY3RNZW1iZXIgPT4ge1xuICAgICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSByZXR1cm4gbWVtYmVyO1xuICAgICAgcmV0dXJuIHsga2luZDogJ2V4dHJhJywgaW5kZXg6IGJhc2UuZXh0cmFNZW1iZXJzLmxlbmd0aCArIG1lbWJlci5pbmRleCB9O1xuICAgIH0pLFxuICBdO1xuICBjb25zdCBwcm9wZXJ0aWVzID0geyAuLi5iYXNlLnByb3BlcnRpZXMgfTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3ZlcnJpZGUucHJvcGVydGllcykpIHtcbiAgICBwcm9wZXJ0aWVzW2tleV0gPSBtZXJnZVBhcnNlZFZhbHVlKHByb3BlcnRpZXNba2V5XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiB7IGV4dHJhTWVtYmVycywgbWVtYmVyT3JkZXIsIHByb3BlcnRpZXMgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRWYWx1ZShiYXNlOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCwgb3ZlcnJpZGU6IFBhcnNlZFZhbHVlKTogUGFyc2VkVmFsdWUge1xuICBpZiAoYmFzZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgb3ZlcnJpZGUua2luZCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlLnZhbHVlLCBvdmVycmlkZS52YWx1ZSkgfTtcbiAgfVxuICByZXR1cm4gb3ZlcnJpZGU7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TWFuYWdlZFVzZURlZmF1bHRzKGNvbmZpZzogUGFyc2VkT2JqZWN0LCBkZWZhdWx0Q29uZmlnOiBQYXJzZWRPYmplY3QpOiB2b2lkIHtcbiAgY29uc3QgdXNlID0gY29uZmlnLnByb3BlcnRpZXMudXNlO1xuICBjb25zdCBkZWZhdWx0VXNlID0gZGVmYXVsdENvbmZpZy5wcm9wZXJ0aWVzLnVzZTtcbiAgaWYgKHVzZT8ua2luZCAhPT0gJ29iamVjdCcgfHwgZGVmYXVsdFVzZT8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ3RyYWNlJywgJ3NjcmVlbnNob3QnLCAndmlkZW8nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRVc2UudmFsdWUucHJvcGVydGllc1trZXldO1xuICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHVzZS52YWx1ZS5wcm9wZXJ0aWVzW2tleV0gPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZE1hbmFnZUFwcFNlcnZlckRlZmF1bHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcGFyc2VkOiBQYXJzZWRPYmplY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuZGVwZW5kaW5nLm5leHQgfHxcbiAgICBwYXJzZWQucHJvcGVydGllcy53ZWJTZXJ2ZXIgIT09IHVuZGVmaW5lZCB8fFxuICAgIGRvZXNPYmplY3RIYXZlQmFzZVVybChwYXJzZWQucHJvcGVydGllcy51c2UpIHx8XG4gICAgZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHBhcnNlZCB9LCAnTkVYVF9QVUJMSUNfQkFTRV9VUkwnKVxuICApO1xufVxuXG5mdW5jdGlvbiBkb2VzT2JqZWN0SGF2ZUJhc2VVcmwodmFsdWU6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgdmFsdWUudmFsdWUucHJvcGVydGllcy5iYXNlVVJMICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGl0ZXJhbFRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWUuaW5jbHVkZXMobGl0ZXJhbFRleHQpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5JykgcmV0dXJuIHZhbHVlLnZhbHVlLnNvbWUoKGNoaWxkKSA9PiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbChjaGlsZCwgbGl0ZXJhbFRleHQpKTtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnMuc29tZSgobWVtYmVyKSA9PiBtZW1iZXIuaW5jbHVkZXMobGl0ZXJhbFRleHQpKSB8fFxuICAgIE9iamVjdC52YWx1ZXModmFsdWUudmFsdWUucHJvcGVydGllcykuc29tZSgoY2hpbGQpID0+IGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKGNoaWxkLCBsaXRlcmFsVGV4dCkpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvZXNEZWZpbmVOZXh0UHVibGljQmFzZVVybChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgZm9yIChjb25zdCBlbnZGaWxlUGF0aCBvZiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKC9ORVhUX1BVQkxJQ19CQVNFX1VSTFxccyo9L20udGVzdChjb250ZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3NpbmcgZW52IGZpbGVzIGFyZSBleHBlY3RlZCBpbiBzb21lIHJlcG9zLlxuICAgIH1cbiAgfVxuXG4gIC8vIFNvbWUgUGxheXdyaWdodCBjb25maWdzIG9ubHkgZGVmaW5lIGJyb3dzZXIgcHJvamVjdHMgb3IgZml4dHVyZXMgYW5kIGRvIG5vdFxuICAvLyBzdGFydCBhIHdlYiBhcHAuIEF2b2lkIGZvcmNpbmcgYW4gYXBwLXNlcnZlciBVUkwgaW50byB0aG9zZSBwYWNrYWdlcy5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBlbnZGaWxlTmFtZXMgPSBbJ2Zub3gudG9tbCcsICdtaXNlLnRvbWwnLCAnbWlzZS50ZXN0LnRvbWwnXTtcbiAgY29uc3QgZW52RmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAobGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpOyA7IGN1cnJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKSkge1xuICAgIGVudkZpbGVQYXRocy5wdXNoKC4uLmVudkZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsIGZpbGVOYW1lKSkpO1xuXG4gICAgLy8gUGxheXdyaWdodCBjb25maWdzIG9mdGVuIGxpdmUgaW4gcGFja2FnZXMvKiB3aGlsZSBzaGFyZWQgZW52IGZpbGVzIGxpdmUgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290LCBzbyB3YWxrIHVwd2FyZCB1bnRpbCB0aGUgdGFyZ2V0IHJlcG8gYm91bmRhcnkuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCAnLmdpdCcpKSkgYnJlYWs7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGVudkZpbGVQYXRocztcbn1cblxuZnVuY3Rpb24gc2V0V2ViU2VydmVyQ29tbWFuZChvYmplY3Q6IFBhcnNlZE9iamVjdCk6IHZvaWQge1xuICBjb25zdCB3ZWJTZXJ2ZXIgPSBvYmplY3QucHJvcGVydGllcy53ZWJTZXJ2ZXI7XG4gIGlmICh3ZWJTZXJ2ZXI/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgY29tbWFuZCA9IHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQ7XG4gIC8vIExpYnJhcmllcyBjYW4gdXNlIFBsYXl3cmlnaHQncyB3ZWJTZXJ2ZXIgdG8gYnVpbGQgYW5kIGxhdW5jaCBhIGZpeHR1cmUgZXZlbiB0aG91Z2ggYHdiIHN0YXJ0YFxuICAvLyBpbnRlbnRpb25hbGx5IGhhcyBubyB0ZXN0IHNlcnZlciBmb3IgdGhlIGxpYnJhcnkgaXRzZWxmLiBQcmVzZXJ2ZSB0aG9zZSBjdXN0b20gbGlmZWN5Y2xlXG4gIC8vIGNvbW1hbmRzOyBvbmx5IGFkZCB0aGUgY29tbWFuZCB3aGVuIHdiZnkgYWxyZWFkeSBvd25zIGl0LlxuICBpZiAoY29tbWFuZCAmJiAhaXNHZW5lcmF0ZWRXYlN0YXJ0VGVzdENvbW1hbmQoY29tbWFuZCkpIHJldHVybjtcblxuICAvLyBQbGF5d3JpZ2h0IHJlcXVpcmVzIGBjb21tYW5kYCB3aGVuZXZlciBgd2ViU2VydmVyYCBleGlzdHM7IGFuIGV4dGVybmFsbHkgbWFuYWdlZCBzZXJ2ZXIgc2hvdWxkXG4gIC8vIG9taXQgYHdlYlNlcnZlcmAgaW5zdGVhZC4gS2VlcCBmaWxsaW5nIHRoaXMgcmVxdWlyZWQgZmllbGQgd2hlbiBhIHBhcnRpYWwgbWFuYWdlZCBibG9jayBsYWNrcyBpdC5cbiAgd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZCA9IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKCkpO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFdiU3RhcnRUZXN0Q29tbWFuZChjb21tYW5kOiBQYXJzZWRWYWx1ZSk6IGJvb2xlYW4ge1xuICBpZiAoY29tbWFuZC5raW5kICE9PSAnbGl0ZXJhbCcpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGNvbW1hbmQudmFsdWUudHJpbSgpID09PSBnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0V2JTdGFydFRlc3RDb21tYW5kKCk6IHN0cmluZyB7XG4gIHJldHVybiBgJ2J1biB3YiBzdGFydCAtLW1vZGUgdGVzdCdgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHBhcnNlU291cmNlRmlsZShmaWxlUGF0aCk7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFR5cGVTY3JpcHQgYWxyZWFkeSB1bmRlcnN0YW5kcyBuZXN0ZWQgb2JqZWN0IGxpdGVyYWxzIGFuZCB0ZW1wbGF0ZSBzdHJpbmdzLCBzbyB1c2VcbiAgLy8gaXRzIEFTVCByYW5nZXMgaW5zdGVhZCBvZiBhIHJlZ2V4IHRoYXQgY2FuIHN0b3AgYXQgdGhlIGZpcnN0IGlubmVyIGNsb3NpbmcgYnJhY2UuXG4gIGxldCBmb3VuZDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiBhc3QuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgIGlmIChhc3QuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpID09PSAnZGVmaW5lQ29uZmlnJykge1xuICAgICAgY29uc3QgZmlyc3RBcmd1bWVudCA9IG5vZGUuYXJndW1lbnRzWzBdO1xuICAgICAgaWYgKGZpcnN0QXJndW1lbnQgJiYgYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZmlyc3RBcmd1bWVudCkpIHtcbiAgICAgICAgZm91bmQgPSBmaXJzdEFyZ3VtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfTtcbiAgc291cmNlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG5cbiAgcmV0dXJuIGZvdW5kID8geyBzb3VyY2UsIG5vZGU6IGZvdW5kIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiBhc3QuRXhwcmVzc2lvbiwgc291cmNlOiBhc3QuU291cmNlRmlsZSk6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBzb3VyY2UpO1xuICAgIHJldHVybiBwYXJzZWRPYmplY3QgPyB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkT2JqZWN0IH0gOiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgfVxuICBpZiAoYXN0LmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHBhcnNlRXhwcmVzc2lvbihlbGVtZW50LCBzb3VyY2UpKTtcbiAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCk6IGVsZW1lbnQgaXMgdW5kZWZpbmVkID0+IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzQXJyYXkoZWxlbWVudHMgYXMgUGFyc2VkVmFsdWVbXSk7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKFxuICBvYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogYXN0LlNvdXJjZUZpbGVcbik6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZDogUGFyc2VkT2JqZWN0ID0geyBleHRyYU1lbWJlcnM6IFtdLCBtZW1iZXJPcmRlcjogW10sIHByb3BlcnRpZXM6IHt9IH07XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKGFzdC5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IGxpdGVyYWwoa2V5KTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFhc3QuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpIHx8XG4gICAgICAoIWFzdC5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiYgIWFzdC5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkpXG4gICAgKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlZC5leHRyYU1lbWJlcnMucHVzaChwcm9wZXJ0eS5nZXRUZXh0KHNvdXJjZSkpIC0gMTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUV4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHNvdXJjZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICBpZiAodmFsdWUudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gJ1tdJztcbiAgICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICAgIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGBbXFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9XWA7XG4gIH1cbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlO1xuXG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGVtaXR0ZWRQcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyKTtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlci5mbGF0TWFwKChtZW1iZXIsIGluZGV4KSA9PiB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAnZXh0cmEnKSB7XG4gICAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdE1lbWJlcih2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnNbbWVtYmVyLmluZGV4XSA/PyAnJywgaW5kZW50KV07XG4gICAgfVxuXG4gICAgaWYgKGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuZ2V0KG1lbWJlci5rZXkpICE9PSBpbmRleCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzW21lbWJlci5rZXldO1xuICAgIGlmICghaXRlbSB8fCBlbWl0dGVkUHJvcGVydGllcy5oYXMobWVtYmVyLmtleSkpIHJldHVybiBbXTtcbiAgICBlbWl0dGVkUHJvcGVydGllcy5hZGQobWVtYmVyLmtleSk7XG4gICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShtZW1iZXIua2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KV07XG4gIH0pO1xuICBsaW5lcy5wdXNoKFxuICAgIC4uLk9iamVjdC5lbnRyaWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhrZXkpKVxuICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCkpXG4gICk7XG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBge1xcbiR7Y2xvc2luZ0luZGVudH19YDtcbiAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG59XG5cbmZ1bmN0aW9uIGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkobWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbWVtYmVyXSBvZiBtZW1iZXJPcmRlci5lbnRyaWVzKCkpIHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHtcbiAgICAgIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuc2V0KG1lbWJlci5rZXksIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleTogc3RyaW5nLCBpdGVtOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlciwgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgfVxuICB9XG4gIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7a2V5fTogJHtzdHJpbmdpZmllZFswXX1gO1xuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdE1lbWJlcihtZW1iZXI6IHN0cmluZywgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IG1lbWJlci5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbGluZV0gb2Ygc3RyaW5naWZpZWQuZW50cmllcygpKSB7XG4gICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7bGluZX1gO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG50eXBlIFdpbGxCb29zdGVyT3JnYW5pemF0aW9uID0gJ1dpbGxCb29zdGVyJyB8ICdXaWxsQm9vc3RlckxhYic7XG50eXBlIFJlcG9zaXRvcnlGdWxsTmFtZSA9IGAke1dpbGxCb29zdGVyT3JnYW5pemF0aW9ufS8ke3N0cmluZ31gO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZub3hSZXBvc2l0b3J5U2NvcGUge1xuICBvcmdhbml6YXRpb25zPzogcmVhZG9ubHkgV2lsbEJvb3N0ZXJPcmdhbml6YXRpb25bXTtcbiAgcmVwb3NpdG9yaWVzPzogcmVhZG9ubHkgUmVwb3NpdG9yeUZ1bGxOYW1lW107XG4gIC8vIFJlc3RyaWN0cyB0aGUgc2NvcGUgdG8gcmVwb3NpdG9yaWVzIG9mIHRoZSBnaXZlbiB2aXNpYmlsaXR5LiBQdWJsaWMgcmVwb3NpdG9yaWVzIHB1Ymxpc2ggdGhlaXJcbiAgLy8gY2lwaGVydGV4dHMgdG8gdGhlIHdvcmxkLCBzbyB0aGV5IG11c3QgdXNlIGEgQ0kgaWRlbnRpdHkgc2VwYXJhdGUgZnJvbSB0aGUgb3JnLWludGVybmFsIG9uZTpcbiAgLy8gbGVha2luZyBlaXRoZXIgQ0kga2V5IG11c3Qgbm90IGV4cG9zZSB0aGUgb3RoZXIgc2lkZSdzIHNlY3JldHMuXG4gIHZpc2liaWxpdHk/OiAncHVibGljJyB8ICdwcml2YXRlJztcbn1cblxuaW50ZXJmYWNlIEZub3hBZ2VQcmluY2lwYWwge1xuICBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpY0tleXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZXBvc2l0b3J5U2NvcGU6IEZub3hSZXBvc2l0b3J5U2NvcGU7XG4gIC8vIE1hcmtzIHRoZSBwcmluY2lwYWwgYXMgYSBDSSBpZGVudGl0eSBhbmQgbmFtZXMgdGhlIEdpdEh1YiBzZWNyZXQgaG9sZGluZyBpdHMgcHJpdmF0ZSBrZXkuXG4gIC8vIEV2ZXJ5IGZub3gtbWFuYWdlZCByZXBvc2l0b3J5IG11c3QgcmVzb2x2ZSBvbmUgKGdlbmVyYXRlRm5veFRvbWwgZmFpbHMgY2xvc2VkIG90aGVyd2lzZTogYVxuICAvLyByb3N0ZXIgd2l0aG91dCBhIENJIHJlY2lwaWVudCB3b3VsZCByZS1lbmNyeXB0IHNlY3JldHMgdGhhdCBDSSBjYW4gbmV2ZXIgZGVjcnlwdCBhZ2FpbiksIGFuZFxuICAvLyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yIGRlcml2ZXMgaXRzIGNhbGxlciBtYXBwaW5ncyBmcm9tIHRoZSBzYW1lIHJlc29sdXRpb24gc28gdGhlIHR3byBjYW5cbiAgLy8gbmV2ZXIgZGlzYWdyZWUgb24gd2hpY2ggQ0kgaWRlbnRpdHkgYXBwbGllcy5cbiAgY2lBZ2VLZXlTZWNyZXROYW1lPzogJ0ZOT1hfQUdFX0tFWScgfCAnUFVCTElDX0ZOT1hfQUdFX0tFWSc7XG59XG5cbmludGVyZmFjZSBGbm94QWdlUmVjaXBpZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwdWJsaWNLZXk6IHN0cmluZztcbn1cblxuLy8gVGhlIGFnZSBwcmluY2lwYWxzIGF1dGhvcml6ZWQgdG8gZGVjcnlwdCBlYWNoIGZub3gtbWFuYWdlZCByZXBvc2l0b3J5LiBUbyBncmFudCBhY2Nlc3MsIGFkZCB0aGVcbi8vIHByaW5jaXBhbCdzIHB1YmxpYyBrZXlzIGFuZCByZXBvc2l0b3J5IHNjb3BlIGhlcmUuIE9yZ2FuaXphdGlvbiBzY29wZXMgaW5jbHVkZSBldmVyeSBjdXJyZW50IGFuZFxuLy8gZnV0dXJlIHJlcG9zaXRvcnkgaW4gdGhhdCBvcmdhbml6YXRpb247IHVzZSByZXBvc2l0b3JpZXMgZm9yIGV4YWN0IG93bmVyL3JlcG9zaXRvcnkgZ3JhbnRzLiBUaGVcbi8vIG5leHQgd2JmeSBydW4gb24gZWFjaCBtYXRjaGluZyByZXBvc2l0b3J5IHJld3JpdGVzIGV2ZXJ5IG1hbmFnZWQgZm5veC50b21sIGFuZCByZS1lbmNyeXB0cyBpdHNcbi8vIGNvbW1pdHRlZCBzZWNyZXRzIGZvciB0aGUgcmVzdWx0aW5nIHJlY2lwaWVudCBzZXQuIEEgc2NvcGUncyBvcHRpb25hbCB2aXNpYmlsaXR5IGNvbnN0cmFpbnRcbi8vIHNlbGVjdHMgb25seSBwdWJsaWMgb3Igb25seSBwcml2YXRlIHJlcG9zaXRvcmllcyAodXNlZCB0byBrZWVwIHRoZSBvcmctaW50ZXJuYWwgYW5kIHRoZVxuLy8gcHVibGljLXJlcG9zaXRvcnkgQ0kgaWRlbnRpdGllcyBhcGFydCkuIFJlbW92aW5nIGEgc2NvcGUgY2Fubm90IHJldm9rZSBjaXBoZXJ0ZXh0XG4vLyBhbHJlYWR5IGF2YWlsYWJsZSBmcm9tIEdpdCBoaXN0b3J5LCBzbyByb3RhdGUgdGhlIHNlY3JldCB2YWx1ZXMgdGhhdCBwcmluY2lwYWwgY291bGQgZGVjcnlwdC5cbi8vIE9ubHkgcHVibGljIGtleXMgbWF5IGFwcGVhciBoZXJlOyBhIENJIGlkZW50aXR5J3MgcHJpdmF0ZSBrZXkgc3VwcGxpZXMgdGhlIEZOT1hfQUdFX0tFWSAob3IsXG4vLyBmb3IgcHVibGljIHJlcG9zaXRvcmllcywgUFVCTElDX0ZOT1hfQUdFX0tFWSkgb3JnYW5pemF0aW9uIHNlY3JldC5cbmV4cG9ydCBjb25zdCBGTk9YX0FHRV9QUklOQ0lQQUxTID0gW1xuICB7XG4gICAgbmFtZTogJ2V4a2F6dXUnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWoyMzU0eGh2bTNmdjl5Nzd0NWc2eTNxOG1leGdrMm1mMDB0Z3JremdwNzN0eW5ydno1NXM4YXVheXcnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAncG9uaGFydScsXG4gICAgcHVibGljS2V5czogW1xuICAgICAgJ2FnZTE4cnVnbGRmOWh0YzZ1bTVlcGxweDI3azUzZXA0em4wbGh6d2ZmZ254emhycTBjN3pndnlxM3pjY2R5JyxcbiAgICAgICdhZ2Uxbnoybjk5Y3JqcjducDl4amdsd2ZmZmMzZHVkNDVkaGV3cXpxZnpwenRrZHd1NGhqNzRncTZlbDUzMycsXG4gICAgXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICAvLyBUaGUgb3JnLWludGVybmFsIENJIGlkZW50aXR5ICh0aGUgRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvbiBzZWNyZXQgLyB+Ly5jb25maWcvZm5veC9hZ2UtY2ktd2IudHh0KS5cbiAgICBuYW1lOiAnY2knLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWEyYzZlZjZhaGw2bW1raGdxdHhnMG1ndGQ3eXNzcG50cTdyeHVzdjI2ZWZ4aG51aGxjZHNyOWRwYWsnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddLCB2aXNpYmlsaXR5OiAncHJpdmF0ZScgfSxcbiAgICBjaUFnZUtleVNlY3JldE5hbWU6ICdGTk9YX0FHRV9LRVknLFxuICB9LFxuICB7XG4gICAgLy8gVGhlIENJIGlkZW50aXR5IGRlZGljYXRlZCB0byBwdWJsaWMgcmVwb3NpdG9yaWVzICh0aGUgUFVCTElDX0ZOT1hfQUdFX0tFWSBvcmdhbml6YXRpb25cbiAgICAvLyBzZWNyZXQgLyB+Ly5jb25maWcvZm5veC9hZ2UtY2ktd2ItcHVibGljLnR4dCkuIFNjb3BlZCB0byBXaWxsQm9vc3RlciBvbmx5IGJlY2F1c2UgdGhlXG4gICAgLy8gUFVCTElDX0ZOT1hfQUdFX0tFWSBzZWNyZXQgaXMgcmVnaXN0ZXJlZCBpbiB0aGF0IG9yZ2FuaXphdGlvbiBhbG9uZTsgYSBwdWJsaWNcbiAgICAvLyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3J5IHJlc29sdmVzIE5PIENJIGlkZW50aXR5IGFuZCBnZW5lcmF0ZUZub3hUb21sIGZhaWxzIGNsb3NlZCBvbiBpdFxuICAgIC8vIChXaWxsQm9vc3RlckxhYiBkb2VzIG93biBwdWJsaWMgcmVwb3NpdG9yaWVzLCBlLmcuIGl0cyByZXVzYWJsZS13b3JrZmxvd3Mgc3luYyBtaXJyb3IsIGJ1dFxuICAgIC8vIG5vbmUgb2YgdGhlbSB1c2UgZm5veCDigJQgcmVnaXN0ZXIgdGhlIHNlY3JldCB0aGVyZSBhbmQgZXh0ZW5kIHRoaXMgc2NvcGUgaWYgb25lIGV2ZXIgZG9lcykuXG4gICAgbmFtZTogJ2NpLXB1YmxpYycsXG4gICAgcHVibGljS2V5czogWydhZ2UxZmhlYTg1eGp3cDg5bHdxM2pjbndqMzJzd2gzdjI0cHdwYXJxaDVsN3FrZ3ZjNGF4M3AwcWw2ZHUzNiddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJ10sIHZpc2liaWxpdHk6ICdwdWJsaWMnIH0sXG4gICAgY2lBZ2VLZXlTZWNyZXROYW1lOiAnUFVCTElDX0ZOT1hfQUdFX0tFWScsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAncmVtaW4nLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMW13NHB6OWR1ank5ZG1oazBwYWxxYXdqa2o3bTRrN3p4Nzh5cjlmanQ2M3NhNWwzZTQzdXE2bncwMDQnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnYXJpZXMnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMW5uMGVoeWFlbnlxOGttbnE0Mjk0a3p6Z3h2NWRuZjZwZXAyY2RrcmF4emZxbGs3eGdzcnFxbjZubjknXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHtcbiAgICAgIHJlcG9zaXRvcmllczogW1xuICAgICAgICAnV2lsbEJvb3N0ZXIvYWdlbnQtY2hhbGxlbmdlcycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9hZ2VudGljLXdvcmtmbG93cy1kYXNoYm9hcmQnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvY2hlZXJsaW5ncycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9jaG9mdS13YWxraW5nJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL3Byb21wdC1zdHVkeScsXG4gICAgICAgICdXaWxsQm9vc3Rlci9leGVyY29kZScsXG4gICAgICAgICdXaWxsQm9vc3Rlci9qdWRnZScsXG4gICAgICBdLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnc3VuYWdhJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTF1bHh6bjZ5NjhrdTM0Y3B4NWZ5YTVnZjdybnJ3ejB1ZmxueWU2dXh1aGczNHAybmpoZ2txbWc3M2c0J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7XG4gICAgICByZXBvc2l0b3JpZXM6IFsnV2lsbEJvb3N0ZXIvYWktb2NyJywgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJywgJ1dpbGxCb29zdGVyL2p1ZGdlJ10sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdheWFtZScsXG4gICAgcHVibGljS2V5czogWydhZ2UxdnhtMmdzMDAzcnV3bThwNmgzaHY3eGFzanUyczhrNG14bWMzNHptNmdyZHd6bnJzMDlucTZ4ejV2eiddLFxuICAgIHJlcG9zaXRvcnlTY29wZToge1xuICAgICAgcmVwb3NpdG9yaWVzOiBbJ1dpbGxCb29zdGVyL2FpLW9jcicsICdXaWxsQm9vc3Rlci9jaG9mdS13YWxraW5nJywgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJywgJ1dpbGxCb29zdGVyL2p1ZGdlJ10sXG4gICAgfSxcbiAgfSxcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IEZub3hBZ2VQcmluY2lwYWxbXTtcblxuaW50ZXJmYWNlIEZub3hUb21sIHtcbiAgaW1wb3J0PzogdW5rbm93bjtcbiAgcHJvdmlkZXJzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+O1xuICBwcm9maWxlcz86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxubGV0IGZub3hTeW5jRmFpbGVkID0gZmFsc2U7XG5sZXQgbWlncmF0aW9uTWFya2VyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xubGV0IG1pZ3JhdGlvbk1hcmtlck93bmVkID0gZmFsc2U7XG5cbi8qKiBXaGV0aGVyIGFueSBmbm94IHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gZmFpbGVkIGluIHRoZSBjdXJyZW50IHJlcG9zaXRvcnk7IHNldHVwU2VjcmV0cyBtdXN0IG5vdCB1cGxvYWQgdGhlbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNGbm94U3luY0ZhaWxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZub3hTeW5jRmFpbGVkO1xufVxuXG4vKipcbiAqIFN5bmNocm9uaXplcyB0aGUgYWdlIHJlY2lwaWVudHMgaW4gZXZlcnkgZm5veC50b21sIHdpdGggdGhlIHByaW5jaXBhbHMgYXV0aG9yaXplZCBmb3IgdGhpc1xuICogcmVwb3NpdG9yeSBhbmQgcmUtZW5jcnlwdHMgdGhlIGNvbW1pdHRlZCBzZWNyZXRzIHdoZW4gdGhlIHJlY2lwaWVudCBzZXQgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRm5veFRvbWwocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRm5veFRvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVGhlIGZhaWx1cmUgZmxhZyBpcyBwZXIgcmVwb3NpdG9yeTogd2JmeSBjYW4gcHJvY2VzcyBtdWx0aXBsZSB3b3JraW5nIGRpcmVjdG9yaWVzIGluIG9uZVxuICAgIC8vIGludm9jYXRpb24sIGFuZCBhbiBlYXJsaWVyIHJlcG9zaXRvcnkncyBmYWlsdXJlIG11c3Qgbm90IHZldG8gYSBsYXRlciByZXBvc2l0b3J5J3MgdXBsb2FkLlxuICAgIGZub3hTeW5jRmFpbGVkID0gZmFsc2U7XG4gICAgLy8gQSByZXBvc2l0b3J5IG91dHNpZGUgV2lsbEJvb3N0ZXIvV2lsbEJvb3N0ZXJMYWIgbWFuYWdlcyBpdHMgb3duIHJlY2lwaWVudCBzZXQgKGUuZy4gYVxuICAgIC8vIHBlcnNvbmFsIHJlcG9zaXRvcnkgd2l0aCBpdHMgb3duIENJIGlkZW50aXR5KSwgc28gcmV3cml0aW5nIGl0IHRvIHRoZSBvcmcgcm9zdGVyIHdvdWxkIGdyYW50XG4gICAgLy8gb3JnIG1lbWJlcnMgYWNjZXNzIGFuZCByZS1lbmNyeXB0IHNlY3JldHMgZm9yIGEgQ0kga2V5IHRoYXQgcmVwb3NpdG9yeSBkb2VzIG5vdCB1c2UuXG4gICAgLy8gc2V0dXBTZWNyZXRzIG5ldmVyIHVwbG9hZHMgc2VjcmV0cyBmb3Igc3VjaCByZXBvc2l0b3JpZXMgZWl0aGVyLCBzbyBza2lwIGVudGlyZWx5LlxuICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwbykgcmV0dXJuO1xuICAgIGNvbnN0IGFnZVJlY2lwaWVudHMgPSBnZXRGbm94QWdlUmVjaXBpZW50cyhyb290Q29uZmlnKTtcbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIC8vIEEgbmVzdGVkLW9ubHkgZm5veCBsYXlvdXQgaXMgdW5zdXBwb3J0ZWQ6IHNldHVwU2VjcmV0cyB3b3VsZCB0YWtlIHRoZSBkb3RlbnYgcGF0aCBhbmRcbiAgICAgIC8vIGRlbGV0ZSBGTk9YX0FHRV9LRVkgZXZlbiB0aG91Z2ggdGhlIG5lc3RlZCBjb25maWcncyBDSSBzdGlsbCBuZWVkcyBpdC5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIE9ubHkgYWdlLXVzaW5nIGNvbmZpZ3MgY2FycnkgdGhhdCByaXNrLiBXaXRob3V0IGEgcm9vdCBwcm92aWRpbmcgdGhlIGFnZSBwcm92aWRlciwgYVxuICAgICAgICAvLyBzdHJheSBjb25maWcgdGhhdCBkZWNsYXJlcyBub25lIHVzZXMgbm8gYWdlIGVuY3J5cHRpb24gYXQgYWxsIChlLmcuIGEgcGxhaW50ZXh0IHRlc3RcbiAgICAgICAgLy8gZml4dHVyZSBvciBleGFtcGxlIGNvbmZpZyBhbnkgcmVwb3NpdG9yeSBtYXkgbGVnaXRpbWF0ZWx5IGNvbW1pdCksIHNvIGl0IG5laXRoZXIgbmVlZHNcbiAgICAgICAgLy8gcmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBub3Igb3ducyBhbiBGTk9YX0FHRV9LRVkgYW5kIG11c3Qgbm90IGJsb2NrIHRoZSBydW4uXG4gICAgICAgIGNvbnN0IHN0cmF5RmlsZVBhdGhzID0gbGlzdEZub3hMaWtlRmlsZVBhdGhzKHJvb3REaXJQYXRoKS5maWx0ZXIoKGZpbGVQYXRoKSA9PlxuICAgICAgICAgIGRlY2xhcmVzRm5veEFnZVByb3ZpZGVyKGZpbGVQYXRoKVxuICAgICAgICApO1xuICAgICAgICBpZiAoc3RyYXlGaWxlUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGZub3ggY29uZmlncyBleGlzdCB3aXRob3V0IGEgcm9vdCBmbm94LnRvbWw6ICR7c3RyYXlGaWxlUGF0aHMuam9pbignLCAnKX0uIEFkZCBhIHJvb3QgZm5veC50b21sLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBGYWlsIGNsb3NlZDogd2l0aG91dCBnaXQgaW5mb3JtYXRpb24gYSBuZXN0ZWQtb25seSBmbm94IGxheW91dCBjYW5ub3QgYmUgcnVsZWQgb3V0LCBhbmRcbiAgICAgICAgLy8gc2V0dXBTZWNyZXRzIHdvdWxkIG90aGVyd2lzZSB0YWtlIHRoZSBkb3RlbnYgcGF0aCBhbmQgZGVsZXRlIEZOT1hfQUdFX0tFWS5cbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gY2hlY2sgZm9yIG5lc3RlZCBmbm94IGNvbmZpZ3MgZHVlIHRvOiAkeyhlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3J9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBIGZhaWxlZCB2aXNpYmlsaXR5IGxvb2t1cCBjb2xsYXBzZXMgaXNQdWJsaWNSZXBvIHRvIGZhbHNlLCB3aGljaCB3b3VsZCBzaWxlbnRseSByZS1lbmNyeXB0XG4gICAgLy8gYSBwdWJsaWMgcmVwb3NpdG9yeSdzIHdvcmxkLXJlYWRhYmxlIGNpcGhlcnRleHRzIHRvIHRoZSBvcmctaW50ZXJuYWwgQ0kgaWRlbnRpdHkgKGFuZCB2aWNlXG4gICAgLy8gdmVyc2EgZHJvcCB0aGUgcHVibGljIG9uZSkuIEZhaWwgaW5zdGVhZCBvZiBndWVzc2luZyB3aGVuZXZlciB2aXNpYmlsaXR5IGNoYW5nZXMgdGhlIHJvc3Rlci5cbiAgICBpZiAoIXJvb3RDb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duICYmIGRvZXNGbm94UmVjaXBpZW50U2V0RGVwZW5kT25WaXNpYmlsaXR5KHJvb3RDb25maWcpKSB7XG4gICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIHRoZSB2aXNpYmlsaXR5IG9mICR7cm9vdENvbmZpZy5yZXBvQXV0aG9yfS8ke3Jvb3RDb25maWcucmVwb05hbWV9IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIChHaXRIdWIgbG9va3VwIGZhaWxlZCkgYW5kIHRoZSBDSSByZWNpcGllbnQgZGVwZW5kcyBvbiBpdC4gQ2hlY2sgbmV0d29yayBhbmQgZ2ggYXV0aGVudGljYXRpb24sIHRoZW4gcmVydW4gd2JmeS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBCb3RoIENJIGlkZW50aXRpZXMgYXJlIHZpc2liaWxpdHktY29uc3RyYWluZWQsIHNvIGEgcmVwb3NpdG9yeSBjYW4gZmFsbCB0aHJvdWdoIEJPVEggKGUuZy4gYVxuICAgIC8vIHB1YmxpYyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3J5LCB3aG9zZSBvcmdhbml6YXRpb24gaGFzIG5vIFBVQkxJQ19GTk9YX0FHRV9LRVkgc2VjcmV0KS5cbiAgICAvLyBSZS1lbmNyeXB0aW5nIGZvciBhIHJvc3RlciB3aXRob3V0IGEgQ0kgaWRlbnRpdHkgd291bGQgbGVhdmUgQ0kgdW5hYmxlIHRvIGRlY3J5cHQgYW55dGhpbmcsXG4gICAgLy8gZmFpbGluZyBvbmx5IGF0IHJ1bnRpbWUgaW4gQWN0aW9uczsgZmFpbCBsb3VkbHkgaGVyZSBpbnN0ZWFkLlxuICAgIGlmICghcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUocm9vdENvbmZpZykpIHtcbiAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2Ugbm8gQ0kgaWRlbnRpdHkgaXMgc2NvcGVkIHRvICR7cm9vdENvbmZpZy5yZXBvQXV0aG9yfS8ke3Jvb3RDb25maWcucmVwb05hbWV9IChwdWJsaWMgcmVwb3NpdG9yaWVzIGFyZSBzdXBwb3J0ZWQgb25seSBpbiB0aGUgV2lsbEJvb3N0ZXIgb3JnYW5pemF0aW9uKS4gUHJvdmlzaW9uIHRoZSBtYXRjaGluZyBvcmdhbml6YXRpb24gc2VjcmV0IGFuZCBleHRlbmQgdGhlIENJIHNjb3BlcyBpbiB3YmZ5IGZpcnN0LmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoZSBtaWdyYXRpb24gaXMgdHJhbnNhY3Rpb25hbCBvdmVyIGV2ZXJ5IG1hbmFnZWQgZm5veC50b21sOiByZXJ1bnMgbXVzdCByZXRyeSBmcm9tIHRoZVxuICAgIC8vIG9yaWdpbmFsIHN0YXRlLCBhbmQgYSBwYXJ0aWFsbHkgbWlncmF0ZWQgdHJlZSBjb3VsZCBvdGhlcndpc2UgYmVjb21lIHVuZGVjcnlwdGFibGUgZm9yIHRoZVxuICAgIC8vIGlkZW50aXR5IHBlcmZvcm1pbmcgYSBsYXRlciByZXRyeSAoZS5nLiB3aGVuIGEgcmVjaXBpZW50IGlzIGJlaW5nIHJlbW92ZWQpLlxuICAgIGNvbnN0IHNuYXBzaG90cyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgLy8gQSBmYWlsZWQgc3luY2hyb25pemF0aW9uIG11c3QgZmFpbCB0aGUgd2hvbGUgd2JmeSBydW46IGV4aXRpbmcgemVybyB3aXRoIHN0YWxlIHJlY2lwaWVudHNcbiAgICAvLyB3b3VsZCBsZWF2ZSBzZWNyZXRzIHVuZGVjcnlwdGFibGUgZm9yIG5ldyByZWNpcGllbnRzIHdoaWxlIGxvb2tpbmcgc3VjY2Vzc2Z1bC5cbiAgICB0cnkge1xuICAgICAgLy8gQW55IGZub3ggY29uZmlnIChpbmNsdWRpbmcgYWxpYXNlcyBhbmQgbG9jYWwgb3ZlcnJpZGVzKSBpbiBhbiBhbmNlc3RvciBkaXJlY3Rvcnkgd291bGRcbiAgICAgIC8vIG1lcmdlIGludG8gKGFuZCBwb3NzaWJseSBiZSBSRVdSSVRURU4gYnkpIHRoaXMgcmVwb3NpdG9yeSdzIGBmbm94IHJlZW5jcnlwdGAgdGhyb3VnaFxuICAgICAgLy8gaGllcmFyY2hpY2FsIGxvYWRpbmcsIHVzaW5nIHRoaXMgcmVwb3NpdG9yeSdzIHJlY2lwaWVudCBzZXQgZm9yIGZvcmVpZ24gc2VjcmV0cy5cbiAgICAgIGZvciAobGV0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUocm9vdERpclBhdGgpOyA7IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCkpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3JGbm94RmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGgpO1xuICAgICAgICBpZiAoYW5jZXN0b3JGbm94RmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBhbiBhbmNlc3RvciBkaXJlY3RvcnkgY29udGFpbnMgZm5veCBjb25maWdzIHRoYXQgZm5veCB3b3VsZCBoaWVyYXJjaGljYWxseSBtZXJnZSBhbmQgcmV3cml0ZTogJHthbmNlc3RvckZub3hGaWxlTmFtZXNcbiAgICAgICAgICAgICAgLm1hcCgobmFtZSkgPT4gcGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKVxuICAgICAgICAgICAgICAuam9pbignLCAnKX0uIFJlbW92ZSB0aGVtIG9yIG1vdmUgdGhlIHJlcG9zaXRvcnkuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoLmRpcm5hbWUoZGlyUGF0aCkgPT09IGRpclBhdGgpIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gZm5veCBhbHNvIGxvYWRzIGNvbW1pdHRlZCBjb25maWcgYWxpYXNlcyB0aGlzIGdlbmVyYXRvciBjYW5ub3Qga2VlcCBpbiBzeW5jLlxuICAgICAgY29uc3QgZm5veExpa2VGaWxlUGF0aHMgPSBsaXN0Rm5veExpa2VGaWxlUGF0aHMocm9vdERpclBhdGgpO1xuICAgICAgY29uc3QgdW5zdXBwb3J0ZWRGaWxlUGF0aHMgPSBmbm94TGlrZUZpbGVQYXRocy5maWx0ZXIoKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSAhPT0gJ2Zub3gudG9tbCcpO1xuICAgICAgaWYgKHVuc3VwcG9ydGVkRmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIG9ubHkgZm5veC50b21sIGZpbGVzIGFyZSBzdXBwb3J0ZWQ6ICR7dW5zdXBwb3J0ZWRGaWxlUGF0aHMuam9pbignLCAnKX0uIE1lcmdlIHRoZW0gaW50byB0aGUgYWRqYWNlbnQgZm5veC50b21sLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZGlyUGF0aHMgPSBsaXN0Rm5veFRvbWxEaXJQYXRocyhmbm94TGlrZUZpbGVQYXRocyk7XG4gICAgICBpZiAoIWRpclBhdGhzLmluY2x1ZGVzKHJvb3REaXJQYXRoKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdmbm94LnRvbWwnKX0gaXMgaW52aXNpYmxlIHRvIGdpdCAoZ2l0aWdub3JlZD8pLiBDb21taXQgaXQgb3IgcmVtb3ZlIGl0LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gR2l0LWJhc2VkIGRpc2NvdmVyeSBjYW5ub3Qgc2VlIGdpdGlnbm9yZWQgZmlsZXMsIHNvIGFsc28gaW5zcGVjdCBldmVyeSBkaXJlY3RvcnkgaW4gZWFjaFxuICAgICAgLy8gbWFuYWdlZCBjb25maWcncyBoaWVyYXJjaHkgdGhyb3VnaCB0aGUgZmlsZXN5c3RlbTogYSBnaXRpZ25vcmVkIGFsaWFzIChlLmcuIC5mbm94LnRvbWwpXG4gICAgICAvLyBvciBhIGdpdGlnbm9yZWQgZm5veC50b21sIGluIGFuIGludGVybWVkaWF0ZSBkaXJlY3Rvcnkgd291bGQgc3RpbGwgYmUgbG9hZGVkIGJ5IGZub3ggYW5kXG4gICAgICAvLyBjb3VsZCBvdmVycmlkZSB0aGUgcHJvdmlkZXIgdXNlZCBmb3IgbmVzdGVkIHJlLWVuY3J5cHRpb24uXG4gICAgICBjb25zdCBtYW5hZ2VkRGlyUGF0aHMgPSBuZXcgU2V0KGRpclBhdGhzKTtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgICBmb3IgKGNvbnN0IGhpZXJhcmNoeURpclBhdGggb2YgbGlzdEFuY2VzdG9yRGlyUGF0aHMoZGlyUGF0aCwgcm9vdERpclBhdGgpKSB7XG4gICAgICAgICAgY29uc3Qgc3RyYXlGaWxlTmFtZXMgPSBsaXN0Rm5veExpa2VGaWxlTmFtZXMoaGllcmFyY2h5RGlyUGF0aCkuZmlsdGVyKFxuICAgICAgICAgICAgKG5hbWUpID0+IG5hbWUgIT09ICdmbm94LmxvY2FsLnRvbWwnICYmICEobmFtZSA9PT0gJ2Zub3gudG9tbCcgJiYgbWFuYWdlZERpclBhdGhzLmhhcyhoaWVyYXJjaHlEaXJQYXRoKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzdHJheUZpbGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGZub3ggd291bGQgbG9hZCB1bm1hbmFnZWQgKGdpdGlnbm9yZWQ/KSBjb25maWdzOiAke3N0cmF5RmlsZU5hbWVzXG4gICAgICAgICAgICAgICAgLm1hcCgobmFtZSkgPT4gcGF0aC5qb2luKGhpZXJhcmNoeURpclBhdGgsIG5hbWUpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpfS4gQ29tbWl0IHRoZW0gYXMgZm5veC50b21sIG9yIHJlbW92ZSB0aGVtLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEEgZm5veC5sb2NhbC50b21sIGFueXdoZXJlIGluIHRoZSBtZXJnZWQgaGllcmFyY2h5IChub3Qgb25seSBuZXh0IHRvIGEgbWFuYWdlZFxuICAgICAgICAgIC8vIGNvbmZpZykgY2FuIG92ZXJyaWRlIHByb3ZpZGVycy5cbiAgICAgICAgICBjb25zdCBsb2NhbElzc3VlID0gZmluZEZub3hMb2NhbFRvbWxJc3N1ZShoaWVyYXJjaHlEaXJQYXRoKTtcbiAgICAgICAgICBpZiAobG9jYWxJc3N1ZSkge1xuICAgICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke2xvY2FsSXNzdWV9LiBLZWVwIG9ubHkgbWFjaGluZS1sb2NhbCBzZWNyZXQgb3ZlcnJpZGVzIHRoZXJlLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW4tbWVtb3J5IHNuYXBzaG90cyBkbyBub3Qgc3Vydml2ZSBhIGtpbGxlZCBwcm9jZXNzLCBzbyBhIGR1cmFibGUgbWFya2VyIGlzIHdyaXR0ZW5cbiAgICAgIC8vIGJlZm9yZSB0aGUgZmlyc3QgbXV0YXRpb24gYW5kIHJlbW92ZWQgb25seSB3aGVuIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQgYWdhaW4uIEEgbGVmdG92ZXJcbiAgICAgIC8vIG1hcmtlciBtZWFucyBhIHByZXZpb3VzIHJ1biB3YXMga2lsbGVkIG1pZC1taWdyYXRpb24gKG9yIGNvdWxkIG5vdCByZXN0b3JlKTogc29tZVxuICAgICAgLy8gY2lwaGVydGV4dHMgbWF5IG5vdCBtYXRjaCB0aGUgcmVjaXBpZW50cywgb3IgbWF5IGV2ZW4gYmUgdW5kZWNyeXB0YWJsZSBmb3IgdGhlIGV4ZWN1dG9yJ3NcbiAgICAgIC8vIGlkZW50aXR5IHdoZW4gYSByZWNpcGllbnQgd2FzIGJlaW5nIHJlbW92ZWQg4oCUIHN0YXRlcyB0aGlzIGNvZGUgY2Fubm90IHJlcGFpciBzYWZlbHlcbiAgICAgIC8vIGJlY2F1c2UgdGhlIHdvcmtpbmcgdHJlZSBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIChicmFuY2ggc3dpdGNoZXMsIG1hbnVhbCBlZGl0cykuIFRoZVxuICAgICAgLy8gZm5veC50b21sIGZpbGVzIGFyZSBnaXQtdHJhY2tlZCwgc28gdGhlIHVzZXIgcmVzdG9yZXMgdGhlbSB2aWEgZ2l0IGFuZCBjbGVhcnMgdGhlIG1hcmtlci5cbiAgICAgIG1pZ3JhdGlvbk1hcmtlclBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICcudG1wJywgJ3diZnktZm5veC1taWdyYXRpb24tbWFya2VyJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhtaWdyYXRpb25NYXJrZXJQYXRoKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgYSBwcmV2aW91cyBtaWdyYXRpb24gd2FzIGludGVycnVwdGVkLiBSZXN0b3JlIHRoZSBmbm94LnRvbWwgZmlsZXMgdmlhIGdpdCAoZS5nLiBcXGBnaXQgc3RhdHVzXFxgIGFuZCBcXGBnaXQgcmVzdG9yZSAtLSAnKmZub3gqLnRvbWwnXFxgIGlmIHlvdSBoYXZlIG5vIGludGVudGlvbmFsIGxvY2FsIGNoYW5nZXMpLCB0aGVuIGRlbGV0ZSAke21pZ3JhdGlvbk1hcmtlclBhdGh9IGFuZCByZXJ1biB3YmZ5LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBIHRyYWNrZWQgc3ltbGluayBuYW1lZCBmbm94LnRvbWwgKG9yIGEgc3ltbGlua2VkIHBhcmVudCBkaXJlY3RvcnkpIHdvdWxkIG1ha2UgdGhlXG4gICAgICAvLyByZXdyaXRlIGFuZCBgZm5veCByZWVuY3J5cHRgIHJlYWQgYW5kIE1PRElGWSBmaWxlcyBvdXRzaWRlIHRoaXMgcmVwb3NpdG9yeS5cbiAgICAgIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgY29uc3QgZm5veFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LnRvbWwnKTtcbiAgICAgICAgY29uc3QgcmVhbFBhdGggPSBmcy5yZWFscGF0aFN5bmMoZm5veFRvbWxQYXRoKTtcbiAgICAgICAgaWYgKGZzLmxzdGF0U3luYyhmbm94VG9tbFBhdGgpLmlzU3ltYm9saWNMaW5rKCkgfHwgIXJlYWxQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApKSB7XG4gICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtmbm94VG9tbFBhdGh9IGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5ICgke3JlYWxQYXRofSkuIFJlcGxhY2UgaXQgd2l0aCBhIHJlZ3VsYXIgaW4tcmVwb3NpdG9yeSBmaWxlLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzbmFwc2hvdHMuc2V0KGZub3hUb21sUGF0aCwgZnMucmVhZEZpbGVTeW5jKGZub3hUb21sUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNvcnRlZCBvcmRlciBwcm9jZXNzZXMgYW5jZXN0b3JzIGJlZm9yZSBkZXNjZW5kYW50cywgc28gY29uZmlncyBpbmhlcml0aW5nIGFuIHVwZGF0ZWRcbiAgICAgIC8vIHByb3ZpZGVyIHJlLWVuY3J5cHQgYWdhaW5zdCB0aGUgYWxyZWFkeS11cGRhdGVkIHJlY2lwaWVudHMuXG4gICAgICBjb25zdCBjaGFuZ2VkRGlyUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICBsZXQgYW55RmFpbGVkID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3JDaGFuZ2VkID0gY2hhbmdlZERpclBhdGhzLnNvbWUoKGNoYW5nZWREaXJQYXRoKSA9PiBkaXJQYXRoLnN0YXJ0c1dpdGgoY2hhbmdlZERpclBhdGggKyBwYXRoLnNlcCkpO1xuICAgICAgICAvLyBFdmVyeSBkaXJQYXRoIHdhcyBzbmFwc2hvdHRlZCBhYm92ZS4gQSBtaXNzaW5nIHNuYXBzaG90IG11c3QgZmFpbCBoYXJkOiBmYWxsaW5nIGJhY2sgdG9cbiAgICAgICAgLy8gYW4gZW1wdHkgc3RyaW5nIHdvdWxkIGZsb3cgaW50byByZXBsYWNlQWdlUmVjaXBpZW50cyBhbmQgb3ZlcndyaXRlIHRoZSByZWFsIGZub3gudG9tbFxuICAgICAgICAvLyB3aXRoIGEgcmVjaXBpZW50cy1vbmx5IGZpbGUsIGRlc3Ryb3lpbmcgZXZlcnkgY29tbWl0dGVkIHNlY3JldC5cbiAgICAgICAgY29uc3Qgc25hcHNob3RDb250ZW50ID0gc25hcHNob3RzLmdldChwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gudG9tbCcpKTtcbiAgICAgICAgaWYgKHNuYXBzaG90Q29udGVudCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZm5veC50b21sIHNuYXBzaG90IGZvciAke2RpclBhdGh9LmApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzeW5jaHJvbml6ZUZub3hBZ2VSZWNpcGllbnRzKFxuICAgICAgICAgIGRpclBhdGgsXG4gICAgICAgICAgcm9vdERpclBhdGgsXG4gICAgICAgICAgZGlyUGF0aCA9PT0gcm9vdERpclBhdGgsXG4gICAgICAgICAgYW5jZXN0b3JDaGFuZ2VkLFxuICAgICAgICAgIHNuYXBzaG90Q29udGVudCxcbiAgICAgICAgICBhZ2VSZWNpcGllbnRzXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09ICdjaGFuZ2VkJykgY2hhbmdlZERpclBhdGhzLnB1c2goZGlyUGF0aCk7XG4gICAgICAgIGFueUZhaWxlZCB8fD0gcmVzdWx0ID09PSAnZmFpbGVkJztcbiAgICAgIH1cbiAgICAgIGlmIChhbnlGYWlsZWQpIHtcbiAgICAgICAgLy8gQSBmYWlsZWQgcmUtZW5jcnlwdGlvbiBtYXkgaGF2ZSByZXdyaXR0ZW4gc29tZSBjaXBoZXJ0ZXh0cywgc28gcmVzdG9yZSB1bmNvbmRpdGlvbmFsbHkuXG4gICAgICAgIC8vIFRoZSBtYXJrZXIgaXMgcmVtb3ZlZCBvbmx5IHdoZW4gcmVzdG9yYXRpb24gZnVsbHkgc3VjY2VlZGVkIGFuZCB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LlxuICAgICAgICAvLyBSZXN0b3JlIE9OTFkgd2hlbiB0aGlzIHJ1biBvd25zIHRoZSBtYXJrZXI6IGV2ZXJ5IGNvbW1pdHRlZC1jb25maWcgbXV0YXRpb24gaGFwcGVuc1xuICAgICAgICAvLyBhZnRlciBtYXJrZXIgYWNxdWlzaXRpb24sIHNvIGEgbm9uLW93bmVyIChlLmcuIGxvc2luZyBhIHJhY2UgYWdhaW5zdCBhIGNvbmN1cnJlbnQgd2JmeSlcbiAgICAgICAgLy8gaGFzIGNoYW5nZWQgbm90aGluZyBhbmQgbXVzdCBub3Qgb3ZlcndyaXRlIHRoZSBvd25lcidzIGluLXByb2dyZXNzIG1pZ3JhdGlvbi5cbiAgICAgICAgaWYgKG1pZ3JhdGlvbk1hcmtlck93bmVkICYmIHJlc3RvcmVTbmFwc2hvdHMoc25hcHNob3RzKSkgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChtaWdyYXRpb25NYXJrZXJPd25lZCAmJiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90cykpIHtcbiAgICAgICAgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH1cbiAgICAgIGZhaWxGbm94U3luYyhgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgZHVlIHRvOiAkeyhlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBtaWdyYXRpb25NYXJrZXJQYXRoID0gdW5kZWZpbmVkO1xuICAgICAgbWlncmF0aW9uTWFya2VyT3duZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzeW5jaHJvbml6ZUZub3hBZ2VSZWNpcGllbnRzKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIGlzUm9vdDogYm9vbGVhbixcbiAgYW5jZXN0b3JSZWNpcGllbnRzQ2hhbmdlZDogYm9vbGVhbixcbiAgb3JpZ2luYWxDb250ZW50OiBzdHJpbmcsXG4gIGFnZVJlY2lwaWVudHM6IHJlYWRvbmx5IEZub3hBZ2VSZWNpcGllbnRbXVxuKTogUHJvbWlzZTwnY2hhbmdlZCcgfCAndW5jaGFuZ2VkJyB8ICdmYWlsZWQnPiB7XG4gIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC50b21sJyk7XG5cbiAgLy8gUmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBvbmx5IHVuZGVyc3RhbmRzIHRoZSBzdGFuZGFyZCBzaW5nbGUtZmlsZSBsYXlvdXQgd2l0aCBvbmVcbiAgLy8gdG9wLWxldmVsIGFnZSBwcm92aWRlciBuYW1lZCBgYWdlYC4gR2l0aWdub3JlZCBjb25maWcgYWxpYXNlcyAoZS5nLiAuZm5veC5sb2NhbC50b21sKSB0aGF0XG4gIC8vIGdpdC1iYXNlZCBkaXNjb3ZlcnkgY2Fubm90IHNlZSwgaW1wb3J0cywgZGlmZmVyZW50bHkgbmFtZWQgYWdlIHByb3ZpZGVycywgb3IgcHJvdmlkZXJcbiAgLy8gb3ZlcnJpZGVzIHdvdWxkIGtlZXAgdXNpbmcgcmVjaXBpZW50IHNldHMgdGhpcyBnZW5lcmF0b3IgZG9lcyBub3QgcmV3cml0ZSwgc28gdGhlaXIgc2VjcmV0c1xuICAvLyB3b3VsZCBzaWxlbnRseSBzdGF5IHVuZGVjcnlwdGFibGUgZm9yIG5ldyByZWNpcGllbnRzOyBmYWlsIGluc3RlYWQgb2YgcHJvY2VlZGluZy4gVGhlXG4gIC8vIGdpdGlnbm9yZWQgZm5veC5sb2NhbC50b21sIGlzIGEgc3VwcG9ydGVkIG1hY2hpbmUtbG9jYWwgb3ZlcnJpZGUsIGJ1dCBvbmx5IHdoaWxlIGl0IGxlYXZlc1xuICAvLyBwcm92aWRlcnMgYWxvbmUuXG4gIGNvbnN0IHVuc3VwcG9ydGVkRmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGgpLmZpbHRlcihcbiAgICAobmFtZSkgPT4gbmFtZSAhPT0gJ2Zub3gudG9tbCcgJiYgbmFtZSAhPT0gJ2Zub3gubG9jYWwudG9tbCdcbiAgKTtcbiAgaWYgKHVuc3VwcG9ydGVkRmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBmYWlsRm5veFN5bmMoXG4gICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgaW4gJHtkaXJQYXRofSBiZWNhdXNlIG9ubHkgZm5veC50b21sIGFuZCBmbm94LmxvY2FsLnRvbWwgYXJlIHN1cHBvcnRlZDogJHt1bnN1cHBvcnRlZEZpbGVOYW1lcy5qb2luKCcsICcpfS4gTWVyZ2UgdGhlbSBpbnRvIGZub3gudG9tbC5gXG4gICAgKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgLy8gQSBzdGFsZSBiYWNrdXAgbGVmdCBieSBhbiBpbnRlcnJ1cHRlZCBlYXJsaWVyIHJ1biBtdXN0IGJlIHJlc3RvcmVkIHNvIHRoZSB1c2VyJ3MgbG9jYWxcbiAgLy8gb3ZlcnJpZGVzIGFyZSBuZXZlciBzaWxlbnRseSBsb3N0ICh0aGUgbWlncmF0aW9uIG1hcmtlciBzZXBhcmF0ZWx5IGJsb2NrcyB0aGlzIHJ1biB3aGVuIHRoZVxuICAvLyBpbnRlcnJ1cHRpb24gbGVmdCB0aGUgbWlncmF0aW9uIGl0c2VsZiBpbmNvbXBsZXRlKS5cbiAgcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcblxuICBjb25zdCBsYXlvdXRJc3N1ZSA9IGZpbmRGbm94TGF5b3V0SXNzdWUob3JpZ2luYWxDb250ZW50KTtcbiAgaWYgKGxheW91dElzc3VlKSB7XG4gICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7Zm5veFRvbWxQYXRofSAke2xheW91dElzc3VlfS5gKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShvcmlnaW5hbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICBjb25zdCBwcm9maWxlTmFtZXMgPSBPYmplY3Qua2V5cyhzZXR0aW5ncy5wcm9maWxlcyA/PyB7fSk7XG4gIGNvbnN0IGN1cnJlbnRSZWNpcGllbnRzID0gcmVhZEZub3hBZ2VSZWNpcGllbnRzKG9yaWdpbmFsQ29udGVudCk7XG5cbiAgLy8gQSBuZXN0ZWQgZm5veC50b21sIHdpdGhvdXQgaXRzIG93biBhZ2UgcHJvdmlkZXIgaW5oZXJpdHMgdGhlIG5lYXJlc3QgYW5jZXN0b3IncyBvbmUgdGhyb3VnaFxuICAvLyBmbm94J3MgaGllcmFyY2hpY2FsIGxvYWRpbmcsIHNvIG9ubHkgdGhlIHJvb3QgY29uZmlnIG11c3QgZGVjbGFyZSB0aGUgcHJvdmlkZXIg4oCUIGJ1dCB0aGVcbiAgLy8gbmVzdGVkIGNvbmZpZydzIG93biBjaXBoZXJ0ZXh0cyBzdGlsbCBtdXN0IGJlIHJlLWVuY3J5cHRlZCB3aGVuZXZlciBhbiBhbmNlc3RvcidzIHJlY2lwaWVudHNcbiAgLy8gY2hhbmdlZCwgYW5kIHRoYXQgb25seSBoYXBwZW5zIHdoZW4gYGZub3ggcmVlbmNyeXB0YCBydW5zIGZyb20gdGhlIG5lc3RlZCBkaXJlY3RvcnkuXG4gIGlmICghaXNSb290ICYmICFjdXJyZW50UmVjaXBpZW50cykge1xuICAgIGlmIChhbmNlc3RvclJlY2lwaWVudHNDaGFuZ2VkKSB7XG4gICAgICB3cml0ZU1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgaWYgKCFyZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoLCByb290RGlyUGF0aCwgcHJvZmlsZU5hbWVzKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byByZS1lbmNyeXB0IGZub3ggc2VjcmV0cyBpbiAke2RpclBhdGh9IGZvciB0aGUgdXBkYXRlZCByZWNpcGllbnRzLiBGaXggdGhlIGVycm9yIGFuZCByZXJ1biB3YmZ5LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuICdmYWlsZWQnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJ3VuY2hhbmdlZCc7XG4gIH1cblxuICBpZiAoXG4gICAgY3VycmVudFJlY2lwaWVudHMgJiZcbiAgICBjdXJyZW50UmVjaXBpZW50cy5zaXplID09PSBhZ2VSZWNpcGllbnRzLmxlbmd0aCAmJlxuICAgIGFnZVJlY2lwaWVudHMuZXZlcnkoKHJlY2lwaWVudCkgPT4gY3VycmVudFJlY2lwaWVudHMuaGFzKHJlY2lwaWVudC5wdWJsaWNLZXkpKVxuICApIHtcbiAgICByZXR1cm4gJ3VuY2hhbmdlZCc7XG4gIH1cblxuICAvLyBSZXdyaXRlIG9ubHkgdGhlIHJlY2lwaWVudHMgYXNzaWdubWVudCBzbyB1c2VyLWF1dGhvcmVkIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIHN1cnZpdmUuXG4gIC8vIFJlLXBhcnNlIGJlZm9yZSB3cml0aW5nOiBhbiB1bnVzdWFsIGxheW91dCAoZS5nLiBkb3R0ZWQga2V5cykgY291bGQgbWFrZSB0aGUgdGV4dHVhbCBlZGl0XG4gIC8vIHByb2R1Y2UgYSBkdXBsaWNhdGUgdGFibGUgb3IgbGVhdmUgdGhlIG9sZCByZWNpcGllbnRzIGluIGVmZmVjdC5cbiAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSByZXBsYWNlQWdlUmVjaXBpZW50cyhvcmlnaW5hbENvbnRlbnQsIGFnZVJlY2lwaWVudHMpO1xuICBjb25zdCB1cGRhdGVkUmVjaXBpZW50cyA9IFsuLi4ocmVhZEZub3hBZ2VSZWNpcGllbnRzKHVwZGF0ZWRDb250ZW50KSA/PyBbXSldO1xuICBpZiAoXG4gICAgdXBkYXRlZFJlY2lwaWVudHMubGVuZ3RoICE9PSBhZ2VSZWNpcGllbnRzLmxlbmd0aCB8fFxuICAgICFhZ2VSZWNpcGllbnRzLmV2ZXJ5KChyZWNpcGllbnQpID0+IHVwZGF0ZWRSZWNpcGllbnRzLmluY2x1ZGVzKHJlY2lwaWVudC5wdWJsaWNLZXkpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJld3JpdGluZyB0aGUgYWdlIHJlY2lwaWVudHMgaW4gJHtmbm94VG9tbFBhdGh9IGRpZCBub3QgdGFrZSBlZmZlY3Q7IHVwZGF0ZSB0aGVtIG1hbnVhbGx5LmApO1xuICB9XG4gIHdyaXRlTWlncmF0aW9uTWFya2VyKCk7XG4gIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZm5veFRvbWxQYXRoLCB1cGRhdGVkQ29udGVudCk7XG5cbiAgaWYgKCFyZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoLCByb290RGlyUGF0aCwgcHJvZmlsZU5hbWVzKSkge1xuICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGNvbmZpZzoga2VlcGluZyB0aGUgbmV3IHJlY2lwaWVudHMgd2l0aCBvbGQgY2lwaGVydGV4dHMgd291bGQgbWFrZVxuICAgIC8vIHRoaXMgZ2VuZXJhdG9yIHNraXAgcmUtZW5jcnlwdGlvbiBmb3JldmVyIGFuZCBsZXQgc2V0dXBTZWNyZXRzIHVwbG9hZCBhIENJIGtleSB0aGF0XG4gICAgLy8gY2Fubm90IGRlY3J5cHQgYW55dGhpbmcuIFRoZSBvbGQgY2lwaGVydGV4dHMgcmVtYWluIHZhbGlkIGZvciB0aGUgb2xkIHJlY2lwaWVudHMuXG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmbm94VG9tbFBhdGgsIG9yaWdpbmFsQ29udGVudCk7XG4gICAgZmFpbEZub3hTeW5jKFxuICAgICAgYEZhaWxlZCB0byByZS1lbmNyeXB0IGZub3ggc2VjcmV0cyBpbiAke2RpclBhdGh9IGZvciB0aGUgdXBkYXRlZCByZWNpcGllbnRzLiBGaXggdGhlIGVycm9yIGFuZCByZXJ1biB3YmZ5LmBcbiAgICApO1xuICAgIHJldHVybiAnZmFpbGVkJztcbiAgfVxuICByZXR1cm4gJ2NoYW5nZWQnO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiBhIGZub3gudG9tbCBsYXlvdXQgdGhhdCByZWNpcGllbnQgc3luY2hyb25pemF0aW9uIGFuZCB0aGUgQ0kta2V5XG4gKiB2ZXJpZmljYXRpb24gY2Fubm90IGNvdmVyLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgc3RhbmRhcmQgc2luZ2xlLWZpbGUsIHNpbmdsZS1hZ2UtcHJvdmlkZXJcbiAqIGxheW91dCBpcyB1c2VkLlxuICovXG5mdW5jdGlvbiBmaW5kRm5veExheW91dElzc3VlKGZub3hUb21sQ29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZub3hUb21sQ29udGVudCkgYXMgRm5veFRvbWw7XG4gICAgaWYgKHNldHRpbmdzLmltcG9ydCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gJ3VzZXMgdGhlIHVuc3VwcG9ydGVkIGBpbXBvcnRgIHNldHRpbmcnO1xuICAgIGNvbnN0IG5vblN0YW5kYXJkQWdlUHJvdmlkZXJOYW1lcyA9IE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnByb3ZpZGVycyA/PyB7fSlcbiAgICAgIC5maWx0ZXIoKFtuYW1lLCBwcm92aWRlcl0pID0+IChwcm92aWRlcj8udHlwZSA9PT0gJ2FnZScpICE9PSAobmFtZSA9PT0gJ2FnZScpKVxuICAgICAgLm1hcCgoW25hbWVdKSA9PiBuYW1lKTtcbiAgICBpZiAobm9uU3RhbmRhcmRBZ2VQcm92aWRlck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgZGVjbGFyZXMgYWdlIHByb3ZpZGVycyBub3QgbmFtZWQgXFxgYWdlXFxgIChvciBhbiBcXGBhZ2VcXGAgcHJvdmlkZXIgb2YgYW5vdGhlciB0eXBlKTogJHtub25TdGFuZGFyZEFnZVByb3ZpZGVyTmFtZXMuam9pbignLCAnKX1gO1xuICAgIH1cbiAgICBjb25zdCBwcm9maWxlc1dpdGhQcm92aWRlcnMgPSBPYmplY3QuZW50cmllcyhzZXR0aW5ncy5wcm9maWxlcyA/PyB7fSlcbiAgICAgIC5maWx0ZXIoKFssIHByb2ZpbGVdKSA9PiBwcm9maWxlPy5wcm92aWRlcnMpXG4gICAgICAubWFwKChbbmFtZV0pID0+IG5hbWUpO1xuICAgIGlmIChwcm9maWxlc1dpdGhQcm92aWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGBkZWNsYXJlcyB1bnN1cHBvcnRlZCBwcm9maWxlLXNwZWNpZmljIHByb3ZpZGVyczogJHtwcm9maWxlc1dpdGhQcm92aWRlcnMuam9pbignLCAnKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJ2Nhbm5vdCBiZSBwYXJzZWQgYXMgVE9NTCc7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgW3Byb3ZpZGVycy5hZ2VdLnJlY2lwaWVudHMgb2YgYSBmbm94LnRvbWwsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBjb25maWcgZGVjbGFyZXMgbm9cbiAqIGFnZSBwcm92aWRlciAobmVzdGVkIGNvbmZpZ3MgdGhlbiBpbmhlcml0IHRoZSByb290IG9uZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRm5veEFnZVJlY2lwaWVudHMoZm5veFRvbWxDb250ZW50OiBzdHJpbmcpOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShmbm94VG9tbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICAgIGlmICghc2V0dGluZ3MucHJvdmlkZXJzPy5hZ2UpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjaXBpZW50cyA9IHNldHRpbmdzLnByb3ZpZGVycy5hZ2UucmVjaXBpZW50cztcbiAgICByZXR1cm4gbmV3IFNldChBcnJheS5pc0FycmF5KHJlY2lwaWVudHMpID8gcmVjaXBpZW50cy5maWx0ZXIoKHIpOiByIGlzIHN0cmluZyA9PiB0eXBlb2YgciA9PT0gJ3N0cmluZycpIDogW10pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBBbiB1bnBhcnNhYmxlIGZub3gudG9tbCB5aWVsZHMgbm8gcmVjaXBpZW50cywgc28gdGhlIGNhbGxlciByZXBvcnRzIGFuIGVycm9yLlxuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cbn1cblxudHlwZSBGbm94UmVwb3NpdG9yeUlkZW50aXR5ID0gUGljazxQYWNrYWdlQ29uZmlnLCAncmVwb0F1dGhvcicgfCAncmVwb05hbWUnIHwgJ2lzUHVibGljUmVwbycgfCAnaXNSZXBvVmlzaWJpbGl0eUtub3duJz47XG5cbi8qKlxuICogVGhlIEdpdEh1YiBzZWNyZXQgaG9sZGluZyB0aGUgcHJpdmF0ZSBrZXkgb2YgdGhlIENJIGlkZW50aXR5IHNjb3BlZCB0byB0aGUgcmVwb3NpdG9yeSwgb3JcbiAqIHVuZGVmaW5lZCB3aGVuIG5vbmUgaXMgKGFuIHVua25vd24gdmlzaWJpbGl0eSwgb3IgYSByZXBvc2l0b3J5IG5vIENJIHNjb3BlIGNvdmVycykuIFRoZSBzaW5nbGVcbiAqIHNvdXJjZSBvZiB0cnV0aCBzaGFyZWQgYnkgdGhlIHJlY2lwaWVudCBzeW5jIGFuZCB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3MgY2FsbGVyIG1hcHBpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUoXG4gIGNvbmZpZzogRm5veFJlcG9zaXRvcnlJZGVudGl0eVxuKTogJ0ZOT1hfQUdFX0tFWScgfCAnUFVCTElDX0ZOT1hfQUdFX0tFWScgfCB1bmRlZmluZWQge1xuICBjb25zdCBjaVByaW5jaXBhbDogRm5veEFnZVByaW5jaXBhbCB8IHVuZGVmaW5lZCA9IEZOT1hfQUdFX1BSSU5DSVBBTFMuZmluZChcbiAgICAocHJpbmNpcGFsOiBGbm94QWdlUHJpbmNpcGFsKSA9PlxuICAgICAgcHJpbmNpcGFsLmNpQWdlS2V5U2VjcmV0TmFtZSAmJiBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShwcmluY2lwYWwucmVwb3NpdG9yeVNjb3BlLCBjb25maWcpXG4gICk7XG4gIHJldHVybiBjaVByaW5jaXBhbD8uY2lBZ2VLZXlTZWNyZXROYW1lO1xufVxuXG4vKiogV2hldGhlciB0aGUgcmVjaXBpZW50IHNldCBkaWZmZXJzIGJldHdlZW4gdGhlIHB1YmxpYyBhbmQgcHJpdmF0ZSByZWFkaW5nIG9mIHRoZSByZXBvc2l0b3J5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvZXNGbm94UmVjaXBpZW50U2V0RGVwZW5kT25WaXNpYmlsaXR5KFxuICByb290Q29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdyZXBvQXV0aG9yJyB8ICdyZXBvTmFtZSc+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgcHVibGljS2V5c0ZvciA9IChpc1B1YmxpY1JlcG86IGJvb2xlYW4pOiBzdHJpbmcgPT5cbiAgICBnZXRGbm94QWdlUmVjaXBpZW50cyh7IC4uLnJvb3RDb25maWcsIGlzUHVibGljUmVwbywgaXNSZXBvVmlzaWJpbGl0eUtub3duOiB0cnVlIH0pXG4gICAgICAubWFwKCh7IHB1YmxpY0tleSB9KSA9PiBwdWJsaWNLZXkpXG4gICAgICAuam9pbignXFxuJyk7XG4gIHJldHVybiBwdWJsaWNLZXlzRm9yKHRydWUpICE9PSBwdWJsaWNLZXlzRm9yKGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZub3hBZ2VSZWNpcGllbnRzKHJvb3RDb25maWc6IEZub3hSZXBvc2l0b3J5SWRlbnRpdHkpOiBGbm94QWdlUmVjaXBpZW50W10ge1xuICByZXR1cm4gRk5PWF9BR0VfUFJJTkNJUEFMUy5maWx0ZXIoKHByaW5jaXBhbCkgPT5cbiAgICBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShwcmluY2lwYWwucmVwb3NpdG9yeVNjb3BlLCByb290Q29uZmlnKVxuICApLmZsYXRNYXAoKHByaW5jaXBhbCkgPT5cbiAgICBwcmluY2lwYWwucHVibGljS2V5cy5tYXAoKHB1YmxpY0tleSwgaW5kZXgpID0+ICh7XG4gICAgICBuYW1lOiBwcmluY2lwYWwucHVibGljS2V5cy5sZW5ndGggPT09IDEgPyBwcmluY2lwYWwubmFtZSA6IGAke3ByaW5jaXBhbC5uYW1lfSR7aW5kZXggKyAxfWAsXG4gICAgICBwdWJsaWNLZXksXG4gICAgfSkpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShzY29wZTogRm5veFJlcG9zaXRvcnlTY29wZSwgcmVwb3NpdG9yeTogRm5veFJlcG9zaXRvcnlJZGVudGl0eSk6IGJvb2xlYW4ge1xuICBjb25zdCBvd25lciA9IHJlcG9zaXRvcnkucmVwb0F1dGhvcj8udG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbmFtZSA9IHJlcG9zaXRvcnkucmVwb05hbWU/LnRvTG93ZXJDYXNlKCk7XG4gIGlmICghb3duZXIgfHwgIW5hbWUpIHJldHVybiBmYWxzZTtcblxuICAvLyBBbiB1bmtub3duIHZpc2liaWxpdHkgKGZhaWxlZCBHaXRIdWIgbG9va3VwKSBtYXRjaGVzIG5vIHZpc2liaWxpdHktY29uc3RyYWluZWQgc2NvcGU6IGNhbGxlcnNcbiAgLy8gdGhhdCB3b3VsZCByZXdyaXRlIHJlY2lwaWVudHMgZmFpbCBpbnN0ZWFkIG9mIGVuY3J5cHRpbmcgdG8gdGhlIHdyb25nIENJIGlkZW50aXR5LlxuICBpZiAoXG4gICAgc2NvcGUudmlzaWJpbGl0eSAmJlxuICAgICghcmVwb3NpdG9yeS5pc1JlcG9WaXNpYmlsaXR5S25vd24gfHwgKHNjb3BlLnZpc2liaWxpdHkgPT09ICdwdWJsaWMnKSAhPT0gcmVwb3NpdG9yeS5pc1B1YmxpY1JlcG8pXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgKHNjb3BlLm9yZ2FuaXphdGlvbnM/LnNvbWUoKG9yZ2FuaXphdGlvbikgPT4gb3JnYW5pemF0aW9uLnRvTG93ZXJDYXNlKCkgPT09IG93bmVyKSA/PyBmYWxzZSkgfHxcbiAgICAoc2NvcGUucmVwb3NpdG9yaWVzPy5zb21lKChmdWxsTmFtZSkgPT4gZnVsbE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYCR7b3duZXJ9LyR7bmFtZX1gKSA/PyBmYWxzZSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUFnZVJlY2lwaWVudHMoY29udGVudDogc3RyaW5nLCBhZ2VSZWNpcGllbnRzOiByZWFkb25seSBGbm94QWdlUmVjaXBpZW50W10pOiBzdHJpbmcge1xuICAvLyBUcmFpbGluZyBuYW1lIGNvbW1lbnRzIGxldCBodW1hbnMgdGVsbCB3aG9zZSBrZXkgZWFjaCByZWNpcGllbnQgaXMgd2l0aG91dCBjb25zdWx0aW5nIHdiZnkuXG4gIGNvbnN0IHJlY2lwaWVudHNUZXh0ID0gYHJlY2lwaWVudHMgPSBbXFxuJHthZ2VSZWNpcGllbnRzXG4gICAgLm1hcCgocmVjaXBpZW50KSA9PiBgICBcIiR7cmVjaXBpZW50LnB1YmxpY0tleX1cIiwgIyAke3JlY2lwaWVudC5uYW1lfWApXG4gICAgLmpvaW4oJ1xcbicpfVxcbl1gO1xuICAvLyB3YmZ5IHdyaXRlcyBhIFtwcm92aWRlcnMuYWdlXSB0YWJsZSAocG9zc2libHkgd2l0aCBhIHRyYWlsaW5nIGNvbW1lbnQpLiBTY2FuIGxpbmUtd2lzZSBzbyB0aGF0XG4gIC8vIGEgYFtgIGluc2lkZSBhIGNvbW1lbnQgb3IgYSBzdHJpbmcgbmV2ZXIgdGVybWluYXRlcyB0aGUgdGFibGUgZWFybHk7IHRoZSB0YWJsZSBlbmRzIGF0IHRoZVxuICAvLyBuZXh0IGxpbmUtc3RhcnQgdGFibGUgaGVhZGVyLiBUaGUgYXNzaWdubWVudCBtYXRjaCBpcyBsaW5lLWFuY2hvcmVkIHNvIGEgY29tbWVudGVkLW91dFxuICAvLyBgIyByZWNpcGllbnRzID0gWy4uLl1gIGlzIG5ldmVyIG1pc3Rha2VuIGZvciB0aGUgcmVhbCBvbmUsIHdoaWxlIG11bHRpbGluZSBhcnJheXMgc3RpbGwgbWF0Y2hcbiAgLy8gYmVjYXVzZSB0aGUgbmVnYXRlZCBjbGFzcyBbXlxcXV0gKHVubGlrZSBgLmApIHNwYW5zIG5ld2xpbmVzLiBBbnkgb3RoZXIgc3BlbGxpbmcgZmFsbHMgdGhyb3VnaFxuICAvLyB0byB0aGUgY2FsbGVyJ3MgcmUtcGFyc2UgdmFsaWRhdGlvbiwgd2hpY2ggZmFpbHMgdGhlIHJ1biBzYWZlbHkgd2l0aCBpbnN0cnVjdGlvbnMgaW5zdGVhZCBvZlxuICAvLyBjb3JydXB0aW5nIHRoZSBmaWxlLlxuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBoZWFkZXJJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gL15cXHMqXFxbcHJvdmlkZXJzXFwuYWdlXFxdXFxzKig/OiMuKik/JC91LnRlc3QobGluZSkpO1xuICBpZiAoaGVhZGVySW5kZXggIT09IC0xKSB7XG4gICAgbGV0IGVuZEluZGV4ID0gbGluZXMubGVuZ3RoO1xuICAgIGZvciAobGV0IGluZGV4ID0gaGVhZGVySW5kZXggKyAxOyBpbmRleCA8IGxpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKC9eXFxzKlxcWy91LnRlc3QobGluZXNbaW5kZXhdID8/ICcnKSkge1xuICAgICAgICBlbmRJbmRleCA9IGluZGV4O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VjdGlvbiA9IGxpbmVzLnNsaWNlKGhlYWRlckluZGV4LCBlbmRJbmRleCkuam9pbignXFxuJyk7XG4gICAgY29uc3QgcmVwbGFjZWRTZWN0aW9uID0gc2VjdGlvbi5yZXBsYWNlKC9eXFxzKnJlY2lwaWVudHNcXHMqPVxccypcXFtbXlxcXV0qXFxdL211LCByZWNpcGllbnRzVGV4dCk7XG4gICAgY29uc3QgbmV3U2VjdGlvbiA9XG4gICAgICByZXBsYWNlZFNlY3Rpb24gPT09IHNlY3Rpb25cbiAgICAgICAgPyBbbGluZXNbaGVhZGVySW5kZXhdLCByZWNpcGllbnRzVGV4dCwgLi4ubGluZXMuc2xpY2UoaGVhZGVySW5kZXggKyAxLCBlbmRJbmRleCldLmpvaW4oJ1xcbicpXG4gICAgICAgIDogcmVwbGFjZWRTZWN0aW9uO1xuICAgIHJldHVybiBbLi4ubGluZXMuc2xpY2UoMCwgaGVhZGVySW5kZXgpLCBuZXdTZWN0aW9uLCAuLi5saW5lcy5zbGljZShlbmRJbmRleCldLmpvaW4oJ1xcbicpO1xuICB9XG4gIHJldHVybiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5bcHJvdmlkZXJzLmFnZV1cXG50eXBlID0gXCJhZ2VcIlxcbiR7cmVjaXBpZW50c1RleHR9XFxuYDtcbn1cblxuLy8gUmUtZW5jcnlwdHMgdGhlIGJhc2Ugc2VjcmV0cyBhbmQgZWFjaCBwcm9maWxlJ3Mgb3duIHNlY3JldHMgKC0tbm8tZGVmYXVsdHMga2VlcHMgdGhlIG1lcmdlZFxuLy8gYmFzZSBzZWNyZXRzIGZyb20gYmVpbmcgZHVwbGljYXRlZCBpbnRvIHByb2ZpbGUgdGFibGVzKSBmb3IgdGhlIGN1cnJlbnQgcmVjaXBpZW50IHNldC4gVGhlXG4vLyBzcGF3bmVkIGZub3ggcnVucyB3aXRoIGFuIGlzb2xhdGVkIEhPTUUvWERHX0NPTkZJR19IT01FIGJlY2F1c2UgZm5veCBtZXJnZXMgdGhlIHVzZXItZ2xvYmFsXG4vLyB+Ly5jb25maWcvZm5veC9jb25maWcudG9tbCBpbnRvIGV2ZXJ5IHByb2plY3QgY29uZmlnIOKAlCBhIHBsYWluIHJlZW5jcnlwdCB3b3VsZCByZXdyaXRlIHRoZVxuLy8gdXNlcidzIGdsb2JhbCBzZWNyZXRzIHRvby4gRGVjcnlwdGlvbiB0aGVyZWZvcmUgbmVlZHMgdGhlIHBlcnNvbmFsIGlkZW50aXR5IHBhc3NlZCBleHBsaWNpdGx5XG4vLyB2aWEgRk5PWF9BR0VfS0VZOyBGTk9YX1BST0ZJTEUgaXMgc3RyaXBwZWQgc28gaXQgY2Fubm90IHJlZGlyZWN0IHRoZSBiYXNlIChubyAtUCkgcnVuLlxuZnVuY3Rpb24gcmVlbmNyeXB0Rm5veFNlY3JldHMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nLCBwcm9maWxlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIFRoZSBpZGVudGl0eSBpcyBvcHRpb25hbDogYSBwbGFpbnRleHQtb25seSBjb25maWcgaGFzIG5vdGhpbmcgdG8gZGVjcnlwdCBhbmQgZm5veCBzdWNjZWVkc1xuICAvLyB3aXRob3V0IG9uZSwgd2hpbGUgZXhpc3RpbmcgY2lwaGVydGV4dHMgbWFrZSBmbm94IGZhaWwgbG91ZGx5IG9uIGl0cyBvd24uXG4gIGNvbnN0IGlkZW50aXR5ID0gcmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KCkgPz8gcHJvY2Vzcy5lbnYuRk5PWF9BR0VfS0VZO1xuICBjb25zdCBmbm94Q29tbWFuZCA9IHJlc29sdmVGbm94Q29tbWFuZChkaXJQYXRoKTtcbiAgY29uc3QgaXNvbGF0ZWRIb21lRGlyUGF0aCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diZnktZm5veC1ob21lLScpKTtcbiAgdHJ5IHtcbiAgICAvLyBIaWRlIHRoZSBsb2NhbCBvdmVycmlkZXMgb2YgRVZFUlkgZGlyZWN0b3J5IGZub3ggbWVyZ2VzIGhpZXJhcmNoaWNhbGx5IChmcm9tIHRoZSBjb21tYW5kXG4gICAgLy8gZGlyZWN0b3J5IHVwIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QpOiBhbiBhbmNlc3RvcidzIGZub3gubG9jYWwudG9tbCB3b3VsZCBvdGhlcndpc2Ugc2hhZG93XG4gICAgLy8gY29tbWl0dGVkIHNlY3JldHMgb3IgaXRzZWxmIGdldCByZXdyaXR0ZW4gYnkgdGhlIHJlLWVuY3J5cHRpb24uXG4gICAgcmV0dXJuIHdpdGhGbm94TG9jYWxzSGlkZGVuKHJvb3REaXJQYXRoLCBsaXN0QW5jZXN0b3JEaXJQYXRocyhkaXJQYXRoLCByb290RGlyUGF0aCksICgpID0+IHtcbiAgICAgIGNvbnN0IGVudiA9IHtcbiAgICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHByb2Nlc3MuZW52KS5maWx0ZXIoKFtrZXldKSA9PiAha2V5LnN0YXJ0c1dpdGgoJ0ZOT1hfJykpKSxcbiAgICAgICAgLi4uKGlkZW50aXR5ID8geyBGTk9YX0FHRV9LRVk6IGlkZW50aXR5IH0gOiB7fSksXG4gICAgICAgIEhPTUU6IGlzb2xhdGVkSG9tZURpclBhdGgsXG4gICAgICAgIFhER19DT05GSUdfSE9NRTogaXNvbGF0ZWRIb21lRGlyUGF0aCxcbiAgICAgIH07XG4gICAgICBjb25zdCBwcm9maWxlQXJnc0xpc3QgPSBbW10sIC4uLnByb2ZpbGVOYW1lcy5tYXAoKG5hbWUpID0+IFsnLS1uby1kZWZhdWx0cycsIGAtLXByb2ZpbGU9JHtuYW1lfWBdKV07XG4gICAgICBmb3IgKGNvbnN0IHByb2ZpbGVBcmdzIG9mIHByb2ZpbGVBcmdzTGlzdCkge1xuICAgICAgICBjb25zdCBhcmdzID0gWydyZWVuY3J5cHQnLCAnLS1mb3JjZScsICctLW5vLWRhZW1vbicsICctLXByb3ZpZGVyJywgJ2FnZScsIC4uLnByb2ZpbGVBcmdzXTtcbiAgICAgICAgY29uc29sZS5sb2coYCQgJHtmbm94Q29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX0gYXQgJHtkaXJQYXRofWApO1xuICAgICAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoZm5veENvbW1hbmQsIGFyZ3MsIHtcbiAgICAgICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgICAgIGVudixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgocHJvYy5zdGF0dXMgPz8gMSkgIT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyhpc29sYXRlZEhvbWVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgYWN0dWFsIGZub3ggYmluYXJ5LiBgZm5veGAgb24gUEFUSCBpcyBvZnRlbiBhIG1pc2Ugc2hpbSwgYW5kIG1pc2UgcmVmdXNlcyB0byBydW5cbiAqIG9uY2UgSE9NRS9YREdfQ09ORklHX0hPTUUgcG9pbnQgYXQgdGhlIGlzb2xhdGVkIGRpcmVjdG9yeSAoaXRzIHRydXN0IHN0YXRlIGRpc2FwcGVhcnMpLCBzbyB0aGVcbiAqIGlzb2xhdGVkIHNwYXducyBuZWVkIHRoZSBzaGltIHJlc29sdmVkIHRvIHRoZSByZWFsIGV4ZWN1dGFibGUgYmVmb3JlaGFuZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUZub3hDb21tYW5kKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnbWlzZScsIFsnd2hpY2gnLCAnZm5veCddLCB7IGN3ZDogZGlyUGF0aCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwcm9jLnN0YXR1cyA9PT0gMCA/IHByb2Muc3Rkb3V0LnRyaW0oKSA6ICcnO1xuICByZXR1cm4gcmVzb2x2ZWQgfHwgJ2Zub3gnO1xufVxuXG4vLyBUaGUgcGVyc29uYWwgaWRlbnRpdHkgZmlsZSBpcyBtYWNoaW5lLWdsb2JhbCwgc28gaXQgaXMgcmVhZCBvbmNlIHBlciBwcm9jZXNzLlxubGV0IGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSA9IGZhbHNlO1xubGV0IGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHJlYWRQZXJzb25hbEFnZVNlY3JldEtleSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaGFzUmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KSByZXR1cm4gY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk7XG4gIGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSA9IHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNvbmZpZycsICdmbm94JywgJ2FnZS50eHQnKSwgJ3V0ZjgnKTtcbiAgICBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleSA9IGNvbnRlbnRcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maW5kKChsaW5lKSA9PiBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCdBR0UtU0VDUkVULUtFWS0nKSlcbiAgICAgID8udHJpbSgpO1xuICB9IGNhdGNoIHtcbiAgICBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk7XG59XG5cbi8qKlxuICogUnVucyBhIGZ1bmN0aW9uIHdoaWxlIHRoZSBtYWNoaW5lLWxvY2FsIGZub3gubG9jYWwudG9tbCBmaWxlcyBvZiB0aGUgZ2l2ZW4gZGlyZWN0b3JpZXMgYXJlXG4gKiB0ZW1wb3JhcmlseSBtb3ZlZCBhc2lkZTogZm5veCBsb2FkcyB0aGVtIGF0IGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBjb21taXR0ZWQgZm5veC50b21sLCBzbyBhXG4gKiBsb2NhbCBvdmVycmlkZSBzaGFkb3dpbmcgYSBjb21taXR0ZWQgc2VjcmV0IHdvdWxkIG1ha2UgYGZub3ggcmVlbmNyeXB0YCBza2lwIHRoYXQgc2VjcmV0LlxuICovXG5mdW5jdGlvbiB3aXRoRm5veExvY2Fsc0hpZGRlbjxUPihyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoczogc3RyaW5nW10sIGZ1bmM6ICgpID0+IFQpOiBUIHtcbiAgY29uc3QgaGlkZGVuRGlyUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICByZWNvdmVyU3RhbGVGbm94TG9jYWxCYWNrdXAocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICAgICAgY29uc3QgbG9jYWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICAgICAgY29uc3QgYmFja3VwUGF0aCA9IGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICAgICAgICBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoLCBiYWNrdXBQYXRoKTtcbiAgICAgICAgZnMucmVuYW1lU3luYyhsb2NhbFBhdGgsIGJhY2t1cFBhdGgpO1xuICAgICAgICBoaWRkZW5EaXJQYXRocy5wdXNoKGRpclBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBmdW5jKCk7XG4gICAgLy8gQSByZXN0b3JhdGlvbiBjb25mbGljdCB0aHJvd3MgaGVyZSBhbmQgdGhlcmVieSBpbnZhbGlkYXRlcyB0aGUgc2VlbWluZ2x5IHN1Y2Nlc3NmdWwgcmVzdWx0OlxuICAgIC8vIGEgcmVjcmVhdGVkIG92ZXJyaWRlIG1heSBoYXZlIHNoYWRvd2VkIGNvbW1pdHRlZCBzZWNyZXRzIGR1cmluZyB0aGUgZm5veCBydW4sIHNvIHRoZSBvdXRlclxuICAgIC8vIHRyYW5zYWN0aW9uIG11c3QgcmVzdG9yZSBldmVyeSBjb21taXR0ZWQgZm5veC50b21sIGluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgbWlncmF0aW9uLlxuICAgIHJlc3RvcmVIaWRkZW5Gbm94TG9jYWxzKHJvb3REaXJQYXRoLCBoaWRkZW5EaXJQYXRocyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBUaGUgb3JpZ2luYWwgZmFpbHVyZSBtdXN0IHdpbjsgYSByZXN0b3JhdGlvbiBjb25mbGljdCBvbiB0aGlzIHBhdGggaXMgb25seSByZXBvcnRlZCBzbyBpdFxuICAgIC8vIGNhbm5vdCBtYXNrIHRoZSByb290IGNhdXNlLlxuICAgIHRyeSB7XG4gICAgICByZXN0b3JlSGlkZGVuRm5veExvY2Fscyhyb290RGlyUGF0aCwgaGlkZGVuRGlyUGF0aHMpO1xuICAgIH0gY2F0Y2ggKHJlc3RvcmVFcnJvcikge1xuICAgICAgZmFpbEZub3hTeW5jKChyZXN0b3JlRXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IFN0cmluZyhyZXN0b3JlRXJyb3IpKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLy8gTW92ZXMgdGhlIGhpZGRlbiBmbm94LmxvY2FsLnRvbWwgZmlsZXMgYmFjaywgY2xlYXJpbmcgdGhlIGdpdmVuIGxpc3Qgc28gYSBzZWNvbmQgY2FsbCBpcyBhXG4vLyBuby1vcC4gTmV2ZXIgY2xvYmJlcnMgYSBmbm94LmxvY2FsLnRvbWwgcmVjcmVhdGVkIChlLmcuIGJ5IGFuIGVkaXRvcikgd2hpbGUgZm5veCB3YXMgcnVubmluZzpcbi8vIHRoZSBiYWNrdXAgaXMga2VwdCBhbmQgcmVwb3J0ZWQgZm9yIGEgbWFudWFsIG1lcmdlLlxuZnVuY3Rpb24gcmVzdG9yZUhpZGRlbkZub3hMb2NhbHMocm9vdERpclBhdGg6IHN0cmluZywgaGlkZGVuRGlyUGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGNvbmZsaWN0aW5nTG9jYWxQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGhpZGRlbkRpclBhdGhzLnNwbGljZSgwKSkge1xuICAgIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgICAgY29uZmxpY3RpbmdMb2NhbFBhdGhzLnB1c2gobG9jYWxQYXRoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmcy5yZW5hbWVTeW5jKGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpLCBsb2NhbFBhdGgpO1xuICB9XG4gIGlmIChjb25mbGljdGluZ0xvY2FsUGF0aHMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgZm9sbG93aW5nIGZub3gubG9jYWwudG9tbCBmaWxlcyB3ZXJlIHJlY3JlYXRlZCB3aGlsZSBmbm94IHdhcyBydW5uaW5nIChvcmlnaW5hbCBmaWxlcyBhcmUgcHJlc2VydmVkIHVuZGVyICR7cGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnLnRtcCcsICd3YmZ5LWZub3gtbG9jYWwtYmFja3VwJyl9IOKAlCBtZXJnZSB0aGVtIG1hbnVhbGx5KTogJHtjb25mbGljdGluZ0xvY2FsUGF0aHMuam9pbignLCAnKX1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc3RvcmVzIGEgZm5veC5sb2NhbC50b21sIGJhY2t1cCBsZWZ0IGJ5IGFuIGludGVycnVwdGVkIGVhcmxpZXIgcnVuIHNvIHRoZSB1c2VyJ3MgbG9jYWxcbiAqIG92ZXJyaWRlcyBhcmUgbmV2ZXIgc2lsZW50bHkgbG9zdC5cbiAqL1xuZnVuY3Rpb24gcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICBjb25zdCBiYWNrdXBQYXRoID0gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhiYWNrdXBQYXRoKSkgcmV0dXJuO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBCb3RoICR7bG9jYWxQYXRofSBhbmQgaXRzIGJhY2t1cCAke2JhY2t1cFBhdGh9IGV4aXN0OyByZXNvbHZlIHRoZSBsZWZ0b3ZlciBiYWNrdXAgbWFudWFsbHkuYCk7XG4gIH1cbiAgZW5zdXJlU2FmZUZub3hMb2NhbEJhY2t1cERpcihyb290RGlyUGF0aCwgYmFja3VwUGF0aCk7XG4gIGZzLnJlbmFtZVN5bmMoYmFja3VwUGF0aCwgbG9jYWxQYXRoKTtcbn1cblxuLy8gQ3JlYXRlcyB0aGUgYmFja3VwIGRpcmVjdG9yeSBhbmQgcHJvdmVzIG5vIHBhdGggY29tcG9uZW50IGJlbG93IHRoZSByZXBvc2l0b3J5IHJvb3QgaXMgYVxuLy8gc3ltbGluazogYSByZXBvc2l0b3J5LWNvbnRyb2xsZWQgc3ltbGluayAoZS5nLiBhIHRyYWNrZWQgLnRtcC93YmZ5LWZub3gtbG9jYWwtYmFja3VwIGxpbmspXG4vLyBjb3VsZCBvdGhlcndpc2UgbW92ZSB0aGUgcGxhaW50ZXh0IGxvY2FsIHNlY3JldHMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgb3IgcmVzb2x2ZSB0aGUgYmFja3VwXG4vLyBiYWNrIG9udG8gdGhlIHNvdXJjZSBmaWxlIGFuZCB0dXJuIHRoZSBoaWRlIHJlbmFtZSBpbnRvIGEgbm8tb3AuXG5mdW5jdGlvbiBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoOiBzdHJpbmcsIGJhY2t1cFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBiYWNrdXBEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGJhY2t1cFBhdGgpO1xuICBmcy5ta2RpclN5bmMoYmFja3VwRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGV4cGVjdGVkUmVhbFBhdGggPSBwYXRoLmpvaW4oZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKSwgcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgYmFja3VwRGlyUGF0aCkpO1xuICBpZiAoZnMucmVhbHBhdGhTeW5jKGJhY2t1cERpclBhdGgpICE9PSBleHBlY3RlZFJlYWxQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2JhY2t1cERpclBhdGh9IHJlc29sdmVzIHRocm91Z2ggYSBzeW1saW5rOyByZW1vdmUgdGhlIHN5bWxpbmtlZCBjb21wb25lbnQuYCk7XG4gIH1cbn1cblxuLy8gVGhlIGJhY2t1cCBsaXZlcyB1bmRlciB0aGUgZ2l0aWdub3JlZCAudG1wIHNvIGEgaGlkZGVuIGZub3gubG9jYWwudG9tbCBjYW4gbmV2ZXIgYmVjb21lXG4vLyBzdGFnZWFibGUgKGEgc2libGluZyByZW5hbWUgbGlrZSBmbm94LmxvY2FsLnRvbWwud2JmeS1iYWsgd291bGQgbm8gbG9uZ2VyIG1hdGNoIHRoZSBkb2N1bWVudGVkXG4vLyBgZm5veC5sb2NhbC50b21sYCBpZ25vcmUgZW50cnkgYW5kIGNvdWxkIGJlIGNvbW1pdHRlZCBieSBgZ2l0IGFkZCAtQWApLlxuZnVuY3Rpb24gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5yZXNvbHZlKFxuICAgIHJvb3REaXJQYXRoLFxuICAgICcudG1wJyxcbiAgICAnd2JmeS1mbm94LWxvY2FsLWJhY2t1cCcsXG4gICAgcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgZGlyUGF0aCksXG4gICAgJ2Zub3gubG9jYWwudG9tbCdcbiAgKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVNaWdyYXRpb25NYXJrZXIoKTogdm9pZCB7XG4gIGlmICghbWlncmF0aW9uTWFya2VyUGF0aCB8fCBtaWdyYXRpb25NYXJrZXJPd25lZCkgcmV0dXJuO1xuICBjb25zdCB0bXBEaXJQYXRoID0gcGF0aC5kaXJuYW1lKG1pZ3JhdGlvbk1hcmtlclBhdGgpO1xuICBmcy5ta2RpclN5bmModG1wRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIC8vIFJlZnVzZSB0byB3cml0ZSB0aHJvdWdoIHN5bWxpbmtzOiBhIHJlcG9zaXRvcnktY29udHJvbGxlZCAudG1wIHN5bWxpbmsgY291bGQgb3RoZXJ3aXNlXG4gIC8vIHJlZGlyZWN0IHRoZSBtYXJrZXIgd3JpdGUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS4gVGhlIGB3eGAgZmxhZyBtYWtlcyB0aGUgb3BlbiBpdHNlbGYgZmFpbFxuICAvLyBvbiBhbnkgcHJlLWV4aXN0aW5nIHBhdGgsIGluY2x1ZGluZyBhIGRhbmdsaW5nIHN5bWxpbmsg4oCUIHdoaWNoIGFsc28gYWNxdWlyZXMgdGhlIG1hcmtlclxuICAvLyBhdG9taWNhbGx5LCBzbyBhIGNvbmN1cnJlbnQgd2JmeSBydW4gY2Fubm90IHN0YXJ0IGEgc2Vjb25kIG1pZ3JhdGlvbi5cbiAgaWYgKGZzLmxzdGF0U3luYyh0bXBEaXJQYXRoKS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RtcERpclBhdGh9IGlzIGEgc3ltbGluazsgcmVwbGFjZSBpdCB3aXRoIGEgcmVndWxhciBkaXJlY3RvcnkuYCk7XG4gIH1cbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgbWlncmF0aW9uTWFya2VyUGF0aCxcbiAgICAgICd3YmZ5IGZub3ggbWlncmF0aW9uIGluIHByb2dyZXNzOyBhIGxlZnRvdmVyIG1hcmtlciBibG9ja3MgbmV3IG1pZ3JhdGlvbnNcXG4nLFxuICAgICAge1xuICAgICAgICBmbGFnOiAnd3gnLFxuICAgICAgfVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBbm90aGVyIHdiZnkgcHJvY2VzcyBhcHBlYXJzIHRvIGJlIG1pZ3JhdGluZyAoJHttaWdyYXRpb25NYXJrZXJQYXRofSBleGlzdHMpOiAke2Vycm9yfWApO1xuICB9XG4gIG1pZ3JhdGlvbk1hcmtlck93bmVkID0gdHJ1ZTtcbn1cblxuLy8gT25seSB0aGUgcnVuIHRoYXQgYWNxdWlyZWQgdGhlIG1hcmtlciBtYXkgcmVtb3ZlIGl0OiBkZWxldGluZyBhIGZvcmVpZ24gbWFya2VyIHdvdWxkIGRpc2FibGVcbi8vIGludGVycnVwdGVkLW1pZ3JhdGlvbiBkZXRlY3Rpb24gZm9yIGEgY29uY3VycmVudGx5IHJ1bm5pbmcgd2JmeS5cbmZ1bmN0aW9uIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk6IHZvaWQge1xuICBpZiAoIW1pZ3JhdGlvbk1hcmtlck93bmVkIHx8ICFtaWdyYXRpb25NYXJrZXJQYXRoKSByZXR1cm47XG4gIGZzLnJtU3luYyhtaWdyYXRpb25NYXJrZXJQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICBtaWdyYXRpb25NYXJrZXJPd25lZCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90czogTWFwPHN0cmluZywgc3RyaW5nPik6IGJvb2xlYW4ge1xuICBsZXQgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGNvbnRlbnRdIG9mIHNuYXBzaG90cykge1xuICAgIHRyeSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gcmVzdG9yZSAke2ZpbGVQYXRofSBhZnRlciBhIGZhaWxlZCBtaWdyYXRpb246ICR7ZXJyb3J9YCk7XG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1Y2NlZWRlZDtcbn1cblxuZnVuY3Rpb24gZmFpbEZub3hTeW5jKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgZm5veFN5bmNGYWlsZWQgPSB0cnVlO1xufVxuXG4vLyBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgYW4gdW5zdXBwb3J0ZWQgZm5veC5sb2NhbC50b21sIGluIHRoZSBkaXJlY3RvcnksIG9yIHVuZGVmaW5lZC4gTG9jYWxcbi8vIG92ZXJyaWRlcyBtYXkgb25seSBob2xkIG1hY2hpbmUtbG9jYWwgc2VjcmV0IHZhbHVlczsgaW1wb3J0cyBvciBwcm92aWRlciAocmUpZGVmaW5pdGlvbnMgd291bGRcbi8vIHNpbGVudGx5IGNoYW5nZSB3aGljaCByZWNpcGllbnQgc2V0IGdvdmVybnMgcmUtZW5jcnlwdGlvbi5cbmZ1bmN0aW9uIGZpbmRGbm94TG9jYWxUb21sSXNzdWUoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbG9jYWxUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhsb2NhbFRvbWxQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbG9jYWxTZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhsb2NhbFRvbWxQYXRoLCAndXRmOCcpKSBhcyBGbm94VG9tbDtcbiAgY29uc3QgZGVmaW5lc1Byb3ZpZGVycyA9XG4gICAgbG9jYWxTZXR0aW5ncy5pbXBvcnQgIT09IHVuZGVmaW5lZCB8fFxuICAgIGxvY2FsU2V0dGluZ3MucHJvdmlkZXJzICE9PSB1bmRlZmluZWQgfHxcbiAgICBPYmplY3QudmFsdWVzKGxvY2FsU2V0dGluZ3MucHJvZmlsZXMgPz8ge30pLnNvbWUoKHByb2ZpbGUpID0+IHByb2ZpbGU/LnByb3ZpZGVycyAhPT0gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIGRlZmluZXNQcm92aWRlcnMgPyBgJHtsb2NhbFRvbWxQYXRofSBkZWZpbmVzIGltcG9ydHMsIHByb3ZpZGVycywgb3IgcHJvZmlsZSBwcm92aWRlcnNgIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIExpc3RzIGV2ZXJ5IGRpcmVjdG9yeSBjb250YWluaW5nIGEgY29tbWl0dGVkIChvciBjb21taXR0YWJsZSkgZm5veC50b21sIGFtb25nIHRoZSBnaXZlblxuICogZ2l0LWRpc2NvdmVyZWQgY29uZmlnIHBhdGhzIChzZWUgbGlzdEZub3hMaWtlRmlsZVBhdGhzOiBnaXQtYmFzZWQgZGlzY292ZXJ5IGV4Y2x1ZGVzIGdpdGlnbm9yZWRcbiAqIHRyZWVzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIHdpdGhvdXQgZXhjbHVkaW5nIGxlZ2l0aW1hdGUgcGFja2FnZXMgbmFtZWQgbGlrZSBidWlsZCBvdXRwdXRzKS5cbiAqL1xuZnVuY3Rpb24gbGlzdEZub3hUb21sRGlyUGF0aHMoZm5veExpa2VGaWxlUGF0aHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBmbm94TGlrZUZpbGVQYXRoc1xuICAgICAgICAuZmlsdGVyKChmaWxlUGF0aCkgPT4gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkgPT09ICdmbm94LnRvbWwnKVxuICAgICAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSlcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGZub3ggY29uZmlnIGRlY2xhcmVzIGl0cyBvd24gYFtwcm92aWRlcnMuYWdlXWAsIGkuZS4gcGFydGljaXBhdGVzIGluIGFnZSBlbmNyeXB0aW9uLlxuICogQSBjb25maWcgd2l0aG91dCBvbmUgZWl0aGVyIGluaGVyaXRzIGEgbWFuYWdlZCByb290J3MgcHJvdmlkZXIgKGhhbmRsZWQgYnkgdGhlIHJvb3QtZXhpc3RzIHBhdGgpXG4gKiBvciwgd2hlbiBubyByb290IGV4aXN0cywgdXNlcyBubyBhZ2UgZW5jcnlwdGlvbiBhdCBhbGwg4oCUIHNvIGl0IG5lZWRzIG5vIHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb25cbiAqIGFuZCBvd25zIG5vIEZOT1hfQUdFX0tFWS5cbiAqL1xuZnVuY3Rpb24gZGVjbGFyZXNGbm94QWdlUHJvdmlkZXIoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhaWwgY2xvc2VkOiBhbiB1bnJlYWRhYmxlIGNvbmZpZyBtaWdodCBkZWNsYXJlIGFuIGFnZSBwcm92aWRlci5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBCb29sZWFuKChCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBGbm94VG9tbCkucHJvdmlkZXJzPy5hZ2UpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWlsIGNsb3NlZDogYW4gdW5wYXJzYWJsZSBjb25maWcgbWlnaHQgZGVjbGFyZSBhbiBhZ2UgcHJvdmlkZXIuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZm5veCBjb25maWcgcGF0aCBsaWVzIGluc2lkZSBhIHRlc3QtZml4dHVyZSB0cmVlICh0ZXN0L2ZpeHR1cmVzLCB0ZXN0LWZpeHR1cmVzLFxuICogX190ZXN0c19fKTogZml4dHVyZSBjb25maWdzIGFyZSB0ZXN0IElOUFVUUywgbm90IHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbi4gZm5veCBuZXZlciBsb2Fkc1xuICogdGhlbSBmb3IgcmVhbCBjb21tYW5kcyAoaGllcmFyY2hpY2FsIGxvYWRpbmcgb25seSB3YWxrcyBjd2QgYW5jZXN0b3JzKSwgcmVjaXBpZW50XG4gKiBzeW5jaHJvbml6YXRpb24gbXVzdCBub3QgcmV3cml0ZSBvciByZS1lbmNyeXB0IHRoZW0gKHNoYXJlZC1saWItbm9kZSdzIHVuZGVjcnlwdGFibGUgZml4dHVyZVxuICogZXhpc3RzIHByZWNpc2VseSB0byBzdGF5IHVuZGVjcnlwdGFibGUpLCBhbmQgYSBmaXh0dXJlIG11c3Qgbm90IGZhaWwgdGhlIHN0cmF5LW5lc3RlZC1jb25maWdcbiAqIGNoZWNrIGluIHJlcG9zaXRvcmllcyB3aXRob3V0IGEgcm9vdCBmbm94LnRvbWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Rlc3RGaXh0dXJlRm5veFBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBgZml4dHVyZXNgIGNvdW50cyBvbmx5IGRpcmVjdGx5IHVuZGVyIGEgdGVzdCBkaXJlY3Rvcnk6IHdiZnkgc3VwcG9ydHMgYXJiaXRyYXJ5IHdvcmtzcGFjZXMsXG4gIC8vIHNvIGEgbGVnaXRpbWF0ZSBgcGFja2FnZXMvZml4dHVyZXMvYCB3b3Jrc3BhY2UgbXVzdCBzdGF5IG1hbmFnZWQgYW5kIHZlcmlmaWVkLlxuICBjb25zdCBzZWdtZW50cyA9IGZpbGVQYXRoLnNwbGl0KCcvJyk7XG4gIHJldHVybiBzZWdtZW50cy5zb21lKFxuICAgIChzZWdtZW50LCBpbmRleCkgPT5cbiAgICAgIHNlZ21lbnQgPT09ICd0ZXN0LWZpeHR1cmVzJyB8fFxuICAgICAgc2VnbWVudCA9PT0gJ19fdGVzdHNfXycgfHxcbiAgICAgIChzZWdtZW50ID09PSAnZml4dHVyZXMnICYmIChzZWdtZW50c1tpbmRleCAtIDFdID09PSAndGVzdCcgfHwgc2VnbWVudHNbaW5kZXggLSAxXSA9PT0gJ3Rlc3RzJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGxpc3RGbm94TGlrZUZpbGVQYXRocyhyb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAvLyAteiBwcmludHMgTlVMLWRlbGltaXRlZCB2ZXJiYXRpbSBwYXRoczsgd2l0aG91dCBpdCwgY29yZS5xdW90ZVBhdGggQy1xdW90ZXMgbm9uLUFTQ0lJIHBhdGhzXG4gIC8vIChlLmcuIFwiXFwzNDZcXDIyN1xcMjQ1Li4uXCIpLCB3aGljaCB3b3VsZCBtYWtlIHRoZSBiYXNlbmFtZSBmaWx0ZXIgc2lsZW50bHkgc2tpcCB0aG9zZSBjb25maWdzLlxuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoXG4gICAgJ2dpdCcsXG4gICAgWydscy1maWxlcycsICcteicsICctLWNhY2hlZCcsICctLW90aGVycycsICctLWV4Y2x1ZGUtc3RhbmRhcmQnLCAnLS0nLCAnKmZub3gqLnRvbWwnXSxcbiAgICB7IGN3ZDogcm9vdERpclBhdGgsIGVuY29kaW5nOiAndXRmOCcsIHN0ZGlvOiAncGlwZScgfVxuICApO1xuICAvLyBGYWlsIGNsb3NlZDogdHJlYXRpbmcgYSBnaXQgZmFpbHVyZSBhcyBcIm5vIGZub3ggY29uZmlnc1wiIHdvdWxkIHNraXAgc3luY2hyb25pemF0aW9uIGFuZCBsZXRcbiAgLy8gc2V0dXBTZWNyZXRzIHVwbG9hZCBhIGtleSB0aGF0IHdhcyBuZXZlciB2ZXJpZmllZCBhZ2FpbnN0IHRoZSByZXBvc2l0b3J5J3MgY2lwaGVydGV4dHMuXG4gIGlmIChwcm9jLnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZ2l0IGxzLWZpbGVzIGZhaWxlZCBpbiAke3Jvb3REaXJQYXRofTogJHsocHJvYy5zdGRlcnIgfHwgcHJvYy5lcnJvcj8ubWVzc2FnZSB8fCAnJykudHJpbSgpfWApO1xuICB9XG4gIHJldHVybiBwcm9jLnN0ZG91dFxuICAgIC5zcGxpdCgnXFwwJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiAvXlxcLj9mbm94KFxcLi4rKT9cXC50b21sJC91LnRlc3QocGF0aC5iYXNlbmFtZShsaW5lKSkgJiYgIWlzVGVzdEZpeHR1cmVGbm94UGF0aChsaW5lKSlcbiAgICAubWFwKChsaW5lKSA9PiBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIGxpbmUpKTtcbn1cblxuZnVuY3Rpb24gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnNcbiAgICAgIC5yZWFkZGlyU3luYyhkaXJQYXRoKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gL15cXC4/Zm5veChcXC4uKyk/XFwudG9tbCQvdS50ZXN0KG5hbWUpKVxuICAgICAgLnRvU29ydGVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyB7IGNvZGU/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk/LmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gW107XG4gICAgLy8gRmFpbCBjbG9zZWQ6IGZub3ggY2FuIHN0aWxsIGxvYWQgYSBjb25maWcgZnJvbSBhIGRpcmVjdG9yeSB0aGlzIHByb2Nlc3MgY2Fubm90IGVudW1lcmF0ZVxuICAgIC8vIChlLmcuIGV4ZWN1dGUtb25seSBwZXJtaXNzaW9uKSwgc28gYW4gZW51bWVyYXRpb24gZmFpbHVyZSBtdXN0IG5vdCByZWFkIGFzIFwibm8gY29uZmlnc1wiLlxuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGluc3BlY3QgJHtkaXJQYXRofSBmb3IgZm5veCBjb25maWdzOiAke2Vycm9yfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxpc3RBbmNlc3RvckRpclBhdGhzKGRpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGlyUGF0aHMgPSBbZGlyUGF0aF07XG4gIHdoaWxlIChkaXJQYXRocy5hdCgtMSkgIT09IHJvb3REaXJQYXRoKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGRpclBhdGhzLmF0KC0xKSA/PyAnJyk7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyUGF0aHMuYXQoLTEpKSBicmVhaztcbiAgICBkaXJQYXRocy5wdXNoKHBhcmVudCk7XG4gIH1cbiAgcmV0dXJuIGRpclBhdGhzO1xufVxuIiwiaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiB1bmtub3duW10sIHNvdXJjZTogdW5rbm93bltdLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd25bXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QodGFyZ2V0W2luZGV4XSwgb3B0aW9ucykgJiYgaXNNZXJnZWFibGVPYmplY3QoaXRlbSwgb3B0aW9ucykpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlLCBvcHRpb25zKSA/IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWUsIG9wdGlvbnMpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh2YWx1ZSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIHBhY2thZ2UuanNvbi1zdHlsZSBrZXlzIGFyZSBub24tYXJyYXktaW5kZXgga2V5cywgc28gSlNPTi5zdHJpbmdpZnkgcHJlc2VydmVzIHRoaXMgaW5zZXJ0aW9uIG9yZGVyLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQge1xuICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxuICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4sXG4gIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5LFxuICByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbi8vIFRoZSBCdW4tZXhhY3QgcmVzb2x1dGlvbiBwcmltaXRpdmVzIGxpdmUgaW4gQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSAoc3JjL2J1bldvcmtzcGFjZXMudHMpXG4vLyBzbyB3YidzIHJlbGVhc2UgY29kZSBzaGFyZXMgdGhlbTsgcmUtZXhwb3J0IHRoZSBvbmVzIHdiZnkgbW9kdWxlcyBhbmQgdGVzdHMgY29uc3VtZS5cbmV4cG9ydCB7XG4gIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxufSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbi8qKiBUaGUgc3Vic2V0IG9mIFBhY2thZ2VDb25maWcgdGhhdCB3b3Jrc3BhY2UgZGlzY292ZXJ5IG5lZWRzLCBzbyBpdCBjYW4gcnVuIGJlZm9yZSBjb25maWdzIGV4aXN0LiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlUm9vdExpa2UgPSBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJyB8ICdkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucycgfCAncGFja2FnZUpzb24nPjtcblxuLyoqXG4gKiBFdmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2UgZGlyZWN0b3J5IChhYnNvbHV0ZSwgZGVkdXBsaWNhdGVkKSBvZiB0aGUgbW9ub3JlcG8gcm9vdCwgY292ZXJpbmdcbiAqIG5vbi1wYWNrYWdlcy8qIGxheW91dHMgc3VjaCBhcyBhcHBzLyouIFVuY2FjaGVkIGJlY2F1c2UgaW5kZXgudHMgY2FsbHMgaXQgYmVmb3JlIHdiZnkgbXV0YXRlc1xuICogdGhlIHJvb3QgcGFja2FnZS5qc29uIChnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyBjYWNoZXMgdGhlIHBvc3QtbXV0YXRpb24gc3RhdGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMocm9vdExpa2U6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RMaWtlKS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGF0aC5yZXNvbHZlKHJvb3RMaWtlLmRpclBhdGgsIHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKVxuICAgICAgKVxuICAgICksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpLCBpbmNsdWRpbmcgbWFuaWZlc3RzXG4gKiB3aXRob3V0IGEgYG5hbWVgIGZpZWxkIOKAlCB3YmZ5IG5hbWVzIHRob3NlIGxhdGVyLCBzbyBkZXBlbmRlbmN5IHNjYW5zIG11c3Qgbm90IHNraXAgdGhlbS5cbiAqIFJlc29sdXRpb24gbWltaWNzIEJ1bidzIHNlcXVlbnRpYWwgcGF0dGVybiBldmFsdWF0aW9uOyBzZWUgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RDb25maWc6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMocm9vdENvbmZpZyksIHJvb3RDb25maWcuZGlyUGF0aCk7XG59XG5cbmludGVyZmFjZSBXb3Jrc3BhY2VEaXJQYXR0ZXJucyB7XG4gIC8qKiBEaXJlY3Rvcnkgc3VidHJlZXMgKG9yIHBhY2thZ2Utb3duZWQgc3VicGF0aHMpIG1hdGNoZWQgYnkgZWZmZWN0aXZlIG5lZ2F0aW9ucywgZm9yIHRzY29uZmlnIGBleGNsdWRlYCBlbnRyaWVzLiAqL1xuICBleGNsdWRlczogc3RyaW5nW107XG4gIC8qKiBQb3NpdGl2ZSBkaXJlY3RvcnkgcGF0dGVybnMgKG9yIGNvbmNyZXRlIGRpcmVjdG9yaWVzIGZvciBCdW4tb25seSBnbG9iIHN5bnRheCkuICovXG4gIGluY2x1ZGVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBTb3J0ZWQgd29ya3NwYWNlIGRpcmVjdG9yeSBwYXR0ZXJucyAocG9zaXgsIHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290KSBmb3IgZ2VuZXJhdG9ycyB0aGF0XG4gKiBuZWVkIHBhdHRlcm4tc2hhcGVkIGdsb2JzIGNvdmVyaW5nIGV2ZXJ5IHdvcmtzcGFjZSBsYXlvdXQg4oCUIGUuZy4gdGhlIHJvb3QgdHNjb25maWcncyBgYXBwcy8qYFxuICogaW5jbHVkZSBlbnRyaWVzIOKAlCBpbnN0ZWFkIG9mIGNvbmNyZXRlIGRpcmVjdG9yaWVzLCB3aGljaCB3b3VsZCBjaHVybiBnZW5lcmF0ZWQgZmlsZXMgd2hlbmV2ZXIgYVxuICogd29ya3NwYWNlIHBhY2thZ2UgaXMgYWRkZWQgb3IgcmVtb3ZlZC4gRXZlcnkgcmV0dXJuZWQgcGF0dGVybiBpcyB2YWxpZCB0c2NvbmZpZyBnbG9iIHN5bnRheC5cbiAqIEEgcGF0dGVybiBjYW4gbWF0Y2ggYSBzaWJsaW5nIGRpcmVjdG9yeSB3aXRob3V0IGEgcGFja2FnZS5qc29uIChub3QgYSB3b3Jrc3BhY2UgdG8gQnVuKTsgdGhhdFxuICogaXMgZGVsaWJlcmF0ZSwgbWlycm9yaW5nIHRoZSBsb25nLXN0YW5kaW5nIGBwYWNrYWdlcy8qYCBlbnRyaWVzJyBiZWhhdmlvciBpbiBmYXZvciBvZiBzdGFibGVcbiAqIGdlbmVyYXRlZCBvdXRwdXQuIE5lZ2F0aW9ucyBmb2xsb3cgQnVuJ3Mgc2VxdWVudGlhbCBzZW1hbnRpY3MgKHNlZVxuICogcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMpOiBhIG5lZ2F0aW9uIHN0YXlzIHBhdHRlcm4tc2hhcGVkIHdoaWxlIGl0IGV4Y2x1ZGVzIGV4YWN0bHlcbiAqIHdoYXQgaXQgbWF0Y2hlcywgYnV0IGlzIGNvbmNyZXRpemVkIHBlciBtYXRjaGVkIGRpcmVjdG9yeSB3aGVuIGEgbWF0Y2hlZCBkaXJlY3RvcnkgZW5kcyB1cCBhXG4gKiB3b3Jrc3BhY2UgYW55d2F5IChyZS1pbmNsdWRlZCBieSBhIGxhdGVyIHBvc2l0aXZlLCBhIHBpbm5lZCBjb25jcmV0ZSBwb3NpdGl2ZSwgb3IgYSBzZWVkZWRcbiAqIGJhc2VsaW5lOyAjMTAwNSkgb3IgaXMgYW4gYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5LCB3aGVyZSBCdW4gZXhjbHVkZXMgb25seSB0aGVcbiAqIHBhY2thZ2UgQVQgdGhhdCBkaXJlY3RvcnksIHNvIG9ubHkgaXRzIHBhY2thZ2Utb3duZWQgc3VicGF0aHMgYXJlIGV4Y2x1ZGVkICgjMTAwNCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBXb3Jrc3BhY2VEaXJQYXR0ZXJucyB7XG4gIC8vIFVubGlrZSBkaXNjb3ZlcnksIGdlbmVyYXRlZCBvdXRwdXQgbXVzdCBub3QgY29udGFpbiBhIG5ldmVyLW1hdGNoaW5nIGBwYWNrYWdlcy8qYCBmYWxsYmFjazpcbiAgLy8gYW4gYXBwcy8qLW9ubHkgbW9ub3JlcG8gd291bGQgZ2V0IGRlYWQgZ2xvYnMgY29tbWl0dGVkIGludG8gaXRzIHJvb3QgdHNjb25maWcuIE1pcnJvclxuICAvLyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMsIHdoaWNoIGZvcmNlcyBgcGFja2FnZXMvKmAgb25seSB3aGVuIGEgbWFuaWZlc3QgYWN0dWFsbHkgbWF0Y2hlcy5cbiAgY29uc3QgaGFzUGFja2FnZXNMYXlvdXQgPVxuICAgIHJvb3RMaWtlLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmXG4gICAgLy8gTWlycm9yIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucycgYmFzZWxpbmUgZ2F0ZSB0b286IHdpdGggYW4gaW1wbGljaXQgYmFzZWxpbmUgc2VlZGVkLFxuICAgIC8vIGBwYWNrYWdlcy8qYCBlbnRyaWVzIHdvdWxkIGJlIGRlYWQgZ2xvYnMgc3Vic3VtZWQgYnkgdGhlIGJhc2VsaW5lLWRlcml2ZWQgb25lcy5cbiAgICAhaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZShyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcykgJiZcbiAgICBmZy5nbG9iU3luYygncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBjd2Q6IHJvb3RMaWtlLmRpclBhdGgsXG4gICAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICB9KS5sZW5ndGggPiAwO1xuICBjb25zdCB3b3Jrc3BhY2VQYXR0ZXJucyA9IGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zKHtcbiAgICAuLi5yb290TGlrZSxcbiAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogaGFzUGFja2FnZXNMYXlvdXQsXG4gIH0pO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IG5ldyBTZXQoXG4gICAgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMod29ya3NwYWNlUGF0dGVybnMsIHJvb3RMaWtlLmRpclBhdGgpLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aClcbiAgICApXG4gICk7XG4gIGNvbnN0IGluY2x1ZGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG5lZ2F0aW9uQm9kaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdHRlcm4gb2Ygd29ya3NwYWNlUGF0dGVybnMpIHtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJyk7XG4gICAgY29uc3QgcGF0dGVybkJvZHkgPSBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShpc05lZ2F0aXZlID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm4pO1xuICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICAvLyBBIHNlZWRpbmcgbmVnYXRpb24gbWFrZXMgQnVuIGxpbmsgYmFzZWxpbmUtbWF0Y2hlZCBkaXJlY3Rvcmllcywgc28gdGhlIGJhc2VsaW5lIG11c3RcbiAgICAgIC8vIGVudGVyIHRoZSBnZW5lcmF0ZWQgaW5jbHVkZSBwYXR0ZXJucyBldmVuIHdoZW4gZXZlcnkgZGVjbGFyZWQgcGF0dGVybiBpcyBhIG5lZ2F0aW9uLlxuICAgICAgY29uc3QgYmFzZWxpbmVHbG9iID0gZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKHBhdHRlcm5Cb2R5KTtcbiAgICAgIGlmIChiYXNlbGluZUdsb2IgIT09IHVuZGVmaW5lZCkgaW5jbHVkZXMuYWRkKGJhc2VsaW5lR2xvYik7XG4gICAgICBuZWdhdGlvbkJvZGllcy5wdXNoKHBhdHRlcm5Cb2R5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBkaXJQYXR0ZXJuIG9mIHRvVHNjb25maWdDb21wYXRpYmxlRGlyUGF0dGVybnMocGF0dGVybkJvZHksIHJvb3RMaWtlLmRpclBhdGgpKSB7XG4gICAgICAgIGluY2x1ZGVzLmFkZChkaXJQYXR0ZXJuKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgZXhjbHVkZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBuZWdhdGlvbkJvZHkgb2YgbmVnYXRpb25Cb2RpZXMpIHtcbiAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVFbnRyeSBvZiB0b0V4Y2x1ZGVFbnRyaWVzKG5lZ2F0aW9uQm9keSwgd29ya3NwYWNlRGlyUGF0aHMsIHJvb3RMaWtlLmRpclBhdGgpKSB7XG4gICAgICBleGNsdWRlcy5hZGQoZXhjbHVkZUVudHJ5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgZXhjbHVkZXM6IFsuLi5leGNsdWRlc10udG9Tb3J0ZWQoKSwgaW5jbHVkZXM6IFsuLi5pbmNsdWRlc10udG9Tb3J0ZWQoKSB9O1xufVxuXG4vKipcbiAqIHRzY29uZmlnIGV4Y2x1ZGUgZW50cmllcyBmb3Igb25lIG5lZ2F0aW9uLiBQYXR0ZXJuLXNoYXBlZCB3aGVuIHRoZSBuZWdhdGlvbiBleGNsdWRlcyBleGFjdGx5XG4gKiB3aGF0IGl0IG1hdGNoZXMgKHN0YWJsZSBvdXRwdXQpOyBwZXItZGlyZWN0b3J5IG90aGVyd2lzZTogYSBkaXJlY3RvcnkgdGhhdCBpcyBhIHdvcmtzcGFjZVxuICogZGVzcGl0ZSB0aGUgbmVnYXRpb24gaXMgbm90IGV4Y2x1ZGVkIGF0IGFsbCwgYW5kIG5laXRoZXIgaXMgYSBQTEFJTiAocGFja2FnZS5qc29uLWxlc3MpXG4gKiBkZXNjZW5kYW50IG9mIGEgd29ya3NwYWNlIGRpcmVjdG9yeSDigJQgbmVnYXRpbmcgYSBub24tcGFja2FnZSBkaXJlY3RvcnkgaXMgYSBuby1vcCBmb3IgQnVuLFxuICogYW5kIHRoZSBlbmNsb3Npbmcgd29ya3NwYWNlIHN0YXlzIGFjdGl2ZSAoZS5nLiBgWydhcHBzLyoqJywgJyFhcHBzLyoqJywgJ2FwcHMvd2ViJ11gXG4gKiByZS1pbmNsdWRlcyBhcHBzL3dlYiwgd2hvc2Ugc3JjIG11c3Qga2VlcCB0eXBlLWNoZWNraW5nOyBhIHRzY29uZmlnIGV4Y2x1ZGUgd291bGQgb3ZlcnJpZGVcbiAqIHRoZSBpbmNsdWRlKS4gQSBkZXNjZW5kYW50IHdpdGggaXRzIG93biBtYW5pZmVzdCB0aGF0IHRoZSBuZWdhdGlvbiBrZWVwcyBvdXQgb2YgdGhlIHdvcmtzcGFjZVxuICogc2V0IGlzIGFuIGV4Y2x1ZGVkIG5lc3RlZCBwYWNrYWdlIGFuZCBzdGF5cyBleGNsdWRlZC4gQSBkaXJlY3RvcnkgdGhhdCBpcyBhblxuICogYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5IGdldHMgb25seSBpdHMgcGFja2FnZS1vd25lZCBzdWJwYXRocyBleGNsdWRlZCwgYmVjYXVzZSBCdW5cbiAqIGV4Y2x1ZGVzIG9ubHkgdGhlIHBhY2thZ2UgQVQgdGhhdCBkaXJlY3Rvcnkgd2hpbGUga2VlcGluZyBkZXNjZW5kYW50IHdvcmtzcGFjZXMgKCMxMDA0KS5cbiAqL1xuZnVuY3Rpb24gdG9FeGNsdWRlRW50cmllcyhuZWdhdGlvbkJvZHk6IHN0cmluZywgd29ya3NwYWNlRGlyUGF0aHM6IFNldDxzdHJpbmc+LCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBpc1dvcmtzcGFjZUFuY2VzdG9yID0gKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICBbLi4ud29ya3NwYWNlRGlyUGF0aHNdLnNvbWUoKHdvcmtzcGFjZURpclBhdGgpID0+IHdvcmtzcGFjZURpclBhdGguc3RhcnRzV2l0aChgJHtkaXJQYXRofS9gKSk7XG4gIC8vIE9ubHkgUExBSU4gZGlyZWN0b3JpZXMgKG5vIHBhY2thZ2UuanNvbiBvZiB0aGVpciBvd24pIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGVuY2xvc2luZ1xuICAvLyB3b3Jrc3BhY2U6IGEgbWF0Y2hlZCBkaXJlY3RvcnkgdGhhdCBjYXJyaWVzIGl0cyBvd24gbWFuaWZlc3QgeWV0IGlzIGFic2VudCBmcm9tIHRoZSBmaW5hbFxuICAvLyB3b3Jrc3BhY2Ugc2V0IGlzIGFuIGV4Y2x1ZGVkIG5lc3RlZCBwYWNrYWdlLCBhbmQgaXRzIGV4Y2x1c2lvbiBtdXN0IHN1cnZpdmUuXG4gIGNvbnN0IGlzUHJvdGVjdGVkV29ya3NwYWNlRGVzY2VuZGFudCA9IChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgWy4uLndvcmtzcGFjZURpclBhdGhzXS5zb21lKCh3b3Jrc3BhY2VEaXJQYXRoKSA9PiBkaXJQYXRoLnN0YXJ0c1dpdGgoYCR7d29ya3NwYWNlRGlyUGF0aH0vYCkpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBkaXJQYXRoLCAncGFja2FnZS5qc29uJykpO1xuICBjb25zdCBtYXRjaGVkRGlyUGF0aHMgPSBnZXRNYXRjaGVkRGlyUGF0aHMobmVnYXRpb25Cb2R5LCByb290RGlyUGF0aCk7XG4gIGlmIChcbiAgICAhbWF0Y2hlZERpclBhdGhzLnNvbWUoXG4gICAgICAoZGlyUGF0aCkgPT5cbiAgICAgICAgd29ya3NwYWNlRGlyUGF0aHMuaGFzKGRpclBhdGgpIHx8IGlzV29ya3NwYWNlQW5jZXN0b3IoZGlyUGF0aCkgfHwgaXNQcm90ZWN0ZWRXb3Jrc3BhY2VEZXNjZW5kYW50KGRpclBhdGgpXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhuZWdhdGlvbkJvZHksIHJvb3REaXJQYXRoKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlZERpclBhdGhzLmZsYXRNYXAoKGRpclBhdGgpID0+IHtcbiAgICAvLyBUaGUgZGVzY2VuZGFudCBjaGVjayBwcmVjZWRlcyB0aGUgYW5jZXN0b3Igb25lOiBhIGRpcmVjdG9yeSBpbnNpZGUgb25lIHdvcmtzcGFjZSBidXQgYWJvdmVcbiAgICAvLyBhIG5lc3RlZCBvbmUgKGUuZy4gYXBwcy93ZWIvcGx1Z2lucyBiZXR3ZWVuIHdvcmtzcGFjZXMgYXBwcy93ZWIgYW5kIGFwcHMvd2ViL3BsdWdpbnMveClcbiAgICAvLyBzdGlsbCBiZWxvbmdzIHRvIHRoZSBlbmNsb3NpbmcgYWN0aXZlIHdvcmtzcGFjZSwgc28gbm90aGluZyBvZiBpdCBtYXkgYmUgZXhjbHVkZWQuXG4gICAgaWYgKHdvcmtzcGFjZURpclBhdGhzLmhhcyhkaXJQYXRoKSB8fCBpc1Byb3RlY3RlZFdvcmtzcGFjZURlc2NlbmRhbnQoZGlyUGF0aCkpIHJldHVybiBbXTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VBbmNlc3RvcihkaXJQYXRoKSkge1xuICAgICAgcmV0dXJuIFtgJHtkaXJQYXRofS8qLmNvbmZpZy50c2AsIGAke2RpclBhdGh9L3NjcmlwdHNgLCBgJHtkaXJQYXRofS9zcmNgLCBgJHtkaXJQYXRofS90ZXN0YF07XG4gICAgfVxuICAgIHJldHVybiBbZGlyUGF0aF07XG4gIH0pO1xufVxuXG4vKipcbiAqIERpcmVjdG9yaWVzIGEgbmVnYXRpb24gbWF0Y2hlcy4gVGhlIG1hbmlmZXN0LWJhc2VkIGdsb2IgY29tcGxlbWVudHMgb25seURpcmVjdG9yaWVzIGJlY2F1c2VcbiAqIGZhc3QtZ2xvYidzIGBkaXIvKipgIGRvZXMgbm90IHJldHVybiBgZGlyYCBpdHNlbGYgYXMgYSBkaXJlY3RvcnksIHdoaWxlIGJvdGggQnVuIGFuZCB0aGVcbiAqIG1hbmlmZXN0IGdsb2IgdHJlYXQgYCoqYCBhcyB6ZXJvIG9yIG1vcmUgc2VnbWVudHMgKGBhcHBzLyoqYCBjb3ZlcnMgdGhlIHBhY2thZ2UgYXQgYXBwcykuXG4gKi9cbmZ1bmN0aW9uIGdldE1hdGNoZWREaXJQYXRocyhuZWdhdGlvbkJvZHk6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7IGN3ZDogcm9vdERpclBhdGgsIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfTtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFtcbiAgICAgIC4uLmZnLmdsb2JTeW5jKG5lZ2F0aW9uQm9keSwgeyAuLi5nbG9iT3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pLFxuICAgICAgLi4uZmdcbiAgICAgICAgLmdsb2JTeW5jKHBhdGgucG9zaXguam9pbihuZWdhdGlvbkJvZHksICdwYWNrYWdlLmpzb24nKSwgZ2xvYk9wdGlvbnMpXG4gICAgICAgIC5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT4gcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpXG4gICAgICAgIC8vIEEgemVyby1zZWdtZW50IGAqKmAgbWF0Y2ggcmVhY2hlcyB0aGUgcm9vdCBpdHNlbGYsIHdoaWNoIGlzIG5ldmVyIGEgd29ya3NwYWNlLlxuICAgICAgICAuZmlsdGVyKChkaXJQYXRoKSA9PiBkaXJQYXRoICE9PSAnLicpLFxuICAgIF0pLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogdHNjb25maWcgaW5jbHVkZS9leGNsdWRlIHN1cHBvcnQgb25seSB0aGUgYCpgLCBgP2AsIGFuZCBgKipgIHdpbGRjYXJkcywgd2hpbGUgQnVuIHdvcmtzcGFjZXNcbiAqIGFjY2VwdCBmdWxsIGdsb2Igc3ludGF4IChicmFjZSBleHBhbnNpb24sIGNoYXJhY3RlciBjbGFzc2VzLCDigKYpLCBzbyBleHBhbmQgQnVuLW9ubHkgcGF0dGVybnMgdG9cbiAqIHRoZSBjb25jcmV0ZSBkaXJlY3RvcmllcyB0aGV5IG1hdGNoIHRvIGtlZXAgdGhlIGdlbmVyYXRlZCBnbG9icyB2YWxpZCBmb3IgVHlwZVNjcmlwdC5cbiAqL1xuZnVuY3Rpb24gdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhwYXR0ZXJuQm9keTogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAoIS9bKClbXFxde31dL3UudGVzdChwYXR0ZXJuQm9keSkpIHJldHVybiBbcGF0dGVybkJvZHldO1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybkJvZHksIHtcbiAgICBjd2Q6IHJvb3REaXJQYXRoLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICBvbmx5RGlyZWN0b3JpZXM6IHRydWUsXG4gIH0pO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyAobmVnYXRpdmUgb25lcyBpbmNsdWRlZCkgdGhhdCBzdGF5IGluc2lkZSB0aGUgcmVwb3NpdG9yeTogYWJzb2x1dGVcbiAqIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIHJlbW92ZU5vZGVNb2R1bGVzIG9wZXJhdGUgb24gYW5vdGhlclxuICogcmVwb3NpdG9yeSdzIGZpbGVzLiBEZWNsYXJhdGlvbiBvcmRlciBhbmQgZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZVxuICogcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBwb3NpdGlvbiBtYXR0ZXJzLlxuICovXG5mdW5jdGlvbiBnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlY2xhcmVkUGF0dGVybnMgPSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcyk7XG4gIC8vIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyBmb3JjZXMgYHBhY2thZ2VzLypgIGludG8gYSBtb25vcmVwbydzIHdvcmtzcGFjZXMgd2hlbiBhXG4gIC8vIHBhY2thZ2VzLyovcGFja2FnZS5qc29uIGFjdHVhbGx5IG1hdGNoZXMsIGJ1dCBpdCBtYXkgbm90IGhhdmUgd3JpdHRlbiB0aGUgcm9vdCBwYWNrYWdlLmpzb25cbiAgLy8geWV0LCBzbyBtaXJyb3IgdGhhdCBub3JtYWxpemF0aW9uIGhlcmUg4oCUIFBSRVBFTkRFRCBsaWtlIHRoZXJlLCBiZWNhdXNlIGEgcG9zaXRpdmUgcGF0dGVyblxuICAvLyBwbGFjZWQgYWZ0ZXIgYSB1c2VyIG5lZ2F0aW9uIHdvdWxkIHJlLWluY2x1ZGUgdGhlIG5lZ2F0ZWQgcGFja2FnZXMgdW5kZXIgQnVuJ3Mgc2VxdWVudGlhbFxuICAvLyBldmFsdWF0aW9uLiBEaXNjb3ZlcnkgY2FsbGVycyBwYXNzIHRoZSBmYWxsYmFjayB1bmNvbmRpdGlvbmFsbHkgZm9yIG1vbm9yZXBvcyDigJQgYVxuICAvLyBuZXZlci1tYXRjaGluZyBwYXR0ZXJuIGNvbnRyaWJ1dGVzIG5vIHBhdGhzIHRoZXJlIOKAlCB3aGlsZSBwYXR0ZXJuLXNoYXBlZCBjYWxsZXJzXG4gIC8vIChnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucykgZ2F0ZSBpdCBvbiBhbiBhY3R1YWwgbWF0Y2guXG4gIGNvbnN0IHdvcmtzcGFjZVBhdHRlcm5zID1cbiAgICByb290TGlrZS5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAhaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKHJvb3RMaWtlLnBhY2thZ2VKc29uPy53b3Jrc3BhY2VzKVxuICAgICAgPyBbJ3BhY2thZ2VzLyonLCAuLi5kZWNsYXJlZFBhdHRlcm5zXVxuICAgICAgOiBkZWNsYXJlZFBhdHRlcm5zO1xuICByZXR1cm4gd29ya3NwYWNlUGF0dGVybnMuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybikpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBkZWNsYXJlZCBwb3NpdGl2ZSBwYXR0ZXJuIGFscmVhZHkgY292ZXJzIGBwYWNrYWdlcy8qYCB1bmRlciBwYXRoIG5vcm1hbGl6YXRpb25cbiAqIChlLmcuIGAuL3BhY2thZ2VzLypgIG9yIGEgdHJhaWxpbmctc2xhc2ggc3BlbGxpbmcpOiBmb3JjaW5nIGEgdGV4dHVhbCBgcGFja2FnZXMvKmAgbmV4dCB0b1xuICogc3VjaCBhIHNwZWxsaW5nIHdvdWxkIHBlcnNpc3QgZHVwbGljYXRlIGVxdWl2YWxlbnQgcGF0dGVybnMgYW5kIHJlLXNjYW4gdGhlIHNhbWUgZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4od29ya3NwYWNlczogUGFja2FnZUpzb25bJ3dvcmtzcGFjZXMnXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlcykuc29tZShcbiAgICAod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgICF3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgLy8gQSBgLi5gLXRyYXZlcnNpbmcgb3IgYWJzb2x1dGUgc3BlbGxpbmcgKGUuZy4gYHgvLi4vcGFja2FnZXMvKmApIGlzIGRpc2NhcmRlZCBieVxuICAgICAgLy8gZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMsIHNvIGl0IG11c3Qgbm90IGNvdW50IGFzIGNvdmVyaW5nIHBhY2thZ2VzLyog4oCUIHRoYXQgd291bGRcbiAgICAgIC8vIHN1cHByZXNzIHRoZSBmYWxsYmFjayBBTkQgbG9zZSB0aGUgcGF0dGVybiwgbGVhdmluZyBubyBkaXNjb3ZlcmVkIHdvcmtzcGFjZXMuXG4gICAgICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybikgJiZcbiAgICAgIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4pID09PSAncGFja2FnZXMvKidcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuaW1wb3J0IHsgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyB9IGZyb20gJy4vd29ya3NwYWNlVXRpbC5qcyc7XG5cbmNvbnN0IFBSSVZBVEVfU0NPUEUgPSAnQHdpbGxib29zdGVyLXByaXZhdGUvJztcblxuY29uc3QgcHJpdmF0ZVJlZ2lzdHJ5SG9zdCA9ICd2ZXJkYWNjaW8tcHJvZHVjdGlvbi1lMzg5LnVwLnJhaWx3YXkuYXBwJztcbmV4cG9ydCBjb25zdCBwcml2YXRlUmVnaXN0cnlTY29wZU1hcHBpbmcgPSBgQHdpbGxib29zdGVyLXByaXZhdGU6cmVnaXN0cnk9aHR0cHM6Ly8ke3ByaXZhdGVSZWdpc3RyeUhvc3R9L2A7XG5cbi8qKlxuICogV2hldGhlciB0aGlzIHJlcG9zaXRvcnkgZGVhbHMgd2l0aCBgQHdpbGxib29zdGVyLXByaXZhdGUvKmAgcGFja2FnZXMg4oCUIGJ5IGNvbnZlbnRpb24gdGhhdCBzY29wZVxuICogbGl2ZXMgZXhjbHVzaXZlbHkgb24gdGhlIHByaXZhdGUgVmVyZGFjY2lvIHJlZ2lzdHJ5LCBzbyBleGFjdGx5IHRoZXNlIHJlcG9zaXRvcmllcyBuZWVkIHRoZVxuICogVkVSREFDQ0lPX1RPS0VOIHBhc3MtdGhyb3VnaCBpbiB0aGVpciByZXVzYWJsZS13b3JrZmxvdyBjYWxsZXJzLlxuICpcbiAqIEEgcmVwb3NpdG9yeSBxdWFsaWZpZXMgd2hlbiBhbnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBERUNMQVJFUyBhIGRlcGVuZGVuY3kgaW4gdGhlIHNjb3BlIChhbnlcbiAqIGRlcGVuZGVuY3kgZmllbGQpLCBvciBpcyBpdHNlbGYgTkFNRUQgaW4gdGhlIHNjb3BlIChpdCBwdWJsaXNoZXMgdG8gVmVyZGFjY2lvLCBhbmQgcmVsZWFzZS55bWxcbiAqIGRlcml2ZXMgaXRzIG5wbSBhdXRoIGZyb20gdGhlIHNhbWUgc2VjcmV0KS4gTm90aGluZyBlbHNlIGlzIHNjYW5uZWQ6IGxvY2tmaWxlcyBvbmx5IG1pcnJvciB0aGVcbiAqIGRlY2xhcmVkIGRlcGVuZGVuY2llcywgYW5kIGJ1bmZpZy50b21sJ3MgYG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXNgIG1lbnRpb25zIHRoZSBzY29wZSBldmVuIGluXG4gKiByZXBvc2l0b3JpZXMgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RpclBhdGgnIHwgJ2RvZXNDb250YWluU3ViUGFja2FnZUpzb25zJyB8ICdwYWNrYWdlSnNvbic+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgbWFuaWZlc3RSZWxQYXRocyA9IG5ldyBTZXQoWydwYWNrYWdlLmpzb24nLCAuLi5nZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGNvbmZpZyldKTtcbiAgcmV0dXJuIFsuLi5tYW5pZmVzdFJlbFBhdGhzXS5zb21lKChyZWxQYXRoKSA9PiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSByZWFkUGFja2FnZUpzb25JZkV4aXN0cyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIHJlbFBhdGgpKTtcbiAgICBpZiAoIW1hbmlmZXN0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG1hbmlmZXN0Lm5hbWU/LnN0YXJ0c1dpdGgoUFJJVkFURV9TQ09QRSkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBbXG4gICAgICBtYW5pZmVzdC5kZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5kZXZEZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5wZWVyRGVwZW5kZW5jaWVzLFxuICAgICAgbWFuaWZlc3Qub3B0aW9uYWxEZXBlbmRlbmNpZXMsXG4gICAgXS5zb21lKChkZXBlbmRlbmNpZXMpID0+IE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcyA/PyB7fSkuc29tZSgobmFtZSkgPT4gbmFtZS5zdGFydHNXaXRoKFBSSVZBVEVfU0NPUEUpKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkUGFja2FnZUpzb25JZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IHJ1bm5lclNjaGVtYSA9IHoudW5pb24oW3ouc3RyaW5nKCksIHouYXJyYXkoei5zdHJpbmcoKSldKTtcbmNvbnN0IHdvcmtmbG93U2NoZW1hID0gei5vYmplY3Qoe1xuICBqb2JzOiB6LnJlY29yZChcbiAgICB6LnN0cmluZygpLFxuICAgIHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICAncnVucy1vbic6IHJ1bm5lclNjaGVtYS5vcHRpb25hbCgpLFxuICAgICAgICBzdHJhdGVneTogei5vYmplY3QoeyBtYXRyaXg6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSB9KS5vcHRpb25hbCgpLFxuICAgICAgfSlcbiAgICAgIC5udWxsYWJsZSgpXG4gICksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydFByaXZhdGVXb3JrZmxvd1J1bm5lcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB3b3JrZmxvd3NQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gfHwgIWNvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24pIHJldHVybjtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pLmNhdGNoKChlcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgaWYgKGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gW107XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xuICBmb3IgKGNvbnN0IHsgbmFtZTogZmlsZU5hbWUgfSBvZiBlbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRmlsZSgpICYmIC9cXC55YT9tbCQvdS50ZXN0KGVudHJ5Lm5hbWUpKSkge1xuICAgIGNvbnN0IHdvcmtmbG93ID0gd29ya2Zsb3dTY2hlbWEucGFyc2UoeWFtbC5sb2FkKGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4JykpKTtcbiAgICBmb3IgKGNvbnN0IFtqb2JOYW1lLCBqb2JdIG9mIE9iamVjdC5lbnRyaWVzKHdvcmtmbG93LmpvYnMpKSB7XG4gICAgICBpZiAoIWpvYj8uWydydW5zLW9uJ10pIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcnVubmVyID0gam9iWydydW5zLW9uJ107XG4gICAgICBpZiAoaXNTZWxmSG9zdGVkKHJ1bm5lcikpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbWF0Y2ggPSB0eXBlb2YgcnVubmVyID09PSAnc3RyaW5nJyAmJiAvXlxcJFxce1xce1xccyptYXRyaXhcXC4oXFx3KylcXHMqXFx9XFx9JC91LmV4ZWMocnVubmVyKTtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXM6IHVua25vd25bXSA9IFtdO1xuICAgICAgaWYgKG1hdGNoICYmIGpvYi5zdHJhdGVneSkge1xuICAgICAgICBjb25zdCBrZXkgPSBtYXRjaFsxXSE7XG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IGpvYi5zdHJhdGVneS5tYXRyaXg7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHouYXJyYXkoei51bmtub3duKCkpLnNhZmVQYXJzZShtYXRyaXhba2V5XSk7XG4gICAgICAgIGlmICh2YWx1ZXMuc3VjY2VzcykgY2FuZGlkYXRlcy5wdXNoKC4uLnZhbHVlcy5kYXRhKTtcbiAgICAgICAgY29uc3QgaW5jbHVkZSA9IHouYXJyYXkoei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpKS5zYWZlUGFyc2UobWF0cml4LmluY2x1ZGUpO1xuICAgICAgICBpZiAoaW5jbHVkZS5zdWNjZXNzKVxuICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaCguLi5pbmNsdWRlLmRhdGEubWFwKChyb3cpID0+IHJvd1trZXldKS5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYW5kaWRhdGVzLnB1c2gocnVubmVyKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFsbG93ZWQgPVxuICAgICAgICBjYW5kaWRhdGVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgY2FuZGlkYXRlcy5ldmVyeShcbiAgICAgICAgICAoY2FuZGlkYXRlKSA9PlxuICAgICAgICAgICAgaXNTZWxmSG9zdGVkKGNhbmRpZGF0ZSkgfHxcbiAgICAgICAgICAgIChjb25maWcucmVwb3NpdG9yeT8udG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yjp3aWxsYm9vc3Rlci9jaGVlcmxpbmdzJyAmJlxuICAgICAgICAgICAgICBmaWxlTmFtZSA9PT0gJ2J1aWxkLWRlc2t0b3AtYXBwcy55bWwnICYmXG4gICAgICAgICAgICAgIGpvYk5hbWUgPT09ICdidWlsZCcgJiZcbiAgICAgICAgICAgICAgY2FuZGlkYXRlID09PSAnd2luZG93cy1sYXRlc3QnKVxuICAgICAgICApO1xuICAgICAgaWYgKCFhbGxvd2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHtmaWxlTmFtZX06IGpvYnMuJHtqb2JOYW1lfS5ydW5zLW9uIG11c3Qgc2VsZWN0IHNlbGYtaG9zdGVkIHJ1bm5lcnMgaW4gYSBwcml2YXRlIHJlcG9zaXRvcnkuIEZpeCB0aGUgd29ya2Zsb3cgYmVmb3JlIHJ1bm5pbmcgd2JmeS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzU2VsZkhvc3RlZChydW5uZXI6IHVua25vd24pOiBib29sZWFuIHtcbiAgY29uc3QgbGFiZWxzID0gcnVubmVyU2NoZW1hLnNhZmVQYXJzZShydW5uZXIpO1xuICBpZiAoIWxhYmVscy5zdWNjZXNzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBcnJheS5pc0FycmF5KGxhYmVscy5kYXRhKSkgcmV0dXJuIGxhYmVscy5kYXRhLmluY2x1ZGVzKCdzZWxmLWhvc3RlZCcpO1xuICByZXR1cm4gbGFiZWxzLmRhdGEgPT09ICdzZWxmLWhvc3RlZCc7XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGhhc0Zub3hTeW5jRmFpbGVkLCByZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZSB9IGZyb20gJy4vZm5veFRvbWwuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IG1vdmVUb0JvdHRvbSwgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyB9IGZyb20gJy4uL3V0aWxzL3ByaXZhdGVQYWNrYWdlcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGFzc2VydFByaXZhdGVXb3JrZmxvd1J1bm5lcnMgfSBmcm9tICcuL3dvcmtmbG93UnVubmVyUG9saWN5LmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZT86IHN0cmluZztcbiAgb24/OiBPbjtcbiAgY29uY3VycmVuY3k/OiBDb25jdXJyZW5jeTtcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBqb2JzOiBSZWNvcmQ8c3RyaW5nLCBKb2I+O1xufVxuXG5pbnRlcmZhY2UgQ29uY3VycmVuY3kge1xuICBncm91cDogc3RyaW5nO1xuICAnY2FuY2VsLWluLXByb2dyZXNzJzogYm9vbGVhbjtcbiAgcXVldWU/OiAnc2luZ2xlJyB8ICdtYXgnO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICAvLyBHaXRIdWIgQWN0aW9ucyB0cmVhdHMgYGV2ZW50OiBudWxsYCBhcyBhIHZhbHVlbGVzcyBldmVudCBtYXBwaW5nLCBlLmcuXG4gIC8vIGBwdWxsX3JlcXVlc3Q6YC4gYHVuZGVmaW5lZGAgd291bGQgb21pdCB0aGUgZXZlbnQgZW50aXJlbHkgd2hlbiBkdW1waW5nIFlBTUwuXG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8ICdpbmhlcml0JztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbiddLFxuICAgICAgfSxcbiAgICAgIC8vIExldCBtYWludGFpbmVycyByZS1ydW4gdGhlIHRlc3RzIGJ5IGhhbmQuXG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIC8vIE5vbmUgb2YgdGhlc2UgbWF5IGJlIG5hcnJvd2VkIGp1c3QgYmVjYXVzZSB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdyBuZXZlciBwdXNoZXM6XG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciB0aGUgdGVzdCBqb2IncyBza2lwLWR1cGxpY2F0ZS1hY3Rpb25zIGNhbGwgd2l0aCBjYW5jZWxfb3RoZXJzOiB0cnVlICh0aGUgcmV1c2FibGVcbiAgICAgIC8vIHRlc3Qgd29ya2Zsb3cgZGVjbGFyZXMgbm8gcGVybWlzc2lvbnMgb2YgaXRzIG93biwgc28gaXRzIGpvYnMgcnVuIG9uIHRoaXMgdG9rZW4pXG4gICAgICBhY3Rpb25zOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIGBzZW1hbnRpYy1yZWxlYXNlIC0tZHJ5LXJ1bmAsIHdoaWNoIGRvZXMgYSBgZ2l0IHB1c2ggLS1kcnktcnVuYCB0byB2ZXJpZnkgd3JpdGVcbiAgICAgIC8vIGFjY2VzcyBhbmQgYWJvcnRzIHdpdGggRUdJVE5PUEVSTUlTU0lPTiB3aXRob3V0IGl0XG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBwa2ctcHJlZmxpZ2h0IFBSIGZpbGUgbGlzdGluZ1xuICAgICAgJ3B1bGwtcmVxdWVzdHMnOiAncmVhZCcsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICd0ZXN0LXJ1c3QnOiB7XG4gICAgbmFtZTogJ1Rlc3QgUnVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbiddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAndGVzdC1ydXN0Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QtcnVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGBxdWV1ZTogbWF4YCBoZXJlIHRvbyAoIzk3NCk6IEdpdEh1YidzIGRlZmF1bHQgcXVldWUgKGBzaW5nbGVgKSBjYW5jZWxzIGFuIGFscmVhZHktUEVORElOR1xuICAgIC8vIGNhbGxlciBydW4gd2hlbiBhbm90aGVyIG9uZSBxdWV1ZXMg4oCUIGJlZm9yZSBpdHMgam9iIChhbmQgdGhlIHJldXNhYmxlIHdvcmtmbG93J3Mgb3duXG4gICAgLy8gam9iLWxldmVsIGBxdWV1ZTogbWF4YCkgZXZlciBzdGFydHMg4oCUIHNpbGVudGx5IGRyb3BwaW5nIHRoYXQgcmVsZWFzZSB0cmlnZ2VyLlxuICAgIC8vIFRoZSBjYWxsZXItbGV2ZWwgZ3JvdXAgbXVzdCBOT1QgcmV1c2UgdGhlIHJldXNhYmxlIHdvcmtmbG93J3Mgam9iLWxldmVsIGdyb3VwIG5hbWVcbiAgICAvLyAoYHJlbGVhc2UtJHt7IGdpdGh1Yi5yZXBvc2l0b3J5IH19YCk6IHdvcmtmbG93LWxldmVsIGFuZCBqb2ItbGV2ZWwgZ3JvdXBzIHNoYXJlIG9uZVxuICAgIC8vIHJlcG9zaXRvcnktd2lkZSBuYW1lc3BhY2UsIGFuZCBpZGVudGljYWwgbmFtZXMgZGVhZGxvY2sgdGhlIHJ1biAoXCJDYW5jZWxpbmcgc2luY2UgYVxuICAgIC8vIGRlYWRsb2NrIGZvciBjb25jdXJyZW5jeSBncm91cCAuLi4gd2FzIGRldGVjdGVkIGJldHdlZW4gJ3RvcCBsZXZlbCB3b3JrZmxvdycgYW5kICc8am9iPidcIikuXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICBxdWV1ZTogJ21heCcsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS90cnVzdGVkLXB1Ymxpc2hlcnMjc3RlcC0yLWNvbmZpZ3VyZS15b3VyLWNpY2Qtd29ya2Zsb3dcbiAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgY29tbWl0aW5nIGNoYW5nZXNcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBLbm93bktpbmQgPSBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzIHwgJ2RlcGxveSc7XG5cbi8qKlxuICogUGFyc2VzIGEgYHVzZXM6YCB2YWx1ZSBjYWxsaW5nIG9uZSBvZiBXaWxsQm9vc3RlcidzIG93biByZXVzYWJsZSB3b3JrZmxvd3MgKG9yIHRoZVxuICogV2lsbEJvb3N0ZXJMYWIgc3luYyBtaXJyb3IpIGludG8gdGhlIHdvcmtmbG93IG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKSBhbmQgZ2l0IHJlZi4gT25seSB0aG9zZVxuICogZm9sbG93IHRoZSBjb250cmFjdCB3YmZ5IGVuZm9yY2VzIOKAlCBjYWxsZXJzIG9mIGFub3RoZXIgb3JnYW5pemF0aW9uJ3Mgc2FtZS1uYW1lZCByZXBvc2l0b3J5IGFyZVxuICogbGVmdCBhbG9uZS4gR2l0SHViIHRyZWF0cyBvd25lci9yZXBvc2l0b3J5IG5hbWVzIGNhc2UtaW5zZW5zaXRpdmVseSwgc28gdGhlIGNvbXBhcmlzb24gZG9lc1xuICogdG9vLCB3aGlsZSB0aGUgd29ya2Zsb3cgcGF0aCBhbmQgcmVmIHN0YXkgY2FzZS1zZW5zaXRpdmUuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoXG4gIHVzZXM6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogeyB3b3JrZmxvd05hbWU6IHN0cmluZzsgZXh0ZW5zaW9uOiBzdHJpbmc7IHJlZjogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaCA9IC9eKFteL10rKVxcLyhbXi9dKylcXC9cXC5naXRodWJcXC93b3JrZmxvd3NcXC8oW14vQF0rPylcXC4oeWE/bWwpQCguKykkL3UuZXhlYyh1c2VzID8/ICcnKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3duZXIgPSBtYXRjaFsxXSEudG9Mb3dlckNhc2UoKTtcbiAgaWYgKChvd25lciAhPT0gJ3dpbGxib29zdGVyJyAmJiBvd25lciAhPT0gJ3dpbGxib29zdGVybGFiJykgfHwgbWF0Y2hbMl0hLnRvTG93ZXJDYXNlKCkgIT09ICdyZXVzYWJsZS13b3JrZmxvd3MnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4geyB3b3JrZmxvd05hbWU6IG1hdGNoWzNdISwgZXh0ZW5zaW9uOiBtYXRjaFs0XSEsIHJlZjogbWF0Y2hbNV0hIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghcm9vdENvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24pIHtcbiAgICBjb25zb2xlLndhcm4oJ1NraXBwZWQgd29ya2Zsb3cgZ2VuZXJhdGlvbiBiZWNhdXNlIHJlcG9zaXRvcnkgdmlzaWJpbGl0eSBpcyB1bmtub3duLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJiAoYXdhaXQgZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgod29ya2Zsb3dzUGF0aCkpKSB7XG4gICAgYXdhaXQgYXNzZXJ0UHJpdmF0ZVdvcmtmbG93UnVubmVycyhyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoKTtcbiAgfVxuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2l0aCAuZ2l0aHViIG9yIC5naXRodWIvd29ya2Zsb3dzIHN5bWxpbmtlZCBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCB3cml0ZVlhbWwncyBndWFyZHNcbiAgICAvLyBhbHJlYWR5IHJlZnVzZSB0aGUgd3JpdGVzLCBidXQgcmVhZGRpci9ybSBiZWxvdyB3b3VsZCBzdGlsbCBlbnVtZXJhdGUgYW5kIERFTEVURSBmaWxlc1xuICAgIC8vIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkg4oCUIHNvIHJlcXVpcmUgdGhlIGRpcmVjdG9yeSB0byByZXNvbHZlIGluc2lkZSBpdCBiZWZvcmUgYW55XG4gICAgLy8gdHJhdmVyc2FsLCBta2Rpciwgb3IgY2xlYW51cC5cbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nIHdvcmtmbG93cyBiZWNhdXNlICR7d29ya2Zsb3dzUGF0aH0gcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgLy8gd2JmeSB3cml0ZXMgLnltbCB3b3JrZmxvd3MsIHNvIGVhY2gga2luZCBtYXBzIHRvIGl0cyAueW1sIGZpbGUuXG4gICAgY29uc3QgZmlsZU5hbWVzQnlLaW5kID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIWVudHJ5Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkgY29udGludWU7XG4gICAgICBmaWxlTmFtZXNCeUtpbmQuc2V0KGVudHJ5Lm5hbWUuc2xpY2UoMCwgLScueW1sJy5sZW5ndGgpLCBlbnRyeS5uYW1lKTtcbiAgICB9XG4gICAgY29uc3QgbWFuZGF0b3J5S2luZHMgPSBbJ3Rlc3QnLCAnc2VtYW50aWMtcHInLCAnY2xvc2UtY29tbWVudCddO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIG1hbmRhdG9yeUtpbmRzLnB1c2goJ3JlbGVhc2UnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgbWFuZGF0b3J5S2luZHMucHVzaCgndGVzdC1ydXN0Jyk7XG4gICAgfVxuICAgIC8vIEEgcHJldmlvdXMgcnVuIG1heSBoYXZlIG1pc3Rha2VuIGEgZ2l0aWdub3JlZCB0aGlyZC1wYXJ0eSBjaGVja291dCBmb3IgcmVwb3NpdG9yeSBSdXN0IGNvZGUuXG4gICAgLy8gUmVtb3ZlIG9ubHkgdGhlIGdlbmVyYXRlZC1zdHlsZSBjYWxsZXI6IGEgc2FtZS1uYW1lZCBjdXN0b20gd29ya2Zsb3cgd2l0aCBhbnkgb3RoZXIgam9iIHN0YXlzLlxuICAgIGlmIChyb290Q29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgdGVzdFJ1c3RGaWxlTmFtZSA9IGZpbGVOYW1lc0J5S2luZC5nZXQoJ3Rlc3QtcnVzdCcpO1xuICAgICAgaWYgKHRlc3RSdXN0RmlsZU5hbWUgJiYgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93KHdvcmtmbG93c1BhdGgsIHRlc3RSdXN0RmlsZU5hbWUsICd0ZXN0LXJ1c3QnKSkge1xuICAgICAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCd0ZXN0LXJ1c3QnKTtcbiAgICAgICAgYXdhaXQgZnNVdGlsLnJlbW92ZUNvbmZpbmVkKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCB0ZXN0UnVzdEZpbGVOYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZpbGVOYW1lc0J5S2luZC5kZWxldGUoJ3diZnknKTtcbiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgbWFuZGF0b3J5S2luZHMpIHtcbiAgICAgIGlmICghZmlsZU5hbWVzQnlLaW5kLmhhcyhraW5kKSkge1xuICAgICAgICBmaWxlTmFtZXNCeUtpbmQuc2V0KGtpbmQsIGAke2tpbmR9LnltbGApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmlsZU5hbWVzQnlLaW5kLmhhcygnc3luYycpKSB7XG4gICAgICAvLyBUaGUgc3luYyB3b3JrZmxvdydzIGdlbmVyYXRpb24gb3ducyB0aGUgZm9yY2Utc3luYyB3b3JrZmxvdywgc28gcHJvY2Vzc2luZyBpdCBhcyBhblxuICAgICAgLy8gaW5kZXBlbmRlbnQga2luZCB3b3VsZCByYWNlIGNvbmN1cnJlbnQgd3JpdGVzIG9uIHRoZSBzYW1lIHBhdGguXG4gICAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCdzeW5jLWZvcmNlJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2luZCwgZmlsZU5hbWVdIG9mIGZpbGVOYW1lc0J5S2luZCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCBhcyBLbm93bktpbmQsIGZpbGVOYW1lKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZTogR2l0SHViIHJlcG9zaXRvcnkgbmFtZXMgYXJlLCBhbmQgYSByZW1vdGUgbWF5IHNwZWxsIHRoaXMgb25lIGFueSB3YXkuIEdldHRpbmcgaXQgd3JvbmdcbiAgLy8gbGV0cyB3YmZ5IHJld3JpdGUgdGhlIHJlcG9zaXRvcnkgdGhhdCBob3N0cyB0aGUgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gIHJldHVybiByZXBvc2l0b3J5Py50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciBldmVyeSBqb2Igb2YgdGhlIHdvcmtmbG93IGZpbGUgY2FsbHMgdGhlIG5hbWVkIFdpbGxCb29zdGVyIHJldXNhYmxlIHdvcmtmbG93IChvd25lclxuICogcmVzdHJpY3RlZCB2aWEgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCkuIFVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgd2JmeSBvd25zIGEgZmlsZSBlbm91Z2ggdG9cbiAqIGRlbGV0ZSBpdDogdW5wYXJzYWJsZSBmaWxlcyBhbmQgZmlsZXMgd2l0aCBhbnkgb3RoZXIgam9iIHJldHVybiBmYWxzZSDigJQgZGVsZXRpbmcgYSB3aG9sZVxuICogd29ya2Zsb3cgb24gYSBsb29zZSBtYXRjaCB3b3VsZCBiZSB0b28gYWdncmVzc2l2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIHdvcmtmbG93TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghZmlsZU5hbWUuZW5kc1dpdGgoJy55bWwnKSkgcmV0dXJuIGZhbHNlO1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGlzVGFyZ2V0Q2FsbCA9ICh1c2VzOiB1bmtub3duKTogYm9vbGVhbiA9PlxuICAgIHR5cGVvZiB1c2VzID09PSAnc3RyaW5nJyAmJiBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKHVzZXMpPy53b3JrZmxvd05hbWUgPT09IHdvcmtmbG93TmFtZTtcbiAgdHJ5IHtcbiAgICBjb25zdCB3b3JrZmxvdyA9IHlhbWwubG9hZChjb250ZW50KSBhcyBXb3JrZmxvdyB8IHVuZGVmaW5lZDtcbiAgICBpZiAod29ya2Zsb3cgJiYgdHlwZW9mIHdvcmtmbG93ID09PSAnb2JqZWN0JyAmJiB3b3JrZmxvdy5qb2JzICYmIHR5cGVvZiB3b3JrZmxvdy5qb2JzID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3Qgam9icyA9IE9iamVjdC52YWx1ZXMod29ya2Zsb3cuam9icyk7XG4gICAgICByZXR1cm4gam9icy5sZW5ndGggPiAwICYmIGpvYnMuZXZlcnkoKGpvYikgPT4gaXNUYXJnZXRDYWxsKGpvYj8udXNlcykpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gVW5wYXJzYWJsZSBjb250ZW50IGlzIG5vdCBwcm92YWJseSBhIGNhbGxlciBvZiB0aGUgbmFtZWQgd29ya2Zsb3cuXG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsXG4gIGtpbmQ6IEtub3duS2luZCxcbiAgZmlsZU5hbWUgPSBgJHtraW5kfS55bWxgXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpO1xuICBjb25zdCBkZXBsb3lQcm9kdWN0aW9uRmlsZU5hbWUgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJykpXG4gICAgPyAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJ1xuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIEEgbm9uLWdlbmVyYXRlZCB0ZXN0LXJ1c3QueW1sIGluIGEgcmVwbyB3aXRob3V0IFJ1c3QgY29kZSBtZXJlbHkgc2hhcmVzIHRoZSBuYW1lOyBsZWF2ZSBpdCBhbG9uZS5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0LXJ1c3QnICYmIGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcbiAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGxldCBvbGRTZXR0aW5nczogV29ya2Zsb3c7XG4gICAgdHJ5IHtcbiAgICAgIG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQW4gZXhpc3Rpbmcgd29ya2Zsb3cgd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0IHVudG91Y2hlZDogd3JpdGluZyB0aGUgdGVtcGxhdGVcbiAgICAgIC8vIHdpdGhvdXQgbWVyZ2luZyB3b3VsZCBzaWxlbnRseSBkaXNjYXJkIHRoZSByZXBvc2l0b3J5J3Mgd29ya2Zsb3cuXG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBZQU1MLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB5YW1sLmxvYWQgcmV0dXJucyB1bmRlZmluZWQgZm9yIGVtcHR5L2NvbW1lbnQtb25seSBmaWxlcyBhbmQgbm9uLW9iamVjdHMgZm9yIHNjYWxhclxuICAgIC8vIGRvY3VtZW50cyB3aXRob3V0IHRocm93aW5nOyBkZWVwbWVyZ2Ugd291bGQgY3Jhc2ggb24gdGhlbS5cbiAgICBpZiAodHlwZW9mIG9sZFNldHRpbmdzICE9PSAnb2JqZWN0JyB8fCBvbGRTZXR0aW5ncyA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgYSB3b3JrZmxvdy5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfVxuXG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICAvLyBVbmxpa2UgdGhlIHJlbGVhc2UgY2FsbGVyLCB0aGUgZGVmYXVsdCBxdWV1ZSAoYHNpbmdsZWApIGlzIGludGVudGlvbmFsIGhlcmU6IGEgcGVuZGluZ1xuICAgICAgLy8gZGVwbG95IHRoYXQgaXMgY2FuY2VsbGVkIGFuZCByZXBsYWNlZCBieSBhIG5ld2VyIG9uZSBsb3NlcyBub3RoaW5nIOKAlCB0aGUgbmV3ZXIgZGVwbG95XG4gICAgICAvLyBjb252ZXJnZXMgdGhlIGVudmlyb25tZW50IHRvIHRoZSBsYXRlc3Qgc3RhdGUgYW55d2F5LlxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbkZpbGVOYW1lKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9IGRlcGxveVByb2R1Y3Rpb25GaWxlTmFtZTtcbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBlbXB0eSBqb2JzIChhIGJhcmUgYGpvYk5hbWU6YCBwYXJzZXMgYXMgbnVsbCksIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3MsIGFuZCBvdGhlclxuICAgIC8vIG9yZ2FuaXphdGlvbnMnIHJldXNhYmxlIHdvcmtmbG93czogYSBzYW1lLW5hbWVkIGByZXVzYWJsZS13b3JrZmxvd3NgIHJlcG9zaXRvcnkgZWxzZXdoZXJlXG4gICAgLy8gZm9sbG93cyBhIGRpZmZlcmVudCBjb250cmFjdCwgYW5kIG5vcm1hbGl6aW5nIGl0cyBjYWxsZXJzIChzZWNyZXQgaW5qZWN0aW9uL3JlbW92YWwsXG4gICAgLy8gcGVybWlzc2lvbnMpIGNvdWxkIGJyZWFrIHRoZW0uXG4gICAgaWYgKCFqb2IgfHwgIXBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoam9iLnVzZXMpKSBjb250aW51ZTtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gICAgaXNSZXVzYWJsZVdvcmtmbG93ID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzUmV1c2FibGVXb3JrZmxvdykgcmV0dXJuO1xuXG4gIC8vIERlcGxveSBjYWxsZXJzIG5lZWQgbm8gcmVwb3NpdG9yeSB3cml0ZXM6IHRoZSBjYWxsZWQgcmV1c2FibGUgd29ya2Zsb3cgaW5oZXJpdHMgdGhlIGNhbGxlcidzXG4gIC8vIHRva2VuIHBlcm1pc3Npb25zLCByZXBvc2l0b3JpZXMgZGVmYXVsdCB0aGUgdG9rZW4gdG8gd3JpdGUsIGFuZCB0aGUgcmV1c2FibGUgZGVwbG95IHdvcmtmbG93XG4gIC8vIGF0IG1haW4gcGVyZm9ybXMgbm8gR0lUSFVCX1RPS0VOIHdyaXRlcy4gVGhlIHJlYWQtb25seSBkZWZhdWx0IGlzIGluamVjdGVkIGF0IHRoZSBKT0IgbGV2ZWxcbiAgLy8gKGpvYiBwZXJtaXNzaW9ucyBkbyBub3QgYWZmZWN0IHNpYmxpbmcgam9icywgc28gaW5saW5lIGpvYnMgb3IgcGlubmVkIGNhbGxlZXMg4oCUIHdob3NlIHdyaXRlXG4gIC8vIG5lZWRzIGFyZSB1bmF1ZGl0ZWQg4oCUIGtlZXAgdGhlaXJzKSwgYW5kIG9ubHkgd2hlbiBuZWl0aGVyIHRoZSB3b3JrZmxvdyBub3IgdGhlIGpvYiBkZWNsYXJlc1xuICAvLyBpdHMgb3duIHBlcm1pc3Npb25zIChPSURDIGRlcGxveXMgYWx3YXlzIGRvLCBmb3IgaWQtdG9rZW4pLiBydW4tc2NyaXB0IGNhbGxlcnMgYXJlIGV4Y2x1ZGVkXG4gIC8vIGJlY2F1c2UgYXJiaXRyYXJ5IHBhY2thZ2Ugc2NyaXB0cyBtYXkgcHVzaCBjb21taXRzLlxuICBpZiAoIW5ld1NldHRpbmdzLnBlcm1pc3Npb25zKSB7XG4gICAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgICAgaWYgKCFqb2IpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY2FsbCA9IHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoam9iLnVzZXMpO1xuICAgICAgaWYgKCFqb2IucGVybWlzc2lvbnMgJiYgY2FsbD8ud29ya2Zsb3dOYW1lID09PSAnZGVwbG95JyAmJiBjYWxsLnJlZiA9PT0gJ21haW4nKSB7XG4gICAgICAgIGpvYi5wZXJtaXNzaW9ucyA9IHsgY29udGVudHM6ICdyZWFkJyB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ3JlbGVhc2UnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnNjaGVkdWxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoO1xuICAgICAgfSBlbHNlIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCAmJiBjb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBjb25maWcucmVsZWFzZS5icmFuY2hlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6XG4gICAgY2FzZSAndGVzdC1ydXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVsbF9yZXF1ZXN0WydwYXRocy1pZ25vcmUnXTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ107XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgdGhlIGZvcmNlLXN5bmMgd29ya2Zsb3cgYmFzZWQgb24gdGhlIHN5bmMgd29ya2Zsb3cgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuLy8gd2IncyBnbG9iYWwgb3B0aW9ucyB0aGF0IGNvbnN1bWUgYSBmb2xsb3dpbmcgdmFsdWUgdG9rZW4gKGZyb20gc2hhcmVkT3B0aW9uc0J1aWxkZXIgcGx1c1xuLy8geWFyZ3NPcHRpb25zQnVpbGRlckZvckVudik7IGV2ZXJ5IG90aGVyIGAtYC1wcmVmaXhlZCB0b2tlbiBiZWZvcmUgdGhlIHN1YmNvbW1hbmQgaXMgYSBib29sZWFuLlxuY29uc3Qgd2JHbG9iYWxWYWx1ZU9wdGlvbnMgPSBuZXcgU2V0KFsnLS13b3JraW5nLWRpcicsICctdycsICctLWVudicsICctLWNhc2NhZGUtZW52J10pO1xuXG4vLyBTdWJjb21tYW5kcyB0aGF0IHJ1biBhIEJJTkFSWSAoc28gdGhlIGZvbGxvd2luZyB0b2tlbiBjYW4gYmUgdGhlIHdiIGV4ZWN1dGFibGUpLCBwZXIgcnVubmVyOiBidW5cbi8vIHJlc2VydmVzIG9ubHkgYHhgIChgYnVuIGRseGAvYGJ1biBleGVjYCBydW4gYSBwYWNrYWdlIHNjcmlwdCBvZiB0aGF0IG5hbWUpLCBucG0gaGFzIGBleGVjYC9geGAsXG4vLyBhbmQgcG5wbS95YXJuIChCZXJyeSkgaGF2ZSBgZXhlY2AvYGRseGAuXG5jb25zdCBydW5uZXJFeGVjdXRvclN1YmNvbW1hbmRzQnlSdW5uZXI6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IHtcbiAgbnBtOiBuZXcgU2V0KFsnZXhlYycsICd4J10pLFxuICBwbnBtOiBuZXcgU2V0KFsnZXhlYycsICdkbHgnXSksXG4gIHlhcm46IG5ldyBTZXQoWydleGVjJywgJ2RseCddKSxcbiAgYnVuOiBuZXcgU2V0KFsneCddKSxcbn07XG5cbi8vIFJ1bm5lciBvcHRpb25zIHRoYXQgY29uc3VtZSB0aGUgRk9MTE9XSU5HIHRva2VuIGFzIHRoZWlyIHZhbHVlLCBzbyBpdCBpcyBub3QgdGhlIHdiIGV4ZWN1dGFibGVcbi8vIChlLmcuIGBidW4gLS1jd2QgZGlyIHdiIGRlcGxveWAsIGBucHggLXAgcGtnIHdiIGRlcGxveWApLiBBIGNvbnNlcnZhdGl2ZSBzdXBlcnNldCBhY3Jvc3Ncbi8vIG5wbS9wbnBtL3lhcm4vYnVuIGFuZCB0aGUgbnB4L2J1bnggcGFja2FnZSBleGVjdXRvcnMuXG5jb25zdCBydW5uZXJWYWx1ZU9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgJy0tY3dkJyxcbiAgJy1DJyxcbiAgJy0tcHJlZml4JyxcbiAgJy0tZmlsdGVyJyxcbiAgJy1GJyxcbiAgJy0td29ya3NwYWNlJyxcbiAgJy13JyxcbiAgJy0tZGlyJyxcbiAgJy1wJyxcbiAgJy0tcGFja2FnZScsXG4gICctYycsXG4gICctLWNhbGwnLFxuXSk7XG5cbi8qKiBBZHZhbmNlIHBhc3QgYSBydW5uZXIncyBvcHRpb25zLCBjb25zdW1pbmcgYSBzZXBhcmF0ZSB2YWx1ZSB0b2tlbiB3aGVyZSBvbmUgYXBwbGllcy4gKi9cbmZ1bmN0aW9uIHNraXBSdW5uZXJPcHRpb25zKHRva2Vuczogc3RyaW5nW10sIHN0YXJ0SW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7XG4gIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGggJiYgKHRva2Vuc1tpbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgIGNvbnN0IG9wdGlvbiA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgaW5kZXgrKztcbiAgICBpZiAoIW9wdGlvbi5pbmNsdWRlcygnPScpICYmIHJ1bm5lclZhbHVlT3B0aW9ucy5oYXMob3B0aW9uKSAmJiBpbmRleCA8IHRva2Vucy5sZW5ndGgpIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIFRva2VuaXplIGEgc2hlbGwgY29tbWFuZCBsaW5lIGludG8gY29tbWFuZCBzZWdtZW50cywgZWFjaCBhIGxpc3Qgb2YgdG9rZW5zIHdpdGggcXVvdGVzIHJlbW92ZWQuXG4gKiBBIG5ldyBzZWdtZW50IHN0YXJ0cyBhdCBhbiB1bnF1b3RlZCBgJiZgL2B8fGAvYDtgL2B8YC9gJmA7IGFuIHVucXVvdGVkIGAjYCBzdGFydHMgYSBjb21tZW50IHRvXG4gKiBlbmQgb2YgbGluZTsgYSBiYWNrc2xhc2ggZXNjYXBlcyB0aGUgbmV4dCBjaGFyYWN0ZXIgKHNvIGBcXDtgIGlzIGEgbGl0ZXJhbCwgbm90IGEgc2VwYXJhdG9yKTtcbiAqIGdyb3VwaW5nIHBhcmVudGhlc2VzIGAoYC9gKWAgYXJlIHRva2VuIHNlcGFyYXRvcnMsIHNvIGAod2IgZGVwbG95KWAgdG9rZW5pemVzIGFzIGB3YiBkZXBsb3lgLlxuICogU2VnbWVudHMvdG9rZW5zIG1vZGVsIGNvbW1hbmQgc3RydWN0dXJlIHByZWNpc2VseSBlbm91Z2ggdGhhdCBxdW90ZWQgb3BlcmF0b3JzLCBlc2NhcGVkXG4gKiBvcGVyYXRvcnMsIGNvbW1lbnRzLCBhbmQgc3Vic2hlbGwgZ3JvdXBzIG5laXRoZXIgZmFicmljYXRlIG5vciBoaWRlIGEgYHdiIGRlcGxveWAgaW52b2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVTaGVsbENvbW1hbmQoc2NyaXB0OiBzdHJpbmcpOiB7IHNlZ21lbnRzOiBzdHJpbmdbXVtdOyBzYXdIZXJlZG9jOiBib29sZWFuIH0ge1xuICBjb25zdCBzZWdtZW50czogc3RyaW5nW11bXSA9IFtdO1xuICBsZXQgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudCA9ICcnO1xuICBsZXQgaW5Ub2tlbiA9IGZhbHNlO1xuICBsZXQgcXVvdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLy8gV2hldGhlciB0aGUgc2NyaXB0IHVzZXMgYW55IGhlcmVkb2MuIEZhaXRoZnVsbHkgY2xhc3NpZnlpbmcgd2hpY2ggYm9keSBsaW5lcyBhcmUgZGF0YSAodGhlXG4gIC8vIGRlbGltaXRlciB3b3JkIGNhbiBiZSBxdW90ZWQvYmFja3NsYXNoLWVzY2FwZWQsIGA8PC1gIHN0cmlwcyBsZWFkaW5nIHRhYnMsIHRlcm1pbmF0b3JzIG1hdGNoXG4gIC8vIGV4YWN0bHkpIGlzIG1vcmUgdGhhbiB0aGlzIHBhcnNlciBtb2RlbHMsIHNvIGEgaGVyZWRvYyBhbnl3aGVyZSBtYWtlcyBkZXRlY3Rpb24gcmV0dXJuIGZhbHNlLlxuICBsZXQgc2F3SGVyZWRvYyA9IGZhbHNlO1xuICAvLyBIZXJlZG9jIGRlbGltaXRlcnMgd2hvc2UgYm9kaWVzIGJlZ2luIGF0IHRoZSBORVhUIG5ld2xpbmU6IGBjYXQgPDxBIDw8QmAgcXVldWVzIEEgdGhlbiBCLCBhbmRcbiAgLy8gdGhlIGNvbW1hbmRzIEFGVEVSIHRoZSBgPDxgIGhlYWRlciBvbiB0aGUgc2FtZSBsaW5lIHN0aWxsIGV4ZWN1dGUsIHNvIHRoZSBoZWFkZXIgaXMgcmVjb3JkZWRcbiAgLy8gaGVyZSBhbmQgdGhlIGJvZGllcyBhcmUgc2tpcHBlZCBvbmx5IHdoZW4gdGhlIGxpbmUncyBuZXdsaW5lIGlzIHJlYWNoZWQuXG4gIGxldCBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNraXBIZXJlZG9jQm9kaWVzID0gKGZyb21JbmRleDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICBsZXQgY3Vyc29yID0gZnJvbUluZGV4O1xuICAgIGZvciAoY29uc3QgZGVsaW1pdGVyIG9mIHBlbmRpbmdIZXJlZG9jRGVsaW1pdGVycykge1xuICAgICAgd2hpbGUgKGN1cnNvciA8IHNjcmlwdC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbGluZVN0YXJ0ID0gY3Vyc29yICsgMTtcbiAgICAgICAgbGV0IGxpbmVFbmQgPSBsaW5lU3RhcnQ7XG4gICAgICAgIHdoaWxlIChsaW5lRW5kIDwgc2NyaXB0Lmxlbmd0aCAmJiBzY3JpcHRbbGluZUVuZF0gIT09ICdcXG4nKSBsaW5lRW5kKys7XG4gICAgICAgIGN1cnNvciA9IGxpbmVFbmQ7XG4gICAgICAgIGlmIChzY3JpcHQuc2xpY2UobGluZVN0YXJ0LCBsaW5lRW5kKS50cmltKCkgPT09IGRlbGltaXRlcikgYnJlYWs7XG4gICAgICAgIGlmIChsaW5lRW5kID49IHNjcmlwdC5sZW5ndGgpIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMgPSBbXTtcbiAgICByZXR1cm4gY3Vyc29yO1xuICB9O1xuICBjb25zdCBlbmRUb2tlbiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoaW5Ub2tlbikgdG9rZW5zLnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9ICcnO1xuICAgIGluVG9rZW4gPSBmYWxzZTtcbiAgfTtcbiAgY29uc3QgZW5kU2VnbWVudCA9ICgpOiB2b2lkID0+IHtcbiAgICBlbmRUb2tlbigpO1xuICAgIHNlZ21lbnRzLnB1c2godG9rZW5zKTtcbiAgICB0b2tlbnMgPSBbXTtcbiAgfTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNjcmlwdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBzY3JpcHRbaW5kZXhdID8/ICcnO1xuICAgIGlmIChxdW90ZSkge1xuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnICYmIHF1b3RlID09PSAnXCInKSB7XG4gICAgICAgIC8vIEluc2lkZSBkb3VibGUgcXVvdGVzLCBiYWNrc2xhc2gtbmV3bGluZSBpcyBzdGlsbCBhIGxpbmUgY29udGludWF0aW9uIChib3RoIHJlbW92ZWQpO1xuICAgICAgICAvLyBhbnkgb3RoZXIgZXNjYXBlZCBjaGFyYWN0ZXIgY29udHJpYnV0ZXMgbGl0ZXJhbGx5LlxuICAgICAgICBpZiAoc2NyaXB0W2luZGV4ICsgMV0gPT09ICdcXG4nKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGN1cnJlbnQgKz0gc2NyaXB0WysraW5kZXhdID8/ICcnO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09IHF1b3RlKSBxdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgIGVsc2UgY3VycmVudCArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnKSB7XG4gICAgICAvLyBCYWNrc2xhc2gtbmV3bGluZSBpcyBhIGxpbmUgY29udGludWF0aW9uOiB0aGUgc2hlbGwgcmVtb3ZlcyBib3RoLCBqb2luaW5nIHRoZSBsaW5lc1xuICAgICAgLy8gd2l0aG91dCBpbnRyb2R1Y2luZyBhIHRva2VuIGJvdW5kYXJ5LiBBbnkgb3RoZXIgZXNjYXBlZCBjaGFyYWN0ZXIgaXMgYSBsaXRlcmFsLlxuICAgICAgaWYgKHNjcmlwdFtpbmRleCArIDFdID09PSAnXFxuJykge1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgKz0gc2NyaXB0WysraW5kZXhdID8/ICcnO1xuICAgICAgaW5Ub2tlbiA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gXCInXCIgfHwgY2hhcmFjdGVyID09PSAnXCInKSB7XG4gICAgICBxdW90ZSA9IGNoYXJhY3RlcjtcbiAgICAgIGluVG9rZW4gPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEEgYDw8YC9gPDwtYCBoZXJlZG9jIHJlZGlyZWN0aW9uOiBpdHMgYm9keSBsaW5lcyAodXAgdG8gdGhlIGRlbGltaXRlciBsaW5lKSBhcmUgREFUQSwgbm90XG4gICAgLy8gY29tbWFuZHMsIHNvIGBjYXQgPDwnRU9GJ1xcbndiIGRlcGxveVxcbkVPRmAgbXVzdCBub3QgcmVhZCBgd2IgZGVwbG95YCBhcyBhbiBpbnZvY2F0aW9uLiBTaW5jZVxuICAgIC8vIHRoZSBjYWxsZXIgZGVjbGluZXMgb24gQU5ZIGhlcmVkb2MsIGZsYWcgaXQgdGhlIGluc3RhbnQgYDw8YCBhcHBlYXJzIOKAlCBiZWZvcmUgcGFyc2luZyB0aGVcbiAgICAvLyBkZWxpbWl0ZXIgd29yZCDigJQgc28gYW4gZXhvdGljIGRlbGltaXRlciAoYDw8K2ApIHRoZSB3b3JkIHNjYW5uZXIgY2Fubm90IHJlYWQgc3RpbGwgZGVjbGluZXMuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJzwnICYmIHNjcmlwdFtpbmRleCArIDFdID09PSAnPCcpIHtcbiAgICAgIHNhd0hlcmVkb2MgPSB0cnVlO1xuICAgICAgbGV0IGN1cnNvciA9IGluZGV4ICsgMjtcbiAgICAgIGlmIChzY3JpcHRbY3Vyc29yXSA9PT0gJy0nKSBjdXJzb3IrKztcbiAgICAgIHdoaWxlICgvWyBcXHRdL3UudGVzdChzY3JpcHRbY3Vyc29yXSA/PyAnJykpIGN1cnNvcisrO1xuICAgICAgbGV0IGRlbGltaXRlciA9ICcnO1xuICAgICAgLy8gVGhlIGRlbGltaXRlciB3b3JkIG1heSBiZSBxdW90ZWQgKGA8PCdFT0YnYCkgb3IgYmFja3NsYXNoLWVzY2FwZWQgKGA8PFxcRU9GYCk7IGVpdGhlciBmb3JtXG4gICAgICAvLyBqdXN0IGRpc2FibGVzIGJvZHkgZXhwYW5zaW9uLCBzbyBjb2xsZWN0IHRoZSBiYXJlIHdvcmQuIE1pc3NpbmcgdGhlIGVzY2FwZWQgZm9ybSB3b3VsZCBkcm9wXG4gICAgICAvLyBgc2F3SGVyZWRvY2AgYW5kIHJlYWQgdGhlIGhlcmVkb2MgYm9keSBhcyBjb21tYW5kcy5cbiAgICAgIGxldCBkZWxpbWl0ZXJRdW90ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgd2hpbGUgKGN1cnNvciA8IHNjcmlwdC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZGVsaW1pdGVyQ2hhciA9IHNjcmlwdFtjdXJzb3JdID8/ICcnO1xuICAgICAgICBpZiAoZGVsaW1pdGVyUXVvdGUpIHtcbiAgICAgICAgICBpZiAoZGVsaW1pdGVyQ2hhciA9PT0gZGVsaW1pdGVyUXVvdGUpIGRlbGltaXRlclF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGVsc2UgZGVsaW1pdGVyICs9IGRlbGltaXRlckNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsaW1pdGVyQ2hhciA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgLy8gQSBiYWNrc2xhc2ggcXVvdGVzIHRoZSBuZXh0IGNoYXJhY3RlciBpbnRvIHRoZSBkZWxpbWl0ZXIgd29yZCAoYDw8XFxFT0ZgIOKGkiBgRU9GYCkuXG4gICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgZGVsaW1pdGVyICs9IHNjcmlwdFtjdXJzb3JdID8/ICcnO1xuICAgICAgICB9IGVsc2UgaWYgKGRlbGltaXRlckNoYXIgPT09IFwiJ1wiIHx8IGRlbGltaXRlckNoYXIgPT09ICdcIicpIHtcbiAgICAgICAgICBkZWxpbWl0ZXJRdW90ZSA9IGRlbGltaXRlckNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoL1tcXHcuLV0vdS50ZXN0KGRlbGltaXRlckNoYXIpKSB7XG4gICAgICAgICAgZGVsaW1pdGVyICs9IGRlbGltaXRlckNoYXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY3Vyc29yKys7XG4gICAgICB9XG4gICAgICBpZiAoZGVsaW1pdGVyKSB7XG4gICAgICAgIC8vIFRoZSBgPDxkZWxpbWAgaGVhZGVyIGlzIGEgcmVkaXJlY3Rpb24gKG5vdCBhIHRva2VuKTsgcmVjb3JkIHRoZSBkZWxpbWl0ZXIgYW5kIGtlZXBcbiAgICAgICAgLy8gcGFyc2luZyB0aGUgcmVzdCBvZiB0aGlzIGxpbmUg4oCUIGl0cyBib2R5IGlzIHNraXBwZWQgd2hlbiB0aGUgbmV3bGluZSBpcyByZWFjaGVkLlxuICAgICAgICBlbmRUb2tlbigpO1xuICAgICAgICBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMucHVzaChkZWxpbWl0ZXIpO1xuICAgICAgICBpbmRleCA9IGN1cnNvciAtIDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnIycgJiYgIWluVG9rZW4pIHtcbiAgICAgIC8vIENvbW1lbnQgcnVucyB0byBlbmQgb2YgbGluZTsgZW5kIHRoZSBjdXJyZW50IGNvbW1hbmQgc2VnbWVudCBhbmQgbGV0IHRoZSBsb29wIHJlc3VtZSBhdFxuICAgICAgLy8gdGhlIG5ld2xpbmUgc28gdGhlIG5leHQgbGluZSBpcyBwYXJzZWQgYXMgaXRzIG93biBzZWdtZW50LlxuICAgICAgZW5kU2VnbWVudCgpO1xuICAgICAgd2hpbGUgKGluZGV4ICsgMSA8IHNjcmlwdC5sZW5ndGggJiYgc2NyaXB0W2luZGV4ICsgMV0gIT09ICdcXG4nKSBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcmJyB8fCBjaGFyYWN0ZXIgPT09ICd8JyB8fCBjaGFyYWN0ZXIgPT09ICc7JyB8fCBjaGFyYWN0ZXIgPT09ICdcXG4nKSB7XG4gICAgICBlbmRTZWdtZW50KCk7XG4gICAgICBpZiAoKGNoYXJhY3RlciA9PT0gJyYnIHx8IGNoYXJhY3RlciA9PT0gJ3wnKSAmJiBzY3JpcHRbaW5kZXggKyAxXSA9PT0gY2hhcmFjdGVyKSBpbmRleCsrO1xuICAgICAgLy8gQSBuZXdsaW5lIHRoYXQgY2xvc2VzIGEgaGVyZWRvYyBoZWFkZXIgbGluZSBjb25zdW1lcyB0aGUgcXVldWVkIGJvZGllcyBiZWZvcmUgdGhlIG5leHRcbiAgICAgIC8vIGNvbW1hbmQuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxuJyAmJiBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMubGVuZ3RoID4gMCkgaW5kZXggPSBza2lwSGVyZWRvY0JvZGllcyhpbmRleCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJygnIHx8IGNoYXJhY3RlciA9PT0gJyknKSB7XG4gICAgICBlbmRUb2tlbigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICgvXFxzL3UudGVzdChjaGFyYWN0ZXIpKSB7XG4gICAgICBlbmRUb2tlbigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGN1cnJlbnQgKz0gY2hhcmFjdGVyO1xuICAgIGluVG9rZW4gPSB0cnVlO1xuICB9XG4gIGVuZFNlZ21lbnQoKTtcbiAgcmV0dXJuIHsgc2VnbWVudHMsIHNhd0hlcmVkb2MgfTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVwbG95IHNjcmlwdCBpbnZva2VzIGB3YiDigKYgZGVwbG95YCBhdCBjb21tYW5kIHBvc2l0aW9uLiBFbnYgYXNzaWdubWVudHMsIHBhY2thZ2VcbiAqIHJ1bm5lcnMsIGFuZCBnbG9iYWwgeWFyZ3Mgb3B0aW9ucyAod2l0aCB0aGVpciB2YWx1ZSB0b2tlbnMpIG1heSBwcmVjZWRlIHRoZSBkZXBsb3kgY29tbWFuZDtcbiAqIHNoZWxsIHF1b3RpbmcsIGVzY2FwaW5nLCBjb21tZW50cywgYW5kIGdyb3VwaW5nIGFyZSBob25vcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlc1diRGVwbG95KGRlcGxveVNjcmlwdDogc3RyaW5nLCBzY3JpcHROYW1lczogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICBjb25zdCB7IHNlZ21lbnRzLCBzYXdIZXJlZG9jIH0gPSB0b2tlbml6ZVNoZWxsQ29tbWFuZChkZXBsb3lTY3JpcHQpO1xuICAvLyBBIGhlcmVkb2MgbWFrZXMgYm9keS12cy1jb21tYW5kIGNsYXNzaWZpY2F0aW9uIHVucmVsaWFibGUgKHNlZSB0b2tlbml6ZVNoZWxsQ29tbWFuZCkuXG4gIGlmIChzYXdIZXJlZG9jKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3QgdG9rZW5zIG9mIHNlZ21lbnRzKSB7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmIC9eW0EtWmEtel9dW0EtWmEtejAtOV9dKj0vdS50ZXN0KHRva2Vuc1tpbmRleF0gPz8gJycpKSBpbmRleCsrO1xuICAgIC8vIExlYWRpbmcgbGF1bmNoZXJzIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBlbnZgICh3aXRoIG9wdGlvbnMgKyBLRVk9dmFsdWUgYXNzaWdubWVudHMpXG4gICAgLy8gYW5kIHRoZSBQT1NJWCBgY29tbWFuZGAgYnVpbHRpbiAod2l0aCBpdHMgYC1wYC9gLXZgL2AtVmAgb3B0aW9ucykuIENvbW1hbmQtcG9zaXRpb24gc2hlbGxcbiAgICAvLyByZXNlcnZlZCB3b3JkcyBhbmQgb3RoZXIgbGF1bmNoZXJzIChgaWZgL2B0aGVuYC9gZm9yYC9gdGltZWAvYGV4ZWNgL2AhYC9icmFjZSBncm91cHMsIOKApikgYXJlXG4gICAgLy8gTk9UIG1vZGVsZWQ6IHRoZXkgbGVhdmUgYSBub24tYHdiYCBmaXJzdCB0b2tlbiwgc28gdGhlIHNlZ21lbnQgc2ltcGx5IGRvZXMgbm90IG1hdGNoLiBUaGlzIGlzXG4gICAgLy8gYSBkZWxpYmVyYXRlIGZhbHNlLW5lZ2F0aXZlIGZvciBnZW5lcmF0ZWQgZ3VpZGFuY2UuXG4gICAgaWYgKHRva2Vuc1tpbmRleF0gPT09ICdlbnYnKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgICAgIGlmICgvXltBLVphLXpfXVtBLVphLXowLTlfXSo9L3UudGVzdCh0b2tlbikpIGluZGV4Kys7XG4gICAgICAgIC8vIGVudidzIGRpcmVjdG9yeSB2YWx1ZSBtYXkgYmUgc2VwYXJhdGUgb3IgYXR0YWNoZWQgKGAtQ2RpcmAsIGAtLWNoZGlyPWRpcmApLiBJdCBjaGFuZ2VzXG4gICAgICAgIC8vIHdoZXJlIHdiIHJ1bnMgYnV0IG5vdCB3aGV0aGVyIHRoZSBjb21tYW5kIGludm9rZXMgd2IgZGVwbG95LlxuICAgICAgICBlbHNlIGlmICh0b2tlbiA9PT0gJy1DJyB8fCB0b2tlbiA9PT0gJy0tY2hkaXInKSBpbmRleCArPSAyO1xuICAgICAgICBlbHNlIGlmICh0b2tlbi5zdGFydHNXaXRoKCctQycpIHx8IHRva2VuLnN0YXJ0c1dpdGgoJy0tY2hkaXI9JykpIGluZGV4Kys7XG4gICAgICAgIGVsc2UgaWYgKHRva2VuID09PSAnLXUnKSBpbmRleCArPSAyO1xuICAgICAgICBlbHNlIGlmICh0b2tlbi5zdGFydHNXaXRoKCctJykpIGluZGV4Kys7XG4gICAgICAgIGVsc2UgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGBjb21tYW5kIENNRGAgZXhlY3V0ZXMgQ01ELCBidXQgYGNvbW1hbmQgLXZgL2AtViBDTURgIG9ubHkgUVVFUlkgaXRzIGF2YWlsYWJpbGl0eSB3aXRob3V0XG4gICAgLy8gcnVubmluZyBpdCwgc28gYSBkZXBsb3kgYmVoaW5kIHRoZW0gZG9lcyBub3QgcnVuLiBUaGUgYHZgL2BWYCBmbGFnIG1heSBiZSBjbHVzdGVyZWQgd2l0aFxuICAgIC8vIG90aGVyIG9wdGlvbiBsZXR0ZXJzIChgY29tbWFuZCAtcHYgd2JgKSwgc28gbWF0Y2ggYW55IG9wdGlvbiBsZXR0ZXIgY2x1c3RlciBjb250YWluaW5nIGl0LlxuICAgIHdoaWxlICh0b2tlbnNbaW5kZXhdID09PSAnY29tbWFuZCcpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICBsZXQgcXVlcmllc09ubHkgPSBmYWxzZTtcbiAgICAgIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGggJiYgKHRva2Vuc1tpbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICBpZiAoL14tW0EtWmEtel0qW3ZWXVtBLVphLXpdKiQvdS50ZXN0KHRva2Vuc1tpbmRleF0gPz8gJycpKSBxdWVyaWVzT25seSA9IHRydWU7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgICBpZiAocXVlcmllc09ubHkpIHtcbiAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbmRleCA8IDApIGNvbnRpbnVlO1xuICAgIC8vIFJlc29sdmUgYSBydW5uZXIgcHJlZml4IHRvIHdoZXRoZXIgdGhlIGZvbGxvd2luZyB0b2tlbiBpcyBhIEJJTkFSWSAodGhlIHdiIGV4ZWN1dGFibGUpIG9yIGFcbiAgICAvLyBwYWNrYWdlIFNDUklQVCBuYW1lLiBgYnVueGAvYG5weGAgYW5kIGA8cG0+IHh8ZGx4fGV4ZWNgIHJ1biBhIGJpbmFyeTsgYDxwbT4gcnVufHJ1bi1zY3JpcHRgXG4gICAgLy8gKGFuZCBiYXJlIGBucG0gPG5hbWU+YCwgb3IgYW55IHJ1bm5lciBmb2xsb3dlZCBieSBgLS1gKSBydW4gYSBwYWNrYWdlIHNjcmlwdCDigJQgc29cbiAgICAvLyBgbnBtIHJ1biB3YiBkZXBsb3lgIGV4ZWN1dGVzIHRoZSBzY3JpcHQgbmFtZWQgYHdiYCwgbm90IHRoZSB3YiBiaW5hcnksIGFuZCBtdXN0IGJlIHJlamVjdGVkLlxuICAgIGlmIChbJ25wbScsICdwbnBtJywgJ3lhcm4nLCAnYnVuJ10uaW5jbHVkZXModG9rZW5zW2luZGV4XSA/PyAnJykpIHtcbiAgICAgIGNvbnN0IHJ1bm5lciA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgICBpbmRleCA9IHNraXBSdW5uZXJPcHRpb25zKHRva2VucywgaW5kZXggKyAxKTtcbiAgICAgIGNvbnN0IHN1YmNvbW1hbmQgPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgaWYgKFsncnVuJywgJ3J1bi1zY3JpcHQnXS5pbmNsdWRlcyhzdWJjb21tYW5kKSkgY29udGludWU7IC8vIHJ1bnMgYSBwYWNrYWdlIHNjcmlwdCwgbm90IHdiXG4gICAgICAvLyBFeGVjdXRvciBzdWJjb21tYW5kcyBhcmUgcnVubmVyLVNQRUNJRklDOiBidW4gcmVzZXJ2ZXMgb25seSBgeGAgKGBidW4gZGx4YC9gYnVuIGV4ZWNgIHJ1biBhXG4gICAgICAvLyBwYWNrYWdlIHNjcmlwdCBuYW1lZCBkbHgvZXhlYykuIFJlYWwgYnVpbHQtaW4gZXhlY3V0b3JzIChgZXhlY2AvYHhgLCBhbmQgYGRseGAgZm9yIHBucG0pXG4gICAgICAvLyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBhIHNhbWUtbmFtZWQgc2NyaXB0LCBzbyB0aGV5IGFyZSBOT1Qgc2hhZG93LWNoZWNrZWQuIE9ubHkgYHlhcm4gZGx4YCBpc1xuICAgICAgLy8gYW1iaWd1b3VzIOKAlCBhIEJlcnJ5IGJ1aWx0LWluIGJ1dCBhIHBhY2thZ2UgU0NSSVBUIGluIFlhcm4gQ2xhc3NpYyDigJQgc28gYSBkZWNsYXJlZCBgZGx4YFxuICAgICAgLy8gc2NyaXB0IG1ha2VzIGB5YXJuIGRseGAgZGVjbGluZSAoZmFsbCB0aHJvdWdoIHRvIHRoZSBwYWNrYWdlLXNjcmlwdCBjaGVja3MpLlxuICAgICAgY29uc3QgaXNZYXJuRGx4U2hhZG93ZWRCeVNjcmlwdCA9IHJ1bm5lciA9PT0gJ3lhcm4nICYmIHN1YmNvbW1hbmQgPT09ICdkbHgnICYmIHNjcmlwdE5hbWVzLmhhcygnZGx4Jyk7XG4gICAgICBpZiAocnVubmVyRXhlY3V0b3JTdWJjb21tYW5kc0J5UnVubmVyW3J1bm5lcl0/LmhhcyhzdWJjb21tYW5kKSAmJiAhaXNZYXJuRGx4U2hhZG93ZWRCeVNjcmlwdCkge1xuICAgICAgICBpbmRleCsrOyAvLyBiaW5hcnkgcnVubmVyIChwbnBtIGRseCwgYnVuIHgsIGBucG0gZXhlYyAtLSB3YiDigKZgKVxuICAgICAgICBpZiAodG9rZW5zW2luZGV4XSA9PT0gJy0tJykgaW5kZXgrKzsgLy8gdGhlIGV4ZWN1dG9yJ3Mgb3B0aW9uYWwgYC0tYCBiZWZvcmUgdGhlIGNvbW1hbmRcbiAgICAgIH0gZWxzZSBpZiAocnVubmVyID09PSAnbnBtJykge1xuICAgICAgICBjb250aW51ZTsgLy8gYmFyZSBgbnBtIHdiYCBuZXZlciBydW5zIGEgYmluYXJ5XG4gICAgICB9IGVsc2UgaWYgKHRva2Vuc1tpbmRleF0gPT09ICd3YicgJiYgc2NyaXB0TmFtZXMuaGFzKCd3YicpKSB7XG4gICAgICAgIC8vIEJhcmUgYGJ1bi9wbnBtL3lhcm4gd2JgIHJ1bnMgYSBwYWNrYWdlIFNDUklQVCBuYW1lZCBgd2JgIHdoZW4gb25lIGV4aXN0cyAocGFzc2luZyBgZGVwbG95YFxuICAgICAgICAvLyBhcyBpdHMgYXJndW1lbnQpLCBub3QgdGhlIHdiIGJpbmFyeS5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChbJ2J1bngnLCAnbnB4J10uaW5jbHVkZXModG9rZW5zW2luZGV4XSA/PyAnJykpIHtcbiAgICAgIGluZGV4ID0gc2tpcFJ1bm5lck9wdGlvbnModG9rZW5zLCBpbmRleCArIDEpO1xuICAgIH1cbiAgICBpZiAodG9rZW5zW2luZGV4XSAhPT0gJ3diJykgY29udGludWU7XG4gICAgY29uc3Qgd2JBcmdzID0gdG9rZW5zLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgLy8gU2tpcCBnbG9iYWwgb3B0aW9ucyAoYW5kIGFueSB2YWx1ZSB0b2tlbiBhIHZhbHVlLWJlYXJpbmcgb3B0aW9uIGNvbnN1bWVzKSBzbyB0aGUgRklSU1RcbiAgICAvLyBjb21tYW5kIHRva2VuIGRlY2lkZXM6IGB3YiAtLWNhc2NhZGUtZW52IHByb2R1Y3Rpb24gZGVwbG95YCBhbmQgYHdiIC13IHBhY2thZ2VzL2FwaSBkZXBsb3lgXG4gICAgLy8gbWF0Y2gsIHdoaWxlIHN1YmNvbW1hbmRzIG93bmluZyB0aGVpciBvd24gYGRlcGxveWAgKGB3YiBwcmlzbWEgZGVwbG95YCwgYHdiIHJldHJ5IGRlcGxveWApXG4gICAgLy8gZG8gbm90LiBgLS1vcHQ9dmFsdWVgIGNhcnJpZXMgaXRzIHZhbHVlIGlubGluZSwgc28gb25seSB0aGUgc3BhY2Utc2VwYXJhdGVkIGZvcm0gc2tpcHMgb25lLlxuICAgIGxldCBjb21tYW5kSW5kZXggPSAwO1xuICAgIHdoaWxlIChjb21tYW5kSW5kZXggPCB3YkFyZ3MubGVuZ3RoICYmICh3YkFyZ3NbY29tbWFuZEluZGV4XSA/PyAnJykuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICBjb25zdCBmbGFnID0gd2JBcmdzW2NvbW1hbmRJbmRleF0gPz8gJyc7XG4gICAgICBjb21tYW5kSW5kZXgrKztcbiAgICAgIGlmICh3Ykdsb2JhbFZhbHVlT3B0aW9ucy5oYXMoZmxhZykgJiYgY29tbWFuZEluZGV4IDwgd2JBcmdzLmxlbmd0aCkgY29tbWFuZEluZGV4Kys7XG4gICAgfVxuICAgIGlmICh3YkFyZ3NbY29tbWFuZEluZGV4XSAhPT0gJ2RlcGxveScpIGNvbnRpbnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSB3b3JrZmxvd3MgZGlyZWN0b3J5IGhvbGRzIGEgbGl2ZSBjYWxsZXIgb2YgdGhlIHJldXNhYmxlIENsb3VkZmxhcmUgZGVwbG95IHdvcmtmbG93LlxuICogWUFNTCBpcyBwYXJzZWQgYW5kIG9ubHkgYGpvYnMuKi51c2VzYCB2YWx1ZXMgYXJlIGluc3BlY3RlZCAoYSByYXctdGV4dCBzZWFyY2ggd291bGQgbWF0Y2hcbiAqIGNvbW1lbnRzIG9yIGBydW46YCBzdHJpbmdzKSwgd2l0aCBhIGBkZXBsb3kqYC1maWxlbmFtZSBzaG9ydGN1dCBhbmQgYSBjb25zZXJ2YXRpdmUgcmF3LXRleHRcbiAqIGZhbGxiYWNrIGZvciB1bnBhcnNlYWJsZSBmaWxlcy4gVXNlZCBieSB0aGUgYWdlbnQtaW5zdHJ1Y3Rpb24gZ2VuZXJhdG9yIHNvIGdlbmVyYXRlZCBndWlkYW5jZVxuICogZGVzY3JpYmVzIG9ubHkgd29ya2Zsb3dzIHRoYXQgZXhpc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3cod29ya2Zsb3dzRGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBlbnRyaWVzOiBmcy5EaXJlbnRbXTtcbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMod29ya2Zsb3dzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZSBvd25lci9yZXBvc2l0b3J5IChHaXRIdWIgdHJlYXRzIHRoZW0gc28pLCBjYXNlLXNlbnNpdGl2ZSBwYXRoL3JlZiDigJQgbWF0Y2hpbmdcbiAgLy8gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCwgdXNlZCBmb3IgdGhlIHVucGFyc2VhYmxlLVlBTUwgcmF3LXRleHQgZmFsbGJhY2sgb25seS5cbiAgY29uc3QgZGVwbG95Q2FsbFBhdHRlcm4gPSAvW14vXStcXC9yZXVzYWJsZS13b3JrZmxvd3NcXC9cXC5naXRodWJcXC93b3JrZmxvd3NcXC9kZXBsb3lcXC55YT9tbEAvaXU7XG4gIGNvbnN0IGNhbGxzRGVwbG95V29ya2Zsb3cgPSAodXNlczogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PlxuICAgIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwodXNlcyk/LndvcmtmbG93TmFtZSA9PT0gJ2RlcGxveSc7XG4gIHJldHVybiBlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiB7XG4gICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhL1xcLnlhP21sJC91LnRlc3QoZW50cnkubmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgcmV0dXJuIHRydWU7XG4gICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzRGlyUGF0aCwgZW50cnkubmFtZSksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCB3b3JrZmxvdyA9IHlhbWwubG9hZChjb250ZW50KSBhcyBXb3JrZmxvdyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh3b3JrZmxvdyAmJiB0eXBlb2Ygd29ya2Zsb3cgPT09ICdvYmplY3QnICYmIHdvcmtmbG93LmpvYnMgJiYgdHlwZW9mIHdvcmtmbG93LmpvYnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHdvcmtmbG93LmpvYnMpLnNvbWUoKGpvYikgPT4gY2FsbHNEZXBsb3lXb3JrZmxvdyhqb2I/LnVzZXMpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBkZXBsb3lDYWxsUGF0dGVybi50ZXN0KGNvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIFRoZSByZXVzYWJsZSB3b3JrZmxvd3MgdGhhdCBkZWNsYXJlIEZOT1hfQUdFX0tFWSBhbmQgVkVSREFDQ0lPX1RPS0VOIHVuZGVyXG4vLyBvbi53b3JrZmxvd19jYWxsLnNlY3JldHMgKHNlZSBXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MpLiBQYXNzaW5nIGVpdGhlciBzZWNyZXQgdG8gYW55XG4vLyBvdGhlciBjYWxsZWUgaXMgYSBHaXRIdWIgZXJyb3IuXG5jb25zdCBpbnN0YWxsQ2FwYWJsZVJldXNhYmxlV29ya2Zsb3dzID0gbmV3IFNldChbJ2RlcGxveScsICdyZWxlYXNlJywgJ3J1bi1zY3JpcHQnLCAndGVzdCddKTtcbmNvbnN0IHJldXNhYmxlV29ya2Zsb3dQZXJtaXNzaW9uczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7XG4gIC8vIHNraXAtZHVwbGljYXRlLWFjdGlvbnMgcmVhZHMgd29ya2Zsb3cgcnVuczsgY2FuY2VsX290aGVycyBpcyBmYWxzZSwgc28gcmVhZCBpcyBlbm91Z2guXG4gICd0ZXN0LXJ1c3QnOiB7IGFjdGlvbnM6ICdyZWFkJywgY29udGVudHM6ICdyZWFkJyB9LFxuICAnc2VtYW50aWMtcHInOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLCBzdGF0dXNlczogJ3dyaXRlJyB9LFxuICAnY2xvc2UtY29tbWVudCc6IHsgJ3B1bGwtcmVxdWVzdHMnOiAnd3JpdGUnIH0sXG59O1xuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgLy8gYHNlY3JldHM6IGluaGVyaXRgIChwYXJzZWQgYnkganMteWFtbCBhcyBhIHBsYWluIHN0cmluZykgYWxyZWFkeSBmb3J3YXJkcyBldmVyeSBjYWxsZXIgc2VjcmV0XG4gIC8vIGluY2x1ZGluZyB0aGUgb25lcyBpbmplY3RlZCBiZWxvdywgc28gcHJlc2VydmUgaXQgdW50b3VjaGVkIOKAlCBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvbiB0aGVcbiAgLy8gc3RyaW5nIHdvdWxkIHRocm93LiBDYXZlYXQ6IGBpbmhlcml0YCBmb3J3YXJkcyBzZWNyZXRzIHVuZGVyIHRoZWlyIGV4aXN0aW5nIE5BTUVTLCBzbyBpdCBjYW5cbiAgLy8gbmV2ZXIgZmVlZCBQVUJMSUNfRk5PWF9BR0VfS0VZIGludG8gdGhlIGNhbGxlZSdzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWTsgYSBoYW5kLXdyaXR0ZW5cbiAgLy8gaW5oZXJpdCBjYWxsZXIgaW4gYSBQVUJMSUMgZm5veCByZXBvc2l0b3J5IG11c3QgYmUgY29udmVydGVkIHRvIGFuIGV4cGxpY2l0IG1hcHBpbmcgbWFudWFsbHlcbiAgLy8gKHdiZnkgbmV2ZXIgZ2VuZXJhdGVzIHRoZSBpbmhlcml0IGZvcm0sIGFuZCBoYW5kLXdyaXR0ZW4gZGV2aWF0aW9ucyBhcmUgZml4ZWQgaW4gdGhlIHRhcmdldFxuICAvLyByZXBvc2l0b3J5IGJ5IHBvbGljeSkuXG4gIGNvbnN0IHNlY3JldHMgPSBqb2Iuc2VjcmV0cyA9PT0gJ2luaGVyaXQnID8gdW5kZWZpbmVkIDogKGpvYi5zZWNyZXRzID0gam9iLnNlY3JldHMgPz8ge30pO1xuXG4gIGlmIChzZWNyZXRzICYmIChraW5kID09PSAndGVzdCcgfHwga2luZCA9PT0gJ3JlbGVhc2UnKSkge1xuICAgIHNlY3JldHMuR0hfVE9LRU4gPSAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JztcbiAgfVxuXG4gIC8vIGZub3gudG9tbCBjYXJyaWVzIGFnZS1lbmNyeXB0ZWQgYXBwIHNlY3JldHM7IENJIGRlY3J5cHRzIHRoZW0gd2l0aCB0aGUgRk5PWF9BR0VfS0VZIChvciwgZm9yXG4gIC8vIHB1YmxpYyByZXBvc2l0b3JpZXMsIFBVQkxJQ19GTk9YX0FHRV9LRVkpIG9yZ2FuaXphdGlvbiBzZWNyZXQuXG4gIC8vIEtleSB0aGUgaW5qZWN0aW9uIG9uIHRoZSAqY2FsbGVkKiByZXVzYWJsZSB3b3JrZmxvdywgbm90IHRoZSBjYWxsZXIncyBmaWxlbmFtZTogY2FsbGVycyBtYXkgaGF2ZVxuICAvLyBhcmJpdHJhcnkgbmFtZXMgKGUuZy4gc2NoZWR1bGVkIHJ1bi1zY3JpcHQgY2FsbGVycyksIGFuZCBHaXRIdWIgcmVqZWN0cyBwYXNzaW5nIGEgc2VjcmV0IHRoYXQgdGhlXG4gIC8vIGNhbGxlZSBkb2VzIG5vdCBkZWNsYXJlLlxuICAvLyBPbmx5IGFuIEBtYWluIGNhbGxlZSBpcyBrbm93biB0byBmb2xsb3cgdGhlIGN1cnJlbnQgc2VjcmV0IGNvbnRyYWN0OiBhIHdvcmtmbG93IHBpbm5lZCB0byBhblxuICAvLyBvbGRlciB0YWcgb3IgU0hBIG1heSBzdGlsbCBkZWNsYXJlIE5QTV9UT0tFTiAoYW5kIG5vdCBWRVJEQUNDSU9fVE9LRU4pLCBhbmQgR2l0SHViIHJlamVjdHMgYVxuICAvLyBjYWxsZXIgd2hvc2Ugc2VjcmV0cyBkbyBub3QgbWF0Y2ggdGhlIHNlbGVjdGVkIHJldmlzaW9uJ3MgZGVjbGFyYXRpb25zLCBzbyBwaW5uZWQgY2FsbGVycyBrZWVwXG4gIC8vIHRoZWlyIHNlY3JldHMgdW50b3VjaGVkLlxuICBjb25zdCBvcmdXb3JrZmxvd0NhbGwgPSBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKTtcbiAgY29uc3QgY2FsbGVkUmV1c2FibGVXb3JrZmxvdyA9IG9yZ1dvcmtmbG93Q2FsbD8ucmVmID09PSAnbWFpbicgPyBvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXF1aXJlZFBlcm1pc3Npb25zID0gY2FsbGVkUmV1c2FibGVXb3JrZmxvdyA/IHJldXNhYmxlV29ya2Zsb3dQZXJtaXNzaW9uc1tjYWxsZWRSZXVzYWJsZVdvcmtmbG93XSA6IHVuZGVmaW5lZDtcbiAgaWYgKHJlcXVpcmVkUGVybWlzc2lvbnMpIGpvYi5wZXJtaXNzaW9ucyA9IHsgLi4ucmVxdWlyZWRQZXJtaXNzaW9ucyB9O1xuICBpZiAoc2VjcmV0cyAmJiBjYWxsZWRSZXVzYWJsZVdvcmtmbG93ICYmIGluc3RhbGxDYXBhYmxlUmV1c2FibGVXb3JrZmxvd3MuaGFzKGNhbGxlZFJldXNhYmxlV29ya2Zsb3cpKSB7XG4gICAgLy8gVGhlIGNhbGxlZSByb3V0ZXMgcHVibGljIChkZWZhdWx0LXJlZ2lzdHJ5KSBpbnN0YWxscyB0aHJvdWdoIHRoZSBUYWt1bWkgR3VhcmRcbiAgICAvLyBtYWxpY2lvdXMtcGFja2FnZS1ibG9ja2luZyBwcm94eSB3aGVuIHRoaXMgdG9rZW4gcmVzb2x2ZXM7IGFuIHVuc2V0IG9yZ2FuaXphdGlvbiBzZWNyZXRcbiAgICAvLyBleHBhbmRzIHRvICcnIGFuZCB0aGUgY2FsbGVlIHRyZWF0cyB0aGF0IGFzIFwiZmVhdHVyZSBvZmZcIiwgc28gcGFzc2luZyBpdCBpcyBhbHdheXMgc2FmZS5cbiAgICBzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiA9ICcke3sgc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gfX0nO1xuICAgIC8vIFRoZSBjYWxsZWUgZ2VuZXJhdGVzIHRoZSB3b3Jrc3BhY2UgLm5wbXJjIGZvciBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qIGZyb20gVkVSREFDQ0lPX1RPS0VOXG4gICAgLy8gYmVmb3JlIGluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLiBPbmx5IHJlcG9zaXRvcmllcyB0aGF0IGFjdHVhbGx5IHJlc29sdmUgcHJpdmF0ZSBwYWNrYWdlc1xuICAgIC8vIChvciBwdWJsaXNoIHRvIFZlcmRhY2NpbykgZ2V0IHRoZSBwYXNzLXRocm91Z2g6IGV2ZXJ5d2hlcmUgZWxzZSB0aGUgY3JlZGVudGlhbCB3b3VsZCBmbG93XG4gICAgLy8gaW50byBDSSBydW5zIHRoYXQgbmV2ZXIgdXNlIGl0LCBzbyB0aGUgbGluZSBpcyByZW1vdmVkIGluc3RlYWQuIFRoZSBHaXRIdWIgc2VjcmV0IGl0c2VsZiBpc1xuICAgIC8vIGFsd2F5cyByZWdpc3RlcmVkIG1hbnVhbGx5IGFuZCBzdGF5cyByZWdpc3RlcmVkIGVpdGhlciB3YXkuXG4gICAgaWYgKHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyhjb25maWcpKSB7XG4gICAgICBzZWNyZXRzLlZFUkRBQ0NJT19UT0tFTiA9ICcke3sgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU4gfX0nO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU47XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKSkge1xuICAgICAgLy8gUHVibGljIHJlcG9zaXRvcmllcyBjb21taXQgd29ybGQtcmVhZGFibGUgY2lwaGVydGV4dHMsIHNvIHRoZXkgZGVjcnlwdCB3aXRoIGEgZGVkaWNhdGVkXG4gICAgICAvLyBDSSBpZGVudGl0eSAodGhlIFBVQkxJQ19GTk9YX0FHRV9LRVkgb3JnYW5pemF0aW9uIHNlY3JldCkgaW5zdGVhZCBvZiB0aGUgb3JnLWludGVybmFsXG4gICAgICAvLyBvbmU7IHRoZSBjYWxsZWUgc3RpbGwgcmVjZWl2ZXMgaXQgdW5kZXIgaXRzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWSBuYW1lLiBXaGVuIG5vIENJXG4gICAgICAvLyBpZGVudGl0eSByZXNvbHZlcyAoc2VlIGZub3hBZ2VLZXlNYXBwaW5nKSwgbGVhdmUgYW55IGV4aXN0aW5nIG1hcHBpbmcgdW50b3VjaGVkIGFuZCBhZGRcbiAgICAgIC8vIG5vbmU6IGNyZWF0aW5nIG9yIHJld3JpdGluZyBvbmUgb24gaW5jb21wbGV0ZSBpbmZvcm1hdGlvbiB3b3VsZCBtYXAgYSBwb3NzaWJseS1wdWJsaWNcbiAgICAgIC8vIHJlcG9zaXRvcnkgdG8gdGhlIHdyb25nIGlkZW50aXR5LCBhbmQgYSBmbm94IHJlY2lwaWVudCBzeW5jIGZhaWx1cmUgZG9lcyBub3Qgc3RvcCB0aGlzXG4gICAgICAvLyBnZW5lcmF0b3IgZnJvbSB3cml0aW5nIGZpbGVzIOKAlCB0aGUgZmFpbGVkIHJ1bidzIHJlcnVuIGZpbGxzIHRoZSBtYXBwaW5nIGluLlxuICAgICAgY29uc3QgbWFwcGluZyA9IGZub3hBZ2VLZXlNYXBwaW5nKGNvbmZpZyk7XG4gICAgICBpZiAobWFwcGluZykge1xuICAgICAgICBzZWNyZXRzLkZOT1hfQUdFX0tFWSA9IG1hcHBpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChraW5kID09PSAndGVzdC1ydXN0Jykge1xuICAgIGNvbnN0IFtydXN0RGlyUGF0aF0gPSBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHM7XG4gICAgaWYgKHJ1c3REaXJQYXRoICYmIHJ1c3REaXJQYXRoICE9PSAnLicpIHtcbiAgICAgIGpvYi53aXRoLndvcmtpbmdfZGlyZWN0b3J5ID0gcnVzdERpclBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iud2l0aC53b3JraW5nX2RpcmVjdG9yeTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWNvbnN0cnVjdCBmcm9tIHRoZSBwYXJzZWQgY2FsbCBzbyBhIGRpZmZlcmVudGx5IGNhc2VkIG93bmVyIChHaXRIdWIgaXMgY2FzZS1pbnNlbnNpdGl2ZVxuICAvLyB0aGVyZSkgaXMgYWxzbyBub3JtYWxpemVkIHRvIHRoZSByZXBvc2l0b3J5J3Mgb3duIG9yZ2FuaXphdGlvbiAvIG1pcnJvci5cbiAgaWYgKG9yZ1dvcmtmbG93Q2FsbCAmJiBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBgV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzLyR7b3JnV29ya2Zsb3dDYWxsLndvcmtmbG93TmFtZX0uJHtvcmdXb3JrZmxvd0NhbGwuZXh0ZW5zaW9ufUAke29yZ1dvcmtmbG93Q2FsbC5yZWZ9YDtcbiAgfSBlbHNlIGlmIChvcmdXb3JrZmxvd0NhbGwgJiYgY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gYFdpbGxCb29zdGVyTGFiL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy8ke29yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWV9LiR7b3JnV29ya2Zsb3dDYWxsLmV4dGVuc2lvbn1AJHtvcmdXb3JrZmxvd0NhbGwucmVmfWA7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSAmJiAham9iLndpdGguY2lfbGFiZWwgJiYga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9ICdsYXJnZSc7XG4gIH1cbiAgY29uc3QgYWNjZXB0c1J1bm5lcklucHV0ID0gWyd0ZXN0JywgJ3Rlc3QtcnVzdCcsICdkZXBsb3knLCAncmVsZWFzZScsICdydW4tc2NyaXB0J10uaW5jbHVkZXMoXG4gICAgb3JnV29ya2Zsb3dDYWxsPy53b3JrZmxvd05hbWUgPz8gJydcbiAgKTtcbiAgaWYgKGNvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24pIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbyAmJiBhY2NlcHRzUnVubmVySW5wdXQpIHtcbiAgICAgIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgam9iLndpdGgucnVuc19vbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBsYWJlbHMgPSB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAudHJhbnNmb3JtKCh2YWx1ZSwgY3R4KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKSBhcyB1bmtub3duO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgY3R4LmFkZElzc3VlKHsgY29kZTogJ2N1c3RvbScsIG1lc3NhZ2U6ICdFeHBlY3RlZCBKU09OIHJ1bm5lciBsYWJlbHMnIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHouTkVWRVI7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAucGlwZSh6LmFycmF5KHouc3RyaW5nKCkpKVxuICAgICAgICAuc2FmZVBhcnNlKGpvYi53aXRoLnJ1bnNfb24pO1xuICAgICAgaWYgKGxhYmVscy5zdWNjZXNzICYmIGxhYmVscy5kYXRhLmluY2x1ZGVzKCdzZWxmLWhvc3RlZCcpKSB7XG4gICAgICAgIGpvYi53aXRoLnJ1bnNfb24gPSBKU09OLnN0cmluZ2lmeShsYWJlbHMuZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFJlbW92ZWQgcnVuc19vbiBmcm9tICR7am9iLnVzZXN9OiBwcml2YXRlIHJlcG9zaXRvcmllcyByZXF1aXJlIGEgc2VsZi1ob3N0ZWQgbGFiZWwgYXJyYXkuYCk7XG4gICAgICAgIGRlbGV0ZSBqb2Iud2l0aC5ydW5zX29uO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKHNlY3JldHMpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKHNlY3JldHMpO1xuICAgICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGhlIHNlY3JldCBleHByZXNzaW9uIHRoZSBjYWxsZXIgbWFwcyBpbnRvIHRoZSBjYWxsZWUncyBkZWNsYXJlZCBGTk9YX0FHRV9LRVksIG9yIHVuZGVmaW5lZFxuICogd2hlbiB0aGUgcmVwb3NpdG9yeSBzdGF0ZSBkb2VzIG5vdCBpZGVudGlmeSBhIHVzYWJsZSBDSSBpZGVudGl0eSDigJQgYW4gdW5rbm93biB2aXNpYmlsaXR5LCBhXG4gKiByZXBvc2l0b3J5IG5vIENJIHNjb3BlIGNvdmVycyAoZGVyaXZpbmcgZnJvbSB0aGUgc2FtZSBwcmluY2lwYWwgcm9zdGVyIGFzIHRoZSByZWNpcGllbnQgc3luY1xuICoga2VlcHMgdGhlIHR3byBmcm9tIGV2ZXIgZGlzYWdyZWVpbmcpLCBvciBhIGZhaWxlZCBmbm94IHJlY2lwaWVudCBzeW5jLCB3aG9zZSBjaXBoZXJ0ZXh0cyBtYXlcbiAqIHN0aWxsIHRhcmdldCB0aGUgcHJldmlvdXMgaWRlbnRpdHkuIFRoZSBjYWxsZXIgbXVzdCB0aGVuIHByZXNlcnZlIGFueSBleGlzdGluZyBtYXBwaW5nLlxuICovXG5mdW5jdGlvbiBmbm94QWdlS2V5TWFwcGluZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24gfHwgaGFzRm5veFN5bmNGYWlsZWQoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgc2VjcmV0TmFtZSA9IHJlc29sdmVGbm94Q2lBZ2VLZXlTZWNyZXROYW1lKGNvbmZpZyk7XG4gIHJldHVybiBzZWNyZXROYW1lICYmIGBcXCR7eyBzZWNyZXRzLiR7c2VjcmV0TmFtZX0gfX1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEEgcGVybWlzc2lvbnMgb2JqZWN0IGVtcHRpZWQgYnkgdGhlIHBlci1raW5kIGRlbGV0aW9ucyAoZS5nLiBhbiBleGlzdGluZyB0ZXN0LXJ1c3QgY2FsbGVyXG4gIC8vIHdob3NlIG9ubHkgZW50cnkgd2FzIGBhY3Rpb25zYCkgbXVzdCBiZSBkcm9wcGVkIGVudGlyZWx5OiBgcGVybWlzc2lvbnM6IHt9YCBzdHJpcHMgRVZFUllcbiAgLy8gdG9rZW4gcGVybWlzc2lvbiBmcm9tIHRoZSB3b3JrZmxvdywgdW5saWtlIHRoZSBhYnNlbnQga2V5IHdoaWNoIGtlZXBzIHRoZSBkZWZhdWx0cy5cbiAgaWYgKG5ld1NldHRpbmdzLnBlcm1pc3Npb25zICYmIE9iamVjdC5rZXlzKG5ld1NldHRpbmdzLnBlcm1pc3Npb25zKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MucGVybWlzc2lvbnM7XG4gIH1cbiAgY29uc3QgeWFtbFRleHQgPSB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KTtcbiAgYXdhaXQgZnNVdGlsLndyaXRlRmlsZUNvbmZpbmVkKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyB9IGZyb20gJy4uL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cG9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhwYWNrYWdlQ29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGFja2FnZUNvbmZpZy5kaXJQYXRoO1xuICAgIGNvbnN0IGRvY0ZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZml4VHlwb3MgcnVucyBvbmNlIG9uIHRoZSByb290IGNvbmZpZywgc28gdGhpcyBnbG9iIHNldCBtdXN0IGNvdmVyIGV2ZXJ5IGRlY2xhcmVkIHdvcmtzcGFjZVxuICAgIC8vIGxheW91dCAoZS5nLiBhcHBzLyopLCBub3QganVzdCB0aGUgY29udmVudGlvbmFsIHBhY2thZ2VzLyogZGlyZWN0b3J5IOKAlCB3aGlsZSBob25vcmluZ1xuICAgIC8vIGRlY2xhcmVkIG5lZ2F0aW9ucyAoZS5nLiBgIWFwcHMvZXhjbHVkZWRgKSwgd2hvc2Ugc291cmNlcyBhcmUgbm90IHBhcnQgb2YgdGhlIG1vbm9yZXBvLlxuICAgIGNvbnN0IHdvcmtzcGFjZURpclBhdHRlcm5zID0gZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMocGFja2FnZUNvbmZpZyk7XG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgIC4uLndvcmtzcGFjZURpclBhdHRlcm5zLmluY2x1ZGVzLm1hcChcbiAgICAgICAgICAoZGlyUGF0dGVybikgPT4gYCR7ZGlyUGF0dGVybn0vKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH1gXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAge1xuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgICAgaWdub3JlOiBbLi4uZ2xvYklnbm9yZSwgLi4ud29ya3NwYWNlRGlyUGF0dGVybnMuZXhjbHVkZXMubWFwKChkaXJQYXR0ZXJuKSA9PiBgJHtkaXJQYXR0ZXJufS8qKmApXSxcbiAgICAgIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5Db2RlKG9sZENvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJblRleHQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFxiY1xcLmZcXC4oPz1cXHN8JCkvZywgJ2NmLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKD89XFxzfCQpL2csICdlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oPz1cXHMpL2csICdpLmUuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIGNvbnRlbnRcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csIChjb21tZW50KSA9PiBmaXhUeXBvc0luVGV4dChjb21tZW50KSlcbiAgICAgIC8vIFRoZSB3b3JkIGJvdW5kYXJ5IGFuZCB0cmFpbGluZy13aGl0ZXNwYWNlIGd1YXJkIGtlZXAgd29yZHMgbWVyZWx5IGVuZGluZyBpbiB0aGVcbiAgICAgIC8vIGFiYnJldmlhdGlvbiBsZXR0ZXJzIChlLmcuIFwiY29va2llLlwiLCBcImxlZy5cIikgaW50YWN0LlxuICAgICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KVxcYmNcXC5mXFwuKD89XFxzfCQpL2csICckMS8vJDJjZi4nKVxuICAgICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KVxcYmVnXFwuKD89XFxzfCQpL2csICckMS8vJDJlLmcuJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJpZVxcLig/PVxcc3wkKS9nLCAnJDEvLyQyaS5lLicpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IGNoaWxkUHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmNsYXNzIEdpdEh1YlV0aWwge1xuICBnZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVybFdpdGhvdXRQcm90b2NvbCA9IHVybE9yRnVsbE5hbWUuc3BsaXQoJzonKS5hdCgtMSk7XG4gICAgY29uc3QgbmFtZXMgPSB1cmxXaXRob3V0UHJvdG9jb2w/LnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgb3JnID0gbmFtZXM/LmF0KC0yKSA/PyAnJztcbiAgICAvLyBUaGUgZG90IG11c3QgYmUgZXNjYXBlZDogYW4gdW5lc2NhcGVkIGAuYCBtYXRjaGVzIEFOWSBjaGFyYWN0ZXIsIHNvIGBsZWdpdGAgbG9zdCBpdHMgYGxgIGFuZCBgZWAuXG4gICAgY29uc3QgbmFtZSA9IG5hbWVzPy5hdCgtMSk/LnJlcGxhY2UoL1xcLmdpdCQvdSwgJycpID8/ICcnO1xuICAgIHJldHVybiBbb3JnLCBuYW1lXTtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViVXRpbCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHN0YXR1cyA9IChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXM7XG4gIHJldHVybiBzdGF0dXMgPT09IDQwMSB8fCBzdGF0dXMgPT09IDQwMyB8fCBzdGF0dXMgPT09IDQwNDtcbn1cblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIC8vIEdpdEh1YiBvd25lciBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgc28gY3JlZGVudGlhbCBzZWxlY3Rpb24gKGFuZCB0aGUgY2FjaGUga2V5KSBtdXN0XG4gIC8vIG5vdCBkZXBlbmQgb24gaG93IGEgcmVtb3RlIFVSTCBoYXBwZW5zIHRvIHNwZWxsIHRoZSBvcmdhbml6YXRpb24uXG4gIGNvbnN0IGtleSA9IG93bmVyPy50b0xvd2VyQ2FzZSgpID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIENhc2UtaW5zZW5zaXRpdmUgb24gcHVycG9zZTogYSBub25jYW5vbmljYWxseSBjYXNlZCByZW1vdGUgKGUuZy4gZ2l0aHViLmNvbS93aWxsYm9vc3RlcmxhYi/igKYpXG4gIC8vIG11c3Qgc3RpbGwgc2VsZWN0IHRoZSBvcmdhbml6YXRpb24ncyBvd24gUEFUIOKAlCBmYWxsaW5nIHRocm91Z2ggdG8gdGhlIGdlbmVyaWMgYnJhbmNoIHdvdWxkXG4gIC8vIHByZWZlciB0aGUgT1RIRVIgb3JnYW5pemF0aW9uJ3MgUEFULCB3aGljaCBjYW5ub3QgcmVhZCB0aGlzIG9yZ2FuaXphdGlvbidzIHByaXZhdGVcbiAgLy8gcmVwb3NpdG9yaWVzLlxuICBjb25zdCBub3JtYWxpemVkT3duZXIgPSBvd25lcj8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKG5vcm1hbGl6ZWRPd25lciA9PT0gJ3dpbGxib29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIGlmIChub3JtYWxpemVkT3duZXIgPT09ICd3aWxsYm9vc3RlcmxhYicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUIgfHwgZ2V0R2l0SHViQ2xpVG9rZW4oKTtcbiAgfVxuICByZXR1cm4gKFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9UT0tFTiB8fFxuICAgIHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTiB8fFxuICAgIGdldEdpdEh1YkNsaVRva2VuKClcbiAgKTtcbn1cblxubGV0IGdpdEh1YkNsaVRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGdldEdpdEh1YkNsaVRva2VuKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChnaXRIdWJDbGlUb2tlbiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZ2l0SHViQ2xpVG9rZW4gfHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgLy8gU29tZSBsb2NhbCBydW5zIHJlbHkgb24gR2l0SHViIENMSSBhdXRoZW50aWNhdGlvbiBpbnN0ZWFkIG9mIGV4cG9ydGVkIGVudiB0b2tlbnMuXG4gICAgZ2l0SHViQ2xpVG9rZW4gPVxuICAgICAgY2hpbGRQcm9jZXNzXG4gICAgICAgIC5leGVjRmlsZVN5bmMoJ2doJywgWydhdXRoJywgJ3Rva2VuJ10sIHtcbiAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddLFxuICAgICAgICB9KVxuICAgICAgICAudHJpbSgpIHx8ICcnO1xuICB9IGNhdGNoIHtcbiAgICBnaXRIdWJDbGlUb2tlbiA9ICcnO1xuICB9XG4gIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhcnNlRXJyb3IgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuaW1wb3J0IHsgYXBwbHlFZGl0cywgY3JlYXRlU2Nhbm5lciwgZmluZE5vZGVBdExvY2F0aW9uLCBtb2RpZnksIHBhcnNlIGFzIHBhcnNlSnNvbmMsIHBhcnNlVHJlZSB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5cbi8vIGpzb25jLXBhcnNlciBkZWNsYXJlcyBTeW50YXhLaW5kL1NjYW5FcnJvciBhcyBhbWJpZW50IGNvbnN0IGVudW1zLCB3aGljaCBjYW5ub3QgYmUgaW1wb3J0ZWRcbi8vIHVuZGVyIHZlcmJhdGltTW9kdWxlU3ludGF4OyBtaXJyb3IgdGhlIG5lZWRlZCBtZW1iZXIgdmFsdWVzIGxvY2FsbHkuXG5jb25zdCBzeW50YXhLaW5kID0geyBsaW5lQ29tbWVudFRyaXZpYTogMTIsIGJsb2NrQ29tbWVudFRyaXZpYTogMTMsIGxpbmVCcmVha1RyaXZpYTogMTQsIHRyaXZpYTogMTUsIGVvZjogMTcgfTtcbmNvbnN0IHNjYW5FcnJvck5vbmUgPSAwO1xuXG5leHBvcnQgY29uc3QganNvbmNVdGlsID0ge1xuICAvKipcbiAgICogVGVsbHMgd2hldGhlciB0aGUgY29udGVudCBob2xkcyBubyBjb25maWd1cmF0aW9uIGF0IGFsbCDigJQgb25seSB3aGl0ZXNwYWNlLCBjb21wbGV0ZSBjb21tZW50cyxcbiAgICogYW5kL29yIGEgQk9NLiB0c2MgdHJlYXRzIHN1Y2ggYSB0c2NvbmZpZy5qc29uIGFzIGFuIGVtcHR5IGNvbmZpZywgc28gZ2VuZXJhdG9ycyBzaG91bGQgdHJlYXRcbiAgICogaXQgbGlrZSBhIG1pc3NpbmcgZmlsZSAoYW5kIGdlbmVyYXRlIGRlZmF1bHRzKSBpbnN0ZWFkIG9mIHJlZnVzaW5nIHRvIG1hbmFnZSBpdC4gTGV4aWNhbGx5XG4gICAqIGJyb2tlbiB0cml2aWEgKGUuZy4gYW4gdW50ZXJtaW5hdGVkIGJsb2NrIGNvbW1lbnQpIGlzIE5PVCB0cml2aWEtb25seTogdGhlIGZpbGUgbXVzdCBiZSBsZWZ0XG4gICAqIHVudG91Y2hlZCByYXRoZXIgdGhhbiBvdmVyd3JpdHRlbiB3aXRoIGRlZmF1bHRzLlxuICAgKi9cbiAgaXNUcml2aWFPbmx5KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNjYW5uZXIgPSBjcmVhdGVTY2FubmVyKGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJykpO1xuICAgIGZvciAobGV0IGtpbmQ6IG51bWJlciA9IHNjYW5uZXIuc2NhbigpOyBraW5kICE9PSBzeW50YXhLaW5kLmVvZjsga2luZCA9IHNjYW5uZXIuc2NhbigpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChzY2FubmVyLmdldFRva2VuRXJyb3IoKSBhcyBudW1iZXIpICE9PSBzY2FuRXJyb3JOb25lIHx8XG4gICAgICAgIChraW5kICE9PSBzeW50YXhLaW5kLmxpbmVDb21tZW50VHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC5ibG9ja0NvbW1lbnRUcml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLnRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQubGluZUJyZWFrVHJpdmlhKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8qKlxuICAgKiBQYXJzZXMgYSBKU09OQyAoSlNPTiB3aXRoIGNvbW1lbnRzKSBvYmplY3QgZnJvbSBjb25maWcgZmlsZXMgc3VjaCBhcyB0c2NvbmZpZy5qc29uLFxuICAgKiBweXJpZ2h0Y29uZmlnLmpzb24sIHJlbm92YXRlLmpzb24sIC52c2NvZGUvc2V0dGluZ3MuanNvbiwgYW5kIHdyYW5nbGVyLmpzb25jLlxuICAgKlxuICAgKiBqc29uYy1wYXJzZXIgaXMgZmF1bHQgdG9sZXJhbnQgYW5kIHJldHVybnMgYSBwYXJ0aWFsIG9iamVjdCBmb3IgbWFsZm9ybWVkIGlucHV0LCB3aGljaCBtdXN0XG4gICAqIG5vdCBiZSB0cmVhdGVkIGFzIHRoZSBmaWxlJ3MgY29uZmlndXJhdGlvbjsgcmVqZWN0IGFueSBwYXJzZSBlcnJvciBpbnN0ZWFkLiBBIGxlYWRpbmcgQk9NIGlzXG4gICAqIHN0cmlwcGVkIGJlY2F1c2UgVHlwZVNjcmlwdCBhY2NlcHRzIEJPTSdkIGNvbmZpZyBmaWxlcyB3aGlsZSBqc29uYy1wYXJzZXIgcmVwb3J0cyB0aGUgQk9NIGFzXG4gICAqIGEgcGFyc2UgZXJyb3IuIENhbGxlcnMgd2hvc2UgcmVhZGVyIHJlamVjdHMgdHJhaWxpbmcgY29tbWFzIHR1cm4gYGFsbG93VHJhaWxpbmdDb21tYWBcbiAgICogb2ZmIHNvIHN1Y2ggYSBmaWxlIGlzIHJlcG9ydGVkIGFzIG1hbGZvcm1lZCBoZXJlIHRvby5cbiAgICovXG4gIHBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxUIGV4dGVuZHMgb2JqZWN0Pihjb250ZW50OiBzdHJpbmcsIGFsbG93VHJhaWxpbmdDb21tYSA9IHRydWUpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXJzZUVycm9yczogUGFyc2VFcnJvcltdID0gW107XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUpzb25jKGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJyksIHBhcnNlRXJyb3JzLCB7IGFsbG93VHJhaWxpbmdDb21tYSB9KSBhcyBUIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBwYXJzZUVycm9ycy5sZW5ndGggPT09IDAgJiYgISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgPyB2YWx1ZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIC8qKiBUZWxscyB3aGV0aGVyIHRoZSBjb250ZW50IGNhcnJpZXMgYXQgbGVhc3Qgb25lIGNvbW1lbnQsIGkuZS4gY29udGVudCBKU09OLnN0cmluZ2lmeSB3b3VsZCBkcm9wLiAqL1xuICBjb250YWluc0NvbW1lbnQoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Nhbm5lciA9IGNyZWF0ZVNjYW5uZXIoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSk7XG4gICAgZm9yIChsZXQga2luZDogbnVtYmVyID0gc2Nhbm5lci5zY2FuKCk7IGtpbmQgIT09IHN5bnRheEtpbmQuZW9mOyBraW5kID0gc2Nhbm5lci5zY2FuKCkpIHtcbiAgICAgIC8vIEEgbGV4aWNhbCBlcnJvciBtZWFucyB0aGUgcmVtYWluaW5nIHRva2VucyBhcmUgdW5yZWxpYWJsZTsgcmVwb3J0IG5vIGNvbW1lbnQgcmF0aGVyIHRoYW5cbiAgICAgIC8vIGd1ZXNzaW5nLiBBIGNhbGxlciB0aGF0IG9ubHkgd2FybnMgYWJvdXQgZHJvcHBlZCBjb21tZW50cyBsb3NlcyBub3RoaW5nLCBhbmQgb25lIHRoYXRcbiAgICAgIC8vIHJlZnVzZXMgYSBjb21tZW50ZWQgZmlsZSBmb3IgYSBzdHJpY3QtSlNPTiByZWFkZXIgc3RpbGwgcmVqZWN0cyBzdWNoIGNvbnRlbnQgd2hlbiBpdFxuICAgICAgLy8gcGFyc2VzIGl0LlxuICAgICAgaWYgKChzY2FubmVyLmdldFRva2VuRXJyb3IoKSBhcyBudW1iZXIpICE9PSBzY2FuRXJyb3JOb25lKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoa2luZCA9PT0gc3ludGF4S2luZC5saW5lQ29tbWVudFRyaXZpYSB8fCBraW5kID09PSBzeW50YXhLaW5kLmJsb2NrQ29tbWVudFRyaXZpYSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYHNldHRpbmdzYCBpbnRvIGBvbGRDb250ZW50YCwgZWRpdGluZyBvbmx5IHRoZSB0b3AtbGV2ZWwgcHJvcGVydGllcyB3aG9zZSB2YWx1ZXNcbiAgICogY2hhbmdlZCBzbyB0aGUgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgb2YgYW4gZXhpc3RpbmcgZmlsZSBzdXJ2aXZlLiBDYWxsZXJzIG5ldmVyIGRyb3BcbiAgICogcHJvcGVydGllcyAoZ2VuZXJhdGVkIHNldHRpbmdzIGFyZSBtZXJnZWQgT04gVE9QIG9mIHRoZSBleGlzdGluZyBvbmVzKSwgc28gcmVtb3ZhbHMgYXJlIG5vdFxuICAgKiBoYW5kbGVkOiBhIHByb3BlcnR5IG1pc3NpbmcgZnJvbSBgc2V0dGluZ3NgIGlzIGxlZnQgdW50b3VjaGVkIHJhdGhlciB0aGFuIGRlbGV0ZWQuXG4gICAqXG4gICAqIFRyaXZpYS1vbmx5IGNvbnRlbnQga2VlcHMgaXRzIGNvbW1lbnRzIGFzIGEgaGVhZGVyIGFib3ZlIHRoZSBnZW5lcmF0ZWQgb2JqZWN0LCByYXRoZXIgdGhhblxuICAgKiBiZWluZyByZXBsYWNlZCBvdXRyaWdodCBvciBydW4gdGhyb3VnaCBtb2RpZnkoKSAod2hpY2ggd291bGQgbW92ZSB0aGUgb2JqZWN0IGluIGZyb250IG9mIHRoZW0pLlxuICAgKi9cbiAgc3RyaW5naWZ5UHJlc2VydmluZ1RyaXZpYShcbiAgICBvbGRDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHsgY29udGVudDogc3RyaW5nOyBrZXlzTG9zaW5nQ29tbWVudHM6IHN0cmluZ1tdIH0ge1xuICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7IGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpLCBrZXlzTG9zaW5nQ29tbWVudHM6IFtdIH07XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvbGRDb250ZW50KTtcbiAgICAvLyBEcm9wIGEgbGVhZGluZyBCT006IG1vZGlmeSgpIGluc2VydHMgdGhlIGdlbmVyYXRlZCBvYmplY3QgQkVGT1JFIGFueSBsZWFkaW5nIHRyaXZpYSwgd2hpY2hcbiAgICAvLyB3b3VsZCBsZWF2ZSB0aGUgQk9NIHN0cmFuZGVkIG1pZC1maWxlIHdoZXJlIGl0IGlzIGEgc3ludGF4IGVycm9yIHJhdGhlciB0aGFuIGFuIGlnbm9yZWQgbWFyay5cbiAgICBsZXQgY29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJyk7XG4gICAgaWYgKGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoY29udGVudCkpIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IGNvbnRlbnQudHJpbSgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogYCR7aGVhZGVyID8gaGVhZGVyICsgJ1xcbicgOiAnJ30ke0pTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpfWAsXG4gICAgICAgIGtleXNMb3NpbmdDb21tZW50czogW10sXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBtb2RpZnlPcHRpb25zID0geyBmb3JtYXR0aW5nT3B0aW9uczogZGV0ZWN0Rm9ybWF0dGluZ09wdGlvbnMoY29udGVudCkgfTtcbiAgICBjb25zdCBrZXlzTG9zaW5nQ29tbWVudHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbmV3RW50cmllczogW3N0cmluZywgdW5rbm93bl1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNldHRpbmdzKSkge1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSBvbGRTZXR0aW5ncz8uW2tleV07XG4gICAgICAvLyBDb21wYXJlIHNlcmlhbGl6ZWQgZm9ybXMgc28gZGVlcC1lcXVhbCB2YWx1ZXMgKGUuZy4gYSByZS1tZXJnZWQgYGV4dGVuZHNgIGFycmF5KSBkbyBub3RcbiAgICAgIC8vIHJld3JpdGUgdGhlIHByb3BlcnR5IGFuZCByZWZsb3cgaXRzIGZvcm1hdHRpbmcuXG4gICAgICBpZiAoSlNPTi5zdHJpbmdpZnkob2xkVmFsdWUpID09PSBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKG9sZFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3RW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gUmVwbGFjaW5nIGEgd2hvbGUgYXJyYXkgd291bGQgZGlzY2FyZCB0aGUgY29tbWVudHMgYmV0d2VlbiBpdHMgZWxlbWVudHMsIHNvIGdyb3cgaXQgd2l0aFxuICAgICAgLy8gcGVyLWVsZW1lbnQgaW5zZXJ0aW9ucyB3aGVuZXZlciB0aGUgbmV3IHZhbHVlIG9ubHkgYWRkcyB0byBpdC5cbiAgICAgIGNvbnN0IGluc2VydGlvbnMgPSBBcnJheS5pc0FycmF5KG9sZFZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IGZpbmRJbnNlcnRpb25zKG9sZFZhbHVlLCB2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IGluc2VydGlvbiBvZiBpbnNlcnRpb25zID8/IFtdKSB7XG4gICAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKFxuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgbW9kaWZ5KGNvbnRlbnQsIFtrZXksIGluc2VydGlvbi5pbmRleF0sIGluc2VydGlvbi52YWx1ZSwgeyAuLi5tb2RpZnlPcHRpb25zLCBpc0FycmF5SW5zZXJ0aW9uOiB0cnVlIH0pXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRlbnQgPSByZXN0b3JlVHJhaWxpbmdDb21tZW50KGNvbnRlbnQsIGtleSwgaW5zZXJ0aW9uLmluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnNlcnRpb25zKSBjb250aW51ZTtcbiAgICAgIC8vIFJld3JpdGluZyB0aGUgd2hvbGUgdmFsdWUgaXMgdGhlIG9ubHkgb3B0aW9uIGxlZnQgKHRoZSBuZXcgb25lIGRyb3BzIG9yIHJlb3JkZXJzIGVsZW1lbnRzKSxcbiAgICAgIC8vIGFuZCBpdCB0YWtlcyBhbnkgY29tbWVudCBuZXN0ZWQgaW5zaWRlIGl0IGFsb25nLiBSZXBvcnQgdGhhdCByYXRoZXIgdGhhbiBsb3NpbmcgaXQgcXVpZXRseS5cbiAgICAgIGNvbnN0IHJlcGxhY2VkVGV4dCA9IHZhbHVlVGV4dE9mKGNvbnRlbnQsIGtleSk7XG4gICAgICBpZiAocmVwbGFjZWRUZXh0ICE9PSB1bmRlZmluZWQgJiYganNvbmNVdGlsLmNvbnRhaW5zQ29tbWVudChyZXBsYWNlZFRleHQpKSBrZXlzTG9zaW5nQ29tbWVudHMucHVzaChrZXkpO1xuICAgICAgY29udGVudCA9IGFwcGx5RWRpdHMoY29udGVudCwgbW9kaWZ5KGNvbnRlbnQsIFtrZXldLCB2YWx1ZSwgbW9kaWZ5T3B0aW9ucykpO1xuICAgIH1cbiAgICAvLyBQcmVwZW5kIHJhdGhlciB0aGFuIGFwcGVuZCB0aGUgcHJvcGVydGllcyB0aGF0IGFyZSBuZXc6IGFwcGVuZGluZyBkZXRhY2hlcyBhIHRyYWlsaW5nXG4gICAgLy8gc2FtZS1saW5lIGNvbW1lbnQgZnJvbSB0aGUgbGFzdCBwcm9wZXJ0eSwgbGVhdmluZyBpdCB0byBkZXNjcmliZSB0aGUgZ2VuZXJhdGVkIHZhbHVlXG4gICAgLy8gaW5zdGVhZC4gSW5zZXJ0aW5nIGluIHJldmVyc2Uga2VlcHMgdGhlIG9yZGVyIHRoZSBzZXR0aW5ncyBkZWNsYXJlIHRoZW0gaW4uXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgbmV3RW50cmllcy50b1JldmVyc2VkKCkpIHtcbiAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKGNvbnRlbnQsIG1vZGlmeShjb250ZW50LCBba2V5XSwgdmFsdWUsIHsgLi4ubW9kaWZ5T3B0aW9ucywgZ2V0SW5zZXJ0aW9uSW5kZXg6ICgpID0+IDAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50LCBrZXlzTG9zaW5nQ29tbWVudHMgfTtcbiAgfSxcbn07XG5cbi8qKiBSZXR1cm5zIHRoZSBzb3VyY2UgdGV4dCBvZiBhIHRvcC1sZXZlbCBwcm9wZXJ0eSdzIHZhbHVlLCBjb21tZW50cyBhbmQgYWxsLiAqL1xuZnVuY3Rpb24gdmFsdWVUZXh0T2YoY29udGVudDogc3RyaW5nLCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJvb3QgPSBwYXJzZVRyZWUoY29udGVudCk7XG4gIGNvbnN0IG5vZGUgPSByb290ICYmIGZpbmROb2RlQXRMb2NhdGlvbihyb290LCBba2V5XSk7XG4gIHJldHVybiBub2RlICYmIGNvbnRlbnQuc2xpY2Uobm9kZS5vZmZzZXQsIG5vZGUub2Zmc2V0ICsgbm9kZS5sZW5ndGgpO1xufVxuXG4vLyBUaGUgd2hvbGUgc2FtZS1saW5lIGNvbW1lbnQgc2VxdWVuY2UsIG5vdCBqdXN0IHRoZSBmaXJzdCBvbmU6IGEgbGluZSBjb21tZW50IGVuZHMgaXQgKGl0IHJ1bnMgdG9cbi8vIHRoZSBuZXdsaW5lKSwgYnV0IGFueSBudW1iZXIgb2YgYmxvY2sgY29tbWVudHMgY2FuIHByZWNlZGUgaXQsIGFuZCBtb3Zpbmcgb25seSB0aGUgZmlyc3Qgd291bGRcbi8vIGxlYXZlIHRoZSByZXN0IGRlc2NyaWJpbmcgdGhlIHdyb25nIGVsZW1lbnQuXG5jb25zdCB0cmFpbGluZ0NvbW1lbnRQYXR0ZXJuID0gL14oPzpbXlxcU1xcbl0qXFwvXFwqW1xcU1xcc10qP1xcKlxcLykqKD86W15cXFNcXG5dKlxcL1xcL1teXFxuXSopPy91O1xuXG4vKipcbiAqIFJlYXR0YWNoZXMgYSBzYW1lLWxpbmUgY29tbWVudCB0byB0aGUgZWxlbWVudCBpdCBkZXNjcmliZXMuIEluc2VydGluZyBpbnRvIGFuIGFycmF5IHBsYWNlcyB0aGVcbiAqIG5ldyBlbGVtZW50IEJFRk9SRSB0aGUgdHJpdmlhIHRoYXQgZm9sbG93cyBpdHMgcHJlZGVjZXNzb3IsIHNvIGFwcGVuZGluZyBhZnRlclxuICogYHsgLi4uIH0gLy8gd2h5IHRoaXMgcnVsZSBleGlzdHNgIGxlYXZlcyB0aGF0IGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgZ2VuZXJhdGVkIGVsZW1lbnQgaW5zdGVhZC5cbiAqIEEgZnJlc2hseSBzZXJpYWxpemVkIGVsZW1lbnQgbmV2ZXIgY2FycmllcyBhIGNvbW1lbnQgb2YgaXRzIG93biwgc28gYW55dGhpbmcgdHJhaWxpbmcgdGhlXG4gKiBpbnNlcnRpb24gYmVsb25nZWQgdG8gdGhlIGVsZW1lbnQgYmVmb3JlIGl0LlxuICovXG5mdW5jdGlvbiByZXN0b3JlVHJhaWxpbmdDb21tZW50KGNvbnRlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcsIGluc2VydGVkSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChpbnNlcnRlZEluZGV4ID09PSAwKSByZXR1cm4gY29udGVudDtcbiAgY29uc3Qgcm9vdCA9IHBhcnNlVHJlZShjb250ZW50KTtcbiAgY29uc3QgZWxlbWVudHMgPSAocm9vdCAmJiBmaW5kTm9kZUF0TG9jYXRpb24ocm9vdCwgW2tleV0pKT8uY2hpbGRyZW47XG4gIGNvbnN0IGluc2VydGVkID0gZWxlbWVudHM/LltpbnNlcnRlZEluZGV4XTtcbiAgY29uc3QgcHJldmlvdXMgPSBlbGVtZW50cz8uW2luc2VydGVkSW5kZXggLSAxXTtcbiAgaWYgKCFpbnNlcnRlZCB8fCAhcHJldmlvdXMpIHJldHVybiBjb250ZW50O1xuICBjb25zdCBpbnNlcnRlZEVuZCA9IGluc2VydGVkLm9mZnNldCArIGluc2VydGVkLmxlbmd0aDtcbiAgY29uc3QgY29tbWVudCA9IHRyYWlsaW5nQ29tbWVudFBhdHRlcm4uZXhlYyhjb250ZW50LnNsaWNlKGluc2VydGVkRW5kKSk/LlswXTtcbiAgaWYgKCFjb21tZW50KSByZXR1cm4gY29udGVudDtcbiAgLy8gTGFuZCB0aGUgY29tbWVudCBhZnRlciB0aGUgc2VwYXJhdGluZyBjb21tYSBzbyB0aGUgZWxlbWVudCBrZWVwcyBpdHMgb3duIGxpbmUgaW50YWN0LlxuICBjb25zdCBwcmV2aW91c0VuZCA9IHByZXZpb3VzLm9mZnNldCArIHByZXZpb3VzLmxlbmd0aDtcbiAgY29uc3QgcmVzdG9yZU9mZnNldCA9IHByZXZpb3VzRW5kICsgKC9eXFxzKiwvdS5leGVjKGNvbnRlbnQuc2xpY2UocHJldmlvdXNFbmQpKT8uWzBdLmxlbmd0aCA/PyAwKTtcbiAgcmV0dXJuIChcbiAgICBjb250ZW50LnNsaWNlKDAsIHJlc3RvcmVPZmZzZXQpICtcbiAgICBjb21tZW50ICtcbiAgICBjb250ZW50LnNsaWNlKHJlc3RvcmVPZmZzZXQsIGluc2VydGVkRW5kKSArXG4gICAgY29udGVudC5zbGljZShpbnNlcnRlZEVuZCArIGNvbW1lbnQubGVuZ3RoKVxuICApO1xufVxuXG4vKipcbiAqIE1pcnJvcnMgdGhlIGluZGVudGF0aW9uIHRoZSBmaWxlIGFscmVhZHkgdXNlcywgc28gYSBzZW1hbnRpYyBjaGFuZ2UgZG9lcyBub3QgcmVpbmRlbnQgdW5yZWxhdGVkXG4gKiBsaW5lcy4gVGhlIGZpcnN0IHByb3BlcnR5IGlzIG1lYXN1cmVkIHJhdGhlciB0aGFuIHRoZSBmaXJzdCBpbmRlbnRlZCBsaW5lLCBiZWNhdXNlIGEgZGVjb3JhdGVkXG4gKiBibG9jayBjb21tZW50IChgICogLi4uYCkgd291bGQgb3RoZXJ3aXNlIHBhc3MgZm9yIHRoZSBmaWxlJ3MgaW5kZW50YXRpb24uIEZhbGxzIGJhY2sgdG8gdGhlIHR3b1xuICogc3BhY2VzIGV2ZXJ5IGdlbmVyYXRlZCBjb25maWcgdXNlcy5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0Rm9ybWF0dGluZ09wdGlvbnMoY29udGVudDogc3RyaW5nKTogeyBpbnNlcnRTcGFjZXM6IGJvb2xlYW47IHRhYlNpemU6IG51bWJlciB9IHtcbiAgY29uc3QgZmlyc3RQcm9wZXJ0eSA9IHBhcnNlVHJlZShjb250ZW50KT8uY2hpbGRyZW4/LlswXTtcbiAgY29uc3QgaW5kZW50YXRpb24gPVxuICAgIGZpcnN0UHJvcGVydHkgJiYgY29udGVudC5zbGljZShjb250ZW50Lmxhc3RJbmRleE9mKCdcXG4nLCBmaXJzdFByb3BlcnR5Lm9mZnNldCkgKyAxLCBmaXJzdFByb3BlcnR5Lm9mZnNldCk7XG4gIGlmICghaW5kZW50YXRpb24gfHwgIS9eW1xcdCBdKyQvdS50ZXN0KGluZGVudGF0aW9uKSkgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiB0cnVlLCB0YWJTaXplOiAyIH07XG4gIGlmIChpbmRlbnRhdGlvbi5zdGFydHNXaXRoKCdcXHQnKSkgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiBmYWxzZSwgdGFiU2l6ZTogMSB9O1xuICByZXR1cm4geyBpbnNlcnRTcGFjZXM6IHRydWUsIHRhYlNpemU6IGluZGVudGF0aW9uLmxlbmd0aCB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGluc2VydCBpbnRvIGBvbGRWYWx1ZWAgdG8gdHVybiBpdCBpbnRvIGBuZXdWYWx1ZWAsIG9yIHVuZGVmaW5lZCB3aGVuXG4gKiB0aGF0IGlzIGltcG9zc2libGUgYmVjYXVzZSBgbmV3VmFsdWVgIGRyb3BzIG9yIHJlb3JkZXJzIGFuIGV4aXN0aW5nIGVsZW1lbnQgKHRoZSBjYWxsZXIgbXVzdFxuICogdGhlbiByZXBsYWNlIHRoZSBhcnJheSB3aG9sZXNhbGUpLiBJbmRpY2VzIGFkZHJlc3MgdGhlIGFycmF5IGFzIGl0IGdyb3dzLCBzbyBhcHBseWluZyB0aGVcbiAqIGluc2VydGlvbnMgbGVmdCB0byByaWdodCB5aWVsZHMgYG5ld1ZhbHVlYC5cbiAqL1xuZnVuY3Rpb24gZmluZEluc2VydGlvbnMob2xkVmFsdWU6IHVua25vd25bXSwgbmV3VmFsdWU6IHVua25vd25bXSk6IHsgaW5kZXg6IG51bWJlcjsgdmFsdWU6IHVua25vd24gfVtdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5zZXJ0aW9uczogeyBpbmRleDogbnVtYmVyOyB2YWx1ZTogdW5rbm93biB9W10gPSBbXTtcbiAgbGV0IG9sZEluZGV4ID0gMDtcbiAgZm9yIChjb25zdCBbbmV3SW5kZXgsIGVsZW1lbnRdIG9mIG5ld1ZhbHVlLmVudHJpZXMoKSkge1xuICAgIGlmIChvbGRJbmRleCA8IG9sZFZhbHVlLmxlbmd0aCAmJiBKU09OLnN0cmluZ2lmeShvbGRWYWx1ZVtvbGRJbmRleF0pID09PSBKU09OLnN0cmluZ2lmeShlbGVtZW50KSkge1xuICAgICAgb2xkSW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpbnNlcnRpb25zLnB1c2goeyBpbmRleDogbmV3SW5kZXgsIHZhbHVlOiBlbGVtZW50IH0pO1xuICB9XG4gIHJldHVybiBvbGRJbmRleCA9PT0gb2xkVmFsdWUubGVuZ3RoID8gaW5zZXJ0aW9ucyA6IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG4vKipcbiAqIFJlY29nbml6ZXMgdGhlIG1hbmFnZWQgYHdiIGdlbi1jb2RlYCBzZWdtZW50LCBhIG9uZS1sZXZlbCBwYWNrYWdlLXNjcmlwdCB3cmFwcGVyIGFyb3VuZCBpdCwgYW5kXG4gKiBjdXN0b20gc2VnbWVudHMgdGhhdCB3YmZ5IGxlYXZlcyBhbG9uZS5cbiAqL1xudHlwZSBTY3JpcHRTZWdtZW50S2luZCA9ICdjdXN0b20nIHwgJ2dlbkNvZGUnIHwgJ2dlbkNvZGVXcmFwcGVyJztcblxuY29uc3QgZ2VuQ29kZVNlZ21lbnRQYXR0ZXJuID0gL15idW5cXHMrd2JcXHMrZ2VuLWNvZGUkL3U7XG5cbi8vIEEgcnVubmVyIGRlbGVnYXRpbmcgdG8gb25lIG9mIHRoaXMgcGFja2FnZSdzIG93biBzY3JpcHRzLCBlLmcuIGBidW4gcnVuIGdlbi10eXBlc2AuXG5jb25zdCBzY3JpcHRSdW5uZXJQYXR0ZXJuID0gL15idW5cXHMrcnVuXFxzKyhcXFMrKSQvdTtcblxuLy8gQW55dGhpbmcgd2JmeSdzIGAmJmAgc3BsaXQgY2Fubm90IG1vZGVsIChwaXBlcywgc2VxdWVuY2luZywgcmVkaXJlY3Rpb25zLCBxdW90aW5nLCBzdWJzdGl0dXRpb25zLCBkaXJlY3Rvcnlcbi8vIGNoYW5nZXMpLiBTY3JpcHRzIGNvbnRhaW5pbmcgaXQgYXJlIGxlZnQgdW50b3VjaGVkIGluc3RlYWQgb2YgYmVpbmcgcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbmNvbnN0IHVuc3VwcG9ydGVkU2hlbGxTeW50YXhQYXR0ZXJuID0gL1tcXG47fDw+YCQnXCIoKV18XFxiY2RcXHMvdTtcblxuLyoqXG4gKiBTcGxpdHMgYSBzY3JpcHQgaW50byBgJiZgLXNlcGFyYXRlZCBzZWdtZW50cywgb3IgcmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgc2NyaXB0IHVzZXMgc2hlbGwgc3ludGF4IHdiZnlcbiAqIGRlbGliZXJhdGVseSBkb2VzIG5vdCBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICh1bnN1cHBvcnRlZFNoZWxsU3ludGF4UGF0dGVybi50ZXN0KHNjcmlwdCkpIHJldHVybjtcbiAgcmV0dXJuIHNjcmlwdFxuICAgIC5zcGxpdCgnJiYnKVxuICAgIC5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoXG4gIHNlZ21lbnQ6IHN0cmluZyxcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgZm9sbG93c1dyYXBwZXIgPSB0cnVlXG4pOiBTY3JpcHRTZWdtZW50S2luZCB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBzZWdtZW50LnRyaW0oKS5yZXBsYWNlQWxsKC9cXHMrL2d1LCAnICcpO1xuICBpZiAoZ2VuQ29kZVNlZ21lbnRQYXR0ZXJuLnRlc3Qobm9ybWFsaXplZCkpIHJldHVybiAnZ2VuQ29kZSc7XG4gIC8vIEEgb25lLWxldmVsIHdyYXBwZXIgbG9va3VwIGNvdmVycyBgXCJwb3N0aW5zdGFsbFwiOiBcImJ1biBydW4gZ2VuLXR5cGVzXCJgLCB0aGUgc2hhcGUgdGhlc2UgcmVwb3NpdG9yaWVzIHVzZTtcbiAgLy8gZGVlcGVyIGNoYWlucyBzdGF5IGN1c3RvbSBzbyB3YmZ5IGNhbm5vdCBsb29wIG9uIGEgc2VsZi1yZWZlcmVudGlhbCBzY3JpcHQuXG4gIGNvbnN0IHNjcmlwdE5hbWUgPSBmb2xsb3dzV3JhcHBlciA/IHNjcmlwdFJ1bm5lclBhdHRlcm4uZXhlYyhub3JtYWxpemVkKT8uWzFdIDogdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXQgPSBzY3JpcHROYW1lID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzY3JpcHRzW3NjcmlwdE5hbWVdO1xuICBpZiAoIXRhcmdldCkgcmV0dXJuICdjdXN0b20nO1xuICBjb25zdCBzZWdtZW50cyA9IHNwbGl0U2NyaXB0U2VnbWVudHModGFyZ2V0KTtcbiAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIENVU1RPTUlaRUQgZ2VuLWNvZGUgKGBidW4gd2IgZ2VuLWNvZGUgJiYgYnVuIHJ1biBidWlsZC1hc3NldHNgKSBzdGlsbCBwZXJmb3JtcyB0aGUgbWFuYWdlZFxuICAvLyBnZW5lcmF0aW9uLCBzbyBpdCBjb3VudHMgYXMgZ2VuLWNvZGU7IHRyZWF0aW5nIGl0IGFzIGN1c3RvbSB3b3VsZCBhcHBlbmQgYSBzZWNvbmQgYHdiIGdlbi1jb2RlYCBhbmQgcnVuIGV2ZXJ5XG4gIC8vIGdlbmVyYXRvciB0d2ljZSBwZXIgaW5zdGFsbC5cbiAgaWYgKHNlZ21lbnRzPy5sZW5ndGggIT09IDEpIHtcbiAgICAvLyBBIHdyYXBwZXIgYXJvdW5kIGEgQ1VTVE9NSVpFRCBnZW4tY29kZSAoYGJ1biB3YiBnZW4tY29kZSAmJiBidW4gcnVuIGJ1aWxkLWFzc2V0c2ApIGFscmVhZHkgcGVyZm9ybXMgdGhlXG4gICAgLy8gbWFuYWdlZCBnZW5lcmF0aW9uIEFORCB0aGUgcHJvamVjdCdzIG93biBzdGVwcywgc28gaXQgaXMgdGhlIGluc3RhbGwtdGltZSBlbnRyeSBwb2ludDogaXQgbXVzdCBiZSBrZXB0IGFzXG4gICAgLy8gd3JpdHRlbi4gUmVwbGFjaW5nIGl0IHdpdGggYSBiYXJlIGB3YiBnZW4tY29kZWAgd291bGQgZHJvcCB0aG9zZSBzdGVwczsgYXBwZW5kaW5nIG9uZSB3b3VsZCBydW4gZXZlcnlcbiAgICAvLyBnZW5lcmF0b3IgdHdpY2UuXG4gICAgcmV0dXJuIHNlZ21lbnRzPy5zb21lKChpbm5lcikgPT4gZ2VuQ29kZVNlZ21lbnRQYXR0ZXJuLnRlc3QoaW5uZXIudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJykpKVxuICAgICAgPyAnZ2VuQ29kZVdyYXBwZXInXG4gICAgICA6ICdjdXN0b20nO1xuICB9XG4gIHJldHVybiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudHNbMF0gPz8gJycsIHNjcmlwdHMsIGZhbHNlKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQsIGFyZ3MsIGN3ZCwgcmV0cnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiBudW1iZXIge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhdHVzID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgIGlmIChzdGF0dXMgPT09IDApIGJyZWFrO1xuICAgIGlmIChyZXRyeSA8PSAwKSByZXR1cm4gc3RhdHVzO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXRJbnRlcm5hbChjb21tYW5kLCBhcmdzLCBjd2QpWzFdO1xufVxuXG5mdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXRJbnRlcm5hbChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtudW1iZXIsIHN0cmluZ10ge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3RkZXJyIG9uIEVOT0VOVC5cbiAgY29uc3Qgc3RkZXJyID0gcHJvYy5zdGRlcnIgPz8gJyc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycgPyBzdGRlcnIudHJpbSgpIDogc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAocHJvYy5lcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIGZhaWxlZCB3aXRoOiAke3Byb2MuZXJyb3IubWVzc2FnZX1gKTtcbiAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRvdXQgb24gRU5PRU5ULlxuICBjb25zdCBzdGRvdXQgPSBwcm9jLnN0ZG91dCA/PyAnJztcbiAgY29uc3Qgc3Rkb3V0VGV4dCA9IHR5cGVvZiBzdGRvdXQgPT09ICdzdHJpbmcnID8gc3Rkb3V0IDogc3Rkb3V0LnRvU3RyaW5nKCk7XG4gIHJldHVybiBbcHJvYy5zdGF0dXMgPz8gMSwgc3Rkb3V0VGV4dC50cmltKCldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5zcGxpdCgnOicpXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBlbnYuQkVSUllfQklOX0ZPTERFUilcbiAgICAgIC5qb2luKCc6Jyk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVNjcmlwdFNlZ21lbnQsIHNwbGl0U2NyaXB0U2VnbWVudHMgfSBmcm9tICcuL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LmpzJztcbmltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJy4vdXRpbHMvc3RyaW5nVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLCBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyB9IGZyb20gJy4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgLy8gV2hldGhlciBpc1B1YmxpY1JlcG8gY29tZXMgZnJvbSBhbiBhY3R1YWwgR2l0SHViIEFQSSByZXNwb25zZTogYSBmYWlsZWQgbG9va3VwIChvZmZsaW5lLFxuICAvLyByYXRlLWxpbWl0ZWQsIGJhZCBjcmVkZW50aWFsKSBjb2xsYXBzZXMgdG8gaXNQdWJsaWNSZXBvPWZhbHNlLCB3aGljaCB2aXNpYmlsaXR5LXNlbnNpdGl2ZVxuICAvLyBnZW5lcmF0b3JzIG11c3Qgbm90IG1pc3Rha2UgZm9yIGEgY29uZmlybWVkIHByaXZhdGUgcmVwb3NpdG9yeS5cbiAgaXNSZXBvVmlzaWJpbGl0eUtub3duOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNDbG91ZGZsYXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnOiBib29sZWFuO1xuICBpc1JhaWx3YXk6IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIC8qKiBEaXJlY3RvcmllcyBjb250YWluaW5nIENhcmdvLnRvbWwgKHJlbGF0aXZlIHRvIGRpclBhdGgsIHJvb3QtbW9zdCBmaXJzdCkuIEVtcHR5IGlmIHRoZSByZXBvIGhhcyBubyBSdXN0IGNvZGUuICovXG4gIGNhcmdvVG9tbERpclBhdGhzOiBzdHJpbmdbXTtcbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVXZMb2NrOiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIFB5dGhvbiBsb2NrZmlsZSAocG9ldHJ5LmxvY2sgLyB1di5sb2NrKSBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgTWF2ZW4gcG9tLnhtbCBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblBvbVhtbEFueXdoZXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIFNsaWRldiBkZWNrIChgKi5zbGlkZXYubWRgKSBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblNsaWRldk1kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRhdXJpQ29uZmlnOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRSdW50aW1lOiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzbGlkZXY6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHRhdXJpOiBib29sZWFuO1xuICAgIHZpbmV4dDogYm9vbGVhbjtcbiAgICB2aXRlOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICAgIGNoYWtyYTogYm9vbGVhbjtcbiAgICBkcml6emxlOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQW4gZXhwbGljaXQgYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgcGx1Z2luIGVudHJ5IHB1Ymxpc2hlcyB0aGUgcm9vdCBtYW5pZmVzdCBpdHNlbGZcbiAgICAgKiAobm8gcGtnUm9vdCByZWRpcmVjdGlvbiBhbmQgbnBtUHVibGlzaCBub3QgZGlzYWJsZWQpLlxuICAgICAqL1xuICAgIG5wbVB1Ymxpc2hlc1Jvb3Q6IGJvb2xlYW47XG4gIH07XG4gIG1pc2VUYXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIFRoZSBzZW1hbnRpYy1yZWxlYXNlIGNvbmZpZyBmaWxlcyB3YmZ5IGV4cGVjdHMsIGluIGNvc21pY29uZmlnJ3MgcmVzb2x1dGlvbiBvcmRlciAodGhlIGxlYWRpbmdcbiAqIHBhY2thZ2UuanNvbiBlbnRyeSBpcyBjaGVja2VkIGJ5IHRoZSBjYWxsZXIpLiB3YmZ5IGdlbmVyYXRlcyAucmVsZWFzZXJjLmpzb247IHRoZSBvdGhlciBzcGVsbGluZ3NcbiAqIGFyZSBsaXN0ZWQgb25seSB0byBkZXRlY3QgYSBoYW5kLXdyaXR0ZW4gY29uZmlnLCB3aG9zZSBmb3JtYXQgSlNPTi5wYXJzZSBjYW5ub3QgcmVhZCBhbmQgd2hvc2VcbiAqIHBsdWdpbiBsaXN0IGlzIHRoZXJlZm9yZSBzdGF0aWNhbGx5IHVuaW5zcGVjdGFibGUuXG4gKi9cbmNvbnN0IHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlczogeyBmaWxlTmFtZTogc3RyaW5nOyBqc29uUGFyc2VhYmxlOiBib29sZWFuIH1bXSA9IFtcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMnLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzb24nLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy55bWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBpc1Jvb3Q/OiBib29sZWFuIH1cbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZUJyYW5jaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdCA9IGZhbHNlO1xuICAgIGxldCByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCA9IGZhbHNlO1xuICAgIC8vIFRoZSBGSVJTVCBleGlzdGluZyBzZWFyY2ggcGxhY2Ugd2lucyAoY29zbWljb25maWcgc2hvcnQtY2lyY3VpdHMpLCBzbyBhIEpTL1lBTUwvVFMgY29uZmlnXG4gICAgLy8gb3IgYW4gYGV4dGVuZHNgIHByZXNldCBtYWtlcyB0aGUgZWZmZWN0aXZlIHBsdWdpbiBsaXN0IHN0YXRpY2FsbHkgdW5pbnNwZWN0YWJsZSAobWlycm9yc1xuICAgIC8vIHJlYWRFeHBsaWNpdFNlbWFudGljUmVsZWFzZVBsdWdpbnMgaW4gd2IncyByZWxlYXNlLnRzKS4gVHJlYXRpbmcgaXQgYXMgdW5rbm93biBrZWVwc1xuICAgIC8vIGByZWxlYXNlLm5wbWAgY29uc2VydmF0aXZlbHkgdHJ1ZSwgc28gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIG5ldmVyIGZvcmNlc1xuICAgIC8vIGBwcml2YXRlOiB0cnVlYCBvbiBhIG1vbm9yZXBvIHRoYXQgYWN0dWFsbHkgcHVibGlzaGVzIHRvIG5wbS5cbiAgICBsZXQgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHR5cGUgUmVsZWFzZUNvbmZpZyA9XG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM/OiB1bmtub3duO1xuICAgICAgICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPl0pW107XG4gICAgICAgICAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gY29zbWljb25maWcgc2VhcmNoZXMgcGFja2FnZS5qc29uJ3MgYHJlbGVhc2VgIGtleSBCRUZPUkUgYW55IHJjL2NvbmZpZyBmaWxlXG4gICAgICAvLyAoc2VtYW50aWMtcmVsZWFzZSAyNSBkZWxlZ2F0ZXMgdG8gY29zbWljb25maWcgOSdzIGRlZmF1bHQgc2VhcmNoUGxhY2VzKS5cbiAgICAgIGxldCByZWxlYXNlQ29uZmlnID0gKHBhY2thZ2VKc29uIGFzIHsgcmVsZWFzZT86IFJlbGVhc2VDb25maWcgfSkucmVsZWFzZTtcbiAgICAgIGlmIChyZWxlYXNlQ29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCB7IGZpbGVOYW1lLCBqc29uUGFyc2VhYmxlIH0gb2Ygc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzKSB7XG4gICAgICAgICAgY29uc3QgcmVsZWFzZXJjUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlbGVhc2VyY1BhdGgpKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAoIWpzb25QYXJzZWFibGUpIHtcbiAgICAgICAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93biA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gYC5yZWxlYXNlcmNgIGFuZCBgLmNvbmZpZy9yZWxlYXNlcmNgIG1heSBhbHNvIGhvbGQgWUFNTDsgYSBKU09OLnBhcnNlIGZhaWx1cmUgbGFuZHNcbiAgICAgICAgICAvLyBpbiB0aGUgY2F0Y2ggYmVsb3cgYW5kIG1hcmtzIHRoZSBwbHVnaW4gbGlzdCB1bmtub3duIGluc3RlYWQgb2Ygc2lsZW50bHkgcmVwb3J0aW5nXG4gICAgICAgICAgLy8gXCJubyBwbHVnaW5zXCIuXG4gICAgICAgICAgcmVsZWFzZUNvbmZpZyA9IEpTT04ucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKHJlbGVhc2VyY1BhdGgsICd1dGY4JykpIGFzIFJlbGVhc2VDb25maWc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UgYWNjZXB0cyBhIHNjYWxhciBicmFuY2ggb3IgYnJhbmNoIG9iamVjdHMgKHsgbmFtZSwgcHJlcmVsZWFzZSwgLi4uIH0pO1xuICAgICAgLy8gbm9ybWFsaXplIHRvIHBsYWluIGJyYW5jaCBuYW1lcyBmb3IgY29uc3VtZXJzIHN1Y2ggYXMgdGhlIHdvcmtmbG93IGdlbmVyYXRvci5cbiAgICAgIGNvbnN0IHJhd0JyYW5jaGVzID0gcmVsZWFzZUNvbmZpZz8uYnJhbmNoZXM7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSAoQXJyYXkuaXNBcnJheShyYXdCcmFuY2hlcykgPyByYXdCcmFuY2hlcyA6IHJhd0JyYW5jaGVzID09PSB1bmRlZmluZWQgPyBbXSA6IFtyYXdCcmFuY2hlc10pXG4gICAgICAgIC5tYXAoKGJyYW5jaDogdW5rbm93bikgPT5cbiAgICAgICAgICB0eXBlb2YgYnJhbmNoID09PSAnc3RyaW5nJyA/IGJyYW5jaCA6IChicmFuY2ggYXMgeyBuYW1lPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8ubmFtZVxuICAgICAgICApXG4gICAgICAgIC5maWx0ZXIoKGJyYW5jaE5hbWUpOiBicmFuY2hOYW1lIGlzIHN0cmluZyA9PiB0eXBlb2YgYnJhbmNoTmFtZSA9PT0gJ3N0cmluZycpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVsZWFzZUNvbmZpZz8ucGx1Z2lucykpIHtcbiAgICAgICAgcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcGx1Z2luRW50cnkgb2YgcmVsZWFzZUNvbmZpZy5wbHVnaW5zKSB7XG4gICAgICAgICAgY29uc3QgW3BsdWdpbk5hbWUsIHBsdWdpbk9wdGlvbnNdID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSkgPyBwbHVnaW5FbnRyeSA6IFtwbHVnaW5FbnRyeSwgdW5kZWZpbmVkXTtcbiAgICAgICAgICBpZiAodHlwZW9mIHBsdWdpbk5hbWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5wdXNoKHBsdWdpbk5hbWUpO1xuICAgICAgICAgIGlmIChwbHVnaW5OYW1lICE9PSAnQHNlbWFudGljLXJlbGVhc2UvbnBtJykgY29udGludWU7XG4gICAgICAgICAgLy8gV2l0aCBwa2dSb290IHRoZSBwbHVnaW4gcHVibGlzaGVzIGFub3RoZXIgbWFuaWZlc3QgKGl0IHJlc29sdmVzIHBrZ1Jvb3QgYWdhaW5zdCB0aGVcbiAgICAgICAgICAvLyByZXBvIHJvb3QsIHNvIGAuYCBhbmQgYC4vYCBib3RoIG1lYW4gdGhlIHJvb3QgaXRzZWxmKSwgYW5kIG5wbVB1Ymxpc2g6IGZhbHNlXG4gICAgICAgICAgLy8gZGlzYWJsZXMgcHVibGlzaGluZyBlbnRpcmVseTsgb25seSB0aGUgcmVtYWluaW5nIHNoYXBlIHByb3ZlcyB0aGUgUk9PVCBpcyBwdWJsaXNoZWQuXG4gICAgICAgICAgY29uc3QgcGtnUm9vdCA9IHBsdWdpbk9wdGlvbnM/LnBrZ1Jvb3Q7XG4gICAgICAgICAgY29uc3QgcHVibGlzaGVzUm9vdCA9XG4gICAgICAgICAgICBwbHVnaW5PcHRpb25zPy5ucG1QdWJsaXNoICE9PSBmYWxzZSAmJlxuICAgICAgICAgICAgKHBrZ1Jvb3QgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAodHlwZW9mIHBrZ1Jvb3QgPT09ICdzdHJpbmcnICYmIHBhdGgucmVzb2x2ZShkaXJQYXRoLCBwa2dSb290KSA9PT0gcGF0aC5yZXNvbHZlKGRpclBhdGgpKSk7XG4gICAgICAgICAgcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QgfHw9IHB1Ymxpc2hlc1Jvb3Q7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmVsZWFzZUNvbmZpZyAmJiByZWxlYXNlQ29uZmlnLmV4dGVuZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gV2l0aG91dCBhbiBleHBsaWNpdCBwbHVnaW4gbGlzdCwgc2VtYW50aWMtcmVsZWFzZSdzIGRlZmF1bHQgbGlzdCBhcHBsaWVzLCB3aGljaCBpbmNsdWRlc1xuICAgIC8vIEBzZW1hbnRpYy1yZWxlYXNlL25wbSBhbmQgQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViIChtaXJyb3JzIHJlbGVhc2VQdWJsaXNoZXNUb05wbSBpbiB3YidzXG4gICAgLy8gcmVsZWFzZS50cykuXG4gICAgY29uc3QgdXNlc1NlbWFudGljUmVsZWFzZSA9ICEhKFxuICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwIHx8XG4gICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd25cbiAgICApO1xuXG4gICAgLy8gVGhlIGNhbGxlciBtYXkgY2xhc3NpZnkgZXhwbGljaXRseSAoaW5kZXgudHMgcGFzc2VzIGZhbHNlIGZvciBldmVyeSBkaXNjb3ZlcmVkIHdvcmtzcGFjZSxcbiAgICAvLyBpbmNsdWRpbmcgbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKik7IHRoZSBoZXVyaXN0aWMgY2xhc3NpZmllcyB0aGUgQ0xJIGVudHJ5XG4gICAgLy8gcGF0aCBpdHNlbGYsIHNvIGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmAgYW5kIGB3YmZ5IDxyZXBvPi9hcHBzLzxhcHA+YCBrZWVwIHRoZWlyIGNoaWxkXG4gICAgLy8gY2xhc3NpZmljYXRpb24uXG4gICAgY29uc3QgaXNSb290ID0gb3B0aW9ucz8uaXNSb290ID8/ICFpc1dvcmtzcGFjZU9mRW5jbG9zaW5nUm9vdChkaXJQYXRoKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgLy8gRmV0Y2ggdmlzaWJpbGl0eSBmb3IgdGhlIENMSSBlbnRyeSBldmVuIHdoZW4gaXQgaXMgYSB3b3Jrc3BhY2UgY2hpbGQgKGB3YmZ5XG4gICAgLy8gPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCk6IGdlbmVyYXRvcnMgcmVhZCBpc1B1YmxpY1JlcG8gZnJvbSB0aGVpciByb290Q29uZmlnIHBhcmFtZXRlcixcbiAgICAvLyB3aGljaCBJUyB0aGUgY2hpbGQgY29uZmlnIGluIHRoYXQgaW52b2NhdGlvbiwgc28gYSBzdHViIGBmYWxzZWAgdGhlcmUgd291bGQgZHJvcCB0aGVcbiAgICAvLyBwdWJsaWMtcmVwbyBwdWJsaXNoQ29uZmlnIGhhbmRsaW5nLiBEaXNjb3ZlcmVkIGNoaWxkcmVuIChvcHRpb25zLmlzUm9vdCA9PT0gZmFsc2UpIHN0aWxsXG4gICAgLy8gc2tpcCB0aGUgZmV0Y2gg4oCUIHRoZXkgaW5oZXJpdCB0aGUgZW5jbG9zaW5nIHJvb3QncyB2aXNpYmlsaXR5IHZpYSByb290Q29uZmlnIGluc3RlYWQuXG4gICAgaWYgKG9wdGlvbnM/LmlzUm9vdCAhPT0gZmFsc2UpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBPbmx5IHRoZSByb290IGZldGNoZXMgcmVwbyBpbmZvLCBhbmQgdGhhdCBmZXRjaCBuZWVkcyBuZXR3b3JrIGFuZCBhIHRva2VuLCBzbyBpZGVudGl0eS1kZXJpdmVkXG4gICAgLy8gZmxhZ3MgYmVsb3cgd291bGQgb3RoZXJ3aXNlIGJlIGZhbHNlIGZvciBldmVyeSB3b3Jrc3BhY2UgcGFja2FnZSBhbmQgZm9yIGV2ZXJ5IG9mZmxpbmUgb3JcbiAgICAvLyByYXRlLWxpbWl0ZWQgcnVuLiBUaGUgZ2l0IHJlbW90ZSBhbnN3ZXJzIHRoZSBzYW1lIHF1ZXN0aW9uIGxvY2FsbHksIGZvciBldmVyeSBwYWNrYWdlLlxuICAgIGlmICghcmVwb0F1dGhvciB8fCAhcmVwb05hbWUpIHtcbiAgICAgIFtyZXBvQXV0aG9yLCByZXBvTmFtZV0gPSBhd2FpdCByZXNvbHZlTG9jYWxSZXBvSWRlbnRpdHkoZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cbiAgICAvLyBCdWlsdCBmcm9tIHRoZSBSRVNPTFZFRCBpZGVudGl0eSBzbyB3b3Jrc3BhY2UgcGFja2FnZXMgYW5kIG9mZmxpbmUgcnVucyBhbHNvIGdldCBpdDsgY29uc3VtZXJzIGRlcml2ZVxuICAgIC8vIHRoZSBvd25lciBmcm9tIHRoaXMgZmllbGQgKGUuZy4gdG8gc2V0IGBhdXRob3JgKS5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0F1dGhvciAmJiByZXBvTmFtZSA/IGBnaXRodWI6JHtyZXBvQXV0aG9yfS8ke3JlcG9OYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgLy8gVGF1cmkgb2ZmaWNpYWxseSBzdXBwb3J0cyBKU09OLCBKU09ONSwgYW5kIFRPTUwgY29uZmlndXJhdGlvbiBmb3JtYXRzLlxuICAgIGNvbnN0IGRvZXNDb250YWluVGF1cmlDb25maWcgPSBbJ3RhdXJpLmNvbmYuanNvbicsICd0YXVyaS5jb25mLmpzb241JywgJ1RhdXJpLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdzcmMtdGF1cmknLCBmaWxlTmFtZSkpXG4gICAgKTtcbiAgICAvLyBSb290LWxldmVsIFwiSW5QYWNrYWdlc1wiIHNpZ25hbHMgbXVzdCBzZWUgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlIGxheW91dCAoZS5nLiBhcHBzLyopLCBub3RcbiAgICAvLyBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3RvcnksIHNvIHNjYW4gZWFjaCBkaXNjb3ZlcmVkIHdvcmtzcGFjZSBkaXJlY3RvcnkuXG4gICAgY29uc3Qgd29ya3NwYWNlU3ViRGlyUGF0aHMgPSBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyh7XG4gICAgICBkaXJQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgfSk7XG4gICAgY29uc3QgY29udGFpbnNBbnlJbldvcmtzcGFjZXMgPSAocGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAgICAgd29ya3NwYWNlU3ViRGlyUGF0aHMuc29tZSgod29ya3NwYWNlU3ViRGlyUGF0aCkgPT4gY29udGFpbnNBbnkocGF0dGVybiwgd29ya3NwYWNlU3ViRGlyUGF0aCkpO1xuICAgIGNvbnN0IGRvZXNDb250YWluV3JhbmdsZXJDb25maWcgPSBkZXRlY3RXcmFuZ2xlckNvbmZpZyhkaXJQYXRoKTtcbiAgICBjb25zdCB3b3JrZmxvd0NvbnRlbnRzID0gcmVhZFdvcmtmbG93RmlsZUNvbnRlbnRzKGRpclBhdGgpO1xuICAgIGNvbnN0IGltcG9ydHNQbGF5d3JpZ2h0QXRSdW50aW1lID0gZGV0ZWN0UGxheXdyaWdodFJ1bnRpbWVJbXBvcnQoZGlyUGF0aCk7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVwb1Zpc2liaWxpdHlLbm93bjogdHlwZW9mIHJlcG9JbmZvPy5wcml2YXRlID09PSAnYm9vbGVhbicsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0Nsb3VkZmxhcmU6IGRldGVjdENsb3VkZmxhcmUocGFja2FnZUpzb24sIGRvZXNDb250YWluV3JhbmdsZXJDb25maWcsIHdvcmtmbG93Q29udGVudHMpLFxuICAgICAgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyxcbiAgICAgIGlzUmFpbHdheTogZGV0ZWN0UmFpbHdheShkaXJQYXRoLCBwYWNrYWdlSnNvbiwgd29ya2Zsb3dDb250ZW50cyksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogZGV0ZWN0SXNXaWxsQm9vc3RlckNvbmZpZ3MoZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoLCByZXBvTmFtZSksXG4gICAgICBjYXJnb1RvbWxEaXJQYXRoczogZmluZENhcmdvVG9tbERpclBhdGhzKGRpclBhdGgpLFxuICAgICAgLy8gQWxzbyBob25vciBkZWNsYXJlZCB3b3Jrc3BhY2UgcGF0dGVybnMgYmV5b25kIHBhY2thZ2VzLyogKGUuZy4gYXBwcy8qKTogdHJlYXRpbmcgYW5cbiAgICAgIC8vIGFwcHMvKi1vbmx5IG1vbm9yZXBvIGFzIGEgcGxhaW4gcGFja2FnZSB3b3VsZCBkZWxldGUgaXRzIGB3b3Jrc3BhY2VzYCBkZWNsYXJhdGlvbiBpblxuICAgICAgLy8gZ2VuZXJhdGVQYWNrYWdlSnNvbiBhbmQgc2tpcCBtb25vcmVwby1vbmx5IGNvbnZlbnRpb25zIHN1Y2ggYXMgcm9vdCBgcHJpdmF0ZTogdHJ1ZWAuXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpIHx8IHdvcmtzcGFjZVN1YkRpclBhdGhzLmxlbmd0aCA+IDAsXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblV2TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3V2LmxvY2snKSksXG4gICAgICAvLyBSZWN1cnNpdmUgbGlrZSBkb2VzQ29udGFpbkphdmE6IG11bHRpLWxhbmd1YWdlIHJlcG9zaXRvcmllcyBrZWVwIGxhbmd1YWdlIGRpcmVjdG9yaWVzXG4gICAgICAvLyAoZS5nLiBQeXRob24gdG9vbGluZyBvciBNYXZlbiBtb2R1bGVzKSBvdXRzaWRlIHRoZSByb290IGFuZCBvdXRzaWRlIGRlY2xhcmVkIHdvcmtzcGFjZXMuXG4gICAgICBkb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZTogY29udGFpbnNBbnkoJyoqL3twb2V0cnkubG9jayx1di5sb2NrfScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZTogY29udGFpbnNBbnkoJyoqL3BvbS54bWwnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblNsaWRldk1kOiBjb250YWluc0FueSgnKiovKi5zbGlkZXYubWQnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoXG4gICAgICAgICdzcmMtdGF1cmkve3RhdXJpLmNvbmYuanNvbix0YXVyaS5jb25mLmpzb241LFRhdXJpLnRvbWx9J1xuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmE6IGNvbnRhaW5zQW55KCcqKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzKCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JyksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJyoqLyouamF2YScpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgY2hha3JhOiAhIWRldkRlcGVuZGVuY2llc1snQGNoYWtyYS11aS9jbGknXSxcbiAgICAgICAgZHJpenpsZTogISFkZXBlbmRlbmNpZXNbJ2RyaXp6bGUtb3JtJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ2RyaXp6bGUta2l0J10sXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHBsYXl3cmlnaHRSdW50aW1lOiBpbXBvcnRzUGxheXdyaWdodEF0UnVudGltZSxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgc2xpZGV2OiAhIWRlcGVuZGVuY2llc1snQHNsaWRldi9jbGknXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHNsaWRldi9jbGknXSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB0YXVyaTpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnLFxuICAgICAgICB2aW5leHQ6ICEhZGVwZW5kZW5jaWVzLnZpbmV4dCB8fCAhIWRldkRlcGVuZGVuY2llcy52aW5leHQsXG4gICAgICAgIHZpdGU6ICEhZGVwZW5kZW5jaWVzLnZpdGUgfHwgISFkZXZEZXBlbmRlbmNpZXMudml0ZSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zQXJlRXhwbGljaXRcbiAgICAgICAgICA/IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB8fCByZWxlYXNlUGx1Z2luc0FyZVVua25vd25cbiAgICAgICAgICA6IHVzZXNTZW1hbnRpY1JlbGVhc2UsXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdFxuICAgICAgICAgID8gcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpIHx8IHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICAgICAgIDogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgbnBtUHVibGlzaGVzUm9vdDogcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QsXG4gICAgICB9LFxuICAgICAgbWlzZVRhc2tzOiBhd2FpdCByZWFkTWlzZVRhc2tzKGRpclBhdGgpLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVXZMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sIHx8XG4gICAgICAvLyBBIHJlcG9zaXRvcnkgY2FuIGxlZ2l0aW1hdGVseSBjb250YWluIG9ubHkgZG9jdW1lbnRhdGlvbi4gSXRzIEdpdCBtZXRhZGF0YSBpcyBlbm91Z2ggdG9cbiAgICAgIC8vIGVzdGFibGlzaCB0aGF0IHRoZSBDTEkgdGFyZ2V0IGlzIGEgcHJvamVjdCByb290OyByZXF1aXJpbmcgYSBsYW5ndWFnZSBtYW5pZmVzdCBoZXJlIHdvdWxkXG4gICAgICAvLyBtYWtlIHdiZnkgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgcGFja2FnZS5qc29uIHRoYXQgaXQgbWFuYWdlcyBmb3Igc3VjaCByZXBvc2l0b3JpZXMuIEJvdGhcbiAgICAgIC8vIG9yZGluYXJ5IGNoZWNrb3V0cyAoYC5naXRgIGRpcmVjdG9yeSkgYW5kIHdvcmt0cmVlcyAoYC5naXRgIGZpbGUpIHNhdGlzZnkgdGhpcyBjaGVjay5cbiAgICAgIChjb25maWcuaXNSb290ICYmIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZ2l0JykpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgd2JmeSBtYW5hZ2VzIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgZm9yIHRoZSBwYWNrYWdlLiBUaGUgZmlsZSBpcyBnaXRpZ25vcmVkIGFuZCB1bnRyYWNrZWRcbiAqIGJlY2F1c2UgdGhlIGB3YiBnZW4tY29kZWAgcG9zdGluc3RhbGwgcmVnZW5lcmF0ZXMgaXQgb24gZXZlcnkgaW5zdGFsbCwgc28gdGhlIHBhY2thZ2UgaGFzIHRvIG93biBhIHdyYW5nbGVyXG4gKiBjb25maWcgKGB3cmFuZ2xlciB0eXBlc2AgZXhpdHMgbm9uLXplcm8gd2l0aG91dCBvbmUpLCB0byBkZXBlbmQgb24gd3JhbmdsZXIgKGEgcGFja2FnZSBkZXBsb3lpbmcgdmlhIGFcbiAqIENJIGFjdGlvbiBjYW5ub3QgcmVzb2x2ZSB0aGUgY29tbWFuZCksIGFuZCB0byBjb25zdW1lIHRoZSBnZW5lcmF0ZWQgZmlsZS5cbiAqXG4gKiBJTlZBUklBTlQg4oCUIHRoaXMgZGVjaXNpb24gbXVzdCBjb252ZXJnZSBhY3Jvc3MgbWFjaGluZXMgaG9sZGluZyB0aGUgc2FtZSBjb21taXQuIEl0IG11c3QgTkVWRVIgY29uc3VsdFxuICogZ2l0aWdub3JlZCBmaWxlcyAoYC5kZXYudmFycypgLCBgLmVudipgLCAuLi4pLCB3aGljaCBgd2Igc3RhcnRgIGFuZCBgd2IgZGVwbG95YCBjcmVhdGUgcm91dGluZWx5IGFuZCB3aGljaFxuICogdGhlcmVmb3JlIHN0YXkgdW50cmFja2VkIG9uIGRldiBtYWNoaW5lcyBmb3JldmVyOiBhIGZvcm1lciBjaGVjayB0aGF0IHRyZWF0ZWQgdGhlbSBhcyBpcnJlcHJvZHVjaWJsZSBpbnB1dHNcbiAqIG1hZGUgd2JmeSBydW5zIG9uIGRldiBtYWNoaW5lcyByZS10cmFjayB0aGUgfjE1ay1saW5lIGdlbmVyYXRlZCBmaWxlIHRoYXQgcnVucyBmcm9tIGNsZWFuIGNoZWNrb3V0cyBoYWRcbiAqIHVudHJhY2tlZCwgb3NjaWxsYXRpbmcgZXRlcm5hbGx5IChlLmcuIGFpLWdhbWUtYnVpbGRlciAjNjg0IOKGkiAjNzQ2KS4gUmVhZGluZyBjb21taXR0YWJsZSByZXBvc2l0b3J5IGZpbGVzXG4gKiBmcm9tIHRoZSB3b3JraW5nIHRyZWUgKHRoZSB3cmFuZ2xlciBjb25maWcsIHBhY2thZ2UuanNvbiwgdHNjb25maWcg4oCUIGFzIGV2ZXJ5IHdiZnkgZ2VuZXJhdG9yIGRvZXMpIGlzIGZpbmU6XG4gKiBhbnkgZGl2ZXJnZW5jZSB0aGVyZSBpcyB0cmFuc2llbnQgYW5kIGRpc2FwcGVhcnMgb25jZSB0aGUgZmlsZSBpcyBjb21taXR0ZWQgb3IgcmVtb3ZlZC5cbiAqIFRoZSBoYXphcmQgdGhhdCBjaGVjayBndWFyZGVkIGFnYWluc3Qgbm8gbG9uZ2VyIGV4aXN0czogYHdiIGdlbi1jb2RlYCBydW5zIGB3cmFuZ2xlciB0eXBlcyAtLWVudi1maWxlYCB3aXRoXG4gKiBhIGtleSBzdHViIGRlcml2ZWQgc29sZWx5IGZyb20gdGhlIGNvbW1pdHRlZCBmbm94LnRvbWwgKHNlZSB3YidzIHdyaXRlV29ya2VyVHlwZXNFbnZTdHViKSwgc28gbG9jYWwgZG90ZW52XG4gKiBmaWxlcyBuZXZlciBpbmZsdWVuY2UgdGhlIGdlbmVyYXRlZCBgRW52YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnICYmIGhhc1dyYW5nbGVyRGVwZW5kZW5jeShwYWNrYWdlSnNvbikgJiYgY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvcihjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ3BhY2thZ2VKc29uJz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzY3JpcHRzID0gY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBzY3JpcHRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHNjcmlwdCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBjb25zdCBzZWdtZW50cyA9IHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0KTtcbiAgICBjb25zdCBoYXNOb25DYW5vbmljYWxXYkdlbkNvZGUgPSBzZWdtZW50cz8uc29tZSgoc2VnbWVudCkgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHNlZ21lbnQudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAvXig/Oig/OmJ1bnxidW54KSg/OiAtLWJ1bik/KD86IHJ1bik/ICk/d2IgZ2VuLWNvZGUkL3UudGVzdChub3JtYWxpemVkKSAmJlxuICAgICAgICBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwgc2NyaXB0cywgdHJ1ZSkgPT09ICdjdXN0b20nXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChoYXNOb25DYW5vbmljYWxXYkdlbkNvZGUpIHJldHVybiBgJHtuYW1lfSBtdXN0IHVzZSB0aGUgY2Fub25pY2FsIGJ1biB3YiBnZW4tY29kZSBjb21tYW5kYDtcbiAgfVxuICAvLyBPbmx5IGBidW4gcnVuIDxzY3JpcHQ+YCBpcyByZWNvZ25pemVkIGFzIGEgd3JhcHBlcjsgYW5vdGhlciBydW5uZXIgc3BlbGxpbmcgd291bGQgZ2V0IGEgbWFuYWdlZFxuICAvLyBnZW5lcmF0aW9uIGFwcGVuZGVkIG5leHQgdG8gaXQgYW5kIHJ1biBldmVyeSBnZW5lcmF0b3IgdHdpY2UgcGVyIGluc3RhbGwuIFdpdGhvdXQgYSBnZW4tY29kZVxuICAvLyBwaXBlbGluZSBub3RoaW5nIGlzIGFwcGVuZGVkLCBzbyB0aGUgc3BlbGxpbmcgaXMgaXJyZWxldmFudCB0aGVyZS5cbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0cy5wb3N0aW5zdGFsbCA/PyAnJykgPz8gW10pIHtcbiAgICBjb25zdCBzY3JpcHROYW1lID0gL14oPzpidW58YnVueCkoPzpcXHMrLS1idW4pPyg/OlxccytydW4pP1xccysoXFxTKykkL3UuZXhlYyhzZWdtZW50KT8uWzFdO1xuICAgIGNvbnN0IHRhcmdldCA9IHNjcmlwdE5hbWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgaWYgKFxuICAgICAgdGFyZ2V0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHNlZ21lbnQgIT09IGBidW4gcnVuICR7c2NyaXB0TmFtZX1gICYmXG4gICAgICAoc2NyaXB0c1snZ2VuLWNvZGUnXSAhPT0gdW5kZWZpbmVkIHx8IHRhcmdldC5pbmNsdWRlcygnd2IgZ2VuLWNvZGUnKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBgcG9zdGluc3RhbGwgbXVzdCBpbnZva2UgdGhlICR7c2NyaXB0TmFtZX0gc2NyaXB0IGFzIGJ1biBydW4gJHtzY3JpcHROYW1lfWA7XG4gICAgfVxuICB9XG4gIGlmIChcbiAgICAvKD86XnwmJilcXHMqKD86bnBtfG5weHxwbnBtfHlhcm4pXFxzKyg/OnJ1big/Oi1zY3JpcHQpP1xccyspPyg/Omdlbi1jb2RlfHdiXFxzK2dlbi1jb2RlKVxccyooPzomJnwkKS91LnRlc3QoXG4gICAgICBzY3JpcHRzLnBvc3RpbnN0YWxsID8/ICcnXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gJ3Bvc3RpbnN0YWxsIG11c3QgdXNlIGJ1biB3YiBnZW4tY29kZSBpbnN0ZWFkIG9mIGEgbm9uLUJ1biBnZW4tY29kZSBydW5uZXInO1xuICB9XG4gIGZvciAoY29uc3QgW25hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoc2NyaXB0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmICh3cmFuZ2xlclR5cGVzVGV4dFBhdHRlcm4udGVzdChzY3JpcHQpKSByZXR1cm4gYCR7bmFtZX0gbXVzdCB1c2UgYnVuIHdiIGdlbi1jb2RlIGluc3RlYWQgb2Ygd3JhbmdsZXIgdHlwZXNgO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1dyYW5nbGVyRGVwZW5kZW5jeShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIFtcbiAgICBwYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIHBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/Lm9wdGlvbmFsRGVwZW5kZW5jaWVzLFxuICAgIHBhY2thZ2VKc29uPy5wZWVyRGVwZW5kZW5jaWVzLFxuICBdLnNvbWUoKGRlcGVuZGVuY2llcykgPT4gZGVwZW5kZW5jaWVzPy53cmFuZ2xlciAhPT0gdW5kZWZpbmVkKTtcbn1cblxuY29uc3Qgc2hlbGxXb3JkUGF0dGVybiA9IFN0cmluZy5yYXdgKD86XCIoPzpcXFxcLnxbXlwiXFxcXF0pKlwifCcoPzpcXFxcLnxbXidcXFxcXSkqJ3woPzpcXFxcLnxbXlxcc1wiJ1xcXFxdKSspYDtcbmNvbnN0IHdyYW5nbGVyT3B0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgXFxzKy0tP1tBLVphLXpdW1xcdy1dKig/Oj0ke3NoZWxsV29yZFBhdHRlcm59fFxccysoPyEtfHR5cGVzXFxiKSR7c2hlbGxXb3JkUGF0dGVybn0pP2A7XG5jb25zdCB3cmFuZ2xlclR5cGVzVGV4dFBhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICBTdHJpbmcucmF3YFtcIiddP1xcYndyYW5nbGVyKD86QFteXFxzXCInXSspP1xcYltcIiddPyg/OiR7d3JhbmdsZXJPcHRpb25QYXR0ZXJufSkqXFxzK3R5cGVzXFxiYCxcbiAgJ3UnXG4pO1xuXG4vKipcbiAqIEEgcGFja2FnZSB3aG9zZSBUeXBlU2NyaXB0IHByb2plY3QgY2Fubm90IGluY2x1ZGUgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyAoZS5nLiBvbmUgb24gYSBoYW5kLW1haW50YWluZWRcbiAqIG1pbmltYWwgYEVudmAgd2l0aCBgdHlwZXM6IFtcImJ1blwiXWAsIHRoZSBzdGFuZGFyZCBlc2NhcGUgd2hlbiB0aGUgYW1iaWVudCB3cmFuZ2xlciBnbG9iYWxzIGNvbmZsaWN0IHdpdGggdGhlXG4gKiBgQHR5cGVzL2J1bmAgZ2xvYmFscyBpdHMgdGVzdHMgbmVlZCkgZ2FpbnMgbm90aGluZyBmcm9tIHJlZ2VuZXJhdGluZyB0aGUgfjUwMEtCIGZpbGUgb24gZXZlcnkgaW5zdGFsbCwgc28gd2JmeVxuICogbGVhdmVzIHN1Y2ggcGFja2FnZXMgdW5tYW5hZ2VkIGluc3RlYWQgb2YgcmUtYWRkaW5nIHRoZSBnZW5lcmF0aW9uIHN0ZXAuIENvbnN1bXB0aW9uIGlzIGRldGVjdGVkIHR3byB3YXlzOlxuICogYSB0ZXh0dWFsIGB3b3JrZXItY29uZmlndXJhdGlvbmAgcmVmZXJlbmNlIGluIGFueSB0cmFja2VkIGZpbGUgb2YgdGhlIHBhY2thZ2UgKGNvdmVycyBpbXBvcnRzLCB0cmlwbGUtc2xhc2hcbiAqIHJlZmVyZW5jZXMsIGFuZCBleHBsaWNpdCB0c2NvbmZpZyBlbnRyaWVzKSwgb3IgYSBgZmlsZXNgL2BpbmNsdWRlYC9gZXhjbHVkZWAgc2V0IHRoYXQgY2FuIG1hdGNoIHRoZSBmaWxlIOKAlFxuICogcmVzb2x2ZWQgdGhyb3VnaCByZWxhdGl2ZSBgZXh0ZW5kc2AgY2hhaW5zIHdpdGggZWFjaCBwYXR0ZXJuIGtlcHQgcmVsYXRpdmUgdG8gdGhlIGNvbmZpZyB0aGF0IGRlY2xhcmVkIGl0LFxuICogbWF0Y2hpbmcgdHNjLiBXaGVuZXZlciB0aGUgZWZmZWN0aXZlIHNldCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCAobWlzc2luZyBvciB1bnBhcnNlYWJsZSB0c2NvbmZpZywgcGFja2FnZS1uYW1lXG4gKiBgZXh0ZW5kc2AgcHJlc2V0cywgb3IgVHlwZVNjcmlwdCdzIGRlZmF1bHQgYCoqYCBpbmNsdXNpb24pLCB0aGUgY3VycmVudCBtYW5hZ2VkIGJlaGF2aW9yIGlzIGtlcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzKGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGlyUGF0aCc+KTogYm9vbGVhbiB7XG4gIC8vIGBnaXQgZ3JlcGAgc2VhcmNoZXMgdHJhY2tlZCBmaWxlcyBvbmx5LCBzbyB0aGUgZ2l0aWdub3JlZCBnZW5lcmF0ZWQgZmlsZSBpdHNlbGYgbmV2ZXIgbWF0Y2hlcy5cbiAgLy8gd2JmeSdzIG93biBtYW5hZ2VkIGFydGlmYWN0cyBhcmUgZXhjbHVkZWQ6IHRoZSBgLmdpdGlnbm9yZWAgcnVsZSAoYC93b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYClcbiAgLy8gd2JmeSBjb21taXR0ZWQgd2hpbGUgaXQgbWFuYWdlZCB0aGUgcGFja2FnZSBtdXN0IG5vdCBjb3VudCBhcyBjb25zdW1wdGlvbiwgb3IgYSBvbmNlLW1hbmFnZWRcbiAgLy8gcGFja2FnZSBjb3VsZCBuZXZlciBvcHQgb3V0LlxuICBjb25zdCBncmVwUmVzdWx0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICdnaXQnLFxuICAgIC8vIHRzY29uZmlnIGZpbGVzIGFyZSBjbGFzc2lmaWVkIGJ5IHRoZSByZXNvbHZlZCBmaWxlcy9pbmNsdWRlL2V4Y2x1ZGUgbG9naWMgYmVsb3cg4oCUIGEgdGV4dHVhbFxuICAgIC8vIGhpdCB0aGVyZSAoZS5nLiBhbiBgZXhjbHVkZWAgZW50cnkpIG11c3Qgbm90IGNvdW50IGFzIGNvbnN1bXB0aW9uLlxuICAgIFtcbiAgICAgICdncmVwJyxcbiAgICAgICctbCcsXG4gICAgICAnd29ya2VyLWNvbmZpZ3VyYXRpb24nLFxuICAgICAgJy0tJyxcbiAgICAgICcuJyxcbiAgICAgICc6KGV4Y2x1ZGUpLmdpdGlnbm9yZScsXG4gICAgICAnOihleGNsdWRlKS5naXRhdHRyaWJ1dGVzJyxcbiAgICAgIFN0cmluZy5yYXdgOihnbG9iLGV4Y2x1ZGUpKiovdHNjb25maWcqLmpzb25gLFxuICAgIF0sXG4gICAgY29uZmlnLmRpclBhdGhcbiAgKTtcbiAgaWYgKGdyZXBSZXN1bHQudHJpbSgpKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zdCB3b3JrZXJUeXBlc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJyk7XG4gIGNvbnN0IGZpbGVTZXQgPSByZXNvbHZlVHNjb25maWdGaWxlU2V0KHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKSwgY29uZmlnLmRpclBhdGgsIDUpO1xuICBpZiAoIWZpbGVTZXQpIHJldHVybiB0cnVlO1xuICBjb25zdCBtYXRjaGVzID0gKHBhdHRlcm5TZXQ6IFRzY29uZmlnUGF0dGVyblNldCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICghcGF0dGVyblNldCB8fCAhQXJyYXkuaXNBcnJheShwYXR0ZXJuU2V0LnBhdHRlcm5zKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocGF0dGVyblNldC5iYXNlRGlyUGF0aCwgd29ya2VyVHlwZXNQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICByZXR1cm4gcGF0dGVyblNldC5wYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBgJHtjb25maWdEaXJ9YC1wcmVmaXhlZCBwYXR0ZXJucyB3ZXJlIGV4cGFuZGVkIHRvIGFic29sdXRlIHBhdGhzIGF0IHJlc29sdmUgdGltZS5cbiAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUocGF0dGVybikpIHtcbiAgICAgICAgcmV0dXJuIHRzY29uZmlnUGF0dGVybkNvdWxkTWF0Y2hQYXRoKHBhdHRlcm4sIHdvcmtlclR5cGVzUGF0aCwgcGF0dGVyblNldC5leHBhbmRzRGlyZWN0b3JpZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHNjb25maWdQYXR0ZXJuQ291bGRNYXRjaFBhdGgocGF0dGVybiwgcmVsYXRpdmVQYXRoLCBwYXR0ZXJuU2V0LmV4cGFuZHNEaXJlY3Rvcmllcyk7XG4gICAgfSk7XG4gIH07XG4gIC8vIGBmaWxlc2AgZW50cmllcyBhcmUgYWx3YXlzIHBhcnQgb2YgdGhlIHByb2dyYW0sIGV2ZW4gd2hlbiBgZXhjbHVkZWAgbWF0Y2hlcyB0aGVtLlxuICBpZiAobWF0Y2hlcyhmaWxlU2V0LmZpbGVzKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtYXRjaGVzKGZpbGVTZXQuZXhjbHVkZSkpIHJldHVybiBmYWxzZTtcbiAgLy8gTmVpdGhlciBpbmNsdWRlIG5vciBmaWxlcyBkZWNsYXJlZDogVHlwZVNjcmlwdCdzIGRlZmF1bHQgYCoqYCBpbmNsdXNpb24gY292ZXJzIHRoZSBmaWxlLlxuICBpZiAoIWZpbGVTZXQuaW5jbHVkZSAmJiAhZmlsZVNldC5maWxlcykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBtYXRjaGVzKGZpbGVTZXQuaW5jbHVkZSk7XG59XG5cbmludGVyZmFjZSBUc2NvbmZpZ1BhdHRlcm5TZXQge1xuICAvKiogRGlyZWN0b3J5IG9mIHRoZSBjb25maWcgdGhhdCBkZWNsYXJlZCB0aGUgcGF0dGVybnM7IHRzYyByZXNvbHZlcyB0aGVtIHJlbGF0aXZlIHRvIGl0LiAqL1xuICBiYXNlRGlyUGF0aDogc3RyaW5nO1xuICAvKiogaW5jbHVkZS9leGNsdWRlIHRyZWF0IGFuIGV4dGVuc2lvbmxlc3Mgbm9uLWdsb2IgcGF0dGVybiBhcyBhIGRpcmVjdG9yeSBzdWJ0cmVlOyBgZmlsZXNgIGRvZXMgbm90LiAqL1xuICBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW47XG4gIHBhdHRlcm5zOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgVHNjb25maWdGaWxlU2V0IHtcbiAgZXhjbHVkZT86IFRzY29uZmlnUGF0dGVyblNldDtcbiAgZmlsZXM/OiBUc2NvbmZpZ1BhdHRlcm5TZXQ7XG4gIGluY2x1ZGU/OiBUc2NvbmZpZ1BhdHRlcm5TZXQ7XG59XG5cbi8qKiBSZXNvbHZlcyBmaWxlcy9pbmNsdWRlL2V4Y2x1ZGUgdGhyb3VnaCByZWxhdGl2ZSBgZXh0ZW5kc2AgY2hhaW5zOyB1bmRlZmluZWQgd2hlbiB1bnJlYWRhYmxlLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRzY29uZmlnRmlsZVNldChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uc3VtZXJEaXJQYXRoOiBzdHJpbmcsXG4gIHJlbWFpbmluZ0RlcHRoOiBudW1iZXJcbik6IFRzY29uZmlnRmlsZVNldCB8IHVuZGVmaW5lZCB7XG4gIGlmIChyZW1haW5pbmdEZXB0aCA8PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgdHNjb25maWcgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPHtcbiAgICBleGNsdWRlPzogdW5rbm93bjtcbiAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICBmaWxlcz86IHVua25vd247XG4gICAgaW5jbHVkZT86IHVua25vd247XG4gIH0+KGNvbnRlbnQpO1xuICBpZiAoIXRzY29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcbiAgLy8gYCR7Y29uZmlnRGlyfWAgcmVzb2x2ZXMgdG8gdGhlIGRpcmVjdG9yeSBvZiB0aGUgUk9PVCAoY29uc3VtaW5nKSBjb25maWcsIHdoZXJldmVyIGl0IGFwcGVhcnMuXG4gIGNvbnN0IHRvUGF0dGVyblNldCA9IChwYXR0ZXJuczogdW5rbm93biwgZXhwYW5kc0RpcmVjdG9yaWVzOiBib29sZWFuKTogVHNjb25maWdQYXR0ZXJuU2V0IHwgdW5kZWZpbmVkID0+XG4gICAgQXJyYXkuaXNBcnJheShwYXR0ZXJucylcbiAgICAgID8ge1xuICAgICAgICAgIGJhc2VEaXJQYXRoOiBkaXJQYXRoLFxuICAgICAgICAgIGV4cGFuZHNEaXJlY3RvcmllcyxcbiAgICAgICAgICBwYXR0ZXJuczogcGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PlxuICAgICAgICAgICAgdHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnICYmIHBhdHRlcm4uc3RhcnRzV2l0aCgnJHtjb25maWdEaXJ9JylcbiAgICAgICAgICAgICAgPyBwYXRoLmpvaW4oY29uc3VtZXJEaXJQYXRoLCBwYXR0ZXJuLnNsaWNlKCcke2NvbmZpZ0Rpcn0nLmxlbmd0aCkpXG4gICAgICAgICAgICAgIDogcGF0dGVyblxuICAgICAgICAgICksXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBmaWxlU2V0OiBUc2NvbmZpZ0ZpbGVTZXQgPSB7XG4gICAgZXhjbHVkZTogdG9QYXR0ZXJuU2V0KHRzY29uZmlnLmV4Y2x1ZGUsIHRydWUpLFxuICAgIGZpbGVzOiB0b1BhdHRlcm5TZXQodHNjb25maWcuZmlsZXMsIGZhbHNlKSxcbiAgICBpbmNsdWRlOiB0b1BhdHRlcm5TZXQodHNjb25maWcuaW5jbHVkZSwgdHJ1ZSksXG4gIH07XG4gIGNvbnN0IHBhcmVudHMgPVxuICAgIHR5cGVvZiB0c2NvbmZpZy5leHRlbmRzID09PSAnc3RyaW5nJyA/IFt0c2NvbmZpZy5leHRlbmRzXSA6IEFycmF5LmlzQXJyYXkodHNjb25maWcuZXh0ZW5kcykgPyB0c2NvbmZpZy5leHRlbmRzIDogW107XG4gIC8vIFdpdGggYW4gYGV4dGVuZHNgIGFycmF5LCBsYXRlciBlbnRyaWVzIG92ZXJyaWRlIGVhcmxpZXIgb25lcywgYW5kIHRoZSBjaGlsZCBvdmVycmlkZXMgYWxsIOKAlFxuICAvLyBzbyBmaWxsIGVhY2ggc3RpbGwtbWlzc2luZyBrZXkgZnJvbSB0aGUgbGFzdCBwYXJlbnQgdGhhdCBkZWZpbmVzIGl0LlxuICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRzLnRvUmV2ZXJzZWQoKSkge1xuICAgIGlmIChmaWxlU2V0LmV4Y2x1ZGUgJiYgZmlsZVNldC5maWxlcyAmJiBmaWxlU2V0LmluY2x1ZGUpIGJyZWFrO1xuICAgIC8vIFBhY2thZ2UtbmFtZSBleHRlbmRzIChlLmcuIGBAdHNjb25maWcvYnVuYCkgYXJlIGNvbXBpbGVyT3B0aW9ucyBwcmVzZXRzIHdpdGhvdXQgZmlsZSBzZXRzLlxuICAgIGlmICh0eXBlb2YgcGFyZW50ICE9PSAnc3RyaW5nJyB8fCAhcGFyZW50LnN0YXJ0c1dpdGgoJy4nKSkgY29udGludWU7XG4gICAgbGV0IHBhcmVudFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgcGFyZW50KTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFyZW50UGF0aCkgJiYgZnMuZXhpc3RzU3luYyhgJHtwYXJlbnRQYXRofS5qc29uYCkpIHBhcmVudFBhdGggKz0gJy5qc29uJztcbiAgICBjb25zdCBwYXJlbnRGaWxlU2V0ID0gcmVzb2x2ZVRzY29uZmlnRmlsZVNldChwYXJlbnRQYXRoLCBjb25zdW1lckRpclBhdGgsIHJlbWFpbmluZ0RlcHRoIC0gMSk7XG4gICAgaWYgKCFwYXJlbnRGaWxlU2V0KSBjb250aW51ZTtcbiAgICBmaWxlU2V0LmV4Y2x1ZGUgPz89IHBhcmVudEZpbGVTZXQuZXhjbHVkZTtcbiAgICBmaWxlU2V0LmZpbGVzID8/PSBwYXJlbnRGaWxlU2V0LmZpbGVzO1xuICAgIGZpbGVTZXQuaW5jbHVkZSA/Pz0gcGFyZW50RmlsZVNldC5pbmNsdWRlO1xuICB9XG4gIHJldHVybiBmaWxlU2V0O1xufVxuXG5mdW5jdGlvbiB0c2NvbmZpZ1BhdHRlcm5Db3VsZE1hdGNoUGF0aChwYXR0ZXJuOiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZywgZXhwYW5kc0RpcmVjdG9yaWVzOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXR0ZXJuLnJlcGxhY2UoL15cXC5cXC8vdSwgJycpO1xuICAvLyBBIGJhcmUgYC5gIGluY2x1ZGUgY292ZXJzIGV2ZXJ5dGhpbmcgdW5kZXIgdGhlIGNvbmZpZydzIGRpcmVjdG9yeS5cbiAgaWYgKG5vcm1hbGl6ZWQgPT09ICcnIHx8IG5vcm1hbGl6ZWQgPT09ICcuJykgcmV0dXJuIHRydWU7XG4gIC8vIEFic29sdXRlIHBhdHRlcm5zIChleHBhbmRlZCBgJHtjb25maWdEaXJ9YCkgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgYWJzb2x1dGUgdGFyZ2V0OyBkcm9wIHRoZVxuICAvLyBsZWFkaW5nIHNsYXNoZXMgZnJvbSBib3RoIHNvIHRoZSBzZWdtZW50LWJ1aWx0IHJlZ2V4IGFuY2hvcnMgaWRlbnRpY2FsbHkuXG4gIHRhcmdldFBhdGggPSB0YXJnZXRQYXRoLnJlcGxhY2UoL15cXC8rL3UsICcnKTtcbiAgY29uc3Qgc2VnbWVudHMgPSBub3JtYWxpemVkLnNwbGl0KCcvJykuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50ICE9PSAnJyk7XG4gIGNvbnN0IHJlZ2V4U291cmNlID0gc2VnbWVudHNcbiAgICAubWFwKChzZWdtZW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPT09IHNlZ21lbnRzLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoc2VnbWVudCA9PT0gJyoqJykgcmV0dXJuIGlzTGFzdCA/ICcuKicgOiBTdHJpbmcucmF3YCg/OlteL10rLykqYDtcbiAgICAgIGNvbnN0IHNlZ21lbnRTb3VyY2UgPSBzZWdtZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9bLiteJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKVxuICAgICAgICAucmVwbGFjZUFsbCgnKicsIFN0cmluZy5yYXdgW14vXSpgKVxuICAgICAgICAucmVwbGFjZUFsbCgnPycsIFN0cmluZy5yYXdgW14vXWApO1xuICAgICAgcmV0dXJuIGlzTGFzdCA/IHNlZ21lbnRTb3VyY2UgOiBgJHtzZWdtZW50U291cmNlfS9gO1xuICAgIH0pXG4gICAgLmpvaW4oJycpO1xuICAvLyB0c2MgdHJlYXRzIGFuIGV4dGVuc2lvbmxlc3Mgbm9uLWdsb2IgaW5jbHVkZS9leGNsdWRlIGVudHJ5IGFzIGEgZGlyZWN0b3J5IHdob3NlIHN1YnRyZWUgaXMgaW5jbHVkZWQuXG4gIGNvbnN0IGxhc3RTZWdtZW50ID0gc2VnbWVudHMuYXQoLTEpID8/ICcnO1xuICBjb25zdCBkaXJlY3RvcnlTdWZmaXggPVxuICAgIGV4cGFuZHNEaXJlY3RvcmllcyAmJiAhL1sqP10vdS50ZXN0KGxhc3RTZWdtZW50KSAmJiAhbGFzdFNlZ21lbnQuaW5jbHVkZXMoJy4nKSA/IFN0cmluZy5yYXdgKD86Ly4qKT9gIDogJyc7XG4gIHJldHVybiBuZXcgUmVnRXhwKGBeJHtyZWdleFNvdXJjZX0ke2RpcmVjdG9yeVN1ZmZpeH0kYCwgJ3UnKS50ZXN0KHRhcmdldFBhdGgpO1xufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgdGhlIGRpcmVjdG9yeSBvd25zIGEgV29ya2VyLCB1bmxpa2UgdGhlIGlzQ2xvdWRmbGFyZSBoZXVyaXN0aWMsIHdoaWNoIGFsc28gbWF0Y2hlcyBhIHBhY2thZ2UgdGhhdFxuICogbWVyZWx5IG1lbnRpb25zIHdyYW5nbGVyIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93IChlLmcuIHRoZSByb290IG9mIGEgbW9ub3JlcG8gd2hvc2UgV29ya2VyIGxpdmVzIGluIGEgc3ViLXBhY2thZ2UpLlxuICovXG5mdW5jdGlvbiBkZXRlY3RXcmFuZ2xlckNvbmZpZyhkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ10uc29tZSgoZmlsZU5hbWUpID0+XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpKVxuICApO1xufVxuXG4vKipcbiAqIERldGVjdHMgd2hldGhlciBkaXJQYXRoIGJlbG9uZ3MgdG8gdGhlIHdpbGxib29zdGVyLWNvbmZpZ3MgcmVwb3NpdG9yeS4gUHJlZmVycyB0aGUgYXV0aG9yaXRhdGl2ZVxuICogR2l0SHViIHJlcG8gbmFtZSwgd2hpY2ggaXMgaW1tdW5lIHRvIHRoZSBsb2NhbCBkaXJlY3RvcnkgbGF5b3V0LiBUaGF0IG5hbWUgaXMgZmV0Y2hlZCBvbmx5IGZvciB0aGVcbiAqIHJvb3QsIHNvIHN1Yi1wYWNrYWdlcyAoYW5kIG9mZmxpbmUgcm9vdHMpIHdhbGsgdXAgdG8gdGhlIG5lYXJlc3QgZ2l0IHJvb3QgYW5kIG1hdGNoIGl0cyBkaXJlY3RvcnlcbiAqIG5hbWU6IGEgc2libGluZyByZXBvIGNsb25lZCB1bmRlciBhIHBhcmVudCBkaXJlY3RvcnkgbmFtZWQgd2lsbGJvb3N0ZXItY29uZmlncyBzdG9wcyBhdCBpdHMgb3duXG4gKiBgLmdpdGAsIHNvIGl0IGlzIG5vdCBtaXNjbGFzc2lmaWVkLiBUaGUgcGF0aCBzZWdtZW50IHJlbWFpbnMgYSBsYXN0IHJlc29ydCB3aGVuIG5vIGdpdCByb290IGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0SXNXaWxsQm9vc3RlckNvbmZpZ3MoZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvblBhdGg6IHN0cmluZywgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAocmVwb05hbWUpIHJldHVybiByZXBvTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnd2lsbGJvb3N0ZXItY29uZmlncyc7XG4gIGxldCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICB3aGlsZSAoY3VycmVudCAhPT0gcGF0aC5kaXJuYW1lKGN1cnJlbnQpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcuZ2l0JykpKSB7XG4gICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShjdXJyZW50KS50b0xvd2VyQ2FzZSgpID09PSAnd2lsbGJvb3N0ZXItY29uZmlncyc7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBwYXRoLmRpcm5hbWUoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIHBhY2thZ2VKc29uUGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCcvd2lsbGJvb3N0ZXItY29uZmlncy8nKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0Q2xvdWRmbGFyZShcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnOiBib29sZWFuLFxuICB3b3JrZmxvd0NvbnRlbnRzOiBzdHJpbmdbXVxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCd3cmFuZ2xlcicpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRvZXNDb250YWluV3JhbmdsZXJDb25maWcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd0NvbnRlbnRzLnNvbWUoKGNvbnRlbnQpID0+IC9jbG91ZGZsYXJlfHdyYW5nbGVyL2l1LnRlc3QoY29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RSYWlsd2F5KGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLCB3b3JrZmxvd0NvbnRlbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cztcbiAgaWYgKHNjcmlwdHMgJiYgT2JqZWN0LnZhbHVlcyhzY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC5pbmNsdWRlcygncmFpbHdheScpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmFpbHdheWlnbm9yZScpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdyYWlsd2F5Lmpzb24nKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncmFpbHdheS50b21sJykpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtmbG93Q29udGVudHMuc29tZSgoY29udGVudCkgPT4gL3JhaWx3YXkvaXUudGVzdChjb250ZW50KSk7XG59XG5cbi8qKiBDb250ZW50cyBvZiB0aGUgcmVhZGFibGUgLmdpdGh1Yi93b3JrZmxvd3MgWUFNTCBmaWxlcywgcmVhZCBvbmNlIGZvciBldmVyeSBkZXRlY3RvciBuZWVkaW5nIHRoZW0uICovXG5mdW5jdGlvbiByZWFkV29ya2Zsb3dGaWxlQ29udGVudHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRkaXJTeW5jKHdvcmtmbG93c1BhdGgpXG4gICAgICAuZmlsdGVyKChmaWxlTmFtZSkgPT4gL1xcLnlhP21sJC9pdS50ZXN0KGZpbGVOYW1lKSlcbiAgICAgIC5mbGF0TWFwKChmaWxlTmFtZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBbZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4JyldO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1pc2VUYXNrcyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7IHRhc2tzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncy50YXNrcyA/PyB7fSkpIHtcbiAgICAgICAgdGFza3NbbmFtZV0gPSByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3Npbmcgb3IgdGVtcG9yYXJpbHkgaW52YWxpZCBtaXNlIGZpbGVzIHNob3VsZCBub3QgYmxvY2sgb3RoZXIgd2JmeSBnZW5lcmF0b3JzLlxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFza3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAvLyBQcmVzZXJ2ZSBhcnJheS1mb3JtIG1pc2UgY29tbWFuZHMgc28gcmVjdXJzaW9uIGNoZWNrcyBjYW4gc3RpbGwgc2VlIHBhY2thZ2Ugc2NyaXB0IGNhbGxzLlxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5maWx0ZXIoKGNvbW1hbmQpOiBjb21tYW5kIGlzIHN0cmluZyA9PiB0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycpLmpvaW4oJ1xcbicpO1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIHJlYWRNaXNlVGFza0NvbW1hbmQoKHZhbHVlIGFzIHsgcnVuPzogdW5rbm93biB9KS5ydW4pO1xuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogV2hldGhlciBkaXJQYXRoIGlzIGEgY2hpbGQgd29ya3NwYWNlIG9mIGFuIGVuY2xvc2luZyBtb25vcmVwbyByb290OiBlaXRoZXIgdGhlIGNvbnZlbnRpb25hbFxuICogYDxyb290Pi9wYWNrYWdlcy88bmFtZT5gIGxheW91dCwgb3IgYSBkaXJlY3RvcnkgbWF0Y2hpbmcgYSB3b3Jrc3BhY2UgcGF0dGVybiBkZWNsYXJlZCBieSBhblxuICogYW5jZXN0b3IgcGFja2FnZS5qc29uIChwYXR0ZXJucyBtYXkgYmUgYXJiaXRyYXJpbHkgZGVlcCwgZS5nLiBgZXhhbXBsZXMvKipgKS4gVGhlIHdhbGsgc3RvcHNcbiAqIGF0IHRoZSBmaXJzdCBnaXQgcmVwb3NpdG9yeSBib3VuZGFyeSBzbyBhbiB1bnJlbGF0ZWQgZW5jbG9zaW5nIHJlcG9zaXRvcnkncyB3b3Jrc3BhY2VzIGNhblxuICogbmV2ZXIgcmVjbGFzc2lmeSBhbiBpbmRlcGVuZGVudCByZXBvc2l0b3J5IGFzIGEgY2hpbGQuXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlT2ZFbmNsb3NpbmdSb290KGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZXNvbHZlZERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIC8vIEEgZGlyZWN0b3J5IHdpdGggaXRzIG93biAuZ2l0IGlzIGEgcmVwb3NpdG9yeSBpbiBpdHMgb3duIHJpZ2h0LCBuZXZlciBhIGNoaWxkIHdvcmtzcGFjZSDigJRcbiAgLy8gY2hlY2tlZCBGSVJTVCBzbyBhbiBpbmRlcGVuZGVudCByZXBvc2l0b3J5IHVuZGVyIHNvbWUgYHBhY2thZ2VzL2AgZGlyZWN0b3J5IHN0YXlzIGEgcm9vdC5cbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy5naXQnKSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKFxuICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy4uJykpID09PSAncGFja2FnZXMnICYmXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocmVzb2x2ZWREaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZvciAoXG4gICAgbGV0IGNhbmRpZGF0ZVJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKHJlc29sdmVkRGlyUGF0aCk7XG4gICAgO1xuICAgIGNhbmRpZGF0ZVJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKGNhbmRpZGF0ZVJvb3REaXJQYXRoKVxuICApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm9vdFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICApIGFzIFBhY2thZ2VKc29uO1xuICAgICAgY29uc3QgcmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgcmVzb2x2ZWREaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZURpclBhdGhzID0gZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh7XG4gICAgICAgIGRpclBhdGg6IGNhbmRpZGF0ZVJvb3REaXJQYXRoLFxuICAgICAgICBwYWNrYWdlSnNvbjogcm9vdFBhY2thZ2VKc29uLFxuICAgICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogZmFsc2UsXG4gICAgICB9KS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT4gcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpO1xuICAgICAgaWYgKHdvcmtzcGFjZURpclBhdGhzLmluY2x1ZGVzKHJlbGF0aXZlRGlyUGF0aCkpIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm8gb3IgdW5wYXJzYWJsZSBtYW5pZmVzdCBhdCB0aGlzIGFuY2VzdG9yOiBrZWVwIHdhbGtpbmcuXG4gICAgfVxuICAgIGNvbnN0IGlzUmVwb0JvdW5kYXJ5ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY2FuZGlkYXRlUm9vdERpclBhdGgsICcuZ2l0JykpO1xuICAgIGNvbnN0IGlzRmlsZXN5c3RlbVJvb3QgPSBjYW5kaWRhdGVSb290RGlyUGF0aCA9PT0gcGF0aC5kaXJuYW1lKGNhbmRpZGF0ZVJvb3REaXJQYXRoKTtcbiAgICBpZiAoaXNSZXBvQm91bmRhcnkgfHwgaXNGaWxlc3lzdGVtUm9vdCkgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuZnVuY3Rpb24gZmluZENhcmdvVG9tbERpclBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGZnXG4gICAgLmdsb2JTeW5jKCcqKi9DYXJnby50b21sJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pXG4gICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGguZGlybmFtZShmaWxlUGF0aCkpXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLnNwbGl0KCcvJykubGVuZ3RoIC0gYi5zcGxpdCgnLycpLmxlbmd0aCB8fCBhLmxvY2FsZUNvbXBhcmUoYikpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RQbGF5d3JpZ2h0UnVudGltZUltcG9ydChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZmlsZXMgPSBmZy5nbG9iU3luYygne2FwcCxzcmN9LyoqLyoue2NqcyxjdHMsanMsanN4LG1qcyxtdHMsdHMsdHN4fScsIHtcbiAgICBkb3Q6IHRydWUsXG4gICAgY3dkOiBkaXJQYXRoLFxuICAgIGlnbm9yZTogWy4uLmdsb2JJZ25vcmUsICcqKi9fX3Rlc3RzX18vKionLCAnKiovKi5zcGVjLionLCAnKiovKi50ZXN0LionLCAnKiovcGxheXdyaWdodC5jb25maWcuKiddLFxuICB9KTtcbiAgY29uc3QgcGxheXdyaWdodEltcG9ydFBhdHRlcm4gPSBidWlsZFJ1bnRpbWVJbXBvcnRSZWdFeHAoJ3BsYXl3cmlnaHQnKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZSksICd1dGY4Jyk7XG4gICAgaWYgKHBsYXl3cmlnaHRJbXBvcnRQYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSdW50aW1lSW1wb3J0UmVnRXhwKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBSZWdFeHAge1xuICAvLyBNYXRjaCB0aGUgYmFyZSBzcGVjaWZpZXIgb3IgYW55IHN1YnBhdGggb2YgaXQgKGBwa2dgIC8gYHBrZy9zdWJgKSwgYnV0IG5ldmVyIGEgZGlmZmVyZW50IHBhY2thZ2VcbiAgLy8gdGhhdCBtZXJlbHkgc2hhcmVzIHRoZSBwcmVmaXggKGBwa2ctb3RoZXJgKSwgc2luY2UgdGhlIGNoYXIgYWZ0ZXIgdGhlIG5hbWUgbXVzdCBiZSBgL2Agb3IgYSBxdW90ZS5cbiAgY29uc3Qgc3BlY2lmaWVyID0gU3RyaW5nLnJhd2BbJ1wiXSR7ZXNjYXBlUmVnRXhwKHBhY2thZ2VOYW1lKX0oPzovW14nXCJdKik/WydcIl1gO1xuICByZXR1cm4gbmV3IFJlZ0V4cChcbiAgICBTdHJpbmcucmF3YFxcYmZyb21cXHMrJHtzcGVjaWZpZXJ9fFxcYmltcG9ydFxccypcXChcXHMqJHtzcGVjaWZpZXJ9XFxzKlxcKXxcXGJyZXF1aXJlXFxzKlxcKFxccyoke3NwZWNpZmllcn1cXHMqXFwpYCxcbiAgICAndSdcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVtb3RlVXJsID0gZ2V0T3JpZ2luUmVtb3RlVXJsKGRpclBhdGgpO1xuICBpZiAocmVtb3RlVXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uLiBUaGUgb3duZXIgTVVTVCBiZSBwYXNzZWQ6IGdldE9jdG9raXQoKSB3aXRob3V0IGl0IHByZWZlcnMgdGhlXG4gICAgLy8gV2lsbEJvb3N0ZXIgUEFULCB3aGljaCBjYW5ub3QgcmVhZCBwcml2YXRlIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcmllcywgY29sbGFwc2luZyB0aGVpclxuICAgIC8vIHZpc2liaWxpdHkgdG8gdW5rbm93biAoYW5kIGUuZy4gc2tpcHBpbmcgdGhlIHdiZnkgY2FsbGVyIGdlbmVyYXRpb24gaW5kZWZpbml0ZWx5KS5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQob3JnKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVkaXJlY3RlZEZ1bGxOYW1lID0gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcik7XG4gICAgaWYgKHJlZGlyZWN0ZWRGdWxsTmFtZSkge1xuICAgICAgLy8gUmUtZmV0Y2ggdW5kZXIgdGhlIHJlZGlyZWN0ZWQgaWRlbnRpdHkgc28gYSByZW5hbWVkIHJlcG9zaXRvcnkgc3RpbGwgZ2V0cyBjb21wbGV0ZVxuICAgICAgLy8gbWV0YWRhdGEgKHZpc2liaWxpdHkgaW5jbHVkZWQpIGluc3RlYWQgb2YgYSBiYXJlIGZ1bGxfbmFtZSB0aGF0IHdvdWxkIGxlYXZlXG4gICAgICAvLyBpc1JlcG9WaXNpYmlsaXR5S25vd24gZmFsc2Ugb24gZXZlcnkgc3Vic2VxdWVudCBydW4gd2l0aCB0aGUgc3RhbGUgcmVtb3RlIFVSTC5cbiAgICAgIGNvbnN0IFtyZWRpcmVjdGVkT3JnLCByZWRpcmVjdGVkTmFtZV0gPSByZWRpcmVjdGVkRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZWRpcmVjdGVkT3JnICYmIHJlZGlyZWN0ZWROYW1lKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KHJlZGlyZWN0ZWRPcmcpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICAgICAgICBvd25lcjogcmVkaXJlY3RlZE9yZyxcbiAgICAgICAgICAgIHJlcG86IHJlZGlyZWN0ZWROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGJhcmUgaWRlbnRpdHkgYmVsb3c6IHRoZSByZXBvc2l0b3J5IGlzIHN0aWxsIGNhbm9uaWNhbGl6ZWQsIG9ubHlcbiAgICAgICAgICAvLyBpdHMgdmlzaWJpbGl0eSBzdGF5cyB1bmtub3duLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBmdWxsX25hbWU6IHJlZGlyZWN0ZWRGdWxsTmFtZSB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGA8b3JnPi88bmFtZT5gIGZyb20gdGhlIGdpdCByZW1vdGUgKGZhbGxpbmcgYmFjayB0byBwYWNrYWdlLmpzb24ncyBgcmVwb3NpdG9yeWApIHdpdGhvdXRcbiAqIGNhbGxpbmcgdGhlIEdpdEh1YiBBUEkuIEl0IHdvcmtzIGZvciBldmVyeSB3b3Jrc3BhY2UgcGFja2FnZSwgbm90IGp1c3QgdGhlIHJvb3Qg4oCUIG9ubHkgdGhlIHJvb3RcbiAqIGZldGNoZXMgcmVwbyBpbmZvIOKAlCBhbmQgaXQga2VlcHMgd29ya2luZyBvZmZsaW5lIG9yIHJhdGUtbGltaXRlZCwgd2hlcmUgYW4gdW5kZWZpbmVkIGlkZW50aXR5XG4gKiB3b3VsZCBzaWxlbnRseSByZWNsYXNzaWZ5IHRoZSByZXBvc2l0b3J5IChlLmcuIG1ha2luZyB3YmZ5IHdyaXRlIHdpbGxib29zdGVyLWNvbmZpZ3MnIFJlbm92YXRlXG4gKiBwcmVzZXQgaW50byB0aGUgcHJlc2V0IGl0c2VsZiBhZ2FpbikuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVMb2NhbFJlcG9JZGVudGl0eShcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb25cbik6IFByb21pc2U8W3N0cmluZyB8IHVuZGVmaW5lZCwgc3RyaW5nIHwgdW5kZWZpbmVkXT4ge1xuICBjb25zdCByZW1vdGVVcmwgPSBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aCk7XG4gIGlmIChyZW1vdGVVcmwpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHJlYWRHaXRIdWJJZGVudGl0eShyZW1vdGVVcmwpO1xuICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHJlYWRHaXRIdWJJZGVudGl0eSh1cmwpO1xuICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIHJldHVybiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdO1xufVxuXG5mdW5jdGlvbiBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydjb25maWcnLCAnLS1nZXQnLCAncmVtb3RlLm9yaWdpbi51cmwnXSwgZGlyUGF0aCkgfHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIGBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWVgIGlzIGhvc3QtYWdub3N0aWMsIHNvIGl0IGhhcHBpbHkgdHVybnMgYSBHaXRMYWIgVVJMIGludG8gYW4gYDxvcmc+LzxyZXBvPmAgcGFpci5cbiAqIEV2ZXJ5dGhpbmcgZG93bnN0cmVhbSB0cmVhdHMgdGhlIHJlc3VsdGluZyBpZGVudGl0eSBhcyBHaXRIdWIgKHRoZSBgZ2l0aHViOmAgcmVwb3NpdG9yeSBmaWVsZCBpcyByZXdyaXR0ZW5cbiAqIGludG8gcGFja2FnZS5qc29uKSwgc28gdGhlIGhvc3QgbXVzdCBiZSB2ZXJpZmllZCBmaXJzdDsgYSBub24tR2l0SHViIHJlbW90ZSB5aWVsZHMgbm8gaWRlbnRpdHksIGFzIGJlZm9yZS5cbiAqL1xuZnVuY3Rpb24gcmVhZEdpdEh1YklkZW50aXR5KHVybDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB8IHVuZGVmaW5lZCB7XG4gIGlmICghdGFyZ2V0c0dpdEh1Yih1cmwpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmwpO1xuICByZXR1cm4gb3JnICYmIG5hbWUgPyBbY2Fub25pY2FsaXplT3duZXIob3JnKSwgbmFtZV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgVVJMJ3MgSE9TVCBpcyBnaXRodWIuY29tLiBQYXJzZWQgcmF0aGVyIHRoYW4gc3Vic3RyaW5nLW1hdGNoZWQ6IGEgcGF0aCBzdWNoIGFzXG4gKiBgaHR0cHM6Ly9naXRsYWIuY29tL2dpdGh1Yi5jb20vb3duZXIvcmVwby5naXRgIHdvdWxkIG90aGVyd2lzZSBiZSB0YWtlbiBmb3IgR2l0SHViLCBhbmQgYW4gdXBwZXJjYXNlXG4gKiBgR0lUSFVCLkNPTWAgd291bGQgYmUgcmVqZWN0ZWQuIGBnaXRodWI6b3duZXIvcmVwb2AgaXMgbnBtJ3Mgc2hvcnRoYW5kIGFuZCBuYW1lcyBubyBob3N0LCBzbyBpdCBpc1xuICogcmVjb2duaXplZCBzZXBhcmF0ZWx5OyBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24gYWNjZXB0cyB0aGUgc2FtZSBzaG9ydGhhbmQuXG4gKi9cbmZ1bmN0aW9uIHRhcmdldHNHaXRIdWIodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKC9eZ2l0aHViOi9pdS50ZXN0KHVybCkpIHJldHVybiB0cnVlO1xuICAvLyBzY3Atc3R5bGUgcmVtb3RlcyAoYGdpdEBnaXRodWIuY29tOm93bmVyL3JlcG8uZ2l0YCkgYXJlIG5vdCB2YWxpZCBVUkxzLlxuICBjb25zdCBzY3BIb3N0ID0gL15bXi9AXSpAKFteOi9dKyk6L3UuZXhlYyh1cmwpPy5bMV07XG4gIGlmIChzY3BIb3N0KSByZXR1cm4gc2NwSG9zdC50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbSc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkwodXJsLnJlcGxhY2UoL15naXRcXCsvdSwgJycpKS5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbSc7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdpdEh1YiBvd25lciBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgYW5kIGEgcmVtb3RlIG9yIG1hbmlmZXN0IFVSTCBtYXkgc3BlbGwgdGhlbSBhbnkgd2F5LCBidXQgdGhlIEFQSSdzXG4gKiBgZnVsbF9uYW1lYCBhbHdheXMgcmV0dXJuZWQgdGhlIGNhbm9uaWNhbCBzcGVsbGluZyDigJQgd2hpY2ggdGhlIG1hbnkgZXhhY3QgYD09PSAnV2lsbEJvb3N0ZXInYCBwb2xpY3kgY2hlY2tzXG4gKiAob3JnYW5pemF0aW9uIHdvcmtmbG93cywgYXV0aG9yIG1ldGFkYXRhLCB0aGUgV2lsbEJvb3N0ZXJMYWIgcHJlLXB1c2ggZ3VhcmQpIGRlcGVuZCBvbi4gQ2Fub25pY2FsaXplIGhlcmUgc29cbiAqIHRoZSBsb2NhbCBmYWxsYmFjayB5aWVsZHMgdGhlIHNhbWUgaWRlbnRpdHkgdGhlIEFQSSBkaWQsIGluc3RlYWQgb2Ygc2lsZW50bHkgc2tpcHBpbmcgdGhvc2UgcG9saWNpZXMuXG4gKi9cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZU93bmVyKG93bmVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYW5vbmljYWxPd25lcnMgPSBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ107XG4gIHJldHVybiBjYW5vbmljYWxPd25lcnMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUudG9Mb3dlckNhc2UoKSA9PT0gb3duZXIudG9Mb3dlckNhc2UoKSkgPz8gb3duZXI7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBJU1NVRV9URU1QTEFURV9SVUxFUywgUFVMTF9SRVFVRVNUX0JPRFlfUlVMRVMsIFRFU1RfV1JJVElOR19SVUxFUyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3csIGludm9rZXNXYkRlcGxveSB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdENvbmZpZy5kaXJQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGFnZW50c0V4dHJhQ29udGVudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcblxuLyoqXG4gKiBSZWFkcyB0aGUgcm9vdCdzIHVzZXItYXV0aG9yZWQgQUdFTlRTX0VYVFJBLm1kIG9uY2UgcGVyIHByb2Nlc3M6IHdiZnkgbmV2ZXIgcmV3cml0ZXMgdGhlIGZpbGUsXG4gKiBhbmQgYm90aCB0aGUgYWdlbnQtaW5zdHJ1Y3Rpb24gYW5kIEdlbWluaSBnZW5lcmF0b3JzIG5lZWQgaXRzIGNvbnRlbnQuIENhY2hpbmcgdGhlIHJlc29sdmVkXG4gKiB2YWx1ZSAobm90IHRoZSBQcm9taXNlKSBpcyByYWNlLWZyZWUgYmVjYXVzZSB0aGUgdHdvIGNhbGxlcnMgcnVuIHNlcXVlbnRpYWxseSBpbiBpbmRleC50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdERpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICBpZiAoIWFnZW50c0V4dHJhQ29udGVudENhY2hlLmhhcyhhZ2VudHNFeHRyYVBhdGgpKSB7XG4gICAgYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuc2V0KGFnZW50c0V4dHJhUGF0aCwgYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoYWdlbnRzRXh0cmFQYXRoKSk7XG4gIH1cbiAgcmV0dXJuIGFnZW50c0V4dHJhQ29udGVudENhY2hlLmdldChhZ2VudHNFeHRyYVBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBmcm9udG1hdHRlciA9IGAtLS1cXG5kZXNjcmlwdGlvbjogR2VuZXJhbCBDb2RpbmcgUnVsZXNcXG5nbG9iczpcXG5hbHdheXNBcHBseTogdHJ1ZVxcbi0tLWA7XG4gIGNvbnN0IGJvZHkgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oY29uZmlnLCBhbGxDb25maWdzLCAnQ3Vyc29yJywgZXh0cmFDb250ZW50KTtcbiAgcmV0dXJuIGAke2Zyb250bWF0dGVyfVxcblxcbiR7Ym9keX1gO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9ICdidW4nO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IHJvb3RDb25maWcucGFja2FnZUpzb24/LmRlc2NyaXB0aW9uO1xuICBjb25zdCBmbm94SW5zdHJ1Y3Rpb24gPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSlcbiAgICA/IGBcXG4tIEVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyBsaXZlIGluIFxcYGZub3gudG9tbFxcYCAobWlzZSArIGZub3gpOyBuZXZlciBjcmVhdGUgXFxgLmVudlxcYCwgXFxgLmVudi4qXFxgLCBvciBcXGAuZGV2LnZhcnNcXGAgZmlsZXMuIFJ1biBjb21tYW5kcyB0aHJvdWdoIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIC4uLlxcYCBvciBcXGBmbm94IHJ1biAtUCA8cHJvZmlsZT4gLS0gPGNvbW1hbmQ+XFxgLiBQcm9maWxlIHNlY3JldHMgbG9hZCBvbmx5IHdoZW4gYSBwcm9maWxlIGlzIHNlbGVjdGVkOiBtb2RlLWF3YXJlIHdiIGNvbW1hbmRzIChlLmcuIFxcYHdiIHN0YXJ0XFxgLCBcXGB3YiB0ZXN0XFxgKSBhbmQgXFxgd2IgZG90ZW52XFxgIHNlbGVjdCBpdCB0aGVtc2VsdmVzIChcXGB3YiBkb3RlbnZcXGAgdXNlcyBcXGBXQl9FTlZcXGAsIGVsc2UgXFxgRk5PWF9QUk9GSUxFXFxgLCBlbHNlIFxcYE5PREVfRU5WXFxgLCBlbHNlIHRoZSBkZXZlbG9wbWVudCBwcm9maWxlOyBcXGBXQl9FTlZcXGAgYWNjZXB0cyBvbmx5IFxcYGRldmVsb3BtZW50XFxgL1xcYHRlc3RcXGAvXFxgc3RhZ2luZ1xcYC9cXGBwcm9kdWN0aW9uXFxgLCBzbyB1c2UgXFxgRk5PWF9QUk9GSUxFXFxgIGZvciBhbnkgb3RoZXIgcHJvZmlsZSksIHdoaWxlIGJhcmUgXFxgZm5veCBydW5cXGAgbmVlZHMgYW4gZXhwbGljaXQgXFxgLVAgPHByb2ZpbGU+XFxgLmBcbiAgICA6ICcnO1xuICAvLyBtaXNlIG93bnMgdGhlIHBpbm5lZCB0b29sIHZlcnNpb25zLCBzbyBhIHZlcnNpb24gbWlzbWF0Y2ggaXMgZml4ZWQgYnkgZWRpdGluZyBtaXNlLnRvbWwg4oCUIG5vdFxuICAvLyBieSBpbnN0YWxsaW5nIGEgZGlmZmVyZW50IHZlcnNpb24gZ2xvYmFsbHksIHdoaWNoIHRoZSBuZXh0IGBtaXNlIGluc3RhbGxgIHNpbGVudGx5IG92ZXJyaWRlcy5cbiAgY29uc3QgbWlzZUluc3RydWN0aW9uID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnbWlzZS50b21sJykpXG4gICAgPyAnXFxuLSBUb29sIHZlcnNpb25zIChlLmcuLCBub2RlKSBhcmUgcGlubmVkIGluIGBtaXNlLnRvbWxgOyBydW4gYG1pc2UgaW5zdGFsbGAgYWZ0ZXIgY2hhbmdpbmcgaXQgYW5kIG5ldmVyIGluc3RhbGwgdGhvc2UgdG9vbHMgZ2xvYmFsbHkgaW5zdGVhZC4nXG4gICAgOiAnJztcbiAgLy8gSXNvbGF0ZWQgaW5zdGFsbHMgYXJlIHRoZSBvcmcgc3RhbmRhcmQgKHdiZnkgZ2VuZXJhdGVzIG5vIG90aGVyIGxpbmtlcikgYW5kIHRoZSBtb3N0XG4gIC8vIGFnZW50LWhvc3RpbGUgcGFydCBvZiB0aGUgc3RhY2s6IGEgcGFja2FnZSB0aGF0IGlzIG9ubHkgcmVhY2hhYmxlIGJlY2F1c2UgYSBkZXBlbmRlbmN5IGhvaXN0ZWRcbiAgLy8gaXQgbm8gbG9uZ2VyIHJlc29sdmVzLCBhbmQgdGhlIHJlZmxleCBmaXggKHN3aXRjaGluZyB0aGUgbGlua2VyIGJhY2spIHNpbGVudGx5IHJlaW50cm9kdWNlc1xuICAvLyB0aGUgcGhhbnRvbSBkZXBlbmRlbmNpZXMgdGhlIGxheW91dCBleGlzdHMgdG8gY2F0Y2guXG4gIGNvbnN0IGlzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9uID0gYFxcbi0gXFxgYnVuZmlnLnRvbWxcXGAgdXNlcyBCdW4ncyBpc29sYXRlZCBsaW5rZXIsIHNvIG9ubHkgZGVjbGFyZWQgZGVwZW5kZW5jaWVzIHJlc29sdmUuIElmIGFuIGltcG9ydCBmYWlscyB0byByZXNvbHZlLCBkZWNsYXJlIHRoYXQgcGFja2FnZSBpbiB0aGUgXFxgcGFja2FnZS5qc29uXFxgIHRoYXQgaW1wb3J0cyBpdDsgbmV2ZXIgc3dpdGNoIFxcYGxpbmtlclxcYCB0byBcXGBob2lzdGVkXFxgIG9yIGFkZCB0byBcXGBwdWJsaWNIb2lzdFBhdHRlcm5cXGAgdG8gd29yayBhcm91bmQgaXQuYDtcbiAgLy8gRXZlcnkgY2xhdXNlIHN0YXRlcyBvbmx5IGEgdmVyaWZpZWQgZmFjdCwgcmV1c2luZyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3Mgb3duIGRldGVjdG9yczogdGhlXG4gIC8vIHdyYW5nbGVyLWNvbmZpZyBjbGF1c2UgbmVlZHMgYW4gYWN0dWFsIGNvbmZpZyBmaWxlIChpc0Nsb3VkZmxhcmUgYWxzbyBtYXRjaGVzIGEgbWVyZSB3cmFuZ2xlclxuICAvLyBtZW50aW9uIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93KSwgdGhlIHdvcmtmbG93IGNsYXVzZSBuZWVkcyBhIGxpdmUgcmV1c2FibGUtZGVwbG95IGNhbGxlclxuICAvLyAoWUFNTC1wYXJzZWQgam9icy4qLnVzZXMsIG5vdCBhIHJhdy10ZXh0L2NvbW1lbnQgbWF0Y2gpLCBhbmQgdGhlIGB3YiBkZXBsb3lgIGNsYXVzZSBuZWVkcyBhXG4gIC8vIGRlcGxveSBzY3JpcHQgd2hvc2UgY29tbWFuZCB0b2tlbiBpcyBgd2Ig4oCmIGRlcGxveWAuXG4gIGNvbnN0IG93bnNXcmFuZ2xlckNvbmZpZyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIC8vIE9ubHkgY2xhaW0gdGhlIGZpbGUgaXMgZ2VuZXJhdGVkIHdoZXJlIGl0IGFjdHVhbGx5IGlzOiBhIHBhY2thZ2UgdGhhdCBoYW5kLW1haW50YWlucyBpdHMgYEVudmAgKGUuZy4gdW5kZXJcbiAgLy8gYHR5cGVzOiBbXCJidW5cIl1gKSBpcyBkZWxpYmVyYXRlbHkgbGVmdCB1bm1hbmFnZWQsIGFuZCB0ZWxsaW5nIGFuIGFnZW50IHRvIHJ1biBgd2IgZ2VuLWNvZGVgIHRoZXJlIHdvdWxkIHNlbmRcbiAgLy8gaXQgYWZ0ZXIgYSBmaWxlIHRoYXQgbmV2ZXIgYXBwZWFycyDigJQgYW5kIGF3YXkgZnJvbSB0aGUgYEVudmAgaXQgc2hvdWxkIGJlIGVkaXRpbmcuXG4gIGNvbnN0IG93bnNHZW5lcmF0ZWRXb3JrZXJUeXBlcyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbiAgY29uc3QgaGFzRGVwbG95V29ya2Zsb3cgPSBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3cocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWIvd29ya2Zsb3dzJykpO1xuICBjb25zdCB1c2VzV2JEZXBsb3kgPSBhbGxDb25maWdzLnNvbWUoKGNvbmZpZykgPT4ge1xuICAgIGNvbnN0IGRlcGxveVNjcmlwdCA9IGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uWydkZXBsb3knXTtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIGRlcGxveVNjcmlwdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQsIG5ldyBTZXQoT2JqZWN0LmtleXMoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9KSkpXG4gICAgKTtcbiAgfSk7XG4gIC8vIEluZGVwZW5kZW50IGZhY3RzIHN0YXkgc2VwYXJhdGUgc2VudGVuY2VzOiB0aGUgd29ya2Zsb3cncyBvd24gZGVwbG95IG1lY2hhbmlzbSBpcyBub3RcbiAgLy8gaW5zcGVjdGVkLCBzbyB0aGUgd2ItZGVwbG95IGNsYXVzZSBtdXN0IG5vdCBjbGFpbSB0aGUgd29ya2Zsb3cgaW52b2tlcyBpdC5cbiAgY29uc3QgY2xvdWRmbGFyZUluc3RydWN0aW9uID0gb3duc1dyYW5nbGVyQ29uZmlnXG4gICAgPyBgXFxuLSBUaGlzIHByb2plY3QgcnVucyBvbiBDbG91ZGZsYXJlIFdvcmtlcnM6IHRoZSB3cmFuZ2xlciBjb25maWd1cmF0aW9uIGZpbGUgaG9sZHMgdGhlIFdvcmtlcidzIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBiaW5kaW5ncyBhbmQgcGVyLWVudmlyb25tZW50IG92ZXJyaWRlcy4ke2hhc0RlcGxveVdvcmtmbG93ID8gJyBUaGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgIHBlcmZvcm0gZGVwbG95bWVudHMuJyA6ICcnfSR7dXNlc1diRGVwbG95ID8gJyBUaGUgYGRlcGxveWAgcGFja2FnZSBzY3JpcHQgcnVucyBgd2IgZGVwbG95YC4nIDogJyd9JHtvd25zR2VuZXJhdGVkV29ya2VyVHlwZXMgPyBgXFxuLSBcXGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzXFxgIGlzIGdpdGlnbm9yZWQgYW5kIGdlbmVyYXRlZCBieSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBnZW4tY29kZVxcYDsgYWZ0ZXIgY2hhbmdpbmcgYmluZGluZ3Mgb3IgdmFycyBpbiB0aGUgd3JhbmdsZXIgY29uZmlndXJhdGlvbiwgcmUtcnVuIGl0IGluc3RlYWQgb2YgZWRpdGluZyB0aGUgZmlsZSBieSBoYW5kLmAgOiAnJ31gXG4gICAgOiAnJztcbiAgLy8gV2lsbEJvb3N0ZXIgUmFpbHdheSBwcm9qZWN0IGlkZW50aWZpZXJzIGFyZSBtYW5hZ2VkIGluIGRlcGxveSB3b3JrZmxvdyBzZXR0aW5ncy5cbiAgY29uc3QgcmFpbHdheUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1JhaWx3YXlcbiAgICA/ICdcXG4tIFJhaWx3YXkgcHJvamVjdCBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgLidcbiAgICA6ICcnO1xuICBjb25zdCBwbGF5d3JpZ2h0VGVzdFNlcnZlckluc3RydWN0aW9uID0gaGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoYWxsQ29uZmlncylcbiAgICA/IGBcXG4tIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBzdGFydCAtLW1vZGUgdGVzdFxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gXG4gICAgOiAnJztcbiAgY29uc3QgY29BdXRob3JJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/IGBcXG4gIC0gRW5kIHlvdXIgY29tbWl0IG1lc3NhZ2Ugd2l0aCBhIGJsYW5rIGxpbmUgZm9sbG93ZWQgYnkgXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGAsIHRoZSBvbmx5IEFJIGF0dHJpYnV0aW9uIHRvIGFkZC5gXG4gICAgOiAnJztcbiAgLy8gS2V5ZWQgb24gdGhlIHJlcG9zaXRvcnkgY2xhc3NpZmljYXRpb24gcmF0aGVyIHRoYW4gb24gdGhlIHRlbXBsYXRlIGZpbGVzJyBwcmVzZW5jZTogdGhlIHNhbWVcbiAgLy8gcnVuIHdyaXRlcyB0aGUgdGVtcGxhdGVzIGZvciBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcmllcyBiZWZvcmUgdGhpcyBnZW5lcmF0b3JcbiAgLy8gcnVucywgYW5kIGhhbmQtYWRkZWQgdGVtcGxhdGVzIGVsc2V3aGVyZSBiZWxvbmcgdG8gQUdFTlRTX0VYVFJBLm1kLlxuICBjb25zdCBwclRlbXBsYXRlSW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBgXFxuJHtQVUxMX1JFUVVFU1RfQk9EWV9SVUxFUy5yZXBsYWNlQWxsKC9eL2dtLCAnICAnKX1gXG4gICAgOiAnJztcbiAgLy8gR2F0ZWQgbGlrZSBwclRlbXBsYXRlSW5zdHJ1Y3Rpb246IHRoZSBzZWN0aW9uIGl0IG5hbWVzIGV4aXN0cyBvbmx5IHdoZXJlIHRoZSB0ZW1wbGF0ZSBpcyBnZW5lcmF0ZWQuXG4gIGNvbnN0IHJlcXVpcmVtZW50c0V4ZW1wdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/IFwiLCBhbmQgc28gaXMgdGhlIFBSIGJvZHkncyBSZXF1aXJlbWVudHMgc2VjdGlvbiwgd2hpY2ggcmVjb3JkcyB3aGF0IHdhcyBhc2tlZCBmb3IgcmF0aGVyIHRoYW4gd2hhdCB0aGUgY29kZSBjb250YWluc1wiXG4gICAgOiAnJztcbiAgY29uc3QgaXNzdWVUZW1wbGF0ZUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gYFxcbi0gV2hlbiBjcmVhdGluZyBhbiBpc3N1ZTpcXG4ke0lTU1VFX1RFTVBMQVRFX1JVTEVTLnJlcGxhY2VBbGwoL14vZ20sICcgICcpfWBcbiAgICA6ICcnO1xuICBjb25zdCBydW5uZXJJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/ICdcXG4tIFByaXZhdGUgcmVwb3NpdG9yaWVzIHVzZSBzZWxmLWhvc3RlZCBDSSBydW5uZXJzLiBLZWVwIE9TL3NpemUgY29uc3RyYWludHMgaW4gYW4gZXhwbGljaXQgc2VsZi1ob3N0ZWQgbGFiZWwgYXJyYXk7IGZpeCBtaXNzaW5nIHJ1bm5lciBjYXBhYmlsaXRpZXMgaW5zdGVhZCBvZiBzd2l0Y2hpbmcgdG8gR2l0SHViLWhvc3RlZCBydW5uZXJzLiBUaGUgc29sZSBhcHByb3ZlZCBleGNlcHRpb24gaXMgdGhlIFdpbmRvd3MgZGVza3RvcCBidWlsZCBpbiBXaWxsQm9vc3Rlci9jaGVlcmxpbmdzLidcbiAgICA6ICcnO1xuICBjb25zdCBwcm9qZWN0TmFtZSA9IHJvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoKSk7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6IFxcYCR7cHJvamVjdE5hbWV9XFxgJHtkZXNjcmlwdGlvbiA/IGBcXG4tIERlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufWAgOiAnJ31cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIElmIG9uIFxcYG1haW5cXGAsIGNyZWF0ZSBhIG5ldyBicmFuY2g7IG90aGVyd2lzZSB3b3JrIG9uIHRoZSBjdXJyZW50IGJyYW5jaC5cbi0gUnVuIFxcYGdpdFxcYCBjb21tYW5kcyBvbmUgYXQgYSB0aW1lIHRvIGF2b2lkIFxcYGluZGV4LmxvY2tcXGAgY29uZmxpY3RzLlxuJHtURVNUX1dSSVRJTkdfUlVMRVN9XG4tIFdoZW4gZml4aW5nIGlzc3VlcyAoaW5jbHVkaW5nIHRlc3QgZmFpbHVyZXMpLCBpbnZlc3RpZ2F0ZSB0aGUgcm9vdCBjYXVzZSBmaXJzdCAoZS5nLiwgdmlhIGRlYnVnIGxvZ3Mgb3Igc2NyZWVuc2hvdHMpIGFuZCBmaXggaXQgaW5zdGVhZCBvZiBhcHBseWluZyB3b3JrYXJvdW5kcy5cbi0gQWZ0ZXIgbWFraW5nIGNoYW5nZXMsIHJ1biBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5XFxgICh0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nOyB1cCB0byAxMCBtaW51dGVzKSwgb3IgXFxgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIHZlcmlmeS1mdWxsXFxgIChhbGwgdGVzdHM7IHVwIHRvIDEgaG91cikgaWYgeW91IGNoYW5nZWQgcnVudGltZSBiZWhhdmlvciBvciB0ZXN0cy4gRml4IGVycm9ycyBhbmQgcmUtcnVuIHVudGlsIGl0IHBhc3Nlcy5cbiAgLSBXYWl0IGZvciBpdCB0byBmaW5pc2ggd2l0aG91dCByZXN0YXJ0aW5nIGl0OiBwcmVmZXIgY29tcGxldGlvbiBub3RpZmljYXRpb25zLCBvdGhlcndpc2UgdGhlIGxvbmdlc3QgcGVybWl0dGVkIHdhaXQ7IG5vIG91dHB1dCBkb2VzIG5vdCBtZWFuIGl0IGhhcyBzdG9wcGVkLiBJZiB0aGUgZGlzcGxheWVkIGV4Y2VycHQgaXMgaW5zdWZmaWNpZW50LCByZWFkIHRoZSBpbmRpY2F0ZWQgbG9nIGZpbGUgYmVmb3JlIHJlcnVubmluZy4gSWYgdGhlIGVudmlyb25tZW50IGtpbGxzIGxvbmctcnVubmluZyBjb21tYW5kcywgcnVuIHRoZW0gZGV0YWNoZWQgd2l0aCBhIHNhdmVkIGxvZyBhbmQgZXhpdCBzdGF0dXMuXG4tIE9uY2UgdmVyaWZpZWQsIGNvbW1pdCBhbmQgcHVzaCB0byB0aGUgY3VycmVudCAobm9uLW1haW4pIGJyYW5jaCwgYW5kIGNyZWF0ZSBhIFBSIHZpYSBcXGBnaFxcYCBpZiBub25lIGV4aXN0cyBmb3IgdGhlIGJyYW5jaC5cbiAgLSBGb2xsb3cgdGhlIENvbnZlbnRpb25hbCBDb21taXRzIGZvcm1hdCAoZS5nLiwgXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGApLiR7Y29BdXRob3JJbnN0cnVjdGlvbn1cbiAgLSBBbHdheXMgY3JlYXRlIG5ldyBjb21taXRzOyBhdm9pZCBcXGAtLWFtZW5kXFxgLiR7cHJUZW1wbGF0ZUluc3RydWN0aW9ufSR7aXNzdWVUZW1wbGF0ZUluc3RydWN0aW9ufVxuLSBJbiBhbnkgZXhwbGFuYXRvcnkgdGV4dCAoY29tbWl0IG1lc3NhZ2VzLCBQUiBkZXNjcmlwdGlvbnMsIGRvY3VtZW50YXRpb24sIGNvZGUgY29tbWVudHMsIGV0Yy4pLCBkZXNjcmliZSBvbmx5IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uOiBkcm9wIGFueSBzdGF0ZW1lbnQgbmFtaW5nIGFuIGlkZW50aWZpZXIsIGZlYXR1cmUsIG9yIGNvbmNlcHQgeW91IGNhbm5vdCBjb25maXJtIGV4aXN0cyBpbiB0aGUgZmluYWwgZGlmZiBvciB0aGUgY3VycmVudCBjb2RlYmFzZSAoZS5nLiwgb25lIGFkZGVkIGFuZCBsYXRlciByZW1vdmVkIG9yIHJlbmFtZWQgYWxvbmcgdGhlIHdheSkuIFdoZW5ldmVyIGRvY3VtZW50YXRpb24gb3IgY29tbWVudHMgbm8gbG9uZ2VyIG1hdGNoIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIChyZW1vdmVkIG9wdGlvbnMsIGRlcHJlY2F0ZWQgdXNhZ2UsIG91dGRhdGVkIGJlaGF2aW9yKSwgZGVsZXRlIG9yIHJld3JpdGUgdGhlbSwgZXZlbiBpbiBmaWxlcyB5b3UgYXJlIG5vdCBvdGhlcndpc2UgY2hhbmdpbmcuIE1lbnRpb24gYSBwYXN0IHN0YXRlIG9ubHkgd2hlcmUgaXQgaXMgbmVlZGVkIHRvIHVuZGVyc3RhbmQgd2h5IHRoZSBjdXJyZW50IGRlc2lnbiBpcyBhcyBpdCBpcywgb3Igd2hlbiBleHBsaWNpdGx5IGFza2VkOyBmaWxlcyB0aGF0IHJlY29yZCBoaXN0b3J5IGJ5IGRlc2lnbiAoZS5nLiwgYSBjaGFuZ2Vsb2cpIGFyZSBleGVtcHQke3JlcXVpcmVtZW50c0V4ZW1wdGlvbn0uXG4tIFVzZSBoZXJlZG9jIGZvciBtdWx0aS1saW5lIGNvbW1hbmQgaW5wdXQgKGUuZy4sIFxcYGdpdCBjb21taXQgLUYgLVxcYCwgXFxgZ2ggcHIgY3JlYXRlIC0tYm9keS1maWxlIC1cXGAsIFxcYGdoIGlzc3VlIGNyZWF0ZSAtLWJvZHktZmlsZSAtXFxgKS5cbi0gUHV0IHRlbXBvcmFyeSBmaWxlcyBpbiBcXGAudG1wXFxgOyB1c2UgXFxgL3RtcFxcYCBvbmx5IGZvciBmaWxlcyB0aGF0IG11c3QgbGl2ZSBvdXRzaWRlIHRoZSByZXBvLlxuLSBcXGBBR0VOVFMubWRcXGAsIFxcYENMQVVERS5tZFxcYCwgXFxgR0VNSU5JLm1kXFxgLCBcXGAuY3Vyc29yL3J1bGVzL2dlbmVyYWwubWRjXFxgLCBhbmQgXFxgLmdlbWluaS9zdHlsZWd1aWRlLm1kXFxgIGFyZSBnZW5lcmF0ZWQgZnJvbSBcXGBBR0VOVFNfRVhUUkEubWRcXGAgYW5kIG92ZXJ3cml0dGVuIG9uIGV2ZXJ5IFxcYHdiZnlcXGAgcnVuOyB0byBjaGFuZ2UgYWdlbnQgaW5zdHJ1Y3Rpb25zLCBlZGl0IG9ubHkgXFxgQUdFTlRTX0VYVFJBLm1kXFxgLiR7bWlzZUluc3RydWN0aW9ufSR7aXNvbGF0ZWRJbnN0YWxsSW5zdHJ1Y3Rpb259JHtmbm94SW5zdHJ1Y3Rpb259JHtjbG91ZGZsYXJlSW5zdHJ1Y3Rpb259JHtyYWlsd2F5SW5zdHJ1Y3Rpb259JHtwbGF5d3JpZ2h0VGVzdFNlcnZlckluc3RydWN0aW9ufSR7cnVubmVySW5zdHJ1Y3Rpb259XG5cbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKHJvb3RDb25maWcsIGFsbENvbmZpZ3MpfVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgaGFzTmV3U2VjdGlvbiA9IGV4dHJhQ29udGVudD8udHJpbSgpLnN0YXJ0c1dpdGgoJyMnKTtcbiAgY29uc3Qgbm9ybWFsaXplZEV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudFxuICAgID8gaGFzTmV3U2VjdGlvblxuICAgICAgPyAnXFxuXFxuJyArIGV4dHJhQ29udGVudC50cmltKClcbiAgICAgIDogJ1xcbicgKyBleHRyYUNvbnRlbnRcbiAgICA6ICcnO1xuICByZXR1cm4gYmFzZUNvbnRlbnQgKyBub3JtYWxpemVkRXh0cmFDb250ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZyB7XG4gIC8vIFRhdXJpIGRlc2t0b3AgYXBwcyBzaGlwIFdpbmRvd3MgYnVpbGRzLCBhbmQgdGhlIGJvdW5kYXJ5IGJldHdlZW4gYXBwIGNvZGUgYW5kIHNoYXJlZCBjb2RlIGlzXG4gIC8vIHRvbyBmdXp6eSB0byBzY29wZSB0aGUgbWFjT1MvTGludXgtb25seSBydWxlIHBlciBwYWNrYWdlLCBzbyBzdWNoIHJlcG9zaXRvcmllcyB0YXJnZXQgYWxsXG4gIC8vIHRocmVlIE9TZXMgaW5zdGVhZC5cbiAgY29uc3QgaGFzRGVza3RvcEFwcCA9IGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcudGF1cmkgfHwgYy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcyk7XG4gIC8vIEEgcHVibGljIHJlcG9zaXRvcnkgd2l0aCBubyBgQHdpbGxib29zdGVyL2AgcGFja2FnZSBpcyBPU1MgZm9yIHRoZSBnZW5lcmFsIHB1YmxpYywgd2hvc2UgdXNlcnNcbiAgLy8gbWF5IHJ1biBXaW5kb3dzLCBzbyBubyBPUyByZXN0cmljdGlvbiBhcHBsaWVzIHRoZXJlLiBBbiB1bmtub3duIHZpc2liaWxpdHkgY29sbGFwc2VzIHRvXG4gIC8vIGlzUHVibGljUmVwbz1mYWxzZSBhbmQgdGhlcmVmb3JlIGtlZXBzIHRoZSByZXN0cmljdGl2ZSBkZWZhdWx0LlxuICBjb25zdCBpc0dlbmVyYWxQdWJsaWNPc3MgPVxuICAgIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvICYmIGFsbENvbmZpZ3MuZXZlcnkoKGMpID0+ICFjLnBhY2thZ2VKc29uPy5uYW1lPy5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpO1xuICBjb25zdCBvc0NvbXBhdGliaWxpdHlJbnN0cnVjdGlvbiA9IGlzR2VuZXJhbFB1YmxpY09zc1xuICAgID8gJydcbiAgICA6IGhhc0Rlc2t0b3BBcHBcbiAgICAgID8gJy0gRW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBXaW5kb3dzLCBtYWNPUywgYW5kIExpbnV4LidcbiAgICAgIDogJy0gRW5zdXJlIGNvbXBhdGliaWxpdHkgb25seSB3aXRoIG1hY09TIGFuZCBMaW51eDsgZG8gbm90IGluY2x1ZGUgV2luZG93cy1zcGVjaWZpYyBjb2RlLic7XG4gIC8vIENsb3VkZmxhcmUgV29ya2VycyBleGVjdXRlIGFjcm9zcyBtYW55IGVwaGVtZXJhbCBpc29sYXRlcyBhbmQgdHdvIHJlcXVlc3RzIGFyZSBub3QgZ3VhcmFudGVlZFxuICAvLyB0byBoaXQgdGhlIHNhbWUgaW5zdGFuY2UsIHNvIHRoZSBzaW5nbGUtaW5zdGFuY2Ugc2ltcGxpZmljYXRpb24gc2lsZW50bHkgbG9zZXMgc3RhdGUgdGhlcmUg4oCUXG4gIC8vIGJ1dCBXb3JrZXJzIGRlbGliZXJhdGVseSByZXVzZSBleGVjdXRpb24gY29udGV4dHMsIHNvIGJlc3QtZWZmb3J0IGlzb2xhdGUtbG9jYWwgY2FjaGVzIHN0YXlcbiAgLy8gbGVnaXRpbWF0ZSAoaHR0cHM6Ly9kZXZlbG9wZXJzLmNsb3VkZmxhcmUuY29tL3dvcmtlcnMvcmVmZXJlbmNlL2hvdy13b3JrZXJzLXdvcmtzLykuIFRoZVxuICAvLyBzaWduYWxzIGFyZSBjb3JyZWxhdGVkIFBFUiBQQUNLQUdFOiBhIG1vbm9yZXBvIGNhbiBob3N0IGEgc2luZ2xlLWluc3RhbmNlIHNlcnZlciBhcHAgbmV4dCB0b1xuICAvLyBhbiB1bnJlbGF0ZWQgV29ya2VyLCBhbmQgbmVpdGhlciBtYXkgb3ZlcnJpZGUgdGhlIG90aGVyJ3MgcnVsZS4gZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyBpc1xuICAvLyB0aGUgYWNjdXJhdGUgV29ya2VycyBzaWduYWwgKGlzQ2xvdWRmbGFyZSBhbHNvIG1hdGNoZXMgYSBtZXJlIHdyYW5nbGVyIG1lbnRpb24gaW4gYSBzY3JpcHQgb3JcbiAgLy8gd29ya2Zsb3cpLlxuICBjb25zdCBoYXNXb3JrZXJzQXBwID0gYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRvZXNDb250YWluV3JhbmdsZXJDb25maWcpO1xuICBjb25zdCBoYXNTaW5nbGVJbnN0YW5jZVNlcnZlckFwcCA9IGFsbENvbmZpZ3Muc29tZShcbiAgICAoYykgPT4gKGMuZGVwZW5kaW5nLm5leHQgfHwgYy5kZXBlbmRpbmcudmluZXh0KSAmJiAhYy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnXG4gICk7XG4gIGNvbnN0IHdvcmtlcnNJbnN0cnVjdGlvbiA9XG4gICAgJy0gQ2xvdWRmbGFyZSBXb3JrZXJzIHJ1biBhY3Jvc3MgbWFueSBlcGhlbWVyYWwgaXNvbGF0ZXMsIHNvIHR3byByZXF1ZXN0cyBtYXkgaGl0IGRpZmZlcmVudCBpbnN0YW5jZXM6IG5ldmVyIGxldCBjb3JyZWN0bmVzcyBkZXBlbmQgb24gbW9kdWxlLWxldmVsIG11dGFibGUgc3RhdGU7IHBlcnNpc3QgYXV0aG9yaXRhdGl2ZSBzaGFyZWQgc3RhdGUgaW4gYmluZGluZ3MgKEQxLCBLViwgUjIsIER1cmFibGUgT2JqZWN0cykuIEJlc3QtZWZmb3J0IGlzb2xhdGUtbG9jYWwgY2FjaGVzIG9mIG5vbi1yZXF1ZXN0LXNjb3BlZCBkYXRhIGFyZSBmaW5lLic7XG4gIGNvbnN0IHNlcnZlckluc3RhbmNlSW5zdHJ1Y3Rpb24gPSBoYXNXb3JrZXJzQXBwXG4gICAgPyBoYXNTaW5nbGVJbnN0YW5jZVNlcnZlckFwcFxuICAgICAgPyBgJHt3b3JrZXJzSW5zdHJ1Y3Rpb259IFRoaXMgYXBwbGllcyB0byBhbGwgY29kZSBydW5uaW5nIG9uIENsb3VkZmxhcmUgV29ya2VycyAodGhlIHdyYW5nbGVyLWNvbmZpZ3VyZWQgcGFja2FnZXMgYW5kIGFueSB3b3Jrc3BhY2UgcGFja2FnZSB0aGV5IGltcG9ydCk7IGFzc3VtZSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UgZm9yIHRoZSBvdGhlciBzZXJ2ZXIgYXBwcy5gXG4gICAgICA6IHdvcmtlcnNJbnN0cnVjdGlvblxuICAgIDogaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHBcbiAgICAgID8gJy0gQXNzdW1lIGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZS4nXG4gICAgICA6ICcnO1xuICAvLyBLZWVwIHRvcC1kb3duIG9yZGVyaW5nIGd1aWRhbmNlIGZ1bmN0aW9uLW9ubHkgYmVjYXVzZSBjbGFzc2VzIGFyZSBub3QgaG9pc3RlZCBhbmQgY2FuIGZhaWwgd2hlbiBpbmhlcml0YW5jZSBvciB0b3AtbGV2ZWwgaW5zdGFudGlhdGlvbiBkZXBlbmRzIG9uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICByZXR1cm4gYFxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gVXNlIGNhbWVsQ2FzZSBmaWxlIG5hbWVzIGZvciBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgKFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMpLlxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBtb2R1bGVzIGFuZCBkaXJlY3RvcmllcyB3aXRoIGhpZ2ggY29oZXNpb24gYW5kIGxvdyBjb3VwbGluZzsgc3BsaXQgbGFyZ2UgbW9kdWxlcyB3aGVuIG5lZWRlZC5cbi0gUGxhY2UgY2FsbGluZyBmdW5jdGlvbnMgYWJvdmUgdGhlIGZ1bmN0aW9ucyB0aGV5IGNhbGwgKHRvcC1kb3duIG9yZGVyKTsgcGxhY2UgdmFyaWFibGUgYW5kIHR5cGUgZGVjbGFyYXRpb25zIGFib3ZlIHRoZWlyIHVzYWdlLlxuLSBXcml0ZSBjb21tZW50cyBhbmQgSlNEb2Mgb25seSBmb3IgaGFyZC10by11bmRlcnN0YW5kIGNvZGU6IGV4cGxhaW4gXCJ3aHlcIiBpbiBjb21tZW50cyBhbmQgXCJ3aGF0XCIgaW4gSlNEb2MuXG4tIE5ldmVyIGV4cGxhaW4gaG93IFdpbGxCb29zdGVyJ3MgaW4taG91c2UgdG9vbHMgKGUuZy4sIFxcYHdiXFxgLCBcXGB3YmZ5XFxgKSB3b3JrIGluIGNvZGUgY29tbWVudHMgb3IgZG9jdW1lbnRzIG91dHNpZGUgdGhlIHRvb2wncyBvd24gcGFja2FnZSwgZXhjZXB0IGluIGluc3RydWN0aW9ucyBmb3IgQUkgYWdlbnRzIChlLmcuLCBkbyBub3Qgbm90ZSB0aGF0IFxcYFBPUlRcXGAgaXMgdW5zZXQgYmVjYXVzZSBcXGB3YlxcYCBwaWNrcyBhIGZyZWUgcG9ydCkuXG4tIElmIGxpbnQgZXJyb3JzIG9yIHdhcm5pbmdzIGNhbm5vdCBiZSBmaXhlZCwgdXNlIGlnbm9yZSBjb21tZW50cyB3aXRoIHJlYXNvbnMgKGUuZy4sIFxcYC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSA8cnVsZT4gLS0gPHJlYXNvbj5cXGApLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgcmVxdWlyZWQgYnkgQVBJcyBvciBsaWJyYXJpZXMuXG4tIFZhbGlkYXRlIEphdmFTY3JpcHQgb2JqZWN0cyAoZS5nLiwgcGFyc2VkIEpTT04sIEFQSSByZXNwb25zZXMpIHdpdGggXFxgem9kXFxgIHdoZW5ldmVyIHBvc3NpYmxlIGluc3RlYWQgb2YgaGFuZC13cml0dGVuIGNoZWNrcyBvciB0eXBlIGFzc2VydGlvbnMuXG4tIEJ1aWxkIHByb21wdHMgYXMgYSBzaW5nbGUgdGVtcGxhdGUgbGl0ZXJhbCBpbnN0ZWFkIG9mIFxcYGpvaW4oKVxcYCBvbiBhIHByZS1jb21wdXRhYmxlIGFycmF5IG9mIHN0cmluZ3MuXG4tIEFzc3VtZSBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBkZWZpbmVkOyBpZiB2YWxpZGF0aW9uIGlzIG5lZWRlZCwgXFxgYXNzZXJ0XFxgIHRoZW0gYXQgc3RhcnR1cCB0byBmYWlsIGZhc3QuXG4tIEFzc3VtZSBsb2NhbCB0b29scyBzdWNoIGFzIFxcYGdpdFxcYCwgXFxgZ2hcXGAsIGFuZCBcXGBnaHFcXGAgYXJlIGluc3RhbGxlZCBhbmQgYXV0aGVudGljYXRlZC5cbiR7b3NDb21wYXRpYmlsaXR5SW5zdHJ1Y3Rpb259XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLmdlbkkxOG5UcylcbiAgICA/IGAtIFJlZ2lzdGVyIHN0cmluZyBsaXRlcmFscyBmb3IgUmVhY3QgY29tcG9uZW50cyBpbiB0aGUgXFxgaTE4blxcYCByZXNvdXJjZSBmaWxlcyAoZS5nLiwgXFxgaTE4bi9qYS1KUC5qc29uXFxgKSBhbmQgcmVmZXJlbmNlIHRoZW0gdmlhIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkgKGUuZy4sIFxcYGkxOG4ucGFnZXMuaG9tZS50aXRsZSgpXFxgIGZvciBcXGB7IFwicGFnZXNcIjogeyBcImhvbWVcIjogeyBcInRpdGxlXCI6IFwiTXkgQXBwXCIgfSB9IH1cXGApLmBcbiAgICA6ICcnXG59XG5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcucmVhY3QgfHwgYy5kZXBlbmRpbmcubmV4dCB8fCBjLmRlcGVuZGluZy52aW5leHQpXG4gICAgPyBgLSBQcmVmZXIgbGFtYmRhIG92ZXIgXFxgZnVuY3Rpb25cXGAgZm9yIFJlYWN0IGNvbXBvbmVudHMsIGUuZy4sIFxcYGNvbnN0IEJ1dHRvbjogUmVhY3QuRkMgPSAoKSA9PiB7XFxgLlxuLSBQcmVmZXIgXFxgdXNlSW1tZXJcXGAgb3ZlciBcXGB1c2VTdGF0ZVxcYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzLlxuLSBVc2UgXFxgYXV0b0ZvY3VzXFxgIHdoZXJlIGl0IHJlZHVjZXMgdXNlciBlZmZvcnQuYFxuICAgIDogJydcbn1cbiR7XG4gIC8vIHZpbmV4dCBpcyB0aGUgb3JnJ3MgY3VycmVudCB3ZWItYXBwIGZyYW1ld29yayBhbmQgZW5hYmxlcyB0aGUgUmVhY3QgQ29tcGlsZXIganVzdCBhcyBOZXh0LmpzXG4gIC8vIGRvZXMsIHNvIGl0IG11c3Qgbm90IG1pc3MgdGhpcyBydWxlLlxuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLm5leHQgfHwgYy5kZXBlbmRpbmcudmluZXh0KVxuICAgID8gYFxuLSBUaGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHNvIFxcYHVzZUNhbGxiYWNrXFxgIGFuZCBcXGB1c2VNZW1vXFxgIGFyZSB1bm5lY2Vzc2FyeSBmb3IgcGVyZm9ybWFuY2UuXG5gXG4gICAgOiAnJ1xufVxuJHtzZXJ2ZXJJbnN0YW5jZUluc3RydWN0aW9ufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpO1xufVxuIiwiIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHJlbGVhc2VBZ2VHYXRlIGZyb20gJy4uLy4uL2NvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbicgd2l0aCB7IHR5cGU6ICdqc29uJyB9O1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgQnVuZmlnVG9tbCB7XG4gIGluc3RhbGw/OiB7XG4gICAgZXhhY3Q/OiBib29sZWFuO1xuICAgIGdsb2JhbFN0b3JlPzogYm9vbGVhbjtcbiAgICBsaW5rZXI/OiBzdHJpbmc7XG4gIH07XG59XG5cbi8vIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiBpcyB0aGUgb3JnYW5pemF0aW9uJ3Mgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIHBvbGljeTogdGhlXG4vLyBtYWNoaW5lcycgZ2xvYmFsIGNvbmZpZ3MgZ2V0IGl0IHRocm91Z2ggY29uZmlncy9hcHBseVJlbGVhc2VBZ2VHYXRlLnNoIChydW4gYnkgd2JmeSBpdHNlbGYsIGJ5XG4vLyByZXVzYWJsZS13b3JrZmxvd3Mgb24gQ0ksIGFuZCBieSBzZWxmLWhvc3QtdXRpbHMgb24gdGhlIHJ1bm5lcnMpLCBhbmQgcmVwb3NpdG9yaWVzIGdldCBpdCBoZXJlLlxuLy8gT25seSBvdXIgb3duIHBhY2thZ2VzIGFyZSBleGVtcHQ6IHdlIGNvbnRyb2wgd2hvIHB1Ymxpc2hlcyB0aGVtLCBzbyBhIGNvbXByb21pc2VkIHJlbGVhc2UgY2Fubm90XG4vLyByZWFjaCB1cyB0aHJvdWdoIGFuIHVwc3RyZWFtIG1haW50YWluZXIncyBzdG9sZW4gY3JlZGVudGlhbHMuIFRoYXQgY292ZXJzIGV2ZXJ5XG4vLyBAd2lsbGJvb3N0ZXItcHJpdmF0ZSBwYWNrYWdlICh0aGUgc2NvcGUgcmVzb2x2ZXMgb25seSBmcm9tIG91ciBvd24gcmVnaXN0cnkpLCBidXQgYnVuLCBucG0sIGFuZFxuLy8gWWFybiBtYXRjaCBleGNsdWRlIGVudHJpZXMgYnkgZXhhY3QgbmFtZSDigJQgbm8gQHNjb3BlLyogcGF0dGVybnMg4oCUIHNvIGVhY2ggbmV3IHBhY2thZ2UgaW4gdGhlXG4vLyBzY29wZSBtdXN0IGJlIGFkZGVkIHRvIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiB3aGVuIGl0IGlzIGZpcnN0IHB1Ymxpc2hlZC4gVGhpcmQtcGFydHlcbi8vIHBhY2thZ2VzIOKAlCBpbmNsdWRpbmdcbi8vIHRvb2xpbmcgd2JmeSBwaW5zIGl0c2VsZiDigJQgc3RheSBhZ2UtZ2F0ZWQ7IGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24gaW4gcGFja2FnZUpzb24udHNcbi8vIHBpbnMgdGhlIG5ld2VzdCByZWxlYXNlIG9sZCBlbm91Z2ggdG8gcGFzcyB0aGUgZ2F0ZSwgc28gcGlubmluZyBrZWVwcyB3b3JraW5nIHdpdGhvdXQgYW4gZXhlbXB0aW9uLlxuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyA9IHJlbGVhc2VBZ2VHYXRlLmRheXMgKiAyNCAqIDYwICogNjA7XG5leHBvcnQgY29uc3QgYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IHJlbGVhc2VBZ2VHYXRlLmV4Y2x1ZGVzO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEJ1bkdsb2JhbFN0b3JlKHJvb3REaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdidW5maWcudG9tbCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gcGFyc2VCdW5maWdUb21sKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSk/Lmluc3RhbGw/Lmdsb2JhbFN0b3JlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlKFxuICBjb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHByZXZpb3VzR2xvYmFsU3RvcmU6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHNraXBEZXBzOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgY29uc3QgZGVmYXVsdFVzZUdsb2JhbFN0b3JlID0gc2hvdWxkVXNlQnVuR2xvYmFsU3RvcmUoY29uZmlncyk7XG4gIHJldHVybiBza2lwRGVwcyA/IChwcmV2aW91c0dsb2JhbFN0b3JlID8/IGRlZmF1bHRVc2VHbG9iYWxTdG9yZSkgOiBkZWZhdWx0VXNlR2xvYmFsU3RvcmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRVc2VCdW5HbG9iYWxTdG9yZShjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBib29sZWFuIHtcbiAgLy8gQmxpdHogYnVpbGRzIG9uIE5leHQuanMgYnV0IG5lZWQgbm90IGRlY2xhcmUgaXQgZGlyZWN0bHksIGFuZCBpdHMgY29kZWdlbiBhbHNvIHBhdGNoZXMgTmV4dFxuICAvLyBpbnNpZGUgbm9kZV9tb2R1bGVzLiBCb3RoIGZyYW1ld29ya3MgdGhlcmVmb3JlIHJlcXVpcmUgcHJvamVjdC1sb2NhbCBpc29sYXRlZCBpbnN0YWxscy5cbiAgLy8gU2xpZGV2IGxvYWRzIG9wdGlvbmFsIFZ1ZSBjb21waWxlciBwZWVycyB0aHJvdWdoIGxvY2FsLXBrZy4gVGhlIGdsb2JhbCBzdG9yZSByZWFscGF0aHNcbiAgLy8gbG9jYWwtcGtnIG91dHNpZGUgdGhlIHByb2plY3QsIHNvIE5vZGUgY2Fubm90IHJlc29sdmUgYSBjb21waWxlciBkZWNsYXJlZCBieSB0aGUgcHJvamVjdC5cbiAgcmV0dXJuICFjb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5zbGlkZXYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgdXNlR2xvYmFsU3RvcmU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCwgdXNlR2xvYmFsU3RvcmUpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBuZXdDb250ZW50ID0gKGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkLCB1c2VHbG9iYWxTdG9yZTogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGJ1bmZpZ1RvbWwgPSBwYXJzZUJ1bmZpZ1RvbWwoZXhpc3RpbmdDb250ZW50KTtcbiAgLy8gbWluaW11bVJlbGVhc2VBZ2UgYW5kIG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgYXJlIG9yZyBwb2xpY3ksIG5ldmVyIHJlcG9zaXRvcnkgcG9saWN5OiBib3RoXG4gIC8vIGFyZSByZXdyaXR0ZW4gdG8gY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uJ3MgdmFsdWVzIG9uIGV2ZXJ5IHJ1biwgc28gYSBoYW5kLWVkaXRlZCAod2Vha2VuZWQpXG4gIC8vIGdhdGUgY2Fubm90IHN1cnZpdmUgcmVnZW5lcmF0aW9uLiBEcm9wcGluZyByZXBvc2l0b3J5LXNwZWNpZmljIGV4Y2x1ZGUgZW50cmllcyBpcyBmYWlsLXNhZmUg4oCUIGFuXG4gIC8vIHVuY292ZXJlZCBwYWNrYWdlIGJlY29tZXMgYWdlLWdhdGVkIGFuZCBzdXJmYWNlcyBhdCBpbnN0YWxsIHRpbWUgaW5zdGVhZCBvZiB3ZWFrZW5pbmcgdGhlIGdhdGUuXG4gIC8vIFR1cmJvcGFjayByZWplY3RzIGdsb2JhbC1zdG9yZSBzeW1saW5rcyBiZWNhdXNlIHRoZXkgcmVzb2x2ZSBvdXRzaWRlIGl0cyBmaWxlc3lzdGVtIHJvb3QuXG4gIC8vIEtlZXBpbmcgTmV4dC5qcyBpbnN0YWxscyBwcm9qZWN0LWxvY2FsIGF2b2lkcyB3aWRlbmluZyB0aGF0IHJvb3QgdG8gJEhPTUUgKG9yIGAvYCBpbiBEb2NrZXIpLFxuICAvLyB3aGljaCB3b3VsZCBleHBhbmQgZGV2ZWxvcG1lbnQgZmlsZXN5c3RlbSB3YXRjaGluZyBhbmQgYnlwYXNzIHRoZSBib3VuZGFyeSdzIGNhY2hlIGJlbmVmaXRzLlxuICBjb25zdCBnbG9iYWxTdG9yZUxpbmUgPSB1c2VHbG9iYWxTdG9yZSA/ICdnbG9iYWxTdG9yZSA9IHRydWUnIDogJ2dsb2JhbFN0b3JlID0gZmFsc2UnO1xuICAvLyBObyBgW3J1bl0gYnVuID0gdHJ1ZWA6IGl0cyBub2RlLT5idW4gUEFUSCBzaGltIGxlYWtzIGludG8gZXZlcnkgY2hpbGQgcHJvY2VzcyBhbmQgYnJlYWtzXG4gIC8vIHRvb2xzIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpOyBhbnkgZXhpc3Rpbmcgc2V0dGluZyBpcyBkcm9wcGVkLlxuICAvLyBwdWJsaWNIb2lzdFBhdHRlcm4g4oCUIHRzeDogYnVpbGQtdHMgdW5kZXIgTm9kZS5qcyBzcGF3bnMgYG5vZGUgLS1pbXBvcnQgdHN4YCwgd2hpY2ggcmVzb2x2ZXNcbiAgLy8gdHN4IGZyb20gdGhlIGNvbnN1bWVyIHBhY2thZ2UncyBkaXJlY3RvcnksIG5vdCBmcm9tIGJ1aWxkLXRzJ3Mgb3duIGRlcGVuZGVuY2llcy5cbiAgLy8gdW5kaWNpLXR5cGVzOiBidW4tdHlwZXMgcmVmZXJlbmNlcyBpdCB3aXRob3V0IGRlY2xhcmluZyBpdCBhcyBhIGRlcGVuZGVuY3kgKG92ZW4tc2gvYnVuIzIyODA1KTtcbiAgLy8gZ2VuZXJhdGVkIHRzY29uZmlncyBhbHNvIG1hcCB1bmRpY2ktdHlwZXMgdG8gdGhlIGhvaXN0ZWQgY29weSAoc2VlIHRzY29uZmlnLnRzKSBiZWNhdXNlIHRoZVxuICAvLyBnbG9iYWwgc3RvcmUgcmVhbHBhdGhzIGJ1bi10eXBlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICByZXR1cm4gYGVudiA9IGZhbHNlXG50ZWxlbWV0cnkgPSBmYWxzZVxuXG4ke2V4dHJhY3RSYXdUZXN0U2VjdGlvbnMoZXhpc3RpbmdDb250ZW50KX1baW5zdGFsbF1cbmV4YWN0ID0gJHtidW5maWdUb21sPy5pbnN0YWxsPy5leGFjdCA9PT0gZmFsc2UgPyAnZmFsc2UnIDogJ3RydWUnfVxuJHtnbG9iYWxTdG9yZUxpbmV9XG5saW5rZXIgPSBcImlzb2xhdGVkXCJcbnB1YmxpY0hvaXN0UGF0dGVybiA9IFtcInRzeFwiLCBcInVuZGljaS10eXBlc1wiXVxubWluaW11bVJlbGVhc2VBZ2UgPSAke2J1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kc31cbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4ke2J1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMubWFwKChwYWNrYWdlTmFtZSkgPT4gYCAgICBcIiR7cGFja2FnZU5hbWV9XCIsYCkuam9pbignXFxuJyl9XG5dXG5gO1xufTtcblxuLyoqXG4gKiBQcmVzZXJ2ZSB0aGUgcHJvamVjdCdzIGBbdGVzdF1gIHNlY3Rpb25zIChlLmcuIHByZWxvYWQgc2NyaXB0cyBzd2FwcGluZyBhIENsb3VkZmxhcmUgRDEgY2xpZW50XG4gKiBmb3IgYSBsb2NhbCBTUUxpdGUgb25lKSB2ZXJiYXRpbSwgY29tbWVudHMgaW5jbHVkZWQ7IHdiZnkgbWFuYWdlcyBvbmx5IHRoZSBvdGhlciBzZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSYXdUZXN0U2VjdGlvbnMoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50KSByZXR1cm4gJyc7XG5cbiAgY29uc3QgcHJlc2VydmVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpblRlc3RTZWN0aW9uID0gZmFsc2U7XG4gIGZvciAoY29uc3QgbGluZSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IHNlY3Rpb25NYXRjaCA9IC9eXFxzKlxcWyhbXlxcXV0rKVxcXS8uZXhlYyhsaW5lKTtcbiAgICBpZiAoc2VjdGlvbk1hdGNoKSB7XG4gICAgICBpblRlc3RTZWN0aW9uID0gc2VjdGlvbk1hdGNoWzFdID09PSAndGVzdCcgfHwgKHNlY3Rpb25NYXRjaFsxXSBhcyBzdHJpbmcpLnN0YXJ0c1dpdGgoJ3Rlc3QuJyk7XG4gICAgfVxuICAgIGlmIChpblRlc3RTZWN0aW9uICYmIGxpbmUudHJpbSgpKSB7XG4gICAgICBwcmVzZXJ2ZWRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJlc2VydmVkTGluZXMubGVuZ3RoID4gMCA/IGAke3ByZXNlcnZlZExpbmVzLmpvaW4oJ1xcbicpfVxcblxcbmAgOiAnJztcbn1cblxuZnVuY3Rpb24gcGFyc2VCdW5maWdUb21sKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEJ1bmZpZ1RvbWw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZSBkZXBsb3lzIEdpdC1iYXNlZCBwcml2YXRlIHBhY2thZ2VzIGZyb20gbm9kZV9tb2R1bGVzLCBidXQgdGhlIERvY2tlciBjb250ZXh0IHNob3VsZCBzdGF5IG5hcnJvdy5cbmNvbnN0IGluY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJucyA9IFsnQHdpbGxib29zdGVyJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4uZW52KlxuKiovLkRTX1N0b3JlXG4qKi8uY2FjaGVcbioqLy5jbGF1ZGVcbioqLy5jdXJzb3JcbioqLy5lZGl0b3Jjb25maWdcbioqLy5lc2xpbnRjYWNoZVxuKiovLmdlbWluaVxuKiovLmdpdFxuKiovLmdpdGF0dHJpYnV0ZXNcbioqLy5naXRodWJcbioqLy5naXRpZ25vcmVcbioqLy5pZGVhXG4qKi8ubGVmdGhvb2tcbioqLy5teXB5X2NhY2hlXG4qKi8ubmV4dC9jYWNoZVxuKiovLm5wbVxuKiovLnBhcmNlbC1jYWNoZVxuKiovLnBucG0tc3RvcmVcbioqLy5weXRlc3RfY2FjaGVcbioqLy5yYWlsd2F5aWdub3JlXG4qKi8ucmVsZWFzZXJjLmpzb25cbioqLy5ydWZmX2NhY2hlXG4qKi8udG1wXG4qKi8udG1wLSovKipcbioqLy50dXJib1xuKiovLnRveFxuKiovLnZzY29kZVxuKiovLnlhcm4vY2FjaGVcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG4qKi9fX3B5Y2FjaGVfX1xuKiovKi5sb2dcbioqLyoucHljXG4qKi8qLnRzYnVpbGRpbmZvXG4qKi9jb3ZlcmFnZVxuKiovbm9kZV9tb2R1bGVzLyoqXG4ke2luY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJuc1xuICAubWFwKFxuICAgIChwYXR0ZXJuKSA9PiBgISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59XG4hKiovbm9kZV9tb2R1bGVzLyR7cGF0dGVybn0vKipgXG4gIClcbiAgLmpvaW4oJ1xcbicpfVxuKiovbm9kZV9tb2R1bGVzLy5jYWNoZVxuKiovcGxheXdyaWdodC1yZXBvcnRcbioqL3N0b3J5Ym9vay1zdGF0aWNcbioqL3RhcmdldFxuKiovdGVzdC1yZXN1bHRzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdzaCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAnamF2YScsICdweSddLnRvU29ydGVkKCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnRvU29ydGVkKCksXG4gIG94bGludDogWydhc3RybycsICdjanMnLCAnY3RzJywgJ2pzJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3N2ZWx0ZScsICd0cycsICd0c3gnLCAndnVlJ10udG9Tb3J0ZWQoKSxcbiAgb3hmbXQ6IFtcbiAgICAnYXN0cm8nLFxuICAgICdjanMnLFxuICAgICdjc3MnLFxuICAgICdjdHMnLFxuICAgICdncWwnLFxuICAgICdncmFwaHFsJyxcbiAgICAnaGJzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ2pzJyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdqc3gnLFxuICAgICdsZXNzJyxcbiAgICAnbWQnLFxuICAgICdtZHgnLFxuICAgICdtanMnLFxuICAgICdtdHMnLFxuICAgICdzY3NzJyxcbiAgICAnc3ZlbHRlJyxcbiAgICAndG9tbCcsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgcHJldHRpZXJPbmx5OiBbJ2phdmEnXS50b1NvcnRlZCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUsIHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQgfSBmcm9tICcuL2FnZW50cy5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIGhhdmVfZnVuOiB0cnVlLFxuICBjb2RlX3Jldmlldzoge1xuICAgIGRpc2FibGU6IGZhbHNlLFxuICAgIGNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkOiAnTUVESVVNJyxcbiAgICBtYXhfcmV2aWV3X2NvbW1lbnRzOiAtMSxcbiAgICBwdWxsX3JlcXVlc3Rfb3BlbmVkOiB7XG4gICAgICBoZWxwOiBmYWxzZSxcbiAgICAgIHN1bW1hcnk6IHRydWUsXG4gICAgICBjb2RlX3JldmlldzogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBpZ25vcmVfcGF0dGVybnM6IFsnKiovX19nZW5lcmF0ZWRfXyddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2VtaW5pQ29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueWFtbCcpO1xuICAgIGNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG5cbiAgICBjb25zdCBoYXNOb25DYW5vbmljYWxDb25maWcgPSAhIShhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChub25DYW5vbmljYWxDb25maWdGaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pKTtcbiAgICBpZiAoaGFzTm9uQ2Fub25pY2FsQ29uZmlnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtjb25maWdGaWxlUGF0aH0gYmVjYXVzZSAke25vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRofSBpcyBub3QgYSBzdXBwb3J0ZWQgR2VtaW5pIGNvbmZpZyBsb2NhdGlvbi4gUmVuYW1lIGl0IG1hbnVhbGx5LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IG5ld0NvbmZpZzogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGRlZmF1bHRDb25maWcpO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBoYXNOb25DYW5vbmljYWxDb25maWcgPyB1bmRlZmluZWQgOiBhd2FpdCBmc1V0aWwucmVhZEZpbGVDb25maW5lZElmRXhpc3RzKGNvbmZpZ0ZpbGVQYXRoKTtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvbGRDb25maWcgPSBCdW4uWUFNTC5wYXJzZShvbGRDb250ZW50KTtcbiAgICAgICAgLy8gTWVyZ2Ugb25seSBhIG1hcHBpbmc6IGVtcHR5LCBjb21tZW50LW9ubHksIG9yIHNjYWxhciBZQU1MIHdvdWxkIGVpdGhlciB0aHJvdyBpblxuICAgICAgICAvLyBtZXJnZS5hbGwgb3IgcG9sbHV0ZSB0aGUgY29uZmlnIHdpdGggaW5kZXgga2V5cy5cbiAgICAgICAgaWYgKG9sZENvbmZpZyAmJiB0eXBlb2Ygb2xkQ29uZmlnID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShvbGRDb25maWcpKSB7XG4gICAgICAgICAgbmV3Q29uZmlnID0gbWVyZ2UuYWxsKFtuZXdDb25maWcsIG9sZENvbmZpZywgbmV3Q29uZmlnXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmcgLSBmaWxlIGNhbid0IGJlIHBhcnNlZFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0gQnVuLllBTUwuc3RyaW5naWZ5KG5ld0NvbmZpZywgdW5kZWZpbmVkLCAyKTtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQoY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnQ/LnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoJyMnKSA/IHVuZGVmaW5lZCA6IGV4dHJhQ29udGVudDtcbiAgICBjb25zdCByZXZpZXdMYW5ndWFnZUluc3RydWN0aW9uID0gY29uZmlnLmlzUHVibGljUmVwb1xuICAgICAgPyAnUmV2aWV3IGluIEVuZ2xpc2ggYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjb2Rpbmcgc3RhbmRhcmRzLidcbiAgICAgIDogJ+S7peS4i+OBruOCs+ODvOODh+OCo+ODs+OCsOimj+e0hOOCkui4j+OBvuOBiOOBpuOAgeaXpeacrOiqnuOBp+ODrOODk+ODpeODvOOBl+OBpuOBj+OBoOOBleOBhOOAgic7XG4gICAgY29uc3Qgc3R5bGVndWlkZUNvbnRlbnQgPSBgJHtyZXZpZXdMYW5ndWFnZUluc3RydWN0aW9ufVxcblxcbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGNvbmZpZywgYWxsQ29uZmlncyl9JHtcbiAgICAgIGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPyBgXFxuJHtjb2RpbmdSdWxlRXh0cmFDb250ZW50LnRyaW1FbmQoKX1gIDogJydcbiAgICB9YDtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW1xuICAgICAgLi4uKGhhc05vbkNhbm9uaWNhbENvbmZpZyA/IFtdIDogW3Byb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGNvbmZpZ0ZpbGVQYXRoLCB5YW1sQ29udGVudCkpXSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSksXG4gICAgXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZ2l0T3V0cHV0TWF4QnVmZmVyID0gNjQgKiAxMDI0ICogMTAyNDtcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuLy8gYC5naXRpZ25vcmUgLXRleHRgIGtlZXBzIHRoZSBtYWNPUyB0ZW1wbGF0ZSdzIGBJY29uXFxyXFxyYCBydWxlIGludGFjdDogYHRleHQ9YXV0b2Agbm9ybWFsaXphdGlvblxuLy8gc3RyaXBzIG9uZSBDUiBwZXIgY2hlY2tpbiwgZGVncmFkaW5nIHRoZSBydWxlIHVudGlsIGl0IG1hdGNoZXMgbm90aGluZy5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuLmdpdGlnbm9yZSAtdGV4dFxuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyhkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgbGV0IG91dHB1dDogc3RyaW5nO1xuICB0cnkge1xuICAgIG91dHB1dCA9IGNoaWxkX3Byb2Nlc3MuZXhlY0ZpbGVTeW5jKCdnaXQnLCBbJ2xzLWZpbGVzJywgJy0tZW9sJywgJy16J10sIHtcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBtYXhCdWZmZXI6IGdpdE91dHB1dE1heEJ1ZmZlcixcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdHJhY2tlZCBsaW5lLWVuZGluZyByZW5vcm1hbGl6YXRpb246ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgcmVub3JtYWxpemVkQ291bnQgPSAwO1xuICBmb3IgKGNvbnN0IHJlY29yZCBvZiBvdXRwdXQuc3BsaXQoJ1xcMCcpKSB7XG4gICAgY29uc3Qgc2VwYXJhdG9ySW5kZXggPSByZWNvcmQuaW5kZXhPZignXFx0Jyk7XG4gICAgaWYgKHNlcGFyYXRvckluZGV4ID09PSAtMSkgY29udGludWU7XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gcmVjb3JkLnNsaWNlKDAsIHNlcGFyYXRvckluZGV4KTtcbiAgICBpZiAoIS9eaVxcLyg/OmNybGZ8bWl4ZWQpXFxzL3UudGVzdChhdHRyaWJ1dGVzKSB8fCAhL2F0dHJcXC8uKlxcYmVvbD0oPzpsZnxjcmxmKSg/Olxcc3wkKS91LnRlc3QoYXR0cmlidXRlcykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlY29yZC5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpO1xuICAgIGNvbnN0IHRyYWNrZWRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGNvbnN0IHN0YXRzID0gZnMubHN0YXRTeW5jKHRyYWNrZWRGaWxlUGF0aCwgeyB0aHJvd0lmTm9FbnRyeTogZmFsc2UgfSk7XG4gICAgaWYgKCFzdGF0cz8uaXNGaWxlKCkpIGNvbnRpbnVlO1xuXG4gICAgLy8gR2l0J3Mgc3RhdCBjYWNoZSBjYW4gaGlkZSBwcmUtZXhpc3RpbmcgQ1JMRiBibG9icyBhZnRlciB3YmZ5IGludHJvZHVjZXMgdGV4dCBhdHRyaWJ1dGVzLlxuICAgIC8vIE5vcm1hbGl6ZSBieXRlcyBpbiB0aGUgd29ya3RyZWUgc28gdGhlIGNhbGxlcidzIG5vcm1hbCBgZ2l0IGFkZCAtQWAgcmVjb3JkcyB0aGUgY2Fub25pY2FsXG4gICAgLy8gYmxvYjsgdGhpcyBhbHNvIHByZXZlbnRzIFByZXR0aWVyJ3MgbWV0YWRhdGEgY2FjaGUgZnJvbSBza2lwcGluZyB0aGUgbmV3bHkgY2hhbmdlZCBmaWxlLlxuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModHJhY2tlZEZpbGVQYXRoKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRyYWNrZWRGaWxlUGF0aCwgQnVmZmVyLmZyb20oY29udGVudC50b1N0cmluZygnYmluYXJ5JykucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLCAnYmluYXJ5JykpO1xuICAgIHJlbm9ybWFsaXplZENvdW50Kys7XG4gIH1cbiAgaWYgKHJlbm9ybWFsaXplZENvdW50ID4gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhgUmVub3JtYWxpemVkIGxpbmUgZW5kaW5ncyBpbiAke3Jlbm9ybWFsaXplZENvdW50fSB0cmFja2VkIGZpbGUocykuYCk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzLCBnZW5lcmF0ZXNXb3JrZXJUeXBlcywgdHlwZSBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRG8gbm90IHJlbW92ZSBgd2luZG93c2A6IGdlbmVyYXRlZCAuZ2l0aWdub3JlIGZpbGVzIG11c3Qga2VlcCBpZ25vcmluZyBXaW5kb3dzLWNyZWF0ZWQgbG9jYWwgYXJ0aWZhY3RzLlxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG5fX2dlbmVyYXRlZF9fL1xuIS5rZWVwXG4uYWlkZXIqXG4uYW50aWdyYXZpdHljbGkvXG4uY2xhdWRlLyoubG9jYWwuKlxuLmNsYXVkZS9zY2hlZHVsZWRfdGFza3MubG9ja1xuLmRldmNvbnRhaW5lci9cbi5kb2NrZXIuZW52XG4uZW52KlxuLmlkZWEvQXVnbWVudFdlYnZpZXdTdGF0ZVN0b3JlLnhtbFxuLmlkZWEvY29waWxvdC4qXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5wbGF5d3JpZ2h0LWNsaS9cbi5wbGF5d3JpZ2h0LW1jcC9cbi5zZXJlbmEvXG4udG1wL1xuLnRtcC0qL1xuLnRva2Vuc2F2ZS9cbi53Yi9cbkB3aWxsYm9vc3Rlci9cbkB3aWxsYm9vc3Rlci1wcml2YXRlL1xuKi9tb3VudC8qLmhhc2hcbkNMQVVERS5sb2NhbC5tZFxuZGlzdC9cbmRyaXp6bGUvbW91bnQvXG50ZW1wL1xudG1wL1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Hb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIC8vIEV2ZXJ5IGFjY2VwdGVkIHJlcG9zaXRvcnkgcm9vdCByZWNlaXZlcyBhIG1hbmFnZWQgcGFja2FnZS5qc29uIGxhdGVyIGluIHRoZSBzYW1lIHJ1biwgc28gaXRzXG4gICAgLy8gZGVwZW5kZW5jeSB0cmVlIG11c3QgYmUgaWdub3JlZCBldmVuIHdoZW4gdGhlIG1hbmlmZXN0IGRpZCBub3QgZXhpc3QgYXQgY29uZmlnLWRldGVjdGlvbiB0aW1lLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fCBjb25maWcuaXNSb290KSB7XG4gICAgICBuYW1lcy5wdXNoKCdub2RlJyk7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZSBkZXRlY3Rpb24gKG5vdCBqdXN0IGEgcm9vdCBwb20ueG1sKTogYSBtdWx0aS1sYW5ndWFnZSByZXBvc2l0b3J5IGtlZXBzIGl0cyBNYXZlblxuICAgIC8vIG1vZHVsZXMgaW4gc3ViZGlyZWN0b3JpZXMsIGFuZCBkcm9wcGluZyB0aGUgbWF2ZW4gdGVtcGxhdGUgd291bGQgbGV0IHRhcmdldC8gZ2V0IHRyYWNrZWQuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbEFueXdoZXJlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeS4gUmVjdXJzaXZlIGRldGVjdGlvbiAobm90IGp1c3QgYSByb290XG4gICAgLy8gbG9ja2ZpbGUpOiBhIG11bHRpLWxhbmd1YWdlIHJlcG9zaXRvcnkga2VlcHMgUHl0aG9uIGRpcmVjdG9yaWVzIGluIHN1YmRpcmVjdG9yaWVzLCBhbmRcbiAgICAvLyBkcm9wcGluZyB0aGUgcHl0aG9uIHRlbXBsYXRlIHdvdWxkIGxldCBfX3B5Y2FjaGVfXy8gYW5kIC52ZW52LyBnZXQgdHJhY2tlZC5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHl0aG9uTG9ja0FueXdoZXJlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSB8fCBjb25maWcuZGVwZW5kaW5nLmRyaXp6bGUpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcudGF1cmkpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1c3QnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnKSB7XG4gICAgICAvLyAhQ2FyZ28ubG9jayBvdmVycmlkZXMgYW55IHByZS1leGlzdGluZyB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBmcm9tIGFcbiAgICAgIC8vIHBhcmVudCAuZ2l0aWdub3JlLCBzbyB0aGUgYXBwbGljYXRpb24gbG9ja2ZpbGUgc3RheXMgY29tbWl0dGFibGUuXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCFDYXJnby5sb2NrXG5zcmMtdGF1cmkvZ2VuL3NjaGVtYXMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0Nsb3VkZmxhcmUgfHwgcm9vdENvbmZpZy5pc0Nsb3VkZmxhcmUpIHtcbiAgICAgIC8vIC5kZXYudmFycyogaG9sZCBsb2NhbCBzZWNyZXRzIGZvciB3cmFuZ2xlciBkZXYgYW5kIG11c3QgbmV2ZXIgYmUgY29tbWl0dGVkLlxuICAgICAgLy8gLmVudi5jbG91ZGZsYXJlIGNhcnJpZXMgQ0xPVURGTEFSRV9BUElfVE9LRU46IENJIHdyaXRlcyBpdCBmcm9tIGEgc2VjcmV0LCBhbmQgYSBsb2NhbFxuICAgICAgLy8gYHdiIGRlcGxveWAgbmVlZHMgYSByZWFsIHRva2VuIGluIGl0LCBzbyBjb21taXR0aW5nIGl0IHdvdWxkIGxlYWsgYWNjb3VudCBjcmVkZW50aWFscy5cbiAgICAgIC8vIEl0IGlzIGxpc3RlZCBleHBsaWNpdGx5IHNvIHRoZSBDbG91ZGZsYXJlLXNwZWNpZmljIGNyZWRlbnRpYWwgcG9saWN5IHJlbWFpbnMgdmlzaWJsZS5cbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmRldi52YXJzKlxuLmVudi5jbG91ZGZsYXJlXG4ud3JhbmdsZXIvXG5gO1xuICAgIH1cbiAgICAvLyBJZ25vcmVkIG9ubHkgd2hlcmUgcG9zdGluc3RhbGwgcmVnZW5lcmF0ZXMgaXQsIHNvIHdiZnkgbmV2ZXIgaWdub3JlcyBhIGZpbGUgdGhhdCBub3RoaW5nIHJlY3JlYXRlcy4gVGhpcyBrZWVwc1xuICAgIC8vIGl0cyB0aG91c2FuZHMgb2YgbGluZXMgb3V0IG9mIGV2ZXJ5IHdyYW5nbGVyIGJ1bXAncyBkaWZmLiBBbmNob3JlZCB3aXRoIGEgbGVhZGluZyBzbGFzaCBiZWNhdXNlIGB3cmFuZ2xlciB0eXBlc2BcbiAgICAvLyBhbmQgdGhlIG9wdC1vdXQgZGVsZXRpb24gYmVsb3cgb25seSBldmVyIHRvdWNoIHRoaXMgcGFja2FnZSdzIG93biBmaWxlLCBub3QgYSBuZXN0ZWQgb25lIGF0IGFueSBkZXB0aC5cbiAgICBpZiAoZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnKSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAvd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50c1xuYDtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnICYmICFjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzKGNvbmZpZykpIHtcbiAgICAgIC8vIE9uIGEgZ2VudWluZSB3b3JrZXItdHlwZXMgb3B0LW91dCAobm90aGluZyBjb25zdW1lcyB0aGUgZ2VuZXJhdGVkIGZpbGU7IGdlbmVyYXRlc1dvcmtlclR5cGVzXG4gICAgICAvLyBhbG9uZSBpcyBmYWxzZSBmb3IgdW5yZWxhdGVkIHJlYXNvbnMgc3VjaCBhcyBhIG1pc3NpbmcgbG9jYWwgd3JhbmdsZXIgZGVwZW5kZW5jeSwgd2hlcmUgdGhlXG4gICAgICAvLyBmaWxlIG1heSBzdGlsbCBiZSBjb25zdW1lZCkgdGhlIGlnbm9yZSBydWxlXG4gICAgICAvLyBhYm92ZSBkaXNhcHBlYXJzLCBzbyBhbiBhbHJlYWR5LWdlbmVyYXRlZCBmaWxlIHdvdWxkIHN1cmZhY2UgYXMgdW50cmFja2VkIG5vaXNlIG9uIGV2ZXJ5XG4gICAgICAvLyBjaGVja291dCDigJQgZGVsZXRlIGl0LiBObyByZXBvc2l0b3J5IHRyYWNrcyB0aGUgZmlsZSAoZG9jcy9leHBlY3RlZC1yZXBvc2l0b3J5LXJ1bGVzLm1kKSxcbiAgICAgIC8vIHNvIGFuIGV4aXN0aW5nIGNvcHkgaXMgYWx3YXlzIGEgZGlzcG9zYWJsZSBnZW5lcmF0ZWQgb25lLlxuICAgICAgY29uc3Qgd29ya2VyVHlwZXNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cycpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya2VyVHlwZXNQYXRoKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0od29ya2VyVHlwZXNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnZpbmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAudmluZXh0L1xuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZSB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2FydGlmYWN0cyQvZ20sICcuaWRlYS9hcnRpZmFjdHMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9jb21waWxlci54bWwkL2dtLCAnLmlkZWEvY29tcGlsZXIueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvamFyUmVwb3NpdG9yaWVzLnhtbCQvZ20sICcuaWRlYS9qYXJSZXBvc2l0b3JpZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnLmlkZWEvbW9kdWxlcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC8qLmltbCQvZ20sICcuaWRlYS8qLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMkL2dtLCAnLmlkZWEvbW9kdWxlcycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmltbCQvZ20sICcqLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmlwciQvZ20sICcqLmlwcicpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcjIC5pZGVhL21vZHVsZXMueG1sJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUncyB1bmFuY2hvcmVkIGRlYnVnLyB3b3VsZCBhbHNvIGhpZGUgZnJvbnRlbmQgc291cmNlXG4gICAgICAvLyBkaXJlY3RvcmllcyBzdWNoIGFzIHNyYy9kZWJ1Zy87IGNhcmdvIG91dHB1dCBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgdGFyZ2V0Ly5cbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eZGVidWdcXC8kL2dtLCAnIyBkZWJ1Zy8nKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8IGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcykge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUgaWdub3JlcyBDYXJnby5sb2NrLCBidXQgYSBzcmMtdGF1cmkgY29uZmlndXJhdGlvbiBtYXJrcyBhblxuICAgICAgLy8gYXBwbGljYXRpb24sIHdob3NlIENhcmdvLmxvY2sgbXVzdCBiZSBjb21taXR0ZWQgZm9yIHJlcHJvZHVjaWJsZSBidWlsZHMuIFRoZVxuICAgICAgLy8gcnVsZSBpcyBhbHNvIGRpc2FibGVkIHdoZW4gYSBzdWIgcGFja2FnZSBjb250YWlucyBhIFRhdXJpIGFwcGxpY2F0aW9uLCBiZWNhdXNlXG4gICAgICAvLyBhbiB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBpbiBhIHBhcmVudCAuZ2l0aWdub3JlIHdvdWxkIGhpZGUgdGhlIG5lc3RlZFxuICAgICAgLy8gYXBwbGljYXRpb24ncyBsb2NrZmlsZS4gVGF1cmkgcGx1Z2luIGxpYnJhcmllcyAoZGV0ZWN0ZWQgb25seSB2aWFcbiAgICAgIC8vIEB0YXVyaS1hcHBzLyogZGVwZW5kZW5jaWVzKSBrZWVwIHRoZSB0ZW1wbGF0ZSdzIHBvbGljeSBvZiBpZ25vcmluZyBDYXJnby5sb2NrLlxuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL15DYXJnb1xcLmxvY2skL2dtLCAnIyBDYXJnby5sb2NrJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiB3YmZ5J3Mgb3duIHBhY2thZ2UuanNvbiBjYXJyaWVzIGluIHRoZSByZXBvc2l0b3J5LiBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCByZXdyaXRlc1xuICogaXQgaW4gdGhlIHB1Ymxpc2hlZCB0YXJiYWxsIG9ubHkgKGl0IGlzIG5ldmVyIGNvbW1pdHRlZCBiYWNrKSwgc28gYSB3YmZ5IHJ1biBzdGFydGVkIGZyb20gYSBnaXRcbiAqIGNoZWNrb3V0IHJlcG9ydHMgdGhpcyBwbGFjZWhvbGRlciBpbnN0ZWFkIG9mIGEgcmVhbCB2ZXJzaW9uLlxuICovXG5jb25zdCB1bnJlbGVhc2VkVmVyc2lvblByZWZpeCA9ICcwLjAuMC0nO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeVZlcnNpb24oKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlYWRXYmZ5UGFja2FnZUpzb24oKS52ZXJzaW9uO1xufVxuXG4vKiogd2JmeSdzIGxvY2F0aW9uIGluc2lkZSBpdHMgb3duIHJlcG9zaXRvcnksIHJlbGF0aXZlIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QuICovXG5jb25zdCB3YmZ5RGlyUGF0aEluUmVwbyA9IHBhdGguam9pbigncGFja2FnZXMnLCAnd2JmeScpO1xuXG4vKipcbiAqIElkZW50aWZpZXMgdGhlIHdiZnkgYnVpbGQgdGhhdCBwcm9kdWNlZCB0aGUgZ2VuZXJhdGVkIGZpbGVzOiB0aGUgcmVsZWFzZWQgdmVyc2lvbiwgb3JcbiAqIGA8c2hvcnQgY29tbWl0IGhhc2g+Wy1kaXJ0eV0tbG9jYWxgIHdoZW4gd2JmeSBydW5zIGZyb20gaXRzIG93biBnaXQgY2hlY2tvdXQuIFVuZGVmaW5lZCB3aGVuXG4gKiBuZWl0aGVyIGlzIGF2YWlsYWJsZSAoZS5nLiBhbiB1bnJlbGVhc2VkIGJ1aWxkIGV4dHJhY3RlZCBmcm9tIGEgc291cmNlIGFyY2hpdmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeVZlcnNpb25MYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBOZWl0aGVyIHRoZSBpbnN0YWxsZWQgcGFja2FnZS5qc29uIG5vciB0aGUgZ2l0IHN0YXRlIG9mIHdiZnkncyBvd24gY2hlY2tvdXQgY2FuIGNoYW5nZVxuICAvLyBtaWQtcnVuLCBhbmQgY29tcHV0aW5nIHRoZSBsYWJlbCBzcGF3bnMgc2V2ZXJhbCBnaXQgc3VicHJvY2Vzc2VzLCBzbyBpdCBpcyBjb21wdXRlZCBvbmNlLlxuICBpZiAoIWhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsKSB7XG4gICAgY2FjaGVkVmVyc2lvbkxhYmVsID0gY29tcHV0ZVdiZnlWZXJzaW9uTGFiZWwoKTtcbiAgICBoYXNDb21wdXRlZFZlcnNpb25MYWJlbCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZFZlcnNpb25MYWJlbDtcbn1cblxubGV0IGhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsID0gZmFsc2U7XG5sZXQgY2FjaGVkVmVyc2lvbkxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGNvbXB1dGVXYmZ5VmVyc2lvbkxhYmVsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiwgZGlyUGF0aCB9ID0gcmVhZFdiZnlQYWNrYWdlSnNvbigpO1xuICBpZiAoIXZlcnNpb24uc3RhcnRzV2l0aCh1bnJlbGVhc2VkVmVyc2lvblByZWZpeCkpIHJldHVybiB2ZXJzaW9uO1xuXG4gIC8vIGdpdCByZXNvbHZlcyB0aGUgTkVBUkVTVCBlbmNsb3NpbmcgcmVwb3NpdG9yeSwgd2hpY2ggZm9yIGFuIHVucmVsZWFzZWQgYnVpbGQgcGxhY2VkIHVuZGVyIGFcbiAgLy8gdGFyZ2V0IHJlcG9zaXRvcnkgKG5vZGVfbW9kdWxlcywgb3IgYSB2ZW5kb3JlZC9leHRyYWN0ZWQgc291cmNlIHRyZWUpIGlzIHRoYXQgcmVwb3NpdG9yeSDigJQgaXRzXG4gIC8vIGNvbW1pdCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHdiZnkgYnVpbGQgdGhhdCByYW4uIE9ubHkgd2JmeSdzIG93biBsb2NhdGlvbiBpbnNpZGUgaXRzIG93blxuICAvLyByZXBvc2l0b3J5IGlkZW50aWZpZXMgYSBnZW51aW5lIGNoZWNrb3V0LCBzbyBhbnl0aGluZyBlbHNlIGZhbGxzIGJhY2sgdG8gdGhlIHZlcnNpb24tbGVzcyBsYWJlbC5cbiAgY29uc3QgZ2l0Um9vdERpclBhdGggPSBydW5HaXQoWydyZXYtcGFyc2UnLCAnLS1zaG93LXRvcGxldmVsJ10sIGRpclBhdGgpO1xuICBpZiAoXG4gICAgIWdpdFJvb3REaXJQYXRoIHx8XG4gICAgcGF0aC5yZWxhdGl2ZShnaXRSb290RGlyUGF0aCwgZGlyUGF0aCkgIT09IHdiZnlEaXJQYXRoSW5SZXBvIHx8XG4gICAgIWlzV2JmeVJlcG9zaXRvcnkoZ2l0Um9vdERpclBhdGgpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgY29tbWl0SGFzaCA9IHJ1bkdpdChbJ3Jldi1wYXJzZScsICctLXNob3J0PTgnLCAnSEVBRCddLCBkaXJQYXRoKTtcbiAgaWYgKCFjb21taXRIYXNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBUaGUgY29tbWl0IGFsb25lIHdvdWxkIG1pc2lkZW50aWZ5IGEgYnVpbGQgbWFkZSBmcm9tIGFuIGVkaXRlZCBjaGVja291dCwgc28gdW5jb21taXR0ZWQgY2hhbmdlc1xuICAvLyBhcmUgcmVwb3J0ZWQgdG9vIOKAlCBidXQgb25seSB1bmRlciBwYWNrYWdlcy8qL3NyYywgcGFja2FnZXMvKi9iaW4gYW5kIHBhY2thZ2VzLyovY29uZmlncywgdGhlXG4gIC8vIHNvdXJjZSwgZW50cnktcG9pbnQgd3JhcHBlciBhbmQgcG9saWN5IGZpbGVzIHdiZnkgYW5kIGl0cyB3b3Jrc3BhY2UgZGVwZW5kZW5jaWVzIGFjdHVhbGx5IHJ1blxuICAvLyBmcm9tLiBFdmVyeXRoaW5nIHdiZnkgR0VORVJBVEVTIHdoZW4gaXQgdGFyZ2V0cyBpdHMgb3duIHJlcG9zaXRvcnkgbGl2ZXMgb3V0c2lkZSB0aG9zZSAodGhlXG4gIC8vIHJvb3QgUkVBRE1FIHRoaXMgbGFiZWwgZ29lcyBpbnRvLCBhbmQgZWFjaCBwYWNrYWdlJ3MgLmdpdGlnbm9yZSwgcGFja2FnZS5qc29uLCB0c2NvbmZpZywg4oCmKSwgc29cbiAgLy8gYSBmaXJzdCBydW4gY2Fubm90IG1ha2UgdGhlIG5leHQgb25lIHJlbGFiZWwgdGhlIGJhZGdlIGAtZGlydHktbG9jYWxgIGJ5IGl0c2VsZi5cbiAgLy8gTWFuaWZlc3RzIHN0YXkgb3V0IG9uIHB1cnBvc2UsIGV2ZW4gdGhvdWdoIGFuIGVkaXRlZCBgZXhwb3J0c2AgbWFwIGNhbiByZWRpcmVjdCB3aGljaCBjb2RlXG4gIC8vIGxvYWRzOiB3YmZ5IEdFTkVSQVRFUyBwYWNrYWdlLmpzb24sIHNvIGluY2x1ZGluZyBpdCB3b3VsZCBtYWtlIGV2ZXJ5IHJ1biByZXBvcnQgaXRzZWxmIGRpcnR5LlxuICAvLyBUaGUgbGFiZWwgaXMgYmVzdC1lZmZvcnQgYnVpbGQgcHJvdmVuYW5jZSwgbm90IGEgcmVwcm9kdWNpYmxlLWJ1aWxkIGF0dGVzdGF0aW9uLlxuICBjb25zdCBpc0RpcnR5ID0gZ2V0R2l0RGlydHlTdGF0ZShnaXRSb290RGlyUGF0aCk7XG4gIGlmIChpc0RpcnR5ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChpc0RpcnR5KSByZXR1cm4gYCR7Y29tbWl0SGFzaH0tZGlydHktbG9jYWxgO1xuICAvLyBBbiB1bm1vZGlmaWVkIGNoZWNrb3V0IHNpdHRpbmcgb24gYSByZWxlYXNlIHRhZyBydW5zIGV4YWN0bHkgdGhlIGNvZGUgdGhhdCB3YXMgcHVibGlzaGVkIHVuZGVyXG4gIC8vIHRoYXQgdmVyc2lvbiwgc28gaXQgaXMgbGFiZWxlZCB3aXRoIHRoZSB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGNvbW1pdCB0aGF0IG9ubHkgd2JmeSBkZXZlbG9wZXJzXG4gIC8vIGNvdWxkIHJlc29sdmUgYmFjayB0byBvbmUuXG4gIHJldHVybiBmaW5kUmVsZWFzZWRWZXJzaW9uQXRIZWFkKG5hbWUsIGRpclBhdGgpID8/IGAke2NvbW1pdEhhc2h9LWxvY2FsYDtcbn1cblxuLyoqIGBAc2VtYW50aWMtcmVsZWFzZS9ucG1gIHRhZ3MgZWFjaCByZWxlYXNlIGA8cGFja2FnZSBuYW1lPkA8dmVyc2lvbj5gLiAqL1xuZnVuY3Rpb24gZmluZFJlbGVhc2VkVmVyc2lvbkF0SGVhZChwYWNrYWdlTmFtZTogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRhZ1ByZWZpeCA9IGAke3BhY2thZ2VOYW1lfUBgO1xuICAvLyBBIGNvbW1pdCBjYXJyaWVzIGF0IG1vc3Qgb25lIHJlbGVhc2UgdGFnIHBlciBwYWNrYWdlLCBzbyB0aGUgZmlyc3QgbWF0Y2ggaXMgdGhlIG9ubHkgbWF0Y2guXG4gIHJldHVybiBydW5HaXQoWyd0YWcnLCAnLS1wb2ludHMtYXQnLCAnSEVBRCddLCBjd2QpXG4gICAgPy5zcGxpdCgnXFxuJylcbiAgICAuZmluZCgodGFnKSA9PiB0YWcuc3RhcnRzV2l0aCh0YWdQcmVmaXgpKVxuICAgID8uc2xpY2UodGFnUHJlZml4Lmxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIGlzV2JmeVJlcG9zaXRvcnkoZ2l0Um9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBFdmVyeSByZW1vdGUgY291bnRzLCBub3QganVzdCBgb3JpZ2luYDogYSBmb3JrIGNoZWNrb3V0IGNhcnJpZXMgdGhlIGNhbm9uaWNhbCByZXBvc2l0b3J5IGFzXG4gIC8vIGB1cHN0cmVhbWAsIGFuZCBpdCBpcyBzdGlsbCBhIGdlbnVpbmUgd2JmeSBjaGVja291dCB3aG9zZSBjb21taXQgaWRlbnRpZmllcyB0aGUgYnVpbGQuXG4gIGNvbnN0IHJlbW90ZVVybHMgPSBydW5HaXQoWydyZW1vdGUnLCAnLXYnXSwgZ2l0Um9vdERpclBhdGgpO1xuICByZXR1cm4gISFyZW1vdGVVcmxzPy5zcGxpdCgnXFxuJykuc29tZSgobGluZSkgPT4gaXNDYW5vbmljYWxSZW1vdGVVcmwobGluZS5zcGxpdCgvWyBcXHRdKy91KVsxXSA/PyAnJykpO1xufVxuXG5jb25zdCBjYW5vbmljYWxSZXBvc2l0b3J5UGF0aCA9IC9eXFwvP1dpbGxCb29zdGVyXFwvc2hhcmVkKD86XFwuZ2l0KT8kL2l1O1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlbW90ZSBVUkwgcG9pbnRzIGF0IHdiZnkncyBvd24gcmVwb3NpdG9yeS4gVGhlIGhvc3QgaXMgY29tcGFyZWQgYWZ0ZXIgUEFSU0lORyByYXRoZXJcbiAqIHRoYW4gbWF0Y2hlZCBpbnNpZGUgdGhlIHN0cmluZzogYW55IHBhdHRlcm4gbG9vc2UgZW5vdWdoIHRvIGFjY2VwdCBldmVyeSBVUkwgZm9ybSBnaXQgc3VwcG9ydHNcbiAqIGFsc28gYWNjZXB0ZWQgYSBsb29rYWxpa2UgdGhhdCBtZXJlbHkgY29udGFpbnMgdGhlIGhvc3QsIHN1Y2ggYXNcbiAqIGBodHRwczovL2V2aWwuZXhhbXBsZS8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQuZ2l0YCwgbGV0dGluZyBhbiB1bnJlbGF0ZWQgY2hlY2tvdXQgY2xhaW0gdG9cbiAqIGJlIGEgZ2VudWluZSB3YmZ5IGJ1aWxkLlxuICovXG5mdW5jdGlvbiBpc0Nhbm9uaWNhbFJlbW90ZVVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBzY3Atc3R5bGUgKGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3Rlci9zaGFyZWQuZ2l0YCkgaXMgbm90IGEgVVJMLCBzbyBpdCBpcyBtYXRjaGVkIHNlcGFyYXRlbHkuXG4gIC8vIFRoZSBsb29rYWhlYWQga2VlcHMgYSBzY2hlbWUncyBgOi8vYCBmcm9tIGJlaW5nIHJlYWQgYXMgdGhlIGBob3N0OnBhdGhgIHNlcGFyYXRvci5cbiAgY29uc3Qgc2NwTWF0Y2ggPSAvXig/OlteQC9dK0ApPyhbXi86XSspOig/IVxcLykoLiopJC91LmV4ZWModXJsKTtcbiAgaWYgKHNjcE1hdGNoKSB7XG4gICAgcmV0dXJuIHNjcE1hdGNoWzFdIS50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbScgJiYgY2Fub25pY2FsUmVwb3NpdG9yeVBhdGgudGVzdChzY3BNYXRjaFsyXSEpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgeyBob3N0bmFtZSwgcGF0aG5hbWUgfSA9IG5ldyBVUkwodXJsKTtcbiAgICByZXR1cm4gaG9zdG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nICYmIGNhbm9uaWNhbFJlcG9zaXRvcnlQYXRoLnRlc3QocGF0aG5hbWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0R2l0RGlydHlTdGF0ZShnaXRSb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhcbiAgICAnZ2l0JyxcbiAgICBbXG4gICAgICAnc3RhdHVzJyxcbiAgICAgICctLXBvcmNlbGFpbicsXG4gICAgICAnLS11bnRyYWNrZWQtZmlsZXM9YWxsJyxcbiAgICAgICctLScsXG4gICAgICBgOihnbG9iKSR7cGF0aC5kaXJuYW1lKHdiZnlEaXJQYXRoSW5SZXBvKX0vKi9zcmMvKipgLFxuICAgICAgYDooZ2xvYikke3BhdGguZGlybmFtZSh3YmZ5RGlyUGF0aEluUmVwbyl9LyovYmluLyoqYCxcbiAgICAgIGA6KGdsb2IpJHtwYXRoLmRpcm5hbWUod2JmeURpclBhdGhJblJlcG8pfS8qL2NvbmZpZ3MvKipgLFxuICAgIF0sXG4gICAgeyBjd2Q6IGdpdFJvb3REaXJQYXRoLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH1cbiAgKTtcbiAgcmV0dXJuIHByb2Muc3RhdHVzID09PSAwID8gISFwcm9jLnN0ZG91dC50cmltKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJ1bkdpdChhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIGFyZ3MsIHsgY3dkLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH0pO1xuICByZXR1cm4gcHJvYy5zdGF0dXMgPT09IDAgPyBwcm9jLnN0ZG91dC50cmltKCkgfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkO1xufVxuXG5sZXQgY2FjaGVkV2JmeVBhY2thZ2VKc29uOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBkaXJQYXRoOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcblxuLyoqIFJldHVybnMgd2JmeSdzIG93biBwYWNrYWdlIGRpcmVjdG9yeSwgd2hpY2ggYWxzbyBob2xkcyBpdHMgY29uZmlncyAoZS5nLiByZWxlYXNlQWdlR2F0ZS5qc29uKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXYmZ5RGlyUGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gcmVhZFdiZnlQYWNrYWdlSnNvbigpLmRpclBhdGg7XG59XG5cbmZ1bmN0aW9uIHJlYWRXYmZ5UGFja2FnZUpzb24oKTogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgZGlyUGF0aDogc3RyaW5nIH0ge1xuICBpZiAoY2FjaGVkV2JmeVBhY2thZ2VKc29uKSByZXR1cm4gY2FjaGVkV2JmeVBhY2thZ2VKc29uO1xuICAvLyBmaWxlVVJMVG9QYXRoLCBub3QgVVJMLnBhdGhuYW1lOiB0aGUgbGF0dGVyIGtlZXBzIHBlcmNlbnQtZW5jb2RpbmcsIHNvIGFuIGluc3RhbGxhdGlvbiBwYXRoXG4gIC8vIGNvbnRhaW5pbmcgZS5nLiBhIHNwYWNlIHdvdWxkIHJlc29sdmUgdG8gYSBub25leGlzdGVudCBkaXJlY3RvcnkgYW5kIHRoZSBzZWFyY2ggd291bGQgd2FsayB1cFxuICAvLyB0byBhbiB1bnJlbGF0ZWQgcGFja2FnZS5cbiAgbGV0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgICAvLyBwYXRoLmRpcm5hbWUoJy8nKSA9PT0gJy8nLCBzbyB0aGUgc2VhcmNoIG11c3Qgc3RvcCBleHBsaWNpdGx5IGF0IHRoZSBmaWxlc3lzdGVtIHJvb3QuXG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGRpclBhdGgpIHRocm93IG5ldyBFcnJvcihcIndiZnkncyBvd24gcGFja2FnZS5qc29uIGlzIG1pc3NpbmcuXCIpO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIGNhY2hlZFdiZnlQYWNrYWdlSnNvbiA9IHsgbmFtZTogcGFja2FnZUpzb24ubmFtZSwgdmVyc2lvbjogcGFja2FnZUpzb24udmVyc2lvbiwgZGlyUGF0aCB9O1xuICByZXR1cm4gY2FjaGVkV2JmeVBhY2thZ2VKc29uO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdldFdiZnlEaXJQYXRoIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5cbi8qKlxuICogQXBwbGllcyB0aGUgb3JnYW5pemF0aW9uJ3MgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgdG8gdGhlIGRldmVsb3BlciBtYWNoaW5lJ3MgR0xPQkFMXG4gKiBwYWNrYWdlLW1hbmFnZXIgY29uZmlncy4gUmVwb3NpdG9yeSBjb25maWdzIGd1YXJkIG9ubHkgd2JmaWVkIHJlcG9zaXRvcmllczsgYSBicmFuZC1uZXcgbG9jYWxcbiAqIHByb2plY3QgaGFzIG5vIGJ1bmZpZy50b21sIHlldCwgc28gdGhlIGdsb2JhbCBmaWxlcyBhcmUgdGhlIG9ubHkgZ2F0ZSBiZXR3ZWVuIGBidW4gY3JlYXRlYCAvXG4gKiBgbnBtIGluaXRgIGFuZCBhIGZyZXNobHkgY29tcHJvbWlzZWQgcmVsZWFzZS4gVGhlIHNhbWUgc2NyaXB0IHJ1bnMgb24gQ0kgYW5kIG9uIHRoZSBzZWxmLWhvc3RlZFxuICogcnVubmVycywgc28gZXZlcnkgbWFjaGluZSBlbmRzIHVwIHdpdGggYnl0ZS1pZGVudGljYWwgc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoJ2Jhc2gnLCBbcGF0aC5qb2luKGdldFdiZnlEaXJQYXRoKCksICdjb25maWdzJywgJ2FwcGx5UmVsZWFzZUFnZUdhdGUuc2gnKV0sIHtcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbiAgaWYgKHN0YXR1cyA9PT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gYXBwbHkgdGhlIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoZSBnbG9iYWwgcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MuJyk7XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkphdmEoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5KYXZhIHx8IGNvbmZpZy5kb2VzQ29udGFpbkphdmFJblBhY2thZ2VzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBLZWVwIHBhY2thZ2UtbWFuYWdlciBzaGltcyBpbiB0aGUgRmlsZSBXYXRjaGVyIHByb2dyYW0gZmllbGQgc28gbm9kZSBkb2VzIG5vdFxuLy8gcGFyc2Ugd3JhcHBlciBzY3JpcHRzIHBhc3NlZCB0aHJvdWdoIGFyZ3VtZW50cy5cbmNvbnN0IG94Zm10UHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL294Zm10JztcbmNvbnN0IHByZXR0aWVyUHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZylcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWcpKSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhc2tPcHRpb25zID0gW1xuICAgIHtcbiAgICAgIGFyZ3M6ICctLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gISoqL3BhY2thZ2UuanNvbicsXG4gICAgICBjb25kaXRpb246IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLm94Zm10LFxuICAgICAgbmFtZTogJ094Zm10JyxcbiAgICAgIHByb2dyYW06IG94Zm10UHJvZ3JhbSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFyZ3M6ICctLWNhY2hlIC0td3JpdGUnLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkphdmEoY29uZmlnKSxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5LFxuICAgICAgbmFtZTogJ1ByZXR0aWVyJyxcbiAgICAgIHByb2dyYW06IHByZXR0aWVyUHJvZ3JhbSxcbiAgICB9LFxuICBdXG4gICAgLmZpbHRlcigodGFzaykgPT4gdGFzay5jb25kaXRpb24pXG4gICAgLmZsYXRNYXAoKHRhc2spID0+IHRhc2suZXh0ZW5zaW9ucy5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnModGFzay5wcm9ncmFtLCB0YXNrLmFyZ3MsIHRhc2submFtZSwgZXh0KSkpO1xuXG4gIHJldHVybiBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4gICAgJHt0YXNrT3B0aW9ucy5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbkkxOG5Uc0NvbW1hbmQoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGVwZW5kaW5nJz4sXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgfHwgIXNjcmlwdHM/LlsnZ2VuLWkxOG4tdHMnXSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuICdidW4gcnVuIGdlbi1pMThuLXRzID4gL2Rldi9udWxsJztcbn1cbiIsImNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0T2JqZWN0QnlLZXlOYW1lTGlzdChvYmplY3QsIHNvcnRXaXRoKSB7XG4gIGxldCBrZXlzLCBzb3J0Rm4sIGtleVxuXG4gIGlmICh0eXBlb2Ygc29ydFdpdGggPT09ICdmdW5jdGlvbicpIHtcbiAgICBzb3J0Rm4gPSBzb3J0V2l0aFxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBzb3J0V2l0aFxuICB9XG5cbiAgY29uc3QgdG90YWwgPSB7fVxuICBjb25zdCBvYmplY3RLZXlzID0gWy4uLihrZXlzID8/IFtdKSwgLi4uT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KHNvcnRGbildXG5cbiAgZm9yIChrZXkgb2Ygb2JqZWN0S2V5cykge1xuICAgIGlmIChoYXMob2JqZWN0LCBrZXkpKSB7XG4gICAgICB0b3RhbFtrZXldID0gb2JqZWN0W2tleV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG90YWxcbn1cbiIsIi8vIERldGVjdCBlaXRoZXIgc3BhY2VzIG9yIHRhYnMgYnV0IG5vdCBib3RoIHRvIHByb3Blcmx5IGhhbmRsZSB0YWJzIGZvciBpbmRlbnRhdGlvbiBhbmQgc3BhY2VzIGZvciBhbGlnbm1lbnRcbmNvbnN0IElOREVOVF9SRUdFWCA9IC9eKD86KCApK3xcXHQrKS87XG5cbmNvbnN0IElOREVOVF9UWVBFX1NQQUNFID0gJ3NwYWNlJztcbmNvbnN0IElOREVOVF9UWVBFX1RBQiA9ICd0YWInO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIGlnbm9yZSBzaW5nbGUgc3BhY2UgcGF0dGVybnNcbmZ1bmN0aW9uIHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgdmFsdWUpIHtcblx0cmV0dXJuIGlnbm9yZVNpbmdsZVNwYWNlcyAmJiBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSAmJiB2YWx1ZSA9PT0gMTtcbn1cblxuLyoqXG5NYWtlIGEgTWFwIHRoYXQgY291bnRzIGhvdyBtYW55IGluZGVudHMvdW5pbmRlbnRzIGhhdmUgb2NjdXJyZWQgZm9yIGEgZ2l2ZW4gc2l6ZSBhbmQgaG93IG1hbnkgbGluZXMgZm9sbG93IGEgZ2l2ZW4gaW5kZW50YXRpb24uXG5cblRoZSBrZXkgaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBpbmRlbnRhdGlvbiB0eXBlIChzID0gc3BhY2UgYW5kIHQgPSB0YWIpIGFuZCB0aGUgc2l6ZSBvZiB0aGUgaW5kZW50cy91bmluZGVudHMuXG5cbmBgYFxuaW5kZW50cyA9IHtcblx0dDM6IFsxLCAwXSxcblx0dDQ6IFsxLCA1XSxcblx0czU6IFsxLCAwXSxcblx0czEyOiBbMSwgMF0sXG59XG5gYGBcbiovXG5mdW5jdGlvbiBtYWtlSW5kZW50c01hcChzdHJpbmcsIGlnbm9yZVNpbmdsZVNwYWNlcykge1xuXHRjb25zdCBpbmRlbnRzID0gbmV3IE1hcCgpO1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBzaXplIG9mIHByZXZpb3VzIGxpbmUncyBpbmRlbnRhdGlvblxuXHRsZXQgcHJldmlvdXNTaXplID0gMDtcblx0bGV0IHByZXZpb3VzSW5kZW50VHlwZTtcblxuXHQvLyBJbmRlbnRzIGtleSAoaWRlbnQgdHlwZSArIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzKVxuXHRsZXQga2V5O1xuXG5cdGZvciAoY29uc3QgbGluZSBvZiBzdHJpbmcuc3BsaXQoL1xcbi9nKSkge1xuXHRcdGlmICghbGluZSkge1xuXHRcdFx0Ly8gSWdub3JlIGVtcHR5IGxpbmVzXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBtYXRjaGVzID0gbGluZS5tYXRjaChJTkRFTlRfUkVHRVgpO1xuXG5cdFx0aWYgKG1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHRwcmV2aW91c0luZGVudFR5cGUgPSAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgaW5kZW50ID0gbWF0Y2hlc1swXS5sZW5ndGg7XG5cdFx0XHRjb25zdCBpbmRlbnRUeXBlID0gbWF0Y2hlc1sxXSA/IElOREVOVF9UWVBFX1NQQUNFIDogSU5ERU5UX1RZUEVfVEFCO1xuXG5cdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIHVubGVzcyBpdCdzIHRoZSBvbmx5IGluZGVudCBkZXRlY3RlZCB0byBwcmV2ZW50IGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXNcblx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGluZGVudCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpbmRlbnRUeXBlICE9PSBwcmV2aW91c0luZGVudFR5cGUpIHtcblx0XHRcdFx0cHJldmlvdXNTaXplID0gMDtcblx0XHRcdH1cblxuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gaW5kZW50VHlwZTtcblxuXHRcdFx0bGV0IHVzZSA9IDE7XG5cdFx0XHRsZXQgd2VpZ2h0ID0gMDtcblxuXHRcdFx0Y29uc3QgaW5kZW50RGlmZmVyZW5jZSA9IGluZGVudCAtIHByZXZpb3VzU2l6ZTtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IGluZGVudDtcblxuXHRcdFx0Ly8gUHJldmlvdXMgbGluZSBoYXZlIHNhbWUgaW5kZW50P1xuXHRcdFx0aWYgKGluZGVudERpZmZlcmVuY2UgPT09IDApIHtcblx0XHRcdFx0Ly8gTm90IGEgbmV3IFwidXNlXCIgb2YgdGhlIGN1cnJlbnQgaW5kZW50OlxuXHRcdFx0XHR1c2UgPSAwO1xuXHRcdFx0XHQvLyBCdXQgZG8gYWRkIGEgYml0IHRvIGl0IGZvciBicmVha2luZyB0aWVzOlxuXHRcdFx0XHR3ZWlnaHQgPSAxO1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGtleSBmcm9tIHByZXZpb3VzIGxvb3Bcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSA9IE1hdGguYWJzKGluZGVudERpZmZlcmVuY2UpO1xuXG5cdFx0XHRcdC8vIElnbm9yZSBzaW5nbGUgc3BhY2UgY2hhbmdlcyB3aGVuIGlnbm9yZVNpbmdsZVNwYWNlcyBpcyB0cnVlXG5cdFx0XHRcdC8vIFRoaXMgcHJldmVudHMgY29tbW9uIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHRoaW5ncyBsaWtlIGFsaWduZWQgY29tbWVudHNcblx0XHRcdFx0aWYgKHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0gZW5jb2RlSW5kZW50c0tleShpbmRlbnRUeXBlLCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHN0YXRzXG5cdFx0XHRjb25zdCBlbnRyeSA9IGluZGVudHMuZ2V0KGtleSk7XG5cdFx0XHRpbmRlbnRzLnNldChrZXksIGVudHJ5ID09PSB1bmRlZmluZWQgPyBbMSwgMF0gOiBbZW50cnlbMF0gKyB1c2UsIGVudHJ5WzFdICsgd2VpZ2h0XSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGluZGVudHM7XG59XG5cbi8vIEVuY29kZSB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBhcyBhIHN0cmluZyAoZS5nLiAnczQnKSBmb3IgdXNlIGFzIGEgY29tcG91bmQga2V5IGluIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgaW5kZW50QW1vdW50KSB7XG5cdGNvbnN0IHR5cGVDaGFyYWN0ZXIgPSBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICdzJyA6ICd0Jztcblx0cmV0dXJuIHR5cGVDaGFyYWN0ZXIgKyBTdHJpbmcoaW5kZW50QW1vdW50KTtcbn1cblxuLy8gRXh0cmFjdCB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBmcm9tIGEga2V5IG9mIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGRlY29kZUluZGVudHNLZXkoaW5kZW50c0tleSkge1xuXHRjb25zdCBrZXlIYXNUeXBlU3BhY2UgPSBpbmRlbnRzS2V5WzBdID09PSAncyc7XG5cdGNvbnN0IHR5cGUgPSBrZXlIYXNUeXBlU3BhY2UgPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRjb25zdCBhbW91bnQgPSBOdW1iZXIoaW5kZW50c0tleS5zbGljZSgxKSk7XG5cblx0cmV0dXJuIHt0eXBlLCBhbW91bnR9O1xufVxuXG4vLyBSZXR1cm4gdGhlIGtleSAoZS5nLiAnczQnKSBmcm9tIHRoZSBpbmRlbnRzIE1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIG1vc3QgY29tbW9uIGluZGVudCxcbi8vIG9yIHJldHVybiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIGluZGVudHMuXG5mdW5jdGlvbiBnZXRNb3N0VXNlZEtleShpbmRlbnRzKSB7XG5cdGxldCByZXN1bHQ7XG5cdGxldCBtYXhVc2VkID0gMDtcblx0bGV0IG1heFdlaWdodCA9IDA7XG5cblx0Zm9yIChjb25zdCBba2V5LCBbdXNlZENvdW50LCB3ZWlnaHRdXSBvZiBpbmRlbnRzKSB7XG5cdFx0aWYgKHVzZWRDb3VudCA+IG1heFVzZWQgfHwgKHVzZWRDb3VudCA9PT0gbWF4VXNlZCAmJiB3ZWlnaHQgPiBtYXhXZWlnaHQpKSB7XG5cdFx0XHRtYXhVc2VkID0gdXNlZENvdW50O1xuXHRcdFx0bWF4V2VpZ2h0ID0gd2VpZ2h0O1xuXHRcdFx0cmVzdWx0ID0ga2V5O1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KSB7XG5cdGNvbnN0IGluZGVudENoYXJhY3RlciA9IHR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFID8gJyAnIDogJ1xcdCc7XG5cdHJldHVybiBpbmRlbnRDaGFyYWN0ZXIucmVwZWF0KGFtb3VudCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdEluZGVudChzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdC8vIElkZW50aWZ5IGluZGVudHMgd2hpbGUgc2tpcHBpbmcgc2luZ2xlIHNwYWNlIGluZGVudHMgdG8gYXZvaWQgY29tbW9uIGVkZ2UgY2FzZXMgKGUuZy4gY29kZSBjb21tZW50cylcblx0Ly8gSWYgbm8gaW5kZW50cyBhcmUgaWRlbnRpZmllZCwgcnVuIGFnYWluIGFuZCBpbmNsdWRlIGFsbCBpbmRlbnRzIGZvciBjb21wcmVoZW5zaXZlIGRldGVjdGlvblxuXHRsZXQgaW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgdHJ1ZSk7XG5cdGlmIChpbmRlbnRzLnNpemUgPT09IDApIHtcblx0XHRpbmRlbnRzID0gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBmYWxzZSk7XG5cdH1cblxuXHRjb25zdCBrZXlPZk1vc3RVc2VkSW5kZW50ID0gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cyk7XG5cblx0bGV0IHR5cGU7XG5cdGxldCBhbW91bnQgPSAwO1xuXHRsZXQgaW5kZW50ID0gJyc7XG5cblx0aWYgKGtleU9mTW9zdFVzZWRJbmRlbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdCh7dHlwZSwgYW1vdW50fSA9IGRlY29kZUluZGVudHNLZXkoa2V5T2ZNb3N0VXNlZEluZGVudCkpO1xuXHRcdGluZGVudCA9IG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0YW1vdW50LFxuXHRcdHR5cGUsXG5cdFx0aW5kZW50LFxuXHR9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGRldGVjdE5ld2xpbmUoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHRjb25zdCBuZXdsaW5lcyA9IHN0cmluZy5tYXRjaCgvKD86XFxyP1xcbikvZykgfHwgW107XG5cblx0aWYgKG5ld2xpbmVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGNybGYgPSBuZXdsaW5lcy5maWx0ZXIobmV3bGluZSA9PiBuZXdsaW5lID09PSAnXFxyXFxuJykubGVuZ3RoO1xuXHRjb25zdCBsZiA9IG5ld2xpbmVzLmxlbmd0aCAtIGNybGY7XG5cblx0cmV0dXJuIGNybGYgPiBsZiA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lR3JhY2VmdWwoc3RyaW5nKSB7XG5cdHJldHVybiAodHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycgJiYgZGV0ZWN0TmV3bGluZShzdHJpbmcpKSB8fCAnXFxuJztcbn1cbiIsIiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWx1ZSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBzb3J0T2JqZWN0S2V5cyBmcm9tICdzb3J0LW9iamVjdC1rZXlzJ1xuaW1wb3J0IGRldGVjdEluZGVudCBmcm9tICdkZXRlY3QtaW5kZW50J1xuaW1wb3J0IHsgZGV0ZWN0TmV3bGluZUdyYWNlZnVsIGFzIGRldGVjdE5ld2xpbmUgfSBmcm9tICdkZXRlY3QtbmV3bGluZSdcbmltcG9ydCBnaXRIb29rcyBmcm9tICdnaXQtaG9va3MtbGlzdCdcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJ2lzLXBsYWluLW9iaidcbmltcG9ydCBzZW12ZXJDb21wYXJlIGZyb20gJ3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcydcbmltcG9ydCBzZW12ZXJNaW5WZXJzaW9uIGZyb20gJ3NlbXZlci9yYW5nZXMvbWluLXZlcnNpb24uanMnXG5cbmNvbnN0IHBpcGUgPVxuICAoZm5zKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBmbnMucmVkdWNlKChyZXN1bHQsIGZuKSA9PiBmbihyZXN1bHQsIC4uLmFyZ3MpLCB4KVxuY29uc3Qgb25BcnJheSA9IChmbikgPT4gKHgpID0+IChBcnJheS5pc0FycmF5KHgpID8gZm4oeCkgOiB4KVxuY29uc3Qgb25TdHJpbmdBcnJheSA9IChmbikgPT4gKHgpID0+XG4gIEFycmF5LmlzQXJyYXkoeCkgJiYgeC5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IGZuKHgpIDogeFxuY29uc3QgdW5pcSA9IG9uU3RyaW5nQXJyYXkoKHhzKSA9PiBbLi4ubmV3IFNldCh4cyldKVxuY29uc3Qgc29ydEFycmF5ID0gb25TdHJpbmdBcnJheSgoYXJyYXkpID0+IGFycmF5LnRvU29ydGVkKCkpXG5jb25zdCB1bmlxQW5kU29ydEFycmF5ID0gcGlwZShbdW5pcSwgc29ydEFycmF5XSlcbmNvbnN0IG9uT2JqZWN0ID1cbiAgKGZuKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBpc1BsYWluT2JqZWN0KHgpID8gZm4oeCwgLi4uYXJncykgOiB4XG5jb25zdCBzb3J0T2JqZWN0QnkgPSAoY29tcGFyYXRvciwgZGVlcCkgPT4ge1xuICBjb25zdCBvdmVyID0gb25PYmplY3QoKG9iamVjdCkgPT4ge1xuICAgIGlmIChkZWVwKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIG92ZXIodmFsdWUpXSksXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKG9iamVjdCwgY29tcGFyYXRvcilcbiAgfSlcblxuICByZXR1cm4gb3ZlclxufVxuY29uc3Qgc29ydE9iamVjdCA9IHNvcnRPYmplY3RCeSgpXG5jb25zdCBzb3J0VVJMT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsndHlwZScsICd1cmwnXSlcbmNvbnN0IHNvcnRQZW9wbGVPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ2VtYWlsJywgJ3VybCddKVxuY29uc3Qgc29ydERpcmVjdG9yaWVzID0gc29ydE9iamVjdEJ5KFtcbiAgJ2xpYicsXG4gICdiaW4nLFxuICAnbWFuJyxcbiAgJ2RvYycsXG4gICdleGFtcGxlJyxcbiAgJ3Rlc3QnLFxuXSlcbmNvbnN0IG92ZXJQcm9wZXJ0eSA9IChwcm9wZXJ0eSwgb3ZlcikgPT5cbiAgb25PYmplY3QoKG9iamVjdCwgLi4uYXJncykgPT5cbiAgICBPYmplY3QuaGFzT3duKG9iamVjdCwgcHJvcGVydHkpXG4gICAgICA/IHsgLi4ub2JqZWN0LCBbcHJvcGVydHldOiBvdmVyKG9iamVjdFtwcm9wZXJ0eV0sIC4uLmFyZ3MpIH1cbiAgICAgIDogb2JqZWN0LFxuICApXG5jb25zdCBzb3J0R2l0SG9va3MgPSBzb3J0T2JqZWN0QnkoZ2l0SG9va3MpXG5cbmNvbnN0IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSA9IChzcGVjaWZpZXIpID0+IHtcbiAgLy8gSWdub3JlIGFueXRoaW5nIGFmdGVyID4gJiByZWx5IG9uIGZhbGxiYWNrIGFscGhhbnVtZXJpYyBzb3J0aW5nIGZvciB0aGF0XG4gIGNvbnN0IFtuYW1lQW5kVmVyc2lvbl0gPSBzcGVjaWZpZXIuc3BsaXQoJz4nKVxuICBjb25zdCBhdE1hdGNoZXMgPSBbLi4ubmFtZUFuZFZlcnNpb24ubWF0Y2hBbGwoJ0AnKV1cbiAgaWYgKFxuICAgICFhdE1hdGNoZXMubGVuZ3RoIHx8XG4gICAgKGF0TWF0Y2hlcy5sZW5ndGggPT09IDEgJiYgYXRNYXRjaGVzWzBdLmluZGV4ID09PSAwKVxuICApIHtcbiAgICByZXR1cm4geyBuYW1lOiBzcGVjaWZpZXIgfVxuICB9XG4gIGNvbnN0IHNwbGl0SW5kZXggPSBhdE1hdGNoZXMucG9wKCkuaW5kZXhcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCksXG4gICAgcmFuZ2U6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZyhzcGxpdEluZGV4ICsgMSksXG4gIH1cbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5U2VtdmVyID0gc29ydE9iamVjdEJ5KChhLCBiKSA9PiB7XG4gIGNvbnN0IHsgbmFtZTogYU5hbWUsIHJhbmdlOiBhUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShhKVxuICBjb25zdCB7IG5hbWU6IGJOYW1lLCByYW5nZTogYlJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYilcblxuICBpZiAoYU5hbWUgIT09IGJOYW1lKSB7XG4gICAgcmV0dXJuIGFOYW1lLmxvY2FsZUNvbXBhcmUoYk5hbWUsICdlbicpXG4gIH1cbiAgaWYgKCFhUmFuZ2UpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoIWJSYW5nZSkge1xuICAgIHJldHVybiAxXG4gIH1cbiAgcmV0dXJuIHNlbXZlckNvbXBhcmUoc2VtdmVyTWluVmVyc2lvbihhUmFuZ2UpLCBzZW12ZXJNaW5WZXJzaW9uKGJSYW5nZSkpXG59KVxuXG5jb25zdCBnZXRQYWNrYWdlTmFtZSA9IChpZGVudCkgPT4ge1xuICBjb25zdCBpbmRleCA9IGlkZW50LmluZGV4T2YoJ0AnLCBpZGVudC5zdGFydHNXaXRoKCdAJykgPyAxIDogMClcbiAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgdW5sZXNzIHVzZXIgbWFudWFsbHkgZWRpdCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGlkZW50IDogaWRlbnQuc2xpY2UoMCwgaW5kZXgpXG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeUlkZW50ID0gKGEsIGIpID0+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVBID0gZ2V0UGFja2FnZU5hbWUoYSlcbiAgY29uc3QgcGFja2FnZU5hbWVCID0gZ2V0UGFja2FnZU5hbWUoYilcblxuICBpZiAocGFja2FnZU5hbWVBIDwgcGFja2FnZU5hbWVCKSByZXR1cm4gLTFcbiAgaWYgKHBhY2thZ2VOYW1lQSA+IHBhY2thZ2VOYW1lQikgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gQ2FjaGUgYnkgYHByb2Nlc3MuY3dkKClgIGluc3RlYWQgb2YgYSB2YXJpYWJsZSB0byBhbGxvdyB1c2VyIGNhbGwgYHByb2Nlc3MuY2hkaXIoKWBcbmNvbnN0IGNhY2hlID0gbmV3IE1hcCgpXG5jb25zdCBoYXNZYXJuT3JQbnBtRmlsZXMgPSAoKSA9PiB7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKClcbiAgaWYgKCFjYWNoZS5oYXMoY3dkKSkge1xuICAgIGNhY2hlLnNldChcbiAgICAgIGN3ZCxcbiAgICAgIGZzLmV4aXN0c1N5bmMoJ3lhcm4ubG9jaycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJuLycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJucmMueW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS1sb2NrLnlhbWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLXdvcmtzcGFjZS55YW1sJyksXG4gICAgKVxuICB9XG4gIHJldHVybiBjYWNoZS5nZXQoY3dkKVxufVxuXG4vKipcbiAqIERldGVjdHMgdGhlIHBhY2thZ2UgbWFuYWdlciBmcm9tIHBhY2thZ2UuanNvbiBhbmQgbG9jayBmaWxlc1xuICogQHBhcmFtIHtvYmplY3R9IHBhY2thZ2VKc29uIC0gVGhlIHBhcnNlZCBwYWNrYWdlLmpzb24gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgZGV0ZWN0ZWQgcGFja2FnZSBtYW5hZ2VyLiBEZWZhdWx0IHRvIG5wbSBpZiBub3QgZGV0ZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvY29yZXBhY2tcbiAgaWYgKHR5cGVvZiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnbnBtQCcpXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24uZGV2RW5naW5lcz8ucGFja2FnZU1hbmFnZXI/Lm5hbWUpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24uZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlci5uYW1lID09PSAnbnBtJ1xuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLnBucG0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIE9wdGltaXNhdGlvbjogQ2hlY2sgaWYgbnBtIGlzIGV4cGxpY2l0IGJlZm9yZSByZWFkaW5nIEZTLlxuICBpZiAocGFja2FnZUpzb24uZW5naW5lcz8ubnBtKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChoYXNZYXJuT3JQbnBtRmlsZXMoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBTb3J0IGRlcGVuZGVuY2llcyBhbHBoYWJldGljYWxseSwgZGV0ZWN0aW5nIHBhY2thZ2UgbWFuYWdlciB0byB1c2UgdGhlXG4gKiBhcHByb3ByaWF0ZSBjb21wYXJpc29uLiBucG0gdXNlcyBsb2NhbGUtYXdhcmUgY29tcGFyaXNvbiwgeWFybiBhbmQgcG5wbSB1c2VcbiAqIHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvblxuICovXG5jb25zdCBzb3J0RGVwZW5kZW5jaWVzID0gb25PYmplY3QoKGRlcGVuZGVuY2llcywgcGFja2FnZUpzb24pID0+IHtcbiAgLy8gQXZvaWQgZmlsZSBhY2Nlc3NcbiAgaWYgKE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcykubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBkZXBlbmRlbmNpZXNcbiAgfVxuXG4gIC8vIHNvcnQgZGVwcyBsaWtlIHRoZSBucG0gQ0xJIGRvZXMgKHZpYSB0aGUgcGFja2FnZSBAbnBtY2xpL3BhY2thZ2UtanNvbilcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25wbS9wYWNrYWdlLWpzb24vYmxvYi9iNjQ2NWY0NGM3MjdkNjUxM2RiNjg5OGM3Y2JlNDFkZDM1NWNlYmU4L2xpYi91cGRhdGUtZGVwZW5kZW5jaWVzLmpzI0w4LUwyMVxuICBpZiAoc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pKSB7XG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcywgKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiLCAnZW4nKSlcbiAgfVxuXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMpXG59KVxuXG4vKipcbiAqIFwid29ya3NwYWNlc1wiIGNhbiBiZSBhbiBhcnJheSAobnBtIG9yIHlhcm4gY2xhc3NpYykgb3IgYW4gb2JqZWN0IChwbnBtL2J1bikuXG4gKiBJbiB0aGUgY2FzZSBvZiBhbiBhcnJheSwgd2UgZG8gbm90IHdhbnQgdG8gYWxwaGFiZXRpY2FsbHkgc29ydCBpdCBpbiBjYXNlXG4gKiBzY3JpcHRzIG5lZWQgdG8gcnVuIGluIGEgc3BlY2lmaWMgb3JkZXIuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92Ny91c2luZy1ucG0vd29ya3NwYWNlcz92PXRydWUjcnVubmluZy1jb21tYW5kcy1pbi10aGUtY29udGV4dC1vZi13b3Jrc3BhY2VzXG4gKi9cbmNvbnN0IHNvcnRXb3Jrc3BhY2VzID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShbJ3BhY2thZ2VzJywgJ2NhdGFsb2cnXSksXG4gIG92ZXJQcm9wZXJ0eSgncGFja2FnZXMnLCB1bmlxQW5kU29ydEFycmF5KSxcbiAgb3ZlclByb3BlcnR5KCdjYXRhbG9nJywgc29ydERlcGVuZGVuY2llcyksXG5dKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9ibG9iL2FjYzBlNDc1NzJhOTM5MDI5MmI0ZTMxM2I0YTRiZjM2MGQyMzYzNTgvY29uZi9jb25maWctc2NoZW1hLmpzXG5jb25zdCBlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgLy8gYGZpbGVzYCBhbmQgYGV4Y2x1ZGVkRmlsZXNgIGFyZSBvbmx5IG9uIGBvdmVycmlkZXNbXWBcbiAgLy8gZm9yIGVhc2llciBzb3J0IGBvdmVycmlkZXNbXWAsXG4gIC8vIGFkZCB0aGVtIHRvIGhlcmUsIHNvIHdlIGRvbid0IG5lZWQgc29ydCBgb3ZlcnJpZGVzW11gIHR3aWNlXG4gICdmaWxlcycsXG4gICdleGNsdWRlZEZpbGVzJyxcbiAgLy8gYmFzZUNvbmZpZ1xuICAnZW52JyxcbiAgJ3BhcnNlcicsXG4gICdwYXJzZXJPcHRpb25zJyxcbiAgJ3NldHRpbmdzJyxcbiAgJ3BsdWdpbnMnLFxuICAnZXh0ZW5kcycsXG4gICdydWxlcycsXG4gICdvdmVycmlkZXMnLFxuICAnZ2xvYmFscycsXG4gICdwcm9jZXNzb3InLFxuICAnbm9JbmxpbmVDb25maWcnLFxuICAncmVwb3J0VW51c2VkRGlzYWJsZURpcmVjdGl2ZXMnLFxuXVxuY29uc3Qgc29ydEVzbGludENvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMpLFxuICBvdmVyUHJvcGVydHkoJ2VudicsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoJ2dsb2JhbHMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT4gb3ZlcnJpZGVzLm1hcChzb3J0RXNsaW50Q29uZmlnKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgncGFyc2VyT3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ3J1bGVzJyxcbiAgICBzb3J0T2JqZWN0QnkoXG4gICAgICAocnVsZTEsIHJ1bGUyKSA9PlxuICAgICAgICBydWxlMS5zcGxpdCgnLycpLmxlbmd0aCAtIHJ1bGUyLnNwbGl0KCcvJykubGVuZ3RoIHx8XG4gICAgICAgIHJ1bGUxLmxvY2FsZUNvbXBhcmUocnVsZTIpLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgnc2V0dGluZ3MnLCBzb3J0T2JqZWN0KSxcbl0pXG5jb25zdCBzb3J0VlNDb2RlQmFkZ2VPYmplY3QgPSBzb3J0T2JqZWN0QnkoWydkZXNjcmlwdGlvbicsICd1cmwnLCAnaHJlZiddKVxuXG5jb25zdCBzb3J0UHJldHRpZXJDb25maWcgPSBwaXBlKFtcbiAgLy8gc29ydCBrZXlzIGFscGhhYmV0aWNhbGx5LCBidXQgcHV0IGBvdmVycmlkZXNgIGF0IGJvdHRvbVxuICBvbk9iamVjdCgoY29uZmlnKSA9PlxuICAgIHNvcnRPYmplY3RLZXlzKGNvbmZpZywgW1xuICAgICAgLi4uT2JqZWN0LmtleXMoY29uZmlnKVxuICAgICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gJ292ZXJyaWRlcycpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICAnb3ZlcnJpZGVzJyxcbiAgICBdKSxcbiAgKSxcbiAgLy8gaWYgYGNvbmZpZy5vdmVycmlkZXNgIGV4aXN0c1xuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgLy8gYW5kIGBjb25maWcub3ZlcnJpZGVzYCBpcyBhbiBhcnJheVxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT5cbiAgICAgIG92ZXJyaWRlcy5tYXAoXG4gICAgICAgIHBpcGUoW1xuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXWAgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBzb3J0T2JqZWN0LFxuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXS5vcHRpb25zYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIG92ZXJQcm9wZXJ0eSgnb3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbl0pXG5cbmNvbnN0IHNvcnRWb2x0YSA9IHNvcnRPYmplY3RCeShbJ25vZGUnLCAnbnBtJywgJ3lhcm4nXSlcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS93aXJlaXRcbmNvbnN0IHdpcmVpdFNjcmlwdFByb3BlcnRpZXMgPSBbJ2NvbW1hbmQnLCAnZGVwZW5kZW5jaWVzJywgJ2ZpbGVzJywgJ291dHB1dCddXG5jb25zdCBzb3J0V2lyZWl0U2NyaXB0ID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeSh3aXJlaXRTY3JpcHRQcm9wZXJ0aWVzKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdkZXBlbmRlbmNpZXMnLFxuICAgIG9uQXJyYXkoKGRlcHMpID0+IGRlcHMubWFwKHNvcnRPYmplY3RCeShbJ3NjcmlwdCcsICdjYXNjYWRlJ10pKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnZW52JyxcbiAgICBvbk9iamVjdCgoZW52KSA9PlxuICAgICAgc29ydE9iamVjdEtleXMoXG4gICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhlbnYpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBzb3J0T2JqZWN0QnkoWydleHRlcm5hbCcsICdkZWZhdWx0J10pKHZhbHVlKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdzZXJ2aWNlJyxcbiAgICBwaXBlKFtzb3J0T2JqZWN0QnkoWydyZWFkeVdoZW4nXSksIG92ZXJQcm9wZXJ0eSgncmVhZHlXaGVuJywgc29ydE9iamVjdCldKSxcbiAgKSxcbl0pXG5jb25zdCBzb3J0V2lyZWl0ID0gb25PYmplY3QoKHdpcmVpdCkgPT5cbiAgc29ydE9iamVjdEtleXMoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMod2lyZWl0KS5tYXAoKFtuYW1lLCBjb25maWddKSA9PiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNvcnRXaXJlaXRTY3JpcHQoY29uZmlnKSxcbiAgICAgIF0pLFxuICAgICksXG4gICksXG4pXG5jb25zdCBzb3J0RGV2RW5naW5lcyA9IG92ZXJQcm9wZXJ0eShcbiAgJ3BhY2thZ2VNYW5hZ2VyJyxcbiAgc29ydE9iamVjdEJ5KFsnbmFtZScsICd2ZXJzaW9uJywgJ29uRmFpbCddKSxcbilcblxuY29uc3QgcG5wbUJhc2VDb25maWdQcm9wZXJ0aWVzID0gW1xuICAncGVlckRlcGVuZGVuY3lSdWxlcycsXG4gICduZXZlckJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXNGaWxlJyxcbiAgJ2FsbG93ZWREZXByZWNhdGVkVmVyc2lvbnMnLFxuICAnYWxsb3dOb25BcHBsaWVkUGF0Y2hlcycsXG4gICd1cGRhdGVDb25maWcnLFxuICAnYXVkaXRDb25maWcnLFxuICAncmVxdWlyZWRTY3JpcHRzJyxcbiAgJ3N1cHBvcnRlZEFyY2hpdGVjdHVyZXMnLFxuICAnb3ZlcnJpZGVzJyxcbiAgJ3BhdGNoZWREZXBlbmRlbmNpZXMnLFxuICAncGFja2FnZUV4dGVuc2lvbnMnLFxuXVxuXG5jb25zdCBzb3J0UG5wbUNvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkocG5wbUJhc2VDb25maWdQcm9wZXJ0aWVzLCB0cnVlKSxcbiAgb3ZlclByb3BlcnR5KCdvdmVycmlkZXMnLCBzb3J0T2JqZWN0QnlTZW12ZXIpLFxuXSlcblxuLy8gU2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vbWlzYy9zY3JpcHRzXG5jb25zdCBkZWZhdWx0TnBtU2NyaXB0cyA9IG5ldyBTZXQoW1xuICAnaW5zdGFsbCcsXG4gICdwYWNrJyxcbiAgJ3ByZXBhcmUnLFxuICAncHVibGlzaCcsXG4gICdyZXN0YXJ0JyxcbiAgJ3Nocmlua3dyYXAnLFxuICAnc3RhcnQnLFxuICAnc3RvcCcsXG4gICd0ZXN0JyxcbiAgJ3VuaW5zdGFsbCcsXG4gICd2ZXJzaW9uJyxcbl0pXG5cbmNvbnN0IGhhc0RldkRlcGVuZGVuY3kgPSAoZGVwZW5kZW5jeSwgcGFja2FnZUpzb24pID0+IHtcbiAgcmV0dXJuIChcbiAgICBPYmplY3QuaGFzT3duKHBhY2thZ2VKc29uLCAnZGV2RGVwZW5kZW5jaWVzJykgJiZcbiAgICBPYmplY3QuaGFzT3duKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcywgZGVwZW5kZW5jeSlcbiAgKVxufVxuXG5jb25zdCBydW5TUmVnRXhwID1cbiAgLyg/PD1efFtcXHMmOzw+fChdKSg/OnJ1bi1zfG5wbS1ydW4tYWxsMj8gLiooPzotLXNlcXVlbnRpYWx8LS1zZXJpYWx8LXMpKSg/PSR8W1xccyY7PD58KV0pL1xuXG5jb25zdCBpc1NlcXVlbnRpYWxTY3JpcHQgPSAoY29tbWFuZCkgPT5cbiAgY29tbWFuZC5pbmNsdWRlcygnKicpICYmIHJ1blNSZWdFeHAudGVzdChjb21tYW5kKVxuXG5jb25zdCBoYXNTZXF1ZW50aWFsU2NyaXB0ID0gKHBhY2thZ2VKc29uKSA9PiB7XG4gIGlmIChcbiAgICAhaGFzRGV2RGVwZW5kZW5jeSgnbnBtLXJ1bi1hbGwnLCBwYWNrYWdlSnNvbikgJiZcbiAgICAhaGFzRGV2RGVwZW5kZW5jeSgnbnBtLXJ1bi1hbGwyJywgcGFja2FnZUpzb24pXG4gICkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGNvbnN0IHNjcmlwdHMgPSBbJ3NjcmlwdHMnLCAnYmV0dGVyU2NyaXB0cyddLmZsYXRNYXAoKGZpZWxkKSA9PlxuICAgIHBhY2thZ2VKc29uW2ZpZWxkXSA/IE9iamVjdC52YWx1ZXMocGFja2FnZUpzb25bZmllbGRdKSA6IFtdLFxuICApXG4gIHJldHVybiBzY3JpcHRzLnNvbWUoKHNjcmlwdCkgPT4gaXNTZXF1ZW50aWFsU2NyaXB0KHNjcmlwdCkpXG59XG5cbmZ1bmN0aW9uIHNvcnRTY3JpcHROYW1lcyhrZXlzLCBwcmVmaXggPSAnJykge1xuICBjb25zdCBncm91cE1hcCA9IG5ldyBNYXAoKVxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgcmVzdCA9IHByZWZpeCA/IGtleS5zbGljZShwcmVmaXgubGVuZ3RoICsgMSkgOiBrZXlcbiAgICBjb25zdCBpZHggPSByZXN0LmluZGV4T2YoJzonKVxuICAgIGlmIChpZHggPiAwKSB7XG4gICAgICBjb25zdCBiYXNlID0ga2V5LnNsaWNlKDAsIChwcmVmaXggPyBwcmVmaXgubGVuZ3RoICsgMSA6IDApICsgaWR4KVxuICAgICAgaWYgKCFncm91cE1hcC5oYXMoYmFzZSkpIGdyb3VwTWFwLnNldChiYXNlLCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChiYXNlKS5wdXNoKGtleSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFncm91cE1hcC5oYXMoa2V5KSkgZ3JvdXBNYXAuc2V0KGtleSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoa2V5KS5wdXNoKGtleSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFycmF5LmZyb20oZ3JvdXBNYXAua2V5cygpKVxuICAgIC5zb3J0KClcbiAgICAuZmxhdE1hcCgoZ3JvdXBLZXkpID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gZ3JvdXBNYXAuZ2V0KGdyb3VwS2V5KVxuICAgICAgaWYgKFxuICAgICAgICBjaGlsZHJlbi5sZW5ndGggPiAxICYmXG4gICAgICAgIGNoaWxkcmVuLnNvbWUoKGspID0+IGsgIT09IGdyb3VwS2V5ICYmIGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZGlyZWN0ID0gY2hpbGRyZW5cbiAgICAgICAgICAuZmlsdGVyKChrKSA9PiBrID09PSBncm91cEtleSB8fCAhay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgIGNvbnN0IG5lc3RlZCA9IGNoaWxkcmVuLmZpbHRlcigoaykgPT4gay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICAgcmV0dXJuIFsuLi5kaXJlY3QsIC4uLnNvcnRTY3JpcHROYW1lcyhuZXN0ZWQsIGdyb3VwS2V5KV1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGlsZHJlbi5zb3J0KClcbiAgICB9KVxufVxuXG5jb25zdCBzb3J0U2NyaXB0cyA9IG9uT2JqZWN0KChzY3JpcHRzLCBwYWNrYWdlSnNvbikgPT4ge1xuICBsZXQgbmFtZXMgPSBPYmplY3Qua2V5cyhzY3JpcHRzKVxuICBjb25zdCBwcmVmaXhhYmxlID0gbmV3IFNldCgpXG5cbiAgbmFtZXMgPSBuYW1lcy5tYXAoKG5hbWUpID0+IHtcbiAgICBjb25zdCBvbWl0dGVkID0gbmFtZS5yZXBsYWNlKC9eKD86cHJlfHBvc3QpLywgJycpXG4gICAgaWYgKGRlZmF1bHROcG1TY3JpcHRzLmhhcyhvbWl0dGVkKSB8fCBuYW1lcy5pbmNsdWRlcyhvbWl0dGVkKSkge1xuICAgICAgcHJlZml4YWJsZS5hZGQob21pdHRlZClcbiAgICAgIHJldHVybiBvbWl0dGVkXG4gICAgfVxuICAgIHJldHVybiBuYW1lXG4gIH0pXG5cbiAgaWYgKCFoYXNTZXF1ZW50aWFsU2NyaXB0KHBhY2thZ2VKc29uKSkge1xuICAgIG5hbWVzID0gc29ydFNjcmlwdE5hbWVzKG5hbWVzKVxuICB9XG4gIG5hbWVzID0gbmFtZXMuZmxhdE1hcCgoa2V5KSA9PlxuICAgIHByZWZpeGFibGUuaGFzKGtleSkgPyBbYHByZSR7a2V5fWAsIGtleSwgYHBvc3Qke2tleX1gXSA6IFtrZXldLFxuICApXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhzY3JpcHRzLCBuYW1lcylcbn0pXG5cbi8qXG4tIE1vdmUgYGRlZmF1bHRgIGNvbmRpdGlvbiB0byBib3R0b21cbiovXG5jb25zdCBzb3J0Q29uZGl0aW9ucyA9IChjb25kaXRpb25zKSA9PiB7XG4gIGNvbnN0IHsgZGVmYXVsdENvbmRpdGlvbnMgPSBbXSwgcmVzdENvbmRpdGlvbnMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgY29uZGl0aW9ucyxcbiAgICAoY29uZGl0aW9uKSA9PiB7XG4gICAgICBpZiAoY29uZGl0aW9uID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgcmV0dXJuICdkZWZhdWx0Q29uZGl0aW9ucydcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdyZXN0Q29uZGl0aW9ucydcbiAgICB9LFxuICApXG5cbiAgcmV0dXJuIFsuLi5yZXN0Q29uZGl0aW9ucywgLi4uZGVmYXVsdENvbmRpdGlvbnNdXG59XG5cbmNvbnN0IHNvcnRFeHBvcnRzID0gb25PYmplY3QoKGV4cG9ydHMpID0+IHtcbiAgY29uc3QgeyBwYXRocyA9IFtdLCBjb25kaXRpb25zID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgIE9iamVjdC5rZXlzKGV4cG9ydHMpLFxuICAgIChrZXkpID0+IChrZXkuc3RhcnRzV2l0aCgnLicpID8gJ3BhdGhzJyA6ICdjb25kaXRpb25zJyksXG4gIClcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5wYXRocywgLi4uc29ydENvbmRpdGlvbnMoY29uZGl0aW9ucyldLm1hcCgoa2V5KSA9PiBbXG4gICAgICBrZXksXG4gICAgICBzb3J0RXhwb3J0cyhleHBvcnRzW2tleV0pLFxuICAgIF0pLFxuICApXG59KVxuXG4vLyBmaWVsZHMgbWFya2VkIGB2c2NvZGVgIGFyZSBmb3IgYFZpc3VhbCBTdHVkaW8gQ29kZSBleHRlbnNpb24gbWFuaWZlc3RgIG9ubHlcbi8vIGh0dHBzOi8vY29kZS52aXN1YWxzdHVkaW8uY29tL2FwaS9yZWZlcmVuY2VzL2V4dGVuc2lvbi1tYW5pZmVzdFxuLy8gU3VwcG9ydGVkIGZpZWxkczpcbi8vIHB1Ymxpc2hlciwgZGlzcGxheU5hbWUsIGNhdGVnb3JpZXMsIGdhbGxlcnlCYW5uZXIsIHByZXZpZXcsIGNvbnRyaWJ1dGVzLFxuLy8gYWN0aXZhdGlvbkV2ZW50cywgYmFkZ2VzLCBtYXJrZG93biwgcW5hLCBleHRlbnNpb25QYWNrLFxuLy8gZXh0ZW5zaW9uRGVwZW5kZW5jaWVzLCBpY29uXG5cbi8vIGZpZWxkLmtleXtzdHJpbmd9OiBmaWVsZCBuYW1lXG4vLyBmaWVsZC5vdmVye2Z1bmN0aW9ufTogc29ydCBmaWVsZCBzdWJLZXlcbmNvbnN0IGZpZWxkcyA9IFtcbiAgeyBrZXk6ICckc2NoZW1hJyB9LFxuICB7IGtleTogJ25hbWUnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2Rpc3BsYXlOYW1lJyB9LFxuICB7IGtleTogJ3ZlcnNpb24nIH0sXG4gIC8qIHlhcm4gKi8geyBrZXk6ICdzdGFibGVWZXJzaW9uJyB9LFxuICB7IGtleTogJ3ByaXZhdGUnIH0sXG4gIHsga2V5OiAnZGVzY3JpcHRpb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NhdGVnb3JpZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAna2V5d29yZHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaG9tZXBhZ2UnIH0sXG4gIHsga2V5OiAnYnVncycsIG92ZXI6IHNvcnRPYmplY3RCeShbJ3VybCcsICdlbWFpbCddKSB9LFxuICB7IGtleTogJ3JlcG9zaXRvcnknLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnZnVuZGluZycsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdsaWNlbnNlJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdxbmEnIH0sXG4gIHsga2V5OiAnYXV0aG9yJywgb3Zlcjogc29ydFBlb3BsZU9iamVjdCB9LFxuICB7XG4gICAga2V5OiAnbWFpbnRhaW5lcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKG1haW50YWluZXJzKSA9PiBtYWludGFpbmVycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICB7XG4gICAga2V5OiAnY29udHJpYnV0b3JzJyxcbiAgICBvdmVyOiBvbkFycmF5KChjb250cmlidXRvcnMpID0+IGNvbnRyaWJ1dG9ycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwdWJsaXNoZXInIH0sXG4gIHsga2V5OiAnc2lkZUVmZmVjdHMnIH0sXG4gIHsga2V5OiAndHlwZScgfSxcbiAgeyBrZXk6ICdpbXBvcnRzJyB9LFxuICB7IGtleTogJ2V4cG9ydHMnLCBvdmVyOiBzb3J0RXhwb3J0cyB9LFxuICB7IGtleTogJ21haW4nIH0sXG4gIHsga2V5OiAnc3ZlbHRlJyB9LFxuICB7IGtleTogJ3VtZDptYWluJyB9LFxuICB7IGtleTogJ2pzZGVsaXZyJyB9LFxuICB7IGtleTogJ3VucGtnJyB9LFxuICB7IGtleTogJ21vZHVsZScgfSxcbiAgeyBrZXk6ICdzb3VyY2UnIH0sXG4gIHsga2V5OiAnanNuZXh0Om1haW4nIH0sXG4gIHsga2V5OiAnYnJvd3NlcicgfSxcbiAgeyBrZXk6ICdyZWFjdC1uYXRpdmUnIH0sXG4gIHsga2V5OiAndHlwZXMnIH0sXG4gIHsga2V5OiAndHlwZXNWZXJzaW9ucycgfSxcbiAgeyBrZXk6ICd0eXBpbmdzJyB9LFxuICB7IGtleTogJ3N0eWxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZXN0eWxlJyB9LFxuICB7IGtleTogJ2Fzc2V0cycgfSxcbiAgeyBrZXk6ICdiaW4nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbWFuJyB9LFxuICB7IGtleTogJ2RpcmVjdG9yaWVzJywgb3Zlcjogc29ydERpcmVjdG9yaWVzIH0sXG4gIHsga2V5OiAnZmlsZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnd29ya3NwYWNlcycsIG92ZXI6IHNvcnRXb3Jrc3BhY2VzIH0sXG4gIC8vIG5vZGUtcHJlLWd5cCBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9ub2RlLXByZS1neXAjMS1hZGQtbmV3LWVudHJpZXMtdG8teW91ci1wYWNrYWdlanNvblxuICB7XG4gICAga2V5OiAnYmluYXJ5JyxcbiAgICBvdmVyOiBzb3J0T2JqZWN0QnkoW1xuICAgICAgJ21vZHVsZV9uYW1lJyxcbiAgICAgICdtb2R1bGVfcGF0aCcsXG4gICAgICAncmVtb3RlX3BhdGgnLFxuICAgICAgJ3BhY2thZ2VfbmFtZScsXG4gICAgICAnaG9zdCcsXG4gICAgXSksXG4gIH0sXG4gIHsga2V5OiAnc2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnYmV0dGVyU2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnd2lyZWl0Jywgb3Zlcjogc29ydFdpcmVpdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdsMTBuJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdjb250cmlidXRlcycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnYWN0aXZhdGlvbkV2ZW50cycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdodXNreScsIG92ZXI6IG92ZXJQcm9wZXJ0eSgnaG9va3MnLCBzb3J0R2l0SG9va3MpIH0sXG4gIHsga2V5OiAnc2ltcGxlLWdpdC1ob29rcycsIG92ZXI6IHNvcnRHaXRIb29rcyB9LFxuICB7IGtleTogJ3ByZS1jb21taXQnIH0sXG4gIHsga2V5OiAnY29tbWl0bGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdsaW50LXN0YWdlZCcgfSxcbiAgeyBrZXk6ICduYW5vLXN0YWdlZCcgfSxcbiAgeyBrZXk6ICdjb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbm9kZW1vbkNvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2VyaWZ5Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2JhYmVsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJzbGlzdCcgfSxcbiAgeyBrZXk6ICd4bycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdwcmV0dGllcicsIG92ZXI6IHNvcnRQcmV0dGllckNvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludENvbmZpZycsIG92ZXI6IHNvcnRFc2xpbnRDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRJZ25vcmUnIH0sXG4gIHsga2V5OiAnbnBtcGtnanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtUGFja2FnZUpzb25MaW50Q29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbXBhY2thZ2Vqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZWxlYXNlJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbWFya0NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdzdHlsZWxpbnQnIH0sXG4gIHsga2V5OiAnYXZhJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1qdW5pdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LXN0YXJlJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ21vY2hhJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ255YycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdjOCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICd0YXAnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb2NsaWYnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ3Jlc29sdXRpb25zJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ292ZXJyaWRlcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGV2RGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0Qnkoc29ydE9iamVjdEJ5SWRlbnQsIHRydWUpIH0sXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgLy8gVE9ETzogb25seSBzb3J0IGRlcHRoID0gMlxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdvcHRpb25hbERlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdidW5kbGVkRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICB7IGtleTogJ2J1bmRsZURlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZXh0ZW5zaW9uUGFjaycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZXh0ZW5zaW9uRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICB7IGtleTogJ2ZsYXQnIH0sXG4gIHsga2V5OiAncGFja2FnZU1hbmFnZXInIH0sXG4gIHsga2V5OiAnZW5naW5lcycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdlbmdpbmVTdHJpY3QnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZGV2RW5naW5lcycsIG92ZXI6IHNvcnREZXZFbmdpbmVzIH0sXG4gIHsga2V5OiAndm9sdGEnLCBvdmVyOiBzb3J0Vm9sdGEgfSxcbiAgeyBrZXk6ICdsYW5ndWFnZU5hbWUnIH0sXG4gIHsga2V5OiAnb3MnIH0sXG4gIHsga2V5OiAnY3B1JyB9LFxuICB7IGtleTogJ3ByZWZlckdsb2JhbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdwdWJsaXNoQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdpY29uJyB9LFxuICAvKiB2c2NvZGUgKi8ge1xuICAgIGtleTogJ2JhZGdlcycsXG4gICAgb3Zlcjogb25BcnJheSgoYmFkZ2UpID0+IGJhZGdlLm1hcChzb3J0VlNDb2RlQmFkZ2VPYmplY3QpKSxcbiAgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZ2FsbGVyeUJhbm5lcicsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncHJldmlldycgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbWFya2Rvd24nIH0sXG4gIHsga2V5OiAncG5wbScsIG92ZXI6IHNvcnRQbnBtQ29uZmlnIH0sXG5dXG5cbmNvbnN0IGRlZmF1bHRTb3J0T3JkZXIgPSBmaWVsZHMubWFwKCh7IGtleSB9KSA9PiBrZXkpXG5jb25zdCBvdmVyRmllbGRzID0gcGlwZShcbiAgZmllbGRzXG4gICAgLm1hcCgoeyBrZXksIG92ZXIgfSkgPT4gKG92ZXIgPyBvdmVyUHJvcGVydHkoa2V5LCBvdmVyKSA6IHVuZGVmaW5lZCkpXG4gICAgLmZpbHRlcihCb29sZWFuKSxcbilcblxuZnVuY3Rpb24gZWRpdFN0cmluZ0pTT04oanNvbiwgb3Zlcikge1xuICBpZiAodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgeyBpbmRlbnQsIHR5cGUgfSA9IGRldGVjdEluZGVudChqc29uKVxuICAgIGNvbnN0IGVuZENoYXJhY3RlcnMgPSBqc29uLnNsaWNlKC0xKSA9PT0gJ1xcbicgPyAnXFxuJyA6ICcnXG4gICAgY29uc3QgbmV3bGluZSA9IGRldGVjdE5ld2xpbmUoanNvbilcbiAgICBqc29uID0gSlNPTi5wYXJzZShqc29uKVxuXG4gICAgbGV0IHJlc3VsdCA9XG4gICAgICBKU09OLnN0cmluZ2lmeShvdmVyKGpzb24pLCBudWxsLCB0eXBlID09PSAndGFiJyA/ICdcXHQnIDogaW5kZW50KSArXG4gICAgICBlbmRDaGFyYWN0ZXJzXG4gICAgaWYgKG5ld2xpbmUgPT09ICdcXHJcXG4nKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXFxuL2csIG5ld2xpbmUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHJldHVybiBvdmVyKGpzb24pXG59XG5cbmZ1bmN0aW9uIHNvcnRQYWNrYWdlSnNvbihqc29uSXNoLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGVkaXRTdHJpbmdKU09OKFxuICAgIGpzb25Jc2gsXG4gICAgb25PYmplY3QoKGpzb24pID0+IHtcbiAgICAgIGxldCBzb3J0T3JkZXIgPSBvcHRpb25zLnNvcnRPcmRlciB8fCBkZWZhdWx0U29ydE9yZGVyXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvcnRPcmRlcikpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGpzb24pXG4gICAgICAgIGNvbnN0IHsgcHJpdmF0ZUtleXMgPSBbXSwgcHVibGljS2V5cyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICAgICAgICBrZXlzLFxuICAgICAgICAgIChrZXkpID0+IChrZXlbMF0gPT09ICdfJyA/ICdwcml2YXRlS2V5cycgOiAncHVibGljS2V5cycpLFxuICAgICAgICApXG4gICAgICAgIHNvcnRPcmRlciA9IFtcbiAgICAgICAgICAuLi5zb3J0T3JkZXIsXG4gICAgICAgICAgLi4uZGVmYXVsdFNvcnRPcmRlcixcbiAgICAgICAgICAuLi5wdWJsaWNLZXlzLnNvcnQoKSxcbiAgICAgICAgICAuLi5wcml2YXRlS2V5cy5zb3J0KCksXG4gICAgICAgIF1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG92ZXJGaWVsZHMoc29ydE9iamVjdEtleXMoanNvbiwgc29ydE9yZGVyKSwganNvbilcbiAgICB9KSxcbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBzb3J0UGFja2FnZUpzb25cbmV4cG9ydCB7IHNvcnRQYWNrYWdlSnNvbiwgZGVmYXVsdFNvcnRPcmRlciBhcyBzb3J0T3JkZXIgfVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb1VybCA9IGBnaXRAZ2l0aHViLmNvbToke29yZ2FuaXphdGlvbn0vJHtyZXBvfS5naXRgO1xuICAgIGNvbnN0IG91dHB1dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydscy1yZW1vdGUnLCByZXBvVXJsLCAnSEVBRCddLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gb3V0cHV0LnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29tbWl0SGFzaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCkpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBbXG4gICdAdHNjb25maWcvYnVuJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLWx0cycsXG4gICdAdHNjb25maWcvbm9kZS10cycsXG4gICdAdHNjb25maWcvcmVhY3QtbmF0aXZlJyxcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAvLyBSZWFjdCBOYXRpdmUgbmVlZHMgTWV0cm8tY29tcGF0aWJsZSBzZXR0aW5ncyAoanN4OiByZWFjdC1uYXRpdmUsIG5vZGUgcmVzb2x1dGlvbiksIHdoaWNoXG4gIC8vIEB0c2NvbmZpZy9idW4gd291bGQgb3ZlcnJpZGUgZXZlbiB0aG91Z2ggdGhlIHJlcG8gdXNlcyBCdW4gYXMgaXRzIHBhY2thZ2UgbWFuYWdlci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUvdHNjb25maWcuanNvbic7XG4gIH1cbiAgcmV0dXJuICdAdHNjb25maWcvYnVuL3RzY29uZmlnLmpzb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuIFsnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSddO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9idW4nXTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1vZHVsZSBzcGVjaWZpZXIgYSBnZW5lcmF0ZWQgY29uZmlnIGZpbGUgc2hvdWxkIHVzZSB0byBsb2FkIGFcbiAqIHdpbGxib29zdGVyLWNvbmZpZ3MgY29uZmlnIHBhY2thZ2Ugc3VjaCBhcyBgQHdpbGxib29zdGVyL294bGludC1jb25maWdgLlxuICpcbiAqIE91dHNpZGUgd2lsbGJvb3N0ZXItY29uZmlncyB0aGlzIGlzIHNpbXBseSB0aGUgcHVibGlzaGVkIHBhY2thZ2UgbmFtZS4gSW5zaWRlXG4gKiB3aWxsYm9vc3Rlci1jb25maWdzIHRoZSBwYWNrYWdlIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGEgZGVwZW5kZW5jeTogdGhlXG4gKiBjb25maWcgcGFja2FnZXMgaW1wb3J0IG9uZSBhbm90aGVyIChlLmcuIG94Zm10LWNvbmZpZydzIG94bGludC5jb25maWcudHNcbiAqIGltcG9ydHMgb3hsaW50LWNvbmZpZyBhbmQgdmljZSB2ZXJzYSksIHNvIGEgZGVjbGFyZWQgZWRnZSB3b3VsZCBmb3JtIGFcbiAqIGRlcGVuZGVuY3kgY3ljbGUgdGhhdCBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlIGNhbm5vdCB0b3BvbG9naWNhbGx5IHNvcnQuIFNpbmNlXG4gKiB0aGUgZWRnZSBpcyBhYnNlbnQsIGlzb2xhdGVkIGluc3RhbGxzIGNhbm5vdCByZXNvbHZlIHRoZSBiYXJlIHBhY2thZ2UgbmFtZSwgc29cbiAqIGltcG9ydCB0aGUgY29tbWl0dGVkIGBjb25maWcubWpzYCBidWlsZCBvdXRwdXQgdGhyb3VnaCBhIHJlbGF0aXZlIHBhdGggaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZShjb25maWc6IFBhY2thZ2VDb25maWcsIGNvbmZpZ1BhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykgcmV0dXJuIGNvbmZpZ1BhY2thZ2VOYW1lO1xuXG4gIC8vIGUuZy4gJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyAtPiAnb3hsaW50LWNvbmZpZycsIHdoaWNoIGlzIGl0cyBkaXJlY3RvcnkgdW5kZXIgYHBhY2thZ2VzL2AuXG4gIGNvbnN0IGNvbmZpZ1BhY2thZ2VEaXIgPSBjb25maWdQYWNrYWdlTmFtZS5zcGxpdCgnLycpLnBvcCgpID8/ICcnO1xuICAvLyBEZXJpdmUgdGhlIHdpbGxib29zdGVyLWNvbmZpZ3Mgcm9vdCBmcm9tIHRoZSBwYWNrYWdlIGJlaW5nIGdlbmVyYXRlZCwgbm90IGZyb20gdGhlIENMSSBlbnRyeVxuICAvLyBwYXRoOiBgd2JmeSA8cmVwbz4vcGFja2FnZXMvPHBrZz5gIGlzIGEgc3VwcG9ydGVkIGludm9jYXRpb24gd2hvc2UgZW50cnkgY29uZmlnIGlzIHRoZSBjaGlsZFxuICAvLyBwYWNrYWdlIHJhdGhlciB0aGFuIHRoZSByZXBvIHJvb3QsIHNvIHJlbHlpbmcgb24gdGhlIGVudHJ5IHdvdWxkIGVtaXQgYSBuZXN0ZWQsIHVucmVzb2x2YWJsZVxuICAvLyBwYXRoIGZvciBhIGRpcmVjdGx5IHRhcmdldGVkIGNvbmZpZyBwYWNrYWdlLiBFdmVyeSB3aWxsYm9vc3Rlci1jb25maWdzIHBhY2thZ2UgaXMgZWl0aGVyIHRoZVxuICAvLyByb290IG9yIGEgZGlyZWN0IGNoaWxkIHVuZGVyIGBwYWNrYWdlcy9gLCBzbyB0aGUgcm9vdCBpcyB0aGUgcGFja2FnZSBkaXIgaXRzZWxmIG9yIGl0cyBncmFuZHBhcmVudC5cbiAgY29uc3QgcmVwb1Jvb3REaXJQYXRoID0gY29uZmlnLmlzUm9vdCA/IGNvbmZpZy5kaXJQYXRoIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLi4nLCAnLi4nKTtcbiAgY29uc3QgbG9jYWxFbnRyeSA9IHBhdGgucmVzb2x2ZShyZXBvUm9vdERpclBhdGgsICdwYWNrYWdlcycsIGNvbmZpZ1BhY2thZ2VEaXIsICdjb25maWcubWpzJyk7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGxvY2FsRW50cnkpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSA/IHJlbGF0aXZlUGF0aCA6IGAuLyR7cmVsYXRpdmVQYXRofWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmXG4gICAgIWNvbmZpZy5pc1Jvb3QgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24/LnByaXZhdGUgIT09IHRydWUgJiZcbiAgICBBcnJheS5pc0FycmF5KGNvbmZpZy5wYWNrYWdlSnNvbj8uZmlsZXMpICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uLmZpbGVzLmxlbmd0aCA+IDBcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgc29ydFBhY2thZ2VKc29uIH0gZnJvbSAnc29ydC1wYWNrYWdlLWpzb24nO1xuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzLCBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yLCB0eXBlIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNsYXNzaWZ5U2NyaXB0U2VnbWVudCwgc3BsaXRTY3JpcHRTZWdtZW50cyB9IGZyb20gJy4uL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICcuLi91dGlscy9zdHJpbmdVdGlsLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcywgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuaW1wb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyxcbiAgaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxufSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcbmltcG9ydCB7IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMsIGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyB9IGZyb20gJy4vYnVuZmlnLmpzJztcblxuY29uc3Qgb3hsaW50RGVwcyA9IFsnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsICdveGZtdCcsICdveGxpbnQnLCAnb3hsaW50LXRzZ29saW50J107XG5jb25zdCB0eXBlc2NyaXB0RGVwZW5kZW5jeSA9ICd0eXBlc2NyaXB0Jztcbi8vIFR5cGVTY3JpcHQgNydzIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGlzIHRoZSB0c2dvIG5hdGl2ZSBjb21waWxlciBhbmQgZXhwb3NlcyBub1xuLy8gcHJvZ3JhbW1hdGljIEFQSS4gTmV4dC5qcydzIGJ1aWxkLXRpbWUgYHZlcmlmeVR5cGVTY3JpcHRTZXR1cGAgbmVlZHMgdGhhdCBBUEksIHNvXG4vLyBgbmV4dCBidWlsZGAgZmFpbHMgKFwidHJ5aW5nIHRvIHVzZSBUeXBlU2NyaXB0IGJ1dCBkbyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgcGFja2FnZShzKVwiKVxuLy8gd2l0aCBvbmx5IGB0eXBlc2NyaXB0YCB2NyBpbnN0YWxsZWQuIE5leHQuanMgcmVzb2x2ZXMgdGhlIHRzZ28gYmluYXJ5IHRocm91Z2ggdGhlXG4vLyBzZXBhcmF0ZSBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgIHBhY2thZ2UsIHNvIE5leHQuanMtZmFtaWx5IHJlcG9zIG11c3QgaW5zdGFsbFxuLy8gYm90aDsgb3RoZXIgcmVwb3Mgb25seSBuZWVkIGB0eXBlc2NyaXB0YCBmb3IgYHRzY2AgdHlwZWNoZWNrcy5cbmNvbnN0IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgPSAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnO1xuY29uc3Qgd2JEZXBlbmRlbmN5ID0gJ0B3aWxsYm9vc3Rlci93Yic7XG5jb25zdCBidWlsZFRzRGVwZW5kZW5jeSA9ICdidWlsZC10cyc7XG5jb25zdCBsZWZ0aG9va0RlcGVuZGVuY3kgPSAnbGVmdGhvb2snO1xuY29uc3QgbWFuYWdlZERlcGVuZGVuY3lOYW1lcyA9IG5ldyBTZXQoW1xuICB3YkRlcGVuZGVuY3ksXG4gIGJ1aWxkVHNEZXBlbmRlbmN5LFxuICBsZWZ0aG9va0RlcGVuZGVuY3ksXG4gIHR5cGVzY3JpcHREZXBlbmRlbmN5LFxuICB0eXBlc2NyaXB0R29EZXBlbmRlbmN5LFxuICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAvLyBNaXhlZCBAdHlwZXMvYnVuIHZlcnNpb25zIGFjcm9zcyBhIG1vbm9yZXBvIGxvYWQgdHdvIGJ1bi10eXBlcyBjb3BpZXMsIHdoaWNoXG4gIC8vIGJyZWFrcyBnbG9iYWwgaW50ZXJmYWNlIG1lcmdpbmcgKGUuZy4gUmVzcG9uc2UvSGVhZGVycykgZHVyaW5nIHR5cGUgY2hlY2tpbmcuXG4gICdAdHlwZXMvYnVuJyxcbiAgLi4ub3hsaW50RGVwcyxcbl0pO1xuY29uc3QgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5jb25zdCBwYWNrYWdlQWdlR2F0ZU1zID0gYnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzICogMTAwMDtcbmNvbnN0IG5wbVBhY2thZ2VUaW1lc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG50eXBlIFdyaXRhYmxlUGFja2FnZUpzb24gPSBTZXRSZXF1aXJlZDxcbiAgUGFja2FnZUpzb24sXG4gICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcydcbj47XG5cbmludGVyZmFjZSBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIGRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgd29ya2VyVHlwZXNTY3JpcHRFcnJvciA9IGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IoY29uZmlnKTtcbiAgaWYgKHdvcmtlclR5cGVzU2NyaXB0RXJyb3IpIHRocm93IG5ldyBFcnJvcih3b3JrZXJUeXBlc1NjcmlwdEVycm9yKTtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvbk9iaiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gIHVwZGF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgZW5zdXJlVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmopO1xuICBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgcHJ1bmVDYXBhYmlsaXR5RGVwZW5kZW50Q29tcGlsZXJEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgY29uc3QgZGVwZW5kZW5jeVVwZGF0ZXMgPSBhd2FpdCBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICAvLyBPbiBhIGZpcnN0IHJ1biB0aGVyZSBpcyBubyBtYW5pZmVzdCBmb3IgYGJ1biBhZGRgIHRvIHVwZGF0ZSByZWxpYWJseS4gV3JpdGUgdGhlIHJlc29sdmVkXG4gIC8vIGRlcGVuZGVuY3kgdmVyc2lvbnMgaW50byB0aGUgbmV3IG1hbmlmZXN0IGRpcmVjdGx5OyB0aGUgZmluYWwgcmVwb3NpdG9yeS13aWRlIGBidW4gaW5zdGFsbGBcbiAgLy8gdGhlbiBpbnN0YWxscyB0aGVtIGFuZCByZW1haW5zIHRoZSBhdXRob3JpdGF0aXZlIGZhaWx1cmUgY2hlY2suXG4gIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBkZXBlbmRlbmN5VXBkYXRlcyxcbiAgICBza2lwQWRkaW5nRGVwcyB8fCAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb25cbiAgKTtcbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuICByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcblxuICBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgLy8gWWFybiByZWFkcyBwYWNrYWdlLmpzb24gZnJvbSBkaXNrIGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIGB5YXJuIGFkZCAtRGBcbiAgLy8gY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgcmVndWxhciBkZXBlbmRlbmN5LCBzbyB0aGlzIHdyaXRlIG11c3QgZmluaXNoXG4gIC8vIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlcyBiZWxvdy4gS2VlcCB0aGlzIGdlbmVyYXRlZFxuICAvLyBmaWxlIHNvcnRlZCBldmVuIHdoZW4gd2UgbGF0ZXIgcnVuIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIGZvcm1hdHRlciBzbyBhXG4gIC8vIG1pZC1ydW4gaW50ZXJydXB0aW9uIG5ldmVyIGxlYXZlcyBwYWNrYWdlLmpzb24gaW4gYSBwYXJ0aWFsbHkgbWFuYWdlZCBvcmRlci5cbiAgLy8gQSByZWZ1c2VkIHdyaXRlIChlLmcuIGEgc3ltbGlua2VkIHBhY2thZ2UuanNvbikgbXVzdCBhbHNvIGFib3J0IHRoZSBkZXBlbmRlbmN5IGluc3RhbGxhdGlvblxuICAvLyBiZWxvdzogYGJ1biBhZGRgIGZvbGxvd3MgdGhlIHN5bWxpbmsgYW5kIHdvdWxkIG1vZGlmeSB0aGUgZmlsZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqKSkpKSByZXR1cm47XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgICAvLyBBIG5ld2x5IGNyZWF0ZWQgbWFuaWZlc3QgaXMgYWxyZWFkeSBzb3J0ZWQgYnkgd2JmeSdzIGJ1bmRsZWQgc2VyaWFsaXplcjsgdGhlIHRhcmdldCBmb3JtYXR0ZXJcbiAgICAvLyBpcyBhdmFpbGFibGUgd2l0aG91dCBhbiBleHRyYSBmZXRjaCBvbmx5IHdoZW4gdGhpcyBydW4gc3RhcnRlZCB3aXRoIHBhY2thZ2UuanNvbi5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnLCBmaWxlUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBzdHJpbmcge1xuICAvLyBmc1V0aWwuZ2VuZXJhdGVGaWxlKCkgbm9ybWFsaXplcyB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28ga2VlcCB0aGUgc2VyaWFsaXplclxuICAvLyBmb2N1c2VkIG9uIHRoZSBKU09OIHBheWxvYWQgaXRzZWxmLlxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8V3JpdGFibGVQYWNrYWdlSnNvbj4ge1xuICBsZXQganNvbk9iajogUGFja2FnZUpzb24gPSB7fTtcbiAgdHJ5IHtcbiAgICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBEb2N1bWVudGF0aW9uLW9ubHkgcmVwb3NpdG9yaWVzIGhhdmUgbm8gbWFuaWZlc3Qgb24gdGhlaXIgZmlyc3Qgd2JmeSBydW4uIFN0YXJ0aW5nIGZyb20gYW5cbiAgICAvLyBlbXB0eSBvYmplY3QgbGV0cyB0aGUgbm9ybWFsIGdlbmVyYXRvciBlc3RhYmxpc2ggdGhlIHNhbWUgbWFuYWdlZCBiYXNlbGluZSBhcyBldmVyeSBvdGhlclxuICAgIC8vIHJlcG9zaXRvcnk7IG1hbGZvcm1lZCBvciB1bnJlYWRhYmxlIGV4aXN0aW5nIG1hbmlmZXN0cyBtdXN0IHN0aWxsIGZhaWwgbG91ZGx5LlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnRU5PRU5UJykgdGhyb3cgZXJyb3I7XG4gIH1cbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzID8/IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPz8ge307XG4gIHJldHVybiBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb247XG59XG5cbmZ1bmN0aW9uIHBydW5lQ2FwYWJpbGl0eURlcGVuZGVudENvbXBpbGVyRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICAvLyBSdW4gYmVmb3JlIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucywgd2hpY2ggcmUtYWRkcyB0c2dvIG9ubHkgZm9yIGN1cnJlbnQgTmV4dC5qcy1mYW1pbHkgcmVwb3NpdG9yaWVzLlxuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbdHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0R29EZXBlbmRlbmN5XTtcbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xufVxuXG4vKipcbiAqIEtlZXBzIHRoZSBwcm9qZWN0J3Mgb3duIHNlZ21lbnRzIGluIG9yZGVyLCByZXBsYWNpbmcgdGhlIGZpcnN0IG1hbmFnZWQgZ2VuLWNvZGUgc3BlbGxpbmcgd2l0aFxuICogYGJ1biB3YiBnZW4tY29kZWAgYW5kIGRyb3BwaW5nIGxhdGVyIGR1cGxpY2F0ZXMuIEFwcGVuZHMgZ2VuZXJhdGlvbiBvbmx5IHdoZW4gdGhlIHNjcmlwdFxuICogY29udGFpbmVkIG5vbmUsIHNvIG5vdGhpbmcgaXMgcmVvcmRlcmVkLlxuICovXG5mdW5jdGlvbiByZWJ1aWxkUG9zdGluc3RhbGxTZWdtZW50cyhzZWdtZW50czogc3RyaW5nW10sIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGtpbmRzID0gc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwgc2NyaXB0cywgdHJ1ZSkpO1xuICAvLyBBIHdyYXBwZXIgYXJvdW5kIGEgY3VzdG9taXplZCBnZW4tY29kZSBhbHJlYWR5IGdlbmVyYXRlczsgYWRkaW5nIGFub3RoZXIgaW52b2NhdGlvbiB3b3VsZCBydW4gZXZlcnlcbiAgLy8gZ2VuZXJhdG9yIHR3aWNlLlxuICBsZXQgZ2VuZXJhdGlvblBsYWNlZCA9IGtpbmRzLmluY2x1ZGVzKCdnZW5Db2RlV3JhcHBlcicpO1xuICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2luZGV4LCBzZWdtZW50XSBvZiBzZWdtZW50cy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBraW5kID0ga2luZHNbaW5kZXhdO1xuICAgIGlmIChraW5kID09PSAnY3VzdG9tJyB8fCBraW5kID09PSAnZ2VuQ29kZVdyYXBwZXInKSB7XG4gICAgICByZXN1bHQucHVzaChzZWdtZW50KTtcbiAgICB9IGVsc2UgaWYgKCFnZW5lcmF0aW9uUGxhY2VkKSB7XG4gICAgICByZXN1bHQucHVzaCgnYnVuIHdiIGdlbi1jb2RlJyk7XG4gICAgICBnZW5lcmF0aW9uUGxhY2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFnZW5lcmF0aW9uUGxhY2VkKSByZXN1bHQucHVzaCgnYnVuIHdiIGdlbi1jb2RlJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBtYW5hZ2VkIGdlbi1jb2RlIHNlZ21lbnRzIHdoaWxlIGtlZXBpbmcgdGhlIGZpcnN0IHNlZ21lbnQncyBwb3NpdGlvbiBzbyBhIGN1c3RvbVxuICogc3RlcCB0aGF0IGNvbnN1bWVzIGdlbmVyYXRlZCBvdXRwdXQgc3RpbGwgcnVucyBhZnRlciBpdC4gUmV0dXJucyB3aXRob3V0IGNoYW5naW5nIGFuXG4gKiB1bnBhcnNlYWJsZSBzY3JpcHQuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsIG1hbmFnZXNXb3JrZXJUeXBlczogYm9vbGVhbik6IHZvaWQge1xuICAvLyBgYnVuIHdiIGdlbi1jb2RlYCByZWdlbmVyYXRlcyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGl0c2VsZiwgc28gYSBwYWNrYWdlIHdpdGggYVxuICAvLyBjb2RlLWdlbmVyYXRpb24gb3Igd29ya2VyLXR5cGVzIHBpcGVsaW5lIGdldHMgb25lIG1hbmFnZWQgZ2VuZXJhdGlvbiBzZWdtZW50LlxuICBpZiAoc2NyaXB0c1snZ2VuLWNvZGUnXSB8fCBtYW5hZ2VzV29ya2VyVHlwZXMpIHtcbiAgICAvLyBQcm9qZWN0LW93bmVkIHN0ZXBzIGFyZSBuZXZlciBkcm9wcGVkLCBhbmQgdGhlaXIgUE9TSVRJT04gcmVsYXRpdmUgdG8gZ2VuZXJhdGlvbiBpcyBwcmVzZXJ2ZWQ6IGEgc3RlcFxuICAgIC8vIGJlZm9yZSBpdCBtYXkgcHJvZHVjZSBgd3JhbmdsZXIgdHlwZXNgJyBpbnB1dHMgKGEgd3JhbmdsZXIgY29uZmlnLCBgLmRldi52YXJzYCksIHdoaWxlIG9uZSBhZnRlciBpdCBtYXlcbiAgICAvLyBjb25zdW1lIHRoZSBnZW5lcmF0ZWQgdHlwZXMuIFNvIHRoZSBtYW5hZ2VkIGdlbmVyYXRpb24gcmVwbGFjZXMgdGhlIGZpcnN0IG1hbmFnZWQgc2VnbWVudCBpbiBwbGFjZSwgYW5kIGlzXG4gICAgLy8gYXBwZW5kZWQgb25seSB3aGVuIHRoZSBzY3JpcHQgaGFkIG5vbmUuIEEgd3JhcHBlciBhcm91bmQgYSBjdXN0b21pemVkIGdlbi1jb2RlIGFscmVhZHkgcGVyZm9ybXMgdGhlXG4gICAgLy8gZ2VuZXJhdGlvbiBwbHVzIHRoZSBwcm9qZWN0J3Mgb3duIHN0ZXBzLCBzbyBpdCBzdXBwcmVzc2VzIHRoZSByZXBsYWNlbWVudCBlbnRpcmVseS5cbiAgICBjb25zdCBzZWdtZW50cyA9IHNjcmlwdHMucG9zdGluc3RhbGwgPT09IHVuZGVmaW5lZCA/IFtdIDogc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsKTtcbiAgICBjb25zdCBrZXB0U2VnbWVudHMgPSBzZWdtZW50cyAmJiByZWJ1aWxkUG9zdGluc3RhbGxTZWdtZW50cyhzZWdtZW50cywgc2NyaXB0cyk7XG4gICAgaWYgKGtlcHRTZWdtZW50cykge1xuICAgICAgc2NyaXB0cy5wb3N0aW5zdGFsbCA9IGtlcHRTZWdtZW50cy5qb2luKCcgJiYgJyk7XG4gICAgfVxuICAgIC8vIEFueSBvdGhlciB1bnBhcnNlYWJsZSBwb3N0aW5zdGFsbCBpcyBsZWZ0IHRvIGEgaHVtYW4gcmF0aGVyIHRoYW4gcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxEZXBlbmRlbmN5VXBkYXRlcz4ge1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG5cbiAgaWYgKFxuICAgIGhhc0phdmEgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIC8vIExlZnRob29rIGdlbmVyYXRpb24gaXMgYmVzdC1lZmZvcnQgYW5kIC5sZWZ0aG9vayBpcyBhYnNlbnQgZnJvbSBEb2NrZXIgYnVpbGQgY29udGV4dHMsIHNvIGFcbiAgICAvLyBtaXNzaW5nIG5vcm1hbGl6ZXIgaXMgdmFsaWQuIE9uY2UgcHJlc2VudCwgaXRzIGZhaWx1cmUgbXVzdCBhYm9ydCBpbnN0YWxsIHJhdGhlciB0aGFuIGxlYXZlIGFcbiAgICAvLyBHdWFyZC1waW5uZWQgbG9ja2ZpbGUgYmVoaW5kOyBrZWVwIHRoYXQgZmFpbC1mYXN0IGdyb3VwaW5nIGV4cGxpY2l0IGJlZm9yZSBhbnkgd29ya3NwYWNlIGJ1aWxkLlxuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID1cbiAgICAgICcoYnVuIGxlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSkgJiYgKHRlc3QgISAtZiAubGVmdGhvb2svbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCB8fCBiYXNoIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoKSc7XG4gICAgLy8gV2hlbiBAd2lsbGJvb3N0ZXIvd2IgaXMgYSB3b3Jrc3BhY2Ugb2YgdGhpcyByZXBvc2l0b3J5LCB0aGUgZ2VuZXJhdGVkIGBidW4gd2Ig4oCmYCBzY3JpcHRzIHJ1blxuICAgIC8vIGl0cyBnaXRpZ25vcmVkIGRpc3QgYnVpbGQgKGJpbi9pbmRleC5qcyBpbXBvcnRzIC4uL2Rpc3QvaW5kZXguanMpLCBzbyBhIGZyZXNoIGNoZWNrb3V0IG11c3RcbiAgICAvLyBidWlsZCBpdCBkdXJpbmcgaW5zdGFsbDsgcmVnaXN0cnkgaW5zdGFsbHMgc2hpcCBhIHByZWJ1aWx0IGRpc3QgYW5kIG5lZWQgbm8gZXh0cmEgc3RlcC5cbiAgICBjb25zdCB3YldvcmtzcGFjZURpciA9IGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLmdldCh3YkRlcGVuZGVuY3kpO1xuICAgIGlmICh3YldvcmtzcGFjZURpcikge1xuICAgICAgLy8gU2luZ2xlIHF1b3RlcyAod2l0aCBlbWJlZGRlZCBxdW90ZXMgZXNjYXBlZCkgcHJldmVudCB0aGUgc2hlbGwgZnJvbSBleHBhbmRpbmcgYCQo4oCmKWAgb3JcbiAgICAgIC8vIHZhcmlhYmxlcyB0aGF0IGEgaG9zdGlsZSBkaXJlY3RvcnkgbmFtZSBjb3VsZCBzbXVnZ2xlIGludG8gdGhlIGdlbmVyYXRlZCBzY3JpcHQuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSArPSBgICYmIGJ1biBydW4gLS1jd2QgJyR7d2JXb3Jrc3BhY2VEaXIucmVwbGFjZUFsbChcIidcIiwgU3RyaW5nLnJhd2AnXFwnJ2ApfScgYnVpbGRgO1xuICAgIH1cbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChsZWZ0aG9va0RlcGVuZGVuY3kpO1xuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoZG9lc1JlbGVhc2VTY3JpcHRJbnN0YWxsU2VtYW50aWNSZWxlYXNlKGpzb25PYmouc2NyaXB0cy5yZWxlYXNlKSkge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzLmFydGlsbGVyeSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5hcnRpbGxlcnk7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRSdW50aW1lKSB7XG4gICAgICAgIC8vIFJ1bnRpbWUgaW1wb3J0cyBuZWVkIHRoZSBzdGFuZGFsb25lIHBhY2thZ2UgYWZ0ZXIgRG9ja2VyIHBydW5pbmcgcmVtb3ZlcyBkZXZEZXBlbmRlbmNpZXMuXG4gICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz89XG4gICAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCA/P1xuICAgICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gPz9cbiAgICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddO1xuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaCgncGxheXdyaWdodCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby4gWWFybiB2MSdzIG9iamVjdCBmb3JtIGtlZXBzIGl0c1xuICAgICAgLy8gZGVjbGFyZWQgcGF0dGVybnMgKHdvcmtzcGFjZXMucGFja2FnZXMpOyBvbmx5IGV4dHJhcyBzdWNoIGFzIG5vaG9pc3QgYXJlIGRyb3BwZWQuXG4gICAgICAvLyBGb3JjZSBgcGFja2FnZXMvKmAgb25seSB3aGVuIGl0IGFjdHVhbGx5IG1hdGNoZXMgYSB3b3Jrc3BhY2UgbWFuaWZlc3Q6IGFuIGFwcHMvKi1vbmx5XG4gICAgICAvLyBtb25vcmVwbyBtdXN0IG5vdCBnZXQgYSBuZXZlci1tYXRjaGluZyBwYXR0ZXJuIGFwcGVuZGVkIHRvIGl0cyBkZWNsYXJhdGlvbi4gQVxuICAgICAgLy8gYmFzZWxpbmUtc2VlZGluZyBkZWNsYXJhdGlvbiBuZWVkcyBubyBmb3JjZWQgcGF0dGVybiBhdCBhbGwg4oCUIHRoZSBzZWVkZWQgYmFzZWxpbmVcbiAgICAgIC8vIChgKi8qYCBvciBgKipgKSBhbHJlYWR5IGNvdmVycyBwYWNrYWdlcy8qLiBUaGUgZm9yY2VkIHBhdHRlcm4gaXMgUFJFUEVOREVEOiBCdW5cbiAgICAgIC8vIGV2YWx1YXRlcyB3b3Jrc3BhY2UgcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBhIHBvc2l0aXZlIHBhdHRlcm4gcGxhY2VkIGFmdGVyIGEgdXNlclxuICAgICAgLy8gbmVnYXRpb24gd291bGQgcmUtaW5jbHVkZSB0aGUgbmVnYXRlZCBwYWNrYWdlcy4gQSBkZWNsYXJhdGlvbiB0aGF0IGFscmVhZHkgY292ZXJzXG4gICAgICAvLyBwYWNrYWdlcy8qIHVuZGVyIG5vcm1hbGl6YXRpb24gKGUuZy4gYC4vcGFja2FnZXMvKmApIGlzIGtlcHQgdmVyYmF0aW06IGZvcmNpbmcgYSB0ZXh0dWFsXG4gICAgICAvLyBgcGFja2FnZXMvKmAgbmV4dCB0byBpdCB3b3VsZCBwZXJzaXN0IGEgZHVwbGljYXRlIGVxdWl2YWxlbnQgcGF0dGVybi5cbiAgICAgIGNvbnN0IGZvcmNlZFBhdHRlcm5zID1cbiAgICAgICAgIWhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUoanNvbk9iai53b3Jrc3BhY2VzKSAmJlxuICAgICAgICAhaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKGpzb25PYmoud29ya3NwYWNlcykgJiZcbiAgICAgICAgZmcuZ2xvYlN5bmMoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywgeyBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfSkubGVuZ3RoID4gMFxuICAgICAgICAgID8gWydwYWNrYWdlcy8qJ11cbiAgICAgICAgICA6IFtdO1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gbWVyZ2UuYWxsKFtmb3JjZWRQYXR0ZXJucywgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhqc29uT2JqLndvcmtzcGFjZXMpXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICB9KTtcbiAgICAgIC8vIEJvdGggaW5wdXRzIGNhbiBiZSBlbXB0eSAoZS5nLiBwYWNrYWdlcy9wYWNrYWdlLmpzb24gd2l0aG91dCBhbnkgcGFja2FnZXMvKi9wYWNrYWdlLmpzb25cbiAgICAgIC8vIGFuZCBubyBkZWNsYXJlZCB3b3Jrc3BhY2VzKTsgZG8gbm90IHBlcnNpc3QgYSBtZWFuaW5nbGVzcyBgd29ya3NwYWNlczogW11gLlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSAmJiBqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpeGVycy9uZXh0Q29uZmlnLnRzIGVuYWJsZXMgYHJlYWN0Q29tcGlsZXI6IHRydWVgIGZvciBldmVyeSBOZXh0LmpzIHByb2plY3QsIGFuZCBOZXh0LmpzXG4gIC8vIHJlc29sdmVzIGBiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXJgIGF0IGJ1aWxkIHRpbWUgd2hlbiBSZWFjdCBDb21waWxlciBpcyBvbi4gQWRkIGl0IGhlcmUgc29cbiAgLy8gdGhlIG1hbmFnZWQgbmV4dC5jb25maWcgbmV2ZXIgYnJlYWtzIGBuZXh0IGJ1aWxkYCB3aXRoIGFuIHVucmVzb2x2ZWQtcGFja2FnZSBlcnJvci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXInKTtcbiAgfVxuXG4gIC8vIGB3YiB2ZXJpZnkgLS1mdWxsYCBhdWRpdHMgZXZlcnkgYCouc2xpZGV2Lm1kYCBkZWNrIHdpdGggc2xpZGV2LWNoZWNrLCBzbyB0aGUgY2hlY2tlciBoYXMgdG8gYmVcbiAgLy8gaW5zdGFsbGVkIHdoZXJldmVyIGEgZGVjayBsaXZlcy5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblNsaWRldk1kKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NsaWRldi1jaGVjaycpO1xuICB9XG5cbiAgaWYgKCFpc1diUGFja2FnZShqc29uT2JqKSkge1xuICAgIC8vIEEgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBkZXBlbmRzIG9uIHRoZSB3YiBkZXZlbG9wZWQgaW4gdGhpcyByZXBvc2l0b3J5IChlLmcuXG4gICAgLy8gV2lsbEJvb3N0ZXIvc2hhcmVkIGl0c2VsZik7IGluc3RhbGxpbmcgdGhlIGxhdGVzdCByZWdpc3RyeSByZWxlYXNlIG92ZXIgaXQgd291bGQgc2lsZW50bHlcbiAgICAvLyByZXBsYWNlIHRoZSBsb2NhbCBidWlsZCB3aXRoIGEgcHVibGlzaGVkIG9uZSwgc28gbGVhdmUgc3VjaCBhIGRlY2xhcmF0aW9uIHVudG91Y2hlZC5cbiAgICBjb25zdCB3YlNwZWNpZmllciA9IGpzb25PYmouZGVwZW5kZW5jaWVzW3diRGVwZW5kZW5jeV0gPz8ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbd2JEZXBlbmRlbmN5XTtcbiAgICBpZiAoIXdiU3BlY2lmaWVyPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgIGlmIChzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBidWlsZC10cyBvd25zIFR5cGVTY3JpcHQgZXhlY3V0aW9uIGFuZCBkZWNsYXJhdGlvbiBlbWl0LiB3YmZ5IG11c3QgYWx3YXlzXG4gIC8vIGtlZXAgZXhpc3RpbmcgYnVpbGQtdHMgdXNlcnMgY3VycmVudCBiZWNhdXNlIG9sZGVyIHJlbGVhc2VzIGNhbiBlbWl0IC5kLnRzXG4gIC8vIGZpbGVzIGF0IHBhdGhzIHRoYXQgbm8gbG9uZ2VyIG1hdGNoIHBhY2thZ2UgZXhwb3J0cy5cbiAgaWYgKFxuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIE9iamVjdC52YWx1ZXMoanNvbk9iai5zY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHNjcmlwdD8uaW5jbHVkZXMoYnVpbGRUc0RlcGVuZGVuY3kpKVxuICApIHtcbiAgICBpZiAoc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5veGxpbnREZXBzKTtcbiAgfVxuXG4gIGNvbnN0IHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKSA6IFtdO1xuICBhd2FpdCByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqLCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi50c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlLCBzbyBpdCBpc1xuICAgIC8vIG5vdyB0aGUgbWFuYWdlZCBjb21waWxlciBmb3IgZXZlcnkgVHlwZVNjcmlwdCByZXBvICh0eXBlY2hlY2tpbmcgcnVucyBgdHNjYCkuXG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdERlcGVuZGVuY3kpO1xuICAgIC8vIE5leHQuanMncyBgbmV4dCBidWlsZGAgaW5zcGVjdHMgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgdG8gcnVuIGl0cyB0eXBlXG4gICAgLy8gY2hlY2s7IHRoZSBgdHlwZXNjcmlwdGAgdjcgcGFja2FnZSBhbG9uZSBsYWNrcyB0aGUgQVBJIG5leHQgbmVlZHMsIHNvIGtlZXAgYm90aFxuICAgIC8vIGluc3RhbGxlZCBmb3IgTmV4dC5qcy1mYW1pbHkgcmVwb3MuIFNlZSB0aGUgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSBjb21tZW50IGFib3ZlLlxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdEdvRGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIC8vIFJlYWN0IE5hdGl2ZSByZWxpZXMgb24gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSdzIGFtYmllbnQgdHlwZXMgaW5zdGVhZCBvZiBAdHlwZXMvYnVuLlxuICAgIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ3RzLWplc3QnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICAgICkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9qZXN0Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIHJldHVybiB7XG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIGRldkRlcGVuZGVuY2llczogZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgcHl0aG9uRGV2RGVwZW5kZW5jaWVzIH07XG59XG5cbmZ1bmN0aW9uIGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShzY3JpcHQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBzY3JpcHQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAvXFxiKD86YnVueHxucHh8cG5wbVxccytkbHh8eWFyblxccytkbHgpXFxzK3NlbWFudGljLXJlbGVhc2UoPzpAXFxTKyk/XFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2RlcGVuZGVuY3ksIGtlZXBBc1J1bnRpbWVdIG9mIFtcbiAgICBbd2JEZXBlbmRlbmN5LCBzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopXSxcbiAgICBbYnVpbGRUc0RlcGVuZGVuY3ksIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gIF0gYXMgY29uc3QpIHtcbiAgICBpZiAoa2VlcEFzUnVudGltZSkge1xuICAgICAgY29uc3QgZGV2VmVyc2lvbiA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFkZXZWZXJzaW9uKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9uID0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIXJ1bnRpbWVWZXJzaW9uIHx8IGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihkZXZWZXJzaW9uLCBydW50aW1lVmVyc2lvbikpIHtcbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBkZXZWZXJzaW9uO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIH0gZWxzZSBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIHtcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID8/PSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICAvLyBQcm9kdWN0aW9uIGltYWdlcyBydW4gbWlncmF0aW9ucyBhZnRlciBkZXZEZXBlbmRlbmNpZXMgYXJlIHBydW5lZCwganVzdCBhcyBwYWNrYWdlIG1hbmFnZXJzXG4gIC8vIHJ1biBwb3N0aW5zdGFsbCBkdXJpbmcgcHJvZHVjdGlvbiBpbnN0YWxscywgc28gYm90aCBlbnRyeSBwb2ludHMgbXVzdCByZXRhaW4gdGhlIHdiIGJpbmFyeS5cbiAgLy8gS2VlcCB0aGUgd29yZCBtYXRjaCBjb25zZXJ2YXRpdmU6IHN1cHBvcnRlZCBjdXN0b20gd3JhcHBlcnMgY2FuIHB1dCB3YiBpbnNpZGUgc2hlbGwgbG9vcHMgdGhhdFxuICAvLyB0aGUgY29tbWFuZC1wb3NpdGlvbiBwYXJzZXIgY2Fubm90IGNsYXNzaWZ5LCB3aGlsZSBhIGZhbHNlIHBvc2l0aXZlIG9ubHkgcmV0YWlucyB0aGUgQ0xJLlxuICByZXR1cm4gW2pzb25PYmouc2NyaXB0cz8ucG9zdGluc3RhbGwsIGpzb25PYmouc2NyaXB0cz8uWydkYi1taWdyYXRlJ11dLnNvbWUoXG4gICAgKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgL1xcYndiXFxiL3UudGVzdChzY3JpcHQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICBjb25zdCBwcmlzbWEgPSBqc29uT2JqLnByaXNtYSBhcyB7IHNlZWQ/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHByaXNtYT8uc2VlZCkgfHwgZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhqc29uT2JqLnNjcmlwdHM/LnNlZWQpO1xufVxuXG5mdW5jdGlvbiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHNlZWRDb21tYW5kOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIC8vIFByb2R1Y3Rpb24gRG9ja2VyIGltYWdlcyBydW4gc2VlZCBzY3JpcHRzIGFmdGVyIGRldkRlcGVuZGVuY2llcyBhcmUgcHJ1bmVkLFxuICAvLyBzbyBUeXBlU2NyaXB0IHNlZWQgcnVubmVycyBtdXN0IHJlbWFpbiBhdmFpbGFibGUgYXQgcnVudGltZS5cbiAgcmV0dXJuIHR5cGVvZiBzZWVkQ29tbWFuZCA9PT0gJ3N0cmluZycgJiYgLyg/PCFbXFx3LV0pYnVpbGQtdHMoPyFbXFx3LV0pL3UudGVzdChzZWVkQ29tbWFuZCk7XG59XG5cbmNvbnN0IGRlcGVuZGVuY3lEZWNsYXJhdGlvblNlY3Rpb25zID0gW1xuICAnZGVwZW5kZW5jaWVzJyxcbiAgJ2RldkRlcGVuZGVuY2llcycsXG4gICdvcHRpb25hbERlcGVuZGVuY2llcycsXG4gICdwZWVyRGVwZW5kZW5jaWVzJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogRm9yY2VzIHN0b3JlLWluY29tcGF0aWJsZSBwYWNrYWdlcyB0byBzdGF5IHByb2plY3QtbG9jYWwgd2hlbiB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIGVuYWJsZXNcbiAqIEJ1bidzIGdsb2JhbCBzdG9yZTogYGNoYWtyYSB0eXBlZ2VuYCAocnVuIGJ5IGB3YiBnZW4tY29kZWApXG4gKiB3cml0ZXMgZ2VuZXJhdGVkIHR5cGVzIGludG8gdGhlIGluc3RhbGxlZCBAY2hha3JhLXVpL3JlYWN0IHBhY2thZ2UsIHdoaWNoIHdvdWxkIG90aGVyd2lzZVxuICogbXV0YXRlIHRoZSBtYWNoaW5lLXdpZGUgc3RvcmUgc2hhcmVkIGFjcm9zcyByZXBvc2l0b3JpZXMsIGFuZCBkcml6emxlLWtpdCByZXF1aXJlcyBkcml6emxlLW9ybVxuICogd2l0aG91dCBkZWNsYXJpbmcgaXQsIHdoaWNoIHRoZSBzdG9yZSByZWFscGF0aCBwbGFjZXMgYmV5b25kIGEgcGxhaW4gbm9kZV9tb2R1bGVzIHdhbGstdXAuXG4gKiBMaXN0aW5nIHRoZW0gaW4gYHRydXN0ZWREZXBlbmRlbmNpZXNgIG1ha2VzIEJ1biBtYXRlcmlhbGl6ZSBhIHBlci1wcm9qZWN0IGNvcHkgdW5kZXJcbiAqIGBub2RlX21vZHVsZXMvLmJ1bi9gLCB3aG9zZSBzaWJsaW5nIGBub2RlX21vZHVsZXMvLmJ1bi9ub2RlX21vZHVsZXMvYCBsaW5rcyBldmVyeSBpbnN0YWxsZWRcbiAqIHBhY2thZ2UgYW5kIHRoZXJlZm9yZSByZXNvbHZlcyB0aGUgdW5kZWNsYXJlZCByZXF1aXJlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQnVuIGNvbnN1bHRzIHRydXN0ZWREZXBlbmRlbmNpZXMgaW4gdGhlIHdvcmtzcGFjZSByb290J3MgcGFja2FnZS5qc29uIG9ubHksIHNvIHRoZSBsaXN0IGlzXG4gIC8vIG1hbmFnZWQgdGhlcmUgYW5kIG11c3QgY292ZXIgZGVwZW5kZW5jaWVzIGRlY2xhcmVkIGFueXdoZXJlIGluIHRoZSByZXBvc2l0b3J5LlxuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcbiAgY29uc3QgYnVuSnNvbk9iaiA9IGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbiAmIHsgdHJ1c3RlZERlcGVuZGVuY2llcz86IHN0cmluZ1tdIH07XG4gIC8vIEJ1biBpbnN0YWxscyBvcHRpb25hbCBhbmQgcGVlciBkZXBlbmRlbmNpZXMgYnkgZGVmYXVsdCwgc28gYWxsIGRlY2xhcmF0aW9uIHNlY3Rpb25zIGNvdW50LlxuICAvLyBFdmVyeSBkZWNsYXJlZCByYW5nZSBpcyBrZXB0IHBlciBwYWNrYWdlOiBhIHJvb3QgZGVjbGFyYXRpb24gbXVzdCBub3QgbWFzayBhIHdvcmtzcGFjZSBvbmVcbiAgLy8gKGUuZy4gcm9vdCBAY2hha3JhLXVpL2NsaSB2MiBhbG9uZ3NpZGUgYSB3b3Jrc3BhY2Ugb24gdjMpLlxuICBjb25zdCBkZWNsYXJlZERlcGVuZGVuY2llcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMgPSAocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGRlcGVuZGVuY3lEZWNsYXJhdGlvblNlY3Rpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5TmFtZSwgdmVyc2lvblJhbmdlXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlSnNvbltzZWN0aW9uXSA/PyB7fSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uUmFuZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgdmVyc2lvblJhbmdlcyA9IGRlY2xhcmVkRGVwZW5kZW5jaWVzLmdldChkZXBlbmRlbmN5TmFtZSk7XG4gICAgICAgICAgaWYgKHZlcnNpb25SYW5nZXMpIHtcbiAgICAgICAgICAgIHZlcnNpb25SYW5nZXMucHVzaCh2ZXJzaW9uUmFuZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWNsYXJlZERlcGVuZGVuY2llcy5zZXQoZGVwZW5kZW5jeU5hbWUsIFt2ZXJzaW9uUmFuZ2VdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGNvbmZpZykpIHtcbiAgICB0cnkge1xuICAgICAgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMoXG4gICAgICAgIEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvblxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSB1bnJlYWRhYmxlIHdvcmtzcGFjZSBwYWNrYWdlLmpzb25cbiAgICB9XG4gIH1cbiAgLy8gT25seSBAY2hha3JhLXVpL2NsaSB2MydzIGBjaGFrcmEgdHlwZWdlbmAgd3JpdGVzIGludG8gdGhlIGluc3RhbGxlZCBAY2hha3JhLXVpL3JlYWN0O1xuICAvLyB2MidzIGBjaGFrcmEtY2xpIHRva2Vuc2Agd3JpdGVzIGludG8gQGNoYWtyYS11aS9zdHlsZWQtc3lzdGVtIGluc3RlYWQsIHNvIHRydXN0aW5nXG4gIC8vIEBjaGFrcmEtdWkvcmVhY3QgdGhlcmUgd291bGQgZm9yY2UgYSB1c2VsZXNzIHByb2plY3QtbG9jYWwgY29weSB3aXRob3V0IGZpeGluZyBnZW4tY29kZS5cbiAgLy8gTWlycm9yIHdiIGdlbi1jb2RlJ3MgY2xhc3NpZmljYXRpb246IG9ubHkgYSByYW5nZSB3aG9zZSBsZWFkaW5nIG1ham9yIHBhcnNlcyB0byAyIHNlbGVjdHMgdGhlXG4gIC8vIHYyIGNvbW1hbmQsIHNvIGRpZ2l0bGVzcyBzcGVjcyBsaWtlIGBsYXRlc3RgIG9yIGNhdGFsb2cgcmVmZXJlbmNlcyBjb3VudCBhcyB2My5cbiAgY29uc3QgaGFzQ2hha3JhQ2xpVjMgPSAoZGVjbGFyZWREZXBlbmRlbmNpZXMuZ2V0KCdAY2hha3JhLXVpL2NsaScpID8/IFtdKS5zb21lKFxuICAgICh2ZXJzaW9uUmFuZ2UpID0+IC9cXGQrL3UuZXhlYyh2ZXJzaW9uUmFuZ2UpPy5bMF0gIT09ICcyJ1xuICApO1xuICBjb25zdCByZXF1aXJlZFdiZnlQYWNrYWdlcyA9IFtcbiAgICAuLi4oaGFzQ2hha3JhQ2xpVjMgJiYgZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAY2hha3JhLXVpL3JlYWN0JykgPyBbJ0BjaGFrcmEtdWkvcmVhY3QnXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdkcml6emxlLWtpdCcpID8gWydkcml6emxlLWtpdCddIDogW10pLFxuICAgIC8vIFRoZXNlIGdpdC1kZXBlbmRlbmN5IGJ1aWxkcyBpbXBvcnQgcGFja2FnZXMgdGhleSBkbyBub3QgZGVjbGFyZSAoZS5nLiB6b2QpLCB3aGljaCB0aGVcbiAgICAvLyBnbG9iYWwtc3RvcmUgbGF5b3V0IHBsYWNlcyBiZXlvbmQgdGhlaXIgd2Fsay11cDsgYSBwcm9qZWN0LWxvY2FsIGNvcHkgdW5kZXJcbiAgICAvLyBub2RlX21vZHVsZXMvLmJ1biByZXNvbHZlcyB0aGVtIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9wcm9tcHQtc3R1ZHkpLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpID8gWydAd2lsbGJvb3N0ZXIvanVkZ2UnXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgPyBbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXSA6IFtdKSxcbiAgICAvLyBibGl0eiBhbmQgQGJsaXR6anMvYXV0aCByZXF1aXJlIHJlYWN0IChhbmQgb3RoZXIgcGVlcnMpIHdpdGhvdXQgZGVjbGFyaW5nIHRoZW0sIHJlbHlpbmcgb25cbiAgICAvLyBob2lzdGluZywgd2hpY2ggdGhlIGdsb2JhbC1zdG9yZSBsYXlvdXQgcGxhY2VzIGJleW9uZCB0aGVpciB3YWxrLXVwIChvYnNlcnZlZCBpblxuICAgIC8vIFdpbGxCb29zdGVyL3N1cnZleS1zeXN0ZW06IGBuZXh0IGJ1aWxkYCBwYWdlLWRhdGEgY29sbGVjdGlvbiBkaWVzIHdpdGggXCJDYW5ub3QgZmluZCBtb2R1bGVcbiAgICAvLyAncmVhY3QnXCIgZnJvbSBAYmxpdHpqcy9hdXRoKS4gQGJsaXR6anMvcnBjIGlzIE5PVCBsaXN0ZWQgYmVjYXVzZSBpdCBwcm9wZXJseSBkZWNsYXJlcyBpdHNcbiAgICAvLyByZWFjdC9AdGFuc3RhY2sgcGVlcnMsIHNvIEJ1biBsaW5rcyB0aGVtIGludG8gaXRzIHN0b3JlIGVudHJ5LiBAYmxpdHpqcy9uZXh0IGlzXG4gICAgLy8gZGVsaWJlcmF0ZWx5IE5PVCBsaXN0ZWQgZWl0aGVyOiB0cnVzdGluZyBpdCB3b3VsZCBydW4gaXRzIHBvc3RpbnN0YWxsIChgYmxpdHogY29kZWdlbmApLFxuICAgIC8vIHdoaWNoIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW4gcGxhY2Ug4oCUIHJlcG9zaXRvcmllcyBwYXRjaCBvdXQgdGhhdCBwb3N0aW5zdGFsbFxuICAgIC8vIHdpdGggYGJ1biBwYXRjaGAgaW5zdGVhZCwgd2hpY2ggYWxzbyBrZWVwcyB0aGUgcGFja2FnZSBwcm9qZWN0LWxvY2FsLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ2JsaXR6JykgPyBbJ2JsaXR6J10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGJsaXR6anMvYXV0aCcpID8gWydAYmxpdHpqcy9hdXRoJ10gOiBbXSksXG4gICAgLy8gQnVuIGRvZXMgbm90IGxpbmsgQGhvb2tmb3JtL3Jlc29sdmVycycgT1BUSU9OQUwgdmFsaWRhdG9yIHBlZXJzIChlLmcuIHpvZCkgaW50byBpdHNcbiAgICAvLyBnbG9iYWwtc3RvcmUgZW50cnkgZXZlbiB3aGVuIHRoZSBwcm9qZWN0IGluc3RhbGxzIHRoZW0sIHNvIGl0cyBzZXJ2ZXItc2lkZVxuICAgIC8vIGBpbXBvcnQgJ3pvZCdgIGZhaWxzIGZyb20gdGhlIHN0b3JlIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtKS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAaG9va2Zvcm0vcmVzb2x2ZXJzJykgPyBbJ0Bob29rZm9ybS9yZXNvbHZlcnMnXSA6IFtdKSxcbiAgICAvLyBAem9vbS9ydG1zIGluc3RhbGxzIGl0cyBuYXRpdmUgcnRtcy5ub2RlIGJpbmRpbmcgaW4gYSBsaWZlY3ljbGUgc2NyaXB0LiBXaXRob3V0IGV4cGxpY2l0XG4gICAgLy8gdHJ1c3QsIEJ1biBza2lwcyB0aGF0IHNjcmlwdCBhbmQgdGhlIHBhY2thZ2UgZmFpbHMgYXMgc29vbiBhcyB0aGUgWm9vbSBib3QgaW1wb3J0cyBpdFxuICAgIC8vIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zbWFydHNlLXpvb20tYm90KS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAem9vbS9ydG1zJykgPyBbJ0B6b29tL3J0bXMnXSA6IFtdKSxcbiAgXTtcblxuICAvLyB3YmZ5IGZ1bGx5IG93bnMgdGhpcyBmaWVsZDogYSBwYWNrYWdlIHdob3NlIGxpZmVjeWNsZSBzY3JpcHRzIG11c3QgcnVuIGdldHMgYWRkZWQgdG8gd2JmeVxuICAvLyBpdHNlbGYgaW5zdGVhZCBvZiB0byBpbmRpdmlkdWFsIHJlcG9zaXRvcmllcywgc28gdW5tYW5hZ2VkIGVudHJpZXMgYXJlIGFsd2F5cyByZW1vdmVkIOKAlFxuICAvLyBpbmNsdWRpbmcgYW4gZXhwbGljaXRseSBlbXB0eSBkZW55LWFsbCBsaXN0LCB3aG9zZSBkZWxldGlvbiBkZWxpYmVyYXRlbHkgcmVzdG9yZXMgQnVuJ3NcbiAgLy8gZGVmYXVsdCBhbGxvdy1saXN0ICh0aGUgb3duZXJzaGlwIHBvbGljeSBjaG9zZW4gaW4gIzk3NSkuXG4gIGNvbnN0IGV4aXN0aW5nVHJ1c3RlZCA9IGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcztcbiAgaWYgKHJlcXVpcmVkV2JmeVBhY2thZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChleGlzdGluZ1RydXN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRGVsZXRpbmcgdGhlIGZpZWxkIHJlc3RvcmVzIEJ1bidzIGZ1bGwgZGVmYXVsdCBhbGxvdy1saXN0LCBzbyBvbmx5IGVudHJpZXMgb3V0c2lkZSB0aGF0XG4gICAgICAvLyBsaXN0IGFjdHVhbGx5IGxvc2UgdGhlaXIgbGlmZWN5Y2xlIHNjcmlwdHMuXG4gICAgICB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGV4aXN0aW5nVHJ1c3RlZCwgbmV3IFNldCgpKTtcbiAgICAgIGRlbGV0ZSBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXM7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEFuIGV4cGxpY2l0IHRydXN0ZWREZXBlbmRlbmNpZXMgbGlzdCBSRVBMQUNFUyBCdW4ncyBkZWZhdWx0IGFsbG93LWxpc3QgaW5zdGVhZCBvZiBleHRlbmRpbmdcbiAgLy8gaXQsIGFuZCBCdW4gcHJpbnRzIG5vIHdhcm5pbmcgZm9yIHRoZSBwb3N0aW5zdGFsbHMgaXQgY29uc2VxdWVudGx5IHNraXBzIChlLmcuIEByYWlsd2F5L2NsaVxuICAvLyBkb3dubG9hZHMgaXRzIGJpbmFyeSBpbiBwb3N0aW5zdGFsbCBhbmQgZXhpdHMgMSB3aXRob3V0IG9uZSkuIEluY2x1ZGUgdGhlIEVOVElSRSBkZWZhdWx0IGxpc3Q6XG4gIC8vIGVudHJpZXMgZm9yIHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBpbnN0YWxsZWQgYXJlIGluZXJ0LCBhbmQgdGhpcyBpcyB0aGUgb25seSByZXByZXNlbnRhdGlvblxuICAvLyB0aGF0IHN0YXlzIGNvcnJlY3QgZm9yIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIHRoZSBmaW5hbCBgYnVuIGluc3RhbGxgIHJlc29sdmVzIGFmdGVyIHRoaXNcbiAgLy8gcnVucyDigJQgYW4gaW50ZXJzZWN0aW9uIHdpdGggYSBtaXNzaW5nIG9yIHN0YWxlIGxvY2tmaWxlIHdvdWxkIHNpbGVudGx5IGRyb3AgdGhlbS5cbiAgY29uc3QgZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcpO1xuICAvLyBsZWZ0aG9vayBpcyBhcHBlbmRlZCBleHBsaWNpdGx5IHNvIHRoZSBkZWZhdWx0LWxpc3QgbG9va3VwIGZhaWxpbmcgY2Fubm90IGRyb3AgaXQ6IGl0IGlzXG4gIC8vIHJlcXVpcmVkIGluIGV2ZXJ5IG1hbmFnZWQgcmVwb3NpdG9yeS5cbiAgY29uc3QgbmV3VHJ1c3RlZFBhY2thZ2VzID0gbmV3IFNldChbXG4gICAgLi4ucmVxdWlyZWRXYmZ5UGFja2FnZXMsXG4gICAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuICAgIC4uLihkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA/PyBbXSksXG4gIF0pO1xuICB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGV4aXN0aW5nVHJ1c3RlZCA/PyBbXSwgbmV3VHJ1c3RlZFBhY2thZ2VzKTtcbiAgYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzID0gWy4uLm5ld1RydXN0ZWRQYWNrYWdlc10udG9Tb3J0ZWQoKTtcbn1cblxuLy8gVGhlIHBhY2thZ2VzIHdiZnkgaXRzZWxmIG1heSB3cml0ZSBpbnRvIHRydXN0ZWREZXBlbmRlbmNpZXM7IHRoZWlyIHJlbW92YWwgaXMgbWFuYWdlZCBjbGVhbnVwLFxuLy8gbmV2ZXIgYSBsb3NzIG9mIHVzZXIgcG9saWN5LlxuY29uc3Qgd2JmeU1hbmFnZWRUcnVzdGVkRGVwZW5kZW5jaWVzID0gbmV3IFNldChbXG4gICdAYmxpdHpqcy9hdXRoJyxcbiAgJ0BjaGFrcmEtdWkvcmVhY3QnLFxuICAnQGhvb2tmb3JtL3Jlc29sdmVycycsXG4gICdAd2lsbGJvb3N0ZXIvanVkZ2UnLFxuICAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsXG4gICdAem9vbS9ydG1zJyxcbiAgJ2JsaXR6JyxcbiAgJ2RyaXp6bGUta2l0JyxcbiAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuXSk7XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFJlbW92ZWRUcnVzdGVkRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGV4aXN0aW5nVHJ1c3RlZDogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGtlcHRQYWNrYWdlczogUmVhZG9ubHlTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIC8vIEEgZGVmYXVsdC10cnVzdGVkIGVudHJ5IG5ldmVyIGxvc2VzIGFueXRoaW5nIGJ5IHJlbW92YWw6IHdoaWxlIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCB0aGVcbiAgLy8ga2VwdCBsaXN0IChvciwgd2hlbiB0aGUgZmllbGQgaXMgZGVsZXRlZCwgQnVuJ3Mgb3duIGRlZmF1bHQgbGlzdCkgc3RpbGwgdHJ1c3RzIGl0LlxuICBjb25zdCBkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIGNvbnN0IHJlbW92ZWRQYWNrYWdlcyA9IGV4aXN0aW5nVHJ1c3RlZC5maWx0ZXIoXG4gICAgKHBrZykgPT4gIWtlcHRQYWNrYWdlcy5oYXMocGtnKSAmJiAhd2JmeU1hbmFnZWRUcnVzdGVkRGVwZW5kZW5jaWVzLmhhcyhwa2cpICYmICFkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcz8uaGFzKHBrZylcbiAgKTtcbiAgaWYgKHJlbW92ZWRQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFJlbW92aW5nIHVubWFuYWdlZCB0cnVzdGVkRGVwZW5kZW5jaWVzIGVudHJpZXM6ICR7cmVtb3ZlZFBhY2thZ2VzLmpvaW4oJywgJyl9LiB3YmZ5IG93bnMgdGhpcyBmaWVsZDsgaWYgdGhlaXIgbGlmZWN5Y2xlIHNjcmlwdHMgYXJlIHJlcXVpcmVkLCBhZGQgdGhlIHBhY2thZ2VzIHRvIHdiZnkgaXRzZWxmLmBcbiAgICApO1xuICB9XG59XG5cbmxldCBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llczogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbi8qKiBGZXRjaGVzIEJ1bidzIGRlZmF1bHQgdHJ1c3RlZC1kZXBlbmRlbmN5IGFsbG93LWxpc3QgZnJvbSB0aGUgQnVuIHZlcnNpb24gaW5zdGFsbGluZyB0aGUgcmVwb3NpdG9yeS4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcykge1xuICAgIC8vIEJ1biBjb2xvcml6ZXMgdGhlIGxpc3QgbWFya2VycyB3aGVuIEZPUkNFX0NPTE9SIGlzIHNldCAoZS5nLiBieSB0ZXN0IHJ1bm5lcnMgb24gQ0kpLCBzb1xuICAgIC8vIEFOU0kgZXNjYXBlIHNlcXVlbmNlcyBtdXN0IGJlIHN0cmlwcGVkIGJlZm9yZSBwYXJzaW5nLlxuICAgIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnYnVuJywgWydwbScsICdkZWZhdWx0LXRydXN0ZWQnXSwgY29uZmlnLmRpclBhdGgpLnJlcGxhY2VBbGwoXG4gICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBtYXRjaGluZyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgcmVxdWlyZXMgdGhlIEVTQyBjb250cm9sIGNoYXJhY3RlclxuICAgICAgL1xcdTAwMUJcXFtbMC05O10qbS9ndSxcbiAgICAgICcnXG4gICAgKTtcbiAgICBjb25zdCBwYXJzZWREZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFsuLi5zdGRvdXQubWF0Y2hBbGwoL15cXHMqLVxccysoXFxTKykkL2dtdSldLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdIGFzIHN0cmluZykpO1xuICAgIGlmIChwYXJzZWREZXBlbmRlbmNpZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgLy8gRG8gbm90IGNhY2hlIHRoZSBmYWlsdXJlOiBhIHRhcmdldC1sb2NhbCBwcm9ibGVtIChlLmcuIGFuIHVucmVhZGFibGUgcGFja2FnZS5qc29uKSBtdXN0XG4gICAgICAvLyBub3QgZGVueSB0aGUgZGVmYXVsdCBsaXN0IHRvIGV2ZXJ5IGxhdGVyIHRhcmdldCBvZiBhIG11bHRpLXBhdGggcnVuLlxuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcmVhZCB0aGUgZGVmYXVsdCBhbGxvdy1saXN0IHZpYSBgYnVuIHBtIGRlZmF1bHQtdHJ1c3RlZGAuJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IHBhcnNlZERlcGVuZGVuY2llcztcbiAgfVxuICByZXR1cm4gY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgLy8gRXhwbGljaXQgcm9vdCBwdWJsaXNoaW5nIGludGVudCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgd2JmeSdzIHByaXZhdGUgbW9ub3JlcG8tcm9vdCBkZWZhdWx0LlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmIChjb25maWcucmVsZWFzZS5ucG1QdWJsaXNoZXNSb290IHx8IGpzb25PYmoucHVibGlzaENvbmZpZykpIHtcbiAgICBkZWxldGUganNvbk9iai5wcml2YXRlO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAhY29uZmlnLnJlbGVhc2UubnBtICYmICFqc29uT2JqLnB1Ymxpc2hDb25maWcpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHJlZ2lzdHJ5LCBucG0gcmVzb2x2ZXMgdGhlIHB1Ymxpc2ggdGFyZ2V0IGZyb20gdGhlIHdvcmtzcGFjZSAubnBtcmMsXG4gICAgLy8gd2hvc2UgZGVmYXVsdCByZWdpc3RyeSBvbiBDSSBtYXkgYmUgdGhlIFRha3VtaSBHdWFyZCBpbnN0YWxsIHByb3h5IOKAlCB3aGljaCByZWplY3RzXG4gICAgLy8gYG5wbSBwdWJsaXNoYCB3aXRoIDQwNSAoc2hhcmVkIzEwNzIpLiBgPz89YCBrZWVwcyBhIGRlbGliZXJhdGVseSBkaWZmZXJlbnQgcmVnaXN0cnkuXG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLnJlZ2lzdHJ5ID8/PSAnaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJztcbiAgfVxuICBjb25zdCBvd25lciA9IGNvbmZpZy5yZXBvQXV0aG9yO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBhd2FpdCBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCBqc29uT2JqKTtcbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ2J1biBydW4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlcikge1xuICAgICAgY29uc3Qgc2NyaXB0UnVubmVyID0gJ2J1biBydW4nO1xuICAgICAganNvbk9iai5zY3JpcHRzWydjb21tb24vY2ktc2V0dXAnXSA9IGAke3NjcmlwdFJ1bm5lcn0gc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScgPyAndXYnIDogJ3BvZXRyeSd9YF07XG4gICAgICBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YF0gPSBnZXRQeXRob25TZXR1cENvbW1hbmQocHl0aG9uUGFja2FnZU1hbmFnZXIpO1xuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBjb25zdCBweXRob25SdW5uZXIgPSBgJHtweXRob25QYWNrYWdlTWFuYWdlcn0gcnVuYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgJHtweXRob25SdW5uZXJ9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiAke3B5dGhvblJ1bm5lcn0gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBgJHtzY3JpcHRSdW5uZXJ9IGxpbnRgO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0KTtcbiAgICAgICAgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeSB8fCBqc29uT2JqLnJlcG9zaXRvcnkpIHtcbiAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oY29uZmlnLnJlcG9zaXRvcnkgPz8ganNvbk9iai5yZXBvc2l0b3J5LCBqc29uT2JqLnJlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3QgZ2VuQ29kZVNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXTtcbiAgaWYgKHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZykpIHtcbiAgICAvLyBQcmVzZXJ2ZSBwcm9qZWN0LXNwZWNpZmljIHN0ZXBzIGEgcmVwbyBhcHBlbmRlZCB0byB0aGUgbWFuYWdlZCBgYnVuIHdiIGdlbi1jb2RlYCAoZS5nLiBidWlsZGluZyBleHRyYSBkZXBsb3lcbiAgICAvLyBhc3NldHMpIGluc3RlYWQgb2YgZGlzY2FyZGluZyB0aGVtOyBvbmx5IHRoZSBtYW5hZ2VkIGdlbi1jb2RlIHNlZ21lbnQgaXMgd2JmeSdzIHRvXG4gICAgLy8gcmVnZW5lcmF0ZS4gQW4gdW5wYXJzZWFibGUgc2NyaXB0IGlzIGxlZnQgYWxvbmUgcmF0aGVyIHRoYW4gcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbiAgICBjb25zdCBzZWdtZW50cyA9IGdlbkNvZGVTY3JpcHQgPT09IHVuZGVmaW5lZCA/IFtdIDogc3BsaXRTY3JpcHRTZWdtZW50cyhnZW5Db2RlU2NyaXB0KTtcbiAgICBjb25zdCBjdXN0b21TZWdtZW50cyA9IHNlZ21lbnRzPy5maWx0ZXIoXG4gICAgICAoc2VnbWVudCkgPT4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnQsIGpzb25PYmouc2NyaXB0cywgdHJ1ZSkgPT09ICdjdXN0b20nXG4gICAgKTtcbiAgICBpZiAoY3VzdG9tU2VnbWVudHMpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IFsnYnVuIHdiIGdlbi1jb2RlJywgLi4uY3VzdG9tU2VnbWVudHNdLmpvaW4oJyAmJiAnKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlUG9zdGluc3RhbGxTY3JpcHQoanNvbk9iai5zY3JpcHRzLCBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcuY2hha3JhIHx8IGNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8IGNvbmZpZy5kZXBlbmRpbmcucHJpc21hO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChmb3JtYXRTY3JpcHQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBmb3JtYXRTY3JpcHQgPyBgJHtmb3JtYXRTY3JpcHR9ICYmIGJ1biBydW4gZm9ybWF0LWNvZGVgIDogJ2J1biBydW4gZm9ybWF0LWNvZGUnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybjtcblxuICBjb25zdCBjb25maWdNanNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLm1qcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnTWpzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLnR5cGUgPSAnbW9kdWxlJztcblxuICBjb25zdCBjb25maWdEdHNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQudHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0R0c1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai5maWxlcyA9IFsuLi5uZXcgU2V0KFsuLi4oanNvbk9iai5maWxlcyA/PyBbXSksICdjb25maWcuZC5tdHMnXSldO1xuICAvLyBOb2RlTmV4dCByZXNvbHZlcyBhIHJlbGF0aXZlIGAuL2NvbmZpZy5tanNgIGltcG9ydCB0byBgY29uZmlnLmQubXRzYCwgbm90XG4gIC8vIHRoZSBwYWNrYWdlLWxldmVsIGB0eXBlc2AgZmllbGQuIEtlZXAgdGhlIHB1Ymxpc2hlZCBjb25maWcgaW1wb3J0YWJsZSBmcm9tXG4gIC8vIHBhY2thZ2UtbG9jYWwgVHlwZVNjcmlwdCBsaW50ZXIgc2V0dGluZ3MuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLm10cycpLCBjb25maWdEbXRzQ29udGVudCkpO1xufVxuXG5jb25zdCBjb25maWdEbXRzQ29udGVudCA9IGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9jb25maWcuanMnO1xuYDtcblxuZnVuY3Rpb24gYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgY29uc3QgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMsIGpzb25PYmopXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBdKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsIGpzb25PYmopXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xufVxuXG5mdW5jdGlvbiBnZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBqc29uT2JqOiBQYWNrYWdlSnNvblxuKTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMpLmZpbHRlcihcbiAgICAoZGVwZW5kZW5jeSkgPT5cbiAgICAgIG1hbmFnZWREZXBlbmRlbmN5TmFtZXMuaGFzKGRlcGVuZGVuY3kpICYmXG4gICAgICAvLyBBIHB1YmxpYyBwYWNrYWdlJ3MgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBtdXN0IG5ldmVyIGJlIHJlLW1hbmFnZWQgdmlhIGEgcmVnaXN0cnkgaW5zdGFsbFxuICAgICAgLy8gKHByaXZhdGUgb25lcyBhcmUgbm9ybWFsaXplZCB0byBgd29ya3NwYWNlOipgIGxhdGVyKS4gVGhpcyBhbHNvIGNvdmVycyBydW5uaW5nIHdiZnkgb24gYVxuICAgICAgLy8gbW9ub3JlcG8gU1VCRElSRUNUT1JZLCB3aGVyZSB0aGUgcGFyZW50J3Mgd29ya3NwYWNlcyBhcmUgaW52aXNpYmxlIGFuZCB0aGUgd29ya3NwYWNlLW1hcFxuICAgICAgLy8gZ3VhcmQgaW4gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMgY2Fubm90IHByb3RlY3QgdGhlIHNwZWNpZmllci5cbiAgICAgIChqc29uT2JqLnByaXZhdGUgfHwgIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBqc29uT2JqW2tleV07XG4gICAgaWYgKHNlY3Rpb24gJiYgT2JqZWN0LmtleXMoc2VjdGlvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmosIGtleSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiB2b2lkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jaWVzLCBmYWxzZSk7XG5cbiAgICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCByb290Q29uZmlnLCBkZXZEZXBlbmRlbmNpZXMsIHRydWUpO1xuICB9XG5cbiAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgJiYgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMpXTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMoJ3V2JywgWydhZGQnLCAnLS1kZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnknIHwgJ3V2JyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHJldHVybiAndXYnO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykgcmV0dXJuICdwb2V0cnknO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25TZXR1cENvbW1hbmQocGFja2FnZU1hbmFnZXI6ICdwb2V0cnknIHwgJ3V2Jyk6IHN0cmluZyB7XG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3V2JykgcmV0dXJuICd1diBzeW5jIC0tZnJvemVuJztcbiAgLy8gYG1pc2Ugd2hpY2ggcHl0aG9uYCB5aWVsZHMgdGhlIHNpbmdsZSBhY3RpdmUgaW50ZXJwcmV0ZXIgcGF0aDsgYG1pc2UgY3VycmVudCBweXRob25gIGNhblxuICAvLyBwcmludCBtdWx0aXBsZSBzcGFjZS1zZXBhcmF0ZWQgdmVyc2lvbnMgKG1pc2Ugc3VwcG9ydHMgbXVsdGktdmVyc2lvbiBwaW5zKSwgd2hpY2ggd291bGQgcGFzc1xuICAvLyBleHRyYSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0byBgcG9ldHJ5IGVudiB1c2VgLiBXaGVuIG1pc2UgaXMgbWlzc2luZyBvciBweXRob24gaXNcbiAgLy8gdW5jb25maWd1cmVkLCBza2lwIGBwb2V0cnkgZW52IHVzZWAgYW5kIGZhbGwgYmFjayB0byBwb2V0cnkncyBkZWZhdWx0IGludGVycHJldGVyIGluc3RlYWQgb2ZcbiAgLy8gYWJvcnRpbmcgdGhlIGNoYWluLlxuICAvLyBUaGUgYHx8IHRydWVgIGNvdmVycyBvbmx5IHRoZSBtaXNlIHJlc29sdXRpb246IGEgbWlzc2luZy91bmNvbmZpZ3VyZWQgbWlzZSBmYWxscyBiYWNrIHRvXG4gIC8vIHBvZXRyeSdzIGRlZmF1bHQgaW50ZXJwcmV0ZXIsIHdoaWxlIGEgZmFpbGluZyBgcG9ldHJ5IGVudiB1c2VgIHN0aWxsIGFib3J0cyB0aGUgY2hhaW4uXG4gIHJldHVybiAncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUgJiYgeyBweXRob25fcGF0aD1cIiQobWlzZSB3aGljaCBweXRob24gMj4vZGV2L251bGwpXCIgfHwgdHJ1ZTsgfSAmJiB7IFsgLXogXCIkcHl0aG9uX3BhdGhcIiBdIHx8IHBvZXRyeSBlbnYgdXNlIFwiJHB5dGhvbl9wYXRoXCI7IH0gJiYgcG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwICYmIHBvZXRyeSBpbnN0YWxsJztcbn1cblxuZnVuY3Rpb24gaW5zdGFsbE5wbURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBkZXY6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXJzID0gW1xuICAgIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT4gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KSkpLFxuICBdO1xuICBzcGF3blN5bmMoJ2J1bicsIFsnYWRkJywgLi4uKGRldiA/IFsnLUQnXSA6IFtdKSwgJy0tZXhhY3QnLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llc1RvSW5zdGFsbDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG5ldyBTZXQoZGVwZW5kZW5jaWVzKSkge1xuICAgIC8vIEEgcHJpdmF0ZSBwYWNrYWdlIHdob3NlIG1vbm9yZXBvIGNvbnRhaW5zIHRoaXMgZGVwZW5kZW5jeSBhcyBhIHdvcmtzcGFjZSBtdXN0IHJlZmVyZW5jZSBpdFxuICAgIC8vIHZpYSB0aGUgd29ya3NwYWNlIHByb3RvY29sOiBwaW5uaW5nIGEgcmVnaXN0cnkgdmVyc2lvbiBtYWtlcyBCdW4gc2hhZG93IHRoZSBzYW1lLW5hbWVcbiAgICAvLyB3b3Jrc3BhY2UgYW5kIHNraXAgaW5zdGFsbGluZyB0aGUgd29ya3NwYWNlJ3Mgb3duIGRlcGVuZGVuY2llcy4gKFB1Ymxpc2hlZCBwYWNrYWdlcyBpbnN0ZWFkXG4gICAgLy8gcGluIGEgY29uY3JldGUgdmVyc2lvbiBiZWNhdXNlIGBucG0gcHVibGlzaGAgcmVqZWN0cyBgd29ya3NwYWNlOipgIHNwZWNpZmllcnMg4oCUIGJ1dCBhblxuICAgIC8vIEVYSVNUSU5HIGB3b3Jrc3BhY2U6YCBkZWNsYXJhdGlvbiBpcyBhbHdheXMga2VwdDogb3ZlcndyaXRpbmcgaXQgd2l0aCBhIHJlZ2lzdHJ5IHJlbGVhc2VcbiAgICAvLyB3b3VsZCBzaWxlbnRseSBicmVhayB0aGUgbG9jYWwgd29ya3NwYWNlIGxpbmsuKVxuXG4gICAgLy8gQSBkZWNsYXJlZCBgd29ya3NwYWNlOmAgc3BlY2lmaWVyIGFsd2F5cyB3aW5zLCB3aGV0aGVyIG9yIG5vdCB0aGUgd29ya3NwYWNlIG1hcCBzZWVzIHRoZVxuICAgIC8vIHBhY2thZ2U6IHJ1bm5pbmcgd2JmeSBvbiBhIG1vbm9yZXBvIFNVQkRJUkVDVE9SWSBoaWRlcyB0aGUgcGFyZW50J3Mgd29ya3NwYWNlcywgc28gdGhlIG1hcFxuICAgIC8vIGFsb25lIGNhbm5vdCBiZSB0cnVzdGVkIHRvIGRldGVjdCBhIGxvY2FsIHdvcmtzcGFjZSBsaW5rLlxuICAgIGlmIChwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XT8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICBpZiAoanNvbk9iai5wcml2YXRlKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gJ3dvcmtzcGFjZToqJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoanNvbk9iai5wcml2YXRlICYmIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLmhhcyhkZXBlbmRlbmN5KSkge1xuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpZXIgPSBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghZXhpc3RpbmdTcGVjaWZpZXIgfHwgZXhpc3RpbmdTcGVjaWZpZXIuc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gJ3dvcmtzcGFjZToqJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBBbiBleGlzdGluZyBDT05DUkVURSBwaW4gb24gYSB3b3Jrc3BhY2UgcGFja2FnZSBpcyBhIGRlbGliZXJhdGUgY2hvaWNlIGFuZCBtdXN0IG5vdCBiZVxuICAgICAgLy8gY29udmVydGVkIHRvIHRoZSB3b3Jrc3BhY2UgcHJvdG9jb2wuIE5vdGUgdGhlIHRyYWRlLW9mZiBlaXRoZXIgd2F5OiBucG0gKHdoaWNoXG4gICAgICAvLyBzZW1hbnRpYy1yZWxlYXNlJ3MgbnBtIHBsdWdpbiBzaGVsbHMgb3V0IHRvKSBjYW5ub3QgcGFyc2UgYHdvcmtzcGFjZTpgIHNwZWNpZmllcnMsIHdoaWxlXG4gICAgICAvLyBhIHJlZ2lzdHJ5IHBpbiBtYWtlcyBhIGNvbGQgYnVuIGluc3RhbGwgc2hhZG93IHRoZSB3b3Jrc3BhY2UgYW5kIHNraXAgaXRzIGRlcGVuZGVuY2llcyDigJRcbiAgICAgIC8vIFdpbGxCb29zdGVyL3NoYXJlZCBrZWVwcyBgd29ya3NwYWNlOipgIGFuZCBzdHJpcHMgdGhlIHByb3RvY29sIG9uIHRoZSBDSSBjaGVja291dCByaWdodFxuICAgICAgLy8gYmVmb3JlIHJlbGVhc2luZyAoc2NyaXB0cy9zdHJpcFdvcmtzcGFjZVByb3RvY29sLm1qcykuIEZhbGwgdGhyb3VnaCBzbyBhIGNvbmNyZXRlIHBpblxuICAgICAgLy8ga2VlcHMgYmVpbmcgYnVtcGVkIGxpa2UgYW55IG1hbmFnZWQgZGVwZW5kZW5jeS5cbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ID0gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgICAgIGNvbmZpZyxcbiAgICAgIHJvb3RDb25maWcsXG4gICAgICBkZXBlbmRlbmN5LFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV1cbiAgICApO1xuICAgIGlmIChzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kpIHtcbiAgICAgIGNvbnN0IG1hbmFnZWRWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoc2hvdWxkRG93bmdyYWRlQWdlR2F0ZWRNYW5hZ2VkRGVwZW5kZW5jeShkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSwgbWFuYWdlZFZlcnNpb24pKSB7XG4gICAgICAgIC8vIGBidW4gYWRkIGRlcGVuZGVuY3lgIHByZXNlcnZlcyBhbiBleGlzdGluZyBleGFjdCBwaW4sIHNvIHdyaXRlIHRoZSBhZ2UtY2xlYXJlZCB2ZXJzaW9uXG4gICAgICAgIC8vIGRpcmVjdGx5LiBUaGUgZmluYWwgcmVwb3NpdG9yeS13aWRlIGluc3RhbGwgcmVmcmVzaGVzIHRoZSBsb2NrZmlsZSBhZnRlciBldmVyeSBwYWNrYWdlXG4gICAgICAgIC8vIG1hbmlmZXN0IGhhcyBjb252ZXJnZWQgb24gdGhlIGdlbmVyYXRlZCByZWxlYXNlLWFnZSBwb2xpY3kuXG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gbWFuYWdlZFZlcnNpb247XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZGVwZW5kZW5jaWVzVG9JbnN0YWxsLnB1c2goZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoIXNraXBBZGRpbmdEZXBzKSBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gJiZcbiAgICAgICFzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgJiZcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICE9PSAnKidcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgaWYgKGxhdGVzdFZlcnNpb24gPT09ICcqJyAmJiBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgY29udGludWU7XG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBsYXRlc3RWZXJzaW9uO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmNpZXNUb0luc3RhbGw7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gIGlmICghcmVsYXRpdmVGaWxlUGF0aCkgcmV0dXJuO1xuXG4gIC8vIFJldXNlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIG93biBmb3JtYXR0ZXIgYWZ0ZXIgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24gc29cbiAgLy8gcGFja2FnZS5qc29uIG1hdGNoZXMgd2hhdGV2ZXIgaXRzIGN1cnJlbnQgc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBleHBlY3RzLlxuICAvLyBUaGlzIGF2b2lkcyBmb2xsb3ctdXAgYXV0b2ZpeCBjb21taXRzIGNhdXNlZCBvbmx5IGJ5IGZvcm1hdHRlciB2ZXJzaW9uIGRyaWZ0XG4gIC8vIGJldHdlZW4gd2JmeSBhbmQgdGhlIHByb2plY3QgYmVpbmcgdXBkYXRlZC5cbiAgc3Bhd25TeW5jKCdidW54JywgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICB1c2VkRGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHVzZWREZXBlbmRlbmN5U2V0ID0gbmV3IFNldCh1c2VkRGVwZW5kZW5jaWVzKTtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBhd2FpdCBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgIGlmICh1c2VkRGVwZW5kZW5jeVNldC5oYXMoZGVwZW5kZW5jeSkgfHwgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgYmFzZS1jb25maWcgcGFja2FnZXMuIFJlbW92ZSBzdGFsZSB2YXJpYW50cyB3aGVuIHJlcG9cbiAgICAvLyBjYXBhYmlsaXRpZXMgY2hhbmdlLCBzdWNoIGFzIE5leHQuanMgdGFraW5nIG93bmVyc2hpcCBvZiB0c2NvbmZpZy5qc29uLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdHNjb25maWcqLmpzb24nLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgIGNvbnN0IGFic29sdXRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgICAvLyBUeXBlU2NyaXB0IDcncyBuYXRpdmUgY29tcGlsZXIgZHJvcHBlZCB0aGUgaW4tcHJvY2VzcyBgcGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbmBcbiAgICAvLyBoZWxwZXIsIHNvIHBhcnNlIHRoZSB0c2NvbmZpZyBpbnRvIGFuIEFTVCBhbmQgcmVhZCBpdHMgdG9wLWxldmVsIGBleHRlbmRzYCBkaXJlY3RseS5cbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBwYXJzZVNvdXJjZUZpbGUoYWJzb2x1dGVGaWxlUGF0aCk7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgUHJlc2VydmUgbWFuYWdlZCBAdHNjb25maWcgZGVwZW5kZW5jaWVzIGJlY2F1c2UgJHthYnNvbHV0ZUZpbGVQYXRofSBjb3VsZCBub3QgYmUgcGFyc2VkLmApO1xuICAgICAgcmV0dXJuIG5ldyBTZXQobWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2UpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgICAgICBpZiAodmFsdWUgPT09IGRlcGVuZGVuY3kgfHwgdmFsdWUuc3RhcnRzV2l0aChgJHtkZXBlbmRlbmN5fS9gKSkge1xuICAgICAgICAgIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcztcbn1cblxuLyoqIFJlYWRzIHRoZSB0b3AtbGV2ZWwgYGV4dGVuZHNgIGVudHJpZXMgKGEgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MpIGZyb20gYSBwYXJzZWQgdHNjb25maWcuICovXG5mdW5jdGlvbiByZWFkVHNjb25maWdFeHRlbmRzKHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHZhbHVlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBnZXRUc2NvbmZpZ1Jvb3RQcm9wZXJ0aWVzKHNvdXJjZSkpIHtcbiAgICBpZiAoYXN0LmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSAmJiBhc3QuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpICYmIHByb3BlcnR5Lm5hbWUudGV4dCA9PT0gJ2V4dGVuZHMnKSB7XG4gICAgICBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhwcm9wZXJ0eS5pbml0aWFsaXplciwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZnVuY3Rpb24gZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogcmVhZG9ubHkgYXN0Lk9iamVjdExpdGVyYWxFbGVtZW50TGlrZVtdIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc291cmNlLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoYXN0LmlzRXhwcmVzc2lvblN0YXRlbWVudChzdGF0ZW1lbnQpICYmIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIHN0YXRlbWVudC5leHByZXNzaW9uLnByb3BlcnRpZXM7XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMobm9kZTogYXN0LkV4cHJlc3Npb24sIHZhbHVlczogc3RyaW5nW10pOiB2b2lkIHtcbiAgaWYgKGFzdC5pc1N0cmluZ0xpdGVyYWwobm9kZSkpIHtcbiAgICB2YWx1ZXMucHVzaChub2RlLnRleHQpO1xuICB9IGVsc2UgaWYgKGFzdC5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24obm9kZSkpIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygbm9kZS5lbGVtZW50cykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMoZWxlbWVudCwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PltdIHtcbiAgcmV0dXJuIGRlcGVuZGVuY3lTZWN0aW9uS2V5c1xuICAgIC5tYXAoKGtleSkgPT4ganNvbk9ialtrZXldKVxuICAgIC5maWx0ZXIoKHNlY3Rpb24pOiBzZWN0aW9uIGlzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPT4gISFzZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2FjaGVkVmVyc2lvbiA9IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuZ2V0KGRlcGVuZGVuY3kpO1xuICBpZiAoY2FjaGVkVmVyc2lvbikgcmV0dXJuIGNhY2hlZFZlcnNpb247XG5cbiAgY29uc3QgdmVyc2lvbiA9IGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5zZXQoZGVwZW5kZW5jeSwgdmVyc2lvbik7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3kpKSB7XG4gICAgcmV0dXJuIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgfVxuXG4gIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRpbWVzID0gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3kpO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBpZiAobGF0ZXN0VmVyc2lvbiAhPT0gJyonICYmIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZSh0aW1lc1tsYXRlc3RWZXJzaW9uXSkpIHtcbiAgICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuXG4gIHJldHVybiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyh0aW1lcylbMF0gPz8gJyonO1xufVxuXG4vKiogRXZlcnkgc3RhYmxlIHJlbGVhc2UgaW4gYHRpbWVzYCB0aGF0IGFscmVhZHkgY2xlYXJlZCB0aGUgYWdlIGdhdGUsIG5ld2VzdCBmaXJzdC4gKi9cbmZ1bmN0aW9uIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKHRpbWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nW10ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXModGltZXMpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiBzZW12ZXIudmFsaWQodmVyc2lvbikpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiAoc2VtdmVyLnByZXJlbGVhc2UodmVyc2lvbik/Lmxlbmd0aCA/PyAwKSA9PT0gMClcbiAgICAuZmlsdGVyKChbLCBwdWJsaXNoZWRBdF0pID0+IE51bWJlci5pc0Zpbml0ZShEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSkpXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBub3cgLSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSA+PSBwYWNrYWdlQWdlR2F0ZU1zKVxuICAgIC50b1NvcnRlZCgoW3ZlcnNpb25BXSwgW3ZlcnNpb25CXSkgPT4gc2VtdmVyLnJjb21wYXJlKHZlcnNpb25BLCB2ZXJzaW9uQikpXG4gICAgLm1hcCgoW3ZlcnNpb25dKSA9PiB2ZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNQdWJsaXNoZWRCZWZvcmVBZ2VHYXRlKHB1Ymxpc2hlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFwdWJsaXNoZWRBdCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwdWJsaXNoZWRUaW1lID0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocHVibGlzaGVkVGltZSkgJiYgRGF0ZS5ub3coKSAtIHB1Ymxpc2hlZFRpbWUgPj0gcGFja2FnZUFnZUdhdGVNcztcbn1cblxuZnVuY3Rpb24gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3k6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IGRlcGVuZGVuY3kucmVwbGFjZSgvQFteQC9dKyQvdSwgJycpO1xuICBjb25zdCBjYWNoZWRUaW1lcyA9IG5wbVBhY2thZ2VUaW1lc0NhY2hlLmdldChwYWNrYWdlTmFtZSk7XG4gIGlmIChjYWNoZWRUaW1lcykgcmV0dXJuIGNhY2hlZFRpbWVzO1xuXG4gIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAnbnBtJyxcbiAgICBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3RpbWUnLCAnLS1qc29uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLFxuICAgIHByb2Nlc3MuY3dkKClcbiAgKTtcbiAgaWYgKCFzdGRvdXQpIHJldHVybiB7fTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3Rkb3V0KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgW1JlY29yZDxzdHJpbmcsIHN0cmluZz5dO1xuICAgIGNvbnN0IHRpbWVzID0gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkWzBdIDogcGFyc2VkO1xuICAgIGlmICghdGltZXMpIHJldHVybiB7fTtcbiAgICBucG1QYWNrYWdlVGltZXNDYWNoZS5zZXQocGFja2FnZU5hbWUsIHRpbWVzKTtcbiAgICByZXR1cm4gdGltZXM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3k6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBLZWVwIG1hbmFnZWQgZmlyc3QtcGFydHkgcGFja2FnZXMgYWxpZ25lZCB3aXRoIEJ1bidzIGV4cGxpY2l0IGV4ZW1wdGlvbnMuIHdiZnkncyBnZW5lcmF0ZWRcbiAgLy8gY29uZmlndXJhdGlvbiBjYW4gcmVseSBvbiB0aGUgY3VycmVudCB3YiBjb250cmFjdCwgc28gaW5kZXBlbmRlbnRseSBzb2FraW5nIG9yIGRvd25ncmFkaW5nIHdiXG4gIC8vIHdvdWxkIHBhaXIgbmV3IGdlbmVyYXRlZCBmaWxlcyB3aXRoIGFuIGluY29tcGF0aWJsZSBvbGQgQ0xJLiBUaG9zZSBwYWNrYWdlcyBhcmUgcmVsZWFzZWQgYW5kXG4gIC8vIGZpeGVkIGF0IHRoZWlyIHNvdXJjZSBpbnN0ZWFkOyBvbmx5IHBhY2thZ2VzIEJ1biBpdHNlbGYgZ2F0ZXMgbWF5IGJlIHNlbGVjdGVkIGZyb20gb2xkZXIgdGFncy5cbiAgcmV0dXJuICFidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLnNvbWUoKHBhdHRlcm4pID0+IGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm4sIGRlcGVuZGVuY3kpKTtcbn1cblxuZnVuY3Rpb24gZG9lc1BhY2thZ2VQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHBhdHRlcm4gPT09IGRlcGVuZGVuY3kpIHJldHVybiB0cnVlO1xuICBpZiAoIXBhdHRlcm4uaW5jbHVkZXMoJyonKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGVzY2FwZWRQYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlQWxsKC9bLis/XiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYCkucmVwbGFjZUFsbCgnKicsICcuKicpO1xuICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlZFBhdHRlcm59JGAsICd1JykudGVzdChkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE5vIGNhY2hlIGhlcmU6IHRoZSBvbmx5IGNhbGxlciBjaGFpbiBnb2VzIHRocm91Z2ggZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24sIHdoaWNoIGFscmVhZHlcbiAgLy8gbWVtb2l6ZXMgcGVyIGRlcGVuZGVuY3ksIHNvIHRoaXMgY2FuIHJ1biBhdCBtb3N0IG9uY2UgcGVyIGRlcGVuZGVuY3kuXG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIGRlcGVuZGVuY3ksICd2ZXJzaW9uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLCBwcm9jZXNzLmN3ZCgpKSB8fCAnKic7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gVHlwZVNjcmlwdCBpcyB2ZXJzaW9uLWNhcHBlZCBpbiBCbGl0eiByZXBvc2l0b3JpZXMsIHNvIGl0cyBpbnN0YWxsIHNwZWNpZmllciBtdXN0IGNhcnJ5IHRoZVxuICAvLyBtYW5hZ2VkIHZlcnNpb24g4oCUIGEgYmFyZSBgYnVuIGFkZGAgd291bGQgaW5zdGFsbCB0aGUgaW5jb21wYXRpYmxlIGxhdGVzdC5cbiAgaWYgKGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZywgcm9vdENvbmZpZykpIHtcbiAgICByZXR1cm4gYCR7ZGVwZW5kZW5jeX1AJHtnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KX1gO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmN5O1xufVxuXG4vKiogV2hldGhlciB0aGUgcmVwb3NpdG9yeSBjb250YWlucyBhIEJsaXR6IGFwcCAodGhlIGN1cnJlbnQgcGFja2FnZSBvciB0aGUgd29ya3NwYWNlIHJvb3QpLiAqL1xuZnVuY3Rpb24gaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IHJvb3RDb25maWcuZGVwZW5kaW5nLmJsaXR6O1xufVxuXG5jb25zdCB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbi8qKiBNYXAgZnJvbSBlYWNoIHdvcmtzcGFjZSBwYWNrYWdlJ3MgbmFtZSB0byBpdHMgZGlyZWN0b3J5IChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCkuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlLmdldChyb290Q29uZmlnLmRpclBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHdvcmtzcGFjZURpcnNCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RDb25maWcpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZVBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCksICd1dGY4JylcbiAgICAgICkgYXMgUGFja2FnZUpzb247XG4gICAgICBpZiAod29ya3NwYWNlUGFja2FnZUpzb24ubmFtZSkge1xuICAgICAgICB3b3Jrc3BhY2VEaXJzQnlOYW1lLnNldCh3b3Jrc3BhY2VQYWNrYWdlSnNvbi5uYW1lLCBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmUgdW5wYXJzYWJsZSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uXG4gICAgfVxuICB9XG4gIHdvcmtzcGFjZVBhY2thZ2VEaXJzQ2FjaGUuc2V0KHJvb3RDb25maWcuZGlyUGF0aCwgd29ya3NwYWNlRGlyc0J5TmFtZSk7XG4gIHJldHVybiB3b3Jrc3BhY2VEaXJzQnlOYW1lO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHJldHVybiB0cnVlO1xuICBpZiAoY3VycmVudFZlcnNpb24gPT09ICcqJykgcmV0dXJuIHRydWU7XG4gIGlmIChpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzLmhhcyhkZXBlbmRlbmN5KSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBtYW5hZ2VkVmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpO1xuICBjb25zdCBjdXJyZW50VmFsaWRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgLy8gQSBUeXBlU2NyaXB0IDcgcGluIGluIGEgQmxpdHogcmVwb3NpdG9yeSBpcyBsaWtld2lzZSBpbmNvbXBhdGlibGUgKGBuZXh0IGJ1aWxkYCBmYWlscyBvblxuICAvLyB0aGUgTmV4dC5qcyAxNSB0aGF0IEJsaXR6IHBpbnMg4oCUIHNlZSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24pLCBzbyByZXdyaXRlIGl0IHRvIHRoZVxuICAvLyBjYXBwZWQgcmVsZWFzZSBpbnN0ZWFkIG9mIHByZXNlcnZpbmcgaXQgdmlhIHRoZSBuby1kb3duZ3JhZGUgcnVsZSBiZWxvdy4gVGhlIHBpbiBtYXkgYmUgYVxuICAvLyBSQU5HRSAoZS5nLiBgXjcuMC4wYCksIHdoaWNoIHNlbXZlci52YWxpZCByZWplY3RzIOKAlCBqdWRnZSB0aGUgbWFqb3IgZnJvbSB0aGUgcmFuZ2UgbWluaW11bS5cbiAgY29uc3QgY3VycmVudFR5cGVzY3JpcHRWZXJzaW9uID1cbiAgICBjdXJyZW50VmFsaWRWZXJzaW9uID8/IChzZW12ZXIudmFsaWRSYW5nZShjdXJyZW50VmVyc2lvbikgPyBzZW12ZXIubWluVmVyc2lvbihjdXJyZW50VmVyc2lvbik/LnZlcnNpb24gOiB1bmRlZmluZWQpO1xuICBpZiAoXG4gICAgZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdERlcGVuZGVuY3kgJiZcbiAgICBpc0JsaXR6UmVwb3NpdG9yeShjb25maWcsIHJvb3RDb25maWcpICYmXG4gICAgY3VycmVudFR5cGVzY3JpcHRWZXJzaW9uICYmXG4gICAgc2VtdmVyLm1ham9yKGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbikgPj0gNyAmJlxuICAgIHNlbXZlci52YWxpZChtYW5hZ2VkVmVyc2lvbikgJiZcbiAgICBpc05ld2VyUGFja2FnZVZlcnNpb24oY3VycmVudFZlcnNpb24sIG1hbmFnZWRWZXJzaW9uKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBUaGUgZ2VuZXJhdGVkIGJ1bmZpZyBhcHBsaWVzIHRoZSBvcmdhbml6YXRpb24gYWdlIGdhdGUgZXZlbiB0byBleGFjdCBwaW5zLiBJZiBhIG1hbmFnZWRcbiAgLy8gdGhpcmQtcGFydHkgdG9vbCBpcyBuZXdlciB0aGFuIHRoZSBuZXdlc3QgcmVsZWFzZSB0aGF0IGNsZWFyZWQgdGhhdCBnYXRlLCBwcmVzZXJ2aW5nIHRoZSBwaW5cbiAgLy8gcHJvZHVjZXMgYSBwYWNrYWdlLmpzb24gdGhhdCBhIGZyZXNoIGluc3RhbGwgd2l0aG91dCB0aGUgb2xkIGxvY2tmaWxlIGNhbm5vdCByZXNvbHZlIChub3RhYmx5XG4gIC8vIG9wdGltaXplZCBEb2NrZXIgYnVpbGRzKS4gS2VlcCB0aGUgbm8tZG93bmdyYWRlIHBvbGljeSBvbmx5IHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgZXhlbXB0IGZyb21cbiAgLy8gdGhlIGdhdGU7IGFnZS1nYXRlZCBtYW5hZ2VkIHRvb2xzIG11c3QgY29udmVyZ2Ugb24gdGhlIHZlcnNpb24gdGhlIGdlbmVyYXRlZCBidW5maWcgYWNjZXB0cy5cbiAgaWYgKHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeSwgY3VycmVudFZlcnNpb24sIG1hbmFnZWRWZXJzaW9uKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIHdiZnkgb3ducyB0aGVzZSB0b29sIGRlcGVuZGVuY2llcywgYnV0IGFwcGx5aW5nIHdiZnkgc2hvdWxkIG5vdCBkb3duZ3JhZGUgYVxuICAvLyByZXBvc2l0b3J5IHRoYXQgYWxyZWFkeSBwaW5zIGEgbmV3ZXIgcmV2aWV3ZWQgcmVsZWFzZSB3aGVuIHRoZSBvcmcgcG9saWN5IGV4ZW1wdHMgaXQuXG4gIHJldHVybiBpc05ld2VyUGFja2FnZVZlcnNpb24obWFuYWdlZFZlcnNpb24sIGN1cnJlbnRWZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRG93bmdyYWRlQWdlR2F0ZWRNYW5hZ2VkRGVwZW5kZW5jeShcbiAgZGVwZW5kZW5jeTogc3RyaW5nLFxuICBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBtYW5hZ2VkVmVyc2lvbjogc3RyaW5nXG4pOiBjdXJyZW50VmVyc2lvbiBpcyBzdHJpbmcge1xuICBpZiAoIWN1cnJlbnRWZXJzaW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHZhbGlkQ3VycmVudFZlcnNpb24gPSBzZW12ZXIudmFsaWQoY3VycmVudFZlcnNpb24pO1xuICBjb25zdCB2YWxpZE1hbmFnZWRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKG1hbmFnZWRWZXJzaW9uKTtcbiAgcmV0dXJuIChcbiAgICBzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3kpICYmXG4gICAgdmFsaWRDdXJyZW50VmVyc2lvbiAhPT0gbnVsbCAmJlxuICAgIHZhbGlkTWFuYWdlZFZlcnNpb24gIT09IG51bGwgJiZcbiAgICBzZW12ZXIuZ3QodmFsaWRDdXJyZW50VmVyc2lvbiwgdmFsaWRNYW5hZ2VkVmVyc2lvbilcbiAgKTtcbn1cblxuLy8gVGhlIG5ld2VzdCBUeXBlU2NyaXB0IDYgcmVsZWFzZSBhdCB0aGUgdGltZSB0aGUgQmxpdHogY2FwIHNoaXBwZWQ7IHVzZWQgb25seSB3aGVuIHRoZSByZWdpc3RyeVxuLy8gbG9va3VwIGZvciB0aGUgYWN0dWFsIG5ld2VzdCBwcmUtdjcgcmVsZWFzZSBmYWlscyAoc2VlIGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbikuXG5jb25zdCBsYXN0S25vd25QcmVWN1R5cGVzY3JpcHRWZXJzaW9uID0gJzYuMC4zJztcblxuZnVuY3Rpb24gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xuICBpZiAoZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdERlcGVuZGVuY3kgJiYgaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnLCByb290Q29uZmlnKSkge1xuICAgIC8vIEJsaXR6IHBpbnMgTmV4dC5qcyAxNSwgd2hvc2UgYnVpbGQtdGltZSBgdmVyaWZ5VHlwZVNjcmlwdFNldHVwYCByZXF1aXJlcyB0aGUgY2xhc3NpY1xuICAgIC8vIGB0eXBlc2NyaXB0YCBjb21waWxlciBBUEk7IHRoZSBUeXBlU2NyaXB0IDcgYHR5cGVzY3JpcHRgIHBhY2thZ2UgaXMgdGhlIHRzZ28gYmluYXJ5XG4gICAgLy8gd2l0aG91dCB0aGF0IEFQSSwgc28gYG5leHQgYnVpbGRgIGFib3J0cyB3aXRoIFwiRmFpbGVkIHRvIGluc3RhbGwgcmVxdWlyZWQgVHlwZVNjcmlwdFxuICAgIC8vIGRlcGVuZGVuY2llc1wiIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtKS4gQ2FwIGB0eXBlc2NyaXB0YCBiZWxvdyA3IHVudGlsXG4gICAgLy8gQmxpdHogc3VwcG9ydHMgYSBOZXh0LmpzIHJlbGVhc2UgdGhhdCB1bmRlcnN0YW5kcyB0c2dvLiBBIGZhaWxlZCByZWdpc3RyeSBsb29rdXAgbXVzdFxuICAgIC8vIHJlc29sdmUgdG8gYSBrbm93bi1jb21wYXRpYmxlIHJlbGVhc2Ug4oCUIGZhbGxpbmcgYmFjayB0byBsYXRlc3RWZXJzaW9uIHdvdWxkIHJlaW5zdGFsbCB0aGVcbiAgICAvLyBpbmNvbXBhdGlibGUgVHlwZVNjcmlwdCA3LlxuICAgIGNvbnN0IHZhbGlkTGF0ZXN0VmVyc2lvbiA9IHNlbXZlci52YWxpZChsYXRlc3RWZXJzaW9uKTtcbiAgICBpZiAodmFsaWRMYXRlc3RWZXJzaW9uICYmIHNlbXZlci5tYWpvcih2YWxpZExhdGVzdFZlcnNpb24pIDwgNykgcmV0dXJuIGxhdGVzdFZlcnNpb247XG4gICAgLy8gVGhlIGNhcHBlZCBsb29rdXAgbXVzdCByZXNwZWN0IHRoZSBhZ2UgZ2F0ZSB0b286IHRoaXMgdmVyc2lvbiBpcyB3cml0dGVuIGFzIGFuIGV4YWN0IHBpbixcbiAgICAvLyBhbmQgQnVuIHJlZnVzZXMgdG8gcmVzb2x2ZSBvbmUgcHVibGlzaGVkIGluc2lkZSB0aGUgbWluaW11bS1yZWxlYXNlLWFnZSB3aW5kb3cuIFRoZXJlIGlzIG5vXG4gICAgLy8gdW5nYXRlZCBmYWxsYmFjayDigJQgd2l0aG91dCBwdWJsaWNhdGlvbiBtZXRhZGF0YSB0aGUgYWdlIG9mIGEgcmFuZ2UgcmVzdWx0IGlzIHVua25vd24sIHNvIGFcbiAgICAvLyBwYXJ0aWFsIHJlZ2lzdHJ5IGZhaWx1cmUgd291bGQgb3RoZXJ3aXNlIHdyaXRlIGEgdmVyc2lvbiBCdW4gdGhlbiByZWZ1c2VzIHRvIGluc3RhbGwuXG4gICAgcmV0dXJuIGdldExhdGVzdEFnZUdhdGVkVmVyc2lvbkJlbG93KHR5cGVzY3JpcHREZXBlbmRlbmN5LCAnNy4wLjAnKSA/PyBsYXN0S25vd25QcmVWN1R5cGVzY3JpcHRWZXJzaW9uO1xuICB9XG4gIHJldHVybiBsYXRlc3RWZXJzaW9uO1xufVxuXG4vKipcbiAqIFRoZSBoaWdoZXN0IHJlbGVhc2Ugb2YgYHBhY2thZ2VOYW1lYCBiZWxvdyBgZXhjbHVzaXZlVXBwZXJCb3VuZGAgdGhhdCBhbHJlYWR5IGNsZWFyZWQgdGhlIGFnZVxuICogZ2F0ZSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHJlZ2lzdHJ5IGxvb2t1cCBmYWlscyBvciBubyBzdWNoIHJlbGVhc2UgZXhpc3RzIHlldC5cbiAqL1xuZnVuY3Rpb24gZ2V0TGF0ZXN0QWdlR2F0ZWRWZXJzaW9uQmVsb3cocGFja2FnZU5hbWU6IHN0cmluZywgZXhjbHVzaXZlVXBwZXJCb3VuZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKGdldE5wbVBhY2thZ2VUaW1lcyhwYWNrYWdlTmFtZSkpLmZpbmQoKHZlcnNpb24pID0+XG4gICAgc2VtdmVyLmx0KHZlcnNpb24sIGV4Y2x1c2l2ZVVwcGVyQm91bmQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihjYW5kaWRhdGVWZXJzaW9uOiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdmFsaWRMYXRlc3RWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGNhbmRpZGF0ZVZlcnNpb24pO1xuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgcmV0dXJuICF2YWxpZExhdGVzdFZlcnNpb24gfHwgIXZhbGlkQ3VycmVudFZlcnNpb24gfHwgc2VtdmVyLmd0KHZhbGlkTGF0ZXN0VmVyc2lvbiwgdmFsaWRDdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcnNpb24uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAvLyBObyBgLS1idW5gOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrcyB0b29sc1xuICAgIC8vIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpLlxuICAgIGNsZWFudXA6ICdidW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgZm9ybWF0OiBgYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgIGxpbnQ6IGBidW4gd2IgbGludGAsXG4gICAgJ2xpbnQtZml4JzogJ2J1biB3YiBsaW50IC0tZml4JyxcbiAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgIHR5cGVjaGVjazogJ2J1biB3YiB0eXBlY2hlY2snLFxuICAgIHZlcmlmeTogJ2J1biB3YiB2ZXJpZnknLFxuICAgICd2ZXJpZnktZnVsbCc6ICdidW4gd2IgdmVyaWZ5IC0tZnVsbCcsXG4gIH07XG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgYXBwbHlUZXN0T25DaVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzKTtcbiAgfVxuICBhcHBseVRlc3RTY3JpcHQoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzKTtcbiAga2VlcEdlbmVyYXRlZFNjcmlwdFdyYXBwZXJzKHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsndGVzdCcsICd2ZXJpZnktZnVsbCddKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBgYnVuICR7Z2V0V2JEYXRhYmFzZUNvbW1hbmQoY29uZmlnKX1gKTtcbiAgYXBwbHlNaXNlVGFza1NjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ2J1aWxkJywgJ2RldicsICdzdGFydCcsICd0ZXN0JywgJ3R5cGVjaGVjayddKTtcbiAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJyAmJiBweXJpZ2h0JztcbiAgfVxuICByZXR1cm4gc2NyaXB0cztcbn1cblxuLy8gQ0kgd29ya2Zsb3dzIChib3RoIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93IGFuZCB0aGUgc2VsZi1jb250YWluZWQgdmFyaWFudCBmb3Igbm9uLVdpbGxCb29zdGVyXG4vLyByZXBvc2l0b3JpZXMpIHByZWZlciBgdGVzdC9jaWAgb3ZlciBgdGVzdGAsIHNvIHN0YW5kYXJkaXplIGl0IG9uIGB3YiB0ZXN0LW9uLWNpYCBhdCB0aGUgcm9vdCDigJRcbi8vIGB3YiB0ZXN0LW9uLWNpYCBhbHJlYWR5IGl0ZXJhdGVzIHdvcmtzcGFjZSBwYWNrYWdlcyBpdHNlbGYuXG5mdW5jdGlvbiBhcHBseVRlc3RPbkNpU2NyaXB0KHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1sndGVzdC9jaSddO1xuICAvLyBTb21lIHJlcG9zaXRvcmllcyB3cmFwIENJIHRlc3RzIHdpdGggZXh0cmEgc3RlcHMgKGUuZy4gc2VsZWN0aW5nIHNwZWMgZmlsZXMgb3IgcnVubmluZyByYXdcbiAgLy8gUGxheXdyaWdodCkgdGhhdCB3YiBjYW5ub3QgaW5mZXIgZ2VuZXJpY2FsbHk7IHN1Y2ggd3JhcHBlcnMgYXJlIHByZXNlcnZlZC5cbiAgc2NyaXB0c1sndGVzdC9jaSddID0gb2xkU2NyaXB0ICYmICFpc0dlbmVyYXRlZFRlc3RPbkNpU2NyaXB0KG9sZFNjcmlwdCkgPyBvbGRTY3JpcHQgOiAnYnVuIHdiIHRlc3Qtb24tY2knO1xufVxuXG4vKiogV2hldGhlciBhIHNjcmlwdCBib2R5IGlzIG9uZSBvZiB0aGUgZ2VuZXJhdGVkIGB3YiB0ZXN0LW9uLWNpYCBpbnZvY2F0aW9ucy4gKi9cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdE9uQ2lTY3JpcHQoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNjcmlwdC50cmltKCkgPT09ICdidW4gd2IgdGVzdC1vbi1jaSc7XG59XG5cbi8qKlxuICogYHdiIHRlc3RgIHJ1bnMgSmF2YVNjcmlwdC9UeXBlU2NyaXB0IHRlc3QgcnVubmVycyBvbmx5LCBzbyByZXBsYWNpbmcgdGhlIGB0ZXN0YCBzY3JpcHQgb2YgYVxuICogcGFja2FnZSB3cml0dGVuIGluIGFub3RoZXIgbGFuZ3VhZ2UgKGUuZy4gYSBNYXZlbiBvciBhbiBSU3BlYyBwYWNrYWdlIGluIGEgcG9seWdsb3QgbW9ub3JlcG8pXG4gKiBzaWxlbnRseSBkcm9wcyBpdHMgd2hvbGUgc3VpdGU6IHRoZSBnZW5lcmF0ZWQgc2NyaXB0IHRoZW4gc3VjY2VlZHMgd2l0aG91dCBydW5uaW5nIGFueXRoaW5nLlxuICogU3VjaCBhIHBhY2thZ2Uga2VlcHMgaXRzIG93biBgdGVzdGAgc2NyaXB0OyBKUy9UUyBwYWNrYWdlcyBhcmUgc3RhbmRhcmRpemVkIGFzIHVzdWFsLlxuICovXG5mdW5jdGlvbiBhcHBseVRlc3RTY3JpcHQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0c1xuKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHMudGVzdD8udHJpbSgpO1xuICBpZiAoIW9sZFNjcmlwdCB8fCBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGlzR2VuZXJhdGVkVGVzdFNjcmlwdChvbGRTY3JpcHQpKSByZXR1cm47XG4gIHNjcmlwdHMudGVzdCA9IG9sZFNjcmlwdDtcbn1cblxuLyoqIFdoZXRoZXIgYSBzY3JpcHQgYm9keSBpcyBvbmUgb2YgdGhlIEtOT1dOIGdlbmVyYXRlZCBgd2IgdGVzdGAgaW52b2NhdGlvbnMuICovXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RTY3JpcHQoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNjcmlwdC50cmltKCkgPT09ICdidW4gd2IgdGVzdCc7XG59XG5cbi8qKlxuICogS2VlcHMgYSBzY3JpcHQgdGhhdCBDSEFJTlMgZXh0cmEgY29tbWFuZHMgb250byB0aGUgZ2VuZXJhdGVkIG9uZSAoZS5nLiBhIHBvbHlnbG90IG1vbm9yZXBvXG4gKiBhcHBlbmRpbmcgaXRzIE1hdmVuIGFuZCBSU3BlYyBzdWl0ZXMgdG8gYHdiIHRlc3RgLCB3aGljaCBydW5zIEphdmFTY3JpcHQvVHlwZVNjcmlwdCBydW5uZXJzXG4gKiBvbmx5KS4gU3VjaCBhIHdyYXBwZXIgc3RpbGwgcnVucyB0aGUgZ2VuZXJhdGVkIGNvbW1hbmQsIHNvIHJlcGxhY2luZyBpdCB3b3VsZCBzaWxlbnRseSBkcm9wIHRoZVxuICogcmVwb3NpdG9yeSdzIG93biBzdGVwcyDigJQgdGhlIHNhbWUgcmVhc29uaW5nIGFzIGBhcHBseVRlc3RPbkNpU2NyaXB0YC4gQW4gdW5yZWNvZ25pemVkIGNoYWluZWRcbiAqIHNjcmlwdCBpcyBrZXB0IHdob2xlc2FsZSByYXRoZXIgdGhhbiBsb3NpbmcgaXRzIHByb2plY3Qtb3duZWQgY29tbWFuZHMuXG4gKi9cbmZ1bmN0aW9uIGtlZXBHZW5lcmF0ZWRTY3JpcHRXcmFwcGVycyhcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgc2NyaXB0TmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBzY3JpcHROYW1lIG9mIHNjcmlwdE5hbWVzKSB7XG4gICAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1tzY3JpcHROYW1lXT8udHJpbSgpO1xuICAgIGNvbnN0IGdlbmVyYXRlZFNjcmlwdCA9IHNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgaWYgKCFvbGRTY3JpcHQgfHwgIWdlbmVyYXRlZFNjcmlwdCB8fCBvbGRTY3JpcHQgPT09IGdlbmVyYXRlZFNjcmlwdCkgY29udGludWU7XG4gICAgY29uc3QgaGVhZFJlZ0V4cCA9IG5ldyBSZWdFeHAoXG4gICAgICBgXiR7ZXNjYXBlUmVnRXhwKGdlbmVyYXRlZFNjcmlwdCkucmVwbGFjZUFsbCgnICcsIFN0cmluZy5yYXdgWyBcXHRdK2ApfSg/PVsgXFxcXHRdKig/OiYmfFxcXFx8XFxcXHx8O3xcXFxcbikpYCxcbiAgICAgICd1J1xuICAgICk7XG4gICAgLy8gQSBuZXdsaW5lIHNlcGFyYXRlcyBzaGVsbCBjb21tYW5kcyBqdXN0IGxpa2UgJiYsIHx8IGFuZCA7LlxuICAgIGlmIChoZWFkUmVnRXhwLnRlc3Qob2xkU2NyaXB0KSkge1xuICAgICAgLy8gQSBmdW5jdGlvbiByZXBsYWNlbWVudCBrZWVwcyBgJGAtc2hhcGVkIGNoYXJhY3RlcnMgaW4gdGhlIGdlbmVyYXRlZCBjb21tYW5kIGxpdGVyYWwuXG4gICAgICBzY3JpcHRzW3NjcmlwdE5hbWVdID0gb2xkU2NyaXB0LnJlcGxhY2UoaGVhZFJlZ0V4cCwgKCkgPT4gZ2VuZXJhdGVkU2NyaXB0KTtcbiAgICB9IGVsc2UgaWYgKC8oPzomJnxcXHxcXHx8O3xcXG4pL3UudGVzdChvbGRTY3JpcHQpKSB7XG4gICAgICBzY3JpcHRzW3NjcmlwdE5hbWVdID0gb2xkU2NyaXB0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICB3YkRiQ29tbWFuZDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSByZXR1cm47XG5cbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItY3JlYXRlLW1pZ3JhdGlvbicsIGAke3diRGJDb21tYW5kfSBtaWdyYXRlLWRldmAsICdtaWdyYXRlLWRldicpO1xuICBhcHBseURhdGFiYXNlU2NyaXB0KFxuICAgIHNjcmlwdHMsXG4gICAgb2xkU2NyaXB0cyxcbiAgICAnZGItbWlncmF0ZScsXG4gICAgYCR7d2JEYkNvbW1hbmR9IG1pZ3JhdGUgLS1jaGVjay1pZGVtcG90ZW5jeWAsXG4gICAgJ21pZ3JhdGUgLS1jaGVjay1pZGVtcG90ZW5jeSdcbiAgKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItdmlldycsIGAke3diRGJDb21tYW5kfSBzdHVkaW9gLCAnc3R1ZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGF0YWJhc2VTY3JpcHQoXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5hbWU6IHN0cmluZyxcbiAgZ2VuZXJhdGVkU2NyaXB0OiBzdHJpbmcsXG4gIGdlbmVyYXRlZEFyZ3VtZW50czogc3RyaW5nXG4pOiB2b2lkIHtcbiAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1tuYW1lXTtcbiAgLy8gU29tZSByZXBvc2l0b3JpZXMgd3JhcCBtaWdyYXRpb24gY29tbWFuZHMgdG8gcHJlcGFyZSBTUUxpdGUgZGlyZWN0b3JpZXMsXG4gIC8vIGZhbiBvdXQgb3ZlciB0ZW5hbnRzLCBvciBwZXJmb3JtIGNsZWFudXAgdGhhdCB3YiBjYW5ub3QgaW5mZXIgZ2VuZXJpY2FsbHkuXG4gIGNvbnN0IGdlbmVyYXRlZEJvZGllcyA9IFtgYnVuIHdiIGRiICR7Z2VuZXJhdGVkQXJndW1lbnRzfWAsIGBidW4gd2IgcHJpc21hICR7Z2VuZXJhdGVkQXJndW1lbnRzfWBdO1xuICBzY3JpcHRzW25hbWVdID0gb2xkU2NyaXB0ICYmICFnZW5lcmF0ZWRCb2RpZXMuaW5jbHVkZXMob2xkU2NyaXB0LnRyaW0oKSkgPyBvbGRTY3JpcHQgOiBnZW5lcmF0ZWRTY3JpcHQ7XG59XG5cbmZ1bmN0aW9uIGdldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICd3YiBkYicgfCAnd2IgcHJpc21hJyB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkgcmV0dXJuICd3YiBwcmlzbWEnO1xuICByZXR1cm4gJ3diIGRiJztcbn1cblxuZnVuY3Rpb24gaXNXYlBhY2thZ2UocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYWNrYWdlSnNvbj8ubmFtZSA9PT0gd2JEZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiBhcHBseU1pc2VUYXNrU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lczogc3RyaW5nW11cbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAoIWhhc01pc2VUYXNrKGNvbmZpZywgbmFtZSkpIGNvbnRpbnVlO1xuICAgIGlmIChkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICAvLyBQcmVzZXJ2ZSBhIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudiBwcmVmaXggKGUuZy4gYE1JU0VfRU5WPXRlc3RgKSBvbiBhbiBleGlzdGluZyBtaXNlIGJyaWRnZS5cbiAgICAvLyBTdWNoIGEgcHJlZml4IGlzIHJlcXVpcmVkIGZvciBtaXNlIGNvbmZpZyBlbnZpcm9ubWVudHMgKG1pc2UuPE1JU0VfRU5WPi50b21sKSwgd2hpY2ggYXJlXG4gICAgLy8gc2VsZWN0ZWQgZnJvbSBNSVNFX0VOViAqYmVmb3JlKiBtaXNlIHN0YXJ0cyBhbmQgY2Fubm90IGJlIHN3aXRjaGVkIGZyb20gaW5zaWRlIGEgdGFzazsgZHJvcHBpbmdcbiAgICAvLyBpdCB3b3VsZCBzaWxlbnRseSBydW4gdGhlIHRhc2sgaW4gdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQuXG4gICAgY29uc3QgZW52UHJlZml4ID0gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgob2xkU2NyaXB0c1tuYW1lXSwgbmFtZSk7XG4gICAgaWYgKGVudlByZWZpeCA9PT0gdW5kZWZpbmVkICYmIG9sZFNjcmlwdHNbbmFtZV0gJiYgIShuYW1lIGluIHNjcmlwdHMpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW25hbWVdID0gYCR7ZW52UHJlZml4ID8/ICcnfW1pc2UgcnVuICR7bmFtZX1gO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGVhZGluZyBgS0VZPVZBTFVFIGAgZW52LXZhciBwcmVmaXggb2YgYW4gZXhpc3RpbmcgYG1pc2UgcnVuIDxuYW1lPmAgYnJpZGdlIHNjcmlwdFxuICogKHBvc3NpYmx5IGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBicmlkZ2UgaGFzIG5vIHByZWZpeCksIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHNjcmlwdCBpcyBub3QgYVxuICogbWlzZSBicmlkZ2UgZm9yIHRoZSBnaXZlbiB0YXNrLlxuICovXG5mdW5jdGlvbiBleHRyYWN0TWlzZUJyaWRnZUVudlByZWZpeChzY3JpcHQ6IHVua25vd24sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gRWFjaCBhc3NpZ25tZW50IHZhbHVlIG1heSBiZSBkb3VibGUtcXVvdGVkLCBzaW5nbGUtcXVvdGVkLCBvciBhbiB1bnF1b3RlZCBydW4gb2Ygbm9uLXdoaXRlc3BhY2UsXG4gIC8vIHNvIHByZWZpeGVzIGxpa2UgYE1JU0VfRU5WPVwiYSBiXCJgICh3aG9zZSB2YWx1ZSBjb250YWlucyBzcGFjZXMpIGFyZSBtYXRjaGVkIGluc3RlYWQgb2YgZHJvcHBlZC5cbiAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXigoPzpcXHcrPSg/OlwiW15cIl0qXCJ8J1teJ10qJ3xcXFMrKVxccyspKiltaXNlIHJ1biAke2VzY2FwZVJlZ0V4cChuYW1lKX0kYCwgJ3UnKS5leGVjKFxuICAgIHNjcmlwdC50cmltKClcbiAgKTtcbiAgcmV0dXJuIG1hdGNoPy5bMV07XG59XG5cbmZ1bmN0aW9uIGhhc01pc2VUYXNrKGNvbmZpZzogUGFja2FnZUNvbmZpZywgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duKGNvbmZpZy5taXNlVGFza3MsIG5hbWUpO1xufVxuXG5mdW5jdGlvbiBkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0YXNrID0gY29uZmlnLm1pc2VUYXNrc1tuYW1lXTtcbiAgaWYgKCF0YXNrKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VycyA9IFsnYnVuJywgJ3lhcm4nLCAnbnBtJywgJ3BucG0nXTtcbiAgcmV0dXJuIHBhY2thZ2VNYW5hZ2Vycy5zb21lKChwYWNrYWdlTWFuYWdlcikgPT5cbiAgICBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXFxiJHtwYWNrYWdlTWFuYWdlcn1cXHMrKD86cnVuXFxzKyk/JHtlc2NhcGVSZWdFeHAobmFtZSl9KD8hW2EtekEtWjAtOV9cXC06Ll0pYCwgJ3UnKS50ZXN0KHRhc2spXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKSwgLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpXSk7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlczoge1xuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmc7XG4gICAgb3JnOiBzdHJpbmc7XG4gICAgcmVwbzogc3RyaW5nO1xuICAgIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJztcbiAgfVtdID0gW1xuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicsIG9yZzogJ1dpbGxCb29zdGVyJywgcmVwbzogJ2NvZGUtYW5hbHl6ZXInLCB0YXJnZXQ6ICdkZXZEZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9qdWRnZScsIG9yZzogJ1dpbGxCb29zdGVyTGFiJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5Jywgb3JnOiAnV2lsbEJvb3N0ZXJMYWInLCByZXBvOiAnbGxtLXByb3h5JywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICBdO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHByaXZhdGVQYWNrYWdlcy5tYXAoYXN5bmMgKHsgb3JnLCBwYWNrYWdlTmFtZSwgcmVwbywgdGFyZ2V0IH0pID0+IHtcbiAgICAgIGlmICghcGFja2FnZU5hbWVzLmhhcyhwYWNrYWdlTmFtZSkgfHwgaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosIHBhY2thZ2VOYW1lKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmllciA9IGpzb25PYmouZGVwZW5kZW5jaWVzW3BhY2thZ2VOYW1lXSA/PyBqc29uT2JqLmRldkRlcGVuZGVuY2llc1twYWNrYWdlTmFtZV07XG4gICAgICBjb25zdCBvdGhlclRhcmdldCA9IHRhcmdldCA9PT0gJ2RlcGVuZGVuY2llcycgPyAnZGV2RGVwZW5kZW5jaWVzJyA6ICdkZXBlbmRlbmNpZXMnO1xuICAgICAgLy8gVGhlIGxpbnQgcnVsZSBkaXNhbGxvd3MgYGRlbGV0ZWAgd2l0aCBjb21wdXRlZCBwYWNrYWdlIG5hbWVzOyBSZWZsZWN0IGhhcyB0aGUgc2FtZSBkZWxldGlvbiBzZW1hbnRpY3MgaGVyZS5cbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9ialtvdGhlclRhcmdldF0sIHBhY2thZ2VOYW1lKTtcbiAgICAgIGpzb25PYmpbdGFyZ2V0XVtwYWNrYWdlTmFtZV0gPSBpc1Bpbm5lZFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKGV4aXN0aW5nU3BlY2lmaWVyLCBvcmcsIHJlcG8pXG4gICAgICAgID8gZXhpc3RpbmdTcGVjaWZpZXJcbiAgICAgICAgOiBhd2FpdCBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihvcmcsIHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZXhpc3Rpbmcgc3BlY2lmaWVyIGFscmVhZHkgcGlucyBhIGdpdCByZWYgb2YgdGhlIGV4cGVjdGVkIHByaXZhdGUgcmVwb3NpdG9yeS5cbiAqIHdiZnkgbXVzdCBub3QgYnVtcCBzdWNoIHBpbnM6IGEgcnVuIGludGVuZGVkIGFzIGNvbmZpZ3VyYXRpb24vcGFja2FnZS1tYW5hZ2VyIG1haW50ZW5hbmNlXG4gKiB3b3VsZCBvdGhlcndpc2UgY2hhbmdlIHRoZSBkZXBlbmRlbmN5J3MgdmVyc2lvbiBhcyBhIHNpZGUgZWZmZWN0ICh1cGRhdGluZyBwaW5zIGlzIFJlbm92YXRlJ3NcbiAqIGpvYiksIHBvc3NpYmx5IHRvIGEgY29tbWl0IHdob3NlIHByZWJ1aWx0IGFydGlmYWN0cyBhcmUgbWlzc2luZy5cbiAqL1xuZnVuY3Rpb24gaXNQaW5uZWRQcml2YXRlUGFja2FnZVNwZWNpZmllcihcbiAgc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG9yZzogc3RyaW5nLFxuICByZXBvOiBzdHJpbmdcbik6IHNwZWNpZmllciBpcyBzdHJpbmcge1xuICBpZiAoIXNwZWNpZmllcikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbmV3IFJlZ0V4cChTdHJpbmcucmF3YCg/Ol58WzovXSkke29yZ30vJHtyZXBvfSg/OlxcLmdpdCk/I1xcUyskYCwgJ3UnKS50ZXN0KHNwZWNpZmllcik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKG9yZzogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmcsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOiR7b3JnfS8ke3JlcG99LmdpdCMke2NvbW1pdEhhc2h9YDtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmo6IFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwganNvbk9iai5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmludGVyZmFjZSBMZWZ0aG9va1NldHRpbmdzIHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3Rhcic7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTGVmdGhvb2tKb2Ige1xuICBuYW1lOiBzdHJpbmc7XG4gIGdsb2I/OiBzdHJpbmc7XG4gIHJ1bj86IHN0cmluZztcbiAgc2NyaXB0Pzogc3RyaW5nO1xuICBydW5uZXI/OiAnYmFzaCc7XG4gIHN0YWdlX2ZpeGVkPzogdHJ1ZTtcbn1cblxuY29uc3QgYmFzZVNldHRpbmdzOiBPbWl0PExlZnRob29rU2V0dGluZ3MsICdwcmUtY29tbWl0Jz4gPSB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInLFxuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcmVwYXJlJyxcbiAgICAgICAgc2NyaXB0OiAncHJlcGFyZS5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnY2hlY2snLFxuICAgICAgICBzY3JpcHQ6ICdjaGVjay5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcblxuLy8gTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHRoZSB1bnF1b3RlZCBsb29wcyBiZWxvdyBrZWVwIHBhdGhzXG4vLyB3aXRoIHNwYWNlcyBpbnRhY3QuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBqb2JzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2NsZWFudXAnLFxuICAgICAgZ2xvYjogJycsXG4gICAgICBydW46ICcnLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnY2hlY2stbWlncmF0aW9ucycsXG4gICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICBydW46IGBcbmZhaWxlZD0wXG5mb3IgZmlsZSBpbiB7c3RhZ2VkX2ZpbGVzfTsgZG9cbiAgaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyBcIiRmaWxlXCI7IHRoZW5cbiAgICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlICgkZmlsZSkgY29udGFpbnMgd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICAgIGZhaWxlZD0xXG4gIGZpXG5kb25lXG5leGl0IFwiJGZhaWxlZFwiXG5gLnRyaW0oKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIGJ1biByZWNvcmRzIGFuIGFic29sdXRlIGByZXNvbHZlZGAgVVJMIGZvciBhbiBhbHJlYWR5LWxvY2tlZCBwYWNrYWdlIHdoZW5ldmVyIHRoZVxuICAgICAgLy8gY29uZmlndXJlZCByZWdpc3RyeSBkb2VzIG5vdCBzZXJ2ZSB0aGUgdGFyYmFsbCBob3N0IGluIHRoZSBwYWNrYWdlIG1ldGFkYXRhIOKAlCB3aGljaCBpc1xuICAgICAgLy8gZXhhY3RseSB3aGF0IHRoZSBUYWt1bWkgR3VhcmQgcHJveHkgZG9lcy4gU28gYW4gaW5zdGFsbCBydW4gd2l0aCBHdWFyZCBhcyB0aGUgZGVmYXVsdFxuICAgICAgLy8gcmVnaXN0cnkgKENJLCBvciBhIGRldmVsb3BlciB3aG8gcHV0IGl0IGluIH4vLm5wbXJjKSBiYWtlcyBucG0uZmxhdHQudGVjaCBVUkxzIGludG9cbiAgICAgIC8vIGJ1bi5sb2NrLCBhbmQgY29tbWl0dGluZyB0aGVtIHBpbnMgYSBTSEFSRUQgbG9ja2ZpbGUgdG8gb25lIGVudmlyb25tZW50J3MgbWlycm9yOiBldmVyeVxuICAgICAgLy8gbGF0ZXIgaW5zdGFsbCBkb3dubG9hZHMgdGhyb3VnaCB0aGUgcHJveHksIGFuZCBhIGNvbGQtY2FjaGUgaW5zdGFsbCBmYWlscyBvdXRyaWdodCB3aXRoXG4gICAgICAvLyA0MDEgZm9yIGFueW9uZSB3aG9zZSBucG1yYyBjYXJyaWVzIGEgcmVnaXN0cnkubnBtanMub3JnIHRva2VuLCBiZWNhdXNlIGJ1biBzZW5kcyB0aGVcbiAgICAgIC8vIGRlZmF1bHQgcmVnaXN0cnkncyBjcmVkZW50aWFscyB0byB3aGF0ZXZlciBob3N0IHRoZSBsb2NrZmlsZSBuYW1lcy4gR3VhcmQgY292ZXJhZ2UgZG9lc1xuICAgICAgLy8gbm90IGRlcGVuZCBvbiB0aGVzZSBVUkxzIOKAlCB3aXRoIGFuIGVtcHR5IGByZXNvbHZlZGAsIGJ1biBkZXJpdmVzIHRoZSBkb3dubG9hZCBVUkwgZnJvbVxuICAgICAgLy8gdGhlIGNvbmZpZ3VyZWQgcmVnaXN0cnkg4oCUIHNvIHN0cmlwIHRoZW0uIE9ubHkgdGhlIEd1YXJkIGhvc3QgaXMgc3RyaXBwZWQ6IGEgc2NvcGVkXG4gICAgICAvLyByZWdpc3RyeSBzdWNoIGFzIFZlcmRhY2NpbyBsZWdpdGltYXRlbHkgcmVjb3JkcyBpdHMgb3duIFVSTCBmb3IgcHJpdmF0ZSBwYWNrYWdlcy5cbiAgICAgIG5hbWU6ICdub3JtYWxpemUtYnVuLWxvY2tmaWxlJyxcbiAgICAgIGdsb2I6ICdidW4ubG9jaycsXG4gICAgICBydW46ICdiYXNoIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoIHtzdGFnZWRfZmlsZXN9JyxcbiAgICAgIHN0YWdlX2ZpeGVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gT25seSB3aWxsYm9vc3Rlci1jb25maWdzIGdldHMgdGhpcyBqb2I6IGV2ZXJ5IG90aGVyIHJlcG9zaXRvcnkncyByZW5vdmF0ZS5qc29uYyBtZXJlbHlcbiAgICAgIC8vIGV4dGVuZHMgdGhlIHNoYXJlZCBwcmVzZXQsIGFuZCB0aGUgdmFsaWRhdG9yIGRvZXMgbm90IHJlc29sdmUgcmVtb3RlIHByZXNldHMsIHNvIHJ1bm5pbmcgaXRcbiAgICAgIC8vIHRoZXJlIHdvdWxkIHZhbGlkYXRlIHR3byBsaW5lcyBhbmQgY2F0Y2ggbm90aGluZy4gYC0tbm8tZ2xvYmFsYCB2YWxpZGF0ZXMgdGhlIHByZXNldCBhcyBhXG4gICAgICAvLyByZXBvIGNvbmZpZyBpbnN0ZWFkIG9mIGEgc2VsZi1ob3N0ZWQgZ2xvYmFsIGNvbmZpZywgYW5kIGBAbGF0ZXN0YCBrZWVwcyBucG0gZnJvbSBzaWxlbnRseVxuICAgICAgLy8gaW5zdGFsbGluZyBhbiBhbmNpZW50IFJlbm92YXRlIHRoYXQgY2Fubm90IGV2ZW4gcGFyc2UgSlNPTkMgd2hlbiB0aGUgbG9jYWwgTm9kZSBsYWdzIGJlaGluZC5cbiAgICAgIC8vIFN0YWdpbmcgYSBkZWxldGlvbiBvZiByZW5vdmF0ZS5qc29uYyBsZWF2ZXMgbm8gZmlsZSBmb3IgaW5zcGVjdGlvbiwgc28gTGVmdGhvb2sgc2tpcHMgdGhpc1xuICAgICAgLy8gam9iIGluc3RlYWQgb2YgcnVubmluZyB0aGUgdmFsaWRhdG9yIG9uIGEgbWlzc2luZyBwYXRoIOKAlCBkZWxpYmVyYXRlbHksIGJlY2F1c2UgZGVsZXRpbmcgdGhlXG4gICAgICAvLyBzaGFyZWQgcHJlc2V0IGlzIG5vdCBhbiBvcGVyYXRpb24gdGhpcyBob29rIG5lZWRzIHRvIGd1YXJkLlxuICAgICAgbmFtZTogJ3ZhbGlkYXRlLXJlbm92YXRlLWNvbmZpZycsXG4gICAgICBnbG9iOiAncmVub3ZhdGUuanNvbmMnLFxuICAgICAgcnVuOiAnbnB4IC0teWVzIC0tcGFja2FnZSByZW5vdmF0ZUBsYXRlc3QgLS0gcmVub3ZhdGUtY29uZmlnLXZhbGlkYXRvciAtLXN0cmljdCAtLW5vLWdsb2JhbCB7c3RhZ2VkX2ZpbGVzfScsXG4gICAgfSxcbiAgXSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIC8vIHByZXBhcmUgY2FsbHMgdGhpcyB3aXRob3V0IGFyZ3VtZW50cyBhZnRlciBCdW4gc2F2ZXMgdGhlIHJvb3QgbG9ja2ZpbGU7IExlZnRob29rIHBhc3NlcyBpdHNcbiAgLy8gc3RhZ2VkIHBhdGguIFRoZSB1bnByZWRpY3RhYmxlIHNpYmxpbmcgZmlsZSBtYWtlcyByZXBsYWNlbWVudCBhdG9taWMsIGBjcCAtcGAgcHJlc2VydmVzIGl0c1xuICAvLyBtb2RlLCBhbmQgdGhlIGFuY2hvcmVkIHBhdHRlcm4gY2Fubm90IGVyYXNlIGEgZGlyZWN0IHRhcmJhbGwgZGVwZW5kZW5jeSBVUkwuXG4gIG5vcm1hbGl6ZUJ1bkxvY2tmaWxlOiBgXG4jIS9iaW4vYmFzaFxuc2V0IC1lXG5cbmlmIFtbIFwiJCNcIiAtZXEgMCBdXTsgdGhlblxuICBzZXQgLS0gYnVuLmxvY2tcbmZpXG5cbm5vcm1hbGl6ZWQ9XCJcIlxudHJhcCAnW1sgLXogXCIkbm9ybWFsaXplZFwiIF1dIHx8IHJtIC1mIFwiJG5vcm1hbGl6ZWRcIicgRVhJVFxuZm9yIGZpbGUgaW4gXCIkQFwiOyBkb1xuICBbWyAtZiBcIiRmaWxlXCIgXV0gfHwgY29udGludWVcbiAgbm9ybWFsaXplZD1cIiQobWt0ZW1wIFwiJGZpbGUud2JmeS1ub3JtYWxpemluZy5YWFhYWFhcIilcIlxuICBjcCAtcCBcIiRmaWxlXCIgXCIkbm9ybWFsaXplZFwiXG4gIHNlZCAtRSAncyMoXCIsIClcImh0dHBzOi8vbnBtXFxcXC5mbGF0dFxcXFwudGVjaC9bXlwiXSpcIiNcXFxcMVwiXCIjZycgXCIkZmlsZVwiID4gXCIkbm9ybWFsaXplZFwiXG4gIGlmICEgY21wIC1zIFwiJGZpbGVcIiBcIiRub3JtYWxpemVkXCI7IHRoZW5cbiAgICBtdiBcIiRub3JtYWxpemVkXCIgXCIkZmlsZVwiXG4gICAgZWNobyBcIlJlbW92ZWQgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSAkZmlsZSBzbyB0aGUgbG9ja2ZpbGUgc3RheXMgcmVnaXN0cnktYWdub3N0aWMuXCJcbiAgZmlcbiAgcm0gLWYgXCIkbm9ybWFsaXplZFwiXG4gIG5vcm1hbGl6ZWQ9XCJcIlxuZG9uZVxuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2soY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10gPSBbY29uZmlnXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2snLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIGFsbENvbmZpZ3MpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICBqb2JzOiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZyksXG4gICAgfSxcbiAgfTtcbiAgaWYgKCFsaW50KSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGlmIChsaW50KSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnLCBhbGxDb25maWdzKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gnKSwgc2NyaXB0cy5ub3JtYWxpemVCdW5Mb2NrZmlsZSArICdcXG4nLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBCdW4gcmVwb3MgcmVjZWl2ZSB3YiBhcyBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIHRvb2xjaGFpbiwgc28gZ2VuZXJhdGUgdGhlXG4gIC8vIGZpbmFsIGhvb2sgY29tbWFuZCBvbiB0aGUgZmlyc3QgcnVuIGluc3RlYWQgb2YgY2hhbmdpbmcgaXQgb24gdGhlIHNlY29uZC5cbiAgY29uc3QgcXVpZXRMaW50Q29tbWFuZCA9ICdidW4gd2IgbGludCAtLXF1aWV0JztcbiAgLy8gTm8gc2VwYXJhdGUgdHlwZWNoZWNrIHN0ZXAgbmVlZGVkIOKAlCB0aGUgbGludCBjb21tYW5kIGFscmVhZHkgaW5jbHVkZXMgdHlwZWNoZWNraW5nLlxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHtxdWlldExpbnRDb21tYW5kfVxuYC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHF1aWV0TGludENvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIGdldFByZUNvbW1pdEpvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogTGVmdGhvb2tKb2JbXSB7XG4gIHJldHVybiBwcmVDb21taXRTZXR0aW5ncy5qb2JzXG4gICAgLmZpbHRlcigoam9iKSA9PiBqb2IubmFtZSAhPT0gJ3ZhbGlkYXRlLXJlbm92YXRlLWNvbmZpZycgfHwgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKVxuICAgIC5tYXAoKGpvYikgPT5cbiAgICAgIGpvYi5uYW1lID09PSAnY2xlYW51cCdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5qb2IsXG4gICAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICAgIHJ1bjogZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogam9iXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIExldCBgd2IgbGludCAtLWZvcm1hdGAgZGVjaWRlIHdoZXRoZXIgUHJldHRpZXIgaXMgYXZhaWxhYmxlOyB0aGUgaG9va1xuICAvLyBzdGlsbCBuZWVkcyB0byB0cmlnZ2VyIHdoZW4gYWRkaW5nIHRoZSBmaXJzdCBwcmV0dGllci1vbmx5IGZpbGUuXG4gIGNvbnN0IHN1cHBvcnRlZEV4dGVuc2lvbnMgPSBbLi4uZXh0ZW5zaW9ucy5wcmV0dGllck9ubHldO1xuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCguLi5leHRlbnNpb25zLm94Zm10LCAuLi5leHRlbnNpb25zLm94bGludCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdweScpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgnZGFydCcpO1xuICB9XG4gIGNvbnN0IGZpbHRlcmVkRXh0ZW5zaW9ucyA9IFsuLi5uZXcgU2V0KHN1cHBvcnRlZEV4dGVuc2lvbnMpXS50b1NvcnRlZCgpO1xuICByZXR1cm4gYCoqLyoueyR7ZmlsdGVyZWRFeHRlbnNpb25zLmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnKSkge1xuICAgIHJldHVybiBTdHJpbmcucmF3YFxuYnVuIHJ1biAtLWN3ZCBwYWNrYWdlcy93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbClcIiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuICAvLyBQeXRob24tb25seSBCdW4gcmVwb3MgaW5zdGFsbCB3YiBmb3Igc2hhcmVkIHNjcmlwdHMgYnV0IG5vdCBPeGxpbnQsIHNvXG4gIC8vIHN0YWdlZC1maWxlIGhvb2tzIG11c3QgdXNlIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyBmb3JtYXR0ZXIgcGF0aCBiZWxvdy5cbiAgY29uc3QgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gIGlmIChjYW5Vc2VXYkZvclN0YWdlZEZpbGVzKSB7XG4gICAgcmV0dXJuIGBcbmJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcucmF3YFxucGFja2FnZV9qc29uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiXG4ke2hhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZykgPyBTdHJpbmcucmF3YHB5dGhvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5weSQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2NvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sID8gU3RyaW5nLnJhd2BkYXJ0X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLmRhcnQkJyB8IGdyZXAgLXYgJ2dlbmVyYXRlZCcgfCBncmVwIC12ICdcXC5mcmVlemVkXFwuZGFydCQnIHwgZ3JlcCAtdiAnXFwuZ1xcLmRhcnQkJyB8fCB0cnVlKVwiYCA6ICcnfVxuXG5pZiBbIC1uIFwiJHBhY2thZ2VfanNvbl9maWxlc1wiIF07IHRoZW5cbiAgYnVuIHNvcnQtcGFja2FnZS1qc29uICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcyAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGJsYWNrICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWwpYDtcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSAnYnVuIGluc3RhbGwnO1xuICAvLyBEbyBOT1QgYWRkIGAudmluZXh0YCBoZXJlOiBpdCBob2xkcyBvbmx5IHZpbmV4dCdzIGNvbnRlbnQtaGFzaGVkIGZvbnQgY2FjaGUgYW5kIHRoZSBkZXZcbiAgLy8gc2VydmVyJ3MgbG9jayBmaWxlIChkZWxldGluZyB0aGUgbG9jayBkaXNhYmxlcyB0aGUgZHVwbGljYXRlLWRldi1zZXJ2ZXIgZ3VhcmQgZm9yIGEgcnVubmluZ1xuICAvLyBzZXJ2ZXIpLiB2aW5leHQncyBidWlsZCBvdXRwdXQgZ29lcyB0byBgZGlzdC9gLCBhbmQgVml0ZSdzIGRlcGVuZGVuY3kgY2FjaGUgaXMgaGFuZGxlZCBieVxuICAvLyB0aGUgc2VwYXJhdGUgaW5zdGFsbC1sYXlvdXQgaG9vayBiZWxvdy5cbiAgLy8gU2NhbiBldmVyeSB3b3Jrc3BhY2UgY29uZmlnIChub3QganVzdCB0aGUgcm9vdCk6IGluIGEgbW9ub3JlcG8gdGhlIGFwcCB1c3VhbGx5IGxpdmVzIGluXG4gIC8vIHBhY2thZ2VzLzxhcHA+IG9yIGFwcHMvPGFwcD4sIGFuZCB0aGUgY2FjaGUgZGlyZWN0b3JpZXMgYXJlIHdvcmtzcGFjZS1yZWxhdGl2ZS5cbiAgY29uc3QgbmV4dENhY2hlRGlyUGF0aHMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgICBjb25maWcsXG4gICAgYWxsQ29uZmlncyxcbiAgICAod29ya3NwYWNlQ29uZmlnKSA9PiB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcubmV4dCxcbiAgICAnLm5leHQnXG4gICk7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yaWVzID1cbiAgICBuZXh0Q2FjaGVEaXJQYXRocy5sZW5ndGggPiAwID8gYCAmJiBybSAtUmYgLS0gJHtuZXh0Q2FjaGVEaXJQYXRocy5tYXAocXVvdGVGb3JFdmFsdWF0ZWRTaGVsbCkuam9pbignICcpfWAgOiAnJztcbiAgLy8gQnVuIGRvZXMgbm90IHJlbGluayBhbiBleGlzdGluZyBpc29sYXRlZCB0cmVlIHdoZW4gZ2xvYmFsU3RvcmUvbGlua2VyIHNldHRpbmdzIGNoYW5nZS4gSW5zcGVjdFxuICAvLyB0aG9zZSBrZXlzIHJhdGhlciB0aGFuIGV2ZXJ5IGJ1bmZpZyBjaGFuZ2U6IG1pbmltdW1SZWxlYXNlQWdlIHVwZGF0ZXMgbXVzdCBub3QgZGVzdHJveSBhXG4gIC8vIGNvbnRyaWJ1dG9yJ3Mgd29ya2luZyBpbnN0YWxsIGJlZm9yZSBhIHBvdGVudGlhbGx5IG5ldHdvcmstZGVwZW5kZW50IHJlcGxhY2VtZW50IHN1Y2NlZWRzLlxuICBjb25zdCBub2RlTW9kdWxlc0RpclBhdGhzID0gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoY29uZmlnLCBhbGxDb25maWdzLCAoKSA9PiB0cnVlLCAnbm9kZV9tb2R1bGVzJyk7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgU3RyaW5nLnJhd2BpZiBnaXQgZGlmZiAtLW5vLWNvbG9yIC1VMCBPUklHX0hFQUQgSEVBRCAtLSAnKmJ1bmZpZy50b21sJyB8IGdyZXAgLS1xdWlldCAtRSAnXlsrLV0gKihnbG9iYWxTdG9yZXxsaW5rZXJ8cHVibGljSG9pc3RQYXR0ZXJuKSc7IHRoZW4gcm0gLVJmIC0tICR7bm9kZU1vZHVsZXNEaXJQYXRocy5tYXAocXVvdGVGb3JTaGVsbCkuam9pbignICcpfTsgZmlgXG4gICk7XG4gIC8vIGJ1bi5sb2NrLW9ubHkgbWVyZ2VzIChSZW5vdmF0ZSBsb2NrZmlsZSBtYWludGVuYW5jZSksIGJ1bmZpZy50b21sIC8gLm5wbXJjIGNoYW5nZXMgKGxpbmtlcixcbiAgLy8gcmVnaXN0cnksIGhvaXN0aW5nKSwgYW5kIHBhdGNoIGVkaXRzIGFsbCBjaGFuZ2UgdGhlIGluc3RhbGxlZCB0cmVlIHdpdGhvdXQgdG91Y2hpbmcgcGFja2FnZS5qc29uLlxuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIocGFja2FnZVxcLmpzb258YnVuXFwubG9ja3xidW5maWdcXC50b21sfFxcLm5wbXJjfHBhdGNoZXMvKVwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yaWVzfVwiYFxuICApO1xuICAvLyBWaXRlJ3MgZGVwZW5kZW5jeSBjYWNoZSBpbiBub2RlX21vZHVsZXMvLnZpdGUgc2VsZi1pbnZhbGlkYXRlcyBvbiBsb2NrZmlsZSAvIHBhdGNoZXMgL1xuICAvLyBjb25maWcgLyBOT0RFX0VOViBjaGFuZ2VzIChzZWUgVml0ZSdzIGRlcCBwcmUtYnVuZGxpbmcgZG9jcyksIHNvIHRoZSByZXNpZHVhbCBzdGFsZSBjYXNlIGlzXG4gIC8vIGluc3RhbGwtbGF5b3V0IGNoYW5nZXMgKGJ1bmZpZy50b21sIGxpbmtlciwgLm5wbXJjKTogdGhleSBjaGFuZ2UgdGhlIGluc3RhbGxlZCB0cmVlIHdpdGhvdXRcbiAgLy8gdG91Y2hpbmcgdGhlIGxvY2tmaWxlLCBhbmQgdGhleSBhcmUgYWJzZW50IGZyb20gVml0ZSdzIGNhY2hlIGtleS5cbiAgY29uc3Qgcm1WaXRlQ2FjaGVEaXJlY3RvcmllcyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKFxuICAgIGNvbmZpZyxcbiAgICBhbGxDb25maWdzLFxuICAgICh3b3Jrc3BhY2VDb25maWcpID0+IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcudmluZXh0IHx8IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcudml0ZSxcbiAgICAnbm9kZV9tb2R1bGVzLy52aXRlJ1xuICApO1xuICBpZiAocm1WaXRlQ2FjaGVEaXJlY3Rvcmllcy5sZW5ndGggPiAwKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoYnVuZmlnXFwudG9tbHxcXC5ucG1yYylcIiBcInJtIC1SZiAtLSAke3JtVml0ZUNhY2hlRGlyZWN0b3JpZXMubWFwKHF1b3RlRm9yRXZhbHVhdGVkU2hlbGwpLmpvaW4oJyAnKX1cImBcbiAgICApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJ1dlxcLmxvY2tcIiBcInV2IHN5bmMgLS1mcm96ZW5cImApO1xuICB9XG4gIC8vIEJsaXR6IHJlcG9zaXRvcmllcyBkZWxpYmVyYXRlbHkgZ2V0IHRoZSBzYW1lIHdiLWRyaXZlbiBwcmlzbWEgY29tbWFuZHMgYXMgZXZlcnlvbmUgZWxzZTpcbiAgLy8gdGhlIGJsaXR6IENMSSdzIGNvZGVnZW4gcGF0Y2hlcyB0aGUgaW5zdGFsbGVkIG5leHQgcGFja2FnZSBpbiBwbGFjZSwgd2hpY2ggbXVzdCBuZXZlciBydW5cbiAgLy8gdW5kZXIgQnVuJ3Mgc2hhcmVkIGdsb2JhbCBzdG9yZS4gWWFybi1lcmEgQmxpdHogcmVwb3MgZ2V0IHRoZWlyIHJvdXRlIG1hbmlmZXN0IGZyb21cbiAgLy8gYHdiIGdlbi1jb2RlYCdzIGBibGl0eiBjb2RlZ2VuYCBzdGVwLCBhbmQgY3VycmVudCB3YiByb3V0ZXMgb25seSBgd2IgcHJpc21hIHNlZWRgIHRocm91Z2hcbiAgLy8gdGhlIGJsaXR6IENMSSwgb25seSBmb3Igbm9uLUJ1biByZXBvcyAoc2VlIHBhY2thZ2VzL3diL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMpOyB0aGVcbiAgLy8gcG9zdC1tZXJnZSBob29rcyBzdGF5IHdiLWRyaXZlbiBiZWNhdXNlIGBwcmlzbWEgZGVwbG95YC9gZ2VuZXJhdGVgIG5lZWQgbm8gYmxpdHogbG9hZGVyLlxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJidW4gd2IgcHJpc21hIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwiYnVuIHdiIHByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzQ29tbWFuZCA9IGdldEdlbkkxOG5Uc0NvbW1hbmQoY29uZmlnLCBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMpO1xuICBpZiAoZ2VuSTE4blRzQ29tbWFuZCkge1xuICAgIC8vIGdlbi1pMThuLXRzIG91dHB1dHMgYXJlIGNvbW1vbmx5IGlnbm9yZWQsIHNvIHBvc3QtbWVyZ2UgcmVnZW5lcmF0ZXMgdGhlbSBhZnRlciBwdWxsZWQgcmVzb3VyY2UgY2hhbmdlcy5cbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoXnwvKWkxOG4vLipcXC5qc29uJFwiIFwiJHtnZW5JMThuVHNDb21tYW5kfVwiYCk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuXG4vLyBUaGUgZ2VuZXJhdGVkIGNvbW1hbmQgcGFzc2VzIHRocm91Z2ggVFdPIHNoZWxsIHBhcnNpbmcgc3RhZ2VzOiB0aGUgcHJlcGFyZS5zaCBsaW5lIHBhcnNlcyBpdCBhc1xuLy8gYSBkb3VibGUtcXVvdGVkIGFyZ3VtZW50IChwcm9jZXNzaW5nIFxcLCBgLCAkIGFuZCBcIiBpbW1lZGlhdGVseSksIGFuZCBydW5faWZfY2hhbmdlZCB0aGVuIGV2YWwnc1xuLy8gaXQgKHdvcmQtc3BsaXR0aW5nIGFuZCBnbG9iYmluZykuIEFuIHVucXVvdGVkIHBhdGggY29udGFpbmluZyBzcGFjZXMgKGUuZy4gYGFwcHMvbXkgYXBwLy5uZXh0YClcbi8vIHdvdWxkIHdvcmQtc3BsaXQgaW50byB1bnJlbGF0ZWQgcm0gdGFyZ2V0cywgYW5kIGAkYC9iYWNrdGljayB3b3VsZCBleHBhbmQgYXQgdGhlIGZpcnN0IHN0YWdlLlxuLy8gU286IHNpbmdsZS1xdW90ZSBmb3IgdGhlIGV2YWwgc3RhZ2UsIHRoZW4gYmFja3NsYXNoLWVzY2FwZSB0aGUgZG91YmxlLXF1b3RlLWNvbnRleHQgc3BlY2lhbHMuXG5mdW5jdGlvbiBxdW90ZUZvckV2YWx1YXRlZFNoZWxsKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBldmFsUXVvdGVkID0gcXVvdGVGb3JTaGVsbChmaWxlUGF0aCk7XG4gIHJldHVybiBldmFsUXVvdGVkLnJlcGxhY2VBbGwoL1tcXFxcYCRcIl0vZ3UsIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG5mdW5jdGlvbiBxdW90ZUZvclNoZWxsKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCcke2ZpbGVQYXRoLnJlcGxhY2VBbGwoXCInXCIsIFN0cmluZy5yYXdgJ1xcJydgKX0nYDtcbn1cblxuLyoqXG4gKiBUaGUgd29ya3NwYWNlLXJlbGF0aXZlIGRpcmVjdG9yaWVzIChyb290IGZpcnN0LCBkZWR1cGxpY2F0ZWQsIGA8c3ViRGlyTmFtZT5gIGFwcGVuZGVkKSBvZiBldmVyeVxuICogd29ya3NwYWNlIHdob3NlIGNvbmZpZyBtYXRjaGVzIHRoZSBwcmVkaWNhdGUuIFRoZSBob29rIHNjcmlwdCBydW5zIGF0IHRoZSByZXBvc2l0b3J5IHJvb3QsIHNvXG4gKiBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgY29uZmlnJ3MgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBwcmVkaWNhdGU6IChjb25maWc6IFBhY2thZ2VDb25maWcpID0+IGJvb2xlYW4sXG4gIHN1YkRpck5hbWU6IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBhbGxDb25maWdzXG4gICAgICAgIC5maWx0ZXIoKGNvbmZpZykgPT4gcHJlZGljYXRlKGNvbmZpZykpXG4gICAgICAgIC5tYXAoKGNvbmZpZykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocm9vdENvbmZpZy5kaXJQYXRoLCBjb25maWcuZGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgICAgICAgcmV0dXJuIHJlbGF0aXZlRGlyUGF0aCA/IHBhdGgucG9zaXguam9pbihyZWxhdGl2ZURpclBhdGgsIHN1YkRpck5hbWUpIDogc3ViRGlyTmFtZTtcbiAgICAgICAgfSlcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2s7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblJ1bm5lcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5IHJ1bicgfCAndXYgcnVuJyB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgPyAndXYgcnVuJyA6ICdwb2V0cnkgcnVuJztcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb25maWdDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZW50Py50cmltKCk7XG59XG4iLCJpbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICcuLi91dGlscy9zdHJpbmdVdGlsLmpzJztcblxuZXhwb3J0IHR5cGUgQ29uZmlnQmxvY2tOYW1lID0gJ2Jhc2UnIHwgJ2V4cG9ydCc7XG5cbmludGVyZmFjZSBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucyB7XG4gIGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuICBtYXJrZXJQcmVmaXg6IHN0cmluZztcbiAgdG9vbE5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdldENvbmZpZ0NvbnRlbnRPcHRpb25zIHtcbiAgZGVzaXJlZENvbnRlbnQ6IHN0cmluZztcbiAgZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkQ29uZmlnQmxvY2tzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1hcmtlclByZWZpeDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdG9vbE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucykge1xuICAgIHRoaXMuYmxvY2tOYW1lcyA9IG9wdGlvbnMuYmxvY2tOYW1lcztcbiAgICB0aGlzLm1hcmtlclByZWZpeCA9IG9wdGlvbnMubWFya2VyUHJlZml4O1xuICAgIHRoaXMudG9vbE5hbWUgPSBvcHRpb25zLnRvb2xOYW1lO1xuICB9XG5cbiAgZ2V0Q29uZmlnQ29udGVudChvcHRpb25zOiBHZXRDb25maWdDb250ZW50T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKCFvcHRpb25zLmV4aXN0aW5nQ29udGVudCkgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gICAgaWYgKHRoaXMuaGFzTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50LCBvcHRpb25zLmRlc2lyZWRDb250ZW50LCBvcHRpb25zLmZpbGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gIH1cblxuICBnZXRCbG9jayhibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpfVxuJHtjb250ZW50fVxuJHt0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpfWA7XG4gIH1cblxuICBoYXNNYW5hZ2VkQmxvY2tzKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJsb2NrTmFtZXMuc29tZSgoYmxvY2tOYW1lKSA9PiBjb250ZW50LmluY2x1ZGVzKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQ6IHN0cmluZywgZGVzaXJlZENvbnRlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGNvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQ7XG4gICAgZm9yIChjb25zdCBibG9ja05hbWUgb2YgdGhpcy5ibG9ja05hbWVzKSB7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IHRoaXMuZXh0cmFjdE1hbmFnZWRCbG9jayhkZXNpcmVkQ29udGVudCwgYmxvY2tOYW1lKTtcbiAgICAgIGlmICghcmVwbGFjZW1lbnQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBuZXh0Q29udGVudCA9IHRoaXMucmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50LCBibG9ja05hbWUsIHJlcGxhY2VtZW50KTtcbiAgICAgIGlmICghbmV4dENvbnRlbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nIGluY29tcGxldGUgJHtibG9ja05hbWV9IGJsb2NrIGluICR7dGhpcy50b29sTmFtZX0gY29uZmlnOiAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdDb250ZW50O1xuICAgICAgfVxuICAgICAgY29udGVudCA9IG5leHRDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdE1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKS5leGVjKGNvbnRlbnQpPy5bMF07XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgcmVwbGFjZW1lbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGF0dGVybiA9IHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSk7XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IFJlZ0V4cCB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgICBgJHtlc2NhcGVSZWdFeHAodGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKX1bXFxcXHNcXFxcU10qPyR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSkpfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFydE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OnN0YXJ0ICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OmVuZCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGZtdCcsXG4gIHRvb2xOYW1lOiAnb3hmbXQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hmbXRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGZtdC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgIGZpbGVQYXRoLFxuICAgIH0pO1xuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBveGZtdEJhc2VDb25maWdNb2R1bGUgPSByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnLCAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycpO1xuXG4gIC8vIENvbW1vbkpTIHBhY2thZ2VzIG5lZWQgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cyBoZXJlOiBveGZtdCBjb25maWcgZmlsZXMgYXJlXG4gIC8vIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIHRoZSBzaGFyZWQgY29uZmlnIHBhY2thZ2UgaXMgRVNNLW9ubHkuXG4gIC8vIE5vIC8vLyA8cmVmZXJlbmNlIHR5cGVzPiBsaW5lOiB0aGUgd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcgYWxyZWFkeSBjb3ZlcnMgKi5jb25maWcudHMgd2l0aFxuICAvLyB0eXBlcyBbXCJidW5cIl0sIHdoaWNoIHR5cGVzIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMsIHdoaWxlIGEgXCJub2RlXCIgcmVmZXJlbmNlIGJyZWFrcyB1bmRlclxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIgd2hlcmUgdGhlIHVuZGVjbGFyZWQgQHR5cGVzL25vZGUgaXMgdW5yZXNvbHZhYmxlIChUUzI2ODgpLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGBpbXBvcnQgdHlwZSB7IE94Zm10Q29uZmlnIH0gZnJvbSAnb3hmbXQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hmbXQgY29uZmlnIGZpbGVzIGFyZSBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGZtdENvbmZpZyA9IHJlcXVpcmUoJyR7b3hmbXRCYXNlQ29uZmlnTW9kdWxlfScpO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnOiBPeGZtdENvbmZpZyA9IG94Zm10Q29uZmlnLmRlZmF1bHQgPz8gb3hmbXRDb25maWc7YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hmbXRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCB0eXBlIHsgT3hmbXRDb25maWcgfSBmcm9tICdveGZtdCc7XG5cbmltcG9ydCBjb25maWcgZnJvbSAnJHtveGZtdEJhc2VDb25maWdNb2R1bGV9JztcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBjb25maWc7YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQge1xuICBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UsXG4gIHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZSxcbn0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGxpbnQnLFxuICB0b29sTmFtZTogJ294bGludCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgX3Jvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94bGludENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyBjb25maWcgZmlsZXMgYXMgcHJvZHVjdCBjb2RlLCBzbyBnZW5lcmF0aW9uXG4gICAgLy8gbXVzdCBub3QgcmVwbGFjZSBwYWNrYWdlLXByb3ZpZGVkIGxpbnRlciBzZXR0aW5ncy4gR2VuZXJhdGVkIGZpbGVzIHdpdGhcbiAgICAvLyBtYW5hZ2VkIGJsb2NrcyBhcmUgc3RpbGwgc2FmZSB0byB1cGRhdGUuXG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgPSBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294bGludC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVFeGlzdGluZ0NvbnRlbnQgPVxuICAgICAgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgJiYgZXhpc3RpbmdDb250ZW50ICYmICFtYW5hZ2VkQ29uZmlnQmxvY2tzLmhhc01hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50KTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50XG4gICAgICA/IGV4aXN0aW5nQ29udGVudFxuICAgICAgOiBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICB9KTtcblxuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBpc1Jvb3RDb25maWcgPSBjb25maWcuaXNSb290O1xuICBjb25zdCBveGxpbnRCYXNlQ29uZmlnTW9kdWxlID0gcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlKGNvbmZpZywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyk7XG5cbiAgLy8gRG8gbm90IGNvbGxhcHNlIHRoaXMgdG8gYSBzdGF0aWMgaW1wb3J0IGZvciBldmVyeSBwYWNrYWdlLiBDb21tb25KUyBwYWNrYWdlc1xuICAvLyB0eXBlLWNoZWNrIGF1dG8tZGlzY292ZXJlZCBveGxpbnQuY29uZmlnLnRzIGFzIENvbW1vbkpTLCBzbyBpbXBvcnRpbmcgdGhlIEVTTVxuICAvLyBAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZyBwYWNrYWdlIHRyaWdnZXJzIFRTMTQ3OS4gS2VlcCB0aGlzIGluIHN5bmMgd2l0aFxuICAvLyBsaXRlcmFjeS10ZXN0J3MgZ2VuZXJhdGVkIGNvbmZpZyBwYXR0ZXJuLlxuICAvLyBObyAvLy8gPHJlZmVyZW5jZSB0eXBlcz4gbGluZTogdGhlIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnIGFscmVhZHkgY292ZXJzICouY29uZmlnLnRzIHdpdGhcbiAgLy8gdHlwZXMgW1wiYnVuXCJdLCB3aGljaCB0eXBlcyByZXF1aXJlL21vZHVsZS5leHBvcnRzLCB3aGlsZSBhIFwibm9kZVwiIHJlZmVyZW5jZSBicmVha3MgdW5kZXJcbiAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIHdoZXJlIHRoZSB1bmRlY2xhcmVkIEB0eXBlcy9ub2RlIGlzIHVucmVzb2x2YWJsZSAoVFMyNjg4KS5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgaW1wb3J0IHR5cGUgeyBPeGxpbnRDb25maWcgfSBmcm9tICdveGxpbnQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hsaW50IG9ubHkgYXV0by1kaXNjb3ZlcnMgLnRzIGNvbmZpZyBmaWxlcywgYW5kIENvbW1vbkpTIGF2b2lkcyBFU00gcGFja2FnZSBsb2FkaW5nIGlzc3Vlcy5cbmNvbnN0IG94bGludEJhc2VDb25maWcgPSByZXF1aXJlKCcke294bGludEJhc2VDb25maWdNb2R1bGV9Jyk7XG5cbiR7Z2V0UmVzb2x2ZWRDb25maWdDb250ZW50KCdveGxpbnRCYXNlQ29uZmlnLmRlZmF1bHQgPz8gb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgJ2Jhc2UnLFxuICAgIGBpbXBvcnQgdHlwZSB7IE94bGludENvbmZpZyB9IGZyb20gJ294bGludCc7XG5cbmltcG9ydCBveGxpbnRCYXNlQ29uZmlnIGZyb20gJyR7b3hsaW50QmFzZUNvbmZpZ01vZHVsZX0nO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG59XG5cbi8vIHN0cnVjdHVyZWRDbG9uZSBrZWVwcyBhIHBhY2thZ2UtbG9jYWwgY29weSBzbyByZXBvc2l0b3JpZXMgY2FuIGFkZCBzZXR0aW5ncyBvdXRzaWRlIG1hbmFnZWRcbi8vIGJsb2NrcyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgaW1wb3J0ZWQgY29uZmlnIG9iamVjdC4gVGhlIHJvb3QgY29uZmlnIGZvcmNlcyB0aGUgdHlwZS1hd2FyZVxuLy8gb3B0aW9ucyBvbiBpbnNpZGUgdGhlIG1hbmFnZWQgYmxvY2sgc28gbm8gY3VzdG9taXphdGlvbiBjYW4gc2lsZW50bHkgZGlzYWJsZSB0eXBlIGNoZWNraW5nOyBldmVyeVxuLy8gb3RoZXIgY29uZmlnIGRlbGV0ZXMgdGhlbSBiZWNhdXNlIE94bGludCByZWplY3RzIHRob3NlIHJvb3Qtb25seSBvcHRpb25zIGVsc2V3aGVyZSAodHlwZSBjaGVja2luZ1xuLy8gc3Vydml2ZXM6IHRoZSBsaW50IGNvbW1hbmRzIHBhc3MgLS10eXBlLWF3YXJlIGFuZCAtLXR5cGUtY2hlY2sgZXhwbGljaXRseSkuXG5mdW5jdGlvbiBnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoYmFzZUNvbmZpZ05hbWU6IHN0cmluZywgaXNSb290Q29uZmlnOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzUm9vdENvbmZpZykge1xuICAgIHJldHVybiBgY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWc6IE94bGludENvbmZpZyA9IHN0cnVjdHVyZWRDbG9uZSgke2Jhc2VDb25maWdOYW1lfSk7XG5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zID0geyAuLi5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zLCB0eXBlQXdhcmU6IHRydWUsIHR5cGVDaGVjazogdHJ1ZSB9O2A7XG4gIH1cblxuICByZXR1cm4gYGNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xuZGVsZXRlIG94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnM7YDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncHlyaWdodGNvbmZpZy5qc29uJyk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb3JpZ2luYWxTZXR0aW5nc0pzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KG9sZENvbnRlbnQpKSB7XG4gICAgICAvLyBweXJpZ2h0Y29uZmlnLmpzb24gYWxsb3dzIEpTT05DOyBhbiBleGlzdGluZyBmaWxlIHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdFxuICAgICAgLy8gdW50b3VjaGVkIGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgYmFyZSB0ZW1wbGF0ZS5cbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KG9sZENvbnRlbnQpO1xuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUob2xkU2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfVxuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHB5cmlnaHRjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAob3JpZ2luYWxTZXR0aW5nc0pzb24gPT09IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShuZXdTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjb25zdW1lc0RvY2tlckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBtYW5hZ2VkU2NyaXB0c0Jsb2NrID0gYHNjcmlwdHMvKipcbiFzY3JpcHRzL1xuIXNjcmlwdHMvKi5zaGA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhSYWlsd2F5aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFJhaWx3YXlpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmFpbHdheWlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3QgdXNlc0RvY2tlckVudiA9IGNvbnN1bWVzRG9ja2VyRW52KGNvbmZpZy5kb2NrZXJmaWxlKTtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIGlmIChjb25maWcuaXNSYWlsd2F5ICYmIHVzZXNEb2NrZXJFbnYpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsICchLmRvY2tlci5lbnZcXG4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL15zY3JpcHRzXFwvJC9tLCBtYW5hZ2VkU2NyaXB0c0Jsb2NrKTtcbiAgICAvLyBgcmFpbHdheSB1cGAgc3RyaXBzIGdpdGlnbm9yZWQgZmlsZXMgZnJvbSB0aGUgdXBsb2FkZWQgYnVpbGQgY29udGV4dCwgc28gdGhlIGdlbmVyYXRlZFxuICAgIC8vIG5vbi1zZWNyZXQgLmRvY2tlci5lbnYgKGB3YiBnZW4tZG9ja2VyLWVudmAgb3V0cHV0KSBuZWVkcyBhbiBleHBsaWNpdCB1bi1pZ25vcmUgdG8gcmVhY2hcbiAgICAvLyB0aGUgcmVtb3RlIERvY2tlciBidWlsZC4gQXBwZW5kZWQsIG5vdCBwcmVwZW5kZWQ6IGlnbm9yZSBmaWxlcyBhcmUgbGFzdC1tYXRjaC13aW5zLCBzbyBhXG4gICAgLy8gaGFuZC13cml0dGVuIHBhdHRlcm4gc3VjaCBhcyBgKi5lbnZgIGVhcmxpZXIgaW4gdGhlIGZpbGUgbXVzdCBub3Qgc2lsZW50bHkgcmUtZXhjbHVkZSBpdC5cbiAgICBpZiAodXNlc0RvY2tlckVudiAmJiAhL14hXFwuZG9ja2VyXFwuZW52JC9tLnRlc3QobmV3Q29udGVudCkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBgJHtuZXdDb250ZW50LnJlcGxhY2UoL1xcbj8kLywgJ1xcbicpfSEuZG9ja2VyLmVudlxcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9ja2VyZmlsZSAmJiAhdXNlc0RvY2tlckVudikge1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXiFcXC5kb2NrZXJcXC5lbnZcXG4/L20sICcnKTtcbiAgICB9XG4gICAgaWYgKG5ld0NvbnRlbnQgPT09IGNvbnRlbnQpIHJldHVybjtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgbmV3Q29udGVudCA/IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpIDogZnNVdGlsLnJlbW92ZUNvbmZpbmVkKGZpbGVQYXRoKVxuICAgICk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBJbWFnZSwgTGluaywgUGFyYWdyYXBoLCBQaHJhc2luZ0NvbnRlbnQsIFJvb3RDb250ZW50IH0gZnJvbSAnbWRhc3QnO1xuaW1wb3J0IHsgZnJvbU1hcmtkb3duIH0gZnJvbSAnbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmNvbnN0IHdiZnlCYWRnZVVybFByZWZpeCA9ICdodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL3diZnktJztcbmNvbnN0IHdiZnlCYWRnZVVybFN1ZmZpeCA9ICctMWU5MGZmLnN2Zyc7XG5jb25zdCB3YmZ5QmFkZ2VMaW5rID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvdHJlZS9tYWluL3BhY2thZ2VzL3diZnknO1xuXG5jb25zdCBucG1QYWNrYWdlVXJsUHJlZml4ID0gJ2h0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlLyc7XG5jb25zdCBucG1MaWNlbnNlQmFkZ2VQYXR0ZXJuID0gL15cXFshXFxbW15cXF1dKlxcXVxcKGh0dHBzOlxcL1xcL2ltZ1xcLnNoaWVsZHNcXC5pb1xcL25wbVxcL2xcXC9bXilcXHNdK1xcKVxcXVxcKFteKVxcc10rXFwpJC91O1xuXG5jb25zdCBtYW5hZ2VkQmFkZ2VQYXR0ZXJucyA9IFtcbiAgL15cXFshXFxbd2JmeVxcXVxcKGh0dHBzOlxcL1xcL2ltZ1xcLnNoaWVsZHNcXC5pb1xcL2JhZGdlXFwvd2JmeS1bXilcXHNdKy0xZTkwZmZcXC5zdmdcXClcXF1cXChodHRwczpcXC9cXC9naXRodWJcXC5jb21cXC9XaWxsQm9vc3RlclxcL3NoYXJlZFxcL3RyZWVcXC9tYWluXFwvcGFja2FnZXNcXC93YmZ5XFwpJC91LFxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoKGh0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcL1teKVxcc10rXFwvYWN0aW9uc1xcL3dvcmtmbG93c1xcL1teKVxcc10rKVxcL2JhZGdlXFwuc3ZnXFwpXFxdXFwoXFwxXFwpJC91LFxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoW14pXFxzXStcXClcXF1cXChodHRwcz86XFwvXFwvKD86d3d3XFwuKT9ucG1qc1xcLmNvbVxcL3BhY2thZ2VcXC9bXilcXHNdKlxcKSQvdSxcbiAgbnBtTGljZW5zZUJhZGdlUGF0dGVybixcbl07XG5cbmZ1bmN0aW9uIGJ1aWxkV2JmeUJhZGdlKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIeXBoZW5zIGFyZSBlc2NhcGVkIGFzIGAtLWAgcGVyIHNoaWVsZHMuaW8ncyBiYWRnZSBwYXRoIHN5bnRheCwgc28gYHYxLjIuMy1yYy4xYCBzdGF5cyBpbnRhY3QuXG4gIHJldHVybiBgWyFbd2JmeV0oJHt3YmZ5QmFkZ2VVcmxQcmVmaXh9JHtsYWJlbC5yZXBsYWNlQWxsKCctJywgJy0tJyl9JHt3YmZ5QmFkZ2VVcmxTdWZmaXh9KV0oJHt3YmZ5QmFkZ2VMaW5rfSlgO1xufVxuXG4vKiogVGhlIHZlcnNpb24gbGFiZWwgdGhlIHdiZnkgYmFkZ2UgaW4gdGhlIHJlcG9zaXRvcnkncyBSRUFETUUgcmVjb3JkcywgaS5lLiB0aGUgYnVpbGQgdGhhdCB3YmZpZWQgaXQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIC8vIENvbmZpbmVkLCBhbmQgdG9sZXJhbnQgb2YgYW55IHJlYWQgZmFpbHVyZTogYSBSRUFETUUgdGhhdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IChhXG4gIC8vIGNvbW1pdHRlZCBzeW1saW5rKSBvciBjYW5ub3QgYmUgcmVhZCBhdCBhbGwgc2F5cyBub3RoaW5nIGFib3V0IHdoaWNoIGJ1aWxkIGNvbmZpZ3VyZWQgVEhJU1xuICAvLyByZXBvc2l0b3J5LCBhbmQgdGhlIGFuc3dlciBvbmx5IGV2ZXIgc3VwcHJlc3NlcyB3b3JrIOKAlCBzbyBhbnl0aGluZyBidXQgYSByZWFkYWJsZSBpbi1yZXBvc2l0b3J5XG4gIC8vIFJFQURNRSBtZWFucyBcIm5vdCBrbm93biB0byBiZSBhcHBsaWVkXCIgYW5kIHRoZSBydW4gcHJvY2VlZHMuXG4gIGNvbnN0IHJlYWRtZSA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdSRUFETUUubWQnKSkuY2F0Y2goKCkgPT4ge30pO1xuICBpZiAocmVhZG1lID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFJFQURNRSBpcyBwYXJzZWQgcmF0aGVyIHRoYW4gc2Nhbm5lZCwgZm9yIHRoZSBzYW1lIHJlYXNvbiB3cml0ZUJhZGdlQmxvY2sgcGFyc2VzIGl0LCBhbmRcbiAgLy8gb25seSB0aGUgc2hhcGUgd3JpdGVCYWRnZUJsb2NrIGl0c2VsZiB3cml0ZXMgY291bnRzIGFzIGFuIGFwcGxpZWQgYmFkZ2U6IGEgdG9wLWxldmVsIHBhcmFncmFwaFxuICAvLyBvZiBiYWRnZXMuIEEgYmFkZ2UgYW55d2hlcmUgZWxzZSBpcyBjb250ZW50IHRoYXQgbWVyZWx5IG1lbnRpb25zIG9uZSDigJQgYSBmZW5jZWQgZXhhbXBsZSAod2JmeSdzXG4gIC8vIG93biBkb2N1bWVudGF0aW9uIGhhcyB0aG9zZSksIGEgYmxvY2sgcXVvdGUsIGEgbGlzdCBpdGVtIOKAlCBhbmQgcmVhZGluZyBpdCBhcyBhcHBsaWVkIHdvdWxkIHNraXBcbiAgLy8gZXZlcnkgZml4ZXIgZm9yIHRoZSByZXBvc2l0b3J5LlxuICBmb3IgKGNvbnN0IG5vZGUgb2YgZnJvbU1hcmtkb3duKHJlYWRtZSkuY2hpbGRyZW4pIHtcbiAgICBpZiAoIWlzQmFkZ2VCbG9ja05vZGUobm9kZSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgYmFkZ2Ugb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKCFpc0JhZGdlTm9kZShiYWRnZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyB1cmwgfSA9IGJhZGdlLmNoaWxkcmVuWzBdO1xuICAgICAgaWYgKHVybC5zdGFydHNXaXRoKHdiZnlCYWRnZVVybFByZWZpeCkgJiYgdXJsLmVuZHNXaXRoKHdiZnlCYWRnZVVybFN1ZmZpeCkpIHtcbiAgICAgICAgcmV0dXJuIHVybC5zbGljZSh3YmZ5QmFkZ2VVcmxQcmVmaXgubGVuZ3RoLCAtd2JmeUJhZGdlVXJsU3VmZml4Lmxlbmd0aCkucmVwbGFjZUFsbCgnLS0nLCAnLScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICAvLyBUaGUgd2JmeSBiYWRnZSBtYXJrcyBhIHJlcG9zaXRvcnkgYXMgd2JmaWVkLCBzbyBhIHJlcG9zaXRvcnkgd2l0aG91dCBhIFJFQURNRSBzdGlsbCBnZXRzIG9uZS5cbiAgICAvLyByZWFkRmlsZUlmRXhpc3RzIGZhbGxzIGJhY2sgT05MWSBvbiBFTk9FTlQ6IGEgUkVBRE1FIHRoYXQgZXhpc3RzIGJ1dCBjYW5ub3QgYmUgcmVhZCAoZS5nLlxuICAgIC8vIHBlcm1pc3Npb25zLCBFTUZJTEUpIG11c3QgYWJvcnQgdGhlIGdlbmVyYXRvciBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggdGhlIHN0dWIuXG4gICAgbGV0IG5ld0NvbnRlbnQgPVxuICAgICAgKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz9cbiAgICAgIGAjICR7Y29uZmlnLnBhY2thZ2VKc29uPy5uYW1lID8/IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKSl9XFxuYDtcblxuICAgIC8vIE9yZGVyZWQgYnkgd2hhdCBhIHJlYWRlciBjYXJlcyBhYm91dCBtb3N0OiB0aGUgbnBtIGJhZGdlIG5hbWVzIHRoZSBwYWNrYWdlIGEgcmVhZGVyIGluc3RhbGxzLFxuICAgIC8vIHRoZW4gdGhlIHdvcmtmbG93IGJhZGdlcyByZXBvcnQgd2hldGhlciB0aGUgY29kZSBpcyBjdXJyZW50bHkgaGVhbHRoeSwgdGhlbiBob3cgaXQgaXNcbiAgICAvLyByZWxlYXNlZCwgYW5kIGxhc3QgdGhlIHdiZnkgYnVpbGQgdGhhdCBjb25maWd1cmVkIGl0LlxuICAgIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGF3YWl0IGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZyk7XG4gICAgaWYgKHBhY2thZ2VOYW1lKSB7XG4gICAgICBiYWRnZXMucHVzaChidWlsZE5wbUJhZGdlKHBhY2thZ2VOYW1lKSk7XG4gICAgICBjb25zdCBsaWNlbnNlID0gY29uZmlnLnBhY2thZ2VKc29uPy5saWNlbnNlO1xuICAgICAgaWYgKGxpY2Vuc2UgJiYgbGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnKSB7XG4gICAgICAgIGJhZGdlcy5wdXNoKGJ1aWxkTGljZW5zZUJhZGdlKHBhY2thZ2VOYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGJhZGdlcy5wdXNoKC4uLihhd2FpdCBidWlsZFdvcmtmbG93QmFkZ2VzKGNvbmZpZykpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIGJhZGdlcy5wdXNoKHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICBiYWRnZXMucHVzaChidWlsZFdiZnlCYWRnZShnZXRXYmZ5VmVyc2lvbkxhYmVsKCkgPz8gJ2FwcGxpZWQnKSk7XG5cbiAgICAvLyBUaGUgYmxvY2sgaXMgd3JpdHRlbiBpbiBvbmUgcGFzcyBmcm9tIHRoZSBiYWRnZXMgd2JmeSBtYW5hZ2VzIHJpZ2h0IG5vdy4gQSBiYWRnZSB0aGF0IGlzIG5vXG4gICAgLy8gbG9uZ2VyIHdhbnRlZCDigJQgYSBzdXBlcnNlZGVkIHZlcnNpb24sIG9yIG9uZSB3aG9zZSB3b3JrZmxvdyBpcyBnb25lIOKAlCBzaW1wbHkgaXMgbm90IGluIHRoZVxuICAgIC8vIGxpc3QsIHNvIG5vdGhpbmcgaGFzIHRvIHJlbW92ZSBpdC5cbiAgICBuZXdDb250ZW50ID0gd3JpdGVCYWRnZUJsb2NrKG5ld0NvbnRlbnQsIGJhZGdlcyk7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCwgZ2V0TGluZUVuZGluZyhuZXdDb250ZW50KSkpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGlzaGVkTnBtUGFja2FnZU5hbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBjb25maWcucGFja2FnZUpzb247XG4gIC8vIEEgbW9ub3JlcG8gaGFzIG5vIHNpbmdsZSBucG0gdmVyc2lvbiByZXByZXNlbnRpbmcgdGhlIHdob2xlIHJlcG9zaXRvcnkuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgfHwgIWNvbmZpZy5yZWxlYXNlLm5wbSB8fCAhcGFja2FnZUpzb24/Lm5hbWUgfHwgcGFja2FnZUpzb24ucHJpdmF0ZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIChhd2FpdCBpc01pc3NpbmdGcm9tTnBtUmVnaXN0cnkocGFja2FnZUpzb24ubmFtZSkpID8gdW5kZWZpbmVkIDogcGFja2FnZUpzb24ubmFtZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZWdpc3RyeSBhbnN3ZXJzIHRoYXQgaXQgaGFzIG5vIHN1Y2ggcGFja2FnZSDigJQgdGhlIE9OTFkgYW5zd2VyIHRoYXQgcmVtb3ZlcyBhIGJhZGdlLlxuICogQSBjaGVjayB0aGF0IGNhbm5vdCBydW4gKG9mZmxpbmUsIGFuIG91dGFnZSwgYSB0aW1lb3V0KSBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHBhY2thZ2UsIGFuZFxuICogdHJlYXRpbmcgaXQgYXMgYWJzZW50IHdvdWxkIHN0cmlwIHRoZSBiYWRnZSBvdXQgb2YgZXZlcnkgcHVibGlzaGVkIHJlcG9zaXRvcnkgd2JmeSB0b3VjaGVzXG4gKiBkdXJpbmcgdGhlIG91dGFnZSBhbmQgcHV0IGl0IGJhY2sgYWZ0ZXJ3YXJkcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNNaXNzaW5nRnJvbU5wbVJlZ2lzdHJ5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICAvLyBUaGUgc2NvcGUgc2VwYXJhdG9yIG11c3Qgc3Vydml2ZSBhcyBhIHBhdGggc2VnbWVudCwgc28gdGhlIG5hbWUgaXMgZW5jb2RlZCBwaWVjZXdpc2UuXG4gICAgY29uc3QgZW5jb2RlZE5hbWUgPSBwYWNrYWdlTmFtZS5zcGxpdCgnLycpLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJy8nKTtcbiAgICAvLyBBIGJhZGdlIGlzIGRlY29yYXRpb246IGEgc3RhbGxlZCByZWdpc3RyeSBjb25uZWN0aW9uIG11c3Qgbm90IGhvbGQgdGhlIHdob2xlIHJ1biBmb3IgaG93ZXZlclxuICAgIC8vIGxvbmcgdGhlIG5ldHdvcmtpbmcgc3RhY2sgd291bGQgd2FpdC4gVGhlIGJ1ZGdldCBpcyBnZW5lcm91cyBiZWNhdXNlIGEgdGltZW91dCBhbnN3ZXJzXG4gICAgLy8gXCJ1bmtub3duXCIsIHdoaWNoIGtlZXBzIHRoZSBiYWRnZSDigJQgYW5kIG9uIGEgcmVwb3NpdG9yeSB0aGF0IGlzIG5vdCBvbiBucG0gdGhhdCBtZWFucyB3cml0aW5nXG4gICAgLy8gb25lIGl0IHNob3VsZCBub3QgaGF2ZTsgYSB3YmZ5IHJ1biBhbHJlYWR5IHNwZW5kcyBtaW51dGVzIG9uIGluc3RhbGxzLCBzbyB3YWl0aW5nIGEgbGl0dGxlXG4gICAgLy8gbG9uZ2VyIGZvciBhIHJlYWwgYW5zd2VyIGNvc3RzIGxlc3MgdGhhbiBhY3Rpbmcgb24gYSBtaXNzaW5nIG9uZS5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy8ke2VuY29kZWROYW1lfWAsIHtcbiAgICAgIG1ldGhvZDogJ0hFQUQnLFxuICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDEwXzAwMCksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGROcG1CYWRnZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBbIVtucG0gdmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9ucG0vdi8ke3BhY2thZ2VOYW1lfS5zdmcpXSgke25wbVBhY2thZ2VVcmxQcmVmaXh9JHtwYWNrYWdlTmFtZX0pYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRMaWNlbnNlQmFkZ2UocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgWyFbbGljZW5zZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9ucG0vbC8ke3BhY2thZ2VOYW1lfS5zdmcpXSgke25wbVBhY2thZ2VVcmxQcmVmaXh9JHtwYWNrYWdlTmFtZX0pYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRXb3JrZmxvd0JhZGdlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICBpZiAoIXJlcG9zaXRvcnkgfHwgIWZzLmV4aXN0c1N5bmMod29ya2Zsb3dzUGF0aCkpIHJldHVybiBbXTtcblxuICAvLyBXb3JrZmxvdyBhbmQgUkVBRE1FIGdlbmVyYXRpb24gcnVuIGNvbmN1cnJlbnRseS4gRG8gbm90IHJldGFpbiBhIHN0YWxlIFJ1c3QgYmFkZ2Ugd2hpbGUgdGhlXG4gIC8vIHdvcmtmbG93IGdlbmVyYXRvciByZW1vdmVzIGEgY2FsbGVyIGNyZWF0ZWQgZnJvbSBhIGZvcm1lcmx5IG1pc2RldGVjdGVkIGxvY2FsIGNhY2hlIOKAlCBidXRcbiAgLy8gbWlycm9yIGl0cyBvd25lcnNoaXAgY2hlY2s6IGEgY3VzdG9tIHNhbWUtbmFtZWQgd29ya2Zsb3cgc3Vydml2ZXMsIHNvIGl0cyBiYWRnZSBtdXN0IHRvby5cbiAgLy8gRGVjaWRlZCBzeW5jaHJvbm91c2x5IGJlZm9yZSB0aGUgbG9vcCdzIGZpcnN0IGF3YWl0OiB0aGUgZ2VuZXJhdG9yJ3MgZGVsZXRlIGNhbiBvbmx5IGxhbmQgYXRcbiAgLy8gYW4gYXdhaXQgcG9pbnQsIGFuZCBhIHBvc3QtZGVsZXRlIHJlYWQgd291bGQgbWlzcmVwb3J0IHRoZSB3YmZ5LW93bmVkIGNhbGxlciBhcyBjdXN0b20uXG4gIC8vIE5vIGV4aXN0c1N5bmMgcHJlLWNoZWNrOiB0aGUgaGVscGVyIGFscmVhZHkgdHJlYXRzIGEgbWlzc2luZyBmaWxlIGFzIG5vdCBvd25lZCwgYW5kIHRoaXMgcnVuc1xuICAvLyBvbmNlIHBlciByZXBvc2l0b3J5LCBzbyB0aGUgZXhjZXB0aW9uYWwgRU5PRU5UIHJlYWQgY29zdHMgbm90aGluZyB3b3J0aCBhIHJlZHVuZGFudCBzdGF0LlxuICBjb25zdCBkcm9wc1Rlc3RSdXN0QmFkZ2UgPVxuICAgIGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDAgJiYgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93KHdvcmtmbG93c1BhdGgsICd0ZXN0LXJ1c3QueW1sJywgJ3Rlc3QtcnVzdCcpO1xuXG4gIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKSkge1xuICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG4gICAgaWYgKGZpbGVOYW1lID09PSAndGVzdC1ydXN0LnltbCcgJiYgZHJvcHNUZXN0UnVzdEJhZGdlKSBjb250aW51ZTtcbiAgICAvLyBHaXRIdWIncyBiYWRnZSBlbmRwb2ludCByZXR1cm5zIDQwNCB1bnRpbCB0aGUgd29ya2Zsb3cgaGFzIGF0IGxlYXN0IG9uZSBydW4sIHNvIGEgYmFkZ2UgZm9yIGFcbiAgICAvLyBkaXNwYXRjaC1vbmx5IGRlcGxveSB3b3JrZmxvdyB0aGF0IGhhcyBuZXZlciBydW4gcmVuZGVycyBhcyBhIGJyb2tlbiBpbWFnZS4gVGVzdCB3b3JrZmxvd3MgcnVuXG4gICAgLy8gb24gZXZlcnkgUFIsIHNvIG9ubHkgZGVwbG95IGJhZGdlcyBuZWVkIHRoZSBndWFyZC5cbiAgICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgIShhd2FpdCBoYXNBbnlXb3JrZmxvd1J1bihyZXBvc2l0b3J5LCBmaWxlTmFtZSwgY29uZmlnLmlzUHVibGljUmVwbykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYmFkZ2VOYW1lID0gKGZpbGVOYW1lWzBdID8/ICcnKS50b1VwcGVyQ2FzZSgpICsgZmlsZU5hbWUuc2xpY2UoMSwgZmlsZU5hbWUuaW5kZXhPZignLicpKS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICBjb25zdCB3b3JrZmxvd1VybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2VuY29kZVVybFBhdGgoZmlsZU5hbWUpfWA7XG4gICAgYmFkZ2VzLnB1c2goYFshWyR7YmFkZ2VOYW1lfV0oJHt3b3JrZmxvd1VybH0vYmFkZ2Uuc3ZnKV0oJHt3b3JrZmxvd1VybH0pYCk7XG4gIH1cbiAgcmV0dXJuIGJhZGdlcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFzQW55V29ya2Zsb3dSdW4oXG4gIHJlcG9zaXRvcnk6IHN0cmluZyxcbiAgd29ya2Zsb3dGaWxlTmFtZTogc3RyaW5nLFxuICBpc1B1YmxpY1JlcG86IGJvb2xlYW5cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gcmVwb3NpdG9yeS5zcGxpdCgnLycpO1xuICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm4gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQob3duZXIpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9ydW5zJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgd29ya2Zsb3dfaWQ6IHdvcmtmbG93RmlsZU5hbWUsXG4gICAgICBwZXJfcGFnZTogMSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS50b3RhbF9jb3VudCA+IDA7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRm9yIGEgUFVCTElDIHJlcG9zaXRvcnkgdGhlIHJ1bnMgZW5kcG9pbnQgbmVlZHMgbm8gYXV0aG9yaXphdGlvbiwgc28gNDA0IHJlbGlhYmx5IG1lYW5zIHRoZVxuICAgIC8vIHdvcmtmbG93IGlzIGFic2VudCBmcm9tIHRoZSByZW1vdGUgKGUuZy4gYWRkZWQgbG9jYWxseSwgbmV2ZXIgcHVzaGVkKSDigJQgbGlrZSB6ZXJvIHJ1bnMsIGl0c1xuICAgIC8vIGJhZGdlIHdvdWxkIHJlbmRlciBicm9rZW4uIEZvciBhIFBSSVZBVEUgcmVwb3NpdG9yeSBHaXRIdWIgYWxzbyBhbnN3ZXJzIDQwNCB3aGVuIHRoZSB0b2tlblxuICAgIC8vIGlzIG1pc3Npbmcgb3IgdW5kZXItc2NvcGVkLCBzbyA0MDQgaXMgYW1iaWd1b3VzIHRoZXJlIGFuZCB0aGUgYmFkZ2UgaXMga2VwdC5cbiAgICBpZiAoKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cyA9PT0gNDA0ICYmIGlzUHVibGljUmVwbykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIEtlZXAgdGhlIHByZS1ndWFyZCBiZWhhdmlvciAoaW5zZXJ0IHRoZSBiYWRnZSkgd2hlbiB0aGUgY2hlY2sgaXRzZWxmIGNhbm5vdCBydW4uXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXBsYWNlcyB0aGUgYmFkZ2UgYmxvY2tzIGRpcmVjdGx5IHVuZGVyIHRoZSB0aXRsZSB3aXRoIGBtYW5hZ2VkQmFkZ2VzYCwga2VlcGluZyBhbnkgYmFkZ2UgdGhlcmVcbiAqIHRoYXQgd2JmeSBkb2VzIG5vdCBtYW5hZ2UsIGFuZCByZWFzc2VtYmxlcyB0aGUgUkVBRE1FIGFyb3VuZCB0aGVtIHdpdGggZXhhY3RseSBvbmUgYmxhbmsgbGluZSBvblxuICogZWFjaCBzaWRlLlxuICpcbiAqIEJvdGggdGhlIHRpdGxlIGFuZCB0aGUgYmxvY2sgYXJlIGxvY2F0ZWQgaW4gYSBDb21tb25NYXJrIHN5bnRheCB0cmVlIHJhdGhlciB0aGFuIGJ5IHNjYW5uaW5nXG4gKiBsaW5lczogb25seSBhIHJlYWwgcGFyc2VyIGtub3dzIHdoZXRoZXIgYSBsaW5lIHRoYXQgbG9va3MgbGlrZSBhIGJhZGdlIGlzIGEgYmFkZ2UgKGEgcGFyYWdyYXBoIG9mXG4gKiBsaW5rZWQgaW1hZ2VzKSBvciBjb250ZW50IHRoYXQgbWVyZWx5IHJlYWRzIGxpa2Ugb25lIChhbiBpbmRlbnRlZCBjb2RlIGJsb2NrLCBhIGJsb2NrIHF1b3RlLCBhXG4gKiBmZW5jZWQgZXhhbXBsZSwgYSBtdWx0aWxpbmUgY29kZSBzcGFuLCBhbiBIVE1MIGJsb2NrKS4gRXZlcnl0aGluZyBvdXRzaWRlIHRoZSBibG9jayBpcyBjb3BpZWQgYmFja1xuICogdmVyYmF0aW0gZnJvbSB0aGUgb3JpZ2luYWwgdGV4dCB0aHJvdWdoIHRoZSBwYXJzZXIncyBwb3NpdGlvbmFsIG9mZnNldHMsIHNvIG5vIHJlZm9ybWF0dGluZyBvZiB0aGVcbiAqIHVzZXIncyBjb250ZW50IGlzIHBvc3NpYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVCYWRnZUJsb2NrKHJlYWRtZTogc3RyaW5nLCBtYW5hZ2VkQmFkZ2VzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVFbmRpbmcgPSBnZXRMaW5lRW5kaW5nKHJlYWRtZSk7XG4gIC8vIEEgQk9NIGlzIG5vdCBNYXJrZG93bjogbGVmdCBpbiB0aGUgdGV4dCBpdCBoaWRlcyB0aGUgYCNgIG9mIHRoZSB0aXRsZSBmcm9tIHRoZSBwYXJzZXIsIGFuZFxuICAvLyBwcmVwZW5kaW5nIHRoZSBibG9jayBhaGVhZCBvZiBpdCB3b3VsZCBzdHJpcCB0aGUgbWFya2VyIGZyb20gdGhlIGZpbGUncyBmaXJzdCBieXRlLlxuICBjb25zdCBieXRlT3JkZXJNYXJrID0gcmVhZG1lLnN0YXJ0c1dpdGgoJ++7vycpID8gJ++7vycgOiAnJztcbiAgLy8gRnJvbnQgbWF0dGVyIGlzIGRlbGltaXRlZCBieSB0aGUgc2FtZSBgLS0tYCBhIFNldGV4dCBoZWFkaW5nIGFuZCBhIHRoZW1hdGljIGJyZWFrIHVzZSwgc28gaXQgaXNcbiAgLy8gZGV0YWNoZWQgYmVmb3JlIHBhcnNpbmcgaW5zdGVhZCBvZiBiZWluZyB0b2xkIGFwYXJ0IGFmdGVyd2FyZHM7IGl0IGFsc28gaGFzIHRvIHN0YXkgZmlyc3QgaW4gdGhlXG4gIC8vIGZpbGUsIHdoaWNoIG1ha2VzIGl0IGEgcHJlZml4IGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IHRoZSBCT00gaXMuXG4gIGNvbnN0IHdpdGhvdXRNYXJrID0gcmVhZG1lLnNsaWNlKGJ5dGVPcmRlck1hcmsubGVuZ3RoKTtcbiAgY29uc3QgZnJvbnRNYXR0ZXIgPSB3aXRob3V0TWFyay5zdGFydHNXaXRoKCctLS0nKVxuICAgID8gKC9eLS0tWyBcXHRdKlxccj9cXG5bXFxzXFxTXSo/Xi0tLVsgXFx0XSooPzpcXHI/XFxufCQpL211LmV4ZWMod2l0aG91dE1hcmspPy5bMF0gPz8gJycpXG4gICAgOiAnJztcbiAgY29uc3QgcHJlZml4ID0gYCR7Ynl0ZU9yZGVyTWFya30ke2Zyb250TWF0dGVyfWA7XG4gIC8vIFRoZSBmaW5hbCBuZXdsaW5lIGlzIHNldCBhc2lkZSByYXRoZXIgdGhhbiBwYXJzZWQgYXMgdHJhaWxpbmcgYmxhbmsgc3BhY2UsIHdoaWNoIHRoZSBibGFuay1saW5lXG4gIC8vIHRyaW1taW5nIGJlbG93IHdvdWxkIG90aGVyd2lzZSBzd2FsbG93LlxuICBjb25zdCBlbmRzV2l0aE5ld2xpbmUgPSAvXFxyP1xcbiQvdS50ZXN0KHJlYWRtZSk7XG4gIGNvbnN0IGNvbnRlbnQgPSB3aXRob3V0TWFyay5zbGljZShmcm9udE1hdHRlci5sZW5ndGgpLnJlcGxhY2UoL1xccj9cXG4kL3UsICcnKTtcblxuICBjb25zdCBub2RlcyA9IGZyb21NYXJrZG93bihjb250ZW50KS5jaGlsZHJlbjtcbiAgLy8gQSBsZWFkaW5nIGJhZGdlIGJsb2NrIGlzIHRoZSB1c2VyJ3Mgb3duIGxheW91dDogaXQgc3RheXMgYWJvdmUgdGhlIHRpdGxlLCBhbmQgd2JmeSdzIGJsb2NrIGdvZXMgYmVsb3cuXG4gIGNvbnN0IGtlZXBzTGVhZGluZ0Jsb2NrID0gISFub2Rlc1swXSAmJiBpc0JhZGdlQmxvY2tOb2RlKG5vZGVzWzBdKSAmJiBpc1RpdGxlTm9kZShub2Rlc1sxXSk7XG4gIGNvbnN0IHRpdGxlSW5kZXggPSBrZWVwc0xlYWRpbmdCbG9jayA/IDEgOiBpc1RpdGxlTm9kZShub2Rlc1swXSkgPyAwIDogLTE7XG4gIC8vIFdpdGhvdXQgYSByZWNvZ25pemFibGUgdGl0bGUgdGhlIGJsb2NrIHNpdHMgYXQgdGhlIHZlcnkgdG9wLCBhYm92ZSBldmVyeXRoaW5nLlxuICBjb25zdCBoZWFkU3RhcnROb2RlID0ga2VlcHNMZWFkaW5nQmxvY2sgPyBub2Rlc1swXSEgOiBub2Rlc1t0aXRsZUluZGV4XTtcbiAgY29uc3QgaGVhZCA9XG4gICAgdGl0bGVJbmRleCA9PT0gLTFcbiAgICAgID8gJydcbiAgICAgIDogY29udGVudC5zbGljZShzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudCwgaGVhZFN0YXJ0Tm9kZSEpLCBub2Rlc1t0aXRsZUluZGV4XSEucG9zaXRpb24hLmVuZC5vZmZzZXQpO1xuXG4gIGNvbnN0IGJhZGdlQmxvY2tOb2RlczogUGFyYWdyYXBoW10gPSBbXTtcbiAgZm9yIChsZXQgbm9kZUluZGV4ID0gdGl0bGVJbmRleCArIDE7IDsgbm9kZUluZGV4KyspIHtcbiAgICBjb25zdCBub2RlID0gbm9kZXNbbm9kZUluZGV4XTtcbiAgICBpZiAoIWlzQmFkZ2VCbG9ja05vZGUobm9kZSkpIGJyZWFrO1xuICAgIGJhZGdlQmxvY2tOb2Rlcy5wdXNoKG5vZGUpO1xuICAgIC8vIFdpdGhvdXQgYSB0aXRsZSwgbWVyZ2luZyBsZWFkaW5nIGJsb2NrcyBjb3VsZCBjaGFuZ2Ugd2hpY2ggbm9kZSBpcyByZWNvZ25pemVkIGFzIHRoZSB0aXRsZSBvbiB0aGUgbmV4dCBydW4uXG4gICAgaWYgKHRpdGxlSW5kZXggPT09IC0xKSBicmVhaztcbiAgfVxuICBjb25zdCBleGlzdGluZyA9IGJhZGdlQmxvY2tOb2Rlcy5mbGF0TWFwKChub2RlKSA9PiByZWFkQmFkZ2VzKG5vZGUsIGNvbnRlbnQpKTtcbiAgY29uc3QgYm9keU5vZGUgPSBub2Rlc1t0aXRsZUluZGV4ICsgMSArIGJhZGdlQmxvY2tOb2Rlcy5sZW5ndGhdO1xuICBjb25zdCBib2R5ID0gYm9keU5vZGUgPyBjb250ZW50LnNsaWNlKHN0YXJ0T2Zmc2V0V2l0aEluZGVudChjb250ZW50LCBib2R5Tm9kZSkpIDogJyc7XG5cbiAgLy8gU3VwZXJzZWRpbmcgYSBtYW5hZ2VkIGJhZGdlIGlzIGp1c3QgZHJvcHBpbmcgdGhlIG9sZCBvbmU6IGEgdmVyc2lvbiwgd29ya2Zsb3csIG5wbSwgb3IgbGljZW5zZVxuICAvLyBjaGFuZ2UgbGVhdmVzIG5vIHN0YWxlIGNvcHksIHdoaWxlIGFueSBvdGhlciBiYWRnZSBpbiB0aGUgbWFuYWdlZCByZWdpb24gaXMga2VwdC5cbiAgY29uc3QgYmFkZ2VzID0gWy4uLm1hbmFnZWRCYWRnZXMsIC4uLmV4aXN0aW5nLmZpbHRlcigoYmFkZ2UpID0+ICFpc01hbmFnZWRCYWRnZShiYWRnZSkpXTtcbiAgLy8gQ29udGVudCBpcyBzbGljZWQgZnJvbSBpdHMgbm9kZSdzIHN0YXJ0IG9mZnNldCwgc28gd2hhdGV2ZXIgYmxhbmsgc3BhY2UgZm9sbG93ZWQgdGhlIGZyb250XG4gIC8vIG1hdHRlciBpcyBnb25lOyBleGFjdGx5IG9uZSBibGFuayBsaW5lIGlzIHJlc3RvcmVkIGhlcmUuIEEgY2xvc2luZyBkZWxpbWl0ZXIgdGhhdCBlbmRlZCBhdCBFT0ZcbiAgLy8gY2FycmllcyBubyBuZXdsaW5lIG9mIGl0cyBvd24gYW5kIG5lZWRzIGJvdGgsIG9yIGAtLS1gIHdvdWxkIGZ1c2Ugd2l0aCB0aGUgZmlyc3QgYmFkZ2UgYW5kXG4gIC8vIGRlc3Ryb3kgdGhlbSBib3RoLiBBIEJPTSBuZWVkcyBubyBzZXBhcmF0b3I6IGl0IGlzIGEgYnl0ZSBtYXJrZXIsIG5vdCBhIGxpbmUuXG4gIGNvbnN0IHNlcGFyYXRvciA9IGZyb250TWF0dGVyID8gKC9cXHI/XFxuJC91LnRlc3QoZnJvbnRNYXR0ZXIpID8gbGluZUVuZGluZyA6IGAke2xpbmVFbmRpbmd9JHtsaW5lRW5kaW5nfWApIDogJyc7XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgcHJlZml4ICsgc2VwYXJhdG9yICsgW2hlYWQsIGJhZGdlcy5qb2luKGxpbmVFbmRpbmcpLCBib2R5XS5maWx0ZXIoQm9vbGVhbikuam9pbihgJHtsaW5lRW5kaW5nfSR7bGluZUVuZGluZ31gKTtcbiAgcmV0dXJuIGVuZHNXaXRoTmV3bGluZSA/IGAke3Jlc3VsdH0ke2xpbmVFbmRpbmd9YCA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBIG5vZGUncyBzdGFydCBvZmZzZXQsIGV4dGVuZGVkIGJhY2sgb3ZlciB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlIG9uIGl0cyBvd24gbGluZS4gQ29tbW9uTWFya1xuICogYWxsb3dzIG9uZSB0byB0aHJlZSBzcGFjZXMgb2YgaW5kZW50YXRpb24gYmVmb3JlIGEgYmxvY2ssIGFuZCBtZGFzdCByZXBvcnRzIHRoZSBvZmZzZXQgQUZURVJcbiAqIHRoZW0g4oCUIHNvIHNsaWNpbmcgZnJvbSBpdCBzaWxlbnRseSByZWluZGVudHMgY29udGVudCB0aGlzIGdlbmVyYXRvciBwcm9taXNlcyB0byBjb3B5IHZlcmJhdGltLlxuICovXG5mdW5jdGlvbiBzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudDogc3RyaW5nLCBub2RlOiBSb290Q29udGVudCk6IG51bWJlciB7XG4gIGNvbnN0IHN0YXJ0ID0gbm9kZS5wb3NpdGlvbiEuc3RhcnQub2Zmc2V0ITtcbiAgY29uc3QgbGluZVN0YXJ0ID0gY29udGVudC5sYXN0SW5kZXhPZignXFxuJywgc3RhcnQgLSAxKSArIDE7XG4gIHJldHVybiAvXlsgXFx0XSokL3UudGVzdChjb250ZW50LnNsaWNlKGxpbmVTdGFydCwgc3RhcnQpKSA/IGxpbmVTdGFydCA6IHN0YXJ0O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIG5vZGUgb3BlbnMgdGhlIFJFQURNRSB3aXRoIGEgdGl0bGUuIE9ubHkgdGhlIEZJUlNUIHBpZWNlIG9mIGNvbnRlbnQgY2FuIGJlIG9uZTogYVxuICogdGl0bGUgaXMgd2hhdCBhIFJFQURNRSBvcGVucyB3aXRoLCBhbmQgYW5jaG9yaW5nIHRoZSBiYWRnZXMgdG8gYSBoZWFkaW5nIGZ1cnRoZXIgZG93biB3b3VsZCBidXJ5XG4gKiB0aGVtIGJlbG93IGNvbnRlbnQgdGhlIGF1dGhvciBwdXQgZmlyc3QuXG4gKi9cbmZ1bmN0aW9uIGlzVGl0bGVOb2RlKG5vZGU6IFJvb3RDb250ZW50IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAobm9kZS50eXBlID09PSAnaGVhZGluZycpIHJldHVybiB0cnVlO1xuICAvLyBNYW55IFJFQURNRXMgY2VudGVyIHRoZWlyIHRpdGxlIGluIEhUTUwgKGA8aDE+YCwgb3IgYSBgPGRpdj5gL2A8cD5gIHdyYXBwaW5nIG9uZSksIHdoaWNoIHRoZVxuICAvLyBwYXJzZXIgcmVwb3J0cyBhcyBvbmUgb3BhcXVlIEhUTUwgYmxvY2s7IHRoZSBiYWRnZXMgZ28gYWZ0ZXIgdGhlIHdob2xlIGJsb2NrLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnaHRtbCcgJiYgY29udGFpbnNSZW5kZXJlZEgxKG5vZGUudmFsdWUpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIEhUTUwgYmxvY2sgdW5hbWJpZ3VvdXNseSBSRU5ERVJTIGFuIGA8aDE+YCDigJQgdGhlIGNlbnRlcmVkLXRpdGxlIGxheW91dCBtYW55IFJFQURNRXNcbiAqIHVzZSAoYDxoMT5gLCBvciBhIGA8ZGl2PmAvYDxwPmAgd3JhcHBpbmcgb25lKS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGEgZ2VuZXJhbCBIVE1MIHBhcnNlci4gRGVjaWRpbmcgdGhpcyBleGFjdGx5IHJlcXVpcmVzIHRoZSByZWFsIHRva2VuaXplcidzXG4gKiBzdGF0ZXMg4oCUIHJhdyB0ZXh0LCBSQ0RBVEEsIHNjcmlwdCBkYXRhLCBhdHRyaWJ1dGUgdmFsdWVzLCB0ZW1wbGF0ZSBjb250ZW50cywgZGVjbGFyYXRpb25zIOKAlCBhbmRcbiAqIGFwcHJveGltYXRpbmcgdGhlbSB3aXRoIHJlZ2V4ZXMgaXMgdGhlIHNhbWUgbG9zaW5nIGdhbWUgdGhlIE1hcmtkb3duIHNjYW5uaW5nIHRoaXMgbW9kdWxlXG4gKiByZXBsYWNlZCB3YXMgcGxheWluZy4gU28gdGhlIHJ1bGUgaXM6IHRva2VuaXplIG9ubHkgdGhlIHNpbXBsZSBjYXNlLCBhbmQgdHJlYXQgYW55dGhpbmcgY2FycnlpbmdcbiAqIGEgY29uc3RydWN0IHdob3NlIHBhcnNpbmcgZGVwZW5kcyBvbiB0aG9zZSBzdGF0ZXMgYXMgTk9UIGEgdGl0bGUuIEJlaW5nIHdyb25nIHRoYXQgd2F5IHB1dHMgdGhlXG4gKiBiYWRnZXMgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSwgd2hpY2ggaXMgbWVyZWx5IHVuaGVscGZ1bDsgYmVpbmcgd3JvbmcgdGhlIG90aGVyIHdheSByZXdyaXRlcyB0aGVcbiAqIHVzZXIncyBSRUFETUUgYXJvdW5kIHRoZSB3cm9uZyBhbmNob3IuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zUmVuZGVyZWRIMShodG1sOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gQ29tbWVudHMgY2Fubm90IG5lc3QgYW5kIGVuZCB1bmFtYmlndW91c2x5LCBzbyB0aGV5IGFyZSBzaW1wbHkgcmVtb3ZlZCByYXRoZXIgdGhhbiBkaXNxdWFsaWZ5aW5nLlxuICBjb25zdCB3aXRob3V0Q29tbWVudHMgPSBodG1sLnJlcGxhY2VBbGwoLzwhLS1bXFxzXFxTXSo/KD86LS0+fCQpL2d1LCAnJyk7XG4gIC8vIENEQVRBLCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgZGVjbGFyYXRpb25zLCBlbGVtZW50cyB3aG9zZSBjb250ZW50IGlzIHJhdyB0ZXh0IC8gUkNEQVRBIC9cbiAgLy8gc2NyaXB0IGRhdGEsIGFuZCBgPHRlbXBsYXRlPmAgKHdob3NlIGNvbnRlbnRzIGFyZSBpbmVydCkuIEEgcXVvdGVkIGF0dHJpYnV0ZSBjb250YWluaW5nIGA8YFxuICAvLyBtYWtlcyBldmVuIGxvY2F0aW5nIHRoZXNlIHVucmVsaWFibGUsIHNvIGl0IGRpc3F1YWxpZmllcyB0aGUgYmxvY2sgdG9vLlxuICBjb25zdCBhbWJpZ3VvdXNDb25zdHJ1Y3RQYXR0ZXJuID1cbiAgICAvPCFcXFtDREFUQVxcW3w8XFw/fDwhW2EtekEtWl18PFxcLz8oPzpzY3JpcHR8c3R5bGV8dGV4dGFyZWF8dGl0bGV8aWZyYW1lfG5vZnJhbWVzfG5vZW1iZWR8eG1wfHRlbXBsYXRlKVxcYnxcIlteXCJdKjxbXlwiXSpcInwnW14nXSo8W14nXSonL2l1O1xuICBpZiAoYW1iaWd1b3VzQ29uc3RydWN0UGF0dGVybi50ZXN0KHdpdGhvdXRDb21tZW50cykpIHJldHVybiBmYWxzZTtcbiAgLy8gUXVvdGluZyBpcyBzaWduaWZpY2FudCBvbmx5IGluc2lkZSBhIHN0YXJ0IHRhZywgc28gYW4gYXR0cmlidXRlIHZhbHVlIGlzIGNvbnN1bWVkIHdpdGggaXRzIG93blxuICAvLyB0YWcgd2hpbGUgcXVvdGF0aW9uIG1hcmtzIGluIG9yZGluYXJ5IHRleHQgc3RheSB0ZXh0OiBgPGRpdiB0aXRsZT1cIiZsdDtoMSZndDtcIj5gIGRvZXMgbm90IGNvdW50LFxuICAvLyBgXCI8aDE+UHJvamVjdDwvaDE+XCJgIGRvZXMuXG4gIGNvbnN0IHN0YXJ0VGFnUGF0dGVybiA9IC88KFthLXpBLVpdW15cXHMvPl0qKSg/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXj5cIiddKSo+L2d1O1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIHdpdGhvdXRDb21tZW50cy5tYXRjaEFsbChzdGFydFRhZ1BhdHRlcm4pKSB7XG4gICAgaWYgKG1hdGNoWzFdPy50b0xvd2VyQ2FzZSgpID09PSAnaDEnKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBub2RlIGlzIGEgcGFyYWdyYXBoIG9mIGJhZGdlcyBhbmQgbm90aGluZyBlbHNlIOKAlCB0aGUgb25seSBjb250ZW50IHdiZnkgcHV0cyBpbiB0aGUgYmxvY2suICovXG5mdW5jdGlvbiBpc0JhZGdlQmxvY2tOb2RlKG5vZGU6IFJvb3RDb250ZW50IHwgdW5kZWZpbmVkKTogbm9kZSBpcyBQYXJhZ3JhcGgge1xuICByZXR1cm4gKFxuICAgICEhbm9kZSAmJlxuICAgIG5vZGUudHlwZSA9PT0gJ3BhcmFncmFwaCcgJiZcbiAgICBub2RlLmNoaWxkcmVuLnNvbWUoKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkpICYmXG4gICAgbm9kZS5jaGlsZHJlbi5ldmVyeShcbiAgICAgIChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpIHx8IGNoaWxkLnR5cGUgPT09ICdicmVhaycgfHwgKGNoaWxkLnR5cGUgPT09ICd0ZXh0JyAmJiAhY2hpbGQudmFsdWUudHJpbSgpKVxuICAgIClcbiAgKTtcbn1cblxuLyoqIEEgYmFkZ2UgaXMgb25lIGBbIVthbHRdKGltYWdlKV0obGluaylgLCB0aGUgb25seSBzaGFwZSB3YmZ5IGV2ZXIgd3JpdGVzLiAqL1xuZnVuY3Rpb24gaXNCYWRnZU5vZGUobm9kZTogUm9vdENvbnRlbnQgfCBQaHJhc2luZ0NvbnRlbnQpOiBub2RlIGlzIExpbmsgJiB7IGNoaWxkcmVuOiBbSW1hZ2VdIH0ge1xuICByZXR1cm4gbm9kZS50eXBlID09PSAnbGluaycgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgbm9kZS5jaGlsZHJlblswXT8udHlwZSA9PT0gJ2ltYWdlJztcbn1cblxuLyoqXG4gKiBUaGUgYmFkZ2VzIGluIHRoZSBibG9jaywgYXMgdGhlIGV4YWN0IHNvdXJjZSB0ZXh0IHRoYXQgcHJvZHVjZWQgdGhlbTogYSBiYWRnZSB3YmZ5IGRvZXMgbm90IG1hbmFnZVxuICogaXMgd3JpdHRlbiBiYWNrIGJ5dGUgZm9yIGJ5dGUgaW5zdGVhZCBvZiBiZWluZyByZS1zZXJpYWxpemVkIGZyb20gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHJlYWRCYWRnZXMobm9kZTogUGFyYWdyYXBoLCBjb250ZW50OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBub2RlLmNoaWxkcmVuXG4gICAgLmZpbHRlcigoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSlcbiAgICAubWFwKChjaGlsZCkgPT4gY29udGVudC5zbGljZShjaGlsZC5wb3NpdGlvbiEuc3RhcnQub2Zmc2V0LCBjaGlsZC5wb3NpdGlvbiEuZW5kLm9mZnNldCkpO1xufVxuXG4vKipcbiAqIFBlcmNlbnQtZW5jb2RlcyB0aGUgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGVuZCBhIE1hcmtkb3duIGRlc3RpbmF0aW9uIGVhcmx5LiBBIHdvcmtmbG93IGZpbGUgbWF5IGJlXG4gKiBuYW1lZCBhbnl0aGluZyB3aXRoIGEgYC55bWxgIGV4dGVuc2lvbiwgYW5kIG9uZSBjb250YWluaW5nIGAoYCBvciBgKWAgcHJvZHVjZWQgYSBiYWRnZSB0aGF0IHdiZnknc1xuICogb3duIGJhZGdlIHBhdHRlcm4gY291bGQgbm90IHJlYWQgYmFjayDigJQgc28gdGhlIGxpbmUgbGVmdCB0aGUgYmxvY2sgYW5kIHRoZSBiYWRnZSB3YXMgZHVwbGljYXRlZC5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlVXJsUGF0aCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1soKVxcc10vZ3UsIChjaGFyYWN0ZXIpID0+IGAlJHtjaGFyYWN0ZXIuY29kZVBvaW50QXQoMCkhLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfWApO1xufVxuXG4vKiogV2hldGhlciB0aGUgYmFkZ2UgaXMgb25lIHdiZnkgd3JpdGVzIGl0c2VsZiwgYW5kIHNvIG1heSBiZSByZXBsYWNlZCBieSB0aGUgY3VycmVudCBibG9jay4gKi9cbmZ1bmN0aW9uIGlzTWFuYWdlZEJhZGdlKGJhZGdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGJhZGdlID09PSBzZW1hbnRpY1JlbGVhc2VCYWRnZSB8fCBtYW5hZ2VkQmFkZ2VQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QoYmFkZ2UpKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGluZUVuZGluZyhjb250ZW50OiBzdHJpbmcpOiAnXFxuJyB8ICdcXHJcXG4nIHtcbiAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcclxcbicpID8gJ1xcclxcbicgOiAnXFxuJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIHVua25vd25dKVtdO1xuICAgICAgZXh0ZW5kcz86IHVua25vd247XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucyA/PyBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbkVudHJ5ID0gcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IGlzQXJyYXkgPyBwbHVnaW5FbnRyeVswXSA6IHBsdWdpbkVudHJ5O1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKGlzQXJyYXkgJiYgcGx1Z2luRW50cnlbMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5cbmNvbnN0IHNoYXJlZFByZXNldCA9ICdnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uYyc7XG5jb25zdCBnZW5lcmF0ZWRTZXR0aW5ncyA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbc2hhcmVkUHJlc2V0XSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSBQYXJ0aWFsPHR5cGVvZiBnZW5lcmF0ZWRTZXR0aW5ncz4gJiB7XG4gIHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W107XG59O1xuXG5jb25zdCBtYW5hZ2VkRmlsZU5hbWUgPSAncmVub3ZhdGUuanNvbmMnO1xuXG4vLyB3YmZ5IHN1cHBvcnRzIG9uZSBjYW5vbmljYWwgUmVub3ZhdGUgbG9jYXRpb24uIE5vbi1jYW5vbmljYWwgY29uZmlncyBhcmUgZml4ZWQgaW4gdGhlIHRhcmdldFxuLy8gcmVwb3NpdG9yeSBpbnN0ZWFkIG9mIGJlaW5nIHBhcnNlZCwgbWVyZ2VkLCBvciBkZWxldGVkIGhlcmUuXG5jb25zdCBub25DYW5vbmljYWxDb25maWdQYXRocyA9IFtcbiAgJ3Jlbm92YXRlLmpzb24nLFxuICAncmVub3ZhdGUuanNvbjUnLFxuICAnLmdpdGh1Yi9yZW5vdmF0ZS5qc29uJyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbmMnLFxuICAnLmdpdGh1Yi9yZW5vdmF0ZS5qc29uNScsXG4gICcucmVub3ZhdGVyYycsXG4gICcucmVub3ZhdGVyYy5qc29uJyxcbiAgJy5yZW5vdmF0ZXJjLmpzb241Jyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb25jJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBtYW5hZ2VkRmlsZU5hbWUpO1xuICAgIGNvbnN0IG1hbmFnZWRGaWxlU3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChmaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIGlmIChtYW5hZ2VkRmlsZVN0YXRzPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IGlzIGEgc3ltYm9saWMgbGluay5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBub25DYW5vbmljYWxDb25maWdDYW5kaWRhdGVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBub25DYW5vbmljYWxDb25maWdQYXRocy5tYXAoYXN5bmMgKHJlbGF0aXZlUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoY2FuZGlkYXRlKS5jYXRjaCgoKSA9PiB7fSkpID8gY2FuZGlkYXRlIDogdW5kZWZpbmVkO1xuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ1BhdGggPSBub25DYW5vbmljYWxDb25maWdDYW5kaWRhdGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQpO1xuICAgIGlmIChub25DYW5vbmljYWxDb25maWdQYXRoIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8ucmVub3ZhdGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSByZXBvc2l0b3J5IGhhcyBhIG5vbi1jYW5vbmljYWwgUmVub3ZhdGUgY29uZmlnJHtcbiAgICAgICAgICBub25DYW5vbmljYWxDb25maWdQYXRoID8gYCBhdCAke25vbkNhbm9uaWNhbENvbmZpZ1BhdGh9YCA6ICcgaW4gcGFja2FnZS5qc29uJ1xuICAgICAgICB9LmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb2xkU2V0dGluZ3M6IFNldHRpbmdzIHwgdW5kZWZpbmVkO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkob2xkQ29udGVudCkpIHtcbiAgICAgIG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxTZXR0aW5ncz4ob2xkQ29udGVudCk7XG4gICAgICBpZiAoIW9sZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9sZFNldHRpbmdzPy5leHRlbmRzICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MuZXh0ZW5kcykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgXCJleHRlbmRzXCIgaXMgbm90IGFuIGFycmF5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZW1vdmVkUHJlc2V0ID0gb2xkU2V0dGluZ3M/LmV4dGVuZHM/LmZpbmQoXG4gICAgICAocHJlc2V0KSA9PiBwcmVzZXQuc3RhcnRzV2l0aCgnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6JykgJiYgcHJlc2V0ICE9PSBzaGFyZWRQcmVzZXRcbiAgICApO1xuICAgIGlmIChyZW1vdmVkUHJlc2V0KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIFwiJHtyZW1vdmVkUHJlc2V0fVwiIG5vIGxvbmdlciBleGlzdHM7IHJlbW92ZSBpdCBtYW51YWxseS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdTZXR0aW5ncyA9IGJ1aWxkU2V0dGluZ3MoY29uZmlnLCBvbGRTZXR0aW5ncyk7XG4gICAgY29uc3QgeyBjb250ZW50LCBrZXlzTG9zaW5nQ29tbWVudHMgfSA9IGpzb25jVXRpbC5zdHJpbmdpZnlQcmVzZXJ2aW5nVHJpdmlhKFxuICAgICAgb2xkQ29udGVudCxcbiAgICAgIG5ld1NldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKTtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIG5vcm1hbGl6ZShjb250ZW50KSA9PT0gbm9ybWFsaXplKG9sZENvbnRlbnQpKSByZXR1cm47XG4gICAgaWYgKCEoYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzTG9zaW5nQ29tbWVudHMpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ29tbWVudHMgaW5zaWRlIFwiJHtrZXl9XCIgd2VyZSBkcm9wcGVkIHdoaWxlIHJld3JpdGluZyBpdCBpbiAke2ZpbGVQYXRofS5gKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkU2V0dGluZ3M6IFNldHRpbmdzIHwgdW5kZWZpbmVkKTogU2V0dGluZ3Mge1xuICBjb25zdCBzZXR0aW5ncyA9IG9sZFNldHRpbmdzXG4gICAgPyAobWVyZ2UuYWxsKFtnZW5lcmF0ZWRTZXR0aW5ncywgb2xkU2V0dGluZ3MsIGdlbmVyYXRlZFNldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzKVxuICAgIDogc3RydWN0dXJlZENsb25lKGdlbmVyYXRlZFNldHRpbmdzKTtcbiAgY29uc3QgZXhpc3RpbmdFeHRlbmRzID0gb2xkU2V0dGluZ3M/LmV4dGVuZHMgPz8gW107XG4gIHNldHRpbmdzLmV4dGVuZHMgPSBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3NcbiAgICA/IGV4aXN0aW5nRXh0ZW5kcy5maWx0ZXIoKHByZXNldCkgPT4gcHJlc2V0ICE9PSBzaGFyZWRQcmVzZXQpXG4gICAgOiBleGlzdGluZ0V4dGVuZHMuaW5jbHVkZXMoc2hhcmVkUHJlc2V0KVxuICAgICAgPyBleGlzdGluZ0V4dGVuZHNcbiAgICAgIDogW3NoYXJlZFByZXNldCwgLi4uZXhpc3RpbmdFeHRlbmRzXTtcbiAgcmV0dXJuIHNldHRpbmdzO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZENvbnRlbnQgPSBjb250ZW50LnRyaW0oKTtcbiAgcmV0dXJuIHRyaW1tZWRDb250ZW50ID8gdHJpbW1lZENvbnRlbnQgKyAnXFxuJyA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0V4dGVuZHMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuaW1wb3J0IHtcbiAgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldFdvcmtzcGFjZURpclBhdHRlcm5zLFxuICBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyxcbn0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmNvbnN0IHN1Ykpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IHRydWUsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICAvLyB3YmZ5IGdlbmVyYXRlcyByb290LWxldmVsIHRvb2wgY29uZmlncyBzdWNoIGFzIHBsYXl3cmlnaHQuY29uZmlnLnRzLCBhbmRcbiAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIG5lZWRzIHRob3NlIGZpbGVzIGluIHRoZSBwcm9qZWN0IHRvIHNlZSBOb2RlL0J1biBnbG9iYWxzLlxuICAvLyBgYXBwLyoqYCBpcyBkZWxpYmVyYXRlbHkgYWJzZW50IGV2ZW4gdGhvdWdoIHRoZSBkb2VzQ29udGFpbipTY3JpcHQgc2lnbmFscyBzY2FuIGl0OiBhcHBcbiAgLy8gZGlyZWN0b3JpZXMgYmVsb25nIHRvIGZyYW1ld29yayBwYWNrYWdlcyAoTmV4dC5qcy9CbGl0eiksIHdoaWNoIG93biB0aGVpciB0c2NvbmZpZ1xuICAvLyAoZ2VuZXJhdGVUc2NvbmZpZyBza2lwcyB0aGVtKSwgYW5kIGNoZWNraW5nIGZyYW1ld29yayBzb3VyY2VzIHVuZGVyIHRoaXMgcHJvamVjdCdzIGNvbXBpbGVyXG4gIC8vIG9wdGlvbnMgd291bGQgcHJvZHVjZSBmYWxzZSBlcnJvcnMuXG4gIGluY2x1ZGU6IFsnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB2aW5leHQgaXMgdGhlIG9yZydzIE5leHQuanMtZXF1aXZhbGVudCBmcmFtZXdvcmsgYW5kIG93bnMgaXRzIHRzY29uZmlnIGp1c3QgbGlrZSBOZXh0L0JsaXR6LFxuICAgIC8vIHNvIGl0IG11c3Qgc2tpcCB0aGUgc3RhbmRhcmQgZ2VuZXJhdGlvbiB0aGF0IHdvdWxkIG92ZXJ3cml0ZSB0aGUgZnJhbWV3b3JrJ3Mgb3duIHNldHRpbmdzLlxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgYXdhaXQgbm9ybWFsaXplRnJhbWV3b3JrVHNjb25maWcoY29uZmlnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSAoY29uZmlnLmlzUm9vdCA/IGJ1aWxkUm9vdEpzb25PYmooY29uZmlnKSA6IHN0cnVjdHVyZWRDbG9uZShzdWJKc29uT2JqKSkgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpciA9IGdldFJvb3REaXIoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHR5cGVzOiBnZW5lcmF0ZWRUeXBlcyB9O1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICAvLyBQcmlzbWEgc2VlZHMgYW5kIG1pZ3JhdGlvbiBoZWxwZXIgc2NyaXB0cyBvZnRlbiBsaXZlIG91dHNpZGUgc3JjLCBidXRcbiAgICAgIC8vIHR5cGUtYXdhcmUgbGludGluZyBzdGlsbCBuZWVkcyB0aGVtIGNvdmVyZWQgYnkgdGhlIHByb2plY3QgY29uZmlnLlxuICAgICAgYWRkSW5jbHVkZVBhdGgobmV3U2V0dGluZ3MsICdwcmlzbWEvKiovKicpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb3JpZ2luYWxTZXR0aW5nc0pzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvLyBBIGZpbGUgd2l0aCBubyBjb25maWd1cmF0aW9uIChlbXB0eSBvciBjb21tZW50LW9ubHkpIGlzIHRyZWF0ZWQgbGlrZSBhIG1pc3Npbmcgb25lLCBhcyB0c2MgZG9lcy5cbiAgICBpZiAoZXhpc3RpbmdDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFRzQ29uZmlnSnNvbj4oZXhpc3RpbmdDb250ZW50KTtcbiAgICAgIC8vIEFuIGV4aXN0aW5nIHRzY29uZmlnLmpzb24gd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0IHVudG91Y2hlZDogd3JpdGluZyB0aGVcbiAgICAgIC8vIGdlbmVyYXRlZCBzZXR0aW5ncyB3aXRob3V0IG1lcmdpbmcgd291bGQgc2lsZW50bHkgZGlzY2FyZCB0aGUgcHJvamVjdCdzIGNvbmZpZ3VyYXRpb24uXG4gICAgICBpZiAoIW9sZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShvbGRTZXR0aW5ncykpKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVHlwZXMgPSBub3JtYWxpemVTdHJpbmdBcnJheShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW1pdE1ldGFkYXRhID0gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMobmV3U2V0dGluZ3MuZXh0ZW5kcywgb2xkU2V0dGluZ3MuZXh0ZW5kcyk7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgICAgIHJlbW92ZVN0YWxlTWFuYWdlZFdvcmtzcGFjZUVudHJpZXMoY29uZmlnLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3MpO1xuICAgICAgfVxuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18vJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ3Rlc3RzLycpXG4gICAgICApO1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICAgIC8vIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnLmpzb24gaXMgYSBsaW50L3R5cGVjaGVjayBwcm9qZWN0LCBub3QgdGhlIGVtaXRcbiAgICAgIC8vIGNvbnRyYWN0LiBJdCBtdXN0IGtlZXAgcm9vdERpciBicm9hZCBlbm91Z2ggZm9yIHJvb3QgY29uZmlnIGZpbGVzLFxuICAgICAgLy8gc2NyaXB0cywgc3JjLCBhbmQgdGVzdHMuIGJ1aWxkLXRzIG93bnMgZW1pdCBhbmQgY3JlYXRlcyBhIHRlbXBvcmFyeVxuICAgICAgLy8gc3JjLW9ubHkgdHNjb25maWcgd2l0aCBub0VtaXQ9ZmFsc2UsIGVtaXREZWNsYXJhdGlvbk9ubHk9dHJ1ZSxcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiwgYW5kIGluY2x1ZGU9W1wic3JjLyoqLypcIl0sIHNvIHByZXNlcnZpbmcgbm9FbWl0PWZhbHNlIG9yXG4gICAgICAvLyByb290RGlyPVwic3JjXCIgaGVyZSB3b3VsZCBvbmx5IGJyZWFrIG5vbi1zcmMgdHlwZS1hd2FyZSBsaW50IGNvdmVyYWdlLlxuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIC4uLmV4aXN0aW5nRW1pdE1ldGFkYXRhIH07XG5cbiAgICAgIGNvbnN0IG1lcmdlZFR5cGVzID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlcywgZ2VuZXJhdGVkVHlwZXMpLCAuLi5nZW5lcmF0ZWRUeXBlc10pXTtcbiAgICAgIGlmIChtZXJnZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IG1lcmdlZFR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGREZWxldGVUeXBlUm9vdHMoZ2VuZXJhdGVkVHlwZXMpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZVJvb3RzO1xuICAgICAgfVxuICAgIH1cbiAgICBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKG5ld1NldHRpbmdzLCBjb25maWcpO1xuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgLy8gRG9uJ3QgdXNlIG9sZCBkZWNvcmF0b3JcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5leHBlcmltZW50YWxEZWNvcmF0b3JzO1xuICAgIC8vIFBhY2thZ2UgaW1wb3J0cyBzaG91bGQgcmVzb2x2ZSB0aHJvdWdoIHBhY2thZ2UgZXhwb3J0cyBpbnN0ZWFkIG9mIGJhc2VVcmwuXG4gICAgLy8gcGF0aHMgaXMgaW50ZW50aW9uYWxseSBwcmVzZXJ2ZWQgc28gcmVwby1sb2NhbCB0b29saW5nIGNhbiBrZWVwIGV4cGxpY2l0XG4gICAgLy8gYWxpYXNlcyB3aXRob3V0IHJlbHlpbmcgb24gYmFzZVVybCdzIGJyb2FkIGZhbGxiYWNrIHJlc29sdXRpb24uXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybDtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udmVyYmF0aW1Nb2R1bGVTeW50YXg7XG4gICAgfVxuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LXVwLXRvLWRhdGUgdHNjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAob3JpZ2luYWxTZXR0aW5nc0pzb24gPT09IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgbW9ub3JlcG8tcm9vdCB0c2NvbmZpZywgd2hvc2UgaW5jbHVkZS9leGNsdWRlIGNvdmVyIGV2ZXJ5IERFQ0xBUkVEIHdvcmtzcGFjZSBsYXlvdXQgKGUuZy5cbiAqIGBhcHBzLypgIGFsb25nc2lkZSBgcGFja2FnZXMvKmApIHNvIHR5cGUtYXdhcmUgbGludGluZyBydW4gZnJvbSB0aGUgcm9vdCBzZWVzIGFsbCB3b3Jrc3BhY2VcbiAqIHNvdXJjZXMsIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUm9vdEpzb25PYmooY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogVHNDb25maWdKc29uIHtcbiAgY29uc3Qgd29ya3NwYWNlUGF0dGVybnMgPSBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnNcbiAgICA/IGdldFdvcmtzcGFjZURpclBhdHRlcm5zKGNvbmZpZylcbiAgICA6IHsgZXhjbHVkZXM6IFtdLCBpbmNsdWRlczogW10gfTtcbiAgY29uc3Qgc2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICBzZXR0aW5ncy5leGNsdWRlID0gW1xuICAgIC4uLm5ldyBTZXQoW1xuICAgICAgLi4ud29ya3NwYWNlUGF0dGVybnMuaW5jbHVkZXMubWFwKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBgJHt3b3Jrc3BhY2VQYXR0ZXJufS90ZXN0L2ZpeHR1cmVzYCksXG4gICAgICAvLyBOZWdhdGl2ZSB3b3Jrc3BhY2UgcGF0dGVybnMgKGUuZy4gYCFwYWNrYWdlcy9leGNsdWRlZGApIG9wdCB3b3Jrc3BhY2Ugc3VidHJlZXMgb3V0IG9mIHRoZVxuICAgICAgLy8gbW9ub3JlcG8sIHNvIHRoZWlyIHNvdXJjZXMgbXVzdCBub3QgZW50ZXIgdGhlIHJvb3QgdHlwZS1jaGVjayBwcm9qZWN0IGVpdGhlci4gQSBuZWdhdGlvblxuICAgICAgLy8gd2hvc2UgZGlyZWN0b3J5IGlzIGFuIGFuY2VzdG9yIG9mIGEgd29ya3NwYWNlIHlpZWxkcyBwYWNrYWdlLW93bmVkIHN1YnBhdGggZW50cmllc1xuICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgd2hvbGUgc3VidHJlZSAoc2VlIGdldFdvcmtzcGFjZURpclBhdHRlcm5zKS5cbiAgICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmV4Y2x1ZGVzLFxuICAgICAgLy8gVGhlIG1hbmFnZWQgaW5jbHVkZXMgYWJvdmUgZGVsaWJlcmF0ZWx5IG9taXQgZnJhbWV3b3JrIGBhcHAvKipgIGRpcmVjdG9yaWVzIChzZWVcbiAgICAgIC8vIHN1Ykpzb25PYmouaW5jbHVkZSdzIGNvbW1lbnQpLCBidXQgYSByZXBvLWF1dGhvcmVkIGJyb2FkIGluY2x1ZGUgc3VjaCBhcyBgZTJlLyoqXFwvKmBcbiAgICAgIC8vIGNhbiBzdGlsbCBkcmFnIGEgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIGFwcCBzb3VyY2VzIGludG8gdGhlIHJvb3QgcHJvamVjdCwgd2hlcmUgdGhleVxuICAgICAgLy8gZmFpbCB1bmRlciB0aGUgcm9vdCBjb21waWxlciBvcHRpb25zIOKAlCB0aGVpciBiYXJlIGBuZXh0LypgIGltcG9ydHMgcmVzb2x2ZSBvbmx5IHRocm91Z2hcbiAgICAgIC8vIHRoZSBmcmFtZXdvcmsgd29ya3NwYWNlJ3Mgb3duIHRzY29uZmlnIGBwYXRoc2AuIEV4Y2x1ZGUgdGhvc2UgYXBwIGRpcmVjdG9yaWVzIHNvIHRoZVxuICAgICAgLy8gcm9vdCBwcm9qZWN0IG5ldmVyIHR5cGUtY2hlY2tzIHRoZW0sIG5vIG1hdHRlciBob3cgYnJvYWQgdGhlIHJlcG8ncyBpbmNsdWRlIGdsb2JzIGFyZS5cbiAgICAgIC4uLmdldEZyYW1ld29ya1dvcmtzcGFjZUFwcEV4Y2x1ZGVzKGNvbmZpZyksXG4gICAgICAuLi4oc2V0dGluZ3MuZXhjbHVkZSA/PyBbXSksXG4gICAgXSksXG4gIF0udG9Tb3J0ZWQoKTtcbiAgc2V0dGluZ3MuaW5jbHVkZSA9IFtcbiAgICAuLi4oc2V0dGluZ3MuaW5jbHVkZSA/PyBbXSksXG4gICAgLi4ud29ya3NwYWNlUGF0dGVybnMuaW5jbHVkZXMuZmxhdE1hcCgod29ya3NwYWNlUGF0dGVybikgPT4gW1xuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vKi5jb25maWcudHNgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vc2NyaXB0cy8qKi8qYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3NyYy8qKi8qYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3Rlc3QvKiovKmAsXG4gICAgXSksXG4gIF07XG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuLy8gRnJhbWV3b3JrIHBhY2thZ2VzIG93biB0aGVpciB0c2NvbmZpZyAoZ2VuZXJhdGVUc2NvbmZpZyBza2lwcyB0aGVtKSBhbmQgc2hpbSBiYXJlIGltcG9ydHMgc3VjaCBhc1xuLy8gYG5leHQvbmF2aWdhdGlvbmAgdGhyb3VnaCBwYWNrYWdlLWxvY2FsIGBwYXRoc2A7IHZpbmV4dCBpcyB0aGUgb3JnJ3MgTmV4dC5qcy1lcXVpdmFsZW50IGZyYW1ld29ya1xuLy8gYW5kIGJlaGF2ZXMgdGhlIHNhbWUuIFRoZWlyIGFwcCBzb3VyY2VzIHRoZXJlZm9yZSBvbmx5IHR5cGUtY2hlY2sgdW5kZXIgdGhlaXIgb3duIGNvbmZpZy5cbmNvbnN0IGZyYW1ld29ya0RlcGVuZGVuY3lOYW1lcyA9IFsnYmxpdHonLCAnbmV4dCcsICd2aW5leHQnXTtcblxuLy8gQSBmcmFtZXdvcmsgYXBwIGxpdmVzIGluIGBhcHAvYCBvciwgdW5kZXIgdGhlIHNyYy1kaXJlY3RvcnkgbGF5b3V0LCBgc3JjL2FwcC9gLiBUaGUgcm9vdCBwcm9qZWN0XG4vLyBpbmNsdWRlcyBgPHdvcmtzcGFjZT4vc3JjLyoqLypgLCBzbyBgc3JjL2FwcGAgbGVha3MgaW4ganVzdCBhcyBhIHJlcG8td2lkZSBnbG9iIGNhbiBwdWxsIGluIGBhcHBgLlxuY29uc3QgZnJhbWV3b3JrQXBwRGlyTmFtZXMgPSBbJ2FwcCcsICdzcmMvYXBwJ107XG5cbi8qKiBSb290IGBleGNsdWRlYCBlbnRyaWVzIChwb3NpeCwgcmVsYXRpdmUgdG8gdGhlIHJvb3QpIGZvciBldmVyeSBmcmFtZXdvcmsgd29ya3NwYWNlJ3MgYXBwIGRpcmVjdG9yeS4gKi9cbmZ1bmN0aW9uIGdldEZyYW1ld29ya1dvcmtzcGFjZUFwcEV4Y2x1ZGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHJldHVybiBbXTtcbiAgY29uc3QgZXhjbHVkZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlRGlyUGF0aCBvZiBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyhjb25maWcpKSB7XG4gICAgaWYgKCFkZXBlbmRzT25GcmFtZXdvcmsocGF0aC5yZXNvbHZlKHdvcmtzcGFjZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgYXBwRGlyTmFtZSBvZiBmcmFtZXdvcmtBcHBEaXJOYW1lcykge1xuICAgICAgY29uc3QgYXBwRGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3Jrc3BhY2VEaXJQYXRoLCBhcHBEaXJOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGFwcERpclBhdGgpKSBleGNsdWRlcy5wdXNoKHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGFwcERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4Y2x1ZGVzO1xufVxuXG5mdW5jdGlvbiBkZXBlbmRzT25GcmFtZXdvcmsobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IG1hbmlmZXN0OiBQYWNrYWdlSnNvbiB8IG51bGw7XG4gIHRyeSB7XG4gICAgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uIHwgbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIEEgbWFuaWZlc3QgdGhhdCBwYXJzZXMgdG8gYSBub24tb2JqZWN0IChlLmcuIGEgZmlsZSBsaXRlcmFsbHkgY29udGFpbmluZyBgbnVsbGApIGRlY2xhcmVzIG5vXG4gIC8vIGRlcGVuZGVuY2llczsgZ3VhcmQgdGhlIHByb3BlcnR5IGFjY2Vzcywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHRocm93IG91dHNpZGUgdGhlIHRyeSBhYm92ZS5cbiAgaWYgKCFtYW5pZmVzdCB8fCB0eXBlb2YgbWFuaWZlc3QgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHsgLi4ubWFuaWZlc3QuZGVwZW5kZW5jaWVzLCAuLi5tYW5pZmVzdC5kZXZEZXBlbmRlbmNpZXMgfTtcbiAgcmV0dXJuIGZyYW1ld29ya0RlcGVuZGVuY3lOYW1lcy5zb21lKChkZXBlbmRlbmN5TmFtZSkgPT4gZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3lOYW1lXSk7XG59XG5cbmNvbnN0IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMgPSBbJyouY29uZmlnLnRzJywgJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXTtcblxuLyoqXG4gKiBSb290IGluY2x1ZGUvZXhjbHVkZSBlbnRyaWVzIHdiZnkgZ2VuZXJhdGVkIGZvciBhbiBlYXJsaWVyIHdvcmtzcGFjZSBsYXlvdXQgKGUuZy4gYHBhY2thZ2VzLypgXG4gKiBnbG9icyBpbiBhIHJlcG8gdGhhdCBub3cgZGVjbGFyZXMgb25seSBgYXBwcy8qYCkgbXVzdCBub3Qgc3Vydml2ZSB0aGUgbWVyZ2Ugd2l0aCB0aGUgZXhpc3RpbmdcbiAqIHRzY29uZmlnLCBvciB0aGUgb2Jzb2xldGUgZGlyZWN0b3JpZXMgd291bGQga2VlcCBlbnRlcmluZyByb290IHR5cGUgY2hlY2tpbmcgZm9yZXZlci4gQSBwcmVmaXhcbiAqIGNvdW50cyBhcyB3YmZ5LW1hbmFnZWQgb25seSB3aGVuIHRoZSBDT01QTEVURSBnZW5lcmF0ZWQgaW5jbHVkZSBzZXQgZm9yIGl0IGlzIHByZXNlbnQgYW5kIG5vXG4gKiBsb25nZXIgZ2VuZXJhdGVkIOKAlCBhIHVzZXItYXV0aG9yZWQgZW50cnkgc3VjaCBhcyBhIGxvbmUgYHRvb2xzLypcXC9zcmMvKipcXC8qYCBuZXZlciBxdWFsaWZpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZVN0YWxlTWFuYWdlZFdvcmtzcGFjZUVudHJpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgb2xkU2V0dGluZ3M6IFRzQ29uZmlnSnNvbixcbiAgbmV3U2V0dGluZ3M6IFRzQ29uZmlnSnNvblxuKTogdm9pZCB7XG4gIGNvbnN0IHN0YWxlUHJlZml4ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MuaW5jbHVkZSkpIHtcbiAgICBjb25zdCBvbGRJbmNsdWRlID0gb2xkU2V0dGluZ3MuaW5jbHVkZS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgc3RyaW5nID0+IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpO1xuICAgIGNvbnN0IGdlbmVyYXRlZEluY2x1ZGUgPSBuZXcgU2V0KG5ld1NldHRpbmdzLmluY2x1ZGUpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygb2xkSW5jbHVkZSkge1xuICAgICAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeSk7XG4gICAgICBpZiAod29ya3NwYWNlUHJlZml4ID09PSB1bmRlZmluZWQgfHwgc3RhbGVQcmVmaXhlcy5oYXMod29ya3NwYWNlUHJlZml4KSkgY29udGludWU7XG4gICAgICBjb25zdCBpc0NvbXBsZXRlID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5ldmVyeSgoc3VmZml4KSA9PlxuICAgICAgICBvbGRJbmNsdWRlLmluY2x1ZGVzKGAke3dvcmtzcGFjZVByZWZpeH0vJHtzdWZmaXh9YClcbiAgICAgICk7XG4gICAgICBjb25zdCBpc1N0aWxsR2VuZXJhdGVkID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5zb21lKChzdWZmaXgpID0+XG4gICAgICAgIGdlbmVyYXRlZEluY2x1ZGUuaGFzKGAke3dvcmtzcGFjZVByZWZpeH0vJHtzdWZmaXh9YClcbiAgICAgICk7XG4gICAgICBpZiAoaXNDb21wbGV0ZSAmJiAhaXNTdGlsbEdlbmVyYXRlZCkgc3RhbGVQcmVmaXhlcy5hZGQod29ya3NwYWNlUHJlZml4KTtcbiAgICB9XG4gICAgaWYgKHN0YWxlUHJlZml4ZXMuc2l6ZSA+IDApIHtcbiAgICAgIG9sZFNldHRpbmdzLmluY2x1ZGUgPSBvbGRTZXR0aW5ncy5pbmNsdWRlLmZpbHRlcigoZW50cnkpID0+IHtcbiAgICAgICAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyA/IGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnkpIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gd29ya3NwYWNlUHJlZml4ID09PSB1bmRlZmluZWQgfHwgIXN0YWxlUHJlZml4ZXMuaGFzKHdvcmtzcGFjZVByZWZpeCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmV4Y2x1ZGUpKSByZXR1cm47XG4gIGNvbnN0IGdlbmVyYXRlZEV4Y2x1ZGUgPSBuZXcgU2V0KG5ld1NldHRpbmdzLmV4Y2x1ZGUpO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29uc1xuICAgID8gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoY29uZmlnKS5tYXAoKHdvcmtzcGFjZURpclBhdGgpID0+XG4gICAgICAgIHBhdGgucmVsYXRpdmUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKSwgd29ya3NwYWNlRGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJylcbiAgICAgIClcbiAgICA6IFtdO1xuICBvbGRTZXR0aW5ncy5leGNsdWRlID0gb2xkU2V0dGluZ3MuZXhjbHVkZS5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gJ3N0cmluZycgfHwgZ2VuZXJhdGVkRXhjbHVkZS5oYXMoZW50cnkpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZW50cnkuZW5kc1dpdGgoJy90ZXN0L2ZpeHR1cmVzJykpIHtcbiAgICAgIHJldHVybiAhc3RhbGVQcmVmaXhlcy5oYXMoZW50cnkuc2xpY2UoMCwgLScvdGVzdC9maXh0dXJlcycubGVuZ3RoKSk7XG4gICAgfVxuICAgIC8vIEEgZnJhbWV3b3JrIGFwcCBleGNsdWRlIChgPHdvcmtzcGFjZT4vYXBwYCwgYDx3b3Jrc3BhY2U+L3NyYy9hcHBgKSBmb3IgYSBzdGlsbC1kZWNsYXJlZFxuICAgIC8vIHdvcmtzcGFjZSBpcyBwcnVuZWQgYnkgY292ZXJzV29ya3NwYWNlRGlyIGJlbG93IHdoZW4gbm8gbG9uZ2VyIGdlbmVyYXRlZDsgdGhpcyBjYXRjaGVzIHRoZVxuICAgIC8vIHJlbWFpbmluZyBjYXNlLCB3aGVyZSB0aGUgd29ya3NwYWNlIGl0c2VsZiB3YXMgcmVtb3ZlZCBhbmQgaXRzIHByZWZpeCBpcyB0aGVyZWZvcmUgc3RhbGUuXG4gICAgLy8gKEEgd3Jvbmcgc3VmZml4IHN0cmlwIHlpZWxkcyBhIHByZWZpeCBhYnNlbnQgZnJvbSBzdGFsZVByZWZpeGVzLCBzbyB0ZXN0aW5nIGV2ZXJ5IG5hbWUgaXMgc2FmZS4pXG4gICAgaWYgKFxuICAgICAgZnJhbWV3b3JrQXBwRGlyTmFtZXMuc29tZShcbiAgICAgICAgKGFwcERpck5hbWUpID0+IGVudHJ5LmVuZHNXaXRoKGAvJHthcHBEaXJOYW1lfWApICYmIHN0YWxlUHJlZml4ZXMuaGFzKGVudHJ5LnNsaWNlKDAsIC0oYXBwRGlyTmFtZS5sZW5ndGggKyAxKSkpXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhY292ZXJzV29ya3NwYWNlRGlyKGVudHJ5LCB3b3Jrc3BhY2VEaXJQYXRocyk7XG4gIH0pO1xufVxuXG4vLyBXaGV0aGVyIGFuIGV4Y2x1ZGUgZW50cnkgaXMgYSB3b3Jrc3BhY2UgbmVnYXRpb24gKGAhYXBwcy9leGNsdWRlZGApIHdob3NlIG5lZ2F0aW9uIGlzIGdvbmU6IHRoZVxuLy8gZGlyZWN0b3J5IGlzIGEgd29ya3NwYWNlIGFnYWluIGFuZCBtdXN0IHJlLWVudGVyIHRoZSByb290IHByb2plY3QuIHdiZnkgd3JpdGVzIHN1Y2ggYSBuZWdhdGlvbiBhc1xuLy8gYSBkaXJlY3RvcnkgcGF0aCwgYXMgYSBkaXJlY3RvcnkgUEFUVEVSTiB3aGVuIGl0IGV4Y2x1ZGVzIGV4YWN0bHkgd2hhdCBpdCBtYXRjaGVzIChgYXBwcy8qYmApLCBvclxuLy8gYXMgYW4gYW5jZXN0b3IncyBwYWNrYWdlLW93bmVkIHN1YnBhdGhzIChgYXBwcy94L3NyY2ApIOKAlCBzbyB0aGUgZW50cnkgbWF5IGNvdmVyIGEgZGlzY292ZXJlZFxuLy8gd29ya3NwYWNlIGRpcmVjdG9yeSBvciBzaXQgdW5kZXIgb25lLiBBIGdsb2JzdGFyIHNlZ21lbnQgbWFya3MgYSBoeWdpZW5lIGdsb2IgKG5vZGVfbW9kdWxlcywgZTJlXG4vLyBhbmQgZnJpZW5kcyksIHdoaWNoIGlzIG5ldmVyIG5lZ2F0aW9uLWRlcml2ZWQgYW5kIG11c3Qgc3Vydml2ZS5cbmZ1bmN0aW9uIGNvdmVyc1dvcmtzcGFjZURpcihlbnRyeTogc3RyaW5nLCB3b3Jrc3BhY2VEaXJQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgaWYgKGVudHJ5LnNwbGl0KCcvJykuaW5jbHVkZXMoJyoqJykpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcmVnZXhTb3VyY2UgPSBlbnRyeVxuICAgIC5zcGxpdCgnLycpXG4gICAgLm1hcCgoc2VnbWVudCkgPT5cbiAgICAgIHNlZ21lbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1suK14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCcqJywgJ1teL10qJylcbiAgICAgICAgLnJlcGxhY2VBbGwoJz8nLCAnW14vXScpXG4gICAgKVxuICAgIC5qb2luKCcvJyk7XG4gIGNvbnN0IGVudHJ5UGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke3JlZ2V4U291cmNlfSg/Oi8uKik/JGAsICd1Jyk7XG4gIHJldHVybiB3b3Jrc3BhY2VEaXJQYXRocy5zb21lKFxuICAgICh3b3Jrc3BhY2VEaXJQYXRoKSA9PiBlbnRyeVBhdHRlcm4udGVzdCh3b3Jrc3BhY2VEaXJQYXRoKSB8fCBlbnRyeS5zdGFydHNXaXRoKGAke3dvcmtzcGFjZURpclBhdGh9L2ApXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoZWRTdWZmaXggPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLmZpbmQoKHN1ZmZpeCkgPT4gZW50cnkuZW5kc1dpdGgoYC8ke3N1ZmZpeH1gKSk7XG4gIGlmICghbWF0Y2hlZFN1ZmZpeCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gZW50cnkuc2xpY2UoMCwgLShtYXRjaGVkU3VmZml4Lmxlbmd0aCArIDEpKTtcbiAgcmV0dXJuIHdvcmtzcGFjZVByZWZpeCA9PT0gJycgPyB1bmRlZmluZWQgOiB3b3Jrc3BhY2VQcmVmaXg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZUZyYW1ld29ya1RzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBOZXh0L0JsaXR6IG93biB0aGVpciB0c2NvbmZpZyBzaGFwZSwgYnV0IFR5cGVTY3JpcHQgNiBubyBsb25nZXIgYWNjZXB0c1xuICAvLyBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmdzIHRoYXQgb2xkZXIgcHJvamVjdHMgY29tbW9ubHkgaW5oZXJpdGVkLlxuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICBpZiAoZXhpc3RpbmdDb250ZW50ID09PSB1bmRlZmluZWQgfHwganNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSByZXR1cm47XG4gIGNvbnN0IHNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxUc0NvbmZpZ0pzb24+KGV4aXN0aW5nQ29udGVudCk7XG4gIGlmICghc2V0dGluZ3MpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgY2xlYW5pbmcgdXAgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpO1xuICBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5ncyk7XG4gIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gIGFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5ncyk7XG4gIGFkZFVuZGljaVR5cGVzUGF0aE1hcHBpbmcoc2V0dGluZ3MsIGNvbmZpZyk7XG4gIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgLy8gYWxyZWFkeS1jbGVhbiB0c2NvbmZpZy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICBpZiAoSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpID09PSBvcmlnaW5hbFNldHRpbmdzSnNvbikgcmV0dXJuO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMikpKTtcbn1cblxuLyoqXG4gKiBidW4tdHlwZXMgcmVmZXJlbmNlcyB1bmRpY2ktdHlwZXMgd2l0aG91dCBkZWNsYXJpbmcgaXQgYXMgYSBkZXBlbmRlbmN5IChvdmVuLXNoL2J1biMyMjgwNSksIHNvXG4gKiBCdW4ncyBpc29sYXRlZCBsaW5rZXIgKGVzcGVjaWFsbHkgd2l0aCB0aGUgZ2xvYmFsIHN0b3JlIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkpIGNhbm5vdCByZXNvbHZlXG4gKiBpdCBmcm9tIGJ1bi10eXBlcycgbG9jYXRpb24sIHdoaWNoIHNpbGVudGx5IGRlZ3JhZGVzIGdsb2JhbCBmZXRjaCB0eXBlcyBzdWNoIGFzIFJlc3BvbnNlLiBNYXAgaXRcbiAqIHRvIHRoZSBjb3B5IHRoYXQgYnVuZmlnLnRvbWwncyBwdWJsaWNIb2lzdFBhdHRlcm4gcGxhY2VzIGluIHRoZSByb290IG5vZGVfbW9kdWxlcy5cbiAqL1xuZnVuY3Rpb24gYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhzZXR0aW5nczogVHNDb25maWdKc29uLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgLy8gTWFwIHVuZGljaS10eXBlcyBvbmx5IHdoZW4gYnVuLXR5cGVzIGFjdHVhbGx5IGxvYWRzOiBhbiBleHBsaWNpdCBgdHlwZXNgIGxpc3QgbG9hZHMgaXQgaWZmIGl0XG4gIC8vIGNvbnRhaW5zIFwiYnVuXCIgKGV2ZW4gb24gUmVhY3QgTmF0aXZlLCB3aG9zZSBwcm9qZWN0cyBtYXkgb3B0IGluIGJ5IGhhbmQpOyB3aXRoIGB0eXBlc2BcbiAgLy8gb21pdHRlZCwgVHlwZVNjcmlwdCdzIGF1dG9tYXRpYyBAdHlwZXMgaW5jbHVzaW9uIGxvYWRzIGl0IGJlY2F1c2Ugd2JmeSBpbnN0YWxscyBAdHlwZXMvYnVuXG4gIC8vIGZvciBldmVyeSBUeXBlU2NyaXB0IHByb2plY3QgZXhjZXB0IFJlYWN0IE5hdGl2ZSwgd2hpY2ggdXNlcyBAdHNjb25maWcvcmVhY3QtbmF0aXZlIGluc3RlYWQuXG4gIGNvbnN0IHR5cGVzID0gc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcztcbiAgaWYgKHR5cGVzID8gIXR5cGVzLmluY2x1ZGVzKCdidW4nKSA6IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHJldHVybjtcbiAgY29uc3QgY29ycmVjdE1hcHBpbmcgPSBgJHtnZXRSb290RGlyKGNvbmZpZyl9L25vZGVfbW9kdWxlcy91bmRpY2ktdHlwZXMvaW5kZXguZC50c2A7XG4gIGNvbnN0IGV4aXN0aW5nTWFwcGluZyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ucGF0aHM/LlsndW5kaWNpLXR5cGVzJ107XG4gIGlmIChleGlzdGluZ01hcHBpbmcpIHtcbiAgICAvLyBSZXdyaXRlIHRoZSBnZW5lcmF0ZWQgbWFwcGluZyB3aGVuIGEgd29ya3NwYWNlIG1vdmVzIHRvIGEgZGlmZmVyZW50IHJvb3QgZGVwdGguIEFueSBvdGhlclxuICAgIC8vIHZhbHVlIGlzIGEgZGVsaWJlcmF0ZSByZXBvLWxvY2FsIG1hcHBpbmcgKGUuZy4gcGF0Y2hlZCB0eXBlcykgYW5kIG11c3QgYmUga2VwdC5cbiAgICBpZiAoXG4gICAgICBleGlzdGluZ01hcHBpbmcubGVuZ3RoID09PSAxICYmXG4gICAgICB0eXBlb2YgZXhpc3RpbmdNYXBwaW5nWzBdID09PSAnc3RyaW5nJyAmJlxuICAgICAgLyg/Ol58XFwvKW5vZGVfbW9kdWxlc1xcL3VuZGljaS10eXBlc1xcL2luZGV4XFwuZFxcLnRzJC91LnRlc3QoZXhpc3RpbmdNYXBwaW5nWzBdKVxuICAgICkge1xuICAgICAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zIS5wYXRocyFbJ3VuZGljaS10eXBlcyddID0gW2NvcnJlY3RNYXBwaW5nXTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnBhdGhzID0ge1xuICAgIC4uLnNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5wYXRocyxcbiAgICAndW5kaWNpLXR5cGVzJzogW2NvcnJlY3RNYXBwaW5nXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzOiBUc0NvbmZpZ0pzb24pOiB2b2lkIHtcbiAgLy8gT21pdHRpbmcgaW5jbHVkZSBsZXRzIGZyYW1ld29yayB0c2NvbmZpZ3Mga2VlcCBUeXBlU2NyaXB0J3MgZGVmYXVsdFxuICAvLyBcImFsbCBUUy9UU1ggZmlsZXNcIiBiZWhhdmlvciwgd2hpY2ggYWxyZWFkeSBjb3ZlcnMgc2NyaXB0cy5cbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlKSByZXR1cm47XG4gIGlmIChzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKCdzY3JpcHRzLyoqLyonKSkgcmV0dXJuO1xuXG4gIHNldHRpbmdzLmluY2x1ZGUucHVzaCgnc2NyaXB0cy8qKi8qJyk7XG4gIHNldHRpbmdzLmluY2x1ZGUuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucztcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgY29uc3QgbW9kdWxlUmVzb2x1dGlvbiA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24pO1xuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzZXR0aW5ncy5leHRlbmRzKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBjb25maWcgbWF5IGFscmVhZHkgc3VwcGx5IGEgdmFsaWQgbW9kdWxlL3Jlc29sdmVyIHBhaXIsIHNvIG9ubHlcbiAgICAgIC8vIHJlbW92ZSB0aGUgcmVtb3ZlZC1pbi1UUzYgbm9kZTEwIHNwZWxsaW5ncyBpbnN0ZWFkIG9mIGZvcmNpbmcgYnVuZGxlciBvbiBpdC5cbiAgICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmV4dC5qcyB3cml0ZXMgXCJub2RlXCIgZHVyaW5nIGJ1aWxkIHdoZW4gdGhpcyBvcHRpb24gaXMgbWlzc2luZywgYnV0XG4gICAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gdHNnb2xpbnQgZm9sbG93cyBUeXBlU2NyaXB0IDYgdmFsaWRhdGlvbiwgd2hlcmUgYmFzZVVybCBpcyByZW1vdmVkIGFuZFxuICAvLyBwYXRoIHRhcmdldHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlbGF0aXZlLiBOZXh0LmpzIHN0aWxsIGFjY2VwdHMgdGhlIGFsaWFzXG4gIC8vIHNoYXBlIGFmdGVyIGVhY2ggdGFyZ2V0IGlzIHdyaXR0ZW4gd2l0aCBhIGxlYWRpbmcgLi8uXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMuYmFzZVVybDtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMucGF0aHMpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZXJPcHRpb25zLnBhdGhzKSkge1xuICAgIGNvbXBpbGVyT3B0aW9ucy5wYXRoc1thbGlhc10gPSBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG4gICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpIHx8IHRhcmdldC5zdGFydHNXaXRoKCcuLi8nKSB8fCBwYXRoLmlzQWJzb2x1dGUodGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgICByZXR1cm4gYC4vJHt0YXJnZXR9YDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHJldHVybiAnLic7XG4gIC8vIFRoZSB1bmRpY2ktdHlwZXMgcGF0aCBtYXBwaW5nIG11c3QgcmVhY2ggdGhlIG1vbm9yZXBvIHJvb3QncyBub2RlX21vZHVsZXMgKGJ1bmZpZy50b21sJ3NcbiAgLy8gcHVibGljSG9pc3RQYXR0ZXJuIGhvaXN0cyB0aGUgcGFja2FnZSB0aGVyZSksIGFuZCB3b3Jrc3BhY2UgcGF0dGVybnMgbWF5IGJlIGFyYml0cmFyaWx5IGRlZXBcbiAgLy8gKGUuZy4gYGV4YW1wbGVzLyoqYCksIHNvIGEgZml4ZWQgdHdvLWxldmVsIHByb2JlIGlzIG5vdCBlbm91Z2guIFByZWZlciB0aGUgbmVhcmVzdCBhbmNlc3RvclxuICAvLyBtYW5pZmVzdCB0aGF0IGRlY2xhcmVzIHdvcmtzcGFjZXMgKHRoZSBtb25vcmVwbyByb290KTsgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbmVhcmVzdFxuICAvLyBhbmNlc3RvciBtYW5pZmVzdC4gU3RvcCBhdCB0aGUgZmlyc3QgZ2l0IHJlcG9zaXRvcnkgYm91bmRhcnkgc28gYW4gdW5yZWxhdGVkIGVuY2xvc2luZ1xuICAvLyByZXBvc2l0b3J5J3MgbWFuaWZlc3QgY2FuIG5ldmVyIGJlIGNob3Nlbi5cbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCk7XG4gIGxldCByb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBhbmNlc3RvckRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7IDsgYW5jZXN0b3JEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yRGlyUGF0aCkpIHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkge1xuICAgICAgcm9vdERpclBhdGggPz89IGFuY2VzdG9yRGlyUGF0aDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgICAgLy8gQnVuIG5vLW9wIHBhdHRlcm5zIChlLmcuIGB3b3Jrc3BhY2VzOiBbXCJcIl1gKSBkbyBub3QgbWFrZSBhIG1hbmlmZXN0IGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICAgIGlmIChnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhtYW5pZmVzdC53b3Jrc3BhY2VzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcm9vdERpclBhdGggPSBhbmNlc3RvckRpclBhdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBBbiB1bnBhcnNhYmxlIG1hbmlmZXN0IHN0aWxsIG1hcmtzIGEgcHJvamVjdCBkaXJlY3Rvcnk7IGtlZXAgY2xpbWJpbmcgZm9yIGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlzUmVwb0JvdW5kYXJ5ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAnLmdpdCcpKTtcbiAgICBjb25zdCBpc0ZpbGVzeXN0ZW1Sb290ID0gYW5jZXN0b3JEaXJQYXRoID09PSBwYXRoLmRpcm5hbWUoYW5jZXN0b3JEaXJQYXRoKTtcbiAgICBpZiAoaXNSZXBvQm91bmRhcnkgfHwgaXNGaWxlc3lzdGVtUm9vdCkgYnJlYWs7XG4gIH1cbiAgaWYgKCFyb290RGlyUGF0aCkgcmV0dXJuICcuJztcbiAgcmV0dXJuIHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgcm9vdERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpIHx8ICcuJztcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gYWRkSW5jbHVkZVBhdGgoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHNldHRpbmdzLmluY2x1ZGUgPz89IFtdO1xuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoZGlyUGF0aCkpIHtcbiAgICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxldGVUeXBlUm9vdHModHlwZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGdlbmVyYXRlZCBwYWNrYWdlLW93bmVkIHRlc3QgdHlwZXMgc2hvdWxkIHRyaWdnZXIgdGhpcy4gVXNlci1kZWZpbmVkIHNsYXNoLWJhc2VkXG4gIC8vIGVudHJpZXMgbWF5IGludGVudGlvbmFsbHkgcmVseSBvbiBjdXN0b20gdHlwZVJvb3RzIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIGFzLWlzLlxuICByZXR1cm4gdHlwZU5hbWVzLnNvbWUoKHR5cGVOYW1lKSA9PiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lLmluY2x1ZGVzKCcvJykpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXM6IHN0cmluZ1tdLCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdlbmVyYXRlZFR5cGVTZXQgPSBuZXcgU2V0KGdlbmVyYXRlZFR5cGVzKTtcbiAgcmV0dXJuIGV4aXN0aW5nVHlwZXMuZmlsdGVyKCh0eXBlTmFtZSkgPT4ge1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBwYWNrYWdlLXByb3ZpZGVkIHRlc3QgZ2xvYmFscy4gRHJvcCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlXG4gICAgLy8gY29ycmVzcG9uZGluZyBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBwcmVzZW50IHNvIFR5cGVTY3JpcHQgd29uJ3QgcmVxdWlyZVxuICAgIC8vIG1pc3NpbmcgcGFja2FnZXMgc3VjaCBhcyB2aXRlc3QuXG4gICAgaWYgKGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWUpICYmICFnZW5lcmF0ZWRUeXBlU2V0Lmhhcyh0eXBlTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZSA9PT0gJ2plc3QnIHx8IHR5cGVOYW1lID09PSAnbW9jaGEnIHx8IHR5cGVOYW1lID09PSAndml0ZXN0L2dsb2JhbHMnO1xufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VTZXR0aW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXVxuKTogUGljazxOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPiwgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJz4ge1xuICBjb25zdCBlbWl0T3B0aW9ucyA9IHt9IGFzIFBpY2s8XG4gICAgTm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sXG4gICAgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJ1xuICA+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlY2xhcmF0aW9uJywgJ2RlY2xhcmF0aW9uTWFwJywgJ3NvdXJjZU1hcCddIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21waWxlck9wdGlvbnM/LltrZXldO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbWl0T3B0aW9uc1trZXldID0gdmFsdWUgYXMgbmV2ZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbWl0T3B0aW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIC8vIFJlYWN0IE5hdGl2ZSBnZXRzIGl0cyBhbWJpZW50IHR5cGVzIGZyb20gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSAocmVhY3QtbmF0aXZlLCBqZXN0KS5cbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnYnVuJyk7XG4gIH1cbiAgaWYgKFxuICAgIGRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ2plc3QtZW52aXJvbm1lbnQtanNkb20nXSB8fFxuICAgIGRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2plc3QnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLnZpdGVzdCkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ3ZpdGVzdC9nbG9iYWxzJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5tb2NoYSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ21vY2hhJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5jeXByZXNzKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnY3lwcmVzcycpO1xuICB9XG5cbiAgcmV0dXJuIFsuLi50eXBlTmFtZXNdO1xufVxuIiwiaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGUgb2YgZWFjaCBzdXBwb3J0ZWQgYWdlbnQsIHJlbGF0aXZlIHRvIHRoZSBob21lIGRpcmVjdG9yeS4gVGhlc2VcbiAqIGFwcGx5IHRvIGV2ZXJ5IHJlcG9zaXRvcnkgdGhlIGFnZW50IHdvcmtzIGluLCBzbyB0aGV5IGhvbGQgb25seSB0aGUgY29udmVudGlvbnMgdGhhdCBhcmUgdHJ1ZSBvblxuICogZXZlcnkgV2lsbEJvb3N0ZXIgZGV2ZWxvcGVyIG1hY2hpbmUgcmF0aGVyIHRoYW4gaW4gYSBwYXJ0aWN1bGFyIHJlcG9zaXRvcnkuXG4gKi9cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uRmlsZVBhdGhzID0gWycuY29kZXgvQUdFTlRTLm1kJywgJy5jbGF1ZGUvQ0xBVURFLm1kJywgJy5nZW1pbmkvR0VNSU5JLm1kJ10gYXMgY29uc3Q7XG5cbi8vIFRoaXMgY29udGVudCBpcyBsb2FkZWQgaW50byBldmVyeSBhZ2VudCBzZXNzaW9uLCBzbyBpdCBpcyBrZXB0IGFzIHNob3J0IGFzIGl0IGNhbiBiZSB3aGlsZVxuLy8gc3RheWluZyB1bmFtYmlndW91czogZS5nLiwgdGhlIGV4Y2x1ZGVkIG9yZ2FuaXphdGlvbnMgYXJlIHdyaXR0ZW4gYXMgc2hlbGwgYnJhY2UgZXhwYW5zaW9uLCB3aGljaFxuLy8gdGhlIGFnZW50cyByZWFkIGFzIGEgcGF0aCBjb25kaXRpb24gd2l0aG91dCBhbnkgcnVudGltZSBtYXRjaGluZy5cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCA9IGAtIFJlcG9zIGxpdmUgdW5kZXIgXFxgfi9naHEvZ2l0aHViLmNvbVxcYDsgYWx3YXlzIGNsb25lIHdpdGggXFxgZ2hxIGdldCAtcFxcYCwgbmV2ZXIgXFxgZ2l0IGNsb25lXFxgLlxuLSBMTE0vQUkgYWdlbnQgcmVzcG9uc2VzIG1heSB0YWtlIDHigJMyIGhvdXJzOyB3YWl0IHBhdGllbnRseSwgZG9uJ3QgYXNzdW1lIGZhaWx1cmUuXG4tIE5vIEFJIGF0dHJpYnV0aW9uIChlLmcuLCBcXGBDby1BdXRob3JlZC1CeVxcYCB0cmFpbGVycywgXCJHZW5lcmF0ZWQgd2l0aCAuLi5cIiBmb290ZXJzKSBpbiBjb21taXRzLCBpc3N1ZXMsIG9yIFBScyB1bmxlc3MgZXhwbGljaXRseSByZXF1ZXN0ZWQuIFRoaXMgaGlkZXMgbm90aGluZzogaWYgYXNrZWQgd2hpY2ggQUkgYWdlbnQgZGlkIHRoZSB3b3JrLCBhbnN3ZXIgdHJ1dGhmdWxseS5cbi0gT3V0c2lkZSBcXGB+L2docS9naXRodWIuY29tL3tXaWxsQm9vc3RlcixXaWxsQm9vc3RlckxhYn0vXFxgLCBmb2xsb3cgdGhlIHJlcG9zaXRvcnkncyBjb250cmlidXRpb24gZ3VpZGUgKGUuZy4sIENPTlRSSUJVVElORy5tZCwgXFxgLmdpdGh1Yi9cXGApIGFuZCBpc3N1ZS9QUiB0ZW1wbGF0ZXMsIG1hdGNoIGl0cyBjb21taXQgYW5kIGNvZGUgY29udmVudGlvbnMsIGFuZCBob25vciBpdHMgcnVsZXMgb24gQUktYXNzaXN0ZWQgY29udHJpYnV0aW9ucy4gV3JpdGUgaXRzIGlzc3VlcyBhbmQgUFJzIHdpdGggb25seSB3aGF0IGEgcmV2aWV3ZXIgdW5mYW1pbGlhciB3aXRoIHRoZSB3b3JrIG5lZWRzIHRvIHVuZGVyc3RhbmQgYW5kIGFzc2VzcyBpdCwgYXMgY29uY2lzZWx5IGFzIHRoYXQgY29udGV4dCBhbGxvd3MuXG5gO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIHNldHRpbmdzIG1lcmdlZCBpbnRvIGVhY2ggYWdlbnQncyBKU09OIHNldHRpbmdzIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSBob21lXG4gKiBkaXJlY3RvcnkuXG4gKlxuICogRXZlcnkgYWdlbnQgdGhhdCBjYXJyaWVzIGZhY3RzIGZyb20gb25lIHNlc3Npb24gaW50byB0aGUgbmV4dCBpcyB0dXJuZWQgb2ZmIGhlcmUgYmVjYXVzZSBzdWNoXG4gKiBtZW1vcnkgbWFrZXMgYSBzZXNzaW9uIGRlcGVuZCBvbiBpbnZpc2libGUgbWFjaGluZS1sb2NhbCBzdGF0ZTogaXRzIGJlaGF2aW9yIHN0b3BzIGJlaW5nXG4gKiByZXByb2R1Y2libGUgYWNyb3NzIGRldmVsb3BlcnMgYW5kIENJLCBhbmQgYSBzdGFsZSBvciB3cm9uZyBtZW1vcnkgc2lsZW50bHkgb3ZlcnJpZGVzIHRoZVxuICogaW5zdHJ1Y3Rpb24gZmlsZXMgYWJvdmUuIENvZGV4IG5lZWRzIG5vIGVudHJ5IGJlY2F1c2UgaXRzIG1lbW9yaWVzIGFyZSBvcHQtaW5cbiAqIChgW2ZlYXR1cmVzXSBtZW1vcmllcyA9IHRydWVgIGluIGB+Ly5jb2RleC9jb25maWcudG9tbGApLCBzbyBsZWF2aW5nIHRoYXQgZmxhZyB1bnNldCBpcyBlbm91Z2guXG4gKi9cbmNvbnN0IGFnZW50U2V0dGluZ3MgPSBbXG4gIHtcbiAgICByZWxhdGl2ZVBhdGg6ICcuY2xhdWRlL3NldHRpbmdzLmpzb24nLFxuICAgIGFjY2VwdHNDb21tZW50czogZmFsc2UsXG4gICAgLyoqXG4gICAgICogQ2xhdWRlIENvZGUgaW5qZWN0cyBpdHMgb3duIGF0dHJpYnV0aW9uIGRpcmVjdGl2ZSAoYSBgQ28tQXV0aG9yZWQtQnlgIHRyYWlsZXIsIGEgXCJHZW5lcmF0ZWRcbiAgICAgKiB3aXRoXCIgZm9vdGVyLCBhbmQgYSBzZXNzaW9uIGxpbmspIGludG8gdGhlIHRvb2wgZGVzY3JpcHRpb25zIGFuZCBtaWQtc2Vzc2lvbiByZW1pbmRlcnMsIGFuZFxuICAgICAqIHRoYXQgZGlyZWN0aXZlIGRlY2xhcmVzIGl0c2VsZiB0byByZXBsYWNlIGVhcmxpZXIgZ3VpZGFuY2UsIHNvIHRoZSBpbnN0cnVjdGlvbiBmaWxlIGFsb25lXG4gICAgICogY2Fubm90IHN1cHByZXNzIGl0LiBPbmx5IHRoaXMgc2V0dGluZyByZW1vdmVzIHRoZSBkaXJlY3RpdmUgYXQgaXRzIHNvdXJjZS4gQXV0byBtZW1vcnkgaXMgb25cbiAgICAgKiBieSBkZWZhdWx0LCBzbyBpdCBtdXN0IGJlIHR1cm5lZCBvZmYgZXhwbGljaXRseS5cbiAgICAgKi9cbiAgICBzZXR0aW5nczoge1xuICAgICAgYXR0cmlidXRpb246IHtcbiAgICAgICAgY29tbWl0OiAnJyxcbiAgICAgICAgcHI6ICcnLFxuICAgICAgICBzZXNzaW9uVXJsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBhdXRvTWVtb3J5RW5hYmxlZDogZmFsc2UsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHJlbGF0aXZlUGF0aDogJy5nZW1pbmkvc2V0dGluZ3MuanNvbicsXG4gICAgLy8gR2VtaW5pIENMSSBzdHJpcHMgY29tbWVudHMgYmVmb3JlIHBhcnNpbmcgaXRzIHNldHRpbmdzIGZpbGUsIHVubGlrZSBDbGF1ZGUgQ29kZSwgd2hpY2hcbiAgICAvLyByZWplY3RzIGEgY29tbWVudGVkIGZpbGUgYXMgbWFsZm9ybWVkLlxuICAgIGFjY2VwdHNDb21tZW50czogdHJ1ZSxcbiAgICBzZXR0aW5nczoge1xuICAgICAgZXhwZXJpbWVudGFsOiB7XG4gICAgICAgIGF1dG9NZW1vcnk6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBPdmVyd3JpdGVzIHRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGVzIG9mIGV2ZXJ5IHN1cHBvcnRlZCBhZ2VudCB3aXRoIHRoZSBmaXhlZCBjb250ZW50IGFuZFxuICogbWVyZ2VzIHRoZSBmaXhlZCBzZXR0aW5ncyBpbnRvIGVhY2ggYWdlbnQncyB1c2VyIHNldHRpbmdzLiBSZXR1cm5zIGZhbHNlIHdoZW4gYW55IGZpbGUgd2FzXG4gKiBza2lwcGVkIChlLmcuIGEgc3ltbGlua2VkIG9yIHVucGFyc2FibGUgZmlsZSksIHNvIHRoZSBjb21tYW5kIGNhbiBmYWlsIGxvdWRseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVXNlckFnZW50Q29uZmlncygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgbGV0IGhhc1dyaXR0ZW5BbGwgPSB0cnVlO1xuICBmb3IgKGNvbnN0IHJlbGF0aXZlUGF0aCBvZiB1c2VyQWdlbnRJbnN0cnVjdGlvbkZpbGVQYXRocykge1xuICAgIGNvbnN0IGhhc1dyaXR0ZW4gPSBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGguam9pbihvcy5ob21lZGlyKCksIHJlbGF0aXZlUGF0aCksIHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCk7XG4gICAgaGFzV3JpdHRlbkFsbCAmJj0gaGFzV3JpdHRlbjtcbiAgfVxuICBmb3IgKGNvbnN0IHsgYWNjZXB0c0NvbW1lbnRzLCByZWxhdGl2ZVBhdGgsIHNldHRpbmdzIH0gb2YgYWdlbnRTZXR0aW5ncykge1xuICAgIC8vIEF3YWl0ZWQgc2VwYXJhdGVseTogYCYmPWAgd291bGQgc2tpcCB0aGUgbWVyZ2Ugb25jZSBhbiBlYXJsaWVyIGZpbGUgd2FzIHNraXBwZWQuXG4gICAgY29uc3QgaGFzTWVyZ2VkID0gYXdhaXQgbWVyZ2VBZ2VudFNldHRpbmdzKHJlbGF0aXZlUGF0aCwgc2V0dGluZ3MsIGFjY2VwdHNDb21tZW50cyk7XG4gICAgaGFzV3JpdHRlbkFsbCAmJj0gaGFzTWVyZ2VkO1xuICB9XG4gIHJldHVybiBoYXNXcml0dGVuQWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtZXJnZUFnZW50U2V0dGluZ3MoXG4gIHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuICBuZXdTZXR0aW5nczogb2JqZWN0LFxuICBhY2NlcHRzQ29tbWVudHM6IGJvb2xlYW5cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksIHJlbGF0aXZlUGF0aCk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgbGV0IGV4aXN0aW5nU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGlmIChleGlzdGluZ0NvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIEFuIGFnZW50IGlnbm9yZXMgaXRzIHdob2xlIHNldHRpbmdzIGZpbGUgd2hlbiB0aGUgZmlsZSBicmVha3MgdGhlIGdyYW1tYXIgdGhlIGFnZW50IHJlYWRzIGl0XG4gICAgLy8gd2l0aCwgc28gd2JmeSBsZWF2ZXMgc3VjaCBhIGZpbGUgdG8gdGhlIGRldmVsb3BlciB0byByZXBhaXIgcmF0aGVyIHRoYW4gcmV3cml0aW5nIGl0IGludG8gYVxuICAgIC8vIGZpbGUgdGhlIGFnZW50IHN0aWxsIGlnbm9yZXM6IGNvbW1lbnRzIGFyZSB0b2xlcmF0ZWQgb25seSB3aGVyZSB0aGUgYWdlbnQgc3RyaXBzIHRoZW0sIGFuZFxuICAgIC8vIHRyYWlsaW5nIGNvbW1hcyBub3doZXJlLCBzaW5jZSBib3RoIGFnZW50cyBwYXJzZSB3aXRoIEpTT04ucGFyc2UgaW4gdGhlIGVuZC4gQ29tbWVudC1vbmx5XG4gICAgLy8gY29udGVudCBpcyBjaGVja2VkIHRvbywgYmVjYXVzZSBpdCBpcyBrZXB0IGFzIGEgaGVhZGVyIGFib3ZlIHRoZSBnZW5lcmF0ZWQgb2JqZWN0LlxuICAgIGlmICghYWNjZXB0c0NvbW1lbnRzICYmIGpzb25jVXRpbC5jb250YWluc0NvbW1lbnQoZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhpcyBhZ2VudCByZWFkcyBpdCBhcyBzdHJpY3QgSlNPTiwgY29tbWVudHMgYW5kIGFsbC5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oZXhpc3RpbmdDb250ZW50LCBmYWxzZSk7XG4gICAgICBpZiAoIXBhcnNlZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgU2tpcHBlZCB1cGRhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBhIHN0cmljdCBKU09OIG9iamVjdCAoYSB0cmFpbGluZyBjb21tYSwgZm9yIGV4YW1wbGUsIGlzIG5vdCBhbGxvd2VkKS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nU2V0dGluZ3MgPSBwYXJzZWRTZXR0aW5ncztcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2V0dGluZ3MgPSBtZXJnZShleGlzdGluZ1NldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gIC8vIE9ubHkgdGhlIHByb3BlcnRpZXMgd2hvc2UgdmFsdWUgY2hhbmdlcyBhcmUgcmV3cml0dGVuLCBzbyB0aGUgZmlsZSBrZWVwcyBpdHMgb3duIGZvcm1hdHRpbmdcbiAgLy8gYW5kLCB3aGVyZSB0aGUgYWdlbnQgYWxsb3dzIHRoZW0sIGl0cyBjb21tZW50cy5cbiAgY29uc3QgeyBjb250ZW50LCBrZXlzTG9zaW5nQ29tbWVudHMgfSA9IGpzb25jVXRpbC5zdHJpbmdpZnlQcmVzZXJ2aW5nVHJpdmlhKGV4aXN0aW5nQ29udGVudCwgc2V0dGluZ3MpO1xuICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSkpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzTG9zaW5nQ29tbWVudHMpIHtcbiAgICBjb25zb2xlLndhcm4oYENvbW1lbnRzIGluc2lkZSBcIiR7a2V5fVwiIHdlcmUgZHJvcHBlZCB3aGlsZSByZXdyaXRpbmcgaXQgaW4gJHtmaWxlUGF0aH0uYCk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkgcmV0dXJuO1xuICAgIC8vIC52c2NvZGUvc2V0dGluZ3MuanNvbiBpcyBKU09OQyBieSBkZWZpbml0aW9uOyBKU09OLnBhcnNlIHdvdWxkIG1ha2Ugd2JmeSBzaWxlbnRseSBza2lwXG4gICAgLy8gY29tbWVudGVkIGZpbGVzLlxuICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KGV4aXN0aW5nQ29udGVudCk7XG4gICAgaWYgKCFwYXJzZWRTZXR0aW5ncykge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShwYXJzZWRTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgICBsZXQgc2V0dGluZ3MgPSBwYXJzZWRTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICB9XG4gICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHNldHRpbmdzLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSA9PT0gb3JpZ2luYWxTZXR0aW5nc0pzb24pIHJldHVybjtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuaW50ZXJmYWNlIEZub3hUb21sU3VidHJlZSB7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJvZmlsZXM/OiBSZWNvcmQ8c3RyaW5nLCB7IHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9IHwgdW5kZWZpbmVkPjtcbn1cblxuLy8gVGhlIGZvdXIgc3RhbmRhcmQgV0JfRU5WIG1vZGVzOyBzdGFnaW5nIGlzIG9wdGlvbmFsIGFuZCBvbmx5IGNvbXBsZXRlZCB3aGVuIHRoZSByZXBvc2l0b3J5XG4vLyBhbHJlYWR5IGRlY2xhcmVzIHRoZSBzdGFnaW5nIHByb2ZpbGUuXG5jb25zdCB3YkVudk1vZGVzID0gWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddIGFzIGNvbnN0O1xudHlwZSBXYkVudk1vZGUgPSAodHlwZW9mIHdiRW52TW9kZXMpW251bWJlcl07XG5cbi8qKlxuICogRW5zdXJlcyBhIGZub3ggcmVwb3NpdG9yeSBkZWZpbmVzIFdCX0VOViBmb3IgZXZlcnkgc3RhbmRhcmQgbW9kZSAoYW5kIE5FWFRfUFVCTElDX1dCX0VOViB3aGVuXG4gKiBhbnkgd29ya3NwYWNlIGRlcGVuZHMgb24gTmV4dC5qcyBvciB2aW5leHQpIGluIGZub3gudG9tbCBwcm9maWxlcy4gRXhpc3RpbmcgZGVmaW5pdGlvbnMgYXJlXG4gKiBhbHdheXMgbGVmdCB1bnRvdWNoZWQuIE5vbi1mbm94IHJlcG9zaXRvcmllcyBhcmUgc2tpcHBlZDogLmVudiBmaWxlcyBhcmUgbm8gbG9uZ2VyIG1hbmFnZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2Vuc3VyZVdiRW52RGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbmVlZHNOZXh0UHVibGljID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZykpO1xuICAgIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKTtcbiAgICAvLyBsc3RhdCwgbm90IGV4aXN0c1N5bmM6IGV4aXN0c1N5bmMgaXMgZmFsc2UgZm9yIGEgREFOR0xJTkcgZm5veC50b21sIHN5bWxpbms7IGFueSBmbm94LnRvbWxcbiAgICAvLyBkaXJlY3RvcnkgZW50cnkgbWFya3MgYSBmbm94IHJlcG9zaXRvcnksIGFuZCBhIHJlZnVzZWQvZGFuZ2xpbmcgb25lIGFib3J0cyBpbnN0ZWFkIG9mXG4gICAgLy8gYmVpbmcgdHJlYXRlZCBhcyBhIG5vbi1mbm94IHJlcG9zaXRvcnkgd2hpbGUgdGhlIGZub3ggc3luY2hyb25pemF0aW9uIGlzIGZhaWxpbmcuXG4gICAgaWYgKCEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZm5veFRvbWxQYXRoKS5jYXRjaCgoKSA9PiB7fSkpKSByZXR1cm47XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoZm5veFRvbWxQYXRoKTtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRXYkVudkludG9Gbm94VG9tbChjb250ZW50LCBuZWVkc05leHRQdWJsaWMpO1xuICAgIGlmICh1cGRhdGVkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIHVwZGF0ZWRDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTWlycm9ycyB3YidzIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52IGNvbnRyYWN0IChwYWNrYWdlcy93Yi9zcmMvcHJvamVjdC50cyk6IHRoZSBmcmFtZXdvcmsgbWF5XG4gKiBiZSBkZWNsYXJlZCBpbiBBTlkgb2YgdGhlIGZvdXIgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBgbmV4dGAgYXMgYSBkZXZEZXBlbmRlbmN5IGluIGEgc2hhcmVkXG4gKiBjb21wb25lbnQgbGlicmFyeSksIHdoaWxlIHdiZnkncyBgZGVwZW5kaW5nLm5leHRgIGxvb2tzIG9ubHkgYXQgcmVndWxhciBkZXBlbmRlbmNpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXS5zb21lKChzZWN0aW9uKSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gY29uZmlnLnBhY2thZ2VKc29uPy5bc2VjdGlvbiBhcyAnZGVwZW5kZW5jaWVzJ107XG4gICAgcmV0dXJuICEhZGVwZW5kZW5jaWVzPy5bJ25leHQnXSB8fCAhIWRlcGVuZGVuY2llcz8uWyd2aW5leHQnXTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBtaXNzaW5nIFdCX0VOViAoYW5kIG9wdGlvbmFsbHkgTkVYVF9QVUJMSUNfV0JfRU5WKSBlbnRyaWVzIGludG8gYSBmbm94LnRvbWw6IHRoZSBiYXNlXG4gKiBgW3NlY3JldHNdYCB0YWJsZSBjYXJyaWVzIHRoZSBkZXZlbG9wbWVudCBkZWZhdWx0cyBhbmQgYFtwcm9maWxlcy48bW9kZT4uc2VjcmV0c11gIG92ZXJsYXlzXG4gKiBlYWNoIG90aGVyIG1vZGUsIG1hdGNoaW5nIHRoZSBvcmctc3RhbmRhcmQgbGF5b3V0LiBGb3JtYXR0aW5nIGFuZCBjb21tZW50cyBhcmUgcHJlc2VydmVkOyBvbmx5XG4gKiBtaXNzaW5nIGxpbmVzIGFyZSBpbnNlcnRlZCBvciBtaXNzaW5nIHNlY3Rpb25zIGFwcGVuZGVkLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBjb250ZW50XG4gKiBjYW5ub3QgYmUgc2FmZWx5IGVkaXRlZCAodW5wYXJzYWJsZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGVkaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0V2JFbnZJbnRvRm5veFRvbWwoY29udGVudDogc3RyaW5nLCBuZWVkc05leHRQdWJsaWM6IGJvb2xlYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgc2V0dGluZ3M6IEZub3hUb21sU3VidHJlZTtcbiAgdHJ5IHtcbiAgICBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEZub3hUb21sU3VidHJlZTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGluc2VydGluZyBXQl9FTlYgaW50byBmbm94LnRvbWwgYmVjYXVzZSBpdCBpcyBub3QgcGFyc2FibGUgYXMgVE9NTC4nKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qga2V5TmFtZXMgPSBuZWVkc05leHRQdWJsaWMgPyBbJ1dCX0VOVicsICdORVhUX1BVQkxJQ19XQl9FTlYnXSA6IFsnV0JfRU5WJ107XG4gIGxldCB1cGRhdGVkQ29udGVudCA9IGNvbnRlbnQ7XG4gIGZvciAoY29uc3QgbW9kZSBvZiB3YkVudk1vZGVzKSB7XG4gICAgLy8gVGhlIHN0YWdpbmcgbW9kZSBpcyBvcHRpb25hbDogY29tcGxldGUgaXQgb25seSB3aGVuIHRoZSByZXBvc2l0b3J5IGFscmVhZHkgZGVjbGFyZXMgdGhlIHByb2ZpbGUuXG4gICAgaWYgKG1vZGUgPT09ICdzdGFnaW5nJyAmJiAhc2V0dGluZ3MucHJvZmlsZXM/LnN0YWdpbmcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHNldHRpbmdzLnNlY3JldHMgOiBzZXR0aW5ncy5wcm9maWxlcz8uW21vZGVdPy5zZWNyZXRzO1xuICAgIGZvciAoY29uc3Qga2V5TmFtZSBvZiBrZXlOYW1lcykge1xuICAgICAgY29uc3QgZGVmaW5lZCA9IGRlZmluZWRLZXlzPy5ba2V5TmFtZV07XG4gICAgICBjb25zdCBkZWZpbmVkVmFsdWUgPVxuICAgICAgICB0eXBlb2YgZGVmaW5lZCA9PT0gJ3N0cmluZycgPyBkZWZpbmVkIDogKGRlZmluZWQgYXMgeyBkZWZhdWx0PzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uZGVmYXVsdDtcbiAgICAgIHdhcm5PblVuZXhwZWN0ZWRXYkVudlZhbHVlKGtleU5hbWUsIGRlZmluZWRWYWx1ZSwgbW9kZSk7XG4gICAgfVxuICAgIGNvbnN0IG1pc3NpbmdMaW5lcyA9IGtleU5hbWVzXG4gICAgICAuZmlsdGVyKChrZXlOYW1lKSA9PiBkZWZpbmVkS2V5cz8uW2tleU5hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChrZXlOYW1lKSA9PiBgJHtrZXlOYW1lfSA9IHsgZGVmYXVsdCA9IFwiJHttb2RlfVwiIH1gKTtcbiAgICBpZiAobWlzc2luZ0xpbmVzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRJbnRvRm5veFNlY3Rpb24oXG4gICAgICB1cGRhdGVkQ29udGVudCxcbiAgICAgIG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyAnc2VjcmV0cycgOiBgcHJvZmlsZXMuJHttb2RlfS5zZWNyZXRzYCxcbiAgICAgIG1pc3NpbmdMaW5lc1xuICAgICk7XG4gIH1cbiAgaWYgKHVwZGF0ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm4gY29udGVudDtcblxuICAvLyBSZS1wYXJzZSBiZWZvcmUgcmV0dXJuaW5nOiBhbiB1bnVzdWFsIGxheW91dCAoZS5nLiBkb3R0ZWQga2V5cyB3aXRob3V0IGEgdGFibGUgaGVhZGVyKSBjb3VsZFxuICAvLyBtYWtlIHRoZSB0ZXh0dWFsIGVkaXQgcHJvZHVjZSBhIGR1cGxpY2F0ZSB0YWJsZTsgZmFpbCBzYWZlbHkgaW5zdGVhZCBvZiBjb3JydXB0aW5nIHRoZSBmaWxlLlxuICB0cnkge1xuICAgIGNvbnN0IHVwZGF0ZWRTZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKHVwZGF0ZWRDb250ZW50KSBhcyBGbm94VG9tbFN1YnRyZWU7XG4gICAgZm9yIChjb25zdCBtb2RlIG9mIHdiRW52TW9kZXMpIHtcbiAgICAgIGlmIChtb2RlID09PSAnc3RhZ2luZycgJiYgIXNldHRpbmdzLnByb2ZpbGVzPy5zdGFnaW5nKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHVwZGF0ZWRTZXR0aW5ncy5zZWNyZXRzIDogdXBkYXRlZFNldHRpbmdzLnByb2ZpbGVzPy5bbW9kZV0/LnNlY3JldHM7XG4gICAgICBpZiAoa2V5TmFtZXMuc29tZSgoa2V5TmFtZSkgPT4gZGVmaW5lZEtleXM/LltrZXlOYW1lXSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRoZSBpbnNlcnRlZCAke21vZGV9IGVudHJpZXMgZGlkIG5vdCB0YWtlIGVmZmVjdGApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgaW5zZXJ0aW5nIFdCX0VOViBpbnRvIGZub3gudG9tbCBiZWNhdXNlICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB1cGRhdGVkQ29udGVudDtcbn1cblxuLyoqXG4gKiBXYXJucyB3aGVuIGFuIGV4aXN0aW5nIFdCX0VOVi1mYW1pbHkgZGVmaW5pdGlvbiBuYW1lcyBhIGRpZmZlcmVudCBtb2RlIHRoYW4gdGhlIG9uZSBpdCBpc1xuICogZGVmaW5lZCBmb3IgKGEgdHlwbyBsaWtlIGBwcm9kY3V0aW9uYCBvciBgcHJvZHVjdGlvbjFgLCBvciBhIGNvcHktcGFzdGVkIHdyb25nIG1vZGUpOiB3YlxuICogcmVqZWN0cyBub24tc3RhbmRhcmQgdmFsdWVzIGF0IHJ1bnRpbWUsIHNvIHN1cmZhY2luZyB0aGUgbWlzbWF0Y2ggZHVyaW5nIHdiZnkgaXMgdGhlIGVhcmxpZXN0XG4gKiBwb3NzaWJsZSBzaWduYWwuIFRoZSBwYXNzZWQgdmFsdWUgaXMgYWx3YXlzIHBsYWludGV4dCAoYSBmbm94IGBkZWZhdWx0YCBmaWVsZCkg4oCUIGVuY3J5cHRlZFxuICogZm5veCBlbnRyaWVzIGFyZSBgeyBwcm92aWRlciwgdmFsdWUgfWAgb2JqZWN0cyB3aG9zZSBgZGVmYXVsdGAgaXMgYWJzZW50LlxuICovXG5mdW5jdGlvbiB3YXJuT25VbmV4cGVjdGVkV2JFbnZWYWx1ZShrZXlOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBtb2RlOiBXYkVudk1vZGUpOiB2b2lkIHtcbiAgLy8gQW4gRU1QVFkgdmFsdWUgY291bnRzIGFzIHVuc2V0ICh3YiBzdXBwbGllcyB0aGUgZmFsbGJhY2sgbW9kZSksIG5vdCBhcyBhIG1pc21hdGNoaW5nIG1vZGUuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbW9kZSkgcmV0dXJuO1xuICAvLyBBIGR5bmFtaWMgdmFsdWUgKGUuZy4gYE5FWFRfUFVCTElDX1dCX0VOVj0ke1dCX0VOVn1gKSBtYXkgbGVnaXRpbWF0ZWx5IHJlc29sdmUgdG8gdGhlIG1vZGVcbiAgLy8gdGhyb3VnaCBleHBhbnNpb24sIHdoaWNoIHRoaXMgc3RhdGljIGNoZWNrIGNhbm5vdCBldmFsdWF0ZSDigJQgc2tpcCBpbnN0ZWFkIG9mIG1pc2ZpcmluZy5cbiAgLy8gZm5veCBleHBhbmRzIG9ubHkgYCR7Li4ufWAgKGEgYmFyZSBgJFVOU0VUYCBzdGF5cyBsaXRlcmFsKS5cbiAgaWYgKHZhbHVlLmluY2x1ZGVzKCckeycpKSByZXR1cm47XG4gIGlmIChrZXlOYW1lID09PSAnTkVYVF9QVUJMSUNfV0JfRU5WJykge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGAke2tleU5hbWV9IGluIGZub3gudG9tbCBpcyBcIiR7dmFsdWV9XCIgYnV0IHNob3VsZCBiZSBcIiR7bW9kZX1cIiBmb3IgdGhlICR7bW9kZX0gbW9kZTsgd2Igb3ZlcnJpZGVzIGl0IHdpdGggV0JfRU5WLCBidXQgYSBkaXJlY3QgZnJhbWV3b3JrIGJ1aWxkIHdvdWxkIGlubGluZSB0aGlzIHZhbHVlLmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLndhcm4oXG4gICAgYCR7a2V5TmFtZX0gaW4gZm5veC50b21sIGlzIFwiJHt2YWx1ZX1cIiBidXQgc2hvdWxkIGJlIFwiJHttb2RlfVwiIGZvciB0aGUgJHttb2RlfSBtb2RlOyB3YiByZWplY3RzIHZhbHVlcyBvdXRzaWRlIGRldmVsb3BtZW50L3Rlc3Qvc3RhZ2luZy9wcm9kdWN0aW9uLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIGxpbmVzIGF0IHRoZSB0b3Agb2YgYSBUT01MIHNlY3Rpb24sIHJpZ2h0IGFmdGVyIGl0cyBgW2hlYWRlcl1gIGxpbmUgc28gcHJvZmlsZS1zcGVjaWZpY1xuICogZW50cmllcyBzdGF5IGdyb3VwZWQgd2l0aCB0aGVpciBoZWFkZXI7IHRoZSBzZWN0aW9uIGlzIGFwcGVuZGVkIGF0IHRoZSBlbmQgd2hlbiBpdCBpcyBhYnNlbnQuXG4gKi9cbmZ1bmN0aW9uIGluc2VydEludG9Gbm94U2VjdGlvbihjb250ZW50OiBzdHJpbmcsIHNlY3Rpb25OYW1lOiBzdHJpbmcsIGluc2VydGVkTGluZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgLy8gd2JmeSB3cml0ZXMgdGhlIGhlYWRlciB3aXRob3V0IHdoaXRlc3BhY2UgYXJvdW5kIHRoZSBkb3R0ZWQta2V5IGNvbXBvbmVudHMuXG4gIGNvbnN0IGhlYWRlclBhdHRlcm4gPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXlxccypcXFske3NlY3Rpb25OYW1lLnJlcGxhY2VBbGwoJy4nLCBTdHJpbmcucmF3YFxcLmApfVxcXVxccyooPzojLiopPyRgLCAndScpO1xuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBoZWFkZXJJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gaGVhZGVyUGF0dGVybi50ZXN0KGxpbmUpKTtcbiAgaWYgKGhlYWRlckluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5bJHtzZWN0aW9uTmFtZX1dXFxuJHtpbnNlcnRlZExpbmVzLmpvaW4oJ1xcbicpfVxcbmA7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW5lcy5zbGljZSgwLCBoZWFkZXJJbmRleCArIDEpLCAuLi5pbnNlcnRlZExpbmVzLCAuLi5saW5lcy5zbGljZShoZWFkZXJJbmRleCArIDEpXS5qb2luKCdcXG4nKTtcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLyoqXG4gKiBSZXBvc2l0b3JpZXMgb3V0c2lkZSBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiIGNhbm5vdCBjYWxsIHRoZSBvcmdhbml6YXRpb24ncyByZXVzYWJsZVxuICogd29ya2Zsb3dzOiB0aG9zZSB3b3JrZmxvd3MgZGVwZW5kIG9uIG9yZ2FuaXphdGlvbiBzZWNyZXRzIChWRVJEQUNDSU9fVE9LRU4sIERpc2NvcmQgd2ViaG9va3MpXG4gKiBhbmQgc2VsZi1ob3N0ZWQgcnVubmVycyB0aGF0IG90aGVyIG93bmVycyBkbyBub3QgaGF2ZS4gVGhpcyBnZW5lcmF0b3IgaW5zdGVhZCBlbWl0c1xuICogc2VsZi1jb250YWluZWQgd29ya2Zsb3dzIGJ1aWx0IG9ubHkgZnJvbSB3aGF0IGFueSByZXBvc2l0b3J5IG93bmVyIGNhbiBwcm92aWRlOiB0aGUgcmVwb3NpdG9yeVxuICogY29udGVudHMgKG1pc2UudG9tbCwgcGFja2FnZS5qc29uIHNjcmlwdHMpIGFuZCB0aGUgc2luZ2xlIGBGTk9YX0FHRV9LRVlgIHJlcG9zaXRvcnkgc2VjcmV0IHdoZW5cbiAqIHRoZSByZXBvc2l0b3J5IHVzZXMgZm5veC4gR2VuZXJhdGlvbiBpcyBrZXllZCBvbiByZXBvc2l0b3J5IHN0YXRlLCBuZXZlciBvbiB0aGUgb3duZXInc1xuICogaWRlbnRpdHksIHNvIGl0IHdvcmtzIGZvciBhcmJpdHJhcnkgcGVyc29uYWwgcmVwb3NpdG9yaWVzLlxuICovXG5cbi8qKiBGaXJzdCBsaW5lIG9mIGV2ZXJ5IGdlbmVyYXRlZCBmaWxlOyBmaWxlcyB3aXRob3V0IGl0IGFyZSBoYW5kLXdyaXR0ZW4gYW5kIG5ldmVyIHRvdWNoZWQuICovXG5leHBvcnQgY29uc3Qgc2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnkuJztcblxuLy8gU2FtZSBwaW5zIGFzIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MgLyB0aGVpciBjb25zdW1lcnM7IFJlbm92YXRlIHVwZGF0ZXMgdGhlbSBpbiB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkuXG5jb25zdCBjaGVja291dEFjdGlvbiA9ICdhY3Rpb25zL2NoZWNrb3V0QHY3LjAuMSc7XG5jb25zdCBtaXNlQWN0aW9uID0gJ2pkeC9taXNlLWFjdGlvbkB2NC4yLjMnO1xuY29uc3QgY2FjaGVBY3Rpb24gPSAnYWN0aW9ucy9jYWNoZUB2Ni4xLjAnO1xuY29uc3QgdXBsb2FkQXJ0aWZhY3RBY3Rpb24gPSAnYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAdjcuMC4xJztcbi8vIHY2LjEuMTsgdGhlIHNhbWUgcGluIGFzIHRoZSByZXVzYWJsZSBzZW1hbnRpYy1wciB3b3JrZmxvdy5cbmNvbnN0IHNlbWFudGljUHVsbFJlcXVlc3RBY3Rpb24gPSAnYW1hbm5uL2FjdGlvbi1zZW1hbnRpYy1wdWxsLXJlcXVlc3RANDViOWVkN2NmMjQwODdhMmY3Nzg1YmY1NWJlOTczOTRiYTg3ZTFjMic7XG4vLyB2My4wLjM7IGRlcGxveXMgYXJlIG5ldHdvcmstaGVhdnkgYW5kIGJlbmVmaXQgZnJvbSByZXRyaWVzIHdpdGggYSBsb25nIHRpbWVvdXQuXG5jb25zdCByZXRyeUFjdGlvbiA9ICduaWNrLWZpZWxkcy9yZXRyeUBkZDU2ZjFjYThjYTk5MWUyMzg1YzE4YWI2ZGQzNmVhN2Y5ZmRiNTVmJztcblxuLyoqXG4gKiBKb2ItbGV2ZWwgZW52IHRoYXQgdHVybnMgdGhlIFRha3VtaSBHdWFyZCBpbnN0YWxsIHBhdGggb24sIG1pcnJvcmluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzLlxuICpcbiAqIGBzZWNyZXRzYCBpcyB1bmF2YWlsYWJsZSBpbiBhIHN0ZXAtbGV2ZWwgYGlmOmAsIHNvIHRoZSBwcmVzZW5jZSBvZiB0aGUgdG9rZW4gaXMgZXhwb3NlZCBhcyBhXG4gKiBub24tc2VjcmV0IHNpZ25hbDsgYW4gdW5zZXQgc2VjcmV0IGV4cGFuZHMgdG8gYGZhbHNlYCBhbmQgbGVhdmVzIGV2ZXJ5IEd1YXJkIHN0ZXAgc2tpcHBlZCwgd2hpY2hcbiAqIGlzIHdoYXQga2VlcHMgdGhlIGdlbmVyYXRlZCB3b3JrZmxvd3MgcnVubmFibGUgaW4gYSByZXBvc2l0b3J5IHRoYXQgbmV2ZXIgcmVnaXN0ZXJzIHRoZSBzZWNyZXQuXG4gKiBUQUtVTUlfR1VBUkRfVE9LRU4gaXRzZWxmIGlzIGRlZmluZWQtYnV0LUVNUFRZIGpvYi13aWRlIHNvIHRoZSBgJHtUQUtVTUlfR1VBUkRfVE9LRU59YCByZWZlcmVuY2VcbiAqIGluIHRoZSBnZW5lcmF0ZWQgLm5wbXJjIHN0aWxsIGV4cGFuZHMgKHRvICcnKSBpbiB0aGUgc3RlcHMgdGhhdCBkZWxpYmVyYXRlbHkgcnVuIHdpdGhvdXQgdGhlXG4gKiB0b2tlbjsgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkIHZhcmlhYmxlIGlzIHdoYXQgYnJlYWtzIGFuIGluc3RhbGwsIGFuIGVtcHR5IG9uZSBpcyBmaW5lLlxuICovXG5jb25zdCBndWFyZEpvYkVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgSEFTX1RBS1VNSV9HVUFSRF9UT0tFTjogJyR7eyAhIXNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JyxcbiAgVEFLVU1JX0dVQVJEX1RPS0VOOiAnJyxcbn07XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgbmFtZT86IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICB1c2VzPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gICd3b3JraW5nLWRpcmVjdG9yeSc/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbmN1cnJlbmN5PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7ICdydW5zLW9uJzogc3RyaW5nOyBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHN0ZXBzOiBTdGVwW10gfVxuICA+O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxQYWNrYWdlQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdID0gW3Jvb3RDb25maWddXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGlmICghKGF3YWl0IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKHdvcmtmbG93c1BhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgd29ya2Zsb3dzIGJlY2F1c2UgJHt3b3JrZmxvd3NQYXRofSByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHVzZXNGbm94ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpO1xuICAgIGNvbnN0IHdvcmtmbG93QnlGaWxlTmFtZTogUmVjb3JkPHN0cmluZywgV29ya2Zsb3c+ID0ge1xuICAgICAgJ3Rlc3QueW1sJzogYnVpbGRUZXN0V29ya2Zsb3cocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MsIHVzZXNGbm94KSxcbiAgICAgICdzZW1hbnRpYy1wci55bWwnOiBidWlsZFNlbWFudGljUHJXb3JrZmxvdygpLFxuICAgIH07XG4gICAgLy8gRGVwbG95IHdvcmtmbG93cyBhcmUgZ2VuZXJhdGVkIHBlciBkZXBsb3kgc2NyaXB0IHRoZSByZXBvc2l0b3J5IGRlY2xhcmVzLCBzbyBhIHJlcG9zaXRvcnlcbiAgICAvLyB3aXRob3V0IGEgc3RhZ2luZyBlbnZpcm9ubWVudCBzaW1wbHkgZ2V0cyBubyBzdGFnaW5nIHdvcmtmbG93LiBPbmx5IHNjcmlwdHMgdGhhdCBpbnZva2VcbiAgICAvLyBgd2IgZGVwbG95YCBxdWFsaWZ5OiBhIGJlc3Bva2UgZGVwbG95IHNjcmlwdCBtYXkgbm90IGJlIHNhZmUgdG8gdHJpZ2dlciBhdXRvbWF0aWNhbGx5XG4gICAgLy8gKGRlcGxveS1zdGFnaW5nIHJ1bnMgb24gZXZlcnkgcHVzaCB0byB0aGUgZGVmYXVsdCBicmFuY2gpLlxuICAgIGNvbnN0IHNjcmlwdHMgPSByb290Q29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9O1xuICAgIGNvbnN0IGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdyA9IGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0c1snZGVwbG95J10pO1xuICAgIGlmIChoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cpIHtcbiAgICAgIHdvcmtmbG93QnlGaWxlTmFtZVsnZGVwbG95LXByb2R1Y3Rpb24ueW1sJ10gPSBidWlsZERlcGxveVdvcmtmbG93KCdwcm9kdWN0aW9uJywgJ2RlcGxveScsIHVzZXNGbm94KTtcbiAgICB9XG4gICAgaWYgKGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0c1snZGVwbG95OnN0YWdpbmcnXSkpIHtcbiAgICAgIHdvcmtmbG93QnlGaWxlTmFtZVsnZGVwbG95LXN0YWdpbmcueW1sJ10gPSBidWlsZERlcGxveVdvcmtmbG93KCdzdGFnaW5nJywgJ2RlcGxveTpzdGFnaW5nJywgdXNlc0Zub3gpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlICYmIHJvb3RDb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ3JlbGVhc2UueW1sJ10gPSBidWlsZFJlbGVhc2VXb3JrZmxvdyhyb290Q29uZmlnLCBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3csIHVzZXNGbm94KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHdvcmtmbG93XSBvZiBPYmplY3QuZW50cmllcyh3b3JrZmxvd0J5RmlsZU5hbWUpKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVTZWxmQ29udGFpbmVkV29ya2Zsb3cocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgd29ya2Zsb3cpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVNlbGZDb250YWluZWRXb3JrZmxvdyhmaWxlUGF0aDogc3RyaW5nLCB3b3JrZmxvdzogV29ya2Zsb3cpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgLy8gVW5saWtlIFdpbGxCb29zdGVyLW9yZ2FuaXphdGlvbiByZXBvc2l0b3JpZXMsIHdiZnkgZG9lcyBub3Qgb3duIGFyYml0cmFyeSByZXBvc2l0b3JpZXMnIENJOlxuICAvLyBvbmx5IGZpbGVzIGl0IGdlbmVyYXRlZCAoaWRlbnRpZmllZCBieSB0aGUgbWFya2VyKSBhcmUgcmVnZW5lcmF0ZWQsIGFuZCBoYW5kLXdyaXR0ZW5cbiAgLy8gd29ya2Zsb3dzIGFyZSBuZXZlciB0b3VjaGVkLiBPd25lcnMgb3B0IG91dCBwZXJtYW5lbnRseSBieSByZW1vdmluZyB0aGUgbWFya2VyIGxpbmUuXG4gIC8vIEFuIGVtcHR5IG9yIHdoaXRlc3BhY2Utb25seSBmaWxlIGNhcnJpZXMgbm8gaGFuZC13cml0dGVuIGNvbnRlbnQsIHNvIGl0IGlzIHRyZWF0ZWQgYXMgYWJzZW50LlxuICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIG9sZENvbnRlbnQudHJpbSgpICE9PSAnJyAmJiAhb2xkQ29udGVudC5zdGFydHNXaXRoKHNlbGZDb250YWluZWRXb3JrZmxvd01hcmtlcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoZWFkZXIgPSBgJHtzZWxmQ29udGFpbmVkV29ya2Zsb3dNYXJrZXJ9IFJlbW92ZSB0aGlzIGxpbmUgdG8gc3RvcCB3YmZ5IGZyb20gb3ZlcndyaXRpbmcgdGhpcyBmaWxlLlxcbmA7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKHdvcmtmbG93LCB7IGxpbmVXaWR0aDogLTEgfSk7XG4gIGF3YWl0IGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aCwgaGVhZGVyICsgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiB3b3JraW5nRGlyKGRpclBhdGg6IHN0cmluZyk6IFBpY2s8U3RlcCwgJ3dvcmtpbmctZGlyZWN0b3J5Jz4ge1xuICByZXR1cm4gZGlyUGF0aCA/IHsgJ3dvcmtpbmctZGlyZWN0b3J5JzogZGlyUGF0aCB9IDoge307XG59XG5cbmZ1bmN0aW9uIGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiAvXFxid2IgZGVwbG95XFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBidWlsZFRlc3RXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbFBhY2thZ2VDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sIHVzZXNGbm94OiBib29sZWFuKTogV29ya2Zsb3cge1xuICAvLyBQbGF5d3JpZ2h0IG1heSBiZSBkZWNsYXJlZCBvbmx5IGluIHdvcmtzcGFjZSBwYWNrYWdlczsgYHdiIHRlc3Qtb24tY2lgIHJ1bnMgZXZlcnkgZGVjbGFyaW5nXG4gIC8vIHBhY2thZ2UncyBlMmUgdGVzdHMsIHNvIHRoZSB3b3JrZmxvdyBtdXN0IGluc3RhbGwgYnJvd3NlcnMgZm9yIGVhY2ggb2YgdGhlbSAodGhlaXIgdmVyc2lvbnNcbiAgLy8gbWF5IGRpZmZlciwgYW5kIGVhY2ggbGlicmFyeSB2ZXJzaW9uIHJlcXVpcmVzIGl0cyBtYXRjaGluZyBicm93c2VyIGJpbmFyaWVzKS4gQnVuJ3MgaXNvbGF0ZWRcbiAgLy8gbGlua2VyIHJlc29sdmVzIHRoZSBwbGF5d3JpZ2h0IGJpbmFyeSBvbmx5IGZyb20gdGhlIGRlY2xhcmluZyBwYWNrYWdlLCBoZW5jZSB0aGVcbiAgLy8gd29ya2luZy1kaXJlY3Rvcnkgb24gZXZlcnkgc3RlcC4gVGhlIGJyb3dzZXJzIGxhbmQgaW4gfi8uY2FjaGUvbXMtcGxheXdyaWdodCwgc2hhcmVkIGFjcm9zc1xuICAvLyB3b3Jrc3BhY2VzLCBzbyBzYW1lLXZlcnNpb24gaW5zdGFsbHMgbmF0dXJhbGx5IGRlZHVwbGljYXRlLlxuICBjb25zdCBwbGF5d3JpZ2h0RGlyUGF0aHMgPSBbLi4uYWxsUGFja2FnZUNvbmZpZ3NdXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLmRpclBhdGgubG9jYWxlQ29tcGFyZShiLmRpclBhdGgpKVxuICAgIC5maWx0ZXIoKHBhY2thZ2VDb25maWcpID0+IHBhY2thZ2VDb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KVxuICAgIC5tYXAoKHBhY2thZ2VDb25maWcpID0+IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIHBhY2thZ2VDb25maWcuZGlyUGF0aCkpO1xuICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAvLyBTdGVwLXNjb3BlZCBsaWtlIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93OiBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHJ1biBieSBgYnVuIGluc3RhbGxgXG4gIC8vIG11c3Qgbm90IGJlIGFibGUgdG8gcmVhZCB0aGUgbG9uZy1saXZlZCBhZ2UgaWRlbnRpdHkuXG4gIGNvbnN0IGZub3hFbnY6IFBpY2s8U3RlcCwgJ2Vudic+ID0gdXNlc0Zub3ggPyB7IGVudjogeyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gfSA6IHt9O1xuXG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiB9LFxuICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKHRydWUpLFxuICAgIC4uLihwbGF5d3JpZ2h0RGlyUGF0aHMubGVuZ3RoID4gMFxuICAgICAgPyAoW1xuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgsIGluZGV4KTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgbmFtZTogYEdldCBQbGF5d3JpZ2h0IHZlcnNpb24ke2RpclBhdGggPyBgICgke2RpclBhdGh9KWAgOiAnJ31gLFxuICAgICAgICAgICAgLy8gVGhlIElOU1RBTExFRCB2ZXJzaW9uLCBub3QgdGhlIHBhY2thZ2UuanNvbiBzcGVjaWZpZXI6IGEgcmFuZ2UgbGlrZSBgXjEuNDUuMGBcbiAgICAgICAgICAgIC8vIHN0YXlzIHVuY2hhbmdlZCBhY3Jvc3MgbG9ja2ZpbGUgdXBkYXRlcywgc28ga2V5aW5nIHRoZSBjYWNoZSBvbiBpdCB3b3VsZCByZXN0b3JlXG4gICAgICAgICAgICAvLyBzdGFsZSBicm93c2VycyB0aGF0IG5vIGxvbmdlciBtYXRjaCB0aGUgbGlicmFyeS4gUnVucyBhZnRlciBgYnVuIGluc3RhbGxgLCBzbyB0aGVcbiAgICAgICAgICAgIC8vIHBhY2thZ2UgaXMgcmVzb2x2YWJsZSBmcm9tIHRoZSBkZWNsYXJpbmcgcGFja2FnZSdzIGRpcmVjdG9yeS5cbiAgICAgICAgICAgIGlkOiBgcGxheXdyaWdodC12ZXJzaW9uLSR7aW5kZXh9YCxcbiAgICAgICAgICAgIHJ1bjogJ2VjaG8gXCJ2ZXJzaW9uPSQoYnVuIC1lIFwidHJ5IHsgY29uc29sZS5sb2cocmVxdWlyZShcXCdAcGxheXdyaWdodC90ZXN0L3BhY2thZ2UuanNvblxcJykudmVyc2lvbikgfSBjYXRjaCB7fVwiKVwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIicsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnQ2FjaGUgUGxheXdyaWdodCBicm93c2VycycsXG4gICAgICAgICAgICBpZDogJ3BsYXl3cmlnaHQtY2FjaGUnLFxuICAgICAgICAgICAgdXNlczogY2FjaGVBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgIHBhdGg6ICd+Ly5jYWNoZS9tcy1wbGF5d3JpZ2h0JyxcbiAgICAgICAgICAgICAga2V5OiBgcGxheXdyaWdodC1cXCR7eyBydW5uZXIub3MgfX0tJHtwbGF5d3JpZ2h0RGlyUGF0aHNcbiAgICAgICAgICAgICAgICAubWFwKChfLCBpbmRleCkgPT4gYFxcJHt7IHN0ZXBzLnBsYXl3cmlnaHQtdmVyc2lvbi0ke2luZGV4fS5vdXRwdXRzLnZlcnNpb24gfX1gKVxuICAgICAgICAgICAgICAgIC5qb2luKCctJyl9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoKTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgaWY6IFwic3RlcHMucGxheXdyaWdodC1jYWNoZS5vdXRwdXRzLmNhY2hlLWhpdCAhPSAndHJ1ZSdcIixcbiAgICAgICAgICAgIHJ1bjogJ2J1biBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHMnLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIC8vIFRoZSBjYWNoZWQgYnJvd3NlcnMgc3RpbGwgbmVlZCB0aGVpciBzeXN0ZW0gZGVwZW5kZW5jaWVzIG9uIGEgZnJlc2ggcnVubmVyLlxuICAgICAgICAgICAgaWY6IFwic3RlcHMucGxheXdyaWdodC1jYWNoZS5vdXRwdXRzLmNhY2hlLWhpdCA9PSAndHJ1ZSdcIixcbiAgICAgICAgICAgIHJ1bjogJ2J1biBwbGF5d3JpZ2h0IGluc3RhbGwtZGVwcycsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXSBzYXRpc2ZpZXMgU3RlcFtdKVxuICAgICAgOiBbXSksXG4gICAgLi4uKGhhc1R5cGVjaGVjayA/IFt7IHJ1bjogJ2J1biBydW4gdHlwZWNoZWNrJywgLi4uZm5veEVudiB9XSA6IFtdKSxcbiAgICB7IHJ1bjogJ2J1biBydW4gbGludCcsIC4uLmZub3hFbnYgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVGVzdCcsXG4gICAgICBpZDogJ3Rlc3QnLFxuICAgICAgcnVuOiBgaWYgW1sgXCIkVVBMT0FEX1RFU1RfTE9HXCIgIT0gXCJ0cnVlXCIgXV07IHRoZW5cbiAgZXhlYyBidW4gcnVuIHRlc3QvY2lcbmZpXG5sb2dfZGlyPSQobWt0ZW1wIC1kIFwiJFJVTk5FUl9URU1QL3Rlc3Qtb3V0cHV0LlhYWFhYWFwiKVxuZWNobyBcImxvZ19wYXRoPSRsb2dfZGlyL3Rlc3QubG9nXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiXG4jIEtlZXAgZHJhaW5pbmcgdGVzdCBvdXRwdXQgd2hlbiB0aGUgbG9nIHJlYWNoZXMgYSBmaWxlLXNpemUgbGltaXQuXG5zZXQgK2VcbmJ1biBydW4gdGVzdC9jaSAyPiYxIHwgKHRyYXAgJycgWEZTWjsgdGVlIFwiJGxvZ19kaXIvdGVzdC5sb2dcIilcbnRlc3Rfc3RhdHVzPShcIlxcJHtQSVBFU1RBVFVTW0BdfVwiKVxuaWYgKCggdGVzdF9zdGF0dXNbMF0gIT0gMCApKTsgdGhlbiBleGl0IFwiXFwke3Rlc3Rfc3RhdHVzWzBdfVwiOyBmaVxuZXhpdCBcIlxcJHt0ZXN0X3N0YXR1c1sxXX1cImAsXG4gICAgICBlbnY6IHsgLi4uZm5veEVudi5lbnYsIFVQTE9BRF9URVNUX0xPRzogJyR7eyB2YXJzLlVQTE9BRF9URVNUX0xPRyB9fScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdVcGxvYWQgdGVzdCBsb2cnLFxuICAgICAgaWY6IFwiJHt7IGFsd2F5cygpICYmIHZhcnMuVVBMT0FEX1RFU1RfTE9HID09ICd0cnVlJyAmJiBzdGVwcy50ZXN0Lm91dHB1dHMubG9nX3BhdGggIT0gJycgfX1cIixcbiAgICAgIHVzZXM6IHVwbG9hZEFydGlmYWN0QWN0aW9uLFxuICAgICAgd2l0aDoge1xuICAgICAgICBuYW1lOiAndGVzdC1vdXRwdXQtJHt7IHJ1bm5lci5vcyB9fS0ke3sgam9iLmNoZWNrX3J1bl9pZCB9fS0ke3sgZ2l0aHViLnJ1bl9hdHRlbXB0IH19JyxcbiAgICAgICAgcGF0aDogJyR7eyBzdGVwcy50ZXN0Lm91dHB1dHMubG9nX3BhdGggfX0nLFxuICAgICAgICAncmV0ZW50aW9uLWRheXMnOiAxNCxcbiAgICAgICAgJ2lmLW5vLWZpbGVzLWZvdW5kJzogJ2Vycm9yJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAuLi4ocGxheXdyaWdodERpclBhdGhzLmxlbmd0aCA+IDBcbiAgICAgID8gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdVcGxvYWQgdGVzdCByZXN1bHRzJyxcbiAgICAgICAgICAgIGlmOiAnJHt7IGFsd2F5cygpIH19JyxcbiAgICAgICAgICAgIHVzZXM6IHVwbG9hZEFydGlmYWN0QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICBuYW1lOiAndGVzdC1yZXN1bHRzJyxcbiAgICAgICAgICAgICAgLy8gRXZlcnkgZGVjbGFyaW5nIHBhY2thZ2Ugd3JpdGVzIGl0cyBvd24gdGVzdC1yZXN1bHRzIGRpcmVjdG9yeTsgYSBuZXdsaW5lLXNlcGFyYXRlZFxuICAgICAgICAgICAgICAvLyBsaXN0IHVwbG9hZHMgdGhlbSBhbGwuXG4gICAgICAgICAgICAgIHBhdGg6IHBsYXl3cmlnaHREaXJQYXRoc1xuICAgICAgICAgICAgICAgIC5tYXAoKGRpclBhdGgpID0+IChkaXJQYXRoID8gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICd0ZXN0LXJlc3VsdHMnKSA6ICd0ZXN0LXJlc3VsdHMnKSlcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyksXG4gICAgICAgICAgICAgICdpZi1uby1maWxlcy1mb3VuZCc6ICdpZ25vcmUnLFxuICAgICAgICAgICAgICAncmV0ZW50aW9uLWRheXMnOiAxNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXVxuICAgICAgOiBbXSksXG4gIF07XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHsgYnJhbmNoZXM6IFsnbWFpbiddIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6ICdyZWFkJyB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIGVudjogeyBGT1JDRV9DT0xPUjogJzMnLCBXQl9FTlY6ICd0ZXN0JywgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHMsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGVwbG95V29ya2Zsb3coZW52aXJvbm1lbnQ6ICdzdGFnaW5nJyB8ICdwcm9kdWN0aW9uJywgc2NyaXB0TmFtZTogc3RyaW5nLCB1c2VzRm5veDogYm9vbGVhbik6IFdvcmtmbG93IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBgRGVwbG95IGFwcCBvbiAke2Vudmlyb25tZW50fWAsXG4gICAgb246IHtcbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgICAgLy8gUHJvZHVjdGlvbiBkZXBsb3lzIGZvbGxvdyBwdWJsaXNoZWQgcmVsZWFzZXMgKHNlZSB0aGUgcmVsZWFzZSB3b3JrZmxvdydzIHRyaWdnZXIgc3RlcCk7XG4gICAgICAvLyBzdGFnaW5nIGNvbnZlcmdlcyBvbiBldmVyeSBkZWZhdWx0LWJyYW5jaCBwdXNoLlxuICAgICAgLi4uKGVudmlyb25tZW50ID09PSAncHJvZHVjdGlvbidcbiAgICAgICAgPyB7IHJlbGVhc2U6IHsgdHlwZXM6IFsncHVibGlzaGVkJ10gfSB9XG4gICAgICAgIDogeyBwdXNoOiB7IGJyYW5jaGVzOiBbJ21haW4nXSwgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddIH0gfSksXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7IGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgICBqb2JzOiB7XG4gICAgICBkZXBsb3k6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIGVudjogeyBXQl9FTlY6IGVudmlyb25tZW50LCAuLi5ndWFyZEpvYkVudiB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIC8vIGZldGNoLWRlcHRoIDAgc28gYGdpdCBkZXNjcmliZWAgc2VlcyB0aGUgdGFncyBXQl9WRVJTSU9OIGlzIGRlcml2ZWQgZnJvbS5cbiAgICAgICAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uLCB3aXRoOiB7ICdmZXRjaC1kZXB0aCc6IDAgfSB9LFxuICAgICAgICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdTZXQgV0JfVkVSU0lPTicsXG4gICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbldCX1ZFUlNJT049JChnaXQgZGVzY3JpYmUgLS1hbHdheXMgLS10YWdzKVxcbmVjaG8gXCJXQl9WRVJTSU9OPSRXQl9WRVJTSU9OXCIgPj4gXCIkR0lUSFVCX0VOVlwiJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKGZhbHNlKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnRGVwbG95JyxcbiAgICAgICAgICAgIHVzZXM6IHJldHJ5QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICB0aW1lb3V0X21pbnV0ZXM6IDYwLFxuICAgICAgICAgICAgICBtYXhfYXR0ZW1wdHM6IDUsXG4gICAgICAgICAgICAgIGNvbW1hbmQ6IGBidW4gcnVuICR7c2NyaXB0TmFtZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFN0ZXAtc2NvcGVkIGxpa2UgdGhlIHRlc3Qgd29ya2Zsb3c6IGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdHMgcnVuIGJ5XG4gICAgICAgICAgICAvLyBgYnVuIGluc3RhbGxgIG11c3Qgbm90IGJlIGFibGUgdG8gcmVhZCB0aGUgbG9uZy1saXZlZCBhZ2UgaWRlbnRpdHkuXG4gICAgICAgICAgICAuLi4odXNlc0Zub3ggPyB7IGVudjogeyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gfSA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbGVhc2VXb3JrZmxvdyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3c6IGJvb2xlYW4sXG4gIHVzZXNGbm94OiBib29sZWFuXG4pOiBXb3JrZmxvdyB7XG4gIGNvbnN0IGZub3hFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB1c2VzRm5veCA/IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IDoge307XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7IGJyYW5jaGVzOiBbLi4uY29uZmlnLnJlbGVhc2UuYnJhbmNoZXNdIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgZGlzcGF0Y2hpbmcgdGhlIHByb2R1Y3Rpb24gZGVwbG95IHdvcmtmbG93IGFmdGVyIGEgcmVsZWFzZVxuICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdyA/IHsgYWN0aW9uczogJ3dyaXRlJyB9IDoge30pLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgLy8gUmVsZWFzZXMgYnVpbGQgcHJvZHVjdGlvbiBhcnRpZmFjdHMsIGhlbmNlIHRoZSBlbnZpcm9ubWVudCDigJQgdGhlIHNhbWUgZGVmYXVsdCBhcyB0aGVcbiAgICAgICAgLy8gcmV1c2FibGUgcmVsZWFzZSB3b3JrZmxvdy4gd2IncyBDSSBndWFyZCBhbHNvIHJlcXVpcmVzIGFuIGV4cG9ydGVkIFdCX0VOViwgc28gd2l0aG91dFxuICAgICAgICAvLyBpdCBhIGBwb3N0aW5zdGFsbGAgdGhhdCBjYWxscyB3YiAoZS5nLiBgd2IgZ2VuLWNvZGVgKSBleGl0cyAxIGJlZm9yZSBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICAgIC8vIHJ1bnMuXG4gICAgICAgIGVudjogeyBXQl9FTlY6ICdwcm9kdWN0aW9uJywgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICAvLyBmZXRjaC1kZXB0aCAwOiBzZW1hbnRpYy1yZWxlYXNlIHJlYWRzIHRoZSBmdWxsIGhpc3RvcnkgdG8gY29tcHV0ZSB0aGUgbmV4dCB2ZXJzaW9uLlxuICAgICAgICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24sIHdpdGg6IHsgJ2ZldGNoLWRlcHRoJzogMCB9IH0sXG4gICAgICAgICAgeyB1c2VzOiBtaXNlQWN0aW9uIH0sXG4gICAgICAgICAgLi4uYnVpbGRJbnN0YWxsU3RlcHMoZmFsc2UpLFxuICAgICAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3dcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdHZXQgY3VycmVudCBsYXRlc3QgdGFnJyxcbiAgICAgICAgICAgICAgICAgIGlkOiAncHJlLXJlbGVhc2UtdGFnJyxcbiAgICAgICAgICAgICAgICAgIHJ1bjogJ3NldCAtZXVvIHBpcGVmYWlsXFxuZWNobyBcInRhZz0kKGdpdCBkZXNjcmliZSAtLXRhZ3MgLS1hYmJyZXY9MCAyPi9kZXYvbnVsbCB8fCBlY2hvIFxcJ1xcJylcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCInLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICAgICAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UgY2hlY2tzIE5vZGUuanMgcnVudGltZSByZXF1aXJlbWVudHM7IGBidW4gPGJpbj5gIHJlc3BlY3RzIGl0c1xuICAgICAgICAgICAgLy8gYCMhL3Vzci9iaW4vZW52IG5vZGVgIHNoZWJhbmcsIHNvIGl0IHN0aWxsIHJ1bnMgdW5kZXIgcmVhbCBOb2RlLlxuICAgICAgICAgICAgcnVuOiAnYnVuIHNlbWFudGljLXJlbGVhc2UnLFxuICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICAgICAgICAgIExFRlRIT09LOiAnMCcsXG4gICAgICAgICAgICAgIC4uLmZub3hFbnYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvd1xuICAgICAgICAgICAgPyAoW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdDaGVjayBmb3IgbmV3IHJlbGVhc2UgdGFnJyxcbiAgICAgICAgICAgICAgICAgIGlkOiAncG9zdC1yZWxlYXNlLXRhZycsXG4gICAgICAgICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbmdpdCBmZXRjaCAtLXRhZ3MgLS1mb3JjZVxcbk5FV19UQUc9JChnaXQgZGVzY3JpYmUgLS10YWdzIC0tYWJicmV2PTAgMj4vZGV2L251bGwgfHwgZWNobyBcXCdcXCcpXFxuZWNobyBcInRhZz0kTkVXX1RBR1wiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxcbmlmIFtbIC1uIFwiJE5FV19UQUdcIiAmJiBcIiRORVdfVEFHXCIgIT0gXCIke3sgc3RlcHMucHJlLXJlbGVhc2UtdGFnLm91dHB1dHMudGFnIH19XCIgXV07IHRoZW5cXG4gIGVjaG8gXCJjcmVhdGVkPXRydWVcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCJcXG5maScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZjogXCJzdGVwcy5wb3N0LXJlbGVhc2UtdGFnLm91dHB1dHMuY3JlYXRlZCA9PSAndHJ1ZSdcIixcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdUcmlnZ2VyIHByb2R1Y3Rpb24gZGVwbG95JyxcbiAgICAgICAgICAgICAgICAgIC8vIEEgR0lUSFVCX1RPS0VOLWNyZWF0ZWQgcmVsZWFzZSBkb2VzIG5vdCBmaXJlIHRoZSBkZXBsb3kgd29ya2Zsb3cnc1xuICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZS1wdWJsaXNoZWQgdHJpZ2dlciwgc28gZGlzcGF0Y2ggaXQgZXhwbGljaXRseSBvbiB0aGUgbmV3IHRhZy5cbiAgICAgICAgICAgICAgICAgIHJ1bjogJ2doIHdvcmtmbG93IHJ1biBkZXBsb3ktcHJvZHVjdGlvbi55bWwgLS1yZWYgXCIke3sgc3RlcHMucG9zdC1yZWxlYXNlLXRhZy5vdXRwdXRzLnRhZyB9fVwiJyxcbiAgICAgICAgICAgICAgICAgIGVudjogeyBHSF9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdIHNhdGlzZmllcyBTdGVwW10pXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgaW5zdGFsbCBzZXF1ZW5jZSBldmVyeSBnZW5lcmF0ZWQgd29ya2Zsb3cgc2hhcmVzOiBgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGVgLCBoYXJkZW5lZCBpbnRvIHRoZVxuICogcmV1c2FibGUgd29ya2Zsb3dzJyB0aHJlZS1zdGVwIGRhbmNlIHdoZW4gdGhlIHJlcG9zaXRvcnkgcmVnaXN0ZXJzIGEgVEFLVU1JX0dVQVJEX1RPS0VOIHNlY3JldC5cbiAqXG4gKiBUYWt1bWkgR3VhcmQgKGh0dHBzOi8vZmxhdHQudGVjaC90YWt1bWkvZmVhdHVyZXMvZ3VhcmQpIGlzIGEgcmVnaXN0cnkgcHJveHkgdGhhdCBibG9ja3NcbiAqIGtub3duLW1hbGljaW91cyBwYWNrYWdlcy4gUm91dGluZyB0aGUgREVGQVVMVCByZWdpc3RyeSB0aHJvdWdoIGl0IGlzIHdoYXQgcHJvdGVjdHMgdGhlIGluc3RhbGwsXG4gKiBhbmQgdGhlIHRva2VuIGF1dGhlbnRpY2F0ZXMgdGhhdCBwcm94eSDigJQgc28gdGhlIHRva2VuIGhhcyB0byBiZSBwcmVzZW50IHdoaWxlIGRlcGVuZGVuY2llcyBhcmVcbiAqIHJlc29sdmVkLCB3aGljaCBpcyBleGFjdGx5IHdoZW4gYSBjb21wcm9taXNlZCBkZXBlbmRlbmN5J3MgbGlmZWN5Y2xlIHNjcmlwdCB3b3VsZCBydW4uIEhlbmNlIHRoZVxuICogc3BsaXQ6IHJlc29sdmUgYW5kIGRvd25sb2FkIHdpdGggYC0taWdub3JlLXNjcmlwdHNgIGFuZCB0aGUgdG9rZW4sIHRoZW4gcmVwbGF5IHRoZSBza2lwcGVkXG4gKiBsaWZlY3ljbGUgc2NyaXB0cyBpbiBhIHNlY29uZCBpbnN0YWxsIHRoYXQgaGFzIG5vIHRva2VuIChldmVyeSBwYWNrYWdlIGlzIGFscmVhZHkgY2FjaGVkLCBhbmRcbiAqIEd1YXJkIHNlcnZlcyBhbm9ueW1vdXNseSBhbnl3YXkpLiBPbmx5IGJ1biBpcyBnZW5lcmF0ZWQgaGVyZSwgYW5kIGJ1biByZWFkcyAubnBtcmMsIHNvIG5vXG4gKiBwYWNrYWdlLW1hbmFnZXIgYnJhbmNoaW5nIGlzIG5lZWRlZC5cbiAqXG4gKiBUaGUgc2hlbGwgZGV0YWlscyBkZWxpYmVyYXRlbHkgbWlycm9yIHJldXNhYmxlLXdvcmtmbG93cycgcHJvZHVjdGlvbi1wcm92ZW4gaW5zdGFsbCBzdGVwczogYmFyZVxuICogYCRSVU5ORVJfVEVNUGAgKHNldCBieSB0aGUgcnVubmVyIGFwcGxpY2F0aW9uIG9uIGV2ZXJ5IHJ1bm5lciwgYW5kIGBzZXQgLXVgIGZhaWxzIGxvdWRseSBpZiBub3QpLFxuICogYFtbIC1lIC5ucG1yYyBdXWAsIGFuZCB0aGUgc2Vjb25kIGBybSAtcmYgbm9kZV9tb2R1bGVzYCBpbiB0aGUgZmFsbGJhY2sgKGFuIGludGVycnVwdGVkIGxpZmVjeWNsZVxuICogcnVuIG1heSBsZWF2ZSBub2RlX21vZHVsZXMgaW5jb25zaXN0ZW50LCBzbyB0aGUgcmV0cnkgc3RhcnRzIGNsZWFuIHJhdGhlciB0aGFuIHRydXN0aW5nIGEgcmVwYWlyKS5cbiAqXG4gKiBgdG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlYCBkZWNpZGVzIHdoYXQgYSBmYWlsaW5nIGxpZmVjeWNsZS1zY3JpcHQgcmVwbGF5IGRvZXMuIEV2ZXJ5XG4gKiByZXBsYXkgcnVucyB0b2tlbmxlc3MgYW5kIHdpdGhvdXQgRk5PWF9BR0VfS0VZICh0aGUga2V5IGlzIHNjb3BlZCB0byB0aGUgbGF0ZXIgRGVwbG95L1JlbGVhc2VcbiAqIHN0ZXApLCBzbyBhIHBvc3RpbnN0YWxsIHRoYXQgbmVlZHMgZGVjcnlwdGVkIHNlY3JldHMgaXMgdW5zdXBwb3J0ZWQgaW4gYWxsIG9mIHRoZW0gYnkgZGVzaWduLlxuICogVGhlIHRlc3Qgd29ya2Zsb3cgdG9sZXJhdGVzIHRoZSBmYWlsdXJlIGJlY2F1c2UgdHlwZWNoZWNrL2xpbnQvdGVzdCBmYWlsIGxvdWRseSBvbiBhIGRlZ3JhZGVkXG4gKiB0cmVlIGFueXdheS4gRGVwbG95IGFuZCByZWxlYXNlIHdvcmtmbG93cyBtdXN0IG5vdDogYSBgOjp3YXJuaW5nOjpgIGRvZXMgbm90IGZhaWwgdGhlIGpvYiwgc29cbiAqIHRoZSBmYWxsYmFjayB3b3VsZCBzaGlwIGEgdHJlZSB3aG9zZSBsaWZlY3ljbGUgc2NyaXB0cyAoZS5nLiBhIGBwb3N0aW5zdGFsbDogd2IgZ2VuLWNvZGVgKVxuICogbmV2ZXIgcmFuLCBzaWxlbnRseSBkZXBsb3lpbmcgZGVncmFkZWQgb3V0cHV0ICgjMTEyNykuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW5zdGFsbFN0ZXBzKHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZTogYm9vbGVhbik6IFN0ZXBbXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ0dlbmVyYXRlIC5ucG1yYyBmb3IgVGFrdW1pIEd1YXJkJyxcbiAgICAgIC8vIFRoZSB0b2tlbiBpcyB3cml0dGVuIGFzIGEgbGl0ZXJhbCBgJHtUQUtVTUlfR1VBUkRfVE9LRU59YCByZWZlcmVuY2UgdGhhdCBidW4gZXhwYW5kcyBhdFxuICAgICAgLy8gaW5zdGFsbCB0aW1lLCBzbyB0aGUgc2VjcmV0IGl0c2VsZiBuZXZlciBsYW5kcyBpbiBhIGZpbGUuIFRoZSBtYW5hZ2VkIGxpbmVzIGFyZSBzdHJpcHBlZFxuICAgICAgLy8gZnJvbSBhbiBleGlzdGluZyAubnBtcmMgZmlyc3Q6IGEgcmVwb3NpdG9yeSBvdXRzaWRlIHRoZSBvcmdhbml6YXRpb25zIG1heSBsZWdpdGltYXRlbHlcbiAgICAgIC8vIGNvbW1pdCBvbmUgKHNjb3BlIG1hcHBpbmdzIGZvciBhbm90aGVyIHJlZ2lzdHJ5KSwgYW5kIGRyb3BwaW5nIG9ubHkgdGhlc2UgdHdvIGxpbmVzIGtlZXBzXG4gICAgICAvLyB0aGUgcmVzdCBvZiBpdCBpbiBlZmZlY3QuIFJlcGxhY2luZyB0aGUgZmlsZSB3aXRoIGBtdmAgcmF0aGVyIHRoYW4gYXBwZW5kaW5nIGluIHBsYWNlIHN0b3BzXG4gICAgICAvLyBhIGNvbW1pdHRlZCBzeW1saW5rIGZyb20gcmVkaXJlY3RpbmcgdGhlIHdyaXRlIGludG8sIHNheSwgYSBwZXJzaXN0ZW50IGhvbWUgbnBtcmMuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuTlBNUkM9XCIkKG1rdGVtcCBcIiRSVU5ORVJfVEVNUC9ucG1yYy5YWFhYWFhcIilcIlxuaWYgW1sgLWUgLm5wbXJjIF1dOyB0aGVuXG4gIGdyZXAgLXZFICdecmVnaXN0cnk9fF4vL25wbVxcXFwuZmxhdHRcXFxcLnRlY2gvOl9hdXRoVG9rZW4nIC5ucG1yYyA+IFwiJE5QTVJDXCIgfHwgdHJ1ZVxuZmlcbmVjaG8gJ3JlZ2lzdHJ5PWh0dHBzOi8vbnBtLmZsYXR0LnRlY2gvJyA+PiBcIiROUE1SQ1wiXG5lY2hvICcvL25wbS5mbGF0dC50ZWNoLzpfYXV0aFRva2VuPVxcJHtUQUtVTUlfR1VBUkRfVE9LRU59JyA+PiBcIiROUE1SQ1wiXG5ybSAtZiAubnBtcmNcbm12IFwiJE5QTVJDXCIgLm5wbXJjYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgICAvLyAtLWZyb3plbi1sb2NrZmlsZTogYSBwbGFpbiBgYnVuIGluc3RhbGxgIHNpbGVudGx5IHJlcGFpcnMgYSBidW4ubG9jayB0aGF0IGlzIHN0YWxlIGFnYWluc3RcbiAgICAgIC8vIHBhY2thZ2UuanNvbiwgc28gQ0kgd291bGQgcnVuIGRlcGVuZGVuY3kgcmVzb2x1dGlvbnMgdGhhdCB3ZXJlIG5ldmVyIHJldmlld2VkICgjMTEyNikuXG4gICAgICAvLyBXaXRoIE5PIGJ1bi5sb2NrIGF0IGFsbCwgLS1mcm96ZW4tbG9ja2ZpbGUgc2lsZW50bHkgaW5zdGFsbHMgZnJlc2gsIHVucGlubmVkIHJlc29sdXRpb25zXG4gICAgICAvLyAoQnVuIDEuMy4xNCBleGl0cyAwIGFuZCB3cml0ZXMgbm8gbG9ja2ZpbGUpLCBzbyBhIG1pc3NpbmcgbG9ja2ZpbGUgbXVzdCBmYWlsIGV4cGxpY2l0bHkuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuaWYgW1sgISAtZSBidW4ubG9jayBdXTsgdGhlblxuICBlY2hvIFwiOjplcnJvcjo6YnVuLmxvY2sgaXMgbWlzc2luZzsgY29tbWl0IGl0IHNvIENJIGluc3RhbGxzIHN0YXkgcmVwcm9kdWNpYmxlXCJcbiAgZXhpdCAxXG5maVxuaWYgW1sgXCIkSEFTX1RBS1VNSV9HVUFSRF9UT0tFTlwiID09IFwidHJ1ZVwiIF1dOyB0aGVuXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlIC0taWdub3JlLXNjcmlwdHNcbmVsc2VcbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGVcbmZpYCxcbiAgICAgIC8vIFN0ZXAtc2NvcGVkOiBhIGpvYi1sZXZlbCB0b2tlbiB3b3VsZCBiZSByZWFkYWJsZSBieSBldmVyeSBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHQgdGhlXG4gICAgICAvLyB0b2tlbmxlc3MgcmVwbGF5IGJlbG93IHJ1bnMuXG4gICAgICBlbnY6IHsgVEFLVU1JX0dVQVJEX1RPS0VOOiAnJHt7IHNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ1J1biBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHdpdGhvdXQgcmVnaXN0cnkgY3JlZGVudGlhbHMnLFxuICAgICAgLy8gQSByZXBlYXRlZCBgYnVuIGluc3RhbGxgIGlzIGEgbm8tb3AgdGhhdCByZXBsYXlzIG5vdGhpbmcsIHNvIG5vZGVfbW9kdWxlcyBoYXMgdG8gZ28gZmlyc3QuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxucm0gLXJmIG5vZGVfbW9kdWxlc1xuYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUke1xuICAgICAgICB0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmVcbiAgICAgICAgICA/IGAgfHwge1xuICBlY2hvIFwiOjp3YXJuaW5nOjpMaWZlY3ljbGUgc2NyaXB0cyBmYWlsZWQ7IGNvbXBsZXRpbmcgdGhlIGluc3RhbGwgd2l0aG91dCB0aGVtXCJcbiAgcm0gLXJmIG5vZGVfbW9kdWxlc1xuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSAtLWlnbm9yZS1zY3JpcHRzXG59YFxuICAgICAgICAgIDogJydcbiAgICAgIH1gLFxuICAgIH0sXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ1JlbW92ZSB0aGUgZ2VuZXJhdGVkIC5ucG1yYycsXG4gICAgICAvLyBOb3RoaW5nIGFmdGVyIHRoZSBpbnN0YWxsIG5lZWRzIHRoZSBwcm94eSwgYW5kIGxlYXZpbmcgaXQgaW4gcGxhY2Ugd291bGQgYnJlYWsgdGhlIG9uZVxuICAgICAgLy8gdGhpbmcgR3VhcmQgcmVmdXNlcyB0byBzZXJ2ZTogaXQgYW5zd2VycyBgbnBtIHB1Ymxpc2hgIHdpdGggNDA1LCBzbyBhIHJlbGVhc2Ugd29ya2Zsb3dcbiAgICAgIC8vIHdob3NlIHBhY2thZ2UgbGFja3MgYW4gZXhwbGljaXQgcHVibGlzaENvbmZpZy5yZWdpc3RyeSB3b3VsZCBmYWlsIHRvIHB1Ymxpc2guXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuaWYgZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCAtLSAubnBtcmMgPiAvZGV2L251bGwgMj4mMTsgdGhlblxuICBnaXQgY2hlY2tvdXQgLS0gLm5wbXJjXG5lbHNlXG4gIHJtIC1mIC5ucG1yY1xuZmlgLFxuICAgIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2VtYW50aWNQcldvcmtmbG93KCk6IFdvcmtmbG93IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHsgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICAvLyBUaGUgYWN0aW9uIHJlYWRzIHRoZSBwdWxsIHJlcXVlc3QsIGFuZCBpdHMgYHdpcGAgc3VwcG9ydCBwb3N0cyBhIGNvbW1pdCBzdGF0dXM7IG5laXRoZXJcbiAgICAgICAgLy8gcGVybWlzc2lvbiBpcyBncmFudGVkIHdoZW4gdGhlIHJlcG9zaXRvcnkgcmVzdHJpY3RzIGRlZmF1bHQgd29ya2Zsb3cgcGVybWlzc2lvbnMuXG4gICAgICAgIHBlcm1pc3Npb25zOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLCBzdGF0dXNlczogJ3dyaXRlJyB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVzZXM6IHNlbWFudGljUHVsbFJlcXVlc3RBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7IHdpcDogdHJ1ZSB9LFxuICAgICAgICAgICAgZW52OiB7IEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW50ZXJmYWNlIE1pc2VUb21sIHtcbiAgdG9vbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLy8gVGhlIG9sZGVzdCBCdW4gcnVudGltZSB3YmZ5IHN1cHBvcnRzLlxuZXhwb3J0IGNvbnN0IG1pbmltdW1CdW5WZXJzaW9uID0gJzEuNC4wJztcblxuLyoqXG4gKiBQaW5zIE5vZGUuanMgYW5kIHRoZSBsYXRlc3QgQnVuIGFuZCAod2hlbiBmbm94LnRvbWwgZXhpc3RzKSBmbm94IHZlcnNpb25zIHdoaWxlIHByZXNlcnZpbmdcbiAqIHVucmVsYXRlZCBtaXNlIHNldHRpbmdzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVNaXNlVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU1pc2VUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1pc2VUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ21pc2UudG9tbCcpO1xuICAgIC8vIEEgcGFyc2UgZmFpbHVyZSBtdXN0IGFib3J0IGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvIHt9OiByZWdlbmVyYXRpbmcgZnJvbSBhbiBlbXB0eSBvYmplY3RcbiAgICAvLyB3b3VsZCBzaWxlbnRseSByZXBsYWNlIHRoZSB1c2VyJ3MgZXhpc3RpbmcgKGFsYmVpdCBicm9rZW4pIG1pc2UudG9tbC5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHBhcnNlTWlzZVRvbWwobWlzZVRvbWxQYXRoKTtcbiAgICBjb25zdCB0b29scyA9IHsgLi4uc2V0dGluZ3MudG9vbHMgfTtcblxuICAgIC8vIEVuc3VyZSBOb2RlLmpzIGlzIGFsd2F5cyBwaW5uZWQ6IGdlbmVyYXRlZCBob29rcyBhbmQgQ0kgcnVuIGBtaXNlIGluc3RhbGxgLCBhbmQgYW4gdW5waW5uZWRcbiAgICAvLyBOb2RlIHdvdWxkIGNvbWUgZnJvbSB3aGF0ZXZlciBoYXBwZW5zIHRvIGJlIG9uIFBBVEguXG4gICAgLy8gTGlmdC10aGVuLXBpbjogdGhlIGxpZnQgb25seSB0b3VjaGVzIGV4YWN0IHBpbnMgYW5kIHRoZSBwaW4gb25seSB0b3VjaGVzIHNlbGVjdG9ycywgc29cbiAgICAvLyBvcmRlcmluZyB0aGUgbGlmdCBmaXJzdCBhdm9pZHMgcmVzb2x2aW5nIGBtaXNlIGxhdGVzdCBub2RlQGx0c2AgdHdpY2UgZm9yIHVucGlubmVkIHJlcG9zLlxuICAgIHRvb2xzLm5vZGUgPSBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKFxuICAgICAgJ25vZGUnLFxuICAgICAgbGlmdE91dGRhdGVkVG9vbFZlcnNpb25XaXRoaW5NYWpvcignbm9kZUBsdHMnLCB0b29scy5ub2RlLCBjb25maWcuZGlyUGF0aCksXG4gICAgICBjb25maWcuZGlyUGF0aFxuICAgICk7XG4gICAgdG9vbHMuYnVuID0gcGluTGF0ZXN0VG9vbFZlcnNpb24oJ2J1bicsIHRvb2xzLmJ1biwgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKSkge1xuICAgICAgdG9vbHMuZm5veCA9IHBpbkxhdGVzdFRvb2xWZXJzaW9uKCdmbm94JywgdG9vbHMuZm5veCwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgICBzZXR0aW5ncy50b29scyA9IHRvb2xzO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBCdW4gMS40IHByb3ZpZGVzIFRPTUwuc3RyaW5naWZ5IGJlZm9yZSB0aGUgYWdlLWdhdGVkIEB0eXBlcy9idW4gdmVyc2lvbiBkZWNsYXJlcyBpdC5cbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKG1pc2VUb21sUGF0aCwgQnVuLlRPTUwuc3RyaW5naWZ5KHNldHRpbmdzKSk7XG4gIH0pO1xufVxuXG4vKiogVXBkYXRlcyB0byB0aGUgbGF0ZXN0IHJlbGVhc2UgYWNyb3NzIG1ham9yIHZlcnNpb25zIHdpdGhvdXQgZG93bmdyYWRpbmcgZXhpc3RpbmcgZXhhY3QgcGlucy4gKi9cbmZ1bmN0aW9uIHBpbkxhdGVzdFRvb2xWZXJzaW9uKHRvb2w6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgLy8gUmVzb2x2ZSBpbmRlcGVuZGVudGx5IG9mIHRoZSB0YXJnZXQncyB0cnVzdCBzdGF0ZSBhbmQgdG9vbCBhbGlhc2VzLlxuICBjb25zdCByZXNvbHZlZFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ21pc2UnLCBbJy0tbm8tY29uZmlnJywgJ2xhdGVzdCcsIHRvb2xdLCBjd2QpO1xuICBpZiAoIXNlbXZlci52YWxpZChyZXNvbHZlZFZlcnNpb24pKSByZXR1cm4gdmVyc2lvbiA/PyAnbGF0ZXN0JztcbiAgLy8gQSBjYWNoZWQgcmVsZWFzZSBsaXN0aW5nIGNhbiBsYWcgYmVoaW5kIGFub3RoZXIgbWFjaGluZSB0aGF0IGFscmVhZHkgdXBkYXRlZCB0aGUgcGluLlxuICByZXR1cm4gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnICYmIHNlbXZlci52YWxpZCh2ZXJzaW9uKSAmJiBzZW12ZXIuZ3QodmVyc2lvbiwgcmVzb2x2ZWRWZXJzaW9uKVxuICAgID8gdmVyc2lvblxuICAgIDogcmVzb2x2ZWRWZXJzaW9uO1xufVxuXG4vKipcbiAqIExpZnRzIGFuIGV4YWN0IHRvb2wgcGluIGJlbG93IHRoZSBsYXRlc3QgcmVzb2x2YWJsZSB2ZXJzaW9uIOKAlCB3aXRoaW4gdGhlIFNBTUUgbWFqb3Ig4oCUIHRvIHRoYXRcbiAqIHZlcnNpb24gKE5vZGUuanMgcmVzb2x2ZXMgYWdhaW5zdCB0aGUgbGF0ZXN0IExUUyk6IHRoZSByZXBvc2l0b3J5LXN0cnVjdHVyZSBzdGFuZGFyZCB0cmFja3MgdGhlXG4gKiBjdXJyZW50IHRvb2xjaGFpbiBhY3Jvc3MgcmVwb3NpdG9yaWVzIGFuZCBSZW5vdmF0ZSBkb2VzIG5vdCBtYW5hZ2UgbWlzZS50b21sIHBpbnMsIHNvXG4gKiBwYXRjaC9taW5vciBkcmlmdCAoZS5nLiBub2RlIDI0LjE2LjAgdnMgMjQuMTguMCkgbmV2ZXIgc2VsZi1oZWFscy4gQSBwaW5cbiAqIG9uIGFuIG9sZGVyIG1ham9yIGlzIGEgZGVsaWJlcmF0ZSBjb21wYXRpYmlsaXR5IGNob2ljZSBhbmQgaXMga2VwdCwgYXMgYXJlIG5vbi1leGFjdCBhbmRcbiAqIG5vbi1zdHJpbmcgZm9ybXMuIFdoZW4gbWlzZSBjYW5ub3QgcmVzb2x2ZSB0aGUgc2VsZWN0b3IgKGUuZy4gb2ZmbGluZSksIHRoZSBwaW4gaXMga2VwdC5cbiAqL1xuZnVuY3Rpb24gbGlmdE91dGRhdGVkVG9vbFZlcnNpb25XaXRoaW5NYWpvcihzZWxlY3Rvcjogc3RyaW5nLCB2ZXJzaW9uOiB1bmtub3duLCBjd2Q6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnIHx8ICFzZW12ZXIudmFsaWQodmVyc2lvbikpIHJldHVybiB2ZXJzaW9uO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQobGF0ZXN0VmVyc2lvbikgJiZcbiAgICBzZW12ZXIubWFqb3IobGF0ZXN0VmVyc2lvbikgPT09IHNlbXZlci5tYWpvcih2ZXJzaW9uKSAmJlxuICAgIHNlbXZlci5sdCh2ZXJzaW9uLCBsYXRlc3RWZXJzaW9uKVxuICAgID8gbGF0ZXN0VmVyc2lvblxuICAgIDogdmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyBhbiB1bnBpbm5lZCBzZWxlY3RvciAoYGxhdGVzdGAsIGEgcmFuZ2Ugc3VjaCBhcyBcIjI0XCIsIGFuIGFsaWFzLCBvciBhIG1pc3NpbmcgZW50cnkpXG4gKiB3aXRoIHRoZSBuZXdlc3QgY29uY3JldGUgdmVyc2lvbiBtaXNlIHJlc29sdmVzIGZvciBpdCwgYmVjYXVzZSB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmVcbiAqIHN0YW5kYXJkIHJlcXVpcmVzIGNvbmNyZXRlIHBpbnM6IENJIGluc3RhbGxzIHdoYXRldmVyIGFuIHVucGlubmVkIHNlbGVjdG9yIHJlc29sdmVzIHRvIGF0IHJ1blxuICogdGltZSwgc28gYnVpbGRzIGRyaWZ0IGFjcm9zcyBydW5zLiBFeGFjdCB2ZXJzaW9ucyBhcmUga2VwdCBhcy1pcywgYW5kIG5vbi1zdHJpbmcgZm9ybXMgKG1pc2Unc1xuICogYXJyYXkgYW5kIGB7IHZlcnNpb24gPSBcIuKAplwiIH1gIGZvcm1zKSBhcmUgdXNlci1tYW5hZ2VkIGFuZCBsZWZ0IHVudG91Y2hlZC4gV2hlbiBtaXNlIGlzXG4gKiB1bmF2YWlsYWJsZSBvciBjYW5ub3QgcmVzb2x2ZSB0aGUgc2VsZWN0b3IgKGUuZy4gb2ZmbGluZSksIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBpcyBrZXB0IOKAlFxuICogYW4gdW5waW5uZWQgdG9vbCBpcyBiZXR0ZXIgdGhhbiBhIGJyb2tlbiBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKHRvb2w6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnIHx8IHNlbXZlci52YWxpZCh2ZXJzaW9uKSkpIHJldHVybiB2ZXJzaW9uO1xuICAvLyBOb3JtYWxpemUgc2VsZWN0b3IgZm9ybXMgYG1pc2UgbGF0ZXN0YCBjYW5ub3QgcmVzb2x2ZSBldmVuIHRob3VnaCBtaXNlIGNvbmZpZ3VyYXRpb24gYWNjZXB0c1xuICAvLyB0aGVtOiBgcHJlZml4OjI0YCBpcyByZWplY3RlZCBvdXRyaWdodCB3aGlsZSBgMjRgIHJlc29sdmVzLCBhbmQgYGx0cy8qYCB5aWVsZHMgZW1wdHkgb3V0cHV0XG4gIC8vIHdoaWxlIGBsdHNgIHJlc29sdmVzLiBNb2RpZmllciBzZWxlY3RvcnMgc3VjaCBhcyBgc3ViLTI6bHRzYCBzdGF5IHVucmVzb2x2YWJsZSBhbmQgZmFsbCBiYWNrXG4gIC8vIHRvIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBiZWxvdy5cbiAgY29uc3QgcmFuZ2UgPSB0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycgPyB2ZXJzaW9uLnJlcGxhY2UoL15wcmVmaXg6L3UsICcnKS5yZXBsYWNlKC9cXC9cXCokL3UsICcnKSA6IHVuZGVmaW5lZDtcbiAgLy8gV2l0aCBubyBtZWFuaW5nZnVsIHNlbGVjdG9yLCBOb2RlLmpzIHBpbnMgdG8gdGhlIGxhdGVzdCBMVFMgKG1hdGNoaW5nIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MnXG4gIC8vIGBsdHMvKmAgZmFsbGJhY2spIHJhdGhlciB0aGFuIHRoZSBuZXdlc3QgcmVsZWFzZS5cbiAgY29uc3QgZGVmYXVsdFNlbGVjdG9yID0gdG9vbCA9PT0gJ25vZGUnID8gJ25vZGVAbHRzJyA6IHRvb2w7XG4gIGNvbnN0IHNlbGVjdG9yID0gcmFuZ2UgJiYgcmFuZ2UgIT09ICdsYXRlc3QnID8gYCR7dG9vbH1AJHtyYW5nZX1gIDogZGVmYXVsdFNlbGVjdG9yO1xuICBjb25zdCByZXNvbHZlZFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ21pc2UnLCBbJ2xhdGVzdCcsIHNlbGVjdG9yXSwgY3dkKTtcbiAgcmV0dXJuIHNlbXZlci52YWxpZChyZXNvbHZlZFZlcnNpb24pID8gcmVzb2x2ZWRWZXJzaW9uIDogKHZlcnNpb24gPz8gJ2xhdGVzdCcpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1pc2VUb21sKG1pc2VUb21sUGF0aDogc3RyaW5nKTogTWlzZVRvbWwge1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMobWlzZVRvbWxQYXRoLCAndXRmOCcpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIE9ubHkgYSByZXBvc2l0b3J5IHdpdGhvdXQgbWlzZS50b21sIHN0YXJ0cyBmcm9tIGFuIGVtcHR5IGNvbmZpZ3VyYXRpb247IGFuIHVucmVhZGFibGUgZmlsZVxuICAgIC8vIChlLmcuIHBlcm1pc3Npb25zKSBtdXN0IGFib3J0IGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCBnZW5lcmF0ZWQgc2V0dGluZ3MuXG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4ge307XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgcmV0dXJuIEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIE1pc2VUb21sO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJpdmF0ZVJlZ2lzdHJ5U2NvcGVNYXBwaW5nLCByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuLi91dGlscy9wcml2YXRlUGFja2FnZXMuanMnO1xuXG4vKipcbiAqIEJ1biByZWFkcyByZWdpc3RyeSBzY29wZSBtYXBwaW5ncyBmcm9tIGEgcGh5c2ljYWwgcmVwb3NpdG9yeSAubnBtcmMgZHVyaW5nIFJlbm92YXRlIGFydGlmYWN0XG4gKiB1cGRhdGVzOyBSZW5vdmF0ZSdzIG5wbXJjIHNldHRpbmcgaXMgdXNlZCBvbmx5IGJ5IGl0cyBkYXRhc291cmNlIGxheWVyLiBLZWVwIHRoZSBub24tc2VjcmV0XG4gKiBtYXBwaW5nIGluIHJlcG9zaXRvcmllcyB0aGF0IHJlc29sdmUgcHJpdmF0ZSBwYWNrYWdlcywgd2hpbGUgYXV0aGVudGljYXRpb24gcmVtYWlucyBpbiB0aGVcbiAqIGRldmVsb3BlcidzIH4vLm5wbXJjIGxvY2FsbHkgYW5kIGluIHRlbXBvcmFyeSBDSSBvciBNZW5kIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb0F1dGhvciA9IGNvbmZpZ3NbMF0/LnJlcG9BdXRob3I7XG4gIGlmIChyZXBvQXV0aG9yICE9PSAnV2lsbEJvb3N0ZXInICYmIHJlcG9BdXRob3IgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICBjb25zdCBucG1yY1BhdGhzID0gbmV3IFNldChjb25maWdzLm1hcCgoY29uZmlnKSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubnBtcmMnKSkpO1xuICBjb25zdCByb290Q29uZmlnID0gY29uZmlncy5maW5kKChjb25maWcpID0+IGNvbmZpZy5pc1Jvb3QpO1xuICBpZiAocm9vdENvbmZpZyAmJiByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMocm9vdENvbmZpZykpIHtcbiAgICBjb25zdCByb290TnBtcmNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5ucG1yYycpO1xuICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUocm9vdE5wbXJjUGF0aCwgcHJpdmF0ZVJlZ2lzdHJ5U2NvcGVNYXBwaW5nKTtcbiAgICBucG1yY1BhdGhzLmRlbGV0ZShyb290TnBtcmNQYXRoKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgbnBtcmNQYXRoIG9mIG5wbXJjUGF0aHMpIGF3YWl0IHJlbW92ZU5wbXJjKG5wbXJjUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZU5wbXJjKG5wbXJjUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KG5wbXJjUGF0aCkuY2F0Y2goKCkgPT4ge30pKSkgcmV0dXJuO1xuICBpZiAoYXdhaXQgZnNVdGlsLnJlbW92ZUNvbmZpbmVkKG5wbXJjUGF0aCkpIHtcbiAgICBjb25zb2xlLmluZm8oYFJlbW92ZWQgbm9uLWNhbm9uaWNhbCByZXBvc2l0b3J5IG5wbXJjICR7bnBtcmNQYXRofS5gKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGhhc0dpdEh1YlRva2VuLCBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvciB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5pbnRlcmZhY2UgUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0YXJnZXQ6ICdicmFuY2gnO1xuICBlbmZvcmNlbWVudDogJ2FjdGl2ZSc7XG4gIGNvbmRpdGlvbnM6IHtcbiAgICByZWZfbmFtZToge1xuICAgICAgaW5jbHVkZTogc3RyaW5nW107XG4gICAgICBleGNsdWRlOiBzdHJpbmdbXTtcbiAgICB9O1xuICB9O1xuICBydWxlczogKFxuICAgIHwge1xuICAgICAgICB0eXBlOiAnZGVsZXRpb24nIHwgJ25vbl9mYXN0X2ZvcndhcmQnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcyc7XG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGJvb2xlYW47XG4gICAgICAgICAgZG9fbm90X2VuZm9yY2Vfb25fY3JlYXRlOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IHtcbiAgICAgICAgICAgIGNvbnRleHQ6IHN0cmluZztcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBudW1iZXI7XG4gICAgICAgICAgfVtdO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAncHVsbF9yZXF1ZXN0JztcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHJlcXVpcmVkX2FwcHJvdmluZ19yZXZpZXdfY291bnQ6IG51bWJlcjtcbiAgICAgICAgICBkaXNtaXNzX3N0YWxlX3Jldmlld3Nfb25fcHVzaDogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9yZXZpZXdlcnM6IFtdO1xuICAgICAgICAgIHJlcXVpcmVfY29kZV9vd25lcl9yZXZpZXc6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZV9sYXN0X3B1c2hfYXBwcm92YWw6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfcmV2aWV3X3RocmVhZF9yZXNvbHV0aW9uOiBib29sZWFuO1xuICAgICAgICAgIGFsbG93ZWRfbWVyZ2VfbWV0aG9kczogWydzcXVhc2gnXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgKVtdO1xuICBieXBhc3NfYWN0b3JzOiB7XG4gICAgYWN0b3JfaWQ6IG51bWJlcjtcbiAgICBhY3Rvcl90eXBlOiAnVGVhbSc7XG4gICAgYnlwYXNzX21vZGU6ICdwdWxsX3JlcXVlc3QnO1xuICB9W107XG59XG5cbmludGVyZmFjZSBSZXBvc2l0b3J5UnVsZXNldFN1bW1hcnkge1xuICBpZD86IG51bWJlcjtcbiAgbmFtZT86IHN0cmluZztcbiAgc291cmNlX3R5cGU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIgPSB7XG4gICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4Jyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lEID0gMTVfMzY4O1xuXG5jb25zdCBQUk9URUNUX01BSU5fUlVMRVNFVDogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkID0ge1xuICBuYW1lOiAnUHJvdGVjdCBtYWluJyxcbiAgdGFyZ2V0OiAnYnJhbmNoJyxcbiAgZW5mb3JjZW1lbnQ6ICdhY3RpdmUnLFxuICBjb25kaXRpb25zOiB7XG4gICAgcmVmX25hbWU6IHtcbiAgICAgIGV4Y2x1ZGU6IFtdLFxuICAgICAgaW5jbHVkZTogWyd+REVGQVVMVF9CUkFOQ0gnXSxcbiAgICB9LFxuICB9LFxuICBydWxlczogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdkZWxldGlvbicsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcycsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHN0cmljdF9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzX3BvbGljeTogZmFsc2UsXG4gICAgICAgIGRvX25vdF9lbmZvcmNlX29uX2NyZWF0ZTogdHJ1ZSxcbiAgICAgICAgcmVxdWlyZWRfc3RhdHVzX2NoZWNrczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRleHQ6ICd0ZXN0IC8gdGVzdCcsXG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAnc2VtYW50aWMtcHIgLyBzZW1hbnRpYy1wcicsXG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbm9uX2Zhc3RfZm9yd2FyZCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAncHVsbF9yZXF1ZXN0JyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgcmVxdWlyZWRfYXBwcm92aW5nX3Jldmlld19jb3VudDogMCxcbiAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZF9yZXZpZXdlcnM6IFtdLFxuICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZV9sYXN0X3B1c2hfYXBwcm92YWw6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZF9yZXZpZXdfdGhyZWFkX3Jlc29sdXRpb246IGZhbHNlLFxuICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ10sXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG4gIGJ5cGFzc19hY3RvcnM6IFtcbiAgICB7XG4gICAgICBhY3Rvcl9pZDogMTdfNzc3XzQ5NSxcbiAgICAgIGFjdG9yX3R5cGU6ICdUZWFtJyxcbiAgICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JyxcbiAgICB9LFxuICBdLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwUmVwb3NpdG9yeVJ1bGVzZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcmVwb0F1dGhvcjogb3duZXIsIHJlcG9OYW1lOiByZXBvIH0gPSBjb25maWc7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJykgcmV0dXJuO1xuICAgIC8vIFRoZSByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBob3N0cyB3b3JrZmxvd19jYWxsIGRlZmluaXRpb25zLCBzbyB0aGVcbiAgICAvLyBQcm90ZWN0IG1haW4gcnVsZXNldCB3b3VsZCByZXF1aXJlIHRlc3Qvc2VtYW50aWMtcHIgY2hlY2tzIHRoYXQgbmV2ZXIgcnVuIHRoZXJlLlxuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhjb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVwc2VydFByb3RlY3RNYWluUnVsZXNldChvY3Rva2l0LCBvd25lciwgcmVwbywgYnVpbGRQcm90ZWN0TWFpblJ1bGVzZXQoY29uZmlnKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gUmVwb3NpdG9yeSBydWxlc2V0cyByZXF1aXJlIGFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb24sIHdoaWNoIGxvY2FsIHJ1bnNcbiAgICAgIC8vIG1heSBub3QgaGF2ZSBldmVuIHdoZW4gZmlsZS1nZW5lcmF0aW9uIGFuZCBwdXNoZXMgYXJlIGFsbG93ZWQuXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFByb3RlY3RNYWluUnVsZXNldChjb25maWc6IFBhY2thZ2VDb25maWcpOiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQge1xuICBjb25zdCBydWxlc2V0ID0gc3RydWN0dXJlZENsb25lKFBST1RFQ1RfTUFJTl9SVUxFU0VUKTtcbiAgaWYgKGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzZXQucnVsZXMpIHtcbiAgICAgIGlmIChydWxlLnR5cGUgIT09ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJykgY29udGludWU7XG4gICAgICAvLyBUaGUgY29udGV4dCBpcyBgPGNhbGxlciBqb2IgaWQ+IC8gPHJldXNhYmxlIGpvYiBpZD5gIG9mIHRoZSB3YmZ5LWdlbmVyYXRlZCB0ZXN0LXJ1c3QueW1sLlxuICAgICAgcnVsZS5wYXJhbWV0ZXJzLnJlcXVpcmVkX3N0YXR1c19jaGVja3MucHVzaCh7XG4gICAgICAgIGNvbnRleHQ6ICd0ZXN0LXJ1c3QgLyB0ZXN0LXJ1c3QnLFxuICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ1bGVzZXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwc2VydFByb3RlY3RNYWluUnVsZXNldChcbiAgb2N0b2tpdDogT2N0b2tpdCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nLFxuICBydWxlc2V0OiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBleGlzdGluZ1J1bGVzZXQgPSBhd2FpdCBmaW5kUmVwb3NpdG9yeVJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIHJ1bGVzZXQubmFtZSk7XG4gIGNvbnN0IGV4aXN0aW5nUnVsZXNldElkID0gZXhpc3RpbmdSdWxlc2V0Py5pZDtcblxuICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGV4aXN0aW5nUnVsZXNldElkKSB7XG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBydWxlc2V0X2lkOiBleGlzdGluZ1J1bGVzZXRJZCxcbiAgICAgICAgICAuLi5ydWxlc2V0LFxuICAgICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMnLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgICAuLi5ydWxlc2V0LFxuICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICB7XG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgIH1cbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSdWxlc2V0KFxuICBvY3Rva2l0OiBPY3Rva2l0LFxuICBvd25lcjogc3RyaW5nLFxuICByZXBvOiBzdHJpbmcsXG4gIHJ1bGVzZXROYW1lOiBzdHJpbmdcbik6IFByb21pc2U8UmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2l0aFJldHJ5KFxuICAgICgpID0+XG4gICAgICBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMnLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgICBpbmNsdWRlc19wYXJlbnRzOiBmYWxzZSxcbiAgICAgICAgdGFyZ2V0czogJ2JyYW5jaCcsXG4gICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICB9KSxcbiAgICB7XG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgIH1cbiAgKTtcbiAgY29uc3QgcnVsZXNldHMgPSByZXNwb25zZS5kYXRhO1xuICBpZiAoIUFycmF5LmlzQXJyYXkocnVsZXNldHMpKSByZXR1cm47XG4gIHJldHVybiBydWxlc2V0cy5maW5kKChydWxlc2V0KSA9PiBydWxlc2V0Lm5hbWUgPT09IHJ1bGVzZXROYW1lICYmIHJ1bGVzZXQuc291cmNlX3R5cGUgPT09ICdSZXBvc2l0b3J5Jyk7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiwgaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBHaXRIdWJTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlcG9zaXRvcnkgc2V0dGluZ3MgbmVlZCBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB1bmxpa2UgZmlsZSBnZW5lcmF0aW9uLlxuICAgICAgYXdhaXQgd2l0aFJldHJ5KFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfdXBkYXRlX2JyYW5jaDogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBoYXNfd2lraTogZmFsc2UsXG4gICAgICAgICAgICBoYXNfcHJvamVjdHM6IGZhbHNlLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIExvY2FsIHdiZnkgcnVucyBvZnRlbiBoYXZlIHB1c2ggcGVybWlzc2lvbiB3aXRob3V0IGFkbWluIHBlcm1pc3Npb24uXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBHaXRIdWJTZXR0aW5ncyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3aXRoUmV0cnkoKCkgPT4gZGlzYWJsZURpc2N1c3Npb25zKG9jdG9raXQsIG93bmVyLCByZXBvKSwge1xuICAgICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJTZXR0aW5nc0Vycm9yKGVycm9yKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViU2V0dGluZ3NFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIGRpc2FibGluZyBHaXRIdWIgRGlzY3Vzc2lvbnMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkaXNhYmxlRGlzY3Vzc2lvbnMob2N0b2tpdDogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0T2N0b2tpdD4sIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXBvc2l0b3J5UmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LmdyYXBocWw8eyByZXBvc2l0b3J5PzogeyBpZD86IHN0cmluZyB9IH0+KFxuICAgIGBxdWVyeSgkb3duZXI6IFN0cmluZyEsICRyZXBvOiBTdHJpbmchKSB7XG4gICAgICByZXBvc2l0b3J5KG93bmVyOiAkb3duZXIsIG5hbWU6ICRyZXBvKSB7IGlkIH1cbiAgICB9YCxcbiAgICB7IG93bmVyLCByZXBvIH1cbiAgKTtcbiAgY29uc3QgcmVwb3NpdG9yeUlkID0gcmVwb3NpdG9yeVJlc3BvbnNlLnJlcG9zaXRvcnk/LmlkO1xuICBpZiAoIXJlcG9zaXRvcnlJZCkgcmV0dXJuO1xuICBhd2FpdCBvY3Rva2l0LmdyYXBocWwoXG4gICAgYG11dGF0aW9uKCRpbnB1dDogVXBkYXRlUmVwb3NpdG9yeUlucHV0ISkge1xuICAgICAgdXBkYXRlUmVwb3NpdG9yeShpbnB1dDogJGlucHV0KSB7IHJlcG9zaXRvcnkgeyBpZCB9IH1cbiAgICB9YCxcbiAgICB7IGlucHV0OiB7IHJlcG9zaXRvcnlJZCwgaGFzRGlzY3Vzc2lvbnNFbmFibGVkOiBmYWxzZSB9IH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNHaXRIdWJTZXR0aW5nc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmIChpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcikpIHJldHVybiB0cnVlO1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcgfHwgISgnZXJyb3JzJyBpbiBlcnJvcikgfHwgIUFycmF5LmlzQXJyYXkoZXJyb3IuZXJyb3JzKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZXJyb3IuZXJyb3JzLnNvbWUoXG4gICAgKGdyYXBocWxFcnJvcjogdW5rbm93bikgPT5cbiAgICAgICEhZ3JhcGhxbEVycm9yICYmXG4gICAgICB0eXBlb2YgZ3JhcGhxbEVycm9yID09PSAnb2JqZWN0JyAmJlxuICAgICAgJ3R5cGUnIGluIGdyYXBocWxFcnJvciAmJlxuICAgICAgWydGT1JCSURERU4nLCAnSU5TVUZGSUNJRU5UX1NDT1BFUycsICdOT1RfRk9VTkQnXS5pbmNsdWRlcyhncmFwaHFsRXJyb3IudHlwZSBhcyBzdHJpbmcpXG4gICk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG4vLyBUaGUgYC9zcmNgIGVudHJ5IChhIGRlY2xhcmVkIGV4cG9ydCkgbGV0cyB0aGlzIHdvcmtzcGFjZSBjb25zdW1lciB1c2UgdGhlIHNvdXJjZXMgd2l0aG91dFxuLy8gYnVpbGRpbmcgc2hhcmVkLWxpYiBmaXJzdCwgYXMgZXZlcnkgb3RoZXIgaW1wb3J0IG9mIGl0IGluIHRoaXMgcGFja2FnZSBkb2VzLlxuaW1wb3J0IHtcbiAgQlVHX0lTU1VFX1NFQ1RJT05TLFxuICBDSEFOR0VfSVNTVUVfU0VDVElPTlMsXG4gIFBVTExfUkVRVUVTVF9TRUNUSU9OUyxcbiAgcmVuZGVyU2VjdGlvblRlbXBsYXRlLFxufSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbjwhLS0gV3JpdGUgZm9yIGEgcmV2aWV3ZXIgd2hvIGhhcyBub3QgZm9sbG93ZWQgdGhlIHdvcmsuIFNjYWxlIGVhY2ggc2VjdGlvbiB0byB0aGUgY2hhbmdlOiBhIHNlbnRlbmNlIGZvciBhIHNtYWxsIGNoYW5nZSwgbnVtYmVyZWQgc3Vic2VjdGlvbnMgZm9yIGEgbGFyZ2Ugb25lLiBEZWxldGUgdGhpcyBjb21tZW50IGFuZCB0aGUgcGxhY2Vob2xkZXIgY29tbWVudHMgYmVsb3cuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShQVUxMX1JFUVVFU1RfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9idWcubWQnOiBgXG4tLS1cbm5hbWU6IEJ1ZyAvIFByb2JsZW1cbmFib3V0OiBTb21ldGhpbmcgYmVoYXZlcyB3cm9uZ2x5XG50aXRsZTogJ2ZpeDogJ1xubGFiZWxzOiAndDogZml4IDpidWc6J1xuLS0tXG5cbjwhLS0gS2VlcCBQcm9ibGVtIGFuZCBQcm9wb3NhbDsgZGVsZXRlIEV2aWRlbmNlIG9yIEltcGFjdCB3aGVuIHRoZXkgYWRkIG5vdGhpbmcuIERlbGV0ZSB0aGVzZSBjb21tZW50cy4gLS0+XG5cbiR7cmVuZGVyU2VjdGlvblRlbXBsYXRlKEJVR19JU1NVRV9TRUNUSU9OUyl9XG5gLnRyaW0oKSxcbiAgJ0lTU1VFX1RFTVBMQVRFL2NoYW5nZS5tZCc6IGBcbi0tLVxubmFtZTogQ2hhbmdlIC8gRmVhdHVyZVxuYWJvdXQ6IFByb3Bvc2UgYSBjaGFuZ2UgdGhhdCBhIHRoaXJkIHBhcnR5IGNvdWxkIGltcGxlbWVudCB3aXRob3V0IGFza2luZyBhIHF1ZXN0aW9uXG50aXRsZTogJ2ZlYXQ6ICdcbmxhYmVsczogJ3Q6IGZlYXQgOnNwYXJrbGVzOidcbi0tLVxuXG48IS0tIEtlZXAgdGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGZvciBhbnkgY2hhbmdlIGFuZCBhZGQgdGhlIG90aGVycyBhcyB0aGUgY2hhbmdlIGdyb3dzOyBhIGxhcmdlIGNoYW5nZSBmaWxscyBhbGwgb2YgdGhlbSAoc3BlYy1ib29zdGVyIHJldmlld3MgYWdhaW5zdCB0aGlzIGxpc3QpLiBEZWxldGUgdGhlc2UgY29tbWVudHMuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShDSEFOR0VfSVNTVUVfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9jb25maWcueW1sJzogJ2JsYW5rX2lzc3Vlc19lbmFibGVkOiB0cnVlJyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUZW1wbGF0ZXMgYXJlIHJlcG9zaXRvcnktbGV2ZWwgZmlsZXMsIHNvIGEgZGlyZWN0IHdvcmtzcGFjZS1jaGlsZCBpbnZvY2F0aW9uIG11c3Qgbm90IGNyZWF0ZSB0aGVtLlxuICAgIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvIHx8ICFjb25maWcuaXNSb290KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuY29uc3QgYWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm4gPSBTdHJpbmcucmF3YCg/OldpbGxCb29zdGVyfFdpbGxCb29zdGVyTGFiKWA7XG5jb25zdCBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zID0gW1xuICBuZXcgUmVnRXhwKGBeJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKGBeZ2l0aHViOiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzojXFxcXFMrKT8kYCwgJ3UnKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9odHRwczovL2dpdGh1YlxcXFwuY29tLyR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsXG4gICAgJ3UnXG4gICksXG4gIG5ldyBSZWdFeHAoXG4gICAgYF4oPzpnaXRcXFxcKyk/c3NoOi8vZ2l0QGdpdGh1YlxcXFwuY29tWzovXSR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsXG4gICAgJ3UnXG4gICksXG4gIG5ldyBSZWdFeHAoYF4oPzpnaXRcXFxcKyk/Z2l0QGdpdGh1YlxcXFwuY29tOiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsICd1JyksXG5dO1xuXG5pbnRlcmZhY2UgRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2Uge1xuICBkZXBlbmRlbmN5TmFtZTogc3RyaW5nO1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIHNlY3Rpb25OYW1lOiAodHlwZW9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cylbbnVtYmVyXTtcbiAgc3BlY2lmaWVyOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzID0gY29uZmlncy5mbGF0TWFwKGdldERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlcyk7XG4gIGlmIChkaXNhbGxvd2VkU291cmNlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXRhaWxzID0gZGlzYWxsb3dlZFNvdXJjZXNcbiAgICAubWFwKFxuICAgICAgKHsgZGVwZW5kZW5jeU5hbWUsIGRpclBhdGgsIHNlY3Rpb25OYW1lLCBzcGVjaWZpZXIgfSkgPT5cbiAgICAgICAgYC0gJHtwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpfTogJHtzZWN0aW9uTmFtZX0uJHtkZXBlbmRlbmN5TmFtZX0gdXNlcyAke3NwZWNpZmllcn1gXG4gICAgKVxuICAgIC5qb2luKCdcXG4nKTtcblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYERpc2FsbG93ZWQgR2l0IGRlcGVuZGVuY3kgc291cmNlcyBmb3VuZC5cXG5Pbmx5IFdpbGxCb29zdGVyIGFuZCBXaWxsQm9vc3RlckxhYiBHaXRIdWIgZGVwZW5kZW5jaWVzIGFyZSBhbGxvd2VkLlxcbiR7ZGV0YWlsc31gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdIHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBjb25maWcucGFja2FnZUpzb247XG4gIGlmICghcGFja2FnZUpzb24pIHJldHVybiBbXTtcblxuICBjb25zdCBkaXNhbGxvd2VkU291cmNlczogRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNlY3Rpb25OYW1lIG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBwYWNrYWdlSnNvbltzZWN0aW9uTmFtZV07XG4gICAgaWYgKCFzZWN0aW9uKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3lOYW1lLCBzcGVjaWZpZXJdIG9mIE9iamVjdC5lbnRyaWVzKHNlY3Rpb24pKSB7XG4gICAgICBpZiAoIXNwZWNpZmllcikgY29udGludWU7XG4gICAgICBpZiAoIWlzR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXIpKSBjb250aW51ZTtcbiAgICAgIGlmIChpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuXG4gICAgICBkaXNhbGxvd2VkU291cmNlcy5wdXNoKHtcbiAgICAgICAgZGVwZW5kZW5jeU5hbWUsXG4gICAgICAgIGRpclBhdGg6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBzZWN0aW9uTmFtZSxcbiAgICAgICAgc3BlY2lmaWVyLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkaXNhbGxvd2VkU291cmNlcztcbn1cblxuZnVuY3Rpb24gaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaXNHaXRIdWJTaG9ydGhhbmRTcGVjaWZpZXIoc3BlY2lmaWVyKSB8fFxuICAgIC9eKD86Yml0YnVja2V0fGdpc3R8Z2l0aHVifGdpdGxhYik6L3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL15odHRwcz86XFwvXFwvKD86Yml0YnVja2V0XFwub3JnfGdpdGh1YlxcLmNvbXxnaXRsYWJcXC5jb20pXFwvL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpodHRwcz98c3NoKTpcXC9cXC9cXFMrXFwuZ2l0KD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXlteQFxcc10rQFteOlxcc10rOlxcUysoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQ6JykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZ2l0KycpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ3NzaDovL2dpdEAnKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15bYS16QS1aMC05XVtcXHcuLV0qXFwvW1xcdy4tXSsoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKTtcbn1cblxuZnVuY3Rpb24gaXNBbGxvd2VkR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gYWxsb3dlZEdpdERlcGVuZGVuY3lQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3Qoc3BlY2lmaWVyKSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFcnJvciwgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgeyBub3JtYWxpemVCdW5Mb2NrZmlsZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeE5leHRDb25maWdKc29uIH0gZnJvbSAnLi9maXhlcnMvbmV4dENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhDaGFrcmFUb2FzdGVyIH0gZnJvbSAnLi9maXhlcnMvY2hha3JhVG9hc3Rlci5qcyc7XG5pbXBvcnQgeyBmaXhQbGF5d3JpZ2h0Q29uZmlnIH0gZnJvbSAnLi9maXhlcnMvcGxheXdyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhUeXBvcyB9IGZyb20gJy4vZml4ZXJzL3R5cG9zLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYWdlbnRzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQnVuZmlnVG9tbCwgcmVhZEJ1bkdsb2JhbFN0b3JlLCByZXNvbHZlQnVuR2xvYmFsU3RvcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVGbm94VG9tbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9mbm94VG9tbC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdlbWluaUNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzLCByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dsb2JhbFJlbGVhc2VBZ2VHYXRlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9vayB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uLCBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94Zm10Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294Zm10Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hsaW50Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294bGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhSYWlsd2F5aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JhaWx3YXlpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUsIHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb25jLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3VzZXJBZ2VudENvbmZpZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBlbnN1cmVXYkVudkRlZmluaXRpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3diRW52LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9zZWxmQ29udGFpbmVkV29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTWlzZVRvbWwsIG1pbmltdW1CdW5WZXJzaW9uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL21pc2VUb21sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL25wbXJjLmpzJztcbmltcG9ydCB7IHNldHVwTGFiZWxzIH0gZnJvbSAnLi9naXRodWIvbGFiZWwuanMnO1xuaW1wb3J0IHsgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMgfSBmcm9tICcuL2dpdGh1Yi9ydWxlc2V0LmpzJztcbmltcG9ydCB7IHNldHVwR2l0SHViU2V0dGluZ3MgfSBmcm9tICcuL2dpdGh1Yi9zZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyB9IGZyb20gJy4vZ2l0aHViL3RlbXBsYXRlLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VDb25maWcsIGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzIH0gZnJvbSAnLi91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlVHlwZVNjcmlwdEFwaSB9IGZyb20gJy4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5pbXBvcnQgeyBnZXRXYmZ5VmVyc2lvbiwgZ2V0V2JmeVZlcnNpb25MYWJlbCB9IGZyb20gJy4vdXRpbHMvdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyB9IGZyb20gJy4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbi8qKlxuICogQXBwbGllcyBvbmx5IHRoZSBnbG9iYWwgcmVsZWFzZS1hZ2UgZ2F0ZSwgd2l0aG91dCB0b3VjaGluZyBhbnkgcmVwb3NpdG9yeS4gU3BlbGxlZCBvdXQgaW4gZnVsbFxuICogcmF0aGVyIHRoYW4gc2hvcnRlbmVkIChlLmcuIGBnYXRlYCkgYmVjYXVzZSB0aGUgZGVmYXVsdCBjb21tYW5kIHRha2VzIHBvc2l0aW9uYWwgcGF0aHM6IGEgc2hvcnRcbiAqIG5hbWUgd291bGQgc3dhbGxvdyBhIGRpcmVjdG9yeSB0aGF0IGhhcHBlbnMgdG8gc2hhcmUgaXQuXG4gKi9cbmNvbnN0IGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kID0gJ2FwcGx5LXJlbGVhc2UtYWdlLWdhdGUnO1xuLyoqIFNhbWUgbmFtaW5nIHJhdGlvbmFsZSBhcyBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZC4gKi9cbmNvbnN0IGdlbmVyYXRlVXNlckFnZW50Q29uZmlnc0NvbW1hbmQgPSAnZ2VuZXJhdGUtdXNlci1hZ2VudC1jb25maWdzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZChcbiAgICAgIGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kLFxuICAgICAgXCJBcHBseSBvbmx5IHRoZSBvcmdhbml6YXRpb24ncyBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSB0byB0aGlzIG1hY2hpbmUncyBnbG9iYWwgcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3NcIlxuICAgIClcbiAgICAuY29tbWFuZChcbiAgICAgIGdlbmVyYXRlVXNlckFnZW50Q29uZmlnc0NvbW1hbmQsXG4gICAgICBcIk92ZXJ3cml0ZSB0aGlzIHVzZXIncyBhZ2VudCBpbnN0cnVjdGlvbiBmaWxlcyAofi8uY29kZXgvQUdFTlRTLm1kLCB+Ly5jbGF1ZGUvQ0xBVURFLm1kLCB+Ly5nZW1pbmkvR0VNSU5JLm1kKSB3aXRoIHRoZSBvcmdhbml6YXRpb24ncyBmaXhlZCBjb250ZW50IGFuZCBtZXJnZSB0aGUgb3JnYW5pemF0aW9uJ3Mgc2V0dGluZ3MgaW50byB+Ly5jbGF1ZGUvc2V0dGluZ3MuanNvbiBhbmQgfi8uZ2VtaW5pL3NldHRpbmdzLmpzb25cIlxuICAgIClcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZm9yY2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdBcHBseSB3YmZ5IGV2ZW4gd2hlbiB0aGUgcmVwb3NpdG9yeSBhbHJlYWR5IHJlY29yZHMgdGhpcyB3YmZ5IHZlcnNpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2YnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdTa2lwIGFkZGluZyBtYW5hZ2VkIGRlcGVuZGVuY2llcyBhbmQgdGhlIGxpbmtlciBwcm9iZSAodGhlIGZpbmFsIGBidW4gaW5zdGFsbGAgcmVmcmVzaGluZyB0aGUgbG9ja2ZpbGUgc3RpbGwgcnVucyknLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudmVyc2lvbihnZXRXYmZ5VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcblxuICAvLyBEZWxpYmVyYXRlbHkgYmVmb3JlIHRoZSBCdW4gY2hlY2sgaW4gd2lsbGJvb3N0ZXJpZnlQYXRocygpOiB0aGUgZ2F0ZSBtdXN0IGJlIGFwcGxpYWJsZSBvbiBhXG4gIC8vIG1hY2hpbmUgd2hvc2UgQnVuIGlzIG91dGRhdGVkLCB3aGljaCBpcyBleGFjdGx5IGEgbWFjaGluZSB0aGF0IHN0aWxsIG5lZWRzIGdhdGluZy5cbiAgaWYgKGFyZ3YuX1swXSA9PT0gYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQpIHtcbiAgICBpZiAoIWVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcygpKSBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFyZ3YuX1swXSA9PT0gZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzQ29tbWFuZCkge1xuICAgIGlmICghKGF3YWl0IGdlbmVyYXRlVXNlckFnZW50Q29uZmlncygpKSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBhd2FpdCB3aWxsYm9vc3RlcmlmeVBhdGhzKGFyZ3YucGF0aHMgYXMgc3RyaW5nW10sIGFyZ3Yuc2tpcERlcHMsIGFyZ3YuZm9yY2UpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIFRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyIHNlcnZlciBzcGF3bmVkIGZvciBBU1QgcGFyc2luZyBrZWVwcyBhbiBvcGVuIElQQ1xuICAgIC8vIGNoYW5uZWwgdGhhdCB3b3VsZCBvdGhlcndpc2UgcHJldmVudCB0aGUgTm9kZS5qcyBwcm9jZXNzIGZyb20gZXhpdGluZy5cbiAgICBhd2FpdCBkaXNwb3NlVHlwZVNjcmlwdEFwaSgpO1xuICB9XG4gIGlmIChoYXNJbnZhbGlkUGFja2FnZUNvbmZpZykge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdpbGxib29zdGVyaWZ5UGF0aHMocGF0aHM6IHN0cmluZ1tdLCBza2lwRGVwczogYm9vbGVhbiwgZm9yY2U6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gQmVmb3JlIGFueXRoaW5nIGVsc2Ug4oCUIGV2ZW4gdGhlIEJ1biBjaGVjayBiZWxvdzogdGhlIGRldmVsb3BlciBtYWNoaW5lJ3MgZ2xvYmFsXG4gIC8vIHBhY2thZ2UtbWFuYWdlciBjb25maWdzIG11c3QgcmVjZWl2ZSB0aGUgb3JnJ3MgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgb24gRVZFUlkgcnVuLFxuICAvLyBiZWNhdXNlIHRoZXkgYXJlIHdoYXQgZ3VhcmRzIGJyYW5kLW5ldyBsb2NhbCBwcm9qZWN0cyB0aGF0IGhhdmUgbm8gd2JmeS1nZW5lcmF0ZWQgcmVwb3NpdG9yeVxuICAvLyBjb25maWcgeWV0LCBhbmQgdGhhdCBwcm90ZWN0aW9uIG11c3Qgd29yayBiZWZvcmUgdGhlIHN1cHBvcnRlZC12ZXJzaW9uIGNoZWNrLlxuICBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMoKTtcblxuICAvLyB3YmZ5IG1hbmFnZXMgcmVwb3NpdG9yaWVzIHRocm91Z2ggQnVuICsgbWlzZSBhbmQgdXNlcyBCdW4gMS40IHJ1bnRpbWUgQVBJcy4gVGhlIHZlcnNpb24gZmxvb3JcbiAgLy8gYWxzbyBlbnN1cmVzIHRoZSBnZW5lcmF0ZWQgYnVuZmlnLnRvbWwgb3B0aW9ucyBwcm9kdWNlIHRoZSBpbnN0YWxsIGxheW91dCB3YmZ5IHZhbGlkYXRlcy4gSXRcbiAgLy8gc3RheXMgdW5jb25kaXRpb25hbCBldmVuIHRob3VnaCB0aGUgYWxyZWFkeS1hcHBsaWVkIGNoZWNrIGJlbG93IGNhbiBtYWtlIGEgcnVuIGEgbm8tb3A6IGFuXG4gIC8vIG91dGRhdGVkIEJ1biBpcyBhIGJyb2tlbiBlbnZpcm9ubWVudCB3YmZ5IG11c3QgcmVwb3J0LCBhbmQgaGlkaW5nIGl0IHdoZW5ldmVyIGV2ZXJ5IHBhdGhcbiAgLy8gaGFwcGVucyB0byBiZSBza2lwcGVkIHdvdWxkIHN1cmZhY2UgaXQgb25seSBsYXRlci5cbiAgY29uc3QgYnVuVmVyc2lvbiA9IEJ1bi52ZXJzaW9uO1xuICBpZiAoQnVuLnNlbXZlci5vcmRlcihidW5WZXJzaW9uLCBtaW5pbXVtQnVuVmVyc2lvbikgPCAwKSB7XG4gICAgY29uc29sZS5lcnJvcihgd2JmeSByZXF1aXJlcyBCdW4gPj0gJHttaW5pbXVtQnVuVmVyc2lvbn0gKGZvdW5kICR7YnVuVmVyc2lvbn0pLiBVcGdyYWRlIEJ1biBhbmQgcmUtcnVuLmApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQSBgLWRpcnR5LWxvY2FsYCBsYWJlbCBpZGVudGlmaWVzIGFuIGVkaXRlZCBjaGVja291dCwgd2hvc2UgbmV4dCBidWlsZCBwcm9kdWNlcyBkaWZmZXJlbnQgZmlsZXNcbiAgLy8gdW5kZXIgdGhlIHNhbWUgbGFiZWwsIHNvIHN1Y2ggYSBydW4gaXMgbmV2ZXIgdHJlYXRlZCBhcyBhbHJlYWR5IGFwcGxpZWQuXG4gIGNvbnN0IHZlcnNpb25MYWJlbCA9IGdldFdiZnlWZXJzaW9uTGFiZWwoKTtcbiAgY29uc3Qgc2tpcHBhYmxlVmVyc2lvbkxhYmVsID1cbiAgICAhZm9yY2UgJiYgdmVyc2lvbkxhYmVsICYmICF2ZXJzaW9uTGFiZWwuZW5kc1dpdGgoJy1kaXJ0eS1sb2NhbCcpID8gdmVyc2lvbkxhYmVsIDogdW5kZWZpbmVkO1xuXG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGlucHV0RGlyUGF0aCBvZiBwYXRocykge1xuICAgIC8vIE5vcm1hbGl6ZSBvbmNlIGF0IHRoZSBDTEkgYm91bmRhcnkuIEdlbmVyYXRvcnMgdXNlIGRpclBhdGggZm9yIGN3ZCBhbmQgYmFzZW5hbWUgZGVjaXNpb25zO1xuICAgIC8vIGxlYXZpbmcgdGhlIHN1cHBvcnRlZCBkZWZhdWx0IGAuYCB1bnJlc29sdmVkIHdvdWxkIGdlbmVyYXRlIGFuIGludmFsaWQgcGFja2FnZSBuYW1lIG9mIGAuYC5cbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShpbnB1dERpclBhdGgpO1xuICAgIC8vIENvbmZpbmUgZXZlcnkgZ2VuZXJhdGVkIGZpbGUgdG8gdGhpcyByZXBvc2l0b3J5IChzZWUgZnNVdGlsLmdlbmVyYXRlRmlsZSkuIFNldCBCRUZPUkUgYW55XG4gICAgLy8gZml4ZXIgd3JpdGVzLCBhbmQgcmVzZXQgb24gZXZlcnkgaXRlcmF0aW9uIHNvIGEgbXVsdGktcGF0aCBydW4gbmV2ZXIga2VlcHMgdGhlIHByZXZpb3VzIHJvb3QuXG4gICAgZnNVdGlsLnNldFJvb3REaXJQYXRoKGZzLmV4aXN0c1N5bmMocm9vdERpclBhdGgpID8gcm9vdERpclBhdGggOiB1bmRlZmluZWQpO1xuXG4gICAgLy8gVGhlIGJhZGdlIHJlY29yZHMgdGhlIGJ1aWxkIHRoYXQgZ2VuZXJhdGVkIHRoZSByZXBvc2l0b3J5J3MgY29uZmlndXJhdGlvbiwgc28gdGhlIHNhbWUgYnVpbGRcbiAgICAvLyB3b3VsZCBvbmx5IHJld3JpdGUgd2hhdCBpcyBhbHJlYWR5IHRoZXJlLiBTa2lwcGluZyBpcyBhIGRlbGliZXJhdGUgdHJhZGU6IHRoZSBwYXJ0cyBvZiBhIHJ1blxuICAgIC8vIHRoYXQgZGVwZW5kIG9uIHN0YXRlIE9VVFNJREUgdGhlIHJlcG9zaXRvcnkgKEdpdEh1YiBzZXR0aW5ncywgZGVwZW5kZW5jeSB1cGRhdGVzLCB0aGUgZmV0Y2hlZFxuICAgIC8vIC5naXRpZ25vcmUpIGRvIGdldCBza2lwcGVkIHRvbywgd2hpY2ggaXMgd2hhdCAtLWZvcmNlIGlzIGZvci5cbiAgICBpZiAoc2tpcHBhYmxlVmVyc2lvbkxhYmVsICYmIChhd2FpdCByZWFkQXBwbGllZFdiZnlWZXJzaW9uTGFiZWwocm9vdERpclBhdGgpKSA9PT0gc2tpcHBhYmxlVmVyc2lvbkxhYmVsKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFNraXAgJHtyb290RGlyUGF0aH06IHdiZnkgJHtza2lwcGFibGVWZXJzaW9uTGFiZWx9IGlzIGFscmVhZHkgYXBwbGllZC4gUGFzcyAtLWZvcmNlIHRvIHJlLWFwcGx5LmApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBwYWNrYWdlc1N1YkRpclBhdGhzID0gZGlyZW50c1xuICAgICAgLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKVxuICAgICAgLm1hcCgoZCkgPT4gcGF0aC5yZXNvbHZlKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG4gICAgLy8gQWxzbyBjb3ZlciB3b3Jrc3BhY2VzIGRlY2xhcmVkIG91dHNpZGUgcGFja2FnZXMvKiAoZS5nLiBhcHBzLyopOiB0aGV5IHJlY2VpdmUgdGhlIHNhbWVcbiAgICAvLyBtYW5hZ2VkIGNvbmZpZ3MgKHRzY29uZmlnLmpzb24sIHBhY2thZ2UuanNvbiBjb252ZW50aW9ucywg4oCmKSBhcyBwYWNrYWdlcy8qIGNoaWxkcmVuLlxuICAgIGNvbnN0IHJvb3RQYWNrYWdlSnNvbiA9XG4gICAgICBpZ25vcmVFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUNvbmZpZ1sncGFja2FnZUpzb24nXVxuICAgICAgKSA/PyB7fTtcbiAgICBjb25zdCB3b3Jrc3BhY2VTdWJEaXJQYXRocyA9IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKHtcbiAgICAgIGRpclBhdGg6IHJvb3REaXJQYXRoLFxuICAgICAgcGFja2FnZUpzb246IHJvb3RQYWNrYWdlSnNvbixcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBwYWNrYWdlc1N1YkRpclBhdGhzLnNvbWUoKHN1YkRpclBhdGgpID0+XG4gICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHN1YkRpclBhdGgsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgICksXG4gICAgfSk7XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBbLi4ubmV3IFNldChbLi4ucGFja2FnZXNTdWJEaXJQYXRocywgLi4ud29ya3NwYWNlU3ViRGlyUGF0aHNdKV0uZmlsdGVyKFxuICAgICAgKHN1YkRpclBhdGgpID0+IHN1YkRpclBhdGggIT09IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aClcbiAgICApO1xuXG4gICAgLy8gUmVmdXNlZCB3cml0ZXMgb24gY29yZSBtYW5hZ2VkIGZpbGVzIHdvdWxkIGxlYXZlIHRoZSByZXBvc2l0b3J5IHBhcnRpYWxseSB1cGRhdGVkLCBzbyBza2lwXG4gICAgLy8gaXQgQkVGT1JFIGFueSBtdXRhdGlvbiB3aGVuIG9uZSBvZiB0aGVtIGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICAgIGNvbnN0IG1hbmFnZWRGaWxlUGF0aHMgPSBbXG4gICAgICAuLi5bJy5naXRhdHRyaWJ1dGVzJywgJ2J1bmZpZy50b21sJywgJ2xlZnRob29rLnltbCcsICdwYWNrYWdlLmpzb24nLCAndHNjb25maWcuanNvbiddLm1hcCgobmFtZSkgPT5cbiAgICAgICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCBuYW1lKVxuICAgICAgKSxcbiAgICAgIC4uLnN1YkRpclBhdGhzLmZsYXRNYXAoKHN1YkRpclBhdGgpID0+XG4gICAgICAgIFsncGFja2FnZS5qc29uJywgJ3RzY29uZmlnLmpzb24nXS5tYXAoKG5hbWUpID0+IHBhdGgucmVzb2x2ZShzdWJEaXJQYXRoLCBuYW1lKSlcbiAgICAgICksXG4gICAgXTtcbiAgICBjb25zdCB3cml0YWJsZVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1hbmFnZWRGaWxlUGF0aHMubWFwKChmaWxlUGF0aCkgPT4gZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpKVxuICAgICk7XG4gICAgaWYgKHdyaXRhYmxlUmVzdWx0cy5pbmNsdWRlcyhmYWxzZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXAgJHtyb290RGlyUGF0aH06IGEgbWFuYWdlZCBjb25maWcgZmlsZSBpcyBhIHN5bWxpbmsgb3IgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZsaWdodEVycm9ycyA9IFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdLmZsYXRNYXAoKGRpclBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VDb25maWdbJ3BhY2thZ2VKc29uJ107XG4gICAgICAgIGNvbnN0IGVycm9yID0gZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvcih7IHBhY2thZ2VKc29uIH0pO1xuICAgICAgICByZXR1cm4gZXJyb3IgPyBbYCR7ZGlyUGF0aH06ICR7ZXJyb3J9YF0gOiBbXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW2Ake3BhY2thZ2VKc29uUGF0aH0gaXMgaW52YWxpZGBdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChwcmVmbGlnaHRFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTpcXG4ke3ByZWZsaWdodEVycm9ycy5qb2luKCdcXG4nKX1gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIExldCBnZXRQYWNrYWdlQ29uZmlnIGRlcml2ZSBpc1Jvb3QgZm9yIHRoZSBlbnRyeSBwYXRoOiBgd2JmeSA8cmVwbz4vcGFja2FnZXMvPGFwcD5gIGlzIGFcbiAgICAvLyBzdXBwb3J0ZWQgaW52b2NhdGlvbiB3aG9zZSB0YXJnZXQgbXVzdCBrZWVwIGl0cyBjaGlsZCBjbGFzc2lmaWNhdGlvbiwgc28gZm9yY2luZ1xuICAgIC8vIGBpc1Jvb3Q6IHRydWVgIGhlcmUgd291bGQgYXBwbHkgcm9vdC1vbmx5IHByb2Nlc3NpbmcgKGxlZnRob29rIGluc3RhbGwsIHJvb3QgdHNjb25maWcsXG4gICAgLy8gQUdFTlRTLm1kLCDigKYpIHRvIGEgc3VicGFja2FnZS5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBFdmVyeSBkaXNjb3ZlcmVkIHdvcmtzcGFjZSAoaW5jbHVkaW5nIG5vbi1wYWNrYWdlcy8qIGxheW91dHMgc3VjaCBhcyBhcHBzLyopIGlzIGEgY2hpbGRcbiAgICAvLyBwYWNrYWdlOyB0aGUgcGFja2FnZXMvKiBoZXVyaXN0aWMgaW5zaWRlIGdldFBhY2thZ2VDb25maWcgd291bGQgbWlzY2xhc3NpZnkgYXBwcy8qIGFzIHJvb3RzLlxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCB7IGlzUm9vdDogZmFsc2UgfSkpXG4gICAgKTtcbiAgICBjb25zdCBpbnZhbGlkU3ViUGFja2FnZURpclBhdGggPSBzdWJEaXJQYXRocy5maW5kKFxuICAgICAgKHN1YkRpclBhdGgsIGluZGV4KSA9PiAhbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlnc1tpbmRleF0gJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKVxuICAgICk7XG4gICAgaWYgKGludmFsaWRTdWJQYWNrYWdlRGlyUGF0aCkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTogJHtpbnZhbGlkU3ViUGFja2FnZURpclBhdGh9L3BhY2thZ2UuanNvbiBpcyBpbnZhbGlkLmApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcbiAgICAvLyBUaGUgbWFuYWdlZCBpZ25vcmUgcnVsZSBpcyB1bmFuY2hvcmVkLCBzbyBhIG5lc3RlZCBjb3B5IChlLmcuIHdvcmtlcnMvYXBpLy5lbnYuY2xvdWRmbGFyZSkgaXNcbiAgICAvLyBhcyBtdWNoIGEgbGVhayBhcyBhIHJvb3Qgb25lOyB0aGUgd2lsZGNhcmQgcGF0aHNwZWMgY292ZXJzIGV2ZXJ5IGRlcHRoIGluIG9uZSBxdWVyeS5cbiAgICBjb25zdCB0cmFja2VkQ2xvdWRmbGFyZUVudlBhdGhzID0gYWxsUGFja2FnZUNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuaXNDbG91ZGZsYXJlKVxuICAgICAgPyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgICAgICAgJ2dpdCcsXG4gICAgICAgICAgWyctYycsICdjb3JlLnF1b3RlUGF0aD1mYWxzZScsICdscy1maWxlcycsICctLScsICcuZW52LmNsb3VkZmxhcmUnLCAnKi8uZW52LmNsb3VkZmxhcmUnXSxcbiAgICAgICAgICByb290Q29uZmlnLmRpclBhdGhcbiAgICAgICAgKVxuICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKSlcbiAgICAgIDogW107XG4gICAgaWYgKHRyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFNFQ1VSSVRZIEVSUk9SOiBDbG91ZGZsYXJlIGNyZWRlbnRpYWxzIG11c3QgYmUgdW50cmFja2VkLiBSZW1vdmUgJHt0cmFja2VkQ2xvdWRmbGFyZUVudlBhdGhzLmpvaW4oXG4gICAgICAgICAgJywgJ1xuICAgICAgICApfSBmcm9tIEdpdCwgcHVyZ2UgdGhlIHRva2VuIGZyb20gaGlzdG9yeSwgYW5kIHJvdGF0ZSBDTE9VREZMQVJFX0FQSV9UT0tFTiBiZWZvcmUgcmVydW5uaW5nIHdiZnkuYFxuICAgICAgKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhYmJyZXZpYXRpb25Qcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBhd2FpdCBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyhhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMoYWxsUGFja2FnZUNvbmZpZ3MpO1xuICAgIC8vIE1hbmFnZWQgcmVwb3NpdG9yaWVzIHVzZSBCdW4gd2l0aCBtaXNlIChhbmQgb3B0aW9uYWxseSBmbm94KS5cbiAgICBjb25zdCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlID0gcmVhZEJ1bkdsb2JhbFN0b3JlKHJvb3REaXJQYXRoKTtcbiAgICAvLyBSb290LWxldmVsIGluc3RhbGwgbGF5b3V0IG11c3QgY292ZXIgd29ya3NwYWNlIGFwcHMgdG9vOiBOZXh0LmpzIGNvbW1vbmx5IGxpdmVzIHVuZGVyXG4gICAgLy8gcGFja2FnZXMvKiBvciBhcHBzLyogd2hpbGUgYnVuZmlnLnRvbWwgZXhpc3RzIG9ubHkgYXQgdGhlIHJlcG9zaXRvcnkgcm9vdC5cbiAgICBjb25zdCB1c2VHbG9iYWxTdG9yZSA9IHJlc29sdmVCdW5HbG9iYWxTdG9yZShhbGxQYWNrYWdlQ29uZmlncywgcHJldmlvdXNCdW5HbG9iYWxTdG9yZSwgc2tpcERlcHMpO1xuICAgIGF3YWl0IGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnLCB1c2VHbG9iYWxTdG9yZSk7XG4gICAgYXdhaXQgZ2VuZXJhdGVNaXNlVG9tbChyb290Q29uZmlnKTtcbiAgICBhd2FpdCBnZW5lcmF0ZUZub3hUb21sKHJvb3RDb25maWcpO1xuICAgIC8vIFJ1biBhZnRlciBnZW5lcmF0ZUZub3hUb21sIHNvIGl0cyB0cmFuc2FjdGlvbmFsIHJlY2lwaWVudCBzeW5jIGNhbm5vdCByZXN0b3JlIGEgc25hcHNob3RcbiAgICAvLyBvdmVyIGRlZmluaXRpb25zIGluc2VydGVkIGhlcmUuXG4gICAgYXdhaXQgZW5zdXJlV2JFbnZEZWZpbml0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgLy8gcHJvbWlzZVBvb2wucnVuIHJlc29sdmVzIHdoZW4gYSB0YXNrIFNUQVJUUywgc28gdGhlIGdlbmVyYXRlZCBidW5maWcudG9tbCBpcyBub3RcbiAgICAvLyBndWFyYW50ZWVkIHRvIGJlIG9uIGRpc2sgeWV0OyB0aGUgcHJvYmUgYmVsb3cgbXVzdCBub3QgdmFsaWRhdGUgYSBzdGFsZSBjb25maWd1cmF0aW9uLlxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIC8vIFRoZSBsYXlvdXQgbXVzdCBiZSB2ZXJpZmllZCBpbnN0YWxsYWJsZSBCRUZPUkUgYW55IGBidW4gYWRkYCBtdXRhdGVzIHBhY2thZ2UuanNvbiBmaWxlczpcbiAgICAvLyBwZXItcGFja2FnZSBpbnN0YWxscyB0b2xlcmF0ZSBmYWlsdXJlcyAoc3Bhd25TeW5jIGRpc2NhcmRzIHRoZWlyIHN0YXR1cyksIHNvIGEgbGF5b3V0IHRoYXRcbiAgICAvLyBjYW5ub3QgaW5zdGFsbCB3b3VsZCBzaWxlbnRseSBkcm9wIGV2ZXJ5IG1hbmFnZWQgZGVwZW5kZW5jeSB1cGRhdGUgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4uXG4gICAgLy8gQSBkb2NzLW9ubHkgcmVwb3NpdG9yeSBoYXMgbm8gbWFuaWZlc3QgdG8gcHJvYmUgb24gaXRzIGZpcnN0IHJ1bjsgZ2VuZXJhdGVQYWNrYWdlSnNvbiBiZWxvd1xuICAgIC8vIGNyZWF0ZXMgaXQgYmVmb3JlIHRoZSBhdXRob3JpdGF0aXZlIHJlZnJlc2hCdW5Mb2NrIGNoZWNrLlxuICAgIGlmIChcbiAgICAgICFza2lwRGVwcyAmJlxuICAgICAgcm9vdENvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmXG4gICAgICAhcHJvYmVJc29sYXRlZEJ1bkluc3RhbGwocm9vdERpclBhdGgsIHJvb3RDb25maWcsIHByZXZpb3VzQnVuR2xvYmFsU3RvcmUsIHVzZUdsb2JhbFN0b3JlKVxuICAgICkge1xuICAgICAgLy8gcmVmcmVzaEJ1bkxvY2sgYmVsb3cgaXMgdGhlIGF1dGhvcml0eSBvbiB3aGV0aGVyIHRoZSBmaW5hbCBpbnN0YWxsIGZhaWxlZC5cbiAgICAgIGNvbnNvbGUud2FybihgYnVuIGluc3RhbGwgY3VycmVudGx5IGZhaWxzIGluICR7cm9vdERpclBhdGh9IHVuZGVyIHRoZSBpc29sYXRlZCBsaW5rZXIuYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIC8vIE90aGVyIG93bmVycyBjYW5ub3QgY2FsbCB0aGUgb3JnYW5pemF0aW9uJ3MgcmV1c2FibGUgd29ya2Zsb3dzICh0aGVpciBzZWNyZXRzIGFuZCBydW5uZXJzXG4gICAgLy8gZG8gbm90IGV4aXN0IHRoZXJlKSwgc28gYW55IG90aGVyIEdpdEh1Yi1ob3N0ZWQgTm9kZS5qcyByZXBvc2l0b3J5IGdldHMgc2VsZi1jb250YWluZWRcbiAgICAvLyB3b3JrZmxvd3MgaW5zdGVhZCDigJQga2V5ZWQgb24gcmVwb3NpdG9yeSBzdGF0ZSwgbmV2ZXIgb24gdGhlIG93bmVyJ3MgaWRlbnRpdHkuXG4gICAgLy8gcm9vdENvbmZpZy5pc1Jvb3Q6IGEgZGlyZWN0IHdvcmtzcGFjZS1jaGlsZCBpbnZvY2F0aW9uIChgd2JmeSA8cmVwbz4vcGFja2FnZXMvPGFwcD5gKSBrZWVwc1xuICAgIC8vIGlzUm9vdCBmYWxzZSwgYW5kIEdpdEh1YiBpZ25vcmVzIHdvcmtmbG93IGZpbGVzIG5lc3RlZCB1bmRlciBhIHBhY2thZ2UgZGlyZWN0b3J5LlxuICAgIGNvbnN0IHNob3VsZFJ1blNlbGZDb250YWluZWRXb3JrZmxvd3MgPVxuICAgICAgIXNob3VsZFJ1bldvcmtmbG93cyAmJlxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgICEhcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6JykgJiZcbiAgICAgIHJvb3RDb25maWcuaXNSb290O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHZW1pbmlDb25maWcocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGZpeFJhaWx3YXlpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbmMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihzaG91bGRSdW5Xb3JrZmxvd3MgPyBbZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyldIDogW10pLFxuICAgICAgLi4uKHNob3VsZFJ1blNlbGZDb250YWluZWRXb3JrZmxvd3MgPyBbZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKV0gOiBbXSksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIC8vIEdpdCBob29rcyBhcmUgcmVwb3NpdG9yeS1sZXZlbCBzdGF0ZTogYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gbXVzdCBub3Qgd3JpdGUgYVxuICAgICAgLy8gY2hpbGQgbGVmdGhvb2sueW1sIG9yIHJlcGxhY2UgdGhlIGVuY2xvc2luZyByZXBvc2l0b3J5J3MgaG9vayBpbnN0YWxsYXRpb24uXG4gICAgICAuLi4ocm9vdENvbmZpZy5pc1Jvb3QgPyBbZ2VuZXJhdGVMZWZ0aG9vayhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyldIDogW10pLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAvLyBBZnRlciB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yIChhbmQgaXRzIHBvb2xlZCB3cml0ZXMpIHNvIHRoZSBpbnN0cnVjdGlvbiBmaWxlcyBkZXNjcmliZSB0aGVcbiAgICAvLyBmaW5hbGl6ZWQgd29ya2Zsb3cgZmlsZXMgaW5zdGVhZCBvZiBsYWdnaW5nIG9uZSBydW4gYmVoaW5kLlxuICAgIGF3YWl0IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuY2hha3JhKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4Q2hha3JhVG9hc3Rlcihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSmF2YShjb25maWcpKSBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcERlcHMpO1xuXG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWcpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiYgZG9lc0NvbnRhaW5Kc09yVHMocm9vdENvbmZpZykpIHtcbiAgICAgICAgLy8gTW9ub3JlcG8gdmVyaWZpY2F0aW9uIGNhbiBpbnZva2Ugb3hsaW50IGZyb20gZXZlcnkgd29ya3NwYWNlLiBHaXZlXG4gICAgICAgIC8vIG5vbi1jb2RlIHBhY2thZ2VzIGEgbG9jYWwgY29uZmlnIHNvIG94bGludCBkb2VzIG5vdCBjbGltYiB0byB0aGVcbiAgICAgICAgLy8gcm9vdCBjb25maWcgYW5kIHJlamVjdCByb290LW9ubHkgdHlwZS1hd2FyZSBvcHRpb25zIGZyb20gYSBwYWNrYWdlIGN3ZC5cbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIC8vIFJ1biBhZnRlciBldmVyeSBwb29sZWQgZ2VuZXJhdG9yIHdyaXRlIHNvIG5vcm1hbGl6YXRpb24gY2Fubm90IG92ZXJ3cml0ZSBhIGNvbmN1cnJlbnRcbiAgICAvLyB1cGRhdGUsIGFuZCBiZWZvcmUgY2xlYW51cCBzbyBmb3JtYXR0ZXIgbWV0YWRhdGEgY2FjaGVzIG9ic2VydmUgdGhlIGNoYW5nZWQgZmlsZXMuXG4gICAgcmVub3JtYWxpemVUcmFja2VkVGV4dEZpbGVzKHJvb3REaXJQYXRoKTtcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICB0cnkge1xuICAgICAgcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBBIGZhaWxlZCBpbnN0YWxsIG11c3QgZmFpbCB0aGUgQ0xJOiBleGl0aW5nIDAgd2l0aCBhIHN0YWxlIG9yIG1pc3NpbmcgQnVuIGxvY2tmaWxlIHdvdWxkXG4gICAgICAvLyBoaWRlIGEgYnJva2VuIG1hbmFnZWQgY29uZmlndXJhdGlvbi5cbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZWZyZXNoIHRoZSBCdW4gbG9ja2ZpbGU6JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBlcnJvcik7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyBCdW4gd3JpdGVzIGJ1bi5sb2NrIGJlZm9yZSBsaWZlY3ljbGUgc2NyaXB0cywgc28gYSBmYWlsZWQgaW5zdGFsbCBjYW4gc3RpbGwgbGVhdmUgR3VhcmRcbiAgICAgIC8vIFVSTHMgYmVoaW5kLiBOb3JtYWxpemUgYm90aCBzdWNjZXNzIGFuZCBmYWlsdXJlIG91dHB1dCB3aXRob3V0IHJlcGxhY2luZyB0aGUgaW5zdGFsbCBlcnJvci5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRMb2NrZmlsZVBhdGggPSBub3JtYWxpemVCdW5Mb2NrZmlsZShyb290RGlyUGF0aCk7XG4gICAgICBpZiAobm9ybWFsaXplZExvY2tmaWxlUGF0aCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFJlbW92ZWQgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSAke25vcm1hbGl6ZWRMb2NrZmlsZVBhdGh9IHRvIGtlZXAgaXQgcmVnaXN0cnktYWdub3N0aWMuYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBub3JtYWxpemUgdGhlIEJ1biBsb2NrZmlsZTonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IGVycm9yKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKCdidW4nLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuICB9XG4gIHJldHVybiBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZztcbn1cblxuLyoqXG4gKiBQcm9iZXMgYGJ1biBpbnN0YWxsYCB1bmRlciB0aGUgaXNvbGF0ZWQgbGlua2VyLiBBbiBpbmNvbXBhdGliaWxpdHkgbXVzdCBiZSBmaXhlZCBpbiB0aGVcbiAqIHJlcG9zaXRvcnkgb3IgaW4gd2JmeSdzIG1hbmFnZWQgbGlzdHMsIG5ldmVyIGJ5IHN3aXRjaGluZyB0aGUgbGlua2VyLiBSZXR1cm5zIGZhbHNlIHdoZW4gdGhlXG4gKiBpbnN0YWxsIGZhaWxzLlxuICovXG5mdW5jdGlvbiBwcm9iZUlzb2xhdGVkQnVuSW5zdGFsbChcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcHJldmlvdXNHbG9iYWxTdG9yZTogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgdXNlR2xvYmFsU3RvcmU6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuICAvLyBBIGxheW91dCBzd2l0Y2ggbXVzdCBwcm9iZSBmcm9tIGEgY2xlYW4gdHJlZSBiZWNhdXNlIEJ1biBkb2VzIG5vdCByZW1vdmUgdGhlIHByZXZpb3VzIGxheW91dCdzIGxlZnRvdmVycy5cbiAgaWYgKHByZXZpb3VzR2xvYmFsU3RvcmUgIT09IHVzZUdsb2JhbFN0b3JlKSB7XG4gICAgcmVtb3ZlTm9kZU1vZHVsZXMocm9vdERpclBhdGgsIHJvb3RDb25maWcpO1xuICB9XG4gIC8vIFJldHJ5IG9uY2Ugc28gYSB0cmFuc2llbnQgZmFpbHVyZSAocmVnaXN0cnkgaGljY3VwLCBmbGFreSBsaWZlY3ljbGUgc2NyaXB0KSBkb2VzIG5vdFxuICAvLyBtYXNxdWVyYWRlIGFzIGEgbGF5b3V0IGluY29tcGF0aWJpbGl0eS5cbiAgaWYgKHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWydpbnN0YWxsJ10sIHJvb3REaXJQYXRoLCAxKSA9PT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgLy8gQ2xlYW4gdXAgdGhlIGZhaWxlZCBhdHRlbXB0IHNvIGxhdGVyIGluc3RhbGxzIGRvIG5vdCBydW4gb24gYSBwb2xsdXRlZCB0cmVlLlxuICByZW1vdmVOb2RlTW9kdWxlcyhyb290RGlyUGF0aCwgcm9vdENvbmZpZyk7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZU1vZHVsZXMocm9vdERpclBhdGg6IHN0cmluZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IHZvaWQge1xuICAvLyBDb3ZlciBldmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2U6IGxlZnRvdmVycyBjYW4ga2VlcCBwaGFudG9tIGRlcGVuZGVuY2llcyByZXNvbHZhYmxlLlxuICBjb25zdCBub2RlTW9kdWxlc1BhdGhzID0gW1xuICAgIHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycpLFxuICAgIC4uLlsuLi5nZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290Q29uZmlnKS52YWx1ZXMoKV0ubWFwKCh3b3Jrc3BhY2VEaXIpID0+XG4gICAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIHdvcmtzcGFjZURpciwgJ25vZGVfbW9kdWxlcycpXG4gICAgKSxcbiAgXTtcbiAgLy8gTmV2ZXIgZGVsZXRlIHRocm91Z2ggYSB3b3Jrc3BhY2Ugc3ltbGluayB0aGF0IGVzY2FwZXMgdGhpcyByZXBvc2l0b3J5LlxuICBjb25zdCByZWFsUm9vdERpclBhdGggPSBmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpO1xuICBmb3IgKGNvbnN0IG5vZGVNb2R1bGVzUGF0aCBvZiBub2RlTW9kdWxlc1BhdGhzKSB7XG4gICAgY29uc3QgcmVhbFBhcmVudERpclBhdGggPSBpZ25vcmVFcnJvcigoKSA9PiBmcy5yZWFscGF0aFN5bmMocGF0aC5kaXJuYW1lKG5vZGVNb2R1bGVzUGF0aCkpKTtcbiAgICBpZiAoXG4gICAgICAhcmVhbFBhcmVudERpclBhdGggfHxcbiAgICAgIChyZWFsUGFyZW50RGlyUGF0aCAhPT0gcmVhbFJvb3REaXJQYXRoICYmICFyZWFsUGFyZW50RGlyUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKSlcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmcy5ybVN5bmMobm9kZU1vZHVsZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAvLyB3YmZ5IHNob3VsZCB1cGRhdGUgb25seSB0aGUgcGFja2FnZXMgaXQgZXhwbGljaXRseSBtYW5hZ2VzIHRocm91Z2ggYnVuIGFkZC5cbiAgLy8gUnVubmluZyBidW4gdXBkYXRlIGhlcmUgcmVmcmVzaGVzIHVucmVsYXRlZCBhcHBsaWNhdGlvbiBkZXBlbmRlbmNpZXMgYW5kXG4gIC8vIGNhbiBjaGFuZ2UgcHJvZHVjdCBiZWhhdmlvciwgc28ga2VlcCB0aGUgZXhpc3RpbmcgbG9jayBhbmQgcmVjb25jaWxlIGl0LlxuICBjb25zdCBzdGF0dXMgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoJ2J1bicsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCwgMSk7XG4gIGlmIChzdGF0dXMgPT09IDApIHJldHVybjtcbiAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBCdW4gbG9ja2ZpbGU6IGJ1biBpbnN0YWxsIGV4aXRlZCB3aXRoIHN0YXR1cyAke3N0YXR1c31gKTtcbn1cblxuYXdhaXQgbWFpbigpO1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOls0NSw0Niw0Nyw0OCw0OSw1MF0sIm1hcHBpbmdzIjoiK3lCQVdBLE1BQWEsR0FBb0QsQ0FDL0QsQ0FDRSxRQUFTLE1BQ1QsWUFBYSxzR0FDZixFQUNBLENBQ0UsUUFBUyxlQUNULFlBQ0UsNmNBQ0osRUFDQSxDQUNFLFFBQVMsbUJB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
|
|
515
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsImZzIiwicGFyc2VKc29uYyIsImZzcCIsInJlbGVhc2VBZ2VHYXRlLmRheXMiLCJyZWxlYXNlQWdlR2F0ZS5leGNsdWRlcyIsIm5ld0NvbnRlbnQiLCJjb21tb25Db250ZW50IiwibmV3Q29udGVudCIsImNoaWxkX3Byb2Nlc3MiLCJjb21tb25Db250ZW50IiwiY2hpbGRfcHJvY2VzcyIsInNvcnRPYmplY3RLZXlzIiwiZ2l0SG9va3MiLCJkZXRlY3ROZXdsaW5lIiwiZGVwZW5kZW5jeVNlY3Rpb25LZXlzIiwiY29yZSIsIm1hbmFnZWRDb25maWdCbG9ja3MiLCJnZXRDb25maWdDb250ZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZ2l0aHViVGVtcGxhdGVzLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvc2xlZXAudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL3Rlc3RpbmdSdWxlcy50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuV29ya3NwYWNlcy50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuTG9ja2ZpbGUudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2RvY2tlcmZpbGUudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2dsb2IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3V0aWxzL3R5cGVzY3JpcHRBcGkudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL2NoYWtyYVRvYXN0ZXIudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9mbm94VG9tbC50cyIsIi4uL3NyYy91dGlscy9tZXJnZVV0aWwudHMiLCIuLi9zcmMvdXRpbHMvb2JqZWN0VXRpbC50cyIsIi4uL3NyYy91dGlscy93b3Jrc3BhY2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ByaXZhdGVQYWNrYWdlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93UnVubmVyUG9saWN5LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd29ya2Zsb3cudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvanNvbmNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LnRzIiwiLi4vc3JjL3V0aWxzL3NwYXduVXRpbC50cyIsIi4uL3NyYy91dGlscy9zdHJpbmdVdGlsLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9jb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24iLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dsb2JhbFJlbGVhc2VBZ2VHYXRlLnRzIiwiLi4vc3JjL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9pZGVhLnRzIiwiLi4vc3JjL3V0aWxzL2dlbkkxOG5Ucy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9zb3J0LW9iamVjdC1rZXlzQDIuMS4wLTE4ZGYyZjgzN2U2ZWMyOWEvbm9kZV9tb2R1bGVzL3NvcnQtb2JqZWN0LWtleXMvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZGV0ZWN0LWluZGVudEA3LjAuMi02Yjc1ZGMwZjU2NTMzYmQ5L25vZGVfbW9kdWxlcy9kZXRlY3QtaW5kZW50L2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL2RldGVjdC1uZXdsaW5lQDQuMC4xLTVkYTlkZjY1MTI1ZWU3OTUvbm9kZV9tb2R1bGVzL2RldGVjdC1uZXdsaW5lL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL2dpdC1ob29rcy1saXN0QDQuMi4xLTZjYTJiMjY5ZDkxNjMzMmUvbm9kZV9tb2R1bGVzL2dpdC1ob29rcy1saXN0L2luZGV4Lmpzb24iLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvaXMtcGxhaW4tb2JqQDQuMS4wLTQ3ZmRkZDc3MDY0OGU1Nzcvbm9kZV9tb2R1bGVzL2lzLXBsYWluLW9iai9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9zb3J0LXBhY2thZ2UtanNvbkA0LjAuMC02MzUxYjkyZjgyNjE1NmY0L25vZGVfbW9kdWxlcy9zb3J0LXBhY2thZ2UtanNvbi9pbmRleC5qcyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL3V0aWxzL3RzY29uZmlnQmFzZS50cyIsIi4uL3NyYy91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9sZWZ0aG9vay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2NvbmZpZ0NvbnRlbnQudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9tYW5hZ2VkQ29uZmlnQmxvY2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGZtdENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294bGludENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JhaWx3YXlpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZWFkbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZWxlYXNlcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb25jLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy91c2VyQWdlbnRDb25maWdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93YkVudi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3NlbGZDb250YWluZWRXb3JrZmxvdy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21pc2VUb21sLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbnBtcmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9ydWxlc2V0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvdGVtcGxhdGUudHMiLCIuLi9zcmMvdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc2VjdGlvbiBvZiBhIFBSIG9yIGlzc3VlIGJvZHk6IGl0cyBoZWFkaW5nIGFuZCB3aGF0IHRoZSBzZWN0aW9uIG11c3Qgc3RhdGUuIGByZXF1aXJlbWVudGBcbiAqIHN0YXJ0cyBsb3dlcmNhc2UgYW5kIGVuZHMgd2l0aG91dCBwdW5jdHVhdGlvbiwgc28gdGhhdCBpdCByZWFkcyBib3RoIGFzIGEgcGxhY2Vob2xkZXIgc2VudGVuY2VcbiAqIChjYXBpdGFsaXplZCwgd2l0aCBhIHBlcmlvZCBhcHBlbmRlZCkgYW5kIGFzIGEgY2hlY2tsaXN0IGNsYXVzZSBhZnRlciB0aGUgaGVhZGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZVNlY3Rpb24ge1xuICByZWFkb25seSBoZWFkaW5nOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlcXVpcmVtZW50OiBzdHJpbmc7XG59XG5cbi8qKiBTZWN0aW9ucyBvZiBhIHB1bGwgcmVxdWVzdCBib2R5LCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIFBSIHRlbXBsYXRlLiAqL1xuZXhwb3J0IGNvbnN0IFBVTExfUkVRVUVTVF9TRUNUSU9OUzogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10gPSBbXG4gIHtcbiAgICBoZWFkaW5nOiAnV2h5JyxcbiAgICByZXF1aXJlbWVudDogJ3RoZSBwcm9ibGVtLCB3aXRoIHRoZSBudW1iZXJzIG9yIG9ic2VydmF0aW9ucyBiZWhpbmQgaXQsIGFuZCB3aHkgdGhpcyBhcHByb2FjaCBvdmVyIHRoZSBhbHRlcm5hdGl2ZXMnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1JlcXVpcmVtZW50cycsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICBcInRoZSByZXF1aXJlbWVudHMgdGhlIGNoYW5nZSBtdXN0IHNhdGlzZnkgYW5kIHRoZSBndWFyYW50ZWVzIGl0IG11c3Qga2VlcCwgb25lIHBlciBsaW5lLCBlYWNoIG1hcmtlZCBgcmVxdWlyZWRgIChhc2tlZCBmb3IgYnkgdGhlIHJlcXVlc3Rlciwgb3IgYW4gZXhpc3RpbmcgY29udHJhY3QgY2FsbGVycyBkZXBlbmQgb24pIG9yIGBjaG9zZW5gICh0aGUgaW1wbGVtZW50ZXIncyBvd24gZGVjaXNpb24sIHdoaWNoIGEgc2ltcGxlciBkZXNpZ24gbWF5IHJlcGxhY2UpOyBjb3B5IHRoZSByZXF1ZXN0ZXIncyBpbnN0cnVjdGlvbnMgaGVyZSBhcyBnaXZlbiwgd2hldGhlciB0aGV5IGNhbWUgZnJvbSBhbiBpc3N1ZSBvciBhIGNvbnZlcnNhdGlvbiwgYW5kIGtlZXAgdGhlIGxpc3Qgd2hlbiB0aGUgYm9keSBpcyBsYXRlciByZXdyaXR0ZW4gdW5sZXNzIHRoZSByZXF1ZXN0ZXIncyBpbnN0cnVjdGlvbnMgY2hhbmdlZFwiLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0N1c3RvbWVyIFN1bW1hcnknLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2JlaGF2aW9yLCB3b3JrZmxvdywgb3IgdXNlci12aXNpYmxlIGNoYW5nZXMsIHdyaXR0ZW4gZm9yIHJlYWRlcnMgd2hvIGtub3cgbm90aGluZyBhYm91dCB0aGUgaW1wbGVtZW50YXRpb24nLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1RlY2huaWNhbCBTdW1tYXJ5JyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICdkZWNpc2lvbnMgYW5kIHRoZWlyIHJlYXNvbnMsIGRhdGEgZmxvdywgd2hlcmUgdG8gbG9vayAodGhlIGZpbGVzIHRoYXQgbWF0dGVyIG1vc3QpLCBhbmQgd2hhdCB0byBjaGVjayBoYXJkZXN0OiB0aGUgcGFydHMgd2hvc2UgY29ycmVjdG5lc3MgaXMgYXJndWVkIHJhdGhlciB0aGFuIHByb3ZlbicsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnVGVzdGluZycsXG4gICAgcmVxdWlyZW1lbnQ6ICdjb21tYW5kcyBydW4sIHRlc3RzIGFkZGVkLCBhbmQgd2hhdCB3YXMgTk9UIGV4ZXJjaXNlZCBhbmQgd2h5JyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdOb3RlcycsXG4gICAgcmVxdWlyZW1lbnQ6ICdrbm93biBsaW1pdGF0aW9ucywgY29tcGF0aWJpbGl0eSBhbmQgbWlncmF0aW9uLCBmb2xsb3ctdXAgd29yazsgZGVsZXRlIHRoaXMgc2VjdGlvbiBpZiB0aGVyZSBpcyBub25lJyxcbiAgfSxcbl07XG5cbi8qKlxuICogSG93IGEgdG9vbCB0aGF0IHdyaXRlcyBvciByZXdyaXRlcyBhIFBSIGJvZHkgZGVyaXZlcyBpdCBmcm9tIHRoZSByZXBvc2l0b3J5J3MgUFIgdGVtcGxhdGUsIGFzXG4gKiBtYXJrZG93biBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9ucy4gU3RhdGVkIG9uY2UgaGVyZSBhbmQgcmVuZGVyZWQgYnkgZXZlcnkgd3JpdGVyICh0aGVcbiAqIGdlbmVyYXRlZCBhZ2VudCBpbnN0cnVjdGlvbnMsIHRoZSBQUi1kcmFmdGluZyBza2lsbHMpIHNvIHRoZSB3cml0ZXJzIGNhbm5vdCBkcmlmdCBhcGFydDsgdGhlXG4gKiB0ZW1wbGF0ZS1sZXNzIGJyYW5jaCBsZXRzIHRoZSBzYW1lIHRleHQgc2VydmUgcmVwb3NpdG9yaWVzIG91dHNpZGUgdGhlIG9yZ2FuaXphdGlvbi5cbiAqL1xuY29uc3QgUFVMTF9SRVFVRVNUX1RFTVBMQVRFX1JVTEVTID0gYC0gQmFzZSB0aGUgUFIgYm9keSBvbiBcXGAuZ2l0aHViL3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZFxcYCB3aGVuIGNyZWF0aW5nIG9yIHVwZGF0aW5nIGEgUFIsIGV2ZW4gd2hlbiBhIHNraWxsIG9yIHdvcmtmbG93IHN1cHBsaWVzIGl0cyBvd24gc2tlbGV0b246IGtlZXAgdGhlIHRlbXBsYXRlJ3MgaGVhZGluZ3MgaW4gb3JkZXIsIGZpbGwgZWFjaCBzZWN0aW9uIHdpdGggd2hhdCBpdHMgcGxhY2Vob2xkZXIgY29tbWVudCBhc2tzIGZvciBhdCBhIGxlbmd0aCBmaXR0aW5nIHRoZSBjaGFuZ2UgKGEgc2VudGVuY2UgZm9yIGEgc21hbGwgY2hhbmdlLCBudW1iZXJlZCBzdWJzZWN0aW9ucyBmb3IgYSBsYXJnZSBvbmUpLCBhbmQgZGVsZXRlIHRoZSBwbGFjZWhvbGRlciBjb21tZW50cyBhbmQgYW4gZW1wdHkgTm90ZXMgc2VjdGlvbi4gV2l0aG91dCBhIHRlbXBsYXRlLCB1c2Ugbm8gZml4ZWQgaGVhZGluZ3M6IHN0YXRlIHRoZSBzY29wZSwgdGhlIG1vdGl2YXRpb24sIGFuZCB0aGUgdmVyaWZpY2F0aW9uIGNvbmNpc2VseS5cbi0gU3RhcnQgdGhlIGJvZHkgd2l0aCBcXGBDbG9zZSAjPG4+XFxgIG9ubHkgd2hlbiB0aGUgUFIgcmVzb2x2ZXMgYW4gZXhpc3RpbmcgaXNzdWUuYDtcblxuLyoqXG4gKiBIb3cgYSB0b29sIHRoYXQgd3JpdGVzIG9yIHJld3JpdGVzIGEgUFIgYm9keSBmaWxscyB0aGUgUmVxdWlyZW1lbnRzIHNlY3Rpb24gb2ZcbiAqIGBQVUxMX1JFUVVFU1RfU0VDVElPTlNgLCBhcyBtYXJrZG93biBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9ucy4gU2tpbGxzIHRoYXQgZHJhZnQgUFJcbiAqIGJvZGllcyByZW5kZXIgdGhpcyB0ZXh0IGluc3RlYWQgb2YgcmVzdGF0aW5nIGl0LCBzbyB0aGUgd3JpdGVycyBhbmQgdGhlIHJldmlld2VycyB0aGF0IHJlYWQgdGhlXG4gKiBzZWN0aW9uIGFzIHRoZSBib3VuZGFyeSBhIGZpeCBtdXN0IGtlZXAgbmV2ZXIgZGlzYWdyZWUgb24gd2hhdCBhIGxpbmUgbWVhbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBQVUxMX1JFUVVFU1RfUkVRVUlSRU1FTlRTX1JVTEVTID0gYC0gUmVxdWlyZW1lbnRzIHNlY3Rpb246IG9uZSBsaW5lIHBlciByZXF1aXJlbWVudCwgdGFrZW4gZnJvbSB0aGUgcmVxdWVzdGVyJ3MgaW5zdHJ1Y3Rpb25zIGFzIHRoZXkgd2VyZSBnaXZlbiAodGhlIGlzc3VlLCB0aGUgY29udmVyc2F0aW9uIHRoYXQgYXNrZWQgZm9yIHRoZSBjaGFuZ2UpLCBlYWNoIG1hcmtlZCBcXGByZXF1aXJlZFxcYCAoYXNrZWQgZm9yLCBvciBhbiBleGlzdGluZyBjb250cmFjdCBjYWxsZXJzIGRlcGVuZCBvbikgb3IgXFxgY2hvc2VuXFxgICh5b3VyIG93biBkZWNpc2lvbiwgd2hpY2ggYSBzaW1wbGVyIGRlc2lnbiBtYXkgcmVwbGFjZSkuIE5ldmVyIGluZmVyIGEgcmVxdWlyZW1lbnQgZnJvbSB0aGUgZGlmZjogd2hlbiBubyBpc3N1ZSwgUFIgbWVzc2FnZSwgb3IgY29udmVyc2F0aW9uIHN0YXRlcyB0aGUgcmVxdWVzdCwgd3JpdGUgXFxgcmVxdWlyZWQ6IG5vdCByZWNvcmRlZCDigJQgYXNrIHRoZSByZXF1ZXN0ZXJcXGAgYXMgdGhlIG9ubHkgcmVxdWVzdC1kZXJpdmVkIGxpbmUgKGEgXFxgcmVxdWlyZWRcXGAgbGluZSBmb3IgYW4gZXhpc3RpbmcgY29udHJhY3QgY2FsbGVycyBkZXBlbmQgb24gbWF5IHN0aWxsIGJlIGxpc3RlZCkgYW5kIHNheSBzbyBpbiBOb3Rlcy5cbi0gUmVjb3JkIHJ1bGU6IGFuIGV4aXN0aW5nIFJlcXVpcmVtZW50cyBzZWN0aW9uIGlzIGEgcmVjb3JkLCBub3QgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZGlmZi4gS2VlcCBpdHMgXFxgcmVxdWlyZWRcXGAgbGluZXMgYXMgdGhleSBhcmUsIHJld3JpdGluZyB0aGVtIG9ubHkgd2hlbiB0aGUgcmVxdWVzdGVyJ3MgaW5zdHJ1Y3Rpb25zIGNoYW5nZWQgKHRoZW4gZnJvbSB0aGUgdXBkYXRlZCBpbnN0cnVjdGlvbnMsIGRyb3BwaW5nIGEgbGluZSBvbmx5IHdoZW4gdGhlIHJlcXVlc3RlciByZW1vdmVkIGl0OyB3aXRoIG5vIGluc3RydWN0aW9ucyBhdmFpbGFibGUsIGtlZXAgdGhlbSB1bmNoYW5nZWQpOyBhZGQgYSBcXGBjaG9zZW5cXGAgbGluZSBmb3IgYSBuZXcgZGVjaXNpb24sIGFuZCByZXBsYWNlIG9yIHJlbW92ZSBvbmUgd2hlbiB0aGUgZGVjaXNpb24gaXQgcmVjb3JkcyBjaGFuZ2VkLiBBIHNlY3Rpb24gdGhhdCBtZXJlbHkgZGVzY3JpYmVzIHRoZSBpbXBsZW1lbnRhdGlvbiwgb3IgaG9sZHMgb25seSB0aGUgdGVtcGxhdGUncyBwbGFjZWhvbGRlciBvciBhIFxcYHJlcXVpcmVkOiBub3QgcmVjb3JkZWRcXGAgbGluZSwgaXMgbm90IGEgcmVjb3JkOiB3cml0ZSBpdCBhZnJlc2ggYnkgdGhlIHJ1bGUgYWJvdmUuXG4tIFBsYWNlIHRoZSBzZWN0aW9uIHdoZXJlIHRoZSB0ZW1wbGF0ZSBwdXRzIGl0OyB3aGVuIHRoZSB0ZW1wbGF0ZSBoYXMgbm8gc3VjaCBoZWFkaW5nLCByaWdodCBhZnRlciB0aGUgaXNzdWUtY2xvc2luZyBsaW5lLCBvciBhdCB0aGUgdG9wIG9mIHRoZSBib2R5IHdoZW4gdGhlcmUgaXMgbm9uZS5cbi0gTmV2ZXIgZHJvcCBvciB3ZWFrZW4gYSBcXGByZXF1aXJlZFxcYCBsaW5lIHRvIGZpdCB3aGF0IHdhcyBpbXBsZW1lbnRlZDogd2hlbiBvbmUgY2Fubm90IGhvbGQgaW4gdGhlIGRpZmYsIGtlZXAgaXQgYW5kIHNheSBzbyBpbiBOb3Rlcy5gO1xuXG4vKiogVGhlIGNvbXBsZXRlIHJ1bGVzIGZvciB3cml0aW5nIGEgUFIgYm9keTogdGhlIHRlbXBsYXRlIHJ1bGVzIGZvbGxvd2VkIGJ5IHRoZSBSZXF1aXJlbWVudHMgcnVsZXMuICovXG5leHBvcnQgY29uc3QgUFVMTF9SRVFVRVNUX0JPRFlfUlVMRVMgPSBgJHtQVUxMX1JFUVVFU1RfVEVNUExBVEVfUlVMRVN9XFxuJHtQVUxMX1JFUVVFU1RfUkVRVUlSRU1FTlRTX1JVTEVTfWA7XG5cbi8qKlxuICogSG93IGEgdG9vbCB0aGF0IGNyZWF0ZXMgYW4gaXNzdWUgZGVyaXZlcyBpdCBmcm9tIHRoZSByZXBvc2l0b3J5J3MgaXNzdWUgdGVtcGxhdGVzLCBhcyBtYXJrZG93blxuICogYnVsbGV0cyBmb3IgYW4gYWdlbnQncyBpbnN0cnVjdGlvbnM7IHNoYXJlZCBieSB0aGUgc2FtZSB3cml0ZXJzIGFzIGBQVUxMX1JFUVVFU1RfQk9EWV9SVUxFU2AuXG4gKiBHdWlkYW5jZSB0aGUgdGVtcGxhdGVzIHN0YXRlIGluIHRoZWlyIG93biBwbGFjZWhvbGRlciBjb21tZW50cyAod2hpY2ggc2VjdGlvbnMgdG8ga2VlcCwgZGVsZXRpbmdcbiAqIHRoZSBjb21tZW50cykgaXMgZGVsaWJlcmF0ZWx5IG5vdCByZXBlYXRlZCBoZXJlLCBzaW5jZSB0aGUgd3JpdGVyIHJlYWRzIHRoZSB0ZW1wbGF0ZSBhbnl3YXkuXG4gKi9cbmV4cG9ydCBjb25zdCBJU1NVRV9URU1QTEFURV9SVUxFUyA9IGAtIEZvbGxvdyB0aGUgY2xvc2VzdCB0ZW1wbGF0ZSB1bmRlciBcXGAuZ2l0aHViL0lTU1VFX1RFTVBMQVRFL1xcYDogXFxgYnVnLm1kXFxgIGZvciB3cm9uZyBiZWhhdmlvciwgXFxgY2hhbmdlLm1kXFxgIGZvciBhbnl0aGluZyB0byBidWlsZCBvciBhbHRlcjsgYSBxdWVzdGlvbiBvciBub3RlIGZpdHRpbmcgbmVpdGhlciwgb3IgYSByZXBvc2l0b3J5IHdpdGhvdXQgdGVtcGxhdGVzLCBuZWVkcyBubyB0ZW1wbGF0ZS5cbi0gVGl0bGU6IGEgQ29udmVudGlvbmFsIENvbW1pdHMgcHJlZml4IGZvciB0aGUgdHlwZSB0aGF0IGZpdHMgdGhlIGNoYW5nZSAoXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGAsIFxcYHJlZmFjdG9yOlxcYCwgXFxgZG9jczpcXGAsIFxcYGNob3JlOlxcYCwgLi4uKTsgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIHRlbXBsYXRlJ3MgXFxgdGl0bGVcXGAgcHJlZml4LCByZXBsYWNlIHRoZSB0ZW1wbGF0ZSdzIHR5cGUgbGFiZWwgKFxcYHQ6IC4uLlxcYCkgd2l0aCB0aGUgb25lIG1hdGNoaW5nIHRoZSB0eXBlLlxuLSBUaGUgWUFNTCBmcm9udCBtYXR0ZXIgYmV0d2VlbiB0aGUgXFxgLS0tXFxgIGxpbmVzIGlzIG1ldGFkYXRhLCBub3QgYm9keSB0ZXh0OiBwYXNzIGl0cyBcXGBsYWJlbHNcXGAgdmlhIFxcYC0tbGFiZWxcXGAgYW5kIHN1Ym1pdCBvbmx5IHRoZSBjb250ZW50IGJlbG93IHRoZSBjbG9zaW5nIFxcYC0tLVxcYCBhcyB0aGUgYm9keS5gO1xuXG4vKiogU2VjdGlvbnMgb2YgYSBidWcgcmVwb3J0LCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIGlzc3VlIHRlbXBsYXRlLiAqL1xuZXhwb3J0IGNvbnN0IEJVR19JU1NVRV9TRUNUSU9OUzogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10gPSBbXG4gIHsgaGVhZGluZzogJ1Byb2JsZW0nLCByZXF1aXJlbWVudDogJ3doYXQgaGFwcGVucywgYW5kIHdoYXQgc2hvdWxkIGhhcHBlbiBpbnN0ZWFkJyB9LFxuICB7IGhlYWRpbmc6ICdFdmlkZW5jZScsIHJlcXVpcmVtZW50OiAncmVwcm9kdWN0aW9uIHN0ZXBzLCBsb2dzLCBydW4gSURzLCBvciBsaW5rcycgfSxcbiAgeyBoZWFkaW5nOiAnSW1wYWN0JywgcmVxdWlyZW1lbnQ6ICd3aG8gb3Igd2hhdCBpcyBhZmZlY3RlZCwgYW5kIGhvdyBiYWRseScgfSxcbiAgeyBoZWFkaW5nOiAnUHJvcG9zYWwnLCByZXF1aXJlbWVudDogJ3RoZSBmaXggeW91IGhhdmUgaW4gbWluZCwgYW5kIHRoZSByb290IGNhdXNlIGlmIGtub3duJyB9LFxuXTtcblxuLyoqXG4gKiBTZWN0aW9ucyBhIGNoYW5nZSBzcGVjaWZpY2F0aW9uIG11c3Qgc2V0dGxlIGJlZm9yZSBhIHRoaXJkIHBhcnR5IGNhbiBpbXBsZW1lbnQgaXQsIGRlZmluZWRcbiAqIG9uY2Ugc28gdGhhdCB0aGUgaXNzdWUgdGVtcGxhdGUgYW5kIGFueSB0b29sIHRoYXQgZHJhZnRzIG9yIHJldmlld3Mgc3BlY2lmaWNhdGlvbnMgYWdhaW5zdFxuICogdGhlc2Ugc2VjdGlvbnMgY2Fubm90IGRyaWZ0IGFwYXJ0OyBjaGVja2xpc3QgY29uc3VtZXJzIHJlbmRlciBpdCB3aXRoIGByZW5kZXJTZWN0aW9uQ2hlY2tsaXN0YC5cbiAqIFRoZSBmaXJzdCB0aHJlZSBzZWN0aW9ucyBzdWZmaWNlIGZvciBhIHNtYWxsIGNoYW5nZSwgc28gdGhleSBjb21lIGZpcnN0LlxuICovXG5leHBvcnQgY29uc3QgQ0hBTkdFX0lTU1VFX1NFQ1RJT05TOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSA9IFtcbiAge1xuICAgIGhlYWRpbmc6ICdCYWNrZ3JvdW5kIGFuZCBnb2FsJyxcbiAgICByZXF1aXJlbWVudDogJ3RoZSBwcm9ibGVtIGJlaW5nIHNvbHZlZCwgZm9yIHdob20sIGFuZCB3aGF0IG91dGNvbWUgY291bnRzIGFzIHN1Y2Nlc3MnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0JlaGF2aW9yJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICdldmVyeSB1c2VyLSBvciBjYWxsZXItb2JzZXJ2YWJsZSBiZWhhdmlvciwgaW5jbHVkaW5nIGlucHV0cywgb3V0cHV0cywgZXJyb3IgY2FzZXMsIGVkZ2UgY2FzZXMsIGFuZCBpbnRlcmFjdGlvbnMgd2l0aCBleGlzdGluZyBiZWhhdmlvciwgc3RhdGVkIHByZWNpc2VseSBlbm91Z2ggdGhhdCB0d28gaW1wbGVtZW50ZXJzIHdvdWxkIGJ1aWxkIHRoZSBzYW1lIHRoaW5nJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdBY2NlcHRhbmNlIGNyaXRlcmlhJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICdjaGVja2FibGUgY29uZGl0aW9ucyAoR2l2ZW4vV2hlbi9UaGVuIG9yIGFuIGVxdWl2YWxlbnQpIHRoYXQgZGVjaWRlIHdoZXRoZXIgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRvbmUnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1Njb3BlIGFuZCBub24tZ29hbHMnLFxuICAgIHJlcXVpcmVtZW50OiAnd2hhdCB0aGUgY2hhbmdlIGNvdmVycyBhbmQgd2hhdCBpdCBkZWxpYmVyYXRlbHkgbGVhdmVzIG91dCwgc28gYW4gaW1wbGVtZW50ZXIga25vd3Mgd2hlcmUgdG8gc3RvcCcsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnRGVzaWduIGNvbnN0cmFpbnRzJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICd0aGUgZGF0YSwgQVBJLCBzY2hlbWEsIFVJLCBhbmQgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBuYW1pbmcsIGFuZCB0aGUgZXhpc3RpbmcgY29kZSBvciBjb252ZW50aW9ucyB0aGUgaW1wbGVtZW50YXRpb24gbXVzdCBmaXQg4oCUIGFzIGZhciBhcyB0aGUgd3JpdGVyIGludGVuZHMgdG8gY29uc3RyYWluIHRoZW0sIHdpdGggZXZlcnl0aGluZyBlbHNlIGV4cGxpY2l0bHkgbGVmdCB0byB0aGUgaW1wbGVtZW50ZXInLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0NvbXBhdGliaWxpdHkgYW5kIG1pZ3JhdGlvbicsXG4gICAgcmVxdWlyZW1lbnQ6ICd3aGF0IGV4aXN0aW5nIGRhdGEsIHVzZXJzLCBjYWxsZXJzLCBvciBjb25maWd1cmF0aW9ucyBhcmUgYWZmZWN0ZWQgYW5kIGhvdyB0aGUgdHJhbnNpdGlvbiBoYXBwZW5zJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdWZXJpZmljYXRpb24nLFxuICAgIHJlcXVpcmVtZW50OiAnaG93IHRoZSBjaGFuZ2UgaXMgdGVzdGVkIG9yIGRlbW9uc3RyYXRlZCwgaW5jbHVkaW5nIHdoYXQgbmVlZHMgbm8gdGVzdCBhbmQgd2h5JyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdPcGVuIHF1ZXN0aW9ucycsXG4gICAgcmVxdWlyZW1lbnQ6ICd1bmRlY2lkZWQgcG9pbnRzLCBlYWNoIHdpdGggaXRzIG9wdGlvbnM7IGVtcHR5IG9uY2UgdGhlIHNwZWNpZmljYXRpb24gaXMgaW1wbGVtZW50YWJsZScsXG4gIH0sXG5dO1xuXG4vKiogUmVuZGVycyBzZWN0aW9ucyBhcyBtYXJrZG93biBidWxsZXRzIChgLSAqKkhlYWRpbmcqKjogcmVxdWlyZW1lbnRgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJTZWN0aW9uQ2hlY2tsaXN0KHNlY3Rpb25zOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSk6IHN0cmluZyB7XG4gIHJldHVybiBzZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+IGAtICoqJHtzZWN0aW9uLmhlYWRpbmd9Kio6ICR7c2VjdGlvbi5yZXF1aXJlbWVudH1gKS5qb2luKCdcXG4nKTtcbn1cblxuLyoqIFJlbmRlcnMgc2VjdGlvbnMgYXMgbWFya2Rvd24gaGVhZGluZ3MsIGVhY2ggZm9sbG93ZWQgYnkgaXRzIHJlcXVpcmVtZW50IGFzIGEgcGxhY2Vob2xkZXIgY29tbWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJTZWN0aW9uVGVtcGxhdGUoc2VjdGlvbnM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlY3Rpb25zXG4gICAgLm1hcChcbiAgICAgIChzZWN0aW9uKSA9PlxuICAgICAgICBgIyMgJHtzZWN0aW9uLmhlYWRpbmd9XFxuXFxuPCEtLSAke3NlY3Rpb24ucmVxdWlyZW1lbnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHtzZWN0aW9uLnJlcXVpcmVtZW50LnNsaWNlKDEpfS4gLS0+YFxuICAgIClcbiAgICAuam9pbignXFxuXFxuJyk7XG59XG4iLCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpc2Vjb25kcykpO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAgICogRm9yIGV4YW1wbGUsIGByZXRyeUNvdW50OiAzYCBydW5zIHRoZSBmdW5jdGlvbiBhdCBtb3N0IDMgdGltZXM6IDEgaW5pdGlhbCBhdHRlbXB0IGFuZCB1cCB0byAyIHJldHJpZXMuXG4gICAqL1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogV2hlbiB0byB3cml0ZSBhIHRlc3QgYW5kIHdoYXQgYSB0ZXN0IG1heSBhc3NlcnQsIGFzIG1hcmtkb3duIGJ1bGxldHMgZm9yIGFuIGFnZW50J3MgaW5zdHJ1Y3Rpb25zLlxuICogU3RhdGVkIG9uY2UgaGVyZSBhbmQgcmVuZGVyZWQgYnkgdGhlIGdlbmVyYXRlZCBhZ2VudCBpbnN0cnVjdGlvbnMgYW5kIHRoZSB0ZXN0aW5nIHNraWxsIHNvIHRoZVxuICogdHdvIGNhbm5vdCBkcmlmdCBhcGFydC5cbiAqL1xuZXhwb3J0IGNvbnN0IFRFU1RfV1JJVElOR19SVUxFUyA9IGAtIFdyaXRlIGEgdGVzdCBvbmx5IHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQsIG9yIHdoZW4gYSBiZWhhdmlvciBpcyBsaWtlbHkgdG8gcmVncmVzcyBhbmQgbm8gZXhpc3RpbmcgYXV0b21hdGljIGNoZWNrICh0eXBlIGNoZWNraW5nLCBsaW50aW5nLCBhbiBleGlzdGluZyB0ZXN0IG9yIENJIGNoZWNrKSB3b3VsZCBjYXRjaCB0aGUgYnJlYWthZ2UuIE5ldmVyIGFkZCBhIHRlc3QgdGhhdCBtZXJlbHkgcmVzdGF0ZXMgYSBtYXBwaW5nIGZyb20gY29uZGl0aW9ucyB0byBjb25zdGFudCBvdXRwdXRzIChpdCBmYWlscyBvbmx5IG9uIGludGVudGlvbmFsIGVkaXRzKSBvciB0aGF0IG9ubHkgY29uZmlybXMgYW4gZXh0ZXJuYWwgZmFjdCAoYSBsaWJyYXJ5J3MgYmVoYXZpb3IsIHdoZXRoZXIgYSB2ZXJzaW9uIGZpeGVzIGFuIGlzc3VlKTsgdmVyaWZ5IHRob3NlIG9uY2UgbWFudWFsbHkuXG4tIFRlc3QgZXh0ZXJuYWxseSBvYnNlcnZhYmxlIGJlaGF2aW9yIChlLmcuLCBlbWl0dGVkIGZpbGVzLCBDTEkgb3V0cHV0LCByZW5kZXJlZCByZXN1bHRzKSBhdCB0aGUgc3lzdGVtIGJvdW5kYXJ5LCBub3QgaW1wbGVtZW50YXRpb24gZGV0YWlsczogZG8gbm90IG1pcnJvciBwcm9kdWN0aW9uIGxvZ2ljLCBhc3NlcnQgdGhhdCBhIGJyYW5jaCBpcyB0YWtlbiwgb3IgZmVlZCBoYW5kLWFzc2VtYmxlZCBpbnRlcm5hbCBvYmplY3RzIHRvIGludGVybmFsIGZ1bmN0aW9ucy5cbi0gUHJlZmVyIGFjdHVhbCBBUEkgY2FsbHMgb3ZlciBtb2NrcywgdW5sZXNzIGFjdHVhbCBjYWxscyBhcmUgaW1wcmFjdGljYWwsIGhhdmUgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMsIG9yIG1vY2tzIGFyZSBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbi0gRW5zdXJlIHRlc3RzIGFyZSBpZGVtcG90ZW50IGFuZCBpbmRlcGVuZGVudCAoZS5nLiwgcmVzZXQgcGVyc2lzdGVudCBkYXRhKSBzbyB0aGV5IGNhbiBydW4gcmVwZWF0ZWRseSBvciBpbiBwYXJhbGxlbC5cbi0gQXZvaWQgZml4ZWQgd2FpdHMgaW4gRTJFIHRlc3RzOyB3YWl0IGZvciBjb25kaXRpb25zIGluc3RlYWQuYDtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG4vKiogVGhlIGB3b3Jrc3BhY2VzYCBmaWVsZCBvZiBhIHJvb3QgcGFja2FnZS5qc29uOiB0aGUgYXJyYXkgZm9ybSBvciBZYXJuIHYxJ3Mgb2JqZWN0IGZvcm0uICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VzRGVjbGFyYXRpb24gPSBzdHJpbmdbXSB8IHsgcGFja2FnZXM/OiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlLmpzb24gcGF0aCAocmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QsIHNvcnRlZCkgdGhhdCBCdW4gd291bGQgbGlua1xuICogZm9yIHRoZSBnaXZlbiByb290IHBhY2thZ2UuanNvbiBgd29ya3NwYWNlc2AgZGVjbGFyYXRpb24uIENhbm9uaWNhbGl6ZXMgdGhlIGRlY2xhcmVkIHBhdHRlcm5zXG4gKiAoc2VlIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKSwgZHJvcHMgcGF0dGVybnMgZXNjYXBpbmcgdGhlIHJlcG9zaXRvcnkgKHNlZVxuICogaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKSwgYW5kIHJlc29sdmVzIHRoZSByZXN0IHdpdGggQnVuJ3Mgc2VxdWVudGlhbCBzZW1hbnRpY3MgKHNlZVxuICogcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJ1bldvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoXG4gICAgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlcykuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PlxuICAgICAgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm4pXG4gICAgKSxcbiAgICByb290RGlyUGF0aFxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHdvcmtzcGFjZSBwYXR0ZXJucyB0byBwYWNrYWdlLmpzb24gcGF0aHMgbWltaWNraW5nIEJ1bidzIFNFUVVFTlRJQUwgZXZhbHVhdGlvbixcbiAqIGRlcml2ZWQgZW1waXJpY2FsbHkgd2l0aCBCdW4gMS4zLjE0IChmaXh0dXJlIHJlcG9zIG9ic2VydmVkIHZpYSBgYnVuIGluc3RhbGwgLS1sb2NrZmlsZS1vbmx5YDtcbiAqIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA0IC8gV2lsbEJvb3N0ZXIvc2hhcmVkIzEwMDUpOlxuICogMS4gUGF0dGVybnMgYXJlIGV2YWx1YXRlZCBpbiBkZWNsYXJhdGlvbiBvcmRlciBpbnRvIGFuIGFjY3VtdWxhdGluZyBzZXQ6IGEgcG9zaXRpdmUgZ2xvYlxuICogICAgcGF0dGVybiBhZGRzIGV2ZXJ5IHBhY2thZ2UuanNvbiBpdCBtYXRjaGVzOyBhIG5lZ2F0aW9uIGRlbGV0ZXMgaXRzIG1hdGNoZXMgZnJvbSB0aGUgc2V0XG4gKiAgICBhY2N1bXVsYXRlZCBTTyBGQVIsIHNvIGEgbGF0ZXIgcG9zaXRpdmUgcmUtYWRkcyB0aGVtIChgW1wiIWFwcHMvZXhjbHVkZWRcIiwgXCJhcHBzLypcIl1gIGxpbmtzXG4gKiAgICBhcHBzL2V4Y2x1ZGVkLCB3aGlsZSBgW1wiYXBwcy8qXCIsIFwiIWFwcHMvZXhjbHVkZWRcIl1gIGRvZXMgbm90KS5cbiAqIDIuIEEgbmVnYXRpb24gd2hvc2Ugbm9ybWFsaXplZCBib2R5IGhhcyBFWEFDVExZIHR3byBzZWdtZW50cywgd2hvc2UgbGFzdCBzZWdtZW50IGlzIGEgc3Rhci1ydW5cbiAqICAgIChgKmAsIGAqKmAsIGAqKipgLCDigKYpLCBhbmQgd2hvc2UgZmlyc3Qgc2VnbWVudCBpcyBOT1QgaXRzZWxmIGEgc3Rhci1ydW4gZmlyc3Qgc2VlZHMgdGhlXG4gKiAgICBpbXBsaWNpdCBiYXNlbGluZSBpbnRvIHRoZSBzZXQsIHRoZW4gZGVsZXRlcyBpdHMgb3duIG1hdGNoZXM6IGEgYCoqYCBsYXN0IHNlZ21lbnQgc2VlZHNcbiAqICAgIGAqKmAgKHBhY2thZ2VzIGF0IGFueSBkZXB0aCksIGFueSBvdGhlciBzdGFyLXJ1biBzZWVkcyBgKlxcLypgIChkZXB0aCAyIG9ubHkpLiBTZWVkaW5nXG4gKiAgICBoYXBwZW5zIGV2ZW4gYWxvbmdzaWRlIHBvc2l0aXZlIHBhdHRlcm5zIChgW1wiYXBwcy8qXCIsIFwiIW90aGVyLypcIl1gIGxpbmtzIGV2ZXJ5IGRlcHRoLTJcbiAqICAgIHBhY2thZ2Ugb3V0c2lkZSBvdGhlci8pLiBObyBvdGhlciBuZWdhdGlvbiBzaGFwZSBzZWVkczogYCEqYCwgYCEqKmAsIGAhKlxcLypgLCBgISpcXC8qKmAsXG4gKiAgICBgISoqXFwvKmAsIGAhYS9iLypgLCBgIWEvYi8qKmAsIGAhZGlyYCwgYW5kIGAhZGlyLyp4YCBlYWNoIGxpbmsgbm90aGluZyBvbiB0aGVpciBvd24uXG4gKiAgICBgP2AsIGJyYWNlLCBhbmQgY2hhcmFjdGVyLWNsYXNzIGxhc3Qgc2VnbWVudHMgYmVoYXZlIEVSUkFUSUNBTExZIChgW1wiIW90aGVyLz9cIl1gIGxpbmtzXG4gKiAgICBwYWNrYWdlcy9hIHlldCBub3QgdGhlIGVxdWFsbHkgYmFzZWxpbmUtc2hhcGVkIG90aGVyL3l5LCBgW1wiIW90aGVyLz8/XCJdYCBsaW5rcyBub3RoaW5nLCBhbmRcbiAqICAgIGBbXCIhPy8/XCJdYCBsaW5rcyB0aGUgdmVyeSBvdGhlci94IGl0IG1hdGNoZXMpLCBzbyBubyBjb25zaXN0ZW50IHJ1bGUgY2FuIG1vZGVsIHRoZW07IHRoZXlcbiAqICAgIGFyZSBkZWxpYmVyYXRlbHkgdHJlYXRlZCBhcyBub3Qgc2VlZGluZyDigJQgc2VlIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUgYW5kICMxMDA1LlxuICogMy4gQSBub24tZ2xvYiBwb3NpdGl2ZSBwYXR0ZXJuIFBJTlMgaXRzIGRpcmVjdG9yeTogaXQgc3RheXMgYSB3b3Jrc3BhY2UgcmVnYXJkbGVzcyBvZiB3aGVyZSBhXG4gKiAgICBtYXRjaGluZyBuZWdhdGlvbiBhcHBlYXJzIChgW1wib3RoZXIveFwiLCBcIiFvdGhlci94XCJdYCBhbmQgYFtcIiFvdGhlci94XCIsIFwib3RoZXIveFwiXWAgYm90aFxuICogICAgbGluayBvdGhlci94KS5cbiAqIDQuIGAqKmAgbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgcGF0aCBzZWdtZW50cyAoYFtcImFwcHMvKipcIl1gIGxpbmtzIHRoZSBwYWNrYWdlIGF0IGFwcHMgaXRzZWxmLCBhbmRcbiAqICAgIGAhYXBwcy8qKmAgZGVsZXRlcyBpdCksIG1hdGNoaW5nIGZhc3QtZ2xvYidzIGZpbGUtZ2xvYiBzZW1hbnRpY3MuXG4gKiBEbyBub3QgYXBwbHkgZ2xvYklnbm9yZSBoZXJlOiB3b3Jrc3BhY2UgbWVtYmVyc2hpcCBpcyBkZWZpbmVkIHNvbGVseSBieSB0aGUgZGVjbGFyZWQgcGF0dGVybnMsXG4gKiBhbmQgc291cmNlLXNjYW5uaW5nIGlnbm9yZXMgc3VjaCBhcyBgYnVpbGRgIG9yIGBkaXN0YCB3b3VsZCBoaWRlIGxlZ2l0aW1hdGVseSBuYW1lZCB3b3Jrc3BhY2VcbiAqIGRpcmVjdG9yaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMod29ya3NwYWNlUGF0dGVybnM6IHN0cmluZ1tdLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAvLyBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSBzdG9wcyBHTE9CIHRyYXZlcnNhbCB0aHJvdWdoIHN5bWxpbmtzLCBidXQgYSBub24tZ2xvYiBwYXR0ZXJuXG4gIC8vIG5hbWluZyBhIHN5bWxpbmtlZCBkaXJlY3RvcnkgKGUuZy4gYGxpbmtlZGAgd2l0aCBgbGlua2VkIC0+IC4uL290aGVyLXJlcG9gKSBzdGlsbCBtYXRjaGVzIOKAlFxuICAvLyBmYXN0LWdsb2IgcmVzb2x2ZXMgc3RhdGljIHBhdHRlcm5zIHdpdGggZGlyZWN0IGZzIGNoZWNrcywgYW5kIEJ1biBkb2VzIGxpbmsgc3VjaCBhIHdvcmtzcGFjZS5cbiAgLy8gRGVsaWJlcmF0ZWx5IGRpdmVyZ2UgZnJvbSBCdW4gdGhlcmU6IGNvbnN1bWVycyBzdWNoIGFzIG5vZGVfbW9kdWxlcyBjbGVhbnVwIGFuZCBtYW5pZmVzdFxuICAvLyByZXdyaXRpbmcgd291bGQgb3RoZXJ3aXNlIGRlbGV0ZSBhbmQgcmV3cml0ZSBmaWxlcyBpbiBBTk9USEVSIHJlcG9zaXRvcnkgdGhyb3VnaCB0aGUgc3ltbGluayxcbiAgLy8gc28ga2VlcCBvbmx5IG1hbmlmZXN0cyB3aG9zZSByZWFsIHBhdGggc3RheXMgaW5zaWRlIHRoZSByZXBvc2l0b3J5J3MgcmVhbCByb290LiBTY2FubmluZyBlYWNoXG4gIC8vIHBhdHRlcm4gc2VwYXJhdGVseSAobm8gY3Jvc3MtcGF0dGVybiBjYWNoaW5nKSBpcyBkZWxpYmVyYXRlOiBkZWNsYXJhdGlvbnMgaG9sZCBhIGhhbmRmdWwgb2ZcbiAgLy8gcGF0dGVybnMsIHNvIGEgY2FjaGUgd291bGQgY29tcGxpY2F0ZSB0aGlzIHNoYXJlZCBjb2RlIHdpdGhvdXQgbWVhc3VyYWJsZSBnYWluLlxuICBjb25zdCBnbG9iTWFuaWZlc3RQYXRocyA9IChwYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgLy8gQnVuIGxpbmtzIGRvdC1kaXJlY3RvcnkgcGFja2FnZXMgb25seSB0aHJvdWdoIGZ1bGx5IHN0YXRpYyBwYXR0ZXJuczogd2l0aCBCdW4gMS4zLjE0LFxuICAgIC8vIGAuaGlkZGVuL3hgIHBpbnMgdGhlIHBhY2thZ2Ugd2hpbGUgYC5oaWRkZW4vKmAsIGAuKi8qYCwgYW5kIGAqKmAgYWxsIGxpbmsgbm90aGluZyB1bmRlclxuICAgIC8vIC5oaWRkZW4g4oCUIGV2ZW4gd2hlbiB0aGUgZG90dGVkIHNlZ21lbnQgaXRzZWxmIGlzIGxpdGVyYWwg4oCUIHNvIGFueSBkeW5hbWljIHBhdHRlcm4gbXVzdFxuICAgIC8vIGRyb3AgbWF0Y2hlcyBjb250YWluaW5nIGEgZG90LWxlZCBzZWdtZW50IChmYXN0LWdsb2IncyBgZG90OiBmYWxzZWAgb25seSBjb3ZlcnMgc2VnbWVudHNcbiAgICAvLyBhIHdpbGRjYXJkIG1hdGNoZXMpLlxuICAgIGNvbnN0IGV4Y2x1ZGVzRG90U2VnbWVudHMgPSBmZy5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm4pO1xuICAgIGNvbnN0IGdsb2JPcHRpb25zID0geyBjd2Q6IHJvb3REaXJQYXRoLCBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSwgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddIH07XG4gICAgLy8gZmFzdC1nbG9iIDMuMy4zIHJldHVybnMgbm8gbWF0Y2hlcyBmb3IgZmlsZSBnbG9icyB3aXRoIGEgbG9uZS1gP2Agc2VnbWVudCAoZS5nLlxuICAgIC8vIGBwYWNrYWdlcy8/L3BhY2thZ2UuanNvbmApLCBhbHRob3VnaCBtaWNyb21hdGNoIG1hdGNoZXMgdGhlbSBhbmQgQnVuIDEuMy4xNCBsaW5rcyBzdWNoXG4gICAgLy8gd29ya3NwYWNlczsgZm9yIGA/YC1jYXJyeWluZyBwYXR0ZXJucyBvbmx5IChhIGRpcmVjdG9yeSBnbG9iIGZvciBlLmcuIGAqKmAgd291bGQgc2NhbiBldmVyeVxuICAgIC8vIGRpcmVjdG9yeSBpbiB0aGUgcmVwb3NpdG9yeSksIGdsb2JiaW5nIHRoZSBkaXJlY3RvcmllcyAod2hlcmUgYD9gIHdvcmtzKSBhbmQgY2hlY2tpbmcgdGhlaXJcbiAgICAvLyBtYW5pZmVzdHMgY29tcGxlbWVudHMgdGhlIG1hbmlmZXN0IGdsb2IsIHdoaWNoIHN0YXlzIG5lY2Vzc2FyeSBmb3IgYCoqYCdzIHplcm8tc2VnbWVudFxuICAgIC8vIG1hdGNoZXMg4oCUIGBkaXIvKipgIGRvZXMgbm90IHJldHVybiBkaXIgaXRzZWxmIGFzIGEgZGlyZWN0b3J5LlxuICAgIGNvbnN0IG1hbmlmZXN0UGF0aHMgPSBuZXcgU2V0KGZnLmdsb2JTeW5jKHBhdGgucG9zaXguam9pbihwYXR0ZXJuLCAncGFja2FnZS5qc29uJyksIGdsb2JPcHRpb25zKSk7XG4gICAgaWYgKHBhdHRlcm4uaW5jbHVkZXMoJz8nKSkge1xuICAgICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgLi4uZ2xvYk9wdGlvbnMsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnBvc2l4LmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsIHBhY2thZ2VKc29uUGF0aCkpKSBtYW5pZmVzdFBhdGhzLmFkZChwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBIHplcm8tc2VnbWVudCBgKipgIG1hdGNoIHJlYWNoZXMgdGhlIHJvb3QncyBvd24gbWFuaWZlc3QsIGJ1dCBCdW4gbmV2ZXIgdHJlYXRzIHRoZVxuICAgIC8vIG1vbm9yZXBvIHJvb3QgYXMgaXRzIG93biB3b3Jrc3BhY2UuXG4gICAgcmV0dXJuIFsuLi5tYW5pZmVzdFBhdGhzXS5maWx0ZXIoXG4gICAgICAocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgICBwYWNrYWdlSnNvblBhdGggIT09ICdwYWNrYWdlLmpzb24nICYmXG4gICAgICAgICghZXhjbHVkZXNEb3RTZWdtZW50cyB8fCAhcGFja2FnZUpzb25QYXRoLnNwbGl0KCcvJykuc29tZSgoc2VnbWVudCkgPT4gc2VnbWVudC5zdGFydHNXaXRoKCcuJykpKSAmJlxuICAgICAgICBpc0luc2lkZVJlYWxSb290KHBhY2thZ2VKc29uUGF0aClcbiAgICApO1xuICB9O1xuICBsZXQgcmVhbFJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGlzSW5zaWRlUmVhbFJvb3QgPSAocGFja2FnZUpzb25QYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICB0cnkge1xuICAgICAgcmVhbFJvb3REaXJQYXRoID8/PSBmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpO1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShyZWFsUm9vdERpclBhdGgsIGZzLnJlYWxwYXRoU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsIHBhY2thZ2VKc29uUGF0aCkpKTtcbiAgICAgIC8vIENvbXBhcmUgd2hvbGUgc2VnbWVudHMsIG5vdCBhIGAuLmAgcHJlZml4OiBhIGRpcmVjdG9yeSBsaXRlcmFsbHkgbmFtZWQgZS5nLiBgLi5wa2dgIGlzXG4gICAgICAvLyBpbnNpZGUgdGhlIHJvb3QsIHdoaWxlIGEgcGxhaW4gc3RhcnRzV2l0aCgnLi4nKSB3b3VsZCBtaXNyZWFkIGl0IGFzIHBhcmVudCB0cmF2ZXJzYWwuXG4gICAgICByZXR1cm4gcmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQSBtYW5pZmVzdCB0aGF0IHZhbmlzaGVkIGJldHdlZW4gdGhlIGdsb2IgYW5kIHRoZSByZWFscGF0aCBjYWxsIGlzIG5vdCBhIHdvcmtzcGFjZS5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGFjY3VtdWxhdGVkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgcGlubmVkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXR0ZXJuIG9mIHdvcmtzcGFjZVBhdHRlcm5zKSB7XG4gICAgY29uc3QgaXNOZWdhdGl2ZSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpO1xuICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkoaXNOZWdhdGl2ZSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuKTtcbiAgICBpZiAoaXNOZWdhdGl2ZSkge1xuICAgICAgY29uc3QgYmFzZWxpbmVHbG9iID0gZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKHBhdHRlcm5Cb2R5KTtcbiAgICAgIGlmIChiYXNlbGluZUdsb2IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhiYXNlbGluZUdsb2IpKSBhY2N1bXVsYXRlZFBhdGhzLmFkZChwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMocGF0dGVybkJvZHkpKSBhY2N1bXVsYXRlZFBhdGhzLmRlbGV0ZShwYWNrYWdlSnNvblBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YXJnZXRQYXRocyA9IGZnLmlzRHluYW1pY1BhdHRlcm4ocGF0dGVybkJvZHkpID8gYWNjdW11bGF0ZWRQYXRocyA6IHBpbm5lZFBhdGhzO1xuICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMocGF0dGVybkJvZHkpKSB7XG4gICAgICAgIHRhcmdldFBhdGhzLmFkZChwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmFjY3VtdWxhdGVkUGF0aHMsIC4uLnBpbm5lZFBhdGhzXSldLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZGVjbGFyYXRpb24gc2VlZHMgQnVuJ3MgaW1wbGljaXQgd29ya3NwYWNlIGJhc2VsaW5lOiBpdCBjb250YWlucyBhdCBsZWFzdCBvbmVcbiAqIG5lZ2F0aW9uIG9mIHRoZSBzZWVkaW5nIHNoYXBlIChzZWUgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMgcnVsZSAyKS4gTWVhc3VyZWQgd2l0aCBCdW5cbiAqIDEuMy4xNCwgc2VlZGluZyBpcyBwZXItbmVnYXRpb24gYW5kIGhhcHBlbnMgZXZlbiBhbG9uZ3NpZGUgcG9zaXRpdmUgcGF0dGVybnM7IGNvbmNyZXRlIG9yXG4gKiBtaXhlZC1saXRlcmFsIGxhc3Qgc2VnbWVudHMgKGAhYXBwcy9leGNsdWRlZGAsIGAhYXBwcy8qZGApIG5ldmVyIHNlZWQsIGFuZCBgP2AsIGJyYWNlLCBhbmRcbiAqIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZWQgaW5jb25zaXN0ZW50bHkgYWNyb3NzIGZpeHR1cmVzIChzb21ldGltZXMgZHJvcHBpbmcgZXZlblxuICogdW5yZWxhdGVkIHNpYmxpbmcgd29ya3NwYWNlcyksIHNvIHRoZXkgYXJlIGNvbnNlcnZhdGl2ZWx5IHRyZWF0ZWQgYXMgbm90IHNlZWRpbmc7IHNlZVxuICogV2lsbEJvb3N0ZXIvc2hhcmVkIzEwMDUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbik6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlcykuc29tZShcbiAgICAod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpICYmXG4gICAgICBnZXRTZWVkZWRCYXNlbGluZUdsb2Iobm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkod29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSkpICE9PSB1bmRlZmluZWRcbiAgKTtcbn1cblxuLyoqXG4gKiBEZWNsYXJlZCB3b3Jrc3BhY2UgcGF0dGVybnMgd2l0aG91dCBCdW4ncyBuby1vcCBvbmVzIChgXCJcImAsIGEgbG9uZSBgXCIhXCJgLCBhbmQgYFwiLlwiYCksIHdoaWNoIEJ1blxuICogaWdub3JlcyBlbnRpcmVseSDigJQgYSBsb25lIGBcIiFcImAgbXVzdCBub3QgYWN0aXZhdGUgdGhlIG5lZ2F0aXZlLW9ubHkgaW1wbGljaXQgYmFzZWxpbmUsIGFuZCBgXCJcImBcbiAqIG11c3Qgbm90IG1ha2UgdGhlIHJlcG9zaXRvcnkgcm9vdCBpdHNlbGYgYSBkaXNjb3ZlcmVkIHdvcmtzcGFjZS4gRGVjbGFyYXRpb24gb3JkZXIgYW5kXG4gKiBkdXBsaWNhdGVzIGFyZSBwcmVzZXJ2ZWQg4oCUIEJ1biBldmFsdWF0ZXMgdGhlIHBhdHRlcm5zIHNlcXVlbnRpYWxseSwgc28gcG9zaXRpb24gbWF0dGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlcylcbiAgICAubWFwKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiB7XG4gICAgICAvLyBCdW4gYXBwbGllcyBsZWFkaW5nLWJhbmcgUEFSSVRZICh2ZXJpZmllZCB3aXRoIEJ1biAxLjMuMTQpOiBgISFwYCBpcyB0aGUgcG9zaXRpdmUgYHBgXG4gICAgICAvLyBhbmQgYCEhIXBgIHRoZSBuZWdhdGlvbiBgIXBgLCBzbyBjYW5vbmljYWxpemUgdG8gYXQgbW9zdCBvbmUgYmFuZy5cbiAgICAgIGNvbnN0IGJhbmdDb3VudCA9IC9eISovdS5leGVjKHdvcmtzcGFjZVBhdHRlcm4pIVswXS5sZW5ndGg7XG4gICAgICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoYmFuZ0NvdW50KTtcbiAgICAgIHJldHVybiBiYW5nQ291bnQgJSAyID09PSAxID8gYCEke3BhdHRlcm5Cb2R5fWAgOiBwYXR0ZXJuQm9keTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKHdvcmtzcGFjZVBhdHRlcm4pID0+IHtcbiAgICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybjtcbiAgICAgIC8vIE5vcm1hbGl6ZSBzbyBzcGVsbGluZ3MgbGlrZSBgLi9gLCBgLi8uYCwgYW5kIGAhLi9gIGFyZSByZWNvZ25pemVkIGFzIHRoZSBzYW1lIG5vLW9wc1xuICAgICAgLy8gKHBhdGgucG9zaXgubm9ybWFsaXplKCcnKSA9PT0gJy4nLCBzbyB0aGUgZW1wdHkgcGF0dGVybiBpcyBjb3ZlcmVkIHRvbykuXG4gICAgICByZXR1cm4gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkocGF0dGVybkJvZHkpICE9PSAnLic7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQ29sbGFwc2VzIGAvL2AsIHJlc29sdmVzIGAuL2AsIGFuZCBzdHJpcHMgdHJhaWxpbmcgc2xhc2hlcywgbWlycm9yaW5nIEJ1bidzIHBhdGggaGFuZGxpbmcuXG4gKiBBIHB1cmUgc3Rhci1ydW4gc2VnbWVudCBvZiB0aHJlZSBvciBtb3JlIHN0YXJzIGJlaGF2ZXMgbGlrZSBgKmAgdW5kZXIgQnVuIChgIW90aGVyLyoqKmBcbiAqIG1hdGNoZXMgb3RoZXIveCkgYnV0IG5vdCB1bmRlciBmYXN0LWdsb2IsIHNvIGNhbm9uaWNhbGl6ZSBpdCB0byBgKmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShwYXR0ZXJuQm9keTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgucG9zaXhcbiAgICAubm9ybWFsaXplKHBhdHRlcm5Cb2R5KVxuICAgIC5yZXBsYWNlKC9cXC8rJC91LCAnJylcbiAgICAuc3BsaXQoJy8nKVxuICAgIC5tYXAoKHNlZ21lbnQpID0+ICgvXlxcKnszLH0kL3UudGVzdChzZWdtZW50KSA/ICcqJyA6IHNlZ21lbnQpKVxuICAgIC5qb2luKCcvJyk7XG59XG5cbi8qKiBUaGUgaW1wbGljaXQgYmFzZWxpbmUgZ2xvYiBhIG5lZ2F0aW9uIHNlZWRzIHVuZGVyIEJ1bidzIHJ1bGUgMiBhYm92ZSwgb3IgdW5kZWZpbmVkIGlmIG5vbmUuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKG5lZ2F0aW9uQm9keTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBuZWdhdGlvbkJvZHkuc3BsaXQoJy8nKTtcbiAgaWYgKHNlZ21lbnRzLmxlbmd0aCAhPT0gMikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgW2ZpcnN0U2VnbWVudCwgbGFzdFNlZ21lbnRdID0gc2VnbWVudHMgYXMgW3N0cmluZywgc3RyaW5nXTtcbiAgaWYgKCEvXlxcKiskL3UudGVzdChsYXN0U2VnbWVudCkgfHwgL15cXCorJC91LnRlc3QoZmlyc3RTZWdtZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGxhc3RTZWdtZW50ID09PSAnKionID8gJyoqJyA6ICcqLyonO1xufVxuXG4vKiogV29ya3NwYWNlIHBhdHRlcm5zIGZyb20gZWl0aGVyIHRoZSBhcnJheSBmb3JtIG9yIFlhcm4gdjEncyBgeyBwYWNrYWdlczogW+KApl0gfWAgb2JqZWN0IGZvcm0uICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBzdHJpbmdbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHdvcmtzcGFjZXMpKSByZXR1cm4gd29ya3NwYWNlcztcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkod29ya3NwYWNlcz8ucGFja2FnZXMpID8gd29ya3NwYWNlcy5wYWNrYWdlcyA6IFtdO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBkZWNsYXJlZCB3b3Jrc3BhY2UgcGF0dGVybiAobmVnYXRpdmUgb25lcyBpbmNsdWRlZCkgc3RheXMgaW5zaWRlIHRoZSByZXBvc2l0b3J5OlxuICogYWJzb2x1dGUgb3IgYC4uYC10cmF2ZXJzaW5nIHBhdHRlcm5zIHdvdWxkIG1ha2UgY29uc3VtZXJzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIGNsZWFudXAgb3BlcmF0ZVxuICogb24gYW5vdGhlciByZXBvc2l0b3J5J3MgZmlsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhdHRlcm5Cb2R5ID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybjtcbiAgcmV0dXJuICFwYXRoLnBvc2l4LmlzQWJzb2x1dGUocGF0dGVybkJvZHkpICYmICFwYXR0ZXJuQm9keS5zcGxpdCgnLycpLmluY2x1ZGVzKCcuLicpO1xufVxuIiwiaW1wb3J0IGNyeXB0byBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG4vKipcbiAqIEFuY2hvcmVkIHRvIGBcIiwgYCBzbyBvbmx5IGEgcmVnaXN0cnkgZW50cnkncyBgcmVzb2x2ZWRgIHNsb3QgaXMgY2xlYXJlZC4gQSBkaXJlY3QgdGFyYmFsbFxuICogZGVwZW5kZW5jeSBjYXJyaWVzIGl0cyBVUkwgaW4gdGhlIHdvcmtzcGFjZSBkZXNjcmlwdG9yIGFuZCB0dXBsZSBpZGVudGlmaWVyIGluc3RlYWQsIGFuZCB0aG9zZVxuICogVVJMcyBtdXN0IHJlbWFpbiBpbnRhY3QuXG4gKi9cbmNvbnN0IGd1YXJkUmVzb2x2ZWRVcmxQYXR0ZXJuID0gLyhcIiwgKVwiaHR0cHM6XFwvXFwvbnBtXFwuZmxhdHRcXC50ZWNoXFwvW15cIl0qXCIvZztcblxuLyoqXG4gKiBSZW1vdmUgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgYnVuLmxvY2suXG4gKlxuICogQnVuIHdyaXRlcyB0aGUgd29ya3NwYWNlIHJvb3QncyBsb2NrZmlsZSBldmVuIHdoZW4gYW4gaW5zdGFsbCBydW5zIGZyb20gYSBjaGlsZCBwYWNrYWdlLiBJbiBhXG4gKiBHaXQgY2hlY2tvdXQgdGhlIHNlYXJjaCBjbGltYnMgdG8gdGhhdCByb290OyB3aXRob3V0IGEgY2hlY2tvdXQgYm91bmRhcnkgaXQgaW5zcGVjdHMgb25seSB0aGVcbiAqIHN0YXJ0aW5nIGRpcmVjdG9yeSBzbyBpdCBjYW5ub3QgcmV3cml0ZSBhbiB1bnJlbGF0ZWQgYW5jZXN0b3IncyBsb2NrZmlsZS4gVGhlIHByb3h5IGlzXG4gKiBpbnN0YWxsLXRpbWUgcG9saWN5IHJhdGhlciB0aGFuIHJlcG9zaXRvcnkgc3RhdGU6IGFuIGVtcHR5IHJlc29sdmVkIHNsb3Qgc3RpbGwgbWFrZXMgQnVuIHVzZSB0aGVcbiAqIGNvbmZpZ3VyZWQgZGVmYXVsdCByZWdpc3RyeS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBsb2NrZmlsZSBwYXRoLCBvciB1bmRlZmluZWQgd2hlbiBubyBjaGFuZ2Ugd2FzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUJ1bkxvY2tmaWxlKHN0YXJ0RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbG9ja2ZpbGVQYXRoID0gZmluZEJ1bkxvY2tmaWxlUGF0aChzdGFydERpclBhdGgpO1xuICBpZiAoIWxvY2tmaWxlUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMobG9ja2ZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbChndWFyZFJlc29sdmVkVXJsUGF0dGVybiwgJyQxXCJcIicpO1xuICBpZiAobm9ybWFsaXplZENvbnRlbnQgPT09IGNvbnRlbnQpIHJldHVybjtcblxuICAvLyBBIHNpYmxpbmcgdGVtcCBmaWxlIG1ha2VzIHRoZSByZXBsYWNlbWVudCBhbiBhdG9taWMgc2FtZS1kaXJlY3RvcnkgcmVuYW1lLCBzbyBhbiBpbnRlcnJ1cHRlZFxuICAvLyB3cml0ZSBjYW5ub3QgbGVhdmUgYSB0cnVuY2F0ZWQgYnVuLmxvY2sgYmVoaW5kLlxuICBjb25zdCB0ZW1wb3JhcnlQYXRoID0gYCR7bG9ja2ZpbGVQYXRofS5ub3JtYWxpemluZy4ke3Byb2Nlc3MucGlkfS4ke2NyeXB0by5yYW5kb21VVUlEKCl9YDtcbiAgdHJ5IHtcbiAgICAvLyBzdGF0J3MgbW9kZSBpbmNsdWRlcyBmaWxlLXR5cGUgYml0cywgd2hpY2ggY2htb2QgaXMgbm90IHNwZWNpZmllZCB0byBhY2NlcHQuXG4gICAgY29uc3QgbW9kZSA9IGZzLnN0YXRTeW5jKGxvY2tmaWxlUGF0aCkubW9kZSAmIDBvNzc3O1xuICAgIGZzLndyaXRlRmlsZVN5bmModGVtcG9yYXJ5UGF0aCwgbm9ybWFsaXplZENvbnRlbnQsIHsgbW9kZSB9KTtcbiAgICAvLyB3cml0ZUZpbGVTeW5jJ3MgbW9kZSBpcyBtYXNrZWQgYnkgdGhlIHByb2Nlc3MgdW1hc2s7IGNobW9kIHJlc3RvcmVzIHRoZSBleGFjdCBvcmlnaW5hbCBiaXRzLlxuICAgIGZzLmNobW9kU3luYyh0ZW1wb3JhcnlQYXRoLCBtb2RlKTtcbiAgICBmcy5yZW5hbWVTeW5jKHRlbXBvcmFyeVBhdGgsIGxvY2tmaWxlUGF0aCk7XG4gIH0gZmluYWxseSB7XG4gICAgZnMucm1TeW5jKHRlbXBvcmFyeVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIGxvY2tmaWxlUGF0aDtcbn1cblxuZnVuY3Rpb24gZmluZEJ1bkxvY2tmaWxlUGF0aChzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkU3RhcnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKHN0YXJ0RGlyUGF0aCk7XG4gIGNvbnN0IHJlcG9zaXRvcnlSb290RGlyUGF0aCA9IGZpbmRSZXBvc2l0b3J5Um9vdERpclBhdGgocmVzb2x2ZWRTdGFydERpclBhdGgpO1xuICBpZiAoIXJlcG9zaXRvcnlSb290RGlyUGF0aCkge1xuICAgIGNvbnN0IGxvY2tmaWxlUGF0aCA9IHBhdGguam9pbihyZXNvbHZlZFN0YXJ0RGlyUGF0aCwgJ2J1bi5sb2NrJyk7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMobG9ja2ZpbGVQYXRoKSA/IGxvY2tmaWxlUGF0aCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGxldCBkaXJQYXRoID0gcmVzb2x2ZWRTdGFydERpclBhdGg7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgbG9ja2ZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsICdidW4ubG9jaycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2tmaWxlUGF0aCkpIHJldHVybiBsb2NrZmlsZVBhdGg7XG4gICAgaWYgKGRpclBhdGggPT09IHJlcG9zaXRvcnlSb290RGlyUGF0aCkgcmV0dXJuO1xuXG4gICAgZGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kUmVwb3NpdG9yeVJvb3REaXJQYXRoKHN0YXJ0RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGRpclBhdGggPSBzdGFydERpclBhdGg7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICcuZ2l0JykpKSByZXR1cm4gZGlyUGF0aDtcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGRpclBhdGgpIHJldHVybjtcbiAgICBkaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuIiwiLyoqIFdoZXRoZXIgYSBEb2NrZXJmaWxlIGNvbnN1bWVzIHdiJ3MgZ2VuZXJhdGVkIG5vbi1zZWNyZXQgZW52aXJvbm1lbnQgZGlyZWN0bHkgb3IgdGhyb3VnaCBpdHMgaGVscGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN1bWVzRG9ja2VyRW52KGRvY2tlcmZpbGVUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGRvY2tlcmZpbGVUZXh0XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5zb21lKChsaW5lKSA9PiAhL15cXHMqIy91LnRlc3QobGluZSkgJiYgKGxpbmUuaW5jbHVkZXMoJy5kb2NrZXIuZW52JykgfHwgbGluZS5pbmNsdWRlcygnYXBwbHktZG9ja2VyLWVudi5zaCcpKSk7XG59XG4iLCJleHBvcnQgY29uc3QgZ2xvYklnbm9yZSA9IFtcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi8uYW50aWdyYXZpdHljbGkvKionLFxuICAvLyBHaXQncyBvYmplY3Qgc3RvcmUgaG9sZHMgY29waWVzIG9mIHRyYWNrZWQgZmlsZXMgKGFuZCBgZG90OiB0cnVlYCBtYWtlcyB0aGVtIHZpc2libGUpLCBzb1xuICAvLyBzY2FubmluZyBpdCB3b3VsZCBib3RoIHNsb3cgZXZlcnkgZ2xvYiBkb3duIGFuZCBsZXQgc3RhbGUgYmxvYnMgaW5mbHVlbmNlIGRldGVjdGlvbi5cbiAgJyoqLy5naXQvKionLFxuICAvLyBUaGUgb3JnLXN0YW5kYXJkIHRlbXBvcmFyeSBkaXJlY3Rvcnk7IHN0YWxlIGNvcGllcyB1bmRlciBpdCAoZS5nLiByZXZpZXcgc2NyYXRjaCBkaXJzKSBtdXN0XG4gIC8vIG5vdCBpbmZsdWVuY2UgbGFuZ3VhZ2UgZGV0ZWN0aW9uLlxuICAnKiovLnRtcC8qKicsXG4gICcqKi8udG1wLSovKionLFxuICAvLyBMb2NhbCBjYWNoZXMgY2FuIGNvbnRhaW4gY29tcGxldGUgdGhpcmQtcGFydHkgc291cmNlIGNoZWNrb3V0cy4gVHJlYXRpbmcgdGhvc2UgYXMgcmVwb3NpdG9yeVxuICAvLyBjb2RlIGdlbmVyYXRlcyB3b3JrZmxvd3MgZm9yIHBhdGhzIHRoYXQgYXJlIGdpdGlnbm9yZWQgYW5kIGFic2VudCBmcm9tIGZyZXNoIENJIGNoZWNrb3V0cy5cbiAgJyoqLy5jYWNoZS8qKicsXG4gICcqKi8udmVudi8qKicsXG4gICcqKi90ZXN0LWZpeHR1cmVzLyoqJyxcbiAgJyoqL3Rlc3QvZml4dHVyZXMvKionLFxuICAnKiovZGlzdC8qKicsXG4gICcqKi9idWlsZC8qKicsXG4gICcqKi90YXJnZXQvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi90bXAvKionLFxuXTtcbiIsImNsYXNzIE9wdGlvbnMge1xuICBpc1ZlcmJvc2UgPSBmYWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpO1xuIiwiaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5cbmNsYXNzIExvZ2dlciB7XG4gIGFzeW5jIGZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24obmFtZTogc3RyaW5nLCBmdW5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLSAke25hbWV9IHN0YXJ0IC0tLS0tLS0tLWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnVuYygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEVycm9yIG9jY3VycmVkIGluICR7bmFtZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogU3RyaW5nKGVycm9yKX19YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0tICR7bmFtZX0gZW5kIC0tLS0tLS0tLS1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmxldCByZWFsUm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGNvbnN0IGZzVXRpbCA9IHtcbiAgLyoqIENvbmZpbmVzIGdlbmVyYXRlRmlsZSB3cml0ZXMgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdGVkIGF0IHJvb3REaXJQYXRoICh1bmRlZmluZWQgZGlzYWJsZXMgaXQpLiAqL1xuICBzZXRSb290RGlyUGF0aChyb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgcmVhbFJvb3REaXJQYXRoID0gcm9vdERpclBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBvbmx5IHdoZW4gdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QuIE90aGVyIGZhaWx1cmVzIChlLmcuIHBlcm1pc3Npb25zKSBhcmVcbiAgICogcmV0aHJvd24gc28gY2FsbGVycyByZWdlbmVyYXRpbmcgY29uZmlnIGZpbGVzIG5ldmVyIG92ZXJ3cml0ZSBjb250ZW50IHRoZXkgY291bGQgbm90IHJlYWQuXG4gICAqL1xuICBhc3luYyByZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfSxcbiAgLyoqIFRlbGxzIHdoZXRoZXIgYSB3cml0ZSB0byBmaWxlUGF0aCB3b3VsZCBwYXNzIHRoZSBzeW1saW5rL3JlcG9zaXRvcnktY29udGFpbm1lbnQgZ3VhcmRzLiAqL1xuICBhc3luYyBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gYXdhaXQgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZWFkcyBhIHNvdXJjZSBmaWxlLCByZXR1cm5pbmcgdW5kZWZpbmVkIHdoZW4gdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgT1Igd2hlbiBpdFxuICAgKiByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IOKAlCBhIGNvbW1pdHRlZCBzeW1saW5rIHBvaW50aW5nIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkgbXVzdFxuICAgKiBub3QgZ2V0IGl0cyB0YXJnZXQncyBjb250ZW50IGNvcGllZCBpbnRvIGEgdHJhY2tlZCBmaWxlLiBBIHN5bWxpbmsgd2hvc2UgcmVzb2x2ZWQgdGFyZ2V0XG4gICAqIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeSBpcyBsZWdpdGltYXRlIChlLmcuIGAubm9kZS12ZXJzaW9uIC0+IC5udm1yY2ApIGFuZCBpcyByZWFkLlxuICAgKi9cbiAgYXN5bmMgcmVhZEZpbGVDb25maW5lZElmRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBpZiAoIXN0YXRzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICBsZXQgcmVhbEZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICByZWFsRmlsZVBhdGggPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFscGF0aChmaWxlUGF0aCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlYWRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCBpcyBhIGRhbmdsaW5nIHN5bWJvbGljIGxpbmsuYCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHJlYWxSb290RGlyUGF0aCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHJlYWxGaWxlUGF0aCAhPT0gcmVhbFJvb3REaXJQYXRoICYmXG4gICAgICAgICFyZWFsRmlsZVBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcClcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgcmVhZGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgcmVhZGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICB9LFxuICAvKipcbiAgICogUmVtb3ZlcyBmaWxlUGF0aCAoZm9yY2UsIG9wdGlvbmFsbHkgcmVjdXJzaXZlKSBvbmx5IHdoZW4gaXRzIFBBUkVOVCBkaXJlY3RvcnkgcmVzb2x2ZXMgaW5zaWRlXG4gICAqIHRoZSByZXBvc2l0b3J5LCBzbyBhIHN5bWxpbmtlZCBkaXJlY3RvcnkgKGUuZy4gYSBjb21taXR0ZWQgLmdpdGh1Yi93b3JrZmxvd3MgbGluaykgY2FuIG5ldmVyXG4gICAqIG1ha2UgY2xlYW51cCBkZWxldGUgZmlsZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS4gUmVtb3ZpbmcgYSBzeW1saW5rIGVudHJ5IGl0c2VsZiBpcyBhbGxvd2VkOlxuICAgKiB0aGF0IGRlbGV0ZXMgb25seSB0aGUgbGluaywgbmV2ZXIgaXRzIHRhcmdldC4gUmV0dXJucyB3aGV0aGVyIHRoZSByZW1vdmFsIHdhcyBwZXJmb3JtZWQuXG4gICAqL1xuICBhc3luYyByZW1vdmVDb25maW5lZChmaWxlUGF0aDogc3RyaW5nLCBvcHRpb25zPzogeyByZWN1cnNpdmU/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIShhd2FpdCBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgcmVtb3ZpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiBvcHRpb25zPy5yZWN1cnNpdmUgPz8gZmFsc2UgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8qKiBXcml0ZXMgY29udGVudCB2ZXJiYXRpbSwgYXBwbHlpbmcgdGhlIHNhbWUgc3ltbGluay9yZXBvc2l0b3J5LWNvbnRhaW5tZW50IGd1YXJkcyBhcyBnZW5lcmF0ZUZpbGUuICovXG4gIGFzeW5jIHdyaXRlRmlsZUNvbmZpbmVkKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghKGF3YWl0IGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpKSkgcmV0dXJuIGZhbHNlO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgY29udGVudCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGZpbGUgd2FzIGFjdHVhbGx5IGdlbmVyYXRlZCAoZmFsc2Ugd2hlbiB0aGUgY29uZmluZW1lbnQgZ3VhcmRzIHNraXAgaXQpLiAqL1xuICBhc3luYyBnZW5lcmF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBsaW5lRW5kaW5nOiAnXFxuJyB8ICdcXHJcXG4nID0gJ1xcbicpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIShhd2FpdCBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKSkpIHJldHVybiBmYWxzZTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAvLyBgdHJpbWAgdHJlYXRzIGEgQk9NIGFzIHdoaXRlc3BhY2UsIHNvIGl0IGlzIHJlYXR0YWNoZWQgYXQgcG9zaXRpb24gMDogZHJvcHBpbmcgaXQgd291bGRcbiAgICAvLyByZXdyaXRlIHRoZSBlbmNvZGluZyBtYXJrZXIgb2YgYSBmaWxlIHRoZSBnZW5lcmF0b3Igd2FzIG9ubHkgYXNrZWQgdG8gdXBkYXRlLlxuICAgIGNvbnN0IGJ5dGVPcmRlck1hcmsgPSBjb250ZW50LnN0YXJ0c1dpdGgoJ++7vycpID8gJ++7vycgOiAnJztcbiAgICBsZXQgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnRyaW0oKTtcbiAgICBpZiAobm9ybWFsaXplZENvbnRlbnQpIHtcbiAgICAgIG5vcm1hbGl6ZWRDb250ZW50ID0gYCR7Ynl0ZU9yZGVyTWFya30ke25vcm1hbGl6ZWRDb250ZW50fSR7bGluZUVuZGluZ31gO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGVkL1VwZGF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBOZXZlciB3cml0ZSB0aHJvdWdoIGEgc3ltbGluazogYSAocG9zc2libHkgZGFuZ2xpbmcpIGxpbmsgY29tbWl0dGVkIGluIHRoZSB0YXJnZXQgcmVwb3NpdG9yeVxuICAvLyBjb3VsZCByZWRpcmVjdCB0aGUgd3JpdGUgb3V0c2lkZSBpdC5cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChmaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuICBpZiAoc3RhdHM/LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgd3JpdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IGlzIGEgc3ltYm9saWMgbGluay5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCEoYXdhaXQgaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGgpKSkge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB3cml0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIEEgc3ltbGlua2VkIHBhcmVudCBkaXJlY3Rvcnkgd291bGQgcmVkaXJlY3QgcmVhZHMsIHdyaXRlcywgYW5kIHJlbW92YWxzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnksXG4vLyBzbyByZXF1aXJlIHRoZSBjbG9zZXN0IGV4aXN0aW5nIGFuY2VzdG9yIHRvIHJlc29sdmUgaW5zaWRlIHRoZSByb290IHNldCBieSB0aGUgQ0xJIGVudHJ5IHBvaW50LlxuYXN5bmMgZnVuY3Rpb24gaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAocmVhbFJvb3REaXJQYXRoID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICBsZXQgYW5jZXN0b3JQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKGFuY2VzdG9yUGF0aCkpIHtcbiAgICBhbmNlc3RvclBhdGggPSBwYXRoLmRpcm5hbWUoYW5jZXN0b3JQYXRoKTtcbiAgfVxuICBjb25zdCByZWFsQW5jZXN0b3JQYXRoID0gYXdhaXQgZnMucHJvbWlzZXMucmVhbHBhdGgoYW5jZXN0b3JQYXRoKTtcbiAgcmV0dXJuIHJlYWxBbmNlc3RvclBhdGggPT09IHJlYWxSb290RGlyUGF0aCB8fCByZWFsQW5jZXN0b3JQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApO1xufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgQVBJIH0gZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3luYyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZUZpbGUgfSBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbi8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIChHbykgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGFuZCBub1xuLy8gbG9uZ2VyIGV4cG9zZXMgYW4gaW4tcHJvY2VzcyBwYXJzZXIgc3VjaCBhcyBgdHMuY3JlYXRlU291cmNlRmlsZWAuIFBhcnNpbmcgbm93XG4vLyBoYXBwZW5zIGluIGEgc3Bhd25lZCBjb21waWxlciBzZXJ2ZXIgcmVhY2hlZCB0aHJvdWdoIHRoZSBhc3luY2hyb25vdXMgQVBJLCBzbyB3ZVxuLy8ga2VlcCBhIHNpbmdsZSBsYXppbHktY3JlYXRlZCBpbnN0YW5jZSBhbmQgcmV1c2UgaXQgYWNyb3NzIGV2ZXJ5IGZpeGVyIHRvIGF2b2lkXG4vLyBwYXlpbmcgdGhlIHByb2Nlc3Mtc3Bhd24gY29zdCBwZXIgZmlsZS5cbmxldCBhcGk6IEFQSSB8IHVuZGVmaW5lZDtcbmxldCBjb25uZWN0ZWQ6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUGFyc2VzIGEgc291cmNlIGZpbGUgaW50byBhIFR5cGVTY3JpcHQgQVNUIHVzaW5nIHRoZSBidW5kbGVkIG5hdGl2ZSBjb21waWxlci5cbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgY29tcGlsZXIgY2Fubm90IGxvYWQgdGhlIGZpbGUgKGUuZy4gaXQgaXMgbWlzc2luZ1xuICogb3IgdW5wYXJzYWJsZSkgc28gY2FsbGVycyBjYW4gZmFsbCBiYWNrIHRvIGNvbnNlcnZhdGl2ZSBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxTb3VyY2VGaWxlIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgYXBpID0gYXdhaXQgZ2V0QXBpKCk7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBhcGkudXBkYXRlU25hcHNob3QoeyBvcGVuRmlsZXM6IFtmaWxlUGF0aF0gfSk7XG4gICAgY29uc3QgcHJvamVjdCA9IGF3YWl0IHNuYXBzaG90LmdldERlZmF1bHRQcm9qZWN0Rm9yRmlsZShmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHByb2plY3Q/LnByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlUGF0aCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaHV0cyBkb3duIHRoZSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlci4gVGhlIHNlcnZlciBrZWVwcyBhbiBvcGVuIElQQyBjaGFubmVsXG4gKiB0aGF0IHdvdWxkIG90aGVyd2lzZSBrZWVwIHRoZSBydW50aW1lIGV2ZW50IGxvb3AgYWxpdmUsIHNvIHdiZnkgbXVzdCBjYWxsIHRoaXNcbiAqIG9uY2UgaXRzIHJ1biBmaW5pc2hlcyBmb3IgdGhlIHByb2Nlc3MgdG8gZXhpdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc3Bvc2VUeXBlU2NyaXB0QXBpKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBhcGk/LmNsb3NlKCk7XG4gIGFwaSA9IHVuZGVmaW5lZDtcbiAgY29ubmVjdGVkID0gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcGkoKTogUHJvbWlzZTxBUEk+IHtcbiAgYXBpID8/PSBuZXcgQVBJKHsgY3dkOiBwcm9jZXNzLmN3ZCgpIH0pO1xuICAvLyBUaGUgY2xpZW50IG1hcmtzIGl0c2VsZiBjb25uZWN0ZWQgb25seSBvbmNlIGl0cyBmaXJzdCBzcGF3biBjb21wbGV0ZXMsIHNvIGNvbmN1cnJlbnRcbiAgLy8gZmlyc3QgcmVxdWVzdHMgKHRoZSBmaXhlcnMgcnVuIGluIHBhcmFsbGVsKSB3b3VsZCBlYWNoIHNwYXduIGEgY29tcGlsZXIgc2VydmVyOyB0aGVcbiAgLy8gZXh0cmEgc2VydmVycyBhcmUgbmV2ZXIgY2xvc2VkIGFuZCBrZWVwIHRoZSBwcm9jZXNzIGFsaXZlIGFmdGVyIGBkaXNwb3NlVHlwZVNjcmlwdEFwaWAuXG4gIC8vIFRoZSBmaXJzdCByZXF1ZXN0IGlzIHRoZXJlZm9yZSBhd2FpdGVkIG9uY2UgYmVmb3JlIGFueSBvdGhlciBpcyBzZW50OyBhIGZhaWxlZCBvbmUgaXNcbiAgLy8gZm9yZ290dGVuIHNvIHRoYXQgdGhlIG5leHQgcmVxdWVzdCBjb25uZWN0cyBhZ2FpbiBpbnN0ZWFkIG9mIGZhaWxpbmcgZm9yIHRoZSB3aG9sZSBydW4uXG4gIGNvbm5lY3RlZCA/Pz0gYXBpLnVwZGF0ZVNuYXBzaG90KCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgY29ubmVjdGVkID0gdW5kZWZpbmVkO1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbiAgYXdhaXQgY29ubmVjdGVkO1xuICByZXR1cm4gYXBpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5cbi8vIFNldHRpbmdzIGV2ZXJ5IFdpbGxCb29zdGVyIE5leHQuanMgcHJvamVjdCBzaG91bGQgY2FycnkuIGBuYW1lYCBpcyB0aGUgdG9wLWxldmVsXG4vLyBwcm9wZXJ0eSBrZXkgdXNlZCB0byBkZXRlY3Qgd2hldGhlciB0aGUgc2V0dGluZyBhbHJlYWR5IGV4aXN0czsgYHRleHRgIGlzIGluc2VydGVkXG4vLyB2ZXJiYXRpbSAoYSB3aG9sZSBga2V5OiB2YWx1ZWAgcGFpcikgd2hlbiB0aGUga2V5IGlzIG1pc3NpbmcuXG5jb25zdCBtYW5hZ2VkUHJvcGVydGllczogcmVhZG9ubHkgeyBuYW1lOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9W10gPSBbXG4gIHsgbmFtZTogJ3JlYWN0Q29tcGlsZXInLCB0ZXh0OiAncmVhY3RDb21waWxlcjogdHJ1ZScgfSxcbiAgeyBuYW1lOiAncmVhY3RTdHJpY3RNb2RlJywgdGV4dDogJ3JlYWN0U3RyaWN0TW9kZTogdHJ1ZScgfSxcbiAgeyBuYW1lOiAndHlwZXNjcmlwdCcsIHRleHQ6ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0nIH0sXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ3RzJywgJ210cycsICdjdHMnLCAnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhY3RlZCA9IGF3YWl0IGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoKTtcbiAgICBpZiAoIWV4dHJhY3RlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgc291cmNlLCBvYmplY3RMaXRlcmFsIH0gPSBleHRyYWN0ZWQ7XG5cbiAgICAvLyBgcHJvcGVydGllc2AgaW5jbHVkZXMgc3ByZWFkIGFzc2lnbm1lbnRzIChgLi4ucmVzdGApIHRoYXQgY2Fycnkgbm8gbmFtZSwgc28gZ3VhcmQgYmVmb3JlIHJlYWRpbmcgaXQuXG4gICAgY29uc3QgZXhpc3RpbmdQcm9wZXJ0aWVzID0gbmV3IFNldChcbiAgICAgIG9iamVjdExpdGVyYWwucHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PlxuICAgICAgICAnbmFtZScgaW4gcHJvcGVydHkgJiYgcHJvcGVydHkubmFtZSA/IGdldFByb3BlcnR5S2V5KHByb3BlcnR5Lm5hbWUsIHNvdXJjZSkgOiB1bmRlZmluZWRcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHByb3BlcnR5VGV4dHMgPSBtYW5hZ2VkUHJvcGVydGllc1xuICAgICAgLmZpbHRlcigocHJvcGVydHkpID0+ICFleGlzdGluZ1Byb3BlcnRpZXMuaGFzKHByb3BlcnR5Lm5hbWUpKVxuICAgICAgLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LnRleHQpO1xuICAgIGlmIChwcm9wZXJ0eVRleHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IHNvdXJjZS50ZXh0O1xuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gb2JqZWN0TGl0ZXJhbC5nZXRFbmQoKSAtIDE7XG4gICAgLy8gVGhlIG5hdGl2ZSBUUyBBU1QgZG9lcyBub3QgcmVsaWFibHkgZXhwb3NlIGBwcm9wZXJ0aWVzLmhhc1RyYWlsaW5nQ29tbWFgLCBzbyBzY2FuIHRoZSBzb3VyY2VcbiAgICAvLyBiZXR3ZWVuIHRoZSBsYXN0IHByb3BlcnR5IGFuZCB0aGUgY2xvc2luZyBicmFjZS4gU3RyaXAgY29tbWVudHMgZmlyc3Qgc28gYSBjb21tYSBpbnNpZGUgYVxuICAgIC8vIHRyYWlsaW5nIGNvbW1lbnQgKGUuZy4gYGZvbzogMSAvLyBhLCBiYCkgaXMgbm90IG1pc3Rha2VuIGZvciBhIHJlYWwgdHJhaWxpbmcgY29tbWEuXG4gICAgY29uc3QgbGFzdFByb3BlcnR5ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmF0KC0xKTtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NvbW1hID0gbGFzdFByb3BlcnR5XG4gICAgICA/IHN0cmlwQ29tbWVudHMob2xkQ29udGVudC5zbGljZShsYXN0UHJvcGVydHkuZ2V0RW5kKCksIGluc2VydGlvblBvaW50KSkuaW5jbHVkZXMoJywnKVxuICAgICAgOiBmYWxzZTtcbiAgICBjb25zdCBwcmVmaXggPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubGVuZ3RoID4gMCAmJiAhaGFzVHJhaWxpbmdDb21tYSA/ICcsICcgOiAnJztcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBpbnNlcnRpb25Qb2ludCl9JHtwcmVmaXh9JHtwcm9wZXJ0eVRleHRzLmpvaW4oJywgJyl9JHtvbGRDb250ZW50LnNsaWNlKFxuICAgICAgaW5zZXJ0aW9uUG9pbnRcbiAgICApfWA7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHsgc291cmNlOiBhc3QuU291cmNlRmlsZTsgb2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIH0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc291cmNlID0gYXdhaXQgcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkIGRlY2xhcmVzIHRoZSBjb25maWcgYXMgYGNvbnN0IG5leHRDb25maWc6IE5leHRDb25maWcgPSB7IC4uLiB9YCBhbmRcbiAgLy8gZXhwb3J0cyBpdCAocG9zc2libHkgd3JhcHBlZCwgZS5nLiBgd2l0aFNlbnRyeUNvbmZpZyguLi4pYCksIHNvIHRoZSBvYmplY3QgbGl0ZXJhbCBpcyByYXJlbHlcbiAgLy8gdGhlIGRpcmVjdCBvcGVyYW5kIG9mIGBleHBvcnQgZGVmYXVsdGAvYG1vZHVsZS5leHBvcnRzYC4gQ29sbGVjdCBldmVyeSBjYW5kaWRhdGUgYW5kIHBpY2sgdGhlXG4gIC8vIG1vc3QgYXV0aG9yaXRhdGl2ZSBvbmUgYmVsb3cuXG4gIGxldCBkaXJlY3RPYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGxldCBleHBvcnRlZElkZW50aWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmFyaWFibGVPYmplY3RMaXRlcmFscyA9IG5ldyBNYXA8c3RyaW5nLCBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24+KCk7XG4gIGNvbnN0IHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHM6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbltdID0gW107XG5cbiAgY29uc3QgdmlzaXQgPSAobm9kZTogYXN0Lk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoYXN0LmlzRXhwb3J0QXNzaWdubWVudChub2RlKSkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5leHByZXNzaW9uKTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz89IG9iamVjdExpdGVyYWw7XG4gICAgICB9IGVsc2UgaWYgKGFzdC5pc0lkZW50aWZpZXIobm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgICBleHBvcnRlZElkZW50aWZpZXIgPz89IG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGFzdC5pc0JpbmFyeUV4cHJlc3Npb24obm9kZSkgJiZcbiAgICAgIG5vZGUub3BlcmF0b3JUb2tlbi5raW5kID09PSBhc3QuU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgbm9kZS5sZWZ0LmdldFRleHQoc291cmNlKSA9PT0gJ21vZHVsZS5leHBvcnRzJ1xuICAgICkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5yaWdodCk7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/PSBvYmplY3RMaXRlcmFsO1xuICAgICAgfSBlbHNlIGlmIChhc3QuaXNJZGVudGlmaWVyKG5vZGUucmlnaHQpKSB7XG4gICAgICAgIGV4cG9ydGVkSWRlbnRpZmllciA/Pz0gbm9kZS5yaWdodC5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhc3QuaXNWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpICYmIG5vZGUuaW5pdGlhbGl6ZXIpIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUuaW5pdGlhbGl6ZXIpO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwgJiYgYXN0LmlzSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgICAgIHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuc2V0KG5vZGUubmFtZS5nZXRUZXh0KHNvdXJjZSksIG9iamVjdExpdGVyYWwpO1xuICAgICAgICAvLyBUaGUgYDogTmV4dENvbmZpZ2AgYW5ub3RhdGlvbiB3YmZ5IHdyaXRlcyBtYXJrcyB0aGUgY2Fub25pY2FsIGNvbmZpZyBvYmplY3QgKGFjY2VwdGluZ1xuICAgICAgICAvLyBxdWFsaWZpZWQgbmFtZXMgc3VjaCBhcyBgaW1wb3J0KCduZXh0JykuTmV4dENvbmZpZ2ApLlxuICAgICAgICBjb25zdCBhbm5vdGF0aW9uVHlwZSA9IG5vZGUudHlwZT8uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgICBpZiAoYW5ub3RhdGlvblR5cGUgIT09IHVuZGVmaW5lZCAmJiBpc05leHRDb25maWdUeXBlKGFubm90YXRpb25UeXBlKSkge1xuICAgICAgICAgIHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHMucHVzaChvYmplY3RMaXRlcmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH07XG4gIHNvdXJjZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuXG4gIGNvbnN0IG9iamVjdExpdGVyYWwgPVxuICAgIHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHNbMF0gPz9cbiAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/XG4gICAgKGV4cG9ydGVkSWRlbnRpZmllciA/IHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuZ2V0KGV4cG9ydGVkSWRlbnRpZmllcikgOiB1bmRlZmluZWQpID8/XG4gICAgdmFyaWFibGVPYmplY3RMaXRlcmFscy5nZXQoJ25leHRDb25maWcnKTtcbiAgcmV0dXJuIG9iamVjdExpdGVyYWwgPyB7IHNvdXJjZSwgb2JqZWN0TGl0ZXJhbCB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY3VycmVudCA9IHVud3JhcFBhcmVudGhlc2VzKG5vZGUpO1xuICByZXR1cm4gYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oY3VycmVudCkgPyBjdXJyZW50IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJlbnRoZXNlcyhub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5FeHByZXNzaW9uIHtcbiAgbGV0IGN1cnJlbnQgPSBub2RlO1xuICB3aGlsZSAoYXN0LmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oY3VycmVudCkpIHtcbiAgICBjdXJyZW50ID0gY3VycmVudC5leHByZXNzaW9uO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vLyBNYXRjaCBib3RoIHRoZSBiYXJlIGBOZXh0Q29uZmlnYCBhbmQgcXVhbGlmaWVkIGZvcm1zIGxpa2UgYGltcG9ydCgnbmV4dCcpLk5leHRDb25maWdgLlxuZnVuY3Rpb24gaXNOZXh0Q29uZmlnVHlwZSh0eXBlVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlVGV4dCA9PT0gJ05leHRDb25maWcnIHx8IHR5cGVUZXh0LmVuZHNXaXRoKCcuTmV4dENvbmZpZycpO1xufVxuXG4vLyBSZXR1cm4gYSBwcm9wZXJ0eSBrZXkgd2l0aG91dCBzdXJyb3VuZGluZyBxdW90ZXMsIHNvIGAncmVhY3RDb21waWxlcidgIG1hdGNoZXMgYHJlYWN0Q29tcGlsZXJgLlxuLy8gSWRlbnRpZmllciwgc3RyaW5nLWxpdGVyYWwgYW5kIG51bWVyaWMtbGl0ZXJhbCBuYW1lcyBhbGwgZXhwb3NlIHRoZSB1bnF1b3RlZCB2YWx1ZSB2aWEgYC50ZXh0YC5cbmZ1bmN0aW9uIGdldFByb3BlcnR5S2V5KG5hbWU6IGFzdC5Qcm9wZXJ0eU5hbWUsIHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmcge1xuICByZXR1cm4gJ3RleHQnIGluIG5hbWUgJiYgdHlwZW9mIG5hbWUudGV4dCA9PT0gJ3N0cmluZycgPyBuYW1lLnRleHQgOiBuYW1lLmdldFRleHQoc291cmNlKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBDb21tZW50cyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9cXC9cXC9bXlxcbl0qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgJycpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeENoYWtyYVRvYXN0ZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4Q2hha3JhVG9hc3RlcicsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuY2hha3JhKSByZXR1cm47XG5cbiAgICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZy5nbG9iKCcqKi90b2FzdGVyLnt0cyx0c3h9Jywge1xuICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgaWdub3JlOiBbJyoqLy4qLyoqJywgJyoqL25vZGVfbW9kdWxlcy8qKiddLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbnRlbnQuaW5jbHVkZXMoJ0NyZWF0ZVRvYXN0ZXJSZXR1cm4nKSB8fFxuICAgICAgICAhY29udGVudC5pbmNsdWRlcyhcImZyb20gJ0BjaGFrcmEtdWkvcmVhY3QnXCIpIHx8XG4gICAgICAgICFjb250ZW50LmluY2x1ZGVzKCdleHBvcnQgY29uc3QgdG9hc3RlciA9IGNyZWF0ZVRvYXN0ZXIoJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gY29udGVudFxuICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAvXmltcG9ydCAuKiBmcm9tICdAY2hha3JhLXVpXFwvcmVhY3QnOyQvbXUsXG4gICAgICAgICAgXCIkJlxcbmltcG9ydCB0eXBlIHsgQ3JlYXRlVG9hc3RlclJldHVybiB9IGZyb20gJ0BjaGFrcmEtdWkvcmVhY3QnO1wiXG4gICAgICAgIClcbiAgICAgICAgLnJlcGxhY2UoJ2V4cG9ydCBjb25zdCB0b2FzdGVyID0gY3JlYXRlVG9hc3RlcignLCAnZXhwb3J0IGNvbnN0IHRvYXN0ZXI6IENyZWF0ZVRvYXN0ZXJSZXR1cm4gPSBjcmVhdGVUb2FzdGVyKCcpO1xuICAgICAgaWYgKHVwZGF0ZWRDb250ZW50ICE9PSBjb250ZW50KSBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCB1cGRhdGVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG50eXBlIFBhcnNlZFZhbHVlID1cbiAgfCB7IGtpbmQ6ICdhcnJheSc7IHZhbHVlOiBQYXJzZWRWYWx1ZVtdIH1cbiAgfCB7IGtpbmQ6ICdsaXRlcmFsJzsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnb2JqZWN0JzsgdmFsdWU6IFBhcnNlZE9iamVjdCB9O1xudHlwZSBPYmplY3RNZW1iZXIgPSB7IGtpbmQ6ICdleHRyYSc7IGluZGV4OiBudW1iZXIgfSB8IHsga2luZDogJ3Byb3BlcnR5Jzsga2V5OiBzdHJpbmcgfTtcbmludGVyZmFjZSBQYXJzZWRPYmplY3Qge1xuICBleHRyYU1lbWJlcnM6IHN0cmluZ1tdO1xuICBtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW107XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcbn1cbmludGVyZmFjZSBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHtcbiAgc291cmNlOiBhc3QuU291cmNlRmlsZTtcbiAgbm9kZTogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uO1xufVxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkVmFsdWUgPT4gKHtcbiAga2luZDogJ29iamVjdCcsXG4gIHZhbHVlOiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzLCBleHRyYU1lbWJlcnMpLFxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0czogYm9vbGVhbik6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IHVzZSA9IHRvUGFyc2VkT2JqZWN0KHtcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb24nXCIpLFxuICAgIHZpZGVvOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgfSk7XG5cbiAgaWYgKHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzKSB7XG4gICAgdXNlLnByb3BlcnRpZXMuYmFzZVVSTCA9IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyk7XG4gICAgdXNlLm1lbWJlck9yZGVyLnVuc2hpZnQoeyBraW5kOiAncHJvcGVydHknLCBrZXk6ICdiYXNlVVJMJyB9KTtcbiAgfVxuXG4gIHJldHVybiB0b1BhcnNlZE9iamVjdCh7XG4gICAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICAgIHVzZTogeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHVzZSB9LFxuICAgIC4uLihzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0c1xuICAgICAgPyB7XG4gICAgICAgICAgd2ViU2VydmVyOiBhc09iamVjdCh7XG4gICAgICAgICAgICBjb21tYW5kOiBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpKSxcbiAgICAgICAgICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICAgICAgICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IGxpdGVyYWwoJzMwMF8wMDAnKSxcbiAgICAgICAgICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIHN0ZGVycjogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgICAgICAgICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICBleHRyYU1lbWJlcnMsXG4gICAgbWVtYmVyT3JkZXI6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHByb3BlcnRpZXMpLm1hcCgoa2V5KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KSksXG4gICAgICAuLi5leHRyYU1lbWJlcnMubWFwKChfLCBpbmRleCk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KSksXG4gICAgXSxcbiAgICBwcm9wZXJ0aWVzLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGV4dHJhY3RlZE9iamVjdExpdGVyYWwgPSBhd2FpdCBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aCk7XG4gICAgaWYgKCFleHRyYWN0ZWRPYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZSwgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICAvLyB3YiBkZXJpdmVzIE5FWFRfUFVCTElDX0JBU0VfVVJMIGZyb20gdGhlIHJlc29sdmVkIHBvcnQgZm9yIE5leHQuanMvdmluZXh0IGFwcHMgKHZpbmV4dFxuICAgIC8vIGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gYGRlcGVuZGluZy5uZXh0YCBjb3ZlcnMgYm90aCksIHNvIHRob3NlIG5lZWQgbm8gZGVjbGFyZWRcbiAgICAvLyB2YXJpYWJsZTsgb3RoZXIgcGFja2FnZXMgc3RpbGwgcmVxdWlyZSBhIGRlY2xhcmF0aW9uLlxuICAgIGNvbnN0IHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzID1cbiAgICAgIHNob3VsZE1hbmFnZUFwcFNlcnZlckRlZmF1bHRzKGNvbmZpZywgcGFyc2VkKSAmJlxuICAgICAgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCAoYXdhaXQgZG9lc0RlZmluZU5leHRQdWJsaWNCYXNlVXJsKGNvbmZpZy5kaXJQYXRoKSkpO1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSBjcmVhdGVEZWZhdWx0Q29uZmlnKGNvbmZpZywgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMpO1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlUGFyc2VkT2JqZWN0cyhkZWZhdWx0Q29uZmlnLCBwYXJzZWQpO1xuICAgIGFwcGx5TWFuYWdlZFVzZURlZmF1bHRzKG1lcmdlZCwgZGVmYXVsdENvbmZpZyk7XG4gICAgc2V0V2ViU2VydmVyQ29tbWFuZChtZXJnZWQpO1xuXG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeVZhbHVlKHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZWQgfSwgMCk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlLnRleHQ7XG4gICAgY29uc3Qgc3RhcnQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0U3RhcnQoZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGNvbnN0IGVuZCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRFbmQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBzdGFydCl9JHtuZXdPYmplY3RMaXRlcmFsfSR7b2xkQ29udGVudC5zbGljZShlbmQpfWA7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2U6IFBhcnNlZE9iamVjdCwgb3ZlcnJpZGU6IFBhcnNlZE9iamVjdCk6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IG92ZXJyaWRlUHJvcGVydHlLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhvdmVycmlkZS5wcm9wZXJ0aWVzKSk7XG4gIGNvbnN0IGV4dHJhTWVtYmVycyA9IFsuLi5iYXNlLmV4dHJhTWVtYmVycywgLi4ub3ZlcnJpZGUuZXh0cmFNZW1iZXJzXTtcbiAgLy8gS2VlcCBkZWZhdWx0LW9ubHkgbWVtYmVycyBiZWZvcmUgcGFyc2VkIG1lbWJlcnMgc28gc3ByZWFkcyBhbmQgZXhwbGljaXQgbG9jYWwgcHJvcGVydGllcyByZXRhaW4gcHJlY2VkZW5jZS5cbiAgY29uc3QgbWVtYmVyT3JkZXIgPSBbXG4gICAgLi4uYmFzZS5tZW1iZXJPcmRlci5maWx0ZXIoKG1lbWJlcikgPT4gbWVtYmVyLmtpbmQgIT09ICdwcm9wZXJ0eScgfHwgIW92ZXJyaWRlUHJvcGVydHlLZXlzLmhhcyhtZW1iZXIua2V5KSksXG4gICAgLi4ub3ZlcnJpZGUubWVtYmVyT3JkZXIubWFwKChtZW1iZXIpOiBPYmplY3RNZW1iZXIgPT4ge1xuICAgICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSByZXR1cm4gbWVtYmVyO1xuICAgICAgcmV0dXJuIHsga2luZDogJ2V4dHJhJywgaW5kZXg6IGJhc2UuZXh0cmFNZW1iZXJzLmxlbmd0aCArIG1lbWJlci5pbmRleCB9O1xuICAgIH0pLFxuICBdO1xuICBjb25zdCBwcm9wZXJ0aWVzID0geyAuLi5iYXNlLnByb3BlcnRpZXMgfTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3ZlcnJpZGUucHJvcGVydGllcykpIHtcbiAgICBwcm9wZXJ0aWVzW2tleV0gPSBtZXJnZVBhcnNlZFZhbHVlKHByb3BlcnRpZXNba2V5XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiB7IGV4dHJhTWVtYmVycywgbWVtYmVyT3JkZXIsIHByb3BlcnRpZXMgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRWYWx1ZShiYXNlOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCwgb3ZlcnJpZGU6IFBhcnNlZFZhbHVlKTogUGFyc2VkVmFsdWUge1xuICBpZiAoYmFzZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgb3ZlcnJpZGUua2luZCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlLnZhbHVlLCBvdmVycmlkZS52YWx1ZSkgfTtcbiAgfVxuICByZXR1cm4gb3ZlcnJpZGU7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TWFuYWdlZFVzZURlZmF1bHRzKGNvbmZpZzogUGFyc2VkT2JqZWN0LCBkZWZhdWx0Q29uZmlnOiBQYXJzZWRPYmplY3QpOiB2b2lkIHtcbiAgY29uc3QgdXNlID0gY29uZmlnLnByb3BlcnRpZXMudXNlO1xuICBjb25zdCBkZWZhdWx0VXNlID0gZGVmYXVsdENvbmZpZy5wcm9wZXJ0aWVzLnVzZTtcbiAgaWYgKHVzZT8ua2luZCAhPT0gJ29iamVjdCcgfHwgZGVmYXVsdFVzZT8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ3RyYWNlJywgJ3NjcmVlbnNob3QnLCAndmlkZW8nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRVc2UudmFsdWUucHJvcGVydGllc1trZXldO1xuICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHVzZS52YWx1ZS5wcm9wZXJ0aWVzW2tleV0gPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZE1hbmFnZUFwcFNlcnZlckRlZmF1bHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcGFyc2VkOiBQYXJzZWRPYmplY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuZGVwZW5kaW5nLm5leHQgfHxcbiAgICBwYXJzZWQucHJvcGVydGllcy53ZWJTZXJ2ZXIgIT09IHVuZGVmaW5lZCB8fFxuICAgIGRvZXNPYmplY3RIYXZlQmFzZVVybChwYXJzZWQucHJvcGVydGllcy51c2UpIHx8XG4gICAgZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHBhcnNlZCB9LCAnTkVYVF9QVUJMSUNfQkFTRV9VUkwnKVxuICApO1xufVxuXG5mdW5jdGlvbiBkb2VzT2JqZWN0SGF2ZUJhc2VVcmwodmFsdWU6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgdmFsdWUudmFsdWUucHJvcGVydGllcy5iYXNlVVJMICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGl0ZXJhbFRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWUuaW5jbHVkZXMobGl0ZXJhbFRleHQpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5JykgcmV0dXJuIHZhbHVlLnZhbHVlLnNvbWUoKGNoaWxkKSA9PiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbChjaGlsZCwgbGl0ZXJhbFRleHQpKTtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnMuc29tZSgobWVtYmVyKSA9PiBtZW1iZXIuaW5jbHVkZXMobGl0ZXJhbFRleHQpKSB8fFxuICAgIE9iamVjdC52YWx1ZXModmFsdWUudmFsdWUucHJvcGVydGllcykuc29tZSgoY2hpbGQpID0+IGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKGNoaWxkLCBsaXRlcmFsVGV4dCkpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvZXNEZWZpbmVOZXh0UHVibGljQmFzZVVybChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgZm9yIChjb25zdCBlbnZGaWxlUGF0aCBvZiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKC9ORVhUX1BVQkxJQ19CQVNFX1VSTFxccyo9L20udGVzdChjb250ZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3NpbmcgZW52IGZpbGVzIGFyZSBleHBlY3RlZCBpbiBzb21lIHJlcG9zLlxuICAgIH1cbiAgfVxuXG4gIC8vIFNvbWUgUGxheXdyaWdodCBjb25maWdzIG9ubHkgZGVmaW5lIGJyb3dzZXIgcHJvamVjdHMgb3IgZml4dHVyZXMgYW5kIGRvIG5vdFxuICAvLyBzdGFydCBhIHdlYiBhcHAuIEF2b2lkIGZvcmNpbmcgYW4gYXBwLXNlcnZlciBVUkwgaW50byB0aG9zZSBwYWNrYWdlcy5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBlbnZGaWxlTmFtZXMgPSBbJ2Zub3gudG9tbCcsICdtaXNlLnRvbWwnLCAnbWlzZS50ZXN0LnRvbWwnXTtcbiAgY29uc3QgZW52RmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAobGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpOyA7IGN1cnJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKSkge1xuICAgIGVudkZpbGVQYXRocy5wdXNoKC4uLmVudkZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsIGZpbGVOYW1lKSkpO1xuXG4gICAgLy8gUGxheXdyaWdodCBjb25maWdzIG9mdGVuIGxpdmUgaW4gcGFja2FnZXMvKiB3aGlsZSBzaGFyZWQgZW52IGZpbGVzIGxpdmUgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290LCBzbyB3YWxrIHVwd2FyZCB1bnRpbCB0aGUgdGFyZ2V0IHJlcG8gYm91bmRhcnkuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCAnLmdpdCcpKSkgYnJlYWs7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGVudkZpbGVQYXRocztcbn1cblxuZnVuY3Rpb24gc2V0V2ViU2VydmVyQ29tbWFuZChvYmplY3Q6IFBhcnNlZE9iamVjdCk6IHZvaWQge1xuICBjb25zdCB3ZWJTZXJ2ZXIgPSBvYmplY3QucHJvcGVydGllcy53ZWJTZXJ2ZXI7XG4gIGlmICh3ZWJTZXJ2ZXI/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgY29tbWFuZCA9IHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQ7XG4gIC8vIExpYnJhcmllcyBjYW4gdXNlIFBsYXl3cmlnaHQncyB3ZWJTZXJ2ZXIgdG8gYnVpbGQgYW5kIGxhdW5jaCBhIGZpeHR1cmUgZXZlbiB0aG91Z2ggYHdiIHN0YXJ0YFxuICAvLyBpbnRlbnRpb25hbGx5IGhhcyBubyB0ZXN0IHNlcnZlciBmb3IgdGhlIGxpYnJhcnkgaXRzZWxmLiBQcmVzZXJ2ZSB0aG9zZSBjdXN0b20gbGlmZWN5Y2xlXG4gIC8vIGNvbW1hbmRzOyBvbmx5IGFkZCB0aGUgY29tbWFuZCB3aGVuIHdiZnkgYWxyZWFkeSBvd25zIGl0LlxuICBpZiAoY29tbWFuZCAmJiAhaXNHZW5lcmF0ZWRXYlN0YXJ0VGVzdENvbW1hbmQoY29tbWFuZCkpIHJldHVybjtcblxuICAvLyBQbGF5d3JpZ2h0IHJlcXVpcmVzIGBjb21tYW5kYCB3aGVuZXZlciBgd2ViU2VydmVyYCBleGlzdHM7IGFuIGV4dGVybmFsbHkgbWFuYWdlZCBzZXJ2ZXIgc2hvdWxkXG4gIC8vIG9taXQgYHdlYlNlcnZlcmAgaW5zdGVhZC4gS2VlcCBmaWxsaW5nIHRoaXMgcmVxdWlyZWQgZmllbGQgd2hlbiBhIHBhcnRpYWwgbWFuYWdlZCBibG9jayBsYWNrcyBpdC5cbiAgd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZCA9IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKCkpO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFdiU3RhcnRUZXN0Q29tbWFuZChjb21tYW5kOiBQYXJzZWRWYWx1ZSk6IGJvb2xlYW4ge1xuICBpZiAoY29tbWFuZC5raW5kICE9PSAnbGl0ZXJhbCcpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGNvbW1hbmQudmFsdWUudHJpbSgpID09PSBnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0V2JTdGFydFRlc3RDb21tYW5kKCk6IHN0cmluZyB7XG4gIHJldHVybiBgJ2J1biB3YiBzdGFydCAtLW1vZGUgdGVzdCdgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHBhcnNlU291cmNlRmlsZShmaWxlUGF0aCk7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFR5cGVTY3JpcHQgYWxyZWFkeSB1bmRlcnN0YW5kcyBuZXN0ZWQgb2JqZWN0IGxpdGVyYWxzIGFuZCB0ZW1wbGF0ZSBzdHJpbmdzLCBzbyB1c2VcbiAgLy8gaXRzIEFTVCByYW5nZXMgaW5zdGVhZCBvZiBhIHJlZ2V4IHRoYXQgY2FuIHN0b3AgYXQgdGhlIGZpcnN0IGlubmVyIGNsb3NpbmcgYnJhY2UuXG4gIGxldCBmb3VuZDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiBhc3QuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgIGlmIChhc3QuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpID09PSAnZGVmaW5lQ29uZmlnJykge1xuICAgICAgY29uc3QgZmlyc3RBcmd1bWVudCA9IG5vZGUuYXJndW1lbnRzWzBdO1xuICAgICAgaWYgKGZpcnN0QXJndW1lbnQgJiYgYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZmlyc3RBcmd1bWVudCkpIHtcbiAgICAgICAgZm91bmQgPSBmaXJzdEFyZ3VtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfTtcbiAgc291cmNlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG5cbiAgcmV0dXJuIGZvdW5kID8geyBzb3VyY2UsIG5vZGU6IGZvdW5kIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiBhc3QuRXhwcmVzc2lvbiwgc291cmNlOiBhc3QuU291cmNlRmlsZSk6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBzb3VyY2UpO1xuICAgIHJldHVybiBwYXJzZWRPYmplY3QgPyB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkT2JqZWN0IH0gOiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgfVxuICBpZiAoYXN0LmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHBhcnNlRXhwcmVzc2lvbihlbGVtZW50LCBzb3VyY2UpKTtcbiAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCk6IGVsZW1lbnQgaXMgdW5kZWZpbmVkID0+IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzQXJyYXkoZWxlbWVudHMgYXMgUGFyc2VkVmFsdWVbXSk7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKFxuICBvYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogYXN0LlNvdXJjZUZpbGVcbik6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZDogUGFyc2VkT2JqZWN0ID0geyBleHRyYU1lbWJlcnM6IFtdLCBtZW1iZXJPcmRlcjogW10sIHByb3BlcnRpZXM6IHt9IH07XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKGFzdC5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IGxpdGVyYWwoa2V5KTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFhc3QuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpIHx8XG4gICAgICAoIWFzdC5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiYgIWFzdC5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkpXG4gICAgKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlZC5leHRyYU1lbWJlcnMucHVzaChwcm9wZXJ0eS5nZXRUZXh0KHNvdXJjZSkpIC0gMTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUV4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHNvdXJjZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICBpZiAodmFsdWUudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gJ1tdJztcbiAgICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICAgIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGBbXFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9XWA7XG4gIH1cbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlO1xuXG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGVtaXR0ZWRQcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyKTtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlci5mbGF0TWFwKChtZW1iZXIsIGluZGV4KSA9PiB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAnZXh0cmEnKSB7XG4gICAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdE1lbWJlcih2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnNbbWVtYmVyLmluZGV4XSA/PyAnJywgaW5kZW50KV07XG4gICAgfVxuXG4gICAgaWYgKGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuZ2V0KG1lbWJlci5rZXkpICE9PSBpbmRleCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzW21lbWJlci5rZXldO1xuICAgIGlmICghaXRlbSB8fCBlbWl0dGVkUHJvcGVydGllcy5oYXMobWVtYmVyLmtleSkpIHJldHVybiBbXTtcbiAgICBlbWl0dGVkUHJvcGVydGllcy5hZGQobWVtYmVyLmtleSk7XG4gICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShtZW1iZXIua2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KV07XG4gIH0pO1xuICBsaW5lcy5wdXNoKFxuICAgIC4uLk9iamVjdC5lbnRyaWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhrZXkpKVxuICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCkpXG4gICk7XG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBge1xcbiR7Y2xvc2luZ0luZGVudH19YDtcbiAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG59XG5cbmZ1bmN0aW9uIGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkobWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbWVtYmVyXSBvZiBtZW1iZXJPcmRlci5lbnRyaWVzKCkpIHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHtcbiAgICAgIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuc2V0KG1lbWJlci5rZXksIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleTogc3RyaW5nLCBpdGVtOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlciwgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgfVxuICB9XG4gIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7a2V5fTogJHtzdHJpbmdpZmllZFswXX1gO1xuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdE1lbWJlcihtZW1iZXI6IHN0cmluZywgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IG1lbWJlci5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbGluZV0gb2Ygc3RyaW5naWZpZWQuZW50cmllcygpKSB7XG4gICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7bGluZX1gO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG50eXBlIFdpbGxCb29zdGVyT3JnYW5pemF0aW9uID0gJ1dpbGxCb29zdGVyJyB8ICdXaWxsQm9vc3RlckxhYic7XG50eXBlIFJlcG9zaXRvcnlGdWxsTmFtZSA9IGAke1dpbGxCb29zdGVyT3JnYW5pemF0aW9ufS8ke3N0cmluZ31gO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZub3hSZXBvc2l0b3J5U2NvcGUge1xuICBvcmdhbml6YXRpb25zPzogcmVhZG9ubHkgV2lsbEJvb3N0ZXJPcmdhbml6YXRpb25bXTtcbiAgcmVwb3NpdG9yaWVzPzogcmVhZG9ubHkgUmVwb3NpdG9yeUZ1bGxOYW1lW107XG4gIC8vIFJlc3RyaWN0cyB0aGUgc2NvcGUgdG8gcmVwb3NpdG9yaWVzIG9mIHRoZSBnaXZlbiB2aXNpYmlsaXR5LiBQdWJsaWMgcmVwb3NpdG9yaWVzIHB1Ymxpc2ggdGhlaXJcbiAgLy8gY2lwaGVydGV4dHMgdG8gdGhlIHdvcmxkLCBzbyB0aGV5IG11c3QgdXNlIGEgQ0kgaWRlbnRpdHkgc2VwYXJhdGUgZnJvbSB0aGUgb3JnLWludGVybmFsIG9uZTpcbiAgLy8gbGVha2luZyBlaXRoZXIgQ0kga2V5IG11c3Qgbm90IGV4cG9zZSB0aGUgb3RoZXIgc2lkZSdzIHNlY3JldHMuXG4gIHZpc2liaWxpdHk/OiAncHVibGljJyB8ICdwcml2YXRlJztcbn1cblxuaW50ZXJmYWNlIEZub3hBZ2VQcmluY2lwYWwge1xuICBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpY0tleXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZXBvc2l0b3J5U2NvcGU6IEZub3hSZXBvc2l0b3J5U2NvcGU7XG4gIC8vIE1hcmtzIHRoZSBwcmluY2lwYWwgYXMgYSBDSSBpZGVudGl0eSBhbmQgbmFtZXMgdGhlIEdpdEh1YiBzZWNyZXQgaG9sZGluZyBpdHMgcHJpdmF0ZSBrZXkuXG4gIC8vIEV2ZXJ5IGZub3gtbWFuYWdlZCByZXBvc2l0b3J5IG11c3QgcmVzb2x2ZSBvbmUgKGdlbmVyYXRlRm5veFRvbWwgZmFpbHMgY2xvc2VkIG90aGVyd2lzZTogYVxuICAvLyByb3N0ZXIgd2l0aG91dCBhIENJIHJlY2lwaWVudCB3b3VsZCByZS1lbmNyeXB0IHNlY3JldHMgdGhhdCBDSSBjYW4gbmV2ZXIgZGVjcnlwdCBhZ2FpbiksIGFuZFxuICAvLyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yIGRlcml2ZXMgaXRzIGNhbGxlciBtYXBwaW5ncyBmcm9tIHRoZSBzYW1lIHJlc29sdXRpb24gc28gdGhlIHR3byBjYW5cbiAgLy8gbmV2ZXIgZGlzYWdyZWUgb24gd2hpY2ggQ0kgaWRlbnRpdHkgYXBwbGllcy5cbiAgY2lBZ2VLZXlTZWNyZXROYW1lPzogJ0ZOT1hfQUdFX0tFWScgfCAnUFVCTElDX0ZOT1hfQUdFX0tFWSc7XG59XG5cbmludGVyZmFjZSBGbm94QWdlUmVjaXBpZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwdWJsaWNLZXk6IHN0cmluZztcbn1cblxuLy8gVGhlIGFnZSBwcmluY2lwYWxzIGF1dGhvcml6ZWQgdG8gZGVjcnlwdCBlYWNoIGZub3gtbWFuYWdlZCByZXBvc2l0b3J5LiBUbyBncmFudCBhY2Nlc3MsIGFkZCB0aGVcbi8vIHByaW5jaXBhbCdzIHB1YmxpYyBrZXlzIGFuZCByZXBvc2l0b3J5IHNjb3BlIGhlcmUuIE9yZ2FuaXphdGlvbiBzY29wZXMgaW5jbHVkZSBldmVyeSBjdXJyZW50IGFuZFxuLy8gZnV0dXJlIHJlcG9zaXRvcnkgaW4gdGhhdCBvcmdhbml6YXRpb247IHVzZSByZXBvc2l0b3JpZXMgZm9yIGV4YWN0IG93bmVyL3JlcG9zaXRvcnkgZ3JhbnRzLiBUaGVcbi8vIG5leHQgd2JmeSBydW4gb24gZWFjaCBtYXRjaGluZyByZXBvc2l0b3J5IHJld3JpdGVzIGV2ZXJ5IG1hbmFnZWQgZm5veC50b21sIGFuZCByZS1lbmNyeXB0cyBpdHNcbi8vIGNvbW1pdHRlZCBzZWNyZXRzIGZvciB0aGUgcmVzdWx0aW5nIHJlY2lwaWVudCBzZXQuIEEgc2NvcGUncyBvcHRpb25hbCB2aXNpYmlsaXR5IGNvbnN0cmFpbnRcbi8vIHNlbGVjdHMgb25seSBwdWJsaWMgb3Igb25seSBwcml2YXRlIHJlcG9zaXRvcmllcyAodXNlZCB0byBrZWVwIHRoZSBvcmctaW50ZXJuYWwgYW5kIHRoZVxuLy8gcHVibGljLXJlcG9zaXRvcnkgQ0kgaWRlbnRpdGllcyBhcGFydCkuIFJlbW92aW5nIGEgc2NvcGUgY2Fubm90IHJldm9rZSBjaXBoZXJ0ZXh0XG4vLyBhbHJlYWR5IGF2YWlsYWJsZSBmcm9tIEdpdCBoaXN0b3J5LCBzbyByb3RhdGUgdGhlIHNlY3JldCB2YWx1ZXMgdGhhdCBwcmluY2lwYWwgY291bGQgZGVjcnlwdC5cbi8vIE9ubHkgcHVibGljIGtleXMgbWF5IGFwcGVhciBoZXJlOyBhIENJIGlkZW50aXR5J3MgcHJpdmF0ZSBrZXkgc3VwcGxpZXMgdGhlIEZOT1hfQUdFX0tFWSAob3IsXG4vLyBmb3IgcHVibGljIHJlcG9zaXRvcmllcywgUFVCTElDX0ZOT1hfQUdFX0tFWSkgb3JnYW5pemF0aW9uIHNlY3JldC5cbmV4cG9ydCBjb25zdCBGTk9YX0FHRV9QUklOQ0lQQUxTID0gW1xuICB7XG4gICAgbmFtZTogJ2V4a2F6dXUnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWoyMzU0eGh2bTNmdjl5Nzd0NWc2eTNxOG1leGdrMm1mMDB0Z3JremdwNzN0eW5ydno1NXM4YXVheXcnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAncG9uaGFydScsXG4gICAgcHVibGljS2V5czogW1xuICAgICAgJ2FnZTE4cnVnbGRmOWh0YzZ1bTVlcGxweDI3azUzZXA0em4wbGh6d2ZmZ254emhycTBjN3pndnlxM3pjY2R5JyxcbiAgICAgICdhZ2Uxbnoybjk5Y3JqcjducDl4amdsd2ZmZmMzZHVkNDVkaGV3cXpxZnpwenRrZHd1NGhqNzRncTZlbDUzMycsXG4gICAgXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICAvLyBUaGUgb3JnLWludGVybmFsIENJIGlkZW50aXR5ICh0aGUgRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvbiBzZWNyZXQgLyB+Ly5jb25maWcvZm5veC9hZ2UtY2ktd2IudHh0KS5cbiAgICBuYW1lOiAnY2knLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWEyYzZlZjZhaGw2bW1raGdxdHhnMG1ndGQ3eXNzcG50cTdyeHVzdjI2ZWZ4aG51aGxjZHNyOWRwYWsnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddLCB2aXNpYmlsaXR5OiAncHJpdmF0ZScgfSxcbiAgICBjaUFnZUtleVNlY3JldE5hbWU6ICdGTk9YX0FHRV9LRVknLFxuICB9LFxuICB7XG4gICAgLy8gVGhlIENJIGlkZW50aXR5IGRlZGljYXRlZCB0byBwdWJsaWMgcmVwb3NpdG9yaWVzICh0aGUgUFVCTElDX0ZOT1hfQUdFX0tFWSBvcmdhbml6YXRpb25cbiAgICAvLyBzZWNyZXQgLyB+Ly5jb25maWcvZm5veC9hZ2UtY2ktd2ItcHVibGljLnR4dCkuIFNjb3BlZCB0byBXaWxsQm9vc3RlciBvbmx5IGJlY2F1c2UgdGhlXG4gICAgLy8gUFVCTElDX0ZOT1hfQUdFX0tFWSBzZWNyZXQgaXMgcmVnaXN0ZXJlZCBpbiB0aGF0IG9yZ2FuaXphdGlvbiBhbG9uZTsgYSBwdWJsaWNcbiAgICAvLyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3J5IHJlc29sdmVzIE5PIENJIGlkZW50aXR5IGFuZCBnZW5lcmF0ZUZub3hUb21sIGZhaWxzIGNsb3NlZCBvbiBpdFxuICAgIC8vIChXaWxsQm9vc3RlckxhYiBkb2VzIG93biBwdWJsaWMgcmVwb3NpdG9yaWVzLCBlLmcuIGl0cyByZXVzYWJsZS13b3JrZmxvd3Mgc3luYyBtaXJyb3IsIGJ1dFxuICAgIC8vIG5vbmUgb2YgdGhlbSB1c2UgZm5veCDigJQgcmVnaXN0ZXIgdGhlIHNlY3JldCB0aGVyZSBhbmQgZXh0ZW5kIHRoaXMgc2NvcGUgaWYgb25lIGV2ZXIgZG9lcykuXG4gICAgbmFtZTogJ2NpLXB1YmxpYycsXG4gICAgcHVibGljS2V5czogWydhZ2UxZmhlYTg1eGp3cDg5bHdxM2pjbndqMzJzd2gzdjI0cHdwYXJxaDVsN3FrZ3ZjNGF4M3AwcWw2ZHUzNiddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJ10sIHZpc2liaWxpdHk6ICdwdWJsaWMnIH0sXG4gICAgY2lBZ2VLZXlTZWNyZXROYW1lOiAnUFVCTElDX0ZOT1hfQUdFX0tFWScsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAncmVtaW4nLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMW13NHB6OWR1ank5ZG1oazBwYWxxYXdqa2o3bTRrN3p4Nzh5cjlmanQ2M3NhNWwzZTQzdXE2bncwMDQnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnYXJpZXMnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMW5uMGVoeWFlbnlxOGttbnE0Mjk0a3p6Z3h2NWRuZjZwZXAyY2RrcmF4emZxbGs3eGdzcnFxbjZubjknXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHtcbiAgICAgIHJlcG9zaXRvcmllczogW1xuICAgICAgICAnV2lsbEJvb3N0ZXIvYWdlbnQtY2hhbGxlbmdlcycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9hZ2VudGljLXdvcmtmbG93cy1kYXNoYm9hcmQnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvY2hlZXJsaW5ncycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9jaG9mdS13YWxraW5nJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL3Byb21wdC1zdHVkeScsXG4gICAgICAgICdXaWxsQm9vc3Rlci9leGVyY29kZScsXG4gICAgICAgICdXaWxsQm9vc3Rlci9qdWRnZScsXG4gICAgICBdLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnc3VuYWdhJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTF1bHh6bjZ5NjhrdTM0Y3B4NWZ5YTVnZjdybnJ3ejB1ZmxueWU2dXh1aGczNHAybmpoZ2txbWc3M2c0J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7XG4gICAgICByZXBvc2l0b3JpZXM6IFsnV2lsbEJvb3N0ZXIvYWktb2NyJywgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJywgJ1dpbGxCb29zdGVyL2p1ZGdlJ10sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdheWFtZScsXG4gICAgcHVibGljS2V5czogWydhZ2UxdnhtMmdzMDAzcnV3bThwNmgzaHY3eGFzanUyczhrNG14bWMzNHptNmdyZHd6bnJzMDlucTZ4ejV2eiddLFxuICAgIHJlcG9zaXRvcnlTY29wZToge1xuICAgICAgcmVwb3NpdG9yaWVzOiBbJ1dpbGxCb29zdGVyL2FpLW9jcicsICdXaWxsQm9vc3Rlci9jaG9mdS13YWxraW5nJywgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJywgJ1dpbGxCb29zdGVyL2p1ZGdlJ10sXG4gICAgfSxcbiAgfSxcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IEZub3hBZ2VQcmluY2lwYWxbXTtcblxuaW50ZXJmYWNlIEZub3hUb21sIHtcbiAgaW1wb3J0PzogdW5rbm93bjtcbiAgcHJvdmlkZXJzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+O1xuICBwcm9maWxlcz86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxubGV0IGZub3hTeW5jRmFpbGVkID0gZmFsc2U7XG5sZXQgbWlncmF0aW9uTWFya2VyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xubGV0IG1pZ3JhdGlvbk1hcmtlck93bmVkID0gZmFsc2U7XG5cbi8qKiBXaGV0aGVyIGFueSBmbm94IHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gZmFpbGVkIGluIHRoZSBjdXJyZW50IHJlcG9zaXRvcnk7IHNldHVwU2VjcmV0cyBtdXN0IG5vdCB1cGxvYWQgdGhlbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNGbm94U3luY0ZhaWxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZub3hTeW5jRmFpbGVkO1xufVxuXG4vKipcbiAqIFN5bmNocm9uaXplcyB0aGUgYWdlIHJlY2lwaWVudHMgaW4gZXZlcnkgZm5veC50b21sIHdpdGggdGhlIHByaW5jaXBhbHMgYXV0aG9yaXplZCBmb3IgdGhpc1xuICogcmVwb3NpdG9yeSBhbmQgcmUtZW5jcnlwdHMgdGhlIGNvbW1pdHRlZCBzZWNyZXRzIHdoZW4gdGhlIHJlY2lwaWVudCBzZXQgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRm5veFRvbWwocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRm5veFRvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVGhlIGZhaWx1cmUgZmxhZyBpcyBwZXIgcmVwb3NpdG9yeTogd2JmeSBjYW4gcHJvY2VzcyBtdWx0aXBsZSB3b3JraW5nIGRpcmVjdG9yaWVzIGluIG9uZVxuICAgIC8vIGludm9jYXRpb24sIGFuZCBhbiBlYXJsaWVyIHJlcG9zaXRvcnkncyBmYWlsdXJlIG11c3Qgbm90IHZldG8gYSBsYXRlciByZXBvc2l0b3J5J3MgdXBsb2FkLlxuICAgIGZub3hTeW5jRmFpbGVkID0gZmFsc2U7XG4gICAgLy8gQSByZXBvc2l0b3J5IG91dHNpZGUgV2lsbEJvb3N0ZXIvV2lsbEJvb3N0ZXJMYWIgbWFuYWdlcyBpdHMgb3duIHJlY2lwaWVudCBzZXQgKGUuZy4gYVxuICAgIC8vIHBlcnNvbmFsIHJlcG9zaXRvcnkgd2l0aCBpdHMgb3duIENJIGlkZW50aXR5KSwgc28gcmV3cml0aW5nIGl0IHRvIHRoZSBvcmcgcm9zdGVyIHdvdWxkIGdyYW50XG4gICAgLy8gb3JnIG1lbWJlcnMgYWNjZXNzIGFuZCByZS1lbmNyeXB0IHNlY3JldHMgZm9yIGEgQ0kga2V5IHRoYXQgcmVwb3NpdG9yeSBkb2VzIG5vdCB1c2UuXG4gICAgLy8gc2V0dXBTZWNyZXRzIG5ldmVyIHVwbG9hZHMgc2VjcmV0cyBmb3Igc3VjaCByZXBvc2l0b3JpZXMgZWl0aGVyLCBzbyBza2lwIGVudGlyZWx5LlxuICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwbykgcmV0dXJuO1xuICAgIGNvbnN0IGFnZVJlY2lwaWVudHMgPSBnZXRGbm94QWdlUmVjaXBpZW50cyhyb290Q29uZmlnKTtcbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIC8vIEEgbmVzdGVkLW9ubHkgZm5veCBsYXlvdXQgaXMgdW5zdXBwb3J0ZWQ6IHNldHVwU2VjcmV0cyB3b3VsZCB0YWtlIHRoZSBkb3RlbnYgcGF0aCBhbmRcbiAgICAgIC8vIGRlbGV0ZSBGTk9YX0FHRV9LRVkgZXZlbiB0aG91Z2ggdGhlIG5lc3RlZCBjb25maWcncyBDSSBzdGlsbCBuZWVkcyBpdC5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIE9ubHkgYWdlLXVzaW5nIGNvbmZpZ3MgY2FycnkgdGhhdCByaXNrLiBXaXRob3V0IGEgcm9vdCBwcm92aWRpbmcgdGhlIGFnZSBwcm92aWRlciwgYVxuICAgICAgICAvLyBzdHJheSBjb25maWcgdGhhdCBkZWNsYXJlcyBub25lIHVzZXMgbm8gYWdlIGVuY3J5cHRpb24gYXQgYWxsIChlLmcuIGEgcGxhaW50ZXh0IHRlc3RcbiAgICAgICAgLy8gZml4dHVyZSBvciBleGFtcGxlIGNvbmZpZyBhbnkgcmVwb3NpdG9yeSBtYXkgbGVnaXRpbWF0ZWx5IGNvbW1pdCksIHNvIGl0IG5laXRoZXIgbmVlZHNcbiAgICAgICAgLy8gcmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBub3Igb3ducyBhbiBGTk9YX0FHRV9LRVkgYW5kIG11c3Qgbm90IGJsb2NrIHRoZSBydW4uXG4gICAgICAgIGNvbnN0IHN0cmF5RmlsZVBhdGhzID0gbGlzdEZub3hMaWtlRmlsZVBhdGhzKHJvb3REaXJQYXRoKS5maWx0ZXIoKGZpbGVQYXRoKSA9PlxuICAgICAgICAgIGRlY2xhcmVzRm5veEFnZVByb3ZpZGVyKGZpbGVQYXRoKVxuICAgICAgICApO1xuICAgICAgICBpZiAoc3RyYXlGaWxlUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGZub3ggY29uZmlncyBleGlzdCB3aXRob3V0IGEgcm9vdCBmbm94LnRvbWw6ICR7c3RyYXlGaWxlUGF0aHMuam9pbignLCAnKX0uIEFkZCBhIHJvb3QgZm5veC50b21sLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBGYWlsIGNsb3NlZDogd2l0aG91dCBnaXQgaW5mb3JtYXRpb24gYSBuZXN0ZWQtb25seSBmbm94IGxheW91dCBjYW5ub3QgYmUgcnVsZWQgb3V0LCBhbmRcbiAgICAgICAgLy8gc2V0dXBTZWNyZXRzIHdvdWxkIG90aGVyd2lzZSB0YWtlIHRoZSBkb3RlbnYgcGF0aCBhbmQgZGVsZXRlIEZOT1hfQUdFX0tFWS5cbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gY2hlY2sgZm9yIG5lc3RlZCBmbm94IGNvbmZpZ3MgZHVlIHRvOiAkeyhlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3J9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBIGZhaWxlZCB2aXNpYmlsaXR5IGxvb2t1cCBjb2xsYXBzZXMgaXNQdWJsaWNSZXBvIHRvIGZhbHNlLCB3aGljaCB3b3VsZCBzaWxlbnRseSByZS1lbmNyeXB0XG4gICAgLy8gYSBwdWJsaWMgcmVwb3NpdG9yeSdzIHdvcmxkLXJlYWRhYmxlIGNpcGhlcnRleHRzIHRvIHRoZSBvcmctaW50ZXJuYWwgQ0kgaWRlbnRpdHkgKGFuZCB2aWNlXG4gICAgLy8gdmVyc2EgZHJvcCB0aGUgcHVibGljIG9uZSkuIEZhaWwgaW5zdGVhZCBvZiBndWVzc2luZyB3aGVuZXZlciB2aXNpYmlsaXR5IGNoYW5nZXMgdGhlIHJvc3Rlci5cbiAgICBpZiAoIXJvb3RDb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duICYmIGRvZXNGbm94UmVjaXBpZW50U2V0RGVwZW5kT25WaXNpYmlsaXR5KHJvb3RDb25maWcpKSB7XG4gICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIHRoZSB2aXNpYmlsaXR5IG9mICR7cm9vdENvbmZpZy5yZXBvQXV0aG9yfS8ke3Jvb3RDb25maWcucmVwb05hbWV9IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIChHaXRIdWIgbG9va3VwIGZhaWxlZCkgYW5kIHRoZSBDSSByZWNpcGllbnQgZGVwZW5kcyBvbiBpdC4gQ2hlY2sgbmV0d29yayBhbmQgZ2ggYXV0aGVudGljYXRpb24sIHRoZW4gcmVydW4gd2JmeS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBCb3RoIENJIGlkZW50aXRpZXMgYXJlIHZpc2liaWxpdHktY29uc3RyYWluZWQsIHNvIGEgcmVwb3NpdG9yeSBjYW4gZmFsbCB0aHJvdWdoIEJPVEggKGUuZy4gYVxuICAgIC8vIHB1YmxpYyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3J5LCB3aG9zZSBvcmdhbml6YXRpb24gaGFzIG5vIFBVQkxJQ19GTk9YX0FHRV9LRVkgc2VjcmV0KS5cbiAgICAvLyBSZS1lbmNyeXB0aW5nIGZvciBhIHJvc3RlciB3aXRob3V0IGEgQ0kgaWRlbnRpdHkgd291bGQgbGVhdmUgQ0kgdW5hYmxlIHRvIGRlY3J5cHQgYW55dGhpbmcsXG4gICAgLy8gZmFpbGluZyBvbmx5IGF0IHJ1bnRpbWUgaW4gQWN0aW9uczsgZmFpbCBsb3VkbHkgaGVyZSBpbnN0ZWFkLlxuICAgIGlmICghcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUocm9vdENvbmZpZykpIHtcbiAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2Ugbm8gQ0kgaWRlbnRpdHkgaXMgc2NvcGVkIHRvICR7cm9vdENvbmZpZy5yZXBvQXV0aG9yfS8ke3Jvb3RDb25maWcucmVwb05hbWV9IChwdWJsaWMgcmVwb3NpdG9yaWVzIGFyZSBzdXBwb3J0ZWQgb25seSBpbiB0aGUgV2lsbEJvb3N0ZXIgb3JnYW5pemF0aW9uKS4gUHJvdmlzaW9uIHRoZSBtYXRjaGluZyBvcmdhbml6YXRpb24gc2VjcmV0IGFuZCBleHRlbmQgdGhlIENJIHNjb3BlcyBpbiB3YmZ5IGZpcnN0LmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoZSBtaWdyYXRpb24gaXMgdHJhbnNhY3Rpb25hbCBvdmVyIGV2ZXJ5IG1hbmFnZWQgZm5veC50b21sOiByZXJ1bnMgbXVzdCByZXRyeSBmcm9tIHRoZVxuICAgIC8vIG9yaWdpbmFsIHN0YXRlLCBhbmQgYSBwYXJ0aWFsbHkgbWlncmF0ZWQgdHJlZSBjb3VsZCBvdGhlcndpc2UgYmVjb21lIHVuZGVjcnlwdGFibGUgZm9yIHRoZVxuICAgIC8vIGlkZW50aXR5IHBlcmZvcm1pbmcgYSBsYXRlciByZXRyeSAoZS5nLiB3aGVuIGEgcmVjaXBpZW50IGlzIGJlaW5nIHJlbW92ZWQpLlxuICAgIGNvbnN0IHNuYXBzaG90cyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgLy8gQSBmYWlsZWQgc3luY2hyb25pemF0aW9uIG11c3QgZmFpbCB0aGUgd2hvbGUgd2JmeSBydW46IGV4aXRpbmcgemVybyB3aXRoIHN0YWxlIHJlY2lwaWVudHNcbiAgICAvLyB3b3VsZCBsZWF2ZSBzZWNyZXRzIHVuZGVjcnlwdGFibGUgZm9yIG5ldyByZWNpcGllbnRzIHdoaWxlIGxvb2tpbmcgc3VjY2Vzc2Z1bC5cbiAgICB0cnkge1xuICAgICAgLy8gQW55IGZub3ggY29uZmlnIChpbmNsdWRpbmcgYWxpYXNlcyBhbmQgbG9jYWwgb3ZlcnJpZGVzKSBpbiBhbiBhbmNlc3RvciBkaXJlY3Rvcnkgd291bGRcbiAgICAgIC8vIG1lcmdlIGludG8gKGFuZCBwb3NzaWJseSBiZSBSRVdSSVRURU4gYnkpIHRoaXMgcmVwb3NpdG9yeSdzIGBmbm94IHJlZW5jcnlwdGAgdGhyb3VnaFxuICAgICAgLy8gaGllcmFyY2hpY2FsIGxvYWRpbmcsIHVzaW5nIHRoaXMgcmVwb3NpdG9yeSdzIHJlY2lwaWVudCBzZXQgZm9yIGZvcmVpZ24gc2VjcmV0cy5cbiAgICAgIGZvciAobGV0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUocm9vdERpclBhdGgpOyA7IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCkpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3JGbm94RmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGgpO1xuICAgICAgICBpZiAoYW5jZXN0b3JGbm94RmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBhbiBhbmNlc3RvciBkaXJlY3RvcnkgY29udGFpbnMgZm5veCBjb25maWdzIHRoYXQgZm5veCB3b3VsZCBoaWVyYXJjaGljYWxseSBtZXJnZSBhbmQgcmV3cml0ZTogJHthbmNlc3RvckZub3hGaWxlTmFtZXNcbiAgICAgICAgICAgICAgLm1hcCgobmFtZSkgPT4gcGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKVxuICAgICAgICAgICAgICAuam9pbignLCAnKX0uIFJlbW92ZSB0aGVtIG9yIG1vdmUgdGhlIHJlcG9zaXRvcnkuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoLmRpcm5hbWUoZGlyUGF0aCkgPT09IGRpclBhdGgpIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gZm5veCBhbHNvIGxvYWRzIGNvbW1pdHRlZCBjb25maWcgYWxpYXNlcyB0aGlzIGdlbmVyYXRvciBjYW5ub3Qga2VlcCBpbiBzeW5jLlxuICAgICAgY29uc3QgZm5veExpa2VGaWxlUGF0aHMgPSBsaXN0Rm5veExpa2VGaWxlUGF0aHMocm9vdERpclBhdGgpO1xuICAgICAgY29uc3QgdW5zdXBwb3J0ZWRGaWxlUGF0aHMgPSBmbm94TGlrZUZpbGVQYXRocy5maWx0ZXIoKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSAhPT0gJ2Zub3gudG9tbCcpO1xuICAgICAgaWYgKHVuc3VwcG9ydGVkRmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIG9ubHkgZm5veC50b21sIGZpbGVzIGFyZSBzdXBwb3J0ZWQ6ICR7dW5zdXBwb3J0ZWRGaWxlUGF0aHMuam9pbignLCAnKX0uIE1lcmdlIHRoZW0gaW50byB0aGUgYWRqYWNlbnQgZm5veC50b21sLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZGlyUGF0aHMgPSBsaXN0Rm5veFRvbWxEaXJQYXRocyhmbm94TGlrZUZpbGVQYXRocyk7XG4gICAgICBpZiAoIWRpclBhdGhzLmluY2x1ZGVzKHJvb3REaXJQYXRoKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdmbm94LnRvbWwnKX0gaXMgaW52aXNpYmxlIHRvIGdpdCAoZ2l0aWdub3JlZD8pLiBDb21taXQgaXQgb3IgcmVtb3ZlIGl0LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gR2l0LWJhc2VkIGRpc2NvdmVyeSBjYW5ub3Qgc2VlIGdpdGlnbm9yZWQgZmlsZXMsIHNvIGFsc28gaW5zcGVjdCBldmVyeSBkaXJlY3RvcnkgaW4gZWFjaFxuICAgICAgLy8gbWFuYWdlZCBjb25maWcncyBoaWVyYXJjaHkgdGhyb3VnaCB0aGUgZmlsZXN5c3RlbTogYSBnaXRpZ25vcmVkIGFsaWFzIChlLmcuIC5mbm94LnRvbWwpXG4gICAgICAvLyBvciBhIGdpdGlnbm9yZWQgZm5veC50b21sIGluIGFuIGludGVybWVkaWF0ZSBkaXJlY3Rvcnkgd291bGQgc3RpbGwgYmUgbG9hZGVkIGJ5IGZub3ggYW5kXG4gICAgICAvLyBjb3VsZCBvdmVycmlkZSB0aGUgcHJvdmlkZXIgdXNlZCBmb3IgbmVzdGVkIHJlLWVuY3J5cHRpb24uXG4gICAgICBjb25zdCBtYW5hZ2VkRGlyUGF0aHMgPSBuZXcgU2V0KGRpclBhdGhzKTtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgICBmb3IgKGNvbnN0IGhpZXJhcmNoeURpclBhdGggb2YgbGlzdEFuY2VzdG9yRGlyUGF0aHMoZGlyUGF0aCwgcm9vdERpclBhdGgpKSB7XG4gICAgICAgICAgY29uc3Qgc3RyYXlGaWxlTmFtZXMgPSBsaXN0Rm5veExpa2VGaWxlTmFtZXMoaGllcmFyY2h5RGlyUGF0aCkuZmlsdGVyKFxuICAgICAgICAgICAgKG5hbWUpID0+IG5hbWUgIT09ICdmbm94LmxvY2FsLnRvbWwnICYmICEobmFtZSA9PT0gJ2Zub3gudG9tbCcgJiYgbWFuYWdlZERpclBhdGhzLmhhcyhoaWVyYXJjaHlEaXJQYXRoKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzdHJheUZpbGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGZub3ggd291bGQgbG9hZCB1bm1hbmFnZWQgKGdpdGlnbm9yZWQ/KSBjb25maWdzOiAke3N0cmF5RmlsZU5hbWVzXG4gICAgICAgICAgICAgICAgLm1hcCgobmFtZSkgPT4gcGF0aC5qb2luKGhpZXJhcmNoeURpclBhdGgsIG5hbWUpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpfS4gQ29tbWl0IHRoZW0gYXMgZm5veC50b21sIG9yIHJlbW92ZSB0aGVtLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEEgZm5veC5sb2NhbC50b21sIGFueXdoZXJlIGluIHRoZSBtZXJnZWQgaGllcmFyY2h5IChub3Qgb25seSBuZXh0IHRvIGEgbWFuYWdlZFxuICAgICAgICAgIC8vIGNvbmZpZykgY2FuIG92ZXJyaWRlIHByb3ZpZGVycy5cbiAgICAgICAgICBjb25zdCBsb2NhbElzc3VlID0gZmluZEZub3hMb2NhbFRvbWxJc3N1ZShoaWVyYXJjaHlEaXJQYXRoKTtcbiAgICAgICAgICBpZiAobG9jYWxJc3N1ZSkge1xuICAgICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke2xvY2FsSXNzdWV9LiBLZWVwIG9ubHkgbWFjaGluZS1sb2NhbCBzZWNyZXQgb3ZlcnJpZGVzIHRoZXJlLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW4tbWVtb3J5IHNuYXBzaG90cyBkbyBub3Qgc3Vydml2ZSBhIGtpbGxlZCBwcm9jZXNzLCBzbyBhIGR1cmFibGUgbWFya2VyIGlzIHdyaXR0ZW5cbiAgICAgIC8vIGJlZm9yZSB0aGUgZmlyc3QgbXV0YXRpb24gYW5kIHJlbW92ZWQgb25seSB3aGVuIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQgYWdhaW4uIEEgbGVmdG92ZXJcbiAgICAgIC8vIG1hcmtlciBtZWFucyBhIHByZXZpb3VzIHJ1biB3YXMga2lsbGVkIG1pZC1taWdyYXRpb24gKG9yIGNvdWxkIG5vdCByZXN0b3JlKTogc29tZVxuICAgICAgLy8gY2lwaGVydGV4dHMgbWF5IG5vdCBtYXRjaCB0aGUgcmVjaXBpZW50cywgb3IgbWF5IGV2ZW4gYmUgdW5kZWNyeXB0YWJsZSBmb3IgdGhlIGV4ZWN1dG9yJ3NcbiAgICAgIC8vIGlkZW50aXR5IHdoZW4gYSByZWNpcGllbnQgd2FzIGJlaW5nIHJlbW92ZWQg4oCUIHN0YXRlcyB0aGlzIGNvZGUgY2Fubm90IHJlcGFpciBzYWZlbHlcbiAgICAgIC8vIGJlY2F1c2UgdGhlIHdvcmtpbmcgdHJlZSBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIChicmFuY2ggc3dpdGNoZXMsIG1hbnVhbCBlZGl0cykuIFRoZVxuICAgICAgLy8gZm5veC50b21sIGZpbGVzIGFyZSBnaXQtdHJhY2tlZCwgc28gdGhlIHVzZXIgcmVzdG9yZXMgdGhlbSB2aWEgZ2l0IGFuZCBjbGVhcnMgdGhlIG1hcmtlci5cbiAgICAgIG1pZ3JhdGlvbk1hcmtlclBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICcudG1wJywgJ3diZnktZm5veC1taWdyYXRpb24tbWFya2VyJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhtaWdyYXRpb25NYXJrZXJQYXRoKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgYSBwcmV2aW91cyBtaWdyYXRpb24gd2FzIGludGVycnVwdGVkLiBSZXN0b3JlIHRoZSBmbm94LnRvbWwgZmlsZXMgdmlhIGdpdCAoZS5nLiBcXGBnaXQgc3RhdHVzXFxgIGFuZCBcXGBnaXQgcmVzdG9yZSAtLSAnKmZub3gqLnRvbWwnXFxgIGlmIHlvdSBoYXZlIG5vIGludGVudGlvbmFsIGxvY2FsIGNoYW5nZXMpLCB0aGVuIGRlbGV0ZSAke21pZ3JhdGlvbk1hcmtlclBhdGh9IGFuZCByZXJ1biB3YmZ5LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBIHRyYWNrZWQgc3ltbGluayBuYW1lZCBmbm94LnRvbWwgKG9yIGEgc3ltbGlua2VkIHBhcmVudCBkaXJlY3RvcnkpIHdvdWxkIG1ha2UgdGhlXG4gICAgICAvLyByZXdyaXRlIGFuZCBgZm5veCByZWVuY3J5cHRgIHJlYWQgYW5kIE1PRElGWSBmaWxlcyBvdXRzaWRlIHRoaXMgcmVwb3NpdG9yeS5cbiAgICAgIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgY29uc3QgZm5veFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LnRvbWwnKTtcbiAgICAgICAgY29uc3QgcmVhbFBhdGggPSBmcy5yZWFscGF0aFN5bmMoZm5veFRvbWxQYXRoKTtcbiAgICAgICAgaWYgKGZzLmxzdGF0U3luYyhmbm94VG9tbFBhdGgpLmlzU3ltYm9saWNMaW5rKCkgfHwgIXJlYWxQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApKSB7XG4gICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtmbm94VG9tbFBhdGh9IGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5ICgke3JlYWxQYXRofSkuIFJlcGxhY2UgaXQgd2l0aCBhIHJlZ3VsYXIgaW4tcmVwb3NpdG9yeSBmaWxlLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzbmFwc2hvdHMuc2V0KGZub3hUb21sUGF0aCwgZnMucmVhZEZpbGVTeW5jKGZub3hUb21sUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNvcnRlZCBvcmRlciBwcm9jZXNzZXMgYW5jZXN0b3JzIGJlZm9yZSBkZXNjZW5kYW50cywgc28gY29uZmlncyBpbmhlcml0aW5nIGFuIHVwZGF0ZWRcbiAgICAgIC8vIHByb3ZpZGVyIHJlLWVuY3J5cHQgYWdhaW5zdCB0aGUgYWxyZWFkeS11cGRhdGVkIHJlY2lwaWVudHMuXG4gICAgICBjb25zdCBjaGFuZ2VkRGlyUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICBsZXQgYW55RmFpbGVkID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3JDaGFuZ2VkID0gY2hhbmdlZERpclBhdGhzLnNvbWUoKGNoYW5nZWREaXJQYXRoKSA9PiBkaXJQYXRoLnN0YXJ0c1dpdGgoY2hhbmdlZERpclBhdGggKyBwYXRoLnNlcCkpO1xuICAgICAgICAvLyBFdmVyeSBkaXJQYXRoIHdhcyBzbmFwc2hvdHRlZCBhYm92ZS4gQSBtaXNzaW5nIHNuYXBzaG90IG11c3QgZmFpbCBoYXJkOiBmYWxsaW5nIGJhY2sgdG9cbiAgICAgICAgLy8gYW4gZW1wdHkgc3RyaW5nIHdvdWxkIGZsb3cgaW50byByZXBsYWNlQWdlUmVjaXBpZW50cyBhbmQgb3ZlcndyaXRlIHRoZSByZWFsIGZub3gudG9tbFxuICAgICAgICAvLyB3aXRoIGEgcmVjaXBpZW50cy1vbmx5IGZpbGUsIGRlc3Ryb3lpbmcgZXZlcnkgY29tbWl0dGVkIHNlY3JldC5cbiAgICAgICAgY29uc3Qgc25hcHNob3RDb250ZW50ID0gc25hcHNob3RzLmdldChwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gudG9tbCcpKTtcbiAgICAgICAgaWYgKHNuYXBzaG90Q29udGVudCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZm5veC50b21sIHNuYXBzaG90IGZvciAke2RpclBhdGh9LmApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzeW5jaHJvbml6ZUZub3hBZ2VSZWNpcGllbnRzKFxuICAgICAgICAgIGRpclBhdGgsXG4gICAgICAgICAgcm9vdERpclBhdGgsXG4gICAgICAgICAgZGlyUGF0aCA9PT0gcm9vdERpclBhdGgsXG4gICAgICAgICAgYW5jZXN0b3JDaGFuZ2VkLFxuICAgICAgICAgIHNuYXBzaG90Q29udGVudCxcbiAgICAgICAgICBhZ2VSZWNpcGllbnRzXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09ICdjaGFuZ2VkJykgY2hhbmdlZERpclBhdGhzLnB1c2goZGlyUGF0aCk7XG4gICAgICAgIGFueUZhaWxlZCB8fD0gcmVzdWx0ID09PSAnZmFpbGVkJztcbiAgICAgIH1cbiAgICAgIGlmIChhbnlGYWlsZWQpIHtcbiAgICAgICAgLy8gQSBmYWlsZWQgcmUtZW5jcnlwdGlvbiBtYXkgaGF2ZSByZXdyaXR0ZW4gc29tZSBjaXBoZXJ0ZXh0cywgc28gcmVzdG9yZSB1bmNvbmRpdGlvbmFsbHkuXG4gICAgICAgIC8vIFRoZSBtYXJrZXIgaXMgcmVtb3ZlZCBvbmx5IHdoZW4gcmVzdG9yYXRpb24gZnVsbHkgc3VjY2VlZGVkIGFuZCB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LlxuICAgICAgICAvLyBSZXN0b3JlIE9OTFkgd2hlbiB0aGlzIHJ1biBvd25zIHRoZSBtYXJrZXI6IGV2ZXJ5IGNvbW1pdHRlZC1jb25maWcgbXV0YXRpb24gaGFwcGVuc1xuICAgICAgICAvLyBhZnRlciBtYXJrZXIgYWNxdWlzaXRpb24sIHNvIGEgbm9uLW93bmVyIChlLmcuIGxvc2luZyBhIHJhY2UgYWdhaW5zdCBhIGNvbmN1cnJlbnQgd2JmeSlcbiAgICAgICAgLy8gaGFzIGNoYW5nZWQgbm90aGluZyBhbmQgbXVzdCBub3Qgb3ZlcndyaXRlIHRoZSBvd25lcidzIGluLXByb2dyZXNzIG1pZ3JhdGlvbi5cbiAgICAgICAgaWYgKG1pZ3JhdGlvbk1hcmtlck93bmVkICYmIHJlc3RvcmVTbmFwc2hvdHMoc25hcHNob3RzKSkgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChtaWdyYXRpb25NYXJrZXJPd25lZCAmJiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90cykpIHtcbiAgICAgICAgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH1cbiAgICAgIGZhaWxGbm94U3luYyhgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgZHVlIHRvOiAkeyhlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBtaWdyYXRpb25NYXJrZXJQYXRoID0gdW5kZWZpbmVkO1xuICAgICAgbWlncmF0aW9uTWFya2VyT3duZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzeW5jaHJvbml6ZUZub3hBZ2VSZWNpcGllbnRzKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIGlzUm9vdDogYm9vbGVhbixcbiAgYW5jZXN0b3JSZWNpcGllbnRzQ2hhbmdlZDogYm9vbGVhbixcbiAgb3JpZ2luYWxDb250ZW50OiBzdHJpbmcsXG4gIGFnZVJlY2lwaWVudHM6IHJlYWRvbmx5IEZub3hBZ2VSZWNpcGllbnRbXVxuKTogUHJvbWlzZTwnY2hhbmdlZCcgfCAndW5jaGFuZ2VkJyB8ICdmYWlsZWQnPiB7XG4gIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC50b21sJyk7XG5cbiAgLy8gUmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBvbmx5IHVuZGVyc3RhbmRzIHRoZSBzdGFuZGFyZCBzaW5nbGUtZmlsZSBsYXlvdXQgd2l0aCBvbmVcbiAgLy8gdG9wLWxldmVsIGFnZSBwcm92aWRlciBuYW1lZCBgYWdlYC4gR2l0aWdub3JlZCBjb25maWcgYWxpYXNlcyAoZS5nLiAuZm5veC5sb2NhbC50b21sKSB0aGF0XG4gIC8vIGdpdC1iYXNlZCBkaXNjb3ZlcnkgY2Fubm90IHNlZSwgaW1wb3J0cywgZGlmZmVyZW50bHkgbmFtZWQgYWdlIHByb3ZpZGVycywgb3IgcHJvdmlkZXJcbiAgLy8gb3ZlcnJpZGVzIHdvdWxkIGtlZXAgdXNpbmcgcmVjaXBpZW50IHNldHMgdGhpcyBnZW5lcmF0b3IgZG9lcyBub3QgcmV3cml0ZSwgc28gdGhlaXIgc2VjcmV0c1xuICAvLyB3b3VsZCBzaWxlbnRseSBzdGF5IHVuZGVjcnlwdGFibGUgZm9yIG5ldyByZWNpcGllbnRzOyBmYWlsIGluc3RlYWQgb2YgcHJvY2VlZGluZy4gVGhlXG4gIC8vIGdpdGlnbm9yZWQgZm5veC5sb2NhbC50b21sIGlzIGEgc3VwcG9ydGVkIG1hY2hpbmUtbG9jYWwgb3ZlcnJpZGUsIGJ1dCBvbmx5IHdoaWxlIGl0IGxlYXZlc1xuICAvLyBwcm92aWRlcnMgYWxvbmUuXG4gIGNvbnN0IHVuc3VwcG9ydGVkRmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGgpLmZpbHRlcihcbiAgICAobmFtZSkgPT4gbmFtZSAhPT0gJ2Zub3gudG9tbCcgJiYgbmFtZSAhPT0gJ2Zub3gubG9jYWwudG9tbCdcbiAgKTtcbiAgaWYgKHVuc3VwcG9ydGVkRmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBmYWlsRm5veFN5bmMoXG4gICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgaW4gJHtkaXJQYXRofSBiZWNhdXNlIG9ubHkgZm5veC50b21sIGFuZCBmbm94LmxvY2FsLnRvbWwgYXJlIHN1cHBvcnRlZDogJHt1bnN1cHBvcnRlZEZpbGVOYW1lcy5qb2luKCcsICcpfS4gTWVyZ2UgdGhlbSBpbnRvIGZub3gudG9tbC5gXG4gICAgKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgLy8gQSBzdGFsZSBiYWNrdXAgbGVmdCBieSBhbiBpbnRlcnJ1cHRlZCBlYXJsaWVyIHJ1biBtdXN0IGJlIHJlc3RvcmVkIHNvIHRoZSB1c2VyJ3MgbG9jYWxcbiAgLy8gb3ZlcnJpZGVzIGFyZSBuZXZlciBzaWxlbnRseSBsb3N0ICh0aGUgbWlncmF0aW9uIG1hcmtlciBzZXBhcmF0ZWx5IGJsb2NrcyB0aGlzIHJ1biB3aGVuIHRoZVxuICAvLyBpbnRlcnJ1cHRpb24gbGVmdCB0aGUgbWlncmF0aW9uIGl0c2VsZiBpbmNvbXBsZXRlKS5cbiAgcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcblxuICBjb25zdCBsYXlvdXRJc3N1ZSA9IGZpbmRGbm94TGF5b3V0SXNzdWUob3JpZ2luYWxDb250ZW50KTtcbiAgaWYgKGxheW91dElzc3VlKSB7XG4gICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7Zm5veFRvbWxQYXRofSAke2xheW91dElzc3VlfS5gKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShvcmlnaW5hbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICBjb25zdCBwcm9maWxlTmFtZXMgPSBPYmplY3Qua2V5cyhzZXR0aW5ncy5wcm9maWxlcyA/PyB7fSk7XG4gIGNvbnN0IGN1cnJlbnRSZWNpcGllbnRzID0gcmVhZEZub3hBZ2VSZWNpcGllbnRzKG9yaWdpbmFsQ29udGVudCk7XG5cbiAgLy8gQSBuZXN0ZWQgZm5veC50b21sIHdpdGhvdXQgaXRzIG93biBhZ2UgcHJvdmlkZXIgaW5oZXJpdHMgdGhlIG5lYXJlc3QgYW5jZXN0b3IncyBvbmUgdGhyb3VnaFxuICAvLyBmbm94J3MgaGllcmFyY2hpY2FsIGxvYWRpbmcsIHNvIG9ubHkgdGhlIHJvb3QgY29uZmlnIG11c3QgZGVjbGFyZSB0aGUgcHJvdmlkZXIg4oCUIGJ1dCB0aGVcbiAgLy8gbmVzdGVkIGNvbmZpZydzIG93biBjaXBoZXJ0ZXh0cyBzdGlsbCBtdXN0IGJlIHJlLWVuY3J5cHRlZCB3aGVuZXZlciBhbiBhbmNlc3RvcidzIHJlY2lwaWVudHNcbiAgLy8gY2hhbmdlZCwgYW5kIHRoYXQgb25seSBoYXBwZW5zIHdoZW4gYGZub3ggcmVlbmNyeXB0YCBydW5zIGZyb20gdGhlIG5lc3RlZCBkaXJlY3RvcnkuXG4gIGlmICghaXNSb290ICYmICFjdXJyZW50UmVjaXBpZW50cykge1xuICAgIGlmIChhbmNlc3RvclJlY2lwaWVudHNDaGFuZ2VkKSB7XG4gICAgICB3cml0ZU1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgaWYgKCFyZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoLCByb290RGlyUGF0aCwgcHJvZmlsZU5hbWVzKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byByZS1lbmNyeXB0IGZub3ggc2VjcmV0cyBpbiAke2RpclBhdGh9IGZvciB0aGUgdXBkYXRlZCByZWNpcGllbnRzLiBGaXggdGhlIGVycm9yIGFuZCByZXJ1biB3YmZ5LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuICdmYWlsZWQnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJ3VuY2hhbmdlZCc7XG4gIH1cblxuICBpZiAoXG4gICAgY3VycmVudFJlY2lwaWVudHMgJiZcbiAgICBjdXJyZW50UmVjaXBpZW50cy5zaXplID09PSBhZ2VSZWNpcGllbnRzLmxlbmd0aCAmJlxuICAgIGFnZVJlY2lwaWVudHMuZXZlcnkoKHJlY2lwaWVudCkgPT4gY3VycmVudFJlY2lwaWVudHMuaGFzKHJlY2lwaWVudC5wdWJsaWNLZXkpKVxuICApIHtcbiAgICByZXR1cm4gJ3VuY2hhbmdlZCc7XG4gIH1cblxuICAvLyBSZXdyaXRlIG9ubHkgdGhlIHJlY2lwaWVudHMgYXNzaWdubWVudCBzbyB1c2VyLWF1dGhvcmVkIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIHN1cnZpdmUuXG4gIC8vIFJlLXBhcnNlIGJlZm9yZSB3cml0aW5nOiBhbiB1bnVzdWFsIGxheW91dCAoZS5nLiBkb3R0ZWQga2V5cykgY291bGQgbWFrZSB0aGUgdGV4dHVhbCBlZGl0XG4gIC8vIHByb2R1Y2UgYSBkdXBsaWNhdGUgdGFibGUgb3IgbGVhdmUgdGhlIG9sZCByZWNpcGllbnRzIGluIGVmZmVjdC5cbiAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSByZXBsYWNlQWdlUmVjaXBpZW50cyhvcmlnaW5hbENvbnRlbnQsIGFnZVJlY2lwaWVudHMpO1xuICBjb25zdCB1cGRhdGVkUmVjaXBpZW50cyA9IFsuLi4ocmVhZEZub3hBZ2VSZWNpcGllbnRzKHVwZGF0ZWRDb250ZW50KSA/PyBbXSldO1xuICBpZiAoXG4gICAgdXBkYXRlZFJlY2lwaWVudHMubGVuZ3RoICE9PSBhZ2VSZWNpcGllbnRzLmxlbmd0aCB8fFxuICAgICFhZ2VSZWNpcGllbnRzLmV2ZXJ5KChyZWNpcGllbnQpID0+IHVwZGF0ZWRSZWNpcGllbnRzLmluY2x1ZGVzKHJlY2lwaWVudC5wdWJsaWNLZXkpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJld3JpdGluZyB0aGUgYWdlIHJlY2lwaWVudHMgaW4gJHtmbm94VG9tbFBhdGh9IGRpZCBub3QgdGFrZSBlZmZlY3Q7IHVwZGF0ZSB0aGVtIG1hbnVhbGx5LmApO1xuICB9XG4gIHdyaXRlTWlncmF0aW9uTWFya2VyKCk7XG4gIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZm5veFRvbWxQYXRoLCB1cGRhdGVkQ29udGVudCk7XG5cbiAgaWYgKCFyZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoLCByb290RGlyUGF0aCwgcHJvZmlsZU5hbWVzKSkge1xuICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGNvbmZpZzoga2VlcGluZyB0aGUgbmV3IHJlY2lwaWVudHMgd2l0aCBvbGQgY2lwaGVydGV4dHMgd291bGQgbWFrZVxuICAgIC8vIHRoaXMgZ2VuZXJhdG9yIHNraXAgcmUtZW5jcnlwdGlvbiBmb3JldmVyIGFuZCBsZXQgc2V0dXBTZWNyZXRzIHVwbG9hZCBhIENJIGtleSB0aGF0XG4gICAgLy8gY2Fubm90IGRlY3J5cHQgYW55dGhpbmcuIFRoZSBvbGQgY2lwaGVydGV4dHMgcmVtYWluIHZhbGlkIGZvciB0aGUgb2xkIHJlY2lwaWVudHMuXG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmbm94VG9tbFBhdGgsIG9yaWdpbmFsQ29udGVudCk7XG4gICAgZmFpbEZub3hTeW5jKFxuICAgICAgYEZhaWxlZCB0byByZS1lbmNyeXB0IGZub3ggc2VjcmV0cyBpbiAke2RpclBhdGh9IGZvciB0aGUgdXBkYXRlZCByZWNpcGllbnRzLiBGaXggdGhlIGVycm9yIGFuZCByZXJ1biB3YmZ5LmBcbiAgICApO1xuICAgIHJldHVybiAnZmFpbGVkJztcbiAgfVxuICByZXR1cm4gJ2NoYW5nZWQnO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiBhIGZub3gudG9tbCBsYXlvdXQgdGhhdCByZWNpcGllbnQgc3luY2hyb25pemF0aW9uIGFuZCB0aGUgQ0kta2V5XG4gKiB2ZXJpZmljYXRpb24gY2Fubm90IGNvdmVyLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgc3RhbmRhcmQgc2luZ2xlLWZpbGUsIHNpbmdsZS1hZ2UtcHJvdmlkZXJcbiAqIGxheW91dCBpcyB1c2VkLlxuICovXG5mdW5jdGlvbiBmaW5kRm5veExheW91dElzc3VlKGZub3hUb21sQ29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZub3hUb21sQ29udGVudCkgYXMgRm5veFRvbWw7XG4gICAgaWYgKHNldHRpbmdzLmltcG9ydCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gJ3VzZXMgdGhlIHVuc3VwcG9ydGVkIGBpbXBvcnRgIHNldHRpbmcnO1xuICAgIGNvbnN0IG5vblN0YW5kYXJkQWdlUHJvdmlkZXJOYW1lcyA9IE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnByb3ZpZGVycyA/PyB7fSlcbiAgICAgIC5maWx0ZXIoKFtuYW1lLCBwcm92aWRlcl0pID0+IChwcm92aWRlcj8udHlwZSA9PT0gJ2FnZScpICE9PSAobmFtZSA9PT0gJ2FnZScpKVxuICAgICAgLm1hcCgoW25hbWVdKSA9PiBuYW1lKTtcbiAgICBpZiAobm9uU3RhbmRhcmRBZ2VQcm92aWRlck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgZGVjbGFyZXMgYWdlIHByb3ZpZGVycyBub3QgbmFtZWQgXFxgYWdlXFxgIChvciBhbiBcXGBhZ2VcXGAgcHJvdmlkZXIgb2YgYW5vdGhlciB0eXBlKTogJHtub25TdGFuZGFyZEFnZVByb3ZpZGVyTmFtZXMuam9pbignLCAnKX1gO1xuICAgIH1cbiAgICBjb25zdCBwcm9maWxlc1dpdGhQcm92aWRlcnMgPSBPYmplY3QuZW50cmllcyhzZXR0aW5ncy5wcm9maWxlcyA/PyB7fSlcbiAgICAgIC5maWx0ZXIoKFssIHByb2ZpbGVdKSA9PiBwcm9maWxlPy5wcm92aWRlcnMpXG4gICAgICAubWFwKChbbmFtZV0pID0+IG5hbWUpO1xuICAgIGlmIChwcm9maWxlc1dpdGhQcm92aWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGBkZWNsYXJlcyB1bnN1cHBvcnRlZCBwcm9maWxlLXNwZWNpZmljIHByb3ZpZGVyczogJHtwcm9maWxlc1dpdGhQcm92aWRlcnMuam9pbignLCAnKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJ2Nhbm5vdCBiZSBwYXJzZWQgYXMgVE9NTCc7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgW3Byb3ZpZGVycy5hZ2VdLnJlY2lwaWVudHMgb2YgYSBmbm94LnRvbWwsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBjb25maWcgZGVjbGFyZXMgbm9cbiAqIGFnZSBwcm92aWRlciAobmVzdGVkIGNvbmZpZ3MgdGhlbiBpbmhlcml0IHRoZSByb290IG9uZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRm5veEFnZVJlY2lwaWVudHMoZm5veFRvbWxDb250ZW50OiBzdHJpbmcpOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShmbm94VG9tbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICAgIGlmICghc2V0dGluZ3MucHJvdmlkZXJzPy5hZ2UpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjaXBpZW50cyA9IHNldHRpbmdzLnByb3ZpZGVycy5hZ2UucmVjaXBpZW50cztcbiAgICByZXR1cm4gbmV3IFNldChBcnJheS5pc0FycmF5KHJlY2lwaWVudHMpID8gcmVjaXBpZW50cy5maWx0ZXIoKHIpOiByIGlzIHN0cmluZyA9PiB0eXBlb2YgciA9PT0gJ3N0cmluZycpIDogW10pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBBbiB1bnBhcnNhYmxlIGZub3gudG9tbCB5aWVsZHMgbm8gcmVjaXBpZW50cywgc28gdGhlIGNhbGxlciByZXBvcnRzIGFuIGVycm9yLlxuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cbn1cblxudHlwZSBGbm94UmVwb3NpdG9yeUlkZW50aXR5ID0gUGljazxQYWNrYWdlQ29uZmlnLCAncmVwb0F1dGhvcicgfCAncmVwb05hbWUnIHwgJ2lzUHVibGljUmVwbycgfCAnaXNSZXBvVmlzaWJpbGl0eUtub3duJz47XG5cbi8qKlxuICogVGhlIEdpdEh1YiBzZWNyZXQgaG9sZGluZyB0aGUgcHJpdmF0ZSBrZXkgb2YgdGhlIENJIGlkZW50aXR5IHNjb3BlZCB0byB0aGUgcmVwb3NpdG9yeSwgb3JcbiAqIHVuZGVmaW5lZCB3aGVuIG5vbmUgaXMgKGFuIHVua25vd24gdmlzaWJpbGl0eSwgb3IgYSByZXBvc2l0b3J5IG5vIENJIHNjb3BlIGNvdmVycykuIFRoZSBzaW5nbGVcbiAqIHNvdXJjZSBvZiB0cnV0aCBzaGFyZWQgYnkgdGhlIHJlY2lwaWVudCBzeW5jIGFuZCB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3MgY2FsbGVyIG1hcHBpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUoXG4gIGNvbmZpZzogRm5veFJlcG9zaXRvcnlJZGVudGl0eVxuKTogJ0ZOT1hfQUdFX0tFWScgfCAnUFVCTElDX0ZOT1hfQUdFX0tFWScgfCB1bmRlZmluZWQge1xuICBjb25zdCBjaVByaW5jaXBhbDogRm5veEFnZVByaW5jaXBhbCB8IHVuZGVmaW5lZCA9IEZOT1hfQUdFX1BSSU5DSVBBTFMuZmluZChcbiAgICAocHJpbmNpcGFsOiBGbm94QWdlUHJpbmNpcGFsKSA9PlxuICAgICAgcHJpbmNpcGFsLmNpQWdlS2V5U2VjcmV0TmFtZSAmJiBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShwcmluY2lwYWwucmVwb3NpdG9yeVNjb3BlLCBjb25maWcpXG4gICk7XG4gIHJldHVybiBjaVByaW5jaXBhbD8uY2lBZ2VLZXlTZWNyZXROYW1lO1xufVxuXG4vKiogV2hldGhlciB0aGUgcmVjaXBpZW50IHNldCBkaWZmZXJzIGJldHdlZW4gdGhlIHB1YmxpYyBhbmQgcHJpdmF0ZSByZWFkaW5nIG9mIHRoZSByZXBvc2l0b3J5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvZXNGbm94UmVjaXBpZW50U2V0RGVwZW5kT25WaXNpYmlsaXR5KFxuICByb290Q29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdyZXBvQXV0aG9yJyB8ICdyZXBvTmFtZSc+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgcHVibGljS2V5c0ZvciA9IChpc1B1YmxpY1JlcG86IGJvb2xlYW4pOiBzdHJpbmcgPT5cbiAgICBnZXRGbm94QWdlUmVjaXBpZW50cyh7IC4uLnJvb3RDb25maWcsIGlzUHVibGljUmVwbywgaXNSZXBvVmlzaWJpbGl0eUtub3duOiB0cnVlIH0pXG4gICAgICAubWFwKCh7IHB1YmxpY0tleSB9KSA9PiBwdWJsaWNLZXkpXG4gICAgICAuam9pbignXFxuJyk7XG4gIHJldHVybiBwdWJsaWNLZXlzRm9yKHRydWUpICE9PSBwdWJsaWNLZXlzRm9yKGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZub3hBZ2VSZWNpcGllbnRzKHJvb3RDb25maWc6IEZub3hSZXBvc2l0b3J5SWRlbnRpdHkpOiBGbm94QWdlUmVjaXBpZW50W10ge1xuICByZXR1cm4gRk5PWF9BR0VfUFJJTkNJUEFMUy5maWx0ZXIoKHByaW5jaXBhbCkgPT5cbiAgICBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShwcmluY2lwYWwucmVwb3NpdG9yeVNjb3BlLCByb290Q29uZmlnKVxuICApLmZsYXRNYXAoKHByaW5jaXBhbCkgPT5cbiAgICBwcmluY2lwYWwucHVibGljS2V5cy5tYXAoKHB1YmxpY0tleSwgaW5kZXgpID0+ICh7XG4gICAgICBuYW1lOiBwcmluY2lwYWwucHVibGljS2V5cy5sZW5ndGggPT09IDEgPyBwcmluY2lwYWwubmFtZSA6IGAke3ByaW5jaXBhbC5uYW1lfSR7aW5kZXggKyAxfWAsXG4gICAgICBwdWJsaWNLZXksXG4gICAgfSkpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShzY29wZTogRm5veFJlcG9zaXRvcnlTY29wZSwgcmVwb3NpdG9yeTogRm5veFJlcG9zaXRvcnlJZGVudGl0eSk6IGJvb2xlYW4ge1xuICBjb25zdCBvd25lciA9IHJlcG9zaXRvcnkucmVwb0F1dGhvcj8udG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbmFtZSA9IHJlcG9zaXRvcnkucmVwb05hbWU/LnRvTG93ZXJDYXNlKCk7XG4gIGlmICghb3duZXIgfHwgIW5hbWUpIHJldHVybiBmYWxzZTtcblxuICAvLyBBbiB1bmtub3duIHZpc2liaWxpdHkgKGZhaWxlZCBHaXRIdWIgbG9va3VwKSBtYXRjaGVzIG5vIHZpc2liaWxpdHktY29uc3RyYWluZWQgc2NvcGU6IGNhbGxlcnNcbiAgLy8gdGhhdCB3b3VsZCByZXdyaXRlIHJlY2lwaWVudHMgZmFpbCBpbnN0ZWFkIG9mIGVuY3J5cHRpbmcgdG8gdGhlIHdyb25nIENJIGlkZW50aXR5LlxuICBpZiAoXG4gICAgc2NvcGUudmlzaWJpbGl0eSAmJlxuICAgICghcmVwb3NpdG9yeS5pc1JlcG9WaXNpYmlsaXR5S25vd24gfHwgKHNjb3BlLnZpc2liaWxpdHkgPT09ICdwdWJsaWMnKSAhPT0gcmVwb3NpdG9yeS5pc1B1YmxpY1JlcG8pXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgKHNjb3BlLm9yZ2FuaXphdGlvbnM/LnNvbWUoKG9yZ2FuaXphdGlvbikgPT4gb3JnYW5pemF0aW9uLnRvTG93ZXJDYXNlKCkgPT09IG93bmVyKSA/PyBmYWxzZSkgfHxcbiAgICAoc2NvcGUucmVwb3NpdG9yaWVzPy5zb21lKChmdWxsTmFtZSkgPT4gZnVsbE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYCR7b3duZXJ9LyR7bmFtZX1gKSA/PyBmYWxzZSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUFnZVJlY2lwaWVudHMoY29udGVudDogc3RyaW5nLCBhZ2VSZWNpcGllbnRzOiByZWFkb25seSBGbm94QWdlUmVjaXBpZW50W10pOiBzdHJpbmcge1xuICAvLyBUcmFpbGluZyBuYW1lIGNvbW1lbnRzIGxldCBodW1hbnMgdGVsbCB3aG9zZSBrZXkgZWFjaCByZWNpcGllbnQgaXMgd2l0aG91dCBjb25zdWx0aW5nIHdiZnkuXG4gIGNvbnN0IHJlY2lwaWVudHNUZXh0ID0gYHJlY2lwaWVudHMgPSBbXFxuJHthZ2VSZWNpcGllbnRzXG4gICAgLm1hcCgocmVjaXBpZW50KSA9PiBgICBcIiR7cmVjaXBpZW50LnB1YmxpY0tleX1cIiwgIyAke3JlY2lwaWVudC5uYW1lfWApXG4gICAgLmpvaW4oJ1xcbicpfVxcbl1gO1xuICAvLyB3YmZ5IHdyaXRlcyBhIFtwcm92aWRlcnMuYWdlXSB0YWJsZSAocG9zc2libHkgd2l0aCBhIHRyYWlsaW5nIGNvbW1lbnQpLiBTY2FuIGxpbmUtd2lzZSBzbyB0aGF0XG4gIC8vIGEgYFtgIGluc2lkZSBhIGNvbW1lbnQgb3IgYSBzdHJpbmcgbmV2ZXIgdGVybWluYXRlcyB0aGUgdGFibGUgZWFybHk7IHRoZSB0YWJsZSBlbmRzIGF0IHRoZVxuICAvLyBuZXh0IGxpbmUtc3RhcnQgdGFibGUgaGVhZGVyLiBUaGUgYXNzaWdubWVudCBtYXRjaCBpcyBsaW5lLWFuY2hvcmVkIHNvIGEgY29tbWVudGVkLW91dFxuICAvLyBgIyByZWNpcGllbnRzID0gWy4uLl1gIGlzIG5ldmVyIG1pc3Rha2VuIGZvciB0aGUgcmVhbCBvbmUsIHdoaWxlIG11bHRpbGluZSBhcnJheXMgc3RpbGwgbWF0Y2hcbiAgLy8gYmVjYXVzZSB0aGUgbmVnYXRlZCBjbGFzcyBbXlxcXV0gKHVubGlrZSBgLmApIHNwYW5zIG5ld2xpbmVzLiBBbnkgb3RoZXIgc3BlbGxpbmcgZmFsbHMgdGhyb3VnaFxuICAvLyB0byB0aGUgY2FsbGVyJ3MgcmUtcGFyc2UgdmFsaWRhdGlvbiwgd2hpY2ggZmFpbHMgdGhlIHJ1biBzYWZlbHkgd2l0aCBpbnN0cnVjdGlvbnMgaW5zdGVhZCBvZlxuICAvLyBjb3JydXB0aW5nIHRoZSBmaWxlLlxuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBoZWFkZXJJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gL15cXHMqXFxbcHJvdmlkZXJzXFwuYWdlXFxdXFxzKig/OiMuKik/JC91LnRlc3QobGluZSkpO1xuICBpZiAoaGVhZGVySW5kZXggIT09IC0xKSB7XG4gICAgbGV0IGVuZEluZGV4ID0gbGluZXMubGVuZ3RoO1xuICAgIGZvciAobGV0IGluZGV4ID0gaGVhZGVySW5kZXggKyAxOyBpbmRleCA8IGxpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKC9eXFxzKlxcWy91LnRlc3QobGluZXNbaW5kZXhdID8/ICcnKSkge1xuICAgICAgICBlbmRJbmRleCA9IGluZGV4O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VjdGlvbiA9IGxpbmVzLnNsaWNlKGhlYWRlckluZGV4LCBlbmRJbmRleCkuam9pbignXFxuJyk7XG4gICAgY29uc3QgcmVwbGFjZWRTZWN0aW9uID0gc2VjdGlvbi5yZXBsYWNlKC9eXFxzKnJlY2lwaWVudHNcXHMqPVxccypcXFtbXlxcXV0qXFxdL211LCByZWNpcGllbnRzVGV4dCk7XG4gICAgY29uc3QgbmV3U2VjdGlvbiA9XG4gICAgICByZXBsYWNlZFNlY3Rpb24gPT09IHNlY3Rpb25cbiAgICAgICAgPyBbbGluZXNbaGVhZGVySW5kZXhdLCByZWNpcGllbnRzVGV4dCwgLi4ubGluZXMuc2xpY2UoaGVhZGVySW5kZXggKyAxLCBlbmRJbmRleCldLmpvaW4oJ1xcbicpXG4gICAgICAgIDogcmVwbGFjZWRTZWN0aW9uO1xuICAgIHJldHVybiBbLi4ubGluZXMuc2xpY2UoMCwgaGVhZGVySW5kZXgpLCBuZXdTZWN0aW9uLCAuLi5saW5lcy5zbGljZShlbmRJbmRleCldLmpvaW4oJ1xcbicpO1xuICB9XG4gIHJldHVybiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5bcHJvdmlkZXJzLmFnZV1cXG50eXBlID0gXCJhZ2VcIlxcbiR7cmVjaXBpZW50c1RleHR9XFxuYDtcbn1cblxuLy8gUmUtZW5jcnlwdHMgdGhlIGJhc2Ugc2VjcmV0cyBhbmQgZWFjaCBwcm9maWxlJ3Mgb3duIHNlY3JldHMgKC0tbm8tZGVmYXVsdHMga2VlcHMgdGhlIG1lcmdlZFxuLy8gYmFzZSBzZWNyZXRzIGZyb20gYmVpbmcgZHVwbGljYXRlZCBpbnRvIHByb2ZpbGUgdGFibGVzKSBmb3IgdGhlIGN1cnJlbnQgcmVjaXBpZW50IHNldC4gVGhlXG4vLyBzcGF3bmVkIGZub3ggcnVucyB3aXRoIGFuIGlzb2xhdGVkIEhPTUUvWERHX0NPTkZJR19IT01FIGJlY2F1c2UgZm5veCBtZXJnZXMgdGhlIHVzZXItZ2xvYmFsXG4vLyB+Ly5jb25maWcvZm5veC9jb25maWcudG9tbCBpbnRvIGV2ZXJ5IHByb2plY3QgY29uZmlnIOKAlCBhIHBsYWluIHJlZW5jcnlwdCB3b3VsZCByZXdyaXRlIHRoZVxuLy8gdXNlcidzIGdsb2JhbCBzZWNyZXRzIHRvby4gRGVjcnlwdGlvbiB0aGVyZWZvcmUgbmVlZHMgdGhlIHBlcnNvbmFsIGlkZW50aXR5IHBhc3NlZCBleHBsaWNpdGx5XG4vLyB2aWEgRk5PWF9BR0VfS0VZOyBGTk9YX1BST0ZJTEUgaXMgc3RyaXBwZWQgc28gaXQgY2Fubm90IHJlZGlyZWN0IHRoZSBiYXNlIChubyAtUCkgcnVuLlxuZnVuY3Rpb24gcmVlbmNyeXB0Rm5veFNlY3JldHMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nLCBwcm9maWxlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIFRoZSBpZGVudGl0eSBpcyBvcHRpb25hbDogYSBwbGFpbnRleHQtb25seSBjb25maWcgaGFzIG5vdGhpbmcgdG8gZGVjcnlwdCBhbmQgZm5veCBzdWNjZWVkc1xuICAvLyB3aXRob3V0IG9uZSwgd2hpbGUgZXhpc3RpbmcgY2lwaGVydGV4dHMgbWFrZSBmbm94IGZhaWwgbG91ZGx5IG9uIGl0cyBvd24uXG4gIGNvbnN0IGlkZW50aXR5ID0gcmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KCkgPz8gcHJvY2Vzcy5lbnYuRk5PWF9BR0VfS0VZO1xuICBjb25zdCBmbm94Q29tbWFuZCA9IHJlc29sdmVGbm94Q29tbWFuZChkaXJQYXRoKTtcbiAgY29uc3QgaXNvbGF0ZWRIb21lRGlyUGF0aCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diZnktZm5veC1ob21lLScpKTtcbiAgdHJ5IHtcbiAgICAvLyBIaWRlIHRoZSBsb2NhbCBvdmVycmlkZXMgb2YgRVZFUlkgZGlyZWN0b3J5IGZub3ggbWVyZ2VzIGhpZXJhcmNoaWNhbGx5IChmcm9tIHRoZSBjb21tYW5kXG4gICAgLy8gZGlyZWN0b3J5IHVwIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QpOiBhbiBhbmNlc3RvcidzIGZub3gubG9jYWwudG9tbCB3b3VsZCBvdGhlcndpc2Ugc2hhZG93XG4gICAgLy8gY29tbWl0dGVkIHNlY3JldHMgb3IgaXRzZWxmIGdldCByZXdyaXR0ZW4gYnkgdGhlIHJlLWVuY3J5cHRpb24uXG4gICAgcmV0dXJuIHdpdGhGbm94TG9jYWxzSGlkZGVuKHJvb3REaXJQYXRoLCBsaXN0QW5jZXN0b3JEaXJQYXRocyhkaXJQYXRoLCByb290RGlyUGF0aCksICgpID0+IHtcbiAgICAgIGNvbnN0IGVudiA9IHtcbiAgICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHByb2Nlc3MuZW52KS5maWx0ZXIoKFtrZXldKSA9PiAha2V5LnN0YXJ0c1dpdGgoJ0ZOT1hfJykpKSxcbiAgICAgICAgLi4uKGlkZW50aXR5ID8geyBGTk9YX0FHRV9LRVk6IGlkZW50aXR5IH0gOiB7fSksXG4gICAgICAgIEhPTUU6IGlzb2xhdGVkSG9tZURpclBhdGgsXG4gICAgICAgIFhER19DT05GSUdfSE9NRTogaXNvbGF0ZWRIb21lRGlyUGF0aCxcbiAgICAgIH07XG4gICAgICBjb25zdCBwcm9maWxlQXJnc0xpc3QgPSBbW10sIC4uLnByb2ZpbGVOYW1lcy5tYXAoKG5hbWUpID0+IFsnLS1uby1kZWZhdWx0cycsIGAtLXByb2ZpbGU9JHtuYW1lfWBdKV07XG4gICAgICBmb3IgKGNvbnN0IHByb2ZpbGVBcmdzIG9mIHByb2ZpbGVBcmdzTGlzdCkge1xuICAgICAgICBjb25zdCBhcmdzID0gWydyZWVuY3J5cHQnLCAnLS1mb3JjZScsICctLW5vLWRhZW1vbicsICctLXByb3ZpZGVyJywgJ2FnZScsIC4uLnByb2ZpbGVBcmdzXTtcbiAgICAgICAgY29uc29sZS5sb2coYCQgJHtmbm94Q29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX0gYXQgJHtkaXJQYXRofWApO1xuICAgICAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoZm5veENvbW1hbmQsIGFyZ3MsIHtcbiAgICAgICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgICAgIGVudixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgocHJvYy5zdGF0dXMgPz8gMSkgIT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyhpc29sYXRlZEhvbWVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgYWN0dWFsIGZub3ggYmluYXJ5LiBgZm5veGAgb24gUEFUSCBpcyBvZnRlbiBhIG1pc2Ugc2hpbSwgYW5kIG1pc2UgcmVmdXNlcyB0byBydW5cbiAqIG9uY2UgSE9NRS9YREdfQ09ORklHX0hPTUUgcG9pbnQgYXQgdGhlIGlzb2xhdGVkIGRpcmVjdG9yeSAoaXRzIHRydXN0IHN0YXRlIGRpc2FwcGVhcnMpLCBzbyB0aGVcbiAqIGlzb2xhdGVkIHNwYXducyBuZWVkIHRoZSBzaGltIHJlc29sdmVkIHRvIHRoZSByZWFsIGV4ZWN1dGFibGUgYmVmb3JlaGFuZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUZub3hDb21tYW5kKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnbWlzZScsIFsnd2hpY2gnLCAnZm5veCddLCB7IGN3ZDogZGlyUGF0aCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwcm9jLnN0YXR1cyA9PT0gMCA/IHByb2Muc3Rkb3V0LnRyaW0oKSA6ICcnO1xuICByZXR1cm4gcmVzb2x2ZWQgfHwgJ2Zub3gnO1xufVxuXG4vLyBUaGUgcGVyc29uYWwgaWRlbnRpdHkgZmlsZSBpcyBtYWNoaW5lLWdsb2JhbCwgc28gaXQgaXMgcmVhZCBvbmNlIHBlciBwcm9jZXNzLlxubGV0IGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSA9IGZhbHNlO1xubGV0IGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHJlYWRQZXJzb25hbEFnZVNlY3JldEtleSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaGFzUmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KSByZXR1cm4gY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk7XG4gIGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSA9IHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNvbmZpZycsICdmbm94JywgJ2FnZS50eHQnKSwgJ3V0ZjgnKTtcbiAgICBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleSA9IGNvbnRlbnRcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maW5kKChsaW5lKSA9PiBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCdBR0UtU0VDUkVULUtFWS0nKSlcbiAgICAgID8udHJpbSgpO1xuICB9IGNhdGNoIHtcbiAgICBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk7XG59XG5cbi8qKlxuICogUnVucyBhIGZ1bmN0aW9uIHdoaWxlIHRoZSBtYWNoaW5lLWxvY2FsIGZub3gubG9jYWwudG9tbCBmaWxlcyBvZiB0aGUgZ2l2ZW4gZGlyZWN0b3JpZXMgYXJlXG4gKiB0ZW1wb3JhcmlseSBtb3ZlZCBhc2lkZTogZm5veCBsb2FkcyB0aGVtIGF0IGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBjb21taXR0ZWQgZm5veC50b21sLCBzbyBhXG4gKiBsb2NhbCBvdmVycmlkZSBzaGFkb3dpbmcgYSBjb21taXR0ZWQgc2VjcmV0IHdvdWxkIG1ha2UgYGZub3ggcmVlbmNyeXB0YCBza2lwIHRoYXQgc2VjcmV0LlxuICovXG5mdW5jdGlvbiB3aXRoRm5veExvY2Fsc0hpZGRlbjxUPihyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoczogc3RyaW5nW10sIGZ1bmM6ICgpID0+IFQpOiBUIHtcbiAgY29uc3QgaGlkZGVuRGlyUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICByZWNvdmVyU3RhbGVGbm94TG9jYWxCYWNrdXAocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICAgICAgY29uc3QgbG9jYWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICAgICAgY29uc3QgYmFja3VwUGF0aCA9IGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICAgICAgICBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoLCBiYWNrdXBQYXRoKTtcbiAgICAgICAgZnMucmVuYW1lU3luYyhsb2NhbFBhdGgsIGJhY2t1cFBhdGgpO1xuICAgICAgICBoaWRkZW5EaXJQYXRocy5wdXNoKGRpclBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBmdW5jKCk7XG4gICAgLy8gQSByZXN0b3JhdGlvbiBjb25mbGljdCB0aHJvd3MgaGVyZSBhbmQgdGhlcmVieSBpbnZhbGlkYXRlcyB0aGUgc2VlbWluZ2x5IHN1Y2Nlc3NmdWwgcmVzdWx0OlxuICAgIC8vIGEgcmVjcmVhdGVkIG92ZXJyaWRlIG1heSBoYXZlIHNoYWRvd2VkIGNvbW1pdHRlZCBzZWNyZXRzIGR1cmluZyB0aGUgZm5veCBydW4sIHNvIHRoZSBvdXRlclxuICAgIC8vIHRyYW5zYWN0aW9uIG11c3QgcmVzdG9yZSBldmVyeSBjb21taXR0ZWQgZm5veC50b21sIGluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgbWlncmF0aW9uLlxuICAgIHJlc3RvcmVIaWRkZW5Gbm94TG9jYWxzKHJvb3REaXJQYXRoLCBoaWRkZW5EaXJQYXRocyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBUaGUgb3JpZ2luYWwgZmFpbHVyZSBtdXN0IHdpbjsgYSByZXN0b3JhdGlvbiBjb25mbGljdCBvbiB0aGlzIHBhdGggaXMgb25seSByZXBvcnRlZCBzbyBpdFxuICAgIC8vIGNhbm5vdCBtYXNrIHRoZSByb290IGNhdXNlLlxuICAgIHRyeSB7XG4gICAgICByZXN0b3JlSGlkZGVuRm5veExvY2Fscyhyb290RGlyUGF0aCwgaGlkZGVuRGlyUGF0aHMpO1xuICAgIH0gY2F0Y2ggKHJlc3RvcmVFcnJvcikge1xuICAgICAgZmFpbEZub3hTeW5jKChyZXN0b3JlRXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IFN0cmluZyhyZXN0b3JlRXJyb3IpKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLy8gTW92ZXMgdGhlIGhpZGRlbiBmbm94LmxvY2FsLnRvbWwgZmlsZXMgYmFjaywgY2xlYXJpbmcgdGhlIGdpdmVuIGxpc3Qgc28gYSBzZWNvbmQgY2FsbCBpcyBhXG4vLyBuby1vcC4gTmV2ZXIgY2xvYmJlcnMgYSBmbm94LmxvY2FsLnRvbWwgcmVjcmVhdGVkIChlLmcuIGJ5IGFuIGVkaXRvcikgd2hpbGUgZm5veCB3YXMgcnVubmluZzpcbi8vIHRoZSBiYWNrdXAgaXMga2VwdCBhbmQgcmVwb3J0ZWQgZm9yIGEgbWFudWFsIG1lcmdlLlxuZnVuY3Rpb24gcmVzdG9yZUhpZGRlbkZub3hMb2NhbHMocm9vdERpclBhdGg6IHN0cmluZywgaGlkZGVuRGlyUGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGNvbmZsaWN0aW5nTG9jYWxQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGhpZGRlbkRpclBhdGhzLnNwbGljZSgwKSkge1xuICAgIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgICAgY29uZmxpY3RpbmdMb2NhbFBhdGhzLnB1c2gobG9jYWxQYXRoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmcy5yZW5hbWVTeW5jKGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpLCBsb2NhbFBhdGgpO1xuICB9XG4gIGlmIChjb25mbGljdGluZ0xvY2FsUGF0aHMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgZm9sbG93aW5nIGZub3gubG9jYWwudG9tbCBmaWxlcyB3ZXJlIHJlY3JlYXRlZCB3aGlsZSBmbm94IHdhcyBydW5uaW5nIChvcmlnaW5hbCBmaWxlcyBhcmUgcHJlc2VydmVkIHVuZGVyICR7cGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnLnRtcCcsICd3YmZ5LWZub3gtbG9jYWwtYmFja3VwJyl9IOKAlCBtZXJnZSB0aGVtIG1hbnVhbGx5KTogJHtjb25mbGljdGluZ0xvY2FsUGF0aHMuam9pbignLCAnKX1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc3RvcmVzIGEgZm5veC5sb2NhbC50b21sIGJhY2t1cCBsZWZ0IGJ5IGFuIGludGVycnVwdGVkIGVhcmxpZXIgcnVuIHNvIHRoZSB1c2VyJ3MgbG9jYWxcbiAqIG92ZXJyaWRlcyBhcmUgbmV2ZXIgc2lsZW50bHkgbG9zdC5cbiAqL1xuZnVuY3Rpb24gcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICBjb25zdCBiYWNrdXBQYXRoID0gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhiYWNrdXBQYXRoKSkgcmV0dXJuO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBCb3RoICR7bG9jYWxQYXRofSBhbmQgaXRzIGJhY2t1cCAke2JhY2t1cFBhdGh9IGV4aXN0OyByZXNvbHZlIHRoZSBsZWZ0b3ZlciBiYWNrdXAgbWFudWFsbHkuYCk7XG4gIH1cbiAgZW5zdXJlU2FmZUZub3hMb2NhbEJhY2t1cERpcihyb290RGlyUGF0aCwgYmFja3VwUGF0aCk7XG4gIGZzLnJlbmFtZVN5bmMoYmFja3VwUGF0aCwgbG9jYWxQYXRoKTtcbn1cblxuLy8gQ3JlYXRlcyB0aGUgYmFja3VwIGRpcmVjdG9yeSBhbmQgcHJvdmVzIG5vIHBhdGggY29tcG9uZW50IGJlbG93IHRoZSByZXBvc2l0b3J5IHJvb3QgaXMgYVxuLy8gc3ltbGluazogYSByZXBvc2l0b3J5LWNvbnRyb2xsZWQgc3ltbGluayAoZS5nLiBhIHRyYWNrZWQgLnRtcC93YmZ5LWZub3gtbG9jYWwtYmFja3VwIGxpbmspXG4vLyBjb3VsZCBvdGhlcndpc2UgbW92ZSB0aGUgcGxhaW50ZXh0IGxvY2FsIHNlY3JldHMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgb3IgcmVzb2x2ZSB0aGUgYmFja3VwXG4vLyBiYWNrIG9udG8gdGhlIHNvdXJjZSBmaWxlIGFuZCB0dXJuIHRoZSBoaWRlIHJlbmFtZSBpbnRvIGEgbm8tb3AuXG5mdW5jdGlvbiBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoOiBzdHJpbmcsIGJhY2t1cFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBiYWNrdXBEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGJhY2t1cFBhdGgpO1xuICBmcy5ta2RpclN5bmMoYmFja3VwRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGV4cGVjdGVkUmVhbFBhdGggPSBwYXRoLmpvaW4oZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKSwgcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgYmFja3VwRGlyUGF0aCkpO1xuICBpZiAoZnMucmVhbHBhdGhTeW5jKGJhY2t1cERpclBhdGgpICE9PSBleHBlY3RlZFJlYWxQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2JhY2t1cERpclBhdGh9IHJlc29sdmVzIHRocm91Z2ggYSBzeW1saW5rOyByZW1vdmUgdGhlIHN5bWxpbmtlZCBjb21wb25lbnQuYCk7XG4gIH1cbn1cblxuLy8gVGhlIGJhY2t1cCBsaXZlcyB1bmRlciB0aGUgZ2l0aWdub3JlZCAudG1wIHNvIGEgaGlkZGVuIGZub3gubG9jYWwudG9tbCBjYW4gbmV2ZXIgYmVjb21lXG4vLyBzdGFnZWFibGUgKGEgc2libGluZyByZW5hbWUgbGlrZSBmbm94LmxvY2FsLnRvbWwud2JmeS1iYWsgd291bGQgbm8gbG9uZ2VyIG1hdGNoIHRoZSBkb2N1bWVudGVkXG4vLyBgZm5veC5sb2NhbC50b21sYCBpZ25vcmUgZW50cnkgYW5kIGNvdWxkIGJlIGNvbW1pdHRlZCBieSBgZ2l0IGFkZCAtQWApLlxuZnVuY3Rpb24gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5yZXNvbHZlKFxuICAgIHJvb3REaXJQYXRoLFxuICAgICcudG1wJyxcbiAgICAnd2JmeS1mbm94LWxvY2FsLWJhY2t1cCcsXG4gICAgcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgZGlyUGF0aCksXG4gICAgJ2Zub3gubG9jYWwudG9tbCdcbiAgKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVNaWdyYXRpb25NYXJrZXIoKTogdm9pZCB7XG4gIGlmICghbWlncmF0aW9uTWFya2VyUGF0aCB8fCBtaWdyYXRpb25NYXJrZXJPd25lZCkgcmV0dXJuO1xuICBjb25zdCB0bXBEaXJQYXRoID0gcGF0aC5kaXJuYW1lKG1pZ3JhdGlvbk1hcmtlclBhdGgpO1xuICBmcy5ta2RpclN5bmModG1wRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIC8vIFJlZnVzZSB0byB3cml0ZSB0aHJvdWdoIHN5bWxpbmtzOiBhIHJlcG9zaXRvcnktY29udHJvbGxlZCAudG1wIHN5bWxpbmsgY291bGQgb3RoZXJ3aXNlXG4gIC8vIHJlZGlyZWN0IHRoZSBtYXJrZXIgd3JpdGUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS4gVGhlIGB3eGAgZmxhZyBtYWtlcyB0aGUgb3BlbiBpdHNlbGYgZmFpbFxuICAvLyBvbiBhbnkgcHJlLWV4aXN0aW5nIHBhdGgsIGluY2x1ZGluZyBhIGRhbmdsaW5nIHN5bWxpbmsg4oCUIHdoaWNoIGFsc28gYWNxdWlyZXMgdGhlIG1hcmtlclxuICAvLyBhdG9taWNhbGx5LCBzbyBhIGNvbmN1cnJlbnQgd2JmeSBydW4gY2Fubm90IHN0YXJ0IGEgc2Vjb25kIG1pZ3JhdGlvbi5cbiAgaWYgKGZzLmxzdGF0U3luYyh0bXBEaXJQYXRoKS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RtcERpclBhdGh9IGlzIGEgc3ltbGluazsgcmVwbGFjZSBpdCB3aXRoIGEgcmVndWxhciBkaXJlY3RvcnkuYCk7XG4gIH1cbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgbWlncmF0aW9uTWFya2VyUGF0aCxcbiAgICAgICd3YmZ5IGZub3ggbWlncmF0aW9uIGluIHByb2dyZXNzOyBhIGxlZnRvdmVyIG1hcmtlciBibG9ja3MgbmV3IG1pZ3JhdGlvbnNcXG4nLFxuICAgICAge1xuICAgICAgICBmbGFnOiAnd3gnLFxuICAgICAgfVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBbm90aGVyIHdiZnkgcHJvY2VzcyBhcHBlYXJzIHRvIGJlIG1pZ3JhdGluZyAoJHttaWdyYXRpb25NYXJrZXJQYXRofSBleGlzdHMpOiAke2Vycm9yfWApO1xuICB9XG4gIG1pZ3JhdGlvbk1hcmtlck93bmVkID0gdHJ1ZTtcbn1cblxuLy8gT25seSB0aGUgcnVuIHRoYXQgYWNxdWlyZWQgdGhlIG1hcmtlciBtYXkgcmVtb3ZlIGl0OiBkZWxldGluZyBhIGZvcmVpZ24gbWFya2VyIHdvdWxkIGRpc2FibGVcbi8vIGludGVycnVwdGVkLW1pZ3JhdGlvbiBkZXRlY3Rpb24gZm9yIGEgY29uY3VycmVudGx5IHJ1bm5pbmcgd2JmeS5cbmZ1bmN0aW9uIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk6IHZvaWQge1xuICBpZiAoIW1pZ3JhdGlvbk1hcmtlck93bmVkIHx8ICFtaWdyYXRpb25NYXJrZXJQYXRoKSByZXR1cm47XG4gIGZzLnJtU3luYyhtaWdyYXRpb25NYXJrZXJQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICBtaWdyYXRpb25NYXJrZXJPd25lZCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90czogTWFwPHN0cmluZywgc3RyaW5nPik6IGJvb2xlYW4ge1xuICBsZXQgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGNvbnRlbnRdIG9mIHNuYXBzaG90cykge1xuICAgIHRyeSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gcmVzdG9yZSAke2ZpbGVQYXRofSBhZnRlciBhIGZhaWxlZCBtaWdyYXRpb246ICR7ZXJyb3J9YCk7XG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1Y2NlZWRlZDtcbn1cblxuZnVuY3Rpb24gZmFpbEZub3hTeW5jKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgZm5veFN5bmNGYWlsZWQgPSB0cnVlO1xufVxuXG4vLyBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgYW4gdW5zdXBwb3J0ZWQgZm5veC5sb2NhbC50b21sIGluIHRoZSBkaXJlY3RvcnksIG9yIHVuZGVmaW5lZC4gTG9jYWxcbi8vIG92ZXJyaWRlcyBtYXkgb25seSBob2xkIG1hY2hpbmUtbG9jYWwgc2VjcmV0IHZhbHVlczsgaW1wb3J0cyBvciBwcm92aWRlciAocmUpZGVmaW5pdGlvbnMgd291bGRcbi8vIHNpbGVudGx5IGNoYW5nZSB3aGljaCByZWNpcGllbnQgc2V0IGdvdmVybnMgcmUtZW5jcnlwdGlvbi5cbmZ1bmN0aW9uIGZpbmRGbm94TG9jYWxUb21sSXNzdWUoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbG9jYWxUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhsb2NhbFRvbWxQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbG9jYWxTZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhsb2NhbFRvbWxQYXRoLCAndXRmOCcpKSBhcyBGbm94VG9tbDtcbiAgY29uc3QgZGVmaW5lc1Byb3ZpZGVycyA9XG4gICAgbG9jYWxTZXR0aW5ncy5pbXBvcnQgIT09IHVuZGVmaW5lZCB8fFxuICAgIGxvY2FsU2V0dGluZ3MucHJvdmlkZXJzICE9PSB1bmRlZmluZWQgfHxcbiAgICBPYmplY3QudmFsdWVzKGxvY2FsU2V0dGluZ3MucHJvZmlsZXMgPz8ge30pLnNvbWUoKHByb2ZpbGUpID0+IHByb2ZpbGU/LnByb3ZpZGVycyAhPT0gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIGRlZmluZXNQcm92aWRlcnMgPyBgJHtsb2NhbFRvbWxQYXRofSBkZWZpbmVzIGltcG9ydHMsIHByb3ZpZGVycywgb3IgcHJvZmlsZSBwcm92aWRlcnNgIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIExpc3RzIGV2ZXJ5IGRpcmVjdG9yeSBjb250YWluaW5nIGEgY29tbWl0dGVkIChvciBjb21taXR0YWJsZSkgZm5veC50b21sIGFtb25nIHRoZSBnaXZlblxuICogZ2l0LWRpc2NvdmVyZWQgY29uZmlnIHBhdGhzIChzZWUgbGlzdEZub3hMaWtlRmlsZVBhdGhzOiBnaXQtYmFzZWQgZGlzY292ZXJ5IGV4Y2x1ZGVzIGdpdGlnbm9yZWRcbiAqIHRyZWVzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIHdpdGhvdXQgZXhjbHVkaW5nIGxlZ2l0aW1hdGUgcGFja2FnZXMgbmFtZWQgbGlrZSBidWlsZCBvdXRwdXRzKS5cbiAqL1xuZnVuY3Rpb24gbGlzdEZub3hUb21sRGlyUGF0aHMoZm5veExpa2VGaWxlUGF0aHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBmbm94TGlrZUZpbGVQYXRoc1xuICAgICAgICAuZmlsdGVyKChmaWxlUGF0aCkgPT4gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkgPT09ICdmbm94LnRvbWwnKVxuICAgICAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSlcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGZub3ggY29uZmlnIGRlY2xhcmVzIGl0cyBvd24gYFtwcm92aWRlcnMuYWdlXWAsIGkuZS4gcGFydGljaXBhdGVzIGluIGFnZSBlbmNyeXB0aW9uLlxuICogQSBjb25maWcgd2l0aG91dCBvbmUgZWl0aGVyIGluaGVyaXRzIGEgbWFuYWdlZCByb290J3MgcHJvdmlkZXIgKGhhbmRsZWQgYnkgdGhlIHJvb3QtZXhpc3RzIHBhdGgpXG4gKiBvciwgd2hlbiBubyByb290IGV4aXN0cywgdXNlcyBubyBhZ2UgZW5jcnlwdGlvbiBhdCBhbGwg4oCUIHNvIGl0IG5lZWRzIG5vIHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb25cbiAqIGFuZCBvd25zIG5vIEZOT1hfQUdFX0tFWS5cbiAqL1xuZnVuY3Rpb24gZGVjbGFyZXNGbm94QWdlUHJvdmlkZXIoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhaWwgY2xvc2VkOiBhbiB1bnJlYWRhYmxlIGNvbmZpZyBtaWdodCBkZWNsYXJlIGFuIGFnZSBwcm92aWRlci5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBCb29sZWFuKChCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBGbm94VG9tbCkucHJvdmlkZXJzPy5hZ2UpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWlsIGNsb3NlZDogYW4gdW5wYXJzYWJsZSBjb25maWcgbWlnaHQgZGVjbGFyZSBhbiBhZ2UgcHJvdmlkZXIuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZm5veCBjb25maWcgcGF0aCBsaWVzIGluc2lkZSBhIHRlc3QtZml4dHVyZSB0cmVlICh0ZXN0L2ZpeHR1cmVzLCB0ZXN0LWZpeHR1cmVzLFxuICogX190ZXN0c19fKTogZml4dHVyZSBjb25maWdzIGFyZSB0ZXN0IElOUFVUUywgbm90IHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbi4gZm5veCBuZXZlciBsb2Fkc1xuICogdGhlbSBmb3IgcmVhbCBjb21tYW5kcyAoaGllcmFyY2hpY2FsIGxvYWRpbmcgb25seSB3YWxrcyBjd2QgYW5jZXN0b3JzKSwgcmVjaXBpZW50XG4gKiBzeW5jaHJvbml6YXRpb24gbXVzdCBub3QgcmV3cml0ZSBvciByZS1lbmNyeXB0IHRoZW0gKHNoYXJlZC1saWItbm9kZSdzIHVuZGVjcnlwdGFibGUgZml4dHVyZVxuICogZXhpc3RzIHByZWNpc2VseSB0byBzdGF5IHVuZGVjcnlwdGFibGUpLCBhbmQgYSBmaXh0dXJlIG11c3Qgbm90IGZhaWwgdGhlIHN0cmF5LW5lc3RlZC1jb25maWdcbiAqIGNoZWNrIGluIHJlcG9zaXRvcmllcyB3aXRob3V0IGEgcm9vdCBmbm94LnRvbWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Rlc3RGaXh0dXJlRm5veFBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBgZml4dHVyZXNgIGNvdW50cyBvbmx5IGRpcmVjdGx5IHVuZGVyIGEgdGVzdCBkaXJlY3Rvcnk6IHdiZnkgc3VwcG9ydHMgYXJiaXRyYXJ5IHdvcmtzcGFjZXMsXG4gIC8vIHNvIGEgbGVnaXRpbWF0ZSBgcGFja2FnZXMvZml4dHVyZXMvYCB3b3Jrc3BhY2UgbXVzdCBzdGF5IG1hbmFnZWQgYW5kIHZlcmlmaWVkLlxuICBjb25zdCBzZWdtZW50cyA9IGZpbGVQYXRoLnNwbGl0KCcvJyk7XG4gIHJldHVybiBzZWdtZW50cy5zb21lKFxuICAgIChzZWdtZW50LCBpbmRleCkgPT5cbiAgICAgIHNlZ21lbnQgPT09ICd0ZXN0LWZpeHR1cmVzJyB8fFxuICAgICAgc2VnbWVudCA9PT0gJ19fdGVzdHNfXycgfHxcbiAgICAgIChzZWdtZW50ID09PSAnZml4dHVyZXMnICYmIChzZWdtZW50c1tpbmRleCAtIDFdID09PSAndGVzdCcgfHwgc2VnbWVudHNbaW5kZXggLSAxXSA9PT0gJ3Rlc3RzJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGxpc3RGbm94TGlrZUZpbGVQYXRocyhyb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAvLyAteiBwcmludHMgTlVMLWRlbGltaXRlZCB2ZXJiYXRpbSBwYXRoczsgd2l0aG91dCBpdCwgY29yZS5xdW90ZVBhdGggQy1xdW90ZXMgbm9uLUFTQ0lJIHBhdGhzXG4gIC8vIChlLmcuIFwiXFwzNDZcXDIyN1xcMjQ1Li4uXCIpLCB3aGljaCB3b3VsZCBtYWtlIHRoZSBiYXNlbmFtZSBmaWx0ZXIgc2lsZW50bHkgc2tpcCB0aG9zZSBjb25maWdzLlxuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoXG4gICAgJ2dpdCcsXG4gICAgWydscy1maWxlcycsICcteicsICctLWNhY2hlZCcsICctLW90aGVycycsICctLWV4Y2x1ZGUtc3RhbmRhcmQnLCAnLS0nLCAnKmZub3gqLnRvbWwnXSxcbiAgICB7IGN3ZDogcm9vdERpclBhdGgsIGVuY29kaW5nOiAndXRmOCcsIHN0ZGlvOiAncGlwZScgfVxuICApO1xuICAvLyBGYWlsIGNsb3NlZDogdHJlYXRpbmcgYSBnaXQgZmFpbHVyZSBhcyBcIm5vIGZub3ggY29uZmlnc1wiIHdvdWxkIHNraXAgc3luY2hyb25pemF0aW9uIGFuZCBsZXRcbiAgLy8gc2V0dXBTZWNyZXRzIHVwbG9hZCBhIGtleSB0aGF0IHdhcyBuZXZlciB2ZXJpZmllZCBhZ2FpbnN0IHRoZSByZXBvc2l0b3J5J3MgY2lwaGVydGV4dHMuXG4gIGlmIChwcm9jLnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZ2l0IGxzLWZpbGVzIGZhaWxlZCBpbiAke3Jvb3REaXJQYXRofTogJHsocHJvYy5zdGRlcnIgfHwgcHJvYy5lcnJvcj8ubWVzc2FnZSB8fCAnJykudHJpbSgpfWApO1xuICB9XG4gIHJldHVybiBwcm9jLnN0ZG91dFxuICAgIC5zcGxpdCgnXFwwJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiAvXlxcLj9mbm94KFxcLi4rKT9cXC50b21sJC91LnRlc3QocGF0aC5iYXNlbmFtZShsaW5lKSkgJiYgIWlzVGVzdEZpeHR1cmVGbm94UGF0aChsaW5lKSlcbiAgICAubWFwKChsaW5lKSA9PiBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIGxpbmUpKTtcbn1cblxuZnVuY3Rpb24gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnNcbiAgICAgIC5yZWFkZGlyU3luYyhkaXJQYXRoKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gL15cXC4/Zm5veChcXC4uKyk/XFwudG9tbCQvdS50ZXN0KG5hbWUpKVxuICAgICAgLnRvU29ydGVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyB7IGNvZGU/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk/LmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gW107XG4gICAgLy8gRmFpbCBjbG9zZWQ6IGZub3ggY2FuIHN0aWxsIGxvYWQgYSBjb25maWcgZnJvbSBhIGRpcmVjdG9yeSB0aGlzIHByb2Nlc3MgY2Fubm90IGVudW1lcmF0ZVxuICAgIC8vIChlLmcuIGV4ZWN1dGUtb25seSBwZXJtaXNzaW9uKSwgc28gYW4gZW51bWVyYXRpb24gZmFpbHVyZSBtdXN0IG5vdCByZWFkIGFzIFwibm8gY29uZmlnc1wiLlxuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGluc3BlY3QgJHtkaXJQYXRofSBmb3IgZm5veCBjb25maWdzOiAke2Vycm9yfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxpc3RBbmNlc3RvckRpclBhdGhzKGRpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGlyUGF0aHMgPSBbZGlyUGF0aF07XG4gIHdoaWxlIChkaXJQYXRocy5hdCgtMSkgIT09IHJvb3REaXJQYXRoKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGRpclBhdGhzLmF0KC0xKSA/PyAnJyk7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyUGF0aHMuYXQoLTEpKSBicmVhaztcbiAgICBkaXJQYXRocy5wdXNoKHBhcmVudCk7XG4gIH1cbiAgcmV0dXJuIGRpclBhdGhzO1xufVxuIiwiaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiB1bmtub3duW10sIHNvdXJjZTogdW5rbm93bltdLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd25bXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QodGFyZ2V0W2luZGV4XSwgb3B0aW9ucykgJiYgaXNNZXJnZWFibGVPYmplY3QoaXRlbSwgb3B0aW9ucykpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlLCBvcHRpb25zKSA/IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWUsIG9wdGlvbnMpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh2YWx1ZSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIHBhY2thZ2UuanNvbi1zdHlsZSBrZXlzIGFyZSBub24tYXJyYXktaW5kZXgga2V5cywgc28gSlNPTi5zdHJpbmdpZnkgcHJlc2VydmVzIHRoaXMgaW5zZXJ0aW9uIG9yZGVyLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQge1xuICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxuICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4sXG4gIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5LFxuICByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbi8vIFRoZSBCdW4tZXhhY3QgcmVzb2x1dGlvbiBwcmltaXRpdmVzIGxpdmUgaW4gQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSAoc3JjL2J1bldvcmtzcGFjZXMudHMpXG4vLyBzbyB3YidzIHJlbGVhc2UgY29kZSBzaGFyZXMgdGhlbTsgcmUtZXhwb3J0IHRoZSBvbmVzIHdiZnkgbW9kdWxlcyBhbmQgdGVzdHMgY29uc3VtZS5cbmV4cG9ydCB7XG4gIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxufSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbi8qKiBUaGUgc3Vic2V0IG9mIFBhY2thZ2VDb25maWcgdGhhdCB3b3Jrc3BhY2UgZGlzY292ZXJ5IG5lZWRzLCBzbyBpdCBjYW4gcnVuIGJlZm9yZSBjb25maWdzIGV4aXN0LiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlUm9vdExpa2UgPSBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJyB8ICdkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucycgfCAncGFja2FnZUpzb24nPjtcblxuLyoqXG4gKiBFdmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2UgZGlyZWN0b3J5IChhYnNvbHV0ZSwgZGVkdXBsaWNhdGVkKSBvZiB0aGUgbW9ub3JlcG8gcm9vdCwgY292ZXJpbmdcbiAqIG5vbi1wYWNrYWdlcy8qIGxheW91dHMgc3VjaCBhcyBhcHBzLyouIFVuY2FjaGVkIGJlY2F1c2UgaW5kZXgudHMgY2FsbHMgaXQgYmVmb3JlIHdiZnkgbXV0YXRlc1xuICogdGhlIHJvb3QgcGFja2FnZS5qc29uIChnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyBjYWNoZXMgdGhlIHBvc3QtbXV0YXRpb24gc3RhdGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMocm9vdExpa2U6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RMaWtlKS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGF0aC5yZXNvbHZlKHJvb3RMaWtlLmRpclBhdGgsIHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKVxuICAgICAgKVxuICAgICksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpLCBpbmNsdWRpbmcgbWFuaWZlc3RzXG4gKiB3aXRob3V0IGEgYG5hbWVgIGZpZWxkIOKAlCB3YmZ5IG5hbWVzIHRob3NlIGxhdGVyLCBzbyBkZXBlbmRlbmN5IHNjYW5zIG11c3Qgbm90IHNraXAgdGhlbS5cbiAqIFJlc29sdXRpb24gbWltaWNzIEJ1bidzIHNlcXVlbnRpYWwgcGF0dGVybiBldmFsdWF0aW9uOyBzZWUgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RDb25maWc6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMocm9vdENvbmZpZyksIHJvb3RDb25maWcuZGlyUGF0aCk7XG59XG5cbmludGVyZmFjZSBXb3Jrc3BhY2VEaXJQYXR0ZXJucyB7XG4gIC8qKiBEaXJlY3Rvcnkgc3VidHJlZXMgKG9yIHBhY2thZ2Utb3duZWQgc3VicGF0aHMpIG1hdGNoZWQgYnkgZWZmZWN0aXZlIG5lZ2F0aW9ucywgZm9yIHRzY29uZmlnIGBleGNsdWRlYCBlbnRyaWVzLiAqL1xuICBleGNsdWRlczogc3RyaW5nW107XG4gIC8qKiBQb3NpdGl2ZSBkaXJlY3RvcnkgcGF0dGVybnMgKG9yIGNvbmNyZXRlIGRpcmVjdG9yaWVzIGZvciBCdW4tb25seSBnbG9iIHN5bnRheCkuICovXG4gIGluY2x1ZGVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBTb3J0ZWQgd29ya3NwYWNlIGRpcmVjdG9yeSBwYXR0ZXJucyAocG9zaXgsIHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290KSBmb3IgZ2VuZXJhdG9ycyB0aGF0XG4gKiBuZWVkIHBhdHRlcm4tc2hhcGVkIGdsb2JzIGNvdmVyaW5nIGV2ZXJ5IHdvcmtzcGFjZSBsYXlvdXQg4oCUIGUuZy4gdGhlIHJvb3QgdHNjb25maWcncyBgYXBwcy8qYFxuICogaW5jbHVkZSBlbnRyaWVzIOKAlCBpbnN0ZWFkIG9mIGNvbmNyZXRlIGRpcmVjdG9yaWVzLCB3aGljaCB3b3VsZCBjaHVybiBnZW5lcmF0ZWQgZmlsZXMgd2hlbmV2ZXIgYVxuICogd29ya3NwYWNlIHBhY2thZ2UgaXMgYWRkZWQgb3IgcmVtb3ZlZC4gRXZlcnkgcmV0dXJuZWQgcGF0dGVybiBpcyB2YWxpZCB0c2NvbmZpZyBnbG9iIHN5bnRheC5cbiAqIEEgcGF0dGVybiBjYW4gbWF0Y2ggYSBzaWJsaW5nIGRpcmVjdG9yeSB3aXRob3V0IGEgcGFja2FnZS5qc29uIChub3QgYSB3b3Jrc3BhY2UgdG8gQnVuKTsgdGhhdFxuICogaXMgZGVsaWJlcmF0ZSwgbWlycm9yaW5nIHRoZSBsb25nLXN0YW5kaW5nIGBwYWNrYWdlcy8qYCBlbnRyaWVzJyBiZWhhdmlvciBpbiBmYXZvciBvZiBzdGFibGVcbiAqIGdlbmVyYXRlZCBvdXRwdXQuIE5lZ2F0aW9ucyBmb2xsb3cgQnVuJ3Mgc2VxdWVudGlhbCBzZW1hbnRpY3MgKHNlZVxuICogcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMpOiBhIG5lZ2F0aW9uIHN0YXlzIHBhdHRlcm4tc2hhcGVkIHdoaWxlIGl0IGV4Y2x1ZGVzIGV4YWN0bHlcbiAqIHdoYXQgaXQgbWF0Y2hlcywgYnV0IGlzIGNvbmNyZXRpemVkIHBlciBtYXRjaGVkIGRpcmVjdG9yeSB3aGVuIGEgbWF0Y2hlZCBkaXJlY3RvcnkgZW5kcyB1cCBhXG4gKiB3b3Jrc3BhY2UgYW55d2F5IChyZS1pbmNsdWRlZCBieSBhIGxhdGVyIHBvc2l0aXZlLCBhIHBpbm5lZCBjb25jcmV0ZSBwb3NpdGl2ZSwgb3IgYSBzZWVkZWRcbiAqIGJhc2VsaW5lOyAjMTAwNSkgb3IgaXMgYW4gYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5LCB3aGVyZSBCdW4gZXhjbHVkZXMgb25seSB0aGVcbiAqIHBhY2thZ2UgQVQgdGhhdCBkaXJlY3RvcnksIHNvIG9ubHkgaXRzIHBhY2thZ2Utb3duZWQgc3VicGF0aHMgYXJlIGV4Y2x1ZGVkICgjMTAwNCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBXb3Jrc3BhY2VEaXJQYXR0ZXJucyB7XG4gIC8vIFVubGlrZSBkaXNjb3ZlcnksIGdlbmVyYXRlZCBvdXRwdXQgbXVzdCBub3QgY29udGFpbiBhIG5ldmVyLW1hdGNoaW5nIGBwYWNrYWdlcy8qYCBmYWxsYmFjazpcbiAgLy8gYW4gYXBwcy8qLW9ubHkgbW9ub3JlcG8gd291bGQgZ2V0IGRlYWQgZ2xvYnMgY29tbWl0dGVkIGludG8gaXRzIHJvb3QgdHNjb25maWcuIE1pcnJvclxuICAvLyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMsIHdoaWNoIGZvcmNlcyBgcGFja2FnZXMvKmAgb25seSB3aGVuIGEgbWFuaWZlc3QgYWN0dWFsbHkgbWF0Y2hlcy5cbiAgY29uc3QgaGFzUGFja2FnZXNMYXlvdXQgPVxuICAgIHJvb3RMaWtlLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmXG4gICAgLy8gTWlycm9yIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucycgYmFzZWxpbmUgZ2F0ZSB0b286IHdpdGggYW4gaW1wbGljaXQgYmFzZWxpbmUgc2VlZGVkLFxuICAgIC8vIGBwYWNrYWdlcy8qYCBlbnRyaWVzIHdvdWxkIGJlIGRlYWQgZ2xvYnMgc3Vic3VtZWQgYnkgdGhlIGJhc2VsaW5lLWRlcml2ZWQgb25lcy5cbiAgICAhaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZShyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcykgJiZcbiAgICBmZy5nbG9iU3luYygncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBjd2Q6IHJvb3RMaWtlLmRpclBhdGgsXG4gICAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICB9KS5sZW5ndGggPiAwO1xuICBjb25zdCB3b3Jrc3BhY2VQYXR0ZXJucyA9IGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zKHtcbiAgICAuLi5yb290TGlrZSxcbiAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogaGFzUGFja2FnZXNMYXlvdXQsXG4gIH0pO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IG5ldyBTZXQoXG4gICAgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMod29ya3NwYWNlUGF0dGVybnMsIHJvb3RMaWtlLmRpclBhdGgpLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aClcbiAgICApXG4gICk7XG4gIGNvbnN0IGluY2x1ZGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG5lZ2F0aW9uQm9kaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdHRlcm4gb2Ygd29ya3NwYWNlUGF0dGVybnMpIHtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJyk7XG4gICAgY29uc3QgcGF0dGVybkJvZHkgPSBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShpc05lZ2F0aXZlID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm4pO1xuICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICAvLyBBIHNlZWRpbmcgbmVnYXRpb24gbWFrZXMgQnVuIGxpbmsgYmFzZWxpbmUtbWF0Y2hlZCBkaXJlY3Rvcmllcywgc28gdGhlIGJhc2VsaW5lIG11c3RcbiAgICAgIC8vIGVudGVyIHRoZSBnZW5lcmF0ZWQgaW5jbHVkZSBwYXR0ZXJucyBldmVuIHdoZW4gZXZlcnkgZGVjbGFyZWQgcGF0dGVybiBpcyBhIG5lZ2F0aW9uLlxuICAgICAgY29uc3QgYmFzZWxpbmVHbG9iID0gZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKHBhdHRlcm5Cb2R5KTtcbiAgICAgIGlmIChiYXNlbGluZUdsb2IgIT09IHVuZGVmaW5lZCkgaW5jbHVkZXMuYWRkKGJhc2VsaW5lR2xvYik7XG4gICAgICBuZWdhdGlvbkJvZGllcy5wdXNoKHBhdHRlcm5Cb2R5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBkaXJQYXR0ZXJuIG9mIHRvVHNjb25maWdDb21wYXRpYmxlRGlyUGF0dGVybnMocGF0dGVybkJvZHksIHJvb3RMaWtlLmRpclBhdGgpKSB7XG4gICAgICAgIGluY2x1ZGVzLmFkZChkaXJQYXR0ZXJuKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgZXhjbHVkZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBuZWdhdGlvbkJvZHkgb2YgbmVnYXRpb25Cb2RpZXMpIHtcbiAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVFbnRyeSBvZiB0b0V4Y2x1ZGVFbnRyaWVzKG5lZ2F0aW9uQm9keSwgd29ya3NwYWNlRGlyUGF0aHMsIHJvb3RMaWtlLmRpclBhdGgpKSB7XG4gICAgICBleGNsdWRlcy5hZGQoZXhjbHVkZUVudHJ5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgZXhjbHVkZXM6IFsuLi5leGNsdWRlc10udG9Tb3J0ZWQoKSwgaW5jbHVkZXM6IFsuLi5pbmNsdWRlc10udG9Tb3J0ZWQoKSB9O1xufVxuXG4vKipcbiAqIHRzY29uZmlnIGV4Y2x1ZGUgZW50cmllcyBmb3Igb25lIG5lZ2F0aW9uLiBQYXR0ZXJuLXNoYXBlZCB3aGVuIHRoZSBuZWdhdGlvbiBleGNsdWRlcyBleGFjdGx5XG4gKiB3aGF0IGl0IG1hdGNoZXMgKHN0YWJsZSBvdXRwdXQpOyBwZXItZGlyZWN0b3J5IG90aGVyd2lzZTogYSBkaXJlY3RvcnkgdGhhdCBpcyBhIHdvcmtzcGFjZVxuICogZGVzcGl0ZSB0aGUgbmVnYXRpb24gaXMgbm90IGV4Y2x1ZGVkIGF0IGFsbCwgYW5kIG5laXRoZXIgaXMgYSBQTEFJTiAocGFja2FnZS5qc29uLWxlc3MpXG4gKiBkZXNjZW5kYW50IG9mIGEgd29ya3NwYWNlIGRpcmVjdG9yeSDigJQgbmVnYXRpbmcgYSBub24tcGFja2FnZSBkaXJlY3RvcnkgaXMgYSBuby1vcCBmb3IgQnVuLFxuICogYW5kIHRoZSBlbmNsb3Npbmcgd29ya3NwYWNlIHN0YXlzIGFjdGl2ZSAoZS5nLiBgWydhcHBzLyoqJywgJyFhcHBzLyoqJywgJ2FwcHMvd2ViJ11gXG4gKiByZS1pbmNsdWRlcyBhcHBzL3dlYiwgd2hvc2Ugc3JjIG11c3Qga2VlcCB0eXBlLWNoZWNraW5nOyBhIHRzY29uZmlnIGV4Y2x1ZGUgd291bGQgb3ZlcnJpZGVcbiAqIHRoZSBpbmNsdWRlKS4gQSBkZXNjZW5kYW50IHdpdGggaXRzIG93biBtYW5pZmVzdCB0aGF0IHRoZSBuZWdhdGlvbiBrZWVwcyBvdXQgb2YgdGhlIHdvcmtzcGFjZVxuICogc2V0IGlzIGFuIGV4Y2x1ZGVkIG5lc3RlZCBwYWNrYWdlIGFuZCBzdGF5cyBleGNsdWRlZC4gQSBkaXJlY3RvcnkgdGhhdCBpcyBhblxuICogYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5IGdldHMgb25seSBpdHMgcGFja2FnZS1vd25lZCBzdWJwYXRocyBleGNsdWRlZCwgYmVjYXVzZSBCdW5cbiAqIGV4Y2x1ZGVzIG9ubHkgdGhlIHBhY2thZ2UgQVQgdGhhdCBkaXJlY3Rvcnkgd2hpbGUga2VlcGluZyBkZXNjZW5kYW50IHdvcmtzcGFjZXMgKCMxMDA0KS5cbiAqL1xuZnVuY3Rpb24gdG9FeGNsdWRlRW50cmllcyhuZWdhdGlvbkJvZHk6IHN0cmluZywgd29ya3NwYWNlRGlyUGF0aHM6IFNldDxzdHJpbmc+LCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBpc1dvcmtzcGFjZUFuY2VzdG9yID0gKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICBbLi4ud29ya3NwYWNlRGlyUGF0aHNdLnNvbWUoKHdvcmtzcGFjZURpclBhdGgpID0+IHdvcmtzcGFjZURpclBhdGguc3RhcnRzV2l0aChgJHtkaXJQYXRofS9gKSk7XG4gIC8vIE9ubHkgUExBSU4gZGlyZWN0b3JpZXMgKG5vIHBhY2thZ2UuanNvbiBvZiB0aGVpciBvd24pIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGVuY2xvc2luZ1xuICAvLyB3b3Jrc3BhY2U6IGEgbWF0Y2hlZCBkaXJlY3RvcnkgdGhhdCBjYXJyaWVzIGl0cyBvd24gbWFuaWZlc3QgeWV0IGlzIGFic2VudCBmcm9tIHRoZSBmaW5hbFxuICAvLyB3b3Jrc3BhY2Ugc2V0IGlzIGFuIGV4Y2x1ZGVkIG5lc3RlZCBwYWNrYWdlLCBhbmQgaXRzIGV4Y2x1c2lvbiBtdXN0IHN1cnZpdmUuXG4gIGNvbnN0IGlzUHJvdGVjdGVkV29ya3NwYWNlRGVzY2VuZGFudCA9IChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgWy4uLndvcmtzcGFjZURpclBhdGhzXS5zb21lKCh3b3Jrc3BhY2VEaXJQYXRoKSA9PiBkaXJQYXRoLnN0YXJ0c1dpdGgoYCR7d29ya3NwYWNlRGlyUGF0aH0vYCkpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBkaXJQYXRoLCAncGFja2FnZS5qc29uJykpO1xuICBjb25zdCBtYXRjaGVkRGlyUGF0aHMgPSBnZXRNYXRjaGVkRGlyUGF0aHMobmVnYXRpb25Cb2R5LCByb290RGlyUGF0aCk7XG4gIGlmIChcbiAgICAhbWF0Y2hlZERpclBhdGhzLnNvbWUoXG4gICAgICAoZGlyUGF0aCkgPT5cbiAgICAgICAgd29ya3NwYWNlRGlyUGF0aHMuaGFzKGRpclBhdGgpIHx8IGlzV29ya3NwYWNlQW5jZXN0b3IoZGlyUGF0aCkgfHwgaXNQcm90ZWN0ZWRXb3Jrc3BhY2VEZXNjZW5kYW50KGRpclBhdGgpXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhuZWdhdGlvbkJvZHksIHJvb3REaXJQYXRoKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlZERpclBhdGhzLmZsYXRNYXAoKGRpclBhdGgpID0+IHtcbiAgICAvLyBUaGUgZGVzY2VuZGFudCBjaGVjayBwcmVjZWRlcyB0aGUgYW5jZXN0b3Igb25lOiBhIGRpcmVjdG9yeSBpbnNpZGUgb25lIHdvcmtzcGFjZSBidXQgYWJvdmVcbiAgICAvLyBhIG5lc3RlZCBvbmUgKGUuZy4gYXBwcy93ZWIvcGx1Z2lucyBiZXR3ZWVuIHdvcmtzcGFjZXMgYXBwcy93ZWIgYW5kIGFwcHMvd2ViL3BsdWdpbnMveClcbiAgICAvLyBzdGlsbCBiZWxvbmdzIHRvIHRoZSBlbmNsb3NpbmcgYWN0aXZlIHdvcmtzcGFjZSwgc28gbm90aGluZyBvZiBpdCBtYXkgYmUgZXhjbHVkZWQuXG4gICAgaWYgKHdvcmtzcGFjZURpclBhdGhzLmhhcyhkaXJQYXRoKSB8fCBpc1Byb3RlY3RlZFdvcmtzcGFjZURlc2NlbmRhbnQoZGlyUGF0aCkpIHJldHVybiBbXTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VBbmNlc3RvcihkaXJQYXRoKSkge1xuICAgICAgcmV0dXJuIFtgJHtkaXJQYXRofS8qLmNvbmZpZy50c2AsIGAke2RpclBhdGh9L3NjcmlwdHNgLCBgJHtkaXJQYXRofS9zcmNgLCBgJHtkaXJQYXRofS90ZXN0YF07XG4gICAgfVxuICAgIHJldHVybiBbZGlyUGF0aF07XG4gIH0pO1xufVxuXG4vKipcbiAqIERpcmVjdG9yaWVzIGEgbmVnYXRpb24gbWF0Y2hlcy4gVGhlIG1hbmlmZXN0LWJhc2VkIGdsb2IgY29tcGxlbWVudHMgb25seURpcmVjdG9yaWVzIGJlY2F1c2VcbiAqIGZhc3QtZ2xvYidzIGBkaXIvKipgIGRvZXMgbm90IHJldHVybiBgZGlyYCBpdHNlbGYgYXMgYSBkaXJlY3RvcnksIHdoaWxlIGJvdGggQnVuIGFuZCB0aGVcbiAqIG1hbmlmZXN0IGdsb2IgdHJlYXQgYCoqYCBhcyB6ZXJvIG9yIG1vcmUgc2VnbWVudHMgKGBhcHBzLyoqYCBjb3ZlcnMgdGhlIHBhY2thZ2UgYXQgYXBwcykuXG4gKi9cbmZ1bmN0aW9uIGdldE1hdGNoZWREaXJQYXRocyhuZWdhdGlvbkJvZHk6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7IGN3ZDogcm9vdERpclBhdGgsIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfTtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFtcbiAgICAgIC4uLmZnLmdsb2JTeW5jKG5lZ2F0aW9uQm9keSwgeyAuLi5nbG9iT3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pLFxuICAgICAgLi4uZmdcbiAgICAgICAgLmdsb2JTeW5jKHBhdGgucG9zaXguam9pbihuZWdhdGlvbkJvZHksICdwYWNrYWdlLmpzb24nKSwgZ2xvYk9wdGlvbnMpXG4gICAgICAgIC5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT4gcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpXG4gICAgICAgIC8vIEEgemVyby1zZWdtZW50IGAqKmAgbWF0Y2ggcmVhY2hlcyB0aGUgcm9vdCBpdHNlbGYsIHdoaWNoIGlzIG5ldmVyIGEgd29ya3NwYWNlLlxuICAgICAgICAuZmlsdGVyKChkaXJQYXRoKSA9PiBkaXJQYXRoICE9PSAnLicpLFxuICAgIF0pLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogdHNjb25maWcgaW5jbHVkZS9leGNsdWRlIHN1cHBvcnQgb25seSB0aGUgYCpgLCBgP2AsIGFuZCBgKipgIHdpbGRjYXJkcywgd2hpbGUgQnVuIHdvcmtzcGFjZXNcbiAqIGFjY2VwdCBmdWxsIGdsb2Igc3ludGF4IChicmFjZSBleHBhbnNpb24sIGNoYXJhY3RlciBjbGFzc2VzLCDigKYpLCBzbyBleHBhbmQgQnVuLW9ubHkgcGF0dGVybnMgdG9cbiAqIHRoZSBjb25jcmV0ZSBkaXJlY3RvcmllcyB0aGV5IG1hdGNoIHRvIGtlZXAgdGhlIGdlbmVyYXRlZCBnbG9icyB2YWxpZCBmb3IgVHlwZVNjcmlwdC5cbiAqL1xuZnVuY3Rpb24gdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhwYXR0ZXJuQm9keTogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAoIS9bKClbXFxde31dL3UudGVzdChwYXR0ZXJuQm9keSkpIHJldHVybiBbcGF0dGVybkJvZHldO1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybkJvZHksIHtcbiAgICBjd2Q6IHJvb3REaXJQYXRoLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICBvbmx5RGlyZWN0b3JpZXM6IHRydWUsXG4gIH0pO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyAobmVnYXRpdmUgb25lcyBpbmNsdWRlZCkgdGhhdCBzdGF5IGluc2lkZSB0aGUgcmVwb3NpdG9yeTogYWJzb2x1dGVcbiAqIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIHJlbW92ZU5vZGVNb2R1bGVzIG9wZXJhdGUgb24gYW5vdGhlclxuICogcmVwb3NpdG9yeSdzIGZpbGVzLiBEZWNsYXJhdGlvbiBvcmRlciBhbmQgZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZVxuICogcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBwb3NpdGlvbiBtYXR0ZXJzLlxuICovXG5mdW5jdGlvbiBnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlY2xhcmVkUGF0dGVybnMgPSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcyk7XG4gIC8vIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyBmb3JjZXMgYHBhY2thZ2VzLypgIGludG8gYSBtb25vcmVwbydzIHdvcmtzcGFjZXMgd2hlbiBhXG4gIC8vIHBhY2thZ2VzLyovcGFja2FnZS5qc29uIGFjdHVhbGx5IG1hdGNoZXMsIGJ1dCBpdCBtYXkgbm90IGhhdmUgd3JpdHRlbiB0aGUgcm9vdCBwYWNrYWdlLmpzb25cbiAgLy8geWV0LCBzbyBtaXJyb3IgdGhhdCBub3JtYWxpemF0aW9uIGhlcmUg4oCUIFBSRVBFTkRFRCBsaWtlIHRoZXJlLCBiZWNhdXNlIGEgcG9zaXRpdmUgcGF0dGVyblxuICAvLyBwbGFjZWQgYWZ0ZXIgYSB1c2VyIG5lZ2F0aW9uIHdvdWxkIHJlLWluY2x1ZGUgdGhlIG5lZ2F0ZWQgcGFja2FnZXMgdW5kZXIgQnVuJ3Mgc2VxdWVudGlhbFxuICAvLyBldmFsdWF0aW9uLiBEaXNjb3ZlcnkgY2FsbGVycyBwYXNzIHRoZSBmYWxsYmFjayB1bmNvbmRpdGlvbmFsbHkgZm9yIG1vbm9yZXBvcyDigJQgYVxuICAvLyBuZXZlci1tYXRjaGluZyBwYXR0ZXJuIGNvbnRyaWJ1dGVzIG5vIHBhdGhzIHRoZXJlIOKAlCB3aGlsZSBwYXR0ZXJuLXNoYXBlZCBjYWxsZXJzXG4gIC8vIChnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucykgZ2F0ZSBpdCBvbiBhbiBhY3R1YWwgbWF0Y2guXG4gIGNvbnN0IHdvcmtzcGFjZVBhdHRlcm5zID1cbiAgICByb290TGlrZS5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAhaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKHJvb3RMaWtlLnBhY2thZ2VKc29uPy53b3Jrc3BhY2VzKVxuICAgICAgPyBbJ3BhY2thZ2VzLyonLCAuLi5kZWNsYXJlZFBhdHRlcm5zXVxuICAgICAgOiBkZWNsYXJlZFBhdHRlcm5zO1xuICByZXR1cm4gd29ya3NwYWNlUGF0dGVybnMuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybikpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBkZWNsYXJlZCBwb3NpdGl2ZSBwYXR0ZXJuIGFscmVhZHkgY292ZXJzIGBwYWNrYWdlcy8qYCB1bmRlciBwYXRoIG5vcm1hbGl6YXRpb25cbiAqIChlLmcuIGAuL3BhY2thZ2VzLypgIG9yIGEgdHJhaWxpbmctc2xhc2ggc3BlbGxpbmcpOiBmb3JjaW5nIGEgdGV4dHVhbCBgcGFja2FnZXMvKmAgbmV4dCB0b1xuICogc3VjaCBhIHNwZWxsaW5nIHdvdWxkIHBlcnNpc3QgZHVwbGljYXRlIGVxdWl2YWxlbnQgcGF0dGVybnMgYW5kIHJlLXNjYW4gdGhlIHNhbWUgZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4od29ya3NwYWNlczogUGFja2FnZUpzb25bJ3dvcmtzcGFjZXMnXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlcykuc29tZShcbiAgICAod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgICF3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgLy8gQSBgLi5gLXRyYXZlcnNpbmcgb3IgYWJzb2x1dGUgc3BlbGxpbmcgKGUuZy4gYHgvLi4vcGFja2FnZXMvKmApIGlzIGRpc2NhcmRlZCBieVxuICAgICAgLy8gZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMsIHNvIGl0IG11c3Qgbm90IGNvdW50IGFzIGNvdmVyaW5nIHBhY2thZ2VzLyog4oCUIHRoYXQgd291bGRcbiAgICAgIC8vIHN1cHByZXNzIHRoZSBmYWxsYmFjayBBTkQgbG9zZSB0aGUgcGF0dGVybiwgbGVhdmluZyBubyBkaXNjb3ZlcmVkIHdvcmtzcGFjZXMuXG4gICAgICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybikgJiZcbiAgICAgIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4pID09PSAncGFja2FnZXMvKidcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuaW1wb3J0IHsgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyB9IGZyb20gJy4vd29ya3NwYWNlVXRpbC5qcyc7XG5cbmNvbnN0IFBSSVZBVEVfU0NPUEUgPSAnQHdpbGxib29zdGVyLXByaXZhdGUvJztcblxuY29uc3QgcHJpdmF0ZVJlZ2lzdHJ5SG9zdCA9ICd2ZXJkYWNjaW8tcHJvZHVjdGlvbi1lMzg5LnVwLnJhaWx3YXkuYXBwJztcbmV4cG9ydCBjb25zdCBwcml2YXRlUmVnaXN0cnlTY29wZU1hcHBpbmcgPSBgQHdpbGxib29zdGVyLXByaXZhdGU6cmVnaXN0cnk9aHR0cHM6Ly8ke3ByaXZhdGVSZWdpc3RyeUhvc3R9L2A7XG5cbi8qKlxuICogV2hldGhlciB0aGlzIHJlcG9zaXRvcnkgZGVhbHMgd2l0aCBgQHdpbGxib29zdGVyLXByaXZhdGUvKmAgcGFja2FnZXMg4oCUIGJ5IGNvbnZlbnRpb24gdGhhdCBzY29wZVxuICogbGl2ZXMgZXhjbHVzaXZlbHkgb24gdGhlIHByaXZhdGUgVmVyZGFjY2lvIHJlZ2lzdHJ5LCBzbyBleGFjdGx5IHRoZXNlIHJlcG9zaXRvcmllcyBuZWVkIHRoZVxuICogVkVSREFDQ0lPX1RPS0VOIHBhc3MtdGhyb3VnaCBpbiB0aGVpciByZXVzYWJsZS13b3JrZmxvdyBjYWxsZXJzLlxuICpcbiAqIEEgcmVwb3NpdG9yeSBxdWFsaWZpZXMgd2hlbiBhbnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBERUNMQVJFUyBhIGRlcGVuZGVuY3kgaW4gdGhlIHNjb3BlIChhbnlcbiAqIGRlcGVuZGVuY3kgZmllbGQpLCBvciBpcyBpdHNlbGYgTkFNRUQgaW4gdGhlIHNjb3BlIChpdCBwdWJsaXNoZXMgdG8gVmVyZGFjY2lvLCBhbmQgcmVsZWFzZS55bWxcbiAqIGRlcml2ZXMgaXRzIG5wbSBhdXRoIGZyb20gdGhlIHNhbWUgc2VjcmV0KS4gTm90aGluZyBlbHNlIGlzIHNjYW5uZWQ6IGxvY2tmaWxlcyBvbmx5IG1pcnJvciB0aGVcbiAqIGRlY2xhcmVkIGRlcGVuZGVuY2llcywgYW5kIGJ1bmZpZy50b21sJ3MgYG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXNgIG1lbnRpb25zIHRoZSBzY29wZSBldmVuIGluXG4gKiByZXBvc2l0b3JpZXMgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RpclBhdGgnIHwgJ2RvZXNDb250YWluU3ViUGFja2FnZUpzb25zJyB8ICdwYWNrYWdlSnNvbic+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgbWFuaWZlc3RSZWxQYXRocyA9IG5ldyBTZXQoWydwYWNrYWdlLmpzb24nLCAuLi5nZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGNvbmZpZyldKTtcbiAgcmV0dXJuIFsuLi5tYW5pZmVzdFJlbFBhdGhzXS5zb21lKChyZWxQYXRoKSA9PiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSByZWFkUGFja2FnZUpzb25JZkV4aXN0cyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIHJlbFBhdGgpKTtcbiAgICBpZiAoIW1hbmlmZXN0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG1hbmlmZXN0Lm5hbWU/LnN0YXJ0c1dpdGgoUFJJVkFURV9TQ09QRSkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBbXG4gICAgICBtYW5pZmVzdC5kZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5kZXZEZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5wZWVyRGVwZW5kZW5jaWVzLFxuICAgICAgbWFuaWZlc3Qub3B0aW9uYWxEZXBlbmRlbmNpZXMsXG4gICAgXS5zb21lKChkZXBlbmRlbmNpZXMpID0+IE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcyA/PyB7fSkuc29tZSgobmFtZSkgPT4gbmFtZS5zdGFydHNXaXRoKFBSSVZBVEVfU0NPUEUpKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkUGFja2FnZUpzb25JZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IHJ1bm5lclNjaGVtYSA9IHoudW5pb24oW3ouc3RyaW5nKCksIHouYXJyYXkoei5zdHJpbmcoKSldKTtcbmNvbnN0IHdvcmtmbG93U2NoZW1hID0gei5vYmplY3Qoe1xuICBqb2JzOiB6LnJlY29yZChcbiAgICB6LnN0cmluZygpLFxuICAgIHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICAncnVucy1vbic6IHJ1bm5lclNjaGVtYS5vcHRpb25hbCgpLFxuICAgICAgICBzdHJhdGVneTogei5vYmplY3QoeyBtYXRyaXg6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSB9KS5vcHRpb25hbCgpLFxuICAgICAgfSlcbiAgICAgIC5udWxsYWJsZSgpXG4gICksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydFByaXZhdGVXb3JrZmxvd1J1bm5lcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB3b3JrZmxvd3NQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gfHwgIWNvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24pIHJldHVybjtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pLmNhdGNoKChlcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgaWYgKGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gW107XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xuICBmb3IgKGNvbnN0IHsgbmFtZTogZmlsZU5hbWUgfSBvZiBlbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRmlsZSgpICYmIC9cXC55YT9tbCQvdS50ZXN0KGVudHJ5Lm5hbWUpKSkge1xuICAgIGNvbnN0IHdvcmtmbG93ID0gd29ya2Zsb3dTY2hlbWEucGFyc2UoeWFtbC5sb2FkKGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4JykpKTtcbiAgICBmb3IgKGNvbnN0IFtqb2JOYW1lLCBqb2JdIG9mIE9iamVjdC5lbnRyaWVzKHdvcmtmbG93LmpvYnMpKSB7XG4gICAgICBpZiAoIWpvYj8uWydydW5zLW9uJ10pIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcnVubmVyID0gam9iWydydW5zLW9uJ107XG4gICAgICBpZiAoaXNTZWxmSG9zdGVkKHJ1bm5lcikpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbWF0Y2ggPSB0eXBlb2YgcnVubmVyID09PSAnc3RyaW5nJyAmJiAvXlxcJFxce1xce1xccyptYXRyaXhcXC4oXFx3KylcXHMqXFx9XFx9JC91LmV4ZWMocnVubmVyKTtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXM6IHVua25vd25bXSA9IFtdO1xuICAgICAgaWYgKG1hdGNoICYmIGpvYi5zdHJhdGVneSkge1xuICAgICAgICBjb25zdCBrZXkgPSBtYXRjaFsxXSE7XG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IGpvYi5zdHJhdGVneS5tYXRyaXg7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHouYXJyYXkoei51bmtub3duKCkpLnNhZmVQYXJzZShtYXRyaXhba2V5XSk7XG4gICAgICAgIGlmICh2YWx1ZXMuc3VjY2VzcykgY2FuZGlkYXRlcy5wdXNoKC4uLnZhbHVlcy5kYXRhKTtcbiAgICAgICAgY29uc3QgaW5jbHVkZSA9IHouYXJyYXkoei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpKS5zYWZlUGFyc2UobWF0cml4LmluY2x1ZGUpO1xuICAgICAgICBpZiAoaW5jbHVkZS5zdWNjZXNzKVxuICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaCguLi5pbmNsdWRlLmRhdGEubWFwKChyb3cpID0+IHJvd1trZXldKS5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYW5kaWRhdGVzLnB1c2gocnVubmVyKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFsbG93ZWQgPVxuICAgICAgICBjYW5kaWRhdGVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgY2FuZGlkYXRlcy5ldmVyeShcbiAgICAgICAgICAoY2FuZGlkYXRlKSA9PlxuICAgICAgICAgICAgaXNTZWxmSG9zdGVkKGNhbmRpZGF0ZSkgfHxcbiAgICAgICAgICAgIChjb25maWcucmVwb3NpdG9yeT8udG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yjp3aWxsYm9vc3Rlci9jaGVlcmxpbmdzJyAmJlxuICAgICAgICAgICAgICBmaWxlTmFtZSA9PT0gJ2J1aWxkLWRlc2t0b3AtYXBwcy55bWwnICYmXG4gICAgICAgICAgICAgIGpvYk5hbWUgPT09ICdidWlsZCcgJiZcbiAgICAgICAgICAgICAgY2FuZGlkYXRlID09PSAnd2luZG93cy1sYXRlc3QnKVxuICAgICAgICApO1xuICAgICAgaWYgKCFhbGxvd2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHtmaWxlTmFtZX06IGpvYnMuJHtqb2JOYW1lfS5ydW5zLW9uIG11c3Qgc2VsZWN0IHNlbGYtaG9zdGVkIHJ1bm5lcnMgaW4gYSBwcml2YXRlIHJlcG9zaXRvcnkuIEZpeCB0aGUgd29ya2Zsb3cgYmVmb3JlIHJ1bm5pbmcgd2JmeS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzU2VsZkhvc3RlZChydW5uZXI6IHVua25vd24pOiBib29sZWFuIHtcbiAgY29uc3QgbGFiZWxzID0gcnVubmVyU2NoZW1hLnNhZmVQYXJzZShydW5uZXIpO1xuICBpZiAoIWxhYmVscy5zdWNjZXNzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBcnJheS5pc0FycmF5KGxhYmVscy5kYXRhKSkgcmV0dXJuIGxhYmVscy5kYXRhLmluY2x1ZGVzKCdzZWxmLWhvc3RlZCcpO1xuICByZXR1cm4gbGFiZWxzLmRhdGEgPT09ICdzZWxmLWhvc3RlZCc7XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGhhc0Zub3hTeW5jRmFpbGVkLCByZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZSB9IGZyb20gJy4vZm5veFRvbWwuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IG1vdmVUb0JvdHRvbSwgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyB9IGZyb20gJy4uL3V0aWxzL3ByaXZhdGVQYWNrYWdlcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGFzc2VydFByaXZhdGVXb3JrZmxvd1J1bm5lcnMgfSBmcm9tICcuL3dvcmtmbG93UnVubmVyUG9saWN5LmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZT86IHN0cmluZztcbiAgb24/OiBPbjtcbiAgY29uY3VycmVuY3k/OiBDb25jdXJyZW5jeTtcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBqb2JzOiBSZWNvcmQ8c3RyaW5nLCBKb2I+O1xufVxuXG5pbnRlcmZhY2UgQ29uY3VycmVuY3kge1xuICBncm91cDogc3RyaW5nO1xuICAnY2FuY2VsLWluLXByb2dyZXNzJzogYm9vbGVhbjtcbiAgcXVldWU/OiAnc2luZ2xlJyB8ICdtYXgnO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICAvLyBHaXRIdWIgQWN0aW9ucyB0cmVhdHMgYGV2ZW50OiBudWxsYCBhcyBhIHZhbHVlbGVzcyBldmVudCBtYXBwaW5nLCBlLmcuXG4gIC8vIGBwdWxsX3JlcXVlc3Q6YC4gYHVuZGVmaW5lZGAgd291bGQgb21pdCB0aGUgZXZlbnQgZW50aXJlbHkgd2hlbiBkdW1waW5nIFlBTUwuXG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8ICdpbmhlcml0JztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbiddLFxuICAgICAgfSxcbiAgICAgIC8vIExldCBtYWludGFpbmVycyByZS1ydW4gdGhlIHRlc3RzIGJ5IGhhbmQuXG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIC8vIE5vbmUgb2YgdGhlc2UgbWF5IGJlIG5hcnJvd2VkIGp1c3QgYmVjYXVzZSB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdyBuZXZlciBwdXNoZXM6XG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciB0aGUgdGVzdCBqb2IncyBza2lwLWR1cGxpY2F0ZS1hY3Rpb25zIGNhbGwgd2l0aCBjYW5jZWxfb3RoZXJzOiB0cnVlICh0aGUgcmV1c2FibGVcbiAgICAgIC8vIHRlc3Qgd29ya2Zsb3cgZGVjbGFyZXMgbm8gcGVybWlzc2lvbnMgb2YgaXRzIG93biwgc28gaXRzIGpvYnMgcnVuIG9uIHRoaXMgdG9rZW4pXG4gICAgICBhY3Rpb25zOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIGBzZW1hbnRpYy1yZWxlYXNlIC0tZHJ5LXJ1bmAsIHdoaWNoIGRvZXMgYSBgZ2l0IHB1c2ggLS1kcnktcnVuYCB0byB2ZXJpZnkgd3JpdGVcbiAgICAgIC8vIGFjY2VzcyBhbmQgYWJvcnRzIHdpdGggRUdJVE5PUEVSTUlTU0lPTiB3aXRob3V0IGl0XG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBwa2ctcHJlZmxpZ2h0IFBSIGZpbGUgbGlzdGluZ1xuICAgICAgJ3B1bGwtcmVxdWVzdHMnOiAncmVhZCcsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICd0ZXN0LXJ1c3QnOiB7XG4gICAgbmFtZTogJ1Rlc3QgUnVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbiddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAndGVzdC1ydXN0Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QtcnVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGBxdWV1ZTogbWF4YCBoZXJlIHRvbyAoIzk3NCk6IEdpdEh1YidzIGRlZmF1bHQgcXVldWUgKGBzaW5nbGVgKSBjYW5jZWxzIGFuIGFscmVhZHktUEVORElOR1xuICAgIC8vIGNhbGxlciBydW4gd2hlbiBhbm90aGVyIG9uZSBxdWV1ZXMg4oCUIGJlZm9yZSBpdHMgam9iIChhbmQgdGhlIHJldXNhYmxlIHdvcmtmbG93J3Mgb3duXG4gICAgLy8gam9iLWxldmVsIGBxdWV1ZTogbWF4YCkgZXZlciBzdGFydHMg4oCUIHNpbGVudGx5IGRyb3BwaW5nIHRoYXQgcmVsZWFzZSB0cmlnZ2VyLlxuICAgIC8vIFRoZSBjYWxsZXItbGV2ZWwgZ3JvdXAgbXVzdCBOT1QgcmV1c2UgdGhlIHJldXNhYmxlIHdvcmtmbG93J3Mgam9iLWxldmVsIGdyb3VwIG5hbWVcbiAgICAvLyAoYHJlbGVhc2UtJHt7IGdpdGh1Yi5yZXBvc2l0b3J5IH19YCk6IHdvcmtmbG93LWxldmVsIGFuZCBqb2ItbGV2ZWwgZ3JvdXBzIHNoYXJlIG9uZVxuICAgIC8vIHJlcG9zaXRvcnktd2lkZSBuYW1lc3BhY2UsIGFuZCBpZGVudGljYWwgbmFtZXMgZGVhZGxvY2sgdGhlIHJ1biAoXCJDYW5jZWxpbmcgc2luY2UgYVxuICAgIC8vIGRlYWRsb2NrIGZvciBjb25jdXJyZW5jeSBncm91cCAuLi4gd2FzIGRldGVjdGVkIGJldHdlZW4gJ3RvcCBsZXZlbCB3b3JrZmxvdycgYW5kICc8am9iPidcIikuXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICBxdWV1ZTogJ21heCcsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS90cnVzdGVkLXB1Ymxpc2hlcnMjc3RlcC0yLWNvbmZpZ3VyZS15b3VyLWNpY2Qtd29ya2Zsb3dcbiAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgY29tbWl0aW5nIGNoYW5nZXNcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBLbm93bktpbmQgPSBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzIHwgJ2RlcGxveSc7XG5cbi8qKlxuICogUGFyc2VzIGEgYHVzZXM6YCB2YWx1ZSBjYWxsaW5nIG9uZSBvZiBXaWxsQm9vc3RlcidzIG93biByZXVzYWJsZSB3b3JrZmxvd3MgKG9yIHRoZVxuICogV2lsbEJvb3N0ZXJMYWIgc3luYyBtaXJyb3IpIGludG8gdGhlIHdvcmtmbG93IG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKSBhbmQgZ2l0IHJlZi4gT25seSB0aG9zZVxuICogZm9sbG93IHRoZSBjb250cmFjdCB3YmZ5IGVuZm9yY2VzIOKAlCBjYWxsZXJzIG9mIGFub3RoZXIgb3JnYW5pemF0aW9uJ3Mgc2FtZS1uYW1lZCByZXBvc2l0b3J5IGFyZVxuICogbGVmdCBhbG9uZS4gR2l0SHViIHRyZWF0cyBvd25lci9yZXBvc2l0b3J5IG5hbWVzIGNhc2UtaW5zZW5zaXRpdmVseSwgc28gdGhlIGNvbXBhcmlzb24gZG9lc1xuICogdG9vLCB3aGlsZSB0aGUgd29ya2Zsb3cgcGF0aCBhbmQgcmVmIHN0YXkgY2FzZS1zZW5zaXRpdmUuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoXG4gIHVzZXM6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogeyB3b3JrZmxvd05hbWU6IHN0cmluZzsgZXh0ZW5zaW9uOiBzdHJpbmc7IHJlZjogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaCA9IC9eKFteL10rKVxcLyhbXi9dKylcXC9cXC5naXRodWJcXC93b3JrZmxvd3NcXC8oW14vQF0rPylcXC4oeWE/bWwpQCguKykkL3UuZXhlYyh1c2VzID8/ICcnKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3duZXIgPSBtYXRjaFsxXSEudG9Mb3dlckNhc2UoKTtcbiAgaWYgKChvd25lciAhPT0gJ3dpbGxib29zdGVyJyAmJiBvd25lciAhPT0gJ3dpbGxib29zdGVybGFiJykgfHwgbWF0Y2hbMl0hLnRvTG93ZXJDYXNlKCkgIT09ICdyZXVzYWJsZS13b3JrZmxvd3MnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4geyB3b3JrZmxvd05hbWU6IG1hdGNoWzNdISwgZXh0ZW5zaW9uOiBtYXRjaFs0XSEsIHJlZjogbWF0Y2hbNV0hIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghcm9vdENvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24pIHtcbiAgICBjb25zb2xlLndhcm4oJ1NraXBwZWQgd29ya2Zsb3cgZ2VuZXJhdGlvbiBiZWNhdXNlIHJlcG9zaXRvcnkgdmlzaWJpbGl0eSBpcyB1bmtub3duLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJiAoYXdhaXQgZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgod29ya2Zsb3dzUGF0aCkpKSB7XG4gICAgYXdhaXQgYXNzZXJ0UHJpdmF0ZVdvcmtmbG93UnVubmVycyhyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoKTtcbiAgfVxuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2l0aCAuZ2l0aHViIG9yIC5naXRodWIvd29ya2Zsb3dzIHN5bWxpbmtlZCBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCB3cml0ZVlhbWwncyBndWFyZHNcbiAgICAvLyBhbHJlYWR5IHJlZnVzZSB0aGUgd3JpdGVzLCBidXQgcmVhZGRpci9ybSBiZWxvdyB3b3VsZCBzdGlsbCBlbnVtZXJhdGUgYW5kIERFTEVURSBmaWxlc1xuICAgIC8vIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkg4oCUIHNvIHJlcXVpcmUgdGhlIGRpcmVjdG9yeSB0byByZXNvbHZlIGluc2lkZSBpdCBiZWZvcmUgYW55XG4gICAgLy8gdHJhdmVyc2FsLCBta2Rpciwgb3IgY2xlYW51cC5cbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nIHdvcmtmbG93cyBiZWNhdXNlICR7d29ya2Zsb3dzUGF0aH0gcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgLy8gd2JmeSB3cml0ZXMgLnltbCB3b3JrZmxvd3MsIHNvIGVhY2gga2luZCBtYXBzIHRvIGl0cyAueW1sIGZpbGUuXG4gICAgY29uc3QgZmlsZU5hbWVzQnlLaW5kID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIWVudHJ5Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkgY29udGludWU7XG4gICAgICBmaWxlTmFtZXNCeUtpbmQuc2V0KGVudHJ5Lm5hbWUuc2xpY2UoMCwgLScueW1sJy5sZW5ndGgpLCBlbnRyeS5uYW1lKTtcbiAgICB9XG4gICAgY29uc3QgbWFuZGF0b3J5S2luZHMgPSBbJ3Rlc3QnLCAnc2VtYW50aWMtcHInLCAnY2xvc2UtY29tbWVudCddO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIG1hbmRhdG9yeUtpbmRzLnB1c2goJ3JlbGVhc2UnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgbWFuZGF0b3J5S2luZHMucHVzaCgndGVzdC1ydXN0Jyk7XG4gICAgfVxuICAgIC8vIEEgcHJldmlvdXMgcnVuIG1heSBoYXZlIG1pc3Rha2VuIGEgZ2l0aWdub3JlZCB0aGlyZC1wYXJ0eSBjaGVja291dCBmb3IgcmVwb3NpdG9yeSBSdXN0IGNvZGUuXG4gICAgLy8gUmVtb3ZlIG9ubHkgdGhlIGdlbmVyYXRlZC1zdHlsZSBjYWxsZXI6IGEgc2FtZS1uYW1lZCBjdXN0b20gd29ya2Zsb3cgd2l0aCBhbnkgb3RoZXIgam9iIHN0YXlzLlxuICAgIGlmIChyb290Q29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgdGVzdFJ1c3RGaWxlTmFtZSA9IGZpbGVOYW1lc0J5S2luZC5nZXQoJ3Rlc3QtcnVzdCcpO1xuICAgICAgaWYgKHRlc3RSdXN0RmlsZU5hbWUgJiYgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93KHdvcmtmbG93c1BhdGgsIHRlc3RSdXN0RmlsZU5hbWUsICd0ZXN0LXJ1c3QnKSkge1xuICAgICAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCd0ZXN0LXJ1c3QnKTtcbiAgICAgICAgYXdhaXQgZnNVdGlsLnJlbW92ZUNvbmZpbmVkKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCB0ZXN0UnVzdEZpbGVOYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZpbGVOYW1lc0J5S2luZC5kZWxldGUoJ3diZnknKTtcbiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgbWFuZGF0b3J5S2luZHMpIHtcbiAgICAgIGlmICghZmlsZU5hbWVzQnlLaW5kLmhhcyhraW5kKSkge1xuICAgICAgICBmaWxlTmFtZXNCeUtpbmQuc2V0KGtpbmQsIGAke2tpbmR9LnltbGApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmlsZU5hbWVzQnlLaW5kLmhhcygnc3luYycpKSB7XG4gICAgICAvLyBUaGUgc3luYyB3b3JrZmxvdydzIGdlbmVyYXRpb24gb3ducyB0aGUgZm9yY2Utc3luYyB3b3JrZmxvdywgc28gcHJvY2Vzc2luZyBpdCBhcyBhblxuICAgICAgLy8gaW5kZXBlbmRlbnQga2luZCB3b3VsZCByYWNlIGNvbmN1cnJlbnQgd3JpdGVzIG9uIHRoZSBzYW1lIHBhdGguXG4gICAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCdzeW5jLWZvcmNlJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2luZCwgZmlsZU5hbWVdIG9mIGZpbGVOYW1lc0J5S2luZCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCBhcyBLbm93bktpbmQsIGZpbGVOYW1lKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZTogR2l0SHViIHJlcG9zaXRvcnkgbmFtZXMgYXJlLCBhbmQgYSByZW1vdGUgbWF5IHNwZWxsIHRoaXMgb25lIGFueSB3YXkuIEdldHRpbmcgaXQgd3JvbmdcbiAgLy8gbGV0cyB3YmZ5IHJld3JpdGUgdGhlIHJlcG9zaXRvcnkgdGhhdCBob3N0cyB0aGUgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gIHJldHVybiByZXBvc2l0b3J5Py50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciBldmVyeSBqb2Igb2YgdGhlIHdvcmtmbG93IGZpbGUgY2FsbHMgdGhlIG5hbWVkIFdpbGxCb29zdGVyIHJldXNhYmxlIHdvcmtmbG93IChvd25lclxuICogcmVzdHJpY3RlZCB2aWEgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCkuIFVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgd2JmeSBvd25zIGEgZmlsZSBlbm91Z2ggdG9cbiAqIGRlbGV0ZSBpdDogdW5wYXJzYWJsZSBmaWxlcyBhbmQgZmlsZXMgd2l0aCBhbnkgb3RoZXIgam9iIHJldHVybiBmYWxzZSDigJQgZGVsZXRpbmcgYSB3aG9sZVxuICogd29ya2Zsb3cgb24gYSBsb29zZSBtYXRjaCB3b3VsZCBiZSB0b28gYWdncmVzc2l2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIHdvcmtmbG93TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghZmlsZU5hbWUuZW5kc1dpdGgoJy55bWwnKSkgcmV0dXJuIGZhbHNlO1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGlzVGFyZ2V0Q2FsbCA9ICh1c2VzOiB1bmtub3duKTogYm9vbGVhbiA9PlxuICAgIHR5cGVvZiB1c2VzID09PSAnc3RyaW5nJyAmJiBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKHVzZXMpPy53b3JrZmxvd05hbWUgPT09IHdvcmtmbG93TmFtZTtcbiAgdHJ5IHtcbiAgICBjb25zdCB3b3JrZmxvdyA9IHlhbWwubG9hZChjb250ZW50KSBhcyBXb3JrZmxvdyB8IHVuZGVmaW5lZDtcbiAgICBpZiAod29ya2Zsb3cgJiYgdHlwZW9mIHdvcmtmbG93ID09PSAnb2JqZWN0JyAmJiB3b3JrZmxvdy5qb2JzICYmIHR5cGVvZiB3b3JrZmxvdy5qb2JzID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3Qgam9icyA9IE9iamVjdC52YWx1ZXMod29ya2Zsb3cuam9icyk7XG4gICAgICByZXR1cm4gam9icy5sZW5ndGggPiAwICYmIGpvYnMuZXZlcnkoKGpvYikgPT4gaXNUYXJnZXRDYWxsKGpvYj8udXNlcykpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gVW5wYXJzYWJsZSBjb250ZW50IGlzIG5vdCBwcm92YWJseSBhIGNhbGxlciBvZiB0aGUgbmFtZWQgd29ya2Zsb3cuXG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsXG4gIGtpbmQ6IEtub3duS2luZCxcbiAgZmlsZU5hbWUgPSBgJHtraW5kfS55bWxgXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpO1xuICBjb25zdCBkZXBsb3lQcm9kdWN0aW9uRmlsZU5hbWUgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJykpXG4gICAgPyAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJ1xuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIEEgbm9uLWdlbmVyYXRlZCB0ZXN0LXJ1c3QueW1sIGluIGEgcmVwbyB3aXRob3V0IFJ1c3QgY29kZSBtZXJlbHkgc2hhcmVzIHRoZSBuYW1lOyBsZWF2ZSBpdCBhbG9uZS5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0LXJ1c3QnICYmIGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcbiAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGxldCBvbGRTZXR0aW5nczogV29ya2Zsb3c7XG4gICAgdHJ5IHtcbiAgICAgIG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQW4gZXhpc3Rpbmcgd29ya2Zsb3cgd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0IHVudG91Y2hlZDogd3JpdGluZyB0aGUgdGVtcGxhdGVcbiAgICAgIC8vIHdpdGhvdXQgbWVyZ2luZyB3b3VsZCBzaWxlbnRseSBkaXNjYXJkIHRoZSByZXBvc2l0b3J5J3Mgd29ya2Zsb3cuXG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBZQU1MLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB5YW1sLmxvYWQgcmV0dXJucyB1bmRlZmluZWQgZm9yIGVtcHR5L2NvbW1lbnQtb25seSBmaWxlcyBhbmQgbm9uLW9iamVjdHMgZm9yIHNjYWxhclxuICAgIC8vIGRvY3VtZW50cyB3aXRob3V0IHRocm93aW5nOyBkZWVwbWVyZ2Ugd291bGQgY3Jhc2ggb24gdGhlbS5cbiAgICBpZiAodHlwZW9mIG9sZFNldHRpbmdzICE9PSAnb2JqZWN0JyB8fCBvbGRTZXR0aW5ncyA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgYSB3b3JrZmxvdy5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfVxuXG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICAvLyBVbmxpa2UgdGhlIHJlbGVhc2UgY2FsbGVyLCB0aGUgZGVmYXVsdCBxdWV1ZSAoYHNpbmdsZWApIGlzIGludGVudGlvbmFsIGhlcmU6IGEgcGVuZGluZ1xuICAgICAgLy8gZGVwbG95IHRoYXQgaXMgY2FuY2VsbGVkIGFuZCByZXBsYWNlZCBieSBhIG5ld2VyIG9uZSBsb3NlcyBub3RoaW5nIOKAlCB0aGUgbmV3ZXIgZGVwbG95XG4gICAgICAvLyBjb252ZXJnZXMgdGhlIGVudmlyb25tZW50IHRvIHRoZSBsYXRlc3Qgc3RhdGUgYW55d2F5LlxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbkZpbGVOYW1lKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9IGRlcGxveVByb2R1Y3Rpb25GaWxlTmFtZTtcbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBlbXB0eSBqb2JzIChhIGJhcmUgYGpvYk5hbWU6YCBwYXJzZXMgYXMgbnVsbCksIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3MsIGFuZCBvdGhlclxuICAgIC8vIG9yZ2FuaXphdGlvbnMnIHJldXNhYmxlIHdvcmtmbG93czogYSBzYW1lLW5hbWVkIGByZXVzYWJsZS13b3JrZmxvd3NgIHJlcG9zaXRvcnkgZWxzZXdoZXJlXG4gICAgLy8gZm9sbG93cyBhIGRpZmZlcmVudCBjb250cmFjdCwgYW5kIG5vcm1hbGl6aW5nIGl0cyBjYWxsZXJzIChzZWNyZXQgaW5qZWN0aW9uL3JlbW92YWwsXG4gICAgLy8gcGVybWlzc2lvbnMpIGNvdWxkIGJyZWFrIHRoZW0uXG4gICAgaWYgKCFqb2IgfHwgIXBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoam9iLnVzZXMpKSBjb250aW51ZTtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gICAgaXNSZXVzYWJsZVdvcmtmbG93ID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzUmV1c2FibGVXb3JrZmxvdykgcmV0dXJuO1xuXG4gIC8vIERlcGxveSBjYWxsZXJzIG5lZWQgbm8gcmVwb3NpdG9yeSB3cml0ZXM6IHRoZSBjYWxsZWQgcmV1c2FibGUgd29ya2Zsb3cgaW5oZXJpdHMgdGhlIGNhbGxlcidzXG4gIC8vIHRva2VuIHBlcm1pc3Npb25zLCByZXBvc2l0b3JpZXMgZGVmYXVsdCB0aGUgdG9rZW4gdG8gd3JpdGUsIGFuZCB0aGUgcmV1c2FibGUgZGVwbG95IHdvcmtmbG93XG4gIC8vIGF0IG1haW4gcGVyZm9ybXMgbm8gR0lUSFVCX1RPS0VOIHdyaXRlcy4gVGhlIHJlYWQtb25seSBkZWZhdWx0IGlzIGluamVjdGVkIGF0IHRoZSBKT0IgbGV2ZWxcbiAgLy8gKGpvYiBwZXJtaXNzaW9ucyBkbyBub3QgYWZmZWN0IHNpYmxpbmcgam9icywgc28gaW5saW5lIGpvYnMgb3IgcGlubmVkIGNhbGxlZXMg4oCUIHdob3NlIHdyaXRlXG4gIC8vIG5lZWRzIGFyZSB1bmF1ZGl0ZWQg4oCUIGtlZXAgdGhlaXJzKSwgYW5kIG9ubHkgd2hlbiBuZWl0aGVyIHRoZSB3b3JrZmxvdyBub3IgdGhlIGpvYiBkZWNsYXJlc1xuICAvLyBpdHMgb3duIHBlcm1pc3Npb25zIChPSURDIGRlcGxveXMgYWx3YXlzIGRvLCBmb3IgaWQtdG9rZW4pLiBydW4tc2NyaXB0IGNhbGxlcnMgYXJlIGV4Y2x1ZGVkXG4gIC8vIGJlY2F1c2UgYXJiaXRyYXJ5IHBhY2thZ2Ugc2NyaXB0cyBtYXkgcHVzaCBjb21taXRzLlxuICBpZiAoIW5ld1NldHRpbmdzLnBlcm1pc3Npb25zKSB7XG4gICAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgICAgaWYgKCFqb2IpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY2FsbCA9IHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoam9iLnVzZXMpO1xuICAgICAgaWYgKCFqb2IucGVybWlzc2lvbnMgJiYgY2FsbD8ud29ya2Zsb3dOYW1lID09PSAnZGVwbG95JyAmJiBjYWxsLnJlZiA9PT0gJ21haW4nKSB7XG4gICAgICAgIGpvYi5wZXJtaXNzaW9ucyA9IHsgY29udGVudHM6ICdyZWFkJyB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ3JlbGVhc2UnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnNjaGVkdWxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoO1xuICAgICAgfSBlbHNlIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCAmJiBjb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBjb25maWcucmVsZWFzZS5icmFuY2hlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6XG4gICAgY2FzZSAndGVzdC1ydXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVsbF9yZXF1ZXN0WydwYXRocy1pZ25vcmUnXTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ107XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgdGhlIGZvcmNlLXN5bmMgd29ya2Zsb3cgYmFzZWQgb24gdGhlIHN5bmMgd29ya2Zsb3cgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuLy8gd2IncyBnbG9iYWwgb3B0aW9ucyB0aGF0IGNvbnN1bWUgYSBmb2xsb3dpbmcgdmFsdWUgdG9rZW4gKGZyb20gc2hhcmVkT3B0aW9uc0J1aWxkZXIgcGx1c1xuLy8geWFyZ3NPcHRpb25zQnVpbGRlckZvckVudik7IGV2ZXJ5IG90aGVyIGAtYC1wcmVmaXhlZCB0b2tlbiBiZWZvcmUgdGhlIHN1YmNvbW1hbmQgaXMgYSBib29sZWFuLlxuY29uc3Qgd2JHbG9iYWxWYWx1ZU9wdGlvbnMgPSBuZXcgU2V0KFsnLS13b3JraW5nLWRpcicsICctdycsICctLWVudicsICctLWNhc2NhZGUtZW52J10pO1xuXG4vLyBTdWJjb21tYW5kcyB0aGF0IHJ1biBhIEJJTkFSWSAoc28gdGhlIGZvbGxvd2luZyB0b2tlbiBjYW4gYmUgdGhlIHdiIGV4ZWN1dGFibGUpLCBwZXIgcnVubmVyOiBidW5cbi8vIHJlc2VydmVzIG9ubHkgYHhgIChgYnVuIGRseGAvYGJ1biBleGVjYCBydW4gYSBwYWNrYWdlIHNjcmlwdCBvZiB0aGF0IG5hbWUpLCBucG0gaGFzIGBleGVjYC9geGAsXG4vLyBhbmQgcG5wbS95YXJuIChCZXJyeSkgaGF2ZSBgZXhlY2AvYGRseGAuXG5jb25zdCBydW5uZXJFeGVjdXRvclN1YmNvbW1hbmRzQnlSdW5uZXI6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IHtcbiAgbnBtOiBuZXcgU2V0KFsnZXhlYycsICd4J10pLFxuICBwbnBtOiBuZXcgU2V0KFsnZXhlYycsICdkbHgnXSksXG4gIHlhcm46IG5ldyBTZXQoWydleGVjJywgJ2RseCddKSxcbiAgYnVuOiBuZXcgU2V0KFsneCddKSxcbn07XG5cbi8vIFJ1bm5lciBvcHRpb25zIHRoYXQgY29uc3VtZSB0aGUgRk9MTE9XSU5HIHRva2VuIGFzIHRoZWlyIHZhbHVlLCBzbyBpdCBpcyBub3QgdGhlIHdiIGV4ZWN1dGFibGVcbi8vIChlLmcuIGBidW4gLS1jd2QgZGlyIHdiIGRlcGxveWAsIGBucHggLXAgcGtnIHdiIGRlcGxveWApLiBBIGNvbnNlcnZhdGl2ZSBzdXBlcnNldCBhY3Jvc3Ncbi8vIG5wbS9wbnBtL3lhcm4vYnVuIGFuZCB0aGUgbnB4L2J1bnggcGFja2FnZSBleGVjdXRvcnMuXG5jb25zdCBydW5uZXJWYWx1ZU9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgJy0tY3dkJyxcbiAgJy1DJyxcbiAgJy0tcHJlZml4JyxcbiAgJy0tZmlsdGVyJyxcbiAgJy1GJyxcbiAgJy0td29ya3NwYWNlJyxcbiAgJy13JyxcbiAgJy0tZGlyJyxcbiAgJy1wJyxcbiAgJy0tcGFja2FnZScsXG4gICctYycsXG4gICctLWNhbGwnLFxuXSk7XG5cbi8qKiBBZHZhbmNlIHBhc3QgYSBydW5uZXIncyBvcHRpb25zLCBjb25zdW1pbmcgYSBzZXBhcmF0ZSB2YWx1ZSB0b2tlbiB3aGVyZSBvbmUgYXBwbGllcy4gKi9cbmZ1bmN0aW9uIHNraXBSdW5uZXJPcHRpb25zKHRva2Vuczogc3RyaW5nW10sIHN0YXJ0SW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7XG4gIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGggJiYgKHRva2Vuc1tpbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgIGNvbnN0IG9wdGlvbiA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgaW5kZXgrKztcbiAgICBpZiAoIW9wdGlvbi5pbmNsdWRlcygnPScpICYmIHJ1bm5lclZhbHVlT3B0aW9ucy5oYXMob3B0aW9uKSAmJiBpbmRleCA8IHRva2Vucy5sZW5ndGgpIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIFRva2VuaXplIGEgc2hlbGwgY29tbWFuZCBsaW5lIGludG8gY29tbWFuZCBzZWdtZW50cywgZWFjaCBhIGxpc3Qgb2YgdG9rZW5zIHdpdGggcXVvdGVzIHJlbW92ZWQuXG4gKiBBIG5ldyBzZWdtZW50IHN0YXJ0cyBhdCBhbiB1bnF1b3RlZCBgJiZgL2B8fGAvYDtgL2B8YC9gJmA7IGFuIHVucXVvdGVkIGAjYCBzdGFydHMgYSBjb21tZW50IHRvXG4gKiBlbmQgb2YgbGluZTsgYSBiYWNrc2xhc2ggZXNjYXBlcyB0aGUgbmV4dCBjaGFyYWN0ZXIgKHNvIGBcXDtgIGlzIGEgbGl0ZXJhbCwgbm90IGEgc2VwYXJhdG9yKTtcbiAqIGdyb3VwaW5nIHBhcmVudGhlc2VzIGAoYC9gKWAgYXJlIHRva2VuIHNlcGFyYXRvcnMsIHNvIGAod2IgZGVwbG95KWAgdG9rZW5pemVzIGFzIGB3YiBkZXBsb3lgLlxuICogU2VnbWVudHMvdG9rZW5zIG1vZGVsIGNvbW1hbmQgc3RydWN0dXJlIHByZWNpc2VseSBlbm91Z2ggdGhhdCBxdW90ZWQgb3BlcmF0b3JzLCBlc2NhcGVkXG4gKiBvcGVyYXRvcnMsIGNvbW1lbnRzLCBhbmQgc3Vic2hlbGwgZ3JvdXBzIG5laXRoZXIgZmFicmljYXRlIG5vciBoaWRlIGEgYHdiIGRlcGxveWAgaW52b2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVTaGVsbENvbW1hbmQoc2NyaXB0OiBzdHJpbmcpOiB7IHNlZ21lbnRzOiBzdHJpbmdbXVtdOyBzYXdIZXJlZG9jOiBib29sZWFuIH0ge1xuICBjb25zdCBzZWdtZW50czogc3RyaW5nW11bXSA9IFtdO1xuICBsZXQgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudCA9ICcnO1xuICBsZXQgaW5Ub2tlbiA9IGZhbHNlO1xuICBsZXQgcXVvdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLy8gV2hldGhlciB0aGUgc2NyaXB0IHVzZXMgYW55IGhlcmVkb2MuIEZhaXRoZnVsbHkgY2xhc3NpZnlpbmcgd2hpY2ggYm9keSBsaW5lcyBhcmUgZGF0YSAodGhlXG4gIC8vIGRlbGltaXRlciB3b3JkIGNhbiBiZSBxdW90ZWQvYmFja3NsYXNoLWVzY2FwZWQsIGA8PC1gIHN0cmlwcyBsZWFkaW5nIHRhYnMsIHRlcm1pbmF0b3JzIG1hdGNoXG4gIC8vIGV4YWN0bHkpIGlzIG1vcmUgdGhhbiB0aGlzIHBhcnNlciBtb2RlbHMsIHNvIGEgaGVyZWRvYyBhbnl3aGVyZSBtYWtlcyBkZXRlY3Rpb24gcmV0dXJuIGZhbHNlLlxuICBsZXQgc2F3SGVyZWRvYyA9IGZhbHNlO1xuICAvLyBIZXJlZG9jIGRlbGltaXRlcnMgd2hvc2UgYm9kaWVzIGJlZ2luIGF0IHRoZSBORVhUIG5ld2xpbmU6IGBjYXQgPDxBIDw8QmAgcXVldWVzIEEgdGhlbiBCLCBhbmRcbiAgLy8gdGhlIGNvbW1hbmRzIEFGVEVSIHRoZSBgPDxgIGhlYWRlciBvbiB0aGUgc2FtZSBsaW5lIHN0aWxsIGV4ZWN1dGUsIHNvIHRoZSBoZWFkZXIgaXMgcmVjb3JkZWRcbiAgLy8gaGVyZSBhbmQgdGhlIGJvZGllcyBhcmUgc2tpcHBlZCBvbmx5IHdoZW4gdGhlIGxpbmUncyBuZXdsaW5lIGlzIHJlYWNoZWQuXG4gIGxldCBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNraXBIZXJlZG9jQm9kaWVzID0gKGZyb21JbmRleDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICBsZXQgY3Vyc29yID0gZnJvbUluZGV4O1xuICAgIGZvciAoY29uc3QgZGVsaW1pdGVyIG9mIHBlbmRpbmdIZXJlZG9jRGVsaW1pdGVycykge1xuICAgICAgd2hpbGUgKGN1cnNvciA8IHNjcmlwdC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbGluZVN0YXJ0ID0gY3Vyc29yICsgMTtcbiAgICAgICAgbGV0IGxpbmVFbmQgPSBsaW5lU3RhcnQ7XG4gICAgICAgIHdoaWxlIChsaW5lRW5kIDwgc2NyaXB0Lmxlbmd0aCAmJiBzY3JpcHRbbGluZUVuZF0gIT09ICdcXG4nKSBsaW5lRW5kKys7XG4gICAgICAgIGN1cnNvciA9IGxpbmVFbmQ7XG4gICAgICAgIGlmIChzY3JpcHQuc2xpY2UobGluZVN0YXJ0LCBsaW5lRW5kKS50cmltKCkgPT09IGRlbGltaXRlcikgYnJlYWs7XG4gICAgICAgIGlmIChsaW5lRW5kID49IHNjcmlwdC5sZW5ndGgpIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMgPSBbXTtcbiAgICByZXR1cm4gY3Vyc29yO1xuICB9O1xuICBjb25zdCBlbmRUb2tlbiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoaW5Ub2tlbikgdG9rZW5zLnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9ICcnO1xuICAgIGluVG9rZW4gPSBmYWxzZTtcbiAgfTtcbiAgY29uc3QgZW5kU2VnbWVudCA9ICgpOiB2b2lkID0+IHtcbiAgICBlbmRUb2tlbigpO1xuICAgIHNlZ21lbnRzLnB1c2godG9rZW5zKTtcbiAgICB0b2tlbnMgPSBbXTtcbiAgfTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNjcmlwdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBzY3JpcHRbaW5kZXhdID8/ICcnO1xuICAgIGlmIChxdW90ZSkge1xuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnICYmIHF1b3RlID09PSAnXCInKSB7XG4gICAgICAgIC8vIEluc2lkZSBkb3VibGUgcXVvdGVzLCBiYWNrc2xhc2gtbmV3bGluZSBpcyBzdGlsbCBhIGxpbmUgY29udGludWF0aW9uIChib3RoIHJlbW92ZWQpO1xuICAgICAgICAvLyBhbnkgb3RoZXIgZXNjYXBlZCBjaGFyYWN0ZXIgY29udHJpYnV0ZXMgbGl0ZXJhbGx5LlxuICAgICAgICBpZiAoc2NyaXB0W2luZGV4ICsgMV0gPT09ICdcXG4nKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGN1cnJlbnQgKz0gc2NyaXB0WysraW5kZXhdID8/ICcnO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09IHF1b3RlKSBxdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgIGVsc2UgY3VycmVudCArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnKSB7XG4gICAgICAvLyBCYWNrc2xhc2gtbmV3bGluZSBpcyBhIGxpbmUgY29udGludWF0aW9uOiB0aGUgc2hlbGwgcmVtb3ZlcyBib3RoLCBqb2luaW5nIHRoZSBsaW5lc1xuICAgICAgLy8gd2l0aG91dCBpbnRyb2R1Y2luZyBhIHRva2VuIGJvdW5kYXJ5LiBBbnkgb3RoZXIgZXNjYXBlZCBjaGFyYWN0ZXIgaXMgYSBsaXRlcmFsLlxuICAgICAgaWYgKHNjcmlwdFtpbmRleCArIDFdID09PSAnXFxuJykge1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgKz0gc2NyaXB0WysraW5kZXhdID8/ICcnO1xuICAgICAgaW5Ub2tlbiA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gXCInXCIgfHwgY2hhcmFjdGVyID09PSAnXCInKSB7XG4gICAgICBxdW90ZSA9IGNoYXJhY3RlcjtcbiAgICAgIGluVG9rZW4gPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEEgYDw8YC9gPDwtYCBoZXJlZG9jIHJlZGlyZWN0aW9uOiBpdHMgYm9keSBsaW5lcyAodXAgdG8gdGhlIGRlbGltaXRlciBsaW5lKSBhcmUgREFUQSwgbm90XG4gICAgLy8gY29tbWFuZHMsIHNvIGBjYXQgPDwnRU9GJ1xcbndiIGRlcGxveVxcbkVPRmAgbXVzdCBub3QgcmVhZCBgd2IgZGVwbG95YCBhcyBhbiBpbnZvY2F0aW9uLiBTaW5jZVxuICAgIC8vIHRoZSBjYWxsZXIgZGVjbGluZXMgb24gQU5ZIGhlcmVkb2MsIGZsYWcgaXQgdGhlIGluc3RhbnQgYDw8YCBhcHBlYXJzIOKAlCBiZWZvcmUgcGFyc2luZyB0aGVcbiAgICAvLyBkZWxpbWl0ZXIgd29yZCDigJQgc28gYW4gZXhvdGljIGRlbGltaXRlciAoYDw8K2ApIHRoZSB3b3JkIHNjYW5uZXIgY2Fubm90IHJlYWQgc3RpbGwgZGVjbGluZXMuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJzwnICYmIHNjcmlwdFtpbmRleCArIDFdID09PSAnPCcpIHtcbiAgICAgIHNhd0hlcmVkb2MgPSB0cnVlO1xuICAgICAgbGV0IGN1cnNvciA9IGluZGV4ICsgMjtcbiAgICAgIGlmIChzY3JpcHRbY3Vyc29yXSA9PT0gJy0nKSBjdXJzb3IrKztcbiAgICAgIHdoaWxlICgvWyBcXHRdL3UudGVzdChzY3JpcHRbY3Vyc29yXSA/PyAnJykpIGN1cnNvcisrO1xuICAgICAgbGV0IGRlbGltaXRlciA9ICcnO1xuICAgICAgLy8gVGhlIGRlbGltaXRlciB3b3JkIG1heSBiZSBxdW90ZWQgKGA8PCdFT0YnYCkgb3IgYmFja3NsYXNoLWVzY2FwZWQgKGA8PFxcRU9GYCk7IGVpdGhlciBmb3JtXG4gICAgICAvLyBqdXN0IGRpc2FibGVzIGJvZHkgZXhwYW5zaW9uLCBzbyBjb2xsZWN0IHRoZSBiYXJlIHdvcmQuIE1pc3NpbmcgdGhlIGVzY2FwZWQgZm9ybSB3b3VsZCBkcm9wXG4gICAgICAvLyBgc2F3SGVyZWRvY2AgYW5kIHJlYWQgdGhlIGhlcmVkb2MgYm9keSBhcyBjb21tYW5kcy5cbiAgICAgIGxldCBkZWxpbWl0ZXJRdW90ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgd2hpbGUgKGN1cnNvciA8IHNjcmlwdC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZGVsaW1pdGVyQ2hhciA9IHNjcmlwdFtjdXJzb3JdID8/ICcnO1xuICAgICAgICBpZiAoZGVsaW1pdGVyUXVvdGUpIHtcbiAgICAgICAgICBpZiAoZGVsaW1pdGVyQ2hhciA9PT0gZGVsaW1pdGVyUXVvdGUpIGRlbGltaXRlclF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGVsc2UgZGVsaW1pdGVyICs9IGRlbGltaXRlckNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsaW1pdGVyQ2hhciA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgLy8gQSBiYWNrc2xhc2ggcXVvdGVzIHRoZSBuZXh0IGNoYXJhY3RlciBpbnRvIHRoZSBkZWxpbWl0ZXIgd29yZCAoYDw8XFxFT0ZgIOKGkiBgRU9GYCkuXG4gICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgZGVsaW1pdGVyICs9IHNjcmlwdFtjdXJzb3JdID8/ICcnO1xuICAgICAgICB9IGVsc2UgaWYgKGRlbGltaXRlckNoYXIgPT09IFwiJ1wiIHx8IGRlbGltaXRlckNoYXIgPT09ICdcIicpIHtcbiAgICAgICAgICBkZWxpbWl0ZXJRdW90ZSA9IGRlbGltaXRlckNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoL1tcXHcuLV0vdS50ZXN0KGRlbGltaXRlckNoYXIpKSB7XG4gICAgICAgICAgZGVsaW1pdGVyICs9IGRlbGltaXRlckNoYXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY3Vyc29yKys7XG4gICAgICB9XG4gICAgICBpZiAoZGVsaW1pdGVyKSB7XG4gICAgICAgIC8vIFRoZSBgPDxkZWxpbWAgaGVhZGVyIGlzIGEgcmVkaXJlY3Rpb24gKG5vdCBhIHRva2VuKTsgcmVjb3JkIHRoZSBkZWxpbWl0ZXIgYW5kIGtlZXBcbiAgICAgICAgLy8gcGFyc2luZyB0aGUgcmVzdCBvZiB0aGlzIGxpbmUg4oCUIGl0cyBib2R5IGlzIHNraXBwZWQgd2hlbiB0aGUgbmV3bGluZSBpcyByZWFjaGVkLlxuICAgICAgICBlbmRUb2tlbigpO1xuICAgICAgICBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMucHVzaChkZWxpbWl0ZXIpO1xuICAgICAgICBpbmRleCA9IGN1cnNvciAtIDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnIycgJiYgIWluVG9rZW4pIHtcbiAgICAgIC8vIENvbW1lbnQgcnVucyB0byBlbmQgb2YgbGluZTsgZW5kIHRoZSBjdXJyZW50IGNvbW1hbmQgc2VnbWVudCBhbmQgbGV0IHRoZSBsb29wIHJlc3VtZSBhdFxuICAgICAgLy8gdGhlIG5ld2xpbmUgc28gdGhlIG5leHQgbGluZSBpcyBwYXJzZWQgYXMgaXRzIG93biBzZWdtZW50LlxuICAgICAgZW5kU2VnbWVudCgpO1xuICAgICAgd2hpbGUgKGluZGV4ICsgMSA8IHNjcmlwdC5sZW5ndGggJiYgc2NyaXB0W2luZGV4ICsgMV0gIT09ICdcXG4nKSBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcmJyB8fCBjaGFyYWN0ZXIgPT09ICd8JyB8fCBjaGFyYWN0ZXIgPT09ICc7JyB8fCBjaGFyYWN0ZXIgPT09ICdcXG4nKSB7XG4gICAgICBlbmRTZWdtZW50KCk7XG4gICAgICBpZiAoKGNoYXJhY3RlciA9PT0gJyYnIHx8IGNoYXJhY3RlciA9PT0gJ3wnKSAmJiBzY3JpcHRbaW5kZXggKyAxXSA9PT0gY2hhcmFjdGVyKSBpbmRleCsrO1xuICAgICAgLy8gQSBuZXdsaW5lIHRoYXQgY2xvc2VzIGEgaGVyZWRvYyBoZWFkZXIgbGluZSBjb25zdW1lcyB0aGUgcXVldWVkIGJvZGllcyBiZWZvcmUgdGhlIG5leHRcbiAgICAgIC8vIGNvbW1hbmQuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxuJyAmJiBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMubGVuZ3RoID4gMCkgaW5kZXggPSBza2lwSGVyZWRvY0JvZGllcyhpbmRleCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJygnIHx8IGNoYXJhY3RlciA9PT0gJyknKSB7XG4gICAgICBlbmRUb2tlbigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICgvXFxzL3UudGVzdChjaGFyYWN0ZXIpKSB7XG4gICAgICBlbmRUb2tlbigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGN1cnJlbnQgKz0gY2hhcmFjdGVyO1xuICAgIGluVG9rZW4gPSB0cnVlO1xuICB9XG4gIGVuZFNlZ21lbnQoKTtcbiAgcmV0dXJuIHsgc2VnbWVudHMsIHNhd0hlcmVkb2MgfTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVwbG95IHNjcmlwdCBpbnZva2VzIGB3YiDigKYgZGVwbG95YCBhdCBjb21tYW5kIHBvc2l0aW9uLiBFbnYgYXNzaWdubWVudHMsIHBhY2thZ2VcbiAqIHJ1bm5lcnMsIGFuZCBnbG9iYWwgeWFyZ3Mgb3B0aW9ucyAod2l0aCB0aGVpciB2YWx1ZSB0b2tlbnMpIG1heSBwcmVjZWRlIHRoZSBkZXBsb3kgY29tbWFuZDtcbiAqIHNoZWxsIHF1b3RpbmcsIGVzY2FwaW5nLCBjb21tZW50cywgYW5kIGdyb3VwaW5nIGFyZSBob25vcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlc1diRGVwbG95KGRlcGxveVNjcmlwdDogc3RyaW5nLCBzY3JpcHROYW1lczogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICBjb25zdCB7IHNlZ21lbnRzLCBzYXdIZXJlZG9jIH0gPSB0b2tlbml6ZVNoZWxsQ29tbWFuZChkZXBsb3lTY3JpcHQpO1xuICAvLyBBIGhlcmVkb2MgbWFrZXMgYm9keS12cy1jb21tYW5kIGNsYXNzaWZpY2F0aW9uIHVucmVsaWFibGUgKHNlZSB0b2tlbml6ZVNoZWxsQ29tbWFuZCkuXG4gIGlmIChzYXdIZXJlZG9jKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3QgdG9rZW5zIG9mIHNlZ21lbnRzKSB7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmIC9eW0EtWmEtel9dW0EtWmEtejAtOV9dKj0vdS50ZXN0KHRva2Vuc1tpbmRleF0gPz8gJycpKSBpbmRleCsrO1xuICAgIC8vIExlYWRpbmcgbGF1bmNoZXJzIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBlbnZgICh3aXRoIG9wdGlvbnMgKyBLRVk9dmFsdWUgYXNzaWdubWVudHMpXG4gICAgLy8gYW5kIHRoZSBQT1NJWCBgY29tbWFuZGAgYnVpbHRpbiAod2l0aCBpdHMgYC1wYC9gLXZgL2AtVmAgb3B0aW9ucykuIENvbW1hbmQtcG9zaXRpb24gc2hlbGxcbiAgICAvLyByZXNlcnZlZCB3b3JkcyBhbmQgb3RoZXIgbGF1bmNoZXJzIChgaWZgL2B0aGVuYC9gZm9yYC9gdGltZWAvYGV4ZWNgL2AhYC9icmFjZSBncm91cHMsIOKApikgYXJlXG4gICAgLy8gTk9UIG1vZGVsZWQ6IHRoZXkgbGVhdmUgYSBub24tYHdiYCBmaXJzdCB0b2tlbiwgc28gdGhlIHNlZ21lbnQgc2ltcGx5IGRvZXMgbm90IG1hdGNoLiBUaGlzIGlzXG4gICAgLy8gYSBkZWxpYmVyYXRlIGZhbHNlLW5lZ2F0aXZlIGZvciBnZW5lcmF0ZWQgZ3VpZGFuY2UuXG4gICAgaWYgKHRva2Vuc1tpbmRleF0gPT09ICdlbnYnKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgICAgIGlmICgvXltBLVphLXpfXVtBLVphLXowLTlfXSo9L3UudGVzdCh0b2tlbikpIGluZGV4Kys7XG4gICAgICAgIC8vIGVudidzIGRpcmVjdG9yeSB2YWx1ZSBtYXkgYmUgc2VwYXJhdGUgb3IgYXR0YWNoZWQgKGAtQ2RpcmAsIGAtLWNoZGlyPWRpcmApLiBJdCBjaGFuZ2VzXG4gICAgICAgIC8vIHdoZXJlIHdiIHJ1bnMgYnV0IG5vdCB3aGV0aGVyIHRoZSBjb21tYW5kIGludm9rZXMgd2IgZGVwbG95LlxuICAgICAgICBlbHNlIGlmICh0b2tlbiA9PT0gJy1DJyB8fCB0b2tlbiA9PT0gJy0tY2hkaXInKSBpbmRleCArPSAyO1xuICAgICAgICBlbHNlIGlmICh0b2tlbi5zdGFydHNXaXRoKCctQycpIHx8IHRva2VuLnN0YXJ0c1dpdGgoJy0tY2hkaXI9JykpIGluZGV4Kys7XG4gICAgICAgIGVsc2UgaWYgKHRva2VuID09PSAnLXUnKSBpbmRleCArPSAyO1xuICAgICAgICBlbHNlIGlmICh0b2tlbi5zdGFydHNXaXRoKCctJykpIGluZGV4Kys7XG4gICAgICAgIGVsc2UgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGBjb21tYW5kIENNRGAgZXhlY3V0ZXMgQ01ELCBidXQgYGNvbW1hbmQgLXZgL2AtViBDTURgIG9ubHkgUVVFUlkgaXRzIGF2YWlsYWJpbGl0eSB3aXRob3V0XG4gICAgLy8gcnVubmluZyBpdCwgc28gYSBkZXBsb3kgYmVoaW5kIHRoZW0gZG9lcyBub3QgcnVuLiBUaGUgYHZgL2BWYCBmbGFnIG1heSBiZSBjbHVzdGVyZWQgd2l0aFxuICAgIC8vIG90aGVyIG9wdGlvbiBsZXR0ZXJzIChgY29tbWFuZCAtcHYgd2JgKSwgc28gbWF0Y2ggYW55IG9wdGlvbiBsZXR0ZXIgY2x1c3RlciBjb250YWluaW5nIGl0LlxuICAgIHdoaWxlICh0b2tlbnNbaW5kZXhdID09PSAnY29tbWFuZCcpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICBsZXQgcXVlcmllc09ubHkgPSBmYWxzZTtcbiAgICAgIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGggJiYgKHRva2Vuc1tpbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICBpZiAoL14tW0EtWmEtel0qW3ZWXVtBLVphLXpdKiQvdS50ZXN0KHRva2Vuc1tpbmRleF0gPz8gJycpKSBxdWVyaWVzT25seSA9IHRydWU7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgICBpZiAocXVlcmllc09ubHkpIHtcbiAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbmRleCA8IDApIGNvbnRpbnVlO1xuICAgIC8vIFJlc29sdmUgYSBydW5uZXIgcHJlZml4IHRvIHdoZXRoZXIgdGhlIGZvbGxvd2luZyB0b2tlbiBpcyBhIEJJTkFSWSAodGhlIHdiIGV4ZWN1dGFibGUpIG9yIGFcbiAgICAvLyBwYWNrYWdlIFNDUklQVCBuYW1lLiBgYnVueGAvYG5weGAgYW5kIGA8cG0+IHh8ZGx4fGV4ZWNgIHJ1biBhIGJpbmFyeTsgYDxwbT4gcnVufHJ1bi1zY3JpcHRgXG4gICAgLy8gKGFuZCBiYXJlIGBucG0gPG5hbWU+YCwgb3IgYW55IHJ1bm5lciBmb2xsb3dlZCBieSBgLS1gKSBydW4gYSBwYWNrYWdlIHNjcmlwdCDigJQgc29cbiAgICAvLyBgbnBtIHJ1biB3YiBkZXBsb3lgIGV4ZWN1dGVzIHRoZSBzY3JpcHQgbmFtZWQgYHdiYCwgbm90IHRoZSB3YiBiaW5hcnksIGFuZCBtdXN0IGJlIHJlamVjdGVkLlxuICAgIGlmIChbJ25wbScsICdwbnBtJywgJ3lhcm4nLCAnYnVuJ10uaW5jbHVkZXModG9rZW5zW2luZGV4XSA/PyAnJykpIHtcbiAgICAgIGNvbnN0IHJ1bm5lciA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgICBpbmRleCA9IHNraXBSdW5uZXJPcHRpb25zKHRva2VucywgaW5kZXggKyAxKTtcbiAgICAgIGNvbnN0IHN1YmNvbW1hbmQgPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgaWYgKFsncnVuJywgJ3J1bi1zY3JpcHQnXS5pbmNsdWRlcyhzdWJjb21tYW5kKSkgY29udGludWU7IC8vIHJ1bnMgYSBwYWNrYWdlIHNjcmlwdCwgbm90IHdiXG4gICAgICAvLyBFeGVjdXRvciBzdWJjb21tYW5kcyBhcmUgcnVubmVyLVNQRUNJRklDOiBidW4gcmVzZXJ2ZXMgb25seSBgeGAgKGBidW4gZGx4YC9gYnVuIGV4ZWNgIHJ1biBhXG4gICAgICAvLyBwYWNrYWdlIHNjcmlwdCBuYW1lZCBkbHgvZXhlYykuIFJlYWwgYnVpbHQtaW4gZXhlY3V0b3JzIChgZXhlY2AvYHhgLCBhbmQgYGRseGAgZm9yIHBucG0pXG4gICAgICAvLyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBhIHNhbWUtbmFtZWQgc2NyaXB0LCBzbyB0aGV5IGFyZSBOT1Qgc2hhZG93LWNoZWNrZWQuIE9ubHkgYHlhcm4gZGx4YCBpc1xuICAgICAgLy8gYW1iaWd1b3VzIOKAlCBhIEJlcnJ5IGJ1aWx0LWluIGJ1dCBhIHBhY2thZ2UgU0NSSVBUIGluIFlhcm4gQ2xhc3NpYyDigJQgc28gYSBkZWNsYXJlZCBgZGx4YFxuICAgICAgLy8gc2NyaXB0IG1ha2VzIGB5YXJuIGRseGAgZGVjbGluZSAoZmFsbCB0aHJvdWdoIHRvIHRoZSBwYWNrYWdlLXNjcmlwdCBjaGVja3MpLlxuICAgICAgY29uc3QgaXNZYXJuRGx4U2hhZG93ZWRCeVNjcmlwdCA9IHJ1bm5lciA9PT0gJ3lhcm4nICYmIHN1YmNvbW1hbmQgPT09ICdkbHgnICYmIHNjcmlwdE5hbWVzLmhhcygnZGx4Jyk7XG4gICAgICBpZiAocnVubmVyRXhlY3V0b3JTdWJjb21tYW5kc0J5UnVubmVyW3J1bm5lcl0/LmhhcyhzdWJjb21tYW5kKSAmJiAhaXNZYXJuRGx4U2hhZG93ZWRCeVNjcmlwdCkge1xuICAgICAgICBpbmRleCsrOyAvLyBiaW5hcnkgcnVubmVyIChwbnBtIGRseCwgYnVuIHgsIGBucG0gZXhlYyAtLSB3YiDigKZgKVxuICAgICAgICBpZiAodG9rZW5zW2luZGV4XSA9PT0gJy0tJykgaW5kZXgrKzsgLy8gdGhlIGV4ZWN1dG9yJ3Mgb3B0aW9uYWwgYC0tYCBiZWZvcmUgdGhlIGNvbW1hbmRcbiAgICAgIH0gZWxzZSBpZiAocnVubmVyID09PSAnbnBtJykge1xuICAgICAgICBjb250aW51ZTsgLy8gYmFyZSBgbnBtIHdiYCBuZXZlciBydW5zIGEgYmluYXJ5XG4gICAgICB9IGVsc2UgaWYgKHRva2Vuc1tpbmRleF0gPT09ICd3YicgJiYgc2NyaXB0TmFtZXMuaGFzKCd3YicpKSB7XG4gICAgICAgIC8vIEJhcmUgYGJ1bi9wbnBtL3lhcm4gd2JgIHJ1bnMgYSBwYWNrYWdlIFNDUklQVCBuYW1lZCBgd2JgIHdoZW4gb25lIGV4aXN0cyAocGFzc2luZyBgZGVwbG95YFxuICAgICAgICAvLyBhcyBpdHMgYXJndW1lbnQpLCBub3QgdGhlIHdiIGJpbmFyeS5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChbJ2J1bngnLCAnbnB4J10uaW5jbHVkZXModG9rZW5zW2luZGV4XSA/PyAnJykpIHtcbiAgICAgIGluZGV4ID0gc2tpcFJ1bm5lck9wdGlvbnModG9rZW5zLCBpbmRleCArIDEpO1xuICAgIH1cbiAgICBpZiAodG9rZW5zW2luZGV4XSAhPT0gJ3diJykgY29udGludWU7XG4gICAgY29uc3Qgd2JBcmdzID0gdG9rZW5zLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgLy8gU2tpcCBnbG9iYWwgb3B0aW9ucyAoYW5kIGFueSB2YWx1ZSB0b2tlbiBhIHZhbHVlLWJlYXJpbmcgb3B0aW9uIGNvbnN1bWVzKSBzbyB0aGUgRklSU1RcbiAgICAvLyBjb21tYW5kIHRva2VuIGRlY2lkZXM6IGB3YiAtLWNhc2NhZGUtZW52IHByb2R1Y3Rpb24gZGVwbG95YCBhbmQgYHdiIC13IHBhY2thZ2VzL2FwaSBkZXBsb3lgXG4gICAgLy8gbWF0Y2gsIHdoaWxlIHN1YmNvbW1hbmRzIG93bmluZyB0aGVpciBvd24gYGRlcGxveWAgKGB3YiBwcmlzbWEgZGVwbG95YCwgYHdiIHJldHJ5IGRlcGxveWApXG4gICAgLy8gZG8gbm90LiBgLS1vcHQ9dmFsdWVgIGNhcnJpZXMgaXRzIHZhbHVlIGlubGluZSwgc28gb25seSB0aGUgc3BhY2Utc2VwYXJhdGVkIGZvcm0gc2tpcHMgb25lLlxuICAgIGxldCBjb21tYW5kSW5kZXggPSAwO1xuICAgIHdoaWxlIChjb21tYW5kSW5kZXggPCB3YkFyZ3MubGVuZ3RoICYmICh3YkFyZ3NbY29tbWFuZEluZGV4XSA/PyAnJykuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICBjb25zdCBmbGFnID0gd2JBcmdzW2NvbW1hbmRJbmRleF0gPz8gJyc7XG4gICAgICBjb21tYW5kSW5kZXgrKztcbiAgICAgIGlmICh3Ykdsb2JhbFZhbHVlT3B0aW9ucy5oYXMoZmxhZykgJiYgY29tbWFuZEluZGV4IDwgd2JBcmdzLmxlbmd0aCkgY29tbWFuZEluZGV4Kys7XG4gICAgfVxuICAgIGlmICh3YkFyZ3NbY29tbWFuZEluZGV4XSAhPT0gJ2RlcGxveScpIGNvbnRpbnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSB3b3JrZmxvd3MgZGlyZWN0b3J5IGhvbGRzIGEgbGl2ZSBjYWxsZXIgb2YgdGhlIHJldXNhYmxlIENsb3VkZmxhcmUgZGVwbG95IHdvcmtmbG93LlxuICogWUFNTCBpcyBwYXJzZWQgYW5kIG9ubHkgYGpvYnMuKi51c2VzYCB2YWx1ZXMgYXJlIGluc3BlY3RlZCAoYSByYXctdGV4dCBzZWFyY2ggd291bGQgbWF0Y2hcbiAqIGNvbW1lbnRzIG9yIGBydW46YCBzdHJpbmdzKSwgd2l0aCBhIGBkZXBsb3kqYC1maWxlbmFtZSBzaG9ydGN1dCBhbmQgYSBjb25zZXJ2YXRpdmUgcmF3LXRleHRcbiAqIGZhbGxiYWNrIGZvciB1bnBhcnNlYWJsZSBmaWxlcy4gVXNlZCBieSB0aGUgYWdlbnQtaW5zdHJ1Y3Rpb24gZ2VuZXJhdG9yIHNvIGdlbmVyYXRlZCBndWlkYW5jZVxuICogZGVzY3JpYmVzIG9ubHkgd29ya2Zsb3dzIHRoYXQgZXhpc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3cod29ya2Zsb3dzRGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBlbnRyaWVzOiBmcy5EaXJlbnRbXTtcbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMod29ya2Zsb3dzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZSBvd25lci9yZXBvc2l0b3J5IChHaXRIdWIgdHJlYXRzIHRoZW0gc28pLCBjYXNlLXNlbnNpdGl2ZSBwYXRoL3JlZiDigJQgbWF0Y2hpbmdcbiAgLy8gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCwgdXNlZCBmb3IgdGhlIHVucGFyc2VhYmxlLVlBTUwgcmF3LXRleHQgZmFsbGJhY2sgb25seS5cbiAgY29uc3QgZGVwbG95Q2FsbFBhdHRlcm4gPSAvW14vXStcXC9yZXVzYWJsZS13b3JrZmxvd3NcXC9cXC5naXRodWJcXC93b3JrZmxvd3NcXC9kZXBsb3lcXC55YT9tbEAvaXU7XG4gIGNvbnN0IGNhbGxzRGVwbG95V29ya2Zsb3cgPSAodXNlczogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PlxuICAgIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwodXNlcyk/LndvcmtmbG93TmFtZSA9PT0gJ2RlcGxveSc7XG4gIHJldHVybiBlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiB7XG4gICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhL1xcLnlhP21sJC91LnRlc3QoZW50cnkubmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgcmV0dXJuIHRydWU7XG4gICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzRGlyUGF0aCwgZW50cnkubmFtZSksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCB3b3JrZmxvdyA9IHlhbWwubG9hZChjb250ZW50KSBhcyBXb3JrZmxvdyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh3b3JrZmxvdyAmJiB0eXBlb2Ygd29ya2Zsb3cgPT09ICdvYmplY3QnICYmIHdvcmtmbG93LmpvYnMgJiYgdHlwZW9mIHdvcmtmbG93LmpvYnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHdvcmtmbG93LmpvYnMpLnNvbWUoKGpvYikgPT4gY2FsbHNEZXBsb3lXb3JrZmxvdyhqb2I/LnVzZXMpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBkZXBsb3lDYWxsUGF0dGVybi50ZXN0KGNvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIFRoZSByZXVzYWJsZSB3b3JrZmxvd3MgdGhhdCBkZWNsYXJlIEZOT1hfQUdFX0tFWSBhbmQgVkVSREFDQ0lPX1RPS0VOIHVuZGVyXG4vLyBvbi53b3JrZmxvd19jYWxsLnNlY3JldHMgKHNlZSBXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MpLiBQYXNzaW5nIGVpdGhlciBzZWNyZXQgdG8gYW55XG4vLyBvdGhlciBjYWxsZWUgaXMgYSBHaXRIdWIgZXJyb3IuXG5jb25zdCBpbnN0YWxsQ2FwYWJsZVJldXNhYmxlV29ya2Zsb3dzID0gbmV3IFNldChbJ2RlcGxveScsICdyZWxlYXNlJywgJ3J1bi1zY3JpcHQnLCAndGVzdCddKTtcbmNvbnN0IHJldXNhYmxlV29ya2Zsb3dQZXJtaXNzaW9uczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7XG4gIC8vIHNraXAtZHVwbGljYXRlLWFjdGlvbnMgcmVhZHMgd29ya2Zsb3cgcnVuczsgY2FuY2VsX290aGVycyBpcyBmYWxzZSwgc28gcmVhZCBpcyBlbm91Z2guXG4gICd0ZXN0LXJ1c3QnOiB7IGFjdGlvbnM6ICdyZWFkJywgY29udGVudHM6ICdyZWFkJyB9LFxuICAnc2VtYW50aWMtcHInOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLCBzdGF0dXNlczogJ3dyaXRlJyB9LFxuICAnY2xvc2UtY29tbWVudCc6IHsgJ3B1bGwtcmVxdWVzdHMnOiAnd3JpdGUnIH0sXG59O1xuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgLy8gYHNlY3JldHM6IGluaGVyaXRgIChwYXJzZWQgYnkganMteWFtbCBhcyBhIHBsYWluIHN0cmluZykgYWxyZWFkeSBmb3J3YXJkcyBldmVyeSBjYWxsZXIgc2VjcmV0XG4gIC8vIGluY2x1ZGluZyB0aGUgb25lcyBpbmplY3RlZCBiZWxvdywgc28gcHJlc2VydmUgaXQgdW50b3VjaGVkIOKAlCBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvbiB0aGVcbiAgLy8gc3RyaW5nIHdvdWxkIHRocm93LiBDYXZlYXQ6IGBpbmhlcml0YCBmb3J3YXJkcyBzZWNyZXRzIHVuZGVyIHRoZWlyIGV4aXN0aW5nIE5BTUVTLCBzbyBpdCBjYW5cbiAgLy8gbmV2ZXIgZmVlZCBQVUJMSUNfRk5PWF9BR0VfS0VZIGludG8gdGhlIGNhbGxlZSdzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWTsgYSBoYW5kLXdyaXR0ZW5cbiAgLy8gaW5oZXJpdCBjYWxsZXIgaW4gYSBQVUJMSUMgZm5veCByZXBvc2l0b3J5IG11c3QgYmUgY29udmVydGVkIHRvIGFuIGV4cGxpY2l0IG1hcHBpbmcgbWFudWFsbHlcbiAgLy8gKHdiZnkgbmV2ZXIgZ2VuZXJhdGVzIHRoZSBpbmhlcml0IGZvcm0sIGFuZCBoYW5kLXdyaXR0ZW4gZGV2aWF0aW9ucyBhcmUgZml4ZWQgaW4gdGhlIHRhcmdldFxuICAvLyByZXBvc2l0b3J5IGJ5IHBvbGljeSkuXG4gIGNvbnN0IHNlY3JldHMgPSBqb2Iuc2VjcmV0cyA9PT0gJ2luaGVyaXQnID8gdW5kZWZpbmVkIDogKGpvYi5zZWNyZXRzID0gam9iLnNlY3JldHMgPz8ge30pO1xuXG4gIGlmIChzZWNyZXRzICYmIChraW5kID09PSAndGVzdCcgfHwga2luZCA9PT0gJ3JlbGVhc2UnKSkge1xuICAgIHNlY3JldHMuR0hfVE9LRU4gPSAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JztcbiAgfVxuXG4gIC8vIGZub3gudG9tbCBjYXJyaWVzIGFnZS1lbmNyeXB0ZWQgYXBwIHNlY3JldHM7IENJIGRlY3J5cHRzIHRoZW0gd2l0aCB0aGUgRk5PWF9BR0VfS0VZIChvciwgZm9yXG4gIC8vIHB1YmxpYyByZXBvc2l0b3JpZXMsIFBVQkxJQ19GTk9YX0FHRV9LRVkpIG9yZ2FuaXphdGlvbiBzZWNyZXQuXG4gIC8vIEtleSB0aGUgaW5qZWN0aW9uIG9uIHRoZSAqY2FsbGVkKiByZXVzYWJsZSB3b3JrZmxvdywgbm90IHRoZSBjYWxsZXIncyBmaWxlbmFtZTogY2FsbGVycyBtYXkgaGF2ZVxuICAvLyBhcmJpdHJhcnkgbmFtZXMgKGUuZy4gc2NoZWR1bGVkIHJ1bi1zY3JpcHQgY2FsbGVycyksIGFuZCBHaXRIdWIgcmVqZWN0cyBwYXNzaW5nIGEgc2VjcmV0IHRoYXQgdGhlXG4gIC8vIGNhbGxlZSBkb2VzIG5vdCBkZWNsYXJlLlxuICAvLyBPbmx5IGFuIEBtYWluIGNhbGxlZSBpcyBrbm93biB0byBmb2xsb3cgdGhlIGN1cnJlbnQgc2VjcmV0IGNvbnRyYWN0OiBhIHdvcmtmbG93IHBpbm5lZCB0byBhblxuICAvLyBvbGRlciB0YWcgb3IgU0hBIG1heSBzdGlsbCBkZWNsYXJlIE5QTV9UT0tFTiAoYW5kIG5vdCBWRVJEQUNDSU9fVE9LRU4pLCBhbmQgR2l0SHViIHJlamVjdHMgYVxuICAvLyBjYWxsZXIgd2hvc2Ugc2VjcmV0cyBkbyBub3QgbWF0Y2ggdGhlIHNlbGVjdGVkIHJldmlzaW9uJ3MgZGVjbGFyYXRpb25zLCBzbyBwaW5uZWQgY2FsbGVycyBrZWVwXG4gIC8vIHRoZWlyIHNlY3JldHMgdW50b3VjaGVkLlxuICBjb25zdCBvcmdXb3JrZmxvd0NhbGwgPSBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKTtcbiAgY29uc3QgY2FsbGVkUmV1c2FibGVXb3JrZmxvdyA9IG9yZ1dvcmtmbG93Q2FsbD8ucmVmID09PSAnbWFpbicgPyBvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXF1aXJlZFBlcm1pc3Npb25zID0gY2FsbGVkUmV1c2FibGVXb3JrZmxvdyA/IHJldXNhYmxlV29ya2Zsb3dQZXJtaXNzaW9uc1tjYWxsZWRSZXVzYWJsZVdvcmtmbG93XSA6IHVuZGVmaW5lZDtcbiAgaWYgKHJlcXVpcmVkUGVybWlzc2lvbnMpIGpvYi5wZXJtaXNzaW9ucyA9IHsgLi4ucmVxdWlyZWRQZXJtaXNzaW9ucyB9O1xuICBpZiAoc2VjcmV0cyAmJiBjYWxsZWRSZXVzYWJsZVdvcmtmbG93ICYmIGluc3RhbGxDYXBhYmxlUmV1c2FibGVXb3JrZmxvd3MuaGFzKGNhbGxlZFJldXNhYmxlV29ya2Zsb3cpKSB7XG4gICAgLy8gVGhlIGNhbGxlZSByb3V0ZXMgcHVibGljIChkZWZhdWx0LXJlZ2lzdHJ5KSBpbnN0YWxscyB0aHJvdWdoIHRoZSBUYWt1bWkgR3VhcmRcbiAgICAvLyBtYWxpY2lvdXMtcGFja2FnZS1ibG9ja2luZyBwcm94eSB3aGVuIHRoaXMgdG9rZW4gcmVzb2x2ZXM7IGFuIHVuc2V0IG9yZ2FuaXphdGlvbiBzZWNyZXRcbiAgICAvLyBleHBhbmRzIHRvICcnIGFuZCB0aGUgY2FsbGVlIHRyZWF0cyB0aGF0IGFzIFwiZmVhdHVyZSBvZmZcIiwgc28gcGFzc2luZyBpdCBpcyBhbHdheXMgc2FmZS5cbiAgICBzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiA9ICcke3sgc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gfX0nO1xuICAgIC8vIFRoZSBjYWxsZWUgZ2VuZXJhdGVzIHRoZSB3b3Jrc3BhY2UgLm5wbXJjIGZvciBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qIGZyb20gVkVSREFDQ0lPX1RPS0VOXG4gICAgLy8gYmVmb3JlIGluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLiBPbmx5IHJlcG9zaXRvcmllcyB0aGF0IGFjdHVhbGx5IHJlc29sdmUgcHJpdmF0ZSBwYWNrYWdlc1xuICAgIC8vIChvciBwdWJsaXNoIHRvIFZlcmRhY2NpbykgZ2V0IHRoZSBwYXNzLXRocm91Z2g6IGV2ZXJ5d2hlcmUgZWxzZSB0aGUgY3JlZGVudGlhbCB3b3VsZCBmbG93XG4gICAgLy8gaW50byBDSSBydW5zIHRoYXQgbmV2ZXIgdXNlIGl0LCBzbyB0aGUgbGluZSBpcyByZW1vdmVkIGluc3RlYWQuIFRoZSBHaXRIdWIgc2VjcmV0IGl0c2VsZiBpc1xuICAgIC8vIGFsd2F5cyByZWdpc3RlcmVkIG1hbnVhbGx5IGFuZCBzdGF5cyByZWdpc3RlcmVkIGVpdGhlciB3YXkuXG4gICAgaWYgKHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyhjb25maWcpKSB7XG4gICAgICBzZWNyZXRzLlZFUkRBQ0NJT19UT0tFTiA9ICcke3sgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU4gfX0nO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU47XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKSkge1xuICAgICAgLy8gUHVibGljIHJlcG9zaXRvcmllcyBjb21taXQgd29ybGQtcmVhZGFibGUgY2lwaGVydGV4dHMsIHNvIHRoZXkgZGVjcnlwdCB3aXRoIGEgZGVkaWNhdGVkXG4gICAgICAvLyBDSSBpZGVudGl0eSAodGhlIFBVQkxJQ19GTk9YX0FHRV9LRVkgb3JnYW5pemF0aW9uIHNlY3JldCkgaW5zdGVhZCBvZiB0aGUgb3JnLWludGVybmFsXG4gICAgICAvLyBvbmU7IHRoZSBjYWxsZWUgc3RpbGwgcmVjZWl2ZXMgaXQgdW5kZXIgaXRzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWSBuYW1lLiBXaGVuIG5vIENJXG4gICAgICAvLyBpZGVudGl0eSByZXNvbHZlcyAoc2VlIGZub3hBZ2VLZXlNYXBwaW5nKSwgbGVhdmUgYW55IGV4aXN0aW5nIG1hcHBpbmcgdW50b3VjaGVkIGFuZCBhZGRcbiAgICAgIC8vIG5vbmU6IGNyZWF0aW5nIG9yIHJld3JpdGluZyBvbmUgb24gaW5jb21wbGV0ZSBpbmZvcm1hdGlvbiB3b3VsZCBtYXAgYSBwb3NzaWJseS1wdWJsaWNcbiAgICAgIC8vIHJlcG9zaXRvcnkgdG8gdGhlIHdyb25nIGlkZW50aXR5LCBhbmQgYSBmbm94IHJlY2lwaWVudCBzeW5jIGZhaWx1cmUgZG9lcyBub3Qgc3RvcCB0aGlzXG4gICAgICAvLyBnZW5lcmF0b3IgZnJvbSB3cml0aW5nIGZpbGVzIOKAlCB0aGUgZmFpbGVkIHJ1bidzIHJlcnVuIGZpbGxzIHRoZSBtYXBwaW5nIGluLlxuICAgICAgY29uc3QgbWFwcGluZyA9IGZub3hBZ2VLZXlNYXBwaW5nKGNvbmZpZyk7XG4gICAgICBpZiAobWFwcGluZykge1xuICAgICAgICBzZWNyZXRzLkZOT1hfQUdFX0tFWSA9IG1hcHBpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChraW5kID09PSAndGVzdC1ydXN0Jykge1xuICAgIGNvbnN0IFtydXN0RGlyUGF0aF0gPSBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHM7XG4gICAgaWYgKHJ1c3REaXJQYXRoICYmIHJ1c3REaXJQYXRoICE9PSAnLicpIHtcbiAgICAgIGpvYi53aXRoLndvcmtpbmdfZGlyZWN0b3J5ID0gcnVzdERpclBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iud2l0aC53b3JraW5nX2RpcmVjdG9yeTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWNvbnN0cnVjdCBmcm9tIHRoZSBwYXJzZWQgY2FsbCBzbyBhIGRpZmZlcmVudGx5IGNhc2VkIG93bmVyIChHaXRIdWIgaXMgY2FzZS1pbnNlbnNpdGl2ZVxuICAvLyB0aGVyZSkgaXMgYWxzbyBub3JtYWxpemVkIHRvIHRoZSByZXBvc2l0b3J5J3Mgb3duIG9yZ2FuaXphdGlvbiAvIG1pcnJvci5cbiAgaWYgKG9yZ1dvcmtmbG93Q2FsbCAmJiBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBgV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzLyR7b3JnV29ya2Zsb3dDYWxsLndvcmtmbG93TmFtZX0uJHtvcmdXb3JrZmxvd0NhbGwuZXh0ZW5zaW9ufUAke29yZ1dvcmtmbG93Q2FsbC5yZWZ9YDtcbiAgfSBlbHNlIGlmIChvcmdXb3JrZmxvd0NhbGwgJiYgY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gYFdpbGxCb29zdGVyTGFiL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy8ke29yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWV9LiR7b3JnV29ya2Zsb3dDYWxsLmV4dGVuc2lvbn1AJHtvcmdXb3JrZmxvd0NhbGwucmVmfWA7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSAmJiAham9iLndpdGguY2lfbGFiZWwgJiYga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9ICdsYXJnZSc7XG4gIH1cbiAgY29uc3QgYWNjZXB0c1J1bm5lcklucHV0ID0gWyd0ZXN0JywgJ3Rlc3QtcnVzdCcsICdkZXBsb3knLCAncmVsZWFzZScsICdydW4tc2NyaXB0J10uaW5jbHVkZXMoXG4gICAgb3JnV29ya2Zsb3dDYWxsPy53b3JrZmxvd05hbWUgPz8gJydcbiAgKTtcbiAgaWYgKGNvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24pIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbyAmJiBhY2NlcHRzUnVubmVySW5wdXQpIHtcbiAgICAgIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgam9iLndpdGgucnVuc19vbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBsYWJlbHMgPSB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAudHJhbnNmb3JtKCh2YWx1ZSwgY3R4KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKSBhcyB1bmtub3duO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgY3R4LmFkZElzc3VlKHsgY29kZTogJ2N1c3RvbScsIG1lc3NhZ2U6ICdFeHBlY3RlZCBKU09OIHJ1bm5lciBsYWJlbHMnIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHouTkVWRVI7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAucGlwZSh6LmFycmF5KHouc3RyaW5nKCkpKVxuICAgICAgICAuc2FmZVBhcnNlKGpvYi53aXRoLnJ1bnNfb24pO1xuICAgICAgaWYgKGxhYmVscy5zdWNjZXNzICYmIGxhYmVscy5kYXRhLmluY2x1ZGVzKCdzZWxmLWhvc3RlZCcpKSB7XG4gICAgICAgIGpvYi53aXRoLnJ1bnNfb24gPSBKU09OLnN0cmluZ2lmeShsYWJlbHMuZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFJlbW92ZWQgcnVuc19vbiBmcm9tICR7am9iLnVzZXN9OiBwcml2YXRlIHJlcG9zaXRvcmllcyByZXF1aXJlIGEgc2VsZi1ob3N0ZWQgbGFiZWwgYXJyYXkuYCk7XG4gICAgICAgIGRlbGV0ZSBqb2Iud2l0aC5ydW5zX29uO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKHNlY3JldHMpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKHNlY3JldHMpO1xuICAgICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGhlIHNlY3JldCBleHByZXNzaW9uIHRoZSBjYWxsZXIgbWFwcyBpbnRvIHRoZSBjYWxsZWUncyBkZWNsYXJlZCBGTk9YX0FHRV9LRVksIG9yIHVuZGVmaW5lZFxuICogd2hlbiB0aGUgcmVwb3NpdG9yeSBzdGF0ZSBkb2VzIG5vdCBpZGVudGlmeSBhIHVzYWJsZSBDSSBpZGVudGl0eSDigJQgYW4gdW5rbm93biB2aXNpYmlsaXR5LCBhXG4gKiByZXBvc2l0b3J5IG5vIENJIHNjb3BlIGNvdmVycyAoZGVyaXZpbmcgZnJvbSB0aGUgc2FtZSBwcmluY2lwYWwgcm9zdGVyIGFzIHRoZSByZWNpcGllbnQgc3luY1xuICoga2VlcHMgdGhlIHR3byBmcm9tIGV2ZXIgZGlzYWdyZWVpbmcpLCBvciBhIGZhaWxlZCBmbm94IHJlY2lwaWVudCBzeW5jLCB3aG9zZSBjaXBoZXJ0ZXh0cyBtYXlcbiAqIHN0aWxsIHRhcmdldCB0aGUgcHJldmlvdXMgaWRlbnRpdHkuIFRoZSBjYWxsZXIgbXVzdCB0aGVuIHByZXNlcnZlIGFueSBleGlzdGluZyBtYXBwaW5nLlxuICovXG5mdW5jdGlvbiBmbm94QWdlS2V5TWFwcGluZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24gfHwgaGFzRm5veFN5bmNGYWlsZWQoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgc2VjcmV0TmFtZSA9IHJlc29sdmVGbm94Q2lBZ2VLZXlTZWNyZXROYW1lKGNvbmZpZyk7XG4gIHJldHVybiBzZWNyZXROYW1lICYmIGBcXCR7eyBzZWNyZXRzLiR7c2VjcmV0TmFtZX0gfX1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEEgcGVybWlzc2lvbnMgb2JqZWN0IGVtcHRpZWQgYnkgdGhlIHBlci1raW5kIGRlbGV0aW9ucyAoZS5nLiBhbiBleGlzdGluZyB0ZXN0LXJ1c3QgY2FsbGVyXG4gIC8vIHdob3NlIG9ubHkgZW50cnkgd2FzIGBhY3Rpb25zYCkgbXVzdCBiZSBkcm9wcGVkIGVudGlyZWx5OiBgcGVybWlzc2lvbnM6IHt9YCBzdHJpcHMgRVZFUllcbiAgLy8gdG9rZW4gcGVybWlzc2lvbiBmcm9tIHRoZSB3b3JrZmxvdywgdW5saWtlIHRoZSBhYnNlbnQga2V5IHdoaWNoIGtlZXBzIHRoZSBkZWZhdWx0cy5cbiAgaWYgKG5ld1NldHRpbmdzLnBlcm1pc3Npb25zICYmIE9iamVjdC5rZXlzKG5ld1NldHRpbmdzLnBlcm1pc3Npb25zKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MucGVybWlzc2lvbnM7XG4gIH1cbiAgY29uc3QgeWFtbFRleHQgPSB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KTtcbiAgYXdhaXQgZnNVdGlsLndyaXRlRmlsZUNvbmZpbmVkKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyB9IGZyb20gJy4uL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cG9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhwYWNrYWdlQ29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGFja2FnZUNvbmZpZy5kaXJQYXRoO1xuICAgIGNvbnN0IGRvY0ZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZml4VHlwb3MgcnVucyBvbmNlIG9uIHRoZSByb290IGNvbmZpZywgc28gdGhpcyBnbG9iIHNldCBtdXN0IGNvdmVyIGV2ZXJ5IGRlY2xhcmVkIHdvcmtzcGFjZVxuICAgIC8vIGxheW91dCAoZS5nLiBhcHBzLyopLCBub3QganVzdCB0aGUgY29udmVudGlvbmFsIHBhY2thZ2VzLyogZGlyZWN0b3J5IOKAlCB3aGlsZSBob25vcmluZ1xuICAgIC8vIGRlY2xhcmVkIG5lZ2F0aW9ucyAoZS5nLiBgIWFwcHMvZXhjbHVkZWRgKSwgd2hvc2Ugc291cmNlcyBhcmUgbm90IHBhcnQgb2YgdGhlIG1vbm9yZXBvLlxuICAgIGNvbnN0IHdvcmtzcGFjZURpclBhdHRlcm5zID0gZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMocGFja2FnZUNvbmZpZyk7XG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgIC4uLndvcmtzcGFjZURpclBhdHRlcm5zLmluY2x1ZGVzLm1hcChcbiAgICAgICAgICAoZGlyUGF0dGVybikgPT4gYCR7ZGlyUGF0dGVybn0vKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH1gXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAge1xuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgICAgaWdub3JlOiBbLi4uZ2xvYklnbm9yZSwgLi4ud29ya3NwYWNlRGlyUGF0dGVybnMuZXhjbHVkZXMubWFwKChkaXJQYXR0ZXJuKSA9PiBgJHtkaXJQYXR0ZXJufS8qKmApXSxcbiAgICAgIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5Db2RlKG9sZENvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJblRleHQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFxiY1xcLmZcXC4oPz1cXHN8JCkvZywgJ2NmLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKD89XFxzfCQpL2csICdlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oPz1cXHMpL2csICdpLmUuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIGNvbnRlbnRcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csIChjb21tZW50KSA9PiBmaXhUeXBvc0luVGV4dChjb21tZW50KSlcbiAgICAgIC8vIFRoZSB3b3JkIGJvdW5kYXJ5IGFuZCB0cmFpbGluZy13aGl0ZXNwYWNlIGd1YXJkIGtlZXAgd29yZHMgbWVyZWx5IGVuZGluZyBpbiB0aGVcbiAgICAgIC8vIGFiYnJldmlhdGlvbiBsZXR0ZXJzIChlLmcuIFwiY29va2llLlwiLCBcImxlZy5cIikgaW50YWN0LlxuICAgICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KVxcYmNcXC5mXFwuKD89XFxzfCQpL2csICckMS8vJDJjZi4nKVxuICAgICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KVxcYmVnXFwuKD89XFxzfCQpL2csICckMS8vJDJlLmcuJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJpZVxcLig/PVxcc3wkKS9nLCAnJDEvLyQyaS5lLicpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IGNoaWxkUHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmNsYXNzIEdpdEh1YlV0aWwge1xuICBnZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVybFdpdGhvdXRQcm90b2NvbCA9IHVybE9yRnVsbE5hbWUuc3BsaXQoJzonKS5hdCgtMSk7XG4gICAgY29uc3QgbmFtZXMgPSB1cmxXaXRob3V0UHJvdG9jb2w/LnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgb3JnID0gbmFtZXM/LmF0KC0yKSA/PyAnJztcbiAgICAvLyBUaGUgZG90IG11c3QgYmUgZXNjYXBlZDogYW4gdW5lc2NhcGVkIGAuYCBtYXRjaGVzIEFOWSBjaGFyYWN0ZXIsIHNvIGBsZWdpdGAgbG9zdCBpdHMgYGxgIGFuZCBgZWAuXG4gICAgY29uc3QgbmFtZSA9IG5hbWVzPy5hdCgtMSk/LnJlcGxhY2UoL1xcLmdpdCQvdSwgJycpID8/ICcnO1xuICAgIHJldHVybiBbb3JnLCBuYW1lXTtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViVXRpbCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHN0YXR1cyA9IChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXM7XG4gIHJldHVybiBzdGF0dXMgPT09IDQwMSB8fCBzdGF0dXMgPT09IDQwMyB8fCBzdGF0dXMgPT09IDQwNDtcbn1cblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIC8vIEdpdEh1YiBvd25lciBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgc28gY3JlZGVudGlhbCBzZWxlY3Rpb24gKGFuZCB0aGUgY2FjaGUga2V5KSBtdXN0XG4gIC8vIG5vdCBkZXBlbmQgb24gaG93IGEgcmVtb3RlIFVSTCBoYXBwZW5zIHRvIHNwZWxsIHRoZSBvcmdhbml6YXRpb24uXG4gIGNvbnN0IGtleSA9IG93bmVyPy50b0xvd2VyQ2FzZSgpID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIENhc2UtaW5zZW5zaXRpdmUgb24gcHVycG9zZTogYSBub25jYW5vbmljYWxseSBjYXNlZCByZW1vdGUgKGUuZy4gZ2l0aHViLmNvbS93aWxsYm9vc3RlcmxhYi/igKYpXG4gIC8vIG11c3Qgc3RpbGwgc2VsZWN0IHRoZSBvcmdhbml6YXRpb24ncyBvd24gUEFUIOKAlCBmYWxsaW5nIHRocm91Z2ggdG8gdGhlIGdlbmVyaWMgYnJhbmNoIHdvdWxkXG4gIC8vIHByZWZlciB0aGUgT1RIRVIgb3JnYW5pemF0aW9uJ3MgUEFULCB3aGljaCBjYW5ub3QgcmVhZCB0aGlzIG9yZ2FuaXphdGlvbidzIHByaXZhdGVcbiAgLy8gcmVwb3NpdG9yaWVzLlxuICBjb25zdCBub3JtYWxpemVkT3duZXIgPSBvd25lcj8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKG5vcm1hbGl6ZWRPd25lciA9PT0gJ3dpbGxib29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIGlmIChub3JtYWxpemVkT3duZXIgPT09ICd3aWxsYm9vc3RlcmxhYicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUIgfHwgZ2V0R2l0SHViQ2xpVG9rZW4oKTtcbiAgfVxuICByZXR1cm4gKFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9UT0tFTiB8fFxuICAgIHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTiB8fFxuICAgIGdldEdpdEh1YkNsaVRva2VuKClcbiAgKTtcbn1cblxubGV0IGdpdEh1YkNsaVRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGdldEdpdEh1YkNsaVRva2VuKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChnaXRIdWJDbGlUb2tlbiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZ2l0SHViQ2xpVG9rZW4gfHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgLy8gU29tZSBsb2NhbCBydW5zIHJlbHkgb24gR2l0SHViIENMSSBhdXRoZW50aWNhdGlvbiBpbnN0ZWFkIG9mIGV4cG9ydGVkIGVudiB0b2tlbnMuXG4gICAgZ2l0SHViQ2xpVG9rZW4gPVxuICAgICAgY2hpbGRQcm9jZXNzXG4gICAgICAgIC5leGVjRmlsZVN5bmMoJ2doJywgWydhdXRoJywgJ3Rva2VuJ10sIHtcbiAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddLFxuICAgICAgICB9KVxuICAgICAgICAudHJpbSgpIHx8ICcnO1xuICB9IGNhdGNoIHtcbiAgICBnaXRIdWJDbGlUb2tlbiA9ICcnO1xuICB9XG4gIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhcnNlRXJyb3IgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuaW1wb3J0IHsgYXBwbHlFZGl0cywgY3JlYXRlU2Nhbm5lciwgZmluZE5vZGVBdExvY2F0aW9uLCBtb2RpZnksIHBhcnNlIGFzIHBhcnNlSnNvbmMsIHBhcnNlVHJlZSB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5cbi8vIGpzb25jLXBhcnNlciBkZWNsYXJlcyBTeW50YXhLaW5kL1NjYW5FcnJvciBhcyBhbWJpZW50IGNvbnN0IGVudW1zLCB3aGljaCBjYW5ub3QgYmUgaW1wb3J0ZWRcbi8vIHVuZGVyIHZlcmJhdGltTW9kdWxlU3ludGF4OyBtaXJyb3IgdGhlIG5lZWRlZCBtZW1iZXIgdmFsdWVzIGxvY2FsbHkuXG5jb25zdCBzeW50YXhLaW5kID0geyBsaW5lQ29tbWVudFRyaXZpYTogMTIsIGJsb2NrQ29tbWVudFRyaXZpYTogMTMsIGxpbmVCcmVha1RyaXZpYTogMTQsIHRyaXZpYTogMTUsIGVvZjogMTcgfTtcbmNvbnN0IHNjYW5FcnJvck5vbmUgPSAwO1xuXG5leHBvcnQgY29uc3QganNvbmNVdGlsID0ge1xuICAvKipcbiAgICogVGVsbHMgd2hldGhlciB0aGUgY29udGVudCBob2xkcyBubyBjb25maWd1cmF0aW9uIGF0IGFsbCDigJQgb25seSB3aGl0ZXNwYWNlLCBjb21wbGV0ZSBjb21tZW50cyxcbiAgICogYW5kL29yIGEgQk9NLiB0c2MgdHJlYXRzIHN1Y2ggYSB0c2NvbmZpZy5qc29uIGFzIGFuIGVtcHR5IGNvbmZpZywgc28gZ2VuZXJhdG9ycyBzaG91bGQgdHJlYXRcbiAgICogaXQgbGlrZSBhIG1pc3NpbmcgZmlsZSAoYW5kIGdlbmVyYXRlIGRlZmF1bHRzKSBpbnN0ZWFkIG9mIHJlZnVzaW5nIHRvIG1hbmFnZSBpdC4gTGV4aWNhbGx5XG4gICAqIGJyb2tlbiB0cml2aWEgKGUuZy4gYW4gdW50ZXJtaW5hdGVkIGJsb2NrIGNvbW1lbnQpIGlzIE5PVCB0cml2aWEtb25seTogdGhlIGZpbGUgbXVzdCBiZSBsZWZ0XG4gICAqIHVudG91Y2hlZCByYXRoZXIgdGhhbiBvdmVyd3JpdHRlbiB3aXRoIGRlZmF1bHRzLlxuICAgKi9cbiAgaXNUcml2aWFPbmx5KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNjYW5uZXIgPSBjcmVhdGVTY2FubmVyKGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJykpO1xuICAgIGZvciAobGV0IGtpbmQ6IG51bWJlciA9IHNjYW5uZXIuc2NhbigpOyBraW5kICE9PSBzeW50YXhLaW5kLmVvZjsga2luZCA9IHNjYW5uZXIuc2NhbigpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChzY2FubmVyLmdldFRva2VuRXJyb3IoKSBhcyBudW1iZXIpICE9PSBzY2FuRXJyb3JOb25lIHx8XG4gICAgICAgIChraW5kICE9PSBzeW50YXhLaW5kLmxpbmVDb21tZW50VHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC5ibG9ja0NvbW1lbnRUcml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLnRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQubGluZUJyZWFrVHJpdmlhKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8qKlxuICAgKiBQYXJzZXMgYSBKU09OQyAoSlNPTiB3aXRoIGNvbW1lbnRzKSBvYmplY3QgZnJvbSBjb25maWcgZmlsZXMgc3VjaCBhcyB0c2NvbmZpZy5qc29uLFxuICAgKiBweXJpZ2h0Y29uZmlnLmpzb24sIHJlbm92YXRlLmpzb24sIC52c2NvZGUvc2V0dGluZ3MuanNvbiwgYW5kIHdyYW5nbGVyLmpzb25jLlxuICAgKlxuICAgKiBqc29uYy1wYXJzZXIgaXMgZmF1bHQgdG9sZXJhbnQgYW5kIHJldHVybnMgYSBwYXJ0aWFsIG9iamVjdCBmb3IgbWFsZm9ybWVkIGlucHV0LCB3aGljaCBtdXN0XG4gICAqIG5vdCBiZSB0cmVhdGVkIGFzIHRoZSBmaWxlJ3MgY29uZmlndXJhdGlvbjsgcmVqZWN0IGFueSBwYXJzZSBlcnJvciBpbnN0ZWFkLiBBIGxlYWRpbmcgQk9NIGlzXG4gICAqIHN0cmlwcGVkIGJlY2F1c2UgVHlwZVNjcmlwdCBhY2NlcHRzIEJPTSdkIGNvbmZpZyBmaWxlcyB3aGlsZSBqc29uYy1wYXJzZXIgcmVwb3J0cyB0aGUgQk9NIGFzXG4gICAqIGEgcGFyc2UgZXJyb3IuIENhbGxlcnMgd2hvc2UgcmVhZGVyIHJlamVjdHMgdHJhaWxpbmcgY29tbWFzIHR1cm4gYGFsbG93VHJhaWxpbmdDb21tYWBcbiAgICogb2ZmIHNvIHN1Y2ggYSBmaWxlIGlzIHJlcG9ydGVkIGFzIG1hbGZvcm1lZCBoZXJlIHRvby5cbiAgICovXG4gIHBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxUIGV4dGVuZHMgb2JqZWN0Pihjb250ZW50OiBzdHJpbmcsIGFsbG93VHJhaWxpbmdDb21tYSA9IHRydWUpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXJzZUVycm9yczogUGFyc2VFcnJvcltdID0gW107XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUpzb25jKGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJyksIHBhcnNlRXJyb3JzLCB7IGFsbG93VHJhaWxpbmdDb21tYSB9KSBhcyBUIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBwYXJzZUVycm9ycy5sZW5ndGggPT09IDAgJiYgISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgPyB2YWx1ZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIC8qKiBUZWxscyB3aGV0aGVyIHRoZSBjb250ZW50IGNhcnJpZXMgYXQgbGVhc3Qgb25lIGNvbW1lbnQsIGkuZS4gY29udGVudCBKU09OLnN0cmluZ2lmeSB3b3VsZCBkcm9wLiAqL1xuICBjb250YWluc0NvbW1lbnQoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Nhbm5lciA9IGNyZWF0ZVNjYW5uZXIoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSk7XG4gICAgZm9yIChsZXQga2luZDogbnVtYmVyID0gc2Nhbm5lci5zY2FuKCk7IGtpbmQgIT09IHN5bnRheEtpbmQuZW9mOyBraW5kID0gc2Nhbm5lci5zY2FuKCkpIHtcbiAgICAgIC8vIEEgbGV4aWNhbCBlcnJvciBtZWFucyB0aGUgcmVtYWluaW5nIHRva2VucyBhcmUgdW5yZWxpYWJsZTsgcmVwb3J0IG5vIGNvbW1lbnQgcmF0aGVyIHRoYW5cbiAgICAgIC8vIGd1ZXNzaW5nLiBBIGNhbGxlciB0aGF0IG9ubHkgd2FybnMgYWJvdXQgZHJvcHBlZCBjb21tZW50cyBsb3NlcyBub3RoaW5nLCBhbmQgb25lIHRoYXRcbiAgICAgIC8vIHJlZnVzZXMgYSBjb21tZW50ZWQgZmlsZSBmb3IgYSBzdHJpY3QtSlNPTiByZWFkZXIgc3RpbGwgcmVqZWN0cyBzdWNoIGNvbnRlbnQgd2hlbiBpdFxuICAgICAgLy8gcGFyc2VzIGl0LlxuICAgICAgaWYgKChzY2FubmVyLmdldFRva2VuRXJyb3IoKSBhcyBudW1iZXIpICE9PSBzY2FuRXJyb3JOb25lKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoa2luZCA9PT0gc3ludGF4S2luZC5saW5lQ29tbWVudFRyaXZpYSB8fCBraW5kID09PSBzeW50YXhLaW5kLmJsb2NrQ29tbWVudFRyaXZpYSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYHNldHRpbmdzYCBpbnRvIGBvbGRDb250ZW50YCwgZWRpdGluZyBvbmx5IHRoZSB0b3AtbGV2ZWwgcHJvcGVydGllcyB3aG9zZSB2YWx1ZXNcbiAgICogY2hhbmdlZCBzbyB0aGUgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgb2YgYW4gZXhpc3RpbmcgZmlsZSBzdXJ2aXZlLiBDYWxsZXJzIG5ldmVyIGRyb3BcbiAgICogcHJvcGVydGllcyAoZ2VuZXJhdGVkIHNldHRpbmdzIGFyZSBtZXJnZWQgT04gVE9QIG9mIHRoZSBleGlzdGluZyBvbmVzKSwgc28gcmVtb3ZhbHMgYXJlIG5vdFxuICAgKiBoYW5kbGVkOiBhIHByb3BlcnR5IG1pc3NpbmcgZnJvbSBgc2V0dGluZ3NgIGlzIGxlZnQgdW50b3VjaGVkIHJhdGhlciB0aGFuIGRlbGV0ZWQuXG4gICAqXG4gICAqIFRyaXZpYS1vbmx5IGNvbnRlbnQga2VlcHMgaXRzIGNvbW1lbnRzIGFzIGEgaGVhZGVyIGFib3ZlIHRoZSBnZW5lcmF0ZWQgb2JqZWN0LCByYXRoZXIgdGhhblxuICAgKiBiZWluZyByZXBsYWNlZCBvdXRyaWdodCBvciBydW4gdGhyb3VnaCBtb2RpZnkoKSAod2hpY2ggd291bGQgbW92ZSB0aGUgb2JqZWN0IGluIGZyb250IG9mIHRoZW0pLlxuICAgKi9cbiAgc3RyaW5naWZ5UHJlc2VydmluZ1RyaXZpYShcbiAgICBvbGRDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHsgY29udGVudDogc3RyaW5nOyBrZXlzTG9zaW5nQ29tbWVudHM6IHN0cmluZ1tdIH0ge1xuICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7IGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpLCBrZXlzTG9zaW5nQ29tbWVudHM6IFtdIH07XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvbGRDb250ZW50KTtcbiAgICAvLyBEcm9wIGEgbGVhZGluZyBCT006IG1vZGlmeSgpIGluc2VydHMgdGhlIGdlbmVyYXRlZCBvYmplY3QgQkVGT1JFIGFueSBsZWFkaW5nIHRyaXZpYSwgd2hpY2hcbiAgICAvLyB3b3VsZCBsZWF2ZSB0aGUgQk9NIHN0cmFuZGVkIG1pZC1maWxlIHdoZXJlIGl0IGlzIGEgc3ludGF4IGVycm9yIHJhdGhlciB0aGFuIGFuIGlnbm9yZWQgbWFyay5cbiAgICBsZXQgY29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJyk7XG4gICAgaWYgKGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoY29udGVudCkpIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IGNvbnRlbnQudHJpbSgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogYCR7aGVhZGVyID8gaGVhZGVyICsgJ1xcbicgOiAnJ30ke0pTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpfWAsXG4gICAgICAgIGtleXNMb3NpbmdDb21tZW50czogW10sXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBtb2RpZnlPcHRpb25zID0geyBmb3JtYXR0aW5nT3B0aW9uczogZGV0ZWN0Rm9ybWF0dGluZ09wdGlvbnMoY29udGVudCkgfTtcbiAgICBjb25zdCBrZXlzTG9zaW5nQ29tbWVudHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbmV3RW50cmllczogW3N0cmluZywgdW5rbm93bl1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNldHRpbmdzKSkge1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSBvbGRTZXR0aW5ncz8uW2tleV07XG4gICAgICAvLyBDb21wYXJlIHNlcmlhbGl6ZWQgZm9ybXMgc28gZGVlcC1lcXVhbCB2YWx1ZXMgKGUuZy4gYSByZS1tZXJnZWQgYGV4dGVuZHNgIGFycmF5KSBkbyBub3RcbiAgICAgIC8vIHJld3JpdGUgdGhlIHByb3BlcnR5IGFuZCByZWZsb3cgaXRzIGZvcm1hdHRpbmcuXG4gICAgICBpZiAoSlNPTi5zdHJpbmdpZnkob2xkVmFsdWUpID09PSBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKG9sZFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3RW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gUmVwbGFjaW5nIGEgd2hvbGUgYXJyYXkgd291bGQgZGlzY2FyZCB0aGUgY29tbWVudHMgYmV0d2VlbiBpdHMgZWxlbWVudHMsIHNvIGdyb3cgaXQgd2l0aFxuICAgICAgLy8gcGVyLWVsZW1lbnQgaW5zZXJ0aW9ucyB3aGVuZXZlciB0aGUgbmV3IHZhbHVlIG9ubHkgYWRkcyB0byBpdC5cbiAgICAgIGNvbnN0IGluc2VydGlvbnMgPSBBcnJheS5pc0FycmF5KG9sZFZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IGZpbmRJbnNlcnRpb25zKG9sZFZhbHVlLCB2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IGluc2VydGlvbiBvZiBpbnNlcnRpb25zID8/IFtdKSB7XG4gICAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKFxuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgbW9kaWZ5KGNvbnRlbnQsIFtrZXksIGluc2VydGlvbi5pbmRleF0sIGluc2VydGlvbi52YWx1ZSwgeyAuLi5tb2RpZnlPcHRpb25zLCBpc0FycmF5SW5zZXJ0aW9uOiB0cnVlIH0pXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRlbnQgPSByZXN0b3JlVHJhaWxpbmdDb21tZW50KGNvbnRlbnQsIGtleSwgaW5zZXJ0aW9uLmluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnNlcnRpb25zKSBjb250aW51ZTtcbiAgICAgIC8vIFJld3JpdGluZyB0aGUgd2hvbGUgdmFsdWUgaXMgdGhlIG9ubHkgb3B0aW9uIGxlZnQgKHRoZSBuZXcgb25lIGRyb3BzIG9yIHJlb3JkZXJzIGVsZW1lbnRzKSxcbiAgICAgIC8vIGFuZCBpdCB0YWtlcyBhbnkgY29tbWVudCBuZXN0ZWQgaW5zaWRlIGl0IGFsb25nLiBSZXBvcnQgdGhhdCByYXRoZXIgdGhhbiBsb3NpbmcgaXQgcXVpZXRseS5cbiAgICAgIGNvbnN0IHJlcGxhY2VkVGV4dCA9IHZhbHVlVGV4dE9mKGNvbnRlbnQsIGtleSk7XG4gICAgICBpZiAocmVwbGFjZWRUZXh0ICE9PSB1bmRlZmluZWQgJiYganNvbmNVdGlsLmNvbnRhaW5zQ29tbWVudChyZXBsYWNlZFRleHQpKSBrZXlzTG9zaW5nQ29tbWVudHMucHVzaChrZXkpO1xuICAgICAgY29udGVudCA9IGFwcGx5RWRpdHMoY29udGVudCwgbW9kaWZ5KGNvbnRlbnQsIFtrZXldLCB2YWx1ZSwgbW9kaWZ5T3B0aW9ucykpO1xuICAgIH1cbiAgICAvLyBQcmVwZW5kIHJhdGhlciB0aGFuIGFwcGVuZCB0aGUgcHJvcGVydGllcyB0aGF0IGFyZSBuZXc6IGFwcGVuZGluZyBkZXRhY2hlcyBhIHRyYWlsaW5nXG4gICAgLy8gc2FtZS1saW5lIGNvbW1lbnQgZnJvbSB0aGUgbGFzdCBwcm9wZXJ0eSwgbGVhdmluZyBpdCB0byBkZXNjcmliZSB0aGUgZ2VuZXJhdGVkIHZhbHVlXG4gICAgLy8gaW5zdGVhZC4gSW5zZXJ0aW5nIGluIHJldmVyc2Uga2VlcHMgdGhlIG9yZGVyIHRoZSBzZXR0aW5ncyBkZWNsYXJlIHRoZW0gaW4uXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgbmV3RW50cmllcy50b1JldmVyc2VkKCkpIHtcbiAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKGNvbnRlbnQsIG1vZGlmeShjb250ZW50LCBba2V5XSwgdmFsdWUsIHsgLi4ubW9kaWZ5T3B0aW9ucywgZ2V0SW5zZXJ0aW9uSW5kZXg6ICgpID0+IDAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50LCBrZXlzTG9zaW5nQ29tbWVudHMgfTtcbiAgfSxcbn07XG5cbi8qKiBSZXR1cm5zIHRoZSBzb3VyY2UgdGV4dCBvZiBhIHRvcC1sZXZlbCBwcm9wZXJ0eSdzIHZhbHVlLCBjb21tZW50cyBhbmQgYWxsLiAqL1xuZnVuY3Rpb24gdmFsdWVUZXh0T2YoY29udGVudDogc3RyaW5nLCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJvb3QgPSBwYXJzZVRyZWUoY29udGVudCk7XG4gIGNvbnN0IG5vZGUgPSByb290ICYmIGZpbmROb2RlQXRMb2NhdGlvbihyb290LCBba2V5XSk7XG4gIHJldHVybiBub2RlICYmIGNvbnRlbnQuc2xpY2Uobm9kZS5vZmZzZXQsIG5vZGUub2Zmc2V0ICsgbm9kZS5sZW5ndGgpO1xufVxuXG4vLyBUaGUgd2hvbGUgc2FtZS1saW5lIGNvbW1lbnQgc2VxdWVuY2UsIG5vdCBqdXN0IHRoZSBmaXJzdCBvbmU6IGEgbGluZSBjb21tZW50IGVuZHMgaXQgKGl0IHJ1bnMgdG9cbi8vIHRoZSBuZXdsaW5lKSwgYnV0IGFueSBudW1iZXIgb2YgYmxvY2sgY29tbWVudHMgY2FuIHByZWNlZGUgaXQsIGFuZCBtb3Zpbmcgb25seSB0aGUgZmlyc3Qgd291bGRcbi8vIGxlYXZlIHRoZSByZXN0IGRlc2NyaWJpbmcgdGhlIHdyb25nIGVsZW1lbnQuXG5jb25zdCB0cmFpbGluZ0NvbW1lbnRQYXR0ZXJuID0gL14oPzpbXlxcU1xcbl0qXFwvXFwqW1xcU1xcc10qP1xcKlxcLykqKD86W15cXFNcXG5dKlxcL1xcL1teXFxuXSopPy91O1xuXG4vKipcbiAqIFJlYXR0YWNoZXMgYSBzYW1lLWxpbmUgY29tbWVudCB0byB0aGUgZWxlbWVudCBpdCBkZXNjcmliZXMuIEluc2VydGluZyBpbnRvIGFuIGFycmF5IHBsYWNlcyB0aGVcbiAqIG5ldyBlbGVtZW50IEJFRk9SRSB0aGUgdHJpdmlhIHRoYXQgZm9sbG93cyBpdHMgcHJlZGVjZXNzb3IsIHNvIGFwcGVuZGluZyBhZnRlclxuICogYHsgLi4uIH0gLy8gd2h5IHRoaXMgcnVsZSBleGlzdHNgIGxlYXZlcyB0aGF0IGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgZ2VuZXJhdGVkIGVsZW1lbnQgaW5zdGVhZC5cbiAqIEEgZnJlc2hseSBzZXJpYWxpemVkIGVsZW1lbnQgbmV2ZXIgY2FycmllcyBhIGNvbW1lbnQgb2YgaXRzIG93biwgc28gYW55dGhpbmcgdHJhaWxpbmcgdGhlXG4gKiBpbnNlcnRpb24gYmVsb25nZWQgdG8gdGhlIGVsZW1lbnQgYmVmb3JlIGl0LlxuICovXG5mdW5jdGlvbiByZXN0b3JlVHJhaWxpbmdDb21tZW50KGNvbnRlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcsIGluc2VydGVkSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChpbnNlcnRlZEluZGV4ID09PSAwKSByZXR1cm4gY29udGVudDtcbiAgY29uc3Qgcm9vdCA9IHBhcnNlVHJlZShjb250ZW50KTtcbiAgY29uc3QgZWxlbWVudHMgPSAocm9vdCAmJiBmaW5kTm9kZUF0TG9jYXRpb24ocm9vdCwgW2tleV0pKT8uY2hpbGRyZW47XG4gIGNvbnN0IGluc2VydGVkID0gZWxlbWVudHM/LltpbnNlcnRlZEluZGV4XTtcbiAgY29uc3QgcHJldmlvdXMgPSBlbGVtZW50cz8uW2luc2VydGVkSW5kZXggLSAxXTtcbiAgaWYgKCFpbnNlcnRlZCB8fCAhcHJldmlvdXMpIHJldHVybiBjb250ZW50O1xuICBjb25zdCBpbnNlcnRlZEVuZCA9IGluc2VydGVkLm9mZnNldCArIGluc2VydGVkLmxlbmd0aDtcbiAgY29uc3QgY29tbWVudCA9IHRyYWlsaW5nQ29tbWVudFBhdHRlcm4uZXhlYyhjb250ZW50LnNsaWNlKGluc2VydGVkRW5kKSk/LlswXTtcbiAgaWYgKCFjb21tZW50KSByZXR1cm4gY29udGVudDtcbiAgLy8gTGFuZCB0aGUgY29tbWVudCBhZnRlciB0aGUgc2VwYXJhdGluZyBjb21tYSBzbyB0aGUgZWxlbWVudCBrZWVwcyBpdHMgb3duIGxpbmUgaW50YWN0LlxuICBjb25zdCBwcmV2aW91c0VuZCA9IHByZXZpb3VzLm9mZnNldCArIHByZXZpb3VzLmxlbmd0aDtcbiAgY29uc3QgcmVzdG9yZU9mZnNldCA9IHByZXZpb3VzRW5kICsgKC9eXFxzKiwvdS5leGVjKGNvbnRlbnQuc2xpY2UocHJldmlvdXNFbmQpKT8uWzBdLmxlbmd0aCA/PyAwKTtcbiAgcmV0dXJuIChcbiAgICBjb250ZW50LnNsaWNlKDAsIHJlc3RvcmVPZmZzZXQpICtcbiAgICBjb21tZW50ICtcbiAgICBjb250ZW50LnNsaWNlKHJlc3RvcmVPZmZzZXQsIGluc2VydGVkRW5kKSArXG4gICAgY29udGVudC5zbGljZShpbnNlcnRlZEVuZCArIGNvbW1lbnQubGVuZ3RoKVxuICApO1xufVxuXG4vKipcbiAqIE1pcnJvcnMgdGhlIGluZGVudGF0aW9uIHRoZSBmaWxlIGFscmVhZHkgdXNlcywgc28gYSBzZW1hbnRpYyBjaGFuZ2UgZG9lcyBub3QgcmVpbmRlbnQgdW5yZWxhdGVkXG4gKiBsaW5lcy4gVGhlIGZpcnN0IHByb3BlcnR5IGlzIG1lYXN1cmVkIHJhdGhlciB0aGFuIHRoZSBmaXJzdCBpbmRlbnRlZCBsaW5lLCBiZWNhdXNlIGEgZGVjb3JhdGVkXG4gKiBibG9jayBjb21tZW50IChgICogLi4uYCkgd291bGQgb3RoZXJ3aXNlIHBhc3MgZm9yIHRoZSBmaWxlJ3MgaW5kZW50YXRpb24uIEZhbGxzIGJhY2sgdG8gdGhlIHR3b1xuICogc3BhY2VzIGV2ZXJ5IGdlbmVyYXRlZCBjb25maWcgdXNlcy5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0Rm9ybWF0dGluZ09wdGlvbnMoY29udGVudDogc3RyaW5nKTogeyBpbnNlcnRTcGFjZXM6IGJvb2xlYW47IHRhYlNpemU6IG51bWJlciB9IHtcbiAgY29uc3QgZmlyc3RQcm9wZXJ0eSA9IHBhcnNlVHJlZShjb250ZW50KT8uY2hpbGRyZW4/LlswXTtcbiAgY29uc3QgaW5kZW50YXRpb24gPVxuICAgIGZpcnN0UHJvcGVydHkgJiYgY29udGVudC5zbGljZShjb250ZW50Lmxhc3RJbmRleE9mKCdcXG4nLCBmaXJzdFByb3BlcnR5Lm9mZnNldCkgKyAxLCBmaXJzdFByb3BlcnR5Lm9mZnNldCk7XG4gIGlmICghaW5kZW50YXRpb24gfHwgIS9eW1xcdCBdKyQvdS50ZXN0KGluZGVudGF0aW9uKSkgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiB0cnVlLCB0YWJTaXplOiAyIH07XG4gIGlmIChpbmRlbnRhdGlvbi5zdGFydHNXaXRoKCdcXHQnKSkgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiBmYWxzZSwgdGFiU2l6ZTogMSB9O1xuICByZXR1cm4geyBpbnNlcnRTcGFjZXM6IHRydWUsIHRhYlNpemU6IGluZGVudGF0aW9uLmxlbmd0aCB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGluc2VydCBpbnRvIGBvbGRWYWx1ZWAgdG8gdHVybiBpdCBpbnRvIGBuZXdWYWx1ZWAsIG9yIHVuZGVmaW5lZCB3aGVuXG4gKiB0aGF0IGlzIGltcG9zc2libGUgYmVjYXVzZSBgbmV3VmFsdWVgIGRyb3BzIG9yIHJlb3JkZXJzIGFuIGV4aXN0aW5nIGVsZW1lbnQgKHRoZSBjYWxsZXIgbXVzdFxuICogdGhlbiByZXBsYWNlIHRoZSBhcnJheSB3aG9sZXNhbGUpLiBJbmRpY2VzIGFkZHJlc3MgdGhlIGFycmF5IGFzIGl0IGdyb3dzLCBzbyBhcHBseWluZyB0aGVcbiAqIGluc2VydGlvbnMgbGVmdCB0byByaWdodCB5aWVsZHMgYG5ld1ZhbHVlYC5cbiAqL1xuZnVuY3Rpb24gZmluZEluc2VydGlvbnMob2xkVmFsdWU6IHVua25vd25bXSwgbmV3VmFsdWU6IHVua25vd25bXSk6IHsgaW5kZXg6IG51bWJlcjsgdmFsdWU6IHVua25vd24gfVtdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5zZXJ0aW9uczogeyBpbmRleDogbnVtYmVyOyB2YWx1ZTogdW5rbm93biB9W10gPSBbXTtcbiAgbGV0IG9sZEluZGV4ID0gMDtcbiAgZm9yIChjb25zdCBbbmV3SW5kZXgsIGVsZW1lbnRdIG9mIG5ld1ZhbHVlLmVudHJpZXMoKSkge1xuICAgIGlmIChvbGRJbmRleCA8IG9sZFZhbHVlLmxlbmd0aCAmJiBKU09OLnN0cmluZ2lmeShvbGRWYWx1ZVtvbGRJbmRleF0pID09PSBKU09OLnN0cmluZ2lmeShlbGVtZW50KSkge1xuICAgICAgb2xkSW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpbnNlcnRpb25zLnB1c2goeyBpbmRleDogbmV3SW5kZXgsIHZhbHVlOiBlbGVtZW50IH0pO1xuICB9XG4gIHJldHVybiBvbGRJbmRleCA9PT0gb2xkVmFsdWUubGVuZ3RoID8gaW5zZXJ0aW9ucyA6IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG4vKipcbiAqIFJlY29nbml6ZXMgdGhlIG1hbmFnZWQgYHdiIGdlbi1jb2RlYCBzZWdtZW50LCBhIG9uZS1sZXZlbCBwYWNrYWdlLXNjcmlwdCB3cmFwcGVyIGFyb3VuZCBpdCwgYW5kXG4gKiBjdXN0b20gc2VnbWVudHMgdGhhdCB3YmZ5IGxlYXZlcyBhbG9uZS5cbiAqL1xudHlwZSBTY3JpcHRTZWdtZW50S2luZCA9ICdjdXN0b20nIHwgJ2dlbkNvZGUnIHwgJ2dlbkNvZGVXcmFwcGVyJztcblxuY29uc3QgZ2VuQ29kZVNlZ21lbnRQYXR0ZXJuID0gL15idW5cXHMrd2JcXHMrZ2VuLWNvZGUkL3U7XG5cbi8vIEEgcnVubmVyIGRlbGVnYXRpbmcgdG8gb25lIG9mIHRoaXMgcGFja2FnZSdzIG93biBzY3JpcHRzLCBlLmcuIGBidW4gcnVuIGdlbi10eXBlc2AuXG5jb25zdCBzY3JpcHRSdW5uZXJQYXR0ZXJuID0gL15idW5cXHMrcnVuXFxzKyhcXFMrKSQvdTtcblxuLy8gQW55dGhpbmcgd2JmeSdzIGAmJmAgc3BsaXQgY2Fubm90IG1vZGVsIChwaXBlcywgc2VxdWVuY2luZywgcmVkaXJlY3Rpb25zLCBxdW90aW5nLCBzdWJzdGl0dXRpb25zLCBkaXJlY3Rvcnlcbi8vIGNoYW5nZXMpLiBTY3JpcHRzIGNvbnRhaW5pbmcgaXQgYXJlIGxlZnQgdW50b3VjaGVkIGluc3RlYWQgb2YgYmVpbmcgcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbmNvbnN0IHVuc3VwcG9ydGVkU2hlbGxTeW50YXhQYXR0ZXJuID0gL1tcXG47fDw+YCQnXCIoKV18XFxiY2RcXHMvdTtcblxuLyoqXG4gKiBTcGxpdHMgYSBzY3JpcHQgaW50byBgJiZgLXNlcGFyYXRlZCBzZWdtZW50cywgb3IgcmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgc2NyaXB0IHVzZXMgc2hlbGwgc3ludGF4IHdiZnlcbiAqIGRlbGliZXJhdGVseSBkb2VzIG5vdCBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICh1bnN1cHBvcnRlZFNoZWxsU3ludGF4UGF0dGVybi50ZXN0KHNjcmlwdCkpIHJldHVybjtcbiAgcmV0dXJuIHNjcmlwdFxuICAgIC5zcGxpdCgnJiYnKVxuICAgIC5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoXG4gIHNlZ21lbnQ6IHN0cmluZyxcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgZm9sbG93c1dyYXBwZXIgPSB0cnVlXG4pOiBTY3JpcHRTZWdtZW50S2luZCB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBzZWdtZW50LnRyaW0oKS5yZXBsYWNlQWxsKC9cXHMrL2d1LCAnICcpO1xuICBpZiAoZ2VuQ29kZVNlZ21lbnRQYXR0ZXJuLnRlc3Qobm9ybWFsaXplZCkpIHJldHVybiAnZ2VuQ29kZSc7XG4gIC8vIEEgb25lLWxldmVsIHdyYXBwZXIgbG9va3VwIGNvdmVycyBgXCJwb3N0aW5zdGFsbFwiOiBcImJ1biBydW4gZ2VuLXR5cGVzXCJgLCB0aGUgc2hhcGUgdGhlc2UgcmVwb3NpdG9yaWVzIHVzZTtcbiAgLy8gZGVlcGVyIGNoYWlucyBzdGF5IGN1c3RvbSBzbyB3YmZ5IGNhbm5vdCBsb29wIG9uIGEgc2VsZi1yZWZlcmVudGlhbCBzY3JpcHQuXG4gIGNvbnN0IHNjcmlwdE5hbWUgPSBmb2xsb3dzV3JhcHBlciA/IHNjcmlwdFJ1bm5lclBhdHRlcm4uZXhlYyhub3JtYWxpemVkKT8uWzFdIDogdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXQgPSBzY3JpcHROYW1lID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzY3JpcHRzW3NjcmlwdE5hbWVdO1xuICBpZiAoIXRhcmdldCkgcmV0dXJuICdjdXN0b20nO1xuICBjb25zdCBzZWdtZW50cyA9IHNwbGl0U2NyaXB0U2VnbWVudHModGFyZ2V0KTtcbiAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIENVU1RPTUlaRUQgZ2VuLWNvZGUgKGBidW4gd2IgZ2VuLWNvZGUgJiYgYnVuIHJ1biBidWlsZC1hc3NldHNgKSBzdGlsbCBwZXJmb3JtcyB0aGUgbWFuYWdlZFxuICAvLyBnZW5lcmF0aW9uLCBzbyBpdCBjb3VudHMgYXMgZ2VuLWNvZGU7IHRyZWF0aW5nIGl0IGFzIGN1c3RvbSB3b3VsZCBhcHBlbmQgYSBzZWNvbmQgYHdiIGdlbi1jb2RlYCBhbmQgcnVuIGV2ZXJ5XG4gIC8vIGdlbmVyYXRvciB0d2ljZSBwZXIgaW5zdGFsbC5cbiAgaWYgKHNlZ21lbnRzPy5sZW5ndGggIT09IDEpIHtcbiAgICAvLyBBIHdyYXBwZXIgYXJvdW5kIGEgQ1VTVE9NSVpFRCBnZW4tY29kZSAoYGJ1biB3YiBnZW4tY29kZSAmJiBidW4gcnVuIGJ1aWxkLWFzc2V0c2ApIGFscmVhZHkgcGVyZm9ybXMgdGhlXG4gICAgLy8gbWFuYWdlZCBnZW5lcmF0aW9uIEFORCB0aGUgcHJvamVjdCdzIG93biBzdGVwcywgc28gaXQgaXMgdGhlIGluc3RhbGwtdGltZSBlbnRyeSBwb2ludDogaXQgbXVzdCBiZSBrZXB0IGFzXG4gICAgLy8gd3JpdHRlbi4gUmVwbGFjaW5nIGl0IHdpdGggYSBiYXJlIGB3YiBnZW4tY29kZWAgd291bGQgZHJvcCB0aG9zZSBzdGVwczsgYXBwZW5kaW5nIG9uZSB3b3VsZCBydW4gZXZlcnlcbiAgICAvLyBnZW5lcmF0b3IgdHdpY2UuXG4gICAgcmV0dXJuIHNlZ21lbnRzPy5zb21lKChpbm5lcikgPT4gZ2VuQ29kZVNlZ21lbnRQYXR0ZXJuLnRlc3QoaW5uZXIudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJykpKVxuICAgICAgPyAnZ2VuQ29kZVdyYXBwZXInXG4gICAgICA6ICdjdXN0b20nO1xuICB9XG4gIHJldHVybiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudHNbMF0gPz8gJycsIHNjcmlwdHMsIGZhbHNlKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQsIGFyZ3MsIGN3ZCwgcmV0cnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiBudW1iZXIge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhdHVzID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgIGlmIChzdGF0dXMgPT09IDApIGJyZWFrO1xuICAgIGlmIChyZXRyeSA8PSAwKSByZXR1cm4gc3RhdHVzO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXRJbnRlcm5hbChjb21tYW5kLCBhcmdzLCBjd2QpWzFdO1xufVxuXG5mdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXRJbnRlcm5hbChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtudW1iZXIsIHN0cmluZ10ge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3RkZXJyIG9uIEVOT0VOVC5cbiAgY29uc3Qgc3RkZXJyID0gcHJvYy5zdGRlcnIgPz8gJyc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycgPyBzdGRlcnIudHJpbSgpIDogc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAocHJvYy5lcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIGZhaWxlZCB3aXRoOiAke3Byb2MuZXJyb3IubWVzc2FnZX1gKTtcbiAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRvdXQgb24gRU5PRU5ULlxuICBjb25zdCBzdGRvdXQgPSBwcm9jLnN0ZG91dCA/PyAnJztcbiAgY29uc3Qgc3Rkb3V0VGV4dCA9IHR5cGVvZiBzdGRvdXQgPT09ICdzdHJpbmcnID8gc3Rkb3V0IDogc3Rkb3V0LnRvU3RyaW5nKCk7XG4gIHJldHVybiBbcHJvYy5zdGF0dXMgPz8gMSwgc3Rkb3V0VGV4dC50cmltKCldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5zcGxpdCgnOicpXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBlbnYuQkVSUllfQklOX0ZPTERFUilcbiAgICAgIC5qb2luKCc6Jyk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVNjcmlwdFNlZ21lbnQsIHNwbGl0U2NyaXB0U2VnbWVudHMgfSBmcm9tICcuL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LmpzJztcbmltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJy4vdXRpbHMvc3RyaW5nVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLCBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyB9IGZyb20gJy4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgLy8gV2hldGhlciBpc1B1YmxpY1JlcG8gY29tZXMgZnJvbSBhbiBhY3R1YWwgR2l0SHViIEFQSSByZXNwb25zZTogYSBmYWlsZWQgbG9va3VwIChvZmZsaW5lLFxuICAvLyByYXRlLWxpbWl0ZWQsIGJhZCBjcmVkZW50aWFsKSBjb2xsYXBzZXMgdG8gaXNQdWJsaWNSZXBvPWZhbHNlLCB3aGljaCB2aXNpYmlsaXR5LXNlbnNpdGl2ZVxuICAvLyBnZW5lcmF0b3JzIG11c3Qgbm90IG1pc3Rha2UgZm9yIGEgY29uZmlybWVkIHByaXZhdGUgcmVwb3NpdG9yeS5cbiAgaXNSZXBvVmlzaWJpbGl0eUtub3duOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNDbG91ZGZsYXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnOiBib29sZWFuO1xuICBpc1JhaWx3YXk6IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIC8qKiBEaXJlY3RvcmllcyBjb250YWluaW5nIENhcmdvLnRvbWwgKHJlbGF0aXZlIHRvIGRpclBhdGgsIHJvb3QtbW9zdCBmaXJzdCkuIEVtcHR5IGlmIHRoZSByZXBvIGhhcyBubyBSdXN0IGNvZGUuICovXG4gIGNhcmdvVG9tbERpclBhdGhzOiBzdHJpbmdbXTtcbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVXZMb2NrOiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIFB5dGhvbiBsb2NrZmlsZSAocG9ldHJ5LmxvY2sgLyB1di5sb2NrKSBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgTWF2ZW4gcG9tLnhtbCBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblBvbVhtbEFueXdoZXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIFNsaWRldiBkZWNrIChgKi5zbGlkZXYubWRgKSBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblNsaWRldk1kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRhdXJpQ29uZmlnOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRSdW50aW1lOiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzbGlkZXY6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHRhdXJpOiBib29sZWFuO1xuICAgIHZpbmV4dDogYm9vbGVhbjtcbiAgICB2aXRlOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICAgIGNoYWtyYTogYm9vbGVhbjtcbiAgICBkcml6emxlOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQW4gZXhwbGljaXQgYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgcGx1Z2luIGVudHJ5IHB1Ymxpc2hlcyB0aGUgcm9vdCBtYW5pZmVzdCBpdHNlbGZcbiAgICAgKiAobm8gcGtnUm9vdCByZWRpcmVjdGlvbiBhbmQgbnBtUHVibGlzaCBub3QgZGlzYWJsZWQpLlxuICAgICAqL1xuICAgIG5wbVB1Ymxpc2hlc1Jvb3Q6IGJvb2xlYW47XG4gIH07XG4gIG1pc2VUYXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIFRoZSBzZW1hbnRpYy1yZWxlYXNlIGNvbmZpZyBmaWxlcyB3YmZ5IGV4cGVjdHMsIGluIGNvc21pY29uZmlnJ3MgcmVzb2x1dGlvbiBvcmRlciAodGhlIGxlYWRpbmdcbiAqIHBhY2thZ2UuanNvbiBlbnRyeSBpcyBjaGVja2VkIGJ5IHRoZSBjYWxsZXIpLiB3YmZ5IGdlbmVyYXRlcyAucmVsZWFzZXJjLmpzb247IHRoZSBvdGhlciBzcGVsbGluZ3NcbiAqIGFyZSBsaXN0ZWQgb25seSB0byBkZXRlY3QgYSBoYW5kLXdyaXR0ZW4gY29uZmlnLCB3aG9zZSBmb3JtYXQgSlNPTi5wYXJzZSBjYW5ub3QgcmVhZCBhbmQgd2hvc2VcbiAqIHBsdWdpbiBsaXN0IGlzIHRoZXJlZm9yZSBzdGF0aWNhbGx5IHVuaW5zcGVjdGFibGUuXG4gKi9cbmNvbnN0IHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlczogeyBmaWxlTmFtZTogc3RyaW5nOyBqc29uUGFyc2VhYmxlOiBib29sZWFuIH1bXSA9IFtcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMnLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzb24nLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy55bWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBpc1Jvb3Q/OiBib29sZWFuIH1cbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZUJyYW5jaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdCA9IGZhbHNlO1xuICAgIGxldCByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCA9IGZhbHNlO1xuICAgIC8vIFRoZSBGSVJTVCBleGlzdGluZyBzZWFyY2ggcGxhY2Ugd2lucyAoY29zbWljb25maWcgc2hvcnQtY2lyY3VpdHMpLCBzbyBhIEpTL1lBTUwvVFMgY29uZmlnXG4gICAgLy8gb3IgYW4gYGV4dGVuZHNgIHByZXNldCBtYWtlcyB0aGUgZWZmZWN0aXZlIHBsdWdpbiBsaXN0IHN0YXRpY2FsbHkgdW5pbnNwZWN0YWJsZSAobWlycm9yc1xuICAgIC8vIHJlYWRFeHBsaWNpdFNlbWFudGljUmVsZWFzZVBsdWdpbnMgaW4gd2IncyByZWxlYXNlLnRzKS4gVHJlYXRpbmcgaXQgYXMgdW5rbm93biBrZWVwc1xuICAgIC8vIGByZWxlYXNlLm5wbWAgY29uc2VydmF0aXZlbHkgdHJ1ZSwgc28gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIG5ldmVyIGZvcmNlc1xuICAgIC8vIGBwcml2YXRlOiB0cnVlYCBvbiBhIG1vbm9yZXBvIHRoYXQgYWN0dWFsbHkgcHVibGlzaGVzIHRvIG5wbS5cbiAgICBsZXQgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHR5cGUgUmVsZWFzZUNvbmZpZyA9XG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM/OiB1bmtub3duO1xuICAgICAgICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPl0pW107XG4gICAgICAgICAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gY29zbWljb25maWcgc2VhcmNoZXMgcGFja2FnZS5qc29uJ3MgYHJlbGVhc2VgIGtleSBCRUZPUkUgYW55IHJjL2NvbmZpZyBmaWxlXG4gICAgICAvLyAoc2VtYW50aWMtcmVsZWFzZSAyNSBkZWxlZ2F0ZXMgdG8gY29zbWljb25maWcgOSdzIGRlZmF1bHQgc2VhcmNoUGxhY2VzKS5cbiAgICAgIGxldCByZWxlYXNlQ29uZmlnID0gKHBhY2thZ2VKc29uIGFzIHsgcmVsZWFzZT86IFJlbGVhc2VDb25maWcgfSkucmVsZWFzZTtcbiAgICAgIGlmIChyZWxlYXNlQ29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCB7IGZpbGVOYW1lLCBqc29uUGFyc2VhYmxlIH0gb2Ygc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzKSB7XG4gICAgICAgICAgY29uc3QgcmVsZWFzZXJjUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlbGVhc2VyY1BhdGgpKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAoIWpzb25QYXJzZWFibGUpIHtcbiAgICAgICAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93biA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gYC5yZWxlYXNlcmNgIGFuZCBgLmNvbmZpZy9yZWxlYXNlcmNgIG1heSBhbHNvIGhvbGQgWUFNTDsgYSBKU09OLnBhcnNlIGZhaWx1cmUgbGFuZHNcbiAgICAgICAgICAvLyBpbiB0aGUgY2F0Y2ggYmVsb3cgYW5kIG1hcmtzIHRoZSBwbHVnaW4gbGlzdCB1bmtub3duIGluc3RlYWQgb2Ygc2lsZW50bHkgcmVwb3J0aW5nXG4gICAgICAgICAgLy8gXCJubyBwbHVnaW5zXCIuXG4gICAgICAgICAgcmVsZWFzZUNvbmZpZyA9IEpTT04ucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKHJlbGVhc2VyY1BhdGgsICd1dGY4JykpIGFzIFJlbGVhc2VDb25maWc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UgYWNjZXB0cyBhIHNjYWxhciBicmFuY2ggb3IgYnJhbmNoIG9iamVjdHMgKHsgbmFtZSwgcHJlcmVsZWFzZSwgLi4uIH0pO1xuICAgICAgLy8gbm9ybWFsaXplIHRvIHBsYWluIGJyYW5jaCBuYW1lcyBmb3IgY29uc3VtZXJzIHN1Y2ggYXMgdGhlIHdvcmtmbG93IGdlbmVyYXRvci5cbiAgICAgIGNvbnN0IHJhd0JyYW5jaGVzID0gcmVsZWFzZUNvbmZpZz8uYnJhbmNoZXM7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSAoQXJyYXkuaXNBcnJheShyYXdCcmFuY2hlcykgPyByYXdCcmFuY2hlcyA6IHJhd0JyYW5jaGVzID09PSB1bmRlZmluZWQgPyBbXSA6IFtyYXdCcmFuY2hlc10pXG4gICAgICAgIC5tYXAoKGJyYW5jaDogdW5rbm93bikgPT5cbiAgICAgICAgICB0eXBlb2YgYnJhbmNoID09PSAnc3RyaW5nJyA/IGJyYW5jaCA6IChicmFuY2ggYXMgeyBuYW1lPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8ubmFtZVxuICAgICAgICApXG4gICAgICAgIC5maWx0ZXIoKGJyYW5jaE5hbWUpOiBicmFuY2hOYW1lIGlzIHN0cmluZyA9PiB0eXBlb2YgYnJhbmNoTmFtZSA9PT0gJ3N0cmluZycpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVsZWFzZUNvbmZpZz8ucGx1Z2lucykpIHtcbiAgICAgICAgcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcGx1Z2luRW50cnkgb2YgcmVsZWFzZUNvbmZpZy5wbHVnaW5zKSB7XG4gICAgICAgICAgY29uc3QgW3BsdWdpbk5hbWUsIHBsdWdpbk9wdGlvbnNdID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSkgPyBwbHVnaW5FbnRyeSA6IFtwbHVnaW5FbnRyeSwgdW5kZWZpbmVkXTtcbiAgICAgICAgICBpZiAodHlwZW9mIHBsdWdpbk5hbWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5wdXNoKHBsdWdpbk5hbWUpO1xuICAgICAgICAgIGlmIChwbHVnaW5OYW1lICE9PSAnQHNlbWFudGljLXJlbGVhc2UvbnBtJykgY29udGludWU7XG4gICAgICAgICAgLy8gV2l0aCBwa2dSb290IHRoZSBwbHVnaW4gcHVibGlzaGVzIGFub3RoZXIgbWFuaWZlc3QgKGl0IHJlc29sdmVzIHBrZ1Jvb3QgYWdhaW5zdCB0aGVcbiAgICAgICAgICAvLyByZXBvIHJvb3QsIHNvIGAuYCBhbmQgYC4vYCBib3RoIG1lYW4gdGhlIHJvb3QgaXRzZWxmKSwgYW5kIG5wbVB1Ymxpc2g6IGZhbHNlXG4gICAgICAgICAgLy8gZGlzYWJsZXMgcHVibGlzaGluZyBlbnRpcmVseTsgb25seSB0aGUgcmVtYWluaW5nIHNoYXBlIHByb3ZlcyB0aGUgUk9PVCBpcyBwdWJsaXNoZWQuXG4gICAgICAgICAgY29uc3QgcGtnUm9vdCA9IHBsdWdpbk9wdGlvbnM/LnBrZ1Jvb3Q7XG4gICAgICAgICAgY29uc3QgcHVibGlzaGVzUm9vdCA9XG4gICAgICAgICAgICBwbHVnaW5PcHRpb25zPy5ucG1QdWJsaXNoICE9PSBmYWxzZSAmJlxuICAgICAgICAgICAgKHBrZ1Jvb3QgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAodHlwZW9mIHBrZ1Jvb3QgPT09ICdzdHJpbmcnICYmIHBhdGgucmVzb2x2ZShkaXJQYXRoLCBwa2dSb290KSA9PT0gcGF0aC5yZXNvbHZlKGRpclBhdGgpKSk7XG4gICAgICAgICAgcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QgfHw9IHB1Ymxpc2hlc1Jvb3Q7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmVsZWFzZUNvbmZpZyAmJiByZWxlYXNlQ29uZmlnLmV4dGVuZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gV2l0aG91dCBhbiBleHBsaWNpdCBwbHVnaW4gbGlzdCwgc2VtYW50aWMtcmVsZWFzZSdzIGRlZmF1bHQgbGlzdCBhcHBsaWVzLCB3aGljaCBpbmNsdWRlc1xuICAgIC8vIEBzZW1hbnRpYy1yZWxlYXNlL25wbSBhbmQgQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViIChtaXJyb3JzIHJlbGVhc2VQdWJsaXNoZXNUb05wbSBpbiB3YidzXG4gICAgLy8gcmVsZWFzZS50cykuXG4gICAgY29uc3QgdXNlc1NlbWFudGljUmVsZWFzZSA9ICEhKFxuICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwIHx8XG4gICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd25cbiAgICApO1xuXG4gICAgLy8gVGhlIGNhbGxlciBtYXkgY2xhc3NpZnkgZXhwbGljaXRseSAoaW5kZXgudHMgcGFzc2VzIGZhbHNlIGZvciBldmVyeSBkaXNjb3ZlcmVkIHdvcmtzcGFjZSxcbiAgICAvLyBpbmNsdWRpbmcgbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKik7IHRoZSBoZXVyaXN0aWMgY2xhc3NpZmllcyB0aGUgQ0xJIGVudHJ5XG4gICAgLy8gcGF0aCBpdHNlbGYsIHNvIGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmAgYW5kIGB3YmZ5IDxyZXBvPi9hcHBzLzxhcHA+YCBrZWVwIHRoZWlyIGNoaWxkXG4gICAgLy8gY2xhc3NpZmljYXRpb24uXG4gICAgY29uc3QgaXNSb290ID0gb3B0aW9ucz8uaXNSb290ID8/ICFpc1dvcmtzcGFjZU9mRW5jbG9zaW5nUm9vdChkaXJQYXRoKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgLy8gRmV0Y2ggdmlzaWJpbGl0eSBmb3IgdGhlIENMSSBlbnRyeSBldmVuIHdoZW4gaXQgaXMgYSB3b3Jrc3BhY2UgY2hpbGQgKGB3YmZ5XG4gICAgLy8gPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCk6IGdlbmVyYXRvcnMgcmVhZCBpc1B1YmxpY1JlcG8gZnJvbSB0aGVpciByb290Q29uZmlnIHBhcmFtZXRlcixcbiAgICAvLyB3aGljaCBJUyB0aGUgY2hpbGQgY29uZmlnIGluIHRoYXQgaW52b2NhdGlvbiwgc28gYSBzdHViIGBmYWxzZWAgdGhlcmUgd291bGQgZHJvcCB0aGVcbiAgICAvLyBwdWJsaWMtcmVwbyBwdWJsaXNoQ29uZmlnIGhhbmRsaW5nLiBEaXNjb3ZlcmVkIGNoaWxkcmVuIChvcHRpb25zLmlzUm9vdCA9PT0gZmFsc2UpIHN0aWxsXG4gICAgLy8gc2tpcCB0aGUgZmV0Y2gg4oCUIHRoZXkgaW5oZXJpdCB0aGUgZW5jbG9zaW5nIHJvb3QncyB2aXNpYmlsaXR5IHZpYSByb290Q29uZmlnIGluc3RlYWQuXG4gICAgaWYgKG9wdGlvbnM/LmlzUm9vdCAhPT0gZmFsc2UpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBPbmx5IHRoZSByb290IGZldGNoZXMgcmVwbyBpbmZvLCBhbmQgdGhhdCBmZXRjaCBuZWVkcyBuZXR3b3JrIGFuZCBhIHRva2VuLCBzbyBpZGVudGl0eS1kZXJpdmVkXG4gICAgLy8gZmxhZ3MgYmVsb3cgd291bGQgb3RoZXJ3aXNlIGJlIGZhbHNlIGZvciBldmVyeSB3b3Jrc3BhY2UgcGFja2FnZSBhbmQgZm9yIGV2ZXJ5IG9mZmxpbmUgb3JcbiAgICAvLyByYXRlLWxpbWl0ZWQgcnVuLiBUaGUgZ2l0IHJlbW90ZSBhbnN3ZXJzIHRoZSBzYW1lIHF1ZXN0aW9uIGxvY2FsbHksIGZvciBldmVyeSBwYWNrYWdlLlxuICAgIGlmICghcmVwb0F1dGhvciB8fCAhcmVwb05hbWUpIHtcbiAgICAgIFtyZXBvQXV0aG9yLCByZXBvTmFtZV0gPSBhd2FpdCByZXNvbHZlTG9jYWxSZXBvSWRlbnRpdHkoZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cbiAgICAvLyBCdWlsdCBmcm9tIHRoZSBSRVNPTFZFRCBpZGVudGl0eSBzbyB3b3Jrc3BhY2UgcGFja2FnZXMgYW5kIG9mZmxpbmUgcnVucyBhbHNvIGdldCBpdDsgY29uc3VtZXJzIGRlcml2ZVxuICAgIC8vIHRoZSBvd25lciBmcm9tIHRoaXMgZmllbGQgKGUuZy4gdG8gc2V0IGBhdXRob3JgKS5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0F1dGhvciAmJiByZXBvTmFtZSA/IGBnaXRodWI6JHtyZXBvQXV0aG9yfS8ke3JlcG9OYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgLy8gVGF1cmkgb2ZmaWNpYWxseSBzdXBwb3J0cyBKU09OLCBKU09ONSwgYW5kIFRPTUwgY29uZmlndXJhdGlvbiBmb3JtYXRzLlxuICAgIGNvbnN0IGRvZXNDb250YWluVGF1cmlDb25maWcgPSBbJ3RhdXJpLmNvbmYuanNvbicsICd0YXVyaS5jb25mLmpzb241JywgJ1RhdXJpLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdzcmMtdGF1cmknLCBmaWxlTmFtZSkpXG4gICAgKTtcbiAgICAvLyBSb290LWxldmVsIFwiSW5QYWNrYWdlc1wiIHNpZ25hbHMgbXVzdCBzZWUgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlIGxheW91dCAoZS5nLiBhcHBzLyopLCBub3RcbiAgICAvLyBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3RvcnksIHNvIHNjYW4gZWFjaCBkaXNjb3ZlcmVkIHdvcmtzcGFjZSBkaXJlY3RvcnkuXG4gICAgY29uc3Qgd29ya3NwYWNlU3ViRGlyUGF0aHMgPSBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyh7XG4gICAgICBkaXJQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgfSk7XG4gICAgY29uc3QgY29udGFpbnNBbnlJbldvcmtzcGFjZXMgPSAocGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAgICAgd29ya3NwYWNlU3ViRGlyUGF0aHMuc29tZSgod29ya3NwYWNlU3ViRGlyUGF0aCkgPT4gY29udGFpbnNBbnkocGF0dGVybiwgd29ya3NwYWNlU3ViRGlyUGF0aCkpO1xuICAgIGNvbnN0IGRvZXNDb250YWluV3JhbmdsZXJDb25maWcgPSBkZXRlY3RXcmFuZ2xlckNvbmZpZyhkaXJQYXRoKTtcbiAgICBjb25zdCB3b3JrZmxvd0NvbnRlbnRzID0gcmVhZFdvcmtmbG93RmlsZUNvbnRlbnRzKGRpclBhdGgpO1xuICAgIGNvbnN0IGltcG9ydHNQbGF5d3JpZ2h0QXRSdW50aW1lID0gZGV0ZWN0UGxheXdyaWdodFJ1bnRpbWVJbXBvcnQoZGlyUGF0aCk7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVwb1Zpc2liaWxpdHlLbm93bjogdHlwZW9mIHJlcG9JbmZvPy5wcml2YXRlID09PSAnYm9vbGVhbicsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0Nsb3VkZmxhcmU6IGRldGVjdENsb3VkZmxhcmUocGFja2FnZUpzb24sIGRvZXNDb250YWluV3JhbmdsZXJDb25maWcsIHdvcmtmbG93Q29udGVudHMpLFxuICAgICAgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyxcbiAgICAgIGlzUmFpbHdheTogZGV0ZWN0UmFpbHdheShkaXJQYXRoLCBwYWNrYWdlSnNvbiwgd29ya2Zsb3dDb250ZW50cyksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogZGV0ZWN0SXNXaWxsQm9vc3RlckNvbmZpZ3MoZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoLCByZXBvTmFtZSksXG4gICAgICBjYXJnb1RvbWxEaXJQYXRoczogZmluZENhcmdvVG9tbERpclBhdGhzKGRpclBhdGgpLFxuICAgICAgLy8gQWxzbyBob25vciBkZWNsYXJlZCB3b3Jrc3BhY2UgcGF0dGVybnMgYmV5b25kIHBhY2thZ2VzLyogKGUuZy4gYXBwcy8qKTogdHJlYXRpbmcgYW5cbiAgICAgIC8vIGFwcHMvKi1vbmx5IG1vbm9yZXBvIGFzIGEgcGxhaW4gcGFja2FnZSB3b3VsZCBkZWxldGUgaXRzIGB3b3Jrc3BhY2VzYCBkZWNsYXJhdGlvbiBpblxuICAgICAgLy8gZ2VuZXJhdGVQYWNrYWdlSnNvbiBhbmQgc2tpcCBtb25vcmVwby1vbmx5IGNvbnZlbnRpb25zIHN1Y2ggYXMgcm9vdCBgcHJpdmF0ZTogdHJ1ZWAuXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpIHx8IHdvcmtzcGFjZVN1YkRpclBhdGhzLmxlbmd0aCA+IDAsXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblV2TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3V2LmxvY2snKSksXG4gICAgICAvLyBSZWN1cnNpdmUgbGlrZSBkb2VzQ29udGFpbkphdmE6IG11bHRpLWxhbmd1YWdlIHJlcG9zaXRvcmllcyBrZWVwIGxhbmd1YWdlIGRpcmVjdG9yaWVzXG4gICAgICAvLyAoZS5nLiBQeXRob24gdG9vbGluZyBvciBNYXZlbiBtb2R1bGVzKSBvdXRzaWRlIHRoZSByb290IGFuZCBvdXRzaWRlIGRlY2xhcmVkIHdvcmtzcGFjZXMuXG4gICAgICBkb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZTogY29udGFpbnNBbnkoJyoqL3twb2V0cnkubG9jayx1di5sb2NrfScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZTogY29udGFpbnNBbnkoJyoqL3BvbS54bWwnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblNsaWRldk1kOiBjb250YWluc0FueSgnKiovKi5zbGlkZXYubWQnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoXG4gICAgICAgICdzcmMtdGF1cmkve3RhdXJpLmNvbmYuanNvbix0YXVyaS5jb25mLmpzb241LFRhdXJpLnRvbWx9J1xuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmE6IGNvbnRhaW5zQW55KCcqKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzKCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JyksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJyoqLyouamF2YScpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgY2hha3JhOiAhIWRldkRlcGVuZGVuY2llc1snQGNoYWtyYS11aS9jbGknXSxcbiAgICAgICAgZHJpenpsZTogISFkZXBlbmRlbmNpZXNbJ2RyaXp6bGUtb3JtJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ2RyaXp6bGUta2l0J10sXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHBsYXl3cmlnaHRSdW50aW1lOiBpbXBvcnRzUGxheXdyaWdodEF0UnVudGltZSxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgc2xpZGV2OiAhIWRlcGVuZGVuY2llc1snQHNsaWRldi9jbGknXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHNsaWRldi9jbGknXSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB0YXVyaTpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnLFxuICAgICAgICB2aW5leHQ6ICEhZGVwZW5kZW5jaWVzLnZpbmV4dCB8fCAhIWRldkRlcGVuZGVuY2llcy52aW5leHQsXG4gICAgICAgIHZpdGU6ICEhZGVwZW5kZW5jaWVzLnZpdGUgfHwgISFkZXZEZXBlbmRlbmNpZXMudml0ZSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zQXJlRXhwbGljaXRcbiAgICAgICAgICA/IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB8fCByZWxlYXNlUGx1Z2luc0FyZVVua25vd25cbiAgICAgICAgICA6IHVzZXNTZW1hbnRpY1JlbGVhc2UsXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdFxuICAgICAgICAgID8gcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpIHx8IHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICAgICAgIDogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgbnBtUHVibGlzaGVzUm9vdDogcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QsXG4gICAgICB9LFxuICAgICAgbWlzZVRhc2tzOiBhd2FpdCByZWFkTWlzZVRhc2tzKGRpclBhdGgpLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVXZMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sIHx8XG4gICAgICAvLyBBIHJlcG9zaXRvcnkgY2FuIGxlZ2l0aW1hdGVseSBjb250YWluIG9ubHkgZG9jdW1lbnRhdGlvbi4gSXRzIEdpdCBtZXRhZGF0YSBpcyBlbm91Z2ggdG9cbiAgICAgIC8vIGVzdGFibGlzaCB0aGF0IHRoZSBDTEkgdGFyZ2V0IGlzIGEgcHJvamVjdCByb290OyByZXF1aXJpbmcgYSBsYW5ndWFnZSBtYW5pZmVzdCBoZXJlIHdvdWxkXG4gICAgICAvLyBtYWtlIHdiZnkgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgcGFja2FnZS5qc29uIHRoYXQgaXQgbWFuYWdlcyBmb3Igc3VjaCByZXBvc2l0b3JpZXMuIEJvdGhcbiAgICAgIC8vIG9yZGluYXJ5IGNoZWNrb3V0cyAoYC5naXRgIGRpcmVjdG9yeSkgYW5kIHdvcmt0cmVlcyAoYC5naXRgIGZpbGUpIHNhdGlzZnkgdGhpcyBjaGVjay5cbiAgICAgIChjb25maWcuaXNSb290ICYmIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZ2l0JykpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgd2JmeSBtYW5hZ2VzIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgZm9yIHRoZSBwYWNrYWdlLiBUaGUgZmlsZSBpcyBnaXRpZ25vcmVkIGFuZCB1bnRyYWNrZWRcbiAqIGJlY2F1c2UgdGhlIGB3YiBnZW4tY29kZWAgcG9zdGluc3RhbGwgcmVnZW5lcmF0ZXMgaXQgb24gZXZlcnkgaW5zdGFsbCwgc28gdGhlIHBhY2thZ2UgaGFzIHRvIG93biBhIHdyYW5nbGVyXG4gKiBjb25maWcgKGB3cmFuZ2xlciB0eXBlc2AgZXhpdHMgbm9uLXplcm8gd2l0aG91dCBvbmUpLCB0byBkZXBlbmQgb24gd3JhbmdsZXIgKGEgcGFja2FnZSBkZXBsb3lpbmcgdmlhIGFcbiAqIENJIGFjdGlvbiBjYW5ub3QgcmVzb2x2ZSB0aGUgY29tbWFuZCksIGFuZCB0byBjb25zdW1lIHRoZSBnZW5lcmF0ZWQgZmlsZS5cbiAqXG4gKiBJTlZBUklBTlQg4oCUIHRoaXMgZGVjaXNpb24gbXVzdCBjb252ZXJnZSBhY3Jvc3MgbWFjaGluZXMgaG9sZGluZyB0aGUgc2FtZSBjb21taXQuIEl0IG11c3QgTkVWRVIgY29uc3VsdFxuICogZ2l0aWdub3JlZCBmaWxlcyAoYC5kZXYudmFycypgLCBgLmVudipgLCAuLi4pLCB3aGljaCBgd2Igc3RhcnRgIGFuZCBgd2IgZGVwbG95YCBjcmVhdGUgcm91dGluZWx5IGFuZCB3aGljaFxuICogdGhlcmVmb3JlIHN0YXkgdW50cmFja2VkIG9uIGRldiBtYWNoaW5lcyBmb3JldmVyOiBhIGZvcm1lciBjaGVjayB0aGF0IHRyZWF0ZWQgdGhlbSBhcyBpcnJlcHJvZHVjaWJsZSBpbnB1dHNcbiAqIG1hZGUgd2JmeSBydW5zIG9uIGRldiBtYWNoaW5lcyByZS10cmFjayB0aGUgfjE1ay1saW5lIGdlbmVyYXRlZCBmaWxlIHRoYXQgcnVucyBmcm9tIGNsZWFuIGNoZWNrb3V0cyBoYWRcbiAqIHVudHJhY2tlZCwgb3NjaWxsYXRpbmcgZXRlcm5hbGx5IChlLmcuIGFpLWdhbWUtYnVpbGRlciAjNjg0IOKGkiAjNzQ2KS4gUmVhZGluZyBjb21taXR0YWJsZSByZXBvc2l0b3J5IGZpbGVzXG4gKiBmcm9tIHRoZSB3b3JraW5nIHRyZWUgKHRoZSB3cmFuZ2xlciBjb25maWcsIHBhY2thZ2UuanNvbiwgdHNjb25maWcg4oCUIGFzIGV2ZXJ5IHdiZnkgZ2VuZXJhdG9yIGRvZXMpIGlzIGZpbmU6XG4gKiBhbnkgZGl2ZXJnZW5jZSB0aGVyZSBpcyB0cmFuc2llbnQgYW5kIGRpc2FwcGVhcnMgb25jZSB0aGUgZmlsZSBpcyBjb21taXR0ZWQgb3IgcmVtb3ZlZC5cbiAqIFRoZSBoYXphcmQgdGhhdCBjaGVjayBndWFyZGVkIGFnYWluc3Qgbm8gbG9uZ2VyIGV4aXN0czogYHdiIGdlbi1jb2RlYCBydW5zIGB3cmFuZ2xlciB0eXBlcyAtLWVudi1maWxlYCB3aXRoXG4gKiBhIGtleSBzdHViIGRlcml2ZWQgc29sZWx5IGZyb20gdGhlIGNvbW1pdHRlZCBmbm94LnRvbWwgKHNlZSB3YidzIHdyaXRlV29ya2VyVHlwZXNFbnZTdHViKSwgc28gbG9jYWwgZG90ZW52XG4gKiBmaWxlcyBuZXZlciBpbmZsdWVuY2UgdGhlIGdlbmVyYXRlZCBgRW52YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnICYmIGhhc1dyYW5nbGVyRGVwZW5kZW5jeShwYWNrYWdlSnNvbikgJiYgY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvcihjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ3BhY2thZ2VKc29uJz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzY3JpcHRzID0gY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBzY3JpcHRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHNjcmlwdCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBjb25zdCBzZWdtZW50cyA9IHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0KTtcbiAgICBjb25zdCBoYXNOb25DYW5vbmljYWxXYkdlbkNvZGUgPSBzZWdtZW50cz8uc29tZSgoc2VnbWVudCkgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHNlZ21lbnQudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAvXig/Oig/OmJ1bnxidW54KSg/OiAtLWJ1bik/KD86IHJ1bik/ICk/d2IgZ2VuLWNvZGUkL3UudGVzdChub3JtYWxpemVkKSAmJlxuICAgICAgICBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwgc2NyaXB0cywgdHJ1ZSkgPT09ICdjdXN0b20nXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChoYXNOb25DYW5vbmljYWxXYkdlbkNvZGUpIHJldHVybiBgJHtuYW1lfSBtdXN0IHVzZSB0aGUgY2Fub25pY2FsIGJ1biB3YiBnZW4tY29kZSBjb21tYW5kYDtcbiAgfVxuICAvLyBPbmx5IGBidW4gcnVuIDxzY3JpcHQ+YCBpcyByZWNvZ25pemVkIGFzIGEgd3JhcHBlcjsgYW5vdGhlciBydW5uZXIgc3BlbGxpbmcgd291bGQgZ2V0IGEgbWFuYWdlZFxuICAvLyBnZW5lcmF0aW9uIGFwcGVuZGVkIG5leHQgdG8gaXQgYW5kIHJ1biBldmVyeSBnZW5lcmF0b3IgdHdpY2UgcGVyIGluc3RhbGwuIFdpdGhvdXQgYSBnZW4tY29kZVxuICAvLyBwaXBlbGluZSBub3RoaW5nIGlzIGFwcGVuZGVkLCBzbyB0aGUgc3BlbGxpbmcgaXMgaXJyZWxldmFudCB0aGVyZS5cbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0cy5wb3N0aW5zdGFsbCA/PyAnJykgPz8gW10pIHtcbiAgICBjb25zdCBzY3JpcHROYW1lID0gL14oPzpidW58YnVueCkoPzpcXHMrLS1idW4pPyg/OlxccytydW4pP1xccysoXFxTKykkL3UuZXhlYyhzZWdtZW50KT8uWzFdO1xuICAgIGNvbnN0IHRhcmdldCA9IHNjcmlwdE5hbWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgaWYgKFxuICAgICAgdGFyZ2V0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHNlZ21lbnQgIT09IGBidW4gcnVuICR7c2NyaXB0TmFtZX1gICYmXG4gICAgICAoc2NyaXB0c1snZ2VuLWNvZGUnXSAhPT0gdW5kZWZpbmVkIHx8IHRhcmdldC5pbmNsdWRlcygnd2IgZ2VuLWNvZGUnKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBgcG9zdGluc3RhbGwgbXVzdCBpbnZva2UgdGhlICR7c2NyaXB0TmFtZX0gc2NyaXB0IGFzIGJ1biBydW4gJHtzY3JpcHROYW1lfWA7XG4gICAgfVxuICB9XG4gIGlmIChcbiAgICAvKD86XnwmJilcXHMqKD86bnBtfG5weHxwbnBtfHlhcm4pXFxzKyg/OnJ1big/Oi1zY3JpcHQpP1xccyspPyg/Omdlbi1jb2RlfHdiXFxzK2dlbi1jb2RlKVxccyooPzomJnwkKS91LnRlc3QoXG4gICAgICBzY3JpcHRzLnBvc3RpbnN0YWxsID8/ICcnXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gJ3Bvc3RpbnN0YWxsIG11c3QgdXNlIGJ1biB3YiBnZW4tY29kZSBpbnN0ZWFkIG9mIGEgbm9uLUJ1biBnZW4tY29kZSBydW5uZXInO1xuICB9XG4gIGZvciAoY29uc3QgW25hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoc2NyaXB0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmICh3cmFuZ2xlclR5cGVzVGV4dFBhdHRlcm4udGVzdChzY3JpcHQpKSByZXR1cm4gYCR7bmFtZX0gbXVzdCB1c2UgYnVuIHdiIGdlbi1jb2RlIGluc3RlYWQgb2Ygd3JhbmdsZXIgdHlwZXNgO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1dyYW5nbGVyRGVwZW5kZW5jeShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIFtcbiAgICBwYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIHBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/Lm9wdGlvbmFsRGVwZW5kZW5jaWVzLFxuICAgIHBhY2thZ2VKc29uPy5wZWVyRGVwZW5kZW5jaWVzLFxuICBdLnNvbWUoKGRlcGVuZGVuY2llcykgPT4gZGVwZW5kZW5jaWVzPy53cmFuZ2xlciAhPT0gdW5kZWZpbmVkKTtcbn1cblxuY29uc3Qgc2hlbGxXb3JkUGF0dGVybiA9IFN0cmluZy5yYXdgKD86XCIoPzpcXFxcLnxbXlwiXFxcXF0pKlwifCcoPzpcXFxcLnxbXidcXFxcXSkqJ3woPzpcXFxcLnxbXlxcc1wiJ1xcXFxdKSspYDtcbmNvbnN0IHdyYW5nbGVyT3B0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgXFxzKy0tP1tBLVphLXpdW1xcdy1dKig/Oj0ke3NoZWxsV29yZFBhdHRlcm59fFxccysoPyEtfHR5cGVzXFxiKSR7c2hlbGxXb3JkUGF0dGVybn0pP2A7XG5jb25zdCB3cmFuZ2xlclR5cGVzVGV4dFBhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICBTdHJpbmcucmF3YFtcIiddP1xcYndyYW5nbGVyKD86QFteXFxzXCInXSspP1xcYltcIiddPyg/OiR7d3JhbmdsZXJPcHRpb25QYXR0ZXJufSkqXFxzK3R5cGVzXFxiYCxcbiAgJ3UnXG4pO1xuXG4vKipcbiAqIEEgcGFja2FnZSB3aG9zZSBUeXBlU2NyaXB0IHByb2plY3QgY2Fubm90IGluY2x1ZGUgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyAoZS5nLiBvbmUgb24gYSBoYW5kLW1haW50YWluZWRcbiAqIG1pbmltYWwgYEVudmAgd2l0aCBgdHlwZXM6IFtcImJ1blwiXWAsIHRoZSBzdGFuZGFyZCBlc2NhcGUgd2hlbiB0aGUgYW1iaWVudCB3cmFuZ2xlciBnbG9iYWxzIGNvbmZsaWN0IHdpdGggdGhlXG4gKiBgQHR5cGVzL2J1bmAgZ2xvYmFscyBpdHMgdGVzdHMgbmVlZCkgZ2FpbnMgbm90aGluZyBmcm9tIHJlZ2VuZXJhdGluZyB0aGUgfjUwMEtCIGZpbGUgb24gZXZlcnkgaW5zdGFsbCwgc28gd2JmeVxuICogbGVhdmVzIHN1Y2ggcGFja2FnZXMgdW5tYW5hZ2VkIGluc3RlYWQgb2YgcmUtYWRkaW5nIHRoZSBnZW5lcmF0aW9uIHN0ZXAuIENvbnN1bXB0aW9uIGlzIGRldGVjdGVkIHR3byB3YXlzOlxuICogYSB0ZXh0dWFsIGB3b3JrZXItY29uZmlndXJhdGlvbmAgcmVmZXJlbmNlIGluIGFueSB0cmFja2VkIGZpbGUgb2YgdGhlIHBhY2thZ2UgKGNvdmVycyBpbXBvcnRzLCB0cmlwbGUtc2xhc2hcbiAqIHJlZmVyZW5jZXMsIGFuZCBleHBsaWNpdCB0c2NvbmZpZyBlbnRyaWVzKSwgb3IgYSBgZmlsZXNgL2BpbmNsdWRlYC9gZXhjbHVkZWAgc2V0IHRoYXQgY2FuIG1hdGNoIHRoZSBmaWxlIOKAlFxuICogcmVzb2x2ZWQgdGhyb3VnaCByZWxhdGl2ZSBgZXh0ZW5kc2AgY2hhaW5zIHdpdGggZWFjaCBwYXR0ZXJuIGtlcHQgcmVsYXRpdmUgdG8gdGhlIGNvbmZpZyB0aGF0IGRlY2xhcmVkIGl0LFxuICogbWF0Y2hpbmcgdHNjLiBXaGVuZXZlciB0aGUgZWZmZWN0aXZlIHNldCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCAobWlzc2luZyBvciB1bnBhcnNlYWJsZSB0c2NvbmZpZywgcGFja2FnZS1uYW1lXG4gKiBgZXh0ZW5kc2AgcHJlc2V0cywgb3IgVHlwZVNjcmlwdCdzIGRlZmF1bHQgYCoqYCBpbmNsdXNpb24pLCB0aGUgY3VycmVudCBtYW5hZ2VkIGJlaGF2aW9yIGlzIGtlcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzKGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGlyUGF0aCc+KTogYm9vbGVhbiB7XG4gIC8vIGBnaXQgZ3JlcGAgc2VhcmNoZXMgdHJhY2tlZCBmaWxlcyBvbmx5LCBzbyB0aGUgZ2l0aWdub3JlZCBnZW5lcmF0ZWQgZmlsZSBpdHNlbGYgbmV2ZXIgbWF0Y2hlcy5cbiAgLy8gd2JmeSdzIG93biBtYW5hZ2VkIGFydGlmYWN0cyBhcmUgZXhjbHVkZWQ6IHRoZSBgLmdpdGlnbm9yZWAgcnVsZSAoYC93b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYClcbiAgLy8gd2JmeSBjb21taXR0ZWQgd2hpbGUgaXQgbWFuYWdlZCB0aGUgcGFja2FnZSBtdXN0IG5vdCBjb3VudCBhcyBjb25zdW1wdGlvbiwgb3IgYSBvbmNlLW1hbmFnZWRcbiAgLy8gcGFja2FnZSBjb3VsZCBuZXZlciBvcHQgb3V0LlxuICBjb25zdCBncmVwUmVzdWx0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICdnaXQnLFxuICAgIC8vIHRzY29uZmlnIGZpbGVzIGFyZSBjbGFzc2lmaWVkIGJ5IHRoZSByZXNvbHZlZCBmaWxlcy9pbmNsdWRlL2V4Y2x1ZGUgbG9naWMgYmVsb3cg4oCUIGEgdGV4dHVhbFxuICAgIC8vIGhpdCB0aGVyZSAoZS5nLiBhbiBgZXhjbHVkZWAgZW50cnkpIG11c3Qgbm90IGNvdW50IGFzIGNvbnN1bXB0aW9uLlxuICAgIFtcbiAgICAgICdncmVwJyxcbiAgICAgICctbCcsXG4gICAgICAnd29ya2VyLWNvbmZpZ3VyYXRpb24nLFxuICAgICAgJy0tJyxcbiAgICAgICcuJyxcbiAgICAgICc6KGV4Y2x1ZGUpLmdpdGlnbm9yZScsXG4gICAgICAnOihleGNsdWRlKS5naXRhdHRyaWJ1dGVzJyxcbiAgICAgIFN0cmluZy5yYXdgOihnbG9iLGV4Y2x1ZGUpKiovdHNjb25maWcqLmpzb25gLFxuICAgIF0sXG4gICAgY29uZmlnLmRpclBhdGhcbiAgKTtcbiAgaWYgKGdyZXBSZXN1bHQudHJpbSgpKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zdCB3b3JrZXJUeXBlc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJyk7XG4gIGNvbnN0IGZpbGVTZXQgPSByZXNvbHZlVHNjb25maWdGaWxlU2V0KHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKSwgY29uZmlnLmRpclBhdGgsIDUpO1xuICBpZiAoIWZpbGVTZXQpIHJldHVybiB0cnVlO1xuICBjb25zdCBtYXRjaGVzID0gKHBhdHRlcm5TZXQ6IFRzY29uZmlnUGF0dGVyblNldCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICghcGF0dGVyblNldCB8fCAhQXJyYXkuaXNBcnJheShwYXR0ZXJuU2V0LnBhdHRlcm5zKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocGF0dGVyblNldC5iYXNlRGlyUGF0aCwgd29ya2VyVHlwZXNQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICByZXR1cm4gcGF0dGVyblNldC5wYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBgJHtjb25maWdEaXJ9YC1wcmVmaXhlZCBwYXR0ZXJucyB3ZXJlIGV4cGFuZGVkIHRvIGFic29sdXRlIHBhdGhzIGF0IHJlc29sdmUgdGltZS5cbiAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUocGF0dGVybikpIHtcbiAgICAgICAgcmV0dXJuIHRzY29uZmlnUGF0dGVybkNvdWxkTWF0Y2hQYXRoKHBhdHRlcm4sIHdvcmtlclR5cGVzUGF0aCwgcGF0dGVyblNldC5leHBhbmRzRGlyZWN0b3JpZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHNjb25maWdQYXR0ZXJuQ291bGRNYXRjaFBhdGgocGF0dGVybiwgcmVsYXRpdmVQYXRoLCBwYXR0ZXJuU2V0LmV4cGFuZHNEaXJlY3Rvcmllcyk7XG4gICAgfSk7XG4gIH07XG4gIC8vIGBmaWxlc2AgZW50cmllcyBhcmUgYWx3YXlzIHBhcnQgb2YgdGhlIHByb2dyYW0sIGV2ZW4gd2hlbiBgZXhjbHVkZWAgbWF0Y2hlcyB0aGVtLlxuICBpZiAobWF0Y2hlcyhmaWxlU2V0LmZpbGVzKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtYXRjaGVzKGZpbGVTZXQuZXhjbHVkZSkpIHJldHVybiBmYWxzZTtcbiAgLy8gTmVpdGhlciBpbmNsdWRlIG5vciBmaWxlcyBkZWNsYXJlZDogVHlwZVNjcmlwdCdzIGRlZmF1bHQgYCoqYCBpbmNsdXNpb24gY292ZXJzIHRoZSBmaWxlLlxuICBpZiAoIWZpbGVTZXQuaW5jbHVkZSAmJiAhZmlsZVNldC5maWxlcykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBtYXRjaGVzKGZpbGVTZXQuaW5jbHVkZSk7XG59XG5cbmludGVyZmFjZSBUc2NvbmZpZ1BhdHRlcm5TZXQge1xuICAvKiogRGlyZWN0b3J5IG9mIHRoZSBjb25maWcgdGhhdCBkZWNsYXJlZCB0aGUgcGF0dGVybnM7IHRzYyByZXNvbHZlcyB0aGVtIHJlbGF0aXZlIHRvIGl0LiAqL1xuICBiYXNlRGlyUGF0aDogc3RyaW5nO1xuICAvKiogaW5jbHVkZS9leGNsdWRlIHRyZWF0IGFuIGV4dGVuc2lvbmxlc3Mgbm9uLWdsb2IgcGF0dGVybiBhcyBhIGRpcmVjdG9yeSBzdWJ0cmVlOyBgZmlsZXNgIGRvZXMgbm90LiAqL1xuICBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW47XG4gIHBhdHRlcm5zOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgVHNjb25maWdGaWxlU2V0IHtcbiAgZXhjbHVkZT86IFRzY29uZmlnUGF0dGVyblNldDtcbiAgZmlsZXM/OiBUc2NvbmZpZ1BhdHRlcm5TZXQ7XG4gIGluY2x1ZGU/OiBUc2NvbmZpZ1BhdHRlcm5TZXQ7XG59XG5cbi8qKiBSZXNvbHZlcyBmaWxlcy9pbmNsdWRlL2V4Y2x1ZGUgdGhyb3VnaCByZWxhdGl2ZSBgZXh0ZW5kc2AgY2hhaW5zOyB1bmRlZmluZWQgd2hlbiB1bnJlYWRhYmxlLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRzY29uZmlnRmlsZVNldChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uc3VtZXJEaXJQYXRoOiBzdHJpbmcsXG4gIHJlbWFpbmluZ0RlcHRoOiBudW1iZXJcbik6IFRzY29uZmlnRmlsZVNldCB8IHVuZGVmaW5lZCB7XG4gIGlmIChyZW1haW5pbmdEZXB0aCA8PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgdHNjb25maWcgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPHtcbiAgICBleGNsdWRlPzogdW5rbm93bjtcbiAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICBmaWxlcz86IHVua25vd247XG4gICAgaW5jbHVkZT86IHVua25vd247XG4gIH0+KGNvbnRlbnQpO1xuICBpZiAoIXRzY29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcbiAgLy8gYCR7Y29uZmlnRGlyfWAgcmVzb2x2ZXMgdG8gdGhlIGRpcmVjdG9yeSBvZiB0aGUgUk9PVCAoY29uc3VtaW5nKSBjb25maWcsIHdoZXJldmVyIGl0IGFwcGVhcnMuXG4gIGNvbnN0IHRvUGF0dGVyblNldCA9IChwYXR0ZXJuczogdW5rbm93biwgZXhwYW5kc0RpcmVjdG9yaWVzOiBib29sZWFuKTogVHNjb25maWdQYXR0ZXJuU2V0IHwgdW5kZWZpbmVkID0+XG4gICAgQXJyYXkuaXNBcnJheShwYXR0ZXJucylcbiAgICAgID8ge1xuICAgICAgICAgIGJhc2VEaXJQYXRoOiBkaXJQYXRoLFxuICAgICAgICAgIGV4cGFuZHNEaXJlY3RvcmllcyxcbiAgICAgICAgICBwYXR0ZXJuczogcGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PlxuICAgICAgICAgICAgdHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnICYmIHBhdHRlcm4uc3RhcnRzV2l0aCgnJHtjb25maWdEaXJ9JylcbiAgICAgICAgICAgICAgPyBwYXRoLmpvaW4oY29uc3VtZXJEaXJQYXRoLCBwYXR0ZXJuLnNsaWNlKCcke2NvbmZpZ0Rpcn0nLmxlbmd0aCkpXG4gICAgICAgICAgICAgIDogcGF0dGVyblxuICAgICAgICAgICksXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBmaWxlU2V0OiBUc2NvbmZpZ0ZpbGVTZXQgPSB7XG4gICAgZXhjbHVkZTogdG9QYXR0ZXJuU2V0KHRzY29uZmlnLmV4Y2x1ZGUsIHRydWUpLFxuICAgIGZpbGVzOiB0b1BhdHRlcm5TZXQodHNjb25maWcuZmlsZXMsIGZhbHNlKSxcbiAgICBpbmNsdWRlOiB0b1BhdHRlcm5TZXQodHNjb25maWcuaW5jbHVkZSwgdHJ1ZSksXG4gIH07XG4gIGNvbnN0IHBhcmVudHMgPVxuICAgIHR5cGVvZiB0c2NvbmZpZy5leHRlbmRzID09PSAnc3RyaW5nJyA/IFt0c2NvbmZpZy5leHRlbmRzXSA6IEFycmF5LmlzQXJyYXkodHNjb25maWcuZXh0ZW5kcykgPyB0c2NvbmZpZy5leHRlbmRzIDogW107XG4gIC8vIFdpdGggYW4gYGV4dGVuZHNgIGFycmF5LCBsYXRlciBlbnRyaWVzIG92ZXJyaWRlIGVhcmxpZXIgb25lcywgYW5kIHRoZSBjaGlsZCBvdmVycmlkZXMgYWxsIOKAlFxuICAvLyBzbyBmaWxsIGVhY2ggc3RpbGwtbWlzc2luZyBrZXkgZnJvbSB0aGUgbGFzdCBwYXJlbnQgdGhhdCBkZWZpbmVzIGl0LlxuICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRzLnRvUmV2ZXJzZWQoKSkge1xuICAgIGlmIChmaWxlU2V0LmV4Y2x1ZGUgJiYgZmlsZVNldC5maWxlcyAmJiBmaWxlU2V0LmluY2x1ZGUpIGJyZWFrO1xuICAgIC8vIFBhY2thZ2UtbmFtZSBleHRlbmRzIChlLmcuIGBAdHNjb25maWcvYnVuYCkgYXJlIGNvbXBpbGVyT3B0aW9ucyBwcmVzZXRzIHdpdGhvdXQgZmlsZSBzZXRzLlxuICAgIGlmICh0eXBlb2YgcGFyZW50ICE9PSAnc3RyaW5nJyB8fCAhcGFyZW50LnN0YXJ0c1dpdGgoJy4nKSkgY29udGludWU7XG4gICAgbGV0IHBhcmVudFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgcGFyZW50KTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFyZW50UGF0aCkgJiYgZnMuZXhpc3RzU3luYyhgJHtwYXJlbnRQYXRofS5qc29uYCkpIHBhcmVudFBhdGggKz0gJy5qc29uJztcbiAgICBjb25zdCBwYXJlbnRGaWxlU2V0ID0gcmVzb2x2ZVRzY29uZmlnRmlsZVNldChwYXJlbnRQYXRoLCBjb25zdW1lckRpclBhdGgsIHJlbWFpbmluZ0RlcHRoIC0gMSk7XG4gICAgaWYgKCFwYXJlbnRGaWxlU2V0KSBjb250aW51ZTtcbiAgICBmaWxlU2V0LmV4Y2x1ZGUgPz89IHBhcmVudEZpbGVTZXQuZXhjbHVkZTtcbiAgICBmaWxlU2V0LmZpbGVzID8/PSBwYXJlbnRGaWxlU2V0LmZpbGVzO1xuICAgIGZpbGVTZXQuaW5jbHVkZSA/Pz0gcGFyZW50RmlsZVNldC5pbmNsdWRlO1xuICB9XG4gIHJldHVybiBmaWxlU2V0O1xufVxuXG5mdW5jdGlvbiB0c2NvbmZpZ1BhdHRlcm5Db3VsZE1hdGNoUGF0aChwYXR0ZXJuOiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZywgZXhwYW5kc0RpcmVjdG9yaWVzOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXR0ZXJuLnJlcGxhY2UoL15cXC5cXC8vdSwgJycpO1xuICAvLyBBIGJhcmUgYC5gIGluY2x1ZGUgY292ZXJzIGV2ZXJ5dGhpbmcgdW5kZXIgdGhlIGNvbmZpZydzIGRpcmVjdG9yeS5cbiAgaWYgKG5vcm1hbGl6ZWQgPT09ICcnIHx8IG5vcm1hbGl6ZWQgPT09ICcuJykgcmV0dXJuIHRydWU7XG4gIC8vIEFic29sdXRlIHBhdHRlcm5zIChleHBhbmRlZCBgJHtjb25maWdEaXJ9YCkgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgYWJzb2x1dGUgdGFyZ2V0OyBkcm9wIHRoZVxuICAvLyBsZWFkaW5nIHNsYXNoZXMgZnJvbSBib3RoIHNvIHRoZSBzZWdtZW50LWJ1aWx0IHJlZ2V4IGFuY2hvcnMgaWRlbnRpY2FsbHkuXG4gIHRhcmdldFBhdGggPSB0YXJnZXRQYXRoLnJlcGxhY2UoL15cXC8rL3UsICcnKTtcbiAgY29uc3Qgc2VnbWVudHMgPSBub3JtYWxpemVkLnNwbGl0KCcvJykuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50ICE9PSAnJyk7XG4gIGNvbnN0IHJlZ2V4U291cmNlID0gc2VnbWVudHNcbiAgICAubWFwKChzZWdtZW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPT09IHNlZ21lbnRzLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoc2VnbWVudCA9PT0gJyoqJykgcmV0dXJuIGlzTGFzdCA/ICcuKicgOiBTdHJpbmcucmF3YCg/OlteL10rLykqYDtcbiAgICAgIGNvbnN0IHNlZ21lbnRTb3VyY2UgPSBzZWdtZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9bLiteJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKVxuICAgICAgICAucmVwbGFjZUFsbCgnKicsIFN0cmluZy5yYXdgW14vXSpgKVxuICAgICAgICAucmVwbGFjZUFsbCgnPycsIFN0cmluZy5yYXdgW14vXWApO1xuICAgICAgcmV0dXJuIGlzTGFzdCA/IHNlZ21lbnRTb3VyY2UgOiBgJHtzZWdtZW50U291cmNlfS9gO1xuICAgIH0pXG4gICAgLmpvaW4oJycpO1xuICAvLyB0c2MgdHJlYXRzIGFuIGV4dGVuc2lvbmxlc3Mgbm9uLWdsb2IgaW5jbHVkZS9leGNsdWRlIGVudHJ5IGFzIGEgZGlyZWN0b3J5IHdob3NlIHN1YnRyZWUgaXMgaW5jbHVkZWQuXG4gIGNvbnN0IGxhc3RTZWdtZW50ID0gc2VnbWVudHMuYXQoLTEpID8/ICcnO1xuICBjb25zdCBkaXJlY3RvcnlTdWZmaXggPVxuICAgIGV4cGFuZHNEaXJlY3RvcmllcyAmJiAhL1sqP10vdS50ZXN0KGxhc3RTZWdtZW50KSAmJiAhbGFzdFNlZ21lbnQuaW5jbHVkZXMoJy4nKSA/IFN0cmluZy5yYXdgKD86Ly4qKT9gIDogJyc7XG4gIHJldHVybiBuZXcgUmVnRXhwKGBeJHtyZWdleFNvdXJjZX0ke2RpcmVjdG9yeVN1ZmZpeH0kYCwgJ3UnKS50ZXN0KHRhcmdldFBhdGgpO1xufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgdGhlIGRpcmVjdG9yeSBvd25zIGEgV29ya2VyLCB1bmxpa2UgdGhlIGlzQ2xvdWRmbGFyZSBoZXVyaXN0aWMsIHdoaWNoIGFsc28gbWF0Y2hlcyBhIHBhY2thZ2UgdGhhdFxuICogbWVyZWx5IG1lbnRpb25zIHdyYW5nbGVyIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93IChlLmcuIHRoZSByb290IG9mIGEgbW9ub3JlcG8gd2hvc2UgV29ya2VyIGxpdmVzIGluIGEgc3ViLXBhY2thZ2UpLlxuICovXG5mdW5jdGlvbiBkZXRlY3RXcmFuZ2xlckNvbmZpZyhkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ10uc29tZSgoZmlsZU5hbWUpID0+XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpKVxuICApO1xufVxuXG4vKipcbiAqIERldGVjdHMgd2hldGhlciBkaXJQYXRoIGJlbG9uZ3MgdG8gdGhlIHdpbGxib29zdGVyLWNvbmZpZ3MgcmVwb3NpdG9yeS4gUHJlZmVycyB0aGUgYXV0aG9yaXRhdGl2ZVxuICogR2l0SHViIHJlcG8gbmFtZSwgd2hpY2ggaXMgaW1tdW5lIHRvIHRoZSBsb2NhbCBkaXJlY3RvcnkgbGF5b3V0LiBUaGF0IG5hbWUgaXMgZmV0Y2hlZCBvbmx5IGZvciB0aGVcbiAqIHJvb3QsIHNvIHN1Yi1wYWNrYWdlcyAoYW5kIG9mZmxpbmUgcm9vdHMpIHdhbGsgdXAgdG8gdGhlIG5lYXJlc3QgZ2l0IHJvb3QgYW5kIG1hdGNoIGl0cyBkaXJlY3RvcnlcbiAqIG5hbWU6IGEgc2libGluZyByZXBvIGNsb25lZCB1bmRlciBhIHBhcmVudCBkaXJlY3RvcnkgbmFtZWQgd2lsbGJvb3N0ZXItY29uZmlncyBzdG9wcyBhdCBpdHMgb3duXG4gKiBgLmdpdGAsIHNvIGl0IGlzIG5vdCBtaXNjbGFzc2lmaWVkLiBUaGUgcGF0aCBzZWdtZW50IHJlbWFpbnMgYSBsYXN0IHJlc29ydCB3aGVuIG5vIGdpdCByb290IGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0SXNXaWxsQm9vc3RlckNvbmZpZ3MoZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvblBhdGg6IHN0cmluZywgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAocmVwb05hbWUpIHJldHVybiByZXBvTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnd2lsbGJvb3N0ZXItY29uZmlncyc7XG4gIGxldCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICB3aGlsZSAoY3VycmVudCAhPT0gcGF0aC5kaXJuYW1lKGN1cnJlbnQpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcuZ2l0JykpKSB7XG4gICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShjdXJyZW50KS50b0xvd2VyQ2FzZSgpID09PSAnd2lsbGJvb3N0ZXItY29uZmlncyc7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBwYXRoLmRpcm5hbWUoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIHBhY2thZ2VKc29uUGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCcvd2lsbGJvb3N0ZXItY29uZmlncy8nKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0Q2xvdWRmbGFyZShcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnOiBib29sZWFuLFxuICB3b3JrZmxvd0NvbnRlbnRzOiBzdHJpbmdbXVxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCd3cmFuZ2xlcicpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRvZXNDb250YWluV3JhbmdsZXJDb25maWcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd0NvbnRlbnRzLnNvbWUoKGNvbnRlbnQpID0+IC9jbG91ZGZsYXJlfHdyYW5nbGVyL2l1LnRlc3QoY29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RSYWlsd2F5KGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLCB3b3JrZmxvd0NvbnRlbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cztcbiAgaWYgKHNjcmlwdHMgJiYgT2JqZWN0LnZhbHVlcyhzY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC5pbmNsdWRlcygncmFpbHdheScpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmFpbHdheWlnbm9yZScpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdyYWlsd2F5Lmpzb24nKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncmFpbHdheS50b21sJykpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtmbG93Q29udGVudHMuc29tZSgoY29udGVudCkgPT4gL3JhaWx3YXkvaXUudGVzdChjb250ZW50KSk7XG59XG5cbi8qKiBDb250ZW50cyBvZiB0aGUgcmVhZGFibGUgLmdpdGh1Yi93b3JrZmxvd3MgWUFNTCBmaWxlcywgcmVhZCBvbmNlIGZvciBldmVyeSBkZXRlY3RvciBuZWVkaW5nIHRoZW0uICovXG5mdW5jdGlvbiByZWFkV29ya2Zsb3dGaWxlQ29udGVudHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRkaXJTeW5jKHdvcmtmbG93c1BhdGgpXG4gICAgICAuZmlsdGVyKChmaWxlTmFtZSkgPT4gL1xcLnlhP21sJC9pdS50ZXN0KGZpbGVOYW1lKSlcbiAgICAgIC5mbGF0TWFwKChmaWxlTmFtZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBbZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4JyldO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1pc2VUYXNrcyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7IHRhc2tzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncy50YXNrcyA/PyB7fSkpIHtcbiAgICAgICAgdGFza3NbbmFtZV0gPSByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3Npbmcgb3IgdGVtcG9yYXJpbHkgaW52YWxpZCBtaXNlIGZpbGVzIHNob3VsZCBub3QgYmxvY2sgb3RoZXIgd2JmeSBnZW5lcmF0b3JzLlxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFza3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAvLyBQcmVzZXJ2ZSBhcnJheS1mb3JtIG1pc2UgY29tbWFuZHMgc28gcmVjdXJzaW9uIGNoZWNrcyBjYW4gc3RpbGwgc2VlIHBhY2thZ2Ugc2NyaXB0IGNhbGxzLlxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5maWx0ZXIoKGNvbW1hbmQpOiBjb21tYW5kIGlzIHN0cmluZyA9PiB0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycpLmpvaW4oJ1xcbicpO1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIHJlYWRNaXNlVGFza0NvbW1hbmQoKHZhbHVlIGFzIHsgcnVuPzogdW5rbm93biB9KS5ydW4pO1xuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogV2hldGhlciBkaXJQYXRoIGlzIGEgY2hpbGQgd29ya3NwYWNlIG9mIGFuIGVuY2xvc2luZyBtb25vcmVwbyByb290OiBlaXRoZXIgdGhlIGNvbnZlbnRpb25hbFxuICogYDxyb290Pi9wYWNrYWdlcy88bmFtZT5gIGxheW91dCwgb3IgYSBkaXJlY3RvcnkgbWF0Y2hpbmcgYSB3b3Jrc3BhY2UgcGF0dGVybiBkZWNsYXJlZCBieSBhblxuICogYW5jZXN0b3IgcGFja2FnZS5qc29uIChwYXR0ZXJucyBtYXkgYmUgYXJiaXRyYXJpbHkgZGVlcCwgZS5nLiBgZXhhbXBsZXMvKipgKS4gVGhlIHdhbGsgc3RvcHNcbiAqIGF0IHRoZSBmaXJzdCBnaXQgcmVwb3NpdG9yeSBib3VuZGFyeSBzbyBhbiB1bnJlbGF0ZWQgZW5jbG9zaW5nIHJlcG9zaXRvcnkncyB3b3Jrc3BhY2VzIGNhblxuICogbmV2ZXIgcmVjbGFzc2lmeSBhbiBpbmRlcGVuZGVudCByZXBvc2l0b3J5IGFzIGEgY2hpbGQuXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlT2ZFbmNsb3NpbmdSb290KGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZXNvbHZlZERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIC8vIEEgZGlyZWN0b3J5IHdpdGggaXRzIG93biAuZ2l0IGlzIGEgcmVwb3NpdG9yeSBpbiBpdHMgb3duIHJpZ2h0LCBuZXZlciBhIGNoaWxkIHdvcmtzcGFjZSDigJRcbiAgLy8gY2hlY2tlZCBGSVJTVCBzbyBhbiBpbmRlcGVuZGVudCByZXBvc2l0b3J5IHVuZGVyIHNvbWUgYHBhY2thZ2VzL2AgZGlyZWN0b3J5IHN0YXlzIGEgcm9vdC5cbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy5naXQnKSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKFxuICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy4uJykpID09PSAncGFja2FnZXMnICYmXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocmVzb2x2ZWREaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZvciAoXG4gICAgbGV0IGNhbmRpZGF0ZVJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKHJlc29sdmVkRGlyUGF0aCk7XG4gICAgO1xuICAgIGNhbmRpZGF0ZVJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKGNhbmRpZGF0ZVJvb3REaXJQYXRoKVxuICApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm9vdFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICApIGFzIFBhY2thZ2VKc29uO1xuICAgICAgY29uc3QgcmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgcmVzb2x2ZWREaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZURpclBhdGhzID0gZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh7XG4gICAgICAgIGRpclBhdGg6IGNhbmRpZGF0ZVJvb3REaXJQYXRoLFxuICAgICAgICBwYWNrYWdlSnNvbjogcm9vdFBhY2thZ2VKc29uLFxuICAgICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogZmFsc2UsXG4gICAgICB9KS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT4gcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpO1xuICAgICAgaWYgKHdvcmtzcGFjZURpclBhdGhzLmluY2x1ZGVzKHJlbGF0aXZlRGlyUGF0aCkpIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm8gb3IgdW5wYXJzYWJsZSBtYW5pZmVzdCBhdCB0aGlzIGFuY2VzdG9yOiBrZWVwIHdhbGtpbmcuXG4gICAgfVxuICAgIGNvbnN0IGlzUmVwb0JvdW5kYXJ5ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY2FuZGlkYXRlUm9vdERpclBhdGgsICcuZ2l0JykpO1xuICAgIGNvbnN0IGlzRmlsZXN5c3RlbVJvb3QgPSBjYW5kaWRhdGVSb290RGlyUGF0aCA9PT0gcGF0aC5kaXJuYW1lKGNhbmRpZGF0ZVJvb3REaXJQYXRoKTtcbiAgICBpZiAoaXNSZXBvQm91bmRhcnkgfHwgaXNGaWxlc3lzdGVtUm9vdCkgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuZnVuY3Rpb24gZmluZENhcmdvVG9tbERpclBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGZnXG4gICAgLmdsb2JTeW5jKCcqKi9DYXJnby50b21sJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pXG4gICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGguZGlybmFtZShmaWxlUGF0aCkpXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLnNwbGl0KCcvJykubGVuZ3RoIC0gYi5zcGxpdCgnLycpLmxlbmd0aCB8fCBhLmxvY2FsZUNvbXBhcmUoYikpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RQbGF5d3JpZ2h0UnVudGltZUltcG9ydChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZmlsZXMgPSBmZy5nbG9iU3luYygne2FwcCxzcmN9LyoqLyoue2NqcyxjdHMsanMsanN4LG1qcyxtdHMsdHMsdHN4fScsIHtcbiAgICBkb3Q6IHRydWUsXG4gICAgY3dkOiBkaXJQYXRoLFxuICAgIGlnbm9yZTogWy4uLmdsb2JJZ25vcmUsICcqKi9fX3Rlc3RzX18vKionLCAnKiovKi5zcGVjLionLCAnKiovKi50ZXN0LionLCAnKiovcGxheXdyaWdodC5jb25maWcuKiddLFxuICB9KTtcbiAgY29uc3QgcGxheXdyaWdodEltcG9ydFBhdHRlcm4gPSBidWlsZFJ1bnRpbWVJbXBvcnRSZWdFeHAoJ3BsYXl3cmlnaHQnKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZSksICd1dGY4Jyk7XG4gICAgaWYgKHBsYXl3cmlnaHRJbXBvcnRQYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSdW50aW1lSW1wb3J0UmVnRXhwKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBSZWdFeHAge1xuICAvLyBNYXRjaCB0aGUgYmFyZSBzcGVjaWZpZXIgb3IgYW55IHN1YnBhdGggb2YgaXQgKGBwa2dgIC8gYHBrZy9zdWJgKSwgYnV0IG5ldmVyIGEgZGlmZmVyZW50IHBhY2thZ2VcbiAgLy8gdGhhdCBtZXJlbHkgc2hhcmVzIHRoZSBwcmVmaXggKGBwa2ctb3RoZXJgKSwgc2luY2UgdGhlIGNoYXIgYWZ0ZXIgdGhlIG5hbWUgbXVzdCBiZSBgL2Agb3IgYSBxdW90ZS5cbiAgY29uc3Qgc3BlY2lmaWVyID0gU3RyaW5nLnJhd2BbJ1wiXSR7ZXNjYXBlUmVnRXhwKHBhY2thZ2VOYW1lKX0oPzovW14nXCJdKik/WydcIl1gO1xuICByZXR1cm4gbmV3IFJlZ0V4cChcbiAgICBTdHJpbmcucmF3YFxcYmZyb21cXHMrJHtzcGVjaWZpZXJ9fFxcYmltcG9ydFxccypcXChcXHMqJHtzcGVjaWZpZXJ9XFxzKlxcKXxcXGJyZXF1aXJlXFxzKlxcKFxccyoke3NwZWNpZmllcn1cXHMqXFwpYCxcbiAgICAndSdcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVtb3RlVXJsID0gZ2V0T3JpZ2luUmVtb3RlVXJsKGRpclBhdGgpO1xuICBpZiAocmVtb3RlVXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uLiBUaGUgb3duZXIgTVVTVCBiZSBwYXNzZWQ6IGdldE9jdG9raXQoKSB3aXRob3V0IGl0IHByZWZlcnMgdGhlXG4gICAgLy8gV2lsbEJvb3N0ZXIgUEFULCB3aGljaCBjYW5ub3QgcmVhZCBwcml2YXRlIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcmllcywgY29sbGFwc2luZyB0aGVpclxuICAgIC8vIHZpc2liaWxpdHkgdG8gdW5rbm93biAoYW5kIGUuZy4gc2tpcHBpbmcgdGhlIHdiZnkgY2FsbGVyIGdlbmVyYXRpb24gaW5kZWZpbml0ZWx5KS5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQob3JnKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVkaXJlY3RlZEZ1bGxOYW1lID0gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcik7XG4gICAgaWYgKHJlZGlyZWN0ZWRGdWxsTmFtZSkge1xuICAgICAgLy8gUmUtZmV0Y2ggdW5kZXIgdGhlIHJlZGlyZWN0ZWQgaWRlbnRpdHkgc28gYSByZW5hbWVkIHJlcG9zaXRvcnkgc3RpbGwgZ2V0cyBjb21wbGV0ZVxuICAgICAgLy8gbWV0YWRhdGEgKHZpc2liaWxpdHkgaW5jbHVkZWQpIGluc3RlYWQgb2YgYSBiYXJlIGZ1bGxfbmFtZSB0aGF0IHdvdWxkIGxlYXZlXG4gICAgICAvLyBpc1JlcG9WaXNpYmlsaXR5S25vd24gZmFsc2Ugb24gZXZlcnkgc3Vic2VxdWVudCBydW4gd2l0aCB0aGUgc3RhbGUgcmVtb3RlIFVSTC5cbiAgICAgIGNvbnN0IFtyZWRpcmVjdGVkT3JnLCByZWRpcmVjdGVkTmFtZV0gPSByZWRpcmVjdGVkRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZWRpcmVjdGVkT3JnICYmIHJlZGlyZWN0ZWROYW1lKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KHJlZGlyZWN0ZWRPcmcpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICAgICAgICBvd25lcjogcmVkaXJlY3RlZE9yZyxcbiAgICAgICAgICAgIHJlcG86IHJlZGlyZWN0ZWROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGJhcmUgaWRlbnRpdHkgYmVsb3c6IHRoZSByZXBvc2l0b3J5IGlzIHN0aWxsIGNhbm9uaWNhbGl6ZWQsIG9ubHlcbiAgICAgICAgICAvLyBpdHMgdmlzaWJpbGl0eSBzdGF5cyB1bmtub3duLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBmdWxsX25hbWU6IHJlZGlyZWN0ZWRGdWxsTmFtZSB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGA8b3JnPi88bmFtZT5gIGZyb20gdGhlIGdpdCByZW1vdGUgKGZhbGxpbmcgYmFjayB0byBwYWNrYWdlLmpzb24ncyBgcmVwb3NpdG9yeWApIHdpdGhvdXRcbiAqIGNhbGxpbmcgdGhlIEdpdEh1YiBBUEkuIEl0IHdvcmtzIGZvciBldmVyeSB3b3Jrc3BhY2UgcGFja2FnZSwgbm90IGp1c3QgdGhlIHJvb3Qg4oCUIG9ubHkgdGhlIHJvb3RcbiAqIGZldGNoZXMgcmVwbyBpbmZvIOKAlCBhbmQgaXQga2VlcHMgd29ya2luZyBvZmZsaW5lIG9yIHJhdGUtbGltaXRlZCwgd2hlcmUgYW4gdW5kZWZpbmVkIGlkZW50aXR5XG4gKiB3b3VsZCBzaWxlbnRseSByZWNsYXNzaWZ5IHRoZSByZXBvc2l0b3J5IChlLmcuIG1ha2luZyB3YmZ5IHdyaXRlIHdpbGxib29zdGVyLWNvbmZpZ3MnIFJlbm92YXRlXG4gKiBwcmVzZXQgaW50byB0aGUgcHJlc2V0IGl0c2VsZiBhZ2FpbikuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVMb2NhbFJlcG9JZGVudGl0eShcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb25cbik6IFByb21pc2U8W3N0cmluZyB8IHVuZGVmaW5lZCwgc3RyaW5nIHwgdW5kZWZpbmVkXT4ge1xuICBjb25zdCByZW1vdGVVcmwgPSBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aCk7XG4gIGlmIChyZW1vdGVVcmwpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHJlYWRHaXRIdWJJZGVudGl0eShyZW1vdGVVcmwpO1xuICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHJlYWRHaXRIdWJJZGVudGl0eSh1cmwpO1xuICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIHJldHVybiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdO1xufVxuXG5mdW5jdGlvbiBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydjb25maWcnLCAnLS1nZXQnLCAncmVtb3RlLm9yaWdpbi51cmwnXSwgZGlyUGF0aCkgfHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIGBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWVgIGlzIGhvc3QtYWdub3N0aWMsIHNvIGl0IGhhcHBpbHkgdHVybnMgYSBHaXRMYWIgVVJMIGludG8gYW4gYDxvcmc+LzxyZXBvPmAgcGFpci5cbiAqIEV2ZXJ5dGhpbmcgZG93bnN0cmVhbSB0cmVhdHMgdGhlIHJlc3VsdGluZyBpZGVudGl0eSBhcyBHaXRIdWIgKHRoZSBgZ2l0aHViOmAgcmVwb3NpdG9yeSBmaWVsZCBpcyByZXdyaXR0ZW5cbiAqIGludG8gcGFja2FnZS5qc29uKSwgc28gdGhlIGhvc3QgbXVzdCBiZSB2ZXJpZmllZCBmaXJzdDsgYSBub24tR2l0SHViIHJlbW90ZSB5aWVsZHMgbm8gaWRlbnRpdHksIGFzIGJlZm9yZS5cbiAqL1xuZnVuY3Rpb24gcmVhZEdpdEh1YklkZW50aXR5KHVybDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB8IHVuZGVmaW5lZCB7XG4gIGlmICghdGFyZ2V0c0dpdEh1Yih1cmwpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmwpO1xuICByZXR1cm4gb3JnICYmIG5hbWUgPyBbY2Fub25pY2FsaXplT3duZXIob3JnKSwgbmFtZV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgVVJMJ3MgSE9TVCBpcyBnaXRodWIuY29tLiBQYXJzZWQgcmF0aGVyIHRoYW4gc3Vic3RyaW5nLW1hdGNoZWQ6IGEgcGF0aCBzdWNoIGFzXG4gKiBgaHR0cHM6Ly9naXRsYWIuY29tL2dpdGh1Yi5jb20vb3duZXIvcmVwby5naXRgIHdvdWxkIG90aGVyd2lzZSBiZSB0YWtlbiBmb3IgR2l0SHViLCBhbmQgYW4gdXBwZXJjYXNlXG4gKiBgR0lUSFVCLkNPTWAgd291bGQgYmUgcmVqZWN0ZWQuIGBnaXRodWI6b3duZXIvcmVwb2AgaXMgbnBtJ3Mgc2hvcnRoYW5kIGFuZCBuYW1lcyBubyBob3N0LCBzbyBpdCBpc1xuICogcmVjb2duaXplZCBzZXBhcmF0ZWx5OyBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24gYWNjZXB0cyB0aGUgc2FtZSBzaG9ydGhhbmQuXG4gKi9cbmZ1bmN0aW9uIHRhcmdldHNHaXRIdWIodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKC9eZ2l0aHViOi9pdS50ZXN0KHVybCkpIHJldHVybiB0cnVlO1xuICAvLyBzY3Atc3R5bGUgcmVtb3RlcyAoYGdpdEBnaXRodWIuY29tOm93bmVyL3JlcG8uZ2l0YCkgYXJlIG5vdCB2YWxpZCBVUkxzLlxuICBjb25zdCBzY3BIb3N0ID0gL15bXi9AXSpAKFteOi9dKyk6L3UuZXhlYyh1cmwpPy5bMV07XG4gIGlmIChzY3BIb3N0KSByZXR1cm4gc2NwSG9zdC50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbSc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkwodXJsLnJlcGxhY2UoL15naXRcXCsvdSwgJycpKS5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbSc7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdpdEh1YiBvd25lciBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgYW5kIGEgcmVtb3RlIG9yIG1hbmlmZXN0IFVSTCBtYXkgc3BlbGwgdGhlbSBhbnkgd2F5LCBidXQgdGhlIEFQSSdzXG4gKiBgZnVsbF9uYW1lYCBhbHdheXMgcmV0dXJuZWQgdGhlIGNhbm9uaWNhbCBzcGVsbGluZyDigJQgd2hpY2ggdGhlIG1hbnkgZXhhY3QgYD09PSAnV2lsbEJvb3N0ZXInYCBwb2xpY3kgY2hlY2tzXG4gKiAob3JnYW5pemF0aW9uIHdvcmtmbG93cywgYXV0aG9yIG1ldGFkYXRhLCB0aGUgV2lsbEJvb3N0ZXJMYWIgcHJlLXB1c2ggZ3VhcmQpIGRlcGVuZCBvbi4gQ2Fub25pY2FsaXplIGhlcmUgc29cbiAqIHRoZSBsb2NhbCBmYWxsYmFjayB5aWVsZHMgdGhlIHNhbWUgaWRlbnRpdHkgdGhlIEFQSSBkaWQsIGluc3RlYWQgb2Ygc2lsZW50bHkgc2tpcHBpbmcgdGhvc2UgcG9saWNpZXMuXG4gKi9cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZU93bmVyKG93bmVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYW5vbmljYWxPd25lcnMgPSBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ107XG4gIHJldHVybiBjYW5vbmljYWxPd25lcnMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUudG9Mb3dlckNhc2UoKSA9PT0gb3duZXIudG9Mb3dlckNhc2UoKSkgPz8gb3duZXI7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBJU1NVRV9URU1QTEFURV9SVUxFUywgUFVMTF9SRVFVRVNUX0JPRFlfUlVMRVMsIFRFU1RfV1JJVElOR19SVUxFUyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3csIGludm9rZXNXYkRlcGxveSB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdENvbmZpZy5kaXJQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGFnZW50c0V4dHJhQ29udGVudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcblxuLyoqXG4gKiBSZWFkcyB0aGUgcm9vdCdzIHVzZXItYXV0aG9yZWQgQUdFTlRTX0VYVFJBLm1kIG9uY2UgcGVyIHByb2Nlc3M6IHdiZnkgbmV2ZXIgcmV3cml0ZXMgdGhlIGZpbGUsXG4gKiBhbmQgYm90aCB0aGUgYWdlbnQtaW5zdHJ1Y3Rpb24gYW5kIEdlbWluaSBnZW5lcmF0b3JzIG5lZWQgaXRzIGNvbnRlbnQuIENhY2hpbmcgdGhlIHJlc29sdmVkXG4gKiB2YWx1ZSAobm90IHRoZSBQcm9taXNlKSBpcyByYWNlLWZyZWUgYmVjYXVzZSB0aGUgdHdvIGNhbGxlcnMgcnVuIHNlcXVlbnRpYWxseSBpbiBpbmRleC50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdERpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICBpZiAoIWFnZW50c0V4dHJhQ29udGVudENhY2hlLmhhcyhhZ2VudHNFeHRyYVBhdGgpKSB7XG4gICAgYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuc2V0KGFnZW50c0V4dHJhUGF0aCwgYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoYWdlbnRzRXh0cmFQYXRoKSk7XG4gIH1cbiAgcmV0dXJuIGFnZW50c0V4dHJhQ29udGVudENhY2hlLmdldChhZ2VudHNFeHRyYVBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBmcm9udG1hdHRlciA9IGAtLS1cXG5kZXNjcmlwdGlvbjogR2VuZXJhbCBDb2RpbmcgUnVsZXNcXG5nbG9iczpcXG5hbHdheXNBcHBseTogdHJ1ZVxcbi0tLWA7XG4gIGNvbnN0IGJvZHkgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oY29uZmlnLCBhbGxDb25maWdzLCAnQ3Vyc29yJywgZXh0cmFDb250ZW50KTtcbiAgcmV0dXJuIGAke2Zyb250bWF0dGVyfVxcblxcbiR7Ym9keX1gO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9ICdidW4nO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IHJvb3RDb25maWcucGFja2FnZUpzb24/LmRlc2NyaXB0aW9uO1xuICBjb25zdCBmbm94SW5zdHJ1Y3Rpb24gPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSlcbiAgICA/IGBcXG4tIEVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyBsaXZlIGluIFxcYGZub3gudG9tbFxcYCAobWlzZSArIGZub3gpOyBuZXZlciBjcmVhdGUgXFxgLmVudlxcYCwgXFxgLmVudi4qXFxgLCBvciBcXGAuZGV2LnZhcnNcXGAgZmlsZXMuIFJ1biBjb21tYW5kcyB0aHJvdWdoIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIC4uLlxcYCBvciBcXGBmbm94IHJ1biAtUCA8cHJvZmlsZT4gLS0gPGNvbW1hbmQ+XFxgLiBQcm9maWxlIHNlY3JldHMgbG9hZCBvbmx5IHdoZW4gYSBwcm9maWxlIGlzIHNlbGVjdGVkOiBtb2RlLWF3YXJlIHdiIGNvbW1hbmRzIChlLmcuIFxcYHdiIHN0YXJ0XFxgLCBcXGB3YiB0ZXN0XFxgKSBhbmQgXFxgd2IgZG90ZW52XFxgIHNlbGVjdCBpdCB0aGVtc2VsdmVzIChcXGB3YiBkb3RlbnZcXGAgdXNlcyBcXGBXQl9FTlZcXGAsIGVsc2UgXFxgRk5PWF9QUk9GSUxFXFxgLCBlbHNlIFxcYE5PREVfRU5WXFxgLCBlbHNlIHRoZSBkZXZlbG9wbWVudCBwcm9maWxlOyBcXGBXQl9FTlZcXGAgYWNjZXB0cyBvbmx5IFxcYGRldmVsb3BtZW50XFxgL1xcYHRlc3RcXGAvXFxgc3RhZ2luZ1xcYC9cXGBwcm9kdWN0aW9uXFxgLCBzbyB1c2UgXFxgRk5PWF9QUk9GSUxFXFxgIGZvciBhbnkgb3RoZXIgcHJvZmlsZSksIHdoaWxlIGJhcmUgXFxgZm5veCBydW5cXGAgbmVlZHMgYW4gZXhwbGljaXQgXFxgLVAgPHByb2ZpbGU+XFxgLmBcbiAgICA6ICcnO1xuICAvLyBtaXNlIG93bnMgdGhlIHBpbm5lZCB0b29sIHZlcnNpb25zLCBzbyBhIHZlcnNpb24gbWlzbWF0Y2ggaXMgZml4ZWQgYnkgZWRpdGluZyBtaXNlLnRvbWwg4oCUIG5vdFxuICAvLyBieSBpbnN0YWxsaW5nIGEgZGlmZmVyZW50IHZlcnNpb24gZ2xvYmFsbHksIHdoaWNoIHRoZSBuZXh0IGBtaXNlIGluc3RhbGxgIHNpbGVudGx5IG92ZXJyaWRlcy5cbiAgY29uc3QgbWlzZUluc3RydWN0aW9uID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnbWlzZS50b21sJykpXG4gICAgPyAnXFxuLSBUb29sIHZlcnNpb25zIChlLmcuLCBub2RlKSBhcmUgcGlubmVkIGluIGBtaXNlLnRvbWxgOyBydW4gYG1pc2UgaW5zdGFsbGAgYWZ0ZXIgY2hhbmdpbmcgaXQgYW5kIG5ldmVyIGluc3RhbGwgdGhvc2UgdG9vbHMgZ2xvYmFsbHkgaW5zdGVhZC4nXG4gICAgOiAnJztcbiAgLy8gSXNvbGF0ZWQgaW5zdGFsbHMgYXJlIHRoZSBvcmcgc3RhbmRhcmQgKHdiZnkgZ2VuZXJhdGVzIG5vIG90aGVyIGxpbmtlcikgYW5kIHRoZSBtb3N0XG4gIC8vIGFnZW50LWhvc3RpbGUgcGFydCBvZiB0aGUgc3RhY2s6IGEgcGFja2FnZSB0aGF0IGlzIG9ubHkgcmVhY2hhYmxlIGJlY2F1c2UgYSBkZXBlbmRlbmN5IGhvaXN0ZWRcbiAgLy8gaXQgbm8gbG9uZ2VyIHJlc29sdmVzLCBhbmQgdGhlIHJlZmxleCBmaXggKHN3aXRjaGluZyB0aGUgbGlua2VyIGJhY2spIHNpbGVudGx5IHJlaW50cm9kdWNlc1xuICAvLyB0aGUgcGhhbnRvbSBkZXBlbmRlbmNpZXMgdGhlIGxheW91dCBleGlzdHMgdG8gY2F0Y2guXG4gIGNvbnN0IGlzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9uID0gYFxcbi0gXFxgYnVuZmlnLnRvbWxcXGAgdXNlcyBCdW4ncyBpc29sYXRlZCBsaW5rZXIsIHNvIG9ubHkgZGVjbGFyZWQgZGVwZW5kZW5jaWVzIHJlc29sdmUuIElmIGFuIGltcG9ydCBmYWlscyB0byByZXNvbHZlLCBkZWNsYXJlIHRoYXQgcGFja2FnZSBpbiB0aGUgXFxgcGFja2FnZS5qc29uXFxgIHRoYXQgaW1wb3J0cyBpdDsgbmV2ZXIgc3dpdGNoIFxcYGxpbmtlclxcYCB0byBcXGBob2lzdGVkXFxgIG9yIGFkZCB0byBcXGBwdWJsaWNIb2lzdFBhdHRlcm5cXGAgdG8gd29yayBhcm91bmQgaXQuYDtcbiAgLy8gRXZlcnkgY2xhdXNlIHN0YXRlcyBvbmx5IGEgdmVyaWZpZWQgZmFjdCwgcmV1c2luZyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3Mgb3duIGRldGVjdG9yczogdGhlXG4gIC8vIHdyYW5nbGVyLWNvbmZpZyBjbGF1c2UgbmVlZHMgYW4gYWN0dWFsIGNvbmZpZyBmaWxlIChpc0Nsb3VkZmxhcmUgYWxzbyBtYXRjaGVzIGEgbWVyZSB3cmFuZ2xlclxuICAvLyBtZW50aW9uIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93KSwgdGhlIHdvcmtmbG93IGNsYXVzZSBuZWVkcyBhIGxpdmUgcmV1c2FibGUtZGVwbG95IGNhbGxlclxuICAvLyAoWUFNTC1wYXJzZWQgam9icy4qLnVzZXMsIG5vdCBhIHJhdy10ZXh0L2NvbW1lbnQgbWF0Y2gpLCBhbmQgdGhlIGB3YiBkZXBsb3lgIGNsYXVzZSBuZWVkcyBhXG4gIC8vIGRlcGxveSBzY3JpcHQgd2hvc2UgY29tbWFuZCB0b2tlbiBpcyBgd2Ig4oCmIGRlcGxveWAuXG4gIGNvbnN0IG93bnNXcmFuZ2xlckNvbmZpZyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIC8vIE9ubHkgY2xhaW0gdGhlIGZpbGUgaXMgZ2VuZXJhdGVkIHdoZXJlIGl0IGFjdHVhbGx5IGlzOiBhIHBhY2thZ2UgdGhhdCBoYW5kLW1haW50YWlucyBpdHMgYEVudmAgKGUuZy4gdW5kZXJcbiAgLy8gYHR5cGVzOiBbXCJidW5cIl1gKSBpcyBkZWxpYmVyYXRlbHkgbGVmdCB1bm1hbmFnZWQsIGFuZCB0ZWxsaW5nIGFuIGFnZW50IHRvIHJ1biBgd2IgZ2VuLWNvZGVgIHRoZXJlIHdvdWxkIHNlbmRcbiAgLy8gaXQgYWZ0ZXIgYSBmaWxlIHRoYXQgbmV2ZXIgYXBwZWFycyDigJQgYW5kIGF3YXkgZnJvbSB0aGUgYEVudmAgaXQgc2hvdWxkIGJlIGVkaXRpbmcuXG4gIGNvbnN0IG93bnNHZW5lcmF0ZWRXb3JrZXJUeXBlcyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbiAgY29uc3QgaGFzRGVwbG95V29ya2Zsb3cgPSBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3cocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWIvd29ya2Zsb3dzJykpO1xuICBjb25zdCB1c2VzV2JEZXBsb3kgPSBhbGxDb25maWdzLnNvbWUoKGNvbmZpZykgPT4ge1xuICAgIGNvbnN0IGRlcGxveVNjcmlwdCA9IGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uWydkZXBsb3knXTtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIGRlcGxveVNjcmlwdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQsIG5ldyBTZXQoT2JqZWN0LmtleXMoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9KSkpXG4gICAgKTtcbiAgfSk7XG4gIC8vIEluZGVwZW5kZW50IGZhY3RzIHN0YXkgc2VwYXJhdGUgc2VudGVuY2VzOiB0aGUgd29ya2Zsb3cncyBvd24gZGVwbG95IG1lY2hhbmlzbSBpcyBub3RcbiAgLy8gaW5zcGVjdGVkLCBzbyB0aGUgd2ItZGVwbG95IGNsYXVzZSBtdXN0IG5vdCBjbGFpbSB0aGUgd29ya2Zsb3cgaW52b2tlcyBpdC5cbiAgY29uc3QgY2xvdWRmbGFyZUluc3RydWN0aW9uID0gb3duc1dyYW5nbGVyQ29uZmlnXG4gICAgPyBgXFxuLSBUaGlzIHByb2plY3QgcnVucyBvbiBDbG91ZGZsYXJlIFdvcmtlcnM6IHRoZSB3cmFuZ2xlciBjb25maWd1cmF0aW9uIGZpbGUgaG9sZHMgdGhlIFdvcmtlcidzIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBiaW5kaW5ncyBhbmQgcGVyLWVudmlyb25tZW50IG92ZXJyaWRlcy4ke2hhc0RlcGxveVdvcmtmbG93ID8gJyBUaGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgIHBlcmZvcm0gZGVwbG95bWVudHMuJyA6ICcnfSR7dXNlc1diRGVwbG95ID8gJyBUaGUgYGRlcGxveWAgcGFja2FnZSBzY3JpcHQgcnVucyBgd2IgZGVwbG95YC4nIDogJyd9JHtvd25zR2VuZXJhdGVkV29ya2VyVHlwZXMgPyBgXFxuLSBcXGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzXFxgIGlzIGdpdGlnbm9yZWQgYW5kIGdlbmVyYXRlZCBieSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBnZW4tY29kZVxcYDsgYWZ0ZXIgY2hhbmdpbmcgYmluZGluZ3Mgb3IgdmFycyBpbiB0aGUgd3JhbmdsZXIgY29uZmlndXJhdGlvbiwgcmUtcnVuIGl0IGluc3RlYWQgb2YgZWRpdGluZyB0aGUgZmlsZSBieSBoYW5kLmAgOiAnJ31gXG4gICAgOiAnJztcbiAgLy8gV2lsbEJvb3N0ZXIgUmFpbHdheSBwcm9qZWN0IGlkZW50aWZpZXJzIGFyZSBtYW5hZ2VkIGluIGRlcGxveSB3b3JrZmxvdyBzZXR0aW5ncy5cbiAgY29uc3QgcmFpbHdheUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1JhaWx3YXlcbiAgICA/ICdcXG4tIFJhaWx3YXkgcHJvamVjdCBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgLidcbiAgICA6ICcnO1xuICBjb25zdCBwbGF5d3JpZ2h0VGVzdFNlcnZlckluc3RydWN0aW9uID0gaGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoYWxsQ29uZmlncylcbiAgICA/IGBcXG4tIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBzdGFydCAtLW1vZGUgdGVzdFxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gXG4gICAgOiAnJztcbiAgY29uc3QgY29BdXRob3JJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/IGBcXG4gIC0gRW5kIHlvdXIgY29tbWl0IG1lc3NhZ2Ugd2l0aCBhIGJsYW5rIGxpbmUgZm9sbG93ZWQgYnkgXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGAsIHRoZSBvbmx5IEFJIGF0dHJpYnV0aW9uIHRvIGFkZC5gXG4gICAgOiAnJztcbiAgLy8gS2V5ZWQgb24gdGhlIHJlcG9zaXRvcnkgY2xhc3NpZmljYXRpb24gcmF0aGVyIHRoYW4gb24gdGhlIHRlbXBsYXRlIGZpbGVzJyBwcmVzZW5jZTogdGhlIHNhbWVcbiAgLy8gcnVuIHdyaXRlcyB0aGUgdGVtcGxhdGVzIGZvciBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcmllcyBiZWZvcmUgdGhpcyBnZW5lcmF0b3JcbiAgLy8gcnVucywgYW5kIGhhbmQtYWRkZWQgdGVtcGxhdGVzIGVsc2V3aGVyZSBiZWxvbmcgdG8gQUdFTlRTX0VYVFJBLm1kLlxuICBjb25zdCBwclRlbXBsYXRlSW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBgXFxuJHtQVUxMX1JFUVVFU1RfQk9EWV9SVUxFUy5yZXBsYWNlQWxsKC9eL2dtLCAnICAnKX1gXG4gICAgOiAnJztcbiAgLy8gR2F0ZWQgbGlrZSBwclRlbXBsYXRlSW5zdHJ1Y3Rpb246IHRoZSBzZWN0aW9uIGl0IG5hbWVzIGV4aXN0cyBvbmx5IHdoZXJlIHRoZSB0ZW1wbGF0ZSBpcyBnZW5lcmF0ZWQuXG4gIGNvbnN0IHJlcXVpcmVtZW50c0V4ZW1wdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/IFwiLCBhbmQgc28gaXMgdGhlIFBSIGJvZHkncyBSZXF1aXJlbWVudHMgc2VjdGlvbiwgd2hpY2ggcmVjb3JkcyB3aGF0IHdhcyBhc2tlZCBmb3IgcmF0aGVyIHRoYW4gd2hhdCB0aGUgY29kZSBjb250YWluc1wiXG4gICAgOiAnJztcbiAgY29uc3QgaXNzdWVUZW1wbGF0ZUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gYFxcbi0gV2hlbiBjcmVhdGluZyBhbiBpc3N1ZTpcXG4ke0lTU1VFX1RFTVBMQVRFX1JVTEVTLnJlcGxhY2VBbGwoL14vZ20sICcgICcpfWBcbiAgICA6ICcnO1xuICBjb25zdCBydW5uZXJJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/ICdcXG4tIFByaXZhdGUgcmVwb3NpdG9yaWVzIHVzZSBzZWxmLWhvc3RlZCBDSSBydW5uZXJzLiBLZWVwIE9TL3NpemUgY29uc3RyYWludHMgaW4gYW4gZXhwbGljaXQgc2VsZi1ob3N0ZWQgbGFiZWwgYXJyYXk7IGZpeCBtaXNzaW5nIHJ1bm5lciBjYXBhYmlsaXRpZXMgaW5zdGVhZCBvZiBzd2l0Y2hpbmcgdG8gR2l0SHViLWhvc3RlZCBydW5uZXJzLiBUaGUgc29sZSBhcHByb3ZlZCBleGNlcHRpb24gaXMgdGhlIFdpbmRvd3MgZGVza3RvcCBidWlsZCBpbiBXaWxsQm9vc3Rlci9jaGVlcmxpbmdzLidcbiAgICA6ICcnO1xuICBjb25zdCBwcm9qZWN0TmFtZSA9IHJvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoKSk7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6IFxcYCR7cHJvamVjdE5hbWV9XFxgJHtkZXNjcmlwdGlvbiA/IGBcXG4tIERlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufWAgOiAnJ31cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIElmIG9uIFxcYG1haW5cXGAsIGNyZWF0ZSBhIG5ldyBicmFuY2g7IG90aGVyd2lzZSB3b3JrIG9uIHRoZSBjdXJyZW50IGJyYW5jaC5cbi0gUnVuIFxcYGdpdFxcYCBjb21tYW5kcyBvbmUgYXQgYSB0aW1lIHRvIGF2b2lkIFxcYGluZGV4LmxvY2tcXGAgY29uZmxpY3RzLlxuJHtURVNUX1dSSVRJTkdfUlVMRVN9XG4tIFdoZW4gZml4aW5nIGlzc3VlcyAoaW5jbHVkaW5nIHRlc3QgZmFpbHVyZXMpLCBpbnZlc3RpZ2F0ZSB0aGUgcm9vdCBjYXVzZSBmaXJzdCAoZS5nLiwgdmlhIGRlYnVnIGxvZ3Mgb3Igc2NyZWVuc2hvdHMpIGFuZCBmaXggaXQgaW5zdGVhZCBvZiBhcHBseWluZyB3b3JrYXJvdW5kcy5cbi0gQWZ0ZXIgbWFraW5nIGNoYW5nZXMsIHJ1biBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5XFxgICh0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nOyB1cCB0byAxMCBtaW51dGVzKSwgb3IgXFxgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIHZlcmlmeS1mdWxsXFxgIChhbGwgdGVzdHM7IHVwIHRvIDEgaG91cikgaWYgeW91IGNoYW5nZWQgcnVudGltZSBiZWhhdmlvciBvciB0ZXN0cy4gRml4IGVycm9ycyBhbmQgcmUtcnVuIHVudGlsIGl0IHBhc3Nlcy5cbiAgLSBXYWl0IGZvciBpdCB0byBmaW5pc2ggd2l0aG91dCByZXN0YXJ0aW5nIGl0OiBwcmVmZXIgY29tcGxldGlvbiBub3RpZmljYXRpb25zLCBvdGhlcndpc2UgdGhlIGxvbmdlc3QgcGVybWl0dGVkIHdhaXQ7IG5vIG91dHB1dCBkb2VzIG5vdCBtZWFuIGl0IGhhcyBzdG9wcGVkLiBJZiB0aGUgZGlzcGxheWVkIGV4Y2VycHQgaXMgaW5zdWZmaWNpZW50LCByZWFkIHRoZSBpbmRpY2F0ZWQgbG9nIGZpbGUgYmVmb3JlIHJlcnVubmluZy4gSWYgdGhlIGVudmlyb25tZW50IGtpbGxzIGxvbmctcnVubmluZyBjb21tYW5kcywgcnVuIHRoZW0gZGV0YWNoZWQgd2l0aCBhIHNhdmVkIGxvZyBhbmQgZXhpdCBzdGF0dXMuXG4tIE9uY2UgdmVyaWZpZWQsIGNvbW1pdCBhbmQgcHVzaCB0byB0aGUgY3VycmVudCAobm9uLW1haW4pIGJyYW5jaCwgYW5kIGNyZWF0ZSBhIFBSIHZpYSBcXGBnaFxcYCBpZiBub25lIGV4aXN0cyBmb3IgdGhlIGJyYW5jaC5cbiAgLSBGb2xsb3cgdGhlIENvbnZlbnRpb25hbCBDb21taXRzIGZvcm1hdCAoZS5nLiwgXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGApLiR7Y29BdXRob3JJbnN0cnVjdGlvbn1cbiAgLSBBbHdheXMgY3JlYXRlIG5ldyBjb21taXRzOyBhdm9pZCBcXGAtLWFtZW5kXFxgLiR7cHJUZW1wbGF0ZUluc3RydWN0aW9ufSR7aXNzdWVUZW1wbGF0ZUluc3RydWN0aW9ufVxuLSBJbiBhbnkgZXhwbGFuYXRvcnkgdGV4dCAoY29tbWl0IG1lc3NhZ2VzLCBQUiBkZXNjcmlwdGlvbnMsIGRvY3VtZW50YXRpb24sIGNvZGUgY29tbWVudHMsIGV0Yy4pLCBkZXNjcmliZSBvbmx5IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uOiBkcm9wIGFueSBzdGF0ZW1lbnQgbmFtaW5nIGFuIGlkZW50aWZpZXIsIGZlYXR1cmUsIG9yIGNvbmNlcHQgeW91IGNhbm5vdCBjb25maXJtIGV4aXN0cyBpbiB0aGUgZmluYWwgZGlmZiBvciB0aGUgY3VycmVudCBjb2RlYmFzZSAoZS5nLiwgb25lIGFkZGVkIGFuZCBsYXRlciByZW1vdmVkIG9yIHJlbmFtZWQgYWxvbmcgdGhlIHdheSkuIFdoZW5ldmVyIGRvY3VtZW50YXRpb24gb3IgY29tbWVudHMgbm8gbG9uZ2VyIG1hdGNoIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIChyZW1vdmVkIG9wdGlvbnMsIGRlcHJlY2F0ZWQgdXNhZ2UsIG91dGRhdGVkIGJlaGF2aW9yKSwgZGVsZXRlIG9yIHJld3JpdGUgdGhlbSwgZXZlbiBpbiBmaWxlcyB5b3UgYXJlIG5vdCBvdGhlcndpc2UgY2hhbmdpbmcuIE1lbnRpb24gYSBwYXN0IHN0YXRlIG9ubHkgd2hlcmUgaXQgaXMgbmVlZGVkIHRvIHVuZGVyc3RhbmQgd2h5IHRoZSBjdXJyZW50IGRlc2lnbiBpcyBhcyBpdCBpcywgb3Igd2hlbiBleHBsaWNpdGx5IGFza2VkOyBmaWxlcyB0aGF0IHJlY29yZCBoaXN0b3J5IGJ5IGRlc2lnbiAoZS5nLiwgYSBjaGFuZ2Vsb2cpIGFyZSBleGVtcHQke3JlcXVpcmVtZW50c0V4ZW1wdGlvbn0uXG4tIFVzZSBoZXJlZG9jIGZvciBtdWx0aS1saW5lIGNvbW1hbmQgaW5wdXQgKGUuZy4sIFxcYGdpdCBjb21taXQgLUYgLVxcYCwgXFxgZ2ggcHIgY3JlYXRlIC0tYm9keS1maWxlIC1cXGAsIFxcYGdoIGlzc3VlIGNyZWF0ZSAtLWJvZHktZmlsZSAtXFxgKS5cbi0gUHV0IHRlbXBvcmFyeSBmaWxlcyBpbiBcXGAudG1wXFxgOyB1c2UgXFxgL3RtcFxcYCBvbmx5IGZvciBmaWxlcyB0aGF0IG11c3QgbGl2ZSBvdXRzaWRlIHRoZSByZXBvLlxuLSBcXGBBR0VOVFMubWRcXGAsIFxcYENMQVVERS5tZFxcYCwgXFxgR0VNSU5JLm1kXFxgLCBcXGAuY3Vyc29yL3J1bGVzL2dlbmVyYWwubWRjXFxgLCBhbmQgXFxgLmdlbWluaS9zdHlsZWd1aWRlLm1kXFxgIGFyZSBnZW5lcmF0ZWQgZnJvbSBcXGBBR0VOVFNfRVhUUkEubWRcXGAgYW5kIG92ZXJ3cml0dGVuIG9uIGV2ZXJ5IFxcYHdiZnlcXGAgcnVuOyB0byBjaGFuZ2UgYWdlbnQgaW5zdHJ1Y3Rpb25zLCBlZGl0IG9ubHkgXFxgQUdFTlRTX0VYVFJBLm1kXFxgLiR7bWlzZUluc3RydWN0aW9ufSR7aXNvbGF0ZWRJbnN0YWxsSW5zdHJ1Y3Rpb259JHtmbm94SW5zdHJ1Y3Rpb259JHtjbG91ZGZsYXJlSW5zdHJ1Y3Rpb259JHtyYWlsd2F5SW5zdHJ1Y3Rpb259JHtwbGF5d3JpZ2h0VGVzdFNlcnZlckluc3RydWN0aW9ufSR7cnVubmVySW5zdHJ1Y3Rpb259XG5cbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKHJvb3RDb25maWcsIGFsbENvbmZpZ3MpfVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgaGFzTmV3U2VjdGlvbiA9IGV4dHJhQ29udGVudD8udHJpbSgpLnN0YXJ0c1dpdGgoJyMnKTtcbiAgY29uc3Qgbm9ybWFsaXplZEV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudFxuICAgID8gaGFzTmV3U2VjdGlvblxuICAgICAgPyAnXFxuXFxuJyArIGV4dHJhQ29udGVudC50cmltKClcbiAgICAgIDogJ1xcbicgKyBleHRyYUNvbnRlbnRcbiAgICA6ICcnO1xuICByZXR1cm4gYmFzZUNvbnRlbnQgKyBub3JtYWxpemVkRXh0cmFDb250ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZyB7XG4gIC8vIFRhdXJpIGRlc2t0b3AgYXBwcyBzaGlwIFdpbmRvd3MgYnVpbGRzLCBhbmQgdGhlIGJvdW5kYXJ5IGJldHdlZW4gYXBwIGNvZGUgYW5kIHNoYXJlZCBjb2RlIGlzXG4gIC8vIHRvbyBmdXp6eSB0byBzY29wZSB0aGUgbWFjT1MvTGludXgtb25seSBydWxlIHBlciBwYWNrYWdlLCBzbyBzdWNoIHJlcG9zaXRvcmllcyB0YXJnZXQgYWxsXG4gIC8vIHRocmVlIE9TZXMgaW5zdGVhZC5cbiAgY29uc3QgaGFzRGVza3RvcEFwcCA9IGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcudGF1cmkgfHwgYy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcyk7XG4gIC8vIEEgcHVibGljIHJlcG9zaXRvcnkgd2l0aCBubyBgQHdpbGxib29zdGVyL2AgcGFja2FnZSBpcyBPU1MgZm9yIHRoZSBnZW5lcmFsIHB1YmxpYywgd2hvc2UgdXNlcnNcbiAgLy8gbWF5IHJ1biBXaW5kb3dzLCBzbyBubyBPUyByZXN0cmljdGlvbiBhcHBsaWVzIHRoZXJlLiBBbiB1bmtub3duIHZpc2liaWxpdHkgY29sbGFwc2VzIHRvXG4gIC8vIGlzUHVibGljUmVwbz1mYWxzZSBhbmQgdGhlcmVmb3JlIGtlZXBzIHRoZSByZXN0cmljdGl2ZSBkZWZhdWx0LlxuICBjb25zdCBpc0dlbmVyYWxQdWJsaWNPc3MgPVxuICAgIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvICYmIGFsbENvbmZpZ3MuZXZlcnkoKGMpID0+ICFjLnBhY2thZ2VKc29uPy5uYW1lPy5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpO1xuICAvLyBPbmx5IHB1YmxpYyByZXBvc2l0b3JpZXMgcHVibGlzaCBwYWNrYWdlcyB0byB0aGUgcHVibGljIG5wbSByZWdpc3RyeSwgd2hvc2UgdXNlcnMgcmVhZCB0aGVcbiAgLy8gSlNEb2Mgd2l0aG91dCB0aGUgc291cmNlOyBwcml2YXRlIHJlcG9zaXRvcmllcyBhcmUgcmVhZCBvbmx5IGJ5IGFnZW50cyB0aGF0IGhhdmUgdGhlIHNvdXJjZS5cbiAgY29uc3QgbnBtQXBpRXhjZXB0aW9uID0gcm9vdENvbmZpZy5pc1B1YmxpY1JlcG9cbiAgICA/ICcgRXhjZXB0aW9uOiB0aGUgZXhwb3J0ZWQgQVBJIG9mIGEgcGFja2FnZSBwdWJsaXNoZWQgdG8gbnBtIG1heSBjYXJyeSBKU0RvYyBkZXNjcmliaW5nIHdoYXQgaXQgZG9lcyBhbmQgaG93IHRvIGNhbGwgaXQsIGJlY2F1c2UgaXRzIHVzZXJzIHJlYWQgaXQgd2l0aG91dCB0aGUgc291cmNlLidcbiAgICA6ICcnO1xuICBjb25zdCBjb21tZW50SW5zdHJ1Y3Rpb24gPSBgLSBDb21tZW50cyBhbmQgSlNEb2M6IGV2ZXJ5IHJlYWRlciBoYXMgdGhlIHNvdXJjZSwgc28gbmV2ZXIgcmVzdGF0ZSB3aGF0IHRoZSBjb2RlLCBpdHMgbmFtZXMsIG9yIGl0cyB0eXBlcyBhbHJlYWR5IHNheSAoZS5nLiwgXFxgQHBhcmFtIG5hbWUgVGhlIG5hbWVcXGAsIFxcYEByZXR1cm5zIHRoZSByZXN1bHRcXGAsIGEgbmFycmF0aW9uIG9mIHRoZSBjb250cm9sIGZsb3cpLiBXcml0ZSBvbmUgb25seSB3aGVuIGEgcGxhdXNpYmxlIGVkaXQgKHNpbXBsaWZ5aW5nLCBkZWxldGluZywgcmVvcmRlcmluZywgcmVwbGFjaW5nKSB3b3VsZCBicmVhayBzb21ldGhpbmcgd2l0aG91dCB0aGF0IGtub3dsZWRnZSBhbmQgbm8gdHlwZSBjaGVjaywgbGludCBydWxlLCBvciBleGlzdGluZyB0ZXN0IHdvdWxkIGNhdGNoIHRoZSBicmVha2FnZTsgZmlyc3QgdHJ5IHRvIGVuY29kZSB0aGUga25vd2xlZGdlIGluIGNvZGUgKGEgbmFtZSBzdWNoIGFzIFxcYHRpbWVvdXRNc1xcYCwgYSB0eXBlLCBhbiBcXGBhc3NlcnRcXGAsIGEgdGVzdCkgYW5kIGNvbW1lbnQgb25seSB3aGF0IGNhbm5vdCBiZSBlbmNvZGVkOiBhIGRlbGliZXJhdGVseSBvZGQtbG9va2luZyB3b3JrYXJvdW5kLCBhIGRlcGVuZGVuY3kgb24gYSBmYWN0IG91dHNpZGUgdGhlIHJlcG9zaXRvcnkgKGFuIGV4dGVybmFsIEFQSSdzIGJlaGF2aW9yLCBhbiBhZ3JlZW1lbnQgd2l0aCBhbm90aGVyIHN5c3RlbSksIG9yIGEgcmVqZWN0ZWQgYWx0ZXJuYXRpdmUgYW5kIHdoeS4gUHV0IGl0IGluIEpTRG9jIHdoZW4gaXQgaXMgYSBjb250cmFjdCBvZiB0aGUgZGVjbGFyZWQgc3ltYm9sLCBzbyBjYWxsZXJzIHNlZSBpdCwgYW5kIGluIGFuIGlubGluZSBjb21tZW50IHdoZW4gaXQgY29uY2VybnMgc3BlY2lmaWMgbGluZXMuIERlbGV0ZSBjb21tZW50cyB0aGF0IGZhaWwgdGhpcyB0ZXN0IGluIGZpbGVzIHlvdSB0b3VjaC4ke25wbUFwaUV4Y2VwdGlvbn1gO1xuICBjb25zdCBvc0NvbXBhdGliaWxpdHlJbnN0cnVjdGlvbiA9IGlzR2VuZXJhbFB1YmxpY09zc1xuICAgID8gJydcbiAgICA6IGhhc0Rlc2t0b3BBcHBcbiAgICAgID8gJy0gRW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBXaW5kb3dzLCBtYWNPUywgYW5kIExpbnV4LidcbiAgICAgIDogJy0gRW5zdXJlIGNvbXBhdGliaWxpdHkgb25seSB3aXRoIG1hY09TIGFuZCBMaW51eDsgZG8gbm90IGluY2x1ZGUgV2luZG93cy1zcGVjaWZpYyBjb2RlLic7XG4gIC8vIENsb3VkZmxhcmUgV29ya2VycyBleGVjdXRlIGFjcm9zcyBtYW55IGVwaGVtZXJhbCBpc29sYXRlcyBhbmQgdHdvIHJlcXVlc3RzIGFyZSBub3QgZ3VhcmFudGVlZFxuICAvLyB0byBoaXQgdGhlIHNhbWUgaW5zdGFuY2UsIHNvIHRoZSBzaW5nbGUtaW5zdGFuY2Ugc2ltcGxpZmljYXRpb24gc2lsZW50bHkgbG9zZXMgc3RhdGUgdGhlcmUg4oCUXG4gIC8vIGJ1dCBXb3JrZXJzIGRlbGliZXJhdGVseSByZXVzZSBleGVjdXRpb24gY29udGV4dHMsIHNvIGJlc3QtZWZmb3J0IGlzb2xhdGUtbG9jYWwgY2FjaGVzIHN0YXlcbiAgLy8gbGVnaXRpbWF0ZSAoaHR0cHM6Ly9kZXZlbG9wZXJzLmNsb3VkZmxhcmUuY29tL3dvcmtlcnMvcmVmZXJlbmNlL2hvdy13b3JrZXJzLXdvcmtzLykuIFRoZVxuICAvLyBzaWduYWxzIGFyZSBjb3JyZWxhdGVkIFBFUiBQQUNLQUdFOiBhIG1vbm9yZXBvIGNhbiBob3N0IGEgc2luZ2xlLWluc3RhbmNlIHNlcnZlciBhcHAgbmV4dCB0b1xuICAvLyBhbiB1bnJlbGF0ZWQgV29ya2VyLCBhbmQgbmVpdGhlciBtYXkgb3ZlcnJpZGUgdGhlIG90aGVyJ3MgcnVsZS4gZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyBpc1xuICAvLyB0aGUgYWNjdXJhdGUgV29ya2VycyBzaWduYWwgKGlzQ2xvdWRmbGFyZSBhbHNvIG1hdGNoZXMgYSBtZXJlIHdyYW5nbGVyIG1lbnRpb24gaW4gYSBzY3JpcHQgb3JcbiAgLy8gd29ya2Zsb3cpLlxuICBjb25zdCBoYXNXb3JrZXJzQXBwID0gYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRvZXNDb250YWluV3JhbmdsZXJDb25maWcpO1xuICBjb25zdCBoYXNTaW5nbGVJbnN0YW5jZVNlcnZlckFwcCA9IGFsbENvbmZpZ3Muc29tZShcbiAgICAoYykgPT4gKGMuZGVwZW5kaW5nLm5leHQgfHwgYy5kZXBlbmRpbmcudmluZXh0KSAmJiAhYy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnXG4gICk7XG4gIGNvbnN0IHdvcmtlcnNJbnN0cnVjdGlvbiA9XG4gICAgJy0gQ2xvdWRmbGFyZSBXb3JrZXJzIHJ1biBhY3Jvc3MgbWFueSBlcGhlbWVyYWwgaXNvbGF0ZXMsIHNvIHR3byByZXF1ZXN0cyBtYXkgaGl0IGRpZmZlcmVudCBpbnN0YW5jZXM6IG5ldmVyIGxldCBjb3JyZWN0bmVzcyBkZXBlbmQgb24gbW9kdWxlLWxldmVsIG11dGFibGUgc3RhdGU7IHBlcnNpc3QgYXV0aG9yaXRhdGl2ZSBzaGFyZWQgc3RhdGUgaW4gYmluZGluZ3MgKEQxLCBLViwgUjIsIER1cmFibGUgT2JqZWN0cykuIEJlc3QtZWZmb3J0IGlzb2xhdGUtbG9jYWwgY2FjaGVzIG9mIG5vbi1yZXF1ZXN0LXNjb3BlZCBkYXRhIGFyZSBmaW5lLic7XG4gIGNvbnN0IHNlcnZlckluc3RhbmNlSW5zdHJ1Y3Rpb24gPSBoYXNXb3JrZXJzQXBwXG4gICAgPyBoYXNTaW5nbGVJbnN0YW5jZVNlcnZlckFwcFxuICAgICAgPyBgJHt3b3JrZXJzSW5zdHJ1Y3Rpb259IFRoaXMgYXBwbGllcyB0byBhbGwgY29kZSBydW5uaW5nIG9uIENsb3VkZmxhcmUgV29ya2VycyAodGhlIHdyYW5nbGVyLWNvbmZpZ3VyZWQgcGFja2FnZXMgYW5kIGFueSB3b3Jrc3BhY2UgcGFja2FnZSB0aGV5IGltcG9ydCk7IGFzc3VtZSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UgZm9yIHRoZSBvdGhlciBzZXJ2ZXIgYXBwcy5gXG4gICAgICA6IHdvcmtlcnNJbnN0cnVjdGlvblxuICAgIDogaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHBcbiAgICAgID8gJy0gQXNzdW1lIGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZS4nXG4gICAgICA6ICcnO1xuICAvLyBLZWVwIHRvcC1kb3duIG9yZGVyaW5nIGd1aWRhbmNlIGZ1bmN0aW9uLW9ubHkgYmVjYXVzZSBjbGFzc2VzIGFyZSBub3QgaG9pc3RlZCBhbmQgY2FuIGZhaWwgd2hlbiBpbmhlcml0YW5jZSBvciB0b3AtbGV2ZWwgaW5zdGFudGlhdGlvbiBkZXBlbmRzIG9uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICByZXR1cm4gYFxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gVXNlIGNhbWVsQ2FzZSBmaWxlIG5hbWVzIGZvciBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgKFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMpLlxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBtb2R1bGVzIGFuZCBkaXJlY3RvcmllcyB3aXRoIGhpZ2ggY29oZXNpb24gYW5kIGxvdyBjb3VwbGluZzsgc3BsaXQgbGFyZ2UgbW9kdWxlcyB3aGVuIG5lZWRlZC5cbi0gUGxhY2UgY2FsbGluZyBmdW5jdGlvbnMgYWJvdmUgdGhlIGZ1bmN0aW9ucyB0aGV5IGNhbGwgKHRvcC1kb3duIG9yZGVyKTsgcGxhY2UgdmFyaWFibGUgYW5kIHR5cGUgZGVjbGFyYXRpb25zIGFib3ZlIHRoZWlyIHVzYWdlLlxuJHtjb21tZW50SW5zdHJ1Y3Rpb259XG4tIE5ldmVyIGV4cGxhaW4gaG93IFdpbGxCb29zdGVyJ3MgaW4taG91c2UgdG9vbHMgKGUuZy4sIFxcYHdiXFxgLCBcXGB3YmZ5XFxgKSB3b3JrIGluIGNvZGUgY29tbWVudHMgb3IgZG9jdW1lbnRzIG91dHNpZGUgdGhlIHRvb2wncyBvd24gcGFja2FnZSwgZXhjZXB0IGluIGluc3RydWN0aW9ucyBmb3IgQUkgYWdlbnRzIChlLmcuLCBkbyBub3Qgbm90ZSB0aGF0IFxcYFBPUlRcXGAgaXMgdW5zZXQgYmVjYXVzZSBcXGB3YlxcYCBwaWNrcyBhIGZyZWUgcG9ydCkuXG4tIElmIGxpbnQgZXJyb3JzIG9yIHdhcm5pbmdzIGNhbm5vdCBiZSBmaXhlZCwgdXNlIGlnbm9yZSBjb21tZW50cyB3aXRoIHJlYXNvbnMgKGUuZy4sIFxcYC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSA8cnVsZT4gLS0gPHJlYXNvbj5cXGApLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgcmVxdWlyZWQgYnkgQVBJcyBvciBsaWJyYXJpZXMuXG4tIFZhbGlkYXRlIEphdmFTY3JpcHQgb2JqZWN0cyAoZS5nLiwgcGFyc2VkIEpTT04sIEFQSSByZXNwb25zZXMpIHdpdGggXFxgem9kXFxgIHdoZW5ldmVyIHBvc3NpYmxlIGluc3RlYWQgb2YgaGFuZC13cml0dGVuIGNoZWNrcyBvciB0eXBlIGFzc2VydGlvbnMuXG4tIEJ1aWxkIHByb21wdHMgYXMgYSBzaW5nbGUgdGVtcGxhdGUgbGl0ZXJhbCBpbnN0ZWFkIG9mIFxcYGpvaW4oKVxcYCBvbiBhIHByZS1jb21wdXRhYmxlIGFycmF5IG9mIHN0cmluZ3MuXG4tIEFzc3VtZSBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBkZWZpbmVkOyBpZiB2YWxpZGF0aW9uIGlzIG5lZWRlZCwgXFxgYXNzZXJ0XFxgIHRoZW0gYXQgc3RhcnR1cCB0byBmYWlsIGZhc3QuXG4tIEFzc3VtZSBsb2NhbCB0b29scyBzdWNoIGFzIFxcYGdpdFxcYCwgXFxgZ2hcXGAsIGFuZCBcXGBnaHFcXGAgYXJlIGluc3RhbGxlZCBhbmQgYXV0aGVudGljYXRlZC5cbiR7b3NDb21wYXRpYmlsaXR5SW5zdHJ1Y3Rpb259XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLmdlbkkxOG5UcylcbiAgICA/IGAtIFJlZ2lzdGVyIHN0cmluZyBsaXRlcmFscyBmb3IgUmVhY3QgY29tcG9uZW50cyBpbiB0aGUgXFxgaTE4blxcYCByZXNvdXJjZSBmaWxlcyAoZS5nLiwgXFxgaTE4bi9qYS1KUC5qc29uXFxgKSBhbmQgcmVmZXJlbmNlIHRoZW0gdmlhIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkgKGUuZy4sIFxcYGkxOG4ucGFnZXMuaG9tZS50aXRsZSgpXFxgIGZvciBcXGB7IFwicGFnZXNcIjogeyBcImhvbWVcIjogeyBcInRpdGxlXCI6IFwiTXkgQXBwXCIgfSB9IH1cXGApLmBcbiAgICA6ICcnXG59XG5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcucmVhY3QgfHwgYy5kZXBlbmRpbmcubmV4dCB8fCBjLmRlcGVuZGluZy52aW5leHQpXG4gICAgPyBgLSBQcmVmZXIgbGFtYmRhIG92ZXIgXFxgZnVuY3Rpb25cXGAgZm9yIFJlYWN0IGNvbXBvbmVudHMsIGUuZy4sIFxcYGNvbnN0IEJ1dHRvbjogUmVhY3QuRkMgPSAoKSA9PiB7XFxgLlxuLSBQcmVmZXIgXFxgdXNlSW1tZXJcXGAgb3ZlciBcXGB1c2VTdGF0ZVxcYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzLlxuLSBVc2UgXFxgYXV0b0ZvY3VzXFxgIHdoZXJlIGl0IHJlZHVjZXMgdXNlciBlZmZvcnQuYFxuICAgIDogJydcbn1cbiR7XG4gIC8vIHZpbmV4dCBpcyB0aGUgb3JnJ3MgY3VycmVudCB3ZWItYXBwIGZyYW1ld29yayBhbmQgZW5hYmxlcyB0aGUgUmVhY3QgQ29tcGlsZXIganVzdCBhcyBOZXh0LmpzXG4gIC8vIGRvZXMsIHNvIGl0IG11c3Qgbm90IG1pc3MgdGhpcyBydWxlLlxuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLm5leHQgfHwgYy5kZXBlbmRpbmcudmluZXh0KVxuICAgID8gYFxuLSBUaGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHNvIFxcYHVzZUNhbGxiYWNrXFxgIGFuZCBcXGB1c2VNZW1vXFxgIGFyZSB1bm5lY2Vzc2FyeSBmb3IgcGVyZm9ybWFuY2UuXG5gXG4gICAgOiAnJ1xufVxuJHtzZXJ2ZXJJbnN0YW5jZUluc3RydWN0aW9ufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpO1xufVxuIiwiIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHJlbGVhc2VBZ2VHYXRlIGZyb20gJy4uLy4uL2NvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbicgd2l0aCB7IHR5cGU6ICdqc29uJyB9O1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgQnVuZmlnVG9tbCB7XG4gIGluc3RhbGw/OiB7XG4gICAgZXhhY3Q/OiBib29sZWFuO1xuICAgIGdsb2JhbFN0b3JlPzogYm9vbGVhbjtcbiAgICBsaW5rZXI/OiBzdHJpbmc7XG4gIH07XG59XG5cbi8vIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiBpcyB0aGUgb3JnYW5pemF0aW9uJ3Mgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIHBvbGljeTogdGhlXG4vLyBtYWNoaW5lcycgZ2xvYmFsIGNvbmZpZ3MgZ2V0IGl0IHRocm91Z2ggY29uZmlncy9hcHBseVJlbGVhc2VBZ2VHYXRlLnNoIChydW4gYnkgd2JmeSBpdHNlbGYsIGJ5XG4vLyByZXVzYWJsZS13b3JrZmxvd3Mgb24gQ0ksIGFuZCBieSBzZWxmLWhvc3QtdXRpbHMgb24gdGhlIHJ1bm5lcnMpLCBhbmQgcmVwb3NpdG9yaWVzIGdldCBpdCBoZXJlLlxuLy8gT25seSBvdXIgb3duIHBhY2thZ2VzIGFyZSBleGVtcHQ6IHdlIGNvbnRyb2wgd2hvIHB1Ymxpc2hlcyB0aGVtLCBzbyBhIGNvbXByb21pc2VkIHJlbGVhc2UgY2Fubm90XG4vLyByZWFjaCB1cyB0aHJvdWdoIGFuIHVwc3RyZWFtIG1haW50YWluZXIncyBzdG9sZW4gY3JlZGVudGlhbHMuIFRoYXQgY292ZXJzIGV2ZXJ5XG4vLyBAd2lsbGJvb3N0ZXItcHJpdmF0ZSBwYWNrYWdlICh0aGUgc2NvcGUgcmVzb2x2ZXMgb25seSBmcm9tIG91ciBvd24gcmVnaXN0cnkpLCBidXQgYnVuLCBucG0sIGFuZFxuLy8gWWFybiBtYXRjaCBleGNsdWRlIGVudHJpZXMgYnkgZXhhY3QgbmFtZSDigJQgbm8gQHNjb3BlLyogcGF0dGVybnMg4oCUIHNvIGVhY2ggbmV3IHBhY2thZ2UgaW4gdGhlXG4vLyBzY29wZSBtdXN0IGJlIGFkZGVkIHRvIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiB3aGVuIGl0IGlzIGZpcnN0IHB1Ymxpc2hlZC4gVGhpcmQtcGFydHlcbi8vIHBhY2thZ2VzIOKAlCBpbmNsdWRpbmdcbi8vIHRvb2xpbmcgd2JmeSBwaW5zIGl0c2VsZiDigJQgc3RheSBhZ2UtZ2F0ZWQ7IGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24gaW4gcGFja2FnZUpzb24udHNcbi8vIHBpbnMgdGhlIG5ld2VzdCByZWxlYXNlIG9sZCBlbm91Z2ggdG8gcGFzcyB0aGUgZ2F0ZSwgc28gcGlubmluZyBrZWVwcyB3b3JraW5nIHdpdGhvdXQgYW4gZXhlbXB0aW9uLlxuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyA9IHJlbGVhc2VBZ2VHYXRlLmRheXMgKiAyNCAqIDYwICogNjA7XG5leHBvcnQgY29uc3QgYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IHJlbGVhc2VBZ2VHYXRlLmV4Y2x1ZGVzO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEJ1bkdsb2JhbFN0b3JlKHJvb3REaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdidW5maWcudG9tbCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gcGFyc2VCdW5maWdUb21sKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSk/Lmluc3RhbGw/Lmdsb2JhbFN0b3JlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlKFxuICBjb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHByZXZpb3VzR2xvYmFsU3RvcmU6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHNraXBEZXBzOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgY29uc3QgZGVmYXVsdFVzZUdsb2JhbFN0b3JlID0gc2hvdWxkVXNlQnVuR2xvYmFsU3RvcmUoY29uZmlncyk7XG4gIHJldHVybiBza2lwRGVwcyA/IChwcmV2aW91c0dsb2JhbFN0b3JlID8/IGRlZmF1bHRVc2VHbG9iYWxTdG9yZSkgOiBkZWZhdWx0VXNlR2xvYmFsU3RvcmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRVc2VCdW5HbG9iYWxTdG9yZShjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBib29sZWFuIHtcbiAgLy8gQmxpdHogYnVpbGRzIG9uIE5leHQuanMgYnV0IG5lZWQgbm90IGRlY2xhcmUgaXQgZGlyZWN0bHksIGFuZCBpdHMgY29kZWdlbiBhbHNvIHBhdGNoZXMgTmV4dFxuICAvLyBpbnNpZGUgbm9kZV9tb2R1bGVzLiBCb3RoIGZyYW1ld29ya3MgdGhlcmVmb3JlIHJlcXVpcmUgcHJvamVjdC1sb2NhbCBpc29sYXRlZCBpbnN0YWxscy5cbiAgLy8gU2xpZGV2IGxvYWRzIG9wdGlvbmFsIFZ1ZSBjb21waWxlciBwZWVycyB0aHJvdWdoIGxvY2FsLXBrZy4gVGhlIGdsb2JhbCBzdG9yZSByZWFscGF0aHNcbiAgLy8gbG9jYWwtcGtnIG91dHNpZGUgdGhlIHByb2plY3QsIHNvIE5vZGUgY2Fubm90IHJlc29sdmUgYSBjb21waWxlciBkZWNsYXJlZCBieSB0aGUgcHJvamVjdC5cbiAgcmV0dXJuICFjb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5zbGlkZXYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgdXNlR2xvYmFsU3RvcmU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCwgdXNlR2xvYmFsU3RvcmUpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBuZXdDb250ZW50ID0gKGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkLCB1c2VHbG9iYWxTdG9yZTogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGJ1bmZpZ1RvbWwgPSBwYXJzZUJ1bmZpZ1RvbWwoZXhpc3RpbmdDb250ZW50KTtcbiAgLy8gbWluaW11bVJlbGVhc2VBZ2UgYW5kIG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgYXJlIG9yZyBwb2xpY3ksIG5ldmVyIHJlcG9zaXRvcnkgcG9saWN5OiBib3RoXG4gIC8vIGFyZSByZXdyaXR0ZW4gdG8gY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uJ3MgdmFsdWVzIG9uIGV2ZXJ5IHJ1biwgc28gYSBoYW5kLWVkaXRlZCAod2Vha2VuZWQpXG4gIC8vIGdhdGUgY2Fubm90IHN1cnZpdmUgcmVnZW5lcmF0aW9uLiBEcm9wcGluZyByZXBvc2l0b3J5LXNwZWNpZmljIGV4Y2x1ZGUgZW50cmllcyBpcyBmYWlsLXNhZmUg4oCUIGFuXG4gIC8vIHVuY292ZXJlZCBwYWNrYWdlIGJlY29tZXMgYWdlLWdhdGVkIGFuZCBzdXJmYWNlcyBhdCBpbnN0YWxsIHRpbWUgaW5zdGVhZCBvZiB3ZWFrZW5pbmcgdGhlIGdhdGUuXG4gIC8vIFR1cmJvcGFjayByZWplY3RzIGdsb2JhbC1zdG9yZSBzeW1saW5rcyBiZWNhdXNlIHRoZXkgcmVzb2x2ZSBvdXRzaWRlIGl0cyBmaWxlc3lzdGVtIHJvb3QuXG4gIC8vIEtlZXBpbmcgTmV4dC5qcyBpbnN0YWxscyBwcm9qZWN0LWxvY2FsIGF2b2lkcyB3aWRlbmluZyB0aGF0IHJvb3QgdG8gJEhPTUUgKG9yIGAvYCBpbiBEb2NrZXIpLFxuICAvLyB3aGljaCB3b3VsZCBleHBhbmQgZGV2ZWxvcG1lbnQgZmlsZXN5c3RlbSB3YXRjaGluZyBhbmQgYnlwYXNzIHRoZSBib3VuZGFyeSdzIGNhY2hlIGJlbmVmaXRzLlxuICBjb25zdCBnbG9iYWxTdG9yZUxpbmUgPSB1c2VHbG9iYWxTdG9yZSA/ICdnbG9iYWxTdG9yZSA9IHRydWUnIDogJ2dsb2JhbFN0b3JlID0gZmFsc2UnO1xuICAvLyBObyBgW3J1bl0gYnVuID0gdHJ1ZWA6IGl0cyBub2RlLT5idW4gUEFUSCBzaGltIGxlYWtzIGludG8gZXZlcnkgY2hpbGQgcHJvY2VzcyBhbmQgYnJlYWtzXG4gIC8vIHRvb2xzIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpOyBhbnkgZXhpc3Rpbmcgc2V0dGluZyBpcyBkcm9wcGVkLlxuICAvLyBwdWJsaWNIb2lzdFBhdHRlcm4g4oCUIHRzeDogYnVpbGQtdHMgdW5kZXIgTm9kZS5qcyBzcGF3bnMgYG5vZGUgLS1pbXBvcnQgdHN4YCwgd2hpY2ggcmVzb2x2ZXNcbiAgLy8gdHN4IGZyb20gdGhlIGNvbnN1bWVyIHBhY2thZ2UncyBkaXJlY3RvcnksIG5vdCBmcm9tIGJ1aWxkLXRzJ3Mgb3duIGRlcGVuZGVuY2llcy5cbiAgLy8gdW5kaWNpLXR5cGVzOiBidW4tdHlwZXMgcmVmZXJlbmNlcyBpdCB3aXRob3V0IGRlY2xhcmluZyBpdCBhcyBhIGRlcGVuZGVuY3kgKG92ZW4tc2gvYnVuIzIyODA1KTtcbiAgLy8gZ2VuZXJhdGVkIHRzY29uZmlncyBhbHNvIG1hcCB1bmRpY2ktdHlwZXMgdG8gdGhlIGhvaXN0ZWQgY29weSAoc2VlIHRzY29uZmlnLnRzKSBiZWNhdXNlIHRoZVxuICAvLyBnbG9iYWwgc3RvcmUgcmVhbHBhdGhzIGJ1bi10eXBlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICByZXR1cm4gYGVudiA9IGZhbHNlXG50ZWxlbWV0cnkgPSBmYWxzZVxuXG4ke2V4dHJhY3RSYXdUZXN0U2VjdGlvbnMoZXhpc3RpbmdDb250ZW50KX1baW5zdGFsbF1cbmV4YWN0ID0gJHtidW5maWdUb21sPy5pbnN0YWxsPy5leGFjdCA9PT0gZmFsc2UgPyAnZmFsc2UnIDogJ3RydWUnfVxuJHtnbG9iYWxTdG9yZUxpbmV9XG5saW5rZXIgPSBcImlzb2xhdGVkXCJcbnB1YmxpY0hvaXN0UGF0dGVybiA9IFtcInRzeFwiLCBcInVuZGljaS10eXBlc1wiXVxubWluaW11bVJlbGVhc2VBZ2UgPSAke2J1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kc31cbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4ke2J1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMubWFwKChwYWNrYWdlTmFtZSkgPT4gYCAgICBcIiR7cGFja2FnZU5hbWV9XCIsYCkuam9pbignXFxuJyl9XG5dXG5gO1xufTtcblxuLyoqXG4gKiBQcmVzZXJ2ZSB0aGUgcHJvamVjdCdzIGBbdGVzdF1gIHNlY3Rpb25zIChlLmcuIHByZWxvYWQgc2NyaXB0cyBzd2FwcGluZyBhIENsb3VkZmxhcmUgRDEgY2xpZW50XG4gKiBmb3IgYSBsb2NhbCBTUUxpdGUgb25lKSB2ZXJiYXRpbSwgY29tbWVudHMgaW5jbHVkZWQ7IHdiZnkgbWFuYWdlcyBvbmx5IHRoZSBvdGhlciBzZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSYXdUZXN0U2VjdGlvbnMoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50KSByZXR1cm4gJyc7XG5cbiAgY29uc3QgcHJlc2VydmVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpblRlc3RTZWN0aW9uID0gZmFsc2U7XG4gIGZvciAoY29uc3QgbGluZSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IHNlY3Rpb25NYXRjaCA9IC9eXFxzKlxcWyhbXlxcXV0rKVxcXS8uZXhlYyhsaW5lKTtcbiAgICBpZiAoc2VjdGlvbk1hdGNoKSB7XG4gICAgICBpblRlc3RTZWN0aW9uID0gc2VjdGlvbk1hdGNoWzFdID09PSAndGVzdCcgfHwgKHNlY3Rpb25NYXRjaFsxXSBhcyBzdHJpbmcpLnN0YXJ0c1dpdGgoJ3Rlc3QuJyk7XG4gICAgfVxuICAgIGlmIChpblRlc3RTZWN0aW9uICYmIGxpbmUudHJpbSgpKSB7XG4gICAgICBwcmVzZXJ2ZWRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJlc2VydmVkTGluZXMubGVuZ3RoID4gMCA/IGAke3ByZXNlcnZlZExpbmVzLmpvaW4oJ1xcbicpfVxcblxcbmAgOiAnJztcbn1cblxuZnVuY3Rpb24gcGFyc2VCdW5maWdUb21sKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEJ1bmZpZ1RvbWw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZSBkZXBsb3lzIEdpdC1iYXNlZCBwcml2YXRlIHBhY2thZ2VzIGZyb20gbm9kZV9tb2R1bGVzLCBidXQgdGhlIERvY2tlciBjb250ZXh0IHNob3VsZCBzdGF5IG5hcnJvdy5cbmNvbnN0IGluY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJucyA9IFsnQHdpbGxib29zdGVyJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4uZW52KlxuKiovLkRTX1N0b3JlXG4qKi8uY2FjaGVcbioqLy5jbGF1ZGVcbioqLy5jdXJzb3JcbioqLy5lZGl0b3Jjb25maWdcbioqLy5lc2xpbnRjYWNoZVxuKiovLmdlbWluaVxuKiovLmdpdFxuKiovLmdpdGF0dHJpYnV0ZXNcbioqLy5naXRodWJcbioqLy5naXRpZ25vcmVcbioqLy5pZGVhXG4qKi8ubGVmdGhvb2tcbioqLy5teXB5X2NhY2hlXG4qKi8ubmV4dC9jYWNoZVxuKiovLm5wbVxuKiovLnBhcmNlbC1jYWNoZVxuKiovLnBucG0tc3RvcmVcbioqLy5weXRlc3RfY2FjaGVcbioqLy5yYWlsd2F5aWdub3JlXG4qKi8ucmVsZWFzZXJjLmpzb25cbioqLy5ydWZmX2NhY2hlXG4qKi8udG1wXG4qKi8udG1wLSovKipcbioqLy50dXJib1xuKiovLnRveFxuKiovLnZzY29kZVxuKiovLnlhcm4vY2FjaGVcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG4qKi9fX3B5Y2FjaGVfX1xuKiovKi5sb2dcbioqLyoucHljXG4qKi8qLnRzYnVpbGRpbmZvXG4qKi9jb3ZlcmFnZVxuKiovbm9kZV9tb2R1bGVzLyoqXG4ke2luY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJuc1xuICAubWFwKFxuICAgIChwYXR0ZXJuKSA9PiBgISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59XG4hKiovbm9kZV9tb2R1bGVzLyR7cGF0dGVybn0vKipgXG4gIClcbiAgLmpvaW4oJ1xcbicpfVxuKiovbm9kZV9tb2R1bGVzLy5jYWNoZVxuKiovcGxheXdyaWdodC1yZXBvcnRcbioqL3N0b3J5Ym9vay1zdGF0aWNcbioqL3RhcmdldFxuKiovdGVzdC1yZXN1bHRzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdzaCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAnamF2YScsICdweSddLnRvU29ydGVkKCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnRvU29ydGVkKCksXG4gIG94bGludDogWydhc3RybycsICdjanMnLCAnY3RzJywgJ2pzJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3N2ZWx0ZScsICd0cycsICd0c3gnLCAndnVlJ10udG9Tb3J0ZWQoKSxcbiAgb3hmbXQ6IFtcbiAgICAnYXN0cm8nLFxuICAgICdjanMnLFxuICAgICdjc3MnLFxuICAgICdjdHMnLFxuICAgICdncWwnLFxuICAgICdncmFwaHFsJyxcbiAgICAnaGJzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ2pzJyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdqc3gnLFxuICAgICdsZXNzJyxcbiAgICAnbWQnLFxuICAgICdtZHgnLFxuICAgICdtanMnLFxuICAgICdtdHMnLFxuICAgICdzY3NzJyxcbiAgICAnc3ZlbHRlJyxcbiAgICAndG9tbCcsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgcHJldHRpZXJPbmx5OiBbJ2phdmEnXS50b1NvcnRlZCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUsIHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQgfSBmcm9tICcuL2FnZW50cy5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIGhhdmVfZnVuOiB0cnVlLFxuICBjb2RlX3Jldmlldzoge1xuICAgIGRpc2FibGU6IGZhbHNlLFxuICAgIGNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkOiAnTUVESVVNJyxcbiAgICBtYXhfcmV2aWV3X2NvbW1lbnRzOiAtMSxcbiAgICBwdWxsX3JlcXVlc3Rfb3BlbmVkOiB7XG4gICAgICBoZWxwOiBmYWxzZSxcbiAgICAgIHN1bW1hcnk6IHRydWUsXG4gICAgICBjb2RlX3JldmlldzogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBpZ25vcmVfcGF0dGVybnM6IFsnKiovX19nZW5lcmF0ZWRfXyddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2VtaW5pQ29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueWFtbCcpO1xuICAgIGNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG5cbiAgICBjb25zdCBoYXNOb25DYW5vbmljYWxDb25maWcgPSAhIShhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChub25DYW5vbmljYWxDb25maWdGaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pKTtcbiAgICBpZiAoaGFzTm9uQ2Fub25pY2FsQ29uZmlnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtjb25maWdGaWxlUGF0aH0gYmVjYXVzZSAke25vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRofSBpcyBub3QgYSBzdXBwb3J0ZWQgR2VtaW5pIGNvbmZpZyBsb2NhdGlvbi4gUmVuYW1lIGl0IG1hbnVhbGx5LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IG5ld0NvbmZpZzogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGRlZmF1bHRDb25maWcpO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBoYXNOb25DYW5vbmljYWxDb25maWcgPyB1bmRlZmluZWQgOiBhd2FpdCBmc1V0aWwucmVhZEZpbGVDb25maW5lZElmRXhpc3RzKGNvbmZpZ0ZpbGVQYXRoKTtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvbGRDb25maWcgPSBCdW4uWUFNTC5wYXJzZShvbGRDb250ZW50KTtcbiAgICAgICAgLy8gTWVyZ2Ugb25seSBhIG1hcHBpbmc6IGVtcHR5LCBjb21tZW50LW9ubHksIG9yIHNjYWxhciBZQU1MIHdvdWxkIGVpdGhlciB0aHJvdyBpblxuICAgICAgICAvLyBtZXJnZS5hbGwgb3IgcG9sbHV0ZSB0aGUgY29uZmlnIHdpdGggaW5kZXgga2V5cy5cbiAgICAgICAgaWYgKG9sZENvbmZpZyAmJiB0eXBlb2Ygb2xkQ29uZmlnID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShvbGRDb25maWcpKSB7XG4gICAgICAgICAgbmV3Q29uZmlnID0gbWVyZ2UuYWxsKFtuZXdDb25maWcsIG9sZENvbmZpZywgbmV3Q29uZmlnXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmcgLSBmaWxlIGNhbid0IGJlIHBhcnNlZFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0gQnVuLllBTUwuc3RyaW5naWZ5KG5ld0NvbmZpZywgdW5kZWZpbmVkLCAyKTtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQoY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnQ/LnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoJyMnKSA/IHVuZGVmaW5lZCA6IGV4dHJhQ29udGVudDtcbiAgICBjb25zdCByZXZpZXdMYW5ndWFnZUluc3RydWN0aW9uID0gY29uZmlnLmlzUHVibGljUmVwb1xuICAgICAgPyAnUmV2aWV3IGluIEVuZ2xpc2ggYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjb2Rpbmcgc3RhbmRhcmRzLidcbiAgICAgIDogJ+S7peS4i+OBruOCs+ODvOODh+OCo+ODs+OCsOimj+e0hOOCkui4j+OBvuOBiOOBpuOAgeaXpeacrOiqnuOBp+ODrOODk+ODpeODvOOBl+OBpuOBj+OBoOOBleOBhOOAgic7XG4gICAgY29uc3Qgc3R5bGVndWlkZUNvbnRlbnQgPSBgJHtyZXZpZXdMYW5ndWFnZUluc3RydWN0aW9ufVxcblxcbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGNvbmZpZywgYWxsQ29uZmlncyl9JHtcbiAgICAgIGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPyBgXFxuJHtjb2RpbmdSdWxlRXh0cmFDb250ZW50LnRyaW1FbmQoKX1gIDogJydcbiAgICB9YDtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW1xuICAgICAgLi4uKGhhc05vbkNhbm9uaWNhbENvbmZpZyA/IFtdIDogW3Byb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGNvbmZpZ0ZpbGVQYXRoLCB5YW1sQ29udGVudCkpXSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSksXG4gICAgXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZ2l0T3V0cHV0TWF4QnVmZmVyID0gNjQgKiAxMDI0ICogMTAyNDtcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuLy8gYC5naXRpZ25vcmUgLXRleHRgIGtlZXBzIHRoZSBtYWNPUyB0ZW1wbGF0ZSdzIGBJY29uXFxyXFxyYCBydWxlIGludGFjdDogYHRleHQ9YXV0b2Agbm9ybWFsaXphdGlvblxuLy8gc3RyaXBzIG9uZSBDUiBwZXIgY2hlY2tpbiwgZGVncmFkaW5nIHRoZSBydWxlIHVudGlsIGl0IG1hdGNoZXMgbm90aGluZy5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuLmdpdGlnbm9yZSAtdGV4dFxuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyhkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgbGV0IG91dHB1dDogc3RyaW5nO1xuICB0cnkge1xuICAgIG91dHB1dCA9IGNoaWxkX3Byb2Nlc3MuZXhlY0ZpbGVTeW5jKCdnaXQnLCBbJ2xzLWZpbGVzJywgJy0tZW9sJywgJy16J10sIHtcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBtYXhCdWZmZXI6IGdpdE91dHB1dE1heEJ1ZmZlcixcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdHJhY2tlZCBsaW5lLWVuZGluZyByZW5vcm1hbGl6YXRpb246ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgcmVub3JtYWxpemVkQ291bnQgPSAwO1xuICBmb3IgKGNvbnN0IHJlY29yZCBvZiBvdXRwdXQuc3BsaXQoJ1xcMCcpKSB7XG4gICAgY29uc3Qgc2VwYXJhdG9ySW5kZXggPSByZWNvcmQuaW5kZXhPZignXFx0Jyk7XG4gICAgaWYgKHNlcGFyYXRvckluZGV4ID09PSAtMSkgY29udGludWU7XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gcmVjb3JkLnNsaWNlKDAsIHNlcGFyYXRvckluZGV4KTtcbiAgICBpZiAoIS9eaVxcLyg/OmNybGZ8bWl4ZWQpXFxzL3UudGVzdChhdHRyaWJ1dGVzKSB8fCAhL2F0dHJcXC8uKlxcYmVvbD0oPzpsZnxjcmxmKSg/Olxcc3wkKS91LnRlc3QoYXR0cmlidXRlcykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlY29yZC5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpO1xuICAgIGNvbnN0IHRyYWNrZWRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGNvbnN0IHN0YXRzID0gZnMubHN0YXRTeW5jKHRyYWNrZWRGaWxlUGF0aCwgeyB0aHJvd0lmTm9FbnRyeTogZmFsc2UgfSk7XG4gICAgaWYgKCFzdGF0cz8uaXNGaWxlKCkpIGNvbnRpbnVlO1xuXG4gICAgLy8gR2l0J3Mgc3RhdCBjYWNoZSBjYW4gaGlkZSBwcmUtZXhpc3RpbmcgQ1JMRiBibG9icyBhZnRlciB3YmZ5IGludHJvZHVjZXMgdGV4dCBhdHRyaWJ1dGVzLlxuICAgIC8vIE5vcm1hbGl6ZSBieXRlcyBpbiB0aGUgd29ya3RyZWUgc28gdGhlIGNhbGxlcidzIG5vcm1hbCBgZ2l0IGFkZCAtQWAgcmVjb3JkcyB0aGUgY2Fub25pY2FsXG4gICAgLy8gYmxvYjsgdGhpcyBhbHNvIHByZXZlbnRzIFByZXR0aWVyJ3MgbWV0YWRhdGEgY2FjaGUgZnJvbSBza2lwcGluZyB0aGUgbmV3bHkgY2hhbmdlZCBmaWxlLlxuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModHJhY2tlZEZpbGVQYXRoKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRyYWNrZWRGaWxlUGF0aCwgQnVmZmVyLmZyb20oY29udGVudC50b1N0cmluZygnYmluYXJ5JykucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLCAnYmluYXJ5JykpO1xuICAgIHJlbm9ybWFsaXplZENvdW50Kys7XG4gIH1cbiAgaWYgKHJlbm9ybWFsaXplZENvdW50ID4gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhgUmVub3JtYWxpemVkIGxpbmUgZW5kaW5ncyBpbiAke3Jlbm9ybWFsaXplZENvdW50fSB0cmFja2VkIGZpbGUocykuYCk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzLCBnZW5lcmF0ZXNXb3JrZXJUeXBlcywgdHlwZSBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRG8gbm90IHJlbW92ZSBgd2luZG93c2A6IGdlbmVyYXRlZCAuZ2l0aWdub3JlIGZpbGVzIG11c3Qga2VlcCBpZ25vcmluZyBXaW5kb3dzLWNyZWF0ZWQgbG9jYWwgYXJ0aWZhY3RzLlxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG5fX2dlbmVyYXRlZF9fL1xuIS5rZWVwXG4uYWlkZXIqXG4uYW50aWdyYXZpdHljbGkvXG4uY2xhdWRlLyoubG9jYWwuKlxuLmNsYXVkZS9zY2hlZHVsZWRfdGFza3MubG9ja1xuLmRldmNvbnRhaW5lci9cbi5kb2NrZXIuZW52XG4uZW52KlxuLmlkZWEvQXVnbWVudFdlYnZpZXdTdGF0ZVN0b3JlLnhtbFxuLmlkZWEvY29waWxvdC4qXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5wbGF5d3JpZ2h0LWNsaS9cbi5wbGF5d3JpZ2h0LW1jcC9cbi5zZXJlbmEvXG4udG1wL1xuLnRtcC0qL1xuLnRva2Vuc2F2ZS9cbi53Yi9cbkB3aWxsYm9vc3Rlci9cbkB3aWxsYm9vc3Rlci1wcml2YXRlL1xuKi9tb3VudC8qLmhhc2hcbkNMQVVERS5sb2NhbC5tZFxuZGlzdC9cbmRyaXp6bGUvbW91bnQvXG50ZW1wL1xudG1wL1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Hb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIC8vIEV2ZXJ5IGFjY2VwdGVkIHJlcG9zaXRvcnkgcm9vdCByZWNlaXZlcyBhIG1hbmFnZWQgcGFja2FnZS5qc29uIGxhdGVyIGluIHRoZSBzYW1lIHJ1biwgc28gaXRzXG4gICAgLy8gZGVwZW5kZW5jeSB0cmVlIG11c3QgYmUgaWdub3JlZCBldmVuIHdoZW4gdGhlIG1hbmlmZXN0IGRpZCBub3QgZXhpc3QgYXQgY29uZmlnLWRldGVjdGlvbiB0aW1lLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fCBjb25maWcuaXNSb290KSB7XG4gICAgICBuYW1lcy5wdXNoKCdub2RlJyk7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZSBkZXRlY3Rpb24gKG5vdCBqdXN0IGEgcm9vdCBwb20ueG1sKTogYSBtdWx0aS1sYW5ndWFnZSByZXBvc2l0b3J5IGtlZXBzIGl0cyBNYXZlblxuICAgIC8vIG1vZHVsZXMgaW4gc3ViZGlyZWN0b3JpZXMsIGFuZCBkcm9wcGluZyB0aGUgbWF2ZW4gdGVtcGxhdGUgd291bGQgbGV0IHRhcmdldC8gZ2V0IHRyYWNrZWQuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbEFueXdoZXJlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeS4gUmVjdXJzaXZlIGRldGVjdGlvbiAobm90IGp1c3QgYSByb290XG4gICAgLy8gbG9ja2ZpbGUpOiBhIG11bHRpLWxhbmd1YWdlIHJlcG9zaXRvcnkga2VlcHMgUHl0aG9uIGRpcmVjdG9yaWVzIGluIHN1YmRpcmVjdG9yaWVzLCBhbmRcbiAgICAvLyBkcm9wcGluZyB0aGUgcHl0aG9uIHRlbXBsYXRlIHdvdWxkIGxldCBfX3B5Y2FjaGVfXy8gYW5kIC52ZW52LyBnZXQgdHJhY2tlZC5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHl0aG9uTG9ja0FueXdoZXJlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSB8fCBjb25maWcuZGVwZW5kaW5nLmRyaXp6bGUpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcudGF1cmkpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1c3QnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnKSB7XG4gICAgICAvLyAhQ2FyZ28ubG9jayBvdmVycmlkZXMgYW55IHByZS1leGlzdGluZyB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBmcm9tIGFcbiAgICAgIC8vIHBhcmVudCAuZ2l0aWdub3JlLCBzbyB0aGUgYXBwbGljYXRpb24gbG9ja2ZpbGUgc3RheXMgY29tbWl0dGFibGUuXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCFDYXJnby5sb2NrXG5zcmMtdGF1cmkvZ2VuL3NjaGVtYXMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0Nsb3VkZmxhcmUgfHwgcm9vdENvbmZpZy5pc0Nsb3VkZmxhcmUpIHtcbiAgICAgIC8vIC5kZXYudmFycyogaG9sZCBsb2NhbCBzZWNyZXRzIGZvciB3cmFuZ2xlciBkZXYgYW5kIG11c3QgbmV2ZXIgYmUgY29tbWl0dGVkLlxuICAgICAgLy8gLmVudi5jbG91ZGZsYXJlIGNhcnJpZXMgQ0xPVURGTEFSRV9BUElfVE9LRU46IENJIHdyaXRlcyBpdCBmcm9tIGEgc2VjcmV0LCBhbmQgYSBsb2NhbFxuICAgICAgLy8gYHdiIGRlcGxveWAgbmVlZHMgYSByZWFsIHRva2VuIGluIGl0LCBzbyBjb21taXR0aW5nIGl0IHdvdWxkIGxlYWsgYWNjb3VudCBjcmVkZW50aWFscy5cbiAgICAgIC8vIEl0IGlzIGxpc3RlZCBleHBsaWNpdGx5IHNvIHRoZSBDbG91ZGZsYXJlLXNwZWNpZmljIGNyZWRlbnRpYWwgcG9saWN5IHJlbWFpbnMgdmlzaWJsZS5cbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmRldi52YXJzKlxuLmVudi5jbG91ZGZsYXJlXG4ud3JhbmdsZXIvXG5gO1xuICAgIH1cbiAgICAvLyBJZ25vcmVkIG9ubHkgd2hlcmUgcG9zdGluc3RhbGwgcmVnZW5lcmF0ZXMgaXQsIHNvIHdiZnkgbmV2ZXIgaWdub3JlcyBhIGZpbGUgdGhhdCBub3RoaW5nIHJlY3JlYXRlcy4gVGhpcyBrZWVwc1xuICAgIC8vIGl0cyB0aG91c2FuZHMgb2YgbGluZXMgb3V0IG9mIGV2ZXJ5IHdyYW5nbGVyIGJ1bXAncyBkaWZmLiBBbmNob3JlZCB3aXRoIGEgbGVhZGluZyBzbGFzaCBiZWNhdXNlIGB3cmFuZ2xlciB0eXBlc2BcbiAgICAvLyBhbmQgdGhlIG9wdC1vdXQgZGVsZXRpb24gYmVsb3cgb25seSBldmVyIHRvdWNoIHRoaXMgcGFja2FnZSdzIG93biBmaWxlLCBub3QgYSBuZXN0ZWQgb25lIGF0IGFueSBkZXB0aC5cbiAgICBpZiAoZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnKSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAvd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50c1xuYDtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnICYmICFjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzKGNvbmZpZykpIHtcbiAgICAgIC8vIE9uIGEgZ2VudWluZSB3b3JrZXItdHlwZXMgb3B0LW91dCAobm90aGluZyBjb25zdW1lcyB0aGUgZ2VuZXJhdGVkIGZpbGU7IGdlbmVyYXRlc1dvcmtlclR5cGVzXG4gICAgICAvLyBhbG9uZSBpcyBmYWxzZSBmb3IgdW5yZWxhdGVkIHJlYXNvbnMgc3VjaCBhcyBhIG1pc3NpbmcgbG9jYWwgd3JhbmdsZXIgZGVwZW5kZW5jeSwgd2hlcmUgdGhlXG4gICAgICAvLyBmaWxlIG1heSBzdGlsbCBiZSBjb25zdW1lZCkgdGhlIGlnbm9yZSBydWxlXG4gICAgICAvLyBhYm92ZSBkaXNhcHBlYXJzLCBzbyBhbiBhbHJlYWR5LWdlbmVyYXRlZCBmaWxlIHdvdWxkIHN1cmZhY2UgYXMgdW50cmFja2VkIG5vaXNlIG9uIGV2ZXJ5XG4gICAgICAvLyBjaGVja291dCDigJQgZGVsZXRlIGl0LiBObyByZXBvc2l0b3J5IHRyYWNrcyB0aGUgZmlsZSAoZG9jcy9leHBlY3RlZC1yZXBvc2l0b3J5LXJ1bGVzLm1kKSxcbiAgICAgIC8vIHNvIGFuIGV4aXN0aW5nIGNvcHkgaXMgYWx3YXlzIGEgZGlzcG9zYWJsZSBnZW5lcmF0ZWQgb25lLlxuICAgICAgY29uc3Qgd29ya2VyVHlwZXNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cycpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya2VyVHlwZXNQYXRoKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0od29ya2VyVHlwZXNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnZpbmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAudmluZXh0L1xuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZSB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2FydGlmYWN0cyQvZ20sICcuaWRlYS9hcnRpZmFjdHMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9jb21waWxlci54bWwkL2dtLCAnLmlkZWEvY29tcGlsZXIueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvamFyUmVwb3NpdG9yaWVzLnhtbCQvZ20sICcuaWRlYS9qYXJSZXBvc2l0b3JpZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnLmlkZWEvbW9kdWxlcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC8qLmltbCQvZ20sICcuaWRlYS8qLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMkL2dtLCAnLmlkZWEvbW9kdWxlcycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmltbCQvZ20sICcqLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmlwciQvZ20sICcqLmlwcicpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcjIC5pZGVhL21vZHVsZXMueG1sJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUncyB1bmFuY2hvcmVkIGRlYnVnLyB3b3VsZCBhbHNvIGhpZGUgZnJvbnRlbmQgc291cmNlXG4gICAgICAvLyBkaXJlY3RvcmllcyBzdWNoIGFzIHNyYy9kZWJ1Zy87IGNhcmdvIG91dHB1dCBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgdGFyZ2V0Ly5cbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eZGVidWdcXC8kL2dtLCAnIyBkZWJ1Zy8nKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8IGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcykge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUgaWdub3JlcyBDYXJnby5sb2NrLCBidXQgYSBzcmMtdGF1cmkgY29uZmlndXJhdGlvbiBtYXJrcyBhblxuICAgICAgLy8gYXBwbGljYXRpb24sIHdob3NlIENhcmdvLmxvY2sgbXVzdCBiZSBjb21taXR0ZWQgZm9yIHJlcHJvZHVjaWJsZSBidWlsZHMuIFRoZVxuICAgICAgLy8gcnVsZSBpcyBhbHNvIGRpc2FibGVkIHdoZW4gYSBzdWIgcGFja2FnZSBjb250YWlucyBhIFRhdXJpIGFwcGxpY2F0aW9uLCBiZWNhdXNlXG4gICAgICAvLyBhbiB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBpbiBhIHBhcmVudCAuZ2l0aWdub3JlIHdvdWxkIGhpZGUgdGhlIG5lc3RlZFxuICAgICAgLy8gYXBwbGljYXRpb24ncyBsb2NrZmlsZS4gVGF1cmkgcGx1Z2luIGxpYnJhcmllcyAoZGV0ZWN0ZWQgb25seSB2aWFcbiAgICAgIC8vIEB0YXVyaS1hcHBzLyogZGVwZW5kZW5jaWVzKSBrZWVwIHRoZSB0ZW1wbGF0ZSdzIHBvbGljeSBvZiBpZ25vcmluZyBDYXJnby5sb2NrLlxuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL15DYXJnb1xcLmxvY2skL2dtLCAnIyBDYXJnby5sb2NrJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiB3YmZ5J3Mgb3duIHBhY2thZ2UuanNvbiBjYXJyaWVzIGluIHRoZSByZXBvc2l0b3J5LiBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCByZXdyaXRlc1xuICogaXQgaW4gdGhlIHB1Ymxpc2hlZCB0YXJiYWxsIG9ubHkgKGl0IGlzIG5ldmVyIGNvbW1pdHRlZCBiYWNrKSwgc28gYSB3YmZ5IHJ1biBzdGFydGVkIGZyb20gYSBnaXRcbiAqIGNoZWNrb3V0IHJlcG9ydHMgdGhpcyBwbGFjZWhvbGRlciBpbnN0ZWFkIG9mIGEgcmVhbCB2ZXJzaW9uLlxuICovXG5jb25zdCB1bnJlbGVhc2VkVmVyc2lvblByZWZpeCA9ICcwLjAuMC0nO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeVZlcnNpb24oKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlYWRXYmZ5UGFja2FnZUpzb24oKS52ZXJzaW9uO1xufVxuXG4vKiogd2JmeSdzIGxvY2F0aW9uIGluc2lkZSBpdHMgb3duIHJlcG9zaXRvcnksIHJlbGF0aXZlIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QuICovXG5jb25zdCB3YmZ5RGlyUGF0aEluUmVwbyA9IHBhdGguam9pbigncGFja2FnZXMnLCAnd2JmeScpO1xuXG4vKipcbiAqIElkZW50aWZpZXMgdGhlIHdiZnkgYnVpbGQgdGhhdCBwcm9kdWNlZCB0aGUgZ2VuZXJhdGVkIGZpbGVzOiB0aGUgcmVsZWFzZWQgdmVyc2lvbiwgb3JcbiAqIGA8c2hvcnQgY29tbWl0IGhhc2g+Wy1kaXJ0eV0tbG9jYWxgIHdoZW4gd2JmeSBydW5zIGZyb20gaXRzIG93biBnaXQgY2hlY2tvdXQuIFVuZGVmaW5lZCB3aGVuXG4gKiBuZWl0aGVyIGlzIGF2YWlsYWJsZSAoZS5nLiBhbiB1bnJlbGVhc2VkIGJ1aWxkIGV4dHJhY3RlZCBmcm9tIGEgc291cmNlIGFyY2hpdmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeVZlcnNpb25MYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBOZWl0aGVyIHRoZSBpbnN0YWxsZWQgcGFja2FnZS5qc29uIG5vciB0aGUgZ2l0IHN0YXRlIG9mIHdiZnkncyBvd24gY2hlY2tvdXQgY2FuIGNoYW5nZVxuICAvLyBtaWQtcnVuLCBhbmQgY29tcHV0aW5nIHRoZSBsYWJlbCBzcGF3bnMgc2V2ZXJhbCBnaXQgc3VicHJvY2Vzc2VzLCBzbyBpdCBpcyBjb21wdXRlZCBvbmNlLlxuICBpZiAoIWhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsKSB7XG4gICAgY2FjaGVkVmVyc2lvbkxhYmVsID0gY29tcHV0ZVdiZnlWZXJzaW9uTGFiZWwoKTtcbiAgICBoYXNDb21wdXRlZFZlcnNpb25MYWJlbCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZFZlcnNpb25MYWJlbDtcbn1cblxubGV0IGhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsID0gZmFsc2U7XG5sZXQgY2FjaGVkVmVyc2lvbkxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGNvbXB1dGVXYmZ5VmVyc2lvbkxhYmVsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiwgZGlyUGF0aCB9ID0gcmVhZFdiZnlQYWNrYWdlSnNvbigpO1xuICBpZiAoIXZlcnNpb24uc3RhcnRzV2l0aCh1bnJlbGVhc2VkVmVyc2lvblByZWZpeCkpIHJldHVybiB2ZXJzaW9uO1xuXG4gIC8vIGdpdCByZXNvbHZlcyB0aGUgTkVBUkVTVCBlbmNsb3NpbmcgcmVwb3NpdG9yeSwgd2hpY2ggZm9yIGFuIHVucmVsZWFzZWQgYnVpbGQgcGxhY2VkIHVuZGVyIGFcbiAgLy8gdGFyZ2V0IHJlcG9zaXRvcnkgKG5vZGVfbW9kdWxlcywgb3IgYSB2ZW5kb3JlZC9leHRyYWN0ZWQgc291cmNlIHRyZWUpIGlzIHRoYXQgcmVwb3NpdG9yeSDigJQgaXRzXG4gIC8vIGNvbW1pdCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHdiZnkgYnVpbGQgdGhhdCByYW4uIE9ubHkgd2JmeSdzIG93biBsb2NhdGlvbiBpbnNpZGUgaXRzIG93blxuICAvLyByZXBvc2l0b3J5IGlkZW50aWZpZXMgYSBnZW51aW5lIGNoZWNrb3V0LCBzbyBhbnl0aGluZyBlbHNlIGZhbGxzIGJhY2sgdG8gdGhlIHZlcnNpb24tbGVzcyBsYWJlbC5cbiAgY29uc3QgZ2l0Um9vdERpclBhdGggPSBydW5HaXQoWydyZXYtcGFyc2UnLCAnLS1zaG93LXRvcGxldmVsJ10sIGRpclBhdGgpO1xuICBpZiAoXG4gICAgIWdpdFJvb3REaXJQYXRoIHx8XG4gICAgcGF0aC5yZWxhdGl2ZShnaXRSb290RGlyUGF0aCwgZGlyUGF0aCkgIT09IHdiZnlEaXJQYXRoSW5SZXBvIHx8XG4gICAgIWlzV2JmeVJlcG9zaXRvcnkoZ2l0Um9vdERpclBhdGgpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgY29tbWl0SGFzaCA9IHJ1bkdpdChbJ3Jldi1wYXJzZScsICctLXNob3J0PTgnLCAnSEVBRCddLCBkaXJQYXRoKTtcbiAgaWYgKCFjb21taXRIYXNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBUaGUgY29tbWl0IGFsb25lIHdvdWxkIG1pc2lkZW50aWZ5IGEgYnVpbGQgbWFkZSBmcm9tIGFuIGVkaXRlZCBjaGVja291dCwgc28gdW5jb21taXR0ZWQgY2hhbmdlc1xuICAvLyBhcmUgcmVwb3J0ZWQgdG9vIOKAlCBidXQgb25seSB1bmRlciBwYWNrYWdlcy8qL3NyYywgcGFja2FnZXMvKi9iaW4gYW5kIHBhY2thZ2VzLyovY29uZmlncywgdGhlXG4gIC8vIHNvdXJjZSwgZW50cnktcG9pbnQgd3JhcHBlciBhbmQgcG9saWN5IGZpbGVzIHdiZnkgYW5kIGl0cyB3b3Jrc3BhY2UgZGVwZW5kZW5jaWVzIGFjdHVhbGx5IHJ1blxuICAvLyBmcm9tLiBFdmVyeXRoaW5nIHdiZnkgR0VORVJBVEVTIHdoZW4gaXQgdGFyZ2V0cyBpdHMgb3duIHJlcG9zaXRvcnkgbGl2ZXMgb3V0c2lkZSB0aG9zZSAodGhlXG4gIC8vIHJvb3QgUkVBRE1FIHRoaXMgbGFiZWwgZ29lcyBpbnRvLCBhbmQgZWFjaCBwYWNrYWdlJ3MgLmdpdGlnbm9yZSwgcGFja2FnZS5qc29uLCB0c2NvbmZpZywg4oCmKSwgc29cbiAgLy8gYSBmaXJzdCBydW4gY2Fubm90IG1ha2UgdGhlIG5leHQgb25lIHJlbGFiZWwgdGhlIGJhZGdlIGAtZGlydHktbG9jYWxgIGJ5IGl0c2VsZi5cbiAgLy8gTWFuaWZlc3RzIHN0YXkgb3V0IG9uIHB1cnBvc2UsIGV2ZW4gdGhvdWdoIGFuIGVkaXRlZCBgZXhwb3J0c2AgbWFwIGNhbiByZWRpcmVjdCB3aGljaCBjb2RlXG4gIC8vIGxvYWRzOiB3YmZ5IEdFTkVSQVRFUyBwYWNrYWdlLmpzb24sIHNvIGluY2x1ZGluZyBpdCB3b3VsZCBtYWtlIGV2ZXJ5IHJ1biByZXBvcnQgaXRzZWxmIGRpcnR5LlxuICAvLyBUaGUgbGFiZWwgaXMgYmVzdC1lZmZvcnQgYnVpbGQgcHJvdmVuYW5jZSwgbm90IGEgcmVwcm9kdWNpYmxlLWJ1aWxkIGF0dGVzdGF0aW9uLlxuICBjb25zdCBpc0RpcnR5ID0gZ2V0R2l0RGlydHlTdGF0ZShnaXRSb290RGlyUGF0aCk7XG4gIGlmIChpc0RpcnR5ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChpc0RpcnR5KSByZXR1cm4gYCR7Y29tbWl0SGFzaH0tZGlydHktbG9jYWxgO1xuICAvLyBBbiB1bm1vZGlmaWVkIGNoZWNrb3V0IHNpdHRpbmcgb24gYSByZWxlYXNlIHRhZyBydW5zIGV4YWN0bHkgdGhlIGNvZGUgdGhhdCB3YXMgcHVibGlzaGVkIHVuZGVyXG4gIC8vIHRoYXQgdmVyc2lvbiwgc28gaXQgaXMgbGFiZWxlZCB3aXRoIHRoZSB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGNvbW1pdCB0aGF0IG9ubHkgd2JmeSBkZXZlbG9wZXJzXG4gIC8vIGNvdWxkIHJlc29sdmUgYmFjayB0byBvbmUuXG4gIHJldHVybiBmaW5kUmVsZWFzZWRWZXJzaW9uQXRIZWFkKG5hbWUsIGRpclBhdGgpID8/IGAke2NvbW1pdEhhc2h9LWxvY2FsYDtcbn1cblxuLyoqIGBAc2VtYW50aWMtcmVsZWFzZS9ucG1gIHRhZ3MgZWFjaCByZWxlYXNlIGA8cGFja2FnZSBuYW1lPkA8dmVyc2lvbj5gLiAqL1xuZnVuY3Rpb24gZmluZFJlbGVhc2VkVmVyc2lvbkF0SGVhZChwYWNrYWdlTmFtZTogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRhZ1ByZWZpeCA9IGAke3BhY2thZ2VOYW1lfUBgO1xuICAvLyBBIGNvbW1pdCBjYXJyaWVzIGF0IG1vc3Qgb25lIHJlbGVhc2UgdGFnIHBlciBwYWNrYWdlLCBzbyB0aGUgZmlyc3QgbWF0Y2ggaXMgdGhlIG9ubHkgbWF0Y2guXG4gIHJldHVybiBydW5HaXQoWyd0YWcnLCAnLS1wb2ludHMtYXQnLCAnSEVBRCddLCBjd2QpXG4gICAgPy5zcGxpdCgnXFxuJylcbiAgICAuZmluZCgodGFnKSA9PiB0YWcuc3RhcnRzV2l0aCh0YWdQcmVmaXgpKVxuICAgID8uc2xpY2UodGFnUHJlZml4Lmxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIGlzV2JmeVJlcG9zaXRvcnkoZ2l0Um9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBFdmVyeSByZW1vdGUgY291bnRzLCBub3QganVzdCBgb3JpZ2luYDogYSBmb3JrIGNoZWNrb3V0IGNhcnJpZXMgdGhlIGNhbm9uaWNhbCByZXBvc2l0b3J5IGFzXG4gIC8vIGB1cHN0cmVhbWAsIGFuZCBpdCBpcyBzdGlsbCBhIGdlbnVpbmUgd2JmeSBjaGVja291dCB3aG9zZSBjb21taXQgaWRlbnRpZmllcyB0aGUgYnVpbGQuXG4gIGNvbnN0IHJlbW90ZVVybHMgPSBydW5HaXQoWydyZW1vdGUnLCAnLXYnXSwgZ2l0Um9vdERpclBhdGgpO1xuICByZXR1cm4gISFyZW1vdGVVcmxzPy5zcGxpdCgnXFxuJykuc29tZSgobGluZSkgPT4gaXNDYW5vbmljYWxSZW1vdGVVcmwobGluZS5zcGxpdCgvWyBcXHRdKy91KVsxXSA/PyAnJykpO1xufVxuXG5jb25zdCBjYW5vbmljYWxSZXBvc2l0b3J5UGF0aCA9IC9eXFwvP1dpbGxCb29zdGVyXFwvc2hhcmVkKD86XFwuZ2l0KT8kL2l1O1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlbW90ZSBVUkwgcG9pbnRzIGF0IHdiZnkncyBvd24gcmVwb3NpdG9yeS4gVGhlIGhvc3QgaXMgY29tcGFyZWQgYWZ0ZXIgUEFSU0lORyByYXRoZXJcbiAqIHRoYW4gbWF0Y2hlZCBpbnNpZGUgdGhlIHN0cmluZzogYW55IHBhdHRlcm4gbG9vc2UgZW5vdWdoIHRvIGFjY2VwdCBldmVyeSBVUkwgZm9ybSBnaXQgc3VwcG9ydHNcbiAqIGFsc28gYWNjZXB0ZWQgYSBsb29rYWxpa2UgdGhhdCBtZXJlbHkgY29udGFpbnMgdGhlIGhvc3QsIHN1Y2ggYXNcbiAqIGBodHRwczovL2V2aWwuZXhhbXBsZS8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQuZ2l0YCwgbGV0dGluZyBhbiB1bnJlbGF0ZWQgY2hlY2tvdXQgY2xhaW0gdG9cbiAqIGJlIGEgZ2VudWluZSB3YmZ5IGJ1aWxkLlxuICovXG5mdW5jdGlvbiBpc0Nhbm9uaWNhbFJlbW90ZVVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBzY3Atc3R5bGUgKGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3Rlci9zaGFyZWQuZ2l0YCkgaXMgbm90IGEgVVJMLCBzbyBpdCBpcyBtYXRjaGVkIHNlcGFyYXRlbHkuXG4gIC8vIFRoZSBsb29rYWhlYWQga2VlcHMgYSBzY2hlbWUncyBgOi8vYCBmcm9tIGJlaW5nIHJlYWQgYXMgdGhlIGBob3N0OnBhdGhgIHNlcGFyYXRvci5cbiAgY29uc3Qgc2NwTWF0Y2ggPSAvXig/OlteQC9dK0ApPyhbXi86XSspOig/IVxcLykoLiopJC91LmV4ZWModXJsKTtcbiAgaWYgKHNjcE1hdGNoKSB7XG4gICAgcmV0dXJuIHNjcE1hdGNoWzFdIS50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbScgJiYgY2Fub25pY2FsUmVwb3NpdG9yeVBhdGgudGVzdChzY3BNYXRjaFsyXSEpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgeyBob3N0bmFtZSwgcGF0aG5hbWUgfSA9IG5ldyBVUkwodXJsKTtcbiAgICByZXR1cm4gaG9zdG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nICYmIGNhbm9uaWNhbFJlcG9zaXRvcnlQYXRoLnRlc3QocGF0aG5hbWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0R2l0RGlydHlTdGF0ZShnaXRSb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhcbiAgICAnZ2l0JyxcbiAgICBbXG4gICAgICAnc3RhdHVzJyxcbiAgICAgICctLXBvcmNlbGFpbicsXG4gICAgICAnLS11bnRyYWNrZWQtZmlsZXM9YWxsJyxcbiAgICAgICctLScsXG4gICAgICBgOihnbG9iKSR7cGF0aC5kaXJuYW1lKHdiZnlEaXJQYXRoSW5SZXBvKX0vKi9zcmMvKipgLFxuICAgICAgYDooZ2xvYikke3BhdGguZGlybmFtZSh3YmZ5RGlyUGF0aEluUmVwbyl9LyovYmluLyoqYCxcbiAgICAgIGA6KGdsb2IpJHtwYXRoLmRpcm5hbWUod2JmeURpclBhdGhJblJlcG8pfS8qL2NvbmZpZ3MvKipgLFxuICAgIF0sXG4gICAgeyBjd2Q6IGdpdFJvb3REaXJQYXRoLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH1cbiAgKTtcbiAgcmV0dXJuIHByb2Muc3RhdHVzID09PSAwID8gISFwcm9jLnN0ZG91dC50cmltKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJ1bkdpdChhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIGFyZ3MsIHsgY3dkLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH0pO1xuICByZXR1cm4gcHJvYy5zdGF0dXMgPT09IDAgPyBwcm9jLnN0ZG91dC50cmltKCkgfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkO1xufVxuXG5sZXQgY2FjaGVkV2JmeVBhY2thZ2VKc29uOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBkaXJQYXRoOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcblxuLyoqIFJldHVybnMgd2JmeSdzIG93biBwYWNrYWdlIGRpcmVjdG9yeSwgd2hpY2ggYWxzbyBob2xkcyBpdHMgY29uZmlncyAoZS5nLiByZWxlYXNlQWdlR2F0ZS5qc29uKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXYmZ5RGlyUGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gcmVhZFdiZnlQYWNrYWdlSnNvbigpLmRpclBhdGg7XG59XG5cbmZ1bmN0aW9uIHJlYWRXYmZ5UGFja2FnZUpzb24oKTogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgZGlyUGF0aDogc3RyaW5nIH0ge1xuICBpZiAoY2FjaGVkV2JmeVBhY2thZ2VKc29uKSByZXR1cm4gY2FjaGVkV2JmeVBhY2thZ2VKc29uO1xuICAvLyBmaWxlVVJMVG9QYXRoLCBub3QgVVJMLnBhdGhuYW1lOiB0aGUgbGF0dGVyIGtlZXBzIHBlcmNlbnQtZW5jb2RpbmcsIHNvIGFuIGluc3RhbGxhdGlvbiBwYXRoXG4gIC8vIGNvbnRhaW5pbmcgZS5nLiBhIHNwYWNlIHdvdWxkIHJlc29sdmUgdG8gYSBub25leGlzdGVudCBkaXJlY3RvcnkgYW5kIHRoZSBzZWFyY2ggd291bGQgd2FsayB1cFxuICAvLyB0byBhbiB1bnJlbGF0ZWQgcGFja2FnZS5cbiAgbGV0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgICAvLyBwYXRoLmRpcm5hbWUoJy8nKSA9PT0gJy8nLCBzbyB0aGUgc2VhcmNoIG11c3Qgc3RvcCBleHBsaWNpdGx5IGF0IHRoZSBmaWxlc3lzdGVtIHJvb3QuXG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGRpclBhdGgpIHRocm93IG5ldyBFcnJvcihcIndiZnkncyBvd24gcGFja2FnZS5qc29uIGlzIG1pc3NpbmcuXCIpO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIGNhY2hlZFdiZnlQYWNrYWdlSnNvbiA9IHsgbmFtZTogcGFja2FnZUpzb24ubmFtZSwgdmVyc2lvbjogcGFja2FnZUpzb24udmVyc2lvbiwgZGlyUGF0aCB9O1xuICByZXR1cm4gY2FjaGVkV2JmeVBhY2thZ2VKc29uO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdldFdiZnlEaXJQYXRoIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5cbi8qKlxuICogQXBwbGllcyB0aGUgb3JnYW5pemF0aW9uJ3MgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgdG8gdGhlIGRldmVsb3BlciBtYWNoaW5lJ3MgR0xPQkFMXG4gKiBwYWNrYWdlLW1hbmFnZXIgY29uZmlncy4gUmVwb3NpdG9yeSBjb25maWdzIGd1YXJkIG9ubHkgd2JmaWVkIHJlcG9zaXRvcmllczsgYSBicmFuZC1uZXcgbG9jYWxcbiAqIHByb2plY3QgaGFzIG5vIGJ1bmZpZy50b21sIHlldCwgc28gdGhlIGdsb2JhbCBmaWxlcyBhcmUgdGhlIG9ubHkgZ2F0ZSBiZXR3ZWVuIGBidW4gY3JlYXRlYCAvXG4gKiBgbnBtIGluaXRgIGFuZCBhIGZyZXNobHkgY29tcHJvbWlzZWQgcmVsZWFzZS4gVGhlIHNhbWUgc2NyaXB0IHJ1bnMgb24gQ0kgYW5kIG9uIHRoZSBzZWxmLWhvc3RlZFxuICogcnVubmVycywgc28gZXZlcnkgbWFjaGluZSBlbmRzIHVwIHdpdGggYnl0ZS1pZGVudGljYWwgc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoJ2Jhc2gnLCBbcGF0aC5qb2luKGdldFdiZnlEaXJQYXRoKCksICdjb25maWdzJywgJ2FwcGx5UmVsZWFzZUFnZUdhdGUuc2gnKV0sIHtcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbiAgaWYgKHN0YXR1cyA9PT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gYXBwbHkgdGhlIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoZSBnbG9iYWwgcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MuJyk7XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkphdmEoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5KYXZhIHx8IGNvbmZpZy5kb2VzQ29udGFpbkphdmFJblBhY2thZ2VzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBLZWVwIHBhY2thZ2UtbWFuYWdlciBzaGltcyBpbiB0aGUgRmlsZSBXYXRjaGVyIHByb2dyYW0gZmllbGQgc28gbm9kZSBkb2VzIG5vdFxuLy8gcGFyc2Ugd3JhcHBlciBzY3JpcHRzIHBhc3NlZCB0aHJvdWdoIGFyZ3VtZW50cy5cbmNvbnN0IG94Zm10UHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL294Zm10JztcbmNvbnN0IHByZXR0aWVyUHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZylcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWcpKSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhc2tPcHRpb25zID0gW1xuICAgIHtcbiAgICAgIGFyZ3M6ICctLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gISoqL3BhY2thZ2UuanNvbicsXG4gICAgICBjb25kaXRpb246IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLm94Zm10LFxuICAgICAgbmFtZTogJ094Zm10JyxcbiAgICAgIHByb2dyYW06IG94Zm10UHJvZ3JhbSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFyZ3M6ICctLWNhY2hlIC0td3JpdGUnLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkphdmEoY29uZmlnKSxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5LFxuICAgICAgbmFtZTogJ1ByZXR0aWVyJyxcbiAgICAgIHByb2dyYW06IHByZXR0aWVyUHJvZ3JhbSxcbiAgICB9LFxuICBdXG4gICAgLmZpbHRlcigodGFzaykgPT4gdGFzay5jb25kaXRpb24pXG4gICAgLmZsYXRNYXAoKHRhc2spID0+IHRhc2suZXh0ZW5zaW9ucy5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnModGFzay5wcm9ncmFtLCB0YXNrLmFyZ3MsIHRhc2submFtZSwgZXh0KSkpO1xuXG4gIHJldHVybiBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4gICAgJHt0YXNrT3B0aW9ucy5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbkkxOG5Uc0NvbW1hbmQoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGVwZW5kaW5nJz4sXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgfHwgIXNjcmlwdHM/LlsnZ2VuLWkxOG4tdHMnXSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuICdidW4gcnVuIGdlbi1pMThuLXRzID4gL2Rldi9udWxsJztcbn1cbiIsImNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0T2JqZWN0QnlLZXlOYW1lTGlzdChvYmplY3QsIHNvcnRXaXRoKSB7XG4gIGxldCBrZXlzLCBzb3J0Rm4sIGtleVxuXG4gIGlmICh0eXBlb2Ygc29ydFdpdGggPT09ICdmdW5jdGlvbicpIHtcbiAgICBzb3J0Rm4gPSBzb3J0V2l0aFxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBzb3J0V2l0aFxuICB9XG5cbiAgY29uc3QgdG90YWwgPSB7fVxuICBjb25zdCBvYmplY3RLZXlzID0gWy4uLihrZXlzID8/IFtdKSwgLi4uT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KHNvcnRGbildXG5cbiAgZm9yIChrZXkgb2Ygb2JqZWN0S2V5cykge1xuICAgIGlmIChoYXMob2JqZWN0LCBrZXkpKSB7XG4gICAgICB0b3RhbFtrZXldID0gb2JqZWN0W2tleV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG90YWxcbn1cbiIsIi8vIERldGVjdCBlaXRoZXIgc3BhY2VzIG9yIHRhYnMgYnV0IG5vdCBib3RoIHRvIHByb3Blcmx5IGhhbmRsZSB0YWJzIGZvciBpbmRlbnRhdGlvbiBhbmQgc3BhY2VzIGZvciBhbGlnbm1lbnRcbmNvbnN0IElOREVOVF9SRUdFWCA9IC9eKD86KCApK3xcXHQrKS87XG5cbmNvbnN0IElOREVOVF9UWVBFX1NQQUNFID0gJ3NwYWNlJztcbmNvbnN0IElOREVOVF9UWVBFX1RBQiA9ICd0YWInO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIGlnbm9yZSBzaW5nbGUgc3BhY2UgcGF0dGVybnNcbmZ1bmN0aW9uIHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgdmFsdWUpIHtcblx0cmV0dXJuIGlnbm9yZVNpbmdsZVNwYWNlcyAmJiBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSAmJiB2YWx1ZSA9PT0gMTtcbn1cblxuLyoqXG5NYWtlIGEgTWFwIHRoYXQgY291bnRzIGhvdyBtYW55IGluZGVudHMvdW5pbmRlbnRzIGhhdmUgb2NjdXJyZWQgZm9yIGEgZ2l2ZW4gc2l6ZSBhbmQgaG93IG1hbnkgbGluZXMgZm9sbG93IGEgZ2l2ZW4gaW5kZW50YXRpb24uXG5cblRoZSBrZXkgaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBpbmRlbnRhdGlvbiB0eXBlIChzID0gc3BhY2UgYW5kIHQgPSB0YWIpIGFuZCB0aGUgc2l6ZSBvZiB0aGUgaW5kZW50cy91bmluZGVudHMuXG5cbmBgYFxuaW5kZW50cyA9IHtcblx0dDM6IFsxLCAwXSxcblx0dDQ6IFsxLCA1XSxcblx0czU6IFsxLCAwXSxcblx0czEyOiBbMSwgMF0sXG59XG5gYGBcbiovXG5mdW5jdGlvbiBtYWtlSW5kZW50c01hcChzdHJpbmcsIGlnbm9yZVNpbmdsZVNwYWNlcykge1xuXHRjb25zdCBpbmRlbnRzID0gbmV3IE1hcCgpO1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBzaXplIG9mIHByZXZpb3VzIGxpbmUncyBpbmRlbnRhdGlvblxuXHRsZXQgcHJldmlvdXNTaXplID0gMDtcblx0bGV0IHByZXZpb3VzSW5kZW50VHlwZTtcblxuXHQvLyBJbmRlbnRzIGtleSAoaWRlbnQgdHlwZSArIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzKVxuXHRsZXQga2V5O1xuXG5cdGZvciAoY29uc3QgbGluZSBvZiBzdHJpbmcuc3BsaXQoL1xcbi9nKSkge1xuXHRcdGlmICghbGluZSkge1xuXHRcdFx0Ly8gSWdub3JlIGVtcHR5IGxpbmVzXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBtYXRjaGVzID0gbGluZS5tYXRjaChJTkRFTlRfUkVHRVgpO1xuXG5cdFx0aWYgKG1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHRwcmV2aW91c0luZGVudFR5cGUgPSAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgaW5kZW50ID0gbWF0Y2hlc1swXS5sZW5ndGg7XG5cdFx0XHRjb25zdCBpbmRlbnRUeXBlID0gbWF0Y2hlc1sxXSA/IElOREVOVF9UWVBFX1NQQUNFIDogSU5ERU5UX1RZUEVfVEFCO1xuXG5cdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIHVubGVzcyBpdCdzIHRoZSBvbmx5IGluZGVudCBkZXRlY3RlZCB0byBwcmV2ZW50IGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXNcblx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGluZGVudCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpbmRlbnRUeXBlICE9PSBwcmV2aW91c0luZGVudFR5cGUpIHtcblx0XHRcdFx0cHJldmlvdXNTaXplID0gMDtcblx0XHRcdH1cblxuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gaW5kZW50VHlwZTtcblxuXHRcdFx0bGV0IHVzZSA9IDE7XG5cdFx0XHRsZXQgd2VpZ2h0ID0gMDtcblxuXHRcdFx0Y29uc3QgaW5kZW50RGlmZmVyZW5jZSA9IGluZGVudCAtIHByZXZpb3VzU2l6ZTtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IGluZGVudDtcblxuXHRcdFx0Ly8gUHJldmlvdXMgbGluZSBoYXZlIHNhbWUgaW5kZW50P1xuXHRcdFx0aWYgKGluZGVudERpZmZlcmVuY2UgPT09IDApIHtcblx0XHRcdFx0Ly8gTm90IGEgbmV3IFwidXNlXCIgb2YgdGhlIGN1cnJlbnQgaW5kZW50OlxuXHRcdFx0XHR1c2UgPSAwO1xuXHRcdFx0XHQvLyBCdXQgZG8gYWRkIGEgYml0IHRvIGl0IGZvciBicmVha2luZyB0aWVzOlxuXHRcdFx0XHR3ZWlnaHQgPSAxO1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGtleSBmcm9tIHByZXZpb3VzIGxvb3Bcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSA9IE1hdGguYWJzKGluZGVudERpZmZlcmVuY2UpO1xuXG5cdFx0XHRcdC8vIElnbm9yZSBzaW5nbGUgc3BhY2UgY2hhbmdlcyB3aGVuIGlnbm9yZVNpbmdsZVNwYWNlcyBpcyB0cnVlXG5cdFx0XHRcdC8vIFRoaXMgcHJldmVudHMgY29tbW9uIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHRoaW5ncyBsaWtlIGFsaWduZWQgY29tbWVudHNcblx0XHRcdFx0aWYgKHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0gZW5jb2RlSW5kZW50c0tleShpbmRlbnRUeXBlLCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHN0YXRzXG5cdFx0XHRjb25zdCBlbnRyeSA9IGluZGVudHMuZ2V0KGtleSk7XG5cdFx0XHRpbmRlbnRzLnNldChrZXksIGVudHJ5ID09PSB1bmRlZmluZWQgPyBbMSwgMF0gOiBbZW50cnlbMF0gKyB1c2UsIGVudHJ5WzFdICsgd2VpZ2h0XSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGluZGVudHM7XG59XG5cbi8vIEVuY29kZSB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBhcyBhIHN0cmluZyAoZS5nLiAnczQnKSBmb3IgdXNlIGFzIGEgY29tcG91bmQga2V5IGluIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgaW5kZW50QW1vdW50KSB7XG5cdGNvbnN0IHR5cGVDaGFyYWN0ZXIgPSBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICdzJyA6ICd0Jztcblx0cmV0dXJuIHR5cGVDaGFyYWN0ZXIgKyBTdHJpbmcoaW5kZW50QW1vdW50KTtcbn1cblxuLy8gRXh0cmFjdCB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBmcm9tIGEga2V5IG9mIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGRlY29kZUluZGVudHNLZXkoaW5kZW50c0tleSkge1xuXHRjb25zdCBrZXlIYXNUeXBlU3BhY2UgPSBpbmRlbnRzS2V5WzBdID09PSAncyc7XG5cdGNvbnN0IHR5cGUgPSBrZXlIYXNUeXBlU3BhY2UgPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRjb25zdCBhbW91bnQgPSBOdW1iZXIoaW5kZW50c0tleS5zbGljZSgxKSk7XG5cblx0cmV0dXJuIHt0eXBlLCBhbW91bnR9O1xufVxuXG4vLyBSZXR1cm4gdGhlIGtleSAoZS5nLiAnczQnKSBmcm9tIHRoZSBpbmRlbnRzIE1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIG1vc3QgY29tbW9uIGluZGVudCxcbi8vIG9yIHJldHVybiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIGluZGVudHMuXG5mdW5jdGlvbiBnZXRNb3N0VXNlZEtleShpbmRlbnRzKSB7XG5cdGxldCByZXN1bHQ7XG5cdGxldCBtYXhVc2VkID0gMDtcblx0bGV0IG1heFdlaWdodCA9IDA7XG5cblx0Zm9yIChjb25zdCBba2V5LCBbdXNlZENvdW50LCB3ZWlnaHRdXSBvZiBpbmRlbnRzKSB7XG5cdFx0aWYgKHVzZWRDb3VudCA+IG1heFVzZWQgfHwgKHVzZWRDb3VudCA9PT0gbWF4VXNlZCAmJiB3ZWlnaHQgPiBtYXhXZWlnaHQpKSB7XG5cdFx0XHRtYXhVc2VkID0gdXNlZENvdW50O1xuXHRcdFx0bWF4V2VpZ2h0ID0gd2VpZ2h0O1xuXHRcdFx0cmVzdWx0ID0ga2V5O1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KSB7XG5cdGNvbnN0IGluZGVudENoYXJhY3RlciA9IHR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFID8gJyAnIDogJ1xcdCc7XG5cdHJldHVybiBpbmRlbnRDaGFyYWN0ZXIucmVwZWF0KGFtb3VudCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdEluZGVudChzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdC8vIElkZW50aWZ5IGluZGVudHMgd2hpbGUgc2tpcHBpbmcgc2luZ2xlIHNwYWNlIGluZGVudHMgdG8gYXZvaWQgY29tbW9uIGVkZ2UgY2FzZXMgKGUuZy4gY29kZSBjb21tZW50cylcblx0Ly8gSWYgbm8gaW5kZW50cyBhcmUgaWRlbnRpZmllZCwgcnVuIGFnYWluIGFuZCBpbmNsdWRlIGFsbCBpbmRlbnRzIGZvciBjb21wcmVoZW5zaXZlIGRldGVjdGlvblxuXHRsZXQgaW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgdHJ1ZSk7XG5cdGlmIChpbmRlbnRzLnNpemUgPT09IDApIHtcblx0XHRpbmRlbnRzID0gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBmYWxzZSk7XG5cdH1cblxuXHRjb25zdCBrZXlPZk1vc3RVc2VkSW5kZW50ID0gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cyk7XG5cblx0bGV0IHR5cGU7XG5cdGxldCBhbW91bnQgPSAwO1xuXHRsZXQgaW5kZW50ID0gJyc7XG5cblx0aWYgKGtleU9mTW9zdFVzZWRJbmRlbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdCh7dHlwZSwgYW1vdW50fSA9IGRlY29kZUluZGVudHNLZXkoa2V5T2ZNb3N0VXNlZEluZGVudCkpO1xuXHRcdGluZGVudCA9IG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0YW1vdW50LFxuXHRcdHR5cGUsXG5cdFx0aW5kZW50LFxuXHR9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGRldGVjdE5ld2xpbmUoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHRjb25zdCBuZXdsaW5lcyA9IHN0cmluZy5tYXRjaCgvKD86XFxyP1xcbikvZykgfHwgW107XG5cblx0aWYgKG5ld2xpbmVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGNybGYgPSBuZXdsaW5lcy5maWx0ZXIobmV3bGluZSA9PiBuZXdsaW5lID09PSAnXFxyXFxuJykubGVuZ3RoO1xuXHRjb25zdCBsZiA9IG5ld2xpbmVzLmxlbmd0aCAtIGNybGY7XG5cblx0cmV0dXJuIGNybGYgPiBsZiA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lR3JhY2VmdWwoc3RyaW5nKSB7XG5cdHJldHVybiAodHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycgJiYgZGV0ZWN0TmV3bGluZShzdHJpbmcpKSB8fCAnXFxuJztcbn1cbiIsIiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWx1ZSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBzb3J0T2JqZWN0S2V5cyBmcm9tICdzb3J0LW9iamVjdC1rZXlzJ1xuaW1wb3J0IGRldGVjdEluZGVudCBmcm9tICdkZXRlY3QtaW5kZW50J1xuaW1wb3J0IHsgZGV0ZWN0TmV3bGluZUdyYWNlZnVsIGFzIGRldGVjdE5ld2xpbmUgfSBmcm9tICdkZXRlY3QtbmV3bGluZSdcbmltcG9ydCBnaXRIb29rcyBmcm9tICdnaXQtaG9va3MtbGlzdCdcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJ2lzLXBsYWluLW9iaidcbmltcG9ydCBzZW12ZXJDb21wYXJlIGZyb20gJ3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcydcbmltcG9ydCBzZW12ZXJNaW5WZXJzaW9uIGZyb20gJ3NlbXZlci9yYW5nZXMvbWluLXZlcnNpb24uanMnXG5cbmNvbnN0IHBpcGUgPVxuICAoZm5zKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBmbnMucmVkdWNlKChyZXN1bHQsIGZuKSA9PiBmbihyZXN1bHQsIC4uLmFyZ3MpLCB4KVxuY29uc3Qgb25BcnJheSA9IChmbikgPT4gKHgpID0+IChBcnJheS5pc0FycmF5KHgpID8gZm4oeCkgOiB4KVxuY29uc3Qgb25TdHJpbmdBcnJheSA9IChmbikgPT4gKHgpID0+XG4gIEFycmF5LmlzQXJyYXkoeCkgJiYgeC5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IGZuKHgpIDogeFxuY29uc3QgdW5pcSA9IG9uU3RyaW5nQXJyYXkoKHhzKSA9PiBbLi4ubmV3IFNldCh4cyldKVxuY29uc3Qgc29ydEFycmF5ID0gb25TdHJpbmdBcnJheSgoYXJyYXkpID0+IGFycmF5LnRvU29ydGVkKCkpXG5jb25zdCB1bmlxQW5kU29ydEFycmF5ID0gcGlwZShbdW5pcSwgc29ydEFycmF5XSlcbmNvbnN0IG9uT2JqZWN0ID1cbiAgKGZuKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBpc1BsYWluT2JqZWN0KHgpID8gZm4oeCwgLi4uYXJncykgOiB4XG5jb25zdCBzb3J0T2JqZWN0QnkgPSAoY29tcGFyYXRvciwgZGVlcCkgPT4ge1xuICBjb25zdCBvdmVyID0gb25PYmplY3QoKG9iamVjdCkgPT4ge1xuICAgIGlmIChkZWVwKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIG92ZXIodmFsdWUpXSksXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKG9iamVjdCwgY29tcGFyYXRvcilcbiAgfSlcblxuICByZXR1cm4gb3ZlclxufVxuY29uc3Qgc29ydE9iamVjdCA9IHNvcnRPYmplY3RCeSgpXG5jb25zdCBzb3J0VVJMT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsndHlwZScsICd1cmwnXSlcbmNvbnN0IHNvcnRQZW9wbGVPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ2VtYWlsJywgJ3VybCddKVxuY29uc3Qgc29ydERpcmVjdG9yaWVzID0gc29ydE9iamVjdEJ5KFtcbiAgJ2xpYicsXG4gICdiaW4nLFxuICAnbWFuJyxcbiAgJ2RvYycsXG4gICdleGFtcGxlJyxcbiAgJ3Rlc3QnLFxuXSlcbmNvbnN0IG92ZXJQcm9wZXJ0eSA9IChwcm9wZXJ0eSwgb3ZlcikgPT5cbiAgb25PYmplY3QoKG9iamVjdCwgLi4uYXJncykgPT5cbiAgICBPYmplY3QuaGFzT3duKG9iamVjdCwgcHJvcGVydHkpXG4gICAgICA/IHsgLi4ub2JqZWN0LCBbcHJvcGVydHldOiBvdmVyKG9iamVjdFtwcm9wZXJ0eV0sIC4uLmFyZ3MpIH1cbiAgICAgIDogb2JqZWN0LFxuICApXG5jb25zdCBzb3J0R2l0SG9va3MgPSBzb3J0T2JqZWN0QnkoZ2l0SG9va3MpXG5cbmNvbnN0IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSA9IChzcGVjaWZpZXIpID0+IHtcbiAgLy8gSWdub3JlIGFueXRoaW5nIGFmdGVyID4gJiByZWx5IG9uIGZhbGxiYWNrIGFscGhhbnVtZXJpYyBzb3J0aW5nIGZvciB0aGF0XG4gIGNvbnN0IFtuYW1lQW5kVmVyc2lvbl0gPSBzcGVjaWZpZXIuc3BsaXQoJz4nKVxuICBjb25zdCBhdE1hdGNoZXMgPSBbLi4ubmFtZUFuZFZlcnNpb24ubWF0Y2hBbGwoJ0AnKV1cbiAgaWYgKFxuICAgICFhdE1hdGNoZXMubGVuZ3RoIHx8XG4gICAgKGF0TWF0Y2hlcy5sZW5ndGggPT09IDEgJiYgYXRNYXRjaGVzWzBdLmluZGV4ID09PSAwKVxuICApIHtcbiAgICByZXR1cm4geyBuYW1lOiBzcGVjaWZpZXIgfVxuICB9XG4gIGNvbnN0IHNwbGl0SW5kZXggPSBhdE1hdGNoZXMucG9wKCkuaW5kZXhcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCksXG4gICAgcmFuZ2U6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZyhzcGxpdEluZGV4ICsgMSksXG4gIH1cbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5U2VtdmVyID0gc29ydE9iamVjdEJ5KChhLCBiKSA9PiB7XG4gIGNvbnN0IHsgbmFtZTogYU5hbWUsIHJhbmdlOiBhUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShhKVxuICBjb25zdCB7IG5hbWU6IGJOYW1lLCByYW5nZTogYlJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYilcblxuICBpZiAoYU5hbWUgIT09IGJOYW1lKSB7XG4gICAgcmV0dXJuIGFOYW1lLmxvY2FsZUNvbXBhcmUoYk5hbWUsICdlbicpXG4gIH1cbiAgaWYgKCFhUmFuZ2UpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoIWJSYW5nZSkge1xuICAgIHJldHVybiAxXG4gIH1cbiAgcmV0dXJuIHNlbXZlckNvbXBhcmUoc2VtdmVyTWluVmVyc2lvbihhUmFuZ2UpLCBzZW12ZXJNaW5WZXJzaW9uKGJSYW5nZSkpXG59KVxuXG5jb25zdCBnZXRQYWNrYWdlTmFtZSA9IChpZGVudCkgPT4ge1xuICBjb25zdCBpbmRleCA9IGlkZW50LmluZGV4T2YoJ0AnLCBpZGVudC5zdGFydHNXaXRoKCdAJykgPyAxIDogMClcbiAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgdW5sZXNzIHVzZXIgbWFudWFsbHkgZWRpdCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGlkZW50IDogaWRlbnQuc2xpY2UoMCwgaW5kZXgpXG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeUlkZW50ID0gKGEsIGIpID0+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVBID0gZ2V0UGFja2FnZU5hbWUoYSlcbiAgY29uc3QgcGFja2FnZU5hbWVCID0gZ2V0UGFja2FnZU5hbWUoYilcblxuICBpZiAocGFja2FnZU5hbWVBIDwgcGFja2FnZU5hbWVCKSByZXR1cm4gLTFcbiAgaWYgKHBhY2thZ2VOYW1lQSA+IHBhY2thZ2VOYW1lQikgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gQ2FjaGUgYnkgYHByb2Nlc3MuY3dkKClgIGluc3RlYWQgb2YgYSB2YXJpYWJsZSB0byBhbGxvdyB1c2VyIGNhbGwgYHByb2Nlc3MuY2hkaXIoKWBcbmNvbnN0IGNhY2hlID0gbmV3IE1hcCgpXG5jb25zdCBoYXNZYXJuT3JQbnBtRmlsZXMgPSAoKSA9PiB7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKClcbiAgaWYgKCFjYWNoZS5oYXMoY3dkKSkge1xuICAgIGNhY2hlLnNldChcbiAgICAgIGN3ZCxcbiAgICAgIGZzLmV4aXN0c1N5bmMoJ3lhcm4ubG9jaycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJuLycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJucmMueW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS1sb2NrLnlhbWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLXdvcmtzcGFjZS55YW1sJyksXG4gICAgKVxuICB9XG4gIHJldHVybiBjYWNoZS5nZXQoY3dkKVxufVxuXG4vKipcbiAqIERldGVjdHMgdGhlIHBhY2thZ2UgbWFuYWdlciBmcm9tIHBhY2thZ2UuanNvbiBhbmQgbG9jayBmaWxlc1xuICogQHBhcmFtIHtvYmplY3R9IHBhY2thZ2VKc29uIC0gVGhlIHBhcnNlZCBwYWNrYWdlLmpzb24gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgZGV0ZWN0ZWQgcGFja2FnZSBtYW5hZ2VyLiBEZWZhdWx0IHRvIG5wbSBpZiBub3QgZGV0ZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvY29yZXBhY2tcbiAgaWYgKHR5cGVvZiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnbnBtQCcpXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24uZGV2RW5naW5lcz8ucGFja2FnZU1hbmFnZXI/Lm5hbWUpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24uZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlci5uYW1lID09PSAnbnBtJ1xuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLnBucG0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIE9wdGltaXNhdGlvbjogQ2hlY2sgaWYgbnBtIGlzIGV4cGxpY2l0IGJlZm9yZSByZWFkaW5nIEZTLlxuICBpZiAocGFja2FnZUpzb24uZW5naW5lcz8ubnBtKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChoYXNZYXJuT3JQbnBtRmlsZXMoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBTb3J0IGRlcGVuZGVuY2llcyBhbHBoYWJldGljYWxseSwgZGV0ZWN0aW5nIHBhY2thZ2UgbWFuYWdlciB0byB1c2UgdGhlXG4gKiBhcHByb3ByaWF0ZSBjb21wYXJpc29uLiBucG0gdXNlcyBsb2NhbGUtYXdhcmUgY29tcGFyaXNvbiwgeWFybiBhbmQgcG5wbSB1c2VcbiAqIHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvblxuICovXG5jb25zdCBzb3J0RGVwZW5kZW5jaWVzID0gb25PYmplY3QoKGRlcGVuZGVuY2llcywgcGFja2FnZUpzb24pID0+IHtcbiAgLy8gQXZvaWQgZmlsZSBhY2Nlc3NcbiAgaWYgKE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcykubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBkZXBlbmRlbmNpZXNcbiAgfVxuXG4gIC8vIHNvcnQgZGVwcyBsaWtlIHRoZSBucG0gQ0xJIGRvZXMgKHZpYSB0aGUgcGFja2FnZSBAbnBtY2xpL3BhY2thZ2UtanNvbilcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25wbS9wYWNrYWdlLWpzb24vYmxvYi9iNjQ2NWY0NGM3MjdkNjUxM2RiNjg5OGM3Y2JlNDFkZDM1NWNlYmU4L2xpYi91cGRhdGUtZGVwZW5kZW5jaWVzLmpzI0w4LUwyMVxuICBpZiAoc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pKSB7XG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcywgKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiLCAnZW4nKSlcbiAgfVxuXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMpXG59KVxuXG4vKipcbiAqIFwid29ya3NwYWNlc1wiIGNhbiBiZSBhbiBhcnJheSAobnBtIG9yIHlhcm4gY2xhc3NpYykgb3IgYW4gb2JqZWN0IChwbnBtL2J1bikuXG4gKiBJbiB0aGUgY2FzZSBvZiBhbiBhcnJheSwgd2UgZG8gbm90IHdhbnQgdG8gYWxwaGFiZXRpY2FsbHkgc29ydCBpdCBpbiBjYXNlXG4gKiBzY3JpcHRzIG5lZWQgdG8gcnVuIGluIGEgc3BlY2lmaWMgb3JkZXIuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92Ny91c2luZy1ucG0vd29ya3NwYWNlcz92PXRydWUjcnVubmluZy1jb21tYW5kcy1pbi10aGUtY29udGV4dC1vZi13b3Jrc3BhY2VzXG4gKi9cbmNvbnN0IHNvcnRXb3Jrc3BhY2VzID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShbJ3BhY2thZ2VzJywgJ2NhdGFsb2cnXSksXG4gIG92ZXJQcm9wZXJ0eSgncGFja2FnZXMnLCB1bmlxQW5kU29ydEFycmF5KSxcbiAgb3ZlclByb3BlcnR5KCdjYXRhbG9nJywgc29ydERlcGVuZGVuY2llcyksXG5dKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9ibG9iL2FjYzBlNDc1NzJhOTM5MDI5MmI0ZTMxM2I0YTRiZjM2MGQyMzYzNTgvY29uZi9jb25maWctc2NoZW1hLmpzXG5jb25zdCBlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgLy8gYGZpbGVzYCBhbmQgYGV4Y2x1ZGVkRmlsZXNgIGFyZSBvbmx5IG9uIGBvdmVycmlkZXNbXWBcbiAgLy8gZm9yIGVhc2llciBzb3J0IGBvdmVycmlkZXNbXWAsXG4gIC8vIGFkZCB0aGVtIHRvIGhlcmUsIHNvIHdlIGRvbid0IG5lZWQgc29ydCBgb3ZlcnJpZGVzW11gIHR3aWNlXG4gICdmaWxlcycsXG4gICdleGNsdWRlZEZpbGVzJyxcbiAgLy8gYmFzZUNvbmZpZ1xuICAnZW52JyxcbiAgJ3BhcnNlcicsXG4gICdwYXJzZXJPcHRpb25zJyxcbiAgJ3NldHRpbmdzJyxcbiAgJ3BsdWdpbnMnLFxuICAnZXh0ZW5kcycsXG4gICdydWxlcycsXG4gICdvdmVycmlkZXMnLFxuICAnZ2xvYmFscycsXG4gICdwcm9jZXNzb3InLFxuICAnbm9JbmxpbmVDb25maWcnLFxuICAncmVwb3J0VW51c2VkRGlzYWJsZURpcmVjdGl2ZXMnLFxuXVxuY29uc3Qgc29ydEVzbGludENvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMpLFxuICBvdmVyUHJvcGVydHkoJ2VudicsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoJ2dsb2JhbHMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT4gb3ZlcnJpZGVzLm1hcChzb3J0RXNsaW50Q29uZmlnKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgncGFyc2VyT3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ3J1bGVzJyxcbiAgICBzb3J0T2JqZWN0QnkoXG4gICAgICAocnVsZTEsIHJ1bGUyKSA9PlxuICAgICAgICBydWxlMS5zcGxpdCgnLycpLmxlbmd0aCAtIHJ1bGUyLnNwbGl0KCcvJykubGVuZ3RoIHx8XG4gICAgICAgIHJ1bGUxLmxvY2FsZUNvbXBhcmUocnVsZTIpLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgnc2V0dGluZ3MnLCBzb3J0T2JqZWN0KSxcbl0pXG5jb25zdCBzb3J0VlNDb2RlQmFkZ2VPYmplY3QgPSBzb3J0T2JqZWN0QnkoWydkZXNjcmlwdGlvbicsICd1cmwnLCAnaHJlZiddKVxuXG5jb25zdCBzb3J0UHJldHRpZXJDb25maWcgPSBwaXBlKFtcbiAgLy8gc29ydCBrZXlzIGFscGhhYmV0aWNhbGx5LCBidXQgcHV0IGBvdmVycmlkZXNgIGF0IGJvdHRvbVxuICBvbk9iamVjdCgoY29uZmlnKSA9PlxuICAgIHNvcnRPYmplY3RLZXlzKGNvbmZpZywgW1xuICAgICAgLi4uT2JqZWN0LmtleXMoY29uZmlnKVxuICAgICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gJ292ZXJyaWRlcycpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICAnb3ZlcnJpZGVzJyxcbiAgICBdKSxcbiAgKSxcbiAgLy8gaWYgYGNvbmZpZy5vdmVycmlkZXNgIGV4aXN0c1xuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgLy8gYW5kIGBjb25maWcub3ZlcnJpZGVzYCBpcyBhbiBhcnJheVxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT5cbiAgICAgIG92ZXJyaWRlcy5tYXAoXG4gICAgICAgIHBpcGUoW1xuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXWAgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBzb3J0T2JqZWN0LFxuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXS5vcHRpb25zYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIG92ZXJQcm9wZXJ0eSgnb3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbl0pXG5cbmNvbnN0IHNvcnRWb2x0YSA9IHNvcnRPYmplY3RCeShbJ25vZGUnLCAnbnBtJywgJ3lhcm4nXSlcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS93aXJlaXRcbmNvbnN0IHdpcmVpdFNjcmlwdFByb3BlcnRpZXMgPSBbJ2NvbW1hbmQnLCAnZGVwZW5kZW5jaWVzJywgJ2ZpbGVzJywgJ291dHB1dCddXG5jb25zdCBzb3J0V2lyZWl0U2NyaXB0ID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeSh3aXJlaXRTY3JpcHRQcm9wZXJ0aWVzKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdkZXBlbmRlbmNpZXMnLFxuICAgIG9uQXJyYXkoKGRlcHMpID0+IGRlcHMubWFwKHNvcnRPYmplY3RCeShbJ3NjcmlwdCcsICdjYXNjYWRlJ10pKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnZW52JyxcbiAgICBvbk9iamVjdCgoZW52KSA9PlxuICAgICAgc29ydE9iamVjdEtleXMoXG4gICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhlbnYpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBzb3J0T2JqZWN0QnkoWydleHRlcm5hbCcsICdkZWZhdWx0J10pKHZhbHVlKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdzZXJ2aWNlJyxcbiAgICBwaXBlKFtzb3J0T2JqZWN0QnkoWydyZWFkeVdoZW4nXSksIG92ZXJQcm9wZXJ0eSgncmVhZHlXaGVuJywgc29ydE9iamVjdCldKSxcbiAgKSxcbl0pXG5jb25zdCBzb3J0V2lyZWl0ID0gb25PYmplY3QoKHdpcmVpdCkgPT5cbiAgc29ydE9iamVjdEtleXMoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMod2lyZWl0KS5tYXAoKFtuYW1lLCBjb25maWddKSA9PiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNvcnRXaXJlaXRTY3JpcHQoY29uZmlnKSxcbiAgICAgIF0pLFxuICAgICksXG4gICksXG4pXG5jb25zdCBzb3J0RGV2RW5naW5lcyA9IG92ZXJQcm9wZXJ0eShcbiAgJ3BhY2thZ2VNYW5hZ2VyJyxcbiAgc29ydE9iamVjdEJ5KFsnbmFtZScsICd2ZXJzaW9uJywgJ29uRmFpbCddKSxcbilcblxuY29uc3QgcG5wbUJhc2VDb25maWdQcm9wZXJ0aWVzID0gW1xuICAncGVlckRlcGVuZGVuY3lSdWxlcycsXG4gICduZXZlckJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXNGaWxlJyxcbiAgJ2FsbG93ZWREZXByZWNhdGVkVmVyc2lvbnMnLFxuICAnYWxsb3dOb25BcHBsaWVkUGF0Y2hlcycsXG4gICd1cGRhdGVDb25maWcnLFxuICAnYXVkaXRDb25maWcnLFxuICAncmVxdWlyZWRTY3JpcHRzJyxcbiAgJ3N1cHBvcnRlZEFyY2hpdGVjdHVyZXMnLFxuICAnb3ZlcnJpZGVzJyxcbiAgJ3BhdGNoZWREZXBlbmRlbmNpZXMnLFxuICAncGFja2FnZUV4dGVuc2lvbnMnLFxuXVxuXG5jb25zdCBzb3J0UG5wbUNvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkocG5wbUJhc2VDb25maWdQcm9wZXJ0aWVzLCB0cnVlKSxcbiAgb3ZlclByb3BlcnR5KCdvdmVycmlkZXMnLCBzb3J0T2JqZWN0QnlTZW12ZXIpLFxuXSlcblxuLy8gU2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vbWlzYy9zY3JpcHRzXG5jb25zdCBkZWZhdWx0TnBtU2NyaXB0cyA9IG5ldyBTZXQoW1xuICAnaW5zdGFsbCcsXG4gICdwYWNrJyxcbiAgJ3ByZXBhcmUnLFxuICAncHVibGlzaCcsXG4gICdyZXN0YXJ0JyxcbiAgJ3Nocmlua3dyYXAnLFxuICAnc3RhcnQnLFxuICAnc3RvcCcsXG4gICd0ZXN0JyxcbiAgJ3VuaW5zdGFsbCcsXG4gICd2ZXJzaW9uJyxcbl0pXG5cbmNvbnN0IGhhc0RldkRlcGVuZGVuY3kgPSAoZGVwZW5kZW5jeSwgcGFja2FnZUpzb24pID0+IHtcbiAgcmV0dXJuIChcbiAgICBPYmplY3QuaGFzT3duKHBhY2thZ2VKc29uLCAnZGV2RGVwZW5kZW5jaWVzJykgJiZcbiAgICBPYmplY3QuaGFzT3duKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcywgZGVwZW5kZW5jeSlcbiAgKVxufVxuXG5jb25zdCBydW5TUmVnRXhwID1cbiAgLyg/PD1efFtcXHMmOzw+fChdKSg/OnJ1bi1zfG5wbS1ydW4tYWxsMj8gLiooPzotLXNlcXVlbnRpYWx8LS1zZXJpYWx8LXMpKSg/PSR8W1xccyY7PD58KV0pL1xuXG5jb25zdCBpc1NlcXVlbnRpYWxTY3JpcHQgPSAoY29tbWFuZCkgPT5cbiAgY29tbWFuZC5pbmNsdWRlcygnKicpICYmIHJ1blNSZWdFeHAudGVzdChjb21tYW5kKVxuXG5jb25zdCBoYXNTZXF1ZW50aWFsU2NyaXB0ID0gKHBhY2thZ2VKc29uKSA9PiB7XG4gIGlmIChcbiAgICAhaGFzRGV2RGVwZW5kZW5jeSgnbnBtLXJ1bi1hbGwnLCBwYWNrYWdlSnNvbikgJiZcbiAgICAhaGFzRGV2RGVwZW5kZW5jeSgnbnBtLXJ1bi1hbGwyJywgcGFja2FnZUpzb24pXG4gICkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGNvbnN0IHNjcmlwdHMgPSBbJ3NjcmlwdHMnLCAnYmV0dGVyU2NyaXB0cyddLmZsYXRNYXAoKGZpZWxkKSA9PlxuICAgIHBhY2thZ2VKc29uW2ZpZWxkXSA/IE9iamVjdC52YWx1ZXMocGFja2FnZUpzb25bZmllbGRdKSA6IFtdLFxuICApXG4gIHJldHVybiBzY3JpcHRzLnNvbWUoKHNjcmlwdCkgPT4gaXNTZXF1ZW50aWFsU2NyaXB0KHNjcmlwdCkpXG59XG5cbmZ1bmN0aW9uIHNvcnRTY3JpcHROYW1lcyhrZXlzLCBwcmVmaXggPSAnJykge1xuICBjb25zdCBncm91cE1hcCA9IG5ldyBNYXAoKVxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgcmVzdCA9IHByZWZpeCA/IGtleS5zbGljZShwcmVmaXgubGVuZ3RoICsgMSkgOiBrZXlcbiAgICBjb25zdCBpZHggPSByZXN0LmluZGV4T2YoJzonKVxuICAgIGlmIChpZHggPiAwKSB7XG4gICAgICBjb25zdCBiYXNlID0ga2V5LnNsaWNlKDAsIChwcmVmaXggPyBwcmVmaXgubGVuZ3RoICsgMSA6IDApICsgaWR4KVxuICAgICAgaWYgKCFncm91cE1hcC5oYXMoYmFzZSkpIGdyb3VwTWFwLnNldChiYXNlLCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChiYXNlKS5wdXNoKGtleSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFncm91cE1hcC5oYXMoa2V5KSkgZ3JvdXBNYXAuc2V0KGtleSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoa2V5KS5wdXNoKGtleSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFycmF5LmZyb20oZ3JvdXBNYXAua2V5cygpKVxuICAgIC5zb3J0KClcbiAgICAuZmxhdE1hcCgoZ3JvdXBLZXkpID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gZ3JvdXBNYXAuZ2V0KGdyb3VwS2V5KVxuICAgICAgaWYgKFxuICAgICAgICBjaGlsZHJlbi5sZW5ndGggPiAxICYmXG4gICAgICAgIGNoaWxkcmVuLnNvbWUoKGspID0+IGsgIT09IGdyb3VwS2V5ICYmIGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZGlyZWN0ID0gY2hpbGRyZW5cbiAgICAgICAgICAuZmlsdGVyKChrKSA9PiBrID09PSBncm91cEtleSB8fCAhay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgIGNvbnN0IG5lc3RlZCA9IGNoaWxkcmVuLmZpbHRlcigoaykgPT4gay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICAgcmV0dXJuIFsuLi5kaXJlY3QsIC4uLnNvcnRTY3JpcHROYW1lcyhuZXN0ZWQsIGdyb3VwS2V5KV1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGlsZHJlbi5zb3J0KClcbiAgICB9KVxufVxuXG5jb25zdCBzb3J0U2NyaXB0cyA9IG9uT2JqZWN0KChzY3JpcHRzLCBwYWNrYWdlSnNvbikgPT4ge1xuICBsZXQgbmFtZXMgPSBPYmplY3Qua2V5cyhzY3JpcHRzKVxuICBjb25zdCBwcmVmaXhhYmxlID0gbmV3IFNldCgpXG5cbiAgbmFtZXMgPSBuYW1lcy5tYXAoKG5hbWUpID0+IHtcbiAgICBjb25zdCBvbWl0dGVkID0gbmFtZS5yZXBsYWNlKC9eKD86cHJlfHBvc3QpLywgJycpXG4gICAgaWYgKGRlZmF1bHROcG1TY3JpcHRzLmhhcyhvbWl0dGVkKSB8fCBuYW1lcy5pbmNsdWRlcyhvbWl0dGVkKSkge1xuICAgICAgcHJlZml4YWJsZS5hZGQob21pdHRlZClcbiAgICAgIHJldHVybiBvbWl0dGVkXG4gICAgfVxuICAgIHJldHVybiBuYW1lXG4gIH0pXG5cbiAgaWYgKCFoYXNTZXF1ZW50aWFsU2NyaXB0KHBhY2thZ2VKc29uKSkge1xuICAgIG5hbWVzID0gc29ydFNjcmlwdE5hbWVzKG5hbWVzKVxuICB9XG4gIG5hbWVzID0gbmFtZXMuZmxhdE1hcCgoa2V5KSA9PlxuICAgIHByZWZpeGFibGUuaGFzKGtleSkgPyBbYHByZSR7a2V5fWAsIGtleSwgYHBvc3Qke2tleX1gXSA6IFtrZXldLFxuICApXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhzY3JpcHRzLCBuYW1lcylcbn0pXG5cbi8qXG4tIE1vdmUgYGRlZmF1bHRgIGNvbmRpdGlvbiB0byBib3R0b21cbiovXG5jb25zdCBzb3J0Q29uZGl0aW9ucyA9IChjb25kaXRpb25zKSA9PiB7XG4gIGNvbnN0IHsgZGVmYXVsdENvbmRpdGlvbnMgPSBbXSwgcmVzdENvbmRpdGlvbnMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgY29uZGl0aW9ucyxcbiAgICAoY29uZGl0aW9uKSA9PiB7XG4gICAgICBpZiAoY29uZGl0aW9uID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgcmV0dXJuICdkZWZhdWx0Q29uZGl0aW9ucydcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdyZXN0Q29uZGl0aW9ucydcbiAgICB9LFxuICApXG5cbiAgcmV0dXJuIFsuLi5yZXN0Q29uZGl0aW9ucywgLi4uZGVmYXVsdENvbmRpdGlvbnNdXG59XG5cbmNvbnN0IHNvcnRFeHBvcnRzID0gb25PYmplY3QoKGV4cG9ydHMpID0+IHtcbiAgY29uc3QgeyBwYXRocyA9IFtdLCBjb25kaXRpb25zID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgIE9iamVjdC5rZXlzKGV4cG9ydHMpLFxuICAgIChrZXkpID0+IChrZXkuc3RhcnRzV2l0aCgnLicpID8gJ3BhdGhzJyA6ICdjb25kaXRpb25zJyksXG4gIClcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5wYXRocywgLi4uc29ydENvbmRpdGlvbnMoY29uZGl0aW9ucyldLm1hcCgoa2V5KSA9PiBbXG4gICAgICBrZXksXG4gICAgICBzb3J0RXhwb3J0cyhleHBvcnRzW2tleV0pLFxuICAgIF0pLFxuICApXG59KVxuXG4vLyBmaWVsZHMgbWFya2VkIGB2c2NvZGVgIGFyZSBmb3IgYFZpc3VhbCBTdHVkaW8gQ29kZSBleHRlbnNpb24gbWFuaWZlc3RgIG9ubHlcbi8vIGh0dHBzOi8vY29kZS52aXN1YWxzdHVkaW8uY29tL2FwaS9yZWZlcmVuY2VzL2V4dGVuc2lvbi1tYW5pZmVzdFxuLy8gU3VwcG9ydGVkIGZpZWxkczpcbi8vIHB1Ymxpc2hlciwgZGlzcGxheU5hbWUsIGNhdGVnb3JpZXMsIGdhbGxlcnlCYW5uZXIsIHByZXZpZXcsIGNvbnRyaWJ1dGVzLFxuLy8gYWN0aXZhdGlvbkV2ZW50cywgYmFkZ2VzLCBtYXJrZG93biwgcW5hLCBleHRlbnNpb25QYWNrLFxuLy8gZXh0ZW5zaW9uRGVwZW5kZW5jaWVzLCBpY29uXG5cbi8vIGZpZWxkLmtleXtzdHJpbmd9OiBmaWVsZCBuYW1lXG4vLyBmaWVsZC5vdmVye2Z1bmN0aW9ufTogc29ydCBmaWVsZCBzdWJLZXlcbmNvbnN0IGZpZWxkcyA9IFtcbiAgeyBrZXk6ICckc2NoZW1hJyB9LFxuICB7IGtleTogJ25hbWUnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2Rpc3BsYXlOYW1lJyB9LFxuICB7IGtleTogJ3ZlcnNpb24nIH0sXG4gIC8qIHlhcm4gKi8geyBrZXk6ICdzdGFibGVWZXJzaW9uJyB9LFxuICB7IGtleTogJ3ByaXZhdGUnIH0sXG4gIHsga2V5OiAnZGVzY3JpcHRpb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NhdGVnb3JpZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAna2V5d29yZHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaG9tZXBhZ2UnIH0sXG4gIHsga2V5OiAnYnVncycsIG92ZXI6IHNvcnRPYmplY3RCeShbJ3VybCcsICdlbWFpbCddKSB9LFxuICB7IGtleTogJ3JlcG9zaXRvcnknLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnZnVuZGluZycsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdsaWNlbnNlJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdxbmEnIH0sXG4gIHsga2V5OiAnYXV0aG9yJywgb3Zlcjogc29ydFBlb3BsZU9iamVjdCB9LFxuICB7XG4gICAga2V5OiAnbWFpbnRhaW5lcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKG1haW50YWluZXJzKSA9PiBtYWludGFpbmVycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICB7XG4gICAga2V5OiAnY29udHJpYnV0b3JzJyxcbiAgICBvdmVyOiBvbkFycmF5KChjb250cmlidXRvcnMpID0+IGNvbnRyaWJ1dG9ycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwdWJsaXNoZXInIH0sXG4gIHsga2V5OiAnc2lkZUVmZmVjdHMnIH0sXG4gIHsga2V5OiAndHlwZScgfSxcbiAgeyBrZXk6ICdpbXBvcnRzJyB9LFxuICB7IGtleTogJ2V4cG9ydHMnLCBvdmVyOiBzb3J0RXhwb3J0cyB9LFxuICB7IGtleTogJ21haW4nIH0sXG4gIHsga2V5OiAnc3ZlbHRlJyB9LFxuICB7IGtleTogJ3VtZDptYWluJyB9LFxuICB7IGtleTogJ2pzZGVsaXZyJyB9LFxuICB7IGtleTogJ3VucGtnJyB9LFxuICB7IGtleTogJ21vZHVsZScgfSxcbiAgeyBrZXk6ICdzb3VyY2UnIH0sXG4gIHsga2V5OiAnanNuZXh0Om1haW4nIH0sXG4gIHsga2V5OiAnYnJvd3NlcicgfSxcbiAgeyBrZXk6ICdyZWFjdC1uYXRpdmUnIH0sXG4gIHsga2V5OiAndHlwZXMnIH0sXG4gIHsga2V5OiAndHlwZXNWZXJzaW9ucycgfSxcbiAgeyBrZXk6ICd0eXBpbmdzJyB9LFxuICB7IGtleTogJ3N0eWxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZXN0eWxlJyB9LFxuICB7IGtleTogJ2Fzc2V0cycgfSxcbiAgeyBrZXk6ICdiaW4nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbWFuJyB9LFxuICB7IGtleTogJ2RpcmVjdG9yaWVzJywgb3Zlcjogc29ydERpcmVjdG9yaWVzIH0sXG4gIHsga2V5OiAnZmlsZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnd29ya3NwYWNlcycsIG92ZXI6IHNvcnRXb3Jrc3BhY2VzIH0sXG4gIC8vIG5vZGUtcHJlLWd5cCBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9ub2RlLXByZS1neXAjMS1hZGQtbmV3LWVudHJpZXMtdG8teW91ci1wYWNrYWdlanNvblxuICB7XG4gICAga2V5OiAnYmluYXJ5JyxcbiAgICBvdmVyOiBzb3J0T2JqZWN0QnkoW1xuICAgICAgJ21vZHVsZV9uYW1lJyxcbiAgICAgICdtb2R1bGVfcGF0aCcsXG4gICAgICAncmVtb3RlX3BhdGgnLFxuICAgICAgJ3BhY2thZ2VfbmFtZScsXG4gICAgICAnaG9zdCcsXG4gICAgXSksXG4gIH0sXG4gIHsga2V5OiAnc2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnYmV0dGVyU2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnd2lyZWl0Jywgb3Zlcjogc29ydFdpcmVpdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdsMTBuJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdjb250cmlidXRlcycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnYWN0aXZhdGlvbkV2ZW50cycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdodXNreScsIG92ZXI6IG92ZXJQcm9wZXJ0eSgnaG9va3MnLCBzb3J0R2l0SG9va3MpIH0sXG4gIHsga2V5OiAnc2ltcGxlLWdpdC1ob29rcycsIG92ZXI6IHNvcnRHaXRIb29rcyB9LFxuICB7IGtleTogJ3ByZS1jb21taXQnIH0sXG4gIHsga2V5OiAnY29tbWl0bGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdsaW50LXN0YWdlZCcgfSxcbiAgeyBrZXk6ICduYW5vLXN0YWdlZCcgfSxcbiAgeyBrZXk6ICdjb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbm9kZW1vbkNvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2VyaWZ5Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2JhYmVsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJzbGlzdCcgfSxcbiAgeyBrZXk6ICd4bycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdwcmV0dGllcicsIG92ZXI6IHNvcnRQcmV0dGllckNvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludENvbmZpZycsIG92ZXI6IHNvcnRFc2xpbnRDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRJZ25vcmUnIH0sXG4gIHsga2V5OiAnbnBtcGtnanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtUGFja2FnZUpzb25MaW50Q29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbXBhY2thZ2Vqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZWxlYXNlJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbWFya0NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdzdHlsZWxpbnQnIH0sXG4gIHsga2V5OiAnYXZhJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1qdW5pdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LXN0YXJlJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ21vY2hhJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ255YycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdjOCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICd0YXAnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb2NsaWYnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ3Jlc29sdXRpb25zJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ292ZXJyaWRlcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGV2RGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0Qnkoc29ydE9iamVjdEJ5SWRlbnQsIHRydWUpIH0sXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgLy8gVE9ETzogb25seSBzb3J0IGRlcHRoID0gMlxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdvcHRpb25hbERlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdidW5kbGVkRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICB7IGtleTogJ2J1bmRsZURlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZXh0ZW5zaW9uUGFjaycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZXh0ZW5zaW9uRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICB7IGtleTogJ2ZsYXQnIH0sXG4gIHsga2V5OiAncGFja2FnZU1hbmFnZXInIH0sXG4gIHsga2V5OiAnZW5naW5lcycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdlbmdpbmVTdHJpY3QnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZGV2RW5naW5lcycsIG92ZXI6IHNvcnREZXZFbmdpbmVzIH0sXG4gIHsga2V5OiAndm9sdGEnLCBvdmVyOiBzb3J0Vm9sdGEgfSxcbiAgeyBrZXk6ICdsYW5ndWFnZU5hbWUnIH0sXG4gIHsga2V5OiAnb3MnIH0sXG4gIHsga2V5OiAnY3B1JyB9LFxuICB7IGtleTogJ3ByZWZlckdsb2JhbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdwdWJsaXNoQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdpY29uJyB9LFxuICAvKiB2c2NvZGUgKi8ge1xuICAgIGtleTogJ2JhZGdlcycsXG4gICAgb3Zlcjogb25BcnJheSgoYmFkZ2UpID0+IGJhZGdlLm1hcChzb3J0VlNDb2RlQmFkZ2VPYmplY3QpKSxcbiAgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZ2FsbGVyeUJhbm5lcicsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncHJldmlldycgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbWFya2Rvd24nIH0sXG4gIHsga2V5OiAncG5wbScsIG92ZXI6IHNvcnRQbnBtQ29uZmlnIH0sXG5dXG5cbmNvbnN0IGRlZmF1bHRTb3J0T3JkZXIgPSBmaWVsZHMubWFwKCh7IGtleSB9KSA9PiBrZXkpXG5jb25zdCBvdmVyRmllbGRzID0gcGlwZShcbiAgZmllbGRzXG4gICAgLm1hcCgoeyBrZXksIG92ZXIgfSkgPT4gKG92ZXIgPyBvdmVyUHJvcGVydHkoa2V5LCBvdmVyKSA6IHVuZGVmaW5lZCkpXG4gICAgLmZpbHRlcihCb29sZWFuKSxcbilcblxuZnVuY3Rpb24gZWRpdFN0cmluZ0pTT04oanNvbiwgb3Zlcikge1xuICBpZiAodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgeyBpbmRlbnQsIHR5cGUgfSA9IGRldGVjdEluZGVudChqc29uKVxuICAgIGNvbnN0IGVuZENoYXJhY3RlcnMgPSBqc29uLnNsaWNlKC0xKSA9PT0gJ1xcbicgPyAnXFxuJyA6ICcnXG4gICAgY29uc3QgbmV3bGluZSA9IGRldGVjdE5ld2xpbmUoanNvbilcbiAgICBqc29uID0gSlNPTi5wYXJzZShqc29uKVxuXG4gICAgbGV0IHJlc3VsdCA9XG4gICAgICBKU09OLnN0cmluZ2lmeShvdmVyKGpzb24pLCBudWxsLCB0eXBlID09PSAndGFiJyA/ICdcXHQnIDogaW5kZW50KSArXG4gICAgICBlbmRDaGFyYWN0ZXJzXG4gICAgaWYgKG5ld2xpbmUgPT09ICdcXHJcXG4nKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXFxuL2csIG5ld2xpbmUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHJldHVybiBvdmVyKGpzb24pXG59XG5cbmZ1bmN0aW9uIHNvcnRQYWNrYWdlSnNvbihqc29uSXNoLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGVkaXRTdHJpbmdKU09OKFxuICAgIGpzb25Jc2gsXG4gICAgb25PYmplY3QoKGpzb24pID0+IHtcbiAgICAgIGxldCBzb3J0T3JkZXIgPSBvcHRpb25zLnNvcnRPcmRlciB8fCBkZWZhdWx0U29ydE9yZGVyXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvcnRPcmRlcikpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGpzb24pXG4gICAgICAgIGNvbnN0IHsgcHJpdmF0ZUtleXMgPSBbXSwgcHVibGljS2V5cyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICAgICAgICBrZXlzLFxuICAgICAgICAgIChrZXkpID0+IChrZXlbMF0gPT09ICdfJyA/ICdwcml2YXRlS2V5cycgOiAncHVibGljS2V5cycpLFxuICAgICAgICApXG4gICAgICAgIHNvcnRPcmRlciA9IFtcbiAgICAgICAgICAuLi5zb3J0T3JkZXIsXG4gICAgICAgICAgLi4uZGVmYXVsdFNvcnRPcmRlcixcbiAgICAgICAgICAuLi5wdWJsaWNLZXlzLnNvcnQoKSxcbiAgICAgICAgICAuLi5wcml2YXRlS2V5cy5zb3J0KCksXG4gICAgICAgIF1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG92ZXJGaWVsZHMoc29ydE9iamVjdEtleXMoanNvbiwgc29ydE9yZGVyKSwganNvbilcbiAgICB9KSxcbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBzb3J0UGFja2FnZUpzb25cbmV4cG9ydCB7IHNvcnRQYWNrYWdlSnNvbiwgZGVmYXVsdFNvcnRPcmRlciBhcyBzb3J0T3JkZXIgfVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb1VybCA9IGBnaXRAZ2l0aHViLmNvbToke29yZ2FuaXphdGlvbn0vJHtyZXBvfS5naXRgO1xuICAgIGNvbnN0IG91dHB1dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydscy1yZW1vdGUnLCByZXBvVXJsLCAnSEVBRCddLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gb3V0cHV0LnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29tbWl0SGFzaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCkpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBbXG4gICdAdHNjb25maWcvYnVuJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLWx0cycsXG4gICdAdHNjb25maWcvbm9kZS10cycsXG4gICdAdHNjb25maWcvcmVhY3QtbmF0aXZlJyxcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAvLyBSZWFjdCBOYXRpdmUgbmVlZHMgTWV0cm8tY29tcGF0aWJsZSBzZXR0aW5ncyAoanN4OiByZWFjdC1uYXRpdmUsIG5vZGUgcmVzb2x1dGlvbiksIHdoaWNoXG4gIC8vIEB0c2NvbmZpZy9idW4gd291bGQgb3ZlcnJpZGUgZXZlbiB0aG91Z2ggdGhlIHJlcG8gdXNlcyBCdW4gYXMgaXRzIHBhY2thZ2UgbWFuYWdlci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUvdHNjb25maWcuanNvbic7XG4gIH1cbiAgcmV0dXJuICdAdHNjb25maWcvYnVuL3RzY29uZmlnLmpzb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuIFsnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSddO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9idW4nXTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1vZHVsZSBzcGVjaWZpZXIgYSBnZW5lcmF0ZWQgY29uZmlnIGZpbGUgc2hvdWxkIHVzZSB0byBsb2FkIGFcbiAqIHdpbGxib29zdGVyLWNvbmZpZ3MgY29uZmlnIHBhY2thZ2Ugc3VjaCBhcyBgQHdpbGxib29zdGVyL294bGludC1jb25maWdgLlxuICpcbiAqIE91dHNpZGUgd2lsbGJvb3N0ZXItY29uZmlncyB0aGlzIGlzIHNpbXBseSB0aGUgcHVibGlzaGVkIHBhY2thZ2UgbmFtZS4gSW5zaWRlXG4gKiB3aWxsYm9vc3Rlci1jb25maWdzIHRoZSBwYWNrYWdlIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGEgZGVwZW5kZW5jeTogdGhlXG4gKiBjb25maWcgcGFja2FnZXMgaW1wb3J0IG9uZSBhbm90aGVyIChlLmcuIG94Zm10LWNvbmZpZydzIG94bGludC5jb25maWcudHNcbiAqIGltcG9ydHMgb3hsaW50LWNvbmZpZyBhbmQgdmljZSB2ZXJzYSksIHNvIGEgZGVjbGFyZWQgZWRnZSB3b3VsZCBmb3JtIGFcbiAqIGRlcGVuZGVuY3kgY3ljbGUgdGhhdCBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlIGNhbm5vdCB0b3BvbG9naWNhbGx5IHNvcnQuIFNpbmNlXG4gKiB0aGUgZWRnZSBpcyBhYnNlbnQsIGlzb2xhdGVkIGluc3RhbGxzIGNhbm5vdCByZXNvbHZlIHRoZSBiYXJlIHBhY2thZ2UgbmFtZSwgc29cbiAqIGltcG9ydCB0aGUgY29tbWl0dGVkIGBjb25maWcubWpzYCBidWlsZCBvdXRwdXQgdGhyb3VnaCBhIHJlbGF0aXZlIHBhdGggaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZShjb25maWc6IFBhY2thZ2VDb25maWcsIGNvbmZpZ1BhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykgcmV0dXJuIGNvbmZpZ1BhY2thZ2VOYW1lO1xuXG4gIC8vIGUuZy4gJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyAtPiAnb3hsaW50LWNvbmZpZycsIHdoaWNoIGlzIGl0cyBkaXJlY3RvcnkgdW5kZXIgYHBhY2thZ2VzL2AuXG4gIGNvbnN0IGNvbmZpZ1BhY2thZ2VEaXIgPSBjb25maWdQYWNrYWdlTmFtZS5zcGxpdCgnLycpLnBvcCgpID8/ICcnO1xuICAvLyBEZXJpdmUgdGhlIHdpbGxib29zdGVyLWNvbmZpZ3Mgcm9vdCBmcm9tIHRoZSBwYWNrYWdlIGJlaW5nIGdlbmVyYXRlZCwgbm90IGZyb20gdGhlIENMSSBlbnRyeVxuICAvLyBwYXRoOiBgd2JmeSA8cmVwbz4vcGFja2FnZXMvPHBrZz5gIGlzIGEgc3VwcG9ydGVkIGludm9jYXRpb24gd2hvc2UgZW50cnkgY29uZmlnIGlzIHRoZSBjaGlsZFxuICAvLyBwYWNrYWdlIHJhdGhlciB0aGFuIHRoZSByZXBvIHJvb3QsIHNvIHJlbHlpbmcgb24gdGhlIGVudHJ5IHdvdWxkIGVtaXQgYSBuZXN0ZWQsIHVucmVzb2x2YWJsZVxuICAvLyBwYXRoIGZvciBhIGRpcmVjdGx5IHRhcmdldGVkIGNvbmZpZyBwYWNrYWdlLiBFdmVyeSB3aWxsYm9vc3Rlci1jb25maWdzIHBhY2thZ2UgaXMgZWl0aGVyIHRoZVxuICAvLyByb290IG9yIGEgZGlyZWN0IGNoaWxkIHVuZGVyIGBwYWNrYWdlcy9gLCBzbyB0aGUgcm9vdCBpcyB0aGUgcGFja2FnZSBkaXIgaXRzZWxmIG9yIGl0cyBncmFuZHBhcmVudC5cbiAgY29uc3QgcmVwb1Jvb3REaXJQYXRoID0gY29uZmlnLmlzUm9vdCA/IGNvbmZpZy5kaXJQYXRoIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLi4nLCAnLi4nKTtcbiAgY29uc3QgbG9jYWxFbnRyeSA9IHBhdGgucmVzb2x2ZShyZXBvUm9vdERpclBhdGgsICdwYWNrYWdlcycsIGNvbmZpZ1BhY2thZ2VEaXIsICdjb25maWcubWpzJyk7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGxvY2FsRW50cnkpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSA/IHJlbGF0aXZlUGF0aCA6IGAuLyR7cmVsYXRpdmVQYXRofWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmXG4gICAgIWNvbmZpZy5pc1Jvb3QgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24/LnByaXZhdGUgIT09IHRydWUgJiZcbiAgICBBcnJheS5pc0FycmF5KGNvbmZpZy5wYWNrYWdlSnNvbj8uZmlsZXMpICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uLmZpbGVzLmxlbmd0aCA+IDBcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgc29ydFBhY2thZ2VKc29uIH0gZnJvbSAnc29ydC1wYWNrYWdlLWpzb24nO1xuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzLCBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yLCB0eXBlIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNsYXNzaWZ5U2NyaXB0U2VnbWVudCwgc3BsaXRTY3JpcHRTZWdtZW50cyB9IGZyb20gJy4uL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICcuLi91dGlscy9zdHJpbmdVdGlsLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcywgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuaW1wb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyxcbiAgaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxufSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcbmltcG9ydCB7IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMsIGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyB9IGZyb20gJy4vYnVuZmlnLmpzJztcblxuY29uc3Qgb3hsaW50RGVwcyA9IFsnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsICdveGZtdCcsICdveGxpbnQnLCAnb3hsaW50LXRzZ29saW50J107XG5jb25zdCB0eXBlc2NyaXB0RGVwZW5kZW5jeSA9ICd0eXBlc2NyaXB0Jztcbi8vIFR5cGVTY3JpcHQgNydzIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGlzIHRoZSB0c2dvIG5hdGl2ZSBjb21waWxlciBhbmQgZXhwb3NlcyBub1xuLy8gcHJvZ3JhbW1hdGljIEFQSS4gTmV4dC5qcydzIGJ1aWxkLXRpbWUgYHZlcmlmeVR5cGVTY3JpcHRTZXR1cGAgbmVlZHMgdGhhdCBBUEksIHNvXG4vLyBgbmV4dCBidWlsZGAgZmFpbHMgKFwidHJ5aW5nIHRvIHVzZSBUeXBlU2NyaXB0IGJ1dCBkbyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgcGFja2FnZShzKVwiKVxuLy8gd2l0aCBvbmx5IGB0eXBlc2NyaXB0YCB2NyBpbnN0YWxsZWQuIE5leHQuanMgcmVzb2x2ZXMgdGhlIHRzZ28gYmluYXJ5IHRocm91Z2ggdGhlXG4vLyBzZXBhcmF0ZSBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgIHBhY2thZ2UsIHNvIE5leHQuanMtZmFtaWx5IHJlcG9zIG11c3QgaW5zdGFsbFxuLy8gYm90aDsgb3RoZXIgcmVwb3Mgb25seSBuZWVkIGB0eXBlc2NyaXB0YCBmb3IgYHRzY2AgdHlwZWNoZWNrcy5cbmNvbnN0IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgPSAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnO1xuY29uc3Qgd2JEZXBlbmRlbmN5ID0gJ0B3aWxsYm9vc3Rlci93Yic7XG5jb25zdCBidWlsZFRzRGVwZW5kZW5jeSA9ICdidWlsZC10cyc7XG5jb25zdCBsZWZ0aG9va0RlcGVuZGVuY3kgPSAnbGVmdGhvb2snO1xuY29uc3QgbWFuYWdlZERlcGVuZGVuY3lOYW1lcyA9IG5ldyBTZXQoW1xuICB3YkRlcGVuZGVuY3ksXG4gIGJ1aWxkVHNEZXBlbmRlbmN5LFxuICBsZWZ0aG9va0RlcGVuZGVuY3ksXG4gIHR5cGVzY3JpcHREZXBlbmRlbmN5LFxuICB0eXBlc2NyaXB0R29EZXBlbmRlbmN5LFxuICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAvLyBNaXhlZCBAdHlwZXMvYnVuIHZlcnNpb25zIGFjcm9zcyBhIG1vbm9yZXBvIGxvYWQgdHdvIGJ1bi10eXBlcyBjb3BpZXMsIHdoaWNoXG4gIC8vIGJyZWFrcyBnbG9iYWwgaW50ZXJmYWNlIG1lcmdpbmcgKGUuZy4gUmVzcG9uc2UvSGVhZGVycykgZHVyaW5nIHR5cGUgY2hlY2tpbmcuXG4gICdAdHlwZXMvYnVuJyxcbiAgLi4ub3hsaW50RGVwcyxcbl0pO1xuY29uc3QgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5jb25zdCBwYWNrYWdlQWdlR2F0ZU1zID0gYnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzICogMTAwMDtcbmNvbnN0IG5wbVBhY2thZ2VUaW1lc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG50eXBlIFdyaXRhYmxlUGFja2FnZUpzb24gPSBTZXRSZXF1aXJlZDxcbiAgUGFja2FnZUpzb24sXG4gICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcydcbj47XG5cbmludGVyZmFjZSBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIGRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgd29ya2VyVHlwZXNTY3JpcHRFcnJvciA9IGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IoY29uZmlnKTtcbiAgaWYgKHdvcmtlclR5cGVzU2NyaXB0RXJyb3IpIHRocm93IG5ldyBFcnJvcih3b3JrZXJUeXBlc1NjcmlwdEVycm9yKTtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvbk9iaiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gIHVwZGF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgZW5zdXJlVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmopO1xuICBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgcHJ1bmVDYXBhYmlsaXR5RGVwZW5kZW50Q29tcGlsZXJEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgY29uc3QgZGVwZW5kZW5jeVVwZGF0ZXMgPSBhd2FpdCBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICAvLyBPbiBhIGZpcnN0IHJ1biB0aGVyZSBpcyBubyBtYW5pZmVzdCBmb3IgYGJ1biBhZGRgIHRvIHVwZGF0ZSByZWxpYWJseS4gV3JpdGUgdGhlIHJlc29sdmVkXG4gIC8vIGRlcGVuZGVuY3kgdmVyc2lvbnMgaW50byB0aGUgbmV3IG1hbmlmZXN0IGRpcmVjdGx5OyB0aGUgZmluYWwgcmVwb3NpdG9yeS13aWRlIGBidW4gaW5zdGFsbGBcbiAgLy8gdGhlbiBpbnN0YWxscyB0aGVtIGFuZCByZW1haW5zIHRoZSBhdXRob3JpdGF0aXZlIGZhaWx1cmUgY2hlY2suXG4gIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBkZXBlbmRlbmN5VXBkYXRlcyxcbiAgICBza2lwQWRkaW5nRGVwcyB8fCAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb25cbiAgKTtcbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuICByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcblxuICBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgLy8gWWFybiByZWFkcyBwYWNrYWdlLmpzb24gZnJvbSBkaXNrIGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIGB5YXJuIGFkZCAtRGBcbiAgLy8gY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgcmVndWxhciBkZXBlbmRlbmN5LCBzbyB0aGlzIHdyaXRlIG11c3QgZmluaXNoXG4gIC8vIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlcyBiZWxvdy4gS2VlcCB0aGlzIGdlbmVyYXRlZFxuICAvLyBmaWxlIHNvcnRlZCBldmVuIHdoZW4gd2UgbGF0ZXIgcnVuIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIGZvcm1hdHRlciBzbyBhXG4gIC8vIG1pZC1ydW4gaW50ZXJydXB0aW9uIG5ldmVyIGxlYXZlcyBwYWNrYWdlLmpzb24gaW4gYSBwYXJ0aWFsbHkgbWFuYWdlZCBvcmRlci5cbiAgLy8gQSByZWZ1c2VkIHdyaXRlIChlLmcuIGEgc3ltbGlua2VkIHBhY2thZ2UuanNvbikgbXVzdCBhbHNvIGFib3J0IHRoZSBkZXBlbmRlbmN5IGluc3RhbGxhdGlvblxuICAvLyBiZWxvdzogYGJ1biBhZGRgIGZvbGxvd3MgdGhlIHN5bWxpbmsgYW5kIHdvdWxkIG1vZGlmeSB0aGUgZmlsZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqKSkpKSByZXR1cm47XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgICAvLyBBIG5ld2x5IGNyZWF0ZWQgbWFuaWZlc3QgaXMgYWxyZWFkeSBzb3J0ZWQgYnkgd2JmeSdzIGJ1bmRsZWQgc2VyaWFsaXplcjsgdGhlIHRhcmdldCBmb3JtYXR0ZXJcbiAgICAvLyBpcyBhdmFpbGFibGUgd2l0aG91dCBhbiBleHRyYSBmZXRjaCBvbmx5IHdoZW4gdGhpcyBydW4gc3RhcnRlZCB3aXRoIHBhY2thZ2UuanNvbi5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnLCBmaWxlUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBzdHJpbmcge1xuICAvLyBmc1V0aWwuZ2VuZXJhdGVGaWxlKCkgbm9ybWFsaXplcyB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28ga2VlcCB0aGUgc2VyaWFsaXplclxuICAvLyBmb2N1c2VkIG9uIHRoZSBKU09OIHBheWxvYWQgaXRzZWxmLlxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8V3JpdGFibGVQYWNrYWdlSnNvbj4ge1xuICBsZXQganNvbk9iajogUGFja2FnZUpzb24gPSB7fTtcbiAgdHJ5IHtcbiAgICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBEb2N1bWVudGF0aW9uLW9ubHkgcmVwb3NpdG9yaWVzIGhhdmUgbm8gbWFuaWZlc3Qgb24gdGhlaXIgZmlyc3Qgd2JmeSBydW4uIFN0YXJ0aW5nIGZyb20gYW5cbiAgICAvLyBlbXB0eSBvYmplY3QgbGV0cyB0aGUgbm9ybWFsIGdlbmVyYXRvciBlc3RhYmxpc2ggdGhlIHNhbWUgbWFuYWdlZCBiYXNlbGluZSBhcyBldmVyeSBvdGhlclxuICAgIC8vIHJlcG9zaXRvcnk7IG1hbGZvcm1lZCBvciB1bnJlYWRhYmxlIGV4aXN0aW5nIG1hbmlmZXN0cyBtdXN0IHN0aWxsIGZhaWwgbG91ZGx5LlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnRU5PRU5UJykgdGhyb3cgZXJyb3I7XG4gIH1cbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzID8/IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPz8ge307XG4gIHJldHVybiBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb247XG59XG5cbmZ1bmN0aW9uIHBydW5lQ2FwYWJpbGl0eURlcGVuZGVudENvbXBpbGVyRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICAvLyBSdW4gYmVmb3JlIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucywgd2hpY2ggcmUtYWRkcyB0c2dvIG9ubHkgZm9yIGN1cnJlbnQgTmV4dC5qcy1mYW1pbHkgcmVwb3NpdG9yaWVzLlxuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbdHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0R29EZXBlbmRlbmN5XTtcbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xufVxuXG4vKipcbiAqIEtlZXBzIHRoZSBwcm9qZWN0J3Mgb3duIHNlZ21lbnRzIGluIG9yZGVyLCByZXBsYWNpbmcgdGhlIGZpcnN0IG1hbmFnZWQgZ2VuLWNvZGUgc3BlbGxpbmcgd2l0aFxuICogYGJ1biB3YiBnZW4tY29kZWAgYW5kIGRyb3BwaW5nIGxhdGVyIGR1cGxpY2F0ZXMuIEFwcGVuZHMgZ2VuZXJhdGlvbiBvbmx5IHdoZW4gdGhlIHNjcmlwdFxuICogY29udGFpbmVkIG5vbmUsIHNvIG5vdGhpbmcgaXMgcmVvcmRlcmVkLlxuICovXG5mdW5jdGlvbiByZWJ1aWxkUG9zdGluc3RhbGxTZWdtZW50cyhzZWdtZW50czogc3RyaW5nW10sIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGtpbmRzID0gc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwgc2NyaXB0cywgdHJ1ZSkpO1xuICAvLyBBIHdyYXBwZXIgYXJvdW5kIGEgY3VzdG9taXplZCBnZW4tY29kZSBhbHJlYWR5IGdlbmVyYXRlczsgYWRkaW5nIGFub3RoZXIgaW52b2NhdGlvbiB3b3VsZCBydW4gZXZlcnlcbiAgLy8gZ2VuZXJhdG9yIHR3aWNlLlxuICBsZXQgZ2VuZXJhdGlvblBsYWNlZCA9IGtpbmRzLmluY2x1ZGVzKCdnZW5Db2RlV3JhcHBlcicpO1xuICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2luZGV4LCBzZWdtZW50XSBvZiBzZWdtZW50cy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBraW5kID0ga2luZHNbaW5kZXhdO1xuICAgIGlmIChraW5kID09PSAnY3VzdG9tJyB8fCBraW5kID09PSAnZ2VuQ29kZVdyYXBwZXInKSB7XG4gICAgICByZXN1bHQucHVzaChzZWdtZW50KTtcbiAgICB9IGVsc2UgaWYgKCFnZW5lcmF0aW9uUGxhY2VkKSB7XG4gICAgICByZXN1bHQucHVzaCgnYnVuIHdiIGdlbi1jb2RlJyk7XG4gICAgICBnZW5lcmF0aW9uUGxhY2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFnZW5lcmF0aW9uUGxhY2VkKSByZXN1bHQucHVzaCgnYnVuIHdiIGdlbi1jb2RlJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBtYW5hZ2VkIGdlbi1jb2RlIHNlZ21lbnRzIHdoaWxlIGtlZXBpbmcgdGhlIGZpcnN0IHNlZ21lbnQncyBwb3NpdGlvbiBzbyBhIGN1c3RvbVxuICogc3RlcCB0aGF0IGNvbnN1bWVzIGdlbmVyYXRlZCBvdXRwdXQgc3RpbGwgcnVucyBhZnRlciBpdC4gUmV0dXJucyB3aXRob3V0IGNoYW5naW5nIGFuXG4gKiB1bnBhcnNlYWJsZSBzY3JpcHQuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsIG1hbmFnZXNXb3JrZXJUeXBlczogYm9vbGVhbik6IHZvaWQge1xuICAvLyBgYnVuIHdiIGdlbi1jb2RlYCByZWdlbmVyYXRlcyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGl0c2VsZiwgc28gYSBwYWNrYWdlIHdpdGggYVxuICAvLyBjb2RlLWdlbmVyYXRpb24gb3Igd29ya2VyLXR5cGVzIHBpcGVsaW5lIGdldHMgb25lIG1hbmFnZWQgZ2VuZXJhdGlvbiBzZWdtZW50LlxuICBpZiAoc2NyaXB0c1snZ2VuLWNvZGUnXSB8fCBtYW5hZ2VzV29ya2VyVHlwZXMpIHtcbiAgICAvLyBQcm9qZWN0LW93bmVkIHN0ZXBzIGFyZSBuZXZlciBkcm9wcGVkLCBhbmQgdGhlaXIgUE9TSVRJT04gcmVsYXRpdmUgdG8gZ2VuZXJhdGlvbiBpcyBwcmVzZXJ2ZWQ6IGEgc3RlcFxuICAgIC8vIGJlZm9yZSBpdCBtYXkgcHJvZHVjZSBgd3JhbmdsZXIgdHlwZXNgJyBpbnB1dHMgKGEgd3JhbmdsZXIgY29uZmlnLCBgLmRldi52YXJzYCksIHdoaWxlIG9uZSBhZnRlciBpdCBtYXlcbiAgICAvLyBjb25zdW1lIHRoZSBnZW5lcmF0ZWQgdHlwZXMuIFNvIHRoZSBtYW5hZ2VkIGdlbmVyYXRpb24gcmVwbGFjZXMgdGhlIGZpcnN0IG1hbmFnZWQgc2VnbWVudCBpbiBwbGFjZSwgYW5kIGlzXG4gICAgLy8gYXBwZW5kZWQgb25seSB3aGVuIHRoZSBzY3JpcHQgaGFkIG5vbmUuIEEgd3JhcHBlciBhcm91bmQgYSBjdXN0b21pemVkIGdlbi1jb2RlIGFscmVhZHkgcGVyZm9ybXMgdGhlXG4gICAgLy8gZ2VuZXJhdGlvbiBwbHVzIHRoZSBwcm9qZWN0J3Mgb3duIHN0ZXBzLCBzbyBpdCBzdXBwcmVzc2VzIHRoZSByZXBsYWNlbWVudCBlbnRpcmVseS5cbiAgICBjb25zdCBzZWdtZW50cyA9IHNjcmlwdHMucG9zdGluc3RhbGwgPT09IHVuZGVmaW5lZCA/IFtdIDogc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsKTtcbiAgICBjb25zdCBrZXB0U2VnbWVudHMgPSBzZWdtZW50cyAmJiByZWJ1aWxkUG9zdGluc3RhbGxTZWdtZW50cyhzZWdtZW50cywgc2NyaXB0cyk7XG4gICAgaWYgKGtlcHRTZWdtZW50cykge1xuICAgICAgc2NyaXB0cy5wb3N0aW5zdGFsbCA9IGtlcHRTZWdtZW50cy5qb2luKCcgJiYgJyk7XG4gICAgfVxuICAgIC8vIEFueSBvdGhlciB1bnBhcnNlYWJsZSBwb3N0aW5zdGFsbCBpcyBsZWZ0IHRvIGEgaHVtYW4gcmF0aGVyIHRoYW4gcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxEZXBlbmRlbmN5VXBkYXRlcz4ge1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG5cbiAgaWYgKFxuICAgIGhhc0phdmEgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIC8vIExlZnRob29rIGdlbmVyYXRpb24gaXMgYmVzdC1lZmZvcnQgYW5kIC5sZWZ0aG9vayBpcyBhYnNlbnQgZnJvbSBEb2NrZXIgYnVpbGQgY29udGV4dHMsIHNvIGFcbiAgICAvLyBtaXNzaW5nIG5vcm1hbGl6ZXIgaXMgdmFsaWQuIE9uY2UgcHJlc2VudCwgaXRzIGZhaWx1cmUgbXVzdCBhYm9ydCBpbnN0YWxsIHJhdGhlciB0aGFuIGxlYXZlIGFcbiAgICAvLyBHdWFyZC1waW5uZWQgbG9ja2ZpbGUgYmVoaW5kOyBrZWVwIHRoYXQgZmFpbC1mYXN0IGdyb3VwaW5nIGV4cGxpY2l0IGJlZm9yZSBhbnkgd29ya3NwYWNlIGJ1aWxkLlxuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID1cbiAgICAgICcoYnVuIGxlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSkgJiYgKHRlc3QgISAtZiAubGVmdGhvb2svbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCB8fCBiYXNoIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoKSc7XG4gICAgLy8gV2hlbiBAd2lsbGJvb3N0ZXIvd2IgaXMgYSB3b3Jrc3BhY2Ugb2YgdGhpcyByZXBvc2l0b3J5LCB0aGUgZ2VuZXJhdGVkIGBidW4gd2Ig4oCmYCBzY3JpcHRzIHJ1blxuICAgIC8vIGl0cyBnaXRpZ25vcmVkIGRpc3QgYnVpbGQgKGJpbi9pbmRleC5qcyBpbXBvcnRzIC4uL2Rpc3QvaW5kZXguanMpLCBzbyBhIGZyZXNoIGNoZWNrb3V0IG11c3RcbiAgICAvLyBidWlsZCBpdCBkdXJpbmcgaW5zdGFsbDsgcmVnaXN0cnkgaW5zdGFsbHMgc2hpcCBhIHByZWJ1aWx0IGRpc3QgYW5kIG5lZWQgbm8gZXh0cmEgc3RlcC5cbiAgICBjb25zdCB3YldvcmtzcGFjZURpciA9IGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLmdldCh3YkRlcGVuZGVuY3kpO1xuICAgIGlmICh3YldvcmtzcGFjZURpcikge1xuICAgICAgLy8gU2luZ2xlIHF1b3RlcyAod2l0aCBlbWJlZGRlZCBxdW90ZXMgZXNjYXBlZCkgcHJldmVudCB0aGUgc2hlbGwgZnJvbSBleHBhbmRpbmcgYCQo4oCmKWAgb3JcbiAgICAgIC8vIHZhcmlhYmxlcyB0aGF0IGEgaG9zdGlsZSBkaXJlY3RvcnkgbmFtZSBjb3VsZCBzbXVnZ2xlIGludG8gdGhlIGdlbmVyYXRlZCBzY3JpcHQuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSArPSBgICYmIGJ1biBydW4gLS1jd2QgJyR7d2JXb3Jrc3BhY2VEaXIucmVwbGFjZUFsbChcIidcIiwgU3RyaW5nLnJhd2AnXFwnJ2ApfScgYnVpbGRgO1xuICAgIH1cbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChsZWZ0aG9va0RlcGVuZGVuY3kpO1xuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoZG9lc1JlbGVhc2VTY3JpcHRJbnN0YWxsU2VtYW50aWNSZWxlYXNlKGpzb25PYmouc2NyaXB0cy5yZWxlYXNlKSkge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzLmFydGlsbGVyeSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5hcnRpbGxlcnk7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRSdW50aW1lKSB7XG4gICAgICAgIC8vIFJ1bnRpbWUgaW1wb3J0cyBuZWVkIHRoZSBzdGFuZGFsb25lIHBhY2thZ2UgYWZ0ZXIgRG9ja2VyIHBydW5pbmcgcmVtb3ZlcyBkZXZEZXBlbmRlbmNpZXMuXG4gICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz89XG4gICAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCA/P1xuICAgICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gPz9cbiAgICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddO1xuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaCgncGxheXdyaWdodCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby4gWWFybiB2MSdzIG9iamVjdCBmb3JtIGtlZXBzIGl0c1xuICAgICAgLy8gZGVjbGFyZWQgcGF0dGVybnMgKHdvcmtzcGFjZXMucGFja2FnZXMpOyBvbmx5IGV4dHJhcyBzdWNoIGFzIG5vaG9pc3QgYXJlIGRyb3BwZWQuXG4gICAgICAvLyBGb3JjZSBgcGFja2FnZXMvKmAgb25seSB3aGVuIGl0IGFjdHVhbGx5IG1hdGNoZXMgYSB3b3Jrc3BhY2UgbWFuaWZlc3Q6IGFuIGFwcHMvKi1vbmx5XG4gICAgICAvLyBtb25vcmVwbyBtdXN0IG5vdCBnZXQgYSBuZXZlci1tYXRjaGluZyBwYXR0ZXJuIGFwcGVuZGVkIHRvIGl0cyBkZWNsYXJhdGlvbi4gQVxuICAgICAgLy8gYmFzZWxpbmUtc2VlZGluZyBkZWNsYXJhdGlvbiBuZWVkcyBubyBmb3JjZWQgcGF0dGVybiBhdCBhbGwg4oCUIHRoZSBzZWVkZWQgYmFzZWxpbmVcbiAgICAgIC8vIChgKi8qYCBvciBgKipgKSBhbHJlYWR5IGNvdmVycyBwYWNrYWdlcy8qLiBUaGUgZm9yY2VkIHBhdHRlcm4gaXMgUFJFUEVOREVEOiBCdW5cbiAgICAgIC8vIGV2YWx1YXRlcyB3b3Jrc3BhY2UgcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBhIHBvc2l0aXZlIHBhdHRlcm4gcGxhY2VkIGFmdGVyIGEgdXNlclxuICAgICAgLy8gbmVnYXRpb24gd291bGQgcmUtaW5jbHVkZSB0aGUgbmVnYXRlZCBwYWNrYWdlcy4gQSBkZWNsYXJhdGlvbiB0aGF0IGFscmVhZHkgY292ZXJzXG4gICAgICAvLyBwYWNrYWdlcy8qIHVuZGVyIG5vcm1hbGl6YXRpb24gKGUuZy4gYC4vcGFja2FnZXMvKmApIGlzIGtlcHQgdmVyYmF0aW06IGZvcmNpbmcgYSB0ZXh0dWFsXG4gICAgICAvLyBgcGFja2FnZXMvKmAgbmV4dCB0byBpdCB3b3VsZCBwZXJzaXN0IGEgZHVwbGljYXRlIGVxdWl2YWxlbnQgcGF0dGVybi5cbiAgICAgIGNvbnN0IGZvcmNlZFBhdHRlcm5zID1cbiAgICAgICAgIWhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUoanNvbk9iai53b3Jrc3BhY2VzKSAmJlxuICAgICAgICAhaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKGpzb25PYmoud29ya3NwYWNlcykgJiZcbiAgICAgICAgZmcuZ2xvYlN5bmMoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywgeyBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfSkubGVuZ3RoID4gMFxuICAgICAgICAgID8gWydwYWNrYWdlcy8qJ11cbiAgICAgICAgICA6IFtdO1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gbWVyZ2UuYWxsKFtmb3JjZWRQYXR0ZXJucywgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhqc29uT2JqLndvcmtzcGFjZXMpXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICB9KTtcbiAgICAgIC8vIEJvdGggaW5wdXRzIGNhbiBiZSBlbXB0eSAoZS5nLiBwYWNrYWdlcy9wYWNrYWdlLmpzb24gd2l0aG91dCBhbnkgcGFja2FnZXMvKi9wYWNrYWdlLmpzb25cbiAgICAgIC8vIGFuZCBubyBkZWNsYXJlZCB3b3Jrc3BhY2VzKTsgZG8gbm90IHBlcnNpc3QgYSBtZWFuaW5nbGVzcyBgd29ya3NwYWNlczogW11gLlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSAmJiBqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpeGVycy9uZXh0Q29uZmlnLnRzIGVuYWJsZXMgYHJlYWN0Q29tcGlsZXI6IHRydWVgIGZvciBldmVyeSBOZXh0LmpzIHByb2plY3QsIGFuZCBOZXh0LmpzXG4gIC8vIHJlc29sdmVzIGBiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXJgIGF0IGJ1aWxkIHRpbWUgd2hlbiBSZWFjdCBDb21waWxlciBpcyBvbi4gQWRkIGl0IGhlcmUgc29cbiAgLy8gdGhlIG1hbmFnZWQgbmV4dC5jb25maWcgbmV2ZXIgYnJlYWtzIGBuZXh0IGJ1aWxkYCB3aXRoIGFuIHVucmVzb2x2ZWQtcGFja2FnZSBlcnJvci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXInKTtcbiAgfVxuXG4gIC8vIGB3YiB2ZXJpZnkgLS1mdWxsYCBhdWRpdHMgZXZlcnkgYCouc2xpZGV2Lm1kYCBkZWNrIHdpdGggc2xpZGV2LWNoZWNrLCBzbyB0aGUgY2hlY2tlciBoYXMgdG8gYmVcbiAgLy8gaW5zdGFsbGVkIHdoZXJldmVyIGEgZGVjayBsaXZlcy5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblNsaWRldk1kKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NsaWRldi1jaGVjaycpO1xuICB9XG5cbiAgaWYgKCFpc1diUGFja2FnZShqc29uT2JqKSkge1xuICAgIC8vIEEgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBkZXBlbmRzIG9uIHRoZSB3YiBkZXZlbG9wZWQgaW4gdGhpcyByZXBvc2l0b3J5IChlLmcuXG4gICAgLy8gV2lsbEJvb3N0ZXIvc2hhcmVkIGl0c2VsZik7IGluc3RhbGxpbmcgdGhlIGxhdGVzdCByZWdpc3RyeSByZWxlYXNlIG92ZXIgaXQgd291bGQgc2lsZW50bHlcbiAgICAvLyByZXBsYWNlIHRoZSBsb2NhbCBidWlsZCB3aXRoIGEgcHVibGlzaGVkIG9uZSwgc28gbGVhdmUgc3VjaCBhIGRlY2xhcmF0aW9uIHVudG91Y2hlZC5cbiAgICBjb25zdCB3YlNwZWNpZmllciA9IGpzb25PYmouZGVwZW5kZW5jaWVzW3diRGVwZW5kZW5jeV0gPz8ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbd2JEZXBlbmRlbmN5XTtcbiAgICBpZiAoIXdiU3BlY2lmaWVyPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgIGlmIChzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBidWlsZC10cyBvd25zIFR5cGVTY3JpcHQgZXhlY3V0aW9uIGFuZCBkZWNsYXJhdGlvbiBlbWl0LiB3YmZ5IG11c3QgYWx3YXlzXG4gIC8vIGtlZXAgZXhpc3RpbmcgYnVpbGQtdHMgdXNlcnMgY3VycmVudCBiZWNhdXNlIG9sZGVyIHJlbGVhc2VzIGNhbiBlbWl0IC5kLnRzXG4gIC8vIGZpbGVzIGF0IHBhdGhzIHRoYXQgbm8gbG9uZ2VyIG1hdGNoIHBhY2thZ2UgZXhwb3J0cy5cbiAgaWYgKFxuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIE9iamVjdC52YWx1ZXMoanNvbk9iai5zY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHNjcmlwdD8uaW5jbHVkZXMoYnVpbGRUc0RlcGVuZGVuY3kpKVxuICApIHtcbiAgICBpZiAoc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5veGxpbnREZXBzKTtcbiAgfVxuXG4gIGNvbnN0IHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKSA6IFtdO1xuICBhd2FpdCByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqLCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi50c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlLCBzbyBpdCBpc1xuICAgIC8vIG5vdyB0aGUgbWFuYWdlZCBjb21waWxlciBmb3IgZXZlcnkgVHlwZVNjcmlwdCByZXBvICh0eXBlY2hlY2tpbmcgcnVucyBgdHNjYCkuXG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdERlcGVuZGVuY3kpO1xuICAgIC8vIE5leHQuanMncyBgbmV4dCBidWlsZGAgaW5zcGVjdHMgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgdG8gcnVuIGl0cyB0eXBlXG4gICAgLy8gY2hlY2s7IHRoZSBgdHlwZXNjcmlwdGAgdjcgcGFja2FnZSBhbG9uZSBsYWNrcyB0aGUgQVBJIG5leHQgbmVlZHMsIHNvIGtlZXAgYm90aFxuICAgIC8vIGluc3RhbGxlZCBmb3IgTmV4dC5qcy1mYW1pbHkgcmVwb3MuIFNlZSB0aGUgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSBjb21tZW50IGFib3ZlLlxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdEdvRGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIC8vIFJlYWN0IE5hdGl2ZSByZWxpZXMgb24gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSdzIGFtYmllbnQgdHlwZXMgaW5zdGVhZCBvZiBAdHlwZXMvYnVuLlxuICAgIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ3RzLWplc3QnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICAgICkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9qZXN0Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIHJldHVybiB7XG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIGRldkRlcGVuZGVuY2llczogZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgcHl0aG9uRGV2RGVwZW5kZW5jaWVzIH07XG59XG5cbmZ1bmN0aW9uIGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShzY3JpcHQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBzY3JpcHQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAvXFxiKD86YnVueHxucHh8cG5wbVxccytkbHh8eWFyblxccytkbHgpXFxzK3NlbWFudGljLXJlbGVhc2UoPzpAXFxTKyk/XFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2RlcGVuZGVuY3ksIGtlZXBBc1J1bnRpbWVdIG9mIFtcbiAgICBbd2JEZXBlbmRlbmN5LCBzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopXSxcbiAgICBbYnVpbGRUc0RlcGVuZGVuY3ksIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gIF0gYXMgY29uc3QpIHtcbiAgICBpZiAoa2VlcEFzUnVudGltZSkge1xuICAgICAgY29uc3QgZGV2VmVyc2lvbiA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFkZXZWZXJzaW9uKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9uID0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIXJ1bnRpbWVWZXJzaW9uIHx8IGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihkZXZWZXJzaW9uLCBydW50aW1lVmVyc2lvbikpIHtcbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBkZXZWZXJzaW9uO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIH0gZWxzZSBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIHtcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID8/PSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICAvLyBQcm9kdWN0aW9uIGltYWdlcyBydW4gbWlncmF0aW9ucyBhZnRlciBkZXZEZXBlbmRlbmNpZXMgYXJlIHBydW5lZCwganVzdCBhcyBwYWNrYWdlIG1hbmFnZXJzXG4gIC8vIHJ1biBwb3N0aW5zdGFsbCBkdXJpbmcgcHJvZHVjdGlvbiBpbnN0YWxscywgc28gYm90aCBlbnRyeSBwb2ludHMgbXVzdCByZXRhaW4gdGhlIHdiIGJpbmFyeS5cbiAgLy8gS2VlcCB0aGUgd29yZCBtYXRjaCBjb25zZXJ2YXRpdmU6IHN1cHBvcnRlZCBjdXN0b20gd3JhcHBlcnMgY2FuIHB1dCB3YiBpbnNpZGUgc2hlbGwgbG9vcHMgdGhhdFxuICAvLyB0aGUgY29tbWFuZC1wb3NpdGlvbiBwYXJzZXIgY2Fubm90IGNsYXNzaWZ5LCB3aGlsZSBhIGZhbHNlIHBvc2l0aXZlIG9ubHkgcmV0YWlucyB0aGUgQ0xJLlxuICByZXR1cm4gW2pzb25PYmouc2NyaXB0cz8ucG9zdGluc3RhbGwsIGpzb25PYmouc2NyaXB0cz8uWydkYi1taWdyYXRlJ11dLnNvbWUoXG4gICAgKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgL1xcYndiXFxiL3UudGVzdChzY3JpcHQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICBjb25zdCBwcmlzbWEgPSBqc29uT2JqLnByaXNtYSBhcyB7IHNlZWQ/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHByaXNtYT8uc2VlZCkgfHwgZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhqc29uT2JqLnNjcmlwdHM/LnNlZWQpO1xufVxuXG5mdW5jdGlvbiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHNlZWRDb21tYW5kOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIC8vIFByb2R1Y3Rpb24gRG9ja2VyIGltYWdlcyBydW4gc2VlZCBzY3JpcHRzIGFmdGVyIGRldkRlcGVuZGVuY2llcyBhcmUgcHJ1bmVkLFxuICAvLyBzbyBUeXBlU2NyaXB0IHNlZWQgcnVubmVycyBtdXN0IHJlbWFpbiBhdmFpbGFibGUgYXQgcnVudGltZS5cbiAgcmV0dXJuIHR5cGVvZiBzZWVkQ29tbWFuZCA9PT0gJ3N0cmluZycgJiYgLyg/PCFbXFx3LV0pYnVpbGQtdHMoPyFbXFx3LV0pL3UudGVzdChzZWVkQ29tbWFuZCk7XG59XG5cbmNvbnN0IGRlcGVuZGVuY3lEZWNsYXJhdGlvblNlY3Rpb25zID0gW1xuICAnZGVwZW5kZW5jaWVzJyxcbiAgJ2RldkRlcGVuZGVuY2llcycsXG4gICdvcHRpb25hbERlcGVuZGVuY2llcycsXG4gICdwZWVyRGVwZW5kZW5jaWVzJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogRm9yY2VzIHN0b3JlLWluY29tcGF0aWJsZSBwYWNrYWdlcyB0byBzdGF5IHByb2plY3QtbG9jYWwgd2hlbiB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIGVuYWJsZXNcbiAqIEJ1bidzIGdsb2JhbCBzdG9yZTogYGNoYWtyYSB0eXBlZ2VuYCAocnVuIGJ5IGB3YiBnZW4tY29kZWApXG4gKiB3cml0ZXMgZ2VuZXJhdGVkIHR5cGVzIGludG8gdGhlIGluc3RhbGxlZCBAY2hha3JhLXVpL3JlYWN0IHBhY2thZ2UsIHdoaWNoIHdvdWxkIG90aGVyd2lzZVxuICogbXV0YXRlIHRoZSBtYWNoaW5lLXdpZGUgc3RvcmUgc2hhcmVkIGFjcm9zcyByZXBvc2l0b3JpZXMsIGFuZCBkcml6emxlLWtpdCByZXF1aXJlcyBkcml6emxlLW9ybVxuICogd2l0aG91dCBkZWNsYXJpbmcgaXQsIHdoaWNoIHRoZSBzdG9yZSByZWFscGF0aCBwbGFjZXMgYmV5b25kIGEgcGxhaW4gbm9kZV9tb2R1bGVzIHdhbGstdXAuXG4gKiBMaXN0aW5nIHRoZW0gaW4gYHRydXN0ZWREZXBlbmRlbmNpZXNgIG1ha2VzIEJ1biBtYXRlcmlhbGl6ZSBhIHBlci1wcm9qZWN0IGNvcHkgdW5kZXJcbiAqIGBub2RlX21vZHVsZXMvLmJ1bi9gLCB3aG9zZSBzaWJsaW5nIGBub2RlX21vZHVsZXMvLmJ1bi9ub2RlX21vZHVsZXMvYCBsaW5rcyBldmVyeSBpbnN0YWxsZWRcbiAqIHBhY2thZ2UgYW5kIHRoZXJlZm9yZSByZXNvbHZlcyB0aGUgdW5kZWNsYXJlZCByZXF1aXJlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQnVuIGNvbnN1bHRzIHRydXN0ZWREZXBlbmRlbmNpZXMgaW4gdGhlIHdvcmtzcGFjZSByb290J3MgcGFja2FnZS5qc29uIG9ubHksIHNvIHRoZSBsaXN0IGlzXG4gIC8vIG1hbmFnZWQgdGhlcmUgYW5kIG11c3QgY292ZXIgZGVwZW5kZW5jaWVzIGRlY2xhcmVkIGFueXdoZXJlIGluIHRoZSByZXBvc2l0b3J5LlxuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcbiAgY29uc3QgYnVuSnNvbk9iaiA9IGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbiAmIHsgdHJ1c3RlZERlcGVuZGVuY2llcz86IHN0cmluZ1tdIH07XG4gIC8vIEJ1biBpbnN0YWxscyBvcHRpb25hbCBhbmQgcGVlciBkZXBlbmRlbmNpZXMgYnkgZGVmYXVsdCwgc28gYWxsIGRlY2xhcmF0aW9uIHNlY3Rpb25zIGNvdW50LlxuICAvLyBFdmVyeSBkZWNsYXJlZCByYW5nZSBpcyBrZXB0IHBlciBwYWNrYWdlOiBhIHJvb3QgZGVjbGFyYXRpb24gbXVzdCBub3QgbWFzayBhIHdvcmtzcGFjZSBvbmVcbiAgLy8gKGUuZy4gcm9vdCBAY2hha3JhLXVpL2NsaSB2MiBhbG9uZ3NpZGUgYSB3b3Jrc3BhY2Ugb24gdjMpLlxuICBjb25zdCBkZWNsYXJlZERlcGVuZGVuY2llcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMgPSAocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGRlcGVuZGVuY3lEZWNsYXJhdGlvblNlY3Rpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5TmFtZSwgdmVyc2lvblJhbmdlXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlSnNvbltzZWN0aW9uXSA/PyB7fSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uUmFuZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgdmVyc2lvblJhbmdlcyA9IGRlY2xhcmVkRGVwZW5kZW5jaWVzLmdldChkZXBlbmRlbmN5TmFtZSk7XG4gICAgICAgICAgaWYgKHZlcnNpb25SYW5nZXMpIHtcbiAgICAgICAgICAgIHZlcnNpb25SYW5nZXMucHVzaCh2ZXJzaW9uUmFuZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWNsYXJlZERlcGVuZGVuY2llcy5zZXQoZGVwZW5kZW5jeU5hbWUsIFt2ZXJzaW9uUmFuZ2VdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGNvbmZpZykpIHtcbiAgICB0cnkge1xuICAgICAgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMoXG4gICAgICAgIEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvblxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSB1bnJlYWRhYmxlIHdvcmtzcGFjZSBwYWNrYWdlLmpzb25cbiAgICB9XG4gIH1cbiAgLy8gT25seSBAY2hha3JhLXVpL2NsaSB2MydzIGBjaGFrcmEgdHlwZWdlbmAgd3JpdGVzIGludG8gdGhlIGluc3RhbGxlZCBAY2hha3JhLXVpL3JlYWN0O1xuICAvLyB2MidzIGBjaGFrcmEtY2xpIHRva2Vuc2Agd3JpdGVzIGludG8gQGNoYWtyYS11aS9zdHlsZWQtc3lzdGVtIGluc3RlYWQsIHNvIHRydXN0aW5nXG4gIC8vIEBjaGFrcmEtdWkvcmVhY3QgdGhlcmUgd291bGQgZm9yY2UgYSB1c2VsZXNzIHByb2plY3QtbG9jYWwgY29weSB3aXRob3V0IGZpeGluZyBnZW4tY29kZS5cbiAgLy8gTWlycm9yIHdiIGdlbi1jb2RlJ3MgY2xhc3NpZmljYXRpb246IG9ubHkgYSByYW5nZSB3aG9zZSBsZWFkaW5nIG1ham9yIHBhcnNlcyB0byAyIHNlbGVjdHMgdGhlXG4gIC8vIHYyIGNvbW1hbmQsIHNvIGRpZ2l0bGVzcyBzcGVjcyBsaWtlIGBsYXRlc3RgIG9yIGNhdGFsb2cgcmVmZXJlbmNlcyBjb3VudCBhcyB2My5cbiAgY29uc3QgaGFzQ2hha3JhQ2xpVjMgPSAoZGVjbGFyZWREZXBlbmRlbmNpZXMuZ2V0KCdAY2hha3JhLXVpL2NsaScpID8/IFtdKS5zb21lKFxuICAgICh2ZXJzaW9uUmFuZ2UpID0+IC9cXGQrL3UuZXhlYyh2ZXJzaW9uUmFuZ2UpPy5bMF0gIT09ICcyJ1xuICApO1xuICBjb25zdCByZXF1aXJlZFdiZnlQYWNrYWdlcyA9IFtcbiAgICAuLi4oaGFzQ2hha3JhQ2xpVjMgJiYgZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAY2hha3JhLXVpL3JlYWN0JykgPyBbJ0BjaGFrcmEtdWkvcmVhY3QnXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdkcml6emxlLWtpdCcpID8gWydkcml6emxlLWtpdCddIDogW10pLFxuICAgIC8vIFRoZXNlIGdpdC1kZXBlbmRlbmN5IGJ1aWxkcyBpbXBvcnQgcGFja2FnZXMgdGhleSBkbyBub3QgZGVjbGFyZSAoZS5nLiB6b2QpLCB3aGljaCB0aGVcbiAgICAvLyBnbG9iYWwtc3RvcmUgbGF5b3V0IHBsYWNlcyBiZXlvbmQgdGhlaXIgd2Fsay11cDsgYSBwcm9qZWN0LWxvY2FsIGNvcHkgdW5kZXJcbiAgICAvLyBub2RlX21vZHVsZXMvLmJ1biByZXNvbHZlcyB0aGVtIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9wcm9tcHQtc3R1ZHkpLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpID8gWydAd2lsbGJvb3N0ZXIvanVkZ2UnXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgPyBbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXSA6IFtdKSxcbiAgICAvLyBibGl0eiBhbmQgQGJsaXR6anMvYXV0aCByZXF1aXJlIHJlYWN0IChhbmQgb3RoZXIgcGVlcnMpIHdpdGhvdXQgZGVjbGFyaW5nIHRoZW0sIHJlbHlpbmcgb25cbiAgICAvLyBob2lzdGluZywgd2hpY2ggdGhlIGdsb2JhbC1zdG9yZSBsYXlvdXQgcGxhY2VzIGJleW9uZCB0aGVpciB3YWxrLXVwIChvYnNlcnZlZCBpblxuICAgIC8vIFdpbGxCb29zdGVyL3N1cnZleS1zeXN0ZW06IGBuZXh0IGJ1aWxkYCBwYWdlLWRhdGEgY29sbGVjdGlvbiBkaWVzIHdpdGggXCJDYW5ub3QgZmluZCBtb2R1bGVcbiAgICAvLyAncmVhY3QnXCIgZnJvbSBAYmxpdHpqcy9hdXRoKS4gQGJsaXR6anMvcnBjIGlzIE5PVCBsaXN0ZWQgYmVjYXVzZSBpdCBwcm9wZXJseSBkZWNsYXJlcyBpdHNcbiAgICAvLyByZWFjdC9AdGFuc3RhY2sgcGVlcnMsIHNvIEJ1biBsaW5rcyB0aGVtIGludG8gaXRzIHN0b3JlIGVudHJ5LiBAYmxpdHpqcy9uZXh0IGlzXG4gICAgLy8gZGVsaWJlcmF0ZWx5IE5PVCBsaXN0ZWQgZWl0aGVyOiB0cnVzdGluZyBpdCB3b3VsZCBydW4gaXRzIHBvc3RpbnN0YWxsIChgYmxpdHogY29kZWdlbmApLFxuICAgIC8vIHdoaWNoIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW4gcGxhY2Ug4oCUIHJlcG9zaXRvcmllcyBwYXRjaCBvdXQgdGhhdCBwb3N0aW5zdGFsbFxuICAgIC8vIHdpdGggYGJ1biBwYXRjaGAgaW5zdGVhZCwgd2hpY2ggYWxzbyBrZWVwcyB0aGUgcGFja2FnZSBwcm9qZWN0LWxvY2FsLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ2JsaXR6JykgPyBbJ2JsaXR6J10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGJsaXR6anMvYXV0aCcpID8gWydAYmxpdHpqcy9hdXRoJ10gOiBbXSksXG4gICAgLy8gQnVuIGRvZXMgbm90IGxpbmsgQGhvb2tmb3JtL3Jlc29sdmVycycgT1BUSU9OQUwgdmFsaWRhdG9yIHBlZXJzIChlLmcuIHpvZCkgaW50byBpdHNcbiAgICAvLyBnbG9iYWwtc3RvcmUgZW50cnkgZXZlbiB3aGVuIHRoZSBwcm9qZWN0IGluc3RhbGxzIHRoZW0sIHNvIGl0cyBzZXJ2ZXItc2lkZVxuICAgIC8vIGBpbXBvcnQgJ3pvZCdgIGZhaWxzIGZyb20gdGhlIHN0b3JlIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtKS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAaG9va2Zvcm0vcmVzb2x2ZXJzJykgPyBbJ0Bob29rZm9ybS9yZXNvbHZlcnMnXSA6IFtdKSxcbiAgICAvLyBAem9vbS9ydG1zIGluc3RhbGxzIGl0cyBuYXRpdmUgcnRtcy5ub2RlIGJpbmRpbmcgaW4gYSBsaWZlY3ljbGUgc2NyaXB0LiBXaXRob3V0IGV4cGxpY2l0XG4gICAgLy8gdHJ1c3QsIEJ1biBza2lwcyB0aGF0IHNjcmlwdCBhbmQgdGhlIHBhY2thZ2UgZmFpbHMgYXMgc29vbiBhcyB0aGUgWm9vbSBib3QgaW1wb3J0cyBpdFxuICAgIC8vIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zbWFydHNlLXpvb20tYm90KS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAem9vbS9ydG1zJykgPyBbJ0B6b29tL3J0bXMnXSA6IFtdKSxcbiAgXTtcblxuICAvLyB3YmZ5IGZ1bGx5IG93bnMgdGhpcyBmaWVsZDogYSBwYWNrYWdlIHdob3NlIGxpZmVjeWNsZSBzY3JpcHRzIG11c3QgcnVuIGdldHMgYWRkZWQgdG8gd2JmeVxuICAvLyBpdHNlbGYgaW5zdGVhZCBvZiB0byBpbmRpdmlkdWFsIHJlcG9zaXRvcmllcywgc28gdW5tYW5hZ2VkIGVudHJpZXMgYXJlIGFsd2F5cyByZW1vdmVkIOKAlFxuICAvLyBpbmNsdWRpbmcgYW4gZXhwbGljaXRseSBlbXB0eSBkZW55LWFsbCBsaXN0LCB3aG9zZSBkZWxldGlvbiBkZWxpYmVyYXRlbHkgcmVzdG9yZXMgQnVuJ3NcbiAgLy8gZGVmYXVsdCBhbGxvdy1saXN0ICh0aGUgb3duZXJzaGlwIHBvbGljeSBjaG9zZW4gaW4gIzk3NSkuXG4gIGNvbnN0IGV4aXN0aW5nVHJ1c3RlZCA9IGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcztcbiAgaWYgKHJlcXVpcmVkV2JmeVBhY2thZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChleGlzdGluZ1RydXN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRGVsZXRpbmcgdGhlIGZpZWxkIHJlc3RvcmVzIEJ1bidzIGZ1bGwgZGVmYXVsdCBhbGxvdy1saXN0LCBzbyBvbmx5IGVudHJpZXMgb3V0c2lkZSB0aGF0XG4gICAgICAvLyBsaXN0IGFjdHVhbGx5IGxvc2UgdGhlaXIgbGlmZWN5Y2xlIHNjcmlwdHMuXG4gICAgICB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGV4aXN0aW5nVHJ1c3RlZCwgbmV3IFNldCgpKTtcbiAgICAgIGRlbGV0ZSBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXM7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEFuIGV4cGxpY2l0IHRydXN0ZWREZXBlbmRlbmNpZXMgbGlzdCBSRVBMQUNFUyBCdW4ncyBkZWZhdWx0IGFsbG93LWxpc3QgaW5zdGVhZCBvZiBleHRlbmRpbmdcbiAgLy8gaXQsIGFuZCBCdW4gcHJpbnRzIG5vIHdhcm5pbmcgZm9yIHRoZSBwb3N0aW5zdGFsbHMgaXQgY29uc2VxdWVudGx5IHNraXBzIChlLmcuIEByYWlsd2F5L2NsaVxuICAvLyBkb3dubG9hZHMgaXRzIGJpbmFyeSBpbiBwb3N0aW5zdGFsbCBhbmQgZXhpdHMgMSB3aXRob3V0IG9uZSkuIEluY2x1ZGUgdGhlIEVOVElSRSBkZWZhdWx0IGxpc3Q6XG4gIC8vIGVudHJpZXMgZm9yIHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBpbnN0YWxsZWQgYXJlIGluZXJ0LCBhbmQgdGhpcyBpcyB0aGUgb25seSByZXByZXNlbnRhdGlvblxuICAvLyB0aGF0IHN0YXlzIGNvcnJlY3QgZm9yIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIHRoZSBmaW5hbCBgYnVuIGluc3RhbGxgIHJlc29sdmVzIGFmdGVyIHRoaXNcbiAgLy8gcnVucyDigJQgYW4gaW50ZXJzZWN0aW9uIHdpdGggYSBtaXNzaW5nIG9yIHN0YWxlIGxvY2tmaWxlIHdvdWxkIHNpbGVudGx5IGRyb3AgdGhlbS5cbiAgY29uc3QgZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcpO1xuICAvLyBsZWZ0aG9vayBpcyBhcHBlbmRlZCBleHBsaWNpdGx5IHNvIHRoZSBkZWZhdWx0LWxpc3QgbG9va3VwIGZhaWxpbmcgY2Fubm90IGRyb3AgaXQ6IGl0IGlzXG4gIC8vIHJlcXVpcmVkIGluIGV2ZXJ5IG1hbmFnZWQgcmVwb3NpdG9yeS5cbiAgY29uc3QgbmV3VHJ1c3RlZFBhY2thZ2VzID0gbmV3IFNldChbXG4gICAgLi4ucmVxdWlyZWRXYmZ5UGFja2FnZXMsXG4gICAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuICAgIC4uLihkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA/PyBbXSksXG4gIF0pO1xuICB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGV4aXN0aW5nVHJ1c3RlZCA/PyBbXSwgbmV3VHJ1c3RlZFBhY2thZ2VzKTtcbiAgYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzID0gWy4uLm5ld1RydXN0ZWRQYWNrYWdlc10udG9Tb3J0ZWQoKTtcbn1cblxuLy8gVGhlIHBhY2thZ2VzIHdiZnkgaXRzZWxmIG1heSB3cml0ZSBpbnRvIHRydXN0ZWREZXBlbmRlbmNpZXM7IHRoZWlyIHJlbW92YWwgaXMgbWFuYWdlZCBjbGVhbnVwLFxuLy8gbmV2ZXIgYSBsb3NzIG9mIHVzZXIgcG9saWN5LlxuY29uc3Qgd2JmeU1hbmFnZWRUcnVzdGVkRGVwZW5kZW5jaWVzID0gbmV3IFNldChbXG4gICdAYmxpdHpqcy9hdXRoJyxcbiAgJ0BjaGFrcmEtdWkvcmVhY3QnLFxuICAnQGhvb2tmb3JtL3Jlc29sdmVycycsXG4gICdAd2lsbGJvb3N0ZXIvanVkZ2UnLFxuICAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsXG4gICdAem9vbS9ydG1zJyxcbiAgJ2JsaXR6JyxcbiAgJ2RyaXp6bGUta2l0JyxcbiAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuXSk7XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFJlbW92ZWRUcnVzdGVkRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGV4aXN0aW5nVHJ1c3RlZDogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGtlcHRQYWNrYWdlczogUmVhZG9ubHlTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIC8vIEEgZGVmYXVsdC10cnVzdGVkIGVudHJ5IG5ldmVyIGxvc2VzIGFueXRoaW5nIGJ5IHJlbW92YWw6IHdoaWxlIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCB0aGVcbiAgLy8ga2VwdCBsaXN0IChvciwgd2hlbiB0aGUgZmllbGQgaXMgZGVsZXRlZCwgQnVuJ3Mgb3duIGRlZmF1bHQgbGlzdCkgc3RpbGwgdHJ1c3RzIGl0LlxuICBjb25zdCBkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIGNvbnN0IHJlbW92ZWRQYWNrYWdlcyA9IGV4aXN0aW5nVHJ1c3RlZC5maWx0ZXIoXG4gICAgKHBrZykgPT4gIWtlcHRQYWNrYWdlcy5oYXMocGtnKSAmJiAhd2JmeU1hbmFnZWRUcnVzdGVkRGVwZW5kZW5jaWVzLmhhcyhwa2cpICYmICFkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcz8uaGFzKHBrZylcbiAgKTtcbiAgaWYgKHJlbW92ZWRQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFJlbW92aW5nIHVubWFuYWdlZCB0cnVzdGVkRGVwZW5kZW5jaWVzIGVudHJpZXM6ICR7cmVtb3ZlZFBhY2thZ2VzLmpvaW4oJywgJyl9LiB3YmZ5IG93bnMgdGhpcyBmaWVsZDsgaWYgdGhlaXIgbGlmZWN5Y2xlIHNjcmlwdHMgYXJlIHJlcXVpcmVkLCBhZGQgdGhlIHBhY2thZ2VzIHRvIHdiZnkgaXRzZWxmLmBcbiAgICApO1xuICB9XG59XG5cbmxldCBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llczogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbi8qKiBGZXRjaGVzIEJ1bidzIGRlZmF1bHQgdHJ1c3RlZC1kZXBlbmRlbmN5IGFsbG93LWxpc3QgZnJvbSB0aGUgQnVuIHZlcnNpb24gaW5zdGFsbGluZyB0aGUgcmVwb3NpdG9yeS4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcykge1xuICAgIC8vIEJ1biBjb2xvcml6ZXMgdGhlIGxpc3QgbWFya2VycyB3aGVuIEZPUkNFX0NPTE9SIGlzIHNldCAoZS5nLiBieSB0ZXN0IHJ1bm5lcnMgb24gQ0kpLCBzb1xuICAgIC8vIEFOU0kgZXNjYXBlIHNlcXVlbmNlcyBtdXN0IGJlIHN0cmlwcGVkIGJlZm9yZSBwYXJzaW5nLlxuICAgIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnYnVuJywgWydwbScsICdkZWZhdWx0LXRydXN0ZWQnXSwgY29uZmlnLmRpclBhdGgpLnJlcGxhY2VBbGwoXG4gICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBtYXRjaGluZyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgcmVxdWlyZXMgdGhlIEVTQyBjb250cm9sIGNoYXJhY3RlclxuICAgICAgL1xcdTAwMUJcXFtbMC05O10qbS9ndSxcbiAgICAgICcnXG4gICAgKTtcbiAgICBjb25zdCBwYXJzZWREZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFsuLi5zdGRvdXQubWF0Y2hBbGwoL15cXHMqLVxccysoXFxTKykkL2dtdSldLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdIGFzIHN0cmluZykpO1xuICAgIGlmIChwYXJzZWREZXBlbmRlbmNpZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgLy8gRG8gbm90IGNhY2hlIHRoZSBmYWlsdXJlOiBhIHRhcmdldC1sb2NhbCBwcm9ibGVtIChlLmcuIGFuIHVucmVhZGFibGUgcGFja2FnZS5qc29uKSBtdXN0XG4gICAgICAvLyBub3QgZGVueSB0aGUgZGVmYXVsdCBsaXN0IHRvIGV2ZXJ5IGxhdGVyIHRhcmdldCBvZiBhIG11bHRpLXBhdGggcnVuLlxuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcmVhZCB0aGUgZGVmYXVsdCBhbGxvdy1saXN0IHZpYSBgYnVuIHBtIGRlZmF1bHQtdHJ1c3RlZGAuJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IHBhcnNlZERlcGVuZGVuY2llcztcbiAgfVxuICByZXR1cm4gY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgLy8gRXhwbGljaXQgcm9vdCBwdWJsaXNoaW5nIGludGVudCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgd2JmeSdzIHByaXZhdGUgbW9ub3JlcG8tcm9vdCBkZWZhdWx0LlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmIChjb25maWcucmVsZWFzZS5ucG1QdWJsaXNoZXNSb290IHx8IGpzb25PYmoucHVibGlzaENvbmZpZykpIHtcbiAgICBkZWxldGUganNvbk9iai5wcml2YXRlO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAhY29uZmlnLnJlbGVhc2UubnBtICYmICFqc29uT2JqLnB1Ymxpc2hDb25maWcpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHJlZ2lzdHJ5LCBucG0gcmVzb2x2ZXMgdGhlIHB1Ymxpc2ggdGFyZ2V0IGZyb20gdGhlIHdvcmtzcGFjZSAubnBtcmMsXG4gICAgLy8gd2hvc2UgZGVmYXVsdCByZWdpc3RyeSBvbiBDSSBtYXkgYmUgdGhlIFRha3VtaSBHdWFyZCBpbnN0YWxsIHByb3h5IOKAlCB3aGljaCByZWplY3RzXG4gICAgLy8gYG5wbSBwdWJsaXNoYCB3aXRoIDQwNSAoc2hhcmVkIzEwNzIpLiBgPz89YCBrZWVwcyBhIGRlbGliZXJhdGVseSBkaWZmZXJlbnQgcmVnaXN0cnkuXG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLnJlZ2lzdHJ5ID8/PSAnaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJztcbiAgfVxuICBjb25zdCBvd25lciA9IGNvbmZpZy5yZXBvQXV0aG9yO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBhd2FpdCBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCBqc29uT2JqKTtcbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ2J1biBydW4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlcikge1xuICAgICAgY29uc3Qgc2NyaXB0UnVubmVyID0gJ2J1biBydW4nO1xuICAgICAganNvbk9iai5zY3JpcHRzWydjb21tb24vY2ktc2V0dXAnXSA9IGAke3NjcmlwdFJ1bm5lcn0gc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScgPyAndXYnIDogJ3BvZXRyeSd9YF07XG4gICAgICBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YF0gPSBnZXRQeXRob25TZXR1cENvbW1hbmQocHl0aG9uUGFja2FnZU1hbmFnZXIpO1xuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBjb25zdCBweXRob25SdW5uZXIgPSBgJHtweXRob25QYWNrYWdlTWFuYWdlcn0gcnVuYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgJHtweXRob25SdW5uZXJ9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiAke3B5dGhvblJ1bm5lcn0gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBgJHtzY3JpcHRSdW5uZXJ9IGxpbnRgO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0KTtcbiAgICAgICAgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeSB8fCBqc29uT2JqLnJlcG9zaXRvcnkpIHtcbiAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oY29uZmlnLnJlcG9zaXRvcnkgPz8ganNvbk9iai5yZXBvc2l0b3J5LCBqc29uT2JqLnJlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3QgZ2VuQ29kZVNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXTtcbiAgaWYgKHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZykpIHtcbiAgICAvLyBQcmVzZXJ2ZSBwcm9qZWN0LXNwZWNpZmljIHN0ZXBzIGEgcmVwbyBhcHBlbmRlZCB0byB0aGUgbWFuYWdlZCBgYnVuIHdiIGdlbi1jb2RlYCAoZS5nLiBidWlsZGluZyBleHRyYSBkZXBsb3lcbiAgICAvLyBhc3NldHMpIGluc3RlYWQgb2YgZGlzY2FyZGluZyB0aGVtOyBvbmx5IHRoZSBtYW5hZ2VkIGdlbi1jb2RlIHNlZ21lbnQgaXMgd2JmeSdzIHRvXG4gICAgLy8gcmVnZW5lcmF0ZS4gQW4gdW5wYXJzZWFibGUgc2NyaXB0IGlzIGxlZnQgYWxvbmUgcmF0aGVyIHRoYW4gcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbiAgICBjb25zdCBzZWdtZW50cyA9IGdlbkNvZGVTY3JpcHQgPT09IHVuZGVmaW5lZCA/IFtdIDogc3BsaXRTY3JpcHRTZWdtZW50cyhnZW5Db2RlU2NyaXB0KTtcbiAgICBjb25zdCBjdXN0b21TZWdtZW50cyA9IHNlZ21lbnRzPy5maWx0ZXIoXG4gICAgICAoc2VnbWVudCkgPT4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnQsIGpzb25PYmouc2NyaXB0cywgdHJ1ZSkgPT09ICdjdXN0b20nXG4gICAgKTtcbiAgICBpZiAoY3VzdG9tU2VnbWVudHMpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IFsnYnVuIHdiIGdlbi1jb2RlJywgLi4uY3VzdG9tU2VnbWVudHNdLmpvaW4oJyAmJiAnKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlUG9zdGluc3RhbGxTY3JpcHQoanNvbk9iai5zY3JpcHRzLCBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcuY2hha3JhIHx8IGNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8IGNvbmZpZy5kZXBlbmRpbmcucHJpc21hO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChmb3JtYXRTY3JpcHQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBmb3JtYXRTY3JpcHQgPyBgJHtmb3JtYXRTY3JpcHR9ICYmIGJ1biBydW4gZm9ybWF0LWNvZGVgIDogJ2J1biBydW4gZm9ybWF0LWNvZGUnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybjtcblxuICBjb25zdCBjb25maWdNanNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLm1qcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnTWpzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLnR5cGUgPSAnbW9kdWxlJztcblxuICBjb25zdCBjb25maWdEdHNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQudHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0R0c1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai5maWxlcyA9IFsuLi5uZXcgU2V0KFsuLi4oanNvbk9iai5maWxlcyA/PyBbXSksICdjb25maWcuZC5tdHMnXSldO1xuICAvLyBOb2RlTmV4dCByZXNvbHZlcyBhIHJlbGF0aXZlIGAuL2NvbmZpZy5tanNgIGltcG9ydCB0byBgY29uZmlnLmQubXRzYCwgbm90XG4gIC8vIHRoZSBwYWNrYWdlLWxldmVsIGB0eXBlc2AgZmllbGQuIEtlZXAgdGhlIHB1Ymxpc2hlZCBjb25maWcgaW1wb3J0YWJsZSBmcm9tXG4gIC8vIHBhY2thZ2UtbG9jYWwgVHlwZVNjcmlwdCBsaW50ZXIgc2V0dGluZ3MuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLm10cycpLCBjb25maWdEbXRzQ29udGVudCkpO1xufVxuXG5jb25zdCBjb25maWdEbXRzQ29udGVudCA9IGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9jb25maWcuanMnO1xuYDtcblxuZnVuY3Rpb24gYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgY29uc3QgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMsIGpzb25PYmopXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBdKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsIGpzb25PYmopXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xufVxuXG5mdW5jdGlvbiBnZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBqc29uT2JqOiBQYWNrYWdlSnNvblxuKTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMpLmZpbHRlcihcbiAgICAoZGVwZW5kZW5jeSkgPT5cbiAgICAgIG1hbmFnZWREZXBlbmRlbmN5TmFtZXMuaGFzKGRlcGVuZGVuY3kpICYmXG4gICAgICAvLyBBIHB1YmxpYyBwYWNrYWdlJ3MgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBtdXN0IG5ldmVyIGJlIHJlLW1hbmFnZWQgdmlhIGEgcmVnaXN0cnkgaW5zdGFsbFxuICAgICAgLy8gKHByaXZhdGUgb25lcyBhcmUgbm9ybWFsaXplZCB0byBgd29ya3NwYWNlOipgIGxhdGVyKS4gVGhpcyBhbHNvIGNvdmVycyBydW5uaW5nIHdiZnkgb24gYVxuICAgICAgLy8gbW9ub3JlcG8gU1VCRElSRUNUT1JZLCB3aGVyZSB0aGUgcGFyZW50J3Mgd29ya3NwYWNlcyBhcmUgaW52aXNpYmxlIGFuZCB0aGUgd29ya3NwYWNlLW1hcFxuICAgICAgLy8gZ3VhcmQgaW4gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMgY2Fubm90IHByb3RlY3QgdGhlIHNwZWNpZmllci5cbiAgICAgIChqc29uT2JqLnByaXZhdGUgfHwgIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBqc29uT2JqW2tleV07XG4gICAgaWYgKHNlY3Rpb24gJiYgT2JqZWN0LmtleXMoc2VjdGlvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmosIGtleSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiB2b2lkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jaWVzLCBmYWxzZSk7XG5cbiAgICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCByb290Q29uZmlnLCBkZXZEZXBlbmRlbmNpZXMsIHRydWUpO1xuICB9XG5cbiAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgJiYgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMpXTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMoJ3V2JywgWydhZGQnLCAnLS1kZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnknIHwgJ3V2JyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHJldHVybiAndXYnO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykgcmV0dXJuICdwb2V0cnknO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25TZXR1cENvbW1hbmQocGFja2FnZU1hbmFnZXI6ICdwb2V0cnknIHwgJ3V2Jyk6IHN0cmluZyB7XG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3V2JykgcmV0dXJuICd1diBzeW5jIC0tZnJvemVuJztcbiAgLy8gYG1pc2Ugd2hpY2ggcHl0aG9uYCB5aWVsZHMgdGhlIHNpbmdsZSBhY3RpdmUgaW50ZXJwcmV0ZXIgcGF0aDsgYG1pc2UgY3VycmVudCBweXRob25gIGNhblxuICAvLyBwcmludCBtdWx0aXBsZSBzcGFjZS1zZXBhcmF0ZWQgdmVyc2lvbnMgKG1pc2Ugc3VwcG9ydHMgbXVsdGktdmVyc2lvbiBwaW5zKSwgd2hpY2ggd291bGQgcGFzc1xuICAvLyBleHRyYSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0byBgcG9ldHJ5IGVudiB1c2VgLiBXaGVuIG1pc2UgaXMgbWlzc2luZyBvciBweXRob24gaXNcbiAgLy8gdW5jb25maWd1cmVkLCBza2lwIGBwb2V0cnkgZW52IHVzZWAgYW5kIGZhbGwgYmFjayB0byBwb2V0cnkncyBkZWZhdWx0IGludGVycHJldGVyIGluc3RlYWQgb2ZcbiAgLy8gYWJvcnRpbmcgdGhlIGNoYWluLlxuICAvLyBUaGUgYHx8IHRydWVgIGNvdmVycyBvbmx5IHRoZSBtaXNlIHJlc29sdXRpb246IGEgbWlzc2luZy91bmNvbmZpZ3VyZWQgbWlzZSBmYWxscyBiYWNrIHRvXG4gIC8vIHBvZXRyeSdzIGRlZmF1bHQgaW50ZXJwcmV0ZXIsIHdoaWxlIGEgZmFpbGluZyBgcG9ldHJ5IGVudiB1c2VgIHN0aWxsIGFib3J0cyB0aGUgY2hhaW4uXG4gIHJldHVybiAncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUgJiYgeyBweXRob25fcGF0aD1cIiQobWlzZSB3aGljaCBweXRob24gMj4vZGV2L251bGwpXCIgfHwgdHJ1ZTsgfSAmJiB7IFsgLXogXCIkcHl0aG9uX3BhdGhcIiBdIHx8IHBvZXRyeSBlbnYgdXNlIFwiJHB5dGhvbl9wYXRoXCI7IH0gJiYgcG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwICYmIHBvZXRyeSBpbnN0YWxsJztcbn1cblxuZnVuY3Rpb24gaW5zdGFsbE5wbURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBkZXY6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXJzID0gW1xuICAgIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT4gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KSkpLFxuICBdO1xuICBzcGF3blN5bmMoJ2J1bicsIFsnYWRkJywgLi4uKGRldiA/IFsnLUQnXSA6IFtdKSwgJy0tZXhhY3QnLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llc1RvSW5zdGFsbDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG5ldyBTZXQoZGVwZW5kZW5jaWVzKSkge1xuICAgIC8vIEEgcHJpdmF0ZSBwYWNrYWdlIHdob3NlIG1vbm9yZXBvIGNvbnRhaW5zIHRoaXMgZGVwZW5kZW5jeSBhcyBhIHdvcmtzcGFjZSBtdXN0IHJlZmVyZW5jZSBpdFxuICAgIC8vIHZpYSB0aGUgd29ya3NwYWNlIHByb3RvY29sOiBwaW5uaW5nIGEgcmVnaXN0cnkgdmVyc2lvbiBtYWtlcyBCdW4gc2hhZG93IHRoZSBzYW1lLW5hbWVcbiAgICAvLyB3b3Jrc3BhY2UgYW5kIHNraXAgaW5zdGFsbGluZyB0aGUgd29ya3NwYWNlJ3Mgb3duIGRlcGVuZGVuY2llcy4gKFB1Ymxpc2hlZCBwYWNrYWdlcyBpbnN0ZWFkXG4gICAgLy8gcGluIGEgY29uY3JldGUgdmVyc2lvbiBiZWNhdXNlIGBucG0gcHVibGlzaGAgcmVqZWN0cyBgd29ya3NwYWNlOipgIHNwZWNpZmllcnMg4oCUIGJ1dCBhblxuICAgIC8vIEVYSVNUSU5HIGB3b3Jrc3BhY2U6YCBkZWNsYXJhdGlvbiBpcyBhbHdheXMga2VwdDogb3ZlcndyaXRpbmcgaXQgd2l0aCBhIHJlZ2lzdHJ5IHJlbGVhc2VcbiAgICAvLyB3b3VsZCBzaWxlbnRseSBicmVhayB0aGUgbG9jYWwgd29ya3NwYWNlIGxpbmsuKVxuXG4gICAgLy8gQSBkZWNsYXJlZCBgd29ya3NwYWNlOmAgc3BlY2lmaWVyIGFsd2F5cyB3aW5zLCB3aGV0aGVyIG9yIG5vdCB0aGUgd29ya3NwYWNlIG1hcCBzZWVzIHRoZVxuICAgIC8vIHBhY2thZ2U6IHJ1bm5pbmcgd2JmeSBvbiBhIG1vbm9yZXBvIFNVQkRJUkVDVE9SWSBoaWRlcyB0aGUgcGFyZW50J3Mgd29ya3NwYWNlcywgc28gdGhlIG1hcFxuICAgIC8vIGFsb25lIGNhbm5vdCBiZSB0cnVzdGVkIHRvIGRldGVjdCBhIGxvY2FsIHdvcmtzcGFjZSBsaW5rLlxuICAgIGlmIChwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XT8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICBpZiAoanNvbk9iai5wcml2YXRlKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gJ3dvcmtzcGFjZToqJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoanNvbk9iai5wcml2YXRlICYmIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLmhhcyhkZXBlbmRlbmN5KSkge1xuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpZXIgPSBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghZXhpc3RpbmdTcGVjaWZpZXIgfHwgZXhpc3RpbmdTcGVjaWZpZXIuc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gJ3dvcmtzcGFjZToqJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBBbiBleGlzdGluZyBDT05DUkVURSBwaW4gb24gYSB3b3Jrc3BhY2UgcGFja2FnZSBpcyBhIGRlbGliZXJhdGUgY2hvaWNlIGFuZCBtdXN0IG5vdCBiZVxuICAgICAgLy8gY29udmVydGVkIHRvIHRoZSB3b3Jrc3BhY2UgcHJvdG9jb2wuIE5vdGUgdGhlIHRyYWRlLW9mZiBlaXRoZXIgd2F5OiBucG0gKHdoaWNoXG4gICAgICAvLyBzZW1hbnRpYy1yZWxlYXNlJ3MgbnBtIHBsdWdpbiBzaGVsbHMgb3V0IHRvKSBjYW5ub3QgcGFyc2UgYHdvcmtzcGFjZTpgIHNwZWNpZmllcnMsIHdoaWxlXG4gICAgICAvLyBhIHJlZ2lzdHJ5IHBpbiBtYWtlcyBhIGNvbGQgYnVuIGluc3RhbGwgc2hhZG93IHRoZSB3b3Jrc3BhY2UgYW5kIHNraXAgaXRzIGRlcGVuZGVuY2llcyDigJRcbiAgICAgIC8vIFdpbGxCb29zdGVyL3NoYXJlZCBrZWVwcyBgd29ya3NwYWNlOipgIGFuZCBzdHJpcHMgdGhlIHByb3RvY29sIG9uIHRoZSBDSSBjaGVja291dCByaWdodFxuICAgICAgLy8gYmVmb3JlIHJlbGVhc2luZyAoc2NyaXB0cy9zdHJpcFdvcmtzcGFjZVByb3RvY29sLm1qcykuIEZhbGwgdGhyb3VnaCBzbyBhIGNvbmNyZXRlIHBpblxuICAgICAgLy8ga2VlcHMgYmVpbmcgYnVtcGVkIGxpa2UgYW55IG1hbmFnZWQgZGVwZW5kZW5jeS5cbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ID0gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgICAgIGNvbmZpZyxcbiAgICAgIHJvb3RDb25maWcsXG4gICAgICBkZXBlbmRlbmN5LFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV1cbiAgICApO1xuICAgIGlmIChzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kpIHtcbiAgICAgIGNvbnN0IG1hbmFnZWRWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoc2hvdWxkRG93bmdyYWRlQWdlR2F0ZWRNYW5hZ2VkRGVwZW5kZW5jeShkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSwgbWFuYWdlZFZlcnNpb24pKSB7XG4gICAgICAgIC8vIGBidW4gYWRkIGRlcGVuZGVuY3lgIHByZXNlcnZlcyBhbiBleGlzdGluZyBleGFjdCBwaW4sIHNvIHdyaXRlIHRoZSBhZ2UtY2xlYXJlZCB2ZXJzaW9uXG4gICAgICAgIC8vIGRpcmVjdGx5LiBUaGUgZmluYWwgcmVwb3NpdG9yeS13aWRlIGluc3RhbGwgcmVmcmVzaGVzIHRoZSBsb2NrZmlsZSBhZnRlciBldmVyeSBwYWNrYWdlXG4gICAgICAgIC8vIG1hbmlmZXN0IGhhcyBjb252ZXJnZWQgb24gdGhlIGdlbmVyYXRlZCByZWxlYXNlLWFnZSBwb2xpY3kuXG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gbWFuYWdlZFZlcnNpb247XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZGVwZW5kZW5jaWVzVG9JbnN0YWxsLnB1c2goZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoIXNraXBBZGRpbmdEZXBzKSBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gJiZcbiAgICAgICFzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgJiZcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICE9PSAnKidcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgaWYgKGxhdGVzdFZlcnNpb24gPT09ICcqJyAmJiBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgY29udGludWU7XG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBsYXRlc3RWZXJzaW9uO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmNpZXNUb0luc3RhbGw7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gIGlmICghcmVsYXRpdmVGaWxlUGF0aCkgcmV0dXJuO1xuXG4gIC8vIFJldXNlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIG93biBmb3JtYXR0ZXIgYWZ0ZXIgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24gc29cbiAgLy8gcGFja2FnZS5qc29uIG1hdGNoZXMgd2hhdGV2ZXIgaXRzIGN1cnJlbnQgc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBleHBlY3RzLlxuICAvLyBUaGlzIGF2b2lkcyBmb2xsb3ctdXAgYXV0b2ZpeCBjb21taXRzIGNhdXNlZCBvbmx5IGJ5IGZvcm1hdHRlciB2ZXJzaW9uIGRyaWZ0XG4gIC8vIGJldHdlZW4gd2JmeSBhbmQgdGhlIHByb2plY3QgYmVpbmcgdXBkYXRlZC5cbiAgc3Bhd25TeW5jKCdidW54JywgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICB1c2VkRGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHVzZWREZXBlbmRlbmN5U2V0ID0gbmV3IFNldCh1c2VkRGVwZW5kZW5jaWVzKTtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBhd2FpdCBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgIGlmICh1c2VkRGVwZW5kZW5jeVNldC5oYXMoZGVwZW5kZW5jeSkgfHwgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgYmFzZS1jb25maWcgcGFja2FnZXMuIFJlbW92ZSBzdGFsZSB2YXJpYW50cyB3aGVuIHJlcG9cbiAgICAvLyBjYXBhYmlsaXRpZXMgY2hhbmdlLCBzdWNoIGFzIE5leHQuanMgdGFraW5nIG93bmVyc2hpcCBvZiB0c2NvbmZpZy5qc29uLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdHNjb25maWcqLmpzb24nLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgIGNvbnN0IGFic29sdXRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgICAvLyBUeXBlU2NyaXB0IDcncyBuYXRpdmUgY29tcGlsZXIgZHJvcHBlZCB0aGUgaW4tcHJvY2VzcyBgcGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbmBcbiAgICAvLyBoZWxwZXIsIHNvIHBhcnNlIHRoZSB0c2NvbmZpZyBpbnRvIGFuIEFTVCBhbmQgcmVhZCBpdHMgdG9wLWxldmVsIGBleHRlbmRzYCBkaXJlY3RseS5cbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBwYXJzZVNvdXJjZUZpbGUoYWJzb2x1dGVGaWxlUGF0aCk7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgUHJlc2VydmUgbWFuYWdlZCBAdHNjb25maWcgZGVwZW5kZW5jaWVzIGJlY2F1c2UgJHthYnNvbHV0ZUZpbGVQYXRofSBjb3VsZCBub3QgYmUgcGFyc2VkLmApO1xuICAgICAgcmV0dXJuIG5ldyBTZXQobWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2UpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgICAgICBpZiAodmFsdWUgPT09IGRlcGVuZGVuY3kgfHwgdmFsdWUuc3RhcnRzV2l0aChgJHtkZXBlbmRlbmN5fS9gKSkge1xuICAgICAgICAgIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcztcbn1cblxuLyoqIFJlYWRzIHRoZSB0b3AtbGV2ZWwgYGV4dGVuZHNgIGVudHJpZXMgKGEgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MpIGZyb20gYSBwYXJzZWQgdHNjb25maWcuICovXG5mdW5jdGlvbiByZWFkVHNjb25maWdFeHRlbmRzKHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHZhbHVlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBnZXRUc2NvbmZpZ1Jvb3RQcm9wZXJ0aWVzKHNvdXJjZSkpIHtcbiAgICBpZiAoYXN0LmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSAmJiBhc3QuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpICYmIHByb3BlcnR5Lm5hbWUudGV4dCA9PT0gJ2V4dGVuZHMnKSB7XG4gICAgICBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhwcm9wZXJ0eS5pbml0aWFsaXplciwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZnVuY3Rpb24gZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogcmVhZG9ubHkgYXN0Lk9iamVjdExpdGVyYWxFbGVtZW50TGlrZVtdIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc291cmNlLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoYXN0LmlzRXhwcmVzc2lvblN0YXRlbWVudChzdGF0ZW1lbnQpICYmIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIHN0YXRlbWVudC5leHByZXNzaW9uLnByb3BlcnRpZXM7XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMobm9kZTogYXN0LkV4cHJlc3Npb24sIHZhbHVlczogc3RyaW5nW10pOiB2b2lkIHtcbiAgaWYgKGFzdC5pc1N0cmluZ0xpdGVyYWwobm9kZSkpIHtcbiAgICB2YWx1ZXMucHVzaChub2RlLnRleHQpO1xuICB9IGVsc2UgaWYgKGFzdC5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24obm9kZSkpIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygbm9kZS5lbGVtZW50cykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMoZWxlbWVudCwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PltdIHtcbiAgcmV0dXJuIGRlcGVuZGVuY3lTZWN0aW9uS2V5c1xuICAgIC5tYXAoKGtleSkgPT4ganNvbk9ialtrZXldKVxuICAgIC5maWx0ZXIoKHNlY3Rpb24pOiBzZWN0aW9uIGlzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPT4gISFzZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2FjaGVkVmVyc2lvbiA9IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuZ2V0KGRlcGVuZGVuY3kpO1xuICBpZiAoY2FjaGVkVmVyc2lvbikgcmV0dXJuIGNhY2hlZFZlcnNpb247XG5cbiAgY29uc3QgdmVyc2lvbiA9IGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5zZXQoZGVwZW5kZW5jeSwgdmVyc2lvbik7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3kpKSB7XG4gICAgcmV0dXJuIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgfVxuXG4gIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRpbWVzID0gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3kpO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBpZiAobGF0ZXN0VmVyc2lvbiAhPT0gJyonICYmIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZSh0aW1lc1tsYXRlc3RWZXJzaW9uXSkpIHtcbiAgICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuXG4gIHJldHVybiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyh0aW1lcylbMF0gPz8gJyonO1xufVxuXG4vKiogRXZlcnkgc3RhYmxlIHJlbGVhc2UgaW4gYHRpbWVzYCB0aGF0IGFscmVhZHkgY2xlYXJlZCB0aGUgYWdlIGdhdGUsIG5ld2VzdCBmaXJzdC4gKi9cbmZ1bmN0aW9uIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKHRpbWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nW10ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXModGltZXMpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiBzZW12ZXIudmFsaWQodmVyc2lvbikpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiAoc2VtdmVyLnByZXJlbGVhc2UodmVyc2lvbik/Lmxlbmd0aCA/PyAwKSA9PT0gMClcbiAgICAuZmlsdGVyKChbLCBwdWJsaXNoZWRBdF0pID0+IE51bWJlci5pc0Zpbml0ZShEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSkpXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBub3cgLSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSA+PSBwYWNrYWdlQWdlR2F0ZU1zKVxuICAgIC50b1NvcnRlZCgoW3ZlcnNpb25BXSwgW3ZlcnNpb25CXSkgPT4gc2VtdmVyLnJjb21wYXJlKHZlcnNpb25BLCB2ZXJzaW9uQikpXG4gICAgLm1hcCgoW3ZlcnNpb25dKSA9PiB2ZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNQdWJsaXNoZWRCZWZvcmVBZ2VHYXRlKHB1Ymxpc2hlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFwdWJsaXNoZWRBdCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwdWJsaXNoZWRUaW1lID0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocHVibGlzaGVkVGltZSkgJiYgRGF0ZS5ub3coKSAtIHB1Ymxpc2hlZFRpbWUgPj0gcGFja2FnZUFnZUdhdGVNcztcbn1cblxuZnVuY3Rpb24gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3k6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IGRlcGVuZGVuY3kucmVwbGFjZSgvQFteQC9dKyQvdSwgJycpO1xuICBjb25zdCBjYWNoZWRUaW1lcyA9IG5wbVBhY2thZ2VUaW1lc0NhY2hlLmdldChwYWNrYWdlTmFtZSk7XG4gIGlmIChjYWNoZWRUaW1lcykgcmV0dXJuIGNhY2hlZFRpbWVzO1xuXG4gIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAnbnBtJyxcbiAgICBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3RpbWUnLCAnLS1qc29uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLFxuICAgIHByb2Nlc3MuY3dkKClcbiAgKTtcbiAgaWYgKCFzdGRvdXQpIHJldHVybiB7fTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3Rkb3V0KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgW1JlY29yZDxzdHJpbmcsIHN0cmluZz5dO1xuICAgIGNvbnN0IHRpbWVzID0gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkWzBdIDogcGFyc2VkO1xuICAgIGlmICghdGltZXMpIHJldHVybiB7fTtcbiAgICBucG1QYWNrYWdlVGltZXNDYWNoZS5zZXQocGFja2FnZU5hbWUsIHRpbWVzKTtcbiAgICByZXR1cm4gdGltZXM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3k6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBLZWVwIG1hbmFnZWQgZmlyc3QtcGFydHkgcGFja2FnZXMgYWxpZ25lZCB3aXRoIEJ1bidzIGV4cGxpY2l0IGV4ZW1wdGlvbnMuIHdiZnkncyBnZW5lcmF0ZWRcbiAgLy8gY29uZmlndXJhdGlvbiBjYW4gcmVseSBvbiB0aGUgY3VycmVudCB3YiBjb250cmFjdCwgc28gaW5kZXBlbmRlbnRseSBzb2FraW5nIG9yIGRvd25ncmFkaW5nIHdiXG4gIC8vIHdvdWxkIHBhaXIgbmV3IGdlbmVyYXRlZCBmaWxlcyB3aXRoIGFuIGluY29tcGF0aWJsZSBvbGQgQ0xJLiBUaG9zZSBwYWNrYWdlcyBhcmUgcmVsZWFzZWQgYW5kXG4gIC8vIGZpeGVkIGF0IHRoZWlyIHNvdXJjZSBpbnN0ZWFkOyBvbmx5IHBhY2thZ2VzIEJ1biBpdHNlbGYgZ2F0ZXMgbWF5IGJlIHNlbGVjdGVkIGZyb20gb2xkZXIgdGFncy5cbiAgcmV0dXJuICFidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLnNvbWUoKHBhdHRlcm4pID0+IGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm4sIGRlcGVuZGVuY3kpKTtcbn1cblxuZnVuY3Rpb24gZG9lc1BhY2thZ2VQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHBhdHRlcm4gPT09IGRlcGVuZGVuY3kpIHJldHVybiB0cnVlO1xuICBpZiAoIXBhdHRlcm4uaW5jbHVkZXMoJyonKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGVzY2FwZWRQYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlQWxsKC9bLis/XiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYCkucmVwbGFjZUFsbCgnKicsICcuKicpO1xuICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlZFBhdHRlcm59JGAsICd1JykudGVzdChkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE5vIGNhY2hlIGhlcmU6IHRoZSBvbmx5IGNhbGxlciBjaGFpbiBnb2VzIHRocm91Z2ggZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24sIHdoaWNoIGFscmVhZHlcbiAgLy8gbWVtb2l6ZXMgcGVyIGRlcGVuZGVuY3ksIHNvIHRoaXMgY2FuIHJ1biBhdCBtb3N0IG9uY2UgcGVyIGRlcGVuZGVuY3kuXG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIGRlcGVuZGVuY3ksICd2ZXJzaW9uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLCBwcm9jZXNzLmN3ZCgpKSB8fCAnKic7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gVHlwZVNjcmlwdCBpcyB2ZXJzaW9uLWNhcHBlZCBpbiBCbGl0eiByZXBvc2l0b3JpZXMsIHNvIGl0cyBpbnN0YWxsIHNwZWNpZmllciBtdXN0IGNhcnJ5IHRoZVxuICAvLyBtYW5hZ2VkIHZlcnNpb24g4oCUIGEgYmFyZSBgYnVuIGFkZGAgd291bGQgaW5zdGFsbCB0aGUgaW5jb21wYXRpYmxlIGxhdGVzdC5cbiAgaWYgKGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZywgcm9vdENvbmZpZykpIHtcbiAgICByZXR1cm4gYCR7ZGVwZW5kZW5jeX1AJHtnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KX1gO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmN5O1xufVxuXG4vKiogV2hldGhlciB0aGUgcmVwb3NpdG9yeSBjb250YWlucyBhIEJsaXR6IGFwcCAodGhlIGN1cnJlbnQgcGFja2FnZSBvciB0aGUgd29ya3NwYWNlIHJvb3QpLiAqL1xuZnVuY3Rpb24gaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IHJvb3RDb25maWcuZGVwZW5kaW5nLmJsaXR6O1xufVxuXG5jb25zdCB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbi8qKiBNYXAgZnJvbSBlYWNoIHdvcmtzcGFjZSBwYWNrYWdlJ3MgbmFtZSB0byBpdHMgZGlyZWN0b3J5IChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCkuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlLmdldChyb290Q29uZmlnLmRpclBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHdvcmtzcGFjZURpcnNCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RDb25maWcpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZVBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCksICd1dGY4JylcbiAgICAgICkgYXMgUGFja2FnZUpzb247XG4gICAgICBpZiAod29ya3NwYWNlUGFja2FnZUpzb24ubmFtZSkge1xuICAgICAgICB3b3Jrc3BhY2VEaXJzQnlOYW1lLnNldCh3b3Jrc3BhY2VQYWNrYWdlSnNvbi5uYW1lLCBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmUgdW5wYXJzYWJsZSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uXG4gICAgfVxuICB9XG4gIHdvcmtzcGFjZVBhY2thZ2VEaXJzQ2FjaGUuc2V0KHJvb3RDb25maWcuZGlyUGF0aCwgd29ya3NwYWNlRGlyc0J5TmFtZSk7XG4gIHJldHVybiB3b3Jrc3BhY2VEaXJzQnlOYW1lO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHJldHVybiB0cnVlO1xuICBpZiAoY3VycmVudFZlcnNpb24gPT09ICcqJykgcmV0dXJuIHRydWU7XG4gIGlmIChpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzLmhhcyhkZXBlbmRlbmN5KSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBtYW5hZ2VkVmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpO1xuICBjb25zdCBjdXJyZW50VmFsaWRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgLy8gQSBUeXBlU2NyaXB0IDcgcGluIGluIGEgQmxpdHogcmVwb3NpdG9yeSBpcyBsaWtld2lzZSBpbmNvbXBhdGlibGUgKGBuZXh0IGJ1aWxkYCBmYWlscyBvblxuICAvLyB0aGUgTmV4dC5qcyAxNSB0aGF0IEJsaXR6IHBpbnMg4oCUIHNlZSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24pLCBzbyByZXdyaXRlIGl0IHRvIHRoZVxuICAvLyBjYXBwZWQgcmVsZWFzZSBpbnN0ZWFkIG9mIHByZXNlcnZpbmcgaXQgdmlhIHRoZSBuby1kb3duZ3JhZGUgcnVsZSBiZWxvdy4gVGhlIHBpbiBtYXkgYmUgYVxuICAvLyBSQU5HRSAoZS5nLiBgXjcuMC4wYCksIHdoaWNoIHNlbXZlci52YWxpZCByZWplY3RzIOKAlCBqdWRnZSB0aGUgbWFqb3IgZnJvbSB0aGUgcmFuZ2UgbWluaW11bS5cbiAgY29uc3QgY3VycmVudFR5cGVzY3JpcHRWZXJzaW9uID1cbiAgICBjdXJyZW50VmFsaWRWZXJzaW9uID8/IChzZW12ZXIudmFsaWRSYW5nZShjdXJyZW50VmVyc2lvbikgPyBzZW12ZXIubWluVmVyc2lvbihjdXJyZW50VmVyc2lvbik/LnZlcnNpb24gOiB1bmRlZmluZWQpO1xuICBpZiAoXG4gICAgZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdERlcGVuZGVuY3kgJiZcbiAgICBpc0JsaXR6UmVwb3NpdG9yeShjb25maWcsIHJvb3RDb25maWcpICYmXG4gICAgY3VycmVudFR5cGVzY3JpcHRWZXJzaW9uICYmXG4gICAgc2VtdmVyLm1ham9yKGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbikgPj0gNyAmJlxuICAgIHNlbXZlci52YWxpZChtYW5hZ2VkVmVyc2lvbikgJiZcbiAgICBpc05ld2VyUGFja2FnZVZlcnNpb24oY3VycmVudFZlcnNpb24sIG1hbmFnZWRWZXJzaW9uKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBUaGUgZ2VuZXJhdGVkIGJ1bmZpZyBhcHBsaWVzIHRoZSBvcmdhbml6YXRpb24gYWdlIGdhdGUgZXZlbiB0byBleGFjdCBwaW5zLiBJZiBhIG1hbmFnZWRcbiAgLy8gdGhpcmQtcGFydHkgdG9vbCBpcyBuZXdlciB0aGFuIHRoZSBuZXdlc3QgcmVsZWFzZSB0aGF0IGNsZWFyZWQgdGhhdCBnYXRlLCBwcmVzZXJ2aW5nIHRoZSBwaW5cbiAgLy8gcHJvZHVjZXMgYSBwYWNrYWdlLmpzb24gdGhhdCBhIGZyZXNoIGluc3RhbGwgd2l0aG91dCB0aGUgb2xkIGxvY2tmaWxlIGNhbm5vdCByZXNvbHZlIChub3RhYmx5XG4gIC8vIG9wdGltaXplZCBEb2NrZXIgYnVpbGRzKS4gS2VlcCB0aGUgbm8tZG93bmdyYWRlIHBvbGljeSBvbmx5IHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgZXhlbXB0IGZyb21cbiAgLy8gdGhlIGdhdGU7IGFnZS1nYXRlZCBtYW5hZ2VkIHRvb2xzIG11c3QgY29udmVyZ2Ugb24gdGhlIHZlcnNpb24gdGhlIGdlbmVyYXRlZCBidW5maWcgYWNjZXB0cy5cbiAgaWYgKHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeSwgY3VycmVudFZlcnNpb24sIG1hbmFnZWRWZXJzaW9uKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIHdiZnkgb3ducyB0aGVzZSB0b29sIGRlcGVuZGVuY2llcywgYnV0IGFwcGx5aW5nIHdiZnkgc2hvdWxkIG5vdCBkb3duZ3JhZGUgYVxuICAvLyByZXBvc2l0b3J5IHRoYXQgYWxyZWFkeSBwaW5zIGEgbmV3ZXIgcmV2aWV3ZWQgcmVsZWFzZSB3aGVuIHRoZSBvcmcgcG9saWN5IGV4ZW1wdHMgaXQuXG4gIHJldHVybiBpc05ld2VyUGFja2FnZVZlcnNpb24obWFuYWdlZFZlcnNpb24sIGN1cnJlbnRWZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRG93bmdyYWRlQWdlR2F0ZWRNYW5hZ2VkRGVwZW5kZW5jeShcbiAgZGVwZW5kZW5jeTogc3RyaW5nLFxuICBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBtYW5hZ2VkVmVyc2lvbjogc3RyaW5nXG4pOiBjdXJyZW50VmVyc2lvbiBpcyBzdHJpbmcge1xuICBpZiAoIWN1cnJlbnRWZXJzaW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHZhbGlkQ3VycmVudFZlcnNpb24gPSBzZW12ZXIudmFsaWQoY3VycmVudFZlcnNpb24pO1xuICBjb25zdCB2YWxpZE1hbmFnZWRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKG1hbmFnZWRWZXJzaW9uKTtcbiAgcmV0dXJuIChcbiAgICBzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3kpICYmXG4gICAgdmFsaWRDdXJyZW50VmVyc2lvbiAhPT0gbnVsbCAmJlxuICAgIHZhbGlkTWFuYWdlZFZlcnNpb24gIT09IG51bGwgJiZcbiAgICBzZW12ZXIuZ3QodmFsaWRDdXJyZW50VmVyc2lvbiwgdmFsaWRNYW5hZ2VkVmVyc2lvbilcbiAgKTtcbn1cblxuLy8gVGhlIG5ld2VzdCBUeXBlU2NyaXB0IDYgcmVsZWFzZSBhdCB0aGUgdGltZSB0aGUgQmxpdHogY2FwIHNoaXBwZWQ7IHVzZWQgb25seSB3aGVuIHRoZSByZWdpc3RyeVxuLy8gbG9va3VwIGZvciB0aGUgYWN0dWFsIG5ld2VzdCBwcmUtdjcgcmVsZWFzZSBmYWlscyAoc2VlIGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbikuXG5jb25zdCBsYXN0S25vd25QcmVWN1R5cGVzY3JpcHRWZXJzaW9uID0gJzYuMC4zJztcblxuZnVuY3Rpb24gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xuICBpZiAoZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdERlcGVuZGVuY3kgJiYgaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnLCByb290Q29uZmlnKSkge1xuICAgIC8vIEJsaXR6IHBpbnMgTmV4dC5qcyAxNSwgd2hvc2UgYnVpbGQtdGltZSBgdmVyaWZ5VHlwZVNjcmlwdFNldHVwYCByZXF1aXJlcyB0aGUgY2xhc3NpY1xuICAgIC8vIGB0eXBlc2NyaXB0YCBjb21waWxlciBBUEk7IHRoZSBUeXBlU2NyaXB0IDcgYHR5cGVzY3JpcHRgIHBhY2thZ2UgaXMgdGhlIHRzZ28gYmluYXJ5XG4gICAgLy8gd2l0aG91dCB0aGF0IEFQSSwgc28gYG5leHQgYnVpbGRgIGFib3J0cyB3aXRoIFwiRmFpbGVkIHRvIGluc3RhbGwgcmVxdWlyZWQgVHlwZVNjcmlwdFxuICAgIC8vIGRlcGVuZGVuY2llc1wiIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtKS4gQ2FwIGB0eXBlc2NyaXB0YCBiZWxvdyA3IHVudGlsXG4gICAgLy8gQmxpdHogc3VwcG9ydHMgYSBOZXh0LmpzIHJlbGVhc2UgdGhhdCB1bmRlcnN0YW5kcyB0c2dvLiBBIGZhaWxlZCByZWdpc3RyeSBsb29rdXAgbXVzdFxuICAgIC8vIHJlc29sdmUgdG8gYSBrbm93bi1jb21wYXRpYmxlIHJlbGVhc2Ug4oCUIGZhbGxpbmcgYmFjayB0byBsYXRlc3RWZXJzaW9uIHdvdWxkIHJlaW5zdGFsbCB0aGVcbiAgICAvLyBpbmNvbXBhdGlibGUgVHlwZVNjcmlwdCA3LlxuICAgIGNvbnN0IHZhbGlkTGF0ZXN0VmVyc2lvbiA9IHNlbXZlci52YWxpZChsYXRlc3RWZXJzaW9uKTtcbiAgICBpZiAodmFsaWRMYXRlc3RWZXJzaW9uICYmIHNlbXZlci5tYWpvcih2YWxpZExhdGVzdFZlcnNpb24pIDwgNykgcmV0dXJuIGxhdGVzdFZlcnNpb247XG4gICAgLy8gVGhlIGNhcHBlZCBsb29rdXAgbXVzdCByZXNwZWN0IHRoZSBhZ2UgZ2F0ZSB0b286IHRoaXMgdmVyc2lvbiBpcyB3cml0dGVuIGFzIGFuIGV4YWN0IHBpbixcbiAgICAvLyBhbmQgQnVuIHJlZnVzZXMgdG8gcmVzb2x2ZSBvbmUgcHVibGlzaGVkIGluc2lkZSB0aGUgbWluaW11bS1yZWxlYXNlLWFnZSB3aW5kb3cuIFRoZXJlIGlzIG5vXG4gICAgLy8gdW5nYXRlZCBmYWxsYmFjayDigJQgd2l0aG91dCBwdWJsaWNhdGlvbiBtZXRhZGF0YSB0aGUgYWdlIG9mIGEgcmFuZ2UgcmVzdWx0IGlzIHVua25vd24sIHNvIGFcbiAgICAvLyBwYXJ0aWFsIHJlZ2lzdHJ5IGZhaWx1cmUgd291bGQgb3RoZXJ3aXNlIHdyaXRlIGEgdmVyc2lvbiBCdW4gdGhlbiByZWZ1c2VzIHRvIGluc3RhbGwuXG4gICAgcmV0dXJuIGdldExhdGVzdEFnZUdhdGVkVmVyc2lvbkJlbG93KHR5cGVzY3JpcHREZXBlbmRlbmN5LCAnNy4wLjAnKSA/PyBsYXN0S25vd25QcmVWN1R5cGVzY3JpcHRWZXJzaW9uO1xuICB9XG4gIHJldHVybiBsYXRlc3RWZXJzaW9uO1xufVxuXG4vKipcbiAqIFRoZSBoaWdoZXN0IHJlbGVhc2Ugb2YgYHBhY2thZ2VOYW1lYCBiZWxvdyBgZXhjbHVzaXZlVXBwZXJCb3VuZGAgdGhhdCBhbHJlYWR5IGNsZWFyZWQgdGhlIGFnZVxuICogZ2F0ZSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHJlZ2lzdHJ5IGxvb2t1cCBmYWlscyBvciBubyBzdWNoIHJlbGVhc2UgZXhpc3RzIHlldC5cbiAqL1xuZnVuY3Rpb24gZ2V0TGF0ZXN0QWdlR2F0ZWRWZXJzaW9uQmVsb3cocGFja2FnZU5hbWU6IHN0cmluZywgZXhjbHVzaXZlVXBwZXJCb3VuZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKGdldE5wbVBhY2thZ2VUaW1lcyhwYWNrYWdlTmFtZSkpLmZpbmQoKHZlcnNpb24pID0+XG4gICAgc2VtdmVyLmx0KHZlcnNpb24sIGV4Y2x1c2l2ZVVwcGVyQm91bmQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihjYW5kaWRhdGVWZXJzaW9uOiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdmFsaWRMYXRlc3RWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGNhbmRpZGF0ZVZlcnNpb24pO1xuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgcmV0dXJuICF2YWxpZExhdGVzdFZlcnNpb24gfHwgIXZhbGlkQ3VycmVudFZlcnNpb24gfHwgc2VtdmVyLmd0KHZhbGlkTGF0ZXN0VmVyc2lvbiwgdmFsaWRDdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcnNpb24uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAvLyBObyBgLS1idW5gOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrcyB0b29sc1xuICAgIC8vIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpLlxuICAgIGNsZWFudXA6ICdidW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgZm9ybWF0OiBgYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgIGxpbnQ6IGBidW4gd2IgbGludGAsXG4gICAgJ2xpbnQtZml4JzogJ2J1biB3YiBsaW50IC0tZml4JyxcbiAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgIHR5cGVjaGVjazogJ2J1biB3YiB0eXBlY2hlY2snLFxuICAgIHZlcmlmeTogJ2J1biB3YiB2ZXJpZnknLFxuICAgICd2ZXJpZnktZnVsbCc6ICdidW4gd2IgdmVyaWZ5IC0tZnVsbCcsXG4gIH07XG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgYXBwbHlUZXN0T25DaVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzKTtcbiAgfVxuICBhcHBseVRlc3RTY3JpcHQoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzKTtcbiAga2VlcEdlbmVyYXRlZFNjcmlwdFdyYXBwZXJzKHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsndGVzdCcsICd2ZXJpZnktZnVsbCddKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBgYnVuICR7Z2V0V2JEYXRhYmFzZUNvbW1hbmQoY29uZmlnKX1gKTtcbiAgYXBwbHlNaXNlVGFza1NjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ2J1aWxkJywgJ2RldicsICdzdGFydCcsICd0ZXN0JywgJ3R5cGVjaGVjayddKTtcbiAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJyAmJiBweXJpZ2h0JztcbiAgfVxuICByZXR1cm4gc2NyaXB0cztcbn1cblxuLy8gQ0kgd29ya2Zsb3dzIChib3RoIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93IGFuZCB0aGUgc2VsZi1jb250YWluZWQgdmFyaWFudCBmb3Igbm9uLVdpbGxCb29zdGVyXG4vLyByZXBvc2l0b3JpZXMpIHByZWZlciBgdGVzdC9jaWAgb3ZlciBgdGVzdGAsIHNvIHN0YW5kYXJkaXplIGl0IG9uIGB3YiB0ZXN0LW9uLWNpYCBhdCB0aGUgcm9vdCDigJRcbi8vIGB3YiB0ZXN0LW9uLWNpYCBhbHJlYWR5IGl0ZXJhdGVzIHdvcmtzcGFjZSBwYWNrYWdlcyBpdHNlbGYuXG5mdW5jdGlvbiBhcHBseVRlc3RPbkNpU2NyaXB0KHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1sndGVzdC9jaSddO1xuICAvLyBTb21lIHJlcG9zaXRvcmllcyB3cmFwIENJIHRlc3RzIHdpdGggZXh0cmEgc3RlcHMgKGUuZy4gc2VsZWN0aW5nIHNwZWMgZmlsZXMgb3IgcnVubmluZyByYXdcbiAgLy8gUGxheXdyaWdodCkgdGhhdCB3YiBjYW5ub3QgaW5mZXIgZ2VuZXJpY2FsbHk7IHN1Y2ggd3JhcHBlcnMgYXJlIHByZXNlcnZlZC5cbiAgc2NyaXB0c1sndGVzdC9jaSddID0gb2xkU2NyaXB0ICYmICFpc0dlbmVyYXRlZFRlc3RPbkNpU2NyaXB0KG9sZFNjcmlwdCkgPyBvbGRTY3JpcHQgOiAnYnVuIHdiIHRlc3Qtb24tY2knO1xufVxuXG4vKiogV2hldGhlciBhIHNjcmlwdCBib2R5IGlzIG9uZSBvZiB0aGUgZ2VuZXJhdGVkIGB3YiB0ZXN0LW9uLWNpYCBpbnZvY2F0aW9ucy4gKi9cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdE9uQ2lTY3JpcHQoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNjcmlwdC50cmltKCkgPT09ICdidW4gd2IgdGVzdC1vbi1jaSc7XG59XG5cbi8qKlxuICogYHdiIHRlc3RgIHJ1bnMgSmF2YVNjcmlwdC9UeXBlU2NyaXB0IHRlc3QgcnVubmVycyBvbmx5LCBzbyByZXBsYWNpbmcgdGhlIGB0ZXN0YCBzY3JpcHQgb2YgYVxuICogcGFja2FnZSB3cml0dGVuIGluIGFub3RoZXIgbGFuZ3VhZ2UgKGUuZy4gYSBNYXZlbiBvciBhbiBSU3BlYyBwYWNrYWdlIGluIGEgcG9seWdsb3QgbW9ub3JlcG8pXG4gKiBzaWxlbnRseSBkcm9wcyBpdHMgd2hvbGUgc3VpdGU6IHRoZSBnZW5lcmF0ZWQgc2NyaXB0IHRoZW4gc3VjY2VlZHMgd2l0aG91dCBydW5uaW5nIGFueXRoaW5nLlxuICogU3VjaCBhIHBhY2thZ2Uga2VlcHMgaXRzIG93biBgdGVzdGAgc2NyaXB0OyBKUy9UUyBwYWNrYWdlcyBhcmUgc3RhbmRhcmRpemVkIGFzIHVzdWFsLlxuICovXG5mdW5jdGlvbiBhcHBseVRlc3RTY3JpcHQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0c1xuKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHMudGVzdD8udHJpbSgpO1xuICBpZiAoIW9sZFNjcmlwdCB8fCBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGlzR2VuZXJhdGVkVGVzdFNjcmlwdChvbGRTY3JpcHQpKSByZXR1cm47XG4gIHNjcmlwdHMudGVzdCA9IG9sZFNjcmlwdDtcbn1cblxuLyoqIFdoZXRoZXIgYSBzY3JpcHQgYm9keSBpcyBvbmUgb2YgdGhlIEtOT1dOIGdlbmVyYXRlZCBgd2IgdGVzdGAgaW52b2NhdGlvbnMuICovXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RTY3JpcHQoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNjcmlwdC50cmltKCkgPT09ICdidW4gd2IgdGVzdCc7XG59XG5cbi8qKlxuICogS2VlcHMgYSBzY3JpcHQgdGhhdCBDSEFJTlMgZXh0cmEgY29tbWFuZHMgb250byB0aGUgZ2VuZXJhdGVkIG9uZSAoZS5nLiBhIHBvbHlnbG90IG1vbm9yZXBvXG4gKiBhcHBlbmRpbmcgaXRzIE1hdmVuIGFuZCBSU3BlYyBzdWl0ZXMgdG8gYHdiIHRlc3RgLCB3aGljaCBydW5zIEphdmFTY3JpcHQvVHlwZVNjcmlwdCBydW5uZXJzXG4gKiBvbmx5KS4gU3VjaCBhIHdyYXBwZXIgc3RpbGwgcnVucyB0aGUgZ2VuZXJhdGVkIGNvbW1hbmQsIHNvIHJlcGxhY2luZyBpdCB3b3VsZCBzaWxlbnRseSBkcm9wIHRoZVxuICogcmVwb3NpdG9yeSdzIG93biBzdGVwcyDigJQgdGhlIHNhbWUgcmVhc29uaW5nIGFzIGBhcHBseVRlc3RPbkNpU2NyaXB0YC4gQW4gdW5yZWNvZ25pemVkIGNoYWluZWRcbiAqIHNjcmlwdCBpcyBrZXB0IHdob2xlc2FsZSByYXRoZXIgdGhhbiBsb3NpbmcgaXRzIHByb2plY3Qtb3duZWQgY29tbWFuZHMuXG4gKi9cbmZ1bmN0aW9uIGtlZXBHZW5lcmF0ZWRTY3JpcHRXcmFwcGVycyhcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgc2NyaXB0TmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBzY3JpcHROYW1lIG9mIHNjcmlwdE5hbWVzKSB7XG4gICAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1tzY3JpcHROYW1lXT8udHJpbSgpO1xuICAgIGNvbnN0IGdlbmVyYXRlZFNjcmlwdCA9IHNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgaWYgKCFvbGRTY3JpcHQgfHwgIWdlbmVyYXRlZFNjcmlwdCB8fCBvbGRTY3JpcHQgPT09IGdlbmVyYXRlZFNjcmlwdCkgY29udGludWU7XG4gICAgY29uc3QgaGVhZFJlZ0V4cCA9IG5ldyBSZWdFeHAoXG4gICAgICBgXiR7ZXNjYXBlUmVnRXhwKGdlbmVyYXRlZFNjcmlwdCkucmVwbGFjZUFsbCgnICcsIFN0cmluZy5yYXdgWyBcXHRdK2ApfSg/PVsgXFxcXHRdKig/OiYmfFxcXFx8XFxcXHx8O3xcXFxcbikpYCxcbiAgICAgICd1J1xuICAgICk7XG4gICAgLy8gQSBuZXdsaW5lIHNlcGFyYXRlcyBzaGVsbCBjb21tYW5kcyBqdXN0IGxpa2UgJiYsIHx8IGFuZCA7LlxuICAgIGlmIChoZWFkUmVnRXhwLnRlc3Qob2xkU2NyaXB0KSkge1xuICAgICAgLy8gQSBmdW5jdGlvbiByZXBsYWNlbWVudCBrZWVwcyBgJGAtc2hhcGVkIGNoYXJhY3RlcnMgaW4gdGhlIGdlbmVyYXRlZCBjb21tYW5kIGxpdGVyYWwuXG4gICAgICBzY3JpcHRzW3NjcmlwdE5hbWVdID0gb2xkU2NyaXB0LnJlcGxhY2UoaGVhZFJlZ0V4cCwgKCkgPT4gZ2VuZXJhdGVkU2NyaXB0KTtcbiAgICB9IGVsc2UgaWYgKC8oPzomJnxcXHxcXHx8O3xcXG4pL3UudGVzdChvbGRTY3JpcHQpKSB7XG4gICAgICBzY3JpcHRzW3NjcmlwdE5hbWVdID0gb2xkU2NyaXB0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICB3YkRiQ29tbWFuZDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSByZXR1cm47XG5cbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItY3JlYXRlLW1pZ3JhdGlvbicsIGAke3diRGJDb21tYW5kfSBtaWdyYXRlLWRldmAsICdtaWdyYXRlLWRldicpO1xuICBhcHBseURhdGFiYXNlU2NyaXB0KFxuICAgIHNjcmlwdHMsXG4gICAgb2xkU2NyaXB0cyxcbiAgICAnZGItbWlncmF0ZScsXG4gICAgYCR7d2JEYkNvbW1hbmR9IG1pZ3JhdGUgLS1jaGVjay1pZGVtcG90ZW5jeWAsXG4gICAgJ21pZ3JhdGUgLS1jaGVjay1pZGVtcG90ZW5jeSdcbiAgKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItdmlldycsIGAke3diRGJDb21tYW5kfSBzdHVkaW9gLCAnc3R1ZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGF0YWJhc2VTY3JpcHQoXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5hbWU6IHN0cmluZyxcbiAgZ2VuZXJhdGVkU2NyaXB0OiBzdHJpbmcsXG4gIGdlbmVyYXRlZEFyZ3VtZW50czogc3RyaW5nXG4pOiB2b2lkIHtcbiAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1tuYW1lXTtcbiAgLy8gU29tZSByZXBvc2l0b3JpZXMgd3JhcCBtaWdyYXRpb24gY29tbWFuZHMgdG8gcHJlcGFyZSBTUUxpdGUgZGlyZWN0b3JpZXMsXG4gIC8vIGZhbiBvdXQgb3ZlciB0ZW5hbnRzLCBvciBwZXJmb3JtIGNsZWFudXAgdGhhdCB3YiBjYW5ub3QgaW5mZXIgZ2VuZXJpY2FsbHkuXG4gIGNvbnN0IGdlbmVyYXRlZEJvZGllcyA9IFtgYnVuIHdiIGRiICR7Z2VuZXJhdGVkQXJndW1lbnRzfWAsIGBidW4gd2IgcHJpc21hICR7Z2VuZXJhdGVkQXJndW1lbnRzfWBdO1xuICBzY3JpcHRzW25hbWVdID0gb2xkU2NyaXB0ICYmICFnZW5lcmF0ZWRCb2RpZXMuaW5jbHVkZXMob2xkU2NyaXB0LnRyaW0oKSkgPyBvbGRTY3JpcHQgOiBnZW5lcmF0ZWRTY3JpcHQ7XG59XG5cbmZ1bmN0aW9uIGdldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICd3YiBkYicgfCAnd2IgcHJpc21hJyB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkgcmV0dXJuICd3YiBwcmlzbWEnO1xuICByZXR1cm4gJ3diIGRiJztcbn1cblxuZnVuY3Rpb24gaXNXYlBhY2thZ2UocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYWNrYWdlSnNvbj8ubmFtZSA9PT0gd2JEZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiBhcHBseU1pc2VUYXNrU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lczogc3RyaW5nW11cbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAoIWhhc01pc2VUYXNrKGNvbmZpZywgbmFtZSkpIGNvbnRpbnVlO1xuICAgIGlmIChkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICAvLyBQcmVzZXJ2ZSBhIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudiBwcmVmaXggKGUuZy4gYE1JU0VfRU5WPXRlc3RgKSBvbiBhbiBleGlzdGluZyBtaXNlIGJyaWRnZS5cbiAgICAvLyBTdWNoIGEgcHJlZml4IGlzIHJlcXVpcmVkIGZvciBtaXNlIGNvbmZpZyBlbnZpcm9ubWVudHMgKG1pc2UuPE1JU0VfRU5WPi50b21sKSwgd2hpY2ggYXJlXG4gICAgLy8gc2VsZWN0ZWQgZnJvbSBNSVNFX0VOViAqYmVmb3JlKiBtaXNlIHN0YXJ0cyBhbmQgY2Fubm90IGJlIHN3aXRjaGVkIGZyb20gaW5zaWRlIGEgdGFzazsgZHJvcHBpbmdcbiAgICAvLyBpdCB3b3VsZCBzaWxlbnRseSBydW4gdGhlIHRhc2sgaW4gdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQuXG4gICAgY29uc3QgZW52UHJlZml4ID0gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgob2xkU2NyaXB0c1tuYW1lXSwgbmFtZSk7XG4gICAgaWYgKGVudlByZWZpeCA9PT0gdW5kZWZpbmVkICYmIG9sZFNjcmlwdHNbbmFtZV0gJiYgIShuYW1lIGluIHNjcmlwdHMpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW25hbWVdID0gYCR7ZW52UHJlZml4ID8/ICcnfW1pc2UgcnVuICR7bmFtZX1gO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGVhZGluZyBgS0VZPVZBTFVFIGAgZW52LXZhciBwcmVmaXggb2YgYW4gZXhpc3RpbmcgYG1pc2UgcnVuIDxuYW1lPmAgYnJpZGdlIHNjcmlwdFxuICogKHBvc3NpYmx5IGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBicmlkZ2UgaGFzIG5vIHByZWZpeCksIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHNjcmlwdCBpcyBub3QgYVxuICogbWlzZSBicmlkZ2UgZm9yIHRoZSBnaXZlbiB0YXNrLlxuICovXG5mdW5jdGlvbiBleHRyYWN0TWlzZUJyaWRnZUVudlByZWZpeChzY3JpcHQ6IHVua25vd24sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gRWFjaCBhc3NpZ25tZW50IHZhbHVlIG1heSBiZSBkb3VibGUtcXVvdGVkLCBzaW5nbGUtcXVvdGVkLCBvciBhbiB1bnF1b3RlZCBydW4gb2Ygbm9uLXdoaXRlc3BhY2UsXG4gIC8vIHNvIHByZWZpeGVzIGxpa2UgYE1JU0VfRU5WPVwiYSBiXCJgICh3aG9zZSB2YWx1ZSBjb250YWlucyBzcGFjZXMpIGFyZSBtYXRjaGVkIGluc3RlYWQgb2YgZHJvcHBlZC5cbiAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXigoPzpcXHcrPSg/OlwiW15cIl0qXCJ8J1teJ10qJ3xcXFMrKVxccyspKiltaXNlIHJ1biAke2VzY2FwZVJlZ0V4cChuYW1lKX0kYCwgJ3UnKS5leGVjKFxuICAgIHNjcmlwdC50cmltKClcbiAgKTtcbiAgcmV0dXJuIG1hdGNoPy5bMV07XG59XG5cbmZ1bmN0aW9uIGhhc01pc2VUYXNrKGNvbmZpZzogUGFja2FnZUNvbmZpZywgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duKGNvbmZpZy5taXNlVGFza3MsIG5hbWUpO1xufVxuXG5mdW5jdGlvbiBkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0YXNrID0gY29uZmlnLm1pc2VUYXNrc1tuYW1lXTtcbiAgaWYgKCF0YXNrKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VycyA9IFsnYnVuJywgJ3lhcm4nLCAnbnBtJywgJ3BucG0nXTtcbiAgcmV0dXJuIHBhY2thZ2VNYW5hZ2Vycy5zb21lKChwYWNrYWdlTWFuYWdlcikgPT5cbiAgICBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXFxiJHtwYWNrYWdlTWFuYWdlcn1cXHMrKD86cnVuXFxzKyk/JHtlc2NhcGVSZWdFeHAobmFtZSl9KD8hW2EtekEtWjAtOV9cXC06Ll0pYCwgJ3UnKS50ZXN0KHRhc2spXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKSwgLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpXSk7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlczoge1xuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmc7XG4gICAgb3JnOiBzdHJpbmc7XG4gICAgcmVwbzogc3RyaW5nO1xuICAgIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJztcbiAgfVtdID0gW1xuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicsIG9yZzogJ1dpbGxCb29zdGVyJywgcmVwbzogJ2NvZGUtYW5hbHl6ZXInLCB0YXJnZXQ6ICdkZXZEZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9qdWRnZScsIG9yZzogJ1dpbGxCb29zdGVyTGFiJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5Jywgb3JnOiAnV2lsbEJvb3N0ZXJMYWInLCByZXBvOiAnbGxtLXByb3h5JywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICBdO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHByaXZhdGVQYWNrYWdlcy5tYXAoYXN5bmMgKHsgb3JnLCBwYWNrYWdlTmFtZSwgcmVwbywgdGFyZ2V0IH0pID0+IHtcbiAgICAgIGlmICghcGFja2FnZU5hbWVzLmhhcyhwYWNrYWdlTmFtZSkgfHwgaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosIHBhY2thZ2VOYW1lKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmllciA9IGpzb25PYmouZGVwZW5kZW5jaWVzW3BhY2thZ2VOYW1lXSA/PyBqc29uT2JqLmRldkRlcGVuZGVuY2llc1twYWNrYWdlTmFtZV07XG4gICAgICBjb25zdCBvdGhlclRhcmdldCA9IHRhcmdldCA9PT0gJ2RlcGVuZGVuY2llcycgPyAnZGV2RGVwZW5kZW5jaWVzJyA6ICdkZXBlbmRlbmNpZXMnO1xuICAgICAgLy8gVGhlIGxpbnQgcnVsZSBkaXNhbGxvd3MgYGRlbGV0ZWAgd2l0aCBjb21wdXRlZCBwYWNrYWdlIG5hbWVzOyBSZWZsZWN0IGhhcyB0aGUgc2FtZSBkZWxldGlvbiBzZW1hbnRpY3MgaGVyZS5cbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9ialtvdGhlclRhcmdldF0sIHBhY2thZ2VOYW1lKTtcbiAgICAgIGpzb25PYmpbdGFyZ2V0XVtwYWNrYWdlTmFtZV0gPSBpc1Bpbm5lZFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKGV4aXN0aW5nU3BlY2lmaWVyLCBvcmcsIHJlcG8pXG4gICAgICAgID8gZXhpc3RpbmdTcGVjaWZpZXJcbiAgICAgICAgOiBhd2FpdCBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihvcmcsIHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZXhpc3Rpbmcgc3BlY2lmaWVyIGFscmVhZHkgcGlucyBhIGdpdCByZWYgb2YgdGhlIGV4cGVjdGVkIHByaXZhdGUgcmVwb3NpdG9yeS5cbiAqIHdiZnkgbXVzdCBub3QgYnVtcCBzdWNoIHBpbnM6IGEgcnVuIGludGVuZGVkIGFzIGNvbmZpZ3VyYXRpb24vcGFja2FnZS1tYW5hZ2VyIG1haW50ZW5hbmNlXG4gKiB3b3VsZCBvdGhlcndpc2UgY2hhbmdlIHRoZSBkZXBlbmRlbmN5J3MgdmVyc2lvbiBhcyBhIHNpZGUgZWZmZWN0ICh1cGRhdGluZyBwaW5zIGlzIFJlbm92YXRlJ3NcbiAqIGpvYiksIHBvc3NpYmx5IHRvIGEgY29tbWl0IHdob3NlIHByZWJ1aWx0IGFydGlmYWN0cyBhcmUgbWlzc2luZy5cbiAqL1xuZnVuY3Rpb24gaXNQaW5uZWRQcml2YXRlUGFja2FnZVNwZWNpZmllcihcbiAgc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG9yZzogc3RyaW5nLFxuICByZXBvOiBzdHJpbmdcbik6IHNwZWNpZmllciBpcyBzdHJpbmcge1xuICBpZiAoIXNwZWNpZmllcikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbmV3IFJlZ0V4cChTdHJpbmcucmF3YCg/Ol58WzovXSkke29yZ30vJHtyZXBvfSg/OlxcLmdpdCk/I1xcUyskYCwgJ3UnKS50ZXN0KHNwZWNpZmllcik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKG9yZzogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmcsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOiR7b3JnfS8ke3JlcG99LmdpdCMke2NvbW1pdEhhc2h9YDtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmo6IFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwganNvbk9iai5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmludGVyZmFjZSBMZWZ0aG9va1NldHRpbmdzIHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3Rhcic7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTGVmdGhvb2tKb2Ige1xuICBuYW1lOiBzdHJpbmc7XG4gIGdsb2I/OiBzdHJpbmc7XG4gIHJ1bj86IHN0cmluZztcbiAgc2NyaXB0Pzogc3RyaW5nO1xuICBydW5uZXI/OiAnYmFzaCc7XG4gIHN0YWdlX2ZpeGVkPzogdHJ1ZTtcbn1cblxuY29uc3QgYmFzZVNldHRpbmdzOiBPbWl0PExlZnRob29rU2V0dGluZ3MsICdwcmUtY29tbWl0Jz4gPSB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInLFxuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcmVwYXJlJyxcbiAgICAgICAgc2NyaXB0OiAncHJlcGFyZS5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnY2hlY2snLFxuICAgICAgICBzY3JpcHQ6ICdjaGVjay5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcblxuLy8gTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHRoZSB1bnF1b3RlZCBsb29wcyBiZWxvdyBrZWVwIHBhdGhzXG4vLyB3aXRoIHNwYWNlcyBpbnRhY3QuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBqb2JzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2NsZWFudXAnLFxuICAgICAgZ2xvYjogJycsXG4gICAgICBydW46ICcnLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnY2hlY2stbWlncmF0aW9ucycsXG4gICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICBydW46IGBcbmZhaWxlZD0wXG5mb3IgZmlsZSBpbiB7c3RhZ2VkX2ZpbGVzfTsgZG9cbiAgaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyBcIiRmaWxlXCI7IHRoZW5cbiAgICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlICgkZmlsZSkgY29udGFpbnMgd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICAgIGZhaWxlZD0xXG4gIGZpXG5kb25lXG5leGl0IFwiJGZhaWxlZFwiXG5gLnRyaW0oKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIGJ1biByZWNvcmRzIGFuIGFic29sdXRlIGByZXNvbHZlZGAgVVJMIGZvciBhbiBhbHJlYWR5LWxvY2tlZCBwYWNrYWdlIHdoZW5ldmVyIHRoZVxuICAgICAgLy8gY29uZmlndXJlZCByZWdpc3RyeSBkb2VzIG5vdCBzZXJ2ZSB0aGUgdGFyYmFsbCBob3N0IGluIHRoZSBwYWNrYWdlIG1ldGFkYXRhIOKAlCB3aGljaCBpc1xuICAgICAgLy8gZXhhY3RseSB3aGF0IHRoZSBUYWt1bWkgR3VhcmQgcHJveHkgZG9lcy4gU28gYW4gaW5zdGFsbCBydW4gd2l0aCBHdWFyZCBhcyB0aGUgZGVmYXVsdFxuICAgICAgLy8gcmVnaXN0cnkgKENJLCBvciBhIGRldmVsb3BlciB3aG8gcHV0IGl0IGluIH4vLm5wbXJjKSBiYWtlcyBucG0uZmxhdHQudGVjaCBVUkxzIGludG9cbiAgICAgIC8vIGJ1bi5sb2NrLCBhbmQgY29tbWl0dGluZyB0aGVtIHBpbnMgYSBTSEFSRUQgbG9ja2ZpbGUgdG8gb25lIGVudmlyb25tZW50J3MgbWlycm9yOiBldmVyeVxuICAgICAgLy8gbGF0ZXIgaW5zdGFsbCBkb3dubG9hZHMgdGhyb3VnaCB0aGUgcHJveHksIGFuZCBhIGNvbGQtY2FjaGUgaW5zdGFsbCBmYWlscyBvdXRyaWdodCB3aXRoXG4gICAgICAvLyA0MDEgZm9yIGFueW9uZSB3aG9zZSBucG1yYyBjYXJyaWVzIGEgcmVnaXN0cnkubnBtanMub3JnIHRva2VuLCBiZWNhdXNlIGJ1biBzZW5kcyB0aGVcbiAgICAgIC8vIGRlZmF1bHQgcmVnaXN0cnkncyBjcmVkZW50aWFscyB0byB3aGF0ZXZlciBob3N0IHRoZSBsb2NrZmlsZSBuYW1lcy4gR3VhcmQgY292ZXJhZ2UgZG9lc1xuICAgICAgLy8gbm90IGRlcGVuZCBvbiB0aGVzZSBVUkxzIOKAlCB3aXRoIGFuIGVtcHR5IGByZXNvbHZlZGAsIGJ1biBkZXJpdmVzIHRoZSBkb3dubG9hZCBVUkwgZnJvbVxuICAgICAgLy8gdGhlIGNvbmZpZ3VyZWQgcmVnaXN0cnkg4oCUIHNvIHN0cmlwIHRoZW0uIE9ubHkgdGhlIEd1YXJkIGhvc3QgaXMgc3RyaXBwZWQ6IGEgc2NvcGVkXG4gICAgICAvLyByZWdpc3RyeSBzdWNoIGFzIFZlcmRhY2NpbyBsZWdpdGltYXRlbHkgcmVjb3JkcyBpdHMgb3duIFVSTCBmb3IgcHJpdmF0ZSBwYWNrYWdlcy5cbiAgICAgIG5hbWU6ICdub3JtYWxpemUtYnVuLWxvY2tmaWxlJyxcbiAgICAgIGdsb2I6ICdidW4ubG9jaycsXG4gICAgICBydW46ICdiYXNoIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoIHtzdGFnZWRfZmlsZXN9JyxcbiAgICAgIHN0YWdlX2ZpeGVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gT25seSB3aWxsYm9vc3Rlci1jb25maWdzIGdldHMgdGhpcyBqb2I6IGV2ZXJ5IG90aGVyIHJlcG9zaXRvcnkncyByZW5vdmF0ZS5qc29uYyBtZXJlbHlcbiAgICAgIC8vIGV4dGVuZHMgdGhlIHNoYXJlZCBwcmVzZXQsIGFuZCB0aGUgdmFsaWRhdG9yIGRvZXMgbm90IHJlc29sdmUgcmVtb3RlIHByZXNldHMsIHNvIHJ1bm5pbmcgaXRcbiAgICAgIC8vIHRoZXJlIHdvdWxkIHZhbGlkYXRlIHR3byBsaW5lcyBhbmQgY2F0Y2ggbm90aGluZy4gYC0tbm8tZ2xvYmFsYCB2YWxpZGF0ZXMgdGhlIHByZXNldCBhcyBhXG4gICAgICAvLyByZXBvIGNvbmZpZyBpbnN0ZWFkIG9mIGEgc2VsZi1ob3N0ZWQgZ2xvYmFsIGNvbmZpZywgYW5kIGBAbGF0ZXN0YCBrZWVwcyBucG0gZnJvbSBzaWxlbnRseVxuICAgICAgLy8gaW5zdGFsbGluZyBhbiBhbmNpZW50IFJlbm92YXRlIHRoYXQgY2Fubm90IGV2ZW4gcGFyc2UgSlNPTkMgd2hlbiB0aGUgbG9jYWwgTm9kZSBsYWdzIGJlaGluZC5cbiAgICAgIC8vIFN0YWdpbmcgYSBkZWxldGlvbiBvZiByZW5vdmF0ZS5qc29uYyBsZWF2ZXMgbm8gZmlsZSBmb3IgaW5zcGVjdGlvbiwgc28gTGVmdGhvb2sgc2tpcHMgdGhpc1xuICAgICAgLy8gam9iIGluc3RlYWQgb2YgcnVubmluZyB0aGUgdmFsaWRhdG9yIG9uIGEgbWlzc2luZyBwYXRoIOKAlCBkZWxpYmVyYXRlbHksIGJlY2F1c2UgZGVsZXRpbmcgdGhlXG4gICAgICAvLyBzaGFyZWQgcHJlc2V0IGlzIG5vdCBhbiBvcGVyYXRpb24gdGhpcyBob29rIG5lZWRzIHRvIGd1YXJkLlxuICAgICAgbmFtZTogJ3ZhbGlkYXRlLXJlbm92YXRlLWNvbmZpZycsXG4gICAgICBnbG9iOiAncmVub3ZhdGUuanNvbmMnLFxuICAgICAgcnVuOiAnbnB4IC0teWVzIC0tcGFja2FnZSByZW5vdmF0ZUBsYXRlc3QgLS0gcmVub3ZhdGUtY29uZmlnLXZhbGlkYXRvciAtLXN0cmljdCAtLW5vLWdsb2JhbCB7c3RhZ2VkX2ZpbGVzfScsXG4gICAgfSxcbiAgXSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIC8vIHByZXBhcmUgY2FsbHMgdGhpcyB3aXRob3V0IGFyZ3VtZW50cyBhZnRlciBCdW4gc2F2ZXMgdGhlIHJvb3QgbG9ja2ZpbGU7IExlZnRob29rIHBhc3NlcyBpdHNcbiAgLy8gc3RhZ2VkIHBhdGguIFRoZSB1bnByZWRpY3RhYmxlIHNpYmxpbmcgZmlsZSBtYWtlcyByZXBsYWNlbWVudCBhdG9taWMsIGBjcCAtcGAgcHJlc2VydmVzIGl0c1xuICAvLyBtb2RlLCBhbmQgdGhlIGFuY2hvcmVkIHBhdHRlcm4gY2Fubm90IGVyYXNlIGEgZGlyZWN0IHRhcmJhbGwgZGVwZW5kZW5jeSBVUkwuXG4gIG5vcm1hbGl6ZUJ1bkxvY2tmaWxlOiBgXG4jIS9iaW4vYmFzaFxuc2V0IC1lXG5cbmlmIFtbIFwiJCNcIiAtZXEgMCBdXTsgdGhlblxuICBzZXQgLS0gYnVuLmxvY2tcbmZpXG5cbm5vcm1hbGl6ZWQ9XCJcIlxudHJhcCAnW1sgLXogXCIkbm9ybWFsaXplZFwiIF1dIHx8IHJtIC1mIFwiJG5vcm1hbGl6ZWRcIicgRVhJVFxuZm9yIGZpbGUgaW4gXCIkQFwiOyBkb1xuICBbWyAtZiBcIiRmaWxlXCIgXV0gfHwgY29udGludWVcbiAgbm9ybWFsaXplZD1cIiQobWt0ZW1wIFwiJGZpbGUud2JmeS1ub3JtYWxpemluZy5YWFhYWFhcIilcIlxuICBjcCAtcCBcIiRmaWxlXCIgXCIkbm9ybWFsaXplZFwiXG4gIHNlZCAtRSAncyMoXCIsIClcImh0dHBzOi8vbnBtXFxcXC5mbGF0dFxcXFwudGVjaC9bXlwiXSpcIiNcXFxcMVwiXCIjZycgXCIkZmlsZVwiID4gXCIkbm9ybWFsaXplZFwiXG4gIGlmICEgY21wIC1zIFwiJGZpbGVcIiBcIiRub3JtYWxpemVkXCI7IHRoZW5cbiAgICBtdiBcIiRub3JtYWxpemVkXCIgXCIkZmlsZVwiXG4gICAgZWNobyBcIlJlbW92ZWQgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSAkZmlsZSBzbyB0aGUgbG9ja2ZpbGUgc3RheXMgcmVnaXN0cnktYWdub3N0aWMuXCJcbiAgZmlcbiAgcm0gLWYgXCIkbm9ybWFsaXplZFwiXG4gIG5vcm1hbGl6ZWQ9XCJcIlxuZG9uZVxuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2soY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10gPSBbY29uZmlnXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2snLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIGFsbENvbmZpZ3MpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICBqb2JzOiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZyksXG4gICAgfSxcbiAgfTtcbiAgaWYgKCFsaW50KSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGlmIChsaW50KSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnLCBhbGxDb25maWdzKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gnKSwgc2NyaXB0cy5ub3JtYWxpemVCdW5Mb2NrZmlsZSArICdcXG4nLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBCdW4gcmVwb3MgcmVjZWl2ZSB3YiBhcyBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIHRvb2xjaGFpbiwgc28gZ2VuZXJhdGUgdGhlXG4gIC8vIGZpbmFsIGhvb2sgY29tbWFuZCBvbiB0aGUgZmlyc3QgcnVuIGluc3RlYWQgb2YgY2hhbmdpbmcgaXQgb24gdGhlIHNlY29uZC5cbiAgY29uc3QgcXVpZXRMaW50Q29tbWFuZCA9ICdidW4gd2IgbGludCAtLXF1aWV0JztcbiAgLy8gTm8gc2VwYXJhdGUgdHlwZWNoZWNrIHN0ZXAgbmVlZGVkIOKAlCB0aGUgbGludCBjb21tYW5kIGFscmVhZHkgaW5jbHVkZXMgdHlwZWNoZWNraW5nLlxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHtxdWlldExpbnRDb21tYW5kfVxuYC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHF1aWV0TGludENvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIGdldFByZUNvbW1pdEpvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogTGVmdGhvb2tKb2JbXSB7XG4gIHJldHVybiBwcmVDb21taXRTZXR0aW5ncy5qb2JzXG4gICAgLmZpbHRlcigoam9iKSA9PiBqb2IubmFtZSAhPT0gJ3ZhbGlkYXRlLXJlbm92YXRlLWNvbmZpZycgfHwgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKVxuICAgIC5tYXAoKGpvYikgPT5cbiAgICAgIGpvYi5uYW1lID09PSAnY2xlYW51cCdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5qb2IsXG4gICAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICAgIHJ1bjogZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogam9iXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIExldCBgd2IgbGludCAtLWZvcm1hdGAgZGVjaWRlIHdoZXRoZXIgUHJldHRpZXIgaXMgYXZhaWxhYmxlOyB0aGUgaG9va1xuICAvLyBzdGlsbCBuZWVkcyB0byB0cmlnZ2VyIHdoZW4gYWRkaW5nIHRoZSBmaXJzdCBwcmV0dGllci1vbmx5IGZpbGUuXG4gIGNvbnN0IHN1cHBvcnRlZEV4dGVuc2lvbnMgPSBbLi4uZXh0ZW5zaW9ucy5wcmV0dGllck9ubHldO1xuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCguLi5leHRlbnNpb25zLm94Zm10LCAuLi5leHRlbnNpb25zLm94bGludCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdweScpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgnZGFydCcpO1xuICB9XG4gIGNvbnN0IGZpbHRlcmVkRXh0ZW5zaW9ucyA9IFsuLi5uZXcgU2V0KHN1cHBvcnRlZEV4dGVuc2lvbnMpXS50b1NvcnRlZCgpO1xuICByZXR1cm4gYCoqLyoueyR7ZmlsdGVyZWRFeHRlbnNpb25zLmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnKSkge1xuICAgIHJldHVybiBTdHJpbmcucmF3YFxuYnVuIHJ1biAtLWN3ZCBwYWNrYWdlcy93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbClcIiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuICAvLyBQeXRob24tb25seSBCdW4gcmVwb3MgaW5zdGFsbCB3YiBmb3Igc2hhcmVkIHNjcmlwdHMgYnV0IG5vdCBPeGxpbnQsIHNvXG4gIC8vIHN0YWdlZC1maWxlIGhvb2tzIG11c3QgdXNlIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyBmb3JtYXR0ZXIgcGF0aCBiZWxvdy5cbiAgY29uc3QgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gIGlmIChjYW5Vc2VXYkZvclN0YWdlZEZpbGVzKSB7XG4gICAgcmV0dXJuIGBcbmJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcucmF3YFxucGFja2FnZV9qc29uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiXG4ke2hhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZykgPyBTdHJpbmcucmF3YHB5dGhvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5weSQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2NvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sID8gU3RyaW5nLnJhd2BkYXJ0X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLmRhcnQkJyB8IGdyZXAgLXYgJ2dlbmVyYXRlZCcgfCBncmVwIC12ICdcXC5mcmVlemVkXFwuZGFydCQnIHwgZ3JlcCAtdiAnXFwuZ1xcLmRhcnQkJyB8fCB0cnVlKVwiYCA6ICcnfVxuXG5pZiBbIC1uIFwiJHBhY2thZ2VfanNvbl9maWxlc1wiIF07IHRoZW5cbiAgYnVuIHNvcnQtcGFja2FnZS1qc29uICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcyAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGJsYWNrICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWwpYDtcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSAnYnVuIGluc3RhbGwnO1xuICAvLyBEbyBOT1QgYWRkIGAudmluZXh0YCBoZXJlOiBpdCBob2xkcyBvbmx5IHZpbmV4dCdzIGNvbnRlbnQtaGFzaGVkIGZvbnQgY2FjaGUgYW5kIHRoZSBkZXZcbiAgLy8gc2VydmVyJ3MgbG9jayBmaWxlIChkZWxldGluZyB0aGUgbG9jayBkaXNhYmxlcyB0aGUgZHVwbGljYXRlLWRldi1zZXJ2ZXIgZ3VhcmQgZm9yIGEgcnVubmluZ1xuICAvLyBzZXJ2ZXIpLiB2aW5leHQncyBidWlsZCBvdXRwdXQgZ29lcyB0byBgZGlzdC9gLCBhbmQgVml0ZSdzIGRlcGVuZGVuY3kgY2FjaGUgaXMgaGFuZGxlZCBieVxuICAvLyB0aGUgc2VwYXJhdGUgaW5zdGFsbC1sYXlvdXQgaG9vayBiZWxvdy5cbiAgLy8gU2NhbiBldmVyeSB3b3Jrc3BhY2UgY29uZmlnIChub3QganVzdCB0aGUgcm9vdCk6IGluIGEgbW9ub3JlcG8gdGhlIGFwcCB1c3VhbGx5IGxpdmVzIGluXG4gIC8vIHBhY2thZ2VzLzxhcHA+IG9yIGFwcHMvPGFwcD4sIGFuZCB0aGUgY2FjaGUgZGlyZWN0b3JpZXMgYXJlIHdvcmtzcGFjZS1yZWxhdGl2ZS5cbiAgY29uc3QgbmV4dENhY2hlRGlyUGF0aHMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgICBjb25maWcsXG4gICAgYWxsQ29uZmlncyxcbiAgICAod29ya3NwYWNlQ29uZmlnKSA9PiB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcubmV4dCxcbiAgICAnLm5leHQnXG4gICk7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yaWVzID1cbiAgICBuZXh0Q2FjaGVEaXJQYXRocy5sZW5ndGggPiAwID8gYCAmJiBybSAtUmYgLS0gJHtuZXh0Q2FjaGVEaXJQYXRocy5tYXAocXVvdGVGb3JFdmFsdWF0ZWRTaGVsbCkuam9pbignICcpfWAgOiAnJztcbiAgLy8gQnVuIGRvZXMgbm90IHJlbGluayBhbiBleGlzdGluZyBpc29sYXRlZCB0cmVlIHdoZW4gZ2xvYmFsU3RvcmUvbGlua2VyIHNldHRpbmdzIGNoYW5nZS4gSW5zcGVjdFxuICAvLyB0aG9zZSBrZXlzIHJhdGhlciB0aGFuIGV2ZXJ5IGJ1bmZpZyBjaGFuZ2U6IG1pbmltdW1SZWxlYXNlQWdlIHVwZGF0ZXMgbXVzdCBub3QgZGVzdHJveSBhXG4gIC8vIGNvbnRyaWJ1dG9yJ3Mgd29ya2luZyBpbnN0YWxsIGJlZm9yZSBhIHBvdGVudGlhbGx5IG5ldHdvcmstZGVwZW5kZW50IHJlcGxhY2VtZW50IHN1Y2NlZWRzLlxuICBjb25zdCBub2RlTW9kdWxlc0RpclBhdGhzID0gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoY29uZmlnLCBhbGxDb25maWdzLCAoKSA9PiB0cnVlLCAnbm9kZV9tb2R1bGVzJyk7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgU3RyaW5nLnJhd2BpZiBnaXQgZGlmZiAtLW5vLWNvbG9yIC1VMCBPUklHX0hFQUQgSEVBRCAtLSAnKmJ1bmZpZy50b21sJyB8IGdyZXAgLS1xdWlldCAtRSAnXlsrLV0gKihnbG9iYWxTdG9yZXxsaW5rZXJ8cHVibGljSG9pc3RQYXR0ZXJuKSc7IHRoZW4gcm0gLVJmIC0tICR7bm9kZU1vZHVsZXNEaXJQYXRocy5tYXAocXVvdGVGb3JTaGVsbCkuam9pbignICcpfTsgZmlgXG4gICk7XG4gIC8vIGJ1bi5sb2NrLW9ubHkgbWVyZ2VzIChSZW5vdmF0ZSBsb2NrZmlsZSBtYWludGVuYW5jZSksIGJ1bmZpZy50b21sIC8gLm5wbXJjIGNoYW5nZXMgKGxpbmtlcixcbiAgLy8gcmVnaXN0cnksIGhvaXN0aW5nKSwgYW5kIHBhdGNoIGVkaXRzIGFsbCBjaGFuZ2UgdGhlIGluc3RhbGxlZCB0cmVlIHdpdGhvdXQgdG91Y2hpbmcgcGFja2FnZS5qc29uLlxuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIocGFja2FnZVxcLmpzb258YnVuXFwubG9ja3xidW5maWdcXC50b21sfFxcLm5wbXJjfHBhdGNoZXMvKVwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yaWVzfVwiYFxuICApO1xuICAvLyBWaXRlJ3MgZGVwZW5kZW5jeSBjYWNoZSBpbiBub2RlX21vZHVsZXMvLnZpdGUgc2VsZi1pbnZhbGlkYXRlcyBvbiBsb2NrZmlsZSAvIHBhdGNoZXMgL1xuICAvLyBjb25maWcgLyBOT0RFX0VOViBjaGFuZ2VzIChzZWUgVml0ZSdzIGRlcCBwcmUtYnVuZGxpbmcgZG9jcyksIHNvIHRoZSByZXNpZHVhbCBzdGFsZSBjYXNlIGlzXG4gIC8vIGluc3RhbGwtbGF5b3V0IGNoYW5nZXMgKGJ1bmZpZy50b21sIGxpbmtlciwgLm5wbXJjKTogdGhleSBjaGFuZ2UgdGhlIGluc3RhbGxlZCB0cmVlIHdpdGhvdXRcbiAgLy8gdG91Y2hpbmcgdGhlIGxvY2tmaWxlLCBhbmQgdGhleSBhcmUgYWJzZW50IGZyb20gVml0ZSdzIGNhY2hlIGtleS5cbiAgY29uc3Qgcm1WaXRlQ2FjaGVEaXJlY3RvcmllcyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKFxuICAgIGNvbmZpZyxcbiAgICBhbGxDb25maWdzLFxuICAgICh3b3Jrc3BhY2VDb25maWcpID0+IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcudmluZXh0IHx8IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcudml0ZSxcbiAgICAnbm9kZV9tb2R1bGVzLy52aXRlJ1xuICApO1xuICBpZiAocm1WaXRlQ2FjaGVEaXJlY3Rvcmllcy5sZW5ndGggPiAwKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoYnVuZmlnXFwudG9tbHxcXC5ucG1yYylcIiBcInJtIC1SZiAtLSAke3JtVml0ZUNhY2hlRGlyZWN0b3JpZXMubWFwKHF1b3RlRm9yRXZhbHVhdGVkU2hlbGwpLmpvaW4oJyAnKX1cImBcbiAgICApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJ1dlxcLmxvY2tcIiBcInV2IHN5bmMgLS1mcm96ZW5cImApO1xuICB9XG4gIC8vIEJsaXR6IHJlcG9zaXRvcmllcyBkZWxpYmVyYXRlbHkgZ2V0IHRoZSBzYW1lIHdiLWRyaXZlbiBwcmlzbWEgY29tbWFuZHMgYXMgZXZlcnlvbmUgZWxzZTpcbiAgLy8gdGhlIGJsaXR6IENMSSdzIGNvZGVnZW4gcGF0Y2hlcyB0aGUgaW5zdGFsbGVkIG5leHQgcGFja2FnZSBpbiBwbGFjZSwgd2hpY2ggbXVzdCBuZXZlciBydW5cbiAgLy8gdW5kZXIgQnVuJ3Mgc2hhcmVkIGdsb2JhbCBzdG9yZS4gWWFybi1lcmEgQmxpdHogcmVwb3MgZ2V0IHRoZWlyIHJvdXRlIG1hbmlmZXN0IGZyb21cbiAgLy8gYHdiIGdlbi1jb2RlYCdzIGBibGl0eiBjb2RlZ2VuYCBzdGVwLCBhbmQgY3VycmVudCB3YiByb3V0ZXMgb25seSBgd2IgcHJpc21hIHNlZWRgIHRocm91Z2hcbiAgLy8gdGhlIGJsaXR6IENMSSwgb25seSBmb3Igbm9uLUJ1biByZXBvcyAoc2VlIHBhY2thZ2VzL3diL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMpOyB0aGVcbiAgLy8gcG9zdC1tZXJnZSBob29rcyBzdGF5IHdiLWRyaXZlbiBiZWNhdXNlIGBwcmlzbWEgZGVwbG95YC9gZ2VuZXJhdGVgIG5lZWQgbm8gYmxpdHogbG9hZGVyLlxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJidW4gd2IgcHJpc21hIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwiYnVuIHdiIHByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzQ29tbWFuZCA9IGdldEdlbkkxOG5Uc0NvbW1hbmQoY29uZmlnLCBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMpO1xuICBpZiAoZ2VuSTE4blRzQ29tbWFuZCkge1xuICAgIC8vIGdlbi1pMThuLXRzIG91dHB1dHMgYXJlIGNvbW1vbmx5IGlnbm9yZWQsIHNvIHBvc3QtbWVyZ2UgcmVnZW5lcmF0ZXMgdGhlbSBhZnRlciBwdWxsZWQgcmVzb3VyY2UgY2hhbmdlcy5cbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoXnwvKWkxOG4vLipcXC5qc29uJFwiIFwiJHtnZW5JMThuVHNDb21tYW5kfVwiYCk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuXG4vLyBUaGUgZ2VuZXJhdGVkIGNvbW1hbmQgcGFzc2VzIHRocm91Z2ggVFdPIHNoZWxsIHBhcnNpbmcgc3RhZ2VzOiB0aGUgcHJlcGFyZS5zaCBsaW5lIHBhcnNlcyBpdCBhc1xuLy8gYSBkb3VibGUtcXVvdGVkIGFyZ3VtZW50IChwcm9jZXNzaW5nIFxcLCBgLCAkIGFuZCBcIiBpbW1lZGlhdGVseSksIGFuZCBydW5faWZfY2hhbmdlZCB0aGVuIGV2YWwnc1xuLy8gaXQgKHdvcmQtc3BsaXR0aW5nIGFuZCBnbG9iYmluZykuIEFuIHVucXVvdGVkIHBhdGggY29udGFpbmluZyBzcGFjZXMgKGUuZy4gYGFwcHMvbXkgYXBwLy5uZXh0YClcbi8vIHdvdWxkIHdvcmQtc3BsaXQgaW50byB1bnJlbGF0ZWQgcm0gdGFyZ2V0cywgYW5kIGAkYC9iYWNrdGljayB3b3VsZCBleHBhbmQgYXQgdGhlIGZpcnN0IHN0YWdlLlxuLy8gU286IHNpbmdsZS1xdW90ZSBmb3IgdGhlIGV2YWwgc3RhZ2UsIHRoZW4gYmFja3NsYXNoLWVzY2FwZSB0aGUgZG91YmxlLXF1b3RlLWNvbnRleHQgc3BlY2lhbHMuXG5mdW5jdGlvbiBxdW90ZUZvckV2YWx1YXRlZFNoZWxsKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBldmFsUXVvdGVkID0gcXVvdGVGb3JTaGVsbChmaWxlUGF0aCk7XG4gIHJldHVybiBldmFsUXVvdGVkLnJlcGxhY2VBbGwoL1tcXFxcYCRcIl0vZ3UsIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG5mdW5jdGlvbiBxdW90ZUZvclNoZWxsKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCcke2ZpbGVQYXRoLnJlcGxhY2VBbGwoXCInXCIsIFN0cmluZy5yYXdgJ1xcJydgKX0nYDtcbn1cblxuLyoqXG4gKiBUaGUgd29ya3NwYWNlLXJlbGF0aXZlIGRpcmVjdG9yaWVzIChyb290IGZpcnN0LCBkZWR1cGxpY2F0ZWQsIGA8c3ViRGlyTmFtZT5gIGFwcGVuZGVkKSBvZiBldmVyeVxuICogd29ya3NwYWNlIHdob3NlIGNvbmZpZyBtYXRjaGVzIHRoZSBwcmVkaWNhdGUuIFRoZSBob29rIHNjcmlwdCBydW5zIGF0IHRoZSByZXBvc2l0b3J5IHJvb3QsIHNvXG4gKiBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgY29uZmlnJ3MgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBwcmVkaWNhdGU6IChjb25maWc6IFBhY2thZ2VDb25maWcpID0+IGJvb2xlYW4sXG4gIHN1YkRpck5hbWU6IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBhbGxDb25maWdzXG4gICAgICAgIC5maWx0ZXIoKGNvbmZpZykgPT4gcHJlZGljYXRlKGNvbmZpZykpXG4gICAgICAgIC5tYXAoKGNvbmZpZykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocm9vdENvbmZpZy5kaXJQYXRoLCBjb25maWcuZGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgICAgICAgcmV0dXJuIHJlbGF0aXZlRGlyUGF0aCA/IHBhdGgucG9zaXguam9pbihyZWxhdGl2ZURpclBhdGgsIHN1YkRpck5hbWUpIDogc3ViRGlyTmFtZTtcbiAgICAgICAgfSlcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2s7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblJ1bm5lcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5IHJ1bicgfCAndXYgcnVuJyB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgPyAndXYgcnVuJyA6ICdwb2V0cnkgcnVuJztcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb25maWdDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZW50Py50cmltKCk7XG59XG4iLCJpbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICcuLi91dGlscy9zdHJpbmdVdGlsLmpzJztcblxuZXhwb3J0IHR5cGUgQ29uZmlnQmxvY2tOYW1lID0gJ2Jhc2UnIHwgJ2V4cG9ydCc7XG5cbmludGVyZmFjZSBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucyB7XG4gIGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuICBtYXJrZXJQcmVmaXg6IHN0cmluZztcbiAgdG9vbE5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdldENvbmZpZ0NvbnRlbnRPcHRpb25zIHtcbiAgZGVzaXJlZENvbnRlbnQ6IHN0cmluZztcbiAgZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkQ29uZmlnQmxvY2tzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1hcmtlclByZWZpeDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdG9vbE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucykge1xuICAgIHRoaXMuYmxvY2tOYW1lcyA9IG9wdGlvbnMuYmxvY2tOYW1lcztcbiAgICB0aGlzLm1hcmtlclByZWZpeCA9IG9wdGlvbnMubWFya2VyUHJlZml4O1xuICAgIHRoaXMudG9vbE5hbWUgPSBvcHRpb25zLnRvb2xOYW1lO1xuICB9XG5cbiAgZ2V0Q29uZmlnQ29udGVudChvcHRpb25zOiBHZXRDb25maWdDb250ZW50T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKCFvcHRpb25zLmV4aXN0aW5nQ29udGVudCkgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gICAgaWYgKHRoaXMuaGFzTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50LCBvcHRpb25zLmRlc2lyZWRDb250ZW50LCBvcHRpb25zLmZpbGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gIH1cblxuICBnZXRCbG9jayhibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpfVxuJHtjb250ZW50fVxuJHt0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpfWA7XG4gIH1cblxuICBoYXNNYW5hZ2VkQmxvY2tzKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJsb2NrTmFtZXMuc29tZSgoYmxvY2tOYW1lKSA9PiBjb250ZW50LmluY2x1ZGVzKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQ6IHN0cmluZywgZGVzaXJlZENvbnRlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGNvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQ7XG4gICAgZm9yIChjb25zdCBibG9ja05hbWUgb2YgdGhpcy5ibG9ja05hbWVzKSB7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IHRoaXMuZXh0cmFjdE1hbmFnZWRCbG9jayhkZXNpcmVkQ29udGVudCwgYmxvY2tOYW1lKTtcbiAgICAgIGlmICghcmVwbGFjZW1lbnQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBuZXh0Q29udGVudCA9IHRoaXMucmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50LCBibG9ja05hbWUsIHJlcGxhY2VtZW50KTtcbiAgICAgIGlmICghbmV4dENvbnRlbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nIGluY29tcGxldGUgJHtibG9ja05hbWV9IGJsb2NrIGluICR7dGhpcy50b29sTmFtZX0gY29uZmlnOiAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdDb250ZW50O1xuICAgICAgfVxuICAgICAgY29udGVudCA9IG5leHRDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdE1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKS5leGVjKGNvbnRlbnQpPy5bMF07XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgcmVwbGFjZW1lbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGF0dGVybiA9IHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSk7XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IFJlZ0V4cCB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgICBgJHtlc2NhcGVSZWdFeHAodGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKX1bXFxcXHNcXFxcU10qPyR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSkpfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFydE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OnN0YXJ0ICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OmVuZCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGZtdCcsXG4gIHRvb2xOYW1lOiAnb3hmbXQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hmbXRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGZtdC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgIGZpbGVQYXRoLFxuICAgIH0pO1xuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBveGZtdEJhc2VDb25maWdNb2R1bGUgPSByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnLCAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycpO1xuXG4gIC8vIENvbW1vbkpTIHBhY2thZ2VzIG5lZWQgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cyBoZXJlOiBveGZtdCBjb25maWcgZmlsZXMgYXJlXG4gIC8vIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIHRoZSBzaGFyZWQgY29uZmlnIHBhY2thZ2UgaXMgRVNNLW9ubHkuXG4gIC8vIE5vIC8vLyA8cmVmZXJlbmNlIHR5cGVzPiBsaW5lOiB0aGUgd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcgYWxyZWFkeSBjb3ZlcnMgKi5jb25maWcudHMgd2l0aFxuICAvLyB0eXBlcyBbXCJidW5cIl0sIHdoaWNoIHR5cGVzIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMsIHdoaWxlIGEgXCJub2RlXCIgcmVmZXJlbmNlIGJyZWFrcyB1bmRlclxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIgd2hlcmUgdGhlIHVuZGVjbGFyZWQgQHR5cGVzL25vZGUgaXMgdW5yZXNvbHZhYmxlIChUUzI2ODgpLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGBpbXBvcnQgdHlwZSB7IE94Zm10Q29uZmlnIH0gZnJvbSAnb3hmbXQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hmbXQgY29uZmlnIGZpbGVzIGFyZSBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGZtdENvbmZpZyA9IHJlcXVpcmUoJyR7b3hmbXRCYXNlQ29uZmlnTW9kdWxlfScpO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnOiBPeGZtdENvbmZpZyA9IG94Zm10Q29uZmlnLmRlZmF1bHQgPz8gb3hmbXRDb25maWc7YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hmbXRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCB0eXBlIHsgT3hmbXRDb25maWcgfSBmcm9tICdveGZtdCc7XG5cbmltcG9ydCBjb25maWcgZnJvbSAnJHtveGZtdEJhc2VDb25maWdNb2R1bGV9JztcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBjb25maWc7YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQge1xuICBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UsXG4gIHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZSxcbn0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGxpbnQnLFxuICB0b29sTmFtZTogJ294bGludCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgX3Jvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94bGludENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyBjb25maWcgZmlsZXMgYXMgcHJvZHVjdCBjb2RlLCBzbyBnZW5lcmF0aW9uXG4gICAgLy8gbXVzdCBub3QgcmVwbGFjZSBwYWNrYWdlLXByb3ZpZGVkIGxpbnRlciBzZXR0aW5ncy4gR2VuZXJhdGVkIGZpbGVzIHdpdGhcbiAgICAvLyBtYW5hZ2VkIGJsb2NrcyBhcmUgc3RpbGwgc2FmZSB0byB1cGRhdGUuXG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgPSBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294bGludC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVFeGlzdGluZ0NvbnRlbnQgPVxuICAgICAgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgJiYgZXhpc3RpbmdDb250ZW50ICYmICFtYW5hZ2VkQ29uZmlnQmxvY2tzLmhhc01hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50KTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50XG4gICAgICA/IGV4aXN0aW5nQ29udGVudFxuICAgICAgOiBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICB9KTtcblxuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBpc1Jvb3RDb25maWcgPSBjb25maWcuaXNSb290O1xuICBjb25zdCBveGxpbnRCYXNlQ29uZmlnTW9kdWxlID0gcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlKGNvbmZpZywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyk7XG5cbiAgLy8gRG8gbm90IGNvbGxhcHNlIHRoaXMgdG8gYSBzdGF0aWMgaW1wb3J0IGZvciBldmVyeSBwYWNrYWdlLiBDb21tb25KUyBwYWNrYWdlc1xuICAvLyB0eXBlLWNoZWNrIGF1dG8tZGlzY292ZXJlZCBveGxpbnQuY29uZmlnLnRzIGFzIENvbW1vbkpTLCBzbyBpbXBvcnRpbmcgdGhlIEVTTVxuICAvLyBAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZyBwYWNrYWdlIHRyaWdnZXJzIFRTMTQ3OS4gS2VlcCB0aGlzIGluIHN5bmMgd2l0aFxuICAvLyBsaXRlcmFjeS10ZXN0J3MgZ2VuZXJhdGVkIGNvbmZpZyBwYXR0ZXJuLlxuICAvLyBObyAvLy8gPHJlZmVyZW5jZSB0eXBlcz4gbGluZTogdGhlIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnIGFscmVhZHkgY292ZXJzICouY29uZmlnLnRzIHdpdGhcbiAgLy8gdHlwZXMgW1wiYnVuXCJdLCB3aGljaCB0eXBlcyByZXF1aXJlL21vZHVsZS5leHBvcnRzLCB3aGlsZSBhIFwibm9kZVwiIHJlZmVyZW5jZSBicmVha3MgdW5kZXJcbiAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIHdoZXJlIHRoZSB1bmRlY2xhcmVkIEB0eXBlcy9ub2RlIGlzIHVucmVzb2x2YWJsZSAoVFMyNjg4KS5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgaW1wb3J0IHR5cGUgeyBPeGxpbnRDb25maWcgfSBmcm9tICdveGxpbnQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hsaW50IG9ubHkgYXV0by1kaXNjb3ZlcnMgLnRzIGNvbmZpZyBmaWxlcywgYW5kIENvbW1vbkpTIGF2b2lkcyBFU00gcGFja2FnZSBsb2FkaW5nIGlzc3Vlcy5cbmNvbnN0IG94bGludEJhc2VDb25maWcgPSByZXF1aXJlKCcke294bGludEJhc2VDb25maWdNb2R1bGV9Jyk7XG5cbiR7Z2V0UmVzb2x2ZWRDb25maWdDb250ZW50KCdveGxpbnRCYXNlQ29uZmlnLmRlZmF1bHQgPz8gb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgJ2Jhc2UnLFxuICAgIGBpbXBvcnQgdHlwZSB7IE94bGludENvbmZpZyB9IGZyb20gJ294bGludCc7XG5cbmltcG9ydCBveGxpbnRCYXNlQ29uZmlnIGZyb20gJyR7b3hsaW50QmFzZUNvbmZpZ01vZHVsZX0nO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG59XG5cbi8vIHN0cnVjdHVyZWRDbG9uZSBrZWVwcyBhIHBhY2thZ2UtbG9jYWwgY29weSBzbyByZXBvc2l0b3JpZXMgY2FuIGFkZCBzZXR0aW5ncyBvdXRzaWRlIG1hbmFnZWRcbi8vIGJsb2NrcyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgaW1wb3J0ZWQgY29uZmlnIG9iamVjdC4gVGhlIHJvb3QgY29uZmlnIGZvcmNlcyB0aGUgdHlwZS1hd2FyZVxuLy8gb3B0aW9ucyBvbiBpbnNpZGUgdGhlIG1hbmFnZWQgYmxvY2sgc28gbm8gY3VzdG9taXphdGlvbiBjYW4gc2lsZW50bHkgZGlzYWJsZSB0eXBlIGNoZWNraW5nOyBldmVyeVxuLy8gb3RoZXIgY29uZmlnIGRlbGV0ZXMgdGhlbSBiZWNhdXNlIE94bGludCByZWplY3RzIHRob3NlIHJvb3Qtb25seSBvcHRpb25zIGVsc2V3aGVyZSAodHlwZSBjaGVja2luZ1xuLy8gc3Vydml2ZXM6IHRoZSBsaW50IGNvbW1hbmRzIHBhc3MgLS10eXBlLWF3YXJlIGFuZCAtLXR5cGUtY2hlY2sgZXhwbGljaXRseSkuXG5mdW5jdGlvbiBnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoYmFzZUNvbmZpZ05hbWU6IHN0cmluZywgaXNSb290Q29uZmlnOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzUm9vdENvbmZpZykge1xuICAgIHJldHVybiBgY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWc6IE94bGludENvbmZpZyA9IHN0cnVjdHVyZWRDbG9uZSgke2Jhc2VDb25maWdOYW1lfSk7XG5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zID0geyAuLi5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zLCB0eXBlQXdhcmU6IHRydWUsIHR5cGVDaGVjazogdHJ1ZSB9O2A7XG4gIH1cblxuICByZXR1cm4gYGNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xuZGVsZXRlIG94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnM7YDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncHlyaWdodGNvbmZpZy5qc29uJyk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb3JpZ2luYWxTZXR0aW5nc0pzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KG9sZENvbnRlbnQpKSB7XG4gICAgICAvLyBweXJpZ2h0Y29uZmlnLmpzb24gYWxsb3dzIEpTT05DOyBhbiBleGlzdGluZyBmaWxlIHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdFxuICAgICAgLy8gdW50b3VjaGVkIGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgYmFyZSB0ZW1wbGF0ZS5cbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KG9sZENvbnRlbnQpO1xuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUob2xkU2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfVxuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHB5cmlnaHRjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAob3JpZ2luYWxTZXR0aW5nc0pzb24gPT09IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShuZXdTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjb25zdW1lc0RvY2tlckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBtYW5hZ2VkU2NyaXB0c0Jsb2NrID0gYHNjcmlwdHMvKipcbiFzY3JpcHRzL1xuIXNjcmlwdHMvKi5zaGA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhSYWlsd2F5aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFJhaWx3YXlpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmFpbHdheWlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3QgdXNlc0RvY2tlckVudiA9IGNvbnN1bWVzRG9ja2VyRW52KGNvbmZpZy5kb2NrZXJmaWxlKTtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIGlmIChjb25maWcuaXNSYWlsd2F5ICYmIHVzZXNEb2NrZXJFbnYpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsICchLmRvY2tlci5lbnZcXG4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL15zY3JpcHRzXFwvJC9tLCBtYW5hZ2VkU2NyaXB0c0Jsb2NrKTtcbiAgICAvLyBgcmFpbHdheSB1cGAgc3RyaXBzIGdpdGlnbm9yZWQgZmlsZXMgZnJvbSB0aGUgdXBsb2FkZWQgYnVpbGQgY29udGV4dCwgc28gdGhlIGdlbmVyYXRlZFxuICAgIC8vIG5vbi1zZWNyZXQgLmRvY2tlci5lbnYgKGB3YiBnZW4tZG9ja2VyLWVudmAgb3V0cHV0KSBuZWVkcyBhbiBleHBsaWNpdCB1bi1pZ25vcmUgdG8gcmVhY2hcbiAgICAvLyB0aGUgcmVtb3RlIERvY2tlciBidWlsZC4gQXBwZW5kZWQsIG5vdCBwcmVwZW5kZWQ6IGlnbm9yZSBmaWxlcyBhcmUgbGFzdC1tYXRjaC13aW5zLCBzbyBhXG4gICAgLy8gaGFuZC13cml0dGVuIHBhdHRlcm4gc3VjaCBhcyBgKi5lbnZgIGVhcmxpZXIgaW4gdGhlIGZpbGUgbXVzdCBub3Qgc2lsZW50bHkgcmUtZXhjbHVkZSBpdC5cbiAgICBpZiAodXNlc0RvY2tlckVudiAmJiAhL14hXFwuZG9ja2VyXFwuZW52JC9tLnRlc3QobmV3Q29udGVudCkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBgJHtuZXdDb250ZW50LnJlcGxhY2UoL1xcbj8kLywgJ1xcbicpfSEuZG9ja2VyLmVudlxcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9ja2VyZmlsZSAmJiAhdXNlc0RvY2tlckVudikge1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXiFcXC5kb2NrZXJcXC5lbnZcXG4/L20sICcnKTtcbiAgICB9XG4gICAgaWYgKG5ld0NvbnRlbnQgPT09IGNvbnRlbnQpIHJldHVybjtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgbmV3Q29udGVudCA/IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpIDogZnNVdGlsLnJlbW92ZUNvbmZpbmVkKGZpbGVQYXRoKVxuICAgICk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBJbWFnZSwgTGluaywgUGFyYWdyYXBoLCBQaHJhc2luZ0NvbnRlbnQsIFJvb3RDb250ZW50IH0gZnJvbSAnbWRhc3QnO1xuaW1wb3J0IHsgZnJvbU1hcmtkb3duIH0gZnJvbSAnbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmNvbnN0IHdiZnlCYWRnZVVybFByZWZpeCA9ICdodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL3diZnktJztcbmNvbnN0IHdiZnlCYWRnZVVybFN1ZmZpeCA9ICctMWU5MGZmLnN2Zyc7XG5jb25zdCB3YmZ5QmFkZ2VMaW5rID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvdHJlZS9tYWluL3BhY2thZ2VzL3diZnknO1xuXG5jb25zdCBucG1QYWNrYWdlVXJsUHJlZml4ID0gJ2h0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlLyc7XG5jb25zdCBucG1MaWNlbnNlQmFkZ2VQYXR0ZXJuID0gL15cXFshXFxbW15cXF1dKlxcXVxcKGh0dHBzOlxcL1xcL2ltZ1xcLnNoaWVsZHNcXC5pb1xcL25wbVxcL2xcXC9bXilcXHNdK1xcKVxcXVxcKFteKVxcc10rXFwpJC91O1xuXG5jb25zdCBtYW5hZ2VkQmFkZ2VQYXR0ZXJucyA9IFtcbiAgL15cXFshXFxbd2JmeVxcXVxcKGh0dHBzOlxcL1xcL2ltZ1xcLnNoaWVsZHNcXC5pb1xcL2JhZGdlXFwvd2JmeS1bXilcXHNdKy0xZTkwZmZcXC5zdmdcXClcXF1cXChodHRwczpcXC9cXC9naXRodWJcXC5jb21cXC9XaWxsQm9vc3RlclxcL3NoYXJlZFxcL3RyZWVcXC9tYWluXFwvcGFja2FnZXNcXC93YmZ5XFwpJC91LFxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoKGh0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcL1teKVxcc10rXFwvYWN0aW9uc1xcL3dvcmtmbG93c1xcL1teKVxcc10rKVxcL2JhZGdlXFwuc3ZnXFwpXFxdXFwoXFwxXFwpJC91LFxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoW14pXFxzXStcXClcXF1cXChodHRwcz86XFwvXFwvKD86d3d3XFwuKT9ucG1qc1xcLmNvbVxcL3BhY2thZ2VcXC9bXilcXHNdKlxcKSQvdSxcbiAgbnBtTGljZW5zZUJhZGdlUGF0dGVybixcbl07XG5cbmZ1bmN0aW9uIGJ1aWxkV2JmeUJhZGdlKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIeXBoZW5zIGFyZSBlc2NhcGVkIGFzIGAtLWAgcGVyIHNoaWVsZHMuaW8ncyBiYWRnZSBwYXRoIHN5bnRheCwgc28gYHYxLjIuMy1yYy4xYCBzdGF5cyBpbnRhY3QuXG4gIHJldHVybiBgWyFbd2JmeV0oJHt3YmZ5QmFkZ2VVcmxQcmVmaXh9JHtsYWJlbC5yZXBsYWNlQWxsKCctJywgJy0tJyl9JHt3YmZ5QmFkZ2VVcmxTdWZmaXh9KV0oJHt3YmZ5QmFkZ2VMaW5rfSlgO1xufVxuXG4vKiogVGhlIHZlcnNpb24gbGFiZWwgdGhlIHdiZnkgYmFkZ2UgaW4gdGhlIHJlcG9zaXRvcnkncyBSRUFETUUgcmVjb3JkcywgaS5lLiB0aGUgYnVpbGQgdGhhdCB3YmZpZWQgaXQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIC8vIENvbmZpbmVkLCBhbmQgdG9sZXJhbnQgb2YgYW55IHJlYWQgZmFpbHVyZTogYSBSRUFETUUgdGhhdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IChhXG4gIC8vIGNvbW1pdHRlZCBzeW1saW5rKSBvciBjYW5ub3QgYmUgcmVhZCBhdCBhbGwgc2F5cyBub3RoaW5nIGFib3V0IHdoaWNoIGJ1aWxkIGNvbmZpZ3VyZWQgVEhJU1xuICAvLyByZXBvc2l0b3J5LCBhbmQgdGhlIGFuc3dlciBvbmx5IGV2ZXIgc3VwcHJlc3NlcyB3b3JrIOKAlCBzbyBhbnl0aGluZyBidXQgYSByZWFkYWJsZSBpbi1yZXBvc2l0b3J5XG4gIC8vIFJFQURNRSBtZWFucyBcIm5vdCBrbm93biB0byBiZSBhcHBsaWVkXCIgYW5kIHRoZSBydW4gcHJvY2VlZHMuXG4gIGNvbnN0IHJlYWRtZSA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdSRUFETUUubWQnKSkuY2F0Y2goKCkgPT4ge30pO1xuICBpZiAocmVhZG1lID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFJFQURNRSBpcyBwYXJzZWQgcmF0aGVyIHRoYW4gc2Nhbm5lZCwgZm9yIHRoZSBzYW1lIHJlYXNvbiB3cml0ZUJhZGdlQmxvY2sgcGFyc2VzIGl0LCBhbmRcbiAgLy8gb25seSB0aGUgc2hhcGUgd3JpdGVCYWRnZUJsb2NrIGl0c2VsZiB3cml0ZXMgY291bnRzIGFzIGFuIGFwcGxpZWQgYmFkZ2U6IGEgdG9wLWxldmVsIHBhcmFncmFwaFxuICAvLyBvZiBiYWRnZXMuIEEgYmFkZ2UgYW55d2hlcmUgZWxzZSBpcyBjb250ZW50IHRoYXQgbWVyZWx5IG1lbnRpb25zIG9uZSDigJQgYSBmZW5jZWQgZXhhbXBsZSAod2JmeSdzXG4gIC8vIG93biBkb2N1bWVudGF0aW9uIGhhcyB0aG9zZSksIGEgYmxvY2sgcXVvdGUsIGEgbGlzdCBpdGVtIOKAlCBhbmQgcmVhZGluZyBpdCBhcyBhcHBsaWVkIHdvdWxkIHNraXBcbiAgLy8gZXZlcnkgZml4ZXIgZm9yIHRoZSByZXBvc2l0b3J5LlxuICBmb3IgKGNvbnN0IG5vZGUgb2YgZnJvbU1hcmtkb3duKHJlYWRtZSkuY2hpbGRyZW4pIHtcbiAgICBpZiAoIWlzQmFkZ2VCbG9ja05vZGUobm9kZSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgYmFkZ2Ugb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKCFpc0JhZGdlTm9kZShiYWRnZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyB1cmwgfSA9IGJhZGdlLmNoaWxkcmVuWzBdO1xuICAgICAgaWYgKHVybC5zdGFydHNXaXRoKHdiZnlCYWRnZVVybFByZWZpeCkgJiYgdXJsLmVuZHNXaXRoKHdiZnlCYWRnZVVybFN1ZmZpeCkpIHtcbiAgICAgICAgcmV0dXJuIHVybC5zbGljZSh3YmZ5QmFkZ2VVcmxQcmVmaXgubGVuZ3RoLCAtd2JmeUJhZGdlVXJsU3VmZml4Lmxlbmd0aCkucmVwbGFjZUFsbCgnLS0nLCAnLScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICAvLyBUaGUgd2JmeSBiYWRnZSBtYXJrcyBhIHJlcG9zaXRvcnkgYXMgd2JmaWVkLCBzbyBhIHJlcG9zaXRvcnkgd2l0aG91dCBhIFJFQURNRSBzdGlsbCBnZXRzIG9uZS5cbiAgICAvLyByZWFkRmlsZUlmRXhpc3RzIGZhbGxzIGJhY2sgT05MWSBvbiBFTk9FTlQ6IGEgUkVBRE1FIHRoYXQgZXhpc3RzIGJ1dCBjYW5ub3QgYmUgcmVhZCAoZS5nLlxuICAgIC8vIHBlcm1pc3Npb25zLCBFTUZJTEUpIG11c3QgYWJvcnQgdGhlIGdlbmVyYXRvciBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggdGhlIHN0dWIuXG4gICAgbGV0IG5ld0NvbnRlbnQgPVxuICAgICAgKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz9cbiAgICAgIGAjICR7Y29uZmlnLnBhY2thZ2VKc29uPy5uYW1lID8/IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKSl9XFxuYDtcblxuICAgIC8vIE9yZGVyZWQgYnkgd2hhdCBhIHJlYWRlciBjYXJlcyBhYm91dCBtb3N0OiB0aGUgbnBtIGJhZGdlIG5hbWVzIHRoZSBwYWNrYWdlIGEgcmVhZGVyIGluc3RhbGxzLFxuICAgIC8vIHRoZW4gdGhlIHdvcmtmbG93IGJhZGdlcyByZXBvcnQgd2hldGhlciB0aGUgY29kZSBpcyBjdXJyZW50bHkgaGVhbHRoeSwgdGhlbiBob3cgaXQgaXNcbiAgICAvLyByZWxlYXNlZCwgYW5kIGxhc3QgdGhlIHdiZnkgYnVpbGQgdGhhdCBjb25maWd1cmVkIGl0LlxuICAgIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGF3YWl0IGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZyk7XG4gICAgaWYgKHBhY2thZ2VOYW1lKSB7XG4gICAgICBiYWRnZXMucHVzaChidWlsZE5wbUJhZGdlKHBhY2thZ2VOYW1lKSk7XG4gICAgICBjb25zdCBsaWNlbnNlID0gY29uZmlnLnBhY2thZ2VKc29uPy5saWNlbnNlO1xuICAgICAgaWYgKGxpY2Vuc2UgJiYgbGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnKSB7XG4gICAgICAgIGJhZGdlcy5wdXNoKGJ1aWxkTGljZW5zZUJhZGdlKHBhY2thZ2VOYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGJhZGdlcy5wdXNoKC4uLihhd2FpdCBidWlsZFdvcmtmbG93QmFkZ2VzKGNvbmZpZykpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIGJhZGdlcy5wdXNoKHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICBiYWRnZXMucHVzaChidWlsZFdiZnlCYWRnZShnZXRXYmZ5VmVyc2lvbkxhYmVsKCkgPz8gJ2FwcGxpZWQnKSk7XG5cbiAgICAvLyBUaGUgYmxvY2sgaXMgd3JpdHRlbiBpbiBvbmUgcGFzcyBmcm9tIHRoZSBiYWRnZXMgd2JmeSBtYW5hZ2VzIHJpZ2h0IG5vdy4gQSBiYWRnZSB0aGF0IGlzIG5vXG4gICAgLy8gbG9uZ2VyIHdhbnRlZCDigJQgYSBzdXBlcnNlZGVkIHZlcnNpb24sIG9yIG9uZSB3aG9zZSB3b3JrZmxvdyBpcyBnb25lIOKAlCBzaW1wbHkgaXMgbm90IGluIHRoZVxuICAgIC8vIGxpc3QsIHNvIG5vdGhpbmcgaGFzIHRvIHJlbW92ZSBpdC5cbiAgICBuZXdDb250ZW50ID0gd3JpdGVCYWRnZUJsb2NrKG5ld0NvbnRlbnQsIGJhZGdlcyk7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCwgZ2V0TGluZUVuZGluZyhuZXdDb250ZW50KSkpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGlzaGVkTnBtUGFja2FnZU5hbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBjb25maWcucGFja2FnZUpzb247XG4gIC8vIEEgbW9ub3JlcG8gaGFzIG5vIHNpbmdsZSBucG0gdmVyc2lvbiByZXByZXNlbnRpbmcgdGhlIHdob2xlIHJlcG9zaXRvcnkuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgfHwgIWNvbmZpZy5yZWxlYXNlLm5wbSB8fCAhcGFja2FnZUpzb24/Lm5hbWUgfHwgcGFja2FnZUpzb24ucHJpdmF0ZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIChhd2FpdCBpc01pc3NpbmdGcm9tTnBtUmVnaXN0cnkocGFja2FnZUpzb24ubmFtZSkpID8gdW5kZWZpbmVkIDogcGFja2FnZUpzb24ubmFtZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZWdpc3RyeSBhbnN3ZXJzIHRoYXQgaXQgaGFzIG5vIHN1Y2ggcGFja2FnZSDigJQgdGhlIE9OTFkgYW5zd2VyIHRoYXQgcmVtb3ZlcyBhIGJhZGdlLlxuICogQSBjaGVjayB0aGF0IGNhbm5vdCBydW4gKG9mZmxpbmUsIGFuIG91dGFnZSwgYSB0aW1lb3V0KSBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHBhY2thZ2UsIGFuZFxuICogdHJlYXRpbmcgaXQgYXMgYWJzZW50IHdvdWxkIHN0cmlwIHRoZSBiYWRnZSBvdXQgb2YgZXZlcnkgcHVibGlzaGVkIHJlcG9zaXRvcnkgd2JmeSB0b3VjaGVzXG4gKiBkdXJpbmcgdGhlIG91dGFnZSBhbmQgcHV0IGl0IGJhY2sgYWZ0ZXJ3YXJkcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNNaXNzaW5nRnJvbU5wbVJlZ2lzdHJ5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICAvLyBUaGUgc2NvcGUgc2VwYXJhdG9yIG11c3Qgc3Vydml2ZSBhcyBhIHBhdGggc2VnbWVudCwgc28gdGhlIG5hbWUgaXMgZW5jb2RlZCBwaWVjZXdpc2UuXG4gICAgY29uc3QgZW5jb2RlZE5hbWUgPSBwYWNrYWdlTmFtZS5zcGxpdCgnLycpLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJy8nKTtcbiAgICAvLyBBIGJhZGdlIGlzIGRlY29yYXRpb246IGEgc3RhbGxlZCByZWdpc3RyeSBjb25uZWN0aW9uIG11c3Qgbm90IGhvbGQgdGhlIHdob2xlIHJ1biBmb3IgaG93ZXZlclxuICAgIC8vIGxvbmcgdGhlIG5ldHdvcmtpbmcgc3RhY2sgd291bGQgd2FpdC4gVGhlIGJ1ZGdldCBpcyBnZW5lcm91cyBiZWNhdXNlIGEgdGltZW91dCBhbnN3ZXJzXG4gICAgLy8gXCJ1bmtub3duXCIsIHdoaWNoIGtlZXBzIHRoZSBiYWRnZSDigJQgYW5kIG9uIGEgcmVwb3NpdG9yeSB0aGF0IGlzIG5vdCBvbiBucG0gdGhhdCBtZWFucyB3cml0aW5nXG4gICAgLy8gb25lIGl0IHNob3VsZCBub3QgaGF2ZTsgYSB3YmZ5IHJ1biBhbHJlYWR5IHNwZW5kcyBtaW51dGVzIG9uIGluc3RhbGxzLCBzbyB3YWl0aW5nIGEgbGl0dGxlXG4gICAgLy8gbG9uZ2VyIGZvciBhIHJlYWwgYW5zd2VyIGNvc3RzIGxlc3MgdGhhbiBhY3Rpbmcgb24gYSBtaXNzaW5nIG9uZS5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy8ke2VuY29kZWROYW1lfWAsIHtcbiAgICAgIG1ldGhvZDogJ0hFQUQnLFxuICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDEwXzAwMCksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGROcG1CYWRnZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBbIVtucG0gdmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9ucG0vdi8ke3BhY2thZ2VOYW1lfS5zdmcpXSgke25wbVBhY2thZ2VVcmxQcmVmaXh9JHtwYWNrYWdlTmFtZX0pYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRMaWNlbnNlQmFkZ2UocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgWyFbbGljZW5zZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9ucG0vbC8ke3BhY2thZ2VOYW1lfS5zdmcpXSgke25wbVBhY2thZ2VVcmxQcmVmaXh9JHtwYWNrYWdlTmFtZX0pYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRXb3JrZmxvd0JhZGdlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICBpZiAoIXJlcG9zaXRvcnkgfHwgIWZzLmV4aXN0c1N5bmMod29ya2Zsb3dzUGF0aCkpIHJldHVybiBbXTtcblxuICAvLyBXb3JrZmxvdyBhbmQgUkVBRE1FIGdlbmVyYXRpb24gcnVuIGNvbmN1cnJlbnRseS4gRG8gbm90IHJldGFpbiBhIHN0YWxlIFJ1c3QgYmFkZ2Ugd2hpbGUgdGhlXG4gIC8vIHdvcmtmbG93IGdlbmVyYXRvciByZW1vdmVzIGEgY2FsbGVyIGNyZWF0ZWQgZnJvbSBhIGZvcm1lcmx5IG1pc2RldGVjdGVkIGxvY2FsIGNhY2hlIOKAlCBidXRcbiAgLy8gbWlycm9yIGl0cyBvd25lcnNoaXAgY2hlY2s6IGEgY3VzdG9tIHNhbWUtbmFtZWQgd29ya2Zsb3cgc3Vydml2ZXMsIHNvIGl0cyBiYWRnZSBtdXN0IHRvby5cbiAgLy8gRGVjaWRlZCBzeW5jaHJvbm91c2x5IGJlZm9yZSB0aGUgbG9vcCdzIGZpcnN0IGF3YWl0OiB0aGUgZ2VuZXJhdG9yJ3MgZGVsZXRlIGNhbiBvbmx5IGxhbmQgYXRcbiAgLy8gYW4gYXdhaXQgcG9pbnQsIGFuZCBhIHBvc3QtZGVsZXRlIHJlYWQgd291bGQgbWlzcmVwb3J0IHRoZSB3YmZ5LW93bmVkIGNhbGxlciBhcyBjdXN0b20uXG4gIC8vIE5vIGV4aXN0c1N5bmMgcHJlLWNoZWNrOiB0aGUgaGVscGVyIGFscmVhZHkgdHJlYXRzIGEgbWlzc2luZyBmaWxlIGFzIG5vdCBvd25lZCwgYW5kIHRoaXMgcnVuc1xuICAvLyBvbmNlIHBlciByZXBvc2l0b3J5LCBzbyB0aGUgZXhjZXB0aW9uYWwgRU5PRU5UIHJlYWQgY29zdHMgbm90aGluZyB3b3J0aCBhIHJlZHVuZGFudCBzdGF0LlxuICBjb25zdCBkcm9wc1Rlc3RSdXN0QmFkZ2UgPVxuICAgIGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDAgJiYgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93KHdvcmtmbG93c1BhdGgsICd0ZXN0LXJ1c3QueW1sJywgJ3Rlc3QtcnVzdCcpO1xuXG4gIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKSkge1xuICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG4gICAgaWYgKGZpbGVOYW1lID09PSAndGVzdC1ydXN0LnltbCcgJiYgZHJvcHNUZXN0UnVzdEJhZGdlKSBjb250aW51ZTtcbiAgICAvLyBHaXRIdWIncyBiYWRnZSBlbmRwb2ludCByZXR1cm5zIDQwNCB1bnRpbCB0aGUgd29ya2Zsb3cgaGFzIGF0IGxlYXN0IG9uZSBydW4sIHNvIGEgYmFkZ2UgZm9yIGFcbiAgICAvLyBkaXNwYXRjaC1vbmx5IGRlcGxveSB3b3JrZmxvdyB0aGF0IGhhcyBuZXZlciBydW4gcmVuZGVycyBhcyBhIGJyb2tlbiBpbWFnZS4gVGVzdCB3b3JrZmxvd3MgcnVuXG4gICAgLy8gb24gZXZlcnkgUFIsIHNvIG9ubHkgZGVwbG95IGJhZGdlcyBuZWVkIHRoZSBndWFyZC5cbiAgICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgIShhd2FpdCBoYXNBbnlXb3JrZmxvd1J1bihyZXBvc2l0b3J5LCBmaWxlTmFtZSwgY29uZmlnLmlzUHVibGljUmVwbykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYmFkZ2VOYW1lID0gKGZpbGVOYW1lWzBdID8/ICcnKS50b1VwcGVyQ2FzZSgpICsgZmlsZU5hbWUuc2xpY2UoMSwgZmlsZU5hbWUuaW5kZXhPZignLicpKS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICBjb25zdCB3b3JrZmxvd1VybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2VuY29kZVVybFBhdGgoZmlsZU5hbWUpfWA7XG4gICAgYmFkZ2VzLnB1c2goYFshWyR7YmFkZ2VOYW1lfV0oJHt3b3JrZmxvd1VybH0vYmFkZ2Uuc3ZnKV0oJHt3b3JrZmxvd1VybH0pYCk7XG4gIH1cbiAgcmV0dXJuIGJhZGdlcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFzQW55V29ya2Zsb3dSdW4oXG4gIHJlcG9zaXRvcnk6IHN0cmluZyxcbiAgd29ya2Zsb3dGaWxlTmFtZTogc3RyaW5nLFxuICBpc1B1YmxpY1JlcG86IGJvb2xlYW5cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gcmVwb3NpdG9yeS5zcGxpdCgnLycpO1xuICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm4gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQob3duZXIpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9ydW5zJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgd29ya2Zsb3dfaWQ6IHdvcmtmbG93RmlsZU5hbWUsXG4gICAgICBwZXJfcGFnZTogMSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS50b3RhbF9jb3VudCA+IDA7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRm9yIGEgUFVCTElDIHJlcG9zaXRvcnkgdGhlIHJ1bnMgZW5kcG9pbnQgbmVlZHMgbm8gYXV0aG9yaXphdGlvbiwgc28gNDA0IHJlbGlhYmx5IG1lYW5zIHRoZVxuICAgIC8vIHdvcmtmbG93IGlzIGFic2VudCBmcm9tIHRoZSByZW1vdGUgKGUuZy4gYWRkZWQgbG9jYWxseSwgbmV2ZXIgcHVzaGVkKSDigJQgbGlrZSB6ZXJvIHJ1bnMsIGl0c1xuICAgIC8vIGJhZGdlIHdvdWxkIHJlbmRlciBicm9rZW4uIEZvciBhIFBSSVZBVEUgcmVwb3NpdG9yeSBHaXRIdWIgYWxzbyBhbnN3ZXJzIDQwNCB3aGVuIHRoZSB0b2tlblxuICAgIC8vIGlzIG1pc3Npbmcgb3IgdW5kZXItc2NvcGVkLCBzbyA0MDQgaXMgYW1iaWd1b3VzIHRoZXJlIGFuZCB0aGUgYmFkZ2UgaXMga2VwdC5cbiAgICBpZiAoKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cyA9PT0gNDA0ICYmIGlzUHVibGljUmVwbykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIEtlZXAgdGhlIHByZS1ndWFyZCBiZWhhdmlvciAoaW5zZXJ0IHRoZSBiYWRnZSkgd2hlbiB0aGUgY2hlY2sgaXRzZWxmIGNhbm5vdCBydW4uXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXBsYWNlcyB0aGUgYmFkZ2UgYmxvY2tzIGRpcmVjdGx5IHVuZGVyIHRoZSB0aXRsZSB3aXRoIGBtYW5hZ2VkQmFkZ2VzYCwga2VlcGluZyBhbnkgYmFkZ2UgdGhlcmVcbiAqIHRoYXQgd2JmeSBkb2VzIG5vdCBtYW5hZ2UsIGFuZCByZWFzc2VtYmxlcyB0aGUgUkVBRE1FIGFyb3VuZCB0aGVtIHdpdGggZXhhY3RseSBvbmUgYmxhbmsgbGluZSBvblxuICogZWFjaCBzaWRlLlxuICpcbiAqIEJvdGggdGhlIHRpdGxlIGFuZCB0aGUgYmxvY2sgYXJlIGxvY2F0ZWQgaW4gYSBDb21tb25NYXJrIHN5bnRheCB0cmVlIHJhdGhlciB0aGFuIGJ5IHNjYW5uaW5nXG4gKiBsaW5lczogb25seSBhIHJlYWwgcGFyc2VyIGtub3dzIHdoZXRoZXIgYSBsaW5lIHRoYXQgbG9va3MgbGlrZSBhIGJhZGdlIGlzIGEgYmFkZ2UgKGEgcGFyYWdyYXBoIG9mXG4gKiBsaW5rZWQgaW1hZ2VzKSBvciBjb250ZW50IHRoYXQgbWVyZWx5IHJlYWRzIGxpa2Ugb25lIChhbiBpbmRlbnRlZCBjb2RlIGJsb2NrLCBhIGJsb2NrIHF1b3RlLCBhXG4gKiBmZW5jZWQgZXhhbXBsZSwgYSBtdWx0aWxpbmUgY29kZSBzcGFuLCBhbiBIVE1MIGJsb2NrKS4gRXZlcnl0aGluZyBvdXRzaWRlIHRoZSBibG9jayBpcyBjb3BpZWQgYmFja1xuICogdmVyYmF0aW0gZnJvbSB0aGUgb3JpZ2luYWwgdGV4dCB0aHJvdWdoIHRoZSBwYXJzZXIncyBwb3NpdGlvbmFsIG9mZnNldHMsIHNvIG5vIHJlZm9ybWF0dGluZyBvZiB0aGVcbiAqIHVzZXIncyBjb250ZW50IGlzIHBvc3NpYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVCYWRnZUJsb2NrKHJlYWRtZTogc3RyaW5nLCBtYW5hZ2VkQmFkZ2VzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVFbmRpbmcgPSBnZXRMaW5lRW5kaW5nKHJlYWRtZSk7XG4gIC8vIEEgQk9NIGlzIG5vdCBNYXJrZG93bjogbGVmdCBpbiB0aGUgdGV4dCBpdCBoaWRlcyB0aGUgYCNgIG9mIHRoZSB0aXRsZSBmcm9tIHRoZSBwYXJzZXIsIGFuZFxuICAvLyBwcmVwZW5kaW5nIHRoZSBibG9jayBhaGVhZCBvZiBpdCB3b3VsZCBzdHJpcCB0aGUgbWFya2VyIGZyb20gdGhlIGZpbGUncyBmaXJzdCBieXRlLlxuICBjb25zdCBieXRlT3JkZXJNYXJrID0gcmVhZG1lLnN0YXJ0c1dpdGgoJ++7vycpID8gJ++7vycgOiAnJztcbiAgLy8gRnJvbnQgbWF0dGVyIGlzIGRlbGltaXRlZCBieSB0aGUgc2FtZSBgLS0tYCBhIFNldGV4dCBoZWFkaW5nIGFuZCBhIHRoZW1hdGljIGJyZWFrIHVzZSwgc28gaXQgaXNcbiAgLy8gZGV0YWNoZWQgYmVmb3JlIHBhcnNpbmcgaW5zdGVhZCBvZiBiZWluZyB0b2xkIGFwYXJ0IGFmdGVyd2FyZHM7IGl0IGFsc28gaGFzIHRvIHN0YXkgZmlyc3QgaW4gdGhlXG4gIC8vIGZpbGUsIHdoaWNoIG1ha2VzIGl0IGEgcHJlZml4IGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IHRoZSBCT00gaXMuXG4gIGNvbnN0IHdpdGhvdXRNYXJrID0gcmVhZG1lLnNsaWNlKGJ5dGVPcmRlck1hcmsubGVuZ3RoKTtcbiAgY29uc3QgZnJvbnRNYXR0ZXIgPSB3aXRob3V0TWFyay5zdGFydHNXaXRoKCctLS0nKVxuICAgID8gKC9eLS0tWyBcXHRdKlxccj9cXG5bXFxzXFxTXSo/Xi0tLVsgXFx0XSooPzpcXHI/XFxufCQpL211LmV4ZWMod2l0aG91dE1hcmspPy5bMF0gPz8gJycpXG4gICAgOiAnJztcbiAgY29uc3QgcHJlZml4ID0gYCR7Ynl0ZU9yZGVyTWFya30ke2Zyb250TWF0dGVyfWA7XG4gIC8vIFRoZSBmaW5hbCBuZXdsaW5lIGlzIHNldCBhc2lkZSByYXRoZXIgdGhhbiBwYXJzZWQgYXMgdHJhaWxpbmcgYmxhbmsgc3BhY2UsIHdoaWNoIHRoZSBibGFuay1saW5lXG4gIC8vIHRyaW1taW5nIGJlbG93IHdvdWxkIG90aGVyd2lzZSBzd2FsbG93LlxuICBjb25zdCBlbmRzV2l0aE5ld2xpbmUgPSAvXFxyP1xcbiQvdS50ZXN0KHJlYWRtZSk7XG4gIGNvbnN0IGNvbnRlbnQgPSB3aXRob3V0TWFyay5zbGljZShmcm9udE1hdHRlci5sZW5ndGgpLnJlcGxhY2UoL1xccj9cXG4kL3UsICcnKTtcblxuICBjb25zdCBub2RlcyA9IGZyb21NYXJrZG93bihjb250ZW50KS5jaGlsZHJlbjtcbiAgLy8gQSBsZWFkaW5nIGJhZGdlIGJsb2NrIGlzIHRoZSB1c2VyJ3Mgb3duIGxheW91dDogaXQgc3RheXMgYWJvdmUgdGhlIHRpdGxlLCBhbmQgd2JmeSdzIGJsb2NrIGdvZXMgYmVsb3cuXG4gIGNvbnN0IGtlZXBzTGVhZGluZ0Jsb2NrID0gISFub2Rlc1swXSAmJiBpc0JhZGdlQmxvY2tOb2RlKG5vZGVzWzBdKSAmJiBpc1RpdGxlTm9kZShub2Rlc1sxXSk7XG4gIGNvbnN0IHRpdGxlSW5kZXggPSBrZWVwc0xlYWRpbmdCbG9jayA/IDEgOiBpc1RpdGxlTm9kZShub2Rlc1swXSkgPyAwIDogLTE7XG4gIC8vIFdpdGhvdXQgYSByZWNvZ25pemFibGUgdGl0bGUgdGhlIGJsb2NrIHNpdHMgYXQgdGhlIHZlcnkgdG9wLCBhYm92ZSBldmVyeXRoaW5nLlxuICBjb25zdCBoZWFkU3RhcnROb2RlID0ga2VlcHNMZWFkaW5nQmxvY2sgPyBub2Rlc1swXSEgOiBub2Rlc1t0aXRsZUluZGV4XTtcbiAgY29uc3QgaGVhZCA9XG4gICAgdGl0bGVJbmRleCA9PT0gLTFcbiAgICAgID8gJydcbiAgICAgIDogY29udGVudC5zbGljZShzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudCwgaGVhZFN0YXJ0Tm9kZSEpLCBub2Rlc1t0aXRsZUluZGV4XSEucG9zaXRpb24hLmVuZC5vZmZzZXQpO1xuXG4gIGNvbnN0IGJhZGdlQmxvY2tOb2RlczogUGFyYWdyYXBoW10gPSBbXTtcbiAgZm9yIChsZXQgbm9kZUluZGV4ID0gdGl0bGVJbmRleCArIDE7IDsgbm9kZUluZGV4KyspIHtcbiAgICBjb25zdCBub2RlID0gbm9kZXNbbm9kZUluZGV4XTtcbiAgICBpZiAoIWlzQmFkZ2VCbG9ja05vZGUobm9kZSkpIGJyZWFrO1xuICAgIGJhZGdlQmxvY2tOb2Rlcy5wdXNoKG5vZGUpO1xuICAgIC8vIFdpdGhvdXQgYSB0aXRsZSwgbWVyZ2luZyBsZWFkaW5nIGJsb2NrcyBjb3VsZCBjaGFuZ2Ugd2hpY2ggbm9kZSBpcyByZWNvZ25pemVkIGFzIHRoZSB0aXRsZSBvbiB0aGUgbmV4dCBydW4uXG4gICAgaWYgKHRpdGxlSW5kZXggPT09IC0xKSBicmVhaztcbiAgfVxuICBjb25zdCBleGlzdGluZyA9IGJhZGdlQmxvY2tOb2Rlcy5mbGF0TWFwKChub2RlKSA9PiByZWFkQmFkZ2VzKG5vZGUsIGNvbnRlbnQpKTtcbiAgY29uc3QgYm9keU5vZGUgPSBub2Rlc1t0aXRsZUluZGV4ICsgMSArIGJhZGdlQmxvY2tOb2Rlcy5sZW5ndGhdO1xuICBjb25zdCBib2R5ID0gYm9keU5vZGUgPyBjb250ZW50LnNsaWNlKHN0YXJ0T2Zmc2V0V2l0aEluZGVudChjb250ZW50LCBib2R5Tm9kZSkpIDogJyc7XG5cbiAgLy8gU3VwZXJzZWRpbmcgYSBtYW5hZ2VkIGJhZGdlIGlzIGp1c3QgZHJvcHBpbmcgdGhlIG9sZCBvbmU6IGEgdmVyc2lvbiwgd29ya2Zsb3csIG5wbSwgb3IgbGljZW5zZVxuICAvLyBjaGFuZ2UgbGVhdmVzIG5vIHN0YWxlIGNvcHksIHdoaWxlIGFueSBvdGhlciBiYWRnZSBpbiB0aGUgbWFuYWdlZCByZWdpb24gaXMga2VwdC5cbiAgY29uc3QgYmFkZ2VzID0gWy4uLm1hbmFnZWRCYWRnZXMsIC4uLmV4aXN0aW5nLmZpbHRlcigoYmFkZ2UpID0+ICFpc01hbmFnZWRCYWRnZShiYWRnZSkpXTtcbiAgLy8gQ29udGVudCBpcyBzbGljZWQgZnJvbSBpdHMgbm9kZSdzIHN0YXJ0IG9mZnNldCwgc28gd2hhdGV2ZXIgYmxhbmsgc3BhY2UgZm9sbG93ZWQgdGhlIGZyb250XG4gIC8vIG1hdHRlciBpcyBnb25lOyBleGFjdGx5IG9uZSBibGFuayBsaW5lIGlzIHJlc3RvcmVkIGhlcmUuIEEgY2xvc2luZyBkZWxpbWl0ZXIgdGhhdCBlbmRlZCBhdCBFT0ZcbiAgLy8gY2FycmllcyBubyBuZXdsaW5lIG9mIGl0cyBvd24gYW5kIG5lZWRzIGJvdGgsIG9yIGAtLS1gIHdvdWxkIGZ1c2Ugd2l0aCB0aGUgZmlyc3QgYmFkZ2UgYW5kXG4gIC8vIGRlc3Ryb3kgdGhlbSBib3RoLiBBIEJPTSBuZWVkcyBubyBzZXBhcmF0b3I6IGl0IGlzIGEgYnl0ZSBtYXJrZXIsIG5vdCBhIGxpbmUuXG4gIGNvbnN0IHNlcGFyYXRvciA9IGZyb250TWF0dGVyID8gKC9cXHI/XFxuJC91LnRlc3QoZnJvbnRNYXR0ZXIpID8gbGluZUVuZGluZyA6IGAke2xpbmVFbmRpbmd9JHtsaW5lRW5kaW5nfWApIDogJyc7XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgcHJlZml4ICsgc2VwYXJhdG9yICsgW2hlYWQsIGJhZGdlcy5qb2luKGxpbmVFbmRpbmcpLCBib2R5XS5maWx0ZXIoQm9vbGVhbikuam9pbihgJHtsaW5lRW5kaW5nfSR7bGluZUVuZGluZ31gKTtcbiAgcmV0dXJuIGVuZHNXaXRoTmV3bGluZSA/IGAke3Jlc3VsdH0ke2xpbmVFbmRpbmd9YCA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBIG5vZGUncyBzdGFydCBvZmZzZXQsIGV4dGVuZGVkIGJhY2sgb3ZlciB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlIG9uIGl0cyBvd24gbGluZS4gQ29tbW9uTWFya1xuICogYWxsb3dzIG9uZSB0byB0aHJlZSBzcGFjZXMgb2YgaW5kZW50YXRpb24gYmVmb3JlIGEgYmxvY2ssIGFuZCBtZGFzdCByZXBvcnRzIHRoZSBvZmZzZXQgQUZURVJcbiAqIHRoZW0g4oCUIHNvIHNsaWNpbmcgZnJvbSBpdCBzaWxlbnRseSByZWluZGVudHMgY29udGVudCB0aGlzIGdlbmVyYXRvciBwcm9taXNlcyB0byBjb3B5IHZlcmJhdGltLlxuICovXG5mdW5jdGlvbiBzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudDogc3RyaW5nLCBub2RlOiBSb290Q29udGVudCk6IG51bWJlciB7XG4gIGNvbnN0IHN0YXJ0ID0gbm9kZS5wb3NpdGlvbiEuc3RhcnQub2Zmc2V0ITtcbiAgY29uc3QgbGluZVN0YXJ0ID0gY29udGVudC5sYXN0SW5kZXhPZignXFxuJywgc3RhcnQgLSAxKSArIDE7XG4gIHJldHVybiAvXlsgXFx0XSokL3UudGVzdChjb250ZW50LnNsaWNlKGxpbmVTdGFydCwgc3RhcnQpKSA/IGxpbmVTdGFydCA6IHN0YXJ0O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIG5vZGUgb3BlbnMgdGhlIFJFQURNRSB3aXRoIGEgdGl0bGUuIE9ubHkgdGhlIEZJUlNUIHBpZWNlIG9mIGNvbnRlbnQgY2FuIGJlIG9uZTogYVxuICogdGl0bGUgaXMgd2hhdCBhIFJFQURNRSBvcGVucyB3aXRoLCBhbmQgYW5jaG9yaW5nIHRoZSBiYWRnZXMgdG8gYSBoZWFkaW5nIGZ1cnRoZXIgZG93biB3b3VsZCBidXJ5XG4gKiB0aGVtIGJlbG93IGNvbnRlbnQgdGhlIGF1dGhvciBwdXQgZmlyc3QuXG4gKi9cbmZ1bmN0aW9uIGlzVGl0bGVOb2RlKG5vZGU6IFJvb3RDb250ZW50IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAobm9kZS50eXBlID09PSAnaGVhZGluZycpIHJldHVybiB0cnVlO1xuICAvLyBNYW55IFJFQURNRXMgY2VudGVyIHRoZWlyIHRpdGxlIGluIEhUTUwgKGA8aDE+YCwgb3IgYSBgPGRpdj5gL2A8cD5gIHdyYXBwaW5nIG9uZSksIHdoaWNoIHRoZVxuICAvLyBwYXJzZXIgcmVwb3J0cyBhcyBvbmUgb3BhcXVlIEhUTUwgYmxvY2s7IHRoZSBiYWRnZXMgZ28gYWZ0ZXIgdGhlIHdob2xlIGJsb2NrLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnaHRtbCcgJiYgY29udGFpbnNSZW5kZXJlZEgxKG5vZGUudmFsdWUpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIEhUTUwgYmxvY2sgdW5hbWJpZ3VvdXNseSBSRU5ERVJTIGFuIGA8aDE+YCDigJQgdGhlIGNlbnRlcmVkLXRpdGxlIGxheW91dCBtYW55IFJFQURNRXNcbiAqIHVzZSAoYDxoMT5gLCBvciBhIGA8ZGl2PmAvYDxwPmAgd3JhcHBpbmcgb25lKS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGEgZ2VuZXJhbCBIVE1MIHBhcnNlci4gRGVjaWRpbmcgdGhpcyBleGFjdGx5IHJlcXVpcmVzIHRoZSByZWFsIHRva2VuaXplcidzXG4gKiBzdGF0ZXMg4oCUIHJhdyB0ZXh0LCBSQ0RBVEEsIHNjcmlwdCBkYXRhLCBhdHRyaWJ1dGUgdmFsdWVzLCB0ZW1wbGF0ZSBjb250ZW50cywgZGVjbGFyYXRpb25zIOKAlCBhbmRcbiAqIGFwcHJveGltYXRpbmcgdGhlbSB3aXRoIHJlZ2V4ZXMgaXMgdGhlIHNhbWUgbG9zaW5nIGdhbWUgdGhlIE1hcmtkb3duIHNjYW5uaW5nIHRoaXMgbW9kdWxlXG4gKiByZXBsYWNlZCB3YXMgcGxheWluZy4gU28gdGhlIHJ1bGUgaXM6IHRva2VuaXplIG9ubHkgdGhlIHNpbXBsZSBjYXNlLCBhbmQgdHJlYXQgYW55dGhpbmcgY2FycnlpbmdcbiAqIGEgY29uc3RydWN0IHdob3NlIHBhcnNpbmcgZGVwZW5kcyBvbiB0aG9zZSBzdGF0ZXMgYXMgTk9UIGEgdGl0bGUuIEJlaW5nIHdyb25nIHRoYXQgd2F5IHB1dHMgdGhlXG4gKiBiYWRnZXMgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSwgd2hpY2ggaXMgbWVyZWx5IHVuaGVscGZ1bDsgYmVpbmcgd3JvbmcgdGhlIG90aGVyIHdheSByZXdyaXRlcyB0aGVcbiAqIHVzZXIncyBSRUFETUUgYXJvdW5kIHRoZSB3cm9uZyBhbmNob3IuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zUmVuZGVyZWRIMShodG1sOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gQ29tbWVudHMgY2Fubm90IG5lc3QgYW5kIGVuZCB1bmFtYmlndW91c2x5LCBzbyB0aGV5IGFyZSBzaW1wbHkgcmVtb3ZlZCByYXRoZXIgdGhhbiBkaXNxdWFsaWZ5aW5nLlxuICBjb25zdCB3aXRob3V0Q29tbWVudHMgPSBodG1sLnJlcGxhY2VBbGwoLzwhLS1bXFxzXFxTXSo/KD86LS0+fCQpL2d1LCAnJyk7XG4gIC8vIENEQVRBLCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgZGVjbGFyYXRpb25zLCBlbGVtZW50cyB3aG9zZSBjb250ZW50IGlzIHJhdyB0ZXh0IC8gUkNEQVRBIC9cbiAgLy8gc2NyaXB0IGRhdGEsIGFuZCBgPHRlbXBsYXRlPmAgKHdob3NlIGNvbnRlbnRzIGFyZSBpbmVydCkuIEEgcXVvdGVkIGF0dHJpYnV0ZSBjb250YWluaW5nIGA8YFxuICAvLyBtYWtlcyBldmVuIGxvY2F0aW5nIHRoZXNlIHVucmVsaWFibGUsIHNvIGl0IGRpc3F1YWxpZmllcyB0aGUgYmxvY2sgdG9vLlxuICBjb25zdCBhbWJpZ3VvdXNDb25zdHJ1Y3RQYXR0ZXJuID1cbiAgICAvPCFcXFtDREFUQVxcW3w8XFw/fDwhW2EtekEtWl18PFxcLz8oPzpzY3JpcHR8c3R5bGV8dGV4dGFyZWF8dGl0bGV8aWZyYW1lfG5vZnJhbWVzfG5vZW1iZWR8eG1wfHRlbXBsYXRlKVxcYnxcIlteXCJdKjxbXlwiXSpcInwnW14nXSo8W14nXSonL2l1O1xuICBpZiAoYW1iaWd1b3VzQ29uc3RydWN0UGF0dGVybi50ZXN0KHdpdGhvdXRDb21tZW50cykpIHJldHVybiBmYWxzZTtcbiAgLy8gUXVvdGluZyBpcyBzaWduaWZpY2FudCBvbmx5IGluc2lkZSBhIHN0YXJ0IHRhZywgc28gYW4gYXR0cmlidXRlIHZhbHVlIGlzIGNvbnN1bWVkIHdpdGggaXRzIG93blxuICAvLyB0YWcgd2hpbGUgcXVvdGF0aW9uIG1hcmtzIGluIG9yZGluYXJ5IHRleHQgc3RheSB0ZXh0OiBgPGRpdiB0aXRsZT1cIiZsdDtoMSZndDtcIj5gIGRvZXMgbm90IGNvdW50LFxuICAvLyBgXCI8aDE+UHJvamVjdDwvaDE+XCJgIGRvZXMuXG4gIGNvbnN0IHN0YXJ0VGFnUGF0dGVybiA9IC88KFthLXpBLVpdW15cXHMvPl0qKSg/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXj5cIiddKSo+L2d1O1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIHdpdGhvdXRDb21tZW50cy5tYXRjaEFsbChzdGFydFRhZ1BhdHRlcm4pKSB7XG4gICAgaWYgKG1hdGNoWzFdPy50b0xvd2VyQ2FzZSgpID09PSAnaDEnKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBub2RlIGlzIGEgcGFyYWdyYXBoIG9mIGJhZGdlcyBhbmQgbm90aGluZyBlbHNlIOKAlCB0aGUgb25seSBjb250ZW50IHdiZnkgcHV0cyBpbiB0aGUgYmxvY2suICovXG5mdW5jdGlvbiBpc0JhZGdlQmxvY2tOb2RlKG5vZGU6IFJvb3RDb250ZW50IHwgdW5kZWZpbmVkKTogbm9kZSBpcyBQYXJhZ3JhcGgge1xuICByZXR1cm4gKFxuICAgICEhbm9kZSAmJlxuICAgIG5vZGUudHlwZSA9PT0gJ3BhcmFncmFwaCcgJiZcbiAgICBub2RlLmNoaWxkcmVuLnNvbWUoKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkpICYmXG4gICAgbm9kZS5jaGlsZHJlbi5ldmVyeShcbiAgICAgIChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpIHx8IGNoaWxkLnR5cGUgPT09ICdicmVhaycgfHwgKGNoaWxkLnR5cGUgPT09ICd0ZXh0JyAmJiAhY2hpbGQudmFsdWUudHJpbSgpKVxuICAgIClcbiAgKTtcbn1cblxuLyoqIEEgYmFkZ2UgaXMgb25lIGBbIVthbHRdKGltYWdlKV0obGluaylgLCB0aGUgb25seSBzaGFwZSB3YmZ5IGV2ZXIgd3JpdGVzLiAqL1xuZnVuY3Rpb24gaXNCYWRnZU5vZGUobm9kZTogUm9vdENvbnRlbnQgfCBQaHJhc2luZ0NvbnRlbnQpOiBub2RlIGlzIExpbmsgJiB7IGNoaWxkcmVuOiBbSW1hZ2VdIH0ge1xuICByZXR1cm4gbm9kZS50eXBlID09PSAnbGluaycgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgbm9kZS5jaGlsZHJlblswXT8udHlwZSA9PT0gJ2ltYWdlJztcbn1cblxuLyoqXG4gKiBUaGUgYmFkZ2VzIGluIHRoZSBibG9jaywgYXMgdGhlIGV4YWN0IHNvdXJjZSB0ZXh0IHRoYXQgcHJvZHVjZWQgdGhlbTogYSBiYWRnZSB3YmZ5IGRvZXMgbm90IG1hbmFnZVxuICogaXMgd3JpdHRlbiBiYWNrIGJ5dGUgZm9yIGJ5dGUgaW5zdGVhZCBvZiBiZWluZyByZS1zZXJpYWxpemVkIGZyb20gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHJlYWRCYWRnZXMobm9kZTogUGFyYWdyYXBoLCBjb250ZW50OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBub2RlLmNoaWxkcmVuXG4gICAgLmZpbHRlcigoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSlcbiAgICAubWFwKChjaGlsZCkgPT4gY29udGVudC5zbGljZShjaGlsZC5wb3NpdGlvbiEuc3RhcnQub2Zmc2V0LCBjaGlsZC5wb3NpdGlvbiEuZW5kLm9mZnNldCkpO1xufVxuXG4vKipcbiAqIFBlcmNlbnQtZW5jb2RlcyB0aGUgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGVuZCBhIE1hcmtkb3duIGRlc3RpbmF0aW9uIGVhcmx5LiBBIHdvcmtmbG93IGZpbGUgbWF5IGJlXG4gKiBuYW1lZCBhbnl0aGluZyB3aXRoIGEgYC55bWxgIGV4dGVuc2lvbiwgYW5kIG9uZSBjb250YWluaW5nIGAoYCBvciBgKWAgcHJvZHVjZWQgYSBiYWRnZSB0aGF0IHdiZnknc1xuICogb3duIGJhZGdlIHBhdHRlcm4gY291bGQgbm90IHJlYWQgYmFjayDigJQgc28gdGhlIGxpbmUgbGVmdCB0aGUgYmxvY2sgYW5kIHRoZSBiYWRnZSB3YXMgZHVwbGljYXRlZC5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlVXJsUGF0aCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1soKVxcc10vZ3UsIChjaGFyYWN0ZXIpID0+IGAlJHtjaGFyYWN0ZXIuY29kZVBvaW50QXQoMCkhLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfWApO1xufVxuXG4vKiogV2hldGhlciB0aGUgYmFkZ2UgaXMgb25lIHdiZnkgd3JpdGVzIGl0c2VsZiwgYW5kIHNvIG1heSBiZSByZXBsYWNlZCBieSB0aGUgY3VycmVudCBibG9jay4gKi9cbmZ1bmN0aW9uIGlzTWFuYWdlZEJhZGdlKGJhZGdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGJhZGdlID09PSBzZW1hbnRpY1JlbGVhc2VCYWRnZSB8fCBtYW5hZ2VkQmFkZ2VQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QoYmFkZ2UpKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGluZUVuZGluZyhjb250ZW50OiBzdHJpbmcpOiAnXFxuJyB8ICdcXHJcXG4nIHtcbiAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcclxcbicpID8gJ1xcclxcbicgOiAnXFxuJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIHVua25vd25dKVtdO1xuICAgICAgZXh0ZW5kcz86IHVua25vd247XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucyA/PyBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbkVudHJ5ID0gcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IGlzQXJyYXkgPyBwbHVnaW5FbnRyeVswXSA6IHBsdWdpbkVudHJ5O1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKGlzQXJyYXkgJiYgcGx1Z2luRW50cnlbMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5cbmNvbnN0IHNoYXJlZFByZXNldCA9ICdnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uYyc7XG5jb25zdCBnZW5lcmF0ZWRTZXR0aW5ncyA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbc2hhcmVkUHJlc2V0XSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSBQYXJ0aWFsPHR5cGVvZiBnZW5lcmF0ZWRTZXR0aW5ncz4gJiB7XG4gIHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W107XG59O1xuXG5jb25zdCBtYW5hZ2VkRmlsZU5hbWUgPSAncmVub3ZhdGUuanNvbmMnO1xuXG4vLyB3YmZ5IHN1cHBvcnRzIG9uZSBjYW5vbmljYWwgUmVub3ZhdGUgbG9jYXRpb24uIE5vbi1jYW5vbmljYWwgY29uZmlncyBhcmUgZml4ZWQgaW4gdGhlIHRhcmdldFxuLy8gcmVwb3NpdG9yeSBpbnN0ZWFkIG9mIGJlaW5nIHBhcnNlZCwgbWVyZ2VkLCBvciBkZWxldGVkIGhlcmUuXG5jb25zdCBub25DYW5vbmljYWxDb25maWdQYXRocyA9IFtcbiAgJ3Jlbm92YXRlLmpzb24nLFxuICAncmVub3ZhdGUuanNvbjUnLFxuICAnLmdpdGh1Yi9yZW5vdmF0ZS5qc29uJyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbmMnLFxuICAnLmdpdGh1Yi9yZW5vdmF0ZS5qc29uNScsXG4gICcucmVub3ZhdGVyYycsXG4gICcucmVub3ZhdGVyYy5qc29uJyxcbiAgJy5yZW5vdmF0ZXJjLmpzb241Jyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb25jJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBtYW5hZ2VkRmlsZU5hbWUpO1xuICAgIGNvbnN0IG1hbmFnZWRGaWxlU3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChmaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIGlmIChtYW5hZ2VkRmlsZVN0YXRzPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IGlzIGEgc3ltYm9saWMgbGluay5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBub25DYW5vbmljYWxDb25maWdDYW5kaWRhdGVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBub25DYW5vbmljYWxDb25maWdQYXRocy5tYXAoYXN5bmMgKHJlbGF0aXZlUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoY2FuZGlkYXRlKS5jYXRjaCgoKSA9PiB7fSkpID8gY2FuZGlkYXRlIDogdW5kZWZpbmVkO1xuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ1BhdGggPSBub25DYW5vbmljYWxDb25maWdDYW5kaWRhdGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQpO1xuICAgIGlmIChub25DYW5vbmljYWxDb25maWdQYXRoIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8ucmVub3ZhdGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSByZXBvc2l0b3J5IGhhcyBhIG5vbi1jYW5vbmljYWwgUmVub3ZhdGUgY29uZmlnJHtcbiAgICAgICAgICBub25DYW5vbmljYWxDb25maWdQYXRoID8gYCBhdCAke25vbkNhbm9uaWNhbENvbmZpZ1BhdGh9YCA6ICcgaW4gcGFja2FnZS5qc29uJ1xuICAgICAgICB9LmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb2xkU2V0dGluZ3M6IFNldHRpbmdzIHwgdW5kZWZpbmVkO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkob2xkQ29udGVudCkpIHtcbiAgICAgIG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxTZXR0aW5ncz4ob2xkQ29udGVudCk7XG4gICAgICBpZiAoIW9sZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9sZFNldHRpbmdzPy5leHRlbmRzICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MuZXh0ZW5kcykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgXCJleHRlbmRzXCIgaXMgbm90IGFuIGFycmF5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZW1vdmVkUHJlc2V0ID0gb2xkU2V0dGluZ3M/LmV4dGVuZHM/LmZpbmQoXG4gICAgICAocHJlc2V0KSA9PiBwcmVzZXQuc3RhcnRzV2l0aCgnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6JykgJiYgcHJlc2V0ICE9PSBzaGFyZWRQcmVzZXRcbiAgICApO1xuICAgIGlmIChyZW1vdmVkUHJlc2V0KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIFwiJHtyZW1vdmVkUHJlc2V0fVwiIG5vIGxvbmdlciBleGlzdHM7IHJlbW92ZSBpdCBtYW51YWxseS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdTZXR0aW5ncyA9IGJ1aWxkU2V0dGluZ3MoY29uZmlnLCBvbGRTZXR0aW5ncyk7XG4gICAgY29uc3QgeyBjb250ZW50LCBrZXlzTG9zaW5nQ29tbWVudHMgfSA9IGpzb25jVXRpbC5zdHJpbmdpZnlQcmVzZXJ2aW5nVHJpdmlhKFxuICAgICAgb2xkQ29udGVudCxcbiAgICAgIG5ld1NldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKTtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIG5vcm1hbGl6ZShjb250ZW50KSA9PT0gbm9ybWFsaXplKG9sZENvbnRlbnQpKSByZXR1cm47XG4gICAgaWYgKCEoYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzTG9zaW5nQ29tbWVudHMpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ29tbWVudHMgaW5zaWRlIFwiJHtrZXl9XCIgd2VyZSBkcm9wcGVkIHdoaWxlIHJld3JpdGluZyBpdCBpbiAke2ZpbGVQYXRofS5gKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkU2V0dGluZ3M6IFNldHRpbmdzIHwgdW5kZWZpbmVkKTogU2V0dGluZ3Mge1xuICBjb25zdCBzZXR0aW5ncyA9IG9sZFNldHRpbmdzXG4gICAgPyAobWVyZ2UuYWxsKFtnZW5lcmF0ZWRTZXR0aW5ncywgb2xkU2V0dGluZ3MsIGdlbmVyYXRlZFNldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzKVxuICAgIDogc3RydWN0dXJlZENsb25lKGdlbmVyYXRlZFNldHRpbmdzKTtcbiAgY29uc3QgZXhpc3RpbmdFeHRlbmRzID0gb2xkU2V0dGluZ3M/LmV4dGVuZHMgPz8gW107XG4gIHNldHRpbmdzLmV4dGVuZHMgPSBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3NcbiAgICA/IGV4aXN0aW5nRXh0ZW5kcy5maWx0ZXIoKHByZXNldCkgPT4gcHJlc2V0ICE9PSBzaGFyZWRQcmVzZXQpXG4gICAgOiBleGlzdGluZ0V4dGVuZHMuaW5jbHVkZXMoc2hhcmVkUHJlc2V0KVxuICAgICAgPyBleGlzdGluZ0V4dGVuZHNcbiAgICAgIDogW3NoYXJlZFByZXNldCwgLi4uZXhpc3RpbmdFeHRlbmRzXTtcbiAgcmV0dXJuIHNldHRpbmdzO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZENvbnRlbnQgPSBjb250ZW50LnRyaW0oKTtcbiAgcmV0dXJuIHRyaW1tZWRDb250ZW50ID8gdHJpbW1lZENvbnRlbnQgKyAnXFxuJyA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0V4dGVuZHMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuaW1wb3J0IHtcbiAgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldFdvcmtzcGFjZURpclBhdHRlcm5zLFxuICBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyxcbn0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmNvbnN0IHN1Ykpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IHRydWUsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICAvLyB3YmZ5IGdlbmVyYXRlcyByb290LWxldmVsIHRvb2wgY29uZmlncyBzdWNoIGFzIHBsYXl3cmlnaHQuY29uZmlnLnRzLCBhbmRcbiAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIG5lZWRzIHRob3NlIGZpbGVzIGluIHRoZSBwcm9qZWN0IHRvIHNlZSBOb2RlL0J1biBnbG9iYWxzLlxuICAvLyBgYXBwLyoqYCBpcyBkZWxpYmVyYXRlbHkgYWJzZW50IGV2ZW4gdGhvdWdoIHRoZSBkb2VzQ29udGFpbipTY3JpcHQgc2lnbmFscyBzY2FuIGl0OiBhcHBcbiAgLy8gZGlyZWN0b3JpZXMgYmVsb25nIHRvIGZyYW1ld29yayBwYWNrYWdlcyAoTmV4dC5qcy9CbGl0eiksIHdoaWNoIG93biB0aGVpciB0c2NvbmZpZ1xuICAvLyAoZ2VuZXJhdGVUc2NvbmZpZyBza2lwcyB0aGVtKSwgYW5kIGNoZWNraW5nIGZyYW1ld29yayBzb3VyY2VzIHVuZGVyIHRoaXMgcHJvamVjdCdzIGNvbXBpbGVyXG4gIC8vIG9wdGlvbnMgd291bGQgcHJvZHVjZSBmYWxzZSBlcnJvcnMuXG4gIGluY2x1ZGU6IFsnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB2aW5leHQgaXMgdGhlIG9yZydzIE5leHQuanMtZXF1aXZhbGVudCBmcmFtZXdvcmsgYW5kIG93bnMgaXRzIHRzY29uZmlnIGp1c3QgbGlrZSBOZXh0L0JsaXR6LFxuICAgIC8vIHNvIGl0IG11c3Qgc2tpcCB0aGUgc3RhbmRhcmQgZ2VuZXJhdGlvbiB0aGF0IHdvdWxkIG92ZXJ3cml0ZSB0aGUgZnJhbWV3b3JrJ3Mgb3duIHNldHRpbmdzLlxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgYXdhaXQgbm9ybWFsaXplRnJhbWV3b3JrVHNjb25maWcoY29uZmlnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSAoY29uZmlnLmlzUm9vdCA/IGJ1aWxkUm9vdEpzb25PYmooY29uZmlnKSA6IHN0cnVjdHVyZWRDbG9uZShzdWJKc29uT2JqKSkgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpciA9IGdldFJvb3REaXIoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHR5cGVzOiBnZW5lcmF0ZWRUeXBlcyB9O1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICAvLyBQcmlzbWEgc2VlZHMgYW5kIG1pZ3JhdGlvbiBoZWxwZXIgc2NyaXB0cyBvZnRlbiBsaXZlIG91dHNpZGUgc3JjLCBidXRcbiAgICAgIC8vIHR5cGUtYXdhcmUgbGludGluZyBzdGlsbCBuZWVkcyB0aGVtIGNvdmVyZWQgYnkgdGhlIHByb2plY3QgY29uZmlnLlxuICAgICAgYWRkSW5jbHVkZVBhdGgobmV3U2V0dGluZ3MsICdwcmlzbWEvKiovKicpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb3JpZ2luYWxTZXR0aW5nc0pzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvLyBBIGZpbGUgd2l0aCBubyBjb25maWd1cmF0aW9uIChlbXB0eSBvciBjb21tZW50LW9ubHkpIGlzIHRyZWF0ZWQgbGlrZSBhIG1pc3Npbmcgb25lLCBhcyB0c2MgZG9lcy5cbiAgICBpZiAoZXhpc3RpbmdDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFRzQ29uZmlnSnNvbj4oZXhpc3RpbmdDb250ZW50KTtcbiAgICAgIC8vIEFuIGV4aXN0aW5nIHRzY29uZmlnLmpzb24gd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0IHVudG91Y2hlZDogd3JpdGluZyB0aGVcbiAgICAgIC8vIGdlbmVyYXRlZCBzZXR0aW5ncyB3aXRob3V0IG1lcmdpbmcgd291bGQgc2lsZW50bHkgZGlzY2FyZCB0aGUgcHJvamVjdCdzIGNvbmZpZ3VyYXRpb24uXG4gICAgICBpZiAoIW9sZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShvbGRTZXR0aW5ncykpKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVHlwZXMgPSBub3JtYWxpemVTdHJpbmdBcnJheShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW1pdE1ldGFkYXRhID0gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMobmV3U2V0dGluZ3MuZXh0ZW5kcywgb2xkU2V0dGluZ3MuZXh0ZW5kcyk7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgICAgIHJlbW92ZVN0YWxlTWFuYWdlZFdvcmtzcGFjZUVudHJpZXMoY29uZmlnLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3MpO1xuICAgICAgfVxuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18vJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ3Rlc3RzLycpXG4gICAgICApO1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICAgIC8vIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnLmpzb24gaXMgYSBsaW50L3R5cGVjaGVjayBwcm9qZWN0LCBub3QgdGhlIGVtaXRcbiAgICAgIC8vIGNvbnRyYWN0LiBJdCBtdXN0IGtlZXAgcm9vdERpciBicm9hZCBlbm91Z2ggZm9yIHJvb3QgY29uZmlnIGZpbGVzLFxuICAgICAgLy8gc2NyaXB0cywgc3JjLCBhbmQgdGVzdHMuIGJ1aWxkLXRzIG93bnMgZW1pdCBhbmQgY3JlYXRlcyBhIHRlbXBvcmFyeVxuICAgICAgLy8gc3JjLW9ubHkgdHNjb25maWcgd2l0aCBub0VtaXQ9ZmFsc2UsIGVtaXREZWNsYXJhdGlvbk9ubHk9dHJ1ZSxcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiwgYW5kIGluY2x1ZGU9W1wic3JjLyoqLypcIl0sIHNvIHByZXNlcnZpbmcgbm9FbWl0PWZhbHNlIG9yXG4gICAgICAvLyByb290RGlyPVwic3JjXCIgaGVyZSB3b3VsZCBvbmx5IGJyZWFrIG5vbi1zcmMgdHlwZS1hd2FyZSBsaW50IGNvdmVyYWdlLlxuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIC4uLmV4aXN0aW5nRW1pdE1ldGFkYXRhIH07XG5cbiAgICAgIGNvbnN0IG1lcmdlZFR5cGVzID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlcywgZ2VuZXJhdGVkVHlwZXMpLCAuLi5nZW5lcmF0ZWRUeXBlc10pXTtcbiAgICAgIGlmIChtZXJnZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IG1lcmdlZFR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGREZWxldGVUeXBlUm9vdHMoZ2VuZXJhdGVkVHlwZXMpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZVJvb3RzO1xuICAgICAgfVxuICAgIH1cbiAgICBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKG5ld1NldHRpbmdzLCBjb25maWcpO1xuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgLy8gRG9uJ3QgdXNlIG9sZCBkZWNvcmF0b3JcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5leHBlcmltZW50YWxEZWNvcmF0b3JzO1xuICAgIC8vIFBhY2thZ2UgaW1wb3J0cyBzaG91bGQgcmVzb2x2ZSB0aHJvdWdoIHBhY2thZ2UgZXhwb3J0cyBpbnN0ZWFkIG9mIGJhc2VVcmwuXG4gICAgLy8gcGF0aHMgaXMgaW50ZW50aW9uYWxseSBwcmVzZXJ2ZWQgc28gcmVwby1sb2NhbCB0b29saW5nIGNhbiBrZWVwIGV4cGxpY2l0XG4gICAgLy8gYWxpYXNlcyB3aXRob3V0IHJlbHlpbmcgb24gYmFzZVVybCdzIGJyb2FkIGZhbGxiYWNrIHJlc29sdXRpb24uXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybDtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udmVyYmF0aW1Nb2R1bGVTeW50YXg7XG4gICAgfVxuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LXVwLXRvLWRhdGUgdHNjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAob3JpZ2luYWxTZXR0aW5nc0pzb24gPT09IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgbW9ub3JlcG8tcm9vdCB0c2NvbmZpZywgd2hvc2UgaW5jbHVkZS9leGNsdWRlIGNvdmVyIGV2ZXJ5IERFQ0xBUkVEIHdvcmtzcGFjZSBsYXlvdXQgKGUuZy5cbiAqIGBhcHBzLypgIGFsb25nc2lkZSBgcGFja2FnZXMvKmApIHNvIHR5cGUtYXdhcmUgbGludGluZyBydW4gZnJvbSB0aGUgcm9vdCBzZWVzIGFsbCB3b3Jrc3BhY2VcbiAqIHNvdXJjZXMsIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUm9vdEpzb25PYmooY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogVHNDb25maWdKc29uIHtcbiAgY29uc3Qgd29ya3NwYWNlUGF0dGVybnMgPSBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnNcbiAgICA/IGdldFdvcmtzcGFjZURpclBhdHRlcm5zKGNvbmZpZylcbiAgICA6IHsgZXhjbHVkZXM6IFtdLCBpbmNsdWRlczogW10gfTtcbiAgY29uc3Qgc2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICBzZXR0aW5ncy5leGNsdWRlID0gW1xuICAgIC4uLm5ldyBTZXQoW1xuICAgICAgLi4ud29ya3NwYWNlUGF0dGVybnMuaW5jbHVkZXMubWFwKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBgJHt3b3Jrc3BhY2VQYXR0ZXJufS90ZXN0L2ZpeHR1cmVzYCksXG4gICAgICAvLyBOZWdhdGl2ZSB3b3Jrc3BhY2UgcGF0dGVybnMgKGUuZy4gYCFwYWNrYWdlcy9leGNsdWRlZGApIG9wdCB3b3Jrc3BhY2Ugc3VidHJlZXMgb3V0IG9mIHRoZVxuICAgICAgLy8gbW9ub3JlcG8sIHNvIHRoZWlyIHNvdXJjZXMgbXVzdCBub3QgZW50ZXIgdGhlIHJvb3QgdHlwZS1jaGVjayBwcm9qZWN0IGVpdGhlci4gQSBuZWdhdGlvblxuICAgICAgLy8gd2hvc2UgZGlyZWN0b3J5IGlzIGFuIGFuY2VzdG9yIG9mIGEgd29ya3NwYWNlIHlpZWxkcyBwYWNrYWdlLW93bmVkIHN1YnBhdGggZW50cmllc1xuICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgd2hvbGUgc3VidHJlZSAoc2VlIGdldFdvcmtzcGFjZURpclBhdHRlcm5zKS5cbiAgICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmV4Y2x1ZGVzLFxuICAgICAgLy8gVGhlIG1hbmFnZWQgaW5jbHVkZXMgYWJvdmUgZGVsaWJlcmF0ZWx5IG9taXQgZnJhbWV3b3JrIGBhcHAvKipgIGRpcmVjdG9yaWVzIChzZWVcbiAgICAgIC8vIHN1Ykpzb25PYmouaW5jbHVkZSdzIGNvbW1lbnQpLCBidXQgYSByZXBvLWF1dGhvcmVkIGJyb2FkIGluY2x1ZGUgc3VjaCBhcyBgZTJlLyoqXFwvKmBcbiAgICAgIC8vIGNhbiBzdGlsbCBkcmFnIGEgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIGFwcCBzb3VyY2VzIGludG8gdGhlIHJvb3QgcHJvamVjdCwgd2hlcmUgdGhleVxuICAgICAgLy8gZmFpbCB1bmRlciB0aGUgcm9vdCBjb21waWxlciBvcHRpb25zIOKAlCB0aGVpciBiYXJlIGBuZXh0LypgIGltcG9ydHMgcmVzb2x2ZSBvbmx5IHRocm91Z2hcbiAgICAgIC8vIHRoZSBmcmFtZXdvcmsgd29ya3NwYWNlJ3Mgb3duIHRzY29uZmlnIGBwYXRoc2AuIEV4Y2x1ZGUgdGhvc2UgYXBwIGRpcmVjdG9yaWVzIHNvIHRoZVxuICAgICAgLy8gcm9vdCBwcm9qZWN0IG5ldmVyIHR5cGUtY2hlY2tzIHRoZW0sIG5vIG1hdHRlciBob3cgYnJvYWQgdGhlIHJlcG8ncyBpbmNsdWRlIGdsb2JzIGFyZS5cbiAgICAgIC4uLmdldEZyYW1ld29ya1dvcmtzcGFjZUFwcEV4Y2x1ZGVzKGNvbmZpZyksXG4gICAgICAuLi4oc2V0dGluZ3MuZXhjbHVkZSA/PyBbXSksXG4gICAgXSksXG4gIF0udG9Tb3J0ZWQoKTtcbiAgc2V0dGluZ3MuaW5jbHVkZSA9IFtcbiAgICAuLi4oc2V0dGluZ3MuaW5jbHVkZSA/PyBbXSksXG4gICAgLi4ud29ya3NwYWNlUGF0dGVybnMuaW5jbHVkZXMuZmxhdE1hcCgod29ya3NwYWNlUGF0dGVybikgPT4gW1xuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vKi5jb25maWcudHNgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vc2NyaXB0cy8qKi8qYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3NyYy8qKi8qYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3Rlc3QvKiovKmAsXG4gICAgXSksXG4gIF07XG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuLy8gRnJhbWV3b3JrIHBhY2thZ2VzIG93biB0aGVpciB0c2NvbmZpZyAoZ2VuZXJhdGVUc2NvbmZpZyBza2lwcyB0aGVtKSBhbmQgc2hpbSBiYXJlIGltcG9ydHMgc3VjaCBhc1xuLy8gYG5leHQvbmF2aWdhdGlvbmAgdGhyb3VnaCBwYWNrYWdlLWxvY2FsIGBwYXRoc2A7IHZpbmV4dCBpcyB0aGUgb3JnJ3MgTmV4dC5qcy1lcXVpdmFsZW50IGZyYW1ld29ya1xuLy8gYW5kIGJlaGF2ZXMgdGhlIHNhbWUuIFRoZWlyIGFwcCBzb3VyY2VzIHRoZXJlZm9yZSBvbmx5IHR5cGUtY2hlY2sgdW5kZXIgdGhlaXIgb3duIGNvbmZpZy5cbmNvbnN0IGZyYW1ld29ya0RlcGVuZGVuY3lOYW1lcyA9IFsnYmxpdHonLCAnbmV4dCcsICd2aW5leHQnXTtcblxuLy8gQSBmcmFtZXdvcmsgYXBwIGxpdmVzIGluIGBhcHAvYCBvciwgdW5kZXIgdGhlIHNyYy1kaXJlY3RvcnkgbGF5b3V0LCBgc3JjL2FwcC9gLiBUaGUgcm9vdCBwcm9qZWN0XG4vLyBpbmNsdWRlcyBgPHdvcmtzcGFjZT4vc3JjLyoqLypgLCBzbyBgc3JjL2FwcGAgbGVha3MgaW4ganVzdCBhcyBhIHJlcG8td2lkZSBnbG9iIGNhbiBwdWxsIGluIGBhcHBgLlxuY29uc3QgZnJhbWV3b3JrQXBwRGlyTmFtZXMgPSBbJ2FwcCcsICdzcmMvYXBwJ107XG5cbi8qKiBSb290IGBleGNsdWRlYCBlbnRyaWVzIChwb3NpeCwgcmVsYXRpdmUgdG8gdGhlIHJvb3QpIGZvciBldmVyeSBmcmFtZXdvcmsgd29ya3NwYWNlJ3MgYXBwIGRpcmVjdG9yeS4gKi9cbmZ1bmN0aW9uIGdldEZyYW1ld29ya1dvcmtzcGFjZUFwcEV4Y2x1ZGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHJldHVybiBbXTtcbiAgY29uc3QgZXhjbHVkZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlRGlyUGF0aCBvZiBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyhjb25maWcpKSB7XG4gICAgaWYgKCFkZXBlbmRzT25GcmFtZXdvcmsocGF0aC5yZXNvbHZlKHdvcmtzcGFjZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgYXBwRGlyTmFtZSBvZiBmcmFtZXdvcmtBcHBEaXJOYW1lcykge1xuICAgICAgY29uc3QgYXBwRGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3Jrc3BhY2VEaXJQYXRoLCBhcHBEaXJOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGFwcERpclBhdGgpKSBleGNsdWRlcy5wdXNoKHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGFwcERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4Y2x1ZGVzO1xufVxuXG5mdW5jdGlvbiBkZXBlbmRzT25GcmFtZXdvcmsobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IG1hbmlmZXN0OiBQYWNrYWdlSnNvbiB8IG51bGw7XG4gIHRyeSB7XG4gICAgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uIHwgbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIEEgbWFuaWZlc3QgdGhhdCBwYXJzZXMgdG8gYSBub24tb2JqZWN0IChlLmcuIGEgZmlsZSBsaXRlcmFsbHkgY29udGFpbmluZyBgbnVsbGApIGRlY2xhcmVzIG5vXG4gIC8vIGRlcGVuZGVuY2llczsgZ3VhcmQgdGhlIHByb3BlcnR5IGFjY2Vzcywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHRocm93IG91dHNpZGUgdGhlIHRyeSBhYm92ZS5cbiAgaWYgKCFtYW5pZmVzdCB8fCB0eXBlb2YgbWFuaWZlc3QgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHsgLi4ubWFuaWZlc3QuZGVwZW5kZW5jaWVzLCAuLi5tYW5pZmVzdC5kZXZEZXBlbmRlbmNpZXMgfTtcbiAgcmV0dXJuIGZyYW1ld29ya0RlcGVuZGVuY3lOYW1lcy5zb21lKChkZXBlbmRlbmN5TmFtZSkgPT4gZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3lOYW1lXSk7XG59XG5cbmNvbnN0IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMgPSBbJyouY29uZmlnLnRzJywgJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXTtcblxuLyoqXG4gKiBSb290IGluY2x1ZGUvZXhjbHVkZSBlbnRyaWVzIHdiZnkgZ2VuZXJhdGVkIGZvciBhbiBlYXJsaWVyIHdvcmtzcGFjZSBsYXlvdXQgKGUuZy4gYHBhY2thZ2VzLypgXG4gKiBnbG9icyBpbiBhIHJlcG8gdGhhdCBub3cgZGVjbGFyZXMgb25seSBgYXBwcy8qYCkgbXVzdCBub3Qgc3Vydml2ZSB0aGUgbWVyZ2Ugd2l0aCB0aGUgZXhpc3RpbmdcbiAqIHRzY29uZmlnLCBvciB0aGUgb2Jzb2xldGUgZGlyZWN0b3JpZXMgd291bGQga2VlcCBlbnRlcmluZyByb290IHR5cGUgY2hlY2tpbmcgZm9yZXZlci4gQSBwcmVmaXhcbiAqIGNvdW50cyBhcyB3YmZ5LW1hbmFnZWQgb25seSB3aGVuIHRoZSBDT01QTEVURSBnZW5lcmF0ZWQgaW5jbHVkZSBzZXQgZm9yIGl0IGlzIHByZXNlbnQgYW5kIG5vXG4gKiBsb25nZXIgZ2VuZXJhdGVkIOKAlCBhIHVzZXItYXV0aG9yZWQgZW50cnkgc3VjaCBhcyBhIGxvbmUgYHRvb2xzLypcXC9zcmMvKipcXC8qYCBuZXZlciBxdWFsaWZpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZVN0YWxlTWFuYWdlZFdvcmtzcGFjZUVudHJpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgb2xkU2V0dGluZ3M6IFRzQ29uZmlnSnNvbixcbiAgbmV3U2V0dGluZ3M6IFRzQ29uZmlnSnNvblxuKTogdm9pZCB7XG4gIGNvbnN0IHN0YWxlUHJlZml4ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MuaW5jbHVkZSkpIHtcbiAgICBjb25zdCBvbGRJbmNsdWRlID0gb2xkU2V0dGluZ3MuaW5jbHVkZS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgc3RyaW5nID0+IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpO1xuICAgIGNvbnN0IGdlbmVyYXRlZEluY2x1ZGUgPSBuZXcgU2V0KG5ld1NldHRpbmdzLmluY2x1ZGUpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygb2xkSW5jbHVkZSkge1xuICAgICAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeSk7XG4gICAgICBpZiAod29ya3NwYWNlUHJlZml4ID09PSB1bmRlZmluZWQgfHwgc3RhbGVQcmVmaXhlcy5oYXMod29ya3NwYWNlUHJlZml4KSkgY29udGludWU7XG4gICAgICBjb25zdCBpc0NvbXBsZXRlID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5ldmVyeSgoc3VmZml4KSA9PlxuICAgICAgICBvbGRJbmNsdWRlLmluY2x1ZGVzKGAke3dvcmtzcGFjZVByZWZpeH0vJHtzdWZmaXh9YClcbiAgICAgICk7XG4gICAgICBjb25zdCBpc1N0aWxsR2VuZXJhdGVkID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5zb21lKChzdWZmaXgpID0+XG4gICAgICAgIGdlbmVyYXRlZEluY2x1ZGUuaGFzKGAke3dvcmtzcGFjZVByZWZpeH0vJHtzdWZmaXh9YClcbiAgICAgICk7XG4gICAgICBpZiAoaXNDb21wbGV0ZSAmJiAhaXNTdGlsbEdlbmVyYXRlZCkgc3RhbGVQcmVmaXhlcy5hZGQod29ya3NwYWNlUHJlZml4KTtcbiAgICB9XG4gICAgaWYgKHN0YWxlUHJlZml4ZXMuc2l6ZSA+IDApIHtcbiAgICAgIG9sZFNldHRpbmdzLmluY2x1ZGUgPSBvbGRTZXR0aW5ncy5pbmNsdWRlLmZpbHRlcigoZW50cnkpID0+IHtcbiAgICAgICAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyA/IGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnkpIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gd29ya3NwYWNlUHJlZml4ID09PSB1bmRlZmluZWQgfHwgIXN0YWxlUHJlZml4ZXMuaGFzKHdvcmtzcGFjZVByZWZpeCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmV4Y2x1ZGUpKSByZXR1cm47XG4gIGNvbnN0IGdlbmVyYXRlZEV4Y2x1ZGUgPSBuZXcgU2V0KG5ld1NldHRpbmdzLmV4Y2x1ZGUpO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29uc1xuICAgID8gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoY29uZmlnKS5tYXAoKHdvcmtzcGFjZURpclBhdGgpID0+XG4gICAgICAgIHBhdGgucmVsYXRpdmUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKSwgd29ya3NwYWNlRGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJylcbiAgICAgIClcbiAgICA6IFtdO1xuICBvbGRTZXR0aW5ncy5leGNsdWRlID0gb2xkU2V0dGluZ3MuZXhjbHVkZS5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gJ3N0cmluZycgfHwgZ2VuZXJhdGVkRXhjbHVkZS5oYXMoZW50cnkpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZW50cnkuZW5kc1dpdGgoJy90ZXN0L2ZpeHR1cmVzJykpIHtcbiAgICAgIHJldHVybiAhc3RhbGVQcmVmaXhlcy5oYXMoZW50cnkuc2xpY2UoMCwgLScvdGVzdC9maXh0dXJlcycubGVuZ3RoKSk7XG4gICAgfVxuICAgIC8vIEEgZnJhbWV3b3JrIGFwcCBleGNsdWRlIChgPHdvcmtzcGFjZT4vYXBwYCwgYDx3b3Jrc3BhY2U+L3NyYy9hcHBgKSBmb3IgYSBzdGlsbC1kZWNsYXJlZFxuICAgIC8vIHdvcmtzcGFjZSBpcyBwcnVuZWQgYnkgY292ZXJzV29ya3NwYWNlRGlyIGJlbG93IHdoZW4gbm8gbG9uZ2VyIGdlbmVyYXRlZDsgdGhpcyBjYXRjaGVzIHRoZVxuICAgIC8vIHJlbWFpbmluZyBjYXNlLCB3aGVyZSB0aGUgd29ya3NwYWNlIGl0c2VsZiB3YXMgcmVtb3ZlZCBhbmQgaXRzIHByZWZpeCBpcyB0aGVyZWZvcmUgc3RhbGUuXG4gICAgLy8gKEEgd3Jvbmcgc3VmZml4IHN0cmlwIHlpZWxkcyBhIHByZWZpeCBhYnNlbnQgZnJvbSBzdGFsZVByZWZpeGVzLCBzbyB0ZXN0aW5nIGV2ZXJ5IG5hbWUgaXMgc2FmZS4pXG4gICAgaWYgKFxuICAgICAgZnJhbWV3b3JrQXBwRGlyTmFtZXMuc29tZShcbiAgICAgICAgKGFwcERpck5hbWUpID0+IGVudHJ5LmVuZHNXaXRoKGAvJHthcHBEaXJOYW1lfWApICYmIHN0YWxlUHJlZml4ZXMuaGFzKGVudHJ5LnNsaWNlKDAsIC0oYXBwRGlyTmFtZS5sZW5ndGggKyAxKSkpXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhY292ZXJzV29ya3NwYWNlRGlyKGVudHJ5LCB3b3Jrc3BhY2VEaXJQYXRocyk7XG4gIH0pO1xufVxuXG4vLyBXaGV0aGVyIGFuIGV4Y2x1ZGUgZW50cnkgaXMgYSB3b3Jrc3BhY2UgbmVnYXRpb24gKGAhYXBwcy9leGNsdWRlZGApIHdob3NlIG5lZ2F0aW9uIGlzIGdvbmU6IHRoZVxuLy8gZGlyZWN0b3J5IGlzIGEgd29ya3NwYWNlIGFnYWluIGFuZCBtdXN0IHJlLWVudGVyIHRoZSByb290IHByb2plY3QuIHdiZnkgd3JpdGVzIHN1Y2ggYSBuZWdhdGlvbiBhc1xuLy8gYSBkaXJlY3RvcnkgcGF0aCwgYXMgYSBkaXJlY3RvcnkgUEFUVEVSTiB3aGVuIGl0IGV4Y2x1ZGVzIGV4YWN0bHkgd2hhdCBpdCBtYXRjaGVzIChgYXBwcy8qYmApLCBvclxuLy8gYXMgYW4gYW5jZXN0b3IncyBwYWNrYWdlLW93bmVkIHN1YnBhdGhzIChgYXBwcy94L3NyY2ApIOKAlCBzbyB0aGUgZW50cnkgbWF5IGNvdmVyIGEgZGlzY292ZXJlZFxuLy8gd29ya3NwYWNlIGRpcmVjdG9yeSBvciBzaXQgdW5kZXIgb25lLiBBIGdsb2JzdGFyIHNlZ21lbnQgbWFya3MgYSBoeWdpZW5lIGdsb2IgKG5vZGVfbW9kdWxlcywgZTJlXG4vLyBhbmQgZnJpZW5kcyksIHdoaWNoIGlzIG5ldmVyIG5lZ2F0aW9uLWRlcml2ZWQgYW5kIG11c3Qgc3Vydml2ZS5cbmZ1bmN0aW9uIGNvdmVyc1dvcmtzcGFjZURpcihlbnRyeTogc3RyaW5nLCB3b3Jrc3BhY2VEaXJQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgaWYgKGVudHJ5LnNwbGl0KCcvJykuaW5jbHVkZXMoJyoqJykpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcmVnZXhTb3VyY2UgPSBlbnRyeVxuICAgIC5zcGxpdCgnLycpXG4gICAgLm1hcCgoc2VnbWVudCkgPT5cbiAgICAgIHNlZ21lbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1suK14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCcqJywgJ1teL10qJylcbiAgICAgICAgLnJlcGxhY2VBbGwoJz8nLCAnW14vXScpXG4gICAgKVxuICAgIC5qb2luKCcvJyk7XG4gIGNvbnN0IGVudHJ5UGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke3JlZ2V4U291cmNlfSg/Oi8uKik/JGAsICd1Jyk7XG4gIHJldHVybiB3b3Jrc3BhY2VEaXJQYXRocy5zb21lKFxuICAgICh3b3Jrc3BhY2VEaXJQYXRoKSA9PiBlbnRyeVBhdHRlcm4udGVzdCh3b3Jrc3BhY2VEaXJQYXRoKSB8fCBlbnRyeS5zdGFydHNXaXRoKGAke3dvcmtzcGFjZURpclBhdGh9L2ApXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoZWRTdWZmaXggPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLmZpbmQoKHN1ZmZpeCkgPT4gZW50cnkuZW5kc1dpdGgoYC8ke3N1ZmZpeH1gKSk7XG4gIGlmICghbWF0Y2hlZFN1ZmZpeCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gZW50cnkuc2xpY2UoMCwgLShtYXRjaGVkU3VmZml4Lmxlbmd0aCArIDEpKTtcbiAgcmV0dXJuIHdvcmtzcGFjZVByZWZpeCA9PT0gJycgPyB1bmRlZmluZWQgOiB3b3Jrc3BhY2VQcmVmaXg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZUZyYW1ld29ya1RzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBOZXh0L0JsaXR6IG93biB0aGVpciB0c2NvbmZpZyBzaGFwZSwgYnV0IFR5cGVTY3JpcHQgNiBubyBsb25nZXIgYWNjZXB0c1xuICAvLyBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmdzIHRoYXQgb2xkZXIgcHJvamVjdHMgY29tbW9ubHkgaW5oZXJpdGVkLlxuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICBpZiAoZXhpc3RpbmdDb250ZW50ID09PSB1bmRlZmluZWQgfHwganNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSByZXR1cm47XG4gIGNvbnN0IHNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxUc0NvbmZpZ0pzb24+KGV4aXN0aW5nQ29udGVudCk7XG4gIGlmICghc2V0dGluZ3MpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgY2xlYW5pbmcgdXAgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpO1xuICBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5ncyk7XG4gIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gIGFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5ncyk7XG4gIGFkZFVuZGljaVR5cGVzUGF0aE1hcHBpbmcoc2V0dGluZ3MsIGNvbmZpZyk7XG4gIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgLy8gYWxyZWFkeS1jbGVhbiB0c2NvbmZpZy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICBpZiAoSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpID09PSBvcmlnaW5hbFNldHRpbmdzSnNvbikgcmV0dXJuO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMikpKTtcbn1cblxuLyoqXG4gKiBidW4tdHlwZXMgcmVmZXJlbmNlcyB1bmRpY2ktdHlwZXMgd2l0aG91dCBkZWNsYXJpbmcgaXQgYXMgYSBkZXBlbmRlbmN5IChvdmVuLXNoL2J1biMyMjgwNSksIHNvXG4gKiBCdW4ncyBpc29sYXRlZCBsaW5rZXIgKGVzcGVjaWFsbHkgd2l0aCB0aGUgZ2xvYmFsIHN0b3JlIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkpIGNhbm5vdCByZXNvbHZlXG4gKiBpdCBmcm9tIGJ1bi10eXBlcycgbG9jYXRpb24sIHdoaWNoIHNpbGVudGx5IGRlZ3JhZGVzIGdsb2JhbCBmZXRjaCB0eXBlcyBzdWNoIGFzIFJlc3BvbnNlLiBNYXAgaXRcbiAqIHRvIHRoZSBjb3B5IHRoYXQgYnVuZmlnLnRvbWwncyBwdWJsaWNIb2lzdFBhdHRlcm4gcGxhY2VzIGluIHRoZSByb290IG5vZGVfbW9kdWxlcy5cbiAqL1xuZnVuY3Rpb24gYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhzZXR0aW5nczogVHNDb25maWdKc29uLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgLy8gTWFwIHVuZGljaS10eXBlcyBvbmx5IHdoZW4gYnVuLXR5cGVzIGFjdHVhbGx5IGxvYWRzOiBhbiBleHBsaWNpdCBgdHlwZXNgIGxpc3QgbG9hZHMgaXQgaWZmIGl0XG4gIC8vIGNvbnRhaW5zIFwiYnVuXCIgKGV2ZW4gb24gUmVhY3QgTmF0aXZlLCB3aG9zZSBwcm9qZWN0cyBtYXkgb3B0IGluIGJ5IGhhbmQpOyB3aXRoIGB0eXBlc2BcbiAgLy8gb21pdHRlZCwgVHlwZVNjcmlwdCdzIGF1dG9tYXRpYyBAdHlwZXMgaW5jbHVzaW9uIGxvYWRzIGl0IGJlY2F1c2Ugd2JmeSBpbnN0YWxscyBAdHlwZXMvYnVuXG4gIC8vIGZvciBldmVyeSBUeXBlU2NyaXB0IHByb2plY3QgZXhjZXB0IFJlYWN0IE5hdGl2ZSwgd2hpY2ggdXNlcyBAdHNjb25maWcvcmVhY3QtbmF0aXZlIGluc3RlYWQuXG4gIGNvbnN0IHR5cGVzID0gc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcztcbiAgaWYgKHR5cGVzID8gIXR5cGVzLmluY2x1ZGVzKCdidW4nKSA6IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHJldHVybjtcbiAgY29uc3QgY29ycmVjdE1hcHBpbmcgPSBgJHtnZXRSb290RGlyKGNvbmZpZyl9L25vZGVfbW9kdWxlcy91bmRpY2ktdHlwZXMvaW5kZXguZC50c2A7XG4gIGNvbnN0IGV4aXN0aW5nTWFwcGluZyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ucGF0aHM/LlsndW5kaWNpLXR5cGVzJ107XG4gIGlmIChleGlzdGluZ01hcHBpbmcpIHtcbiAgICAvLyBSZXdyaXRlIHRoZSBnZW5lcmF0ZWQgbWFwcGluZyB3aGVuIGEgd29ya3NwYWNlIG1vdmVzIHRvIGEgZGlmZmVyZW50IHJvb3QgZGVwdGguIEFueSBvdGhlclxuICAgIC8vIHZhbHVlIGlzIGEgZGVsaWJlcmF0ZSByZXBvLWxvY2FsIG1hcHBpbmcgKGUuZy4gcGF0Y2hlZCB0eXBlcykgYW5kIG11c3QgYmUga2VwdC5cbiAgICBpZiAoXG4gICAgICBleGlzdGluZ01hcHBpbmcubGVuZ3RoID09PSAxICYmXG4gICAgICB0eXBlb2YgZXhpc3RpbmdNYXBwaW5nWzBdID09PSAnc3RyaW5nJyAmJlxuICAgICAgLyg/Ol58XFwvKW5vZGVfbW9kdWxlc1xcL3VuZGljaS10eXBlc1xcL2luZGV4XFwuZFxcLnRzJC91LnRlc3QoZXhpc3RpbmdNYXBwaW5nWzBdKVxuICAgICkge1xuICAgICAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zIS5wYXRocyFbJ3VuZGljaS10eXBlcyddID0gW2NvcnJlY3RNYXBwaW5nXTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnBhdGhzID0ge1xuICAgIC4uLnNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5wYXRocyxcbiAgICAndW5kaWNpLXR5cGVzJzogW2NvcnJlY3RNYXBwaW5nXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzOiBUc0NvbmZpZ0pzb24pOiB2b2lkIHtcbiAgLy8gT21pdHRpbmcgaW5jbHVkZSBsZXRzIGZyYW1ld29yayB0c2NvbmZpZ3Mga2VlcCBUeXBlU2NyaXB0J3MgZGVmYXVsdFxuICAvLyBcImFsbCBUUy9UU1ggZmlsZXNcIiBiZWhhdmlvciwgd2hpY2ggYWxyZWFkeSBjb3ZlcnMgc2NyaXB0cy5cbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlKSByZXR1cm47XG4gIGlmIChzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKCdzY3JpcHRzLyoqLyonKSkgcmV0dXJuO1xuXG4gIHNldHRpbmdzLmluY2x1ZGUucHVzaCgnc2NyaXB0cy8qKi8qJyk7XG4gIHNldHRpbmdzLmluY2x1ZGUuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucztcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgY29uc3QgbW9kdWxlUmVzb2x1dGlvbiA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24pO1xuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzZXR0aW5ncy5leHRlbmRzKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBjb25maWcgbWF5IGFscmVhZHkgc3VwcGx5IGEgdmFsaWQgbW9kdWxlL3Jlc29sdmVyIHBhaXIsIHNvIG9ubHlcbiAgICAgIC8vIHJlbW92ZSB0aGUgcmVtb3ZlZC1pbi1UUzYgbm9kZTEwIHNwZWxsaW5ncyBpbnN0ZWFkIG9mIGZvcmNpbmcgYnVuZGxlciBvbiBpdC5cbiAgICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmV4dC5qcyB3cml0ZXMgXCJub2RlXCIgZHVyaW5nIGJ1aWxkIHdoZW4gdGhpcyBvcHRpb24gaXMgbWlzc2luZywgYnV0XG4gICAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gdHNnb2xpbnQgZm9sbG93cyBUeXBlU2NyaXB0IDYgdmFsaWRhdGlvbiwgd2hlcmUgYmFzZVVybCBpcyByZW1vdmVkIGFuZFxuICAvLyBwYXRoIHRhcmdldHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlbGF0aXZlLiBOZXh0LmpzIHN0aWxsIGFjY2VwdHMgdGhlIGFsaWFzXG4gIC8vIHNoYXBlIGFmdGVyIGVhY2ggdGFyZ2V0IGlzIHdyaXR0ZW4gd2l0aCBhIGxlYWRpbmcgLi8uXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMuYmFzZVVybDtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMucGF0aHMpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZXJPcHRpb25zLnBhdGhzKSkge1xuICAgIGNvbXBpbGVyT3B0aW9ucy5wYXRoc1thbGlhc10gPSBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG4gICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpIHx8IHRhcmdldC5zdGFydHNXaXRoKCcuLi8nKSB8fCBwYXRoLmlzQWJzb2x1dGUodGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgICByZXR1cm4gYC4vJHt0YXJnZXR9YDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHJldHVybiAnLic7XG4gIC8vIFRoZSB1bmRpY2ktdHlwZXMgcGF0aCBtYXBwaW5nIG11c3QgcmVhY2ggdGhlIG1vbm9yZXBvIHJvb3QncyBub2RlX21vZHVsZXMgKGJ1bmZpZy50b21sJ3NcbiAgLy8gcHVibGljSG9pc3RQYXR0ZXJuIGhvaXN0cyB0aGUgcGFja2FnZSB0aGVyZSksIGFuZCB3b3Jrc3BhY2UgcGF0dGVybnMgbWF5IGJlIGFyYml0cmFyaWx5IGRlZXBcbiAgLy8gKGUuZy4gYGV4YW1wbGVzLyoqYCksIHNvIGEgZml4ZWQgdHdvLWxldmVsIHByb2JlIGlzIG5vdCBlbm91Z2guIFByZWZlciB0aGUgbmVhcmVzdCBhbmNlc3RvclxuICAvLyBtYW5pZmVzdCB0aGF0IGRlY2xhcmVzIHdvcmtzcGFjZXMgKHRoZSBtb25vcmVwbyByb290KTsgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbmVhcmVzdFxuICAvLyBhbmNlc3RvciBtYW5pZmVzdC4gU3RvcCBhdCB0aGUgZmlyc3QgZ2l0IHJlcG9zaXRvcnkgYm91bmRhcnkgc28gYW4gdW5yZWxhdGVkIGVuY2xvc2luZ1xuICAvLyByZXBvc2l0b3J5J3MgbWFuaWZlc3QgY2FuIG5ldmVyIGJlIGNob3Nlbi5cbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCk7XG4gIGxldCByb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBhbmNlc3RvckRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7IDsgYW5jZXN0b3JEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yRGlyUGF0aCkpIHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkge1xuICAgICAgcm9vdERpclBhdGggPz89IGFuY2VzdG9yRGlyUGF0aDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgICAgLy8gQnVuIG5vLW9wIHBhdHRlcm5zIChlLmcuIGB3b3Jrc3BhY2VzOiBbXCJcIl1gKSBkbyBub3QgbWFrZSBhIG1hbmlmZXN0IGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICAgIGlmIChnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhtYW5pZmVzdC53b3Jrc3BhY2VzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcm9vdERpclBhdGggPSBhbmNlc3RvckRpclBhdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBBbiB1bnBhcnNhYmxlIG1hbmlmZXN0IHN0aWxsIG1hcmtzIGEgcHJvamVjdCBkaXJlY3Rvcnk7IGtlZXAgY2xpbWJpbmcgZm9yIGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlzUmVwb0JvdW5kYXJ5ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAnLmdpdCcpKTtcbiAgICBjb25zdCBpc0ZpbGVzeXN0ZW1Sb290ID0gYW5jZXN0b3JEaXJQYXRoID09PSBwYXRoLmRpcm5hbWUoYW5jZXN0b3JEaXJQYXRoKTtcbiAgICBpZiAoaXNSZXBvQm91bmRhcnkgfHwgaXNGaWxlc3lzdGVtUm9vdCkgYnJlYWs7XG4gIH1cbiAgaWYgKCFyb290RGlyUGF0aCkgcmV0dXJuICcuJztcbiAgcmV0dXJuIHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgcm9vdERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpIHx8ICcuJztcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gYWRkSW5jbHVkZVBhdGgoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHNldHRpbmdzLmluY2x1ZGUgPz89IFtdO1xuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoZGlyUGF0aCkpIHtcbiAgICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxldGVUeXBlUm9vdHModHlwZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGdlbmVyYXRlZCBwYWNrYWdlLW93bmVkIHRlc3QgdHlwZXMgc2hvdWxkIHRyaWdnZXIgdGhpcy4gVXNlci1kZWZpbmVkIHNsYXNoLWJhc2VkXG4gIC8vIGVudHJpZXMgbWF5IGludGVudGlvbmFsbHkgcmVseSBvbiBjdXN0b20gdHlwZVJvb3RzIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIGFzLWlzLlxuICByZXR1cm4gdHlwZU5hbWVzLnNvbWUoKHR5cGVOYW1lKSA9PiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lLmluY2x1ZGVzKCcvJykpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXM6IHN0cmluZ1tdLCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdlbmVyYXRlZFR5cGVTZXQgPSBuZXcgU2V0KGdlbmVyYXRlZFR5cGVzKTtcbiAgcmV0dXJuIGV4aXN0aW5nVHlwZXMuZmlsdGVyKCh0eXBlTmFtZSkgPT4ge1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBwYWNrYWdlLXByb3ZpZGVkIHRlc3QgZ2xvYmFscy4gRHJvcCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlXG4gICAgLy8gY29ycmVzcG9uZGluZyBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBwcmVzZW50IHNvIFR5cGVTY3JpcHQgd29uJ3QgcmVxdWlyZVxuICAgIC8vIG1pc3NpbmcgcGFja2FnZXMgc3VjaCBhcyB2aXRlc3QuXG4gICAgaWYgKGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWUpICYmICFnZW5lcmF0ZWRUeXBlU2V0Lmhhcyh0eXBlTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZSA9PT0gJ2plc3QnIHx8IHR5cGVOYW1lID09PSAnbW9jaGEnIHx8IHR5cGVOYW1lID09PSAndml0ZXN0L2dsb2JhbHMnO1xufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VTZXR0aW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXVxuKTogUGljazxOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPiwgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJz4ge1xuICBjb25zdCBlbWl0T3B0aW9ucyA9IHt9IGFzIFBpY2s8XG4gICAgTm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sXG4gICAgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJ1xuICA+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlY2xhcmF0aW9uJywgJ2RlY2xhcmF0aW9uTWFwJywgJ3NvdXJjZU1hcCddIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21waWxlck9wdGlvbnM/LltrZXldO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbWl0T3B0aW9uc1trZXldID0gdmFsdWUgYXMgbmV2ZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbWl0T3B0aW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIC8vIFJlYWN0IE5hdGl2ZSBnZXRzIGl0cyBhbWJpZW50IHR5cGVzIGZyb20gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSAocmVhY3QtbmF0aXZlLCBqZXN0KS5cbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnYnVuJyk7XG4gIH1cbiAgaWYgKFxuICAgIGRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ2plc3QtZW52aXJvbm1lbnQtanNkb20nXSB8fFxuICAgIGRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2plc3QnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLnZpdGVzdCkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ3ZpdGVzdC9nbG9iYWxzJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5tb2NoYSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ21vY2hhJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5jeXByZXNzKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnY3lwcmVzcycpO1xuICB9XG5cbiAgcmV0dXJuIFsuLi50eXBlTmFtZXNdO1xufVxuIiwiaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGUgb2YgZWFjaCBzdXBwb3J0ZWQgYWdlbnQsIHJlbGF0aXZlIHRvIHRoZSBob21lIGRpcmVjdG9yeS4gVGhlc2VcbiAqIGFwcGx5IHRvIGV2ZXJ5IHJlcG9zaXRvcnkgdGhlIGFnZW50IHdvcmtzIGluLCBzbyB0aGV5IGhvbGQgb25seSB0aGUgY29udmVudGlvbnMgdGhhdCBhcmUgdHJ1ZSBvblxuICogZXZlcnkgV2lsbEJvb3N0ZXIgZGV2ZWxvcGVyIG1hY2hpbmUgcmF0aGVyIHRoYW4gaW4gYSBwYXJ0aWN1bGFyIHJlcG9zaXRvcnkuXG4gKi9cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uRmlsZVBhdGhzID0gWycuY29kZXgvQUdFTlRTLm1kJywgJy5jbGF1ZGUvQ0xBVURFLm1kJywgJy5nZW1pbmkvR0VNSU5JLm1kJ10gYXMgY29uc3Q7XG5cbi8vIFRoaXMgY29udGVudCBpcyBsb2FkZWQgaW50byBldmVyeSBhZ2VudCBzZXNzaW9uLCBzbyBpdCBpcyBrZXB0IGFzIHNob3J0IGFzIGl0IGNhbiBiZSB3aGlsZVxuLy8gc3RheWluZyB1bmFtYmlndW91czogZS5nLiwgdGhlIGV4Y2x1ZGVkIG9yZ2FuaXphdGlvbnMgYXJlIHdyaXR0ZW4gYXMgc2hlbGwgYnJhY2UgZXhwYW5zaW9uLCB3aGljaFxuLy8gdGhlIGFnZW50cyByZWFkIGFzIGEgcGF0aCBjb25kaXRpb24gd2l0aG91dCBhbnkgcnVudGltZSBtYXRjaGluZy5cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCA9IGAtIFJlcG9zIGxpdmUgdW5kZXIgXFxgfi9naHEvZ2l0aHViLmNvbVxcYDsgYWx3YXlzIGNsb25lIHdpdGggXFxgZ2hxIGdldCAtcFxcYCwgbmV2ZXIgXFxgZ2l0IGNsb25lXFxgLlxuLSBMTE0vQUkgYWdlbnQgcmVzcG9uc2VzIG1heSB0YWtlIDHigJMyIGhvdXJzOyB3YWl0IHBhdGllbnRseSwgZG9uJ3QgYXNzdW1lIGZhaWx1cmUuXG4tIE5vIEFJIGF0dHJpYnV0aW9uIChlLmcuLCBcXGBDby1BdXRob3JlZC1CeVxcYCB0cmFpbGVycywgXCJHZW5lcmF0ZWQgd2l0aCAuLi5cIiBmb290ZXJzKSBpbiBjb21taXRzLCBpc3N1ZXMsIG9yIFBScyB1bmxlc3MgZXhwbGljaXRseSByZXF1ZXN0ZWQuIFRoaXMgaGlkZXMgbm90aGluZzogaWYgYXNrZWQgd2hpY2ggQUkgYWdlbnQgZGlkIHRoZSB3b3JrLCBhbnN3ZXIgdHJ1dGhmdWxseS5cbi0gT3V0c2lkZSBcXGB+L2docS9naXRodWIuY29tL3tXaWxsQm9vc3RlcixXaWxsQm9vc3RlckxhYn0vXFxgLCBmb2xsb3cgdGhlIHJlcG9zaXRvcnkncyBjb250cmlidXRpb24gZ3VpZGUgKGUuZy4sIENPTlRSSUJVVElORy5tZCwgXFxgLmdpdGh1Yi9cXGApIGFuZCBpc3N1ZS9QUiB0ZW1wbGF0ZXMsIG1hdGNoIGl0cyBjb21taXQgYW5kIGNvZGUgY29udmVudGlvbnMsIGFuZCBob25vciBpdHMgcnVsZXMgb24gQUktYXNzaXN0ZWQgY29udHJpYnV0aW9ucy4gV3JpdGUgaXRzIGlzc3VlcyBhbmQgUFJzIHdpdGggb25seSB3aGF0IGEgcmV2aWV3ZXIgdW5mYW1pbGlhciB3aXRoIHRoZSB3b3JrIG5lZWRzIHRvIHVuZGVyc3RhbmQgYW5kIGFzc2VzcyBpdCwgYXMgY29uY2lzZWx5IGFzIHRoYXQgY29udGV4dCBhbGxvd3MuXG5gO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIHNldHRpbmdzIG1lcmdlZCBpbnRvIGVhY2ggYWdlbnQncyBKU09OIHNldHRpbmdzIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSBob21lXG4gKiBkaXJlY3RvcnkuXG4gKlxuICogRXZlcnkgYWdlbnQgdGhhdCBjYXJyaWVzIGZhY3RzIGZyb20gb25lIHNlc3Npb24gaW50byB0aGUgbmV4dCBpcyB0dXJuZWQgb2ZmIGhlcmUgYmVjYXVzZSBzdWNoXG4gKiBtZW1vcnkgbWFrZXMgYSBzZXNzaW9uIGRlcGVuZCBvbiBpbnZpc2libGUgbWFjaGluZS1sb2NhbCBzdGF0ZTogaXRzIGJlaGF2aW9yIHN0b3BzIGJlaW5nXG4gKiByZXByb2R1Y2libGUgYWNyb3NzIGRldmVsb3BlcnMgYW5kIENJLCBhbmQgYSBzdGFsZSBvciB3cm9uZyBtZW1vcnkgc2lsZW50bHkgb3ZlcnJpZGVzIHRoZVxuICogaW5zdHJ1Y3Rpb24gZmlsZXMgYWJvdmUuIENvZGV4IG5lZWRzIG5vIGVudHJ5IGJlY2F1c2UgaXRzIG1lbW9yaWVzIGFyZSBvcHQtaW5cbiAqIChgW2ZlYXR1cmVzXSBtZW1vcmllcyA9IHRydWVgIGluIGB+Ly5jb2RleC9jb25maWcudG9tbGApLCBzbyBsZWF2aW5nIHRoYXQgZmxhZyB1bnNldCBpcyBlbm91Z2guXG4gKi9cbmNvbnN0IGFnZW50U2V0dGluZ3MgPSBbXG4gIHtcbiAgICByZWxhdGl2ZVBhdGg6ICcuY2xhdWRlL3NldHRpbmdzLmpzb24nLFxuICAgIGFjY2VwdHNDb21tZW50czogZmFsc2UsXG4gICAgLyoqXG4gICAgICogQ2xhdWRlIENvZGUgaW5qZWN0cyBpdHMgb3duIGF0dHJpYnV0aW9uIGRpcmVjdGl2ZSAoYSBgQ28tQXV0aG9yZWQtQnlgIHRyYWlsZXIsIGEgXCJHZW5lcmF0ZWRcbiAgICAgKiB3aXRoXCIgZm9vdGVyLCBhbmQgYSBzZXNzaW9uIGxpbmspIGludG8gdGhlIHRvb2wgZGVzY3JpcHRpb25zIGFuZCBtaWQtc2Vzc2lvbiByZW1pbmRlcnMsIGFuZFxuICAgICAqIHRoYXQgZGlyZWN0aXZlIGRlY2xhcmVzIGl0c2VsZiB0byByZXBsYWNlIGVhcmxpZXIgZ3VpZGFuY2UsIHNvIHRoZSBpbnN0cnVjdGlvbiBmaWxlIGFsb25lXG4gICAgICogY2Fubm90IHN1cHByZXNzIGl0LiBPbmx5IHRoaXMgc2V0dGluZyByZW1vdmVzIHRoZSBkaXJlY3RpdmUgYXQgaXRzIHNvdXJjZS4gQXV0byBtZW1vcnkgaXMgb25cbiAgICAgKiBieSBkZWZhdWx0LCBzbyBpdCBtdXN0IGJlIHR1cm5lZCBvZmYgZXhwbGljaXRseS5cbiAgICAgKi9cbiAgICBzZXR0aW5nczoge1xuICAgICAgYXR0cmlidXRpb246IHtcbiAgICAgICAgY29tbWl0OiAnJyxcbiAgICAgICAgcHI6ICcnLFxuICAgICAgICBzZXNzaW9uVXJsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBhdXRvTWVtb3J5RW5hYmxlZDogZmFsc2UsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHJlbGF0aXZlUGF0aDogJy5nZW1pbmkvc2V0dGluZ3MuanNvbicsXG4gICAgLy8gR2VtaW5pIENMSSBzdHJpcHMgY29tbWVudHMgYmVmb3JlIHBhcnNpbmcgaXRzIHNldHRpbmdzIGZpbGUsIHVubGlrZSBDbGF1ZGUgQ29kZSwgd2hpY2hcbiAgICAvLyByZWplY3RzIGEgY29tbWVudGVkIGZpbGUgYXMgbWFsZm9ybWVkLlxuICAgIGFjY2VwdHNDb21tZW50czogdHJ1ZSxcbiAgICBzZXR0aW5nczoge1xuICAgICAgZXhwZXJpbWVudGFsOiB7XG4gICAgICAgIGF1dG9NZW1vcnk6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBPdmVyd3JpdGVzIHRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGVzIG9mIGV2ZXJ5IHN1cHBvcnRlZCBhZ2VudCB3aXRoIHRoZSBmaXhlZCBjb250ZW50IGFuZFxuICogbWVyZ2VzIHRoZSBmaXhlZCBzZXR0aW5ncyBpbnRvIGVhY2ggYWdlbnQncyB1c2VyIHNldHRpbmdzLiBSZXR1cm5zIGZhbHNlIHdoZW4gYW55IGZpbGUgd2FzXG4gKiBza2lwcGVkIChlLmcuIGEgc3ltbGlua2VkIG9yIHVucGFyc2FibGUgZmlsZSksIHNvIHRoZSBjb21tYW5kIGNhbiBmYWlsIGxvdWRseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVXNlckFnZW50Q29uZmlncygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgbGV0IGhhc1dyaXR0ZW5BbGwgPSB0cnVlO1xuICBmb3IgKGNvbnN0IHJlbGF0aXZlUGF0aCBvZiB1c2VyQWdlbnRJbnN0cnVjdGlvbkZpbGVQYXRocykge1xuICAgIGNvbnN0IGhhc1dyaXR0ZW4gPSBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGguam9pbihvcy5ob21lZGlyKCksIHJlbGF0aXZlUGF0aCksIHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCk7XG4gICAgaGFzV3JpdHRlbkFsbCAmJj0gaGFzV3JpdHRlbjtcbiAgfVxuICBmb3IgKGNvbnN0IHsgYWNjZXB0c0NvbW1lbnRzLCByZWxhdGl2ZVBhdGgsIHNldHRpbmdzIH0gb2YgYWdlbnRTZXR0aW5ncykge1xuICAgIC8vIEF3YWl0ZWQgc2VwYXJhdGVseTogYCYmPWAgd291bGQgc2tpcCB0aGUgbWVyZ2Ugb25jZSBhbiBlYXJsaWVyIGZpbGUgd2FzIHNraXBwZWQuXG4gICAgY29uc3QgaGFzTWVyZ2VkID0gYXdhaXQgbWVyZ2VBZ2VudFNldHRpbmdzKHJlbGF0aXZlUGF0aCwgc2V0dGluZ3MsIGFjY2VwdHNDb21tZW50cyk7XG4gICAgaGFzV3JpdHRlbkFsbCAmJj0gaGFzTWVyZ2VkO1xuICB9XG4gIHJldHVybiBoYXNXcml0dGVuQWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtZXJnZUFnZW50U2V0dGluZ3MoXG4gIHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuICBuZXdTZXR0aW5nczogb2JqZWN0LFxuICBhY2NlcHRzQ29tbWVudHM6IGJvb2xlYW5cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksIHJlbGF0aXZlUGF0aCk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgbGV0IGV4aXN0aW5nU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGlmIChleGlzdGluZ0NvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIEFuIGFnZW50IGlnbm9yZXMgaXRzIHdob2xlIHNldHRpbmdzIGZpbGUgd2hlbiB0aGUgZmlsZSBicmVha3MgdGhlIGdyYW1tYXIgdGhlIGFnZW50IHJlYWRzIGl0XG4gICAgLy8gd2l0aCwgc28gd2JmeSBsZWF2ZXMgc3VjaCBhIGZpbGUgdG8gdGhlIGRldmVsb3BlciB0byByZXBhaXIgcmF0aGVyIHRoYW4gcmV3cml0aW5nIGl0IGludG8gYVxuICAgIC8vIGZpbGUgdGhlIGFnZW50IHN0aWxsIGlnbm9yZXM6IGNvbW1lbnRzIGFyZSB0b2xlcmF0ZWQgb25seSB3aGVyZSB0aGUgYWdlbnQgc3RyaXBzIHRoZW0sIGFuZFxuICAgIC8vIHRyYWlsaW5nIGNvbW1hcyBub3doZXJlLCBzaW5jZSBib3RoIGFnZW50cyBwYXJzZSB3aXRoIEpTT04ucGFyc2UgaW4gdGhlIGVuZC4gQ29tbWVudC1vbmx5XG4gICAgLy8gY29udGVudCBpcyBjaGVja2VkIHRvbywgYmVjYXVzZSBpdCBpcyBrZXB0IGFzIGEgaGVhZGVyIGFib3ZlIHRoZSBnZW5lcmF0ZWQgb2JqZWN0LlxuICAgIGlmICghYWNjZXB0c0NvbW1lbnRzICYmIGpzb25jVXRpbC5jb250YWluc0NvbW1lbnQoZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhpcyBhZ2VudCByZWFkcyBpdCBhcyBzdHJpY3QgSlNPTiwgY29tbWVudHMgYW5kIGFsbC5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oZXhpc3RpbmdDb250ZW50LCBmYWxzZSk7XG4gICAgICBpZiAoIXBhcnNlZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgU2tpcHBlZCB1cGRhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBhIHN0cmljdCBKU09OIG9iamVjdCAoYSB0cmFpbGluZyBjb21tYSwgZm9yIGV4YW1wbGUsIGlzIG5vdCBhbGxvd2VkKS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nU2V0dGluZ3MgPSBwYXJzZWRTZXR0aW5ncztcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2V0dGluZ3MgPSBtZXJnZShleGlzdGluZ1NldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gIC8vIE9ubHkgdGhlIHByb3BlcnRpZXMgd2hvc2UgdmFsdWUgY2hhbmdlcyBhcmUgcmV3cml0dGVuLCBzbyB0aGUgZmlsZSBrZWVwcyBpdHMgb3duIGZvcm1hdHRpbmdcbiAgLy8gYW5kLCB3aGVyZSB0aGUgYWdlbnQgYWxsb3dzIHRoZW0sIGl0cyBjb21tZW50cy5cbiAgY29uc3QgeyBjb250ZW50LCBrZXlzTG9zaW5nQ29tbWVudHMgfSA9IGpzb25jVXRpbC5zdHJpbmdpZnlQcmVzZXJ2aW5nVHJpdmlhKGV4aXN0aW5nQ29udGVudCwgc2V0dGluZ3MpO1xuICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSkpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzTG9zaW5nQ29tbWVudHMpIHtcbiAgICBjb25zb2xlLndhcm4oYENvbW1lbnRzIGluc2lkZSBcIiR7a2V5fVwiIHdlcmUgZHJvcHBlZCB3aGlsZSByZXdyaXRpbmcgaXQgaW4gJHtmaWxlUGF0aH0uYCk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkgcmV0dXJuO1xuICAgIC8vIC52c2NvZGUvc2V0dGluZ3MuanNvbiBpcyBKU09OQyBieSBkZWZpbml0aW9uOyBKU09OLnBhcnNlIHdvdWxkIG1ha2Ugd2JmeSBzaWxlbnRseSBza2lwXG4gICAgLy8gY29tbWVudGVkIGZpbGVzLlxuICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KGV4aXN0aW5nQ29udGVudCk7XG4gICAgaWYgKCFwYXJzZWRTZXR0aW5ncykge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShwYXJzZWRTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgICBsZXQgc2V0dGluZ3MgPSBwYXJzZWRTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICB9XG4gICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHNldHRpbmdzLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSA9PT0gb3JpZ2luYWxTZXR0aW5nc0pzb24pIHJldHVybjtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuaW50ZXJmYWNlIEZub3hUb21sU3VidHJlZSB7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJvZmlsZXM/OiBSZWNvcmQ8c3RyaW5nLCB7IHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9IHwgdW5kZWZpbmVkPjtcbn1cblxuLy8gVGhlIGZvdXIgc3RhbmRhcmQgV0JfRU5WIG1vZGVzOyBzdGFnaW5nIGlzIG9wdGlvbmFsIGFuZCBvbmx5IGNvbXBsZXRlZCB3aGVuIHRoZSByZXBvc2l0b3J5XG4vLyBhbHJlYWR5IGRlY2xhcmVzIHRoZSBzdGFnaW5nIHByb2ZpbGUuXG5jb25zdCB3YkVudk1vZGVzID0gWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddIGFzIGNvbnN0O1xudHlwZSBXYkVudk1vZGUgPSAodHlwZW9mIHdiRW52TW9kZXMpW251bWJlcl07XG5cbi8qKlxuICogRW5zdXJlcyBhIGZub3ggcmVwb3NpdG9yeSBkZWZpbmVzIFdCX0VOViBmb3IgZXZlcnkgc3RhbmRhcmQgbW9kZSAoYW5kIE5FWFRfUFVCTElDX1dCX0VOViB3aGVuXG4gKiBhbnkgd29ya3NwYWNlIGRlcGVuZHMgb24gTmV4dC5qcyBvciB2aW5leHQpIGluIGZub3gudG9tbCBwcm9maWxlcy4gRXhpc3RpbmcgZGVmaW5pdGlvbnMgYXJlXG4gKiBhbHdheXMgbGVmdCB1bnRvdWNoZWQuIE5vbi1mbm94IHJlcG9zaXRvcmllcyBhcmUgc2tpcHBlZDogLmVudiBmaWxlcyBhcmUgbm8gbG9uZ2VyIG1hbmFnZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2Vuc3VyZVdiRW52RGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbmVlZHNOZXh0UHVibGljID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZykpO1xuICAgIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKTtcbiAgICAvLyBsc3RhdCwgbm90IGV4aXN0c1N5bmM6IGV4aXN0c1N5bmMgaXMgZmFsc2UgZm9yIGEgREFOR0xJTkcgZm5veC50b21sIHN5bWxpbms7IGFueSBmbm94LnRvbWxcbiAgICAvLyBkaXJlY3RvcnkgZW50cnkgbWFya3MgYSBmbm94IHJlcG9zaXRvcnksIGFuZCBhIHJlZnVzZWQvZGFuZ2xpbmcgb25lIGFib3J0cyBpbnN0ZWFkIG9mXG4gICAgLy8gYmVpbmcgdHJlYXRlZCBhcyBhIG5vbi1mbm94IHJlcG9zaXRvcnkgd2hpbGUgdGhlIGZub3ggc3luY2hyb25pemF0aW9uIGlzIGZhaWxpbmcuXG4gICAgaWYgKCEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZm5veFRvbWxQYXRoKS5jYXRjaCgoKSA9PiB7fSkpKSByZXR1cm47XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoZm5veFRvbWxQYXRoKTtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRXYkVudkludG9Gbm94VG9tbChjb250ZW50LCBuZWVkc05leHRQdWJsaWMpO1xuICAgIGlmICh1cGRhdGVkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIHVwZGF0ZWRDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTWlycm9ycyB3YidzIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52IGNvbnRyYWN0IChwYWNrYWdlcy93Yi9zcmMvcHJvamVjdC50cyk6IHRoZSBmcmFtZXdvcmsgbWF5XG4gKiBiZSBkZWNsYXJlZCBpbiBBTlkgb2YgdGhlIGZvdXIgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBgbmV4dGAgYXMgYSBkZXZEZXBlbmRlbmN5IGluIGEgc2hhcmVkXG4gKiBjb21wb25lbnQgbGlicmFyeSksIHdoaWxlIHdiZnkncyBgZGVwZW5kaW5nLm5leHRgIGxvb2tzIG9ubHkgYXQgcmVndWxhciBkZXBlbmRlbmNpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXS5zb21lKChzZWN0aW9uKSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gY29uZmlnLnBhY2thZ2VKc29uPy5bc2VjdGlvbiBhcyAnZGVwZW5kZW5jaWVzJ107XG4gICAgcmV0dXJuICEhZGVwZW5kZW5jaWVzPy5bJ25leHQnXSB8fCAhIWRlcGVuZGVuY2llcz8uWyd2aW5leHQnXTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBtaXNzaW5nIFdCX0VOViAoYW5kIG9wdGlvbmFsbHkgTkVYVF9QVUJMSUNfV0JfRU5WKSBlbnRyaWVzIGludG8gYSBmbm94LnRvbWw6IHRoZSBiYXNlXG4gKiBgW3NlY3JldHNdYCB0YWJsZSBjYXJyaWVzIHRoZSBkZXZlbG9wbWVudCBkZWZhdWx0cyBhbmQgYFtwcm9maWxlcy48bW9kZT4uc2VjcmV0c11gIG92ZXJsYXlzXG4gKiBlYWNoIG90aGVyIG1vZGUsIG1hdGNoaW5nIHRoZSBvcmctc3RhbmRhcmQgbGF5b3V0LiBGb3JtYXR0aW5nIGFuZCBjb21tZW50cyBhcmUgcHJlc2VydmVkOyBvbmx5XG4gKiBtaXNzaW5nIGxpbmVzIGFyZSBpbnNlcnRlZCBvciBtaXNzaW5nIHNlY3Rpb25zIGFwcGVuZGVkLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBjb250ZW50XG4gKiBjYW5ub3QgYmUgc2FmZWx5IGVkaXRlZCAodW5wYXJzYWJsZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGVkaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0V2JFbnZJbnRvRm5veFRvbWwoY29udGVudDogc3RyaW5nLCBuZWVkc05leHRQdWJsaWM6IGJvb2xlYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgc2V0dGluZ3M6IEZub3hUb21sU3VidHJlZTtcbiAgdHJ5IHtcbiAgICBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEZub3hUb21sU3VidHJlZTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGluc2VydGluZyBXQl9FTlYgaW50byBmbm94LnRvbWwgYmVjYXVzZSBpdCBpcyBub3QgcGFyc2FibGUgYXMgVE9NTC4nKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qga2V5TmFtZXMgPSBuZWVkc05leHRQdWJsaWMgPyBbJ1dCX0VOVicsICdORVhUX1BVQkxJQ19XQl9FTlYnXSA6IFsnV0JfRU5WJ107XG4gIGxldCB1cGRhdGVkQ29udGVudCA9IGNvbnRlbnQ7XG4gIGZvciAoY29uc3QgbW9kZSBvZiB3YkVudk1vZGVzKSB7XG4gICAgLy8gVGhlIHN0YWdpbmcgbW9kZSBpcyBvcHRpb25hbDogY29tcGxldGUgaXQgb25seSB3aGVuIHRoZSByZXBvc2l0b3J5IGFscmVhZHkgZGVjbGFyZXMgdGhlIHByb2ZpbGUuXG4gICAgaWYgKG1vZGUgPT09ICdzdGFnaW5nJyAmJiAhc2V0dGluZ3MucHJvZmlsZXM/LnN0YWdpbmcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHNldHRpbmdzLnNlY3JldHMgOiBzZXR0aW5ncy5wcm9maWxlcz8uW21vZGVdPy5zZWNyZXRzO1xuICAgIGZvciAoY29uc3Qga2V5TmFtZSBvZiBrZXlOYW1lcykge1xuICAgICAgY29uc3QgZGVmaW5lZCA9IGRlZmluZWRLZXlzPy5ba2V5TmFtZV07XG4gICAgICBjb25zdCBkZWZpbmVkVmFsdWUgPVxuICAgICAgICB0eXBlb2YgZGVmaW5lZCA9PT0gJ3N0cmluZycgPyBkZWZpbmVkIDogKGRlZmluZWQgYXMgeyBkZWZhdWx0PzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uZGVmYXVsdDtcbiAgICAgIHdhcm5PblVuZXhwZWN0ZWRXYkVudlZhbHVlKGtleU5hbWUsIGRlZmluZWRWYWx1ZSwgbW9kZSk7XG4gICAgfVxuICAgIGNvbnN0IG1pc3NpbmdMaW5lcyA9IGtleU5hbWVzXG4gICAgICAuZmlsdGVyKChrZXlOYW1lKSA9PiBkZWZpbmVkS2V5cz8uW2tleU5hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChrZXlOYW1lKSA9PiBgJHtrZXlOYW1lfSA9IHsgZGVmYXVsdCA9IFwiJHttb2RlfVwiIH1gKTtcbiAgICBpZiAobWlzc2luZ0xpbmVzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRJbnRvRm5veFNlY3Rpb24oXG4gICAgICB1cGRhdGVkQ29udGVudCxcbiAgICAgIG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyAnc2VjcmV0cycgOiBgcHJvZmlsZXMuJHttb2RlfS5zZWNyZXRzYCxcbiAgICAgIG1pc3NpbmdMaW5lc1xuICAgICk7XG4gIH1cbiAgaWYgKHVwZGF0ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm4gY29udGVudDtcblxuICAvLyBSZS1wYXJzZSBiZWZvcmUgcmV0dXJuaW5nOiBhbiB1bnVzdWFsIGxheW91dCAoZS5nLiBkb3R0ZWQga2V5cyB3aXRob3V0IGEgdGFibGUgaGVhZGVyKSBjb3VsZFxuICAvLyBtYWtlIHRoZSB0ZXh0dWFsIGVkaXQgcHJvZHVjZSBhIGR1cGxpY2F0ZSB0YWJsZTsgZmFpbCBzYWZlbHkgaW5zdGVhZCBvZiBjb3JydXB0aW5nIHRoZSBmaWxlLlxuICB0cnkge1xuICAgIGNvbnN0IHVwZGF0ZWRTZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKHVwZGF0ZWRDb250ZW50KSBhcyBGbm94VG9tbFN1YnRyZWU7XG4gICAgZm9yIChjb25zdCBtb2RlIG9mIHdiRW52TW9kZXMpIHtcbiAgICAgIGlmIChtb2RlID09PSAnc3RhZ2luZycgJiYgIXNldHRpbmdzLnByb2ZpbGVzPy5zdGFnaW5nKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHVwZGF0ZWRTZXR0aW5ncy5zZWNyZXRzIDogdXBkYXRlZFNldHRpbmdzLnByb2ZpbGVzPy5bbW9kZV0/LnNlY3JldHM7XG4gICAgICBpZiAoa2V5TmFtZXMuc29tZSgoa2V5TmFtZSkgPT4gZGVmaW5lZEtleXM/LltrZXlOYW1lXSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRoZSBpbnNlcnRlZCAke21vZGV9IGVudHJpZXMgZGlkIG5vdCB0YWtlIGVmZmVjdGApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgaW5zZXJ0aW5nIFdCX0VOViBpbnRvIGZub3gudG9tbCBiZWNhdXNlICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB1cGRhdGVkQ29udGVudDtcbn1cblxuLyoqXG4gKiBXYXJucyB3aGVuIGFuIGV4aXN0aW5nIFdCX0VOVi1mYW1pbHkgZGVmaW5pdGlvbiBuYW1lcyBhIGRpZmZlcmVudCBtb2RlIHRoYW4gdGhlIG9uZSBpdCBpc1xuICogZGVmaW5lZCBmb3IgKGEgdHlwbyBsaWtlIGBwcm9kY3V0aW9uYCBvciBgcHJvZHVjdGlvbjFgLCBvciBhIGNvcHktcGFzdGVkIHdyb25nIG1vZGUpOiB3YlxuICogcmVqZWN0cyBub24tc3RhbmRhcmQgdmFsdWVzIGF0IHJ1bnRpbWUsIHNvIHN1cmZhY2luZyB0aGUgbWlzbWF0Y2ggZHVyaW5nIHdiZnkgaXMgdGhlIGVhcmxpZXN0XG4gKiBwb3NzaWJsZSBzaWduYWwuIFRoZSBwYXNzZWQgdmFsdWUgaXMgYWx3YXlzIHBsYWludGV4dCAoYSBmbm94IGBkZWZhdWx0YCBmaWVsZCkg4oCUIGVuY3J5cHRlZFxuICogZm5veCBlbnRyaWVzIGFyZSBgeyBwcm92aWRlciwgdmFsdWUgfWAgb2JqZWN0cyB3aG9zZSBgZGVmYXVsdGAgaXMgYWJzZW50LlxuICovXG5mdW5jdGlvbiB3YXJuT25VbmV4cGVjdGVkV2JFbnZWYWx1ZShrZXlOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBtb2RlOiBXYkVudk1vZGUpOiB2b2lkIHtcbiAgLy8gQW4gRU1QVFkgdmFsdWUgY291bnRzIGFzIHVuc2V0ICh3YiBzdXBwbGllcyB0aGUgZmFsbGJhY2sgbW9kZSksIG5vdCBhcyBhIG1pc21hdGNoaW5nIG1vZGUuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbW9kZSkgcmV0dXJuO1xuICAvLyBBIGR5bmFtaWMgdmFsdWUgKGUuZy4gYE5FWFRfUFVCTElDX1dCX0VOVj0ke1dCX0VOVn1gKSBtYXkgbGVnaXRpbWF0ZWx5IHJlc29sdmUgdG8gdGhlIG1vZGVcbiAgLy8gdGhyb3VnaCBleHBhbnNpb24sIHdoaWNoIHRoaXMgc3RhdGljIGNoZWNrIGNhbm5vdCBldmFsdWF0ZSDigJQgc2tpcCBpbnN0ZWFkIG9mIG1pc2ZpcmluZy5cbiAgLy8gZm5veCBleHBhbmRzIG9ubHkgYCR7Li4ufWAgKGEgYmFyZSBgJFVOU0VUYCBzdGF5cyBsaXRlcmFsKS5cbiAgaWYgKHZhbHVlLmluY2x1ZGVzKCckeycpKSByZXR1cm47XG4gIGlmIChrZXlOYW1lID09PSAnTkVYVF9QVUJMSUNfV0JfRU5WJykge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGAke2tleU5hbWV9IGluIGZub3gudG9tbCBpcyBcIiR7dmFsdWV9XCIgYnV0IHNob3VsZCBiZSBcIiR7bW9kZX1cIiBmb3IgdGhlICR7bW9kZX0gbW9kZTsgd2Igb3ZlcnJpZGVzIGl0IHdpdGggV0JfRU5WLCBidXQgYSBkaXJlY3QgZnJhbWV3b3JrIGJ1aWxkIHdvdWxkIGlubGluZSB0aGlzIHZhbHVlLmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLndhcm4oXG4gICAgYCR7a2V5TmFtZX0gaW4gZm5veC50b21sIGlzIFwiJHt2YWx1ZX1cIiBidXQgc2hvdWxkIGJlIFwiJHttb2RlfVwiIGZvciB0aGUgJHttb2RlfSBtb2RlOyB3YiByZWplY3RzIHZhbHVlcyBvdXRzaWRlIGRldmVsb3BtZW50L3Rlc3Qvc3RhZ2luZy9wcm9kdWN0aW9uLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIGxpbmVzIGF0IHRoZSB0b3Agb2YgYSBUT01MIHNlY3Rpb24sIHJpZ2h0IGFmdGVyIGl0cyBgW2hlYWRlcl1gIGxpbmUgc28gcHJvZmlsZS1zcGVjaWZpY1xuICogZW50cmllcyBzdGF5IGdyb3VwZWQgd2l0aCB0aGVpciBoZWFkZXI7IHRoZSBzZWN0aW9uIGlzIGFwcGVuZGVkIGF0IHRoZSBlbmQgd2hlbiBpdCBpcyBhYnNlbnQuXG4gKi9cbmZ1bmN0aW9uIGluc2VydEludG9Gbm94U2VjdGlvbihjb250ZW50OiBzdHJpbmcsIHNlY3Rpb25OYW1lOiBzdHJpbmcsIGluc2VydGVkTGluZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgLy8gd2JmeSB3cml0ZXMgdGhlIGhlYWRlciB3aXRob3V0IHdoaXRlc3BhY2UgYXJvdW5kIHRoZSBkb3R0ZWQta2V5IGNvbXBvbmVudHMuXG4gIGNvbnN0IGhlYWRlclBhdHRlcm4gPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXlxccypcXFske3NlY3Rpb25OYW1lLnJlcGxhY2VBbGwoJy4nLCBTdHJpbmcucmF3YFxcLmApfVxcXVxccyooPzojLiopPyRgLCAndScpO1xuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBoZWFkZXJJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gaGVhZGVyUGF0dGVybi50ZXN0KGxpbmUpKTtcbiAgaWYgKGhlYWRlckluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5bJHtzZWN0aW9uTmFtZX1dXFxuJHtpbnNlcnRlZExpbmVzLmpvaW4oJ1xcbicpfVxcbmA7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW5lcy5zbGljZSgwLCBoZWFkZXJJbmRleCArIDEpLCAuLi5pbnNlcnRlZExpbmVzLCAuLi5saW5lcy5zbGljZShoZWFkZXJJbmRleCArIDEpXS5qb2luKCdcXG4nKTtcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLyoqXG4gKiBSZXBvc2l0b3JpZXMgb3V0c2lkZSBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiIGNhbm5vdCBjYWxsIHRoZSBvcmdhbml6YXRpb24ncyByZXVzYWJsZVxuICogd29ya2Zsb3dzOiB0aG9zZSB3b3JrZmxvd3MgZGVwZW5kIG9uIG9yZ2FuaXphdGlvbiBzZWNyZXRzIChWRVJEQUNDSU9fVE9LRU4sIERpc2NvcmQgd2ViaG9va3MpXG4gKiBhbmQgc2VsZi1ob3N0ZWQgcnVubmVycyB0aGF0IG90aGVyIG93bmVycyBkbyBub3QgaGF2ZS4gVGhpcyBnZW5lcmF0b3IgaW5zdGVhZCBlbWl0c1xuICogc2VsZi1jb250YWluZWQgd29ya2Zsb3dzIGJ1aWx0IG9ubHkgZnJvbSB3aGF0IGFueSByZXBvc2l0b3J5IG93bmVyIGNhbiBwcm92aWRlOiB0aGUgcmVwb3NpdG9yeVxuICogY29udGVudHMgKG1pc2UudG9tbCwgcGFja2FnZS5qc29uIHNjcmlwdHMpIGFuZCB0aGUgc2luZ2xlIGBGTk9YX0FHRV9LRVlgIHJlcG9zaXRvcnkgc2VjcmV0IHdoZW5cbiAqIHRoZSByZXBvc2l0b3J5IHVzZXMgZm5veC4gR2VuZXJhdGlvbiBpcyBrZXllZCBvbiByZXBvc2l0b3J5IHN0YXRlLCBuZXZlciBvbiB0aGUgb3duZXInc1xuICogaWRlbnRpdHksIHNvIGl0IHdvcmtzIGZvciBhcmJpdHJhcnkgcGVyc29uYWwgcmVwb3NpdG9yaWVzLlxuICovXG5cbi8qKiBGaXJzdCBsaW5lIG9mIGV2ZXJ5IGdlbmVyYXRlZCBmaWxlOyBmaWxlcyB3aXRob3V0IGl0IGFyZSBoYW5kLXdyaXR0ZW4gYW5kIG5ldmVyIHRvdWNoZWQuICovXG5leHBvcnQgY29uc3Qgc2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnkuJztcblxuLy8gU2FtZSBwaW5zIGFzIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MgLyB0aGVpciBjb25zdW1lcnM7IFJlbm92YXRlIHVwZGF0ZXMgdGhlbSBpbiB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkuXG5jb25zdCBjaGVja291dEFjdGlvbiA9ICdhY3Rpb25zL2NoZWNrb3V0QHY3LjAuMSc7XG5jb25zdCBtaXNlQWN0aW9uID0gJ2pkeC9taXNlLWFjdGlvbkB2NC4yLjMnO1xuY29uc3QgY2FjaGVBY3Rpb24gPSAnYWN0aW9ucy9jYWNoZUB2Ni4xLjAnO1xuY29uc3QgdXBsb2FkQXJ0aWZhY3RBY3Rpb24gPSAnYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAdjcuMC4xJztcbi8vIHY2LjEuMTsgdGhlIHNhbWUgcGluIGFzIHRoZSByZXVzYWJsZSBzZW1hbnRpYy1wciB3b3JrZmxvdy5cbmNvbnN0IHNlbWFudGljUHVsbFJlcXVlc3RBY3Rpb24gPSAnYW1hbm5uL2FjdGlvbi1zZW1hbnRpYy1wdWxsLXJlcXVlc3RANDViOWVkN2NmMjQwODdhMmY3Nzg1YmY1NWJlOTczOTRiYTg3ZTFjMic7XG4vLyB2My4wLjM7IGRlcGxveXMgYXJlIG5ldHdvcmstaGVhdnkgYW5kIGJlbmVmaXQgZnJvbSByZXRyaWVzIHdpdGggYSBsb25nIHRpbWVvdXQuXG5jb25zdCByZXRyeUFjdGlvbiA9ICduaWNrLWZpZWxkcy9yZXRyeUBkZDU2ZjFjYThjYTk5MWUyMzg1YzE4YWI2ZGQzNmVhN2Y5ZmRiNTVmJztcblxuLyoqXG4gKiBKb2ItbGV2ZWwgZW52IHRoYXQgdHVybnMgdGhlIFRha3VtaSBHdWFyZCBpbnN0YWxsIHBhdGggb24sIG1pcnJvcmluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzLlxuICpcbiAqIGBzZWNyZXRzYCBpcyB1bmF2YWlsYWJsZSBpbiBhIHN0ZXAtbGV2ZWwgYGlmOmAsIHNvIHRoZSBwcmVzZW5jZSBvZiB0aGUgdG9rZW4gaXMgZXhwb3NlZCBhcyBhXG4gKiBub24tc2VjcmV0IHNpZ25hbDsgYW4gdW5zZXQgc2VjcmV0IGV4cGFuZHMgdG8gYGZhbHNlYCBhbmQgbGVhdmVzIGV2ZXJ5IEd1YXJkIHN0ZXAgc2tpcHBlZCwgd2hpY2hcbiAqIGlzIHdoYXQga2VlcHMgdGhlIGdlbmVyYXRlZCB3b3JrZmxvd3MgcnVubmFibGUgaW4gYSByZXBvc2l0b3J5IHRoYXQgbmV2ZXIgcmVnaXN0ZXJzIHRoZSBzZWNyZXQuXG4gKiBUQUtVTUlfR1VBUkRfVE9LRU4gaXRzZWxmIGlzIGRlZmluZWQtYnV0LUVNUFRZIGpvYi13aWRlIHNvIHRoZSBgJHtUQUtVTUlfR1VBUkRfVE9LRU59YCByZWZlcmVuY2VcbiAqIGluIHRoZSBnZW5lcmF0ZWQgLm5wbXJjIHN0aWxsIGV4cGFuZHMgKHRvICcnKSBpbiB0aGUgc3RlcHMgdGhhdCBkZWxpYmVyYXRlbHkgcnVuIHdpdGhvdXQgdGhlXG4gKiB0b2tlbjsgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkIHZhcmlhYmxlIGlzIHdoYXQgYnJlYWtzIGFuIGluc3RhbGwsIGFuIGVtcHR5IG9uZSBpcyBmaW5lLlxuICovXG5jb25zdCBndWFyZEpvYkVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgSEFTX1RBS1VNSV9HVUFSRF9UT0tFTjogJyR7eyAhIXNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JyxcbiAgVEFLVU1JX0dVQVJEX1RPS0VOOiAnJyxcbn07XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgbmFtZT86IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICB1c2VzPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gICd3b3JraW5nLWRpcmVjdG9yeSc/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbmN1cnJlbmN5PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7ICdydW5zLW9uJzogc3RyaW5nOyBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHN0ZXBzOiBTdGVwW10gfVxuICA+O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxQYWNrYWdlQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdID0gW3Jvb3RDb25maWddXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGlmICghKGF3YWl0IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKHdvcmtmbG93c1BhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgd29ya2Zsb3dzIGJlY2F1c2UgJHt3b3JrZmxvd3NQYXRofSByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHVzZXNGbm94ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpO1xuICAgIGNvbnN0IHdvcmtmbG93QnlGaWxlTmFtZTogUmVjb3JkPHN0cmluZywgV29ya2Zsb3c+ID0ge1xuICAgICAgJ3Rlc3QueW1sJzogYnVpbGRUZXN0V29ya2Zsb3cocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MsIHVzZXNGbm94KSxcbiAgICAgICdzZW1hbnRpYy1wci55bWwnOiBidWlsZFNlbWFudGljUHJXb3JrZmxvdygpLFxuICAgIH07XG4gICAgLy8gRGVwbG95IHdvcmtmbG93cyBhcmUgZ2VuZXJhdGVkIHBlciBkZXBsb3kgc2NyaXB0IHRoZSByZXBvc2l0b3J5IGRlY2xhcmVzLCBzbyBhIHJlcG9zaXRvcnlcbiAgICAvLyB3aXRob3V0IGEgc3RhZ2luZyBlbnZpcm9ubWVudCBzaW1wbHkgZ2V0cyBubyBzdGFnaW5nIHdvcmtmbG93LiBPbmx5IHNjcmlwdHMgdGhhdCBpbnZva2VcbiAgICAvLyBgd2IgZGVwbG95YCBxdWFsaWZ5OiBhIGJlc3Bva2UgZGVwbG95IHNjcmlwdCBtYXkgbm90IGJlIHNhZmUgdG8gdHJpZ2dlciBhdXRvbWF0aWNhbGx5XG4gICAgLy8gKGRlcGxveS1zdGFnaW5nIHJ1bnMgb24gZXZlcnkgcHVzaCB0byB0aGUgZGVmYXVsdCBicmFuY2gpLlxuICAgIGNvbnN0IHNjcmlwdHMgPSByb290Q29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9O1xuICAgIGNvbnN0IGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdyA9IGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0c1snZGVwbG95J10pO1xuICAgIGlmIChoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cpIHtcbiAgICAgIHdvcmtmbG93QnlGaWxlTmFtZVsnZGVwbG95LXByb2R1Y3Rpb24ueW1sJ10gPSBidWlsZERlcGxveVdvcmtmbG93KCdwcm9kdWN0aW9uJywgJ2RlcGxveScsIHVzZXNGbm94KTtcbiAgICB9XG4gICAgaWYgKGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0c1snZGVwbG95OnN0YWdpbmcnXSkpIHtcbiAgICAgIHdvcmtmbG93QnlGaWxlTmFtZVsnZGVwbG95LXN0YWdpbmcueW1sJ10gPSBidWlsZERlcGxveVdvcmtmbG93KCdzdGFnaW5nJywgJ2RlcGxveTpzdGFnaW5nJywgdXNlc0Zub3gpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlICYmIHJvb3RDb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ3JlbGVhc2UueW1sJ10gPSBidWlsZFJlbGVhc2VXb3JrZmxvdyhyb290Q29uZmlnLCBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3csIHVzZXNGbm94KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHdvcmtmbG93XSBvZiBPYmplY3QuZW50cmllcyh3b3JrZmxvd0J5RmlsZU5hbWUpKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVTZWxmQ29udGFpbmVkV29ya2Zsb3cocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgd29ya2Zsb3cpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVNlbGZDb250YWluZWRXb3JrZmxvdyhmaWxlUGF0aDogc3RyaW5nLCB3b3JrZmxvdzogV29ya2Zsb3cpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgLy8gVW5saWtlIFdpbGxCb29zdGVyLW9yZ2FuaXphdGlvbiByZXBvc2l0b3JpZXMsIHdiZnkgZG9lcyBub3Qgb3duIGFyYml0cmFyeSByZXBvc2l0b3JpZXMnIENJOlxuICAvLyBvbmx5IGZpbGVzIGl0IGdlbmVyYXRlZCAoaWRlbnRpZmllZCBieSB0aGUgbWFya2VyKSBhcmUgcmVnZW5lcmF0ZWQsIGFuZCBoYW5kLXdyaXR0ZW5cbiAgLy8gd29ya2Zsb3dzIGFyZSBuZXZlciB0b3VjaGVkLiBPd25lcnMgb3B0IG91dCBwZXJtYW5lbnRseSBieSByZW1vdmluZyB0aGUgbWFya2VyIGxpbmUuXG4gIC8vIEFuIGVtcHR5IG9yIHdoaXRlc3BhY2Utb25seSBmaWxlIGNhcnJpZXMgbm8gaGFuZC13cml0dGVuIGNvbnRlbnQsIHNvIGl0IGlzIHRyZWF0ZWQgYXMgYWJzZW50LlxuICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIG9sZENvbnRlbnQudHJpbSgpICE9PSAnJyAmJiAhb2xkQ29udGVudC5zdGFydHNXaXRoKHNlbGZDb250YWluZWRXb3JrZmxvd01hcmtlcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoZWFkZXIgPSBgJHtzZWxmQ29udGFpbmVkV29ya2Zsb3dNYXJrZXJ9IFJlbW92ZSB0aGlzIGxpbmUgdG8gc3RvcCB3YmZ5IGZyb20gb3ZlcndyaXRpbmcgdGhpcyBmaWxlLlxcbmA7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKHdvcmtmbG93LCB7IGxpbmVXaWR0aDogLTEgfSk7XG4gIGF3YWl0IGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aCwgaGVhZGVyICsgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiB3b3JraW5nRGlyKGRpclBhdGg6IHN0cmluZyk6IFBpY2s8U3RlcCwgJ3dvcmtpbmctZGlyZWN0b3J5Jz4ge1xuICByZXR1cm4gZGlyUGF0aCA/IHsgJ3dvcmtpbmctZGlyZWN0b3J5JzogZGlyUGF0aCB9IDoge307XG59XG5cbmZ1bmN0aW9uIGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiAvXFxid2IgZGVwbG95XFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBidWlsZFRlc3RXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbFBhY2thZ2VDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sIHVzZXNGbm94OiBib29sZWFuKTogV29ya2Zsb3cge1xuICAvLyBQbGF5d3JpZ2h0IG1heSBiZSBkZWNsYXJlZCBvbmx5IGluIHdvcmtzcGFjZSBwYWNrYWdlczsgYHdiIHRlc3Qtb24tY2lgIHJ1bnMgZXZlcnkgZGVjbGFyaW5nXG4gIC8vIHBhY2thZ2UncyBlMmUgdGVzdHMsIHNvIHRoZSB3b3JrZmxvdyBtdXN0IGluc3RhbGwgYnJvd3NlcnMgZm9yIGVhY2ggb2YgdGhlbSAodGhlaXIgdmVyc2lvbnNcbiAgLy8gbWF5IGRpZmZlciwgYW5kIGVhY2ggbGlicmFyeSB2ZXJzaW9uIHJlcXVpcmVzIGl0cyBtYXRjaGluZyBicm93c2VyIGJpbmFyaWVzKS4gQnVuJ3MgaXNvbGF0ZWRcbiAgLy8gbGlua2VyIHJlc29sdmVzIHRoZSBwbGF5d3JpZ2h0IGJpbmFyeSBvbmx5IGZyb20gdGhlIGRlY2xhcmluZyBwYWNrYWdlLCBoZW5jZSB0aGVcbiAgLy8gd29ya2luZy1kaXJlY3Rvcnkgb24gZXZlcnkgc3RlcC4gVGhlIGJyb3dzZXJzIGxhbmQgaW4gfi8uY2FjaGUvbXMtcGxheXdyaWdodCwgc2hhcmVkIGFjcm9zc1xuICAvLyB3b3Jrc3BhY2VzLCBzbyBzYW1lLXZlcnNpb24gaW5zdGFsbHMgbmF0dXJhbGx5IGRlZHVwbGljYXRlLlxuICBjb25zdCBwbGF5d3JpZ2h0RGlyUGF0aHMgPSBbLi4uYWxsUGFja2FnZUNvbmZpZ3NdXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLmRpclBhdGgubG9jYWxlQ29tcGFyZShiLmRpclBhdGgpKVxuICAgIC5maWx0ZXIoKHBhY2thZ2VDb25maWcpID0+IHBhY2thZ2VDb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KVxuICAgIC5tYXAoKHBhY2thZ2VDb25maWcpID0+IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIHBhY2thZ2VDb25maWcuZGlyUGF0aCkpO1xuICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAvLyBTdGVwLXNjb3BlZCBsaWtlIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93OiBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHJ1biBieSBgYnVuIGluc3RhbGxgXG4gIC8vIG11c3Qgbm90IGJlIGFibGUgdG8gcmVhZCB0aGUgbG9uZy1saXZlZCBhZ2UgaWRlbnRpdHkuXG4gIGNvbnN0IGZub3hFbnY6IFBpY2s8U3RlcCwgJ2Vudic+ID0gdXNlc0Zub3ggPyB7IGVudjogeyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gfSA6IHt9O1xuXG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiB9LFxuICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKHRydWUpLFxuICAgIC4uLihwbGF5d3JpZ2h0RGlyUGF0aHMubGVuZ3RoID4gMFxuICAgICAgPyAoW1xuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgsIGluZGV4KTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgbmFtZTogYEdldCBQbGF5d3JpZ2h0IHZlcnNpb24ke2RpclBhdGggPyBgICgke2RpclBhdGh9KWAgOiAnJ31gLFxuICAgICAgICAgICAgLy8gVGhlIElOU1RBTExFRCB2ZXJzaW9uLCBub3QgdGhlIHBhY2thZ2UuanNvbiBzcGVjaWZpZXI6IGEgcmFuZ2UgbGlrZSBgXjEuNDUuMGBcbiAgICAgICAgICAgIC8vIHN0YXlzIHVuY2hhbmdlZCBhY3Jvc3MgbG9ja2ZpbGUgdXBkYXRlcywgc28ga2V5aW5nIHRoZSBjYWNoZSBvbiBpdCB3b3VsZCByZXN0b3JlXG4gICAgICAgICAgICAvLyBzdGFsZSBicm93c2VycyB0aGF0IG5vIGxvbmdlciBtYXRjaCB0aGUgbGlicmFyeS4gUnVucyBhZnRlciBgYnVuIGluc3RhbGxgLCBzbyB0aGVcbiAgICAgICAgICAgIC8vIHBhY2thZ2UgaXMgcmVzb2x2YWJsZSBmcm9tIHRoZSBkZWNsYXJpbmcgcGFja2FnZSdzIGRpcmVjdG9yeS5cbiAgICAgICAgICAgIGlkOiBgcGxheXdyaWdodC12ZXJzaW9uLSR7aW5kZXh9YCxcbiAgICAgICAgICAgIHJ1bjogJ2VjaG8gXCJ2ZXJzaW9uPSQoYnVuIC1lIFwidHJ5IHsgY29uc29sZS5sb2cocmVxdWlyZShcXCdAcGxheXdyaWdodC90ZXN0L3BhY2thZ2UuanNvblxcJykudmVyc2lvbikgfSBjYXRjaCB7fVwiKVwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIicsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnQ2FjaGUgUGxheXdyaWdodCBicm93c2VycycsXG4gICAgICAgICAgICBpZDogJ3BsYXl3cmlnaHQtY2FjaGUnLFxuICAgICAgICAgICAgdXNlczogY2FjaGVBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgIHBhdGg6ICd+Ly5jYWNoZS9tcy1wbGF5d3JpZ2h0JyxcbiAgICAgICAgICAgICAga2V5OiBgcGxheXdyaWdodC1cXCR7eyBydW5uZXIub3MgfX0tJHtwbGF5d3JpZ2h0RGlyUGF0aHNcbiAgICAgICAgICAgICAgICAubWFwKChfLCBpbmRleCkgPT4gYFxcJHt7IHN0ZXBzLnBsYXl3cmlnaHQtdmVyc2lvbi0ke2luZGV4fS5vdXRwdXRzLnZlcnNpb24gfX1gKVxuICAgICAgICAgICAgICAgIC5qb2luKCctJyl9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoKTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgaWY6IFwic3RlcHMucGxheXdyaWdodC1jYWNoZS5vdXRwdXRzLmNhY2hlLWhpdCAhPSAndHJ1ZSdcIixcbiAgICAgICAgICAgIHJ1bjogJ2J1biBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHMnLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIC8vIFRoZSBjYWNoZWQgYnJvd3NlcnMgc3RpbGwgbmVlZCB0aGVpciBzeXN0ZW0gZGVwZW5kZW5jaWVzIG9uIGEgZnJlc2ggcnVubmVyLlxuICAgICAgICAgICAgaWY6IFwic3RlcHMucGxheXdyaWdodC1jYWNoZS5vdXRwdXRzLmNhY2hlLWhpdCA9PSAndHJ1ZSdcIixcbiAgICAgICAgICAgIHJ1bjogJ2J1biBwbGF5d3JpZ2h0IGluc3RhbGwtZGVwcycsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXSBzYXRpc2ZpZXMgU3RlcFtdKVxuICAgICAgOiBbXSksXG4gICAgLi4uKGhhc1R5cGVjaGVjayA/IFt7IHJ1bjogJ2J1biBydW4gdHlwZWNoZWNrJywgLi4uZm5veEVudiB9XSA6IFtdKSxcbiAgICB7IHJ1bjogJ2J1biBydW4gbGludCcsIC4uLmZub3hFbnYgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVGVzdCcsXG4gICAgICBpZDogJ3Rlc3QnLFxuICAgICAgcnVuOiBgaWYgW1sgXCIkVVBMT0FEX1RFU1RfTE9HXCIgIT0gXCJ0cnVlXCIgXV07IHRoZW5cbiAgZXhlYyBidW4gcnVuIHRlc3QvY2lcbmZpXG5sb2dfZGlyPSQobWt0ZW1wIC1kIFwiJFJVTk5FUl9URU1QL3Rlc3Qtb3V0cHV0LlhYWFhYWFwiKVxuZWNobyBcImxvZ19wYXRoPSRsb2dfZGlyL3Rlc3QubG9nXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiXG4jIEtlZXAgZHJhaW5pbmcgdGVzdCBvdXRwdXQgd2hlbiB0aGUgbG9nIHJlYWNoZXMgYSBmaWxlLXNpemUgbGltaXQuXG5zZXQgK2VcbmJ1biBydW4gdGVzdC9jaSAyPiYxIHwgKHRyYXAgJycgWEZTWjsgdGVlIFwiJGxvZ19kaXIvdGVzdC5sb2dcIilcbnRlc3Rfc3RhdHVzPShcIlxcJHtQSVBFU1RBVFVTW0BdfVwiKVxuaWYgKCggdGVzdF9zdGF0dXNbMF0gIT0gMCApKTsgdGhlbiBleGl0IFwiXFwke3Rlc3Rfc3RhdHVzWzBdfVwiOyBmaVxuZXhpdCBcIlxcJHt0ZXN0X3N0YXR1c1sxXX1cImAsXG4gICAgICBlbnY6IHsgLi4uZm5veEVudi5lbnYsIFVQTE9BRF9URVNUX0xPRzogJyR7eyB2YXJzLlVQTE9BRF9URVNUX0xPRyB9fScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdVcGxvYWQgdGVzdCBsb2cnLFxuICAgICAgaWY6IFwiJHt7IGFsd2F5cygpICYmIHZhcnMuVVBMT0FEX1RFU1RfTE9HID09ICd0cnVlJyAmJiBzdGVwcy50ZXN0Lm91dHB1dHMubG9nX3BhdGggIT0gJycgfX1cIixcbiAgICAgIHVzZXM6IHVwbG9hZEFydGlmYWN0QWN0aW9uLFxuICAgICAgd2l0aDoge1xuICAgICAgICBuYW1lOiAndGVzdC1vdXRwdXQtJHt7IHJ1bm5lci5vcyB9fS0ke3sgam9iLmNoZWNrX3J1bl9pZCB9fS0ke3sgZ2l0aHViLnJ1bl9hdHRlbXB0IH19JyxcbiAgICAgICAgcGF0aDogJyR7eyBzdGVwcy50ZXN0Lm91dHB1dHMubG9nX3BhdGggfX0nLFxuICAgICAgICAncmV0ZW50aW9uLWRheXMnOiAxNCxcbiAgICAgICAgJ2lmLW5vLWZpbGVzLWZvdW5kJzogJ2Vycm9yJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAuLi4ocGxheXdyaWdodERpclBhdGhzLmxlbmd0aCA+IDBcbiAgICAgID8gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdVcGxvYWQgdGVzdCByZXN1bHRzJyxcbiAgICAgICAgICAgIGlmOiAnJHt7IGFsd2F5cygpIH19JyxcbiAgICAgICAgICAgIHVzZXM6IHVwbG9hZEFydGlmYWN0QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICBuYW1lOiAndGVzdC1yZXN1bHRzJyxcbiAgICAgICAgICAgICAgLy8gRXZlcnkgZGVjbGFyaW5nIHBhY2thZ2Ugd3JpdGVzIGl0cyBvd24gdGVzdC1yZXN1bHRzIGRpcmVjdG9yeTsgYSBuZXdsaW5lLXNlcGFyYXRlZFxuICAgICAgICAgICAgICAvLyBsaXN0IHVwbG9hZHMgdGhlbSBhbGwuXG4gICAgICAgICAgICAgIHBhdGg6IHBsYXl3cmlnaHREaXJQYXRoc1xuICAgICAgICAgICAgICAgIC5tYXAoKGRpclBhdGgpID0+IChkaXJQYXRoID8gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICd0ZXN0LXJlc3VsdHMnKSA6ICd0ZXN0LXJlc3VsdHMnKSlcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyksXG4gICAgICAgICAgICAgICdpZi1uby1maWxlcy1mb3VuZCc6ICdpZ25vcmUnLFxuICAgICAgICAgICAgICAncmV0ZW50aW9uLWRheXMnOiAxNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXVxuICAgICAgOiBbXSksXG4gIF07XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHsgYnJhbmNoZXM6IFsnbWFpbiddIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6ICdyZWFkJyB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIGVudjogeyBGT1JDRV9DT0xPUjogJzMnLCBXQl9FTlY6ICd0ZXN0JywgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHMsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGVwbG95V29ya2Zsb3coZW52aXJvbm1lbnQ6ICdzdGFnaW5nJyB8ICdwcm9kdWN0aW9uJywgc2NyaXB0TmFtZTogc3RyaW5nLCB1c2VzRm5veDogYm9vbGVhbik6IFdvcmtmbG93IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBgRGVwbG95IGFwcCBvbiAke2Vudmlyb25tZW50fWAsXG4gICAgb246IHtcbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgICAgLy8gUHJvZHVjdGlvbiBkZXBsb3lzIGZvbGxvdyBwdWJsaXNoZWQgcmVsZWFzZXMgKHNlZSB0aGUgcmVsZWFzZSB3b3JrZmxvdydzIHRyaWdnZXIgc3RlcCk7XG4gICAgICAvLyBzdGFnaW5nIGNvbnZlcmdlcyBvbiBldmVyeSBkZWZhdWx0LWJyYW5jaCBwdXNoLlxuICAgICAgLi4uKGVudmlyb25tZW50ID09PSAncHJvZHVjdGlvbidcbiAgICAgICAgPyB7IHJlbGVhc2U6IHsgdHlwZXM6IFsncHVibGlzaGVkJ10gfSB9XG4gICAgICAgIDogeyBwdXNoOiB7IGJyYW5jaGVzOiBbJ21haW4nXSwgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddIH0gfSksXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7IGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgICBqb2JzOiB7XG4gICAgICBkZXBsb3k6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIGVudjogeyBXQl9FTlY6IGVudmlyb25tZW50LCAuLi5ndWFyZEpvYkVudiB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIC8vIGZldGNoLWRlcHRoIDAgc28gYGdpdCBkZXNjcmliZWAgc2VlcyB0aGUgdGFncyBXQl9WRVJTSU9OIGlzIGRlcml2ZWQgZnJvbS5cbiAgICAgICAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uLCB3aXRoOiB7ICdmZXRjaC1kZXB0aCc6IDAgfSB9LFxuICAgICAgICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdTZXQgV0JfVkVSU0lPTicsXG4gICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbldCX1ZFUlNJT049JChnaXQgZGVzY3JpYmUgLS1hbHdheXMgLS10YWdzKVxcbmVjaG8gXCJXQl9WRVJTSU9OPSRXQl9WRVJTSU9OXCIgPj4gXCIkR0lUSFVCX0VOVlwiJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKGZhbHNlKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnRGVwbG95JyxcbiAgICAgICAgICAgIHVzZXM6IHJldHJ5QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICB0aW1lb3V0X21pbnV0ZXM6IDYwLFxuICAgICAgICAgICAgICBtYXhfYXR0ZW1wdHM6IDUsXG4gICAgICAgICAgICAgIGNvbW1hbmQ6IGBidW4gcnVuICR7c2NyaXB0TmFtZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFN0ZXAtc2NvcGVkIGxpa2UgdGhlIHRlc3Qgd29ya2Zsb3c6IGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdHMgcnVuIGJ5XG4gICAgICAgICAgICAvLyBgYnVuIGluc3RhbGxgIG11c3Qgbm90IGJlIGFibGUgdG8gcmVhZCB0aGUgbG9uZy1saXZlZCBhZ2UgaWRlbnRpdHkuXG4gICAgICAgICAgICAuLi4odXNlc0Zub3ggPyB7IGVudjogeyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gfSA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbGVhc2VXb3JrZmxvdyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3c6IGJvb2xlYW4sXG4gIHVzZXNGbm94OiBib29sZWFuXG4pOiBXb3JrZmxvdyB7XG4gIGNvbnN0IGZub3hFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB1c2VzRm5veCA/IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IDoge307XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7IGJyYW5jaGVzOiBbLi4uY29uZmlnLnJlbGVhc2UuYnJhbmNoZXNdIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgZGlzcGF0Y2hpbmcgdGhlIHByb2R1Y3Rpb24gZGVwbG95IHdvcmtmbG93IGFmdGVyIGEgcmVsZWFzZVxuICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdyA/IHsgYWN0aW9uczogJ3dyaXRlJyB9IDoge30pLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgLy8gUmVsZWFzZXMgYnVpbGQgcHJvZHVjdGlvbiBhcnRpZmFjdHMsIGhlbmNlIHRoZSBlbnZpcm9ubWVudCDigJQgdGhlIHNhbWUgZGVmYXVsdCBhcyB0aGVcbiAgICAgICAgLy8gcmV1c2FibGUgcmVsZWFzZSB3b3JrZmxvdy4gd2IncyBDSSBndWFyZCBhbHNvIHJlcXVpcmVzIGFuIGV4cG9ydGVkIFdCX0VOViwgc28gd2l0aG91dFxuICAgICAgICAvLyBpdCBhIGBwb3N0aW5zdGFsbGAgdGhhdCBjYWxscyB3YiAoZS5nLiBgd2IgZ2VuLWNvZGVgKSBleGl0cyAxIGJlZm9yZSBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICAgIC8vIHJ1bnMuXG4gICAgICAgIGVudjogeyBXQl9FTlY6ICdwcm9kdWN0aW9uJywgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICAvLyBmZXRjaC1kZXB0aCAwOiBzZW1hbnRpYy1yZWxlYXNlIHJlYWRzIHRoZSBmdWxsIGhpc3RvcnkgdG8gY29tcHV0ZSB0aGUgbmV4dCB2ZXJzaW9uLlxuICAgICAgICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24sIHdpdGg6IHsgJ2ZldGNoLWRlcHRoJzogMCB9IH0sXG4gICAgICAgICAgeyB1c2VzOiBtaXNlQWN0aW9uIH0sXG4gICAgICAgICAgLi4uYnVpbGRJbnN0YWxsU3RlcHMoZmFsc2UpLFxuICAgICAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3dcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdHZXQgY3VycmVudCBsYXRlc3QgdGFnJyxcbiAgICAgICAgICAgICAgICAgIGlkOiAncHJlLXJlbGVhc2UtdGFnJyxcbiAgICAgICAgICAgICAgICAgIHJ1bjogJ3NldCAtZXVvIHBpcGVmYWlsXFxuZWNobyBcInRhZz0kKGdpdCBkZXNjcmliZSAtLXRhZ3MgLS1hYmJyZXY9MCAyPi9kZXYvbnVsbCB8fCBlY2hvIFxcJ1xcJylcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCInLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICAgICAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UgY2hlY2tzIE5vZGUuanMgcnVudGltZSByZXF1aXJlbWVudHM7IGBidW4gPGJpbj5gIHJlc3BlY3RzIGl0c1xuICAgICAgICAgICAgLy8gYCMhL3Vzci9iaW4vZW52IG5vZGVgIHNoZWJhbmcsIHNvIGl0IHN0aWxsIHJ1bnMgdW5kZXIgcmVhbCBOb2RlLlxuICAgICAgICAgICAgcnVuOiAnYnVuIHNlbWFudGljLXJlbGVhc2UnLFxuICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICAgICAgICAgIExFRlRIT09LOiAnMCcsXG4gICAgICAgICAgICAgIC4uLmZub3hFbnYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvd1xuICAgICAgICAgICAgPyAoW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdDaGVjayBmb3IgbmV3IHJlbGVhc2UgdGFnJyxcbiAgICAgICAgICAgICAgICAgIGlkOiAncG9zdC1yZWxlYXNlLXRhZycsXG4gICAgICAgICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbmdpdCBmZXRjaCAtLXRhZ3MgLS1mb3JjZVxcbk5FV19UQUc9JChnaXQgZGVzY3JpYmUgLS10YWdzIC0tYWJicmV2PTAgMj4vZGV2L251bGwgfHwgZWNobyBcXCdcXCcpXFxuZWNobyBcInRhZz0kTkVXX1RBR1wiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxcbmlmIFtbIC1uIFwiJE5FV19UQUdcIiAmJiBcIiRORVdfVEFHXCIgIT0gXCIke3sgc3RlcHMucHJlLXJlbGVhc2UtdGFnLm91dHB1dHMudGFnIH19XCIgXV07IHRoZW5cXG4gIGVjaG8gXCJjcmVhdGVkPXRydWVcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCJcXG5maScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZjogXCJzdGVwcy5wb3N0LXJlbGVhc2UtdGFnLm91dHB1dHMuY3JlYXRlZCA9PSAndHJ1ZSdcIixcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdUcmlnZ2VyIHByb2R1Y3Rpb24gZGVwbG95JyxcbiAgICAgICAgICAgICAgICAgIC8vIEEgR0lUSFVCX1RPS0VOLWNyZWF0ZWQgcmVsZWFzZSBkb2VzIG5vdCBmaXJlIHRoZSBkZXBsb3kgd29ya2Zsb3cnc1xuICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZS1wdWJsaXNoZWQgdHJpZ2dlciwgc28gZGlzcGF0Y2ggaXQgZXhwbGljaXRseSBvbiB0aGUgbmV3IHRhZy5cbiAgICAgICAgICAgICAgICAgIHJ1bjogJ2doIHdvcmtmbG93IHJ1biBkZXBsb3ktcHJvZHVjdGlvbi55bWwgLS1yZWYgXCIke3sgc3RlcHMucG9zdC1yZWxlYXNlLXRhZy5vdXRwdXRzLnRhZyB9fVwiJyxcbiAgICAgICAgICAgICAgICAgIGVudjogeyBHSF9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdIHNhdGlzZmllcyBTdGVwW10pXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgaW5zdGFsbCBzZXF1ZW5jZSBldmVyeSBnZW5lcmF0ZWQgd29ya2Zsb3cgc2hhcmVzOiBgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGVgLCBoYXJkZW5lZCBpbnRvIHRoZVxuICogcmV1c2FibGUgd29ya2Zsb3dzJyB0aHJlZS1zdGVwIGRhbmNlIHdoZW4gdGhlIHJlcG9zaXRvcnkgcmVnaXN0ZXJzIGEgVEFLVU1JX0dVQVJEX1RPS0VOIHNlY3JldC5cbiAqXG4gKiBUYWt1bWkgR3VhcmQgKGh0dHBzOi8vZmxhdHQudGVjaC90YWt1bWkvZmVhdHVyZXMvZ3VhcmQpIGlzIGEgcmVnaXN0cnkgcHJveHkgdGhhdCBibG9ja3NcbiAqIGtub3duLW1hbGljaW91cyBwYWNrYWdlcy4gUm91dGluZyB0aGUgREVGQVVMVCByZWdpc3RyeSB0aHJvdWdoIGl0IGlzIHdoYXQgcHJvdGVjdHMgdGhlIGluc3RhbGwsXG4gKiBhbmQgdGhlIHRva2VuIGF1dGhlbnRpY2F0ZXMgdGhhdCBwcm94eSDigJQgc28gdGhlIHRva2VuIGhhcyB0byBiZSBwcmVzZW50IHdoaWxlIGRlcGVuZGVuY2llcyBhcmVcbiAqIHJlc29sdmVkLCB3aGljaCBpcyBleGFjdGx5IHdoZW4gYSBjb21wcm9taXNlZCBkZXBlbmRlbmN5J3MgbGlmZWN5Y2xlIHNjcmlwdCB3b3VsZCBydW4uIEhlbmNlIHRoZVxuICogc3BsaXQ6IHJlc29sdmUgYW5kIGRvd25sb2FkIHdpdGggYC0taWdub3JlLXNjcmlwdHNgIGFuZCB0aGUgdG9rZW4sIHRoZW4gcmVwbGF5IHRoZSBza2lwcGVkXG4gKiBsaWZlY3ljbGUgc2NyaXB0cyBpbiBhIHNlY29uZCBpbnN0YWxsIHRoYXQgaGFzIG5vIHRva2VuIChldmVyeSBwYWNrYWdlIGlzIGFscmVhZHkgY2FjaGVkLCBhbmRcbiAqIEd1YXJkIHNlcnZlcyBhbm9ueW1vdXNseSBhbnl3YXkpLiBPbmx5IGJ1biBpcyBnZW5lcmF0ZWQgaGVyZSwgYW5kIGJ1biByZWFkcyAubnBtcmMsIHNvIG5vXG4gKiBwYWNrYWdlLW1hbmFnZXIgYnJhbmNoaW5nIGlzIG5lZWRlZC5cbiAqXG4gKiBUaGUgc2hlbGwgZGV0YWlscyBkZWxpYmVyYXRlbHkgbWlycm9yIHJldXNhYmxlLXdvcmtmbG93cycgcHJvZHVjdGlvbi1wcm92ZW4gaW5zdGFsbCBzdGVwczogYmFyZVxuICogYCRSVU5ORVJfVEVNUGAgKHNldCBieSB0aGUgcnVubmVyIGFwcGxpY2F0aW9uIG9uIGV2ZXJ5IHJ1bm5lciwgYW5kIGBzZXQgLXVgIGZhaWxzIGxvdWRseSBpZiBub3QpLFxuICogYFtbIC1lIC5ucG1yYyBdXWAsIGFuZCB0aGUgc2Vjb25kIGBybSAtcmYgbm9kZV9tb2R1bGVzYCBpbiB0aGUgZmFsbGJhY2sgKGFuIGludGVycnVwdGVkIGxpZmVjeWNsZVxuICogcnVuIG1heSBsZWF2ZSBub2RlX21vZHVsZXMgaW5jb25zaXN0ZW50LCBzbyB0aGUgcmV0cnkgc3RhcnRzIGNsZWFuIHJhdGhlciB0aGFuIHRydXN0aW5nIGEgcmVwYWlyKS5cbiAqXG4gKiBgdG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlYCBkZWNpZGVzIHdoYXQgYSBmYWlsaW5nIGxpZmVjeWNsZS1zY3JpcHQgcmVwbGF5IGRvZXMuIEV2ZXJ5XG4gKiByZXBsYXkgcnVucyB0b2tlbmxlc3MgYW5kIHdpdGhvdXQgRk5PWF9BR0VfS0VZICh0aGUga2V5IGlzIHNjb3BlZCB0byB0aGUgbGF0ZXIgRGVwbG95L1JlbGVhc2VcbiAqIHN0ZXApLCBzbyBhIHBvc3RpbnN0YWxsIHRoYXQgbmVlZHMgZGVjcnlwdGVkIHNlY3JldHMgaXMgdW5zdXBwb3J0ZWQgaW4gYWxsIG9mIHRoZW0gYnkgZGVzaWduLlxuICogVGhlIHRlc3Qgd29ya2Zsb3cgdG9sZXJhdGVzIHRoZSBmYWlsdXJlIGJlY2F1c2UgdHlwZWNoZWNrL2xpbnQvdGVzdCBmYWlsIGxvdWRseSBvbiBhIGRlZ3JhZGVkXG4gKiB0cmVlIGFueXdheS4gRGVwbG95IGFuZCByZWxlYXNlIHdvcmtmbG93cyBtdXN0IG5vdDogYSBgOjp3YXJuaW5nOjpgIGRvZXMgbm90IGZhaWwgdGhlIGpvYiwgc29cbiAqIHRoZSBmYWxsYmFjayB3b3VsZCBzaGlwIGEgdHJlZSB3aG9zZSBsaWZlY3ljbGUgc2NyaXB0cyAoZS5nLiBhIGBwb3N0aW5zdGFsbDogd2IgZ2VuLWNvZGVgKVxuICogbmV2ZXIgcmFuLCBzaWxlbnRseSBkZXBsb3lpbmcgZGVncmFkZWQgb3V0cHV0ICgjMTEyNykuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW5zdGFsbFN0ZXBzKHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZTogYm9vbGVhbik6IFN0ZXBbXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ0dlbmVyYXRlIC5ucG1yYyBmb3IgVGFrdW1pIEd1YXJkJyxcbiAgICAgIC8vIFRoZSB0b2tlbiBpcyB3cml0dGVuIGFzIGEgbGl0ZXJhbCBgJHtUQUtVTUlfR1VBUkRfVE9LRU59YCByZWZlcmVuY2UgdGhhdCBidW4gZXhwYW5kcyBhdFxuICAgICAgLy8gaW5zdGFsbCB0aW1lLCBzbyB0aGUgc2VjcmV0IGl0c2VsZiBuZXZlciBsYW5kcyBpbiBhIGZpbGUuIFRoZSBtYW5hZ2VkIGxpbmVzIGFyZSBzdHJpcHBlZFxuICAgICAgLy8gZnJvbSBhbiBleGlzdGluZyAubnBtcmMgZmlyc3Q6IGEgcmVwb3NpdG9yeSBvdXRzaWRlIHRoZSBvcmdhbml6YXRpb25zIG1heSBsZWdpdGltYXRlbHlcbiAgICAgIC8vIGNvbW1pdCBvbmUgKHNjb3BlIG1hcHBpbmdzIGZvciBhbm90aGVyIHJlZ2lzdHJ5KSwgYW5kIGRyb3BwaW5nIG9ubHkgdGhlc2UgdHdvIGxpbmVzIGtlZXBzXG4gICAgICAvLyB0aGUgcmVzdCBvZiBpdCBpbiBlZmZlY3QuIFJlcGxhY2luZyB0aGUgZmlsZSB3aXRoIGBtdmAgcmF0aGVyIHRoYW4gYXBwZW5kaW5nIGluIHBsYWNlIHN0b3BzXG4gICAgICAvLyBhIGNvbW1pdHRlZCBzeW1saW5rIGZyb20gcmVkaXJlY3RpbmcgdGhlIHdyaXRlIGludG8sIHNheSwgYSBwZXJzaXN0ZW50IGhvbWUgbnBtcmMuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuTlBNUkM9XCIkKG1rdGVtcCBcIiRSVU5ORVJfVEVNUC9ucG1yYy5YWFhYWFhcIilcIlxuaWYgW1sgLWUgLm5wbXJjIF1dOyB0aGVuXG4gIGdyZXAgLXZFICdecmVnaXN0cnk9fF4vL25wbVxcXFwuZmxhdHRcXFxcLnRlY2gvOl9hdXRoVG9rZW4nIC5ucG1yYyA+IFwiJE5QTVJDXCIgfHwgdHJ1ZVxuZmlcbmVjaG8gJ3JlZ2lzdHJ5PWh0dHBzOi8vbnBtLmZsYXR0LnRlY2gvJyA+PiBcIiROUE1SQ1wiXG5lY2hvICcvL25wbS5mbGF0dC50ZWNoLzpfYXV0aFRva2VuPVxcJHtUQUtVTUlfR1VBUkRfVE9LRU59JyA+PiBcIiROUE1SQ1wiXG5ybSAtZiAubnBtcmNcbm12IFwiJE5QTVJDXCIgLm5wbXJjYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgICAvLyAtLWZyb3plbi1sb2NrZmlsZTogYSBwbGFpbiBgYnVuIGluc3RhbGxgIHNpbGVudGx5IHJlcGFpcnMgYSBidW4ubG9jayB0aGF0IGlzIHN0YWxlIGFnYWluc3RcbiAgICAgIC8vIHBhY2thZ2UuanNvbiwgc28gQ0kgd291bGQgcnVuIGRlcGVuZGVuY3kgcmVzb2x1dGlvbnMgdGhhdCB3ZXJlIG5ldmVyIHJldmlld2VkICgjMTEyNikuXG4gICAgICAvLyBXaXRoIE5PIGJ1bi5sb2NrIGF0IGFsbCwgLS1mcm96ZW4tbG9ja2ZpbGUgc2lsZW50bHkgaW5zdGFsbHMgZnJlc2gsIHVucGlubmVkIHJlc29sdXRpb25zXG4gICAgICAvLyAoQnVuIDEuMy4xNCBleGl0cyAwIGFuZCB3cml0ZXMgbm8gbG9ja2ZpbGUpLCBzbyBhIG1pc3NpbmcgbG9ja2ZpbGUgbXVzdCBmYWlsIGV4cGxpY2l0bHkuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuaWYgW1sgISAtZSBidW4ubG9jayBdXTsgdGhlblxuICBlY2hvIFwiOjplcnJvcjo6YnVuLmxvY2sgaXMgbWlzc2luZzsgY29tbWl0IGl0IHNvIENJIGluc3RhbGxzIHN0YXkgcmVwcm9kdWNpYmxlXCJcbiAgZXhpdCAxXG5maVxuaWYgW1sgXCIkSEFTX1RBS1VNSV9HVUFSRF9UT0tFTlwiID09IFwidHJ1ZVwiIF1dOyB0aGVuXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlIC0taWdub3JlLXNjcmlwdHNcbmVsc2VcbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGVcbmZpYCxcbiAgICAgIC8vIFN0ZXAtc2NvcGVkOiBhIGpvYi1sZXZlbCB0b2tlbiB3b3VsZCBiZSByZWFkYWJsZSBieSBldmVyeSBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHQgdGhlXG4gICAgICAvLyB0b2tlbmxlc3MgcmVwbGF5IGJlbG93IHJ1bnMuXG4gICAgICBlbnY6IHsgVEFLVU1JX0dVQVJEX1RPS0VOOiAnJHt7IHNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ1J1biBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHdpdGhvdXQgcmVnaXN0cnkgY3JlZGVudGlhbHMnLFxuICAgICAgLy8gQSByZXBlYXRlZCBgYnVuIGluc3RhbGxgIGlzIGEgbm8tb3AgdGhhdCByZXBsYXlzIG5vdGhpbmcsIHNvIG5vZGVfbW9kdWxlcyBoYXMgdG8gZ28gZmlyc3QuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxucm0gLXJmIG5vZGVfbW9kdWxlc1xuYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUke1xuICAgICAgICB0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmVcbiAgICAgICAgICA/IGAgfHwge1xuICBlY2hvIFwiOjp3YXJuaW5nOjpMaWZlY3ljbGUgc2NyaXB0cyBmYWlsZWQ7IGNvbXBsZXRpbmcgdGhlIGluc3RhbGwgd2l0aG91dCB0aGVtXCJcbiAgcm0gLXJmIG5vZGVfbW9kdWxlc1xuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSAtLWlnbm9yZS1zY3JpcHRzXG59YFxuICAgICAgICAgIDogJydcbiAgICAgIH1gLFxuICAgIH0sXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ1JlbW92ZSB0aGUgZ2VuZXJhdGVkIC5ucG1yYycsXG4gICAgICAvLyBOb3RoaW5nIGFmdGVyIHRoZSBpbnN0YWxsIG5lZWRzIHRoZSBwcm94eSwgYW5kIGxlYXZpbmcgaXQgaW4gcGxhY2Ugd291bGQgYnJlYWsgdGhlIG9uZVxuICAgICAgLy8gdGhpbmcgR3VhcmQgcmVmdXNlcyB0byBzZXJ2ZTogaXQgYW5zd2VycyBgbnBtIHB1Ymxpc2hgIHdpdGggNDA1LCBzbyBhIHJlbGVhc2Ugd29ya2Zsb3dcbiAgICAgIC8vIHdob3NlIHBhY2thZ2UgbGFja3MgYW4gZXhwbGljaXQgcHVibGlzaENvbmZpZy5yZWdpc3RyeSB3b3VsZCBmYWlsIHRvIHB1Ymxpc2guXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuaWYgZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCAtLSAubnBtcmMgPiAvZGV2L251bGwgMj4mMTsgdGhlblxuICBnaXQgY2hlY2tvdXQgLS0gLm5wbXJjXG5lbHNlXG4gIHJtIC1mIC5ucG1yY1xuZmlgLFxuICAgIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2VtYW50aWNQcldvcmtmbG93KCk6IFdvcmtmbG93IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHsgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICAvLyBUaGUgYWN0aW9uIHJlYWRzIHRoZSBwdWxsIHJlcXVlc3QsIGFuZCBpdHMgYHdpcGAgc3VwcG9ydCBwb3N0cyBhIGNvbW1pdCBzdGF0dXM7IG5laXRoZXJcbiAgICAgICAgLy8gcGVybWlzc2lvbiBpcyBncmFudGVkIHdoZW4gdGhlIHJlcG9zaXRvcnkgcmVzdHJpY3RzIGRlZmF1bHQgd29ya2Zsb3cgcGVybWlzc2lvbnMuXG4gICAgICAgIHBlcm1pc3Npb25zOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLCBzdGF0dXNlczogJ3dyaXRlJyB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVzZXM6IHNlbWFudGljUHVsbFJlcXVlc3RBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7IHdpcDogdHJ1ZSB9LFxuICAgICAgICAgICAgZW52OiB7IEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW50ZXJmYWNlIE1pc2VUb21sIHtcbiAgdG9vbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLy8gVGhlIG9sZGVzdCBCdW4gcnVudGltZSB3YmZ5IHN1cHBvcnRzLlxuZXhwb3J0IGNvbnN0IG1pbmltdW1CdW5WZXJzaW9uID0gJzEuNC4wJztcblxuLyoqXG4gKiBQaW5zIE5vZGUuanMgYW5kIHRoZSBsYXRlc3QgQnVuIGFuZCAod2hlbiBmbm94LnRvbWwgZXhpc3RzKSBmbm94IHZlcnNpb25zIHdoaWxlIHByZXNlcnZpbmdcbiAqIHVucmVsYXRlZCBtaXNlIHNldHRpbmdzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVNaXNlVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU1pc2VUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1pc2VUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ21pc2UudG9tbCcpO1xuICAgIC8vIEEgcGFyc2UgZmFpbHVyZSBtdXN0IGFib3J0IGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvIHt9OiByZWdlbmVyYXRpbmcgZnJvbSBhbiBlbXB0eSBvYmplY3RcbiAgICAvLyB3b3VsZCBzaWxlbnRseSByZXBsYWNlIHRoZSB1c2VyJ3MgZXhpc3RpbmcgKGFsYmVpdCBicm9rZW4pIG1pc2UudG9tbC5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHBhcnNlTWlzZVRvbWwobWlzZVRvbWxQYXRoKTtcbiAgICBjb25zdCB0b29scyA9IHsgLi4uc2V0dGluZ3MudG9vbHMgfTtcblxuICAgIC8vIEVuc3VyZSBOb2RlLmpzIGlzIGFsd2F5cyBwaW5uZWQ6IGdlbmVyYXRlZCBob29rcyBhbmQgQ0kgcnVuIGBtaXNlIGluc3RhbGxgLCBhbmQgYW4gdW5waW5uZWRcbiAgICAvLyBOb2RlIHdvdWxkIGNvbWUgZnJvbSB3aGF0ZXZlciBoYXBwZW5zIHRvIGJlIG9uIFBBVEguXG4gICAgLy8gTGlmdC10aGVuLXBpbjogdGhlIGxpZnQgb25seSB0b3VjaGVzIGV4YWN0IHBpbnMgYW5kIHRoZSBwaW4gb25seSB0b3VjaGVzIHNlbGVjdG9ycywgc29cbiAgICAvLyBvcmRlcmluZyB0aGUgbGlmdCBmaXJzdCBhdm9pZHMgcmVzb2x2aW5nIGBtaXNlIGxhdGVzdCBub2RlQGx0c2AgdHdpY2UgZm9yIHVucGlubmVkIHJlcG9zLlxuICAgIHRvb2xzLm5vZGUgPSBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKFxuICAgICAgJ25vZGUnLFxuICAgICAgbGlmdE91dGRhdGVkVG9vbFZlcnNpb25XaXRoaW5NYWpvcignbm9kZUBsdHMnLCB0b29scy5ub2RlLCBjb25maWcuZGlyUGF0aCksXG4gICAgICBjb25maWcuZGlyUGF0aFxuICAgICk7XG4gICAgdG9vbHMuYnVuID0gcGluTGF0ZXN0VG9vbFZlcnNpb24oJ2J1bicsIHRvb2xzLmJ1biwgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKSkge1xuICAgICAgdG9vbHMuZm5veCA9IHBpbkxhdGVzdFRvb2xWZXJzaW9uKCdmbm94JywgdG9vbHMuZm5veCwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgICBzZXR0aW5ncy50b29scyA9IHRvb2xzO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBCdW4gMS40IHByb3ZpZGVzIFRPTUwuc3RyaW5naWZ5IGJlZm9yZSB0aGUgYWdlLWdhdGVkIEB0eXBlcy9idW4gdmVyc2lvbiBkZWNsYXJlcyBpdC5cbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKG1pc2VUb21sUGF0aCwgQnVuLlRPTUwuc3RyaW5naWZ5KHNldHRpbmdzKSk7XG4gIH0pO1xufVxuXG4vKiogVXBkYXRlcyB0byB0aGUgbGF0ZXN0IHJlbGVhc2UgYWNyb3NzIG1ham9yIHZlcnNpb25zIHdpdGhvdXQgZG93bmdyYWRpbmcgZXhpc3RpbmcgZXhhY3QgcGlucy4gKi9cbmZ1bmN0aW9uIHBpbkxhdGVzdFRvb2xWZXJzaW9uKHRvb2w6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgLy8gUmVzb2x2ZSBpbmRlcGVuZGVudGx5IG9mIHRoZSB0YXJnZXQncyB0cnVzdCBzdGF0ZSBhbmQgdG9vbCBhbGlhc2VzLlxuICBjb25zdCByZXNvbHZlZFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ21pc2UnLCBbJy0tbm8tY29uZmlnJywgJ2xhdGVzdCcsIHRvb2xdLCBjd2QpO1xuICBpZiAoIXNlbXZlci52YWxpZChyZXNvbHZlZFZlcnNpb24pKSByZXR1cm4gdmVyc2lvbiA/PyAnbGF0ZXN0JztcbiAgLy8gQSBjYWNoZWQgcmVsZWFzZSBsaXN0aW5nIGNhbiBsYWcgYmVoaW5kIGFub3RoZXIgbWFjaGluZSB0aGF0IGFscmVhZHkgdXBkYXRlZCB0aGUgcGluLlxuICByZXR1cm4gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnICYmIHNlbXZlci52YWxpZCh2ZXJzaW9uKSAmJiBzZW12ZXIuZ3QodmVyc2lvbiwgcmVzb2x2ZWRWZXJzaW9uKVxuICAgID8gdmVyc2lvblxuICAgIDogcmVzb2x2ZWRWZXJzaW9uO1xufVxuXG4vKipcbiAqIExpZnRzIGFuIGV4YWN0IHRvb2wgcGluIGJlbG93IHRoZSBsYXRlc3QgcmVzb2x2YWJsZSB2ZXJzaW9uIOKAlCB3aXRoaW4gdGhlIFNBTUUgbWFqb3Ig4oCUIHRvIHRoYXRcbiAqIHZlcnNpb24gKE5vZGUuanMgcmVzb2x2ZXMgYWdhaW5zdCB0aGUgbGF0ZXN0IExUUyk6IHRoZSByZXBvc2l0b3J5LXN0cnVjdHVyZSBzdGFuZGFyZCB0cmFja3MgdGhlXG4gKiBjdXJyZW50IHRvb2xjaGFpbiBhY3Jvc3MgcmVwb3NpdG9yaWVzIGFuZCBSZW5vdmF0ZSBkb2VzIG5vdCBtYW5hZ2UgbWlzZS50b21sIHBpbnMsIHNvXG4gKiBwYXRjaC9taW5vciBkcmlmdCAoZS5nLiBub2RlIDI0LjE2LjAgdnMgMjQuMTguMCkgbmV2ZXIgc2VsZi1oZWFscy4gQSBwaW5cbiAqIG9uIGFuIG9sZGVyIG1ham9yIGlzIGEgZGVsaWJlcmF0ZSBjb21wYXRpYmlsaXR5IGNob2ljZSBhbmQgaXMga2VwdCwgYXMgYXJlIG5vbi1leGFjdCBhbmRcbiAqIG5vbi1zdHJpbmcgZm9ybXMuIFdoZW4gbWlzZSBjYW5ub3QgcmVzb2x2ZSB0aGUgc2VsZWN0b3IgKGUuZy4gb2ZmbGluZSksIHRoZSBwaW4gaXMga2VwdC5cbiAqL1xuZnVuY3Rpb24gbGlmdE91dGRhdGVkVG9vbFZlcnNpb25XaXRoaW5NYWpvcihzZWxlY3Rvcjogc3RyaW5nLCB2ZXJzaW9uOiB1bmtub3duLCBjd2Q6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnIHx8ICFzZW12ZXIudmFsaWQodmVyc2lvbikpIHJldHVybiB2ZXJzaW9uO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQobGF0ZXN0VmVyc2lvbikgJiZcbiAgICBzZW12ZXIubWFqb3IobGF0ZXN0VmVyc2lvbikgPT09IHNlbXZlci5tYWpvcih2ZXJzaW9uKSAmJlxuICAgIHNlbXZlci5sdCh2ZXJzaW9uLCBsYXRlc3RWZXJzaW9uKVxuICAgID8gbGF0ZXN0VmVyc2lvblxuICAgIDogdmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyBhbiB1bnBpbm5lZCBzZWxlY3RvciAoYGxhdGVzdGAsIGEgcmFuZ2Ugc3VjaCBhcyBcIjI0XCIsIGFuIGFsaWFzLCBvciBhIG1pc3NpbmcgZW50cnkpXG4gKiB3aXRoIHRoZSBuZXdlc3QgY29uY3JldGUgdmVyc2lvbiBtaXNlIHJlc29sdmVzIGZvciBpdCwgYmVjYXVzZSB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmVcbiAqIHN0YW5kYXJkIHJlcXVpcmVzIGNvbmNyZXRlIHBpbnM6IENJIGluc3RhbGxzIHdoYXRldmVyIGFuIHVucGlubmVkIHNlbGVjdG9yIHJlc29sdmVzIHRvIGF0IHJ1blxuICogdGltZSwgc28gYnVpbGRzIGRyaWZ0IGFjcm9zcyBydW5zLiBFeGFjdCB2ZXJzaW9ucyBhcmUga2VwdCBhcy1pcywgYW5kIG5vbi1zdHJpbmcgZm9ybXMgKG1pc2Unc1xuICogYXJyYXkgYW5kIGB7IHZlcnNpb24gPSBcIuKAplwiIH1gIGZvcm1zKSBhcmUgdXNlci1tYW5hZ2VkIGFuZCBsZWZ0IHVudG91Y2hlZC4gV2hlbiBtaXNlIGlzXG4gKiB1bmF2YWlsYWJsZSBvciBjYW5ub3QgcmVzb2x2ZSB0aGUgc2VsZWN0b3IgKGUuZy4gb2ZmbGluZSksIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBpcyBrZXB0IOKAlFxuICogYW4gdW5waW5uZWQgdG9vbCBpcyBiZXR0ZXIgdGhhbiBhIGJyb2tlbiBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKHRvb2w6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnIHx8IHNlbXZlci52YWxpZCh2ZXJzaW9uKSkpIHJldHVybiB2ZXJzaW9uO1xuICAvLyBOb3JtYWxpemUgc2VsZWN0b3IgZm9ybXMgYG1pc2UgbGF0ZXN0YCBjYW5ub3QgcmVzb2x2ZSBldmVuIHRob3VnaCBtaXNlIGNvbmZpZ3VyYXRpb24gYWNjZXB0c1xuICAvLyB0aGVtOiBgcHJlZml4OjI0YCBpcyByZWplY3RlZCBvdXRyaWdodCB3aGlsZSBgMjRgIHJlc29sdmVzLCBhbmQgYGx0cy8qYCB5aWVsZHMgZW1wdHkgb3V0cHV0XG4gIC8vIHdoaWxlIGBsdHNgIHJlc29sdmVzLiBNb2RpZmllciBzZWxlY3RvcnMgc3VjaCBhcyBgc3ViLTI6bHRzYCBzdGF5IHVucmVzb2x2YWJsZSBhbmQgZmFsbCBiYWNrXG4gIC8vIHRvIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBiZWxvdy5cbiAgY29uc3QgcmFuZ2UgPSB0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycgPyB2ZXJzaW9uLnJlcGxhY2UoL15wcmVmaXg6L3UsICcnKS5yZXBsYWNlKC9cXC9cXCokL3UsICcnKSA6IHVuZGVmaW5lZDtcbiAgLy8gV2l0aCBubyBtZWFuaW5nZnVsIHNlbGVjdG9yLCBOb2RlLmpzIHBpbnMgdG8gdGhlIGxhdGVzdCBMVFMgKG1hdGNoaW5nIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MnXG4gIC8vIGBsdHMvKmAgZmFsbGJhY2spIHJhdGhlciB0aGFuIHRoZSBuZXdlc3QgcmVsZWFzZS5cbiAgY29uc3QgZGVmYXVsdFNlbGVjdG9yID0gdG9vbCA9PT0gJ25vZGUnID8gJ25vZGVAbHRzJyA6IHRvb2w7XG4gIGNvbnN0IHNlbGVjdG9yID0gcmFuZ2UgJiYgcmFuZ2UgIT09ICdsYXRlc3QnID8gYCR7dG9vbH1AJHtyYW5nZX1gIDogZGVmYXVsdFNlbGVjdG9yO1xuICBjb25zdCByZXNvbHZlZFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ21pc2UnLCBbJ2xhdGVzdCcsIHNlbGVjdG9yXSwgY3dkKTtcbiAgcmV0dXJuIHNlbXZlci52YWxpZChyZXNvbHZlZFZlcnNpb24pID8gcmVzb2x2ZWRWZXJzaW9uIDogKHZlcnNpb24gPz8gJ2xhdGVzdCcpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1pc2VUb21sKG1pc2VUb21sUGF0aDogc3RyaW5nKTogTWlzZVRvbWwge1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMobWlzZVRvbWxQYXRoLCAndXRmOCcpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIE9ubHkgYSByZXBvc2l0b3J5IHdpdGhvdXQgbWlzZS50b21sIHN0YXJ0cyBmcm9tIGFuIGVtcHR5IGNvbmZpZ3VyYXRpb247IGFuIHVucmVhZGFibGUgZmlsZVxuICAgIC8vIChlLmcuIHBlcm1pc3Npb25zKSBtdXN0IGFib3J0IGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCBnZW5lcmF0ZWQgc2V0dGluZ3MuXG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4ge307XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgcmV0dXJuIEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIE1pc2VUb21sO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJpdmF0ZVJlZ2lzdHJ5U2NvcGVNYXBwaW5nLCByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuLi91dGlscy9wcml2YXRlUGFja2FnZXMuanMnO1xuXG4vKipcbiAqIEJ1biByZWFkcyByZWdpc3RyeSBzY29wZSBtYXBwaW5ncyBmcm9tIGEgcGh5c2ljYWwgcmVwb3NpdG9yeSAubnBtcmMgZHVyaW5nIFJlbm92YXRlIGFydGlmYWN0XG4gKiB1cGRhdGVzOyBSZW5vdmF0ZSdzIG5wbXJjIHNldHRpbmcgaXMgdXNlZCBvbmx5IGJ5IGl0cyBkYXRhc291cmNlIGxheWVyLiBLZWVwIHRoZSBub24tc2VjcmV0XG4gKiBtYXBwaW5nIGluIHJlcG9zaXRvcmllcyB0aGF0IHJlc29sdmUgcHJpdmF0ZSBwYWNrYWdlcywgd2hpbGUgYXV0aGVudGljYXRpb24gcmVtYWlucyBpbiB0aGVcbiAqIGRldmVsb3BlcidzIH4vLm5wbXJjIGxvY2FsbHkgYW5kIGluIHRlbXBvcmFyeSBDSSBvciBNZW5kIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb0F1dGhvciA9IGNvbmZpZ3NbMF0/LnJlcG9BdXRob3I7XG4gIGlmIChyZXBvQXV0aG9yICE9PSAnV2lsbEJvb3N0ZXInICYmIHJlcG9BdXRob3IgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICBjb25zdCBucG1yY1BhdGhzID0gbmV3IFNldChjb25maWdzLm1hcCgoY29uZmlnKSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubnBtcmMnKSkpO1xuICBjb25zdCByb290Q29uZmlnID0gY29uZmlncy5maW5kKChjb25maWcpID0+IGNvbmZpZy5pc1Jvb3QpO1xuICBpZiAocm9vdENvbmZpZyAmJiByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMocm9vdENvbmZpZykpIHtcbiAgICBjb25zdCByb290TnBtcmNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5ucG1yYycpO1xuICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUocm9vdE5wbXJjUGF0aCwgcHJpdmF0ZVJlZ2lzdHJ5U2NvcGVNYXBwaW5nKTtcbiAgICBucG1yY1BhdGhzLmRlbGV0ZShyb290TnBtcmNQYXRoKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgbnBtcmNQYXRoIG9mIG5wbXJjUGF0aHMpIGF3YWl0IHJlbW92ZU5wbXJjKG5wbXJjUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZU5wbXJjKG5wbXJjUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KG5wbXJjUGF0aCkuY2F0Y2goKCkgPT4ge30pKSkgcmV0dXJuO1xuICBpZiAoYXdhaXQgZnNVdGlsLnJlbW92ZUNvbmZpbmVkKG5wbXJjUGF0aCkpIHtcbiAgICBjb25zb2xlLmluZm8oYFJlbW92ZWQgbm9uLWNhbm9uaWNhbCByZXBvc2l0b3J5IG5wbXJjICR7bnBtcmNQYXRofS5gKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGhhc0dpdEh1YlRva2VuLCBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvciB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5pbnRlcmZhY2UgUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0YXJnZXQ6ICdicmFuY2gnO1xuICBlbmZvcmNlbWVudDogJ2FjdGl2ZSc7XG4gIGNvbmRpdGlvbnM6IHtcbiAgICByZWZfbmFtZToge1xuICAgICAgaW5jbHVkZTogc3RyaW5nW107XG4gICAgICBleGNsdWRlOiBzdHJpbmdbXTtcbiAgICB9O1xuICB9O1xuICBydWxlczogKFxuICAgIHwge1xuICAgICAgICB0eXBlOiAnZGVsZXRpb24nIHwgJ25vbl9mYXN0X2ZvcndhcmQnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcyc7XG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGJvb2xlYW47XG4gICAgICAgICAgZG9fbm90X2VuZm9yY2Vfb25fY3JlYXRlOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IHtcbiAgICAgICAgICAgIGNvbnRleHQ6IHN0cmluZztcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBudW1iZXI7XG4gICAgICAgICAgfVtdO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAncHVsbF9yZXF1ZXN0JztcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHJlcXVpcmVkX2FwcHJvdmluZ19yZXZpZXdfY291bnQ6IG51bWJlcjtcbiAgICAgICAgICBkaXNtaXNzX3N0YWxlX3Jldmlld3Nfb25fcHVzaDogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9yZXZpZXdlcnM6IFtdO1xuICAgICAgICAgIHJlcXVpcmVfY29kZV9vd25lcl9yZXZpZXc6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZV9sYXN0X3B1c2hfYXBwcm92YWw6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfcmV2aWV3X3RocmVhZF9yZXNvbHV0aW9uOiBib29sZWFuO1xuICAgICAgICAgIGFsbG93ZWRfbWVyZ2VfbWV0aG9kczogWydzcXVhc2gnXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgKVtdO1xuICBieXBhc3NfYWN0b3JzOiB7XG4gICAgYWN0b3JfaWQ6IG51bWJlcjtcbiAgICBhY3Rvcl90eXBlOiAnVGVhbSc7XG4gICAgYnlwYXNzX21vZGU6ICdwdWxsX3JlcXVlc3QnO1xuICB9W107XG59XG5cbmludGVyZmFjZSBSZXBvc2l0b3J5UnVsZXNldFN1bW1hcnkge1xuICBpZD86IG51bWJlcjtcbiAgbmFtZT86IHN0cmluZztcbiAgc291cmNlX3R5cGU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIgPSB7XG4gICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4Jyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lEID0gMTVfMzY4O1xuXG5jb25zdCBQUk9URUNUX01BSU5fUlVMRVNFVDogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkID0ge1xuICBuYW1lOiAnUHJvdGVjdCBtYWluJyxcbiAgdGFyZ2V0OiAnYnJhbmNoJyxcbiAgZW5mb3JjZW1lbnQ6ICdhY3RpdmUnLFxuICBjb25kaXRpb25zOiB7XG4gICAgcmVmX25hbWU6IHtcbiAgICAgIGV4Y2x1ZGU6IFtdLFxuICAgICAgaW5jbHVkZTogWyd+REVGQVVMVF9CUkFOQ0gnXSxcbiAgICB9LFxuICB9LFxuICBydWxlczogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdkZWxldGlvbicsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcycsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHN0cmljdF9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzX3BvbGljeTogZmFsc2UsXG4gICAgICAgIGRvX25vdF9lbmZvcmNlX29uX2NyZWF0ZTogdHJ1ZSxcbiAgICAgICAgcmVxdWlyZWRfc3RhdHVzX2NoZWNrczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRleHQ6ICd0ZXN0IC8gdGVzdCcsXG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAnc2VtYW50aWMtcHIgLyBzZW1hbnRpYy1wcicsXG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbm9uX2Zhc3RfZm9yd2FyZCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAncHVsbF9yZXF1ZXN0JyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgcmVxdWlyZWRfYXBwcm92aW5nX3Jldmlld19jb3VudDogMCxcbiAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZF9yZXZpZXdlcnM6IFtdLFxuICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZV9sYXN0X3B1c2hfYXBwcm92YWw6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZF9yZXZpZXdfdGhyZWFkX3Jlc29sdXRpb246IGZhbHNlLFxuICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ10sXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG4gIGJ5cGFzc19hY3RvcnM6IFtcbiAgICB7XG4gICAgICBhY3Rvcl9pZDogMTdfNzc3XzQ5NSxcbiAgICAgIGFjdG9yX3R5cGU6ICdUZWFtJyxcbiAgICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JyxcbiAgICB9LFxuICBdLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwUmVwb3NpdG9yeVJ1bGVzZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcmVwb0F1dGhvcjogb3duZXIsIHJlcG9OYW1lOiByZXBvIH0gPSBjb25maWc7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJykgcmV0dXJuO1xuICAgIC8vIFRoZSByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBob3N0cyB3b3JrZmxvd19jYWxsIGRlZmluaXRpb25zLCBzbyB0aGVcbiAgICAvLyBQcm90ZWN0IG1haW4gcnVsZXNldCB3b3VsZCByZXF1aXJlIHRlc3Qvc2VtYW50aWMtcHIgY2hlY2tzIHRoYXQgbmV2ZXIgcnVuIHRoZXJlLlxuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhjb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVwc2VydFByb3RlY3RNYWluUnVsZXNldChvY3Rva2l0LCBvd25lciwgcmVwbywgYnVpbGRQcm90ZWN0TWFpblJ1bGVzZXQoY29uZmlnKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gUmVwb3NpdG9yeSBydWxlc2V0cyByZXF1aXJlIGFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb24sIHdoaWNoIGxvY2FsIHJ1bnNcbiAgICAgIC8vIG1heSBub3QgaGF2ZSBldmVuIHdoZW4gZmlsZS1nZW5lcmF0aW9uIGFuZCBwdXNoZXMgYXJlIGFsbG93ZWQuXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFByb3RlY3RNYWluUnVsZXNldChjb25maWc6IFBhY2thZ2VDb25maWcpOiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQge1xuICBjb25zdCBydWxlc2V0ID0gc3RydWN0dXJlZENsb25lKFBST1RFQ1RfTUFJTl9SVUxFU0VUKTtcbiAgaWYgKGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzZXQucnVsZXMpIHtcbiAgICAgIGlmIChydWxlLnR5cGUgIT09ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJykgY29udGludWU7XG4gICAgICAvLyBUaGUgY29udGV4dCBpcyBgPGNhbGxlciBqb2IgaWQ+IC8gPHJldXNhYmxlIGpvYiBpZD5gIG9mIHRoZSB3YmZ5LWdlbmVyYXRlZCB0ZXN0LXJ1c3QueW1sLlxuICAgICAgcnVsZS5wYXJhbWV0ZXJzLnJlcXVpcmVkX3N0YXR1c19jaGVja3MucHVzaCh7XG4gICAgICAgIGNvbnRleHQ6ICd0ZXN0LXJ1c3QgLyB0ZXN0LXJ1c3QnLFxuICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ1bGVzZXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwc2VydFByb3RlY3RNYWluUnVsZXNldChcbiAgb2N0b2tpdDogT2N0b2tpdCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nLFxuICBydWxlc2V0OiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBleGlzdGluZ1J1bGVzZXQgPSBhd2FpdCBmaW5kUmVwb3NpdG9yeVJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIHJ1bGVzZXQubmFtZSk7XG4gIGNvbnN0IGV4aXN0aW5nUnVsZXNldElkID0gZXhpc3RpbmdSdWxlc2V0Py5pZDtcblxuICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGV4aXN0aW5nUnVsZXNldElkKSB7XG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBydWxlc2V0X2lkOiBleGlzdGluZ1J1bGVzZXRJZCxcbiAgICAgICAgICAuLi5ydWxlc2V0LFxuICAgICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMnLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgICAuLi5ydWxlc2V0LFxuICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICB7XG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgIH1cbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSdWxlc2V0KFxuICBvY3Rva2l0OiBPY3Rva2l0LFxuICBvd25lcjogc3RyaW5nLFxuICByZXBvOiBzdHJpbmcsXG4gIHJ1bGVzZXROYW1lOiBzdHJpbmdcbik6IFByb21pc2U8UmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2l0aFJldHJ5KFxuICAgICgpID0+XG4gICAgICBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMnLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgICBpbmNsdWRlc19wYXJlbnRzOiBmYWxzZSxcbiAgICAgICAgdGFyZ2V0czogJ2JyYW5jaCcsXG4gICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICB9KSxcbiAgICB7XG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgIH1cbiAgKTtcbiAgY29uc3QgcnVsZXNldHMgPSByZXNwb25zZS5kYXRhO1xuICBpZiAoIUFycmF5LmlzQXJyYXkocnVsZXNldHMpKSByZXR1cm47XG4gIHJldHVybiBydWxlc2V0cy5maW5kKChydWxlc2V0KSA9PiBydWxlc2V0Lm5hbWUgPT09IHJ1bGVzZXROYW1lICYmIHJ1bGVzZXQuc291cmNlX3R5cGUgPT09ICdSZXBvc2l0b3J5Jyk7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiwgaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBHaXRIdWJTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlcG9zaXRvcnkgc2V0dGluZ3MgbmVlZCBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB1bmxpa2UgZmlsZSBnZW5lcmF0aW9uLlxuICAgICAgYXdhaXQgd2l0aFJldHJ5KFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfdXBkYXRlX2JyYW5jaDogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBoYXNfd2lraTogZmFsc2UsXG4gICAgICAgICAgICBoYXNfcHJvamVjdHM6IGZhbHNlLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIExvY2FsIHdiZnkgcnVucyBvZnRlbiBoYXZlIHB1c2ggcGVybWlzc2lvbiB3aXRob3V0IGFkbWluIHBlcm1pc3Npb24uXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBHaXRIdWJTZXR0aW5ncyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3aXRoUmV0cnkoKCkgPT4gZGlzYWJsZURpc2N1c3Npb25zKG9jdG9raXQsIG93bmVyLCByZXBvKSwge1xuICAgICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJTZXR0aW5nc0Vycm9yKGVycm9yKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViU2V0dGluZ3NFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIGRpc2FibGluZyBHaXRIdWIgRGlzY3Vzc2lvbnMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkaXNhYmxlRGlzY3Vzc2lvbnMob2N0b2tpdDogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0T2N0b2tpdD4sIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXBvc2l0b3J5UmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LmdyYXBocWw8eyByZXBvc2l0b3J5PzogeyBpZD86IHN0cmluZyB9IH0+KFxuICAgIGBxdWVyeSgkb3duZXI6IFN0cmluZyEsICRyZXBvOiBTdHJpbmchKSB7XG4gICAgICByZXBvc2l0b3J5KG93bmVyOiAkb3duZXIsIG5hbWU6ICRyZXBvKSB7IGlkIH1cbiAgICB9YCxcbiAgICB7IG93bmVyLCByZXBvIH1cbiAgKTtcbiAgY29uc3QgcmVwb3NpdG9yeUlkID0gcmVwb3NpdG9yeVJlc3BvbnNlLnJlcG9zaXRvcnk/LmlkO1xuICBpZiAoIXJlcG9zaXRvcnlJZCkgcmV0dXJuO1xuICBhd2FpdCBvY3Rva2l0LmdyYXBocWwoXG4gICAgYG11dGF0aW9uKCRpbnB1dDogVXBkYXRlUmVwb3NpdG9yeUlucHV0ISkge1xuICAgICAgdXBkYXRlUmVwb3NpdG9yeShpbnB1dDogJGlucHV0KSB7IHJlcG9zaXRvcnkgeyBpZCB9IH1cbiAgICB9YCxcbiAgICB7IGlucHV0OiB7IHJlcG9zaXRvcnlJZCwgaGFzRGlzY3Vzc2lvbnNFbmFibGVkOiBmYWxzZSB9IH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNHaXRIdWJTZXR0aW5nc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmIChpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcikpIHJldHVybiB0cnVlO1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcgfHwgISgnZXJyb3JzJyBpbiBlcnJvcikgfHwgIUFycmF5LmlzQXJyYXkoZXJyb3IuZXJyb3JzKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZXJyb3IuZXJyb3JzLnNvbWUoXG4gICAgKGdyYXBocWxFcnJvcjogdW5rbm93bikgPT5cbiAgICAgICEhZ3JhcGhxbEVycm9yICYmXG4gICAgICB0eXBlb2YgZ3JhcGhxbEVycm9yID09PSAnb2JqZWN0JyAmJlxuICAgICAgJ3R5cGUnIGluIGdyYXBocWxFcnJvciAmJlxuICAgICAgWydGT1JCSURERU4nLCAnSU5TVUZGSUNJRU5UX1NDT1BFUycsICdOT1RfRk9VTkQnXS5pbmNsdWRlcyhncmFwaHFsRXJyb3IudHlwZSBhcyBzdHJpbmcpXG4gICk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG4vLyBUaGUgYC9zcmNgIGVudHJ5IChhIGRlY2xhcmVkIGV4cG9ydCkgbGV0cyB0aGlzIHdvcmtzcGFjZSBjb25zdW1lciB1c2UgdGhlIHNvdXJjZXMgd2l0aG91dFxuLy8gYnVpbGRpbmcgc2hhcmVkLWxpYiBmaXJzdCwgYXMgZXZlcnkgb3RoZXIgaW1wb3J0IG9mIGl0IGluIHRoaXMgcGFja2FnZSBkb2VzLlxuaW1wb3J0IHtcbiAgQlVHX0lTU1VFX1NFQ1RJT05TLFxuICBDSEFOR0VfSVNTVUVfU0VDVElPTlMsXG4gIFBVTExfUkVRVUVTVF9TRUNUSU9OUyxcbiAgcmVuZGVyU2VjdGlvblRlbXBsYXRlLFxufSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbjwhLS0gV3JpdGUgZm9yIGEgcmV2aWV3ZXIgd2hvIGhhcyBub3QgZm9sbG93ZWQgdGhlIHdvcmsuIFNjYWxlIGVhY2ggc2VjdGlvbiB0byB0aGUgY2hhbmdlOiBhIHNlbnRlbmNlIGZvciBhIHNtYWxsIGNoYW5nZSwgbnVtYmVyZWQgc3Vic2VjdGlvbnMgZm9yIGEgbGFyZ2Ugb25lLiBEZWxldGUgdGhpcyBjb21tZW50IGFuZCB0aGUgcGxhY2Vob2xkZXIgY29tbWVudHMgYmVsb3cuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShQVUxMX1JFUVVFU1RfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9idWcubWQnOiBgXG4tLS1cbm5hbWU6IEJ1ZyAvIFByb2JsZW1cbmFib3V0OiBTb21ldGhpbmcgYmVoYXZlcyB3cm9uZ2x5XG50aXRsZTogJ2ZpeDogJ1xubGFiZWxzOiAndDogZml4IDpidWc6J1xuLS0tXG5cbjwhLS0gS2VlcCBQcm9ibGVtIGFuZCBQcm9wb3NhbDsgZGVsZXRlIEV2aWRlbmNlIG9yIEltcGFjdCB3aGVuIHRoZXkgYWRkIG5vdGhpbmcuIERlbGV0ZSB0aGVzZSBjb21tZW50cy4gLS0+XG5cbiR7cmVuZGVyU2VjdGlvblRlbXBsYXRlKEJVR19JU1NVRV9TRUNUSU9OUyl9XG5gLnRyaW0oKSxcbiAgJ0lTU1VFX1RFTVBMQVRFL2NoYW5nZS5tZCc6IGBcbi0tLVxubmFtZTogQ2hhbmdlIC8gRmVhdHVyZVxuYWJvdXQ6IFByb3Bvc2UgYSBjaGFuZ2UgdGhhdCBhIHRoaXJkIHBhcnR5IGNvdWxkIGltcGxlbWVudCB3aXRob3V0IGFza2luZyBhIHF1ZXN0aW9uXG50aXRsZTogJ2ZlYXQ6ICdcbmxhYmVsczogJ3Q6IGZlYXQgOnNwYXJrbGVzOidcbi0tLVxuXG48IS0tIEtlZXAgdGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGZvciBhbnkgY2hhbmdlIGFuZCBhZGQgdGhlIG90aGVycyBhcyB0aGUgY2hhbmdlIGdyb3dzOyBhIGxhcmdlIGNoYW5nZSBmaWxscyBhbGwgb2YgdGhlbSAoc3BlYy1ib29zdGVyIHJldmlld3MgYWdhaW5zdCB0aGlzIGxpc3QpLiBEZWxldGUgdGhlc2UgY29tbWVudHMuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShDSEFOR0VfSVNTVUVfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9jb25maWcueW1sJzogJ2JsYW5rX2lzc3Vlc19lbmFibGVkOiB0cnVlJyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUZW1wbGF0ZXMgYXJlIHJlcG9zaXRvcnktbGV2ZWwgZmlsZXMsIHNvIGEgZGlyZWN0IHdvcmtzcGFjZS1jaGlsZCBpbnZvY2F0aW9uIG11c3Qgbm90IGNyZWF0ZSB0aGVtLlxuICAgIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvIHx8ICFjb25maWcuaXNSb290KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuY29uc3QgYWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm4gPSBTdHJpbmcucmF3YCg/OldpbGxCb29zdGVyfFdpbGxCb29zdGVyTGFiKWA7XG5jb25zdCBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zID0gW1xuICBuZXcgUmVnRXhwKGBeJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKGBeZ2l0aHViOiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzojXFxcXFMrKT8kYCwgJ3UnKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9odHRwczovL2dpdGh1YlxcXFwuY29tLyR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsXG4gICAgJ3UnXG4gICksXG4gIG5ldyBSZWdFeHAoXG4gICAgYF4oPzpnaXRcXFxcKyk/c3NoOi8vZ2l0QGdpdGh1YlxcXFwuY29tWzovXSR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsXG4gICAgJ3UnXG4gICksXG4gIG5ldyBSZWdFeHAoYF4oPzpnaXRcXFxcKyk/Z2l0QGdpdGh1YlxcXFwuY29tOiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsICd1JyksXG5dO1xuXG5pbnRlcmZhY2UgRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2Uge1xuICBkZXBlbmRlbmN5TmFtZTogc3RyaW5nO1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIHNlY3Rpb25OYW1lOiAodHlwZW9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cylbbnVtYmVyXTtcbiAgc3BlY2lmaWVyOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzID0gY29uZmlncy5mbGF0TWFwKGdldERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlcyk7XG4gIGlmIChkaXNhbGxvd2VkU291cmNlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXRhaWxzID0gZGlzYWxsb3dlZFNvdXJjZXNcbiAgICAubWFwKFxuICAgICAgKHsgZGVwZW5kZW5jeU5hbWUsIGRpclBhdGgsIHNlY3Rpb25OYW1lLCBzcGVjaWZpZXIgfSkgPT5cbiAgICAgICAgYC0gJHtwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpfTogJHtzZWN0aW9uTmFtZX0uJHtkZXBlbmRlbmN5TmFtZX0gdXNlcyAke3NwZWNpZmllcn1gXG4gICAgKVxuICAgIC5qb2luKCdcXG4nKTtcblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYERpc2FsbG93ZWQgR2l0IGRlcGVuZGVuY3kgc291cmNlcyBmb3VuZC5cXG5Pbmx5IFdpbGxCb29zdGVyIGFuZCBXaWxsQm9vc3RlckxhYiBHaXRIdWIgZGVwZW5kZW5jaWVzIGFyZSBhbGxvd2VkLlxcbiR7ZGV0YWlsc31gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdIHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBjb25maWcucGFja2FnZUpzb247XG4gIGlmICghcGFja2FnZUpzb24pIHJldHVybiBbXTtcblxuICBjb25zdCBkaXNhbGxvd2VkU291cmNlczogRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNlY3Rpb25OYW1lIG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBwYWNrYWdlSnNvbltzZWN0aW9uTmFtZV07XG4gICAgaWYgKCFzZWN0aW9uKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3lOYW1lLCBzcGVjaWZpZXJdIG9mIE9iamVjdC5lbnRyaWVzKHNlY3Rpb24pKSB7XG4gICAgICBpZiAoIXNwZWNpZmllcikgY29udGludWU7XG4gICAgICBpZiAoIWlzR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXIpKSBjb250aW51ZTtcbiAgICAgIGlmIChpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuXG4gICAgICBkaXNhbGxvd2VkU291cmNlcy5wdXNoKHtcbiAgICAgICAgZGVwZW5kZW5jeU5hbWUsXG4gICAgICAgIGRpclBhdGg6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBzZWN0aW9uTmFtZSxcbiAgICAgICAgc3BlY2lmaWVyLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkaXNhbGxvd2VkU291cmNlcztcbn1cblxuZnVuY3Rpb24gaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaXNHaXRIdWJTaG9ydGhhbmRTcGVjaWZpZXIoc3BlY2lmaWVyKSB8fFxuICAgIC9eKD86Yml0YnVja2V0fGdpc3R8Z2l0aHVifGdpdGxhYik6L3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL15odHRwcz86XFwvXFwvKD86Yml0YnVja2V0XFwub3JnfGdpdGh1YlxcLmNvbXxnaXRsYWJcXC5jb20pXFwvL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpodHRwcz98c3NoKTpcXC9cXC9cXFMrXFwuZ2l0KD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXlteQFxcc10rQFteOlxcc10rOlxcUysoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQ6JykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZ2l0KycpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ3NzaDovL2dpdEAnKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15bYS16QS1aMC05XVtcXHcuLV0qXFwvW1xcdy4tXSsoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKTtcbn1cblxuZnVuY3Rpb24gaXNBbGxvd2VkR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gYWxsb3dlZEdpdERlcGVuZGVuY3lQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3Qoc3BlY2lmaWVyKSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFcnJvciwgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgeyBub3JtYWxpemVCdW5Mb2NrZmlsZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeE5leHRDb25maWdKc29uIH0gZnJvbSAnLi9maXhlcnMvbmV4dENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhDaGFrcmFUb2FzdGVyIH0gZnJvbSAnLi9maXhlcnMvY2hha3JhVG9hc3Rlci5qcyc7XG5pbXBvcnQgeyBmaXhQbGF5d3JpZ2h0Q29uZmlnIH0gZnJvbSAnLi9maXhlcnMvcGxheXdyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhUeXBvcyB9IGZyb20gJy4vZml4ZXJzL3R5cG9zLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYWdlbnRzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQnVuZmlnVG9tbCwgcmVhZEJ1bkdsb2JhbFN0b3JlLCByZXNvbHZlQnVuR2xvYmFsU3RvcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVGbm94VG9tbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9mbm94VG9tbC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdlbWluaUNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzLCByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dsb2JhbFJlbGVhc2VBZ2VHYXRlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9vayB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uLCBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94Zm10Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294Zm10Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hsaW50Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294bGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhSYWlsd2F5aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JhaWx3YXlpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUsIHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb25jLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3VzZXJBZ2VudENvbmZpZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBlbnN1cmVXYkVudkRlZmluaXRpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3diRW52LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9zZWxmQ29udGFpbmVkV29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTWlzZVRvbWwsIG1pbmltdW1CdW5WZXJzaW9uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL21pc2VUb21sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL25wbXJjLmpzJztcbmltcG9ydCB7IHNldHVwTGFiZWxzIH0gZnJvbSAnLi9naXRodWIvbGFiZWwuanMnO1xuaW1wb3J0IHsgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMgfSBmcm9tICcuL2dpdGh1Yi9ydWxlc2V0LmpzJztcbmltcG9ydCB7IHNldHVwR2l0SHViU2V0dGluZ3MgfSBmcm9tICcuL2dpdGh1Yi9zZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyB9IGZyb20gJy4vZ2l0aHViL3RlbXBsYXRlLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VDb25maWcsIGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzIH0gZnJvbSAnLi91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlVHlwZVNjcmlwdEFwaSB9IGZyb20gJy4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5pbXBvcnQgeyBnZXRXYmZ5VmVyc2lvbiwgZ2V0V2JmeVZlcnNpb25MYWJlbCB9IGZyb20gJy4vdXRpbHMvdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyB9IGZyb20gJy4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbi8qKlxuICogQXBwbGllcyBvbmx5IHRoZSBnbG9iYWwgcmVsZWFzZS1hZ2UgZ2F0ZSwgd2l0aG91dCB0b3VjaGluZyBhbnkgcmVwb3NpdG9yeS4gU3BlbGxlZCBvdXQgaW4gZnVsbFxuICogcmF0aGVyIHRoYW4gc2hvcnRlbmVkIChlLmcuIGBnYXRlYCkgYmVjYXVzZSB0aGUgZGVmYXVsdCBjb21tYW5kIHRha2VzIHBvc2l0aW9uYWwgcGF0aHM6IGEgc2hvcnRcbiAqIG5hbWUgd291bGQgc3dhbGxvdyBhIGRpcmVjdG9yeSB0aGF0IGhhcHBlbnMgdG8gc2hhcmUgaXQuXG4gKi9cbmNvbnN0IGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kID0gJ2FwcGx5LXJlbGVhc2UtYWdlLWdhdGUnO1xuLyoqIFNhbWUgbmFtaW5nIHJhdGlvbmFsZSBhcyBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZC4gKi9cbmNvbnN0IGdlbmVyYXRlVXNlckFnZW50Q29uZmlnc0NvbW1hbmQgPSAnZ2VuZXJhdGUtdXNlci1hZ2VudC1jb25maWdzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZChcbiAgICAgIGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kLFxuICAgICAgXCJBcHBseSBvbmx5IHRoZSBvcmdhbml6YXRpb24ncyBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSB0byB0aGlzIG1hY2hpbmUncyBnbG9iYWwgcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3NcIlxuICAgIClcbiAgICAuY29tbWFuZChcbiAgICAgIGdlbmVyYXRlVXNlckFnZW50Q29uZmlnc0NvbW1hbmQsXG4gICAgICBcIk92ZXJ3cml0ZSB0aGlzIHVzZXIncyBhZ2VudCBpbnN0cnVjdGlvbiBmaWxlcyAofi8uY29kZXgvQUdFTlRTLm1kLCB+Ly5jbGF1ZGUvQ0xBVURFLm1kLCB+Ly5nZW1pbmkvR0VNSU5JLm1kKSB3aXRoIHRoZSBvcmdhbml6YXRpb24ncyBmaXhlZCBjb250ZW50IGFuZCBtZXJnZSB0aGUgb3JnYW5pemF0aW9uJ3Mgc2V0dGluZ3MgaW50byB+Ly5jbGF1ZGUvc2V0dGluZ3MuanNvbiBhbmQgfi8uZ2VtaW5pL3NldHRpbmdzLmpzb25cIlxuICAgIClcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZm9yY2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdBcHBseSB3YmZ5IGV2ZW4gd2hlbiB0aGUgcmVwb3NpdG9yeSBhbHJlYWR5IHJlY29yZHMgdGhpcyB3YmZ5IHZlcnNpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2YnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdTa2lwIGFkZGluZyBtYW5hZ2VkIGRlcGVuZGVuY2llcyBhbmQgdGhlIGxpbmtlciBwcm9iZSAodGhlIGZpbmFsIGBidW4gaW5zdGFsbGAgcmVmcmVzaGluZyB0aGUgbG9ja2ZpbGUgc3RpbGwgcnVucyknLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudmVyc2lvbihnZXRXYmZ5VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcblxuICAvLyBEZWxpYmVyYXRlbHkgYmVmb3JlIHRoZSBCdW4gY2hlY2sgaW4gd2lsbGJvb3N0ZXJpZnlQYXRocygpOiB0aGUgZ2F0ZSBtdXN0IGJlIGFwcGxpYWJsZSBvbiBhXG4gIC8vIG1hY2hpbmUgd2hvc2UgQnVuIGlzIG91dGRhdGVkLCB3aGljaCBpcyBleGFjdGx5IGEgbWFjaGluZSB0aGF0IHN0aWxsIG5lZWRzIGdhdGluZy5cbiAgaWYgKGFyZ3YuX1swXSA9PT0gYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQpIHtcbiAgICBpZiAoIWVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcygpKSBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFyZ3YuX1swXSA9PT0gZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzQ29tbWFuZCkge1xuICAgIGlmICghKGF3YWl0IGdlbmVyYXRlVXNlckFnZW50Q29uZmlncygpKSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBhd2FpdCB3aWxsYm9vc3RlcmlmeVBhdGhzKGFyZ3YucGF0aHMgYXMgc3RyaW5nW10sIGFyZ3Yuc2tpcERlcHMsIGFyZ3YuZm9yY2UpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIFRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyIHNlcnZlciBzcGF3bmVkIGZvciBBU1QgcGFyc2luZyBrZWVwcyBhbiBvcGVuIElQQ1xuICAgIC8vIGNoYW5uZWwgdGhhdCB3b3VsZCBvdGhlcndpc2UgcHJldmVudCB0aGUgTm9kZS5qcyBwcm9jZXNzIGZyb20gZXhpdGluZy5cbiAgICBhd2FpdCBkaXNwb3NlVHlwZVNjcmlwdEFwaSgpO1xuICB9XG4gIGlmIChoYXNJbnZhbGlkUGFja2FnZUNvbmZpZykge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdpbGxib29zdGVyaWZ5UGF0aHMocGF0aHM6IHN0cmluZ1tdLCBza2lwRGVwczogYm9vbGVhbiwgZm9yY2U6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gQmVmb3JlIGFueXRoaW5nIGVsc2Ug4oCUIGV2ZW4gdGhlIEJ1biBjaGVjayBiZWxvdzogdGhlIGRldmVsb3BlciBtYWNoaW5lJ3MgZ2xvYmFsXG4gIC8vIHBhY2thZ2UtbWFuYWdlciBjb25maWdzIG11c3QgcmVjZWl2ZSB0aGUgb3JnJ3MgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgb24gRVZFUlkgcnVuLFxuICAvLyBiZWNhdXNlIHRoZXkgYXJlIHdoYXQgZ3VhcmRzIGJyYW5kLW5ldyBsb2NhbCBwcm9qZWN0cyB0aGF0IGhhdmUgbm8gd2JmeS1nZW5lcmF0ZWQgcmVwb3NpdG9yeVxuICAvLyBjb25maWcgeWV0LCBhbmQgdGhhdCBwcm90ZWN0aW9uIG11c3Qgd29yayBiZWZvcmUgdGhlIHN1cHBvcnRlZC12ZXJzaW9uIGNoZWNrLlxuICBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMoKTtcblxuICAvLyB3YmZ5IG1hbmFnZXMgcmVwb3NpdG9yaWVzIHRocm91Z2ggQnVuICsgbWlzZSBhbmQgdXNlcyBCdW4gMS40IHJ1bnRpbWUgQVBJcy4gVGhlIHZlcnNpb24gZmxvb3JcbiAgLy8gYWxzbyBlbnN1cmVzIHRoZSBnZW5lcmF0ZWQgYnVuZmlnLnRvbWwgb3B0aW9ucyBwcm9kdWNlIHRoZSBpbnN0YWxsIGxheW91dCB3YmZ5IHZhbGlkYXRlcy4gSXRcbiAgLy8gc3RheXMgdW5jb25kaXRpb25hbCBldmVuIHRob3VnaCB0aGUgYWxyZWFkeS1hcHBsaWVkIGNoZWNrIGJlbG93IGNhbiBtYWtlIGEgcnVuIGEgbm8tb3A6IGFuXG4gIC8vIG91dGRhdGVkIEJ1biBpcyBhIGJyb2tlbiBlbnZpcm9ubWVudCB3YmZ5IG11c3QgcmVwb3J0LCBhbmQgaGlkaW5nIGl0IHdoZW5ldmVyIGV2ZXJ5IHBhdGhcbiAgLy8gaGFwcGVucyB0byBiZSBza2lwcGVkIHdvdWxkIHN1cmZhY2UgaXQgb25seSBsYXRlci5cbiAgY29uc3QgYnVuVmVyc2lvbiA9IEJ1bi52ZXJzaW9uO1xuICBpZiAoQnVuLnNlbXZlci5vcmRlcihidW5WZXJzaW9uLCBtaW5pbXVtQnVuVmVyc2lvbikgPCAwKSB7XG4gICAgY29uc29sZS5lcnJvcihgd2JmeSByZXF1aXJlcyBCdW4gPj0gJHttaW5pbXVtQnVuVmVyc2lvbn0gKGZvdW5kICR7YnVuVmVyc2lvbn0pLiBVcGdyYWRlIEJ1biBhbmQgcmUtcnVuLmApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQSBgLWRpcnR5LWxvY2FsYCBsYWJlbCBpZGVudGlmaWVzIGFuIGVkaXRlZCBjaGVja291dCwgd2hvc2UgbmV4dCBidWlsZCBwcm9kdWNlcyBkaWZmZXJlbnQgZmlsZXNcbiAgLy8gdW5kZXIgdGhlIHNhbWUgbGFiZWwsIHNvIHN1Y2ggYSBydW4gaXMgbmV2ZXIgdHJlYXRlZCBhcyBhbHJlYWR5IGFwcGxpZWQuXG4gIGNvbnN0IHZlcnNpb25MYWJlbCA9IGdldFdiZnlWZXJzaW9uTGFiZWwoKTtcbiAgY29uc3Qgc2tpcHBhYmxlVmVyc2lvbkxhYmVsID1cbiAgICAhZm9yY2UgJiYgdmVyc2lvbkxhYmVsICYmICF2ZXJzaW9uTGFiZWwuZW5kc1dpdGgoJy1kaXJ0eS1sb2NhbCcpID8gdmVyc2lvbkxhYmVsIDogdW5kZWZpbmVkO1xuXG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGlucHV0RGlyUGF0aCBvZiBwYXRocykge1xuICAgIC8vIE5vcm1hbGl6ZSBvbmNlIGF0IHRoZSBDTEkgYm91bmRhcnkuIEdlbmVyYXRvcnMgdXNlIGRpclBhdGggZm9yIGN3ZCBhbmQgYmFzZW5hbWUgZGVjaXNpb25zO1xuICAgIC8vIGxlYXZpbmcgdGhlIHN1cHBvcnRlZCBkZWZhdWx0IGAuYCB1bnJlc29sdmVkIHdvdWxkIGdlbmVyYXRlIGFuIGludmFsaWQgcGFja2FnZSBuYW1lIG9mIGAuYC5cbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShpbnB1dERpclBhdGgpO1xuICAgIC8vIENvbmZpbmUgZXZlcnkgZ2VuZXJhdGVkIGZpbGUgdG8gdGhpcyByZXBvc2l0b3J5IChzZWUgZnNVdGlsLmdlbmVyYXRlRmlsZSkuIFNldCBCRUZPUkUgYW55XG4gICAgLy8gZml4ZXIgd3JpdGVzLCBhbmQgcmVzZXQgb24gZXZlcnkgaXRlcmF0aW9uIHNvIGEgbXVsdGktcGF0aCBydW4gbmV2ZXIga2VlcHMgdGhlIHByZXZpb3VzIHJvb3QuXG4gICAgZnNVdGlsLnNldFJvb3REaXJQYXRoKGZzLmV4aXN0c1N5bmMocm9vdERpclBhdGgpID8gcm9vdERpclBhdGggOiB1bmRlZmluZWQpO1xuXG4gICAgLy8gVGhlIGJhZGdlIHJlY29yZHMgdGhlIGJ1aWxkIHRoYXQgZ2VuZXJhdGVkIHRoZSByZXBvc2l0b3J5J3MgY29uZmlndXJhdGlvbiwgc28gdGhlIHNhbWUgYnVpbGRcbiAgICAvLyB3b3VsZCBvbmx5IHJld3JpdGUgd2hhdCBpcyBhbHJlYWR5IHRoZXJlLiBTa2lwcGluZyBpcyBhIGRlbGliZXJhdGUgdHJhZGU6IHRoZSBwYXJ0cyBvZiBhIHJ1blxuICAgIC8vIHRoYXQgZGVwZW5kIG9uIHN0YXRlIE9VVFNJREUgdGhlIHJlcG9zaXRvcnkgKEdpdEh1YiBzZXR0aW5ncywgZGVwZW5kZW5jeSB1cGRhdGVzLCB0aGUgZmV0Y2hlZFxuICAgIC8vIC5naXRpZ25vcmUpIGRvIGdldCBza2lwcGVkIHRvbywgd2hpY2ggaXMgd2hhdCAtLWZvcmNlIGlzIGZvci5cbiAgICBpZiAoc2tpcHBhYmxlVmVyc2lvbkxhYmVsICYmIChhd2FpdCByZWFkQXBwbGllZFdiZnlWZXJzaW9uTGFiZWwocm9vdERpclBhdGgpKSA9PT0gc2tpcHBhYmxlVmVyc2lvbkxhYmVsKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFNraXAgJHtyb290RGlyUGF0aH06IHdiZnkgJHtza2lwcGFibGVWZXJzaW9uTGFiZWx9IGlzIGFscmVhZHkgYXBwbGllZC4gUGFzcyAtLWZvcmNlIHRvIHJlLWFwcGx5LmApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBwYWNrYWdlc1N1YkRpclBhdGhzID0gZGlyZW50c1xuICAgICAgLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKVxuICAgICAgLm1hcCgoZCkgPT4gcGF0aC5yZXNvbHZlKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG4gICAgLy8gQWxzbyBjb3ZlciB3b3Jrc3BhY2VzIGRlY2xhcmVkIG91dHNpZGUgcGFja2FnZXMvKiAoZS5nLiBhcHBzLyopOiB0aGV5IHJlY2VpdmUgdGhlIHNhbWVcbiAgICAvLyBtYW5hZ2VkIGNvbmZpZ3MgKHRzY29uZmlnLmpzb24sIHBhY2thZ2UuanNvbiBjb252ZW50aW9ucywg4oCmKSBhcyBwYWNrYWdlcy8qIGNoaWxkcmVuLlxuICAgIGNvbnN0IHJvb3RQYWNrYWdlSnNvbiA9XG4gICAgICBpZ25vcmVFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUNvbmZpZ1sncGFja2FnZUpzb24nXVxuICAgICAgKSA/PyB7fTtcbiAgICBjb25zdCB3b3Jrc3BhY2VTdWJEaXJQYXRocyA9IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKHtcbiAgICAgIGRpclBhdGg6IHJvb3REaXJQYXRoLFxuICAgICAgcGFja2FnZUpzb246IHJvb3RQYWNrYWdlSnNvbixcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBwYWNrYWdlc1N1YkRpclBhdGhzLnNvbWUoKHN1YkRpclBhdGgpID0+XG4gICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHN1YkRpclBhdGgsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgICksXG4gICAgfSk7XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBbLi4ubmV3IFNldChbLi4ucGFja2FnZXNTdWJEaXJQYXRocywgLi4ud29ya3NwYWNlU3ViRGlyUGF0aHNdKV0uZmlsdGVyKFxuICAgICAgKHN1YkRpclBhdGgpID0+IHN1YkRpclBhdGggIT09IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aClcbiAgICApO1xuXG4gICAgLy8gUmVmdXNlZCB3cml0ZXMgb24gY29yZSBtYW5hZ2VkIGZpbGVzIHdvdWxkIGxlYXZlIHRoZSByZXBvc2l0b3J5IHBhcnRpYWxseSB1cGRhdGVkLCBzbyBza2lwXG4gICAgLy8gaXQgQkVGT1JFIGFueSBtdXRhdGlvbiB3aGVuIG9uZSBvZiB0aGVtIGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICAgIGNvbnN0IG1hbmFnZWRGaWxlUGF0aHMgPSBbXG4gICAgICAuLi5bJy5naXRhdHRyaWJ1dGVzJywgJ2J1bmZpZy50b21sJywgJ2xlZnRob29rLnltbCcsICdwYWNrYWdlLmpzb24nLCAndHNjb25maWcuanNvbiddLm1hcCgobmFtZSkgPT5cbiAgICAgICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCBuYW1lKVxuICAgICAgKSxcbiAgICAgIC4uLnN1YkRpclBhdGhzLmZsYXRNYXAoKHN1YkRpclBhdGgpID0+XG4gICAgICAgIFsncGFja2FnZS5qc29uJywgJ3RzY29uZmlnLmpzb24nXS5tYXAoKG5hbWUpID0+IHBhdGgucmVzb2x2ZShzdWJEaXJQYXRoLCBuYW1lKSlcbiAgICAgICksXG4gICAgXTtcbiAgICBjb25zdCB3cml0YWJsZVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1hbmFnZWRGaWxlUGF0aHMubWFwKChmaWxlUGF0aCkgPT4gZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpKVxuICAgICk7XG4gICAgaWYgKHdyaXRhYmxlUmVzdWx0cy5pbmNsdWRlcyhmYWxzZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXAgJHtyb290RGlyUGF0aH06IGEgbWFuYWdlZCBjb25maWcgZmlsZSBpcyBhIHN5bWxpbmsgb3IgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZsaWdodEVycm9ycyA9IFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdLmZsYXRNYXAoKGRpclBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VDb25maWdbJ3BhY2thZ2VKc29uJ107XG4gICAgICAgIGNvbnN0IGVycm9yID0gZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvcih7IHBhY2thZ2VKc29uIH0pO1xuICAgICAgICByZXR1cm4gZXJyb3IgPyBbYCR7ZGlyUGF0aH06ICR7ZXJyb3J9YF0gOiBbXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW2Ake3BhY2thZ2VKc29uUGF0aH0gaXMgaW52YWxpZGBdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChwcmVmbGlnaHRFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTpcXG4ke3ByZWZsaWdodEVycm9ycy5qb2luKCdcXG4nKX1gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIExldCBnZXRQYWNrYWdlQ29uZmlnIGRlcml2ZSBpc1Jvb3QgZm9yIHRoZSBlbnRyeSBwYXRoOiBgd2JmeSA8cmVwbz4vcGFja2FnZXMvPGFwcD5gIGlzIGFcbiAgICAvLyBzdXBwb3J0ZWQgaW52b2NhdGlvbiB3aG9zZSB0YXJnZXQgbXVzdCBrZWVwIGl0cyBjaGlsZCBjbGFzc2lmaWNhdGlvbiwgc28gZm9yY2luZ1xuICAgIC8vIGBpc1Jvb3Q6IHRydWVgIGhlcmUgd291bGQgYXBwbHkgcm9vdC1vbmx5IHByb2Nlc3NpbmcgKGxlZnRob29rIGluc3RhbGwsIHJvb3QgdHNjb25maWcsXG4gICAgLy8gQUdFTlRTLm1kLCDigKYpIHRvIGEgc3VicGFja2FnZS5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBFdmVyeSBkaXNjb3ZlcmVkIHdvcmtzcGFjZSAoaW5jbHVkaW5nIG5vbi1wYWNrYWdlcy8qIGxheW91dHMgc3VjaCBhcyBhcHBzLyopIGlzIGEgY2hpbGRcbiAgICAvLyBwYWNrYWdlOyB0aGUgcGFja2FnZXMvKiBoZXVyaXN0aWMgaW5zaWRlIGdldFBhY2thZ2VDb25maWcgd291bGQgbWlzY2xhc3NpZnkgYXBwcy8qIGFzIHJvb3RzLlxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCB7IGlzUm9vdDogZmFsc2UgfSkpXG4gICAgKTtcbiAgICBjb25zdCBpbnZhbGlkU3ViUGFja2FnZURpclBhdGggPSBzdWJEaXJQYXRocy5maW5kKFxuICAgICAgKHN1YkRpclBhdGgsIGluZGV4KSA9PiAhbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlnc1tpbmRleF0gJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKVxuICAgICk7XG4gICAgaWYgKGludmFsaWRTdWJQYWNrYWdlRGlyUGF0aCkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTogJHtpbnZhbGlkU3ViUGFja2FnZURpclBhdGh9L3BhY2thZ2UuanNvbiBpcyBpbnZhbGlkLmApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcbiAgICAvLyBUaGUgbWFuYWdlZCBpZ25vcmUgcnVsZSBpcyB1bmFuY2hvcmVkLCBzbyBhIG5lc3RlZCBjb3B5IChlLmcuIHdvcmtlcnMvYXBpLy5lbnYuY2xvdWRmbGFyZSkgaXNcbiAgICAvLyBhcyBtdWNoIGEgbGVhayBhcyBhIHJvb3Qgb25lOyB0aGUgd2lsZGNhcmQgcGF0aHNwZWMgY292ZXJzIGV2ZXJ5IGRlcHRoIGluIG9uZSBxdWVyeS5cbiAgICBjb25zdCB0cmFja2VkQ2xvdWRmbGFyZUVudlBhdGhzID0gYWxsUGFja2FnZUNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuaXNDbG91ZGZsYXJlKVxuICAgICAgPyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgICAgICAgJ2dpdCcsXG4gICAgICAgICAgWyctYycsICdjb3JlLnF1b3RlUGF0aD1mYWxzZScsICdscy1maWxlcycsICctLScsICcuZW52LmNsb3VkZmxhcmUnLCAnKi8uZW52LmNsb3VkZmxhcmUnXSxcbiAgICAgICAgICByb290Q29uZmlnLmRpclBhdGhcbiAgICAgICAgKVxuICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKSlcbiAgICAgIDogW107XG4gICAgaWYgKHRyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFNFQ1VSSVRZIEVSUk9SOiBDbG91ZGZsYXJlIGNyZWRlbnRpYWxzIG11c3QgYmUgdW50cmFja2VkLiBSZW1vdmUgJHt0cmFja2VkQ2xvdWRmbGFyZUVudlBhdGhzLmpvaW4oXG4gICAgICAgICAgJywgJ1xuICAgICAgICApfSBmcm9tIEdpdCwgcHVyZ2UgdGhlIHRva2VuIGZyb20gaGlzdG9yeSwgYW5kIHJvdGF0ZSBDTE9VREZMQVJFX0FQSV9UT0tFTiBiZWZvcmUgcmVydW5uaW5nIHdiZnkuYFxuICAgICAgKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhYmJyZXZpYXRpb25Qcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBhd2FpdCBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyhhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMoYWxsUGFja2FnZUNvbmZpZ3MpO1xuICAgIC8vIE1hbmFnZWQgcmVwb3NpdG9yaWVzIHVzZSBCdW4gd2l0aCBtaXNlIChhbmQgb3B0aW9uYWxseSBmbm94KS5cbiAgICBjb25zdCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlID0gcmVhZEJ1bkdsb2JhbFN0b3JlKHJvb3REaXJQYXRoKTtcbiAgICAvLyBSb290LWxldmVsIGluc3RhbGwgbGF5b3V0IG11c3QgY292ZXIgd29ya3NwYWNlIGFwcHMgdG9vOiBOZXh0LmpzIGNvbW1vbmx5IGxpdmVzIHVuZGVyXG4gICAgLy8gcGFja2FnZXMvKiBvciBhcHBzLyogd2hpbGUgYnVuZmlnLnRvbWwgZXhpc3RzIG9ubHkgYXQgdGhlIHJlcG9zaXRvcnkgcm9vdC5cbiAgICBjb25zdCB1c2VHbG9iYWxTdG9yZSA9IHJlc29sdmVCdW5HbG9iYWxTdG9yZShhbGxQYWNrYWdlQ29uZmlncywgcHJldmlvdXNCdW5HbG9iYWxTdG9yZSwgc2tpcERlcHMpO1xuICAgIGF3YWl0IGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnLCB1c2VHbG9iYWxTdG9yZSk7XG4gICAgYXdhaXQgZ2VuZXJhdGVNaXNlVG9tbChyb290Q29uZmlnKTtcbiAgICBhd2FpdCBnZW5lcmF0ZUZub3hUb21sKHJvb3RDb25maWcpO1xuICAgIC8vIFJ1biBhZnRlciBnZW5lcmF0ZUZub3hUb21sIHNvIGl0cyB0cmFuc2FjdGlvbmFsIHJlY2lwaWVudCBzeW5jIGNhbm5vdCByZXN0b3JlIGEgc25hcHNob3RcbiAgICAvLyBvdmVyIGRlZmluaXRpb25zIGluc2VydGVkIGhlcmUuXG4gICAgYXdhaXQgZW5zdXJlV2JFbnZEZWZpbml0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgLy8gcHJvbWlzZVBvb2wucnVuIHJlc29sdmVzIHdoZW4gYSB0YXNrIFNUQVJUUywgc28gdGhlIGdlbmVyYXRlZCBidW5maWcudG9tbCBpcyBub3RcbiAgICAvLyBndWFyYW50ZWVkIHRvIGJlIG9uIGRpc2sgeWV0OyB0aGUgcHJvYmUgYmVsb3cgbXVzdCBub3QgdmFsaWRhdGUgYSBzdGFsZSBjb25maWd1cmF0aW9uLlxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIC8vIFRoZSBsYXlvdXQgbXVzdCBiZSB2ZXJpZmllZCBpbnN0YWxsYWJsZSBCRUZPUkUgYW55IGBidW4gYWRkYCBtdXRhdGVzIHBhY2thZ2UuanNvbiBmaWxlczpcbiAgICAvLyBwZXItcGFja2FnZSBpbnN0YWxscyB0b2xlcmF0ZSBmYWlsdXJlcyAoc3Bhd25TeW5jIGRpc2NhcmRzIHRoZWlyIHN0YXR1cyksIHNvIGEgbGF5b3V0IHRoYXRcbiAgICAvLyBjYW5ub3QgaW5zdGFsbCB3b3VsZCBzaWxlbnRseSBkcm9wIGV2ZXJ5IG1hbmFnZWQgZGVwZW5kZW5jeSB1cGRhdGUgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4uXG4gICAgLy8gQSBkb2NzLW9ubHkgcmVwb3NpdG9yeSBoYXMgbm8gbWFuaWZlc3QgdG8gcHJvYmUgb24gaXRzIGZpcnN0IHJ1bjsgZ2VuZXJhdGVQYWNrYWdlSnNvbiBiZWxvd1xuICAgIC8vIGNyZWF0ZXMgaXQgYmVmb3JlIHRoZSBhdXRob3JpdGF0aXZlIHJlZnJlc2hCdW5Mb2NrIGNoZWNrLlxuICAgIGlmIChcbiAgICAgICFza2lwRGVwcyAmJlxuICAgICAgcm9vdENvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmXG4gICAgICAhcHJvYmVJc29sYXRlZEJ1bkluc3RhbGwocm9vdERpclBhdGgsIHJvb3RDb25maWcsIHByZXZpb3VzQnVuR2xvYmFsU3RvcmUsIHVzZUdsb2JhbFN0b3JlKVxuICAgICkge1xuICAgICAgLy8gcmVmcmVzaEJ1bkxvY2sgYmVsb3cgaXMgdGhlIGF1dGhvcml0eSBvbiB3aGV0aGVyIHRoZSBmaW5hbCBpbnN0YWxsIGZhaWxlZC5cbiAgICAgIGNvbnNvbGUud2FybihgYnVuIGluc3RhbGwgY3VycmVudGx5IGZhaWxzIGluICR7cm9vdERpclBhdGh9IHVuZGVyIHRoZSBpc29sYXRlZCBsaW5rZXIuYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIC8vIE90aGVyIG93bmVycyBjYW5ub3QgY2FsbCB0aGUgb3JnYW5pemF0aW9uJ3MgcmV1c2FibGUgd29ya2Zsb3dzICh0aGVpciBzZWNyZXRzIGFuZCBydW5uZXJzXG4gICAgLy8gZG8gbm90IGV4aXN0IHRoZXJlKSwgc28gYW55IG90aGVyIEdpdEh1Yi1ob3N0ZWQgTm9kZS5qcyByZXBvc2l0b3J5IGdldHMgc2VsZi1jb250YWluZWRcbiAgICAvLyB3b3JrZmxvd3MgaW5zdGVhZCDigJQga2V5ZWQgb24gcmVwb3NpdG9yeSBzdGF0ZSwgbmV2ZXIgb24gdGhlIG93bmVyJ3MgaWRlbnRpdHkuXG4gICAgLy8gcm9vdENvbmZpZy5pc1Jvb3Q6IGEgZGlyZWN0IHdvcmtzcGFjZS1jaGlsZCBpbnZvY2F0aW9uIChgd2JmeSA8cmVwbz4vcGFja2FnZXMvPGFwcD5gKSBrZWVwc1xuICAgIC8vIGlzUm9vdCBmYWxzZSwgYW5kIEdpdEh1YiBpZ25vcmVzIHdvcmtmbG93IGZpbGVzIG5lc3RlZCB1bmRlciBhIHBhY2thZ2UgZGlyZWN0b3J5LlxuICAgIGNvbnN0IHNob3VsZFJ1blNlbGZDb250YWluZWRXb3JrZmxvd3MgPVxuICAgICAgIXNob3VsZFJ1bldvcmtmbG93cyAmJlxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgICEhcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6JykgJiZcbiAgICAgIHJvb3RDb25maWcuaXNSb290O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHZW1pbmlDb25maWcocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGZpeFJhaWx3YXlpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbmMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihzaG91bGRSdW5Xb3JrZmxvd3MgPyBbZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyldIDogW10pLFxuICAgICAgLi4uKHNob3VsZFJ1blNlbGZDb250YWluZWRXb3JrZmxvd3MgPyBbZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKV0gOiBbXSksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIC8vIEdpdCBob29rcyBhcmUgcmVwb3NpdG9yeS1sZXZlbCBzdGF0ZTogYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gbXVzdCBub3Qgd3JpdGUgYVxuICAgICAgLy8gY2hpbGQgbGVmdGhvb2sueW1sIG9yIHJlcGxhY2UgdGhlIGVuY2xvc2luZyByZXBvc2l0b3J5J3MgaG9vayBpbnN0YWxsYXRpb24uXG4gICAgICAuLi4ocm9vdENvbmZpZy5pc1Jvb3QgPyBbZ2VuZXJhdGVMZWZ0aG9vayhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyldIDogW10pLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAvLyBBZnRlciB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yIChhbmQgaXRzIHBvb2xlZCB3cml0ZXMpIHNvIHRoZSBpbnN0cnVjdGlvbiBmaWxlcyBkZXNjcmliZSB0aGVcbiAgICAvLyBmaW5hbGl6ZWQgd29ya2Zsb3cgZmlsZXMgaW5zdGVhZCBvZiBsYWdnaW5nIG9uZSBydW4gYmVoaW5kLlxuICAgIGF3YWl0IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuY2hha3JhKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4Q2hha3JhVG9hc3Rlcihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSmF2YShjb25maWcpKSBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcERlcHMpO1xuXG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWcpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiYgZG9lc0NvbnRhaW5Kc09yVHMocm9vdENvbmZpZykpIHtcbiAgICAgICAgLy8gTW9ub3JlcG8gdmVyaWZpY2F0aW9uIGNhbiBpbnZva2Ugb3hsaW50IGZyb20gZXZlcnkgd29ya3NwYWNlLiBHaXZlXG4gICAgICAgIC8vIG5vbi1jb2RlIHBhY2thZ2VzIGEgbG9jYWwgY29uZmlnIHNvIG94bGludCBkb2VzIG5vdCBjbGltYiB0byB0aGVcbiAgICAgICAgLy8gcm9vdCBjb25maWcgYW5kIHJlamVjdCByb290LW9ubHkgdHlwZS1hd2FyZSBvcHRpb25zIGZyb20gYSBwYWNrYWdlIGN3ZC5cbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIC8vIFJ1biBhZnRlciBldmVyeSBwb29sZWQgZ2VuZXJhdG9yIHdyaXRlIHNvIG5vcm1hbGl6YXRpb24gY2Fubm90IG92ZXJ3cml0ZSBhIGNvbmN1cnJlbnRcbiAgICAvLyB1cGRhdGUsIGFuZCBiZWZvcmUgY2xlYW51cCBzbyBmb3JtYXR0ZXIgbWV0YWRhdGEgY2FjaGVzIG9ic2VydmUgdGhlIGNoYW5nZWQgZmlsZXMuXG4gICAgcmVub3JtYWxpemVUcmFja2VkVGV4dEZpbGVzKHJvb3REaXJQYXRoKTtcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICB0cnkge1xuICAgICAgcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBBIGZhaWxlZCBpbnN0YWxsIG11c3QgZmFpbCB0aGUgQ0xJOiBleGl0aW5nIDAgd2l0aCBhIHN0YWxlIG9yIG1pc3NpbmcgQnVuIGxvY2tmaWxlIHdvdWxkXG4gICAgICAvLyBoaWRlIGEgYnJva2VuIG1hbmFnZWQgY29uZmlndXJhdGlvbi5cbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZWZyZXNoIHRoZSBCdW4gbG9ja2ZpbGU6JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBlcnJvcik7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyBCdW4gd3JpdGVzIGJ1bi5sb2NrIGJlZm9yZSBsaWZlY3ljbGUgc2NyaXB0cywgc28gYSBmYWlsZWQgaW5zdGFsbCBjYW4gc3RpbGwgbGVhdmUgR3VhcmRcbiAgICAgIC8vIFVSTHMgYmVoaW5kLiBOb3JtYWxpemUgYm90aCBzdWNjZXNzIGFuZCBmYWlsdXJlIG91dHB1dCB3aXRob3V0IHJlcGxhY2luZyB0aGUgaW5zdGFsbCBlcnJvci5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRMb2NrZmlsZVBhdGggPSBub3JtYWxpemVCdW5Mb2NrZmlsZShyb290RGlyUGF0aCk7XG4gICAgICBpZiAobm9ybWFsaXplZExvY2tmaWxlUGF0aCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFJlbW92ZWQgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSAke25vcm1hbGl6ZWRMb2NrZmlsZVBhdGh9IHRvIGtlZXAgaXQgcmVnaXN0cnktYWdub3N0aWMuYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBub3JtYWxpemUgdGhlIEJ1biBsb2NrZmlsZTonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IGVycm9yKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKCdidW4nLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuICB9XG4gIHJldHVybiBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZztcbn1cblxuLyoqXG4gKiBQcm9iZXMgYGJ1biBpbnN0YWxsYCB1bmRlciB0aGUgaXNvbGF0ZWQgbGlua2VyLiBBbiBpbmNvbXBhdGliaWxpdHkgbXVzdCBiZSBmaXhlZCBpbiB0aGVcbiAqIHJlcG9zaXRvcnkgb3IgaW4gd2JmeSdzIG1hbmFnZWQgbGlzdHMsIG5ldmVyIGJ5IHN3aXRjaGluZyB0aGUgbGlua2VyLiBSZXR1cm5zIGZhbHNlIHdoZW4gdGhlXG4gKiBpbnN0YWxsIGZhaWxzLlxuICovXG5mdW5jdGlvbiBwcm9iZUlzb2xhdGVkQnVuSW5zdGFsbChcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcHJldmlvdXNHbG9iYWxTdG9yZTogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgdXNlR2xvYmFsU3RvcmU6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuICAvLyBBIGxheW91dCBzd2l0Y2ggbXVzdCBwcm9iZSBmcm9tIGEgY2xlYW4gdHJlZSBiZWNhdXNlIEJ1biBkb2VzIG5vdCByZW1vdmUgdGhlIHByZXZpb3VzIGxheW91dCdzIGxlZnRvdmVycy5cbiAgaWYgKHByZXZpb3VzR2xvYmFsU3RvcmUgIT09IHVzZUdsb2JhbFN0b3JlKSB7XG4gICAgcmVtb3ZlTm9kZU1vZHVsZXMocm9vdERpclBhdGgsIHJvb3RDb25maWcpO1xuICB9XG4gIC8vIFJldHJ5IG9uY2Ugc28gYSB0cmFuc2llbnQgZmFpbHVyZSAocmVnaXN0cnkgaGljY3VwLCBmbGFreSBsaWZlY3ljbGUgc2NyaXB0KSBkb2VzIG5vdFxuICAvLyBtYXNxdWVyYWRlIGFzIGEgbGF5b3V0IGluY29tcGF0aWJpbGl0eS5cbiAgaWYgKHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWydpbnN0YWxsJ10sIHJvb3REaXJQYXRoLCAxKSA9PT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgLy8gQ2xlYW4gdXAgdGhlIGZhaWxlZCBhdHRlbXB0IHNvIGxhdGVyIGluc3RhbGxzIGRvIG5vdCBydW4gb24gYSBwb2xsdXRlZCB0cmVlLlxuICByZW1vdmVOb2RlTW9kdWxlcyhyb290RGlyUGF0aCwgcm9vdENvbmZpZyk7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZU1vZHVsZXMocm9vdERpclBhdGg6IHN0cmluZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IHZvaWQge1xuICAvLyBDb3ZlciBldmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2U6IGxlZnRvdmVycyBjYW4ga2VlcCBwaGFudG9tIGRlcGVuZGVuY2llcyByZXNvbHZhYmxlLlxuICBjb25zdCBub2RlTW9kdWxlc1BhdGhzID0gW1xuICAgIHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycpLFxuICAgIC4uLlsuLi5nZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290Q29uZmlnKS52YWx1ZXMoKV0ubWFwKCh3b3Jrc3BhY2VEaXIpID0+XG4gICAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIHdvcmtzcGFjZURpciwgJ25vZGVfbW9kdWxlcycpXG4gICAgKSxcbiAgXTtcbiAgLy8gTmV2ZXIgZGVsZXRlIHRocm91Z2ggYSB3b3Jrc3BhY2Ugc3ltbGluayB0aGF0IGVzY2FwZXMgdGhpcyByZXBvc2l0b3J5LlxuICBjb25zdCByZWFsUm9vdERpclBhdGggPSBmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpO1xuICBmb3IgKGNvbnN0IG5vZGVNb2R1bGVzUGF0aCBvZiBub2RlTW9kdWxlc1BhdGhzKSB7XG4gICAgY29uc3QgcmVhbFBhcmVudERpclBhdGggPSBpZ25vcmVFcnJvcigoKSA9PiBmcy5yZWFscGF0aFN5bmMocGF0aC5kaXJuYW1lKG5vZGVNb2R1bGVzUGF0aCkpKTtcbiAgICBpZiAoXG4gICAgICAhcmVhbFBhcmVudERpclBhdGggfHxcbiAgICAgIChyZWFsUGFyZW50RGlyUGF0aCAhPT0gcmVhbFJvb3REaXJQYXRoICYmICFyZWFsUGFyZW50RGlyUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKSlcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmcy5ybVN5bmMobm9kZU1vZHVsZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAvLyB3YmZ5IHNob3VsZCB1cGRhdGUgb25seSB0aGUgcGFja2FnZXMgaXQgZXhwbGljaXRseSBtYW5hZ2VzIHRocm91Z2ggYnVuIGFkZC5cbiAgLy8gUnVubmluZyBidW4gdXBkYXRlIGhlcmUgcmVmcmVzaGVzIHVucmVsYXRlZCBhcHBsaWNhdGlvbiBkZXBlbmRlbmNpZXMgYW5kXG4gIC8vIGNhbiBjaGFuZ2UgcHJvZHVjdCBiZWhhdmlvciwgc28ga2VlcCB0aGUgZXhpc3RpbmcgbG9jayBhbmQgcmVjb25jaWxlIGl0LlxuICBjb25zdCBzdGF0dXMgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoJ2J1bicsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCwgMSk7XG4gIGlmIChzdGF0dXMgPT09IDApIHJldHVybjtcbiAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBCdW4gbG9ja2ZpbGU6IGJ1biBpbnN0YWxsIGV4aXRlZCB3aXRoIHN0YXR1cyAke3N0YXR1c31gKTtcbn1cblxuYXdhaXQgbWFpbigpO1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOls0NSw0Niw0Nyw0OCw0OSw1MF0sIm1hcHBpbmdzIjoiK3lCQVdBLE1BQWEsR0FBb0QsQ0FDL0QsQ0FDRSxRQUFTLE1BQ1QsWUFBYSxzR0FDZixFQUNBLENBQ0UsUUFBUyxlQUNULFlBQ0UsNmNBQ0osRUFDQSxDQUNFLFFBQVMsbUJBQ1QsWUFDRSw0R0FDSixFQUNBLENBQ0UsUUFBUyxvQkFDVCxZQUNFLHlLQUNKLEVBQ0EsQ0FDRSxRQUFTLFVBQ1QsWUFBYSwrREFDZixFQUNBLENBQ0UsUUFBUyxRQUNULFlBQWEsc0dBQ2YsQ0FDRixFQW9DYSxHQUFpRCxDQUM1RCxDQUFFLFFBQVMsVUFBVyxZQUFhLDhDQUErQyxFQUNsRixDQUFFLFFBQVMsV0FBWSxZQUFhLDZDQUE4QyxFQUNsRixDQUFFLFFBQVMsU0FBVSxZQUFhLHdDQUF5QyxFQUMzRSxDQUFFLFFBQVMsV0FBWSxZQUFhLHVEQUF3RCxDQUM5RixFQVFhLEdBQW9ELENBQy9ELENBQ0UsUUFBUyxzQkFDVCxZQUFhLHdFQUNmLEVBQ0EsQ0FDRSxRQUFTLFdBQ1QsWUFDRSxrTkFDSixFQUNBLENBQ0UsUUFBUyxzQkFDVCxZQUNFLHdHQUNKLEVBQ0EsQ0FDRSxRQUFTLHNCQUNULFlBQWEsbUdBQ2YsRUFDQSxDQUNFLFFBQVMscUJBQ1QsWUFDRSwwT0FDSixFQUNBLENBQ0UsUUFBUyw4QkFDVCxZQUFhLG1H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
|