@willbooster/wb 7.8.22 → 8.0.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 +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"node:path";import t from"yargs";import{hideBin as n}from"yargs/helpers";import r,{spawn as s,spawnSync as o}from"node:child_process";import{createHash as i}from"node:crypto";import a from"node:fs";import c from"chalk";import{globby as d}from"globby";import{config as l}from"dotenv";import u from"kill-port";import{PromisePool as p}from"minimal-promise-pool";import m from"tree-kill";import f from"node:fs/promises";import h from"node:os";function g(t,n){let r=(t.env??[]).map((t=>e.resolve(n,t.toString())));const s=t.cascadeEnv??(t.cascadeNodeEnv?process.env.NODE_ENV||"development":t.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof s){if(0===r.length&&(r.push(e.join(n,".env")),t.includeRootEnv)){const t=e.resolve(n,"..","..");a.existsSync(e.join(t,"package.json"))&&r.push(e.join(t,".env"))}r=r.flatMap((e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e]))}r=r.filter((e=>a.existsSync(e))).map((t=>e.relative(n,t))),t.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",r.join(", ")));const o={...process.env};let i={};for(const s of r){i={...y(e.join(n,s)),...i};let r=0;for(const[e,t]of Object.entries(i))o[e]!==t&&(o[e]=t,r++);t.verbose&&r>0&&console.info(`Loaded ${r} environment variables from ${s}`)}if(t.checkEnv){const s=Object.keys(y(e.join(n,t.checkEnv))||{}).filter((e=>!(e in i)));if(s.length>0)throw new Error(`Missing environment variables in [${r.join(", ")}]: [${s.join(", ")}]`)}return i}const w=new Map;function y(t){const n=w.get(t);if(n)return n;const r=l({path:e.resolve(t),processEnv:{}}).parsed??{};return w.set(t,r),r}async function b(e,t,n){return new Promise(((r,o)=>{try{const i=s(e,t??[],n??{});i.stdout?.setEncoding?.("utf8"),i.stderr?.setEncoding?.("utf8");let a="",c="";i.stdout?.on("data",(e=>{a+=e})),i.stderr?.on("data",(e=>{n?.mergeOutAndError?a+=e:c+=e}));let d=!1;const l=()=>{!d&&i.pid&&(d=!0,n?.verbose&&console.info(`treeKill(${i.pid})`),m(i.pid))};n?.killOnExit&&(process.on("beforeExit",l),process.on("SIGINT",l)),i.on("error",(e=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),i.removeAllListeners("close"),o(e)})),i.on("close",((e,t)=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),void 0===i.pid?o(new Error("Process has no pid.")):r({pid:i.pid,stdout:a,stderr:c,status:e,signal:t})})),n?.input&&(i.stdin?.write(n.input),i.stdin?.end())}catch(e){o(e)}}))}function v(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function $(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function k(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}let E;const A=function({cacheDuration:e=Number.POSITIVE_INFINITY,caches:t,calcKey:n=e=>function(e,t=0){const[n,r]=function(e,t=0){let n=3735928559^t,r=1103547991^t;for(let t,s=0;s<e.length;s++)t=e.codePointAt(s),n=Math.imul(n^t,2654435761),r=Math.imul(r^t,1597334677);return n=Math.imul(n^n>>>16,2246822507),n^=Math.imul(r^r>>>13,3266489909),r=Math.imul(r^r>>>16,2246822507),r^=Math.imul(n^n>>>13,3266489909),[r>>>0,n>>>0]}(e,t);return e.length.toString(36)+n.toString(36).padStart(7,"0")+r.toString(36).padStart(7,"0")}(JSON.stringify(e)),maxCachedArgsSize:r=100,maxCachedThisSize:s=10}={}){return function(o,i){if("getter"===i?.kind){const n=new Map;return t?.push(n),function(){const t=Date.now();if(n.has(this)){const[r,s]=n.get(this);if(t-s<=e)return r}const r=o.call(this);if(n.size>=s){const e=n.keys().next().value;n.delete(e)}return n.set(this,[r,t]),r}}{const a=new Map;return t?.push(a),function(...t){const c=n(t);let d=a.get(this);const l=Date.now();if(d){if(d.has(c)){const[t,n]=d.get(c);if(l-n<=e)return t}}else{if(d=new Map,a.size>=s){const e=a.keys().next().value;a.delete(e)}a.set(this,d)}const u=i?o.call(this,...t):o(...t);if(d.size>=r){const e=d.keys().next().value;d.delete(e)}return d.set(c,[u,l]),u}}}}({maxCachedThisSize:Number.MAX_SAFE_INTEGER,maxCachedArgsSize:1});class N{static{[E]=function(e,t,n,r,s){var o,i,a,c,d,l,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),m=Object.defineProperty,f=Object.create,h=[f(null),f(null)],g=t.length;function w(t,n,r){return function(s,o){n&&(o=s,s=e);for(var i=0;i<t.length;i++)o=t[i].apply(s,r?[o]:[]);return r?o:s}}function y(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function b(e,t,n,r,s,a,c,d,l,u,p){function f(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),b=t[3],v=!c,k=1===s,E=3===s,A=4===s,N=2===s;function x(t,n,r){return function(s,o){return n&&(o=s,s=e),r&&r(s),P[t].call(s,o)}}if(!v){var P={},j=[],S=E?"get":A||k?"set":"value";if(l?(u||k?P={get:$((function(){return b(this)}),r,"get"),set:function(e){t[4](this,e)}}:P[S]=b,u||$(P[S],r,N?"":S)):u||(P=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=h[+d][r])&&7!=(i^s))throw Error("Decorating two elements with the same name ("+P[S].name+") is not supported yet");h[+d][r]=s<3?1:s}}for(var R=e,D=g.length-1;D>=0;D-=n?2:1){var _=y(g[D],"A decorator","be",!0),O=n?g[D-1]:void 0,B={},T={kind:["field","accessor","method","getter","setter","class"][s],name:r,metadata:o,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");y(t,"An initializer","be",!0),a.push(t)}.bind(null,B)};if(v)i=_.call(O,R,T),B.v=1,y(i,"class decorators","return")&&(R=i);else if(T.static=d,T.private=l,i=T.access={has:l?p.bind():function(e){return r in e}},A||(i.get=l?N?function(e){return f(e),P.value}:x("get",0,f):function(e){return e[r]}),N||E||(i.set=l?x("set",0,f):function(e,t){e[r]=t}),R=_.call(O,k?{get:P.get,set:P.set}:P[S],T),B.v=1,k){if("object"==typeof R&&R)(i=y(R.get,"accessor.get"))&&(P.get=i),(i=y(R.set,"accessor.set"))&&(P.set=i),(i=y(R.init,"accessor.init"))&&j.unshift(i);else if(void 0!==R)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(R,(u?"field":"method")+" decorators","return")&&(u?j.unshift(R):P[S]=R)}return s<2&&c.push(w(j,d,1),w(a,d,0)),u||v||(l?k?c.splice(-1,0,x("get",d),x("set",d)):c.push(N?P[S]:y.call.bind(P[S])):m(e,r,P)),R}function E(e){return m(e,p,{configurable:!0,enumerable:!0,value:o})}return o=f(null==o?null:o),d=[],l=function(e){e&&d.push(w(e))},u=function(t,r){for(var o=0;o<n.length;o++){var i=n[o],l=i[1],u=7&l;if((8&l)==t&&!u==r){var p=i[2],m=!!i[3],f=16&l;b(t?e:e.prototype,i,f,m?"#"+p:k(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,m,r,t&&m?function(t){return v(t)===e}:s)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||E(e),{e:i,get c(){var n=[];return g&&[E(e=b(e,[t],r,e.name,5,n)),w(n,1)]}}}(this,[],[[A,3,"isBunAvailable"],[A,3,"buildCommand"],[A,3,"rootDirPath"],[A,3,"dockerfile"],[A,3,"hasDockerfile"],[A,3,"hasSourceCode"],[A,3,"name"],[A,3,"dockerImageName"],[A,3,"env"],[A,3,"packageJson"],[A,3,"packageJsonPath"],[A,3,"hasPrisma"],[A,3,"dockerPackageJson"],[A,3,"binExists"]]).e}argv=void E(this);pathByName=new Map;constructor(t,n,r){this._dirPath=e.resolve(t),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(a.readFileSync(e.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return a.existsSync(e.join(this.dirPath,"..","..","package.json"))?e.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return a.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return a.existsSync(e.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){return this.loadEnv?{...process.env,...g(this.argv,this.dirPath)}:process.env}get packageJson(){return JSON.parse(a.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return e.join(this.dirPath,"package.json")}get hasPrisma(){return!(!this.packageJson.dependencies?.prisma&&!this.packageJson.devDependencies?.prisma)}get dockerPackageJson(){return e.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(a.readFileSync(e.join(e.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let t=!1,n=this.dirPath;for(;;){const r=e.join(n,"node_modules",".bin");if(a.existsSync(r)&&(this.env.PATH=`${r}:${this.env.PATH}`,t=!0),a.existsSync(e.join(n,".git")))break;const s=e.dirname(n);if(n===s)break;n=s}return t}findFile(t){let n=this.pathByName.get(t);if(n)return n;if(n=[t,e.join("..","..",t)].map((t=>e.resolve(this.dirPath,t))).find((e=>a.existsSync(e))),!n)throw new Error(`File not found: ${t}`);return this.pathByName.set(t,n),n}}function x(t,n=!0,r){if(r??=process.cwd(),a.existsSync(e.join(r,"package.json")))return new N(r,t,n)}async function P(t,n=!0,r){const s=function(t,n=!0,r){if(r??=process.cwd(),!a.existsSync(e.join(r,"package.json")))return;const s=new N(r,t,n);let o=s;if(!s.packageJson.workspaces&&e.dirname(r).endsWith("/packages")){const s=e.resolve(r,"..","..");a.existsSync(e.join(s,"package.json"))&&(o=new N(s,t,n))}return{root:o,self:s}}(t,n,r);if(s)return{...s,descendants:s.root===s.self?await j(t,s.root,n):[s.self]}}async function j(t,n,r){const s=[n],o=n.packageJson.workspaces;if(!Array.isArray(o))return s;const i=[],c=[];for(const t of o.map((t=>e.join(n.dirPath,t))))a.existsSync(t)?c.push(t):i.push(t);c.push(...await d(i,{dot:!0,onlyDirectories:!0}));for(const n of c)a.existsSync(e.join(n,"package.json"))&&s.push(new N(n,t,r));return s}const S=process.argv[0].endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),R=S?"bun --bun run":"node",D=S?"bun":"yarn",_=S?"bun --bun run":"yarn",O={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(t){await async function(t,n){const s=await x(t,!0,n);if(!s)return console.error(c.red("No project found.")),!0;if(!a.existsSync(e.join(s.rootDirPath,".git")))return B(s,t),!0;const[o,d,l]=await async function(t,n){const s=e.resolve(t.dirPath,"node_modules",".cache","build"),o=e.resolve(s,"last-build");await a.promises.mkdir(s,{recursive:!0});const c=i("sha256"),d=r.execSync("git rev-parse HEAD",{cwd:t.dirPath}).toString().trim();c.update(d);const l=JSON.stringify(Object.entries(t.env).filter((([e])=>!T.has(e))).sort((([e],[t])=>e.localeCompare(t))));c.update(l),await async function(e,t,n){return new Promise((s=>{const o=r.spawnSync("git",["diff","--name-only"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").map((t=>"test"===e.env.WB_ENV?t.replace(/packages\/scripts\/test-fixtures\/[^/]+\//,""):t)).filter((e=>(I.some((t=>e.includes(t)))||C.some((t=>e.endsWith(t))))&&!W.some((t=>e.includes(t)))));t.verbose&&console.info(`Changed files: ${o.join(", ")}`);const i=r.spawn("git",["diff","--",...o],{cwd:e.rootDirPath});i.stdout?.on("data",(e=>{n.update(e),t.verbose&&(console.info(e.toString()),console.info("Hash:",n.copy().digest("hex")))})),i.on("close",(()=>{s()}))}))}(t,n,c);const u=c.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}((()=>a.promises.readFile(o,"utf8")));return[p===u,o,u]}(s,t);if(o)return console.info(c.green(`Skip to run '${t.command}' 💫`)),!1;if(!B(s,t))return;t.dryRun||await a.promises.writeFile(d,l,"utf8");return!0}(t)}};function B(e,t){if(t={...t,command:t.command??(S?"bun run build":"yarn build")},console.info(c.green(`Run '${t.command}'`)),!t.dryRun){const n=r.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const T=new Set(["CI","PWDEBUG","TMPDIR"]);const I=["src/","public/"],C=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],W=["test/","tests/","__tests__/","test-fixtures/"];const V=new Set;async function z(e){try{await u(e)}catch{}}const J=new p,F={exitIfFailed:!0};async function Y(e,t,n,r=F){const[s,o]=U(e,t);if(L(s,t),n.verbose&&L(o,t,"Start (raw)",!0),n.dryRun)return G(s,0,r),0;const i=o.match(/http-get:\/\/127.0.0.1:(\d+)/)?.[1];o.includes("wait-on")&&i&&!o.includes("docker run")&&await async function(e){await z(e);const t=async()=>{V.has(e)||(V.add(e),await z(e))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,t)}(Number(i));const a=await b(o,void 0,{cwd:t.dirPath,env:q(t.env,r),shell:!0,stdio:"inherit",timeout:r?.timeout,killOnExit:!0,verbose:n.verbose});return G(s,a.status,r),a.status??1}function M(e,t,n,r=F){return J.runAndWaitForReturnValue((async()=>{const[s,o]=U(e,t);if(L(s,t,"Start (parallel)",!0),n.dryRun)return L(s,t,"Started (log)"),n.verbose&&L(o,t,"Started (raw)",!0),G(s,0,r),0;const i=await b(o,void 0,{cwd:t.dirPath,env:q(t.env,r),shell:!0,stdio:"pipe",timeout:r?.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});L(s,t,"Started (log)"),n.verbose&&L(o,t,"Started (raw)",!0);const a=i.stdout.trim();return a&&(process.stdout.write(a),process.stdout.write("\n")),G(s,i.status,r),i.status??1}))}function U(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",t.isBunAvailable?"bun --bun run ":"yarn run ");return S&&(n=n.replaceAll("YARN build-ts run","bun --bun run").replaceAll("bun --bun run bun --bun run","bun --bun run").replaceAll("dist/index.js","src/index.ts").replaceAll(/(?:YARN )?vitest run/g,"bun test").replaceAll(/ --color --passWithNoTests(?: --allowOnly)?/g,"")),n=n.trim(),[H(n.replaceAll("YARN ",`${_} `)),H(n.replaceAll("YARN playwright ",`${_} playwright `).replaceAll("YARN ",!S&&t.binExists?"":`${_} `))]}function L(e,t,n="Start",r=!1){console.info("\n"+(r?c.gray:c.cyan)(c.bold(`${n}:`),e)+c.gray(` at ${t.dirPath}`))}function G(e,t,n){0===t?console.info(c.green(c.bold("Finished:"),e)):(console.info(c.red(c.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function q(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function H(e){return e.includes("next dev")||e.includes("pm2-runtime")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const X=new Set(["cjs","cts","js","json","jsonc","jsx","mjs","mts","ts","tsx"]),K=new Set(["cjs","cts","htm","html","js","json","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),Q=new Set([...K].filter((e=>!X.has(e)))),Z={command:"lint [files...]",describe:"Lint code on Bun",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"}},async handler(t){S||(console.error(c.red("This command is only available on Bun.")),process.exit(1));const n=await P(t,!1);n||(console.error(c.red("No project found.")),process.exit(1));const r=t.files??[];let s,o,i;if(r.length>0){const t=[],n=[],a=[];for(const s of r){const r=e.resolve(String(s));if(r.endsWith("/test-fixtures")||r.includes("/test-fixtures/"))continue;const o=e.extname(r).slice(1);r.endsWith("/package.json")?a.push(r):X.has(o)?t.push(r):K.has(o)&&n.push(r)}s=t.map((e=>`"${e}"`)).join(" "),o=n.map((e=>`"${e}"`)).join(" "),i=a.map((e=>`"${e}"`)).join(" ")}else s="",o=`"**/{.*/,}*.{${[...Q].join(",")}" "!**/test-fixtures/**"`,i=n.descendants.map((e=>`"${e.packageJsonPath}"`)).join(" ");const a=t.fix&&t.format?"check --fix":t.fix?"lint --fix":"lint";let d;(s||0===r.length)&&(d=M(`bun --bun biome ${a} --colors=force --no-errors-on-unmatched --files-ignore-unknown=true ${s}`,n.self,t,{forceColor:!0})),t.format&&(o&&M(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${o}`,n.self,t,{forceColor:!0}),i&&(await d,M(`bun --bun sort-package-json ${i}`,n.self,t,{forceColor:!0})))}};function*ee(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const te={command:"optimizeForDockerBuild",describe:"Optimize configuration when building a Docker image",builder:{outside:{description:"Whether the optimization is executed outside a docker container or not",type:"boolean",alias:"o"}},async handler(t){const n=await P(t);n||(console.error(c.red("No project found.")),process.exit(1));for(const r of ee("optimizeForDockerBuild",n.descendants)){const n=r.packageJson,s=["dependencies","devDependencies"];for(const e of s){const t=n[e]||{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(ne(t,n),re(n),se(n),t.dryRun)continue;const o=t.outside?e.join(r.dirPath,"dist"):r.dirPath;await a.promises.mkdir(o,{recursive:!0}),await a.promises.writeFile(e.join(o,"package.json"),JSON.stringify(n),"utf8")}t.dryRun||t.outside||(r.spawnSync(D,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function ne(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies||{},r=["artillery","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","sort-package-json","wait-on","semantic-release","vitest"],s=[];for(const t of Object.keys(n))(r.some((e=>t.includes(e)))||!e.outside&&t.includes("willbooster")&&t.includes("config"))&&(delete n[t],s.push(t));console.info("Removed devDependencies:",s.join(", ")||"none")}function re(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts||{},s=[];for(const[e,o]of Object.entries(r))(t.some((t=>e.includes(t)))||n.some((e=>o.includes(e)||o.trim()===e.trim())))&&(delete r[e],s.push(e));console.info("Removed scripts:",s.join(", ")||"none")}function se(e){delete e.private,delete e.publishConfig,delete e.prettier}const oe=new class{deploy(e){return"PRISMA migrate deploy"}deployForce(e,t){const n=e.packageJson.dependencies?.blitz?"db":"prisma";return`rm -Rf ${n}/mount/prod.sqlite3*; PRISMA migrate reset --force && rm -Rf ${n}/mount/prod.sqlite3*\n && litestream restore -o ${n}/mount/prod.sqlite3 ${t} && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}litestream(e){return`${R} -e '\nconst { PrismaClient } = require("@prisma/client");\nnew PrismaClient().$queryRaw\`PRAGMA journal_mode = WAL;\`\n .catch((error) => { console.log("Failed due to:", error); process.exit(1); });\n'`}migrate(e){return`PRISMA migrate deploy && PRISMA generate && ${this.seed(e)}`}migrateDev(e){return"PRISMA migrate dev"}reset(e){return`PRISMA migrate reset --force --skip-seed && ${this.seed(e)}`}restore(e,t,n){return`rm -Rf ${e.packageJson.dependencies?.blitz?"db":"prisma"}/restored.sqlite3; GOOGLE_APPLICATION_CREDENTIALS=gcp-sa-key.json litestream restore -o ${n} ${t}`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?"BUN build-ts run prisma/seeds.ts":e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(t,n){let r="";if(n)try{new URL(n),r=`DATABASE_URL=${n} `}catch{const t=e.resolve(n);console.info(n,t),r=`DATABASE_URL=file://${t} `}return`${r}PRISMA studio`}},ie={},ae={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(ce).command(le).command(ue).command(pe).command(me).command(fe).command(he).command(ge).command(we).command(ye).demandCommand(),handler(){}},ce={command:"deploy",describe:"Apply migration to DB without initializing it",builder:ie,async handler(e){const t=await be(e);for(const n of ee("prisma deploy",t))await Y(oe.deploy(n),n,e)}},de={...ie,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},le={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:de,async handler(e){const t=await be(e);for(const n of ee("prisma deploy-force",t))await Y(oe.deployForce(n,e.backupPath),n,e)}},ue={command:"litestream",describe:"Setup DB for Litestream",builder:ie,async handler(e){const t=await be(e);for(const n of ee("prisma litestream",t))await Y(oe.litestream(n),n,e)}},pe={command:"migrate",describe:"Apply migration to DB with initializing it",builder:ie,async handler(e){const t=await be(e);for(const n of ee("prisma migrate",t))await Y(oe.migrate(n),n,e)}},me={command:"migrate-dev",describe:"Create a migration file",builder:ie,async handler(e){const t=await be(e);for(const n of ee("prisma migrate-dev",t))await Y(oe.migrateDev(n),n,e)}},fe={command:"reset",describe:"Reset DB",builder:ie,async handler(e){const t=await be(e);for(const n of ee("prisma reset",t))await Y(oe.reset(n),n,e)}},he={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...de,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await be(e);for(const n of ee("prisma restore",t)){const t=e.output||(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await Y(oe.restore(n,e.backupPath,t),n,e)}}},ge={command:"seed",describe:"Populate DB with seed data",builder:{...ie,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await be(e);for(const n of ee("prisma seed",t))await Y(oe.seed(n,e.file),n,e)}},we={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...ie,"db-url-or-path":{description:"URL or path to the database",type:"string"},restored:{description:"Whether to open the default restored database (<db|prisma>/restored.sqlite3).",type:"boolean"}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw new Error("You cannot specify both --restored and --db-url-or-path.");const t=await be(e);for(const n of ee("prisma studio",t)){const t=e.restored?n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await Y(oe.studio(n,t),n,e)}}},ye={command:"$0 [args..]",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await be(e),n=`${e.args?.join(" ")??""}`.trimEnd();for(const r of ee(`prisma ${n}`,t))await Y(`PRISMA ${n}`,r,e)}};async function be(e){const t=await P(e);t||(console.error(c.red("No project found.")),process.exit(1));const n=t.descendants.filter((e=>e.packageJson.dependencies?.prisma||e.packageJson.devDependencies?.prisma));return 0===n.length&&(console.error(c.red("No prisma project found.")),process.exit(1)),n}const ve={command:"retry [command] [args...]",describe:"Retry the given command until it succeeds",builder:{retry:{description:"A maximum retry count",type:"number",alias:"r",default:3}},async handler(e){const t=x(e);t||(console.error(c.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let s=0;s<e.retry;s++)if(s>0&&console.info(`\n${c.yellow(`#${s} Retrying: ${n.join(" ")}`)}`),r=await Y(n.join(" "),t,e,{exitIfFailed:!1}),0===r)return;process.exit(r)}},$e=["express","fastify","elysia"],ke={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await P(e,!1,t);n||(console.error(c.red("No project found.")),process.exit(1));for(const t of ee("setup",n.descendants)){const s=await f.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===h.platform()){const n=["pstree"];t.hasDockerfile&&n.push("expect"),await M(`brew install ${n.join(" ")}`,t,e)}s.some((e=>e.isFile()&&e.name.includes("-version")))&&await Y("asdf install",t,e)}if(s.some((e=>e.isFile()&&"pyproject.toml"===e.name))){await M("poetry config virtualenvs.in-project true",t,e),await M("poetry config virtualenvs.prefer-active-python true",t,e);const[,n]=r.execSync("asdf current python").toString().trim().split(/\s+/);await M(`poetry env use ${n}`,t,e),await J.promiseAll(),await Y("poetry run pip install --upgrade pip",t,e),await Y("poetry install --ansi",t,e)}const o=t.packageJson.dependencies??{},i=t.packageJson.devDependencies||{},a=t.packageJson.scripts??{},c=[];let d=[];o.blitz||o.next||i["@remix-run/dev"]?(c.push("pm2"),d.push("concurrently","open-cli","vitest","wait-on")):$e.some((e=>o[e]))&&(c.push("pm2"),d.push("concurrently","vitest","wait-on")),S&&(d=d.filter((e=>"vitest"!==e))),c.length>0&&await Y(`${D} add ${c.join(" ")}`,t,e),d.length>0&&await Y(`${D} add -D ${d.join(" ")}`,t,e),a["gen-code"]&&await Y(`${_} gen-code`,t,e)}}(e)}};const Ee=new class{buildDevImage(t,n){const r=t.dockerPackageJson.scripts?.["docker/build/prepare"]?"yarn run docker/build/prepare && ":"";return`cd ${e.dirname(t.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${t.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo amd64)\n --build-arg WB_ENV=${t.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t=!1,n="",r=""){return`${this.stop(e)} && ${t?"unbuffer ":""}${this.start(e,n,r)}`}start(e,t="",n=""){return function(e,t){const n=async()=>{if(V.has(e))return;V.add(e),L(e,t);const{status:n}=o(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});G(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e),`docker run --rm -it -p 8080:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class Ae{constructor(e=Number(process.env.PORT)||3e3){this.defaultPort=e}buildDocker(e,t="development"){return Ee.buildDevImage(e,t)}startDocker(e,t){return`${this.buildDocker(e)}\n && YARN concurrently --raw --kill-others-on-fail\n "${Ee.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e,t,8080)}"`}testE2E(e,t,{playwrightArgs:n="test tests/e2e",prismaDirectory:r,startCommand:s}){const o=e.env.WB_ENV,i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`WB_ENV=${o} NEXT_PUBLIC_WB_ENV=${o} APP_ENV=${o} PORT=8080 YARN concurrently --kill-others --raw --success first\n "rm -Rf ${r}/mount && ${s} && exit 1"\n "concurrently --kill-others-on-fail --raw 'wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${"test tests/e2e"===n&&t.target?n.replace("tests/e2e",t.target):n}${i}"`}testE2EDev(e,t,{playwrightArgs:n="test tests/e2e",startCommand:r}){const s=e.env.WB_ENV,o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`WB_ENV=${s} NEXT_PUBLIC_WB_ENV=${s} APP_ENV=${s} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${r} && exit 1"\n "concurrently --kill-others-on-fail --raw 'wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${"test tests/e2e"===n&&t.target?n.replace("tests/e2e",t.target):n}${o}"`}testUnit(e,t){return`WB_ENV=${e.env.WB_ENV} YARN vitest run ${t.target||"tests/unit"} --color --passWithNoTests --allowOnly`}waitApp(e,t,n=this.defaultPort){return`wait-on -t 10000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${n}`}waitAndOpenApp(e,t,n=this.defaultPort){return`${this.waitApp(e,t,n)} || wait-on http-get://127.0.0.1:${n} && open-cli http://\${HOST:-localhost}:${n}`}}const Ne=new class extends Ae{constructor(){super()}start(e,t){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}YARN concurrently --raw --kill-others-on-fail\n "blitz dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${oe.reset(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:r=`${oe.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"db",startCommand:r})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r="blitz dev -p 8080"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r})}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "blitz dev" "${this.waitApp(e,t)}"`}};const xe=new class extends Ae{constructor(){super()}start(e,t){return`YARN build-ts run src/index.ts ${t.watch?"--watch":""} -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${Ee.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production PORT=\${PORT:-${n}} ${R} dist/index.js ${t.normalizedArgsText??""}`}testE2E(e,t,{startCommand:n=`${e.hasPrisma?"prisma migrate reset --force --skip-generate && ":""}(${this.startProduction(e,t)})`}){const r=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly${r}"`}testE2EDev(e,t,{startCommand:n}){const r=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n||this.start(e,t)} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly${r}"`}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "${this.start(e,t)}" "${this.waitApp(e,t)}"`}};const Pe=new class extends Ae{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "next dev --turbo ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?[oe.reset(e)]:[],e.buildCommand,`PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...e.hasPrisma?[oe.reset(e)]:[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].join(" && ")})}testE2EDev(e,t,{startCommand:n="next dev --turbo -p 8080"}){return super.testE2EDev(e,t,{startCommand:n})}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "next dev --turbo" "${this.waitApp(e,t)}"`}};const je=new class extends Ae{constructor(){super()}start(e,t){return`YARN build-ts run src/index.ts ${t.watch?"--watch":""} -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${Ee.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${R} dist/index.js ${t.normalizedArgsText??""}`}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return"echo 'do nothing.'"}};const Se=new class extends Ae{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "remix dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${oe.reset(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:r=`${oe.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"prisma",startCommand:r})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r="remix dev"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r})}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "remix dev" "${this.waitApp(e,t)}"`}},Re={command:"start [args..]",describe:"Start app",builder:{watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug",type:"string",alias:"m"}},async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[]].map((e=>`'${e}'`)).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map((e=>`'${e}'`)).join(" ")}(e);const t=await P(e);t||(console.error(c.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies||{},r=n.packageJson.devDependencies||{};let s;if(t.blitz)s=Ne;else if(t.next)s=Pe;else if(r["@remix-run/dev"])s=Se;else if($e.some((e=>t[e]))&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))s=xe;else{if(!t["build-ts"]&&!r["build-ts"])continue;s=je}switch(console.info(`Running "start" for ${n.name} ...`),e.mode||"dev"){case"dev":case"development":{const r=De(t,"development");await Y(`${r}${s.start(n,e)}`,n,e);break}case"staging":{const r=De(t,"staging");await Y(`${r}${s.startProduction(n,e,8080)}`,n,e);break}case"docker":{const r=De(t,"staging");await Y(`${r}${s.startDocker(n,e)}`,n,e);break}case"docker-debug":{const r=De(t,"staging");e.normalizedArgsText="'/bin/bash'",await Y(`${r}${s.startDocker(n,e)}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function De(e,t){process.env.WB_ENV||=t;let n=`WB_ENV=${process.env.WB_ENV} `;return e.next&&(process.env.NEXT_PUBLIC_WB_ENV=process.env.WB_ENV,n+=`NEXT_PUBLIC_WB_ENV=${process.env.WB_ENV} `),n}const _e={command:"test",describe:"Test project. If you pass no arguments, it will run all tests.",builder:{ci:{description:"Whether to run tests on CI",type:"boolean"},e2e:{description:"Whether to run e2e tests. You may pass mode as argument: none | headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string"},start:{description:"Whether to run start tests",type:"boolean"},unit:{description:"Whether to run unit tests",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"},target:{description:"Test target",type:"string",alias:"t"}},async handler(t){await async function(t){const n=await P(t);n||(console.error(c.red("No project found.")),process.exit(1));n.descendants.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const r=void 0===t.e2e&&void 0===t.start&&void 0===t.unit;for(const s of n.descendants){const n=s.packageJson.dependencies||{},o=s.packageJson.devDependencies||{};let i;i=n.blitz?Ne:n.next?Pe:o["@remix-run/dev"]?Se:$e.some((e=>n[e]))&&!n["firebase-functions"]?xe:je,r&&(t={...t,e2e:a.existsSync(e.join(s.dirPath,"tests","e2e"))&&!t.target?.includes("/unit/")?"headless":"none",start:!0,unit:a.existsSync(e.join(s.dirPath,"tests","unit"))&&!t.target?.includes("/e2e/")}),console.info(`Running "test" for ${s.name} ...`);const c=[];if(!t.ci){switch(t.unit&&c.push(Y(i.testUnit(s,t),s,t,{timeout:t.unitTimeout})),t.start&&c.push(Y(i.testStart(s,t),s,t)),await Promise.all(c),t.e2e){case void 0:case"none":continue;case"":case"headless":await Y(i.testE2E(s,t,{}),s,t);continue;case"headless-dev":await Y(i.testE2EDev(s,t,{}),s,t);continue;case"docker":await Oe(s,t,i);continue;case"docker-debug":await Oe(s,t,i,`test ${t.target||"tests/e2e"} --debug`);continue}if(n.blitz||n.next||o["@remix-run/dev"])switch(t.e2e){case"headed":await Y(i.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"headed-dev":await Y(i.testE2EDev(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"debug":await Y(i.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --debug`}),s,t);continue;case"generate":await Y(i.testE2E(s,t,{playwrightArgs:"codegen http://localhost:8080"}),s,t);continue;case"trace":await Y("BUN playwright show-trace",s,t);continue}throw new Error(`Unknown e2e mode: ${t.e2e}`)}if(await M(Ee.stopAll(),s,t),t.unit&&await M(i.testUnit(s,t).replaceAll(" --allowOnly",""),s,t,{timeout:t.unitTimeout}),t.start&&await M(i.testStart(s,t),s,t),await J.promiseAll(),"none"!==t.e2e){s.hasDockerfile&&await Y(`${i.buildDocker(s,"test")}`,s,t);const e=s.hasDockerfile?{startCommand:Ee.stopAndStart(s,!0)}:{};process.exitCode=await Y(i.testE2E(s,t,e).replaceAll(" --allowOnly",""),s,t,{exitIfFailed:!1}),await Y(Ee.stop(s),s,t)}}}(t)}};async function Oe(e,t,n,r){await Y(`${n.buildDocker(e,"test")}`,e,t),process.exitCode=await Y(`${n.testE2E(e,t,{playwrightArgs:r,startCommand:Ee.stopAndStart(e,!0)})}`,e,t,{exitIfFailed:!1}),await Y(Ee.stop(e),e,t)}const Be={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(e){const t=await P(e,!1);t||(console.error(c.red("No project found.")),process.exit(1));const n=t.descendants.map((n=>{const r=[];if(n.packageJson.workspaces?n.hasSourceCode&&(n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&r.push("BUN tsc --noEmit --Pretty"):((n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&r.push("BUN tsc --noEmit --Pretty"),n.packageJson.devDependencies?.pyright&&r.push("YARN pyright")),r.length>0)return M(r.join(" && "),n,e,{ci:t.descendants.length>1,forceColor:!0})})),r=await Promise.all(n);let s=0;for(const[e,n]of r.entries())if(n){(t.descendants[e].packageJson.dependencies||{}).blitz&&console.info(c.yellow('Please try "yarn gen-code" if you face unknown type errors.')),s=n}s&&process.exit(s)}},Te={...Be,command:"tc"},Ie={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"},"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}};await t(n(process.argv)).scriptName("wb").options(Ie).middleware((t=>{const n=t["working-dir"];if(n){const t=e.resolve(n);process.chdir(t)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)})).command(O).command(Z).command(te).command(ae).command(ve).command(ke).command(Re).command(_e).command(Be).command(Te).demandCommand().strict().help().argv;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,(()=>process.exit()));
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9tZW1vaXplLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9oYXNoLmpzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvc2NyaXB0cy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGN3ZDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLmZpbHRlcigoZW52UGF0aCkgPT4gZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlbGF0aXZlKGN3ZCwgZW52UGF0aCkpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cHJvY2Vzcy5lbnYuV0JfRU5WfSwgTk9ERV9FTlY6ICR7cHJvY2Vzcy5lbnYuTk9ERV9FTlZ9YCk7XG4gICAgY29uc29sZS5pbmZvKCdSZWFkaW5nIGVudiBmaWxlczonLCBlbnZQYXRocy5qb2luKCcsICcpKTtcbiAgfVxuXG4gIGNvbnN0IG9yZ0VudlZhcnMgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIGxldCBsb2FkZWRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGxvYWRlZEVudlZhcnMgPSB7IC4uLnJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSwgLi4ubG9hZGVkRW52VmFycyB9O1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobG9hZGVkRW52VmFycykpIHtcbiAgICAgIGlmIChvcmdFbnZWYXJzW2tleV0gIT09IHZhbHVlKSB7XG4gICAgICAgIG9yZ0VudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYXJndi52ZXJib3NlICYmIGNvdW50ID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBMb2FkZWQgJHtjb3VudH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhcmd2LmNoZWNrRW52KSB7XG4gICAgY29uc3QgZXhhbXBsZUtleXMgPSBPYmplY3Qua2V5cyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBhcmd2LmNoZWNrRW52KSkgfHwge30pO1xuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gZXhhbXBsZUtleXMuZmlsdGVyKChrZXkpID0+ICEoa2V5IGluIGxvYWRlZEVudlZhcnMpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbG9hZGVkRW52VmFycztcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzIGFuZCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBlbnZWYXJzID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIE9iamVjdC5hc3NpZ24ocHJvY2Vzcy5lbnYsIGVudlZhcnMpO1xuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHJlZUtpbGwgZnJvbSAndHJlZS1raWxsJztcblxuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgdmVyYm9zZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Bc3luYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+LFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICBwcm9jLnN0ZG91dD8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZUZhY3RvcnkgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuY29uc3QgbWVtb2l6ZSA9IG1lbW9pemVGYWN0b3J5KHsgbWF4Q2FjaGVkVGhpc1NpemU6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCBtYXhDYWNoZWRBcmdzU2l6ZTogMSB9KTtcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKF58XFxuKWJ1blxccy8udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ1lBUk4gcnVuIGJ1aWxkJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkXG4gICAgICAgID8gYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gXG4gICAgICAgIDogXCJlY2hvICdObyBidWlsZCBzY3JpcHQnXCI7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBPdmVyd3JpdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGV2ZW4gdGhvdWdoIHRoaXMgYmVoYXZpb3IgaXMgbm9uLXN0YW5kYXJkXG4gICAgLy8gYmVjYXVzZSBgYnVuIHdiIC4uLmAgd2lsbCBsb2FkIC5lbnYgYW5kIC5lbnYubG9jYWwgYmVmb3JlIGB3YmAgbG9hZHMgb3RoZXIgdmFyaWFibGVzLlxuICAgIHJldHVybiB0aGlzLmxvYWRFbnYgPyB7IC4uLnByb2Nlc3MuZW52LCAuLi5yZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpIH0gOiBwcm9jZXNzLmVudjtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsncHJpc21hJ10gfHwgdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LlsncHJpc21hJ10pO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKTtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGJpbkZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5kaXJQYXRoO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgICAgdGhpcy5lbnYuUEFUSCA9IGAke2JpblBhdGh9OiR7dGhpcy5lbnYuUEFUSH1gO1xuICAgICAgICBiaW5Gb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJpbkZvdW5kO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiaW1wb3J0e2N5cmI2NEhhc2hXaXRoTGVuZ3RoIGFzIGV9ZnJvbVwiLi9oYXNoLmpzXCI7Y29uc3QgdD1zKCk7ZnVuY3Rpb24gcyh7Y2FjaGVEdXJhdGlvbjp0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxjYWNoZXM6cyxjYWxjS2V5Om49KHQ9PmUoSlNPTi5zdHJpbmdpZnkodCkpKSxtYXhDYWNoZWRBcmdzU2l6ZTppPTEwMCxtYXhDYWNoZWRUaGlzU2l6ZTpjPTEwfT17fSl7cmV0dXJuIGZ1bmN0aW9uKGUsbyl7aWYoXCJnZXR0ZXJcIj09PW8/LmtpbmQpe2NvbnN0IG49bmV3IE1hcDtyZXR1cm4gcz8ucHVzaChuKSxmdW5jdGlvbigpe2NvbnN0IHM9RGF0ZS5ub3coKTtpZihuLmhhcyh0aGlzKSl7Y29uc3RbZSxpXT1uLmdldCh0aGlzKTtpZihzLWk8PXQpcmV0dXJuIGV9Y29uc3QgaT1lLmNhbGwodGhpcyk7aWYobi5zaXplPj1jKXtjb25zdCBlPW4ua2V5cygpLm5leHQoKS52YWx1ZTtuLmRlbGV0ZShlKX1yZXR1cm4gbi5zZXQodGhpcyxbaSxzXSksaX19e2NvbnN0IHI9bmV3IE1hcDtyZXR1cm4gcz8ucHVzaChyKSxmdW5jdGlvbiguLi5zKXtjb25zdCBhPW4ocyk7bGV0IGg9ci5nZXQodGhpcyk7Y29uc3QgdT1EYXRlLm5vdygpO2lmKGgpe2lmKGguaGFzKGEpKXtjb25zdFtlLHNdPWguZ2V0KGEpO2lmKHUtczw9dClyZXR1cm4gZX19ZWxzZXtpZihoPW5ldyBNYXAsci5zaXplPj1jKXtjb25zdCBlPXIua2V5cygpLm5leHQoKS52YWx1ZTtyLmRlbGV0ZShlKX1yLnNldCh0aGlzLGgpfWNvbnN0IGY9bz9lLmNhbGwodGhpcywuLi5zKTplKC4uLnMpO2lmKGguc2l6ZT49aSl7Y29uc3QgZT1oLmtleXMoKS5uZXh0KCkudmFsdWU7aC5kZWxldGUoZSl9cmV0dXJuIGguc2V0KGEsW2YsdV0pLGZ9fX19ZXhwb3J0e3QgYXMgbWVtb2l6ZSxzIGFzIG1lbW9pemVGYWN0b3J5fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9pemUuanMubWFwXG4iLCJmdW5jdGlvbiB0KHQsbj0wKXtjb25zdFtpLHJdPWZ1bmN0aW9uKHQsbj0wKXtsZXQgaT0zNzM1OTI4NTU5Xm4scj0xMTAzNTQ3OTkxXm47Zm9yKGxldCBuLGE9MDthPHQubGVuZ3RoO2ErKyluPXQuY29kZVBvaW50QXQoYSksaT1NYXRoLmltdWwoaV5uLDI2NTQ0MzU3NjEpLHI9TWF0aC5pbXVsKHJebiwxNTk3MzM0Njc3KTtyZXR1cm4gaT1NYXRoLmltdWwoaV5pPj4+MTYsMjI0NjgyMjUwNyksaV49TWF0aC5pbXVsKHJecj4+PjEzLDMyNjY0ODk5MDkpLHI9TWF0aC5pbXVsKHJecj4+PjE2LDIyNDY4MjI1MDcpLHJePU1hdGguaW11bChpXmk+Pj4xMywzMjY2NDg5OTA5KSxbcj4+PjAsaT4+PjBdfSh0LG4pO3JldHVybiB0Lmxlbmd0aC50b1N0cmluZygzNikraS50b1N0cmluZygzNikucGFkU3RhcnQoNyxcIjBcIikrci50b1N0cmluZygzNikucGFkU3RhcnQoNyxcIjBcIil9ZXhwb3J0e3QgYXMgY3lyYjY0SGFzaFdpdGhMZW5ndGh9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXBcbiIsImV4cG9ydCBjb25zdCBpc1J1bm5pbmdPbkJ1biA9IHByb2Nlc3MuYXJndlswXS5lbmRzV2l0aCgnL2J1bicpIHx8IHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uZW5kc1dpdGgoJy9idW4nKTtcblxuZXhwb3J0IGNvbnN0IHJ1bnRpbWVXaXRoQXJncyA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ25vZGUnO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuJyA6ICd5YXJuJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICd5YXJuJztcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IEhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSWZOZWVkZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2J1aWxkSWZOZWVkZWQnLFxuICBkZXNjcmliZTogJ0J1aWxkIGNvZGUgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBidWlsZElmTmVlZGVkKGFyZ3YpO1xuICB9LFxufTtcblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBhcmd2LmNvbW1hbmQgPz8gKGlzUnVubmluZ09uQnVuID8gJ2J1biBydW4gYnVpbGQnIDogJ3lhcm4gYnVpbGQnKSB9O1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSWZOZWVkZWQoXG4gIC8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGF3YWl0IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAuc29ydCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSlcbiAgKTtcbiAgaGFzaC51cGRhdGUoZW52aXJvbm1lbnRKc29uKTtcblxuICBhd2FpdCB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQocHJvamVjdCwgYXJndiwgaGFzaCk7XG4gIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaC5kaWdlc3QoJ2hleCcpO1xuXG4gIGNvbnN0IGNhY2hlZENvbnRlbnRIYXNoID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIHJldHVybiBbY2FjaGVkQ29udGVudEhhc2ggPT09IGNvbnRlbnRIYXNoLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG59XG5cbmNvbnN0IGluY2x1ZGVQYXR0ZXJucyA9IFsnc3JjLycsICdwdWJsaWMvJ107XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG5dO1xuY29uc3QgZXhjbHVkZVBhdHRlcm5zID0gWyd0ZXN0LycsICd0ZXN0cy8nLCAnX190ZXN0c19fLycsICd0ZXN0LWZpeHR1cmVzLyddO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydkaWZmJywgJy0tbmFtZS1vbmx5J10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGZpbGVQYXRocyA9IHJldC5zdGRvdXRcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0JyA/IGZpbGVQYXRoLnJlcGxhY2UoL3BhY2thZ2VzXFwvc2NyaXB0c1xcL3Rlc3QtZml4dHVyZXNcXC9bXi9dK1xcLy8sICcnKSA6IGZpbGVQYXRoXG4gICAgICApO1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZVBhdGhzID0gZmlsZVBhdGhzLmZpbHRlcihcbiAgICAgIChmaWxlUGF0aCkgPT5cbiAgICAgICAgKGluY2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gZmlsZVBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFleGNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpXG4gICAgKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZWQgZmlsZXM6ICR7ZmlsdGVyZWRGaWxlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGhcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignZ2l0JywgWydkaWZmJywgJy0tJywgLi4uZmlsdGVyZWRGaWxlUGF0aHNdLCB7IGN3ZDogcHJvamVjdC5yb290RGlyUGF0aCB9KTtcbiAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhkYXRhLnRvU3RyaW5nKCkpO1xuICAgICAgICBjb25zb2xlLmluZm8oJ0hhc2g6JywgaGFzaC5jb3B5KCkuZGlnZXN0KCdoZXgnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcy5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFByb21pc2U8VD4sXG4gIHsgYmVmb3JlUmV0cnksIGhhbmRsZUVycm9yLCByZXRyeUNvdW50ID0gMywgcmV0cnlMb2dnZXIsIHNsZWVwTWlsbGlzZWNvbmRzID0gMCB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IGVycm9yfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuLCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IFtwcmludGFibGVTY3JpcHQsIHJ1bm5hYmxlU2NyaXB0XSA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgMCwgb3B0cyk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBwb3J0ID0gcnVubmFibGVTY3JpcHQubWF0Y2goL2h0dHAtZ2V0OlxcL1xcLzEyNy4wLjAuMTooXFxkKykvKT8uWzFdO1xuICBpZiAocnVubmFibGVTY3JpcHQuaW5jbHVkZXMoJ3dhaXQtb24nKSAmJiBwb3J0ICYmICFydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnZG9ja2VyIHJ1bicpKSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQoTnVtYmVyKHBvcnQpKTtcbiAgfVxuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKHJ1bm5hYmxlU2NyaXB0LCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzPy50aW1lb3V0LFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcbiAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIHJldC5zdGF0dXMsIG9wdHMpO1xuICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtwcmludGFibGVTY3JpcHQsIHJ1bm5hYmxlU2NyaXB0XSA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnQgKHBhcmFsbGVsKScsIHRydWUpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgMCwgb3B0cyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKHJ1bm5hYmxlU2NyaXB0LCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIG9wdHMpLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cz8udGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogW3N0cmluZywgc3RyaW5nXSB7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biAtLWJ1biBydW4gJyA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1biAtLWJ1bikgcnVuYFxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHJ1biAnLCBwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biAtLWJ1biBydW4gJyA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyg/OllBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAvLyAnLS1hbGxvd09ubHknIGlzIHNvbWV0aW1lcyByZW1vdmVkLlxuICAgICAgLnJlcGxhY2VBbGwoLyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzKD86IC0tYWxsb3dPbmx5KT8vZywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIHJldHVybiBbXG4gICAgZml4QnVuQ29tbWFuZChuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApKSxcbiAgICBmaXhCdW5Db21tYW5kKFxuICAgICAgbmV3U2NyaXB0XG4gICAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW4gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgYClcbiAgICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIWlzUnVubmluZ09uQnVuICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApXG4gICAgKSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPlxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIG9wdHM6IE9wdGlvbnMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmV3RW52ID0geyAuLi5lbnYgfTtcbiAgaWYgKG9wdHMuY2kpIHtcbiAgICBuZXdFbnZbJ0NJJ10gPSAnMSc7XG4gIH1cbiAgaWYgKG9wdHMuZm9yY2VDb2xvcikge1xuICAgIG5ld0VudlsnRk9SQ0VfQ09MT1InXSA9ICczJztcbiAgfVxuICByZXR1cm4gbmV3RW52O1xufVxuXG5mdW5jdGlvbiBmaXhCdW5Db21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKCduZXh0IGRldicpIHx8IGNvbW1hbmQuaW5jbHVkZXMoJ3BtMi1ydW50aW1lJykgfHwgY29tbWFuZC5pbmNsdWRlcygndGVzdC9lMmUtYWRkaXRpb25hbCcpXG4gICAgPyBjb21tYW5kLnJlcGxhY2VBbGwoJ2J1biAtLWJ1bicsICdidW4nKVxuICAgIDogY29tbWFuZDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBiaW9tZUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnY2pzJywgJ2N0cycsICdqcycsICdqc29uJywgJ2pzb25jJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3RzJywgJ3RzeCddKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2N0cycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhYmlvbWVFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlIG9uIEJ1bicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmICghaXNSdW5uaW5nT25CdW4pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgb25seSBhdmFpbGFibGUgb24gQnVuLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlcyA9IGFyZ3YuZmlsZXMgPz8gW107XG4gICAgbGV0IGJpb21lQXJnc1RleHQ6IHN0cmluZztcbiAgICBsZXQgcHJldHRpZXJBcmdzVGV4dDogc3RyaW5nO1xuICAgIGxldCBzb3J0UGFja2FnZUpzb25BcmdzVGV4dDogc3RyaW5nO1xuICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWU6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllcjogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKFN0cmluZyhmaWxlKSk7XG4gICAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fCBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgICAgcGFja2FnZUpzb25GaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYmlvbWVFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBiaW9tZUFyZ3NUZXh0ID0gZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgICAgcHJldHRpZXJBcmdzVGV4dCA9IGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgICAgc29ydFBhY2thZ2VKc29uQXJnc1RleHQgPSBwYWNrYWdlSnNvbkZpbGVQYXRocy5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmlvbWVBcmdzVGV4dCA9ICcnO1xuICAgICAgcHJldHRpZXJBcmdzVGV4dCA9IGBcIioqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX1cIiBcIiEqKi90ZXN0LWZpeHR1cmVzLyoqXCJgO1xuICAgICAgc29ydFBhY2thZ2VKc29uQXJnc1RleHQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoKHApID0+IGBcIiR7cC5wYWNrYWdlSnNvblBhdGh9XCJgKS5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYmlvbWVDb21tYW5kID0gYXJndi5maXggJiYgYXJndi5mb3JtYXQgPyAnY2hlY2sgLS1maXgnIDogYXJndi5maXggPyAnbGludCAtLWZpeCcgOiAnbGludCc7XG4gICAgbGV0IGJpb21lUHJvbWlzZTogUHJvbWlzZTxudW1iZXI+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChiaW9tZUFyZ3NUZXh0IHx8IGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYmlvbWVQcm9taXNlID0gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgYGJ1biAtLWJ1biBiaW9tZSAke2Jpb21lQ29tbWFuZH0gLS1jb2xvcnM9Zm9yY2UgLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tZmlsZXMtaWdub3JlLXVua25vd249dHJ1ZSAke2Jpb21lQXJnc1RleHR9YCxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgaWYgKHByZXR0aWVyQXJnc1RleHQpIHtcbiAgICAgICAgdm9pZCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICAgIGBidW4gLS1idW4gcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSAke3ByZXR0aWVyQXJnc1RleHR9YCxcbiAgICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzVGV4dCkge1xuICAgICAgICBhd2FpdCBiaW9tZVByb21pc2U7XG4gICAgICAgIHZvaWQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnVuIC0tYnVuIHNvcnQtcGFja2FnZS1qc29uICR7c29ydFBhY2thZ2VKc29uQXJnc1RleHR9YCwgcHJvamVjdHMuc2VsZiwgYXJndiwge1xuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgY29uc3Qga2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSB8fCB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlPy5zdGFydHNXaXRoKCdnaXRAZ2l0aHViLmNvbTonKSkge1xuICAgICAgICAgICAgZGVwc1tuYW1lXSA9IGAuLyR7bmFtZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uKTtcblxuICAgICAgaWYgKGFyZ3YuZHJ5UnVuKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGlzdERpclBhdGggPSBhcmd2Lm91dHNpZGUgPyBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZGlzdCcpIDogcHJvamVjdC5kaXJQYXRoO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiksICd1dGY4Jyk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghYXJndi5vdXRzaWRlKSB7XG4gICAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgYWxsIGRldkRlcGVuZGVuY2llcy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICBjb25zdCBuYW1lV29yZHNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYXJ0aWxsZXJ5JyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAncGxheXdyaWdodCcsXG4gICAgJ3ByZXR0aWVyJyxcbiAgICAncGluc3QnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAoIWFyZ3Yub3V0c2lkZSAmJiBuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgZGVwbG95KF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiAnUFJJU01BIG1pZ3JhdGUgZGVwbG95JztcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QsIGJhY2t1cFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10gPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGBybSAtUmYgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMqOyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlICYmIHJtIC1SZiAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMypcbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAtbyAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyAke2JhY2t1cFBhdGh9ICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXRlc3RyZWFtKF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtydW50aW1lV2l0aEFyZ3N9IC1lICdcbmNvbnN0IHsgUHJpc21hQ2xpZW50IH0gPSByZXF1aXJlKFwiQHByaXNtYS9jbGllbnRcIik7XG5uZXcgUHJpc21hQ2xpZW50KCkuJHF1ZXJ5UmF3XFxgUFJBR01BIGpvdXJuYWxfbW9kZSA9IFdBTDtcXGBcbiAgLmNhdGNoKChlcnJvcikgPT4geyBjb25zb2xlLmxvZyhcIkZhaWxlZCBkdWUgdG86XCIsIGVycm9yKTsgcHJvY2Vzcy5leGl0KDEpOyB9KTtcbidgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAmJiBQUklTTUEgZ2VuZXJhdGUgJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXZgO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICAgIC8vIEknbSBub3Qgc3VyZSB3aHkgd2UgbmVlZCB0byByZW1vdmUgYWxsIHNxbGl0ZSBmaWxlcywgc28gSSBjb21tZW50ZWQgb3V0IHRoZSBmb2xsb3dpbmcgbGluZS5cbiAgICAvLyByZXR1cm4gYHRydWUgJChybSAtUmYgZGIvKiovKi5zcWxpdGUqIDI+IC9kZXYvbnVsbCkgJiYgdHJ1ZSAkKHJtIC1SZiBwcmlzbWEvKiovKi5zcWxpdGUqIDI+IC9kZXYvbnVsbCkgJiYgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3RoaXMuc2VlZCgpfWA7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIGJhY2t1cFBhdGg6IHN0cmluZywgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdkYicgOiAncHJpc21hJztcbiAgICByZXR1cm4gYHJtIC1SZiAke2Rpck5hbWV9L3Jlc3RvcmVkLnNxbGl0ZTM7IEdPT0dMRV9BUFBMSUNBVElPTl9DUkVERU5USUFMUz1nY3Atc2Eta2V5Lmpzb24gbGl0ZXN0cmVhbSByZXN0b3JlIC1vICR7b3V0cHV0UGF0aH0gJHtiYWNrdXBQYXRofWA7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddKVxuICAgICAgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuICdCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50cyc7XG4gICAgaWYgKChwcm9qZWN0LnBhY2thZ2VKc29uLnByaXNtYSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uWydzZWVkJ10pIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKF86IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhkYlVybE9yUGF0aCwgYWJzb2x1dGVQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD1maWxlOi8vJHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpb2A7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgZGVzY3JpYmU6ICdSdW4gcHJpc21hIGNvbW1hbmRzJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKCk7XG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnYmFja3VwLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdiJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlcGxveUZvcmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZXBsb3lGb3JjZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZSA8YmFja3VwLXBhdGg+JyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXI6IGRlcGxveUZvcmNlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveS1mb3JjZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95Rm9yY2UocHJvamVjdCwgYXJndi5iYWNrdXBQYXRoKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnU2V0dXAgREIgZm9yIExpdGVzdHJlYW0nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVEZXZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUtZGV2JyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgYSBtaWdyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlLWRldicsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubWlncmF0ZURldihwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5kZXBsb3lGb3JjZUJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUgPGJhY2t1cC1wYXRoPicsXG4gIGRlc2NyaWJlOiBcIlJlc3RvcmUgREIgZnJvbSBMaXRlc3RyZWFtJ3MgYmFja3VwXCIsXG4gIGJ1aWxkZXI6IHJlc3RvcmVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgcmVzdG9yZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID1cbiAgICAgICAgYXJndi5vdXRwdXQgfHxcbiAgICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10gPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgYXJndi5iYWNrdXBQYXRoLCBvdXRwdXQpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWVkQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgZmlsZToge1xuICAgIGFsaWFzOiAnZicsXG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBzZWVkIHNjcmlwdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc2VlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2VlZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NlZWQnLFxuICBkZXNjcmliZTogJ1BvcHVsYXRlIERCIHdpdGggc2VlZCBkYXRhJyxcbiAgYnVpbGRlcjogc2VlZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzZWVkJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBQcmlzbWEgU3R1ZGlvJyxcbiAgYnVpbGRlcjogc3R1ZGlvQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3YucmVzdG9yZWQgJiYgYXJndi5kYlVybE9yUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlc3RvcmVkIGFuZCAtLWRiLXVybC1vci1wYXRoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J11cbiAgICAgICAgICA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICAgIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ1Bhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byBwcmlzbWEgYXMgaXMnLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IGAke2FyZ3YuYXJncz8uam9pbignICcpID8/ICcnfWAudHJpbUVuZCgpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoYHByaXNtYSAke3NjcmlwdH1gLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgUFJJU01BICR7c2NyaXB0fWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmlsdGVyKFxuICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydwcmlzbWEnXSB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uWydwcmlzbWEnXVxuICApO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByaXNtYSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAobGFzdFN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQobGFzdFN0YXR1cyk7XG4gIH0sXG59O1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYSddO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuLCBwYWNrYWdlTWFuYWdlcldpdGhSdW4sIHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgICBwYWNrYWdlcy5wdXNoKCdleHBlY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMucHJlZmVyLWFjdGl2ZS1weXRob24gdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgY29uc3QgWywgdmVyc2lvbl0gPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdhc2RmIGN1cnJlbnQgcHl0aG9uJykudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7dmVyc2lvbn1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gICAgY29uc3Qgc2NyaXB0cyA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fTtcbiAgICBjb25zdCBuZXdEZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBuZXdEZXZEZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChkZXBzWydibGl0eiddIHx8IGRlcHNbJ25leHQnXSkge1xuICAgICAgbmV3RGVwcy5wdXNoKCdwbTInKTtcbiAgICAgIG5ld0RldkRlcHMucHVzaCgnY29uY3VycmVudGx5JywgJ29wZW4tY2xpJywgJ3ZpdGVzdCcsICd3YWl0LW9uJyk7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBuZXdEZXBzLnB1c2goJ3BtMicpO1xuICAgICAgbmV3RGV2RGVwcy5wdXNoKCdjb25jdXJyZW50bHknLCAnb3Blbi1jbGknLCAndml0ZXN0JywgJ3dhaXQtb24nKTtcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSkge1xuICAgICAgbmV3RGVwcy5wdXNoKCdwbTInKTtcbiAgICAgIG5ld0RldkRlcHMucHVzaCgnY29uY3VycmVudGx5JywgJ3ZpdGVzdCcsICd3YWl0LW9uJyk7XG4gICAgfVxuICAgIGlmIChpc1J1bm5pbmdPbkJ1bikge1xuICAgICAgbmV3RGV2RGVwcyA9IG5ld0RldkRlcHMuZmlsdGVyKChkZXApID0+IGRlcCAhPT0gJ3ZpdGVzdCcpO1xuICAgIH1cbiAgICBpZiAobmV3RGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJ9IGFkZCAke25ld0RlcHMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAobmV3RGV2RGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJ9IGFkZCAtRCAke25ld0RldkRlcHMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAoc2NyaXB0c1snZ2VuLWNvZGUnXSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBEb2NrZXIgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIERvY2tlclNjcmlwdHMge1xuICBidWlsZERldkltYWdlKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZS5nLiBjb2RpbmctYm9vc3RlciB1c2VzIGBcImRvY2tlci9idWlsZC9wcmVwYXJlXCI6IFwidG91Y2ggZHJpbGwtdXNlcnMuY3N2XCIsYFxuICAgIGNvbnN0IHByZWZpeCA9IHByb2plY3QuZG9ja2VyUGFja2FnZUpzb24uc2NyaXB0cz8uWydkb2NrZXIvYnVpbGQvcHJlcGFyZSddXG4gICAgICA/ICd5YXJuIHJ1biBkb2NrZXIvYnVpbGQvcHJlcGFyZSAmJiAnXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgY2QgJHtwYXRoLmRpcm5hbWUocHJvamVjdC5maW5kRmlsZSgnRG9ja2VyZmlsZScpKX1cbiAgICAmJiAke3ByZWZpeH1ZQVJOIHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlXG4gICAgJiYgWUFSTiB3YiByZXRyeSAtLSBkb2NrZXIgYnVpbGQgLXQgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX1cbiAgICAgICAgLS1idWlsZC1hcmcgQVJDSD0kKFsgJCh1bmFtZSAtbSkgPSAnYXJtNjQnIF0gJiYgZWNobyBhcm02NCB8fCBlY2hvIGFtZDY0KVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9XG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX1ZFUlNJT049JHt2ZXJzaW9ufSAuYDtcbiAgfVxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgdW5idWZmZXIgPSBmYWxzZSwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt1bmJ1ZmZlciA/ICd1bmJ1ZmZlciAnIDogJyd9JHt0aGlzLnN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFkZGl0aW9uYWxPcHRpb25zLFxuICAgICAgYWRkaXRpb25hbEFyZ3NcbiAgICApfWA7XG4gIH1cbiAgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgc3Bhd25TeW5jT25FeGl0KHRoaXMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCk7XG4gICAgcmV0dXJuIGBkb2NrZXIgcnVuIC0tcm0gLWl0IC1wIDgwODA6ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFRGV2T3B0aW9ucyB7XG4gIC8vICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJ1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZztcbiAgc3RhcnRDb21tYW5kPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIGV4dGVuZHMgVGVzdEUyRURldk9wdGlvbnMge1xuICBwcmlzbWFEaXJlY3Rvcnk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMCkge31cblxuICBidWlsZERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uID0gJ2RldmVsb3BtZW50Jyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGREZXZJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIGFic3RyYWN0IHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG5cbiAgYWJzdHJhY3Qgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZztcblxuICBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX1cbiAgICAgICYmIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgICBcIiR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICAgICApfVwiXG4gICAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIDgwODApfVwiYDtcbiAgfVxuXG4gIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzID0gJ3Rlc3QgdGVzdHMvZTJlJywgcHJpc21hRGlyZWN0b3J5LCBzdGFydENvbW1hbmQgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIHJldHVybiBgV0JfRU5WPSR7ZW52fSBORVhUX1BVQkxJQ19XQl9FTlY9JHtlbnZ9IEFQUF9FTlY9JHtlbnZ9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCJybSAtUmYgJHtwcmlzbWFEaXJlY3Rvcnl9L21vdW50ICYmICR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJjb25jdXJyZW50bHkgLS1raWxsLW90aGVycy1vbi1mYWlsIC0tcmF3ICd3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODAnICdCVU4gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzJ1xuICAgICAgICAmJiBCVU4gcGxheXdyaWdodCAke3BsYXl3cmlnaHRBcmdzID09PSAndGVzdCB0ZXN0cy9lMmUnICYmIGFyZ3YudGFyZ2V0ID8gcGxheXdyaWdodEFyZ3MucmVwbGFjZSgndGVzdHMvZTJlJywgYXJndi50YXJnZXQpIDogcGxheXdyaWdodEFyZ3N9JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MgPSAndGVzdCB0ZXN0cy9lMmUnLCBzdGFydENvbW1hbmQgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIHJldHVybiBgV0JfRU5WPSR7ZW52fSBORVhUX1BVQkxJQ19XQl9FTlY9JHtlbnZ9IEFQUF9FTlY9JHtlbnZ9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwiY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMtb24tZmFpbCAtLXJhdyAnd2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMTo4MDgwJyAnQlVOIHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwcydcbiAgICAgICAgJiYgQlVOIHBsYXl3cmlnaHQgJHtwbGF5d3JpZ2h0QXJncyA9PT0gJ3Rlc3QgdGVzdHMvZTJlJyAmJiBhcmd2LnRhcmdldCA/IHBsYXl3cmlnaHRBcmdzLnJlcGxhY2UoJ3Rlc3RzL2UyZScsIGFyZ3YudGFyZ2V0KSA6IHBsYXl3cmlnaHRBcmdzfSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIGFic3RyYWN0IHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuXG4gIHRlc3RVbml0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2KTogc3RyaW5nIHtcbiAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gWUFSTiB2aXRlc3QgcnVuICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL3VuaXQnfSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QXBwKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSB0aGlzLmRlZmF1bHRQb3J0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHdhaXQtb24gLXQgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgNTAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDEwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAyMDAwMCAtaSA0MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDYwMDAwIC1pIDUwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IHRoaXMuZGVmYXVsdFBvcnQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYXJndixcbiAgICAgIHBvcnRcbiAgICApfSB8fCB3YWl0LW9uIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgb3Blbi1jbGkgaHR0cDovL1xcJHtIT1NUOi1sb2NhbGhvc3R9OiR7cG9ydH1gO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIEJsaXR6LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBCbGl0elNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBhcHBFbnYgPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgQVBQX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gYCA6ICcnO1xuICAgIHJldHVybiBgJHthcHBFbnZ9WUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcImJsaXR6IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBhcHBFbnYgPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgQVBQX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gYCA6ICcnO1xuICAgIHJldHVybiBgJHthcHBFbnZ9Tk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpfSAmJiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKFxuICAgICAgICAnZWNvc3lzdGVtLmNvbmZpZy5janMnXG4gICAgICApfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBzdGFydENvbW1hbmQgPSBgJHtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpfSAmJiAke1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZFxuICAgICAgfSAmJiBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAnZGInLFxuICAgICAgc3RhcnRDb21tYW5kLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCA9ICdibGl0eiBkZXYgLXAgODA4MCcgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwiYmxpdHogZGV2XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGJsaXR6U2NyaXB0cyA9IG5ldyBCbGl0elNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEh0dHBTZXJ2ZXJTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGJ1aWxkLXRzIHJ1biBzcmMvaW5kZXgudHMgJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICl9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gODA4MCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uICR7XG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZFxuICAgIH0gJiYgTk9ERV9FTlY9cHJvZHVjdGlvbiBQT1JUPVxcJHtQT1JUOi0ke3BvcnR9fSAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAge1xuICAgICAgc3RhcnRDb21tYW5kID0gYCR7cHJvamVjdC5oYXNQcmlzbWEgPyAncHJpc21hIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtZ2VuZXJhdGUgJiYgJyA6ICcnfSgke3RoaXMuc3RhcnRQcm9kdWN0aW9uKFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApfSlgLFxuICAgIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMTo4MDgwICYmIHZpdGVzdCBydW4gJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIHsgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVEZXZPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFdCX0VOVj0ke1xuICAgICAgcHJvamVjdC5lbnYuV0JfRU5WXG4gICAgfSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmQgfHwgdGhpcy5zdGFydChwcm9qZWN0LCBhcmd2KX0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMTo4MDgwICYmIHZpdGVzdCBydW4gJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCIke3RoaXMuc3RhcnQocHJvamVjdCwgYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2XG4gICAgKX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwibmV4dCBkZXYgLS10dXJibyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBbcHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KV0gOiBbXSksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLFxuICAgICAgXS5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZDpcbiAgICAgICAgb3B0aW9ucy5zdGFydENvbW1hbmQgPz9cbiAgICAgICAgW1xuICAgICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpXSA6IFtdKSxcbiAgICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICAgIF0uam9pbignICYmICcpLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgc3RhcnRDb21tYW5kID0gJ25leHQgZGV2IC0tdHVyYm8gLXAgODA4MCcgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJuZXh0IGRldiAtLXR1cmJvXCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gc3JjL2luZGV4LnRzICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICApfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIE5PREVfRU5WPXByb2R1Y3Rpb24gJHtydW50aW1lV2l0aEFyZ3N9IGRpc3QvaW5kZXguanMgJHtcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgfWA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5BcHBTY3JpcHRzID0gbmV3IFBsYWluQXBwU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwicmVtaXggZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpfSAmJiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKFxuICAgICAgICAnZWNvc3lzdGVtLmNvbmZpZy5janMnXG4gICAgICApfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBzdGFydENvbW1hbmQgPSBgJHtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpfSAmJiAke1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZFxuICAgICAgfSAmJiBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHByaXNtYURpcmVjdG9yeTogJ3ByaXNtYScsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgPSAncmVtaXggZGV2JyB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJyZW1peCBkZXZcIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVtaXhTY3JpcHRzID0gbmV3IFJlbWl4U2NyaXB0cygpO1xuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXJncywgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc3RhcnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0YXJ0IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6ICdTdGFydCBhcHAnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICAgIGlmIChkZXBzWydibGl0eiddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHNbJ25leHQnXSkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgfHwgJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ2RldmVsb3BtZW50Jyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnQocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhZ2luZyc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2LCA4MDgwKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3N0YWdpbmcnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3N0YWdpbmcnKTtcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA9IGAnL2Jpbi9iYXNoJ2A7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFydCBtb2RlOiAke2FyZ3YubW9kZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sIHdiRW52OiBzdHJpbmcpOiBzdHJpbmcge1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9IHdiRW52O1xuICBsZXQgcHJlZml4ID0gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gYDtcbiAgaWYgKGRlcHNbJ25leHQnXSkge1xuICAgIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1dCX0VOViA9IHByb2Nlc3MuZW52LldCX0VOVjtcbiAgICBwcmVmaXggKz0gYE5FWFRfUFVCTElDX1dCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gYDtcbiAgfVxuICByZXR1cm4gcHJlZml4O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXJncyhcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj5cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKV1cbiAgICAubWFwKChhcmcpID0+IGAnJHthcmd9J2ApXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSkubWFwKChhcmcpID0+IGAnJHthcmd9J2ApLmpvaW4oJyAnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY2k6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gcnVuIHRlc3RzIG9uIENJJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGUyZToge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1doZXRoZXIgdG8gcnVuIGUyZSB0ZXN0cy4gWW91IG1heSBwYXNzIG1vZGUgYXMgYXJndW1lbnQ6IG5vbmUgfCBoZWFkbGVzcyAoZGVmYXVsdCkgfCBoZWFkbGVzcy1kZXYgfCBoZWFkZWQgfCBoZWFkZWQtZGV2IHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgZGVidWcgfCBnZW5lcmF0ZSB8IHRyYWNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgc3RhcnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gcnVuIHN0YXJ0IHRlc3RzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHVuaXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gcnVuIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ3VuaXQtdGltZW91dCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWVvdXQgZm9yIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxuICB0YXJnZXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Rlc3QgdGFyZ2V0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3QnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+O1xuXG5leHBvcnQgY29uc3QgdGVzdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAndGVzdCcsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0LiBJZiB5b3UgcGFzcyBubyBhcmd1bWVudHMsIGl0IHdpbGwgcnVuIGFsbCB0ZXN0cy4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0KGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICBwcm9jZXNzLmVudi5DSSA9ICcxJztcbiAgfVxuICBwcm9jZXNzLmVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IGFyZ3YuZTJlID09PSB1bmRlZmluZWQgJiYgYXJndi5zdGFydCA9PT0gdW5kZWZpbmVkICYmIGFyZ3YudW5pdCA9PT0gdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzWydibGl0eiddKSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRSdW5BbGxUZXN0cykge1xuICAgICAgYXJndiA9IHtcbiAgICAgICAgLi4uYXJndixcbiAgICAgICAgZTJlOlxuICAgICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3RzJywgJ2UyZScpKSAmJiAhYXJndi50YXJnZXQ/LmluY2x1ZGVzKCcvdW5pdC8nKVxuICAgICAgICAgICAgPyAnaGVhZGxlc3MnXG4gICAgICAgICAgICA6ICdub25lJyxcbiAgICAgICAgc3RhcnQ6IHRydWUsXG4gICAgICAgIHVuaXQ6IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3RzJywgJ3VuaXQnKSkgJiYgIWFyZ3YudGFyZ2V0Py5pbmNsdWRlcygnL2UyZS8nKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx1bmtub3duPltdID0gW107XG4gICAgaWYgKGFyZ3YuY2kpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoZG9ja2VyU2NyaXB0cy5zdG9wQWxsKCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgaWYgKGFyZ3YudW5pdCkge1xuICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgICB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmd2LnN0YXJ0KSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGFyZ3YuZTJlICE9PSAnbm9uZScpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHByb2plY3QuaGFzRG9ja2VyZmlsZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBzdGFydENvbW1hbmQ6IGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge307XG4gICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChhcmd2LnVuaXQpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YsIHsgdGltZW91dDogYXJndi51bml0VGltZW91dCB9KSk7XG4gICAgfVxuICAgIGlmIChhcmd2LnN0YXJ0KSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndikpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBjYXNlICdub25lJzoge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJyc6XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGFyZ3YsIHNjcmlwdHMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGFyZ3YsIHNjcmlwdHMsIGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0tZGVidWdgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzWydibGl0eiddIHx8IGRlcHNbJ25leHQnXSB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1oZWFkZWRgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1kZWJ1Z2AgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6ICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCcgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGUyZSBtb2RlOiAke2FyZ3YuZTJlfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RPbkRvY2tlcihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICBgJHtzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBzdGFydENvbW1hbmQ6IGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpLFxuICAgIH0pfWAsXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocHJvamVjdCkgPT4ge1xuICAgICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcykge1xuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0IC0tUHJldHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5weXJpZ2h0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByb2plY3QuaGFzU291cmNlQ29kZSAmJlxuICAgICAgICAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpXG4gICAgICApIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCAtLVByZXR0eScpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgICBmb3IgKGNvbnN0IFtpLCBleGl0Q29kZV0gb2YgZXhpdENvZGVzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGV4aXRDb2RlKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1tpXS5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge307XG4gICAgICAgIGlmIChkZXBzWydibGl0eiddKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaW5hbEV4aXRDb2RlKSBwcm9jZXNzLmV4aXQoZmluYWxFeGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIC8vIFRoaXMgb3B0aW9uIGlzIGZvciBkZWJ1Z2dpbmcgbWFpbmx5LlxuICAnd29ya2luZy1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICAnZHJ5LXJ1bic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogWydkcnknLCAnZCddLFxuICB9LFxufSBhcyBjb25zdDtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGxpbnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9saW50LmpzJztcbmltcG9ydCB7IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLmpzJztcbmltcG9ydCB7IHByaXNtYUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyByZXRyeUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JldHJ5LmpzJztcbmltcG9ydCB7IHNldHVwQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXAuanMnO1xuaW1wb3J0IHsgc3RhcnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydC5qcyc7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQobGludENvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiBwcm9jZXNzLmV4aXQoKSk7XG59XG4iXSwibmFtZXMiOlsicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwiYXJndiIsImN3ZCIsImVudlBhdGhzIiwiZW52IiwibWFwIiwiZW52UGF0aCIsInBhdGgiLCJyZXNvbHZlIiwidG9TdHJpbmciLCJjYXNjYWRlIiwiY2FzY2FkZUVudiIsImNhc2NhZGVOb2RlRW52IiwicHJvY2VzcyIsIk5PREVfRU5WIiwiYXV0b0Nhc2NhZGVFbnYiLCJXQl9FTlYiLCJ1bmRlZmluZWQiLCJsZW5ndGgiLCJwdXNoIiwiam9pbiIsImluY2x1ZGVSb290RW52Iiwicm9vdFBhdGgiLCJmcyIsImV4aXN0c1N5bmMiLCJmbGF0TWFwIiwiZmlsdGVyIiwicmVsYXRpdmUiLCJ2ZXJib3NlIiwiY29uc29sZSIsImluZm8iLCJvcmdFbnZWYXJzIiwibG9hZGVkRW52VmFycyIsInJlYWRFbnZGaWxlIiwiY291bnQiLCJrZXkiLCJ2YWx1ZSIsIk9iamVjdCIsImVudHJpZXMiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwia2V5cyIsIkVycm9yIiwiY2FjaGVkRW52VmFycyIsIk1hcCIsImZpbGVQYXRoIiwiY2FjaGVkIiwiZ2V0IiwicGFyc2VkIiwiY29uZmlnIiwicHJvY2Vzc0VudiIsInNldCIsImFzeW5jIiwic3Bhd25Bc3luYyIsImNvbW1hbmQiLCJhcmdzIiwib3B0aW9ucyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzdGRvdXQiLCJzZXRFbmNvZGluZyIsInN0ZGVyciIsIm9uIiwiZGF0YSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJzdG9wcGVkIiwic3RvcFByb2Nlc3MiLCJwaWQiLCJ0cmVlS2lsbCIsImtpbGxPbkV4aXQiLCJlcnJvciIsInJlbW92ZUxpc3RlbmVyIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiY29kZSIsInNpZ25hbCIsInN0YXR1cyIsImlucHV0Iiwic3RkaW4iLCJ3cml0ZSIsImVuZCIsIm1lbW9pemUiLCJjYWNoZUR1cmF0aW9uIiwidCIsIk51bWJlciIsIlBPU0lUSVZFX0lORklOSVRZIiwiY2FjaGVzIiwicyIsImNhbGNLZXkiLCJuIiwiaSIsInIiLCJhIiwiY29kZVBvaW50QXQiLCJNYXRoIiwiaW11bCIsInBhZFN0YXJ0IiwiZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJtYXhDYWNoZWRBcmdzU2l6ZSIsIm1heENhY2hlZFRoaXNTaXplIiwiYyIsIm8iLCJraW5kIiwiRGF0ZSIsIm5vdyIsImhhcyIsInRoaXMiLCJjYWxsIiwic2l6ZSIsIm5leHQiLCJkZWxldGUiLCJoIiwidSIsImYiLCJtZW1vaXplRmFjdG9yeSIsIk1BWF9TQUZFX0lOVEVHRVIiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJwYXRoQnlOYW1lIiwiY29uc3RydWN0b3IiLCJkaXJQYXRoIiwibG9hZEVudiIsIl9kaXJQYXRoIiwiaXNCdW5BdmFpbGFibGUiLCJ0ZXN0IiwicmVhZEZpbGVTeW5jIiwicm9vdERpclBhdGgiLCJidWlsZENvbW1hbmQiLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJidWlsZCIsImluY2x1ZGVzIiwiZG9ja2VyZmlsZSIsImZpbmRGaWxlIiwiaGFzRG9ja2VyZmlsZSIsImhhc1NvdXJjZUNvZGUiLCJuYW1lIiwiZG9ja2VySW1hZ2VOYW1lIiwicmVwbGFjZUFsbCIsInBhcnNlIiwicGFja2FnZUpzb25QYXRoIiwiaGFzUHJpc21hIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiZG9ja2VyUGFja2FnZUpzb24iLCJkaXJuYW1lIiwiYmluRXhpc3RzIiwiYmluRm91bmQiLCJjdXJyZW50UGF0aCIsImJpblBhdGgiLCJQQVRIIiwicGFyZW50UGF0aCIsImZpbGVOYW1lIiwicCIsImZpbmQiLCJmaW5kU2VsZlByb2plY3QiLCJmaW5kRGVzY2VuZGFudFByb2plY3RzIiwicm9vdEFuZFNlbGZQcm9qZWN0cyIsInRoaXNQcm9qZWN0Iiwicm9vdFByb2plY3QiLCJ3b3Jrc3BhY2VzIiwiZW5kc1dpdGgiLCJyb290Iiwic2VsZiIsImZpbmRSb290QW5kU2VsZlByb2plY3RzIiwiZGVzY2VuZGFudHMiLCJnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMiLCJwcm9qZWN0cyIsIndvcmtzcGFjZSIsIkFycmF5IiwiaXNBcnJheSIsImdsb2JQYXR0ZXJuIiwicGFja2FnZURpcnMiLCJ3b3Jrc3BhY2VQYXRoIiwid3MiLCJnbG9iYnkiLCJkb3QiLCJvbmx5RGlyZWN0b3JpZXMiLCJzdWJQYWNrYWdlRGlyUGF0aCIsImlzUnVubmluZ09uQnVuIiwibnBtX2V4ZWNwYXRoIiwicnVudGltZVdpdGhBcmdzIiwicGFja2FnZU1hbmFnZXIiLCJwYWNrYWdlTWFuYWdlcldpdGhSdW4iLCJidWlsZElmTmVlZGVkQ29tbWFuZCIsImRlc2NyaWJlIiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiYWxpYXMiLCJoYW5kbGVyIiwicHJvamVjdFBhdGhGb3JUZXN0aW5nIiwicHJvamVjdCIsImNoYWxrIiwicmVkIiwiY2FuU2tpcCIsImNhY2hlRmlsZVBhdGgiLCJjb250ZW50SGFzaCIsImNhY2hlRGlyZWN0b3J5UGF0aCIsInByb21pc2VzIiwibWtkaXIiLCJyZWN1cnNpdmUiLCJoYXNoIiwiY3JlYXRlSGFzaCIsImNvbW1pdEhhc2giLCJjaGlsZF9wcm9jZXNzIiwiZXhlY1N5bmMiLCJ0cmltIiwidXBkYXRlIiwiZW52aXJvbm1lbnRKc29uIiwiaWdub3JpbmdFbnZWYXJOYW1lcyIsInNvcnQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZEZpbGVQYXRocyIsInNwYXduU3luYyIsInN0ZGlvIiwiZW5jb2RpbmciLCJzcGxpdCIsInJlcGxhY2UiLCJpbmNsdWRlUGF0dGVybnMiLCJzb21lIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJncmVlbiIsImRyeVJ1biIsIndyaXRlRmlsZSIsImJ1aWxkSWZOZWVkZWQiLCJyZXQiLCJzaGVsbCIsImV4aXRDb2RlIiwiU2V0Iiwia2lsbGVkIiwia2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMiLCJwb3J0Iiwia2lsbFBvcnRQcm9jZXNzIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0Iiwib3B0cyIsInByaW50YWJsZVNjcmlwdCIsInJ1bm5hYmxlU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0IiwicHJpbnRTdGFydCIsInByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQiLCJtYXRjaCIsImtpbGxGdW5jIiwiYWRkIiwia2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQiLCJjb25maWd1cmVFbnYiLCJ0aW1lb3V0IiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSIsIm91dCIsIm5ld1NjcmlwdCIsImZpeEJ1bkNvbW1hbmQiLCJub3JtYWxpemVkU2NyaXB0IiwicHJlZml4Iiwid2VhayIsImdyYXkiLCJjeWFuIiwiYm9sZCIsImV4aXQiLCJuZXdFbnYiLCJjaSIsImZvcmNlQ29sb3IiLCJiaW9tZUV4dGVuc2lvbnMiLCJwcmV0dGllckV4dGVuc2lvbnMiLCJwcmV0dGllck9ubHlFeHRlbnNpb25zIiwiZXh0IiwibGludENvbW1hbmQiLCJmaXgiLCJmb3JtYXQiLCJmaWxlcyIsImJpb21lQXJnc1RleHQiLCJwcmV0dGllckFyZ3NUZXh0Iiwic29ydFBhY2thZ2VKc29uQXJnc1RleHQiLCJmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUiLCJmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllciIsInBhY2thZ2VKc29uRmlsZVBhdGhzIiwiZmlsZSIsIlN0cmluZyIsImV4dGVuc2lvbiIsImV4dG5hbWUiLCJzbGljZSIsImJpb21lQ29tbWFuZCIsImJpb21lUHJvbWlzZSIsInByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCIsImNvbW1hbmROYW1lIiwib3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQiLCJvdXRzaWRlIiwiZGVwcyIsInN0YXJ0c1dpdGgiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJkZXZEZXBzIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJyZW1vdmVkRGVwcyIsIndvcmQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwicmVtb3ZlZFNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsInByaXNtYVNjcmlwdHMiLCJkZXBsb3kiLCJfIiwiZGVwbG95Rm9yY2UiLCJiYWNrdXBQYXRoIiwiZGlyTmFtZSIsImxpdGVzdHJlYW0iLCJtaWdyYXRlIiwic2VlZCIsIm1pZ3JhdGVEZXYiLCJyZXNldCIsInJlc3RvcmUiLCJvdXRwdXRQYXRoIiwic2NyaXB0UGF0aCIsInByaXNtYSIsInN0dWRpbyIsImRiVXJsT3JQYXRoIiwiVVJMIiwiYWJzb2x1dGVQYXRoIiwiYnVpbGRlciIsInByaXNtYUNvbW1hbmQiLCJ5YXJncyIsImRlcGxveUNvbW1hbmQiLCJkZXBsb3lGb3JjZUNvbW1hbmQiLCJsaXRlc3RyZWFtQ29tbWFuZCIsIm1pZ3JhdGVDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXNldENvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInNlZWRDb21tYW5kIiwic3R1ZGlvQ29tbWFuZCIsImRlZmF1bHRDb21tYW5kIiwiZGVtYW5kQ29tbWFuZCIsImFsbFByb2plY3RzIiwiZmluZFByaXNtYVByb2plY3RzIiwiZGVwbG95Rm9yY2VCdWlsZGVyIiwiZGVtYW5kT3B0aW9uIiwib3V0cHV0IiwicmVzdG9yZWQiLCJ0cmltRW5kIiwiZmlsdGVyZWQiLCJyZXRyeUNvbW1hbmQiLCJyZXRyeSIsImRlZmF1bHQiLCJjbWRBbmRBcmdzIiwiQm9vbGVhbiIsImxhc3RTdGF0dXMiLCJ5ZWxsb3ciLCJodHRwU2VydmVyUGFja2FnZXMiLCJzZXR1cENvbW1hbmQiLCJkaXJlbnRzIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJvcyIsInBsYXRmb3JtIiwicGFja2FnZXMiLCJkIiwiaXNGaWxlIiwidmVyc2lvbiIsInByb21pc2VBbGwiLCJuZXdEZXBzIiwibmV3RGV2RGVwcyIsImRlcCIsInNldHVwIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkRGV2SW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJ1bmJ1ZmZlciIsImFkZGl0aW9uYWxPcHRpb25zIiwiYWRkaXRpb25hbEFyZ3MiLCJzdG9wIiwic3RhcnQiLCJzcGF3blN5bmNPbkV4aXQiLCJzdG9wQWxsIiwiQmFzZVNjcmlwdHMiLCJkZWZhdWx0UG9ydCIsIlBPUlQiLCJidWlsZERvY2tlciIsInN0YXJ0RG9ja2VyIiwibm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Iiwibm9ybWFsaXplZEFyZ3NUZXh0Iiwid2FpdEFuZE9wZW5BcHAiLCJ0ZXN0RTJFIiwicGxheXdyaWdodEFyZ3MiLCJwcmlzbWFEaXJlY3RvcnkiLCJzdGFydENvbW1hbmQiLCJ0YXJnZXQiLCJ0ZXN0RTJFRGV2IiwidGVzdFVuaXQiLCJ3YWl0QXBwIiwiYmxpdHpTY3JpcHRzIiwic3VwZXIiLCJzdGFydFByb2R1Y3Rpb24iLCJ0ZXN0U3RhcnQiLCJodHRwU2VydmVyU2NyaXB0cyIsIndhdGNoIiwibmV4dFNjcmlwdHMiLCJwbGFpbkFwcFNjcmlwdHMiLCJyZW1peFNjcmlwdHMiLCJtb2RlIiwiYXJnIiwiZG9ja2VyT3B0aW9ucyIsIm5vcm1hbGl6ZUFyZ3MiLCJjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyIsIndiRW52IiwiTkVYVF9QVUJMSUNfV0JfRU5WIiwidGVzdENvbW1hbmQiLCJlMmUiLCJ1bml0IiwiQ0kiLCJGT1JDRV9DT0xPUiIsInNob3VsZFJ1bkFsbFRlc3RzIiwidW5pdFRpbWVvdXQiLCJhbGwiLCJ0ZXN0T25Eb2NrZXIiLCJ0eXBlQ2hlY2tDb21tYW5kIiwiY29tbWFuZHMiLCJ0eXBlc2NyaXB0IiwicHlyaWdodCIsImV4aXRDb2RlcyIsImZpbmFsRXhpdENvZGUiLCJ0Y0NvbW1hbmQiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsImhpZGVCaW4iLCJzY3JpcHROYW1lIiwibWlkZGxld2FyZSIsIndvcmtpbmdEaXIiLCJjaGRpciIsImVudlZhcnMiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJ0b1VwcGVyQ2FzZSIsInJlbW92ZU5wbUFu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LDJCQUNiQyxLQUFNLFNBRVIsY0FBZSxDQUNiRCxZQUNFLHdMQUNGQyxLQUFNLFVBRVIsbUJBQW9CLENBQ2xCRCxZQUFhLDBGQUNiQyxLQUFNLFdBRVIsbUJBQW9CLENBQ2xCRCxZQUFhLGlFQUNiQyxLQUFNLFVBQ05pTCxTQUFTLEdBRVgsbUJBQW9CLENBQ2xCbEwsWUFBYSxxR0FDYkMsS0FBTSxVQUNOaUwsU0FBUyxHQUVYLFlBQWEsQ0FDWGxMLFlBQWEscUZBQ2JDLEtBQU0sU0FDTmlMLFFBQVMsZ0JBRVhwVixRQUFTLENBQ1BrSyxZQUFhLHNDQUNiQyxLQUFNLFVBQ05DLE1BQU8sSzhCakNULGNBQWUsQ0FDYkYsWUFBYSxzQkFDYkMsS0FBTSxTQUNOQyxNQUFPLEtBRVQsVUFBVyxDQUNURixZQUFhLDJDQUNiQyxLQUFNLFVBQ05DLE1BQU8sQ0FBQyxNQUFPLGFDSWIwSixFQUFNc0csRUFBUW5iLFFBQVFaLE9BQ3pCZ2MsV0FBVyxNQUNYelksUUFBUXVZLElBQ1JHLFlBQVlqYyxJQUNYLE1BQU1rYyxFQUFhbGMsRUFBSyxlQUN4QixHQUFJa2MsRUFBWSxDQUNkLE1BQU12VSxFQUFVckgsRUFBS0MsUUFBUTJiLEdBQzdCdGIsUUFBUXViLE1BQU14VSxFQUNoQixFL0J5R0csU0FBOEN5VSxHQUUvQ0EsRUFBUTNTLE1BQVEyUyxFQUFRQyxtQkFDMUJELEVBQVEzUyxLQUFPMlMsRUFBUTNTLEtBQUtxRSxRQUFRLEdBQUdzTyxFQUFRQyxvQkFBcUIsSUFFakV4VCxXQUFXLG1DQUFvQyxJQUUvQ0EsV0FBVyxzQkFBdUIsSUFDbENBLFdBQVcsaUJBQWtCLEtBRWxDLElBQUssTUFBTTNHLEtBQU9FLE9BQU9JLEtBQUs0WixHQUFVLENBQ3RDLE1BQU1FLEVBQVdwYSxFQUFJcWEsZUFFbkJELEVBQVNsSixXQUFXLFNBQ3BCa0osRUFBU2xKLFdBQVcsVUFDcEJrSixFQUFTbEosV0FBVyxXQUNQLGdCQUFia0osR0FDYSxhQUFiQSxXQUVPRixFQUFRbGEsRUFFbkIsQ0FDRixDK0I3SElzYSxDQUFxQzViLFFBQVFULElBQUksSUFFbERrRCxRQUFRc0ksR0FDUnRJLFFBQVF5TyxHQUNSek8sUUFBUTRQLElBQ1I1UCxRQUFRbVMsSUFDUm5TLFFBQVF3VCxJQUNSeFQsUUFBUWdVLElBQ1JoVSxRQUFRb1csSUFDUnBXLFFBQVF5WCxJQUNSelgsUUFBUWtZLElBQ1JsWSxRQUFRd1ksSUFDUnpGLGdCQUNBcUcsU0FDQUMsT0FBTzFjLEtBRVYsSUFBSyxNQUFNMkUsSUFBVSxDQUFDLFNBQVUsVUFBVyxXQUN6Qy9ELFFBQVFtRCxHQUFHWSxHQUFRLElBQU0vRCxRQUFRMFEiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMyw0XX0=
|
|
1
|
+
import e from"node:path";import t from"yargs";import{hideBin as n}from"yargs/helpers";import r,{spawn as s,spawnSync as o}from"node:child_process";import{createHash as i}from"node:crypto";import a from"node:fs";import c from"chalk";import{globby as d}from"globby";import{config as l}from"dotenv";import u from"kill-port";import{PromisePool as p}from"minimal-promise-pool";import m from"tree-kill";import f from"node:fs/promises";import h from"node:os";const g=new Map;function w(t){const n=g.get(t);if(n)return n;const r=l({path:e.resolve(t),processEnv:{}}).parsed??{};return g.set(t,r),r}async function y(e,t,n){return new Promise(((r,o)=>{try{const i=s(e,t??[],n??{});i.stdout?.setEncoding?.("utf8"),i.stderr?.setEncoding?.("utf8");let a="",c="";i.stdout?.on("data",(e=>{a+=e})),i.stderr?.on("data",(e=>{n?.mergeOutAndError?a+=e:c+=e}));let d=!1;const l=()=>{!d&&i.pid&&(d=!0,n?.verbose&&console.info(`treeKill(${i.pid})`),m(i.pid))};n?.killOnExit&&(process.on("beforeExit",l),process.on("SIGINT",l)),i.on("error",(e=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),i.removeAllListeners("close"),o(e)})),i.on("close",((e,t)=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),void 0===i.pid?o(new Error("Process has no pid.")):r({pid:i.pid,stdout:a,stderr:c,status:e,signal:t})})),n?.input&&(i.stdin?.write(n.input),i.stdin?.end())}catch(e){o(e)}}))}function b(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function v(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function $(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}let k;const E=function({cacheDuration:e=Number.POSITIVE_INFINITY,caches:t,calcKey:n=e=>function(e,t=0){const[n,r]=function(e,t=0){let n=3735928559^t,r=1103547991^t;for(let t,s=0;s<e.length;s++)t=e.codePointAt(s),n=Math.imul(n^t,2654435761),r=Math.imul(r^t,1597334677);return n=Math.imul(n^n>>>16,2246822507),n^=Math.imul(r^r>>>13,3266489909),r=Math.imul(r^r>>>16,2246822507),r^=Math.imul(n^n>>>13,3266489909),[r>>>0,n>>>0]}(e,t);return e.length.toString(36)+n.toString(36).padStart(7,"0")+r.toString(36).padStart(7,"0")}(JSON.stringify(e)),maxCachedArgsSize:r=100,maxCachedThisSize:s=10}={}){return function(o,i){if("getter"===i?.kind){const n=new Map;return t?.push(n),function(){const t=Date.now();if(n.has(this)){const[r,s]=n.get(this);if(t-s<=e)return r}const r=o.call(this);if(n.size>=s){const e=n.keys().next().value;n.delete(e)}return n.set(this,[r,t]),r}}{const a=new Map;return t?.push(a),function(...t){const c=n(t);let d=a.get(this);const l=Date.now();if(d){if(d.has(c)){const[t,n]=d.get(c);if(l-n<=e)return t}}else{if(d=new Map,a.size>=s){const e=a.keys().next().value;a.delete(e)}a.set(this,d)}const u=i?o.call(this,...t):o(...t);if(d.size>=r){const e=d.keys().next().value;d.delete(e)}return d.set(c,[u,l]),u}}}}({maxCachedThisSize:Number.MAX_SAFE_INTEGER,maxCachedArgsSize:1});class A{static{[k]=function(e,t,n,r,s){var o,i,a,c,d,l,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),m=Object.defineProperty,f=Object.create,h=[f(null),f(null)],g=t.length;function w(t,n,r){return function(s,o){n&&(o=s,s=e);for(var i=0;i<t.length;i++)o=t[i].apply(s,r?[o]:[]);return r?o:s}}function y(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function k(e,t,n,r,s,a,c,d,l,u,p){function f(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),b=t[3],$=!c,k=1===s,E=3===s,A=4===s,N=2===s;function x(t,n,r){return function(s,o){return n&&(o=s,s=e),r&&r(s),P[t].call(s,o)}}if(!$){var P={},j=[],S=E?"get":A||k?"set":"value";if(l?(u||k?P={get:v((function(){return b(this)}),r,"get"),set:function(e){t[4](this,e)}}:P[S]=b,u||v(P[S],r,N?"":S)):u||(P=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=h[+d][r])&&7!=(i^s))throw Error("Decorating two elements with the same name ("+P[S].name+") is not supported yet");h[+d][r]=s<3?1:s}}for(var R=e,D=g.length-1;D>=0;D-=n?2:1){var _=y(g[D],"A decorator","be",!0),O=n?g[D-1]:void 0,B={},T={kind:["field","accessor","method","getter","setter","class"][s],name:r,metadata:o,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");y(t,"An initializer","be",!0),a.push(t)}.bind(null,B)};if($)i=_.call(O,R,T),B.v=1,y(i,"class decorators","return")&&(R=i);else if(T.static=d,T.private=l,i=T.access={has:l?p.bind():function(e){return r in e}},A||(i.get=l?N?function(e){return f(e),P.value}:x("get",0,f):function(e){return e[r]}),N||E||(i.set=l?x("set",0,f):function(e,t){e[r]=t}),R=_.call(O,k?{get:P.get,set:P.set}:P[S],T),B.v=1,k){if("object"==typeof R&&R)(i=y(R.get,"accessor.get"))&&(P.get=i),(i=y(R.set,"accessor.set"))&&(P.set=i),(i=y(R.init,"accessor.init"))&&j.unshift(i);else if(void 0!==R)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(R,(u?"field":"method")+" decorators","return")&&(u?j.unshift(R):P[S]=R)}return s<2&&c.push(w(j,d,1),w(a,d,0)),u||$||(l?k?c.splice(-1,0,x("get",d),x("set",d)):c.push(N?P[S]:y.call.bind(P[S])):m(e,r,P)),R}function E(e){return m(e,p,{configurable:!0,enumerable:!0,value:o})}return o=f(null==o?null:o),d=[],l=function(e){e&&d.push(w(e))},u=function(t,r){for(var o=0;o<n.length;o++){var i=n[o],l=i[1],u=7&l;if((8&l)==t&&!u==r){var p=i[2],m=!!i[3],f=16&l;k(t?e:e.prototype,i,f,m?"#"+p:$(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,m,r,t&&m?function(t){return b(t)===e}:s)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||E(e),{e:i,get c(){var n=[];return g&&[E(e=k(e,[t],r,e.name,5,n)),w(n,1)]}}}(this,[],[[E,3,"isBunAvailable"],[E,3,"buildCommand"],[E,3,"rootDirPath"],[E,3,"dockerfile"],[E,3,"hasDockerfile"],[E,3,"hasSourceCode"],[E,3,"name"],[E,3,"dockerImageName"],[E,3,"env"],[E,3,"packageJson"],[E,3,"packageJsonPath"],[E,3,"hasPrisma"],[E,3,"dockerPackageJson"],[E,3,"binExists"]]).e}argv=void k(this);pathByName=new Map;constructor(t,n,r){this._dirPath=e.resolve(t),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(a.readFileSync(e.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return a.existsSync(e.join(this.dirPath,"..","..","package.json"))?e.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return a.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return a.existsSync(e.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){if(!this.loadEnv)return process.env;const[t,n]=function(t,n){let r=(t.env??[]).map((t=>e.resolve(n,t.toString())));const s=t.cascadeEnv??(t.cascadeNodeEnv?process.env.NODE_ENV||"development":t.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof s){if(0===r.length&&(r.push(e.join(n,".env")),t.includeRootEnv)){const t=e.resolve(n,"..","..");a.existsSync(e.join(t,"package.json"))&&r.push(e.join(t,".env"))}r=r.flatMap((e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e]))}r=r.filter((e=>a.existsSync(e))).map((t=>e.relative(n,t))),t.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",r.join(", ")));const o=[],i={};for(const s of r){let r=0;for(const[t,o]of Object.entries(w(e.join(n,s))))i[t]!==o&&(i[t]=o,r++);o.push([s,r]),t.verbose&&r>0&&console.info(`Read ${r} environment variables from ${s}`)}if(t.checkEnv){const s=Object.keys(w(e.join(n,t.checkEnv))||{}).filter((e=>!(e in i)));if(s.length>0)throw new Error(`Missing environment variables in [${r.join(", ")}]: [${s.join(", ")}]`)}return[i,o]}(this.argv,this.dirPath);for(const[e,t]of n)console.info(`Loaded ${t} environment variables from ${e}`);return{...process.env,...t}}get packageJson(){return JSON.parse(a.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return e.join(this.dirPath,"package.json")}get hasPrisma(){return!(!this.packageJson.dependencies?.prisma&&!this.packageJson.devDependencies?.prisma)}get dockerPackageJson(){return e.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(a.readFileSync(e.join(e.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let t=!1,n=this.dirPath;for(;;){const r=e.join(n,"node_modules",".bin");if(a.existsSync(r)&&(this.env.PATH=`${r}:${this.env.PATH}`,t=!0),a.existsSync(e.join(n,".git")))break;const s=e.dirname(n);if(n===s)break;n=s}return t}findFile(t){let n=this.pathByName.get(t);if(n)return n;if(n=[t,e.join("..","..",t)].map((t=>e.resolve(this.dirPath,t))).find((e=>a.existsSync(e))),!n)throw new Error(`File not found: ${t}`);return this.pathByName.set(t,n),n}}function N(t,n=!0,r){if(r??=process.cwd(),a.existsSync(e.join(r,"package.json")))return new A(r,t,n)}async function x(t,n=!0,r){const s=function(t,n=!0,r){if(r??=process.cwd(),!a.existsSync(e.join(r,"package.json")))return;const s=new A(r,t,n);let o=s;if(!s.packageJson.workspaces&&e.dirname(r).endsWith("/packages")){const s=e.resolve(r,"..","..");a.existsSync(e.join(s,"package.json"))&&(o=new A(s,t,n))}return{root:o,self:s}}(t,n,r);if(s)return{...s,descendants:s.root===s.self?await P(t,s.root,n):[s.self]}}async function P(t,n,r){const s=[n],o=n.packageJson.workspaces;if(!Array.isArray(o))return s;const i=[],c=[];for(const t of o.map((t=>e.join(n.dirPath,t))))a.existsSync(t)?c.push(t):i.push(t);c.push(...await d(i,{dot:!0,onlyDirectories:!0}));for(const n of c)a.existsSync(e.join(n,"package.json"))&&s.push(new A(n,t,r));return s}const j=process.argv[0].endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),S=j?"bun --bun run":"node",R=j?"bun":"yarn",D=j?"bun --bun run":"yarn",_={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(t){await async function(t,n){const s=await N(t,!0,n);if(!s)return console.error(c.red("No project found.")),!0;if(!a.existsSync(e.join(s.rootDirPath,".git")))return O(s,t),!0;const[o,d,l]=await async function(t,n){const s=e.resolve(t.dirPath,"node_modules",".cache","build"),o=e.resolve(s,"last-build");await a.promises.mkdir(s,{recursive:!0});const c=i("sha256"),d=r.execSync("git rev-parse HEAD",{cwd:t.dirPath}).toString().trim();c.update(d);const l=JSON.stringify(Object.entries(t.env).filter((([e])=>!B.has(e))).sort((([e],[t])=>e.localeCompare(t))));c.update(l),await async function(e,t,n){return new Promise((s=>{const o=r.spawnSync("git",["diff","--name-only"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").map((t=>"test"===e.env.WB_ENV?t.replace(/packages\/scripts\/test-fixtures\/[^/]+\//,""):t)).filter((e=>(T.some((t=>e.includes(t)))||I.some((t=>e.endsWith(t))))&&!C.some((t=>e.includes(t)))));t.verbose&&console.info(`Changed files: ${o.join(", ")}`);const i=r.spawn("git",["diff","--",...o],{cwd:e.rootDirPath});i.stdout?.on("data",(e=>{n.update(e),t.verbose&&(console.info(e.toString()),console.info("Hash:",n.copy().digest("hex")))})),i.on("close",(()=>{s()}))}))}(t,n,c);const u=c.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}((()=>a.promises.readFile(o,"utf8")));return[p===u,o,u]}(s,t);if(o)return console.info(c.green(`Skip to run '${t.command}' 💫`)),!1;if(!O(s,t))return;t.dryRun||await a.promises.writeFile(d,l,"utf8");return!0}(t)}};function O(e,t){if(t={...t,command:t.command??(j?"bun run build":"yarn build")},console.info(c.green(`Run '${t.command}'`)),!t.dryRun){const n=r.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const B=new Set(["CI","PWDEBUG","TMPDIR"]);const T=["src/","public/"],I=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],C=["test/","tests/","__tests__/","test-fixtures/"];const W=new Set;async function V(e){try{await u(e)}catch{}}const z=new p,J={exitIfFailed:!0};async function F(e,t,n,r=J){const[s,o]=M(e,t);if(U(s,t),n.verbose&&U(o,t,"Start (raw)",!0),n.dryRun)return L(s,0,r),0;const i=o.match(/http-get:\/\/127.0.0.1:(\d+)/)?.[1];o.includes("wait-on")&&i&&!o.includes("docker run")&&await async function(e){await V(e);const t=async()=>{W.has(e)||(W.add(e),await V(e))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,t)}(Number(i));const a=await y(o,void 0,{cwd:t.dirPath,env:G(t.env,r),shell:!0,stdio:"inherit",timeout:r?.timeout,killOnExit:!0,verbose:n.verbose});return L(s,a.status,r),a.status??1}function Y(e,t,n,r=J){return z.runAndWaitForReturnValue((async()=>{const[s,o]=M(e,t);if(U(s,t,"Start (parallel)",!0),n.dryRun)return U(s,t,"Started (log)"),n.verbose&&U(o,t,"Started (raw)",!0),L(s,0,r),0;const i=await y(o,void 0,{cwd:t.dirPath,env:G(t.env,r),shell:!0,stdio:"pipe",timeout:r?.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});U(s,t,"Started (log)"),n.verbose&&U(o,t,"Started (raw)",!0);const a=i.stdout.trim();return a&&(process.stdout.write(a),process.stdout.write("\n")),L(s,i.status,r),i.status??1}))}function M(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",t.isBunAvailable?"bun --bun run ":"yarn run ");return j&&(n=n.replaceAll("YARN build-ts run","bun --bun run").replaceAll("bun --bun run bun --bun run","bun --bun run").replaceAll("dist/index.js","src/index.ts").replaceAll(/(?:YARN )?vitest run/g,"bun test").replaceAll(/ --color --passWithNoTests(?: --allowOnly)?/g,"")),n=n.trim(),[q(n.replaceAll("YARN ",`${D} `)),q(n.replaceAll("YARN playwright ",`${D} playwright `).replaceAll("YARN ",!j&&t.binExists?"":`${D} `))]}function U(e,t,n="Start",r=!1){console.info("\n"+(r?c.gray:c.cyan)(c.bold(`${n}:`),e)+c.gray(` at ${t.dirPath}`))}function L(e,t,n){0===t?console.info(c.green(c.bold("Finished:"),e)):(console.info(c.red(c.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function G(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function q(e){return e.includes("next dev")||e.includes("pm2-runtime")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const H=new Set(["cjs","cts","js","json","jsonc","jsx","mjs","mts","ts","tsx"]),X=new Set(["cjs","cts","htm","html","js","json","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),K=new Set([...X].filter((e=>!H.has(e)))),Q={command:"lint [files...]",describe:"Lint code on Bun",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"}},async handler(t){j||(console.error(c.red("This command is only available on Bun.")),process.exit(1));const n=await x(t,!1);n||(console.error(c.red("No project found.")),process.exit(1));const r=t.files??[];let s,o,i;if(r.length>0){const t=[],n=[],a=[];for(const s of r){const r=e.resolve(String(s));if(r.endsWith("/test-fixtures")||r.includes("/test-fixtures/"))continue;const o=e.extname(r).slice(1);r.endsWith("/package.json")?a.push(r):H.has(o)?t.push(r):X.has(o)&&n.push(r)}s=t.map((e=>`"${e}"`)).join(" "),o=n.map((e=>`"${e}"`)).join(" "),i=a.map((e=>`"${e}"`)).join(" ")}else s="",o=`"**/{.*/,}*.{${[...K].join(",")}" "!**/test-fixtures/**"`,i=n.descendants.map((e=>`"${e.packageJsonPath}"`)).join(" ");const a=t.fix&&t.format?"check --fix":t.fix?"lint --fix":"lint";let d;(s||0===r.length)&&(d=Y(`bun --bun biome ${a} --colors=force --no-errors-on-unmatched --files-ignore-unknown=true ${s}`,n.self,t,{forceColor:!0})),t.format&&(o&&Y(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${o}`,n.self,t,{forceColor:!0}),i&&(await d,Y(`bun --bun sort-package-json ${i}`,n.self,t,{forceColor:!0})))}};function*Z(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const ee={command:"optimizeForDockerBuild",describe:"Optimize configuration when building a Docker image",builder:{outside:{description:"Whether the optimization is executed outside a docker container or not",type:"boolean",alias:"o"}},async handler(t){const n=await x(t);n||(console.error(c.red("No project found.")),process.exit(1));for(const r of Z("optimizeForDockerBuild",n.descendants)){const n=r.packageJson,s=["dependencies","devDependencies"];for(const e of s){const t=n[e]||{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(te(t,n),ne(n),re(n),t.dryRun)continue;const o=t.outside?e.join(r.dirPath,"dist"):r.dirPath;await a.promises.mkdir(o,{recursive:!0}),await a.promises.writeFile(e.join(o,"package.json"),JSON.stringify(n),"utf8")}t.dryRun||t.outside||(r.spawnSync(R,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function te(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies||{},r=["artillery","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","sort-package-json","wait-on","semantic-release","vitest"],s=[];for(const t of Object.keys(n))(r.some((e=>t.includes(e)))||!e.outside&&t.includes("willbooster")&&t.includes("config"))&&(delete n[t],s.push(t));console.info("Removed devDependencies:",s.join(", ")||"none")}function ne(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts||{},s=[];for(const[e,o]of Object.entries(r))(t.some((t=>e.includes(t)))||n.some((e=>o.includes(e)||o.trim()===e.trim())))&&(delete r[e],s.push(e));console.info("Removed scripts:",s.join(", ")||"none")}function re(e){delete e.private,delete e.publishConfig,delete e.prettier}const se=new class{deploy(e){return"PRISMA migrate deploy"}deployForce(e,t){const n=e.packageJson.dependencies?.blitz?"db":"prisma";return`rm -Rf ${n}/mount/prod.sqlite3*; PRISMA migrate reset --force && rm -Rf ${n}/mount/prod.sqlite3*\n && litestream restore -o ${n}/mount/prod.sqlite3 ${t} && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}litestream(e){return`${S} -e '\nconst { PrismaClient } = require("@prisma/client");\nnew PrismaClient().$queryRaw\`PRAGMA journal_mode = WAL;\`\n .catch((error) => { console.log("Failed due to:", error); process.exit(1); });\n'`}migrate(e){return`PRISMA migrate deploy && PRISMA generate && ${this.seed(e)}`}migrateDev(e){return"PRISMA migrate dev"}reset(e){return`PRISMA migrate reset --force --skip-seed && ${this.seed(e)}`}restore(e,t,n){return`rm -Rf ${e.packageJson.dependencies?.blitz?"db":"prisma"}/restored.sqlite3; GOOGLE_APPLICATION_CREDENTIALS=gcp-sa-key.json litestream restore -o ${n} ${t}`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?"BUN build-ts run prisma/seeds.ts":e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(t,n){let r="";if(n)try{new URL(n),r=`DATABASE_URL=${n} `}catch{const t=e.resolve(n);console.info(n,t),r=`DATABASE_URL=file://${t} `}return`${r}PRISMA studio`}},oe={},ie={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(ae).command(de).command(le).command(ue).command(pe).command(me).command(fe).command(he).command(ge).command(we).demandCommand(),handler(){}},ae={command:"deploy",describe:"Apply migration to DB without initializing it",builder:oe,async handler(e){const t=await ye(e);for(const n of Z("prisma deploy",t))await F(se.deploy(n),n,e)}},ce={...oe,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},de={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:ce,async handler(e){const t=await ye(e);for(const n of Z("prisma deploy-force",t))await F(se.deployForce(n,e.backupPath),n,e)}},le={command:"litestream",describe:"Setup DB for Litestream",builder:oe,async handler(e){const t=await ye(e);for(const n of Z("prisma litestream",t))await F(se.litestream(n),n,e)}},ue={command:"migrate",describe:"Apply migration to DB with initializing it",builder:oe,async handler(e){const t=await ye(e);for(const n of Z("prisma migrate",t))await F(se.migrate(n),n,e)}},pe={command:"migrate-dev",describe:"Create a migration file",builder:oe,async handler(e){const t=await ye(e);for(const n of Z("prisma migrate-dev",t))await F(se.migrateDev(n),n,e)}},me={command:"reset",describe:"Reset DB",builder:oe,async handler(e){const t=await ye(e);for(const n of Z("prisma reset",t))await F(se.reset(n),n,e)}},fe={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...ce,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await ye(e);for(const n of Z("prisma restore",t)){const t=e.output||(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await F(se.restore(n,e.backupPath,t),n,e)}}},he={command:"seed",describe:"Populate DB with seed data",builder:{...oe,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await ye(e);for(const n of Z("prisma seed",t))await F(se.seed(n,e.file),n,e)}},ge={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...oe,"db-url-or-path":{description:"URL or path to the database",type:"string"},restored:{description:"Whether to open the default restored database (<db|prisma>/restored.sqlite3).",type:"boolean"}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw new Error("You cannot specify both --restored and --db-url-or-path.");const t=await ye(e);for(const n of Z("prisma studio",t)){const t=e.restored?n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await F(se.studio(n,t),n,e)}}},we={command:"$0 [args..]",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await ye(e),n=`${e.args?.join(" ")??""}`.trimEnd();for(const r of Z(`prisma ${n}`,t))await F(`PRISMA ${n}`,r,e)}};async function ye(e){const t=await x(e);t||(console.error(c.red("No project found.")),process.exit(1));const n=t.descendants.filter((e=>e.packageJson.dependencies?.prisma||e.packageJson.devDependencies?.prisma));return 0===n.length&&(console.error(c.red("No prisma project found.")),process.exit(1)),n}const be={command:"retry [command] [args...]",describe:"Retry the given command until it succeeds",builder:{retry:{description:"A maximum retry count",type:"number",alias:"r",default:3}},async handler(e){const t=N(e);t||(console.error(c.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let s=0;s<e.retry;s++)if(s>0&&console.info(`\n${c.yellow(`#${s} Retrying: ${n.join(" ")}`)}`),r=await F(n.join(" "),t,e,{exitIfFailed:!1}),0===r)return;process.exit(r)}},ve=["express","fastify","elysia"],$e={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await x(e,!1,t);n||(console.error(c.red("No project found.")),process.exit(1));for(const t of Z("setup",n.descendants)){const s=await f.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===h.platform()){const n=["pstree"];t.hasDockerfile&&n.push("expect"),await Y(`brew install ${n.join(" ")}`,t,e)}s.some((e=>e.isFile()&&e.name.includes("-version")))&&await F("asdf install",t,e)}if(s.some((e=>e.isFile()&&"pyproject.toml"===e.name))){await Y("poetry config virtualenvs.in-project true",t,e),await Y("poetry config virtualenvs.prefer-active-python true",t,e);const[,n]=r.execSync("asdf current python").toString().trim().split(/\s+/);await Y(`poetry env use ${n}`,t,e),await z.promiseAll(),await F("poetry run pip install --upgrade pip",t,e),await F("poetry install --ansi",t,e)}const o=t.packageJson.dependencies??{},i=t.packageJson.devDependencies||{},a=t.packageJson.scripts??{},c=[];let d=[];o.blitz||o.next||i["@remix-run/dev"]?(c.push("pm2"),d.push("concurrently","open-cli","vitest","wait-on")):ve.some((e=>o[e]))&&(c.push("pm2"),d.push("concurrently","vitest","wait-on")),j&&(d=d.filter((e=>"vitest"!==e))),c.length>0&&await F(`${R} add ${c.join(" ")}`,t,e),d.length>0&&await F(`${R} add -D ${d.join(" ")}`,t,e),a["gen-code"]&&await F(`${D} gen-code`,t,e)}}(e)}};const ke=new class{buildDevImage(t,n){const r=t.dockerPackageJson.scripts?.["docker/build/prepare"]?"yarn run docker/build/prepare && ":"";return`cd ${e.dirname(t.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${t.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo amd64)\n --build-arg WB_ENV=${t.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t=!1,n="",r=""){return`${this.stop(e)} && ${t?"unbuffer ":""}${this.start(e,n,r)}`}start(e,t="",n=""){return function(e,t){const n=async()=>{if(W.has(e))return;W.add(e),U(e,t);const{status:n}=o(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});L(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e),`docker run --rm -it -p 8080:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class Ee{constructor(e=Number(process.env.PORT)||3e3){this.defaultPort=e}buildDocker(e,t="development"){return ke.buildDevImage(e,t)}startDocker(e,t){return`${this.buildDocker(e)}\n && YARN concurrently --raw --kill-others-on-fail\n "${ke.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e,t,8080)}"`}testE2E(e,t,{playwrightArgs:n="test tests/e2e",prismaDirectory:r,startCommand:s}){const o=e.env.WB_ENV,i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`WB_ENV=${o} NEXT_PUBLIC_WB_ENV=${o} APP_ENV=${o} PORT=8080 YARN concurrently --kill-others --raw --success first\n "rm -Rf ${r}/mount && ${s} && exit 1"\n "concurrently --kill-others-on-fail --raw 'wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${"test tests/e2e"===n&&t.target?n.replace("tests/e2e",t.target):n}${i}"`}testE2EDev(e,t,{playwrightArgs:n="test tests/e2e",startCommand:r}){const s=e.env.WB_ENV,o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`WB_ENV=${s} NEXT_PUBLIC_WB_ENV=${s} APP_ENV=${s} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${r} && exit 1"\n "concurrently --kill-others-on-fail --raw 'wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${"test tests/e2e"===n&&t.target?n.replace("tests/e2e",t.target):n}${o}"`}testUnit(e,t){return`WB_ENV=${e.env.WB_ENV} YARN vitest run ${t.target||"tests/unit"} --color --passWithNoTests --allowOnly`}waitApp(e,t,n=this.defaultPort){return`wait-on -t 10000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${n}`}waitAndOpenApp(e,t,n=this.defaultPort){return`${this.waitApp(e,t,n)} || wait-on http-get://127.0.0.1:${n} && open-cli http://\${HOST:-localhost}:${n}`}}const Ae=new class extends Ee{constructor(){super()}start(e,t){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}YARN concurrently --raw --kill-others-on-fail\n "blitz dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${se.reset(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:r=`${se.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"db",startCommand:r})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r="blitz dev -p 8080"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r})}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "blitz dev" "${this.waitApp(e,t)}"`}};const Ne=new class extends Ee{constructor(){super()}start(e,t){return`YARN build-ts run src/index.ts ${t.watch?"--watch":""} -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${ke.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production PORT=\${PORT:-${n}} ${S} dist/index.js ${t.normalizedArgsText??""}`}testE2E(e,t,{startCommand:n=`${e.hasPrisma?"prisma migrate reset --force --skip-generate && ":""}(${this.startProduction(e,t)})`}){const r=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly${r}"`}testE2EDev(e,t,{startCommand:n}){const r=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n||this.start(e,t)} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly${r}"`}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "${this.start(e,t)}" "${this.waitApp(e,t)}"`}};const xe=new class extends Ee{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "next dev --turbo ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?[se.reset(e)]:[],e.buildCommand,`PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...e.hasPrisma?[se.reset(e)]:[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].join(" && ")})}testE2EDev(e,t,{startCommand:n="next dev --turbo -p 8080"}){return super.testE2EDev(e,t,{startCommand:n})}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "next dev --turbo" "${this.waitApp(e,t)}"`}};const Pe=new class extends Ee{constructor(){super()}start(e,t){return`YARN build-ts run src/index.ts ${t.watch?"--watch":""} -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${ke.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${S} dist/index.js ${t.normalizedArgsText??""}`}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return"echo 'do nothing.'"}};const je=new class extends Ee{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "remix dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${se.reset(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:r=`${se.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"prisma",startCommand:r})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r="remix dev"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r})}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "remix dev" "${this.waitApp(e,t)}"`}},Se={command:"start [args..]",describe:"Start app",builder:{watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug",type:"string",alias:"m"}},async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[]].map((e=>`'${e}'`)).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map((e=>`'${e}'`)).join(" ")}(e);const t=await x(e);t||(console.error(c.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies||{},r=n.packageJson.devDependencies||{};let s;if(t.blitz)s=Ae;else if(t.next)s=xe;else if(r["@remix-run/dev"])s=je;else if(ve.some((e=>t[e]))&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))s=Ne;else{if(!t["build-ts"]&&!r["build-ts"])continue;s=Pe}switch(console.info(`Running "start" for ${n.name} ...`),e.mode||"dev"){case"dev":case"development":{const r=Re(t,"development");await F(`${r}${s.start(n,e)}`,n,e);break}case"staging":{const r=Re(t,"staging");await F(`${r}${s.startProduction(n,e,8080)}`,n,e);break}case"docker":{const r=Re(t,"staging");await F(`${r}${s.startDocker(n,e)}`,n,e);break}case"docker-debug":{const r=Re(t,"staging");e.normalizedArgsText="'/bin/bash'",await F(`${r}${s.startDocker(n,e)}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function Re(e,t){process.env.WB_ENV||=t;let n=`WB_ENV=${process.env.WB_ENV} `;return e.next&&(process.env.NEXT_PUBLIC_WB_ENV=process.env.WB_ENV,n+=`NEXT_PUBLIC_WB_ENV=${process.env.WB_ENV} `),n}const De={command:"test",describe:"Test project. If you pass no arguments, it will run all tests.",builder:{ci:{description:"Whether to run tests on CI",type:"boolean"},e2e:{description:"Whether to run e2e tests. You may pass mode as argument: none | headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string"},start:{description:"Whether to run start tests",type:"boolean"},unit:{description:"Whether to run unit tests",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"},target:{description:"Test target",type:"string",alias:"t"}},async handler(t){await async function(t){const n=await x(t);n||(console.error(c.red("No project found.")),process.exit(1));n.descendants.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const r=void 0===t.e2e&&void 0===t.start&&void 0===t.unit;for(const s of n.descendants){const n=s.packageJson.dependencies||{},o=s.packageJson.devDependencies||{};let i;i=n.blitz?Ae:n.next?xe:o["@remix-run/dev"]?je:ve.some((e=>n[e]))&&!n["firebase-functions"]?Ne:Pe,r&&(t={...t,e2e:a.existsSync(e.join(s.dirPath,"tests","e2e"))&&!t.target?.includes("/unit/")?"headless":"none",start:!0,unit:a.existsSync(e.join(s.dirPath,"tests","unit"))&&!t.target?.includes("/e2e/")}),console.info(`Running "test" for ${s.name} ...`);const c=[];if(!t.ci){switch(t.unit&&c.push(F(i.testUnit(s,t),s,t,{timeout:t.unitTimeout})),t.start&&c.push(F(i.testStart(s,t),s,t)),await Promise.all(c),t.e2e){case void 0:case"none":continue;case"":case"headless":await F(i.testE2E(s,t,{}),s,t);continue;case"headless-dev":await F(i.testE2EDev(s,t,{}),s,t);continue;case"docker":await _e(s,t,i);continue;case"docker-debug":await _e(s,t,i,`test ${t.target||"tests/e2e"} --debug`);continue}if(n.blitz||n.next||o["@remix-run/dev"])switch(t.e2e){case"headed":await F(i.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"headed-dev":await F(i.testE2EDev(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"debug":await F(i.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --debug`}),s,t);continue;case"generate":await F(i.testE2E(s,t,{playwrightArgs:"codegen http://localhost:8080"}),s,t);continue;case"trace":await F("BUN playwright show-trace",s,t);continue}throw new Error(`Unknown e2e mode: ${t.e2e}`)}if(await Y(ke.stopAll(),s,t),t.unit&&await Y(i.testUnit(s,t).replaceAll(" --allowOnly",""),s,t,{timeout:t.unitTimeout}),t.start&&await Y(i.testStart(s,t),s,t),await z.promiseAll(),"none"!==t.e2e){s.hasDockerfile&&await F(`${i.buildDocker(s,"test")}`,s,t);const e=s.hasDockerfile?{startCommand:ke.stopAndStart(s,!0)}:{};process.exitCode=await F(i.testE2E(s,t,e).replaceAll(" --allowOnly",""),s,t,{exitIfFailed:!1}),await F(ke.stop(s),s,t)}}}(t)}};async function _e(e,t,n,r){await F(`${n.buildDocker(e,"test")}`,e,t),process.exitCode=await F(`${n.testE2E(e,t,{playwrightArgs:r,startCommand:ke.stopAndStart(e,!0)})}`,e,t,{exitIfFailed:!1}),await F(ke.stop(e),e,t)}const Oe={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(e){const t=await x(e,!1);t||(console.error(c.red("No project found.")),process.exit(1));const n=t.descendants.map((n=>{const r=[];if(n.packageJson.workspaces?n.hasSourceCode&&(n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&r.push("BUN tsc --noEmit --Pretty"):((n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&r.push("BUN tsc --noEmit --Pretty"),n.packageJson.devDependencies?.pyright&&r.push("YARN pyright")),r.length>0)return Y(r.join(" && "),n,e,{ci:t.descendants.length>1,forceColor:!0})})),r=await Promise.all(n);let s=0;for(const[e,n]of r.entries())if(n){(t.descendants[e].packageJson.dependencies||{}).blitz&&console.info(c.yellow('Please try "yarn gen-code" if you face unknown type errors.')),s=n}s&&process.exit(s)}},Be={...Oe,command:"tc"},Te={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"},"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}};await t(n(process.argv)).scriptName("wb").options(Te).middleware((t=>{const n=t["working-dir"];if(n){const t=e.resolve(n);process.chdir(t)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)})).command(_).command(Q).command(ee).command(ie).command(be).command($e).command(Se).command(De).command(Oe).command(Be).demandCommand().strict().help().argv;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,(()=>process.exit()));
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9tZW1vaXplLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9oYXNoLmpzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvc2NyaXB0cy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhckNvdW50XVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgbnVtYmVyXVtdXSB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLmZpbHRlcigoZW52UGF0aCkgPT4gZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlbGF0aXZlKGN3ZCwgZW52UGF0aCkpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cHJvY2Vzcy5lbnYuV0JfRU5WfSwgTk9ERV9FTlY6ICR7cHJvY2Vzcy5lbnYuTk9ERV9FTlZ9YCk7XG4gICAgY29uc29sZS5pbmZvKCdSZWFkaW5nIGVudiBmaWxlczonLCBlbnZQYXRocy5qb2luKCcsICcpKTtcbiAgfVxuXG4gIGNvbnN0IGVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzOiBbc3RyaW5nLCBudW1iZXJdW10gPSBbXTtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudlBhdGggb2YgZW52UGF0aHMpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSkpIHtcbiAgICAgIGlmIChlbnZWYXJzW2tleV0gIT09IHZhbHVlKSB7XG4gICAgICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlycy5wdXNoKFtlbnZQYXRoLCBjb3VudF0pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgY291bnQgPiAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtjb3VudH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhcmd2LmNoZWNrRW52KSB7XG4gICAgY29uc3QgZXhhbXBsZUtleXMgPSBPYmplY3Qua2V5cyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBhcmd2LmNoZWNrRW52KSkgfHwge30pO1xuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gZXhhbXBsZUtleXMuZmlsdGVyKChrZXkpID0+ICEoa2V5IGluIGVudlZhcnMpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2VudlZhcnMsIGVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzXTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzIGFuZCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgT2JqZWN0LmFzc2lnbihwcm9jZXNzLmVudiwgZW52VmFycyk7XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG5jb25zdCBjYWNoZWRFbnZWYXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbmZ1bmN0aW9uIHJlYWRFbnZGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVkRW52VmFycy5nZXQoZmlsZVBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShmaWxlUGF0aCksIHByb2Nlc3NFbnY6IHt9IH0pLnBhcnNlZCA/PyB7fTtcbiAgY2FjaGVkRW52VmFycy5zZXQoZmlsZVBhdGgsIHBhcnNlZCk7XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxhdGVkIHRvIG5wbSBhbmQgeWFybiBmcm9tIHRoZSBnaXZlbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogdm9pZCB7XG4gIC8vIFJlbW92ZSBucG0gJiB5YXJuIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHByb2Nlc3MuZW52XG4gIGlmIChlbnZWYXJzLlBBVEggJiYgZW52VmFycy5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52VmFycy5QQVRIID0gZW52VmFycy5QQVRILnJlcGxhY2UoYCR7ZW52VmFycy5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gbWFjT1NcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC9wcml2YXRlXFwvdmFyXFwvZm9sZGVyc1xcL1teOl0rOi9nLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcmllcyBpbiBMaW51eFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ZhclxcL3RtcFxcL1teOl0rOi9nLCAnJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC90bXBcXC9bXjpdKzovZywgJycpO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgY29uc3QgdXBwZXJLZXkgPSBrZXkudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoXG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdOUE1fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ1lBUk5fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ0JFUlJZXycpIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ1BST0pFQ1RfQ1dEJyB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdJTklUX0NXRCdcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBlbnZWYXJzW2tleV07XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFNwYXduT3B0aW9ucyxcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZSxcbiAgU3Bhd25TeW5jUmV0dXJucyxcbiAgU3RkaW9OdWxsLFxuICBTdGRpb1BpcGUsXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB0cmVlS2lsbCBmcm9tICd0cmVlLWtpbGwnO1xuXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jUmV0dXJucyA9IE9taXQ8U3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+LCAnb3V0cHV0JyB8ICdlcnJvcic+O1xuXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jT3B0aW9ucyA9IChcbiAgfCBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW9cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zXG4pICYge1xuICBpbnB1dD86IHN0cmluZztcbiAgbWVyZ2VPdXRBbmRFcnJvcj86IGJvb2xlYW47XG4gIGtpbGxPbkV4aXQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzcGF3bkFzeW5jKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M/OiBSZWFkb25seUFycmF5PHN0cmluZz4sXG4gIG9wdGlvbnM/OiBTcGF3bkFzeW5jT3B0aW9uc1xuKTogUHJvbWlzZTxTcGF3bkFzeW5jUmV0dXJucz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm9jID0gc3Bhd24oY29tbWFuZCwgYXJncyA/PyBbXSwgb3B0aW9ucyA/PyB7fSk7XG4gICAgICAvLyBgc2V0RW5jb2RpbmdgIGlzIHVuZGVmaW5lZCBpbiBCdW5cbiAgICAgIHByb2Muc3Rkb3V0Py5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/Lm1lcmdlT3V0QW5kRXJyb3IpIHtcbiAgICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGRlcnIgKz0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzdG9wUHJvY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHN0b3BwZWQgfHwgIXByb2MucGlkKSByZXR1cm47XG5cbiAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGB0cmVlS2lsbCgke3Byb2MucGlkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnM/LmtpbGxPbkV4aXQpIHtcbiAgICAgICAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5vbignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgfVxuXG4gICAgICBwcm9jLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyBtZW1vaXplRmFjdG9yeSB9IGZyb20gJ2F0LWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5jb25zdCBtZW1vaXplID0gbWVtb2l6ZUZhY3RvcnkoeyBtYXhDYWNoZWRUaGlzU2l6ZTogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsIG1heENhY2hlZEFyZ3NTaXplOiAxIH0pO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5sb2FkRW52KSByZXR1cm4gcHJvY2Vzcy5lbnY7XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gICAgLy8gT3ZlcndyaXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBldmVuIHRob3VnaCB0aGlzIGJlaGF2aW9yIGlzIG5vbi1zdGFuZGFyZFxuICAgIC8vIGJlY2F1c2UgYGJ1biB3YiAuLi5gIHdpbGwgbG9hZCAuZW52IGFuZCAuZW52LmxvY2FsIGJlZm9yZSBgd2JgIGxvYWRzIG90aGVyIHZhcmlhYmxlcy5cbiAgICByZXR1cm4geyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9O1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydwcmlzbWEnXSB8fCB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uWydwcmlzbWEnXSk7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSA9PT0gdGhpcy5kaXJQYXRoXG4gICAgICA/IHRoaXMucGFja2FnZUpzb25cbiAgICAgIDogSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGJpbkV4aXN0cygpOiBib29sZWFuIHtcbiAgICBsZXQgYmluRm91bmQgPSBmYWxzZTtcbiAgICBsZXQgY3VycmVudFBhdGggPSB0aGlzLmRpclBhdGg7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgYmluUGF0aCA9IHBhdGguam9pbihjdXJyZW50UGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhiaW5QYXRoKSkge1xuICAgICAgICB0aGlzLmVudi5QQVRIID0gYCR7YmluUGF0aH06JHt0aGlzLmVudi5QQVRIfWA7XG4gICAgICAgIGJpbkZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnLmdpdCcpKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgICAgaWYgKGN1cnJlbnRQYXRoID09PSBwYXJlbnRQYXRoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY3VycmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gYmluRm91bmQ7XG4gIH1cblxuICBmaW5kRmlsZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgZmlsZVBhdGggPSB0aGlzLnBhdGhCeU5hbWUuZ2V0KGZpbGVOYW1lKTtcbiAgICBpZiAoZmlsZVBhdGgpIHJldHVybiBmaWxlUGF0aDtcblxuICAgIGZpbGVQYXRoID0gW2ZpbGVOYW1lLCBwYXRoLmpvaW4oJy4uJywgJy4uJywgZmlsZU5hbWUpXVxuICAgICAgLm1hcCgocCkgPT4gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgcCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlTmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5wYXRoQnlOYW1lLnNldChmaWxlTmFtZSwgZmlsZVBhdGgpO1xuICAgIHJldHVybiBmaWxlUGF0aDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvdW5kUHJvamVjdHMge1xuICByb290OiBQcm9qZWN0O1xuICBzZWxmOiBQcm9qZWN0O1xuICBkZXNjZW5kYW50czogUHJvamVjdFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNlbGZQcm9qZWN0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnYgPSB0cnVlLCBkaXJQYXRoPzogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmREZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBQcm9taXNlPEZvdW5kUHJvamVjdHMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgcm9vdEFuZFNlbGZQcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGxvYWRFbnYsIGRpclBhdGgpO1xuICBpZiAoIXJvb3RBbmRTZWxmUHJvamVjdHMpIHJldHVybjtcblxuICByZXR1cm4ge1xuICAgIC4uLnJvb3RBbmRTZWxmUHJvamVjdHMsXG4gICAgZGVzY2VuZGFudHM6XG4gICAgICByb290QW5kU2VsZlByb2plY3RzLnJvb3QgPT09IHJvb3RBbmRTZWxmUHJvamVjdHMuc2VsZlxuICAgICAgICA/IGF3YWl0IGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCByb290QW5kU2VsZlByb2plY3RzLnJvb3QsIGxvYWRFbnYpXG4gICAgICAgIDogW3Jvb3RBbmRTZWxmUHJvamVjdHMuc2VsZl0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IE9taXQ8Rm91bmRQcm9qZWN0cywgJ2Rlc2NlbmRhbnRzJz4gfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICBjb25zdCB0aGlzUHJvamVjdCA9IG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICBsZXQgcm9vdFByb2plY3QgPSB0aGlzUHJvamVjdDtcbiAgaWYgKCF0aGlzUHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmIHBhdGguZGlybmFtZShkaXJQYXRoKS5lbmRzV2l0aCgnL3BhY2thZ2VzJykpIHtcbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIHJvb3RQcm9qZWN0ID0gbmV3IFByb2plY3Qocm9vdERpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyByb290OiByb290UHJvamVjdCwgc2VsZjogdGhpc1Byb2plY3QgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICByb290UHJvamVjdDogUHJvamVjdCxcbiAgbG9hZEVudjogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBbcm9vdFByb2plY3RdO1xuXG4gIGNvbnN0IHdvcmtzcGFjZSA9IHJvb3RQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2UpKSByZXR1cm4gcHJvamVjdHM7XG5cbiAgY29uc3QgZ2xvYlBhdHRlcm46IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VEaXJzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdGggb2Ygd29ya3NwYWNlLm1hcCgod3M6IHN0cmluZykgPT4gcGF0aC5qb2luKHJvb3RQcm9qZWN0LmRpclBhdGgsIHdzKSkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh3b3Jrc3BhY2VQYXRoKSkge1xuICAgICAgcGFja2FnZURpcnMucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYlBhdHRlcm4ucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9XG4gIH1cbiAgcGFja2FnZURpcnMucHVzaCguLi4oYXdhaXQgZ2xvYmJ5KGdsb2JQYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSk7XG4gIGZvciAoY29uc3Qgc3ViUGFja2FnZURpclBhdGggb2YgcGFja2FnZURpcnMpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHN1YlBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcblxuICAgIHByb2plY3RzLnB1c2gobmV3IFByb2plY3Qoc3ViUGFja2FnZURpclBhdGgsIGFyZ3YsIGxvYWRFbnYpKTtcbiAgfVxuICByZXR1cm4gcHJvamVjdHM7XG59XG4iLCJpbXBvcnR7Y3lyYjY0SGFzaFdpdGhMZW5ndGggYXMgZX1mcm9tXCIuL2hhc2guanNcIjtjb25zdCB0PXMoKTtmdW5jdGlvbiBzKHtjYWNoZUR1cmF0aW9uOnQ9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGNhY2hlczpzLGNhbGNLZXk6bj0odD0+ZShKU09OLnN0cmluZ2lmeSh0KSkpLG1heENhY2hlZEFyZ3NTaXplOmk9MTAwLG1heENhY2hlZFRoaXNTaXplOmM9MTB9PXt9KXtyZXR1cm4gZnVuY3Rpb24oZSxvKXtpZihcImdldHRlclwiPT09bz8ua2luZCl7Y29uc3Qgbj1uZXcgTWFwO3JldHVybiBzPy5wdXNoKG4pLGZ1bmN0aW9uKCl7Y29uc3Qgcz1EYXRlLm5vdygpO2lmKG4uaGFzKHRoaXMpKXtjb25zdFtlLGldPW4uZ2V0KHRoaXMpO2lmKHMtaTw9dClyZXR1cm4gZX1jb25zdCBpPWUuY2FsbCh0aGlzKTtpZihuLnNpemU+PWMpe2NvbnN0IGU9bi5rZXlzKCkubmV4dCgpLnZhbHVlO24uZGVsZXRlKGUpfXJldHVybiBuLnNldCh0aGlzLFtpLHNdKSxpfX17Y29uc3Qgcj1uZXcgTWFwO3JldHVybiBzPy5wdXNoKHIpLGZ1bmN0aW9uKC4uLnMpe2NvbnN0IGE9bihzKTtsZXQgaD1yLmdldCh0aGlzKTtjb25zdCB1PURhdGUubm93KCk7aWYoaCl7aWYoaC5oYXMoYSkpe2NvbnN0W2Usc109aC5nZXQoYSk7aWYodS1zPD10KXJldHVybiBlfX1lbHNle2lmKGg9bmV3IE1hcCxyLnNpemU+PWMpe2NvbnN0IGU9ci5rZXlzKCkubmV4dCgpLnZhbHVlO3IuZGVsZXRlKGUpfXIuc2V0KHRoaXMsaCl9Y29uc3QgZj1vP2UuY2FsbCh0aGlzLC4uLnMpOmUoLi4ucyk7aWYoaC5zaXplPj1pKXtjb25zdCBlPWgua2V5cygpLm5leHQoKS52YWx1ZTtoLmRlbGV0ZShlKX1yZXR1cm4gaC5zZXQoYSxbZix1XSksZn19fX1leHBvcnR7dCBhcyBtZW1vaXplLHMgYXMgbWVtb2l6ZUZhY3Rvcnl9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZS5qcy5tYXBcbiIsImZ1bmN0aW9uIHQodCxuPTApe2NvbnN0W2kscl09ZnVuY3Rpb24odCxuPTApe2xldCBpPTM3MzU5Mjg1NTlebixyPTExMDM1NDc5OTFebjtmb3IobGV0IG4sYT0wO2E8dC5sZW5ndGg7YSsrKW49dC5jb2RlUG9pbnRBdChhKSxpPU1hdGguaW11bChpXm4sMjY1NDQzNTc2MSkscj1NYXRoLmltdWwocl5uLDE1OTczMzQ2NzcpO3JldHVybiBpPU1hdGguaW11bChpXmk+Pj4xNiwyMjQ2ODIyNTA3KSxpXj1NYXRoLmltdWwocl5yPj4+MTMsMzI2NjQ4OTkwOSkscj1NYXRoLmltdWwocl5yPj4+MTYsMjI0NjgyMjUwNykscl49TWF0aC5pbXVsKGleaT4+PjEzLDMyNjY0ODk5MDkpLFtyPj4+MCxpPj4+MF19KHQsbik7cmV0dXJuIHQubGVuZ3RoLnRvU3RyaW5nKDM2KStpLnRvU3RyaW5nKDM2KS5wYWRTdGFydCg3LFwiMFwiKStyLnRvU3RyaW5nKDM2KS5wYWRTdGFydCg3LFwiMFwiKX1leHBvcnR7dCBhcyBjeXJiNjRIYXNoV2l0aExlbmd0aH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoLmpzLm1hcFxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID0gcHJvY2Vzcy5hcmd2WzBdLmVuZHNXaXRoKCcvYnVuJykgfHwgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBidWlsZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+KTogYm9vbGVhbiB7XG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGFyZ3YuY29tbWFuZCA/PyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIH07XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgUnVuICcke2FyZ3YuY29tbWFuZH0nYCkpO1xuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoYXJndi5jb21tYW5kID8/ICcnLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gYXdhaXQgZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkpIHtcbiAgICBidWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtjYW5Ta2lwLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF0gPSBhd2FpdCBjYW5Ta2lwQnVpbGQocHJvamVjdCwgYXJndik7XG4gIGlmIChjYW5Ta2lwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTa2lwIHRvIHJ1biAnJHthcmd2LmNvbW1hbmR9JyDwn5KrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghYnVpbGQocHJvamVjdCwgYXJndikpIHJldHVybjtcblxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBpZ25vcmluZ0VudlZhck5hbWVzID0gbmV3IFNldChbJ0NJJywgJ1BXREVCVUcnLCAnVE1QRElSJ10pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuU2tpcEJ1aWxkKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdnaXQgcmV2LXBhcnNlIEhFQUQnLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC5zb3J0KChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudEhhc2ggPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgcmV0dXJuIFtjYWNoZWRDb250ZW50SGFzaCA9PT0gY29udGVudEhhc2gsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gWydzcmMvJywgJ3B1YmxpYy8nXTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbl07XG5jb25zdCBleGNsdWRlUGF0dGVybnMgPSBbJ3Rlc3QvJywgJ3Rlc3RzLycsICdfX3Rlc3RzX18vJywgJ3Rlc3QtZml4dHVyZXMvJ107XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ2RpZmYnLCAnLS1uYW1lLW9ubHknXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgZmlsZVBhdGhzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcCgoZmlsZVBhdGgpID0+XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnID8gZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC9zY3JpcHRzXFwvdGVzdC1maXh0dXJlc1xcL1teL10rXFwvLywgJycpIDogZmlsZVBhdGhcbiAgICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKFxuICAgICAgKGZpbGVQYXRoKSA9PlxuICAgICAgICAoaW5jbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBmaWxlUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWV4Y2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSlcbiAgICApO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEZpbGVQYXRocy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aFxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnLS0nLCAuLi5maWx0ZXJlZEZpbGVQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGRhdGEudG9TdHJpbmcoKSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gUHJvbWlzZTxUPixcbiAgeyBiZWZvcmVSZXRyeSwgaGFuZGxlRXJyb3IsIHJldHJ5Q291bnQgPSAzLCByZXRyeUxvZ2dlciwgc2xlZXBNaWxsaXNlY29uZHMgPSAwIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogZXJyb3J9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0KTtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHBvcnQgPSBydW5uYWJsZVNjcmlwdC5tYXRjaCgvaHR0cC1nZXQ6XFwvXFwvMTI3LjAuMC4xOihcXGQrKS8pPy5bMV07XG4gIGlmIChydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnd2FpdC1vbicpICYmIHBvcnQgJiYgIXJ1bm5hYmxlU2NyaXB0LmluY2x1ZGVzKCdkb2NrZXIgcnVuJykpIHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChOdW1iZXIocG9ydCkpO1xuICB9XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHM/LnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzPy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FwaXRhbGl6ZWQgY29tbWFuZHMgKGUuZy4sIFlBUk4sIFBSSVNNQSwgQlVOKSB3aXRoIHN1aXRhYmxlIGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuIC0tYnVuKSBydW5gXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ3lhcm4gcnVuICcpO1xuICBpZiAoaXNSdW5uaW5nT25CdW4pIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gLS1idW4gcnVuIGJ1biAtLWJ1biBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpXG4gICAgICAucmVwbGFjZUFsbCgvKD86WUFSTiApP3ZpdGVzdCBydW4vZywgJ2J1biB0ZXN0JylcbiAgICAgIC8vICctLWFsbG93T25seScgaXMgc29tZXRpbWVzIHJlbW92ZWQuXG4gICAgICAucmVwbGFjZUFsbCgvIC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMoPzogLS1hbGxvd09ubHkpPy9nLCAnJyk7XG4gIH1cbiAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0LnRyaW0oKTtcbiAgcmV0dXJuIFtcbiAgICBmaXhCdW5Db21tYW5kKG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCkpLFxuICAgIGZpeEJ1bkNvbW1hbmQoXG4gICAgICBuZXdTY3JpcHRcbiAgICAgICAgLy8gQmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBgeWFybiBwbGF5d3JpZ2h0YCBpbiBhIHByb2plY3QgZGVwZW5kaW5nIG9uIGBhcnRpbGxlcnktZW5naW5lLXBsYXl3cmlnaHRgLlxuICAgICAgICAucmVwbGFjZUFsbCgnWUFSTiBwbGF5d3JpZ2h0ICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgICAgICAucmVwbGFjZUFsbCgnWUFSTiAnLCAhaXNSdW5uaW5nT25CdW4gJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYClcbiAgICApLFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QsIHByZWZpeCA9ICdTdGFydCcsIHdlYWsgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgJ1xcbicgK1xuICAgICAgKHdlYWsgPyBjaGFsay5ncmF5IDogY2hhbGsuY3lhbikoY2hhbGsuYm9sZChgJHtwcmVmaXh9OmApLCBub3JtYWxpemVkU2NyaXB0KSArXG4gICAgICBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBleGl0Q29kZTogbnVtYmVyIHwgbnVsbCxcbiAgb3B0czogT21pdDxPcHRpb25zLCAndGltZW91dCc+XG4pOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBzY3JpcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTogYCksIHNjcmlwdCkpO1xuICAgIGlmIChvcHRzLmV4aXRJZkZhaWxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSA/PyAxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uZmlndXJlRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiwgb3B0czogT3B0aW9ucyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0VudlsnQ0knXSA9ICcxJztcbiAgfVxuICBpZiAob3B0cy5mb3JjZUNvbG9yKSB7XG4gICAgbmV3RW52WydGT1JDRV9DT0xPUiddID0gJzMnO1xuICB9XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgfHwgY29tbWFuZC5pbmNsdWRlcygncG0yLXJ1bnRpbWUnKSB8fCBjb21tYW5kLmluY2x1ZGVzKCd0ZXN0L2UyZS1hZGRpdGlvbmFsJylcbiAgICA/IGNvbW1hbmQucmVwbGFjZUFsbCgnYnVuIC0tYnVuJywgJ2J1bicpXG4gICAgOiBjb21tYW5kO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmaXg6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpeCB0aGUgbGludGluZyBlcnJvcnMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZm9ybWF0OiB7XG4gICAgZGVzY3JpcHRpb246ICdGb3JtYXQgdGhlIGNvZGUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGZpbGVzOiB7XG4gICAgZGVzY3JpcHRpb246ICdGaWxlIGFuZCBkaXJlY3RvcnkgcGF0aHMgdG8gbGludCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGJpb21lRXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydjanMnLCAnY3RzJywgJ2pzJywgJ2pzb24nLCAnanNvbmMnLCAnanN4JywgJ21qcycsICdtdHMnLCAndHMnLCAndHN4J10pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcblxuZXhwb3J0IGNvbnN0IGxpbnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUgb24gQnVuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKCFpc1J1bm5pbmdPbkJ1bikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBCdW4uJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gYXJndi5maWxlcyA/PyBbXTtcbiAgICBsZXQgYmlvbWVBcmdzVGV4dDogc3RyaW5nO1xuICAgIGxldCBwcmV0dGllckFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgcGFja2FnZUpzb25GaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoU3RyaW5nKGZpbGUpKTtcbiAgICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC1maXh0dXJlcycpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvcGFja2FnZS5qc29uJykpIHtcbiAgICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJpb21lQXJnc1RleHQgPSBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgICBwcmV0dGllckFyZ3NUZXh0ID0gZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzVGV4dCA9IHBhY2thZ2VKc29uRmlsZVBhdGhzLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaW9tZUFyZ3NUZXh0ID0gJyc7XG4gICAgICBwcmV0dGllckFyZ3NUZXh0ID0gYFwiKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfVwiIFwiISoqL3Rlc3QtZml4dHVyZXMvKipcImA7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzVGV4dCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gYFwiJHtwLnBhY2thZ2VKc29uUGF0aH1cImApLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaW9tZUNvbW1hbmQgPSBhcmd2LmZpeCAmJiBhcmd2LmZvcm1hdCA/ICdjaGVjayAtLWZpeCcgOiBhcmd2LmZpeCA/ICdsaW50IC0tZml4JyA6ICdsaW50JztcbiAgICBsZXQgYmlvbWVQcm9taXNlOiBQcm9taXNlPG51bWJlcj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGJpb21lQXJnc1RleHQgfHwgZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBiaW9tZVByb21pc2UgPSBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICBgYnVuIC0tYnVuIGJpb21lICR7YmlvbWVDb21tYW5kfSAtLWNvbG9ycz1mb3JjZSAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1maWxlcy1pZ25vcmUtdW5rbm93bj10cnVlICR7YmlvbWVBcmdzVGV4dH1gLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICB7IGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICBpZiAocHJldHRpZXJBcmdzVGV4dCkge1xuICAgICAgICB2b2lkIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gICAgICAgICAgYGJ1biAtLWJ1biBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlICR7cHJldHRpZXJBcmdzVGV4dH1gLFxuICAgICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7IGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0KSB7XG4gICAgICAgIGF3YWl0IGJpb21lUHJvbWlzZTtcbiAgICAgICAgdm9pZCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBidW4gLS1idW4gc29ydC1wYWNrYWdlLWpzb24gJHtzb3J0UGFja2FnZUpzb25BcmdzVGV4dH1gLCBwcm9qZWN0cy5zZWxmLCBhcmd2LCB7XG4gICAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nLCBwcm9qZWN0czogUHJvamVjdFtdKTogR2VuZXJhdG9yPFByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiJHtjb21tYW5kTmFtZX1cIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgeWllbGQgcHJvamVjdDtcbiAgfVxufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBvdXRzaWRlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBvcHRpbWl6YXRpb24gaXMgZXhlY3V0ZWQgb3V0c2lkZSBhIGRvY2tlciBjb250YWluZXIgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJyxcbiAgZGVzY3JpYmU6ICdPcHRpbWl6ZSBjb25maWd1cmF0aW9uIHdoZW4gYnVpbGRpbmcgYSBEb2NrZXIgaW1hZ2UnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICBjb25zdCBrZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldIHx8IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwcykpIHtcbiAgICAgICAgICBpZiAodmFsdWU/LnN0YXJ0c1dpdGgoJ2dpdEBnaXRodWIuY29tOicpKSB7XG4gICAgICAgICAgICBkZXBzW25hbWVdID0gYC4vJHtuYW1lfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKCdJbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3Y6IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFhcmd2Lm91dHNpZGUpIHtcbiAgICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuICAgIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gIGNvbnN0IG5hbWVXb3Jkc1RvQmVSZW1vdmVkID0gW1xuICAgICdhcnRpbGxlcnknLFxuICAgICdjb25jdXJyZW50bHknLFxuICAgICdjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICdlc2xpbnQnLFxuICAgICdodXNreScsXG4gICAgJ2ltYWdlbWluJyxcbiAgICAnamVzdCcsXG4gICAgJ2tpbGwtcG9ydCcsXG4gICAgJ2xpbnQtc3RhZ2VkJyxcbiAgICAnb3Blbi1jbGknLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgICAnd2FpdC1vbicsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgICghYXJndi5vdXRzaWRlICYmIG5hbWUuaW5jbHVkZXMoJ3dpbGxib29zdGVyJykgJiYgbmFtZS5pbmNsdWRlcygnY29uZmlnJykpXG4gICAgKSB7XG4gICAgICBkZWxldGUgZGV2RGVwc1tuYW1lXTtcbiAgICAgIHJlbW92ZWREZXBzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBkZXZEZXBlbmRlbmNpZXM6JywgcmVtb3ZlZERlcHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydjaGVjaycsICdkZXBsb3knLCAnZm9ybWF0JywgJ2xpbnQnLCAnc3RhcnQnLCAndGVzdCddO1xuICBjb25zdCBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsncGluc3QgJywgJ2h1c2t5ICddO1xuICBjb25zdCBzY3JpcHRzID0gKHBhY2thZ2VKc29uLnNjcmlwdHMgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbnN0IHJlbW92ZWRTY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUHJpc21hIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBQUklTTUFgIGlzIHJlcGxhY2VkIHdpdGggYFlBUk4gcHJpc21hYCBvciBgWUFSTiBibGl0eiBwcmlzbWFgXG4gKiBhbmQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFByaXNtYVNjcmlwdHMge1xuICBkZXBsb3koXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdQUklTTUEgbWlncmF0ZSBkZXBsb3knO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCwgYmFja3VwUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdkYicgOiAncHJpc21hJztcbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYHJtIC1SZiAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyo7IFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgJiYgcm0gLVJmICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzKlxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlIC1vICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzICR7YmFja3VwUGF0aH0gJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpdGVzdHJlYW0oXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3J1bnRpbWVXaXRoQXJnc30gLWUgJ1xuY29uc3QgeyBQcmlzbWFDbGllbnQgfSA9IHJlcXVpcmUoXCJAcHJpc21hL2NsaWVudFwiKTtcbm5ldyBQcmlzbWFDbGllbnQoKS4kcXVlcnlSYXdcXGBQUkFHTUEgam91cm5hbF9tb2RlID0gV0FMO1xcYFxuICAuY2F0Y2goKGVycm9yKSA9PiB7IGNvbnNvbGUubG9nKFwiRmFpbGVkIGR1ZSB0bzpcIiwgZXJyb3IpOyBwcm9jZXNzLmV4aXQoMSk7IH0pO1xuJ2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICYmIFBSSVNNQSBnZW5lcmF0ZSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldmA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICAvLyBCbGl0eiBkb2VzIG5vdCB0cmlnZ2VyIHNlZWQgYXV0b21hdGljYWxseSwgc28gd2UgbmVlZCB0byBydW4gaXQgbWFudWFsbHkuXG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gICAgLy8gSSdtIG5vdCBzdXJlIHdoeSB3ZSBuZWVkIHRvIHJlbW92ZSBhbGwgc3FsaXRlIGZpbGVzLCBzbyBJIGNvbW1lbnRlZCBvdXQgdGhlIGZvbGxvd2luZyBsaW5lLlxuICAgIC8vIHJldHVybiBgdHJ1ZSAkKHJtIC1SZiBkYi8qKi8qLnNxbGl0ZSogMj4gL2Rldi9udWxsKSAmJiB0cnVlICQocm0gLVJmIHByaXNtYS8qKi8qLnNxbGl0ZSogMj4gL2Rldi9udWxsKSAmJiBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7dGhpcy5zZWVkKCl9YDtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgYmFja3VwUGF0aDogc3RyaW5nLCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vcmVzdG9yZWQuc3FsaXRlMzsgR09PR0xFX0FQUExJQ0FUSU9OX0NSRURFTlRJQUxTPWdjcC1zYS1rZXkuanNvbiBsaXRlc3RyZWFtIHJlc3RvcmUgLW8gJHtvdXRwdXRQYXRofSAke2JhY2t1cFBhdGh9YDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10pXG4gICAgICByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gJ0JVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzJztcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5bJ3NlZWQnXSkgcmV0dXJuIGBZQVJOIHByaXNtYSBkYiBzZWVkYDtcbiAgICByZXR1cm4gYGlmIFsgLWUgXCJwcmlzbWEvc2VlZHMudHNcIiBdOyB0aGVuIEJVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzOyBmaWA7XG4gIH1cblxuICBzdHVkaW8oXzogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgY29uc29sZS5pbmZvKGRiVXJsT3JQYXRoLCBhYnNvbHV0ZVBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPWZpbGU6Ly8ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHByaXNtYUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdwcmlzbWEnLFxuICBkZXNjcmliZTogJ1J1biBwcmlzbWEgY29tbWFuZHMnLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHtcbiAgICByZXR1cm4geWFyZ3NcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKTtcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95KHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdiYWNrdXAtcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2InLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlcGxveUZvcmNlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlIDxiYWNrdXAtcGF0aD4nLFxuICBkZXNjcmliZTogXCJGb3JjZSB0byBhcHBseSBtaWdyYXRpb24gdG8gREIgdXRpbGl6aW5nIExpdGVzdHJlYW0ncyBiYWNrdXAgd2l0aG91dCBpbml0aWFsaXppbmcgaXRcIixcbiAgYnVpbGRlcjogZGVwbG95Rm9yY2VCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0LCBhcmd2LmJhY2t1cFBhdGgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBsaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBEQiBmb3IgTGl0ZXN0cmVhbScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBsaXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlJyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlRGV2KHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmRlcGxveUZvcmNlQnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgcmVzdG9yZWQgZGF0YWJhc2UuIERlZmF1bHRzIHRvIFwiPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZSA8YmFja3VwLXBhdGg+JyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICBhcmd2Lm91dHB1dCB8fFxuICAgICAgICAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJyA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMycpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzdG9yZShwcm9qZWN0LCBhcmd2LmJhY2t1cFBhdGgsIG91dHB1dCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIFByaXNtYSBTdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHN0dWRpbycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgZGJVcmxPclBhdGggPSBhcmd2LnJlc3RvcmVkXG4gICAgICAgID8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXVxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOiAnUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHByaXNtYSBhcyBpcycsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gYCR7YXJndi5hcmdzPy5qb2luKCcgJykgPz8gJyd9YC50cmltRW5kKCk7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChgcHJpc21hICR7c2NyaXB0fWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBQUklTTUEgJHtzY3JpcHR9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gZmluZFByaXNtYVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maWx0ZXIoXG4gICAgKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddIHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJ107XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biwgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICAgIHBhY2thZ2VzLnB1c2goJ2V4cGVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUgPT09ICdweXByb2plY3QudG9tbCcpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKCdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5wcmVmZXItYWN0aXZlLXB5dGhvbiB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2FzZGYgY3VycmVudCBweXRob24nKS50b1N0cmluZygpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgcG9ldHJ5IGVudiB1c2UgJHt2ZXJzaW9ufWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IGluc3RhbGwgLS1hbnNpJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICBjb25zdCBzY3JpcHRzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9O1xuICAgIGNvbnN0IG5ld0RlcHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG5ld0RldkRlcHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKGRlcHNbJ2JsaXR6J10gfHwgZGVwc1snbmV4dCddKSB7XG4gICAgICBuZXdEZXBzLnB1c2goJ3BtMicpO1xuICAgICAgbmV3RGV2RGVwcy5wdXNoKCdjb25jdXJyZW50bHknLCAnb3Blbi1jbGknLCAndml0ZXN0JywgJ3dhaXQtb24nKTtcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIG5ld0RlcHMucHVzaCgncG0yJyk7XG4gICAgICBuZXdEZXZEZXBzLnB1c2goJ2NvbmN1cnJlbnRseScsICdvcGVuLWNsaScsICd2aXRlc3QnLCAnd2FpdC1vbicpO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pKSB7XG4gICAgICBuZXdEZXBzLnB1c2goJ3BtMicpO1xuICAgICAgbmV3RGV2RGVwcy5wdXNoKCdjb25jdXJyZW50bHknLCAndml0ZXN0JywgJ3dhaXQtb24nKTtcbiAgICB9XG4gICAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgICBuZXdEZXZEZXBzID0gbmV3RGV2RGVwcy5maWx0ZXIoKGRlcCkgPT4gZGVwICE9PSAndml0ZXN0Jyk7XG4gICAgfVxuICAgIGlmIChuZXdEZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcn0gYWRkICR7bmV3RGVwcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChuZXdEZXZEZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcn0gYWRkIC1EICR7bmV3RGV2RGVwcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChzY3JpcHRzWydnZW4tY29kZSddKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkRGV2SW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ3lhcm4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8gYW1kNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259IC5gO1xuICB9XG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCB1bmJ1ZmZlciA9IGZhbHNlLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3VuYnVmZmVyID8gJ3VuYnVmZmVyICcgOiAnJ30ke3RoaXMuc3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYWRkaXRpb25hbE9wdGlvbnMsXG4gICAgICBhZGRpdGlvbmFsQXJnc1xuICAgICl9YDtcbiAgfVxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAtaXQgLXAgODA4MDo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBjb250YWluZXIgbHMgLXEgLWYgbmFtZT0ke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVEZXZPcHRpb25zIHtcbiAgLy8gJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nO1xuICBzdGFydENvbW1hbmQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMgZXh0ZW5kcyBUZXN0RTJFRGV2T3B0aW9ucyB7XG4gIHByaXNtYURpcmVjdG9yeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcC5cbiAqIE5vdGUgdGhhdCBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVNjcmlwdHMge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UG9ydCA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUKSB8fCAzMDAwKSB7fVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb24gPSAnZGV2ZWxvcG1lbnQnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZERldkltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgYWJzdHJhY3Qgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcblxuICBhYnN0cmFjdCBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfVxuICAgICAgJiYgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICAgIFwiJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICAgICl9XCJcbiAgICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgODA4MCl9XCJgO1xuICB9XG5cbiAgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MgPSAndGVzdCB0ZXN0cy9lMmUnLCBwcmlzbWFEaXJlY3RvcnksIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcInJtIC1SZiAke3ByaXNtYURpcmVjdG9yeX0vbW91bnQgJiYgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcImNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzLW9uLWZhaWwgLS1yYXcgJ3dhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MCcgJ0JVTiBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHMnXG4gICAgICAgICYmIEJVTiBwbGF5d3JpZ2h0ICR7cGxheXdyaWdodEFyZ3MgPT09ICd0ZXN0IHRlc3RzL2UyZScgJiYgYXJndi50YXJnZXQgPyBwbGF5d3JpZ2h0QXJncy5yZXBsYWNlKCd0ZXN0cy9lMmUnLCBhcmd2LnRhcmdldCkgOiBwbGF5d3JpZ2h0QXJnc30ke3N1ZmZpeH1cImA7XG4gIH1cblxuICB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3RzL2UyZScsIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJjb25jdXJyZW50bHkgLS1raWxsLW90aGVycy1vbi1mYWlsIC0tcmF3ICd3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODAnICdCVU4gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzJ1xuICAgICAgICAmJiBCVU4gcGxheXdyaWdodCAke3BsYXl3cmlnaHRBcmdzID09PSAndGVzdCB0ZXN0cy9lMmUnICYmIGFyZ3YudGFyZ2V0ID8gcGxheXdyaWdodEFyZ3MucmVwbGFjZSgndGVzdHMvZTJlJywgYXJndi50YXJnZXQpIDogcGxheXdyaWdodEFyZ3N9JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgYWJzdHJhY3QgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIC8vIFNpbmNlIHRoaXMgY29tbWFuZCBpcyByZWZlcnJlZCBmcm9tIG90aGVyIGNvbW1hbmRzLCB3ZSBoYXZlIHRvIHVzZSBcInZpdGVzdCBydW5cIiAobm9uLWludGVyYWN0aXZlIG1vZGUpLlxuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBZQVJOIHZpdGVzdCBydW4gJHthcmd2LnRhcmdldCB8fCAndGVzdHMvdW5pdCd9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHlgO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IHRoaXMuZGVmYXVsdFBvcnQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgd2FpdC1vbiAtdCAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSA1MDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDIwMDAwIC1pIDQwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgNjAwMDAgLWkgNTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gdGhpcy5kZWZhdWx0UG9ydCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2LFxuICAgICAgcG9ydFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFwcEVudiA9IHByb2plY3QuZW52LldCX0VOViA/IGBBUFBfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBgIDogJyc7XG4gICAgcmV0dXJuIGAke2FwcEVudn1ZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiYmxpdHogZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFwcEVudiA9IHByb2plY3QuZW52LldCX0VOViA/IGBBUFBfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBgIDogJyc7XG4gICAgcmV0dXJuIGAke2FwcEVudn1OT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCl9ICYmICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoXG4gICAgICAgICdlY29zeXN0ZW0uY29uZmlnLmNqcydcbiAgICAgICl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHN0YXJ0Q29tbWFuZCA9IGAke3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCl9ICYmICR7XG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kXG4gICAgICB9ICYmIHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBwcmlzbWFEaXJlY3Rvcnk6ICdkYicsXG4gICAgICBzdGFydENvbW1hbmQsXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kID0gJ2JsaXR6IGRldiAtcCA4MDgwJyB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJibGl0eiBkZXZcIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYmxpdHpTY3JpcHRzID0gbmV3IEJsaXR6U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuIHNyYy9pbmRleC50cyAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSA4MDgwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gJHtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kXG4gICAgfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uIFBPUlQ9XFwke1BPUlQ6LSR7cG9ydH19ICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7XG4gICAgICBzdGFydENvbW1hbmQgPSBgJHtwcm9qZWN0Lmhhc1ByaXNtYSA/ICdwcmlzbWEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1nZW5lcmF0ZSAmJiAnIDogJyd9KCR7dGhpcy5zdGFydFByb2R1Y3Rpb24oXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICl9KWAsXG4gICAgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODAgJiYgdml0ZXN0IHJ1biAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgeyBzdGFydENvbW1hbmQgfTogVGVzdEUyRURldk9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gV0JfRU5WPSR7XG4gICAgICBwcm9qZWN0LmVudi5XQl9FTlZcbiAgICB9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZCB8fCB0aGlzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODAgJiYgdml0ZXN0IHJ1biAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcIiR7dGhpcy5zdGFydChwcm9qZWN0LCBhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFyZ3ZcbiAgICApfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgTmV4dC5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgTmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCJuZXh0IGRldiAtLXR1cmJvICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtbXG4gICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpXSA6IFtdKSxcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgIGBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAsXG4gICAgICBdLmpvaW4oJyAmJiAnKX1cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzOiBvcHRpb25zLnBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAnZGInLFxuICAgICAgc3RhcnRDb21tYW5kOlxuICAgICAgICBvcHRpb25zLnN0YXJ0Q29tbWFuZCA/P1xuICAgICAgICBbXG4gICAgICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCldIDogW10pLFxuICAgICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICAgIGBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICAgICAgXS5qb2luKCcgJiYgJyksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBzdGFydENvbW1hbmQgPSAnbmV4dCBkZXYgLS10dXJibyAtcCA4MDgwJyB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcIm5leHQgZGV2IC0tdHVyYm9cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUGxhaW5BcHBTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGJ1aWxkLXRzIHJ1biBzcmMvaW5kZXgudHMgJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICl9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgTk9ERV9FTlY9cHJvZHVjdGlvbiAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke1xuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICB9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFJlbWl4IGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBSZW1peFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCJyZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCl9ICYmICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoXG4gICAgICAgICdlY29zeXN0ZW0uY29uZmlnLmNqcydcbiAgICAgICl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHN0YXJ0Q29tbWFuZCA9IGAke3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCl9ICYmICR7XG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kXG4gICAgICB9ICYmIHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgcHJpc21hRGlyZWN0b3J5OiAncHJpc21hJywgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCA9ICdyZW1peCBkZXYnIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcInJlbWl4IGRldlwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2NyaXB0T3B0aW9uc0J1aWxkZXIsXG4gIG1vZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IG1vZGU6IGRldltlbG9wbWVudF0gKGRlZmF1bHQpIHwgc3RhZ2luZyB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ1N0YXJ0IGFwcCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHNbJ2JsaXR6J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSB8fCAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnZGV2ZWxvcG1lbnQnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydChwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIDgwODApfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Piwgd2JFbnY6IHN0cmluZyk6IHN0cmluZyB7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gd2JFbnY7XG4gIGxldCBwcmVmaXggPSBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfV0JfRU5WID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuICAgIHByZWZpeCArPSBgTkVYVF9QVUJMSUNfV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICB9XG4gIHJldHVybiBwcmVmaXg7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICBub3JtYWxpemVkQXJnc1RleHQ/OiBzdHJpbmc7XG4gIG5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PlxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gYCcke2FyZ30nYClcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKS5tYXAoKGFyZykgPT4gYCcke2FyZ30nYCkuam9pbignICcpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBjaToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBydW4gdGVzdHMgb24gQ0knLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnV2hldGhlciB0byBydW4gZTJlIHRlc3RzLiBZb3UgbWF5IHBhc3MgbW9kZSBhcyBhcmd1bWVudDogbm9uZSB8IGhlYWRsZXNzIChkZWZhdWx0KSB8IGhlYWRsZXNzLWRldiB8IGhlYWRlZCB8IGhlYWRlZC1kZXYgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCBkZWJ1ZyB8IGdlbmVyYXRlIHwgdHJhY2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBzdGFydDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBydW4gc3RhcnQgdGVzdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgdW5pdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBydW4gdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG4gIHRhcmdldDoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGVzdCB0YXJnZXQnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUZXN0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj47XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0JyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3QoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAocHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSkge1xuICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgIHByb2Nlc3MuZW52LkNJID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gYXJndi5lMmUgPT09IHVuZGVmaW5lZCAmJiBhcmd2LnN0YXJ0ID09PSB1bmRlZmluZWQgJiYgYXJndi51bml0ID09PSB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHNbJ2JsaXR6J10pIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzWyduZXh0J10pIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJ1bkFsbFRlc3RzKSB7XG4gICAgICBhcmd2ID0ge1xuICAgICAgICAuLi5hcmd2LFxuICAgICAgICBlMmU6XG4gICAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdHMnLCAnZTJlJykpICYmICFhcmd2LnRhcmdldD8uaW5jbHVkZXMoJy91bml0LycpXG4gICAgICAgICAgICA/ICdoZWFkbGVzcydcbiAgICAgICAgICAgIDogJ25vbmUnLFxuICAgICAgICBzdGFydDogdHJ1ZSxcbiAgICAgICAgdW5pdDogZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdHMnLCAndW5pdCcpKSAmJiAhYXJndi50YXJnZXQ/LmluY2x1ZGVzKCcvZTJlLycpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcbiAgICBpZiAoYXJndi5jaSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChkb2NrZXJTY3JpcHRzLnN0b3BBbGwoKSwgcHJvamVjdCwgYXJndik7XG4gICAgICBpZiAoYXJndi51bml0KSB7XG4gICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAgIHRpbWVvdXQ6IGFyZ3YudW5pdFRpbWVvdXQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGFyZ3Yuc3RhcnQpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoYXJndi5lMmUgIT09ICdub25lJykge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHN0YXJ0Q29tbWFuZDogZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgdHJ1ZSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fTtcbiAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3YudW5pdCkge1xuICAgICAgcHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndiwgeyB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0IH0pKTtcbiAgICB9XG4gICAgaWYgKGFyZ3Yuc3RhcnQpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGNhc2UgJ25vbmUnOiB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnJzpcbiAgICAgIGNhc2UgJ2hlYWRsZXNzJzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHt9KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHt9KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIocHJvamVjdCwgYXJndiwgc2NyaXB0cyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIocHJvamVjdCwgYXJndiwgc2NyaXB0cywgYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1kZWJ1Z2ApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHNbJ2JsaXR6J10gfHwgZGVwc1snbmV4dCddIHx8IGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1oZWFkZWRgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlYnVnJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWRlYnVnYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZTJlIG1vZGU6ICR7YXJndi5lMmV9YCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+LFxuICBzY3JpcHRzOiBCYXNlU2NyaXB0cyxcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgIGAke3NjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHN0YXJ0Q29tbWFuZDogZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgdHJ1ZSksXG4gICAgfSl9YCxcbiAgICBwcm9qZWN0LFxuICAgIGFyZ3YsXG4gICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH1cbiAgKTtcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwcm9qZWN0KSA9PiB7XG4gICAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQgLS1QcmV0dHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnB5cmlnaHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdZQVJOIHB5cmlnaHQnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJvamVjdC5oYXNTb3VyY2VDb2RlICYmXG4gICAgICAgIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdClcbiAgICAgICkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0IC0tUHJldHR5Jyk7XG4gICAgICB9XG4gICAgICBpZiAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgbGV0IGZpbmFsRXhpdENvZGUgPSAwO1xuICAgIGZvciAoY29uc3QgW2ksIGV4aXRDb2RlXSBvZiBleGl0Q29kZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzW2ldLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICAgICAgaWYgKGRlcHNbJ2JsaXR6J10pIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdQbGVhc2UgdHJ5IFwieWFybiBnZW4tY29kZVwiIGlmIHlvdSBmYWNlIHVua25vd24gdHlwZSBlcnJvcnMuJykpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbmFsRXhpdENvZGUpIHByb2Nlc3MuZXhpdChmaW5hbEV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYnVpbGRJZk5lZWRlZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKGJ1aWxkSWZOZWVkZWRDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQob3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQpXG4gIC5jb21tYW5kKHByaXNtYUNvbW1hbmQpXG4gIC5jb21tYW5kKHJldHJ5Q29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC5oZWxwKCkuYXJndjtcblxuZm9yIChjb25zdCBzaWduYWwgb2YgWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHByb2Nlc3MuZXhpdCgpKTtcbn1cbiJdLCJuYW1lcyI6WyJjYWNoZWRFbnZWYXJzIiwiTWFwIiwicmVhZEVudkZpbGUiLCJmaWxlUGF0aCIsImNhY2hlZCIsImdldCIsInBhcnNlZCIsImNvbmZpZyIsInBhdGgiLCJyZXNvbHZlIiwicHJvY2Vzc0VudiIsInNldCIsImFzeW5jIiwic3Bhd25Bc3luYyIsImNvbW1hbmQiLCJhcmdzIiwib3B0aW9ucyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzdGRvdXQiLCJzZXRFbmNvZGluZyIsInN0ZGVyciIsIm9uIiwiZGF0YSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJzdG9wcGVkIiwic3RvcFByb2Nlc3MiLCJwaWQiLCJ2ZXJib3NlIiwiY29uc29sZSIsImluZm8iLCJ0cmVlS2lsbCIsImtpbGxPbkV4aXQiLCJwcm9jZXNzIiwiZXJyb3IiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImNvZGUiLCJzaWduYWwiLCJ1bmRlZmluZWQiLCJFcnJvciIsInN0YXR1cyIsImlucHV0Iiwic3RkaW4iLCJ3cml0ZSIsImVuZCIsIm1lbW9pemUiLCJjYWNoZUR1cmF0aW9uIiwidCIsIk51bWJlciIsIlBPU0lUSVZFX0lORklOSVRZIiwiY2FjaGVzIiwicyIsImNhbGNLZXkiLCJuIiwiaSIsInIiLCJhIiwibGVuZ3RoIiwiY29kZVBvaW50QXQiLCJNYXRoIiwiaW11bCIsInRvU3RyaW5nIiwicGFkU3RhcnQiLCJlIiwiSlNPTiIsInN0cmluZ2lmeSIsIm1heENhY2hlZEFyZ3NTaXplIiwibWF4Q2FjaGVkVGhpc1NpemUiLCJjIiwibyIsImtpbmQiLCJwdXNoIiwiRGF0ZSIsIm5vdyIsImhhcyIsInRoaXMiLCJjYWxsIiwic2l6ZSIsImtleXMiLCJuZXh0IiwidmFsdWUiLCJkZWxldGUiLCJoIiwidSIsImYiLCJtZW1vaXplRmFjdG9yeSIsIk1BWF9TQUZFX0lOVEVHRVIiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJhcmd2IiwicGF0aEJ5TmFtZSIsImNvbnN0cnVjdG9yIiwiZGlyUGF0aCIsImxvYWRFbnYiLCJfZGlyUGF0aCIsImlzQnVuQXZhaWxhYmxlIiwidGVzdCIsImZzIiwicmVhZEZpbGVTeW5jIiwiam9pbiIsInJvb3REaXJQYXRoIiwiYnVpbGRDb21tYW5kIiwicGFja2FnZUpzb24iLCJzY3JpcHRzIiwiYnVpbGQiLCJpbmNsdWRlcyIsImV4aXN0c1N5bmMiLCJkb2NrZXJmaWxlIiwiZmluZEZpbGUiLCJoYXNEb2NrZXJmaWxlIiwiaGFzU291cmNlQ29kZSIsIm5hbWUiLCJkb2NrZXJJbWFnZU5hbWUiLCJyZXBsYWNlQWxsIiwiZW52IiwiZW52VmFycyIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzIiwiY3dkIiwiZW52UGF0aHMiLCJtYXAiLCJlbnZQYXRoIiwiY2FzY2FkZSIsImNhc2NhZGVFbnYiLCJjYXNjYWRlTm9kZUVudiIsIk5PREVfRU5WIiwiYXV0b0Nhc2NhZGVFbnYiLCJXQl9FTlYiLCJpbmNsdWRlUm9vdEVudiIsInJvb3RQYXRoIiwiZmxhdE1hcCIsImZpbHRlciIsInJlbGF0aXZlIiwiZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnMiLCJjb3VudCIsImtleSIsIk9iamVjdCIsImVudHJpZXMiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwicGFyc2UiLCJwYWNrYWdlSnNvblBhdGgiLCJoYXNQcmlzbWEiLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImRpcm5hbWUiLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmlsZU5hbWUiLCJwIiwiZmluZCIsImZpbmRTZWxmUHJvamVjdCIsImZpbmREZXNjZW5kYW50UHJvamVjdHMiLCJyb290QW5kU2VsZlByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInJvb3QiLCJzZWxmIiwiZmluZFJvb3RBbmRTZWxmUHJvamVjdHMiLCJkZXNjZW5kYW50cyIsImdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyIsInByb2plY3RzIiwid29ya3NwYWNlIiwiQXJyYXkiLCJpc0FycmF5IiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJucG1fZXhlY3BhdGgiLCJydW50aW1lV2l0aEFyZ3MiLCJwYWNrYWdlTWFuYWdlciIsInBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsImJ1aWxkSWZOZWVkZWRDb21tYW5kIiwiZGVzY3JpYmUiLCJkZXNjcmlwdGlvbiIsInR5cGUiLCJhbGlhcyIsImhhbmRsZXIiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJwcm9qZWN0IiwiY2hhbGsiLCJyZWQiLCJjYW5Ta2lwIiwiY2FjaGVGaWxlUGF0aCIsImNvbnRlbnRIYXNoIiwiY2FjaGVEaXJlY3RvcnlQYXRoIiwicHJvbWlzZXMiLCJta2RpciIsInJlY3Vyc2l2ZSIsImhhc2giLCJjcmVhdGVIYXNoIiwiY29tbWl0SGFzaCIsImNoaWxkX3Byb2Nlc3MiLCJleGVjU3luYyIsInRyaW0iLCJ1cGRhdGUiLCJlbnZpcm9ubWVudEpzb24iLCJpZ25vcmluZ0VudlZhck5hbWVzIiwic29ydCIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkRmlsZVBhdGhzIiwic3Bhd25TeW5jIiwic3RkaW8iLCJlbmNvZGluZyIsInNwbGl0IiwicmVwbGFjZSIsImluY2x1ZGVQYXR0ZXJucyIsInNvbWUiLCJwYXR0ZXJuIiwiaW5jbHVkZVN1ZmZpeCIsInN1ZmZpeCIsImV4Y2x1ZGVQYXR0ZXJucyIsImNvcHkiLCJkaWdlc3QiLCJ1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQiLCJjYWNoZWRDb250ZW50SGFzaCIsImZuIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkRmlsZSIsImNhblNraXBCdWlsZCIsImdyZWVuIiwiZHJ5UnVuIiwid3JpdGVGaWxlIiwiYnVpbGRJZk5lZWRlZCIsInJldCIsInNoZWxsIiwiZXhpdENvZGUiLCJTZXQiLCJraWxsZWQiLCJraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyIsInBvcnQiLCJraWxsUG9ydFByb2Nlc3MiLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZGVmYXVsdE9wdGlvbnMiLCJleGl0SWZGYWlsZWQiLCJydW5XaXRoU3Bhd24iLCJzY3JpcHQiLCJvcHRzIiwicHJpbnRhYmxlU2NyaXB0IiwicnVubmFibGVTY3JpcHQiLCJub3JtYWxpemVTY3JpcHQiLCJwcmludFN0YXJ0IiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsIm1hdGNoIiwia2lsbEZ1bmMiLCJhZGQiLCJraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCIsImNvbmZpZ3VyZUVudiIsInRpbWVvdXQiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsIiwicnVuQW5kV2FpdEZvclJldHVyblZhbHVlIiwib3V0IiwibmV3U2NyaXB0IiwiZml4QnVuQ29tbWFuZCIsIm5vcm1hbGl6ZWRTY3JpcHQiLCJwcmVmaXgiLCJ3ZWFrIiwiZ3JheSIsImN5YW4iLCJib2xkIiwiZXhpdCIsIm5ld0VudiIsImNpIiwiZm9yY2VDb2xvciIsImJpb21lRXh0ZW5zaW9ucyIsInByZXR0aWVyRXh0ZW5zaW9ucyIsInByZXR0aWVyT25seUV4dGVuc2lvbnMiLCJleHQiLCJsaW50Q29tbWFuZCIsImZpeCIsImZvcm1hdCIsImZpbGVzIiwiYmlvbWVBcmdzVGV4dCIsInByZXR0aWVyQXJnc1RleHQiLCJzb3J0UGFja2FnZUpzb25BcmdzVGV4dCIsImZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZSIsImZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJmaWxlIiwiU3RyaW5nIiwiZXh0ZW5zaW9uIiwiZXh0bmFtZSIsInNsaWNlIiwiYmlvbWVDb21tYW5kIiwiYmlvbWVQcm9taXNlIiwicHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIiwiY29tbWFuZE5hbWUiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwic3RhcnRzV2l0aCIsIm9wdGltaXplRGV2RGVwZW5kZW5jaWVzIiwib3B0aW1pemVTY3JpcHRzIiwib3B0aW1pemVSb290UHJvcHMiLCJkaXN0RGlyUGF0aCIsImRldkRlcHMiLCJuYW1lV29yZHNUb0JlUmVtb3ZlZCIsInJlbW92ZWREZXBzIiwid29yZCIsIm5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwiY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJyZW1vdmVkU2NyaXB0cyIsImNvbnRlbnQiLCJwcml2YXRlIiwicHVibGlzaENvbmZpZyIsInByZXR0aWVyIiwicHJpc21hU2NyaXB0cyIsImRlcGxveSIsIl8iLCJkZXBsb3lGb3JjZSIsImJhY2t1cFBhdGgiLCJkaXJOYW1lIiwibGl0ZXN0cmVhbSIsIm1pZ3JhdGUiLCJzZWVkIiwibWlncmF0ZURldiIsInJlc2V0IiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJzY3JpcHRQYXRoIiwicHJpc21hIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJVUkwiLCJhYnNvbHV0ZVBhdGgiLCJidWlsZGVyIiwicHJpc21hQ29tbWFuZCIsInlhcmdzIiwiZGVwbG95Q29tbWFuZCIsImRlcGxveUZvcmNlQ29tbWFuZCIsImxpdGVzdHJlYW1Db21tYW5kIiwibWlncmF0ZUNvbW1hbmQiLCJtaWdyYXRlRGV2Q29tbWFuZCIsInJlc2V0Q29tbWFuZCIsInJlc3RvcmVDb21tYW5kIiwic2VlZENvbW1hbmQiLCJzdHVkaW9Db21tYW5kIiwiZGVmYXVsdENvbW1hbmQiLCJkZW1hbmRDb21tYW5kIiwiYWxsUHJvamVjdHMiLCJmaW5kUHJpc21hUHJvamVjdHMiLCJkZXBsb3lGb3JjZUJ1aWxkZXIiLCJkZW1hbmRPcHRpb24iLCJvdXRwdXQiLCJyZXN0b3JlZCIsInRyaW1FbmQiLCJmaWx0ZXJlZCIsInJldHJ5Q29tbWFuZCIsInJldHJ5IiwiZGVmYXVsdCIsImNtZEFuZEFyZ3MiLCJCb29sZWFuIiwibGFzdFN0YXR1cyIsInllbGxvdyIsImh0dHBTZXJ2ZXJQYWNrYWdlcyIsInNldHVwQ29tbWFuZCIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9zIiwicGxhdGZvcm0iLCJwYWNrYWdlcyIsImQiLCJpc0ZpbGUiLCJ2ZXJzaW9uIiwicHJvbWlzZUFsbCIsIm5ld0RlcHMiLCJuZXdEZXZEZXBzIiwiZGVwIiwic2V0dXAiLCJkb2NrZXJTY3JpcHRzIiwiYnVpbGREZXZJbWFnZSIsInN0b3BBbmRTdGFydCIsInVuYnVmZmVyIiwiYWRkaXRpb25hbE9wdGlvbnMiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzdGFydCIsInNwYXduU3luY09uRXhpdCIsInN0b3BBbGwiLCJCYXNlU2NyaXB0cyIsImRlZmF1bHRQb3J0IiwiUE9SVCIsImJ1aWxkRG9ja2VyIiwic3RhcnREb2NrZXIiLCJub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQiLCJub3JtYWxpemVkQXJnc1RleHQiLCJ3YWl0QW5kT3BlbkFwcCIsInRlc3RFMkUiLCJwbGF5d3JpZ2h0QXJncyIsInByaXNtYURpcmVjdG9yeSIsInN0YXJ0Q29tbWFuZCIsInRhcmdldCIsInRlc3RFMkVEZXYiLCJ0ZXN0VW5pdCIsIndhaXRBcHAiLCJibGl0elNjcmlwdHMiLCJzdXBlciIsInN0YXJ0UHJvZHVjdGlvbiIsInRlc3RTdGFydCIsImh0dHBTZXJ2ZXJTY3JpcHRzIiwid2F0Y2giLCJuZXh0U2NyaXB0cyIsInBsYWluQXBwU2NyaXB0cyIsInJlbWl4U2NyaXB0cyIsIm1vZGUiLCJhcmciLCJkb2NrZXJPcHRpb25zIiwibm9ybWFsaXplQXJncyIsImNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzIiwid2JFbnYiLCJORVhUX1BVQkxJQ19XQl9FTlYiLCJ0ZXN0Q29tbWFuZCIsImUyZSIsInVuaXQiLCJDSSIsIkZPUkNFX0NPTE9SIiwic2hvdWxkUnVuQWxsVGVzdHMiLCJ1bml0VGltZW91dCIsImFsbCIsInRlc3RPbkRvY2tlciIsInR5cGVDaGVja0NvbW1hbmQiLCJjb21tYW5kcyIsInR5cGVzY3JpcHQiLCJweXJpZ2h0IiwiZXhpdENvZGVzIiwiZmluYWxFeGl0Q29kZSIsInRjQ29tbWFuZCIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwiaGlkZUJpbiIsInNjcmlwdE5hbWUiLCJtaWRkbGV3YXJlIiwid29ya2luZ0RpciIsImNoZGlyIiwiQkVSUllfQklOX0ZPTERFUiIsInVwcGVyS2V5IiwidG9VcHBlckNhc2UiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJzdHJpY3QiLCJoZWxwIl0sIm1hcHBpbmdzIjoib2NBeUhBLE1BQU1BLEVBQWdCLElBQUlDLElBRTFCLFNBQVNDLEVBQVlDLEdBQ25CLE1BQU1DLEVBQVNKLEVBQWNLLElBQUlGLEdBQ2pDLEdBQUlDLEVBQVEsT0FBT0EsRUFFbkIsTUFBTUUsRUFBU0MsRUFBTyxDQUFFQyxLQUFNQSxFQUFLQyxRQUFRTixHQUFXTyxXQUFZLENBQUMsSUFBS0osUUFBVSxHQUVsRixPQURBTixFQUFjVyxJQUFJUixFQUFVRyxHQUNyQkEsQ0FDVCxDQ2xHT00sZUFBZUMsRUFDcEJDLEVBQ0FDLEVBQ0FDLEdBRUEsT0FBTyxJQUFJQyxTQUFRLENBQUNSLEVBQVNTLEtBQzNCLElBQ0UsTUFBTUMsRUFBT0MsRUFBTU4sRUFBU0MsR0FBUSxHQUFJQyxHQUFXLENBQUEsR0FFbkRHLEVBQUtFLFFBQVFDLGNBQWMsUUFDM0JILEVBQUtJLFFBQVFELGNBQWMsUUFFM0IsSUFBSUQsRUFBUyxHQUNURSxFQUFTLEdBQ2JKLEVBQUtFLFFBQVFHLEdBQUcsUUFBU0MsSUFDdkJKLEdBQVVJLENBQUksSUFFaEJO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
|