build-ts 13.1.39 → 13.2.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 +10 -10
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readAndApplyEnvironmentVariables as e,yargsOptionsBuilderForEnv as o,removeNpmAndYarnEnvironmentVariables as n}from"@willbooster/shared-lib-node";import s from"yargs";import{hideBin as i}from"yargs/helpers";import t from"node:fs";import r from"node:path";import c from"chalk";import a from"date-time";import p from"pretty-ms";import{rollup as l,watch as d}from"rollup";import{onExit as m}from"signal-exit";import u from"node:url";import{babel as f}from"@rollup/plugin-babel";import y from"@rollup/plugin-commonjs";import g from"@rollup/plugin-json";import h from"@rollup/plugin-node-resolve";import b from"@rollup/plugin-replace";import j from"@rollup/plugin-terser";import v from"rollup-plugin-analyzer";import{keepImport as w}from"rollup-plugin-keep-import";import{nodeExternals as x}from"rollup-plugin-node-externals";import k from"rollup-plugin-preserve-directives";import{string as S}from"rollup-plugin-string";import $ from"node:process";import E from"typescript";import*as D from"node:child_process";let O;function T(o,n){return O||(O=e(o,n),o.verbose&&console.info("Loaded env vars:",Object.keys(O))),O}function F(e,o){const n={},s=new Set([...(e.inline??[]).flatMap((e=>e.toString().split(","))),...Object.keys(T(e,o))]);for(const e of s)void 0!==process.env[e]&&(n[`process.env.${e}`]=JSON.stringify(process.env[e]));return e.verbose&&console.info("Inline env vars:",Object.keys(n)),n}const _=["app","functions","lib"];async function N(e){const o=r.join(e,"package.json");try{const e=await t.promises.readFile(o,"utf8");return[JSON.parse(e),o]}catch{}return[void 0,o]}const R={...o,silent:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"s"}},C={...R,input:{description:'Paths of source code files to be built. The first file is main. If no option is given, "src/index.{ts,tsx}" from package directory is targeted.',type:"array",alias:"i"},"core-js":{description:"Whether or not core-js is employed.",type:"boolean",default:!1},"core-js-proposals":{description:"Whether or not core-js with proposals support is employed.",type:"boolean",default:!1},minify:{description:"Whether or not minification is enabled.",type:"boolean",default:!0},sourcemap:{description:"Whether or not sourcemap is enabled.",type:"boolean",default:!0},external:{description:"Additional external dependencies.",type:"array"},inline:{description:"Environment variables to be inlined.",type:"array"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"},keepImport:{description:"Identifiers to be kept as import statements.",type:"array"}},L={...C,moduleType:{description:"esm, cjs, or either (default).",type:"string",alias:"m"}},B={...L,onlyPackageJson:{description:"Whether to generate only package.json.",type:"boolean"}},A={...C,moduleType:{description:"esm, cjs, either, or both (default).",type:"string",alias:"m"},jsExtension:{description:"Whether to use .js in cjs and/or esm: either (default), both, or none.",type:"string",alias:"j"}};function I(e,o,n,s,i,c){const a=[...e.external??[]].map((e=>e.toString()));if(n.dependencies?.["@prisma/client"]&&a.push("prisma-client"),a.push(...Object.keys(n.dependencies??{}),...Object.keys(n.peerDependencies??{}),...Object.keys(n.optionalDependencies??{})),t.existsSync(r.join("..","..","package.json"))){const e=t.readdirSync(r.join(".."),{withFileTypes:!0});for(const o of e){if(!o.isDirectory())continue;const e=r.join("..",o.name,"package.json");if(!t.existsSync(e))continue;const s=JSON.parse(t.readFileSync(e,"utf8"));n.dependencies?.[s.name??""]&&a.push(...Object.keys(s.dependencies??{}),...Object.keys(s.peerDependencies??{}),...Object.keys(s.optionalDependencies??{}))}}const p=[".cjs",".mjs",".js",".jsx",".json",".cts",".mts",".ts",".tsx"],l=r.join(u.fileURLToPath(r.dirname(r.dirname(import.meta.url))),"babel.config.mjs"),d=[b({delimiters:["",""],preventAssignment:!0,values:F(e,i)}),g(),x({deps:!0,devDeps:!1,peerDeps:!0,optDeps:!0,include:a.map((e=>new RegExp(`^${e}(?:\\/.+)?`))),exclude:s&&new RegExp(`^@?${s}(?:\\/.+)?`)}),h({extensions:p}),y(),w({moduleNames:e.keepImport?.map((e=>e.toString()))??[]})],m="app-node"===o||"functions"===o||!a.includes("@babel/runtime");return process.env.BUILDTS_USE_BABLE_RUNTIME=m?"":"1",d.push(f({configFile:l,extensions:p,babelHelpers:m?"bundled":"runtime",exclude:/^(.+\/)?node_modules\/.+$/}),...c.some((e=>e.preserveModules))?[k()]:[],S({include:["**/*.csv","**/*.txt"]})),e.minify&&d.push(j({compress:{directives:!1}})),d.push(v({summaryOnly:!0})),d}async function P(e,o){const n=E.findConfigFile(o,E.sys.fileExists);if(!n)throw new Error(`Failed to find tsconfig.json in ${o}.`);e.verbose&&console.info("Found tsconfig.json:",n);const s=[];let i=r.join("dist",r.basename(o),"src");if(t.existsSync(i)){const e=r.dirname(o),n=await t.promises.readdir(e,{withFileTypes:!0});o=r.resolve(o);for(const i of n){if(!i.isDirectory())continue;const n=r.resolve(e,i.name);if(n===o)continue;const c=E.findConfigFile(n,E.sys.fileExists),a=r.join("dist",i.name,"src");c&&t.existsSync(a)&&s.push([n,c,a])}}else i="dist";s.push([o,n,i]);let c=!0;for(const[n,i,t]of s)c&&=U(e,n,i,r.join(o,t));return c}function U(e,o,n,s){e.verbose&&console.info("runTypeScriptCompiler()",o,n,s);const{config:i}=E.readConfigFile(n,E.sys.readFile);i.compilerOptions={...i.compilerOptions,declaration:!0,emitDeclarationOnly:!0,noEmit:!1,noEmitOnError:!0,outDir:s},i.include=["src/**/*"];const{errors:t,fileNames:r,options:c}=E.parseJsonConfigFileContent(i,E.sys,o),a=E.createProgram({options:c,rootNames:r,configFileParsingDiagnostics:t}),{diagnostics:p,emitSkipped:l}=a.emit(),d=[...E.getPreEmitDiagnostics(a),...p,...t];if(d.length>0){const e={getCanonicalFileName:e=>e,getCurrentDirectory:E.sys.getCurrentDirectory,getNewLine:()=>E.sys.newLine},o=E.formatDiagnostics(d,e);console.warn(o)}return!l}const W={command:"app [package]",describe:"Build an app",builder:L,handler:async e=>G(e,"app")},J={command:"functions [package]",describe:"Build a GCP/Firebase functions app",builder:B,async handler(e){if(!e.onlyPackageJson)return G(e,"functions");{const o=r.resolve(e.package?.toString()??"."),[n,s]=await N(o);n||(console.error(`Failed to parse package.json (${s}).`),process.exit(1)),await H(o,n,e.moduleType)}}},M={command:"lib [package]",describe:"Build a Node.js / React library",builder:A,handler:async e=>G(e,"lib")};async function G(e,o){process.env.NODE_ENV||="production";const n=!e.silent&&e.verbose,s=process.cwd(),i=r.resolve(e.package?.toString()??"."),[u,f]=await N(i);u||(console.error(`Failed to parse package.json (${f}).`),process.exit(1)),T(e,i);const y=function(e,o,n){if(e.input&&e.input.length>0)return e.input.map((e=>r.join(o,e.toString())));const s=r.join(n,"src");for(const e of["ts","tsx","cts","mts"]){const o=r.join(s,`index.${e}`);if(t.existsSync(o))return[o]}console.error("Failed to detect input file."),process.exit(1)}(e,s,i),g=function(e,o){switch(e){case"app":return"app-node";case"functions":return"functions";case"lib":return o.some((e=>e.endsWith(".tsx")))?"lib-react":"lib";default:console.error("target option must be one of: "+_.join(", ")),process.exit(1)}}(o,y);n&&console.info("Target (Category):",`${g} (${o})`);const[h]=function(e){const o=e.name?.toString()||"",n=/@([^/]+)\/(.+)/.exec(o),[,s,i]=n||[];return[s,i]}(u),b="module"===u.type;e["core-js"]?process.env.BUILD_TS_COREJS="1":e["core-js-proposals"]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS="1"),n&&(process.env.BUILD_TS_VERBOSE="1"),process.env.BUILD_TS_TARGET_CATEGORY=o,process.env.BUILD_TS_TARGET_DETAIL=g;const j=function(e,o,n,s){const i=r.join(n,"dist");if("app-node"===o||"functions"===o)return[{dir:i,format:V(s,e.moduleType)?"module":"commonjs",sourcemap:e.sourcemap&&"inline"}];const t=[],c=e.moduleType||"both",a=e.jsExtension||"either";("cjs"===c||"both"===c||"either"===c&&!s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&!s?"[name].js":"[name].cjs",format:"commonjs",preserveModules:!0,sourcemap:e.sourcemap});("esm"===c||"both"===c||"either"===c&&s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&s?"[name].js":"[name].mjs",format:"module",preserveModules:!0,sourcemap:e.sourcemap});return t}(e,g,i,b);n&&console.info("OutputOptions:",j),0===j.length&&(console.error("Failed to detect output files."),process.exit(1)),process.chdir(i),await t.promises.rm(r.join(i,"dist"),{recursive:!0,force:!0}),"functions"===g&&await H(i,u,e.moduleType);const v={input:"functions"===g?Object.fromEntries(y.map(((e,o)=>[0===o?"index":r.basename(e,r.extname(e)),e]))):y,plugins:I(e,g,u,h,i,j),watch:e.watch?{clearScreen:!1}:void 0},w=e=>(Array.isArray(e)?e:[e]).map((e=>r.relative(i,e)));if(e.watch)!function(e,o,n,s,i,t){const r=d({...s,output:i}),l=async e=>{process.removeListener("uncaughtException",l),process.stdin.removeListener("end",l),r&&await r.close(),e&&process.exit(e)};m(l),process.on("uncaughtException",l),process.stdin.isTTY||(process.stdin.on("end",l),process.stdin.resume());r.on("event",(async s=>{switch(s.code){case"ERROR":!function(e,o=!1){const n=e.name||e.cause?.name,s=n?`${n}: `:"",i=`${e.plugin?`(plugin ${e.plugin}) `:""}${s}${e.message}`,t=[c.bold(c.red(`[!] ${c.bold(i.toString())}`))];e.url&&t.push(c.cyan(e.url)),e.loc?t.push(`${e.loc.file||e.id} (${e.loc.line}:${e.loc.column})`):e.id&&t.push(e.id),e.frame&&t.push(c.dim(e.frame)),e.stack&&t.push(c.dim(e.stack?.replace(`${s}${e.message}\n`,""))),t.push("",""),console.error(t.join("\n")),o||$.exit(1)}(s.error,!0);break;case"BUNDLE_START":{if(e.silent)break;const o=s.input,i=[];"string"==typeof o?i.push(o):i.push(...Array.isArray(o)?o:Object.values(o)),console.info(c.cyan(`Bundles ${c.bold(t(i).join(", "))} → ${c.bold(t(s.output).join(", "))}\non ${n} ...`));break}case"BUNDLE_END":if(e.silent)break;console.info(c.green(`Created ${c.bold(t(s.output).join(", "))} in ${c.bold(p(s.duration))}`)),"app-node"!==o&&"functions"!==o&&await P(e,n);break;case"END":if(e.silent)break;console.info(`\n[${a()}] waiting for changes...`)}"result"in s&&s.result&&s.result.close()}))}(e,g,i,v,j,w);else{let o;e.silent||console.info(c.cyan(`Bundles ${c.bold(w(y).join(", "))} → ${c.bold(w(j.map((e=>e.file||e.dir||""))).join(", "))}\non ${i} ...`));let n=!1;try{const n=Date.now(),s=await l(v);o=s,await Promise.all(j.map((e=>s.write(e)))),e.silent||console.info(c.green(`Created ${w(j.map((e=>e.file||e.dir||""))).join(", ")} in ${c.bold(p(Date.now()-n))}`))}catch(e){n=!0,console.error("Failed to build due to:",e)}await(o?.close()),n&&process.exit(1),"app-node"===g||"functions"===g||await P(e,i)||process.exit(1)}}async function H(e,o,n){o.name+="-dist";const s="module"===o.type,i=V(s,n);o.main=s===i?"index.js":i?"index.mjs":"index.cjs",delete o.scripts,delete o.devDependencies,await t.promises.mkdir(r.join(e,"dist"),{recursive:!0}),await t.promises.writeFile(r.join(e,"dist","package.json"),JSON.stringify(o))}function V(e,o){return"esm"===o||(!o||"either"===o)&&e}const Y={command:"run <file>",describe:"Run script",builder:{...R,module:{description:"A module type: cjs or esm",type:"string",alias:"m"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"}},handler(e){T(e,process.cwd());const o=e.file?.toString()||"",n=process.versions.bun,s=n?"bun":"node",i=n?["--bun"]:["--no-warnings","--import","tsx"];e.watch&&i.push("--watch"),i.push(o);const[,...t]=e._,r=[...i,...t.map((e=>e.toString()))];e.verbose&&console.info(`Running '${s} ${r.join(" ")}'`);const c=D.spawnSync(s,r,{stdio:"inherit",env:{...process.env}});process.exit(c.status??1)}};n(process.env),await s(i(process.argv)).scriptName("build-ts").options(R).command(W).command(J).command(M).command(Y).demandCommand().strict().help().argv;
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbnYudHMiLCIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvYnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9wbHVnaW4udHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvdHlwZVNjcmlwdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9yb2xsdXBMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxubGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghZW52VmFycykge1xuICAgIGVudlZhcnMgPSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnTG9hZGVkIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZGVmaW5pdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGJ1aWxkLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnNEZWY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oYXJndi5pbmxpbmUgPz8gW10pLmZsYXRNYXAoKGUpID0+IGUudG9TdHJpbmcoKS5zcGxpdCgnLCcpKSxcbiAgICAuLi5PYmplY3Qua2V5cyhsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgY3dkKSksXG4gIF0pO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnZbbmFtZV0gPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBlbnZWYXJzRGVmW2Bwcm9jZXNzLmVudi4ke25hbWV9YF0gPSBKU09OLnN0cmluZ2lmeShwcm9jZXNzLmVudltuYW1lXSk7XG4gIH1cbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnSW5saW5lIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnNEZWYpKTtcbiAgfVxuICByZXR1cm4gZW52VmFyc0RlZjtcbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzLCBPcHRpb25zIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgYWxsVGFyZ2V0Q2F0ZWdvcmllcyA9IFsnYXBwJywgJ2Z1bmN0aW9ucycsICdsaWInXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGFyZ2V0Q2F0ZWdvcnkgPSAodHlwZW9mIGFsbFRhcmdldENhdGVnb3JpZXMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBhbGxUYXJnZXREZXRhaWxzID0gWydhcHAtbm9kZScsICdmdW5jdGlvbnMnLCAnbGliJywgJ2xpYi1yZWFjdCddIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUYXJnZXREZXRhaWwgPSAodHlwZW9mIGFsbFRhcmdldERldGFpbHMpW251bWJlcl07XG5cbmV4cG9ydCB0eXBlIEFyZ3VtZW50c1R5cGU8VCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogT3B0aW9ucyB9PiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPFQ+PjtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgdXJsIGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxbUGFja2FnZUpzb24gfCB1bmRlZmluZWQsIHN0cmluZ10+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgcmV0dXJuIFtKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF07XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgcGFja2FnZUpzb25QYXRoXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1aWxkVHNSb290UGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gdXJsLmZpbGVVUkxUb1BhdGgocGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShpbXBvcnQubWV0YS51cmwpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lc3BhY2VBbmROYW1lKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFtzdHJpbmcgfCB1bmRlZmluZWQsIHN0cmluZyB8IHVuZGVmaW5lZF0ge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IHBhY2thZ2VKc29uLm5hbWU/LnRvU3RyaW5nKCkgfHwgJyc7XG4gIGNvbnN0IG1hdGNoID0gL0AoW14vXSspXFwvKC4rKS8uZXhlYyhwYWNrYWdlTmFtZSk7XG4gIGNvbnN0IFssIG5hbWVzcGFjZSwgbmFtZV0gPSBtYXRjaCB8fCBbXTtcbiAgcmV0dXJuIFtuYW1lc3BhY2UsIG5hbWVdO1xufVxuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdzJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuZXhwb3J0IGNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLFxuICBpbnB1dDoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGhzIG9mIHNvdXJjZSBjb2RlIGZpbGVzIHRvIGJlIGJ1aWx0LiBUaGUgZmlyc3QgZmlsZSBpcyBtYWluLiBJZiBubyBvcHRpb24gaXMgZ2l2ZW4sIFwic3JjL2luZGV4Lnt0cyx0c3h9XCIgZnJvbSBwYWNrYWdlIGRpcmVjdG9yeSBpcyB0YXJnZXRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdpJyxcbiAgfSxcbiAgJ2NvcmUtanMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBjb3JlLWpzIGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICAnY29yZS1qcy1wcm9wb3NhbHMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBjb3JlLWpzIHdpdGggcHJvcG9zYWxzIHN1cHBvcnQgaXMgZW1wbG95ZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIG1pbmlmeToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgbWluaWZpY2F0aW9uIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgc291cmNlbWFwOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBzb3VyY2VtYXAgaXMgZW5hYmxlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICBleHRlcm5hbDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQWRkaXRpb25hbCBleHRlcm5hbCBkZXBlbmRlbmNpZXMuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICBpbmxpbmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Vudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBpbmxpbmVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gIGtlZXBJbXBvcnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lkZW50aWZpZXJzIHRvIGJlIGtlcHQgYXMgaW1wb3J0IHN0YXRlbWVudHMuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGFwcEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG1vZHVsZVR5cGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ2VzbSwgY2pzLCBvciBlaXRoZXIgKGRlZmF1bHQpLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbnNCdWlsZGVyID0ge1xuICAuLi5hcHBCdWlsZGVyLFxuICBvbmx5UGFja2FnZUpzb246IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gZ2VuZXJhdGUgb25seSBwYWNrYWdlLmpzb24uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgbGliQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIGVpdGhlciwgb3IgYm90aCAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxuICAvLyAuanMgZmlsZXMgaW4gYSBwYWNrYWdlIHdpdGggYFwidHlwZVwiOiBcIm1vZHVsZVwiYCBhcmUgdHJlYXRlZCBhcyBlc20uXG4gIC8vIEhvd2V2ZXIsIHdlIHdhbnQgdG8gdHJlYXQgdGhlbSBhcyBjanMgaW4gdGhlIGNhc2Ugd2hlcmUgYSBjanMgcHJvamVjdCBpbXBvcnRzIGFuIGVzbSBwYWNrYWdlLlxuICAvLyBUbyBkZWFsIHdpdGggdGhlIGNhc2UsIHdlIHVzZSAuY2pzIGFuZCAubWpzIGV4dGVuc2lvbnMgaW5zdGVhZCBvZiAuanMgZXh0ZW5zaW9uLlxuICBqc0V4dGVuc2lvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB1c2UgLmpzIGluIGNqcyBhbmQvb3IgZXNtOiBlaXRoZXIgKGRlZmF1bHQpLCBib3RoLCBvciBub25lLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdqJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEFueUJ1aWxkZXJUeXBlID0gdHlwZW9mIGFwcEJ1aWxkZXIgfCB0eXBlb2YgZnVuY3Rpb25zQnVpbGRlciB8IHR5cGVvZiBsaWJCdWlsZGVyO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgYmFiZWwgfSBmcm9tICdAcm9sbHVwL3BsdWdpbi1iYWJlbCc7XG5pbXBvcnQgY29tbW9uanMgZnJvbSAnQHJvbGx1cC9wbHVnaW4tY29tbW9uanMnO1xuaW1wb3J0IGpzb24gZnJvbSAnQHJvbGx1cC9wbHVnaW4tanNvbic7XG5pbXBvcnQgcmVzb2x2ZSBmcm9tICdAcm9sbHVwL3BsdWdpbi1ub2RlLXJlc29sdmUnO1xuaW1wb3J0IHJlcGxhY2UgZnJvbSAnQHJvbGx1cC9wbHVnaW4tcmVwbGFjZSc7XG5pbXBvcnQgdGVyc2VyIGZyb20gJ0Byb2xsdXAvcGx1Z2luLXRlcnNlcic7XG5pbXBvcnQgdHlwZSB7IE91dHB1dE9wdGlvbnMsIFBsdWdpbiB9IGZyb20gJ3JvbGx1cCc7XG5pbXBvcnQgYW5hbHl6ZSBmcm9tICdyb2xsdXAtcGx1Z2luLWFuYWx5emVyJztcbmltcG9ydCB7IGtlZXBJbXBvcnQgfSBmcm9tICdyb2xsdXAtcGx1Z2luLWtlZXAtaW1wb3J0JztcbmltcG9ydCB7IG5vZGVFeHRlcm5hbHMgfSBmcm9tICdyb2xsdXAtcGx1Z2luLW5vZGUtZXh0ZXJuYWxzJztcbmltcG9ydCBwcmVzZXJ2ZURpcmVjdGl2ZXMgZnJvbSAncm9sbHVwLXBsdWdpbi1wcmVzZXJ2ZS1kaXJlY3RpdmVzJztcbmltcG9ydCB7IHN0cmluZyB9IGZyb20gJ3JvbGx1cC1wbHVnaW4tc3RyaW5nJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24gfSBmcm9tICcuLi8uLi9lbnYuanMnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlLCBUYXJnZXREZXRhaWwgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXRCdWlsZFRzUm9vdFBhdGggfSBmcm9tICcuLi8uLi91dGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cFBsdWdpbnMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXVxuKTogUGx1Z2luW10ge1xuICBjb25zdCBleHRlcm5hbERlcHMgPSBbLi4uKGFyZ3YuZXh0ZXJuYWwgPz8gW10pXS5tYXAoKGl0ZW0pID0+IGl0ZW0udG9TdHJpbmcoKSk7XG4gIGlmIChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnQHByaXNtYS9jbGllbnQnXSkge1xuICAgIGV4dGVybmFsRGVwcy5wdXNoKCdwcmlzbWEtY2xpZW50Jyk7XG4gIH1cbiAgLy8gU2luY2UgYGRlcHM6IHRydWVgIGRvZXMgbm90IHdvcmsgZm9yIGBpbXBvcnQgY2h1bmsgZnJvbSAnbG9kYXNoLmNodW5rL2luZGV4LmpzJztgXG4gIGV4dGVybmFsRGVwcy5wdXNoKFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pXG4gICk7XG4gIC8vIEFkZCBleHRlcm5hbCBkZXBlbmRlbmNpZXMgZnJvbSBzaWJsaW5nIHBhY2thZ2VzXG4gIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbignLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgY29uc3QgcGFja2FnZURpcnMgPSBmcy5yZWFkZGlyU3luYyhwYXRoLmpvaW4oJy4uJyksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IHBhY2thZ2VEaXIgb2YgcGFja2FnZURpcnMpIHtcbiAgICAgIGlmICghcGFja2FnZURpci5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKCcuLicsIHBhY2thZ2VEaXIubmFtZSwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBvdGhlclBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICBpZiAocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bb3RoZXJQYWNrYWdlSnNvbi5uYW1lID8/ICcnXSkge1xuICAgICAgICBleHRlcm5hbERlcHMucHVzaChcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhvdGhlclBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhvdGhlclBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzID8/IHt9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGV4dGVuc2lvbnMgPSBbJy5janMnLCAnLm1qcycsICcuanMnLCAnLmpzeCcsICcuanNvbicsICcuY3RzJywgJy5tdHMnLCAnLnRzJywgJy50c3gnXTtcbiAgY29uc3QgYmFiZWxDb25maWdQYXRoID0gcGF0aC5qb2luKGdldEJ1aWxkVHNSb290UGF0aCgpLCAnYmFiZWwuY29uZmlnLm1qcycpO1xuICBjb25zdCBwbHVnaW5zOiBQbHVnaW5bXSA9IFtcbiAgICByZXBsYWNlKHtcbiAgICAgIC8vIElnbm9yZSB3b3JkIGJvdW5kYXJpZXMgYW5kIHJlcGxhY2UgZXZlcnkgaW5zdGFuY2Ugb2YgdGhlIHN0cmluZy5cbiAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vcm9sbHVwL3BsdWdpbnMvdHJlZS9tYXN0ZXIvcGFja2FnZXMvcmVwbGFjZSN3b3JkLWJvdW5kYXJpZXNcbiAgICAgIGRlbGltaXRlcnM6IFsnJywgJyddLFxuICAgICAgcHJldmVudEFzc2lnbm1lbnQ6IHRydWUsXG4gICAgICB2YWx1ZXM6IGNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbihhcmd2LCBwYWNrYWdlRGlyUGF0aCksXG4gICAgfSksXG4gICAganNvbigpLFxuICAgIG5vZGVFeHRlcm5hbHMoe1xuICAgICAgZGVwczogdHJ1ZSxcbiAgICAgIGRldkRlcHM6IGZhbHNlLFxuICAgICAgcGVlckRlcHM6IHRydWUsXG4gICAgICBvcHREZXBzOiB0cnVlLFxuICAgICAgaW5jbHVkZTogZXh0ZXJuYWxEZXBzLm1hcCgobmFtZSkgPT4gbmV3IFJlZ0V4cChgXiR7bmFtZX0oPzpcXFxcLy4rKT9gKSksXG4gICAgICBleGNsdWRlOiBuYW1lc3BhY2UgJiYgbmV3IFJlZ0V4cChgXkA/JHtuYW1lc3BhY2V9KD86XFxcXC8uKyk/YCksXG4gICAgfSksXG4gICAgcmVzb2x2ZSh7IGV4dGVuc2lvbnMgfSksXG4gICAgY29tbW9uanMoKSxcbiAgICBrZWVwSW1wb3J0KHsgbW9kdWxlTmFtZXM6IGFyZ3Yua2VlcEltcG9ydD8ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpID8/IFtdIH0pLFxuICBdO1xuICBjb25zdCBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPVxuICAgIHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnIHx8ICFleHRlcm5hbERlcHMuaW5jbHVkZXMoJ0BiYWJlbC9ydW50aW1lJyk7XG4gIHByb2Nlc3MuZW52LkJVSUxEVFNfVVNFX0JBQkxFX1JVTlRJTUUgPSBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPyAnJyA6ICcxJztcbiAgcGx1Z2lucy5wdXNoKFxuICAgIGJhYmVsKHtcbiAgICAgIGNvbmZpZ0ZpbGU6IGJhYmVsQ29uZmlnUGF0aCxcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICAvLyBXZSBuZWVkIGBydW50aW1lIHNpbmNlIGBidW5kbGVkYCBtYXkgYnJlYWsgZGlyZWN0b3J5IHN0cnVjdHVyZSBieSBjcmVhdGluZyBfdmlydHVhbCBkaXJlY3RvcnkuXG4gICAgICBiYWJlbEhlbHBlcnM6IGlzQmFiZWxIZWxwZXJzQnVuZGxlZCA/ICdidW5kbGVkJyA6ICdydW50aW1lJyxcbiAgICAgIGV4Y2x1ZGU6IC9eKC4rXFwvKT9ub2RlX21vZHVsZXNcXC8uKyQvLFxuICAgIH0pLFxuICAgIC4uLihvdXRwdXRPcHRpb25zTGlzdC5zb21lKChvcHRzKSA9PiBvcHRzLnByZXNlcnZlTW9kdWxlcykgPyBbcHJlc2VydmVEaXJlY3RpdmVzKCldIDogW10pLFxuICAgIHN0cmluZyh7IGluY2x1ZGU6IFsnKiovKi5jc3YnLCAnKiovKi50eHQnXSB9KVxuICApO1xuICBpZiAoYXJndi5taW5pZnkpIHtcbiAgICBwbHVnaW5zLnB1c2godGVyc2VyKHsgY29tcHJlc3M6IHsgZGlyZWN0aXZlczogZmFsc2UgfSB9KSk7XG4gIH1cbiAgcGx1Z2lucy5wdXNoKGFuYWx5emUoeyBzdW1tYXJ5T25seTogdHJ1ZSB9KSk7XG4gIHJldHVybiBwbHVnaW5zO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbi8vIFdlIGNhbm5vdCB1c2UgbmFtZWQgaW1wb3J0cyBmcm9tICd0eXBlc2NyaXB0JyBiZWNhdXNlIG9mIGJ1aWxkIGVycm9ycy5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFueUJ1aWxkZXJUeXBlIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIGNvcmVQcm9qZWN0RGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgY29yZUNvbmZpZ0ZpbGUgPSB0cy5maW5kQ29uZmlnRmlsZShjb3JlUHJvamVjdERpclBhdGgsIHRzLnN5cy5maWxlRXhpc3RzKTtcbiAgaWYgKCFjb3JlQ29uZmlnRmlsZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCB0c2NvbmZpZy5qc29uIGluICR7Y29yZVByb2plY3REaXJQYXRofS5gKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnRm91bmQgdHNjb25maWcuanNvbjonLCBjb3JlQ29uZmlnRmlsZSk7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0czogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgbGV0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIHBhdGguYmFzZW5hbWUoY29yZVByb2plY3REaXJQYXRoKSwgJ3NyYycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjb3JlUHJvamVjdERpclBhdGgpO1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHBhcmVudERpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb3JlUHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBpZiAoIWRpcmVudC5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUocGFyZW50RGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgaWYgKHByb2plY3REaXJQYXRoID09PSBjb3JlUHJvamVjdERpclBhdGgpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBjb25maWdGaWxlID0gdHMuZmluZENvbmZpZ0ZpbGUocHJvamVjdERpclBhdGgsIHRzLnN5cy5maWxlRXhpc3RzKTtcbiAgICAgIGNvbnN0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIGRpcmVudC5uYW1lLCAnc3JjJyk7XG4gICAgICBpZiAoY29uZmlnRmlsZSAmJiBmcy5leGlzdHNTeW5jKG91dERpcikpIHtcbiAgICAgICAgcHJvamVjdHMucHVzaChbcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXREaXIgPSAnZGlzdCc7XG4gIH1cbiAgcHJvamVjdHMucHVzaChbY29yZVByb2plY3REaXJQYXRoLCBjb3JlQ29uZmlnRmlsZSwgb3V0RGlyXSk7XG5cbiAgbGV0IGFsbFN1Y2NlZWRlZCA9IHRydWU7XG4gIGZvciAoY29uc3QgW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXJdIG9mIHByb2plY3RzKSB7XG4gICAgYWxsU3VjY2VlZGVkICYmPSBydW5UeXBlU2NyaXB0Q29tcGlsZXIoYXJndiwgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIHBhdGguam9pbihjb3JlUHJvamVjdERpclBhdGgsIG91dERpcikpO1xuICB9XG4gIHJldHVybiBhbGxTdWNjZWVkZWQ7XG59XG5cbmZ1bmN0aW9uIHJ1blR5cGVTY3JpcHRDb21waWxlcihcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZ0ZpbGU6IHN0cmluZyxcbiAgb3V0RGlyOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdydW5UeXBlU2NyaXB0Q29tcGlsZXIoKScsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIpO1xuICB9XG5cbiAgY29uc3QgeyBjb25maWcgfSA9IHRzLnJlYWRDb25maWdGaWxlKGNvbmZpZ0ZpbGUsIHRzLnN5cy5yZWFkRmlsZSk7XG4gIGNvbmZpZy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgLi4uY29uZmlnLmNvbXBpbGVyT3B0aW9ucyxcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBlbWl0RGVjbGFyYXRpb25Pbmx5OiB0cnVlLFxuICAgIG5vRW1pdDogZmFsc2UsXG4gICAgbm9FbWl0T25FcnJvcjogdHJ1ZSxcbiAgICBvdXREaXIsXG4gIH07XG4gIGNvbmZpZy5pbmNsdWRlID0gWydzcmMvKiovKiddO1xuICBjb25zdCB7IGVycm9ycywgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSB0cy5wYXJzZUpzb25Db25maWdGaWxlQ29udGVudChjb25maWcsIHRzLnN5cywgcHJvamVjdERpclBhdGgpO1xuXG4gIGNvbnN0IHByb2dyYW0gPSB0cy5jcmVhdGVQcm9ncmFtKHsgb3B0aW9ucywgcm9vdE5hbWVzOiBmaWxlTmFtZXMsIGNvbmZpZ0ZpbGVQYXJzaW5nRGlhZ25vc3RpY3M6IGVycm9ycyB9KTtcbiAgY29uc3QgeyBkaWFnbm9zdGljcywgZW1pdFNraXBwZWQgfSA9IHByb2dyYW0uZW1pdCgpO1xuXG4gIGNvbnN0IGFsbERpYWdub3N0aWNzID0gWy4uLnRzLmdldFByZUVtaXREaWFnbm9zdGljcyhwcm9ncmFtKSwgLi4uZGlhZ25vc3RpY3MsIC4uLmVycm9yc107XG4gIGlmIChhbGxEaWFnbm9zdGljcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZm9ybWF0SG9zdDogdHMuRm9ybWF0RGlhZ25vc3RpY3NIb3N0ID0ge1xuICAgICAgZ2V0Q2Fub25pY2FsRmlsZU5hbWU6IChwYXRoKSA9PiBwYXRoLFxuICAgICAgZ2V0Q3VycmVudERpcmVjdG9yeTogdHMuc3lzLmdldEN1cnJlbnREaXJlY3RvcnksXG4gICAgICBnZXROZXdMaW5lOiAoKSA9PiB0cy5zeXMubmV3TGluZSxcbiAgICB9O1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0cy5mb3JtYXREaWFnbm9zdGljcyhhbGxEaWFnbm9zdGljcywgZm9ybWF0SG9zdCk7XG4gICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICB9XG4gIHJldHVybiAhZW1pdFNraXBwZWQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGRhdGVUaW1lIGZyb20gJ2RhdGUtdGltZSc7XG5pbXBvcnQgbXMgZnJvbSAncHJldHR5LW1zJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUm9sbHVwQnVpbGQsIFJvbGx1cE9wdGlvbnMgfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IHsgcm9sbHVwLCB3YXRjaCB9IGZyb20gJ3JvbGx1cCc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXIgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgeyBvbkV4aXQgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vLi4vZW52LmpzJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSwgVGFyZ2V0Q2F0ZWdvcnksIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGFsbFRhcmdldENhdGVnb3JpZXMgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXROYW1lc3BhY2VBbmROYW1lLCByZWFkUGFja2FnZUpzb24gfSBmcm9tICcuLi8uLi91dGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQW55QnVpbGRlclR5cGUsIGJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYXBwQnVpbGRlciwgZnVuY3Rpb25zQnVpbGRlciwgbGliQnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBzZXR1cFBsdWdpbnMgfSBmcm9tICcuL3BsdWdpbi5qcyc7XG5pbXBvcnQgeyBoYW5kbGVFcnJvciB9IGZyb20gJy4vcm9sbHVwTG9nZ2VyLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyB9IGZyb20gJy4vdHlwZVNjcmlwdC5qcyc7XG5cbmV4cG9ydCBjb25zdCBhcHA6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgYXBwQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYXBwIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYW4gYXBwJyxcbiAgYnVpbGRlcjogYXBwQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdhcHAnKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbnM6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgZnVuY3Rpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZnVuY3Rpb25zIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYSBHQ1AvRmlyZWJhc2UgZnVuY3Rpb25zIGFwcCcsXG4gIGJ1aWxkZXI6IGZ1bmN0aW9uc0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2Lm9ubHlQYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gICAgICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICAgICAgaWYgKCFwYWNrYWdlSnNvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKHBhY2thZ2VEaXJQYXRoLCBwYWNrYWdlSnNvbiwgYXJndi5tb2R1bGVUeXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdmdW5jdGlvbnMnKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgbGliOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGxpYkJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpYiBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgTm9kZS5qcyAvIFJlYWN0IGxpYnJhcnknLFxuICBidWlsZGVyOiBsaWJCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICByZXR1cm4gYnVpbGQoYXJndiwgJ2xpYicpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LCB0YXJnZXRDYXRlZ29yeTogVGFyZ2V0Q2F0ZWdvcnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHw9ICdwcm9kdWN0aW9uJztcblxuICAvLyBgc2lsZW50YCBpcyBzdHJvbmdlciB0aGFuIGB2ZXJib3NlYC5cbiAgY29uc3QgdmVyYm9zZSA9ICFhcmd2LnNpbGVudCAmJiBhcmd2LnZlcmJvc2U7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gIGNvbnN0IFtwYWNrYWdlSnNvbiwgcGFja2FnZUpzb25QYXRoXSA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aCk7XG4gIGlmICghcGFja2FnZUpzb24pIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwYWNrYWdlRGlyUGF0aCk7XG5cbiAgY29uc3QgaW5wdXRzID0gdmVyaWZ5SW5wdXQoYXJndiwgY3dkLCBwYWNrYWdlRGlyUGF0aCk7XG4gIGNvbnN0IHRhcmdldERldGFpbCA9IGRldGVjdFRhcmdldERldGFpbCh0YXJnZXRDYXRlZ29yeSwgaW5wdXRzKTtcblxuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnVGFyZ2V0IChDYXRlZ29yeSk6JywgYCR7dGFyZ2V0RGV0YWlsfSAoJHt0YXJnZXRDYXRlZ29yeX0pYCk7XG4gIH1cblxuICBjb25zdCBbbmFtZXNwYWNlXSA9IGdldE5hbWVzcGFjZUFuZE5hbWUocGFja2FnZUpzb24pO1xuICBjb25zdCBpc0VzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcblxuICBpZiAoYXJndlsnY29yZS1qcyddKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfQ09SRUpTID0gJzEnO1xuICB9IGVsc2UgaWYgKGFyZ3ZbJ2NvcmUtanMtcHJvcG9zYWxzJ10pIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19DT1JFSlNfV0lUSF9QUk9QT1NBTFMgPSAnMSc7XG4gIH1cblxuICBpZiAodmVyYm9zZSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX1ZFUkJPU0UgPSAnMSc7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVEFSR0VUX0NBVEVHT1JZID0gdGFyZ2V0Q2F0ZWdvcnk7XG4gIHByb2Nlc3MuZW52LkJVSUxEX1RTX1RBUkdFVF9ERVRBSUwgPSB0YXJnZXREZXRhaWw7XG5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3QgPSBnZXRPdXRwdXRPcHRpb25zTGlzdChhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VEaXJQYXRoLCBpc0VzbVBhY2thZ2UpO1xuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnT3V0cHV0T3B0aW9uczonLCBvdXRwdXRPcHRpb25zTGlzdCk7XG4gIH1cbiAgaWYgKG91dHB1dE9wdGlvbnNMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3Qgb3V0cHV0IGZpbGVzLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuY2hkaXIocGFja2FnZURpclBhdGgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JyksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgaWYgKHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycpIHtcbiAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKHBhY2thZ2VEaXJQYXRoLCBwYWNrYWdlSnNvbiwgYXJndi5tb2R1bGVUeXBlKTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnM6IFJvbGx1cE9wdGlvbnMgPSB7XG4gICAgaW5wdXQ6XG4gICAgICB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnXG4gICAgICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgaW5wdXRzLm1hcCgoaW5wdXQsIGluZGV4KSA9PiBbaW5kZXggPT09IDAgPyAnaW5kZXgnIDogcGF0aC5iYXNlbmFtZShpbnB1dCwgcGF0aC5leHRuYW1lKGlucHV0KSksIGlucHV0XSlcbiAgICAgICAgICApXG4gICAgICAgIDogaW5wdXRzLFxuICAgIHBsdWdpbnM6IHNldHVwUGx1Z2lucyhhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VKc29uLCBuYW1lc3BhY2UsIHBhY2thZ2VEaXJQYXRoLCBvdXRwdXRPcHRpb25zTGlzdCksXG4gICAgd2F0Y2g6IGFyZ3Yud2F0Y2ggPyB7IGNsZWFyU2NyZWVuOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICB9O1xuXG4gIGNvbnN0IHBhdGhUb1JlbGF0aXZlUGF0aCA9IChwYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KTogc3RyaW5nW10gPT5cbiAgICAoQXJyYXkuaXNBcnJheShwYXRocykgPyBwYXRocyA6IFtwYXRoc10pLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShwYWNrYWdlRGlyUGF0aCwgcCkpO1xuICBpZiAoYXJndi53YXRjaCkge1xuICAgIHdhdGNoUm9sbHVwKGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZURpclBhdGgsIG9wdGlvbnMsIG91dHB1dE9wdGlvbnNMaXN0LCBwYXRoVG9SZWxhdGl2ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgQnVuZGxlcyAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0cykuam9pbignLCAnKSl9IOKGkiAke2NoYWxrLmJvbGQoXG4gICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZVBhdGgob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBvcHRzLmZpbGUgfHwgb3B0cy5kaXIgfHwgJycpKS5qb2luKCcsICcpXG4gICAgICAgICAgKX1cXG5vbiAke3BhY2thZ2VEaXJQYXRofSAuLi5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGJ1bmRsZTogUm9sbHVwQnVpbGQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGJ1aWxkRmFpbGVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBfYnVuZGxlID0gYXdhaXQgcm9sbHVwKG9wdGlvbnMpO1xuICAgICAgYnVuZGxlID0gX2J1bmRsZTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gX2J1bmRsZS53cml0ZShvcHRzKSkpO1xuXG4gICAgICBpZiAoIWFyZ3Yuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgIGBDcmVhdGVkICR7cGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbihcbiAgICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICAgKX0gaW4gJHtjaGFsay5ib2xkKG1zKERhdGUubm93KCkgLSBzdGFydFRpbWUpKX1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBidWlsZEZhaWxlZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYnVpbGQgZHVlIHRvOicsIGVycm9yKTtcbiAgICB9XG4gICAgYXdhaXQgYnVuZGxlPy5jbG9zZSgpO1xuICAgIGlmIChidWlsZEZhaWxlZCkgcHJvY2Vzcy5leGl0KDEpO1xuXG4gICAgaWYgKFxuICAgICAgdGFyZ2V0RGV0YWlsICE9PSAnYXBwLW5vZGUnICYmXG4gICAgICB0YXJnZXREZXRhaWwgIT09ICdmdW5jdGlvbnMnICYmXG4gICAgICAhKGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCkpXG4gICAgKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhdGNoUm9sbHVwKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgdGFyZ2V0RGV0YWlsOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJvbGx1cE9wdGlvbnMsXG4gIG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW10sXG4gIHBhdGhUb1JlbGF0aXZlUGF0aDogKHBhdGhzOiBzdHJpbmcgfCBSZWFkb25seTxzdHJpbmdbXT4pID0+IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgY29uc3Qgd2F0Y2hlciA9IHdhdGNoKHsgLi4ub3B0aW9ucywgb3V0cHV0OiBvdXRwdXRPcHRpb25zTGlzdCB9KTtcblxuICBjb25zdCBjbG9zZSA9IGFzeW5jIChjb2RlOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcigndW5jYXVnaHRFeGNlcHRpb24nLCBjbG9zZSk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xvc2UpO1xuICAgIGlmICh3YXRjaGVyKSBhd2FpdCB3YXRjaGVyLmNsb3NlKCk7XG4gICAgaWYgKGNvZGUpIHByb2Nlc3MuZXhpdChjb2RlKTtcbiAgfTtcbiAgb25FeGl0KGNsb3NlIGFzIHVua25vd24gYXMgSGFuZGxlcik7XG4gIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2UpO1xuICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlbmQnLCBjbG9zZSk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcbiAgfVxuXG4gIHdhdGNoZXIub24oJ2V2ZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgc3dpdGNoIChldmVudC5jb2RlKSB7XG4gICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXZlbnQuZXJyb3IsIHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0JVTkRMRV9TVEFSVCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zdCBldmVudElucHV0ID0gZXZlbnQuaW5wdXQ7XG4gICAgICAgIGNvbnN0IGlucHV0RmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnRJbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpbnB1dEZpbGVzLnB1c2goZXZlbnRJbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5wdXRGaWxlcy5wdXNoKFxuICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZXZlbnRJbnB1dCkgPyBldmVudElucHV0IDogT2JqZWN0LnZhbHVlcyhldmVudElucHV0IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgICBgQnVuZGxlcyAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0RmlsZXMpLmpvaW4oJywgJykpfSDihpIgJHtjaGFsay5ib2xkKFxuICAgICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZVBhdGgoZXZlbnQub3V0cHV0KS5qb2luKCcsICcpXG4gICAgICAgICAgICApfVxcbm9uICR7cGFja2FnZURpclBhdGh9IC4uLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQlVORExFX0VORCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQ3JlYXRlZCAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGV2ZW50Lm91dHB1dCkuam9pbignLCAnKSl9IGluICR7Y2hhbGsuYm9sZChtcyhldmVudC5kdXJhdGlvbikpfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJiB0YXJnZXREZXRhaWwgIT09ICdmdW5jdGlvbnMnKSB7XG4gICAgICAgICAgYXdhaXQgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VORCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zb2xlLmluZm8oYFxcblske2RhdGVUaW1lKCl9XSB3YWl0aW5nIGZvciBjaGFuZ2VzLi4uYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgncmVzdWx0JyBpbiBldmVudCAmJiBldmVudC5yZXN1bHQpIHtcbiAgICAgIHZvaWQgZXZlbnQucmVzdWx0LmNsb3NlKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5SW5wdXQoYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sIGN3ZDogc3RyaW5nLCBwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5pbnB1dCAmJiBhcmd2LmlucHV0Lmxlbmd0aCA+IDApIHJldHVybiBhcmd2LmlucHV0Lm1hcCgocCkgPT4gcGF0aC5qb2luKGN3ZCwgcC50b1N0cmluZygpKSk7XG5cbiAgY29uc3Qgc3JjRGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpO1xuICBmb3IgKGNvbnN0IGV4dCBvZiBbJ3RzJywgJ3RzeCcsICdjdHMnLCAnbXRzJ10pIHtcbiAgICBjb25zdCBpbnB1dCA9IHBhdGguam9pbihzcmNEaXJQYXRoLCBgaW5kZXguJHtleHR9YCk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoaW5wdXQpKSByZXR1cm4gW2lucHV0XTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3QgaW5wdXQgZmlsZS4nKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnk6IHN0cmluZywgaW5wdXRzOiBzdHJpbmdbXSk6IFRhcmdldERldGFpbCB7XG4gIHN3aXRjaCAodGFyZ2V0Q2F0ZWdvcnkpIHtcbiAgICBjYXNlICdhcHAnOiB7XG4gICAgICByZXR1cm4gJ2FwcC1ub2RlJztcbiAgICB9XG4gICAgY2FzZSAnZnVuY3Rpb25zJzoge1xuICAgICAgcmV0dXJuICdmdW5jdGlvbnMnO1xuICAgIH1cbiAgICBjYXNlICdsaWInOiB7XG4gICAgICBpZiAoaW5wdXRzLnNvbWUoKGlucHV0KSA9PiBpbnB1dC5lbmRzV2l0aCgnLnRzeCcpKSkge1xuICAgICAgICByZXR1cm4gJ2xpYi1yZWFjdCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ2xpYic7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RhcmdldCBvcHRpb24gbXVzdCBiZSBvbmUgb2Y6ICcgKyBhbGxUYXJnZXRDYXRlZ29yaWVzLmpvaW4oJywgJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG1vZHVsZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHBhY2thZ2VKc29uLm5hbWUgKz0gJy1kaXN0JztcbiAgY29uc3QgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICBjb25zdCBlc21PdXRwdXQgPSBpc0VzbU91dHB1dChlc21QYWNrYWdlLCBtb2R1bGVUeXBlKTtcbiAgcGFja2FnZUpzb24ubWFpbiA9IGVzbVBhY2thZ2UgPT09IGVzbU91dHB1dCA/ICdpbmRleC5qcycgOiBlc21PdXRwdXQgPyAnaW5kZXgubWpzJyA6ICdpbmRleC5janMnO1xuXG4gIC8vIFByZXZlbnQgRmlyZWJhc2UgRnVuY3Rpb25zIGZyb20gcnVubmluZyBgYnVpbGRgIHNjcmlwdCBzaW5jZSB3ZSBhcmUgYnVpbGRpbmcgY29kZSBiZWZvcmUgZGVwbG95aW5nLlxuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cztcbiAgLy8gZGV2RGVwZW5kZW5jaWVzIGFyZSBub3QgcmVxdWlyZWQgc2luY2Ugd2UgYXJlIGJ1aWxkaW5nIGNvZGUgYmVmb3JlIGRlcGxveWluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcblxuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuXG4pOiBPdXRwdXRPcHRpb25zW10ge1xuICBjb25zdCBvdXREaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpO1xuICBpZiAodGFyZ2V0RGV0YWlsID09PSAnYXBwLW5vZGUnIHx8IHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICAgIGZvcm1hdDogaXNFc21PdXRwdXQoaXNFc21QYWNrYWdlLCBhcmd2Lm1vZHVsZVR5cGUpID8gJ21vZHVsZScgOiAnY29tbW9uanMnLFxuICAgICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwICYmICdpbmxpbmUnLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgLy8gVGhlIGZvbGxvd2luZyBpbXBvcnQgc3RhdGVtZW50IGluIGFuIGVzbSBtb2R1bGUgY2F1c2VzIHRoZSBmb2xsb3dpbmcgZXJyb3I6XG4gIC8vIFN0YXRlbWVudDpcbiAgLy8gICBpbXBvcnQgeyB1c2VQcmV2aW91cyB9IGZyb20gJ3JlYWN0LXVzZSc7XG4gIC8vIEVycm9yOlxuICAvLyAgIE5hbWVkIGV4cG9ydCAndXNlUHJldmlvdXMnIG5vdCBmb3VuZC4gVGhlIHJlcXVlc3RlZCBtb2R1bGUgJ3JlYWN0LXVzZScgaXMgYSBDb21tb25KUyBtb2R1bGUsXG4gIC8vICAgd2hpY2ggbWF5IG5vdCBzdXBwb3J0IGFsbCBtb2R1bGUuZXhwb3J0cyBhcyBuYW1lZCBleHBvcnRzLlxuICAvLyBXZSBuZWVkIGNqcyBtb2R1bGVzIGZvciB3ZWIgYXBwcyB0byBhdm9pZCB0aGUgZXJyb3IuXG4gIC8vIEFsc28sIHNwbGl0dGluZyBhIGxpYnJhcnkgaXMgdXNlZnVsIGluIGJvdGggbW9kdWxlcywgc28gcHJlc2VydmVNb2R1bGVzIHNob3VsZCBiZSB0cnVlLlxuICBjb25zdCBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdID0gW107XG4gIGNvbnN0IG1vZHVsZVR5cGUgPSBhcmd2Lm1vZHVsZVR5cGUgfHwgJ2JvdGgnO1xuICBjb25zdCBqc0V4dCA9IGFyZ3YuanNFeHRlbnNpb24gfHwgJ2VpdGhlcic7XG4gIGlmIChtb2R1bGVUeXBlID09PSAnY2pzJyB8fCBtb2R1bGVUeXBlID09PSAnYm90aCcgfHwgKG1vZHVsZVR5cGUgPT09ICdlaXRoZXInICYmICFpc0VzbVBhY2thZ2UpKSB7XG4gICAgb3V0cHV0T3B0aW9uc0xpc3QucHVzaCh7XG4gICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICBlbnRyeUZpbGVOYW1lczoganNFeHQgPT09ICdib3RoJyB8fCAoanNFeHQgPT09ICdlaXRoZXInICYmICFpc0VzbVBhY2thZ2UpID8gJ1tuYW1lXS5qcycgOiAnW25hbWVdLmNqcycsXG4gICAgICBmb3JtYXQ6ICdjb21tb25qcycsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwLFxuICAgIH0pO1xuICB9XG4gIGlmIChtb2R1bGVUeXBlID09PSAnZXNtJyB8fCBtb2R1bGVUeXBlID09PSAnYm90aCcgfHwgKG1vZHVsZVR5cGUgPT09ICdlaXRoZXInICYmIGlzRXNtUGFja2FnZSkpIHtcbiAgICBvdXRwdXRPcHRpb25zTGlzdC5wdXNoKHtcbiAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgIGVudHJ5RmlsZU5hbWVzOiBqc0V4dCA9PT0gJ2JvdGgnIHx8IChqc0V4dCA9PT0gJ2VpdGhlcicgJiYgaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5tanMnLFxuICAgICAgZm9ybWF0OiAnbW9kdWxlJyxcbiAgICAgIHByZXNlcnZlTW9kdWxlczogdHJ1ZSxcbiAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dE9wdGlvbnNMaXN0O1xufVxuXG5mdW5jdGlvbiBpc0VzbU91dHB1dChpc0VzbVBhY2thZ2U6IGJvb2xlYW4sIG1vZHVsZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbW9kdWxlVHlwZSA9PT0gJ2VzbScgfHwgKCghbW9kdWxlVHlwZSB8fCBtb2R1bGVUeXBlID09PSAnZWl0aGVyJykgJiYgaXNFc21QYWNrYWdlKTtcbn1cbiIsImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFJvbGx1cEVycm9yIH0gZnJvbSAncm9sbHVwJztcblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yOiBSb2xsdXBFcnJvciwgcmVjb3ZlciA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnN0IG5hbWUgPSBlcnJvci5uYW1lIHx8IChlcnJvci5jYXVzZSBhcyBFcnJvcik/Lm5hbWU7XG4gIGNvbnN0IG5hbWVTZWN0aW9uID0gbmFtZSA/IGAke25hbWV9OiBgIDogJyc7XG4gIGNvbnN0IHBsdWdpblNlY3Rpb24gPSBlcnJvci5wbHVnaW4gPyBgKHBsdWdpbiAke2Vycm9yLnBsdWdpbn0pIGAgOiAnJztcbiAgY29uc3QgbWVzc2FnZSA9IGAke3BsdWdpblNlY3Rpb259JHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9YDtcblxuICBjb25zdCBvdXRwdXRMaW5lcyA9IFtjaGFsay5ib2xkKGNoYWxrLnJlZChgWyFdICR7Y2hhbGsuYm9sZChtZXNzYWdlLnRvU3RyaW5nKCkpfWApKV07XG5cbiAgaWYgKGVycm9yLnVybCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuY3lhbihlcnJvci51cmwpKTtcbiAgfVxuXG4gIGlmIChlcnJvci5sb2MpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGAke2Vycm9yLmxvYy5maWxlIHx8IGVycm9yLmlkfSAoJHtlcnJvci5sb2MubGluZX06JHtlcnJvci5sb2MuY29sdW1ufSlgKTtcbiAgfSBlbHNlIGlmIChlcnJvci5pZCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goZXJyb3IuaWQpO1xuICB9XG5cbiAgaWYgKGVycm9yLmZyYW1lKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChjaGFsay5kaW0oZXJyb3IuZnJhbWUpKTtcbiAgfVxuXG4gIGlmIChlcnJvci5zdGFjaykge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuZGltKGVycm9yLnN0YWNrPy5yZXBsYWNlKGAke25hbWVTZWN0aW9ufSR7ZXJyb3IubWVzc2FnZX1cXG5gLCAnJykpKTtcbiAgfVxuXG4gIG91dHB1dExpbmVzLnB1c2goJycsICcnKTtcbiAgY29uc29sZS5lcnJvcihvdXRwdXRMaW5lcy5qb2luKCdcXG4nKSk7XG5cbiAgaWYgKCFyZWNvdmVyKSBwcm9jZXNzLmV4aXQoMSk7XG59XG4iLCJpbXBvcnQgKiBhcyBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vZW52LmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgbW9kdWxlOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1vZHVsZSB0eXBlOiBjanMgb3IgZXNtJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBydW46IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncnVuIDxmaWxlPicsXG4gIGRlc2NyaWJlOiAnUnVuIHNjcmlwdCcsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwcm9jZXNzLmN3ZCgpKTtcblxuICAgIGNvbnN0IGZpbGUgPSBhcmd2LmZpbGU/LnRvU3RyaW5nKCkgfHwgJyc7XG5cbiAgICAvLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICAgIGNvbnN0IGlzUnVubmluZ09uQnVuID0gcHJvY2Vzcy52ZXJzaW9ucy5idW47XG4gICAgY29uc3QgcnVudGltZSA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAnbm9kZSc7XG4gICAgY29uc3QgYXJncyA9IGlzUnVubmluZ09uQnVuID8gWyctLWJ1biddIDogWyctLW5vLXdhcm5pbmdzJywgJy0taW1wb3J0JywgJ3RzeCddO1xuICAgIGlmIChhcmd2LndhdGNoKSB7XG4gICAgICBhcmdzLnB1c2goJy0td2F0Y2gnKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKGZpbGUpO1xuICAgIGNvbnN0IFssIC4uLmFkZGl0aW9uYWxBcmd1bWVudHNdID0gYXJndi5fO1xuICAgIGNvbnN0IHJ1bnRpbWVBcmdzID0gWy4uLmFyZ3MsIC4uLmFkZGl0aW9uYWxBcmd1bWVudHMubWFwKChhcmcpID0+IGFyZy50b1N0cmluZygpKV07XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nICcke3J1bnRpbWV9ICR7cnVudGltZUFyZ3Muam9pbignICcpfSdgKTtcbiAgICB9XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocnVudGltZSwgcnVudGltZUFyZ3MsIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYgfSxcbiAgICB9KTtcbiAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGFwcCwgZnVuY3Rpb25zLCBsaWIgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkL2J1aWxkLmpzJztcbmltcG9ydCB7IHJ1biB9IGZyb20gJy4vY29tbWFuZHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbnJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ2J1aWxkLXRzJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5jb21tYW5kKGFwcClcbiAgLmNvbW1hbmQoZnVuY3Rpb25zKVxuICAuY29tbWFuZChsaWIpXG4gIC5jb21tYW5kKHJ1bilcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLmhlbHAoKS5hcmd2O1xuIl0sIm5hbWVzIjpbImVudlZhcnMiLCJsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUiLCJhcmd2IiwiY3dkIiwicmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMiLCJ2ZXJib3NlIiwiY29uc29sZSIsImluZm8iLCJPYmplY3QiLCJrZXlzIiwiY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uIiwiZW52VmFyc0RlZiIsIm5hbWVzIiwiU2V0IiwiaW5saW5lIiwiZmxhdE1hcCIsImUiLCJ0b1N0cmluZyIsInNwbGl0IiwibmFtZSIsInVuZGVmaW5lZCIsInByb2Nlc3MiLCJlbnYiLCJKU09OIiwic3RyaW5naWZ5IiwiYWxsVGFyZ2V0Q2F0ZWdvcmllcyIsImFzeW5jIiwicmVhZFBhY2thZ2VKc29uIiwiZGlyUGF0aCIsInBhY2thZ2VKc29uUGF0aCIsInBhdGgiLCJqb2luIiwicGFja2FnZUpzb25UZXh0IiwiZnMiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwicGFyc2UiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsInlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYiLCJzaWxlbnQiLCJkZXNjcmlwdGlvbiIsInR5cGUiLCJhbGlhcyIsImJ1aWxkZXIiLCJpbnB1dCIsImRlZmF1bHQiLCJtaW5pZnkiLCJzb3VyY2VtYXAiLCJleHRlcm5hbCIsIndhdGNoIiwia2VlcEltcG9ydCIsImFwcEJ1aWxkZXIiLCJtb2R1bGVUeXBlIiwiZnVuY3Rpb25zQnVpbGRlciIsIm9ubHlQYWNrYWdlSnNvbiIsImxpYkJ1aWxkZXIiLCJqc0V4dGVuc2lvbiIsInNldHVwUGx1Z2lucyIsInRhcmdldERldGFpbCIsInBhY2thZ2VKc29uIiwibmFtZXNwYWNlIiwicGFja2FnZURpclBhdGgiLCJvdXRwdXRPcHRpb25zTGlzdCIsImV4dGVybmFsRGVwcyIsIm1hcCIsIml0ZW0iLCJkZXBlbmRlbmNpZXMiLCJwdXNoIiwicGVlckRlcGVuZGVuY2llcyIsIm9wdGlvbmFsRGVwZW5kZW5jaWVzIiwiZXhpc3RzU3luYyIsInBhY2thZ2VEaXJzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwicGFja2FnZURpciIsImlzRGlyZWN0b3J5Iiwib3RoZXJQYWNrYWdlSnNvbiIsInJlYWRGaWxlU3luYyIsImV4dGVuc2lvbnMiLCJiYWJlbENvbmZpZ1BhdGgiLCJ1cmwiLCJmaWxlVVJMVG9QYXRoIiwiZGlybmFtZSIsInBsdWdpbnMiLCJyZXBsYWNlIiwiZGVsaW1pdGVycyIsInByZXZlbnRBc3NpZ25tZW50IiwidmFsdWVzIiwianNvbiIsIm5vZGVFeHRlcm5hbHMiLCJkZXBzIiwiZGV2RGVwcyIsInBlZXJEZXBzIiwib3B0RGVwcyIsImluY2x1ZGUiLCJSZWdFeHAiLCJleGNsdWRlIiwicmVzb2x2ZSIsImNvbW1vbmpzIiwibW9kdWxlTmFtZXMiLCJpc0JhYmVsSGVscGVyc0J1bmRsZWQiLCJpbmNsdWRlcyIsIkJVSUxEVFNfVVNFX0JBQkxFX1JVTlRJTUUiLCJiYWJlbCIsImNvbmZpZ0ZpbGUiLCJiYWJlbEhlbHBlcnMiLCJzb21lIiwib3B0cyIsInByZXNlcnZlTW9kdWxlcyIsInByZXNlcnZlRGlyZWN0aXZlcyIsInN0cmluZyIsInRlcnNlciIsImNvbXByZXNzIiwiZGlyZWN0aXZlcyIsImFuYWx5emUiLCJzdW1tYXJ5T25seSIsImdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyIsImNvcmVQcm9qZWN0RGlyUGF0aCIsImNvcmVDb25maWdGaWxlIiwidHMiLCJmaW5kQ29uZmlnRmlsZSIsInN5cyIsImZpbGVFeGlzdHMiLCJFcnJvciIsInByb2plY3RzIiwib3V0RGlyIiwiYmFzZW5hbWUiLCJwYXJlbnREaXJQYXRoIiwiZGlyZW50cyIsInJlYWRkaXIiLCJkaXJlbnQiLCJwcm9qZWN0RGlyUGF0aCIsImFsbFN1Y2NlZWRlZCIsInJ1blR5cGVTY3JpcHRDb21waWxlciIsImNvbmZpZyIsInJlYWRDb25maWdGaWxlIiwiY29tcGlsZXJPcHRpb25zIiwiZGVjbGFyYXRpb24iLCJlbWl0RGVjbGFyYXRpb25Pbmx5Iiwibm9FbWl0Iiwibm9FbWl0T25FcnJvciIsImVycm9ycyIsImZpbGVOYW1lcyIsIm9wdGlvbnMiLCJwYXJzZUpzb25Db25maWdGaWxlQ29udGVudCIsInByb2dyYW0iLCJjcmVhdGVQcm9ncmFtIiwicm9vdE5hbWVzIiwiY29uZmlnRmlsZVBhcnNpbmdEaWFnbm9zdGljcyIsImRpYWdub3N0aWNzIiwiZW1pdFNraXBwZWQiLCJlbWl0IiwiYWxsRGlhZ25vc3RpY3MiLCJnZXRQcmVFbWl0RGlhZ25vc3RpY3MiLCJsZW5ndGgiLCJmb3JtYXRIb3N0IiwiZ2V0Q2Fub25pY2FsRmlsZU5hbWUiLCJnZXRDdXJyZW50RGlyZWN0b3J5IiwiZ2V0TmV3TGluZSIsIm5ld0xpbmUiLCJtZXNzYWdlIiwiZm9ybWF0RGlhZ25vc3RpY3MiLCJ3YXJuIiwiYXBwIiwiY29tbWFuZCIsImRlc2NyaWJlIiwiaGFuZGxlciIsImJ1aWxkIiwiZnVuY3Rpb25zIiwicGFja2FnZSIsImVycm9yIiwiZXhpdCIsImdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMiLCJsaWIiLCJ0YXJnZXRDYXRlZ29yeSIsIk5PREVfRU5WIiwiaW5wdXRzIiwicCIsInNyY0RpclBhdGgiLCJleHQiLCJ2ZXJpZnlJbnB1dCIsImVuZHNXaXRoIiwiZGV0ZWN0VGFyZ2V0RGV0YWlsIiwicGFja2FnZU5hbWUiLCJtYXRjaCIsImV4ZWMiLCJnZXROYW1lc3BhY2VBbmROYW1lIiwiaXNFc21QYWNrYWdlIiwiQlVJTERfVFNfQ09SRUpTIiwiQlVJTERfVFNfQ09SRUpTX1dJVEhfUFJPUE9TQUxTIiwiQlVJTERfVFNfVkVSQk9TRSIsIkJVSUxEX1RTX1RBUkdFVF9DQVRFR09SWSIsIkJVSUxEX1RTX1RBUkdFVF9ERVRBSUwiLCJvdXREaXJQYXRoIiwiZGlyIiwiZm9ybWF0IiwiaXNFc21PdXRwdXQiLCJqc0V4dCIsImVudHJ5RmlsZU5hbWVzIiwiZ2V0T3V0cHV0T3B0aW9uc0xpc3QiLCJjaGRpciIsInJtIiwicmVjdXJzaXZlIiwiZm9yY2UiLCJmcm9tRW50cmllcyIsImluZGV4IiwiZXh0bmFtZSIsImNsZWFyU2NyZWVuIiwicGF0aFRvUmVsYXRpdmVQYXRoIiwicGF0aHMiLCJBcnJheSIsImlzQXJyYXkiLCJyZWxhdGl2ZSIsIndhdGNoZXIiLCJvdXRwdXQiLCJjbG9zZSIsInJlbW92ZUxpc3RlbmVyIiwic3RkaW4iLCJjb2RlIiwib25FeGl0Iiwib24iLCJpc1RUWSIsInJlc3VtZSIsImV2ZW50IiwicmVjb3ZlciIsImNhdXNlIiwibmFtZVNlY3Rpb24iLCJwbHVnaW4iLCJvdXRwdXRMaW5lcyIsImNoYWxrIiwiYm9sZCIsInJlZCIsImN5YW4iLCJsb2MiLCJmaWxlIiwiaWQiLCJsaW5lIiwiY29sdW1uIiwiZnJhbWUiLCJkaW0iLCJzdGFjayIsImhhbmRsZUVycm9yIiwiZXZlbnRJbnB1dCIsImlucHV0RmlsZXMiLCJncmVlbiIsIm1zIiwiZHVyYXRpb24iLCJkYXRlVGltZSIsInJlc3VsdCIsIndhdGNoUm9sbHVwIiwiYnVuZGxlIiwiYnVpbGRGYWlsZWQiLCJzdGFydFRpbWUiLCJEYXRlIiwibm93IiwiX2J1bmRsZSIsInJvbGx1cCIsIlByb21pc2UiLCJhbGwiLCJ3cml0ZSIsImVzbVBhY2thZ2UiLCJlc21PdXRwdXQiLCJtYWluIiwic2NyaXB0cyIsImRldkRlcGVuZGVuY2llcyIsIm1rZGlyIiwid3JpdGVGaWxlIiwicnVuIiwibW9kdWxlIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsInJ1bnRpbWUiLCJhcmdzIiwiYWRkaXRpb25hbEFyZ3VtZW50cyIsIl8iLCJydW50aW1lQXJncyIsImFyZyIsInJldCIsImNoaWxkX3Byb2Nlc3MiLCJzcGF3blN5bmMiLCJzdGRpbyIsInN0YXR1cyIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyIsInlhcmdzIiwiaGlkZUJpbiIsInNjcmlwdE5hbWUiLCJkZW1hbmRDb21tYW5kIiwic3RyaWN0IiwiaGVscCJdLCJtYXBwaW5ncyI6InMvQkFNQSxJQUFJQSxFQUtHLFNBQVNDLEVBQ2RDLEVBQ0FDLEdBUUEsT0FOS0gsSUFDSEEsRUFBVUksRUFBaUNGLEVBQU1DLEdBQzdDRCxFQUFLRyxTQUNQQyxRQUFRQyxLQUFLLG1CQUFvQkMsT0FBT0MsS0FBS1QsS0FHMUNBLENBQ1QsQ0FLTyxTQUFTVSxFQUNkUixFQUNBQyxHQUVBLE1BQU1RLEVBQXFDLENBQUUsRUFDdkNDLEVBQVEsSUFBSUMsSUFBSSxLQUNoQlgsRUFBS1ksUUFBVSxJQUFJQyxTQUFTQyxHQUFNQSxFQUFFQyxXQUFXQyxNQUFNLFVBQ3REVixPQUFPQyxLQUFLUixFQUFrQ0MsRUFBTUMsTUFFekQsSUFBSyxNQUFNZ0Is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
|
|
1
|
+
import{readAndApplyEnvironmentVariables as e,yargsOptionsBuilderForEnv as o,removeNpmAndYarnEnvironmentVariables as n}from"@willbooster/shared-lib-node";import s from"yargs";import{hideBin as i}from"yargs/helpers";import t from"node:fs";import r from"node:path";import c from"chalk";import a from"date-time";import p from"pretty-ms";import{rollup as l,watch as d}from"rollup";import{onExit as u}from"signal-exit";import m from"node:url";import{babel as f}from"@rollup/plugin-babel";import y from"@rollup/plugin-commonjs";import b from"@rollup/plugin-json";import g from"@rollup/plugin-node-resolve";import h from"@rollup/plugin-replace";import j from"@rollup/plugin-terser";import v from"rollup-plugin-analyzer";import{keepImport as w}from"rollup-plugin-keep-import";import{nodeExternals as x}from"rollup-plugin-node-externals";import k from"rollup-plugin-preserve-directives";import{string as S}from"rollup-plugin-string";import $ from"node:process";import E from"typescript";import*as D from"node:child_process";let O;function T(o,n){return O||(O=e(o,n),o.verbose&&console.info("Loaded env vars:",Object.keys(O))),O}function F(e,o){const n={},s=new Set([...(e.inline??[]).flatMap((e=>e.toString().split(","))),...Object.keys(T(e,o))]);for(const e of s)void 0!==process.env[e]&&(n[`process.env.${e}`]=JSON.stringify(process.env[e]));return e.verbose&&console.info("Inline env vars:",Object.keys(n)),n}const _=["app","functions","lib"];async function N(e){const o=r.join(e,"package.json");try{const e=await t.promises.readFile(o,"utf8");return[JSON.parse(e),o]}catch{}return[void 0,o]}const B={...o,silent:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"s"}},R={...B,input:{description:'Paths of source code files to be built. The first file is main. If no option is given, "src/index.{ts,tsx}" from package directory is targeted.',type:"array",alias:"i"},"core-js":{description:"Whether or not core-js is employed.",type:"boolean",default:!1},"core-js-proposals":{description:"Whether or not core-js with proposals support is employed.",type:"boolean",default:!1},minify:{description:"Whether or not minification is enabled.",type:"boolean",default:!0},sourcemap:{description:"Whether or not sourcemap is enabled.",type:"boolean",default:!0},external:{description:"Additional external dependencies.",type:"array"},inline:{description:"Environment variables to be inlined.",type:"array"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"},keepImport:{description:"Identifiers to be kept as import statements.",type:"array"},bundleBuiltins:{description:"Module names same with builtins (e.g., undici) to be bundled.",type:"array"}},C={...R,moduleType:{description:"esm, cjs, or either (default).",type:"string",alias:"m"}},L={...C,onlyPackageJson:{description:"Whether to generate only package.json.",type:"boolean"}},A={...R,moduleType:{description:"esm, cjs, either, or both (default).",type:"string",alias:"m"},jsExtension:{description:"Whether to use .js in cjs and/or esm: either (default), both, or none.",type:"string",alias:"j"}};function I(e,o,n,s,i,c){const a=[...e.external??[]].map((e=>e.toString()));if(n.dependencies?.["@prisma/client"]&&a.push("prisma-client"),a.push(...Object.keys(n.dependencies??{}),...Object.keys(n.peerDependencies??{}),...Object.keys(n.optionalDependencies??{})),t.existsSync(r.join("..","..","package.json"))){const e=t.readdirSync(r.join(".."),{withFileTypes:!0});for(const o of e){if(!o.isDirectory())continue;const e=r.join("..",o.name,"package.json");if(!t.existsSync(e))continue;const s=JSON.parse(t.readFileSync(e,"utf8"));n.dependencies?.[s.name??""]&&a.push(...Object.keys(s.dependencies??{}),...Object.keys(s.peerDependencies??{}),...Object.keys(s.optionalDependencies??{}))}}const p=[".cjs",".mjs",".js",".jsx",".json",".cts",".mts",".ts",".tsx"],l=r.join(m.fileURLToPath(r.dirname(r.dirname(import.meta.url))),"babel.config.mjs"),d=[h({delimiters:["",""],preventAssignment:!0,values:F(e,i)}),b(),x({deps:!0,devDeps:!1,peerDeps:!0,optDeps:!0,include:a.map((e=>new RegExp(`^${e}(?:\\/.+)?`))),exclude:s&&new RegExp(`^@?${s}(?:\\/.+)?`)}),g({extensions:p,preferBuiltins:o=>!e.bundleBuiltins?.includes(o)}),y(),w({moduleNames:[...e.keepImport?.map((e=>e.toString()))??[],"undici"]})],u="app-node"===o||"functions"===o||!a.includes("@babel/runtime");return process.env.BUILDTS_USE_BABLE_RUNTIME=u?"":"1",d.push(f({configFile:l,extensions:p,babelHelpers:u?"bundled":"runtime",exclude:/^(.+\/)?node_modules\/.+$/}),...c.some((e=>e.preserveModules))?[k()]:[],S({include:["**/*.csv","**/*.txt"]})),e.minify&&d.push(j({compress:{directives:!1}})),d.push(v({summaryOnly:!0})),d}async function P(e,o){const n=E.findConfigFile(o,E.sys.fileExists);if(!n)throw new Error(`Failed to find tsconfig.json in ${o}.`);e.verbose&&console.info("Found tsconfig.json:",n);const s=[];let i=r.join("dist",r.basename(o),"src");if(t.existsSync(i)){const e=r.dirname(o),n=await t.promises.readdir(e,{withFileTypes:!0});o=r.resolve(o);for(const i of n){if(!i.isDirectory())continue;const n=r.resolve(e,i.name);if(n===o)continue;const c=E.findConfigFile(n,E.sys.fileExists),a=r.join("dist",i.name,"src");c&&t.existsSync(a)&&s.push([n,c,a])}}else i="dist";s.push([o,n,i]);let c=!0;for(const[n,i,t]of s)c&&=U(e,n,i,r.join(o,t));return c}function U(e,o,n,s){e.verbose&&console.info("runTypeScriptCompiler()",o,n,s);const{config:i}=E.readConfigFile(n,E.sys.readFile);i.compilerOptions={...i.compilerOptions,declaration:!0,emitDeclarationOnly:!0,noEmit:!1,noEmitOnError:!0,outDir:s},i.include=["src/**/*"];const{errors:t,fileNames:r,options:c}=E.parseJsonConfigFileContent(i,E.sys,o),a=E.createProgram({options:c,rootNames:r,configFileParsingDiagnostics:t}),{diagnostics:p,emitSkipped:l}=a.emit(),d=[...E.getPreEmitDiagnostics(a),...p,...t];if(d.length>0){const e={getCanonicalFileName:e=>e,getCurrentDirectory:E.sys.getCurrentDirectory,getNewLine:()=>E.sys.newLine},o=E.formatDiagnostics(d,e);console.warn(o)}return!l}const W={command:"app [package]",describe:"Build an app",builder:C,handler:async e=>G(e,"app")},J={command:"functions [package]",describe:"Build a GCP/Firebase functions app",builder:L,async handler(e){if(!e.onlyPackageJson)return G(e,"functions");{const o=r.resolve(e.package?.toString()??"."),[n,s]=await N(o);n||(console.error(`Failed to parse package.json (${s}).`),process.exit(1)),await H(o,n,e.moduleType)}}},M={command:"lib [package]",describe:"Build a Node.js / React library",builder:A,handler:async e=>G(e,"lib")};async function G(e,o){process.env.NODE_ENV||="production";const n=!e.silent&&e.verbose,s=process.cwd(),i=r.resolve(e.package?.toString()??"."),[m,f]=await N(i);m||(console.error(`Failed to parse package.json (${f}).`),process.exit(1)),T(e,i);const y=function(e,o,n){if(e.input&&e.input.length>0)return e.input.map((e=>r.join(o,e.toString())));const s=r.join(n,"src");for(const e of["ts","tsx","cts","mts"]){const o=r.join(s,`index.${e}`);if(t.existsSync(o))return[o]}console.error("Failed to detect input file."),process.exit(1)}(e,s,i),b=function(e,o){switch(e){case"app":return"app-node";case"functions":return"functions";case"lib":return o.some((e=>e.endsWith(".tsx")))?"lib-react":"lib";default:console.error("target option must be one of: "+_.join(", ")),process.exit(1)}}(o,y);n&&console.info("Target (Category):",`${b} (${o})`);const[g]=function(e){const o=e.name?.toString()||"",n=/@([^/]+)\/(.+)/.exec(o),[,s,i]=n||[];return[s,i]}(m),h="module"===m.type;e["core-js"]?process.env.BUILD_TS_COREJS="1":e["core-js-proposals"]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS="1"),n&&(process.env.BUILD_TS_VERBOSE="1"),process.env.BUILD_TS_TARGET_CATEGORY=o,process.env.BUILD_TS_TARGET_DETAIL=b;const j=function(e,o,n,s){const i=r.join(n,"dist");if("app-node"===o||"functions"===o)return[{dir:i,format:V(s,e.moduleType)?"module":"commonjs",sourcemap:e.sourcemap&&"inline"}];const t=[],c=e.moduleType||"both",a=e.jsExtension||"either";("cjs"===c||"both"===c||"either"===c&&!s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&!s?"[name].js":"[name].cjs",format:"commonjs",preserveModules:!0,sourcemap:e.sourcemap});("esm"===c||"both"===c||"either"===c&&s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&s?"[name].js":"[name].mjs",format:"module",preserveModules:!0,sourcemap:e.sourcemap});return t}(e,b,i,h);n&&console.info("OutputOptions:",j),0===j.length&&(console.error("Failed to detect output files."),process.exit(1)),process.chdir(i),await t.promises.rm(r.join(i,"dist"),{recursive:!0,force:!0}),"functions"===b&&await H(i,m,e.moduleType);const v={input:"functions"===b?Object.fromEntries(y.map(((e,o)=>[0===o?"index":r.basename(e,r.extname(e)),e]))):y,plugins:I(e,b,m,g,i,j),watch:e.watch?{clearScreen:!1}:void 0},w=e=>(Array.isArray(e)?e:[e]).map((e=>r.relative(i,e)));if(e.watch)!function(e,o,n,s,i,t){const r=d({...s,output:i}),l=async e=>{process.removeListener("uncaughtException",l),process.stdin.removeListener("end",l),r&&await r.close(),e&&process.exit(e)};u(l),process.on("uncaughtException",l),process.stdin.isTTY||(process.stdin.on("end",l),process.stdin.resume());r.on("event",(async s=>{switch(s.code){case"ERROR":!function(e,o=!1){const n=e.name||e.cause?.name,s=n?`${n}: `:"",i=`${e.plugin?`(plugin ${e.plugin}) `:""}${s}${e.message}`,t=[c.bold(c.red(`[!] ${c.bold(i.toString())}`))];e.url&&t.push(c.cyan(e.url)),e.loc?t.push(`${e.loc.file||e.id} (${e.loc.line}:${e.loc.column})`):e.id&&t.push(e.id),e.frame&&t.push(c.dim(e.frame)),e.stack&&t.push(c.dim(e.stack?.replace(`${s}${e.message}\n`,""))),t.push("",""),console.error(t.join("\n")),o||$.exit(1)}(s.error,!0);break;case"BUNDLE_START":{if(e.silent)break;const o=s.input,i=[];"string"==typeof o?i.push(o):i.push(...Array.isArray(o)?o:Object.values(o)),console.info(c.cyan(`Bundles ${c.bold(t(i).join(", "))} → ${c.bold(t(s.output).join(", "))}\non ${n} ...`));break}case"BUNDLE_END":if(e.silent)break;console.info(c.green(`Created ${c.bold(t(s.output).join(", "))} in ${c.bold(p(s.duration))}`)),"app-node"!==o&&"functions"!==o&&await P(e,n);break;case"END":if(e.silent)break;console.info(`\n[${a()}] waiting for changes...`)}"result"in s&&s.result&&s.result.close()}))}(e,b,i,v,j,w);else{let o;e.silent||console.info(c.cyan(`Bundles ${c.bold(w(y).join(", "))} → ${c.bold(w(j.map((e=>e.file||e.dir||""))).join(", "))}\non ${i} ...`));let n=!1;try{const n=Date.now(),s=await l(v);o=s,await Promise.all(j.map((e=>s.write(e)))),e.silent||console.info(c.green(`Created ${w(j.map((e=>e.file||e.dir||""))).join(", ")} in ${c.bold(p(Date.now()-n))}`))}catch(e){n=!0,console.error("Failed to build due to:",e)}await(o?.close()),n&&process.exit(1),"app-node"===b||"functions"===b||await P(e,i)||process.exit(1)}}async function H(e,o,n){o.name+="-dist";const s="module"===o.type,i=V(s,n);o.main=s===i?"index.js":i?"index.mjs":"index.cjs",delete o.scripts,delete o.devDependencies,await t.promises.mkdir(r.join(e,"dist"),{recursive:!0}),await t.promises.writeFile(r.join(e,"dist","package.json"),JSON.stringify(o))}function V(e,o){return"esm"===o||(!o||"either"===o)&&e}const Y={command:"run <file>",describe:"Run script",builder:{...B,module:{description:"A module type: cjs or esm",type:"string",alias:"m"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"}},handler(e){T(e,process.cwd());const o=e.file?.toString()||"",n=process.versions.bun,s=n?"bun":"node",i=n?["--bun"]:["--no-warnings","--import","tsx"];e.watch&&i.push("--watch"),i.push(o);const[,...t]=e._,r=[...i,...t.map((e=>e.toString()))];e.verbose&&console.info(`Running '${s} ${r.join(" ")}'`);const c=D.spawnSync(s,r,{stdio:"inherit",env:{...process.env}});process.exit(c.status??1)}};n(process.env),await s(i(process.argv)).scriptName("build-ts").options(B).command(W).command(J).command(M).command(Y).demandCommand().strict().help().argv;
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbnYudHMiLCIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvYnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9wbHVnaW4udHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvdHlwZVNjcmlwdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9yb2xsdXBMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxubGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghZW52VmFycykge1xuICAgIGVudlZhcnMgPSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnTG9hZGVkIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZGVmaW5pdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGJ1aWxkLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnNEZWY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oYXJndi5pbmxpbmUgPz8gW10pLmZsYXRNYXAoKGUpID0+IGUudG9TdHJpbmcoKS5zcGxpdCgnLCcpKSxcbiAgICAuLi5PYmplY3Qua2V5cyhsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgY3dkKSksXG4gIF0pO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnZbbmFtZV0gPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBlbnZWYXJzRGVmW2Bwcm9jZXNzLmVudi4ke25hbWV9YF0gPSBKU09OLnN0cmluZ2lmeShwcm9jZXNzLmVudltuYW1lXSk7XG4gIH1cbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnSW5saW5lIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnNEZWYpKTtcbiAgfVxuICByZXR1cm4gZW52VmFyc0RlZjtcbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzLCBPcHRpb25zIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgYWxsVGFyZ2V0Q2F0ZWdvcmllcyA9IFsnYXBwJywgJ2Z1bmN0aW9ucycsICdsaWInXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGFyZ2V0Q2F0ZWdvcnkgPSAodHlwZW9mIGFsbFRhcmdldENhdGVnb3JpZXMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBhbGxUYXJnZXREZXRhaWxzID0gWydhcHAtbm9kZScsICdmdW5jdGlvbnMnLCAnbGliJywgJ2xpYi1yZWFjdCddIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUYXJnZXREZXRhaWwgPSAodHlwZW9mIGFsbFRhcmdldERldGFpbHMpW251bWJlcl07XG5cbmV4cG9ydCB0eXBlIEFyZ3VtZW50c1R5cGU8VCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogT3B0aW9ucyB9PiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPFQ+PjtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgdXJsIGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxbUGFja2FnZUpzb24gfCB1bmRlZmluZWQsIHN0cmluZ10+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgcmV0dXJuIFtKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF07XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgcGFja2FnZUpzb25QYXRoXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1aWxkVHNSb290UGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gdXJsLmZpbGVVUkxUb1BhdGgocGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShpbXBvcnQubWV0YS51cmwpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lc3BhY2VBbmROYW1lKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFtzdHJpbmcgfCB1bmRlZmluZWQsIHN0cmluZyB8IHVuZGVmaW5lZF0ge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IHBhY2thZ2VKc29uLm5hbWU/LnRvU3RyaW5nKCkgfHwgJyc7XG4gIGNvbnN0IG1hdGNoID0gL0AoW14vXSspXFwvKC4rKS8uZXhlYyhwYWNrYWdlTmFtZSk7XG4gIGNvbnN0IFssIG5hbWVzcGFjZSwgbmFtZV0gPSBtYXRjaCB8fCBbXTtcbiAgcmV0dXJuIFtuYW1lc3BhY2UsIG5hbWVdO1xufVxuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdzJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuZXhwb3J0IGNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLFxuICBpbnB1dDoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGhzIG9mIHNvdXJjZSBjb2RlIGZpbGVzIHRvIGJlIGJ1aWx0LiBUaGUgZmlyc3QgZmlsZSBpcyBtYWluLiBJZiBubyBvcHRpb24gaXMgZ2l2ZW4sIFwic3JjL2luZGV4Lnt0cyx0c3h9XCIgZnJvbSBwYWNrYWdlIGRpcmVjdG9yeSBpcyB0YXJnZXRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdpJyxcbiAgfSxcbiAgJ2NvcmUtanMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBjb3JlLWpzIGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICAnY29yZS1qcy1wcm9wb3NhbHMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBjb3JlLWpzIHdpdGggcHJvcG9zYWxzIHN1cHBvcnQgaXMgZW1wbG95ZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIG1pbmlmeToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgbWluaWZpY2F0aW9uIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgc291cmNlbWFwOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBzb3VyY2VtYXAgaXMgZW5hYmxlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICBleHRlcm5hbDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQWRkaXRpb25hbCBleHRlcm5hbCBkZXBlbmRlbmNpZXMuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICBpbmxpbmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Vudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBpbmxpbmVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gIGtlZXBJbXBvcnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lkZW50aWZpZXJzIHRvIGJlIGtlcHQgYXMgaW1wb3J0IHN0YXRlbWVudHMuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICBidW5kbGVCdWlsdGluczoge1xuICAgIGRlc2NyaXB0aW9uOiAnTW9kdWxlIG5hbWVzIHNhbWUgd2l0aCBidWlsdGlucyAoZS5nLiwgdW5kaWNpKSB0byBiZSBidW5kbGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBhcHBCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgb3IgZWl0aGVyIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25zQnVpbGRlciA9IHtcbiAgLi4uYXBwQnVpbGRlcixcbiAgb25seVBhY2thZ2VKc29uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIGdlbmVyYXRlIG9ubHkgcGFja2FnZS5qc29uLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGxpYkJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG1vZHVsZVR5cGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ2VzbSwgY2pzLCBlaXRoZXIsIG9yIGJvdGggKGRlZmF1bHQpLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbiAgLy8gLmpzIGZpbGVzIGluIGEgcGFja2FnZSB3aXRoIGBcInR5cGVcIjogXCJtb2R1bGVcImAgYXJlIHRyZWF0ZWQgYXMgZXNtLlxuICAvLyBIb3dldmVyLCB3ZSB3YW50IHRvIHRyZWF0IHRoZW0gYXMgY2pzIGluIHRoZSBjYXNlIHdoZXJlIGEgY2pzIHByb2plY3QgaW1wb3J0cyBhbiBlc20gcGFja2FnZS5cbiAgLy8gVG8gZGVhbCB3aXRoIHRoZSBjYXNlLCB3ZSB1c2UgLmNqcyBhbmQgLm1qcyBleHRlbnNpb25zIGluc3RlYWQgb2YgLmpzIGV4dGVuc2lvbi5cbiAganNFeHRlbnNpb246IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gdXNlIC5qcyBpbiBjanMgYW5kL29yIGVzbTogZWl0aGVyIChkZWZhdWx0KSwgYm90aCwgb3Igbm9uZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnaicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBBbnlCdWlsZGVyVHlwZSA9IHR5cGVvZiBhcHBCdWlsZGVyIHwgdHlwZW9mIGZ1bmN0aW9uc0J1aWxkZXIgfCB0eXBlb2YgbGliQnVpbGRlcjtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGJhYmVsIH0gZnJvbSAnQHJvbGx1cC9wbHVnaW4tYmFiZWwnO1xuaW1wb3J0IGNvbW1vbmpzIGZyb20gJ0Byb2xsdXAvcGx1Z2luLWNvbW1vbmpzJztcbmltcG9ydCBqc29uIGZyb20gJ0Byb2xsdXAvcGx1Z2luLWpzb24nO1xuaW1wb3J0IHJlc29sdmUgZnJvbSAnQHJvbGx1cC9wbHVnaW4tbm9kZS1yZXNvbHZlJztcbmltcG9ydCByZXBsYWNlIGZyb20gJ0Byb2xsdXAvcGx1Z2luLXJlcGxhY2UnO1xuaW1wb3J0IHRlcnNlciBmcm9tICdAcm9sbHVwL3BsdWdpbi10ZXJzZXInO1xuaW1wb3J0IHR5cGUgeyBPdXRwdXRPcHRpb25zLCBQbHVnaW4gfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IGFuYWx5emUgZnJvbSAncm9sbHVwLXBsdWdpbi1hbmFseXplcic7XG5pbXBvcnQgeyBrZWVwSW1wb3J0IH0gZnJvbSAncm9sbHVwLXBsdWdpbi1rZWVwLWltcG9ydCc7XG5pbXBvcnQgeyBub2RlRXh0ZXJuYWxzIH0gZnJvbSAncm9sbHVwLXBsdWdpbi1ub2RlLWV4dGVybmFscyc7XG5pbXBvcnQgcHJlc2VydmVEaXJlY3RpdmVzIGZyb20gJ3JvbGx1cC1wbHVnaW4tcHJlc2VydmUtZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tICdyb2xsdXAtcGx1Z2luLXN0cmluZyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vZW52LmpzJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSwgVGFyZ2V0RGV0YWlsIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0QnVpbGRUc1Jvb3RQYXRoIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IGJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBQbHVnaW5zKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW11cbik6IFBsdWdpbltdIHtcbiAgY29uc3QgZXh0ZXJuYWxEZXBzID0gWy4uLihhcmd2LmV4dGVybmFsID8/IFtdKV0ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpO1xuICBpZiAocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ0BwcmlzbWEvY2xpZW50J10pIHtcbiAgICBleHRlcm5hbERlcHMucHVzaCgncHJpc21hLWNsaWVudCcpO1xuICB9XG4gIC8vIFNpbmNlIGBkZXBzOiB0cnVlYCBkb2VzIG5vdCB3b3JrIGZvciBgaW1wb3J0IGNodW5rIGZyb20gJ2xvZGFzaC5jaHVuay9pbmRleC5qcyc7YFxuICBleHRlcm5hbERlcHMucHVzaChcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzID8/IHt9KVxuICApO1xuICAvLyBBZGQgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGZyb20gc2libGluZyBwYWNrYWdlc1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIGNvbnN0IHBhY2thZ2VEaXJzID0gZnMucmVhZGRpclN5bmMocGF0aC5qb2luKCcuLicpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBwYWNrYWdlRGlyIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgICBpZiAoIXBhY2thZ2VEaXIuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbignLi4nLCBwYWNrYWdlRGlyLm5hbWUsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgb3RoZXJQYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICAgICAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW290aGVyUGFja2FnZUpzb24ubmFtZSA/PyAnJ10pIHtcbiAgICAgICAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBleHRlbnNpb25zID0gWycuY2pzJywgJy5tanMnLCAnLmpzJywgJy5qc3gnLCAnLmpzb24nLCAnLmN0cycsICcubXRzJywgJy50cycsICcudHN4J107XG4gIGNvbnN0IGJhYmVsQ29uZmlnUGF0aCA9IHBhdGguam9pbihnZXRCdWlsZFRzUm9vdFBhdGgoKSwgJ2JhYmVsLmNvbmZpZy5tanMnKTtcbiAgY29uc3QgcGx1Z2luczogUGx1Z2luW10gPSBbXG4gICAgcmVwbGFjZSh7XG4gICAgICAvLyBJZ25vcmUgd29yZCBib3VuZGFyaWVzIGFuZCByZXBsYWNlIGV2ZXJ5IGluc3RhbmNlIG9mIHRoZSBzdHJpbmcuXG4gICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3JvbGx1cC9wbHVnaW5zL3RyZWUvbWFzdGVyL3BhY2thZ2VzL3JlcGxhY2Ujd29yZC1ib3VuZGFyaWVzXG4gICAgICBkZWxpbWl0ZXJzOiBbJycsICcnXSxcbiAgICAgIHByZXZlbnRBc3NpZ25tZW50OiB0cnVlLFxuICAgICAgdmFsdWVzOiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oYXJndiwgcGFja2FnZURpclBhdGgpLFxuICAgIH0pLFxuICAgIGpzb24oKSxcbiAgICBub2RlRXh0ZXJuYWxzKHtcbiAgICAgIGRlcHM6IHRydWUsXG4gICAgICBkZXZEZXBzOiBmYWxzZSxcbiAgICAgIHBlZXJEZXBzOiB0cnVlLFxuICAgICAgb3B0RGVwczogdHJ1ZSxcbiAgICAgIGluY2x1ZGU6IGV4dGVybmFsRGVwcy5tYXAoKG5hbWUpID0+IG5ldyBSZWdFeHAoYF4ke25hbWV9KD86XFxcXC8uKyk/YCkpLFxuICAgICAgZXhjbHVkZTogbmFtZXNwYWNlICYmIG5ldyBSZWdFeHAoYF5APyR7bmFtZXNwYWNlfSg/OlxcXFwvLispP2ApLFxuICAgIH0pLFxuICAgIHJlc29sdmUoe1xuICAgICAgZXh0ZW5zaW9ucyxcbiAgICAgIC8vIFNldCBwcmVmZXJCdWlsdGlucyB0byBmYWxzZSBmb3IgJ3VuZGljaScgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHRyYW5zZm9ybWVkIHRvICdub2RlOnVuZGljaSdcbiAgICAgIHByZWZlckJ1aWx0aW5zOiAoaWQ6IHN0cmluZykgPT4gIWFyZ3YuYnVuZGxlQnVpbHRpbnM/LmluY2x1ZGVzKGlkKSxcbiAgICB9KSxcbiAgICBjb21tb25qcygpLFxuICAgIGtlZXBJbXBvcnQoeyBtb2R1bGVOYW1lczogWy4uLihhcmd2LmtlZXBJbXBvcnQ/Lm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKSA/PyBbXSksICd1bmRpY2knXSB9KSxcbiAgXTtcbiAgY29uc3QgaXNCYWJlbEhlbHBlcnNCdW5kbGVkID1cbiAgICB0YXJnZXREZXRhaWwgPT09ICdhcHAtbm9kZScgfHwgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJyB8fCAhZXh0ZXJuYWxEZXBzLmluY2x1ZGVzKCdAYmFiZWwvcnVudGltZScpO1xuICBwcm9jZXNzLmVudi5CVUlMRFRTX1VTRV9CQUJMRV9SVU5USU1FID0gaXNCYWJlbEhlbHBlcnNCdW5kbGVkID8gJycgOiAnMSc7XG4gIHBsdWdpbnMucHVzaChcbiAgICBiYWJlbCh7XG4gICAgICBjb25maWdGaWxlOiBiYWJlbENvbmZpZ1BhdGgsXG4gICAgICBleHRlbnNpb25zLFxuICAgICAgLy8gV2UgbmVlZCBgcnVudGltZSBzaW5jZSBgYnVuZGxlZGAgbWF5IGJyZWFrIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYnkgY3JlYXRpbmcgX3ZpcnR1YWwgZGlyZWN0b3J5LlxuICAgICAgYmFiZWxIZWxwZXJzOiBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPyAnYnVuZGxlZCcgOiAncnVudGltZScsXG4gICAgICBleGNsdWRlOiAvXiguK1xcLyk/bm9kZV9tb2R1bGVzXFwvLiskLyxcbiAgICB9KSxcbiAgICAuLi4ob3V0cHV0T3B0aW9uc0xpc3Quc29tZSgob3B0cykgPT4gb3B0cy5wcmVzZXJ2ZU1vZHVsZXMpID8gW3ByZXNlcnZlRGlyZWN0aXZlcygpXSA6IFtdKSxcbiAgICBzdHJpbmcoeyBpbmNsdWRlOiBbJyoqLyouY3N2JywgJyoqLyoudHh0J10gfSlcbiAgKTtcbiAgaWYgKGFyZ3YubWluaWZ5KSB7XG4gICAgcGx1Z2lucy5wdXNoKHRlcnNlcih7IGNvbXByZXNzOiB7IGRpcmVjdGl2ZXM6IGZhbHNlIH0gfSkpO1xuICB9XG4gIHBsdWdpbnMucHVzaChhbmFseXplKHsgc3VtbWFyeU9ubHk6IHRydWUgfSkpO1xuICByZXR1cm4gcGx1Z2lucztcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAqL1xuXG4vLyBXZSBjYW5ub3QgdXNlIG5hbWVkIGltcG9ydHMgZnJvbSAndHlwZXNjcmlwdCcgYmVjYXVzZSBvZiBidWlsZCBlcnJvcnMuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBbnlCdWlsZGVyVHlwZSB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBjb3JlUHJvamVjdERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvcmVDb25maWdGaWxlID0gdHMuZmluZENvbmZpZ0ZpbGUoY29yZVByb2plY3REaXJQYXRoLCB0cy5zeXMuZmlsZUV4aXN0cyk7XG4gIGlmICghY29yZUNvbmZpZ0ZpbGUpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgdHNjb25maWcuanNvbiBpbiAke2NvcmVQcm9qZWN0RGlyUGF0aH0uYCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0ZvdW5kIHRzY29uZmlnLmpzb246JywgY29yZUNvbmZpZ0ZpbGUpO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXVtdID0gW107XG4gIGxldCBvdXREaXIgPSBwYXRoLmpvaW4oJ2Rpc3QnLCBwYXRoLmJhc2VuYW1lKGNvcmVQcm9qZWN0RGlyUGF0aCksICdzcmMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMob3V0RGlyKSkge1xuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihwYXJlbnREaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29yZVByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvcmVQcm9qZWN0RGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgaWYgKCFkaXJlbnQuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKHBhcmVudERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGlmIChwcm9qZWN0RGlyUGF0aCA9PT0gY29yZVByb2plY3REaXJQYXRoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHRzLmZpbmRDb25maWdGaWxlKHByb2plY3REaXJQYXRoLCB0cy5zeXMuZmlsZUV4aXN0cyk7XG4gICAgICBjb25zdCBvdXREaXIgPSBwYXRoLmpvaW4oJ2Rpc3QnLCBkaXJlbnQubmFtZSwgJ3NyYycpO1xuICAgICAgaWYgKGNvbmZpZ0ZpbGUgJiYgZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgICAgIHByb2plY3RzLnB1c2goW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXJdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0RGlyID0gJ2Rpc3QnO1xuICB9XG4gIHByb2plY3RzLnB1c2goW2NvcmVQcm9qZWN0RGlyUGF0aCwgY29yZUNvbmZpZ0ZpbGUsIG91dERpcl0pO1xuXG4gIGxldCBhbGxTdWNjZWVkZWQgPSB0cnVlO1xuICBmb3IgKGNvbnN0IFtwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyXSBvZiBwcm9qZWN0cykge1xuICAgIGFsbFN1Y2NlZWRlZCAmJj0gcnVuVHlwZVNjcmlwdENvbXBpbGVyKGFyZ3YsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBwYXRoLmpvaW4oY29yZVByb2plY3REaXJQYXRoLCBvdXREaXIpKTtcbiAgfVxuICByZXR1cm4gYWxsU3VjY2VlZGVkO1xufVxuXG5mdW5jdGlvbiBydW5UeXBlU2NyaXB0Q29tcGlsZXIoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBwcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBjb25maWdGaWxlOiBzdHJpbmcsXG4gIG91dERpcjogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygncnVuVHlwZVNjcmlwdENvbXBpbGVyKCknLCBwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyKTtcbiAgfVxuXG4gIGNvbnN0IHsgY29uZmlnIH0gPSB0cy5yZWFkQ29uZmlnRmlsZShjb25maWdGaWxlLCB0cy5zeXMucmVhZEZpbGUpO1xuICBjb25maWcuY29tcGlsZXJPcHRpb25zID0ge1xuICAgIC4uLmNvbmZpZy5jb21waWxlck9wdGlvbnMsXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgZW1pdERlY2xhcmF0aW9uT25seTogdHJ1ZSxcbiAgICBub0VtaXQ6IGZhbHNlLFxuICAgIG5vRW1pdE9uRXJyb3I6IHRydWUsXG4gICAgb3V0RGlyLFxuICB9O1xuICBjb25maWcuaW5jbHVkZSA9IFsnc3JjLyoqLyonXTtcbiAgY29uc3QgeyBlcnJvcnMsIGZpbGVOYW1lcywgb3B0aW9ucyB9ID0gdHMucGFyc2VKc29uQ29uZmlnRmlsZUNvbnRlbnQoY29uZmlnLCB0cy5zeXMsIHByb2plY3REaXJQYXRoKTtcblxuICBjb25zdCBwcm9ncmFtID0gdHMuY3JlYXRlUHJvZ3JhbSh7IG9wdGlvbnMsIHJvb3ROYW1lczogZmlsZU5hbWVzLCBjb25maWdGaWxlUGFyc2luZ0RpYWdub3N0aWNzOiBlcnJvcnMgfSk7XG4gIGNvbnN0IHsgZGlhZ25vc3RpY3MsIGVtaXRTa2lwcGVkIH0gPSBwcm9ncmFtLmVtaXQoKTtcblxuICBjb25zdCBhbGxEaWFnbm9zdGljcyA9IFsuLi50cy5nZXRQcmVFbWl0RGlhZ25vc3RpY3MocHJvZ3JhbSksIC4uLmRpYWdub3N0aWNzLCAuLi5lcnJvcnNdO1xuICBpZiAoYWxsRGlhZ25vc3RpY3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGZvcm1hdEhvc3Q6IHRzLkZvcm1hdERpYWdub3N0aWNzSG9zdCA9IHtcbiAgICAgIGdldENhbm9uaWNhbEZpbGVOYW1lOiAocGF0aCkgPT4gcGF0aCxcbiAgICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6IHRzLnN5cy5nZXRDdXJyZW50RGlyZWN0b3J5LFxuICAgICAgZ2V0TmV3TGluZTogKCkgPT4gdHMuc3lzLm5ld0xpbmUsXG4gICAgfTtcbiAgICBjb25zdCBtZXNzYWdlID0gdHMuZm9ybWF0RGlhZ25vc3RpY3MoYWxsRGlhZ25vc3RpY3MsIGZvcm1hdEhvc3QpO1xuICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgfVxuICByZXR1cm4gIWVtaXRTa2lwcGVkO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBkYXRlVGltZSBmcm9tICdkYXRlLXRpbWUnO1xuaW1wb3J0IG1zIGZyb20gJ3ByZXR0eS1tcyc7XG5pbXBvcnQgdHlwZSB7IE91dHB1dE9wdGlvbnMsIFJvbGx1cEJ1aWxkLCBSb2xsdXBPcHRpb25zIH0gZnJvbSAncm9sbHVwJztcbmltcG9ydCB7IHJvbGx1cCwgd2F0Y2ggfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyIH0gZnJvbSAnc2lnbmFsLWV4aXQnO1xuaW1wb3J0IHsgb25FeGl0IH0gZnJvbSAnc2lnbmFsLWV4aXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldENhdGVnb3J5LCBUYXJnZXREZXRhaWwgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBhbGxUYXJnZXRDYXRlZ29yaWVzIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0TmFtZXNwYWNlQW5kTmFtZSwgcmVhZFBhY2thZ2VKc29uIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFueUJ1aWxkZXJUeXBlLCBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGFwcEJ1aWxkZXIsIGZ1bmN0aW9uc0J1aWxkZXIsIGxpYkJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgc2V0dXBQbHVnaW5zIH0gZnJvbSAnLi9wbHVnaW4uanMnO1xuaW1wb3J0IHsgaGFuZGxlRXJyb3IgfSBmcm9tICcuL3JvbGx1cExvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMgfSBmcm9tICcuL3R5cGVTY3JpcHQuanMnO1xuXG5leHBvcnQgY29uc3QgYXBwOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGFwcEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2FwcCBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGFuIGFwcCcsXG4gIGJ1aWxkZXI6IGFwcEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHJldHVybiBidWlsZChhcmd2LCAnYXBwJyk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25zOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGZ1bmN0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2Z1bmN0aW9ucyBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgR0NQL0ZpcmViYXNlIGZ1bmN0aW9ucyBhcHAnLFxuICBidWlsZGVyOiBmdW5jdGlvbnNCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5vbmx5UGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICAgICAgY29uc3QgW3BhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoKTtcbiAgICAgIGlmICghcGFja2FnZUpzb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhwYWNrYWdlRGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWlsZChhcmd2LCAnZnVuY3Rpb25zJyk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGxpYjogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmd1bWVudHNUeXBlPHR5cGVvZiBsaWJCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaWIgW3BhY2thZ2VdJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBhIE5vZGUuanMgLyBSZWFjdCBsaWJyYXJ5JyxcbiAgYnVpbGRlcjogbGliQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdsaWInKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPiwgdGFyZ2V0Q2F0ZWdvcnk6IFRhcmdldENhdGVnb3J5KTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8PSAncHJvZHVjdGlvbic7XG5cbiAgLy8gYHNpbGVudGAgaXMgc3Ryb25nZXIgdGhhbiBgdmVyYm9zZWAuXG4gIGNvbnN0IHZlcmJvc2UgPSAhYXJndi5zaWxlbnQgJiYgYXJndi52ZXJib3NlO1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICBpZiAoIXBhY2thZ2VKc29uKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcGFja2FnZURpclBhdGgpO1xuXG4gIGNvbnN0IGlucHV0cyA9IHZlcmlmeUlucHV0KGFyZ3YsIGN3ZCwgcGFja2FnZURpclBhdGgpO1xuICBjb25zdCB0YXJnZXREZXRhaWwgPSBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnksIGlucHV0cyk7XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ1RhcmdldCAoQ2F0ZWdvcnkpOicsIGAke3RhcmdldERldGFpbH0gKCR7dGFyZ2V0Q2F0ZWdvcnl9KWApO1xuICB9XG5cbiAgY29uc3QgW25hbWVzcGFjZV0gPSBnZXROYW1lc3BhY2VBbmROYW1lKHBhY2thZ2VKc29uKTtcbiAgY29uc3QgaXNFc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG5cbiAgaWYgKGFyZ3ZbJ2NvcmUtanMnXSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX0NPUkVKUyA9ICcxJztcbiAgfSBlbHNlIGlmIChhcmd2Wydjb3JlLWpzLXByb3Bvc2FscyddKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfQ09SRUpTX1dJVEhfUFJPUE9TQUxTID0gJzEnO1xuICB9XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19WRVJCT1NFID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkJVSUxEX1RTX1RBUkdFVF9DQVRFR09SWSA9IHRhcmdldENhdGVnb3J5O1xuICBwcm9jZXNzLmVudi5CVUlMRF9UU19UQVJHRVRfREVUQUlMID0gdGFyZ2V0RGV0YWlsO1xuXG4gIGNvbnN0IG91dHB1dE9wdGlvbnNMaXN0ID0gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlRGlyUGF0aCwgaXNFc21QYWNrYWdlKTtcbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ091dHB1dE9wdGlvbnM6Jywgb3V0cHV0T3B0aW9uc0xpc3QpO1xuICB9XG4gIGlmIChvdXRwdXRPcHRpb25zTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IG91dHB1dCBmaWxlcy4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBwcm9jZXNzLmNoZGlyKHBhY2thZ2VEaXJQYXRoKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIGlmICh0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnKSB7XG4gICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhwYWNrYWdlRGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gIH1cblxuICBjb25zdCBvcHRpb25zOiBSb2xsdXBPcHRpb25zID0ge1xuICAgIGlucHV0OlxuICAgICAgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJ1xuICAgICAgICA/IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIGlucHV0cy5tYXAoKGlucHV0LCBpbmRleCkgPT4gW2luZGV4ID09PSAwID8gJ2luZGV4JyA6IHBhdGguYmFzZW5hbWUoaW5wdXQsIHBhdGguZXh0bmFtZShpbnB1dCkpLCBpbnB1dF0pXG4gICAgICAgICAgKVxuICAgICAgICA6IGlucHV0cyxcbiAgICBwbHVnaW5zOiBzZXR1cFBsdWdpbnMoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlSnNvbiwgbmFtZXNwYWNlLCBwYWNrYWdlRGlyUGF0aCwgb3V0cHV0T3B0aW9uc0xpc3QpLFxuICAgIHdhdGNoOiBhcmd2LndhdGNoID8geyBjbGVhclNjcmVlbjogZmFsc2UgfSA6IHVuZGVmaW5lZCxcbiAgfTtcblxuICBjb25zdCBwYXRoVG9SZWxhdGl2ZVBhdGggPSAocGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPik6IHN0cmluZ1tdID0+XG4gICAgKEFycmF5LmlzQXJyYXkocGF0aHMpID8gcGF0aHMgOiBbcGF0aHNdKS5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUocGFja2FnZURpclBhdGgsIHApKTtcbiAgaWYgKGFyZ3Yud2F0Y2gpIHtcbiAgICB3YXRjaFJvbGx1cChhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VEaXJQYXRoLCBvcHRpb25zLCBvdXRwdXRPcHRpb25zTGlzdCwgcGF0aFRvUmVsYXRpdmVQYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWFyZ3Yuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgYEJ1bmRsZXMgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChpbnB1dHMpLmpvaW4oJywgJykpfSDihpIgJHtjaGFsay5ib2xkKFxuICAgICAgICAgICAgcGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbignLCAnKVxuICAgICAgICAgICl9XFxub24gJHtwYWNrYWdlRGlyUGF0aH0gLi4uYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBidW5kbGU6IFJvbGx1cEJ1aWxkIHwgdW5kZWZpbmVkO1xuICAgIGxldCBidWlsZEZhaWxlZCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgX2J1bmRsZSA9IGF3YWl0IHJvbGx1cChvcHRpb25zKTtcbiAgICAgIGJ1bmRsZSA9IF9idW5kbGU7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IF9idW5kbGUud3JpdGUob3B0cykpKTtcblxuICAgICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQ3JlYXRlZCAke3BhdGhUb1JlbGF0aXZlUGF0aChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IG9wdHMuZmlsZSB8fCBvcHRzLmRpciB8fCAnJykpLmpvaW4oXG4gICAgICAgICAgICAgICcsICdcbiAgICAgICAgICAgICl9IGluICR7Y2hhbGsuYm9sZChtcyhEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnVpbGRGYWlsZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGJ1aWxkIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgfVxuICAgIGF3YWl0IGJ1bmRsZT8uY2xvc2UoKTtcbiAgICBpZiAoYnVpbGRGYWlsZWQpIHByb2Nlc3MuZXhpdCgxKTtcblxuICAgIGlmIChcbiAgICAgIHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJlxuICAgICAgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJyAmJlxuICAgICAgIShhd2FpdCBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoYXJndiwgcGFja2FnZURpclBhdGgpKVxuICAgICkge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXRjaFJvbGx1cChcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHRhcmdldERldGFpbDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBvcHRpb25zOiBSb2xsdXBPcHRpb25zLFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdLFxuICBwYXRoVG9SZWxhdGl2ZVBhdGg6IChwYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KSA9PiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGNvbnN0IHdhdGNoZXIgPSB3YXRjaCh7IC4uLm9wdGlvbnMsIG91dHB1dDogb3V0cHV0T3B0aW9uc0xpc3QgfSk7XG5cbiAgY29uc3QgY2xvc2UgPSBhc3luYyAoY29kZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2UpO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsb3NlKTtcbiAgICBpZiAod2F0Y2hlcikgYXdhaXQgd2F0Y2hlci5jbG9zZSgpO1xuICAgIGlmIChjb2RlKSBwcm9jZXNzLmV4aXQoY29kZSk7XG4gIH07XG4gIG9uRXhpdChjbG9zZSBhcyB1bmtub3duIGFzIEhhbmRsZXIpO1xuICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIGNsb3NlKTtcbiAgaWYgKCFwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgcHJvY2Vzcy5zdGRpbi5vbignZW5kJywgY2xvc2UpO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7XG4gIH1cblxuICB3YXRjaGVyLm9uKCdldmVudCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIGhhbmRsZUVycm9yKGV2ZW50LmVycm9yLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdCVU5ETEVfU1RBUlQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc3QgZXZlbnRJbnB1dCA9IGV2ZW50LmlucHV0O1xuICAgICAgICBjb25zdCBpbnB1dEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodHlwZW9mIGV2ZW50SW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaW5wdXRGaWxlcy5wdXNoKGV2ZW50SW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlucHV0RmlsZXMucHVzaChcbiAgICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KGV2ZW50SW5wdXQpID8gZXZlbnRJbnB1dCA6IE9iamVjdC52YWx1ZXMoZXZlbnRJbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgICAgYEJ1bmRsZXMgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChpbnB1dEZpbGVzKS5qb2luKCcsICcpKX0g4oaSICR7Y2hhbGsuYm9sZChcbiAgICAgICAgICAgICAgcGF0aFRvUmVsYXRpdmVQYXRoKGV2ZW50Lm91dHB1dCkuam9pbignLCAnKVxuICAgICAgICAgICAgKX1cXG5vbiAke3BhY2thZ2VEaXJQYXRofSAuLi5gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0JVTkRMRV9FTkQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgYENyZWF0ZWQgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChldmVudC5vdXRwdXQpLmpvaW4oJywgJykpfSBpbiAke2NoYWxrLmJvbGQobXMoZXZlbnQuZHVyYXRpb24pKX1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0YXJnZXREZXRhaWwgIT09ICdhcHAtbm9kZScgJiYgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJykge1xuICAgICAgICAgIGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdFTkQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG5bJHtkYXRlVGltZSgpfV0gd2FpdGluZyBmb3IgY2hhbmdlcy4uLmApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJ3Jlc3VsdCcgaW4gZXZlbnQgJiYgZXZlbnQucmVzdWx0KSB7XG4gICAgICB2b2lkIGV2ZW50LnJlc3VsdC5jbG9zZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUlucHV0KGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LCBjd2Q6IHN0cmluZywgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGFyZ3YuaW5wdXQgJiYgYXJndi5pbnB1dC5sZW5ndGggPiAwKSByZXR1cm4gYXJndi5pbnB1dC5tYXAoKHApID0+IHBhdGguam9pbihjd2QsIHAudG9TdHJpbmcoKSkpO1xuXG4gIGNvbnN0IHNyY0RpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKTtcbiAgZm9yIChjb25zdCBleHQgb2YgWyd0cycsICd0c3gnLCAnY3RzJywgJ210cyddKSB7XG4gICAgY29uc3QgaW5wdXQgPSBwYXRoLmpvaW4oc3JjRGlyUGF0aCwgYGluZGV4LiR7ZXh0fWApO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGlucHV0KSkgcmV0dXJuIFtpbnB1dF07XG4gIH1cblxuICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IGlucHV0IGZpbGUuJyk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0VGFyZ2V0RGV0YWlsKHRhcmdldENhdGVnb3J5OiBzdHJpbmcsIGlucHV0czogc3RyaW5nW10pOiBUYXJnZXREZXRhaWwge1xuICBzd2l0Y2ggKHRhcmdldENhdGVnb3J5KSB7XG4gICAgY2FzZSAnYXBwJzoge1xuICAgICAgcmV0dXJuICdhcHAtbm9kZSc7XG4gICAgfVxuICAgIGNhc2UgJ2Z1bmN0aW9ucyc6IHtcbiAgICAgIHJldHVybiAnZnVuY3Rpb25zJztcbiAgICB9XG4gICAgY2FzZSAnbGliJzoge1xuICAgICAgaWYgKGlucHV0cy5zb21lKChpbnB1dCkgPT4gaW5wdXQuZW5kc1dpdGgoJy50c3gnKSkpIHtcbiAgICAgICAgcmV0dXJuICdsaWItcmVhY3QnO1xuICAgICAgfVxuICAgICAgcmV0dXJuICdsaWInO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zb2xlLmVycm9yKCd0YXJnZXQgb3B0aW9uIG11c3QgYmUgb25lIG9mOiAnICsgYWxsVGFyZ2V0Q2F0ZWdvcmllcy5qb2luKCcsICcpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBtb2R1bGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBwYWNrYWdlSnNvbi5uYW1lICs9ICctZGlzdCc7XG4gIGNvbnN0IGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgY29uc3QgZXNtT3V0cHV0ID0gaXNFc21PdXRwdXQoZXNtUGFja2FnZSwgbW9kdWxlVHlwZSk7XG4gIHBhY2thZ2VKc29uLm1haW4gPSBlc21QYWNrYWdlID09PSBlc21PdXRwdXQgPyAnaW5kZXguanMnIDogZXNtT3V0cHV0ID8gJ2luZGV4Lm1qcycgOiAnaW5kZXguY2pzJztcblxuICAvLyBQcmV2ZW50IEZpcmViYXNlIEZ1bmN0aW9ucyBmcm9tIHJ1bm5pbmcgYGJ1aWxkYCBzY3JpcHQgc2luY2Ugd2UgYXJlIGJ1aWxkaW5nIGNvZGUgYmVmb3JlIGRlcGxveWluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIC8vIGRldkRlcGVuZGVuY2llcyBhcmUgbm90IHJlcXVpcmVkIHNpbmNlIHdlIGFyZSBidWlsZGluZyBjb2RlIGJlZm9yZSBkZXBsb3lpbmcuXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG5cbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSk7XG59XG5cbmZ1bmN0aW9uIGdldE91dHB1dE9wdGlvbnNMaXN0KFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIGlzRXNtUGFja2FnZTogYm9vbGVhblxuKTogT3V0cHV0T3B0aW9uc1tdIHtcbiAgY29uc3Qgb3V0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnKTtcbiAgaWYgKHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgICBmb3JtYXQ6IGlzRXNtT3V0cHV0KGlzRXNtUGFja2FnZSwgYXJndi5tb2R1bGVUeXBlKSA/ICdtb2R1bGUnIDogJ2NvbW1vbmpzJyxcbiAgICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCAmJiAnaW5saW5lJyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8vIFRoZSBmb2xsb3dpbmcgaW1wb3J0IHN0YXRlbWVudCBpbiBhbiBlc20gbW9kdWxlIGNhdXNlcyB0aGUgZm9sbG93aW5nIGVycm9yOlxuICAvLyBTdGF0ZW1lbnQ6XG4gIC8vICAgaW1wb3J0IHsgdXNlUHJldmlvdXMgfSBmcm9tICdyZWFjdC11c2UnO1xuICAvLyBFcnJvcjpcbiAgLy8gICBOYW1lZCBleHBvcnQgJ3VzZVByZXZpb3VzJyBub3QgZm91bmQuIFRoZSByZXF1ZXN0ZWQgbW9kdWxlICdyZWFjdC11c2UnIGlzIGEgQ29tbW9uSlMgbW9kdWxlLFxuICAvLyAgIHdoaWNoIG1heSBub3Qgc3VwcG9ydCBhbGwgbW9kdWxlLmV4cG9ydHMgYXMgbmFtZWQgZXhwb3J0cy5cbiAgLy8gV2UgbmVlZCBjanMgbW9kdWxlcyBmb3Igd2ViIGFwcHMgdG8gYXZvaWQgdGhlIGVycm9yLlxuICAvLyBBbHNvLCBzcGxpdHRpbmcgYSBsaWJyYXJ5IGlzIHVzZWZ1bCBpbiBib3RoIG1vZHVsZXMsIHNvIHByZXNlcnZlTW9kdWxlcyBzaG91bGQgYmUgdHJ1ZS5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSA9IFtdO1xuICBjb25zdCBtb2R1bGVUeXBlID0gYXJndi5tb2R1bGVUeXBlIHx8ICdib3RoJztcbiAgY29uc3QganNFeHQgPSBhcmd2LmpzRXh0ZW5zaW9uIHx8ICdlaXRoZXInO1xuICBpZiAobW9kdWxlVHlwZSA9PT0gJ2NqcycgfHwgbW9kdWxlVHlwZSA9PT0gJ2JvdGgnIHx8IChtb2R1bGVUeXBlID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSkge1xuICAgIG91dHB1dE9wdGlvbnNMaXN0LnB1c2goe1xuICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgZW50cnlGaWxlTmFtZXM6IGpzRXh0ID09PSAnYm90aCcgfHwgKGpzRXh0ID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5janMnLFxuICAgICAgZm9ybWF0OiAnY29tbW9uanMnLFxuICAgICAgcHJlc2VydmVNb2R1bGVzOiB0cnVlLFxuICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCxcbiAgICB9KTtcbiAgfVxuICBpZiAobW9kdWxlVHlwZSA9PT0gJ2VzbScgfHwgbW9kdWxlVHlwZSA9PT0gJ2JvdGgnIHx8IChtb2R1bGVUeXBlID09PSAnZWl0aGVyJyAmJiBpc0VzbVBhY2thZ2UpKSB7XG4gICAgb3V0cHV0T3B0aW9uc0xpc3QucHVzaCh7XG4gICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICBlbnRyeUZpbGVOYW1lczoganNFeHQgPT09ICdib3RoJyB8fCAoanNFeHQgPT09ICdlaXRoZXInICYmIGlzRXNtUGFja2FnZSkgPyAnW25hbWVdLmpzJyA6ICdbbmFtZV0ubWpzJyxcbiAgICAgIGZvcm1hdDogJ21vZHVsZScsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBvdXRwdXRPcHRpb25zTGlzdDtcbn1cblxuZnVuY3Rpb24gaXNFc21PdXRwdXQoaXNFc21QYWNrYWdlOiBib29sZWFuLCBtb2R1bGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG1vZHVsZVR5cGUgPT09ICdlc20nIHx8ICgoIW1vZHVsZVR5cGUgfHwgbW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicpICYmIGlzRXNtUGFja2FnZSk7XG59XG4iLCJpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBSb2xsdXBFcnJvciB9IGZyb20gJ3JvbGx1cCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVFcnJvcihlcnJvcjogUm9sbHVwRXJyb3IsIHJlY292ZXIgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zdCBuYW1lID0gZXJyb3IubmFtZSB8fCAoZXJyb3IuY2F1c2UgYXMgRXJyb3IpPy5uYW1lO1xuICBjb25zdCBuYW1lU2VjdGlvbiA9IG5hbWUgPyBgJHtuYW1lfTogYCA6ICcnO1xuICBjb25zdCBwbHVnaW5TZWN0aW9uID0gZXJyb3IucGx1Z2luID8gYChwbHVnaW4gJHtlcnJvci5wbHVnaW59KSBgIDogJyc7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgJHtwbHVnaW5TZWN0aW9ufSR7bmFtZVNlY3Rpb259JHtlcnJvci5tZXNzYWdlfWA7XG5cbiAgY29uc3Qgb3V0cHV0TGluZXMgPSBbY2hhbGsuYm9sZChjaGFsay5yZWQoYFshXSAke2NoYWxrLmJvbGQobWVzc2FnZS50b1N0cmluZygpKX1gKSldO1xuXG4gIGlmIChlcnJvci51cmwpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmN5YW4oZXJyb3IudXJsKSk7XG4gIH1cblxuICBpZiAoZXJyb3IubG9jKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChgJHtlcnJvci5sb2MuZmlsZSB8fCBlcnJvci5pZH0gKCR7ZXJyb3IubG9jLmxpbmV9OiR7ZXJyb3IubG9jLmNvbHVtbn0pYCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IuaWQpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGVycm9yLmlkKTtcbiAgfVxuXG4gIGlmIChlcnJvci5mcmFtZSkge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuZGltKGVycm9yLmZyYW1lKSk7XG4gIH1cblxuICBpZiAoZXJyb3Iuc3RhY2spIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmRpbShlcnJvci5zdGFjaz8ucmVwbGFjZShgJHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9XFxuYCwgJycpKSk7XG4gIH1cblxuICBvdXRwdXRMaW5lcy5wdXNoKCcnLCAnJyk7XG4gIGNvbnNvbGUuZXJyb3Iob3V0cHV0TGluZXMuam9pbignXFxuJykpO1xuXG4gIGlmICghcmVjb3ZlcikgcHJvY2Vzcy5leGl0KDEpO1xufVxuIiwiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uL2Vudi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsXG4gIG1vZHVsZToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtb2R1bGUgdHlwZTogY2pzIG9yIGVzbScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcnVuOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3J1biA8ZmlsZT4nLFxuICBkZXNjcmliZTogJ1J1biBzY3JpcHQnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcHJvY2Vzcy5jd2QoKSk7XG5cbiAgICBjb25zdCBmaWxlID0gYXJndi5maWxlPy50b1N0cmluZygpIHx8ICcnO1xuXG4gICAgLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy91dGlsL2RldGVjdC1idW5cbiAgICBjb25zdCBpc1J1bm5pbmdPbkJ1biA9IHByb2Nlc3MudmVyc2lvbnMuYnVuO1xuICAgIGNvbnN0IHJ1bnRpbWUgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ25vZGUnO1xuICAgIGNvbnN0IGFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/IFsnLS1idW4nXSA6IFsnLS1uby13YXJuaW5ncycsICctLWltcG9ydCcsICd0c3gnXTtcbiAgICBpZiAoYXJndi53YXRjaCkge1xuICAgICAgYXJncy5wdXNoKCctLXdhdGNoJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaChmaWxlKTtcbiAgICBjb25zdCBbLCAuLi5hZGRpdGlvbmFsQXJndW1lbnRzXSA9IGFyZ3YuXztcbiAgICBjb25zdCBydW50aW1lQXJncyA9IFsuLi5hcmdzLCAuLi5hZGRpdGlvbmFsQXJndW1lbnRzLm1hcCgoYXJnKSA9PiBhcmcudG9TdHJpbmcoKSldO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyAnJHtydW50aW1lfSAke3J1bnRpbWVBcmdzLmpvaW4oJyAnKX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHJ1bnRpbWUsIHJ1bnRpbWVBcmdzLCB7XG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52IH0sXG4gICAgfSk7XG4gICAgcHJvY2Vzcy5leGl0KHJldC5zdGF0dXMgPz8gMSk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBhcHAsIGZ1bmN0aW9ucywgbGliIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZC9idWlsZC5qcyc7XG5pbXBvcnQgeyBydW4gfSBmcm9tICcuL2NvbW1hbmRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5yZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCdidWlsZC10cycpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAuY29tbWFuZChhcHApXG4gIC5jb21tYW5kKGZ1bmN0aW9ucylcbiAgLmNvbW1hbmQobGliKVxuICAuY29tbWFuZChydW4pXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC5oZWxwKCkuYXJndjtcbiJdLCJuYW1lcyI6WyJlbnZWYXJzIiwibG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIiwiYXJndiIsImN3ZCIsInJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIiwidmVyYm9zZSIsImNvbnNvbGUiLCJpbmZvIiwiT2JqZWN0Iiwia2V5cyIsImNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiIsImVudlZhcnNEZWYiLCJuYW1lcyIsIlNldCIsImlubGluZSIsImZsYXRNYXAiLCJlIiwidG9TdHJpbmciLCJzcGxpdCIsIm5hbWUiLCJ1bmRlZmluZWQiLCJwcm9jZXNzIiwiZW52IiwiSlNPTiIsInN0cmluZ2lmeSIsImFsbFRhcmdldENhdGVnb3JpZXMiLCJhc3luYyIsInJlYWRQYWNrYWdlSnNvbiIsImRpclBhdGgiLCJwYWNrYWdlSnNvblBhdGgiLCJwYXRoIiwiam9pbiIsInBhY2thZ2VKc29uVGV4dCIsImZzIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsInBhcnNlIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Iiwic2lsZW50IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiYWxpYXMiLCJidWlsZGVyIiwiaW5wdXQiLCJkZWZhdWx0IiwibWluaWZ5Iiwic291cmNlbWFwIiwiZXh0ZXJuYWwiLCJ3YXRjaCIsImtlZXBJbXBvcnQiLCJidW5kbGVCdWlsdGlucyIsImFwcEJ1aWxkZXIiLCJtb2R1bGVUeXBlIiwiZnVuY3Rpb25zQnVpbGRlciIsIm9ubHlQYWNrYWdlSnNvbiIsImxpYkJ1aWxkZXIiLCJqc0V4dGVuc2lvbiIsInNldHVwUGx1Z2lucyIsInRhcmdldERldGFpbCIsInBhY2thZ2VKc29uIiwibmFtZXNwYWNlIiwicGFja2FnZURpclBhdGgiLCJvdXRwdXRPcHRpb25zTGlzdCIsImV4dGVybmFsRGVwcyIsIm1hcCIsIml0ZW0iLCJkZXBlbmRlbmNpZXMiLCJwdXNoIiwicGVlckRlcGVuZGVuY2llcyIsIm9wdGlvbmFsRGVwZW5kZW5jaWVzIiwiZXhpc3RzU3luYyIsInBhY2thZ2VEaXJzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwicGFja2FnZURpciIsImlzRGlyZWN0b3J5Iiwib3RoZXJQYWNrYWdlSnNvbiIsInJlYWRGaWxlU3luYyIsImV4dGVuc2lvbnMiLCJiYWJlbENvbmZpZ1BhdGgiLCJ1cmwiLCJmaWxlVVJMVG9QYXRoIiwiZGlybmFtZSIsInBsdWdpbnMiLCJyZXBsYWNlIiwiZGVsaW1pdGVycyIsInByZXZlbnRBc3NpZ25tZW50IiwidmFsdWVzIiwianNvbiIsIm5vZGVFeHRlcm5hbHMiLCJkZXBzIiwiZGV2RGVwcyIsInBlZXJEZXBzIiwib3B0RGVwcyIsImluY2x1ZGUiLCJSZWdFeHAiLCJleGNsdWRlIiwicmVzb2x2ZSIsInByZWZlckJ1aWx0aW5zIiwiaWQiLCJpbmNsdWRlcyIsImNvbW1vbmpzIiwibW9kdWxlTmFtZXMiLCJpc0JhYmVsSGVscGVyc0J1bmRsZWQiLCJCVUlMRFRTX1VTRV9CQUJMRV9SVU5USU1FIiwiYmFiZWwiLCJjb25maWdGaWxlIiwiYmFiZWxIZWxwZXJzIiwic29tZSIsIm9wdHMiLCJwcmVzZXJ2ZU1vZHVsZXMiLCJwcmVzZXJ2ZURpcmVjdGl2ZXMiLCJzdHJpbmciLCJ0ZXJzZXIiLCJjb21wcmVzcyIsImRpcmVjdGl2ZXMiLCJhbmFseXplIiwic3VtbWFyeU9ubHkiLCJnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMiLCJjb3JlUHJvamVjdERpclBhdGgiLCJjb3JlQ29uZmlnRmlsZSIsInRzIiwiZmluZENvbmZpZ0ZpbGUiLCJzeXMiLCJmaWxlRXhpc3RzIiwiRXJyb3IiLCJwcm9qZWN0cyIsIm91dERpciIsImJhc2VuYW1lIiwicGFyZW50RGlyUGF0aCIsImRpcmVudHMiLCJyZWFkZGlyIiwiZGlyZW50IiwicHJvamVjdERpclBhdGgiLCJhbGxTdWNjZWVkZWQiLCJydW5UeXBlU2NyaXB0Q29tcGlsZXIiLCJjb25maWciLCJyZWFkQ29uZmlnRmlsZSIsImNvbXBpbGVyT3B0aW9ucyIsImRlY2xhcmF0aW9uIiwiZW1pdERlY2xhcmF0aW9uT25seSIsIm5vRW1pdCIsIm5vRW1pdE9uRXJyb3IiLCJlcnJvcnMiLCJmaWxlTmFtZXMiLCJvcHRpb25zIiwicGFyc2VKc29uQ29uZmlnRmlsZUNvbnRlbnQiLCJwcm9ncmFtIiwiY3JlYXRlUHJvZ3JhbSIsInJvb3ROYW1lcyIsImNvbmZpZ0ZpbGVQYXJzaW5nRGlhZ25vc3RpY3MiLCJkaWFnbm9zdGljcyIsImVtaXRTa2lwcGVkIiwiZW1pdCIsImFsbERpYWdub3N0aWNzIiwiZ2V0UHJlRW1pdERpYWdub3N0aWNzIiwibGVuZ3RoIiwiZm9ybWF0SG9zdCIsImdldENhbm9uaWNhbEZpbGVOYW1lIiwiZ2V0Q3VycmVudERpcmVjdG9yeSIsImdldE5ld0xpbmUiLCJuZXdMaW5lIiwibWVzc2FnZSIsImZvcm1hdERpYWdub3N0aWNzIiwid2FybiIsImFwcCIsImNvbW1hbmQiLCJkZXNjcmliZSIsImhhbmRsZXIiLCJidWlsZCIsImZ1bmN0aW9ucyIsInBhY2thZ2UiLCJlcnJvciIsImV4aXQiLCJnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zIiwibGliIiwidGFyZ2V0Q2F0ZWdvcnkiLCJOT0RFX0VOViIsImlucHV0cyIsInAiLCJzcmNEaXJQYXRoIiwiZXh0IiwidmVyaWZ5SW5wdXQiLCJlbmRzV2l0aCIsImRldGVjdFRhcmdldERldGFpbCIsInBhY2thZ2VOYW1lIiwibWF0Y2giLCJleGVjIiwiZ2V0TmFtZXNwYWNlQW5kTmFtZSIsImlzRXNtUGFja2FnZSIsIkJVSUxEX1RTX0NPUkVKUyIsIkJVSUxEX1RTX0NPUkVKU19XSVRIX1BST1BPU0FMUyIsIkJVSUxEX1RTX1ZFUkJPU0UiLCJCVUlMRF9UU19UQVJHRVRfQ0FURUdPUlkiLCJCVUlMRF9UU19UQVJHRVRfREVUQUlMIiwib3V0RGlyUGF0aCIsImRpciIsImZvcm1hdCIsImlzRXNtT3V0cHV0IiwianNFeHQiLCJlbnRyeUZpbGVOYW1lcyIsImdldE91dHB1dE9wdGlvbnNMaXN0IiwiY2hkaXIiLCJybSIsInJlY3Vyc2l2ZSIsImZvcmNlIiwiZnJvbUVudHJpZXMiLCJpbmRleCIsImV4dG5hbWUiLCJjbGVhclNjcmVlbiIsInBhdGhUb1JlbGF0aXZlUGF0aCIsInBhdGhzIiwiQXJyYXkiLCJpc0FycmF5IiwicmVsYXRpdmUiLCJ3YXRjaGVyIiwib3V0cHV0IiwiY2xvc2UiLCJyZW1vdmVMaXN0ZW5lciIsInN0ZGluIiwiY29kZSIsIm9uRXhpdCIsIm9uIiwiaXNUVFkiLCJyZXN1bWUiLCJldmVudCIsInJlY292ZXIiLCJjYXVzZSIsIm5hbWVTZWN0aW9uIiwicGx1Z2luIiwib3V0cHV0TGluZXMiLCJjaGFsayIsImJvbGQiLCJyZWQiLCJjeWFuIiwibG9jIiwiZmlsZSIsImxpbmUiLCJjb2x1bW4iLCJmcmFtZSIsImRpbSIsInN0YWNrIiwiaGFuZGxlRXJyb3IiLCJldmVudElucHV0IiwiaW5wdXRGaWxlcyIsImdyZWVuIiwibXMiLCJkdXJhdGlvbiIsImRhdGVUaW1lIiwicmVzdWx0Iiwid2F0Y2hSb2xsdXAiLCJidW5kbGUiLCJidWlsZEZhaWxlZCIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJfYnVuZGxlIiwicm9sbHVwIiwiUHJvbWlzZSIsImFsbCIsIndyaXRlIiwiZXNtUGFja2FnZSIsImVzbU91dHB1dCIsIm1haW4iLCJzY3JpcHRzIiwiZGV2RGVwZW5kZW5jaWVzIiwibWtkaXIiLCJ3cml0ZUZpbGUiLCJydW4iLCJtb2R1bGUiLCJpc1J1bm5pbmdPbkJ1biIsInZlcnNpb25zIiwiYnVuIiwicnVudGltZSIsImFyZ3MiLCJhZGRpdGlvbmFsQXJndW1lbnRzIiwiXyIsInJ1bnRpbWVBcmdzIiwiYXJnIiwicmV0IiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luYyIsInN0ZGlvIiwic3RhdHVzIiwicmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIiwieWFyZ3Mi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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "build-ts",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.2.0",
|
|
4
4
|
"repository": "github:WillBooster/build-ts",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"author": "WillBooster Inc.",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"@rollup/plugin-replace": "6.0.2",
|
|
46
46
|
"@rollup/plugin-terser": "0.4.4",
|
|
47
47
|
"@rollup/pluginutils": "5.1.4",
|
|
48
|
-
"@willbooster/shared-lib-node": "6.1.
|
|
48
|
+
"@willbooster/shared-lib-node": "6.1.16",
|
|
49
49
|
"babel-plugin-polyfill-corejs3": "0.12.0",
|
|
50
50
|
"babel-plugin-transform-remove-console": "6.9.4",
|
|
51
51
|
"chalk": "5.4.1",
|
|
@@ -70,22 +70,22 @@
|
|
|
70
70
|
"@types/babel__plugin-transform-runtime": "7.9.5",
|
|
71
71
|
"@types/babel__preset-env": "7.10.0",
|
|
72
72
|
"@types/eslint": "8.56.10",
|
|
73
|
-
"@types/node": "22.
|
|
73
|
+
"@types/node": "22.15.2",
|
|
74
74
|
"@types/signal-exit": "3.0.4",
|
|
75
75
|
"@types/yargs": "17.0.33",
|
|
76
76
|
"@willbooster/babel-configs": "2.1.0",
|
|
77
77
|
"@willbooster/eslint-config-ts": "11.2.0",
|
|
78
78
|
"@willbooster/prettier-config": "10.0.0",
|
|
79
|
-
"@willbooster/wb": "8.0.
|
|
79
|
+
"@willbooster/wb": "8.0.42",
|
|
80
80
|
"conventional-changelog-conventionalcommits": "8.0.0",
|
|
81
|
-
"eslint": "9.
|
|
81
|
+
"eslint": "9.25.1",
|
|
82
82
|
"eslint-config-flat-gitignore": "2.1.0",
|
|
83
83
|
"eslint-config-prettier": "10.1.2",
|
|
84
|
-
"eslint-import-resolver-typescript": "4.3.
|
|
85
|
-
"eslint-plugin-import-x": "4.
|
|
84
|
+
"eslint-import-resolver-typescript": "4.3.4",
|
|
85
|
+
"eslint-plugin-import-x": "4.11.0",
|
|
86
86
|
"eslint-plugin-sort-class-members": "1.21.0",
|
|
87
87
|
"eslint-plugin-sort-destructure-keys": "2.0.0",
|
|
88
|
-
"eslint-plugin-unicorn": "
|
|
88
|
+
"eslint-plugin-unicorn": "59.0.0",
|
|
89
89
|
"eslint-plugin-unused-imports": "4.1.4",
|
|
90
90
|
"globals": "16.0.0",
|
|
91
91
|
"husky": "9.1.7",
|
|
@@ -96,8 +96,8 @@
|
|
|
96
96
|
"semantic-release": "24.2.3",
|
|
97
97
|
"sort-package-json": "3.0.0",
|
|
98
98
|
"type-fest": "4.40.0",
|
|
99
|
-
"typescript-eslint": "8.
|
|
100
|
-
"vitest": "3.1.
|
|
99
|
+
"typescript-eslint": "8.31.0",
|
|
100
|
+
"vitest": "3.1.2"
|
|
101
101
|
},
|
|
102
102
|
"packageManager": "yarn@4.9.1",
|
|
103
103
|
"engines": {
|