build-ts 17.0.0 → 17.0.1
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 +2 -5
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"node:fs";import o from"node:path";import{readAndApplyEnvironmentVariables as n,yargsOptionsBuilderForEnv as s,removeNpmAndYarnEnvironmentVariables as i}from"@willbooster/shared-lib-node";import t from"yargs";import{hideBin as r}from"yargs/helpers";import a from"chalk";import c 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 g from"@rollup/plugin-json";import b 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(e,o){return O||(O=n(e,o),e.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(",")),...e.autoInline?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(n){const s=o.join(n,"package.json");try{const o=await e.promises.readFile(s,"utf8");return[JSON.parse(o),s]}catch{}return[void 0,s]}const B={...s,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"},"auto-inline":{description:"Inline environment variables defined at env files.",type:"boolean",default:!1},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"}},L={...R,moduleType:{description:"esm, cjs, or either (default).",type:"string",alias:"m"}},C={...L,onlyPackageJson:{description:"Whether to generate only package.json.",type:"boolean"}},I={...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 A(n,s,i,t,r,a){const c=[...n.external??[]].map(e=>e.toString());if(i.dependencies?.["@prisma/client"]&&c.push("prisma-client"),c.push(...Object.keys(i.dependencies??{}),...Object.keys(i.peerDependencies??{}),...Object.keys(i.optionalDependencies??{})),e.existsSync(o.join("..","..","package.json"))){const n=e.readdirSync(o.join(".."),{withFileTypes:!0});for(const s of n){if(!s.isDirectory())continue;const n=o.join("..",s.name,"package.json");if(!e.existsSync(n))continue;const t=JSON.parse(e.readFileSync(n,"utf8"));i.dependencies?.[t.name??""]&&c.push(...Object.keys(t.dependencies??{}),...Object.keys(t.peerDependencies??{}),...Object.keys(t.optionalDependencies??{}))}}const p=[".cjs",".mjs",".js",".jsx",".json",".cts",".mts",".ts",".tsx"],l=o.join(m.fileURLToPath(o.dirname(o.dirname(import.meta.url))),"babel.config.mjs"),d=[h({delimiters:["",""],preventAssignment:!0,values:F(n,r)}),g(),x({deps:!0,devDeps:!1,peerDeps:!0,optDeps:!0,include:c.map(e=>new RegExp(`^${e}(?:\\/.+)?`)),exclude:t&&new RegExp(`^@?${t}(?:\\/.+)?`)}),b({extensions:p,preferBuiltins:e=>!n.bundleBuiltins?.includes(e)}),y(),w({moduleNames:n.keepImport?.map(e=>e.toString())??[]})],u="app-node"===s||"functions"===s||!c.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\/.+$/}),...a.some(e=>e.preserveModules)?[k()]:[],S({include:["**/*.csv","**/*.txt"]})),n.minify&&d.push(j({compress:{directives:!1}})),d.push(v({summaryOnly:!0})),d}async function P(n,s){const i=E.findConfigFile(s,E.sys.fileExists);if(!i)throw new Error(`Failed to find tsconfig.json in ${s}.`);n.verbose&&console.info("Found tsconfig.json:",i);const t=[];let r=o.join("dist",o.basename(s),"src");if(e.existsSync(r)){const n=o.dirname(s),i=await e.promises.readdir(n,{withFileTypes:!0});s=o.resolve(s);for(const r of i){if(!r.isDirectory())continue;const i=o.resolve(n,r.name);if(i===s)continue;const a=E.findConfigFile(i,E.sys.fileExists),c=o.join("dist",r.name,"src");a&&e.existsSync(c)&&t.push([i,a,c])}}else r="dist";t.push([s,i,r]);let a=!0;for(const[e,i,r]of t)a&&=U(n,e,i,o.join(s,r));return a}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:a}=E.parseJsonConfigFileContent(i,E.sys,o),c=E.createProgram({options:a,rootNames:r,configFileParsingDiagnostics:t}),{diagnostics:p,emitSkipped:l}=c.emit(),d=[...E.getPreEmitDiagnostics(c),...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 J={command:"app [package]",describe:"Build an app",builder:L,handler:async e=>G(e,"app")},W={command:"functions [package]",describe:"Build a GCP/Firebase functions app",builder:C,async handler(e){if(!e.onlyPackageJson)return G(e,"functions");{const n=o.resolve(e.package?.toString()??"."),[s,i]=await N(n);s||(console.error(`Failed to parse package.json (${i}).`),process.exit(1)),await H(n,s,e.moduleType)}}},M={command:"lib [package]",describe:"Build a Node.js / React library",builder:I,handler:async e=>G(e,"lib")};async function G(n,s){process.env.NODE_ENV||="production";const i=!n.silent&&n.verbose,t=process.cwd(),r=o.resolve(n.package?.toString()??"."),[m,f]=await N(r);m||(console.error(`Failed to parse package.json (${f}).`),process.exit(1)),T(n,r);const y=function(n,s,i){if(n.input&&n.input.length>0)return n.input.map(e=>o.join(s,e.toString()));const t=o.join(i,"src");for(const n of["ts","tsx","cts","mts"]){const s=o.join(t,`index.${n}`);if(e.existsSync(s))return[s]}console.error("Failed to detect input file."),process.exit(1)}(n,t,r),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)}}(s,y);i&&(console.info("argv:",n),console.info("packageJsonPath:",f),console.info("Target (Category):",`${g} (${s})`));const[b]=function(e){const o=e.name?.toString()??"",n=/@([^/]+)\/(.+)/.exec(o),[,s,i]=n??[];return[s,i]}(m),h="module"===m.type;n["core-js"]?process.env.BUILD_TS_COREJS="1":n["core-js-proposals"]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS="1"),i&&(process.env.BUILD_TS_VERBOSE="1"),process.env.BUILD_TS_TARGET_CATEGORY=s,process.env.BUILD_TS_TARGET_DETAIL=g;const j=function(e,n,s,i){const t=o.join(s,"dist");if("app-node"===n||"functions"===n)return[{dir:t,format:V(i,e.moduleType)?"module":"commonjs",sourcemap:e.sourcemap&&"inline"}];const r=[],a=e.moduleType||"both",c=e.jsExtension||"either";("cjs"===a||"both"===a||"either"===a&&!i)&&r.push({dir:t,entryFileNames:"both"===c||"either"===c&&!i?"[name].js":"[name].cjs",format:"commonjs",preserveModules:!0,sourcemap:e.sourcemap});("esm"===a||"both"===a||"either"===a&&i)&&r.push({dir:t,entryFileNames:"both"===c||"either"===c&&i?"[name].js":"[name].mjs",format:"module",preserveModules:!0,sourcemap:e.sourcemap});return r}(n,g,r,h);i&&console.info("OutputOptions:",j),0===j.length&&(console.error("Failed to detect output files."),process.exit(1)),process.chdir(r),await e.promises.rm(o.join(r,"dist"),{recursive:!0,force:!0}),"functions"===g&&await H(r,m,n.moduleType);const v={input:"functions"===g?Object.fromEntries(y.map((e,n)=>[0===n?"index":o.basename(e,o.extname(e)),e])):y,plugins:A(n,g,m,b,r,j),watch:n.watch?{clearScreen:!1}:void 0},w=e=>(Array.isArray(e)?e:[e]).map(e=>o.relative(r,e));if(n.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=[a.bold(a.red(`[!] ${a.bold(i.toString())}`))];e.url&&t.push(a.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(a.dim(e.frame)),e.stack&&t.push(a.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(a.cyan(`Bundles ${a.bold(t(i).join(", "))} → ${a.bold(t(s.output).join(", "))}\non ${n} ...`));break}case"BUNDLE_END":if(e.silent)break;console.info(a.green(`Created ${a.bold(t(s.output).join(", "))} in ${a.bold(p(s.duration))}`)),"app-node"!==o&&"functions"!==o&&await P(e,n);break;case"END":if(e.silent)break;console.info(`\n[${c()}] waiting for changes...`)}"result"in s&&s.result&&s.result.close()})}(n,g,r,v,j,w);else{let e;n.silent||console.info(a.cyan(`Bundles ${a.bold(w(y).join(", "))} → ${a.bold(w(j.map(e=>e.file||e.dir||"")).join(", "))}\non ${r} ...`));let o=!1;try{const o=Date.now(),s=await l(v);e=s,await Promise.all(j.map(e=>s.write(e))),n.silent||console.info(a.green(`Created ${w(j.map(e=>e.file||e.dir||"")).join(", ")} in ${a.bold(p(Date.now()-o))}`))}catch(e){o=!0,console.error("Failed to build due to:",e)}await(e?.close()),o&&process.exit(1),"app-node"===g||"functions"===g||await P(n,r)||process.exit(1)}}async function H(n,s,i){s.name+="-dist";const t="module"===s.type,r=V(t,i);s.main=t===r?"index.js":r?"index.mjs":"index.cjs",delete s.scripts,delete s.devDependencies,await e.promises.mkdir(o.join(n,"dist"),{recursive:!0}),await e.promises.writeFile(o.join(n,"dist","package.json"),JSON.stringify(s))}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 a=D.spawnSync(s,r,{stdio:"inherit",env:{...process.env}});process.exit(a.status??1)}};i(process.env),await t(r(process.argv)).scriptName("build-ts").options(B).command(J).command(W).command(M).command(Y).demandCommand().strict().version(function(){let n=o.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(o.join(n,"package.json"));)n=o.dirname(n);return JSON.parse(e.readFileSync(o.join(n,"package.json"),"utf8")).version}()).help().argv;
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbnYudHMiLCIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvYnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9wbHVnaW4udHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvdHlwZVNjcmlwdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9yb2xsdXBMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxubGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghZW52VmFycykge1xuICAgIGVudlZhcnMgPSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnTG9hZGVkIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZGVmaW5pdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGJ1aWxkLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnNEZWY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgZW52VmFyTmFtZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oYXJndi5pbmxpbmUgPz8gW10pLmZsYXRNYXAoKGUpID0+IGUudG9TdHJpbmcoKS5zcGxpdCgnLCcpKSxcbiAgICAuLi4oYXJndi5hdXRvSW5saW5lID8gT2JqZWN0LmtleXMobG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIGN3ZCkpIDogW10pLFxuICBdKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGVudlZhck5hbWVzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52W25hbWVdID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgZW52VmFyc0RlZltgcHJvY2Vzcy5lbnYuJHtuYW1lfWBdID0gSlNPTi5zdHJpbmdpZnkocHJvY2Vzcy5lbnZbbmFtZV0pO1xuICB9XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0lubGluZSBlbnYgdmFyczonLCBPYmplY3Qua2V5cyhlbnZWYXJzRGVmKSk7XG4gIH1cbiAgcmV0dXJuIGVudlZhcnNEZWY7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcywgT3B0aW9ucyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IGFsbFRhcmdldENhdGVnb3JpZXMgPSBbJ2FwcCcsICdmdW5jdGlvbnMnLCAnbGliJ10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRhcmdldENhdGVnb3J5ID0gKHR5cGVvZiBhbGxUYXJnZXRDYXRlZ29yaWVzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgYWxsVGFyZ2V0RGV0YWlscyA9IFsnYXBwLW5vZGUnLCAnZnVuY3Rpb25zJywgJ2xpYicsICdsaWItcmVhY3QnXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGFyZ2V0RGV0YWlsID0gKHR5cGVvZiBhbGxUYXJnZXREZXRhaWxzKVtudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBBcmd1bWVudHNUeXBlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBPcHRpb25zPj4gPSBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczxUPj47XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHVybCBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8W1BhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBzdHJpbmddPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgIHJldHVybiBbSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIFt1bmRlZmluZWQsIHBhY2thZ2VKc29uUGF0aF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWlsZFRzUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHVybC5maWxlVVJMVG9QYXRoKHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUoaW1wb3J0Lm1ldGEudXJsKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlQW5kTmFtZShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBbc3RyaW5nIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCB1bmRlZmluZWRdIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBwYWNrYWdlSnNvbi5uYW1lPy50b1N0cmluZygpID8/ICcnO1xuICBjb25zdCBtYXRjaCA9IC9AKFteL10rKVxcLyguKykvLmV4ZWMocGFja2FnZU5hbWUpO1xuICBjb25zdCBbLCBuYW1lc3BhY2UsIG5hbWVdID0gbWF0Y2ggPz8gW107XG4gIHJldHVybiBbbmFtZXNwYWNlLCBuYW1lXTtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAncycsXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmV4cG9ydCBjb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgaW5wdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRocyBvZiBzb3VyY2UgY29kZSBmaWxlcyB0byBiZSBidWlsdC4gVGhlIGZpcnN0IGZpbGUgaXMgbWFpbi4gSWYgbm8gb3B0aW9uIGlzIGdpdmVuLCBcInNyYy9pbmRleC57dHMsdHN4fVwiIGZyb20gcGFja2FnZSBkaXJlY3RvcnkgaXMgdGFyZ2V0ZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnaScsXG4gIH0sXG4gICdjb3JlLWpzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyBpcyBlbXBsb3llZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgJ2NvcmUtanMtcHJvcG9zYWxzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyB3aXRoIHByb3Bvc2FscyBzdXBwb3J0IGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBtaW5pZnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IG1pbmlmaWNhdGlvbiBpcyBlbmFibGVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIHNvdXJjZW1hcDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3Qgc291cmNlbWFwIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgZXh0ZXJuYWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgaW5saW5lOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgaW5saW5lZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdhdXRvLWlubGluZSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lubGluZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBhdCBlbnYgZmlsZXMuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICBrZWVwSW1wb3J0OiB7XG4gICAgZGVzY3JpcHRpb246ICdJZGVudGlmaWVycyB0byBiZSBrZXB0IGFzIGltcG9ydCBzdGF0ZW1lbnRzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgYnVuZGxlQnVpbHRpbnM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ01vZHVsZSBuYW1lcyBzYW1lIHdpdGggYnVpbHRpbnMgKGUuZy4sIHVuZGljaSkgdG8gYmUgYnVuZGxlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYXBwQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIG9yIGVpdGhlciAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLmFwcEJ1aWxkZXIsXG4gIG9ubHlQYWNrYWdlSnNvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBnZW5lcmF0ZSBvbmx5IHBhY2thZ2UuanNvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBsaWJCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgZWl0aGVyLCBvciBib3RoIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG4gIC8vIC5qcyBmaWxlcyBpbiBhIHBhY2thZ2Ugd2l0aCBgXCJ0eXBlXCI6IFwibW9kdWxlXCJgIGFyZSB0cmVhdGVkIGFzIGVzbS5cbiAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byB0cmVhdCB0aGVtIGFzIGNqcyBpbiB0aGUgY2FzZSB3aGVyZSBhIGNqcyBwcm9qZWN0IGltcG9ydHMgYW4gZXNtIHBhY2thZ2UuXG4gIC8vIFRvIGRlYWwgd2l0aCB0aGUgY2FzZSwgd2UgdXNlIC5janMgYW5kIC5tanMgZXh0ZW5zaW9ucyBpbnN0ZWFkIG9mIC5qcyBleHRlbnNpb24uXG4gIGpzRXh0ZW5zaW9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHVzZSAuanMgaW4gY2pzIGFuZC9vciBlc206IGVpdGhlciAoZGVmYXVsdCksIGJvdGgsIG9yIG5vbmUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2onLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQW55QnVpbGRlclR5cGUgPSB0eXBlb2YgYXBwQnVpbGRlciB8IHR5cGVvZiBmdW5jdGlvbnNCdWlsZGVyIHwgdHlwZW9mIGxpYkJ1aWxkZXI7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBiYWJlbCB9IGZyb20gJ0Byb2xsdXAvcGx1Z2luLWJhYmVsJztcbmltcG9ydCBjb21tb25qcyBmcm9tICdAcm9sbHVwL3BsdWdpbi1jb21tb25qcyc7XG5pbXBvcnQganNvbiBmcm9tICdAcm9sbHVwL3BsdWdpbi1qc29uJztcbmltcG9ydCByZXNvbHZlIGZyb20gJ0Byb2xsdXAvcGx1Z2luLW5vZGUtcmVzb2x2ZSc7XG5pbXBvcnQgcmVwbGFjZSBmcm9tICdAcm9sbHVwL3BsdWdpbi1yZXBsYWNlJztcbmltcG9ydCB0ZXJzZXIgZnJvbSAnQHJvbGx1cC9wbHVnaW4tdGVyc2VyJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUGx1Z2luIH0gZnJvbSAncm9sbHVwJztcbmltcG9ydCBhbmFseXplIGZyb20gJ3JvbGx1cC1wbHVnaW4tYW5hbHl6ZXInO1xuaW1wb3J0IHsga2VlcEltcG9ydCB9IGZyb20gJ3JvbGx1cC1wbHVnaW4ta2VlcC1pbXBvcnQnO1xuaW1wb3J0IHsgbm9kZUV4dGVybmFscyB9IGZyb20gJ3JvbGx1cC1wbHVnaW4tbm9kZS1leHRlcm5hbHMnO1xuaW1wb3J0IHByZXNlcnZlRGlyZWN0aXZlcyBmcm9tICdyb2xsdXAtcGx1Z2luLXByZXNlcnZlLWRpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAncm9sbHVwLXBsdWdpbi1zdHJpbmcnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEJ1aWxkVHNSb290UGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwUGx1Z2lucyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sXG4gIHRhcmdldERldGFpbDogVGFyZ2V0RGV0YWlsLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdXG4pOiBQbHVnaW5bXSB7XG4gIGNvbnN0IGV4dGVybmFsRGVwcyA9IFsuLi4oYXJndi5leHRlcm5hbCA/PyBbXSldLm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKTtcbiAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydAcHJpc21hL2NsaWVudCddKSB7XG4gICAgZXh0ZXJuYWxEZXBzLnB1c2goJ3ByaXNtYS1jbGllbnQnKTtcbiAgfVxuICAvLyBTaW5jZSBgZGVwczogdHJ1ZWAgZG9lcyBub3Qgd29yayBmb3IgYGltcG9ydCBjaHVuayBmcm9tICdsb2Rhc2guY2h1bmsvaW5kZXguanMnO2BcbiAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgKTtcbiAgLy8gQWRkIGV4dGVybmFsIGRlcGVuZGVuY2llcyBmcm9tIHNpYmxpbmcgcGFja2FnZXNcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKCcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBjb25zdCBwYWNrYWdlRGlycyA9IGZzLnJlYWRkaXJTeW5jKHBhdGguam9pbignLi4nKSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcGFja2FnZURpciBvZiBwYWNrYWdlRGlycykge1xuICAgICAgaWYgKCFwYWNrYWdlRGlyLmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oJy4uJywgcGFja2FnZURpci5uYW1lLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG90aGVyUGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgICAgIGlmIChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltvdGhlclBhY2thZ2VKc29uLm5hbWUgPz8gJyddKSB7XG4gICAgICAgIGV4dGVybmFsRGVwcy5wdXNoKFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhvdGhlclBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5qc29uJywgJy5jdHMnLCAnLm10cycsICcudHMnLCAnLnRzeCddO1xuICBjb25zdCBiYWJlbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZ2V0QnVpbGRUc1Jvb3RQYXRoKCksICdiYWJlbC5jb25maWcubWpzJyk7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gW1xuICAgIHJlcGxhY2Uoe1xuICAgICAgLy8gSWdub3JlIHdvcmQgYm91bmRhcmllcyBhbmQgcmVwbGFjZSBldmVyeSBpbnN0YW5jZSBvZiB0aGUgc3RyaW5nLlxuICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcGx1Z2lucy90cmVlL21hc3Rlci9wYWNrYWdlcy9yZXBsYWNlI3dvcmQtYm91bmRhcmllc1xuICAgICAgZGVsaW1pdGVyczogWycnLCAnJ10sXG4gICAgICBwcmV2ZW50QXNzaWdubWVudDogdHJ1ZSxcbiAgICAgIHZhbHVlczogY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICB9KSxcbiAgICBqc29uKCksXG4gICAgbm9kZUV4dGVybmFscyh7XG4gICAgICBkZXBzOiB0cnVlLFxuICAgICAgZGV2RGVwczogZmFsc2UsXG4gICAgICBwZWVyRGVwczogdHJ1ZSxcbiAgICAgIG9wdERlcHM6IHRydWUsXG4gICAgICBpbmNsdWRlOiBleHRlcm5hbERlcHMubWFwKChuYW1lKSA9PiBuZXcgUmVnRXhwKGBeJHtuYW1lfSg/OlxcXFwvLispP2ApKSxcbiAgICAgIGV4Y2x1ZGU6IG5hbWVzcGFjZSAmJiBuZXcgUmVnRXhwKGBeQD8ke25hbWVzcGFjZX0oPzpcXFxcLy4rKT9gKSxcbiAgICB9KSxcbiAgICByZXNvbHZlKHtcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICBwcmVmZXJCdWlsdGluczogKGlkOiBzdHJpbmcpID0+ICFhcmd2LmJ1bmRsZUJ1aWx0aW5zPy5pbmNsdWRlcyhpZCksXG4gICAgfSksXG4gICAgY29tbW9uanMoKSxcbiAgICBrZWVwSW1wb3J0KHsgbW9kdWxlTmFtZXM6IGFyZ3Yua2VlcEltcG9ydD8ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpID8/IFtdIH0pLFxuICBdO1xuICBjb25zdCBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPVxuICAgIHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnIHx8ICFleHRlcm5hbERlcHMuaW5jbHVkZXMoJ0BiYWJlbC9ydW50aW1lJyk7XG4gIHByb2Nlc3MuZW52LkJVSUxEVFNfVVNFX0JBQkxFX1JVTlRJTUUgPSBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPyAnJyA6ICcxJztcbiAgcGx1Z2lucy5wdXNoKFxuICAgIGJhYmVsKHtcbiAgICAgIGNvbmZpZ0ZpbGU6IGJhYmVsQ29uZmlnUGF0aCxcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICAvLyBXZSBuZWVkIGBydW50aW1lIHNpbmNlIGBidW5kbGVkYCBtYXkgYnJlYWsgZGlyZWN0b3J5IHN0cnVjdHVyZSBieSBjcmVhdGluZyBfdmlydHVhbCBkaXJlY3RvcnkuXG4gICAgICBiYWJlbEhlbHBlcnM6IGlzQmFiZWxIZWxwZXJzQnVuZGxlZCA/ICdidW5kbGVkJyA6ICdydW50aW1lJyxcbiAgICAgIGV4Y2x1ZGU6IC9eKC4rXFwvKT9ub2RlX21vZHVsZXNcXC8uKyQvLFxuICAgIH0pLFxuICAgIC4uLihvdXRwdXRPcHRpb25zTGlzdC5zb21lKChvcHRzKSA9PiBvcHRzLnByZXNlcnZlTW9kdWxlcykgPyBbcHJlc2VydmVEaXJlY3RpdmVzKCldIDogW10pLFxuICAgIHN0cmluZyh7IGluY2x1ZGU6IFsnKiovKi5jc3YnLCAnKiovKi50eHQnXSB9KVxuICApO1xuICBpZiAoYXJndi5taW5pZnkpIHtcbiAgICBwbHVnaW5zLnB1c2godGVyc2VyKHsgY29tcHJlc3M6IHsgZGlyZWN0aXZlczogZmFsc2UgfSB9KSk7XG4gIH1cbiAgcGx1Z2lucy5wdXNoKGFuYWx5emUoeyBzdW1tYXJ5T25seTogdHJ1ZSB9KSk7XG4gIHJldHVybiBwbHVnaW5zO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbi8vIFdlIGNhbm5vdCB1c2UgbmFtZWQgaW1wb3J0cyBmcm9tICd0eXBlc2NyaXB0JyBiZWNhdXNlIG9mIGJ1aWxkIGVycm9ycy5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFueUJ1aWxkZXJUeXBlIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIGNvcmVQcm9qZWN0RGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgY29yZUNvbmZpZ0ZpbGUgPSB0cy5maW5kQ29uZmlnRmlsZShjb3JlUHJvamVjdERpclBhdGgsIHRzLnN5cy5maWxlRXhpc3RzKTtcbiAgaWYgKCFjb3JlQ29uZmlnRmlsZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCB0c2NvbmZpZy5qc29uIGluICR7Y29yZVByb2plY3REaXJQYXRofS5gKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnRm91bmQgdHNjb25maWcuanNvbjonLCBjb3JlQ29uZmlnRmlsZSk7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0czogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgbGV0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIHBhdGguYmFzZW5hbWUoY29yZVByb2plY3REaXJQYXRoKSwgJ3NyYycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjb3JlUHJvamVjdERpclBhdGgpO1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHBhcmVudERpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb3JlUHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBpZiAoIWRpcmVudC5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUocGFyZW50RGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgaWYgKHByb2plY3REaXJQYXRoID09PSBjb3JlUHJvamVjdERpclBhdGgpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBjb25maWdGaWxlID0gdHMuZmluZENvbmZpZ0ZpbGUocHJvamVjdERpclBhdGgsIHRzLnN5cy5maWxlRXhpc3RzKTtcbiAgICAgIGNvbnN0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIGRpcmVudC5uYW1lLCAnc3JjJyk7XG4gICAgICBpZiAoY29uZmlnRmlsZSAmJiBmcy5leGlzdHNTeW5jKG91dERpcikpIHtcbiAgICAgICAgcHJvamVjdHMucHVzaChbcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXREaXIgPSAnZGlzdCc7XG4gIH1cbiAgcHJvamVjdHMucHVzaChbY29yZVByb2plY3REaXJQYXRoLCBjb3JlQ29uZmlnRmlsZSwgb3V0RGlyXSk7XG5cbiAgbGV0IGFsbFN1Y2NlZWRlZCA9IHRydWU7XG4gIGZvciAoY29uc3QgW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXJdIG9mIHByb2plY3RzKSB7XG4gICAgYWxsU3VjY2VlZGVkICYmPSBydW5UeXBlU2NyaXB0Q29tcGlsZXIoYXJndiwgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIHBhdGguam9pbihjb3JlUHJvamVjdERpclBhdGgsIG91dERpcikpO1xuICB9XG4gIHJldHVybiBhbGxTdWNjZWVkZWQ7XG59XG5cbmZ1bmN0aW9uIHJ1blR5cGVTY3JpcHRDb21waWxlcihcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZ0ZpbGU6IHN0cmluZyxcbiAgb3V0RGlyOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdydW5UeXBlU2NyaXB0Q29tcGlsZXIoKScsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIpO1xuICB9XG5cbiAgY29uc3QgeyBjb25maWcgfSA9IHRzLnJlYWRDb25maWdGaWxlKGNvbmZpZ0ZpbGUsIHRzLnN5cy5yZWFkRmlsZSk7XG4gIGNvbmZpZy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgLi4uY29uZmlnLmNvbXBpbGVyT3B0aW9ucyxcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBlbWl0RGVjbGFyYXRpb25Pbmx5OiB0cnVlLFxuICAgIG5vRW1pdDogZmFsc2UsXG4gICAgbm9FbWl0T25FcnJvcjogdHJ1ZSxcbiAgICBvdXREaXIsXG4gIH07XG4gIGNvbmZpZy5pbmNsdWRlID0gWydzcmMvKiovKiddO1xuICBjb25zdCB7IGVycm9ycywgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSB0cy5wYXJzZUpzb25Db25maWdGaWxlQ29udGVudChjb25maWcsIHRzLnN5cywgcHJvamVjdERpclBhdGgpO1xuXG4gIGNvbnN0IHByb2dyYW0gPSB0cy5jcmVhdGVQcm9ncmFtKHsgb3B0aW9ucywgcm9vdE5hbWVzOiBmaWxlTmFtZXMsIGNvbmZpZ0ZpbGVQYXJzaW5nRGlhZ25vc3RpY3M6IGVycm9ycyB9KTtcbiAgY29uc3QgeyBkaWFnbm9zdGljcywgZW1pdFNraXBwZWQgfSA9IHByb2dyYW0uZW1pdCgpO1xuXG4gIGNvbnN0IGFsbERpYWdub3N0aWNzID0gWy4uLnRzLmdldFByZUVtaXREaWFnbm9zdGljcyhwcm9ncmFtKSwgLi4uZGlhZ25vc3RpY3MsIC4uLmVycm9yc107XG4gIGlmIChhbGxEaWFnbm9zdGljcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZm9ybWF0SG9zdDogdHMuRm9ybWF0RGlhZ25vc3RpY3NIb3N0ID0ge1xuICAgICAgZ2V0Q2Fub25pY2FsRmlsZU5hbWU6IChwYXRoKSA9PiBwYXRoLFxuICAgICAgZ2V0Q3VycmVudERpcmVjdG9yeTogdHMuc3lzLmdldEN1cnJlbnREaXJlY3RvcnksXG4gICAgICBnZXROZXdMaW5lOiAoKSA9PiB0cy5zeXMubmV3TGluZSxcbiAgICB9O1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0cy5mb3JtYXREaWFnbm9zdGljcyhhbGxEaWFnbm9zdGljcywgZm9ybWF0SG9zdCk7XG4gICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICB9XG4gIHJldHVybiAhZW1pdFNraXBwZWQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGRhdGVUaW1lIGZyb20gJ2RhdGUtdGltZSc7XG5pbXBvcnQgbXMgZnJvbSAncHJldHR5LW1zJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUm9sbHVwQnVpbGQsIFJvbGx1cE9wdGlvbnMgfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IHsgcm9sbHVwLCB3YXRjaCB9IGZyb20gJ3JvbGx1cCc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXIgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgeyBvbkV4aXQgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vLi4vZW52LmpzJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSwgVGFyZ2V0Q2F0ZWdvcnksIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGFsbFRhcmdldENhdGVnb3JpZXMgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXROYW1lc3BhY2VBbmROYW1lLCByZWFkUGFja2FnZUpzb24gfSBmcm9tICcuLi8uLi91dGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQW55QnVpbGRlclR5cGUsIGJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYXBwQnVpbGRlciwgZnVuY3Rpb25zQnVpbGRlciwgbGliQnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBzZXR1cFBsdWdpbnMgfSBmcm9tICcuL3BsdWdpbi5qcyc7XG5pbXBvcnQgeyBoYW5kbGVFcnJvciB9IGZyb20gJy4vcm9sbHVwTG9nZ2VyLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyB9IGZyb20gJy4vdHlwZVNjcmlwdC5qcyc7XG5cbmV4cG9ydCBjb25zdCBhcHA6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgYXBwQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYXBwIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYW4gYXBwJyxcbiAgYnVpbGRlcjogYXBwQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdhcHAnKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbnM6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgZnVuY3Rpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZnVuY3Rpb25zIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYSBHQ1AvRmlyZWJhc2UgZnVuY3Rpb25zIGFwcCcsXG4gIGJ1aWxkZXI6IGZ1bmN0aW9uc0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2Lm9ubHlQYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gICAgICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICAgICAgaWYgKCFwYWNrYWdlSnNvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKHBhY2thZ2VEaXJQYXRoLCBwYWNrYWdlSnNvbiwgYXJndi5tb2R1bGVUeXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdmdW5jdGlvbnMnKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgbGliOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGxpYkJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpYiBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgTm9kZS5qcyAvIFJlYWN0IGxpYnJhcnknLFxuICBidWlsZGVyOiBsaWJCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICByZXR1cm4gYnVpbGQoYXJndiwgJ2xpYicpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LCB0YXJnZXRDYXRlZ29yeTogVGFyZ2V0Q2F0ZWdvcnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHw9ICdwcm9kdWN0aW9uJztcblxuICAvLyBgc2lsZW50YCBpcyBzdHJvbmdlciB0aGFuIGB2ZXJib3NlYC5cbiAgY29uc3QgdmVyYm9zZSA9ICFhcmd2LnNpbGVudCAmJiBhcmd2LnZlcmJvc2U7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gIGNvbnN0IFtwYWNrYWdlSnNvbiwgcGFja2FnZUpzb25QYXRoXSA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aCk7XG4gIGlmICghcGFja2FnZUpzb24pIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwYWNrYWdlRGlyUGF0aCk7XG5cbiAgY29uc3QgaW5wdXRzID0gdmVyaWZ5SW5wdXQoYXJndiwgY3dkLCBwYWNrYWdlRGlyUGF0aCk7XG4gIGNvbnN0IHRhcmdldERldGFpbCA9IGRldGVjdFRhcmdldERldGFpbCh0YXJnZXRDYXRlZ29yeSwgaW5wdXRzKTtcblxuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnYXJndjonLCBhcmd2KTtcbiAgICBjb25zb2xlLmluZm8oJ3BhY2thZ2VKc29uUGF0aDonLCBwYWNrYWdlSnNvblBhdGgpO1xuICAgIGNvbnNvbGUuaW5mbygnVGFyZ2V0IChDYXRlZ29yeSk6JywgYCR7dGFyZ2V0RGV0YWlsfSAoJHt0YXJnZXRDYXRlZ29yeX0pYCk7XG4gIH1cblxuICBjb25zdCBbbmFtZXNwYWNlXSA9IGdldE5hbWVzcGFjZUFuZE5hbWUocGFja2FnZUpzb24pO1xuICBjb25zdCBpc0VzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcblxuICBpZiAoYXJndlsnY29yZS1qcyddKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfQ09SRUpTID0gJzEnO1xuICB9IGVsc2UgaWYgKGFyZ3ZbJ2NvcmUtanMtcHJvcG9zYWxzJ10pIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19DT1JFSlNfV0lUSF9QUk9QT1NBTFMgPSAnMSc7XG4gIH1cblxuICBpZiAodmVyYm9zZSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX1ZFUkJPU0UgPSAnMSc7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVEFSR0VUX0NBVEVHT1JZID0gdGFyZ2V0Q2F0ZWdvcnk7XG4gIHByb2Nlc3MuZW52LkJVSUxEX1RTX1RBUkdFVF9ERVRBSUwgPSB0YXJnZXREZXRhaWw7XG5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3QgPSBnZXRPdXRwdXRPcHRpb25zTGlzdChhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VEaXJQYXRoLCBpc0VzbVBhY2thZ2UpO1xuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnT3V0cHV0T3B0aW9uczonLCBvdXRwdXRPcHRpb25zTGlzdCk7XG4gIH1cbiAgaWYgKG91dHB1dE9wdGlvbnNMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3Qgb3V0cHV0IGZpbGVzLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuY2hkaXIocGFja2FnZURpclBhdGgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JyksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgaWYgKHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycpIHtcbiAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKHBhY2thZ2VEaXJQYXRoLCBwYWNrYWdlSnNvbiwgYXJndi5tb2R1bGVUeXBlKTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnM6IFJvbGx1cE9wdGlvbnMgPSB7XG4gICAgaW5wdXQ6XG4gICAgICB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnXG4gICAgICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgaW5wdXRzLm1hcCgoaW5wdXQsIGluZGV4KSA9PiBbaW5kZXggPT09IDAgPyAnaW5kZXgnIDogcGF0aC5iYXNlbmFtZShpbnB1dCwgcGF0aC5leHRuYW1lKGlucHV0KSksIGlucHV0XSlcbiAgICAgICAgICApXG4gICAgICAgIDogaW5wdXRzLFxuICAgIHBsdWdpbnM6IHNldHVwUGx1Z2lucyhhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VKc29uLCBuYW1lc3BhY2UsIHBhY2thZ2VEaXJQYXRoLCBvdXRwdXRPcHRpb25zTGlzdCksXG4gICAgd2F0Y2g6IGFyZ3Yud2F0Y2ggPyB7IGNsZWFyU2NyZWVuOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICB9O1xuXG4gIGNvbnN0IHBhdGhUb1JlbGF0aXZlUGF0aCA9IChwYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KTogc3RyaW5nW10gPT5cbiAgICAoQXJyYXkuaXNBcnJheShwYXRocykgPyBwYXRocyA6IFtwYXRoc10pLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShwYWNrYWdlRGlyUGF0aCwgcCkpO1xuICBpZiAoYXJndi53YXRjaCkge1xuICAgIHdhdGNoUm9sbHVwKGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZURpclBhdGgsIG9wdGlvbnMsIG91dHB1dE9wdGlvbnNMaXN0LCBwYXRoVG9SZWxhdGl2ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgQnVuZGxlcyAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0cykuam9pbignLCAnKSl9IOKGkiAke2NoYWxrLmJvbGQoXG4gICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZVBhdGgob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBvcHRzLmZpbGUgfHwgb3B0cy5kaXIgfHwgJycpKS5qb2luKCcsICcpXG4gICAgICAgICAgKX1cXG5vbiAke3BhY2thZ2VEaXJQYXRofSAuLi5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGJ1bmRsZTogUm9sbHVwQnVpbGQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGJ1aWxkRmFpbGVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBfYnVuZGxlID0gYXdhaXQgcm9sbHVwKG9wdGlvbnMpO1xuICAgICAgYnVuZGxlID0gX2J1bmRsZTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gX2J1bmRsZS53cml0ZShvcHRzKSkpO1xuXG4gICAgICBpZiAoIWFyZ3Yuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgIGBDcmVhdGVkICR7cGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbihcbiAgICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICAgKX0gaW4gJHtjaGFsay5ib2xkKG1zKERhdGUubm93KCkgLSBzdGFydFRpbWUpKX1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBidWlsZEZhaWxlZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYnVpbGQgZHVlIHRvOicsIGVycm9yKTtcbiAgICB9XG4gICAgYXdhaXQgYnVuZGxlPy5jbG9zZSgpO1xuICAgIGlmIChidWlsZEZhaWxlZCkgcHJvY2Vzcy5leGl0KDEpO1xuXG4gICAgaWYgKFxuICAgICAgdGFyZ2V0RGV0YWlsICE9PSAnYXBwLW5vZGUnICYmXG4gICAgICB0YXJnZXREZXRhaWwgIT09ICdmdW5jdGlvbnMnICYmXG4gICAgICAhKGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCkpXG4gICAgKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhdGNoUm9sbHVwKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgdGFyZ2V0RGV0YWlsOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJvbGx1cE9wdGlvbnMsXG4gIG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW10sXG4gIHBhdGhUb1JlbGF0aXZlUGF0aDogKHBhdGhzOiBzdHJpbmcgfCBSZWFkb25seTxzdHJpbmdbXT4pID0+IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgY29uc3Qgd2F0Y2hlciA9IHdhdGNoKHsgLi4ub3B0aW9ucywgb3V0cHV0OiBvdXRwdXRPcHRpb25zTGlzdCB9KTtcblxuICBjb25zdCBjbG9zZSA9IGFzeW5jIChjb2RlOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcigndW5jYXVnaHRFeGNlcHRpb24nLCBjbG9zZSk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xvc2UpO1xuICAgIGlmICh3YXRjaGVyKSBhd2FpdCB3YXRjaGVyLmNsb3NlKCk7XG4gICAgaWYgKGNvZGUpIHByb2Nlc3MuZXhpdChjb2RlKTtcbiAgfTtcbiAgb25FeGl0KGNsb3NlIGFzIHVua25vd24gYXMgSGFuZGxlcik7XG4gIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2UpO1xuICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlbmQnLCBjbG9zZSk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcbiAgfVxuXG4gIHdhdGNoZXIub24oJ2V2ZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgc3dpdGNoIChldmVudC5jb2RlKSB7XG4gICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXZlbnQuZXJyb3IsIHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0JVTkRMRV9TVEFSVCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zdCBldmVudElucHV0ID0gZXZlbnQuaW5wdXQ7XG4gICAgICAgIGNvbnN0IGlucHV0RmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnRJbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpbnB1dEZpbGVzLnB1c2goZXZlbnRJbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5wdXRGaWxlcy5wdXNoKFxuICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZXZlbnRJbnB1dCkgPyBldmVudElucHV0IDogT2JqZWN0LnZhbHVlcyhldmVudElucHV0IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgICBgQnVuZGxlcyAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0RmlsZXMpLmpvaW4oJywgJykpfSDihpIgJHtjaGFsay5ib2xkKFxuICAgICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZVBhdGgoZXZlbnQub3V0cHV0KS5qb2luKCcsICcpXG4gICAgICAgICAgICApfVxcbm9uICR7cGFja2FnZURpclBhdGh9IC4uLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQlVORExFX0VORCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQ3JlYXRlZCAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGV2ZW50Lm91dHB1dCkuam9pbignLCAnKSl9IGluICR7Y2hhbGsuYm9sZChtcyhldmVudC5kdXJhdGlvbikpfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJiB0YXJnZXREZXRhaWwgIT09ICdmdW5jdGlvbnMnKSB7XG4gICAgICAgICAgYXdhaXQgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VORCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zb2xlLmluZm8oYFxcblske2RhdGVUaW1lKCl9XSB3YWl0aW5nIGZvciBjaGFuZ2VzLi4uYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgncmVzdWx0JyBpbiBldmVudCAmJiBldmVudC5yZXN1bHQpIHtcbiAgICAgIHZvaWQgZXZlbnQucmVzdWx0LmNsb3NlKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5SW5wdXQoYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sIGN3ZDogc3RyaW5nLCBwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5pbnB1dCAmJiBhcmd2LmlucHV0Lmxlbmd0aCA+IDApIHJldHVybiBhcmd2LmlucHV0Lm1hcCgocCkgPT4gcGF0aC5qb2luKGN3ZCwgcC50b1N0cmluZygpKSk7XG5cbiAgY29uc3Qgc3JjRGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpO1xuICBmb3IgKGNvbnN0IGV4dCBvZiBbJ3RzJywgJ3RzeCcsICdjdHMnLCAnbXRzJ10pIHtcbiAgICBjb25zdCBpbnB1dCA9IHBhdGguam9pbihzcmNEaXJQYXRoLCBgaW5kZXguJHtleHR9YCk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoaW5wdXQpKSByZXR1cm4gW2lucHV0XTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3QgaW5wdXQgZmlsZS4nKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnk6IHN0cmluZywgaW5wdXRzOiBzdHJpbmdbXSk6IFRhcmdldERldGFpbCB7XG4gIHN3aXRjaCAodGFyZ2V0Q2F0ZWdvcnkpIHtcbiAgICBjYXNlICdhcHAnOiB7XG4gICAgICByZXR1cm4gJ2FwcC1ub2RlJztcbiAgICB9XG4gICAgY2FzZSAnZnVuY3Rpb25zJzoge1xuICAgICAgcmV0dXJuICdmdW5jdGlvbnMnO1xuICAgIH1cbiAgICBjYXNlICdsaWInOiB7XG4gICAgICBpZiAoaW5wdXRzLnNvbWUoKGlucHV0KSA9PiBpbnB1dC5lbmRzV2l0aCgnLnRzeCcpKSkge1xuICAgICAgICByZXR1cm4gJ2xpYi1yZWFjdCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ2xpYic7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RhcmdldCBvcHRpb24gbXVzdCBiZSBvbmUgb2Y6ICcgKyBhbGxUYXJnZXRDYXRlZ29yaWVzLmpvaW4oJywgJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG1vZHVsZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHBhY2thZ2VKc29uLm5hbWUgKz0gJy1kaXN0JztcbiAgY29uc3QgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICBjb25zdCBlc21PdXRwdXQgPSBpc0VzbU91dHB1dChlc21QYWNrYWdlLCBtb2R1bGVUeXBlKTtcbiAgcGFja2FnZUpzb24ubWFpbiA9IGVzbVBhY2thZ2UgPT09IGVzbU91dHB1dCA/ICdpbmRleC5qcycgOiBlc21PdXRwdXQgPyAnaW5kZXgubWpzJyA6ICdpbmRleC5janMnO1xuXG4gIC8vIFByZXZlbnQgRmlyZWJhc2UgRnVuY3Rpb25zIGZyb20gcnVubmluZyBgYnVpbGRgIHNjcmlwdCBzaW5jZSB3ZSBhcmUgYnVpbGRpbmcgY29kZSBiZWZvcmUgZGVwbG95aW5nLlxuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cztcbiAgLy8gZGV2RGVwZW5kZW5jaWVzIGFyZSBub3QgcmVxdWlyZWQgc2luY2Ugd2UgYXJlIGJ1aWxkaW5nIGNvZGUgYmVmb3JlIGRlcGxveWluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcblxuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuXG4pOiBPdXRwdXRPcHRpb25zW10ge1xuICBjb25zdCBvdXREaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpO1xuICBpZiAodGFyZ2V0RGV0YWlsID09PSAnYXBwLW5vZGUnIHx8IHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICAgIGZvcm1hdDogaXNFc21PdXRwdXQoaXNFc21QYWNrYWdlLCBhcmd2Lm1vZHVsZVR5cGUpID8gJ21vZHVsZScgOiAnY29tbW9uanMnLFxuICAgICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwICYmICdpbmxpbmUnLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgLy8gVGhlIGZvbGxvd2luZyBpbXBvcnQgc3RhdGVtZW50IGluIGFuIGVzbSBtb2R1bGUgY2F1c2VzIHRoZSBmb2xsb3dpbmcgZXJyb3I6XG4gIC8vIFN0YXRlbWVudDpcbiAgLy8gICBpbXBvcnQgeyB1c2VQcmV2aW91cyB9IGZyb20gJ3JlYWN0LXVzZSc7XG4gIC8vIEVycm9yOlxuICAvLyAgIE5hbWVkIGV4cG9ydCAndXNlUHJldmlvdXMnIG5vdCBmb3VuZC4gVGhlIHJlcXVlc3RlZCBtb2R1bGUgJ3JlYWN0LXVzZScgaXMgYSBDb21tb25KUyBtb2R1bGUsXG4gIC8vICAgd2hpY2ggbWF5IG5vdCBzdXBwb3J0IGFsbCBtb2R1bGUuZXhwb3J0cyBhcyBuYW1lZCBleHBvcnRzLlxuICAvLyBXZSBuZWVkIGNqcyBtb2R1bGVzIGZvciB3ZWIgYXBwcyB0byBhdm9pZCB0aGUgZXJyb3IuXG4gIC8vIEFsc28sIHNwbGl0dGluZyBhIGxpYnJhcnkgaXMgdXNlZnVsIGluIGJvdGggbW9kdWxlcywgc28gcHJlc2VydmVNb2R1bGVzIHNob3VsZCBiZSB0cnVlLlxuICBjb25zdCBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdID0gW107XG4gIGNvbnN0IG1vZHVsZVR5cGUgPSBhcmd2Lm1vZHVsZVR5cGUgfHwgJ2JvdGgnO1xuICBjb25zdCBqc0V4dCA9IGFyZ3YuanNFeHRlbnNpb24gfHwgJ2VpdGhlcic7XG4gIGlmIChtb2R1bGVUeXBlID09PSAnY2pzJyB8fCBtb2R1bGVUeXBlID09PSAnYm90aCcgfHwgKG1vZHVsZVR5cGUgPT09ICdlaXRoZXInICYmICFpc0VzbVBhY2thZ2UpKSB7XG4gICAgb3V0cHV0T3B0aW9uc0xpc3QucHVzaCh7XG4gICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICBlbnRyeUZpbGVOYW1lczoganNFeHQgPT09ICdib3RoJyB8fCAoanNFeHQgPT09ICdlaXRoZXInICYmICFpc0VzbVBhY2thZ2UpID8gJ1tuYW1lXS5qcycgOiAnW25hbWVdLmNqcycsXG4gICAgICBmb3JtYXQ6ICdjb21tb25qcycsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwLFxuICAgIH0pO1xuICB9XG4gIGlmIChtb2R1bGVUeXBlID09PSAnZXNtJyB8fCBtb2R1bGVUeXBlID09PSAnYm90aCcgfHwgKG1vZHVsZVR5cGUgPT09ICdlaXRoZXInICYmIGlzRXNtUGFja2FnZSkpIHtcbiAgICBvdXRwdXRPcHRpb25zTGlzdC5wdXNoKHtcbiAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgIGVudHJ5RmlsZU5hbWVzOiBqc0V4dCA9PT0gJ2JvdGgnIHx8IChqc0V4dCA9PT0gJ2VpdGhlcicgJiYgaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5tanMnLFxuICAgICAgZm9ybWF0OiAnbW9kdWxlJyxcbiAgICAgIHByZXNlcnZlTW9kdWxlczogdHJ1ZSxcbiAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dE9wdGlvbnNMaXN0O1xufVxuXG5mdW5jdGlvbiBpc0VzbU91dHB1dChpc0VzbVBhY2thZ2U6IGJvb2xlYW4sIG1vZHVsZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbW9kdWxlVHlwZSA9PT0gJ2VzbScgfHwgKCghbW9kdWxlVHlwZSB8fCBtb2R1bGVUeXBlID09PSAnZWl0aGVyJykgJiYgaXNFc21QYWNrYWdlKTtcbn1cbiIsImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFJvbGx1cEVycm9yIH0gZnJvbSAncm9sbHVwJztcblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yOiBSb2xsdXBFcnJvciwgcmVjb3ZlciA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnN0IG5hbWUgPSBlcnJvci5uYW1lIHx8IChlcnJvci5jYXVzZSBhcyBFcnJvcik/Lm5hbWU7XG4gIGNvbnN0IG5hbWVTZWN0aW9uID0gbmFtZSA/IGAke25hbWV9OiBgIDogJyc7XG4gIGNvbnN0IHBsdWdpblNlY3Rpb24gPSBlcnJvci5wbHVnaW4gPyBgKHBsdWdpbiAke2Vycm9yLnBsdWdpbn0pIGAgOiAnJztcbiAgY29uc3QgbWVzc2FnZSA9IGAke3BsdWdpblNlY3Rpb259JHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9YDtcblxuICBjb25zdCBvdXRwdXRMaW5lcyA9IFtjaGFsay5ib2xkKGNoYWxrLnJlZChgWyFdICR7Y2hhbGsuYm9sZChtZXNzYWdlLnRvU3RyaW5nKCkpfWApKV07XG5cbiAgaWYgKGVycm9yLnVybCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuY3lhbihlcnJvci51cmwpKTtcbiAgfVxuXG4gIGlmIChlcnJvci5sb2MpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGAke2Vycm9yLmxvYy5maWxlIHx8IGVycm9yLmlkfSAoJHtlcnJvci5sb2MubGluZX06JHtlcnJvci5sb2MuY29sdW1ufSlgKTtcbiAgfSBlbHNlIGlmIChlcnJvci5pZCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goZXJyb3IuaWQpO1xuICB9XG5cbiAgaWYgKGVycm9yLmZyYW1lKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChjaGFsay5kaW0oZXJyb3IuZnJhbWUpKTtcbiAgfVxuXG4gIGlmIChlcnJvci5zdGFjaykge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuZGltKGVycm9yLnN0YWNrPy5yZXBsYWNlKGAke25hbWVTZWN0aW9ufSR7ZXJyb3IubWVzc2FnZX1cXG5gLCAnJykpKTtcbiAgfVxuXG4gIG91dHB1dExpbmVzLnB1c2goJycsICcnKTtcbiAgY29uc29sZS5lcnJvcihvdXRwdXRMaW5lcy5qb2luKCdcXG4nKSk7XG5cbiAgaWYgKCFyZWNvdmVyKSBwcm9jZXNzLmV4aXQoMSk7XG59XG4iLCJpbXBvcnQgKiBhcyBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vZW52LmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgbW9kdWxlOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1vZHVsZSB0eXBlOiBjanMgb3IgZXNtJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBydW46IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncnVuIDxmaWxlPicsXG4gIGRlc2NyaWJlOiAnUnVuIHNjcmlwdCcsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwcm9jZXNzLmN3ZCgpKTtcblxuICAgIGNvbnN0IGZpbGUgPSBhcmd2LmZpbGU/LnRvU3RyaW5nKCkgPz8gJyc7XG5cbiAgICAvLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICAgIGNvbnN0IGlzUnVubmluZ09uQnVuID0gcHJvY2Vzcy52ZXJzaW9ucy5idW47XG4gICAgY29uc3QgcnVudGltZSA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAnbm9kZSc7XG4gICAgY29uc3QgYXJncyA9IGlzUnVubmluZ09uQnVuID8gWyctLWJ1biddIDogWyctLW5vLXdhcm5pbmdzJywgJy0taW1wb3J0JywgJ3RzeCddO1xuICAgIGlmIChhcmd2LndhdGNoKSB7XG4gICAgICBhcmdzLnB1c2goJy0td2F0Y2gnKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKGZpbGUpO1xuICAgIGNvbnN0IFssIC4uLmFkZGl0aW9uYWxBcmd1bWVudHNdID0gYXJndi5fO1xuICAgIGNvbnN0IHJ1bnRpbWVBcmdzID0gWy4uLmFyZ3MsIC4uLmFkZGl0aW9uYWxBcmd1bWVudHMubWFwKChhcmcpID0+IGFyZy50b1N0cmluZygpKV07XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nICcke3J1bnRpbWV9ICR7cnVudGltZUFyZ3Muam9pbignICcpfSdgKTtcbiAgICB9XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocnVudGltZSwgcnVudGltZUFyZ3MsIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYgfSxcbiAgICB9KTtcbiAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGFwcCwgZnVuY3Rpb25zLCBsaWIgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkL2J1aWxkLmpzJztcbmltcG9ydCB7IHJ1biB9IGZyb20gJy4vY29tbWFuZHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbnJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ2J1aWxkLXRzJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5jb21tYW5kKGFwcClcbiAgLmNvbW1hbmQoZnVuY3Rpb25zKVxuICAuY29tbWFuZChsaWIpXG4gIC5jb21tYW5kKHJ1bilcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG4iXSwibmFtZXMiOlsiZW52VmFycyIsImxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSIsImFyZ3YiLCJjd2QiLCJyZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyIsInZlcmJvc2UiLCJjb25zb2xlIiwiaW5mbyIsIk9iamVjdCIsImtleXMiLCJjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24iLCJlbnZWYXJzRGVmIiwiZW52VmFyTmFtZXMiLCJTZXQiLCJpbmxpbmUiLCJmbGF0TWFwIiwiZSIsInRvU3RyaW5nIiwic3BsaXQiLCJhdXRvSW5saW5lIiwibmFtZSIsInVuZGVmaW5lZCIsInByb2Nlc3MiLCJlbnYiLCJKU09OIiwic3RyaW5naWZ5IiwiYWxsVGFyZ2V0Q2F0ZWdvcmllcyIsImFzeW5jIiwicmVhZFBhY2thZ2VKc29uIiwiZGlyUGF0aCIsInBhY2thZ2VKc29uUGF0aCIsInBhdGgiLCJqb2luIiwicGFja2FnZUpzb25UZXh0IiwiZnMiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwicGFyc2UiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsInlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYiLCJzaWxlbnQiLCJkZXNjcmlwdGlvbiIsInR5cGUiLCJhbGlhcyIsImJ1aWxkZXIiLCJpbnB1dCIsImRlZmF1bHQiLCJtaW5pZnkiLCJzb3VyY2VtYXAiLCJleHRlcm5hbCIsIndhdGNoIiwia2VlcEltcG9ydCIsImJ1bmRsZUJ1aWx0aW5zIiwiYXBwQnVpbGRlciIsIm1vZHVsZVR5cGUiLCJmdW5jdGlvbnNCdWlsZGVyIiwib25seVBhY2thZ2VKc29uIiwibGliQnVpbGRlciIsImpzRXh0ZW5zaW9uIiwic2V0dXBQbHVnaW5zIiwidGFyZ2V0RGV0YWlsIiwicGFja2FnZUpzb24iLCJuYW1lc3BhY2UiLCJwYWNrYWdlRGlyUGF0aCIsIm91dHB1dE9wdGlvbnNMaXN0IiwiZXh0ZXJuYWxEZXBzIiwibWFwIiwiaXRlbSIsImRlcGVuZGVuY2llcyIsInB1c2giLCJwZWVyRGVwZW5kZW5jaWVzIiwib3B0aW9uYWxEZXBlbmRlbmNpZXMiLCJleGlzdHNTeW5jIiwicGFja2FnZURpcnMiLCJyZWFkZGlyU3luYyIsIndpdGhGaWxlVHlwZXMiLCJwYWNrYWdlRGlyIiwiaXNEaXJlY3RvcnkiLCJvdGhlclBhY2thZ2VKc29uIiwicmVhZEZpbGVTeW5jIiwiZXh0ZW5zaW9ucyIsImJhYmVsQ29uZmlnUGF0aCIsInVybCIsImZpbGVVUkxUb1BhdGgiLCJkaXJuYW1lIiwicGx1Z2lucyIsInJlcGxhY2UiLCJkZWxpbWl0ZXJzIiwicHJldmVudEFzc2lnbm1lbnQiLCJ2YWx1ZXMiLCJqc29uIiwibm9kZUV4dGVybmFscyIsImRlcHMiLCJkZXZEZXBzIiwicGVlckRlcHMiLCJvcHREZXBzIiwiaW5jbHVkZSIsIlJlZ0V4cCIsImV4Y2x1ZGUiLCJyZXNvbHZlIiwicHJlZmVyQnVpbHRpbnMiLCJpZCIsImluY2x1ZGVzIiwiY29tbW9uanMiLCJtb2R1bGVOYW1lcyIsImlzQmFiZWxIZWxwZXJzQnVuZGxlZCIsIkJVSUxEVFNfVVNFX0JBQkxFX1JVTlRJTUUiLCJiYWJlbCIsImNvbmZpZ0ZpbGUiLCJiYWJlbEhlbHBlcnMiLCJzb21lIiwib3B0cyIsInByZXNlcnZlTW9kdWxlcyIsInByZXNlcnZlRGlyZWN0aXZlcyIsInN0cmluZyIsInRlcnNlciIsImNvbXByZXNzIiwiZGlyZWN0aXZlcyIsImFuYWx5emUiLCJzdW1tYXJ5T25seSIsImdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyIsImNvcmVQcm9qZWN0RGlyUGF0aCIsImNvcmVDb25maWdGaWxlIiwidHMiLCJmaW5kQ29uZmlnRmlsZSIsInN5cyIsImZpbGVFeGlzdHMiLCJFcnJvciIsInByb2plY3RzIiwib3V0RGlyIiwiYmFzZW5hbWUiLCJwYXJlbnREaXJQYXRoIiwiZGlyZW50cyIsInJlYWRkaXIiLCJkaXJlbnQiLCJwcm9qZWN0RGlyUGF0aCIsImFsbFN1Y2NlZWRlZCIsInJ1blR5cGVTY3JpcHRDb21waWxlciIsImNvbmZpZyIsInJlYWRDb25maWdGaWxlIiwiY29tcGlsZXJPcHRpb25zIiwiZGVjbGFyYXRpb24iLCJlbWl0RGVjbGFyYXRpb25Pbmx5Iiwibm9FbWl0Iiwibm9FbWl0T25FcnJvciIsImVycm9ycyIsImZpbGVOYW1lcyIsIm9wdGlvbnMiLCJwYXJzZUpzb25Db25maWdGaWxlQ29udGVudCIsInByb2dyYW0iLCJjcmVhdGVQcm9ncmFtIiwicm9vdE5hbWVzIiwiY29uZmlnRmlsZVBhcnNpbmdEaWFnbm9zdGljcyIsImRpYWdub3N0aWNzIiwiZW1pdFNraXBwZWQiLCJlbWl0IiwiYWxsRGlhZ25vc3RpY3MiLCJnZXRQcmVFbWl0RGlhZ25vc3RpY3MiLCJsZW5ndGgiLCJmb3JtYXRIb3N0IiwiZ2V0Q2Fub25pY2FsRmlsZU5hbWUiLCJnZXRDdXJyZW50RGlyZWN0b3J5IiwiZ2V0TmV3TGluZSIsIm5ld0xpbmUiLCJtZXNzYWdlIiwiZm9ybWF0RGlhZ25vc3RpY3MiLCJ3YXJuIiwiYXBwIiwiY29tbWFuZCIsImRlc2NyaWJlIiwiaGFuZGxlciIsImJ1aWxkIiwiZnVuY3Rpb25zIiwicGFja2FnZSIsImVycm9yIiwiZXhpdCIsImdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMiLCJsaWIiLCJ0YXJnZXRDYXRlZ29yeSIsIk5PREVfRU5WIiwiaW5wdXRzIiwicCIsInNyY0RpclBhdGgiLCJleHQiLCJ2ZXJpZnlJbnB1dCIsImVuZHNXaXRoIiwiZGV0ZWN0VGFyZ2V0RGV0YWlsIiwicGFja2FnZU5hbWUiLCJtYXRjaCIsImV4ZWMiLCJnZXROYW1lc3BhY2VBbmROYW1lIiwiaXNFc21QYWNrYWdlIiwiQlVJTERfVFNfQ09SRUpTIiwiQlVJTERfVFNfQ09SRUpTX1dJVEhfUFJPUE9TQUxTIiwiQlVJTERfVFNfVkVSQk9TRSIsIkJVSUxEX1RTX1RBUkdFVF9DQVRFR09SWSIsIkJVSUxEX1RTX1RBUkdFVF9ERVRBSUwiLCJvdXREaXJQYXRoIiwiZGlyIiwiZm9ybWF0IiwiaXNFc21PdXRwdXQiLCJqc0V4dCIsImVudHJ5RmlsZU5hbWVzIiwiZ2V0T3V0cHV0T3B0aW9uc0xpc3QiLCJjaGRpciIsInJtIiwicmVjdXJzaXZlIiwiZm9yY2UiLCJmcm9tRW50cmllcyIsImluZGV4IiwiZXh0bmFtZSIsImNsZWFyU2NyZWVuIiwicGF0aFRvUmVsYXRpdmVQYXRoIiwicGF0aHMiLCJBcnJheSIsImlzQXJyYXkiLCJyZWxhdGl2ZSIsIndhdGNoZXIiLCJvdXRwdXQiLCJjbG9zZSIsInJlbW92ZUxpc3RlbmVyIiwic3RkaW4iLCJjb2RlIiwib25FeGl0Iiwib24iLCJpc1RUWSIsInJlc3VtZSIsImV2ZW50IiwicmVjb3ZlciIsImNhdXNlIiwibmFtZVNlY3Rpb24iLCJwbHVnaW4iLCJvdXRwdXRMaW5lcyIsImNoYWxrIiwiYm9sZCIsInJlZCIsImN5YW4iLCJsb2MiLCJmaWxlIiwibGluZSIsImNvbHVtbiIsImZyYW1lIiwiZGltIiwic3RhY2siLCJoYW5kbGVFcnJvciIsImV2ZW50SW5wdXQiLCJpbnB1dEZpbGVzIiwiZ3JlZW4iLCJtcyIsImR1cmF0aW9uIiwiZGF0ZVRpbWUiLCJyZXN1bHQiLCJ3YXRjaFJvbGx1cCIsImJ1bmRsZSIsImJ1aWxkRmFpbGVkIiwic3RhcnRUaW1lIiwiRGF0ZSIsIm5vdyIsIl9idW5kbGUiLCJyb2xsdXAiLCJQcm9taXNlIiwiYWxsIiwid3JpdGUiLCJlc21QYWNrYWdlIiwiZXNtT3V0cHV0IiwibWFpbiIsInNjcmlwdHMiLCJkZXZEZXBlbmRlbmNpZXMiLCJta2RpciIsIndyaXRlRmlsZSIsInJ1biIsIm1vZHVsZSIsImlzUnVubmluZ09uQnVuIiwidmVyc2lvbnMiLCJidW4iLCJydW50aW1lIiwiYXJncyIsImFkZGl0aW9uYWxBcmd1bWVudHMiLCJfIiwicnVudGltZUFyZ3MiLCJhcmciLCJyZXQiLCJjaGlsZF9wcm9jZXNzIiwic3Bhd25TeW5jIiwic3RkaW8iLCJzdGF0dXMiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJ5YXJncyIsImhpZGVCaW4iLCJzY3JpcHROYW1lIiwiZGVtYW5kQ29tbWFuZCIsInN0cmljdCIsInZlcnNpb24iLCJwYWNrYWdlSnNvbkRpciIsIlVSTCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiXSwibWFwcGluZ3MiOiJzL0JBTUEsSUFBSUEsRUFLRyxTQUFTQyxFQUNkQyxFQUNBQyxHQVFBLE9BTktILElBQ0hBLEVBQVVJLEVBQWlDRixFQUFNQyxHQUM3Q0QsRUFBS0csU0FDUEMsUUFBUUMsS0FBSyxtQkFBb0JDLE9BQU9DLEtBQUtU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
|
|
1
|
+
import e from"node:fs";import o from"node:path";import{readAndApplyEnvironmentVariables as n,yargsOptionsBuilderForEnv as s,removeNpmAndYarnEnvironmentVariables as i}from"@willbooster/shared-lib-node";import t from"yargs";import{hideBin as r}from"yargs/helpers";import a from"chalk";import c 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 g from"@rollup/plugin-json";import b 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(e,o){return O||(O=n(e,o),e.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(",")),...e.autoInline?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(n){const s=o.join(n,"package.json");try{const o=await e.promises.readFile(s,"utf8");return[JSON.parse(o),s]}catch{}return[void 0,s]}const B={...s,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"},"auto-inline":{description:"Inline environment variables defined at env files.",type:"boolean",default:!1},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"}},L={...R,moduleType:{description:"esm, cjs, or either (default).",type:"string",alias:"m"}},C={...L,onlyPackageJson:{description:"Whether to generate only package.json.",type:"boolean"}},I={...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 A(n,s,i,t,r,a){const c=[...n.external??[]].map(e=>e.toString());if(i.dependencies?.["@prisma/client"]&&c.push("prisma-client"),c.push(...Object.keys(i.dependencies??{}),...Object.keys(i.peerDependencies??{}),...Object.keys(i.optionalDependencies??{})),e.existsSync(o.join("..","..","package.json"))){const n=e.readdirSync(o.join(".."),{withFileTypes:!0});for(const s of n){if(!s.isDirectory())continue;const n=o.join("..",s.name,"package.json");if(!e.existsSync(n))continue;const t=JSON.parse(e.readFileSync(n,"utf8"));i.dependencies?.[t.name??""]&&c.push(...Object.keys(t.dependencies??{}),...Object.keys(t.peerDependencies??{}),...Object.keys(t.optionalDependencies??{}))}}const p=[".cjs",".mjs",".js",".jsx",".json",".cts",".mts",".ts",".tsx"],l=o.join(m.fileURLToPath(o.dirname(o.dirname(import.meta.url))),"babel.config.mjs"),d=[h({delimiters:["",""],preventAssignment:!0,values:F(n,r)}),g(),x({deps:!0,devDeps:!1,peerDeps:!0,optDeps:!0,include:c.map(e=>new RegExp(`^${e}(?:\\/.+)?`)),exclude:t&&new RegExp(`^@?${t}(?:\\/.+)?`)}),b({extensions:p,preferBuiltins:e=>!n.bundleBuiltins?.includes(e)}),y(),w({moduleNames:n.keepImport?.map(e=>e.toString())??[]})],u="app-node"===s||"functions"===s||!c.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\/.+$/}),...a.some(e=>e.preserveModules)?[k()]:[],S({include:["**/*.csv","**/*.txt"]})),n.minify&&d.push(j({compress:{directives:!1}})),d.push(v({summaryOnly:!0})),d}async function P(n,s){const i=E.findConfigFile(s,E.sys.fileExists);if(!i)throw new Error(`Failed to find tsconfig.json in ${s}.`);n.verbose&&console.info("Found tsconfig.json:",i);const t=[];let r=o.join("dist",o.basename(s),"src");if(e.existsSync(r)){const n=o.dirname(s),i=await e.promises.readdir(n,{withFileTypes:!0});s=o.resolve(s);for(const r of i){if(!r.isDirectory())continue;const i=o.resolve(n,r.name);if(i===s)continue;const a=E.findConfigFile(i,E.sys.fileExists),c=o.join("dist",r.name,"src");a&&e.existsSync(c)&&t.push([i,a,c])}}else r="dist";t.push([s,i,r]);let a=!0;for(const[e,i,r]of t)a&&=U(n,e,i,o.join(s,r));return a}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:a}=E.parseJsonConfigFileContent(i,E.sys,o),c=E.createProgram({options:a,rootNames:r,configFileParsingDiagnostics:t}),{diagnostics:p,emitSkipped:l}=c.emit(),d=[...E.getPreEmitDiagnostics(c),...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 J={command:"app [package]",describe:"Build an app",builder:L,handler:async e=>G(e,"app")},W={command:"functions [package]",describe:"Build a GCP/Firebase functions app",builder:C,async handler(e){if(!e.onlyPackageJson)return G(e,"functions");{const n=o.resolve(e.package?.toString()??"."),[s,i]=await N(n);s||(console.error(`Failed to parse package.json (${i}).`),process.exit(1)),await H(n,s,e.moduleType)}}},M={command:"lib [package]",describe:"Build a Node.js / React library",builder:I,handler:async e=>G(e,"lib")};async function G(n,s){process.env.NODE_ENV||="production";const i=!n.silent&&n.verbose,t=process.cwd(),r=o.resolve(n.package?.toString()??"."),[m,f]=await N(r);m||(console.error(`Failed to parse package.json (${f}).`),process.exit(1)),T(n,r);const y=function(n,s,i){if(n.input&&n.input.length>0)return n.input.map(e=>o.resolve(s,e.toString()));const t=o.join(i,"src");for(const n of["ts","tsx","cts","mts"]){const s=o.join(t,`index.${n}`);if(e.existsSync(s))return[s]}console.error("Failed to detect input file."),process.exit(1)}(n,t,r),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)}}(s,y);i&&(console.info("argv:",n),console.info("packageJsonPath:",f),console.info("Target (Category):",`${g} (${s})`));const[b]=function(e){const o=e.name?.toString()??"",n=/@([^/]+)\/(.+)/.exec(o),[,s,i]=n??[];return[s,i]}(m),h="module"===m.type;n["core-js"]?process.env.BUILD_TS_COREJS="1":n["core-js-proposals"]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS="1"),i&&(process.env.BUILD_TS_VERBOSE="1"),process.env.BUILD_TS_TARGET_CATEGORY=s,process.env.BUILD_TS_TARGET_DETAIL=g;const j=function(e,n,s,i){const t=o.join(s,"dist");if("app-node"===n||"functions"===n)return[{dir:t,format:V(i,e.moduleType)?"module":"commonjs",sourcemap:e.sourcemap&&"inline"}];const r=[],a=e.moduleType||"both",c=e.jsExtension||"either";("cjs"===a||"both"===a||"either"===a&&!i)&&r.push({dir:t,entryFileNames:"both"===c||"either"===c&&!i?"[name].js":"[name].cjs",format:"commonjs",preserveModules:!0,sourcemap:e.sourcemap});("esm"===a||"both"===a||"either"===a&&i)&&r.push({dir:t,entryFileNames:"both"===c||"either"===c&&i?"[name].js":"[name].mjs",format:"module",preserveModules:!0,sourcemap:e.sourcemap});return r}(n,g,r,h);i&&console.info("OutputOptions:",j),0===j.length&&(console.error("Failed to detect output files."),process.exit(1)),process.chdir(r),await e.promises.rm(o.join(r,"dist"),{recursive:!0,force:!0}),"functions"===g&&await H(r,m,n.moduleType);const v={input:"functions"===g?Object.fromEntries(y.map((e,n)=>[0===n?"index":o.basename(e,o.extname(e)),e])):y,plugins:A(n,g,m,b,r,j),watch:n.watch?{clearScreen:!1}:void 0},w=e=>(Array.isArray(e)?e:[e]).map(e=>o.relative(r,e));if(n.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=[a.bold(a.red(`[!] ${a.bold(i.toString())}`))];e.url&&t.push(a.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(a.dim(e.frame)),e.stack&&t.push(a.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(a.cyan(`Bundles ${a.bold(t(i).join(", "))} → ${a.bold(t(s.output).join(", "))}\non ${n} ...`));break}case"BUNDLE_END":if(e.silent)break;console.info(a.green(`Created ${a.bold(t(s.output).join(", "))} in ${a.bold(p(s.duration))}`)),"app-node"!==o&&"functions"!==o&&await P(e,n);break;case"END":if(e.silent)break;console.info(`\n[${c()}] waiting for changes...`)}"result"in s&&s.result&&s.result.close()})}(n,g,r,v,j,w);else{let e;n.silent||console.info(a.cyan(`Bundles ${a.bold(w(y).join(", "))} → ${a.bold(w(j.map(e=>e.file||e.dir||"")).join(", "))}\non ${r} ...`));let o=!1;try{const o=Date.now(),s=await l(v);e=s,await Promise.all(j.map(e=>s.write(e))),n.silent||console.info(a.green(`Created ${w(j.map(e=>e.file||e.dir||"")).join(", ")} in ${a.bold(p(Date.now()-o))}`))}catch(e){o=!0,console.error("Failed to build due to:",e)}await(e?.close()),o&&process.exit(1),"app-node"===g||"functions"===g||await P(n,r)||process.exit(1)}}async function H(n,s,i){s.name+="-dist";const t="module"===s.type,r=V(t,i);s.main=t===r?"index.js":r?"index.mjs":"index.cjs",delete s.scripts,delete s.devDependencies,await e.promises.mkdir(o.join(n,"dist"),{recursive:!0}),await e.promises.writeFile(o.join(n,"dist","package.json"),JSON.stringify(s))}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 a=D.spawnSync(s,r,{stdio:"inherit",env:{...process.env}});process.exit(a.status??1)}};i(process.env),await t(r(process.argv)).scriptName("build-ts").options(B).command(J).command(W).command(M).command(Y).demandCommand().strict().version(function(){let n=o.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(o.join(n,"package.json"));)n=o.dirname(n);return JSON.parse(e.readFileSync(o.join(n,"package.json"),"utf8")).version}()).help().argv;
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbnYudHMiLCIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvYnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9wbHVnaW4udHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvdHlwZVNjcmlwdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9yb2xsdXBMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxubGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghZW52VmFycykge1xuICAgIGVudlZhcnMgPSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnTG9hZGVkIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZGVmaW5pdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGJ1aWxkLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnNEZWY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgZW52VmFyTmFtZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oYXJndi5pbmxpbmUgPz8gW10pLmZsYXRNYXAoKGUpID0+IGUudG9TdHJpbmcoKS5zcGxpdCgnLCcpKSxcbiAgICAuLi4oYXJndi5hdXRvSW5saW5lID8gT2JqZWN0LmtleXMobG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIGN3ZCkpIDogW10pLFxuICBdKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGVudlZhck5hbWVzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52W25hbWVdID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgZW52VmFyc0RlZltgcHJvY2Vzcy5lbnYuJHtuYW1lfWBdID0gSlNPTi5zdHJpbmdpZnkocHJvY2Vzcy5lbnZbbmFtZV0pO1xuICB9XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0lubGluZSBlbnYgdmFyczonLCBPYmplY3Qua2V5cyhlbnZWYXJzRGVmKSk7XG4gIH1cbiAgcmV0dXJuIGVudlZhcnNEZWY7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcywgT3B0aW9ucyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IGFsbFRhcmdldENhdGVnb3JpZXMgPSBbJ2FwcCcsICdmdW5jdGlvbnMnLCAnbGliJ10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRhcmdldENhdGVnb3J5ID0gKHR5cGVvZiBhbGxUYXJnZXRDYXRlZ29yaWVzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgYWxsVGFyZ2V0RGV0YWlscyA9IFsnYXBwLW5vZGUnLCAnZnVuY3Rpb25zJywgJ2xpYicsICdsaWItcmVhY3QnXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGFyZ2V0RGV0YWlsID0gKHR5cGVvZiBhbGxUYXJnZXREZXRhaWxzKVtudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBBcmd1bWVudHNUeXBlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBPcHRpb25zPj4gPSBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczxUPj47XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHVybCBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8W1BhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBzdHJpbmddPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgIHJldHVybiBbSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIFt1bmRlZmluZWQsIHBhY2thZ2VKc29uUGF0aF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWlsZFRzUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHVybC5maWxlVVJMVG9QYXRoKHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUoaW1wb3J0Lm1ldGEudXJsKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlQW5kTmFtZShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBbc3RyaW5nIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCB1bmRlZmluZWRdIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBwYWNrYWdlSnNvbi5uYW1lPy50b1N0cmluZygpID8/ICcnO1xuICBjb25zdCBtYXRjaCA9IC9AKFteL10rKVxcLyguKykvLmV4ZWMocGFja2FnZU5hbWUpO1xuICBjb25zdCBbLCBuYW1lc3BhY2UsIG5hbWVdID0gbWF0Y2ggPz8gW107XG4gIHJldHVybiBbbmFtZXNwYWNlLCBuYW1lXTtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAncycsXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmV4cG9ydCBjb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgaW5wdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRocyBvZiBzb3VyY2UgY29kZSBmaWxlcyB0byBiZSBidWlsdC4gVGhlIGZpcnN0IGZpbGUgaXMgbWFpbi4gSWYgbm8gb3B0aW9uIGlzIGdpdmVuLCBcInNyYy9pbmRleC57dHMsdHN4fVwiIGZyb20gcGFja2FnZSBkaXJlY3RvcnkgaXMgdGFyZ2V0ZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnaScsXG4gIH0sXG4gICdjb3JlLWpzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyBpcyBlbXBsb3llZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgJ2NvcmUtanMtcHJvcG9zYWxzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyB3aXRoIHByb3Bvc2FscyBzdXBwb3J0IGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBtaW5pZnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IG1pbmlmaWNhdGlvbiBpcyBlbmFibGVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIHNvdXJjZW1hcDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3Qgc291cmNlbWFwIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgZXh0ZXJuYWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgaW5saW5lOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgaW5saW5lZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdhdXRvLWlubGluZSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lubGluZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBhdCBlbnYgZmlsZXMuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICBrZWVwSW1wb3J0OiB7XG4gICAgZGVzY3JpcHRpb246ICdJZGVudGlmaWVycyB0byBiZSBrZXB0IGFzIGltcG9ydCBzdGF0ZW1lbnRzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgYnVuZGxlQnVpbHRpbnM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ01vZHVsZSBuYW1lcyBzYW1lIHdpdGggYnVpbHRpbnMgKGUuZy4sIHVuZGljaSkgdG8gYmUgYnVuZGxlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYXBwQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIG9yIGVpdGhlciAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLmFwcEJ1aWxkZXIsXG4gIG9ubHlQYWNrYWdlSnNvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBnZW5lcmF0ZSBvbmx5IHBhY2thZ2UuanNvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBsaWJCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgZWl0aGVyLCBvciBib3RoIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG4gIC8vIC5qcyBmaWxlcyBpbiBhIHBhY2thZ2Ugd2l0aCBgXCJ0eXBlXCI6IFwibW9kdWxlXCJgIGFyZSB0cmVhdGVkIGFzIGVzbS5cbiAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byB0cmVhdCB0aGVtIGFzIGNqcyBpbiB0aGUgY2FzZSB3aGVyZSBhIGNqcyBwcm9qZWN0IGltcG9ydHMgYW4gZXNtIHBhY2thZ2UuXG4gIC8vIFRvIGRlYWwgd2l0aCB0aGUgY2FzZSwgd2UgdXNlIC5janMgYW5kIC5tanMgZXh0ZW5zaW9ucyBpbnN0ZWFkIG9mIC5qcyBleHRlbnNpb24uXG4gIGpzRXh0ZW5zaW9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHVzZSAuanMgaW4gY2pzIGFuZC9vciBlc206IGVpdGhlciAoZGVmYXVsdCksIGJvdGgsIG9yIG5vbmUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2onLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQW55QnVpbGRlclR5cGUgPSB0eXBlb2YgYXBwQnVpbGRlciB8IHR5cGVvZiBmdW5jdGlvbnNCdWlsZGVyIHwgdHlwZW9mIGxpYkJ1aWxkZXI7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBiYWJlbCB9IGZyb20gJ0Byb2xsdXAvcGx1Z2luLWJhYmVsJztcbmltcG9ydCBjb21tb25qcyBmcm9tICdAcm9sbHVwL3BsdWdpbi1jb21tb25qcyc7XG5pbXBvcnQganNvbiBmcm9tICdAcm9sbHVwL3BsdWdpbi1qc29uJztcbmltcG9ydCByZXNvbHZlIGZyb20gJ0Byb2xsdXAvcGx1Z2luLW5vZGUtcmVzb2x2ZSc7XG5pbXBvcnQgcmVwbGFjZSBmcm9tICdAcm9sbHVwL3BsdWdpbi1yZXBsYWNlJztcbmltcG9ydCB0ZXJzZXIgZnJvbSAnQHJvbGx1cC9wbHVnaW4tdGVyc2VyJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUGx1Z2luIH0gZnJvbSAncm9sbHVwJztcbmltcG9ydCBhbmFseXplIGZyb20gJ3JvbGx1cC1wbHVnaW4tYW5hbHl6ZXInO1xuaW1wb3J0IHsga2VlcEltcG9ydCB9IGZyb20gJ3JvbGx1cC1wbHVnaW4ta2VlcC1pbXBvcnQnO1xuaW1wb3J0IHsgbm9kZUV4dGVybmFscyB9IGZyb20gJ3JvbGx1cC1wbHVnaW4tbm9kZS1leHRlcm5hbHMnO1xuaW1wb3J0IHByZXNlcnZlRGlyZWN0aXZlcyBmcm9tICdyb2xsdXAtcGx1Z2luLXByZXNlcnZlLWRpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAncm9sbHVwLXBsdWdpbi1zdHJpbmcnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEJ1aWxkVHNSb290UGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwUGx1Z2lucyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sXG4gIHRhcmdldERldGFpbDogVGFyZ2V0RGV0YWlsLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdXG4pOiBQbHVnaW5bXSB7XG4gIGNvbnN0IGV4dGVybmFsRGVwcyA9IFsuLi4oYXJndi5leHRlcm5hbCA/PyBbXSldLm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKTtcbiAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydAcHJpc21hL2NsaWVudCddKSB7XG4gICAgZXh0ZXJuYWxEZXBzLnB1c2goJ3ByaXNtYS1jbGllbnQnKTtcbiAgfVxuICAvLyBTaW5jZSBgZGVwczogdHJ1ZWAgZG9lcyBub3Qgd29yayBmb3IgYGltcG9ydCBjaHVuayBmcm9tICdsb2Rhc2guY2h1bmsvaW5kZXguanMnO2BcbiAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgKTtcbiAgLy8gQWRkIGV4dGVybmFsIGRlcGVuZGVuY2llcyBmcm9tIHNpYmxpbmcgcGFja2FnZXNcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKCcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBjb25zdCBwYWNrYWdlRGlycyA9IGZzLnJlYWRkaXJTeW5jKHBhdGguam9pbignLi4nKSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcGFja2FnZURpciBvZiBwYWNrYWdlRGlycykge1xuICAgICAgaWYgKCFwYWNrYWdlRGlyLmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oJy4uJywgcGFja2FnZURpci5uYW1lLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG90aGVyUGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgICAgIGlmIChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltvdGhlclBhY2thZ2VKc29uLm5hbWUgPz8gJyddKSB7XG4gICAgICAgIGV4dGVybmFsRGVwcy5wdXNoKFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhvdGhlclBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5qc29uJywgJy5jdHMnLCAnLm10cycsICcudHMnLCAnLnRzeCddO1xuICBjb25zdCBiYWJlbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZ2V0QnVpbGRUc1Jvb3RQYXRoKCksICdiYWJlbC5jb25maWcubWpzJyk7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gW1xuICAgIHJlcGxhY2Uoe1xuICAgICAgLy8gSWdub3JlIHdvcmQgYm91bmRhcmllcyBhbmQgcmVwbGFjZSBldmVyeSBpbnN0YW5jZSBvZiB0aGUgc3RyaW5nLlxuICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcGx1Z2lucy90cmVlL21hc3Rlci9wYWNrYWdlcy9yZXBsYWNlI3dvcmQtYm91bmRhcmllc1xuICAgICAgZGVsaW1pdGVyczogWycnLCAnJ10sXG4gICAgICBwcmV2ZW50QXNzaWdubWVudDogdHJ1ZSxcbiAgICAgIHZhbHVlczogY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICB9KSxcbiAgICBqc29uKCksXG4gICAgbm9kZUV4dGVybmFscyh7XG4gICAgICBkZXBzOiB0cnVlLFxuICAgICAgZGV2RGVwczogZmFsc2UsXG4gICAgICBwZWVyRGVwczogdHJ1ZSxcbiAgICAgIG9wdERlcHM6IHRydWUsXG4gICAgICBpbmNsdWRlOiBleHRlcm5hbERlcHMubWFwKChuYW1lKSA9PiBuZXcgUmVnRXhwKGBeJHtuYW1lfSg/OlxcXFwvLispP2ApKSxcbiAgICAgIGV4Y2x1ZGU6IG5hbWVzcGFjZSAmJiBuZXcgUmVnRXhwKGBeQD8ke25hbWVzcGFjZX0oPzpcXFxcLy4rKT9gKSxcbiAgICB9KSxcbiAgICByZXNvbHZlKHtcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICBwcmVmZXJCdWlsdGluczogKGlkOiBzdHJpbmcpID0+ICFhcmd2LmJ1bmRsZUJ1aWx0aW5zPy5pbmNsdWRlcyhpZCksXG4gICAgfSksXG4gICAgY29tbW9uanMoKSxcbiAgICBrZWVwSW1wb3J0KHsgbW9kdWxlTmFtZXM6IGFyZ3Yua2VlcEltcG9ydD8ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpID8/IFtdIH0pLFxuICBdO1xuICBjb25zdCBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPVxuICAgIHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnIHx8ICFleHRlcm5hbERlcHMuaW5jbHVkZXMoJ0BiYWJlbC9ydW50aW1lJyk7XG4gIHByb2Nlc3MuZW52LkJVSUxEVFNfVVNFX0JBQkxFX1JVTlRJTUUgPSBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPyAnJyA6ICcxJztcbiAgcGx1Z2lucy5wdXNoKFxuICAgIGJhYmVsKHtcbiAgICAgIGNvbmZpZ0ZpbGU6IGJhYmVsQ29uZmlnUGF0aCxcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICAvLyBXZSBuZWVkIGBydW50aW1lIHNpbmNlIGBidW5kbGVkYCBtYXkgYnJlYWsgZGlyZWN0b3J5IHN0cnVjdHVyZSBieSBjcmVhdGluZyBfdmlydHVhbCBkaXJlY3RvcnkuXG4gICAgICBiYWJlbEhlbHBlcnM6IGlzQmFiZWxIZWxwZXJzQnVuZGxlZCA/ICdidW5kbGVkJyA6ICdydW50aW1lJyxcbiAgICAgIGV4Y2x1ZGU6IC9eKC4rXFwvKT9ub2RlX21vZHVsZXNcXC8uKyQvLFxuICAgIH0pLFxuICAgIC4uLihvdXRwdXRPcHRpb25zTGlzdC5zb21lKChvcHRzKSA9PiBvcHRzLnByZXNlcnZlTW9kdWxlcykgPyBbcHJlc2VydmVEaXJlY3RpdmVzKCldIDogW10pLFxuICAgIHN0cmluZyh7IGluY2x1ZGU6IFsnKiovKi5jc3YnLCAnKiovKi50eHQnXSB9KVxuICApO1xuICBpZiAoYXJndi5taW5pZnkpIHtcbiAgICBwbHVnaW5zLnB1c2godGVyc2VyKHsgY29tcHJlc3M6IHsgZGlyZWN0aXZlczogZmFsc2UgfSB9KSk7XG4gIH1cbiAgcGx1Z2lucy5wdXNoKGFuYWx5emUoeyBzdW1tYXJ5T25seTogdHJ1ZSB9KSk7XG4gIHJldHVybiBwbHVnaW5zO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbi8vIFdlIGNhbm5vdCB1c2UgbmFtZWQgaW1wb3J0cyBmcm9tICd0eXBlc2NyaXB0JyBiZWNhdXNlIG9mIGJ1aWxkIGVycm9ycy5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFueUJ1aWxkZXJUeXBlIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIGNvcmVQcm9qZWN0RGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgY29yZUNvbmZpZ0ZpbGUgPSB0cy5maW5kQ29uZmlnRmlsZShjb3JlUHJvamVjdERpclBhdGgsIHRzLnN5cy5maWxlRXhpc3RzKTtcbiAgaWYgKCFjb3JlQ29uZmlnRmlsZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCB0c2NvbmZpZy5qc29uIGluICR7Y29yZVByb2plY3REaXJQYXRofS5gKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnRm91bmQgdHNjb25maWcuanNvbjonLCBjb3JlQ29uZmlnRmlsZSk7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0czogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgbGV0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIHBhdGguYmFzZW5hbWUoY29yZVByb2plY3REaXJQYXRoKSwgJ3NyYycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjb3JlUHJvamVjdERpclBhdGgpO1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHBhcmVudERpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb3JlUHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBpZiAoIWRpcmVudC5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUocGFyZW50RGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgaWYgKHByb2plY3REaXJQYXRoID09PSBjb3JlUHJvamVjdERpclBhdGgpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBjb25maWdGaWxlID0gdHMuZmluZENvbmZpZ0ZpbGUocHJvamVjdERpclBhdGgsIHRzLnN5cy5maWxlRXhpc3RzKTtcbiAgICAgIGNvbnN0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIGRpcmVudC5uYW1lLCAnc3JjJyk7XG4gICAgICBpZiAoY29uZmlnRmlsZSAmJiBmcy5leGlzdHNTeW5jKG91dERpcikpIHtcbiAgICAgICAgcHJvamVjdHMucHVzaChbcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXREaXIgPSAnZGlzdCc7XG4gIH1cbiAgcHJvamVjdHMucHVzaChbY29yZVByb2plY3REaXJQYXRoLCBjb3JlQ29uZmlnRmlsZSwgb3V0RGlyXSk7XG5cbiAgbGV0IGFsbFN1Y2NlZWRlZCA9IHRydWU7XG4gIGZvciAoY29uc3QgW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXJdIG9mIHByb2plY3RzKSB7XG4gICAgYWxsU3VjY2VlZGVkICYmPSBydW5UeXBlU2NyaXB0Q29tcGlsZXIoYXJndiwgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIHBhdGguam9pbihjb3JlUHJvamVjdERpclBhdGgsIG91dERpcikpO1xuICB9XG4gIHJldHVybiBhbGxTdWNjZWVkZWQ7XG59XG5cbmZ1bmN0aW9uIHJ1blR5cGVTY3JpcHRDb21waWxlcihcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZ0ZpbGU6IHN0cmluZyxcbiAgb3V0RGlyOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdydW5UeXBlU2NyaXB0Q29tcGlsZXIoKScsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIpO1xuICB9XG5cbiAgY29uc3QgeyBjb25maWcgfSA9IHRzLnJlYWRDb25maWdGaWxlKGNvbmZpZ0ZpbGUsIHRzLnN5cy5yZWFkRmlsZSk7XG4gIGNvbmZpZy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgLi4uY29uZmlnLmNvbXBpbGVyT3B0aW9ucyxcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBlbWl0RGVjbGFyYXRpb25Pbmx5OiB0cnVlLFxuICAgIG5vRW1pdDogZmFsc2UsXG4gICAgbm9FbWl0T25FcnJvcjogdHJ1ZSxcbiAgICBvdXREaXIsXG4gIH07XG4gIGNvbmZpZy5pbmNsdWRlID0gWydzcmMvKiovKiddO1xuICBjb25zdCB7IGVycm9ycywgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSB0cy5wYXJzZUpzb25Db25maWdGaWxlQ29udGVudChjb25maWcsIHRzLnN5cywgcHJvamVjdERpclBhdGgpO1xuXG4gIGNvbnN0IHByb2dyYW0gPSB0cy5jcmVhdGVQcm9ncmFtKHsgb3B0aW9ucywgcm9vdE5hbWVzOiBmaWxlTmFtZXMsIGNvbmZpZ0ZpbGVQYXJzaW5nRGlhZ25vc3RpY3M6IGVycm9ycyB9KTtcbiAgY29uc3QgeyBkaWFnbm9zdGljcywgZW1pdFNraXBwZWQgfSA9IHByb2dyYW0uZW1pdCgpO1xuXG4gIGNvbnN0IGFsbERpYWdub3N0aWNzID0gWy4uLnRzLmdldFByZUVtaXREaWFnbm9zdGljcyhwcm9ncmFtKSwgLi4uZGlhZ25vc3RpY3MsIC4uLmVycm9yc107XG4gIGlmIChhbGxEaWFnbm9zdGljcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZm9ybWF0SG9zdDogdHMuRm9ybWF0RGlhZ25vc3RpY3NIb3N0ID0ge1xuICAgICAgZ2V0Q2Fub25pY2FsRmlsZU5hbWU6IChwYXRoKSA9PiBwYXRoLFxuICAgICAgZ2V0Q3VycmVudERpcmVjdG9yeTogdHMuc3lzLmdldEN1cnJlbnREaXJlY3RvcnksXG4gICAgICBnZXROZXdMaW5lOiAoKSA9PiB0cy5zeXMubmV3TGluZSxcbiAgICB9O1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0cy5mb3JtYXREaWFnbm9zdGljcyhhbGxEaWFnbm9zdGljcywgZm9ybWF0SG9zdCk7XG4gICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICB9XG4gIHJldHVybiAhZW1pdFNraXBwZWQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGRhdGVUaW1lIGZyb20gJ2RhdGUtdGltZSc7XG5pbXBvcnQgbXMgZnJvbSAncHJldHR5LW1zJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUm9sbHVwQnVpbGQsIFJvbGx1cE9wdGlvbnMgfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IHsgcm9sbHVwLCB3YXRjaCB9IGZyb20gJ3JvbGx1cCc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXIgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgeyBvbkV4aXQgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vLi4vZW52LmpzJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSwgVGFyZ2V0Q2F0ZWdvcnksIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGFsbFRhcmdldENhdGVnb3JpZXMgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXROYW1lc3BhY2VBbmROYW1lLCByZWFkUGFja2FnZUpzb24gfSBmcm9tICcuLi8uLi91dGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQW55QnVpbGRlclR5cGUsIGJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYXBwQnVpbGRlciwgZnVuY3Rpb25zQnVpbGRlciwgbGliQnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBzZXR1cFBsdWdpbnMgfSBmcm9tICcuL3BsdWdpbi5qcyc7XG5pbXBvcnQgeyBoYW5kbGVFcnJvciB9IGZyb20gJy4vcm9sbHVwTG9nZ2VyLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyB9IGZyb20gJy4vdHlwZVNjcmlwdC5qcyc7XG5cbmV4cG9ydCBjb25zdCBhcHA6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgYXBwQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYXBwIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYW4gYXBwJyxcbiAgYnVpbGRlcjogYXBwQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdhcHAnKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbnM6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgZnVuY3Rpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZnVuY3Rpb25zIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYSBHQ1AvRmlyZWJhc2UgZnVuY3Rpb25zIGFwcCcsXG4gIGJ1aWxkZXI6IGZ1bmN0aW9uc0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2Lm9ubHlQYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gICAgICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICAgICAgaWYgKCFwYWNrYWdlSnNvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKHBhY2thZ2VEaXJQYXRoLCBwYWNrYWdlSnNvbiwgYXJndi5tb2R1bGVUeXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdmdW5jdGlvbnMnKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgbGliOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGxpYkJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpYiBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgTm9kZS5qcyAvIFJlYWN0IGxpYnJhcnknLFxuICBidWlsZGVyOiBsaWJCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICByZXR1cm4gYnVpbGQoYXJndiwgJ2xpYicpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LCB0YXJnZXRDYXRlZ29yeTogVGFyZ2V0Q2F0ZWdvcnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHw9ICdwcm9kdWN0aW9uJztcblxuICAvLyBgc2lsZW50YCBpcyBzdHJvbmdlciB0aGFuIGB2ZXJib3NlYC5cbiAgY29uc3QgdmVyYm9zZSA9ICFhcmd2LnNpbGVudCAmJiBhcmd2LnZlcmJvc2U7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gIGNvbnN0IFtwYWNrYWdlSnNvbiwgcGFja2FnZUpzb25QYXRoXSA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aCk7XG4gIGlmICghcGFja2FnZUpzb24pIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwYWNrYWdlRGlyUGF0aCk7XG5cbiAgY29uc3QgaW5wdXRzID0gdmVyaWZ5SW5wdXQoYXJndiwgY3dkLCBwYWNrYWdlRGlyUGF0aCk7XG4gIGNvbnN0IHRhcmdldERldGFpbCA9IGRldGVjdFRhcmdldERldGFpbCh0YXJnZXRDYXRlZ29yeSwgaW5wdXRzKTtcblxuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnYXJndjonLCBhcmd2KTtcbiAgICBjb25zb2xlLmluZm8oJ3BhY2thZ2VKc29uUGF0aDonLCBwYWNrYWdlSnNvblBhdGgpO1xuICAgIGNvbnNvbGUuaW5mbygnVGFyZ2V0IChDYXRlZ29yeSk6JywgYCR7dGFyZ2V0RGV0YWlsfSAoJHt0YXJnZXRDYXRlZ29yeX0pYCk7XG4gIH1cblxuICBjb25zdCBbbmFtZXNwYWNlXSA9IGdldE5hbWVzcGFjZUFuZE5hbWUocGFja2FnZUpzb24pO1xuICBjb25zdCBpc0VzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcblxuICBpZiAoYXJndlsnY29yZS1qcyddKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfQ09SRUpTID0gJzEnO1xuICB9IGVsc2UgaWYgKGFyZ3ZbJ2NvcmUtanMtcHJvcG9zYWxzJ10pIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19DT1JFSlNfV0lUSF9QUk9QT1NBTFMgPSAnMSc7XG4gIH1cblxuICBpZiAodmVyYm9zZSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX1ZFUkJPU0UgPSAnMSc7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVEFSR0VUX0NBVEVHT1JZID0gdGFyZ2V0Q2F0ZWdvcnk7XG4gIHByb2Nlc3MuZW52LkJVSUxEX1RTX1RBUkdFVF9ERVRBSUwgPSB0YXJnZXREZXRhaWw7XG5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3QgPSBnZXRPdXRwdXRPcHRpb25zTGlzdChhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VEaXJQYXRoLCBpc0VzbVBhY2thZ2UpO1xuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnT3V0cHV0T3B0aW9uczonLCBvdXRwdXRPcHRpb25zTGlzdCk7XG4gIH1cbiAgaWYgKG91dHB1dE9wdGlvbnNMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3Qgb3V0cHV0IGZpbGVzLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuY2hkaXIocGFja2FnZURpclBhdGgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JyksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgaWYgKHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycpIHtcbiAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKHBhY2thZ2VEaXJQYXRoLCBwYWNrYWdlSnNvbiwgYXJndi5tb2R1bGVUeXBlKTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnM6IFJvbGx1cE9wdGlvbnMgPSB7XG4gICAgaW5wdXQ6XG4gICAgICB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnXG4gICAgICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgaW5wdXRzLm1hcCgoaW5wdXQsIGluZGV4KSA9PiBbaW5kZXggPT09IDAgPyAnaW5kZXgnIDogcGF0aC5iYXNlbmFtZShpbnB1dCwgcGF0aC5leHRuYW1lKGlucHV0KSksIGlucHV0XSlcbiAgICAgICAgICApXG4gICAgICAgIDogaW5wdXRzLFxuICAgIHBsdWdpbnM6IHNldHVwUGx1Z2lucyhhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VKc29uLCBuYW1lc3BhY2UsIHBhY2thZ2VEaXJQYXRoLCBvdXRwdXRPcHRpb25zTGlzdCksXG4gICAgd2F0Y2g6IGFyZ3Yud2F0Y2ggPyB7IGNsZWFyU2NyZWVuOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICB9O1xuXG4gIGNvbnN0IHBhdGhUb1JlbGF0aXZlUGF0aCA9IChwYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KTogc3RyaW5nW10gPT5cbiAgICAoQXJyYXkuaXNBcnJheShwYXRocykgPyBwYXRocyA6IFtwYXRoc10pLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShwYWNrYWdlRGlyUGF0aCwgcCkpO1xuICBpZiAoYXJndi53YXRjaCkge1xuICAgIHdhdGNoUm9sbHVwKGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZURpclBhdGgsIG9wdGlvbnMsIG91dHB1dE9wdGlvbnNMaXN0LCBwYXRoVG9SZWxhdGl2ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgQnVuZGxlcyAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0cykuam9pbignLCAnKSl9IOKGkiAke2NoYWxrLmJvbGQoXG4gICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZVBhdGgob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBvcHRzLmZpbGUgfHwgb3B0cy5kaXIgfHwgJycpKS5qb2luKCcsICcpXG4gICAgICAgICAgKX1cXG5vbiAke3BhY2thZ2VEaXJQYXRofSAuLi5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGJ1bmRsZTogUm9sbHVwQnVpbGQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGJ1aWxkRmFpbGVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBfYnVuZGxlID0gYXdhaXQgcm9sbHVwKG9wdGlvbnMpO1xuICAgICAgYnVuZGxlID0gX2J1bmRsZTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gX2J1bmRsZS53cml0ZShvcHRzKSkpO1xuXG4gICAgICBpZiAoIWFyZ3Yuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgIGBDcmVhdGVkICR7cGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbihcbiAgICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICAgKX0gaW4gJHtjaGFsay5ib2xkKG1zKERhdGUubm93KCkgLSBzdGFydFRpbWUpKX1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBidWlsZEZhaWxlZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYnVpbGQgZHVlIHRvOicsIGVycm9yKTtcbiAgICB9XG4gICAgYXdhaXQgYnVuZGxlPy5jbG9zZSgpO1xuICAgIGlmIChidWlsZEZhaWxlZCkgcHJvY2Vzcy5leGl0KDEpO1xuXG4gICAgaWYgKFxuICAgICAgdGFyZ2V0RGV0YWlsICE9PSAnYXBwLW5vZGUnICYmXG4gICAgICB0YXJnZXREZXRhaWwgIT09ICdmdW5jdGlvbnMnICYmXG4gICAgICAhKGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCkpXG4gICAgKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhdGNoUm9sbHVwKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgdGFyZ2V0RGV0YWlsOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJvbGx1cE9wdGlvbnMsXG4gIG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW10sXG4gIHBhdGhUb1JlbGF0aXZlUGF0aDogKHBhdGhzOiBzdHJpbmcgfCBSZWFkb25seTxzdHJpbmdbXT4pID0+IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgY29uc3Qgd2F0Y2hlciA9IHdhdGNoKHsgLi4ub3B0aW9ucywgb3V0cHV0OiBvdXRwdXRPcHRpb25zTGlzdCB9KTtcblxuICBjb25zdCBjbG9zZSA9IGFzeW5jIChjb2RlOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcigndW5jYXVnaHRFeGNlcHRpb24nLCBjbG9zZSk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xvc2UpO1xuICAgIGlmICh3YXRjaGVyKSBhd2FpdCB3YXRjaGVyLmNsb3NlKCk7XG4gICAgaWYgKGNvZGUpIHByb2Nlc3MuZXhpdChjb2RlKTtcbiAgfTtcbiAgb25FeGl0KGNsb3NlIGFzIHVua25vd24gYXMgSGFuZGxlcik7XG4gIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2UpO1xuICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlbmQnLCBjbG9zZSk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcbiAgfVxuXG4gIHdhdGNoZXIub24oJ2V2ZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgc3dpdGNoIChldmVudC5jb2RlKSB7XG4gICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXZlbnQuZXJyb3IsIHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0JVTkRMRV9TVEFSVCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zdCBldmVudElucHV0ID0gZXZlbnQuaW5wdXQ7XG4gICAgICAgIGNvbnN0IGlucHV0RmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnRJbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpbnB1dEZpbGVzLnB1c2goZXZlbnRJbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5wdXRGaWxlcy5wdXNoKFxuICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZXZlbnRJbnB1dCkgPyBldmVudElucHV0IDogT2JqZWN0LnZhbHVlcyhldmVudElucHV0IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgICBgQnVuZGxlcyAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0RmlsZXMpLmpvaW4oJywgJykpfSDihpIgJHtjaGFsay5ib2xkKFxuICAgICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZVBhdGgoZXZlbnQub3V0cHV0KS5qb2luKCcsICcpXG4gICAgICAgICAgICApfVxcbm9uICR7cGFja2FnZURpclBhdGh9IC4uLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQlVORExFX0VORCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQ3JlYXRlZCAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGV2ZW50Lm91dHB1dCkuam9pbignLCAnKSl9IGluICR7Y2hhbGsuYm9sZChtcyhldmVudC5kdXJhdGlvbikpfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJiB0YXJnZXREZXRhaWwgIT09ICdmdW5jdGlvbnMnKSB7XG4gICAgICAgICAgYXdhaXQgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VORCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zb2xlLmluZm8oYFxcblske2RhdGVUaW1lKCl9XSB3YWl0aW5nIGZvciBjaGFuZ2VzLi4uYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgncmVzdWx0JyBpbiBldmVudCAmJiBldmVudC5yZXN1bHQpIHtcbiAgICAgIHZvaWQgZXZlbnQucmVzdWx0LmNsb3NlKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5SW5wdXQoYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sIGN3ZDogc3RyaW5nLCBwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5pbnB1dCAmJiBhcmd2LmlucHV0Lmxlbmd0aCA+IDApIHJldHVybiBhcmd2LmlucHV0Lm1hcCgocCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgcC50b1N0cmluZygpKSk7XG5cbiAgY29uc3Qgc3JjRGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpO1xuICBmb3IgKGNvbnN0IGV4dCBvZiBbJ3RzJywgJ3RzeCcsICdjdHMnLCAnbXRzJ10pIHtcbiAgICBjb25zdCBpbnB1dCA9IHBhdGguam9pbihzcmNEaXJQYXRoLCBgaW5kZXguJHtleHR9YCk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoaW5wdXQpKSByZXR1cm4gW2lucHV0XTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3QgaW5wdXQgZmlsZS4nKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnk6IHN0cmluZywgaW5wdXRzOiBzdHJpbmdbXSk6IFRhcmdldERldGFpbCB7XG4gIHN3aXRjaCAodGFyZ2V0Q2F0ZWdvcnkpIHtcbiAgICBjYXNlICdhcHAnOiB7XG4gICAgICByZXR1cm4gJ2FwcC1ub2RlJztcbiAgICB9XG4gICAgY2FzZSAnZnVuY3Rpb25zJzoge1xuICAgICAgcmV0dXJuICdmdW5jdGlvbnMnO1xuICAgIH1cbiAgICBjYXNlICdsaWInOiB7XG4gICAgICBpZiAoaW5wdXRzLnNvbWUoKGlucHV0KSA9PiBpbnB1dC5lbmRzV2l0aCgnLnRzeCcpKSkge1xuICAgICAgICByZXR1cm4gJ2xpYi1yZWFjdCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ2xpYic7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RhcmdldCBvcHRpb24gbXVzdCBiZSBvbmUgb2Y6ICcgKyBhbGxUYXJnZXRDYXRlZ29yaWVzLmpvaW4oJywgJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG1vZHVsZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHBhY2thZ2VKc29uLm5hbWUgKz0gJy1kaXN0JztcbiAgY29uc3QgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICBjb25zdCBlc21PdXRwdXQgPSBpc0VzbU91dHB1dChlc21QYWNrYWdlLCBtb2R1bGVUeXBlKTtcbiAgcGFja2FnZUpzb24ubWFpbiA9IGVzbVBhY2thZ2UgPT09IGVzbU91dHB1dCA/ICdpbmRleC5qcycgOiBlc21PdXRwdXQgPyAnaW5kZXgubWpzJyA6ICdpbmRleC5janMnO1xuXG4gIC8vIFByZXZlbnQgRmlyZWJhc2UgRnVuY3Rpb25zIGZyb20gcnVubmluZyBgYnVpbGRgIHNjcmlwdCBzaW5jZSB3ZSBhcmUgYnVpbGRpbmcgY29kZSBiZWZvcmUgZGVwbG95aW5nLlxuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cztcbiAgLy8gZGV2RGVwZW5kZW5jaWVzIGFyZSBub3QgcmVxdWlyZWQgc2luY2Ugd2UgYXJlIGJ1aWxkaW5nIGNvZGUgYmVmb3JlIGRlcGxveWluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcblxuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuXG4pOiBPdXRwdXRPcHRpb25zW10ge1xuICBjb25zdCBvdXREaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpO1xuICBpZiAodGFyZ2V0RGV0YWlsID09PSAnYXBwLW5vZGUnIHx8IHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICAgIGZvcm1hdDogaXNFc21PdXRwdXQoaXNFc21QYWNrYWdlLCBhcmd2Lm1vZHVsZVR5cGUpID8gJ21vZHVsZScgOiAnY29tbW9uanMnLFxuICAgICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwICYmICdpbmxpbmUnLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgLy8gVGhlIGZvbGxvd2luZyBpbXBvcnQgc3RhdGVtZW50IGluIGFuIGVzbSBtb2R1bGUgY2F1c2VzIHRoZSBmb2xsb3dpbmcgZXJyb3I6XG4gIC8vIFN0YXRlbWVudDpcbiAgLy8gICBpbXBvcnQgeyB1c2VQcmV2aW91cyB9IGZyb20gJ3JlYWN0LXVzZSc7XG4gIC8vIEVycm9yOlxuICAvLyAgIE5hbWVkIGV4cG9ydCAndXNlUHJldmlvdXMnIG5vdCBmb3VuZC4gVGhlIHJlcXVlc3RlZCBtb2R1bGUgJ3JlYWN0LXVzZScgaXMgYSBDb21tb25KUyBtb2R1bGUsXG4gIC8vICAgd2hpY2ggbWF5IG5vdCBzdXBwb3J0IGFsbCBtb2R1bGUuZXhwb3J0cyBhcyBuYW1lZCBleHBvcnRzLlxuICAvLyBXZSBuZWVkIGNqcyBtb2R1bGVzIGZvciB3ZWIgYXBwcyB0byBhdm9pZCB0aGUgZXJyb3IuXG4gIC8vIEFsc28sIHNwbGl0dGluZyBhIGxpYnJhcnkgaXMgdXNlZnVsIGluIGJvdGggbW9kdWxlcywgc28gcHJlc2VydmVNb2R1bGVzIHNob3VsZCBiZSB0cnVlLlxuICBjb25zdCBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdID0gW107XG4gIGNvbnN0IG1vZHVsZVR5cGUgPSBhcmd2Lm1vZHVsZVR5cGUgfHwgJ2JvdGgnO1xuICBjb25zdCBqc0V4dCA9IGFyZ3YuanNFeHRlbnNpb24gfHwgJ2VpdGhlcic7XG4gIGlmIChtb2R1bGVUeXBlID09PSAnY2pzJyB8fCBtb2R1bGVUeXBlID09PSAnYm90aCcgfHwgKG1vZHVsZVR5cGUgPT09ICdlaXRoZXInICYmICFpc0VzbVBhY2thZ2UpKSB7XG4gICAgb3V0cHV0T3B0aW9uc0xpc3QucHVzaCh7XG4gICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICBlbnRyeUZpbGVOYW1lczoganNFeHQgPT09ICdib3RoJyB8fCAoanNFeHQgPT09ICdlaXRoZXInICYmICFpc0VzbVBhY2thZ2UpID8gJ1tuYW1lXS5qcycgOiAnW25hbWVdLmNqcycsXG4gICAgICBmb3JtYXQ6ICdjb21tb25qcycsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwLFxuICAgIH0pO1xuICB9XG4gIGlmIChtb2R1bGVUeXBlID09PSAnZXNtJyB8fCBtb2R1bGVUeXBlID09PSAnYm90aCcgfHwgKG1vZHVsZVR5cGUgPT09ICdlaXRoZXInICYmIGlzRXNtUGFja2FnZSkpIHtcbiAgICBvdXRwdXRPcHRpb25zTGlzdC5wdXNoKHtcbiAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgIGVudHJ5RmlsZU5hbWVzOiBqc0V4dCA9PT0gJ2JvdGgnIHx8IChqc0V4dCA9PT0gJ2VpdGhlcicgJiYgaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5tanMnLFxuICAgICAgZm9ybWF0OiAnbW9kdWxlJyxcbiAgICAgIHByZXNlcnZlTW9kdWxlczogdHJ1ZSxcbiAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dE9wdGlvbnNMaXN0O1xufVxuXG5mdW5jdGlvbiBpc0VzbU91dHB1dChpc0VzbVBhY2thZ2U6IGJvb2xlYW4sIG1vZHVsZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbW9kdWxlVHlwZSA9PT0gJ2VzbScgfHwgKCghbW9kdWxlVHlwZSB8fCBtb2R1bGVUeXBlID09PSAnZWl0aGVyJykgJiYgaXNFc21QYWNrYWdlKTtcbn1cbiIsImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFJvbGx1cEVycm9yIH0gZnJvbSAncm9sbHVwJztcblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yOiBSb2xsdXBFcnJvciwgcmVjb3ZlciA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnN0IG5hbWUgPSBlcnJvci5uYW1lIHx8IChlcnJvci5jYXVzZSBhcyBFcnJvcik/Lm5hbWU7XG4gIGNvbnN0IG5hbWVTZWN0aW9uID0gbmFtZSA/IGAke25hbWV9OiBgIDogJyc7XG4gIGNvbnN0IHBsdWdpblNlY3Rpb24gPSBlcnJvci5wbHVnaW4gPyBgKHBsdWdpbiAke2Vycm9yLnBsdWdpbn0pIGAgOiAnJztcbiAgY29uc3QgbWVzc2FnZSA9IGAke3BsdWdpblNlY3Rpb259JHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9YDtcblxuICBjb25zdCBvdXRwdXRMaW5lcyA9IFtjaGFsay5ib2xkKGNoYWxrLnJlZChgWyFdICR7Y2hhbGsuYm9sZChtZXNzYWdlLnRvU3RyaW5nKCkpfWApKV07XG5cbiAgaWYgKGVycm9yLnVybCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuY3lhbihlcnJvci51cmwpKTtcbiAgfVxuXG4gIGlmIChlcnJvci5sb2MpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGAke2Vycm9yLmxvYy5maWxlIHx8IGVycm9yLmlkfSAoJHtlcnJvci5sb2MubGluZX06JHtlcnJvci5sb2MuY29sdW1ufSlgKTtcbiAgfSBlbHNlIGlmIChlcnJvci5pZCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goZXJyb3IuaWQpO1xuICB9XG5cbiAgaWYgKGVycm9yLmZyYW1lKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChjaGFsay5kaW0oZXJyb3IuZnJhbWUpKTtcbiAgfVxuXG4gIGlmIChlcnJvci5zdGFjaykge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuZGltKGVycm9yLnN0YWNrPy5yZXBsYWNlKGAke25hbWVTZWN0aW9ufSR7ZXJyb3IubWVzc2FnZX1cXG5gLCAnJykpKTtcbiAgfVxuXG4gIG91dHB1dExpbmVzLnB1c2goJycsICcnKTtcbiAgY29uc29sZS5lcnJvcihvdXRwdXRMaW5lcy5qb2luKCdcXG4nKSk7XG5cbiAgaWYgKCFyZWNvdmVyKSBwcm9jZXNzLmV4aXQoMSk7XG59XG4iLCJpbXBvcnQgKiBhcyBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vZW52LmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgbW9kdWxlOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1vZHVsZSB0eXBlOiBjanMgb3IgZXNtJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBydW46IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncnVuIDxmaWxlPicsXG4gIGRlc2NyaWJlOiAnUnVuIHNjcmlwdCcsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwcm9jZXNzLmN3ZCgpKTtcblxuICAgIGNvbnN0IGZpbGUgPSBhcmd2LmZpbGU/LnRvU3RyaW5nKCkgPz8gJyc7XG5cbiAgICAvLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICAgIGNvbnN0IGlzUnVubmluZ09uQnVuID0gcHJvY2Vzcy52ZXJzaW9ucy5idW47XG4gICAgY29uc3QgcnVudGltZSA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAnbm9kZSc7XG4gICAgY29uc3QgYXJncyA9IGlzUnVubmluZ09uQnVuID8gWyctLWJ1biddIDogWyctLW5vLXdhcm5pbmdzJywgJy0taW1wb3J0JywgJ3RzeCddO1xuICAgIGlmIChhcmd2LndhdGNoKSB7XG4gICAgICBhcmdzLnB1c2goJy0td2F0Y2gnKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKGZpbGUpO1xuICAgIGNvbnN0IFssIC4uLmFkZGl0aW9uYWxBcmd1bWVudHNdID0gYXJndi5fO1xuICAgIGNvbnN0IHJ1bnRpbWVBcmdzID0gWy4uLmFyZ3MsIC4uLmFkZGl0aW9uYWxBcmd1bWVudHMubWFwKChhcmcpID0+IGFyZy50b1N0cmluZygpKV07XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nICcke3J1bnRpbWV9ICR7cnVudGltZUFyZ3Muam9pbignICcpfSdgKTtcbiAgICB9XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocnVudGltZSwgcnVudGltZUFyZ3MsIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYgfSxcbiAgICB9KTtcbiAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGFwcCwgZnVuY3Rpb25zLCBsaWIgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkL2J1aWxkLmpzJztcbmltcG9ydCB7IHJ1biB9IGZyb20gJy4vY29tbWFuZHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbnJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ2J1aWxkLXRzJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5jb21tYW5kKGFwcClcbiAgLmNvbW1hbmQoZnVuY3Rpb25zKVxuICAuY29tbWFuZChsaWIpXG4gIC5jb21tYW5kKHJ1bilcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG4iXSwibmFtZXMiOlsiZW52VmFycyIsImxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSIsImFyZ3YiLCJjd2QiLCJyZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyIsInZlcmJvc2UiLCJjb25zb2xlIiwiaW5mbyIsIk9iamVjdCIsImtleXMiLCJjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24iLCJlbnZWYXJzRGVmIiwiZW52VmFyTmFtZXMiLCJTZXQiLCJpbmxpbmUiLCJmbGF0TWFwIiwiZSIsInRvU3RyaW5nIiwic3BsaXQiLCJhdXRvSW5saW5lIiwibmFtZSIsInVuZGVmaW5lZCIsInByb2Nlc3MiLCJlbnYiLCJKU09OIiwic3RyaW5naWZ5IiwiYWxsVGFyZ2V0Q2F0ZWdvcmllcyIsImFzeW5jIiwicmVhZFBhY2thZ2VKc29uIiwiZGlyUGF0aCIsInBhY2thZ2VKc29uUGF0aCIsInBhdGgiLCJqb2luIiwicGFja2FnZUpzb25UZXh0IiwiZnMiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwicGFyc2UiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsInlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYiLCJzaWxlbnQiLCJkZXNjcmlwdGlvbiIsInR5cGUiLCJhbGlhcyIsImJ1aWxkZXIiLCJpbnB1dCIsImRlZmF1bHQiLCJtaW5pZnkiLCJzb3VyY2VtYXAiLCJleHRlcm5hbCIsIndhdGNoIiwia2VlcEltcG9ydCIsImJ1bmRsZUJ1aWx0aW5zIiwiYXBwQnVpbGRlciIsIm1vZHVsZVR5cGUiLCJmdW5jdGlvbnNCdWlsZGVyIiwib25seVBhY2thZ2VKc29uIiwibGliQnVpbGRlciIsImpzRXh0ZW5zaW9uIiwic2V0dXBQbHVnaW5zIiwidGFyZ2V0RGV0YWlsIiwicGFja2FnZUpzb24iLCJuYW1lc3BhY2UiLCJwYWNrYWdlRGlyUGF0aCIsIm91dHB1dE9wdGlvbnNMaXN0IiwiZXh0ZXJuYWxEZXBzIiwibWFwIiwiaXRlbSIsImRlcGVuZGVuY2llcyIsInB1c2giLCJwZWVyRGVwZW5kZW5jaWVzIiwib3B0aW9uYWxEZXBlbmRlbmNpZXMiLCJleGlzdHNTeW5jIiwicGFja2FnZURpcnMiLCJyZWFkZGlyU3luYyIsIndpdGhGaWxlVHlwZXMiLCJwYWNrYWdlRGlyIiwiaXNEaXJlY3RvcnkiLCJvdGhlclBhY2thZ2VKc29uIiwicmVhZEZpbGVTeW5jIiwiZXh0ZW5zaW9ucyIsImJhYmVsQ29uZmlnUGF0aCIsInVybCIsImZpbGVVUkxUb1BhdGgiLCJkaXJuYW1lIiwicGx1Z2lucyIsInJlcGxhY2UiLCJkZWxpbWl0ZXJzIiwicHJldmVudEFzc2lnbm1lbnQiLCJ2YWx1ZXMiLCJqc29uIiwibm9kZUV4dGVybmFscyIsImRlcHMiLCJkZXZEZXBzIiwicGVlckRlcHMiLCJvcHREZXBzIiwiaW5jbHVkZSIsIlJlZ0V4cCIsImV4Y2x1ZGUiLCJyZXNvbHZlIiwicHJlZmVyQnVpbHRpbnMiLCJpZCIsImluY2x1ZGVzIiwiY29tbW9uanMiLCJtb2R1bGVOYW1lcyIsImlzQmFiZWxIZWxwZXJzQnVuZGxlZCIsIkJVSUxEVFNfVVNFX0JBQkxFX1JVTlRJTUUiLCJiYWJlbCIsImNvbmZpZ0ZpbGUiLCJiYWJlbEhlbHBlcnMiLCJzb21lIiwib3B0cyIsInByZXNlcnZlTW9kdWxlcyIsInByZXNlcnZlRGlyZWN0aXZlcyIsInN0cmluZyIsInRlcnNlciIsImNvbXByZXNzIiwiZGlyZWN0aXZlcyIsImFuYWx5emUiLCJzdW1tYXJ5T25seSIsImdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyIsImNvcmVQcm9qZWN0RGlyUGF0aCIsImNvcmVDb25maWdGaWxlIiwidHMiLCJmaW5kQ29uZmlnRmlsZSIsInN5cyIsImZpbGVFeGlzdHMiLCJFcnJvciIsInByb2plY3RzIiwib3V0RGlyIiwiYmFzZW5hbWUiLCJwYXJlbnREaXJQYXRoIiwiZGlyZW50cyIsInJlYWRkaXIiLCJkaXJlbnQiLCJwcm9qZWN0RGlyUGF0aCIsImFsbFN1Y2NlZWRlZCIsInJ1blR5cGVTY3JpcHRDb21waWxlciIsImNvbmZpZyIsInJlYWRDb25maWdGaWxlIiwiY29tcGlsZXJPcHRpb25zIiwiZGVjbGFyYXRpb24iLCJlbWl0RGVjbGFyYXRpb25Pbmx5Iiwibm9FbWl0Iiwibm9FbWl0T25FcnJvciIsImVycm9ycyIsImZpbGVOYW1lcyIsIm9wdGlvbnMiLCJwYXJzZUpzb25Db25maWdGaWxlQ29udGVudCIsInByb2dyYW0iLCJjcmVhdGVQcm9ncmFtIiwicm9vdE5hbWVzIiwiY29uZmlnRmlsZVBhcnNpbmdEaWFnbm9zdGljcyIsImRpYWdub3N0aWNzIiwiZW1pdFNraXBwZWQiLCJlbWl0IiwiYWxsRGlhZ25vc3RpY3MiLCJnZXRQcmVFbWl0RGlhZ25vc3RpY3MiLCJsZW5ndGgiLCJmb3JtYXRIb3N0IiwiZ2V0Q2Fub25pY2FsRmlsZU5hbWUiLCJnZXRDdXJyZW50RGlyZWN0b3J5IiwiZ2V0TmV3TGluZSIsIm5ld0xpbmUiLCJtZXNzYWdlIiwiZm9ybWF0RGlhZ25vc3RpY3MiLCJ3YXJuIiwiYXBwIiwiY29tbWFuZCIsImRlc2NyaWJlIiwiaGFuZGxlciIsImJ1aWxkIiwiZnVuY3Rpb25zIiwicGFja2FnZSIsImVycm9yIiwiZXhpdCIsImdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMiLCJsaWIiLCJ0YXJnZXRDYXRlZ29yeSIsIk5PREVfRU5WIiwiaW5wdXRzIiwicCIsInNyY0RpclBhdGgiLCJleHQiLCJ2ZXJpZnlJbnB1dCIsImVuZHNXaXRoIiwiZGV0ZWN0VGFyZ2V0RGV0YWlsIiwicGFja2FnZU5hbWUiLCJtYXRjaCIsImV4ZWMiLCJnZXROYW1lc3BhY2VBbmROYW1lIiwiaXNFc21QYWNrYWdlIiwiQlVJTERfVFNfQ09SRUpTIiwiQlVJTERfVFNfQ09SRUpTX1dJVEhfUFJPUE9TQUxTIiwiQlVJTERfVFNfVkVSQk9TRSIsIkJVSUxEX1RTX1RBUkdFVF9DQVRFR09SWSIsIkJVSUxEX1RTX1RBUkdFVF9ERVRBSUwiLCJvdXREaXJQYXRoIiwiZGlyIiwiZm9ybWF0IiwiaXNFc21PdXRwdXQiLCJqc0V4dCIsImVudHJ5RmlsZU5hbWVzIiwiZ2V0T3V0cHV0T3B0aW9uc0xpc3QiLCJjaGRpciIsInJtIiwicmVjdXJzaXZlIiwiZm9yY2UiLCJmcm9tRW50cmllcyIsImluZGV4IiwiZXh0bmFtZSIsImNsZWFyU2NyZWVuIiwicGF0aFRvUmVsYXRpdmVQYXRoIiwicGF0aHMiLCJBcnJheSIsImlzQXJyYXkiLCJyZWxhdGl2ZSIsIndhdGNoZXIiLCJvdXRwdXQiLCJjbG9zZSIsInJlbW92ZUxpc3RlbmVyIiwic3RkaW4iLCJjb2RlIiwib25FeGl0Iiwib24iLCJpc1RUWSIsInJlc3VtZSIsImV2ZW50IiwicmVjb3ZlciIsImNhdXNlIiwibmFtZVNlY3Rpb24iLCJwbHVnaW4iLCJvdXRwdXRMaW5lcyIsImNoYWxrIiwiYm9sZCIsInJlZCIsImN5YW4iLCJsb2MiLCJmaWxlIiwibGluZSIsImNvbHVtbiIsImZyYW1lIiwiZGltIiwic3RhY2siLCJoYW5kbGVFcnJvciIsImV2ZW50SW5wdXQiLCJpbnB1dEZpbGVzIiwiZ3JlZW4iLCJtcyIsImR1cmF0aW9uIiwiZGF0ZVRpbWUiLCJyZXN1bHQiLCJ3YXRjaFJvbGx1cCIsImJ1bmRsZSIsImJ1aWxkRmFpbGVkIiwic3RhcnRUaW1lIiwiRGF0ZSIsIm5vdyIsIl9idW5kbGUiLCJyb2xsdXAiLCJQcm9taXNlIiwiYWxsIiwid3JpdGUiLCJlc21QYWNrYWdlIiwiZXNtT3V0cHV0IiwibWFpbiIsInNjcmlwdHMiLCJkZXZEZXBlbmRlbmNpZXMiLCJta2RpciIsIndyaXRlRmlsZSIsInJ1biIsIm1vZHVsZSIsImlzUnVubmluZ09uQnVuIiwidmVyc2lvbnMiLCJidW4iLCJydW50aW1lIiwiYXJncyIsImFkZGl0aW9uYWxBcmd1bWVudHMiLCJfIiwicnVudGltZUFyZ3MiLCJhcmciLCJyZXQiLCJjaGlsZF9wcm9jZXNzIiwic3Bhd25TeW5jIiwic3RkaW8iLCJzdGF0dXMiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJ5YXJncyIsImhpZGVCaW4iLCJzY3JpcHROYW1lIiwiZGVtYW5kQ29tbWFuZCIsInN0cmljdCIsInZlcnNpb24iLCJwYWNrYWdlSnNvbkRpciIsIlVSTCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiXSwibWFwcGluZ3MiOiJzL0JBTUEsSUFBSUEsRUFLRyxTQUFTQyxFQUNkQyxFQUNBQyxHQVFBLE9BTktILElBQ0hBLEVBQVVJLEVBQWlDRixFQUFNQyxHQUM3Q0QsRUFBS0csU0FDUEMsUUFBUUMsS0FBSyxtQkFBb0JDLE9BQU9DLEtB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "build-ts",
|
|
3
|
-
"version": "17.0.
|
|
3
|
+
"version": "17.0.1",
|
|
4
4
|
"repository": "github:WillBooster/build-ts",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"author": "WillBooster Inc.",
|
|
@@ -30,9 +30,6 @@
|
|
|
30
30
|
"typecheck": "wb typecheck"
|
|
31
31
|
},
|
|
32
32
|
"prettier": "@willbooster/prettier-config",
|
|
33
|
-
"resolutions": {
|
|
34
|
-
"rollup": "4.53.1"
|
|
35
|
-
},
|
|
36
33
|
"dependencies": {
|
|
37
34
|
"@babel/core": "7.28.5",
|
|
38
35
|
"@babel/plugin-proposal-decorators": "7.28.0",
|
|
@@ -57,7 +54,7 @@
|
|
|
57
54
|
"core-js-pure": "3.46.0",
|
|
58
55
|
"date-time": "4.0.0",
|
|
59
56
|
"pretty-ms": "9.3.0",
|
|
60
|
-
"rollup": "4.
|
|
57
|
+
"rollup": "4.52.5",
|
|
61
58
|
"rollup-plugin-analyzer": "4.0.0",
|
|
62
59
|
"rollup-plugin-keep-import": "1.0.3",
|
|
63
60
|
"rollup-plugin-node-externals": "8.1.2",
|