build-ts 17.0.27 → 17.1.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 +24 -33
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*as y from"@rollup/plugin-commonjs";import*as g from"@rollup/plugin-json";import*as b from"@rollup/plugin-node-resolve";import*as h from"@rollup/plugin-replace";import*as j from"@rollup/plugin-terser";import*as 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=P(h),u=P(g),$=P(b),E=P(y),D=P(j),O=P(v),T=[d({delimiters:["",""],preventAssignment:!0,values:F(n,r)}),u(),x({deps:!0,devDeps:!1,peerDeps:!0,optDeps:!0,include:c.map(e=>new RegExp(`^${e}(?:\\/.+)?`)),exclude:t&&new RegExp(`^@?${t}(?:\\/.+)?`)}),$({extensions:p,preferBuiltins:e=>!n.bundleBuiltins?.includes(e)}),E(),w({moduleNames:n.keepImport?.map(e=>e.toString())??[]})],_="app-node"===s||"functions"===s||!c.includes("@babel/runtime");return process.env.BUILDTS_USE_BABLE_RUNTIME=_?"":"1",T.push(f({configFile:l,extensions:p,babelHelpers:_?"bundled":"runtime",exclude:/^(.+\/)?node_modules\/.+$/}),...a.some(e=>e.preserveModules)?[k()]:[],S({include:["**/*.csv","**/*.txt"]})),n.minify&&T.push(D({compress:{directives:!1}})),T.push(O({summaryOnly:!0})),T}function P(e){return e.default}async function U(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&&=J(n,e,i,o.join(s,r));return a}function J(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 W={command:"app [package]",describe:"Build an app",builder:L,handler:async e=>H(e,"app")},M={command:"functions [package]",describe:"Build a GCP/Firebase functions app",builder:C,async handler(e){if(!e.onlyPackageJson)return H(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 V(n,s,e.moduleType)}}},G={command:"lib [package]",describe:"Build a Node.js / React library",builder:I,handler:async e=>H(e,"lib")};async function H(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:Y(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 V(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 U(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 U(n,r)||process.exit(1)}}async function V(n,s,i){s.name+="-dist";const t="module"===s.type,r=Y(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 Y(e,o){return"esm"===o||(!o||"either"===o)&&e}const z={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(W).command(M).command(G).command(z).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/ICcnO1xuICBjb25zdCBtYXRjaCA9IC9AKFteL10rKVxcLyguKykvLmV4ZWMocGFja2FnZU5hbWUpO1xuICBjb25zdCBbLCBuYW1lc3BhY2UsIG5hbWVdID0gbWF0Y2ggPz8gW107XG4gIHJldHVybiBbbmFtZXNwYWNlLCBuYW1lXTtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAncycsXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmV4cG9ydCBjb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgaW5wdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRocyBvZiBzb3VyY2UgY29kZSBmaWxlcyB0byBiZSBidWlsdC4gVGhlIGZpcnN0IGZpbGUgaXMgbWFpbi4gSWYgbm8gb3B0aW9uIGlzIGdpdmVuLCBcInNyYy9pbmRleC57dHMsdHN4fVwiIGZyb20gcGFja2FnZSBkaXJlY3RvcnkgaXMgdGFyZ2V0ZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnaScsXG4gIH0sXG4gICdjb3JlLWpzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyBpcyBlbXBsb3llZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgJ2NvcmUtanMtcHJvcG9zYWxzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyB3aXRoIHByb3Bvc2FscyBzdXBwb3J0IGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBtaW5pZnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IG1pbmlmaWNhdGlvbiBpcyBlbmFibGVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIHNvdXJjZW1hcDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3Qgc291cmNlbWFwIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgZXh0ZXJuYWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgaW5saW5lOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgaW5saW5lZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdhdXRvLWlubGluZSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lubGluZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBhdCBlbnYgZmlsZXMuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICBrZWVwSW1wb3J0OiB7XG4gICAgZGVzY3JpcHRpb246ICdJZGVudGlmaWVycyB0byBiZSBrZXB0IGFzIGltcG9ydCBzdGF0ZW1lbnRzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgYnVuZGxlQnVpbHRpbnM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ01vZHVsZSBuYW1lcyBzYW1lIHdpdGggYnVpbHRpbnMgKGUuZy4sIHVuZGljaSkgdG8gYmUgYnVuZGxlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYXBwQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIG9yIGVpdGhlciAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLmFwcEJ1aWxkZXIsXG4gIG9ubHlQYWNrYWdlSnNvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBnZW5lcmF0ZSBvbmx5IHBhY2thZ2UuanNvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBsaWJCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgZWl0aGVyLCBvciBib3RoIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG4gIC8vIC5qcyBmaWxlcyBpbiBhIHBhY2thZ2Ugd2l0aCBgXCJ0eXBlXCI6IFwibW9kdWxlXCJgIGFyZSB0cmVhdGVkIGFzIGVzbS5cbiAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byB0cmVhdCB0aGVtIGFzIGNqcyBpbiB0aGUgY2FzZSB3aGVyZSBhIGNqcyBwcm9qZWN0IGltcG9ydHMgYW4gZXNtIHBhY2thZ2UuXG4gIC8vIFRvIGRlYWwgd2l0aCB0aGUgY2FzZSwgd2UgdXNlIC5janMgYW5kIC5tanMgZXh0ZW5zaW9ucyBpbnN0ZWFkIG9mIC5qcyBleHRlbnNpb24uXG4gIGpzRXh0ZW5zaW9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHVzZSAuanMgaW4gY2pzIGFuZC9vciBlc206IGVpdGhlciAoZGVmYXVsdCksIGJvdGgsIG9yIG5vbmUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2onLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQW55QnVpbGRlclR5cGUgPSB0eXBlb2YgYXBwQnVpbGRlciB8IHR5cGVvZiBmdW5jdGlvbnNCdWlsZGVyIHwgdHlwZW9mIGxpYkJ1aWxkZXI7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBiYWJlbCB9IGZyb20gJ0Byb2xsdXAvcGx1Z2luLWJhYmVsJztcbmltcG9ydCAqIGFzIGNvbW1vbmpzIGZyb20gJ0Byb2xsdXAvcGx1Z2luLWNvbW1vbmpzJztcbmltcG9ydCAqIGFzIGpzb24gZnJvbSAnQHJvbGx1cC9wbHVnaW4tanNvbic7XG5pbXBvcnQgKiBhcyByZXNvbHZlIGZyb20gJ0Byb2xsdXAvcGx1Z2luLW5vZGUtcmVzb2x2ZSc7XG5pbXBvcnQgKiBhcyByZXBsYWNlIGZyb20gJ0Byb2xsdXAvcGx1Z2luLXJlcGxhY2UnO1xuaW1wb3J0ICogYXMgdGVyc2VyIGZyb20gJ0Byb2xsdXAvcGx1Z2luLXRlcnNlcic7XG5pbXBvcnQgdHlwZSB7IE91dHB1dE9wdGlvbnMsIFBsdWdpbiB9IGZyb20gJ3JvbGx1cCc7XG5pbXBvcnQgKiBhcyBhbmFseXplIGZyb20gJ3JvbGx1cC1wbHVnaW4tYW5hbHl6ZXInO1xuaW1wb3J0IHsga2VlcEltcG9ydCB9IGZyb20gJ3JvbGx1cC1wbHVnaW4ta2VlcC1pbXBvcnQnO1xuaW1wb3J0IHsgbm9kZUV4dGVybmFscyB9IGZyb20gJ3JvbGx1cC1wbHVnaW4tbm9kZS1leHRlcm5hbHMnO1xuaW1wb3J0IHByZXNlcnZlRGlyZWN0aXZlcyBmcm9tICdyb2xsdXAtcGx1Z2luLXByZXNlcnZlLWRpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAncm9sbHVwLXBsdWdpbi1zdHJpbmcnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEJ1aWxkVHNSb290UGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwUGx1Z2lucyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sXG4gIHRhcmdldERldGFpbDogVGFyZ2V0RGV0YWlsLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdXG4pOiBQbHVnaW5bXSB7XG4gIGNvbnN0IGV4dGVybmFsRGVwcyA9IFsuLi4oYXJndi5leHRlcm5hbCA/PyBbXSldLm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKTtcbiAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydAcHJpc21hL2NsaWVudCddKSB7XG4gICAgZXh0ZXJuYWxEZXBzLnB1c2goJ3ByaXNtYS1jbGllbnQnKTtcbiAgfVxuICAvLyBTaW5jZSBgZGVwczogdHJ1ZWAgZG9lcyBub3Qgd29yayBmb3IgYGltcG9ydCBjaHVuayBmcm9tICdsb2Rhc2guY2h1bmsvaW5kZXguanMnO2BcbiAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgKTtcbiAgLy8gQWRkIGV4dGVybmFsIGRlcGVuZGVuY2llcyBmcm9tIHNpYmxpbmcgcGFja2FnZXNcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKCcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBjb25zdCBwYWNrYWdlRGlycyA9IGZzLnJlYWRkaXJTeW5jKHBhdGguam9pbignLi4nKSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcGFja2FnZURpciBvZiBwYWNrYWdlRGlycykge1xuICAgICAgaWYgKCFwYWNrYWdlRGlyLmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oJy4uJywgcGFja2FnZURpci5uYW1lLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG90aGVyUGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgICAgIGlmIChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltvdGhlclBhY2thZ2VKc29uLm5hbWUgPz8gJyddKSB7XG4gICAgICAgIGV4dGVybmFsRGVwcy5wdXNoKFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhvdGhlclBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5qc29uJywgJy5jdHMnLCAnLm10cycsICcudHMnLCAnLnRzeCddO1xuICBjb25zdCBiYWJlbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZ2V0QnVpbGRUc1Jvb3RQYXRoKCksICdiYWJlbC5jb25maWcubWpzJyk7XG4gIGNvbnN0IHJlcGxhY2VQbHVnaW4gPSBnZXREZWZhdWx0UGx1Z2luRmFjdG9yeShyZXBsYWNlKTtcbiAgY29uc3QganNvblBsdWdpbiA9IGdldERlZmF1bHRQbHVnaW5GYWN0b3J5KGpzb24pO1xuICBjb25zdCByZXNvbHZlUGx1Z2luID0gZ2V0RGVmYXVsdFBsdWdpbkZhY3RvcnkocmVzb2x2ZSk7XG4gIGNvbnN0IGNvbW1vbmpzUGx1Z2luID0gZ2V0RGVmYXVsdFBsdWdpbkZhY3RvcnkoY29tbW9uanMpO1xuICBjb25zdCB0ZXJzZXJQbHVnaW4gPSBnZXREZWZhdWx0UGx1Z2luRmFjdG9yeSh0ZXJzZXIpO1xuICBjb25zdCBhbmFseXplUGx1Z2luID0gZ2V0RGVmYXVsdFBsdWdpbkZhY3RvcnkoYW5hbHl6ZSk7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gW1xuICAgIHJlcGxhY2VQbHVnaW4oe1xuICAgICAgLy8gSWdub3JlIHdvcmQgYm91bmRhcmllcyBhbmQgcmVwbGFjZSBldmVyeSBpbnN0YW5jZSBvZiB0aGUgc3RyaW5nLlxuICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcGx1Z2lucy90cmVlL21hc3Rlci9wYWNrYWdlcy9yZXBsYWNlI3dvcmQtYm91bmRhcmllc1xuICAgICAgZGVsaW1pdGVyczogWycnLCAnJ10sXG4gICAgICBwcmV2ZW50QXNzaWdubWVudDogdHJ1ZSxcbiAgICAgIHZhbHVlczogY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICB9KSxcbiAgICBqc29uUGx1Z2luKCksXG4gICAgbm9kZUV4dGVybmFscyh7XG4gICAgICBkZXBzOiB0cnVlLFxuICAgICAgZGV2RGVwczogZmFsc2UsXG4gICAgICBwZWVyRGVwczogdHJ1ZSxcbiAgICAgIG9wdERlcHM6IHRydWUsXG4gICAgICBpbmNsdWRlOiBleHRlcm5hbERlcHMubWFwKChuYW1lKSA9PiBuZXcgUmVnRXhwKGBeJHtuYW1lfSg/OlxcXFwvLispP2ApKSxcbiAgICAgIGV4Y2x1ZGU6IG5hbWVzcGFjZSAmJiBuZXcgUmVnRXhwKGBeQD8ke25hbWVzcGFjZX0oPzpcXFxcLy4rKT9gKSxcbiAgICB9KSxcbiAgICByZXNvbHZlUGx1Z2luKHtcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICBwcmVmZXJCdWlsdGluczogKGlkOiBzdHJpbmcpID0+ICFhcmd2LmJ1bmRsZUJ1aWx0aW5zPy5pbmNsdWRlcyhpZCksXG4gICAgfSksXG4gICAgY29tbW9uanNQbHVnaW4oKSxcbiAgICBrZWVwSW1wb3J0KHsgbW9kdWxlTmFtZXM6IGFyZ3Yua2VlcEltcG9ydD8ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpID8/IFtdIH0pLFxuICBdO1xuICBjb25zdCBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPVxuICAgIHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnIHx8ICFleHRlcm5hbERlcHMuaW5jbHVkZXMoJ0BiYWJlbC9ydW50aW1lJyk7XG4gIHByb2Nlc3MuZW52LkJVSUxEVFNfVVNFX0JBQkxFX1JVTlRJTUUgPSBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPyAnJyA6ICcxJztcbiAgcGx1Z2lucy5wdXNoKFxuICAgIGJhYmVsKHtcbiAgICAgIGNvbmZpZ0ZpbGU6IGJhYmVsQ29uZmlnUGF0aCxcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICAvLyBXZSBuZWVkIGBydW50aW1lIHNpbmNlIGBidW5kbGVkYCBtYXkgYnJlYWsgZGlyZWN0b3J5IHN0cnVjdHVyZSBieSBjcmVhdGluZyBfdmlydHVhbCBkaXJlY3RvcnkuXG4gICAgICBiYWJlbEhlbHBlcnM6IGlzQmFiZWxIZWxwZXJzQnVuZGxlZCA/ICdidW5kbGVkJyA6ICdydW50aW1lJyxcbiAgICAgIGV4Y2x1ZGU6IC9eKC4rXFwvKT9ub2RlX21vZHVsZXNcXC8uKyQvLFxuICAgIH0pLFxuICAgIC4uLihvdXRwdXRPcHRpb25zTGlzdC5zb21lKChvcHRzKSA9PiBvcHRzLnByZXNlcnZlTW9kdWxlcykgPyBbcHJlc2VydmVEaXJlY3RpdmVzKCldIDogW10pLFxuICAgIHN0cmluZyh7IGluY2x1ZGU6IFsnKiovKi5jc3YnLCAnKiovKi50eHQnXSB9KVxuICApO1xuICBpZiAoYXJndi5taW5pZnkpIHtcbiAgICBwbHVnaW5zLnB1c2godGVyc2VyUGx1Z2luKHsgY29tcHJlc3M6IHsgZGlyZWN0aXZlczogZmFsc2UgfSB9KSk7XG4gIH1cbiAgcGx1Z2lucy5wdXNoKGFuYWx5emVQbHVnaW4oeyBzdW1tYXJ5T25seTogdHJ1ZSB9KSk7XG4gIHJldHVybiBwbHVnaW5zO1xufVxuXG50eXBlIFBsdWdpbkZhY3RvcnkgPSAob3B0aW9ucz86IHVua25vd24pID0+IFBsdWdpbjtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFBsdWdpbkZhY3RvcnkobW9kdWxlOiB7IGRlZmF1bHQ6IHVua25vd24gfSk6IFBsdWdpbkZhY3Rvcnkge1xuICByZXR1cm4gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luRmFjdG9yeTtcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAqL1xuXG4vLyBXZSBjYW5ub3QgdXNlIG5hbWVkIGltcG9ydHMgZnJvbSAndHlwZXNjcmlwdCcgYmVjYXVzZSBvZiBidWlsZCBlcnJvcnMuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBbnlCdWlsZGVyVHlwZSB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBjb3JlUHJvamVjdERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvcmVDb25maWdGaWxlID0gdHMuZmluZENvbmZpZ0ZpbGUoY29yZVByb2plY3REaXJQYXRoLCB0cy5zeXMuZmlsZUV4aXN0cyk7XG4gIGlmICghY29yZUNvbmZpZ0ZpbGUpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgdHNjb25maWcuanNvbiBpbiAke2NvcmVQcm9qZWN0RGlyUGF0aH0uYCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0ZvdW5kIHRzY29uZmlnLmpzb246JywgY29yZUNvbmZpZ0ZpbGUpO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXVtdID0gW107XG4gIGxldCBvdXREaXIgPSBwYXRoLmpvaW4oJ2Rpc3QnLCBwYXRoLmJhc2VuYW1lKGNvcmVQcm9qZWN0RGlyUGF0aCksICdzcmMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMob3V0RGlyKSkge1xuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihwYXJlbnREaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29yZVByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvcmVQcm9qZWN0RGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgaWYgKCFkaXJlbnQuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKHBhcmVudERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGlmIChwcm9qZWN0RGlyUGF0aCA9PT0gY29yZVByb2plY3REaXJQYXRoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHRzLmZpbmRDb25maWdGaWxlKHByb2plY3REaXJQYXRoLCB0cy5zeXMuZmlsZUV4aXN0cyk7XG4gICAgICBjb25zdCBvdXREaXIgPSBwYXRoLmpvaW4oJ2Rpc3QnLCBkaXJlbnQubmFtZSwgJ3NyYycpO1xuICAgICAgaWYgKGNvbmZpZ0ZpbGUgJiYgZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgICAgIHByb2plY3RzLnB1c2goW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXJdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0RGlyID0gJ2Rpc3QnO1xuICB9XG4gIHByb2plY3RzLnB1c2goW2NvcmVQcm9qZWN0RGlyUGF0aCwgY29yZUNvbmZpZ0ZpbGUsIG91dERpcl0pO1xuXG4gIGxldCBhbGxTdWNjZWVkZWQgPSB0cnVlO1xuICBmb3IgKGNvbnN0IFtwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyXSBvZiBwcm9qZWN0cykge1xuICAgIGFsbFN1Y2NlZWRlZCAmJj0gcnVuVHlwZVNjcmlwdENvbXBpbGVyKGFyZ3YsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBwYXRoLmpvaW4oY29yZVByb2plY3REaXJQYXRoLCBvdXREaXIpKTtcbiAgfVxuICByZXR1cm4gYWxsU3VjY2VlZGVkO1xufVxuXG5mdW5jdGlvbiBydW5UeXBlU2NyaXB0Q29tcGlsZXIoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBwcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBjb25maWdGaWxlOiBzdHJpbmcsXG4gIG91dERpcjogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygncnVuVHlwZVNjcmlwdENvbXBpbGVyKCknLCBwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyKTtcbiAgfVxuXG4gIGNvbnN0IHsgY29uZmlnIH0gPSB0cy5yZWFkQ29uZmlnRmlsZShjb25maWdGaWxlLCB0cy5zeXMucmVhZEZpbGUpO1xuICBjb25maWcuY29tcGlsZXJPcHRpb25zID0ge1xuICAgIC4uLmNvbmZpZy5jb21waWxlck9wdGlvbnMsXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgZW1pdERlY2xhcmF0aW9uT25seTogdHJ1ZSxcbiAgICBub0VtaXQ6IGZhbHNlLFxuICAgIG5vRW1pdE9uRXJyb3I6IHRydWUsXG4gICAgb3V0RGlyLFxuICB9O1xuICBjb25maWcuaW5jbHVkZSA9IFsnc3JjLyoqLyonXTtcbiAgY29uc3QgeyBlcnJvcnMsIGZpbGVOYW1lcywgb3B0aW9ucyB9ID0gdHMucGFyc2VKc29uQ29uZmlnRmlsZUNvbnRlbnQoY29uZmlnLCB0cy5zeXMsIHByb2plY3REaXJQYXRoKTtcblxuICBjb25zdCBwcm9ncmFtID0gdHMuY3JlYXRlUHJvZ3JhbSh7IG9wdGlvbnMsIHJvb3ROYW1lczogZmlsZU5hbWVzLCBjb25maWdGaWxlUGFyc2luZ0RpYWdub3N0aWNzOiBlcnJvcnMgfSk7XG4gIGNvbnN0IHsgZGlhZ25vc3RpY3MsIGVtaXRTa2lwcGVkIH0gPSBwcm9ncmFtLmVtaXQoKTtcblxuICBjb25zdCBhbGxEaWFnbm9zdGljcyA9IFsuLi50cy5nZXRQcmVFbWl0RGlhZ25vc3RpY3MocHJvZ3JhbSksIC4uLmRpYWdub3N0aWNzLCAuLi5lcnJvcnNdO1xuICBpZiAoYWxsRGlhZ25vc3RpY3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGZvcm1hdEhvc3Q6IHRzLkZvcm1hdERpYWdub3N0aWNzSG9zdCA9IHtcbiAgICAgIGdldENhbm9uaWNhbEZpbGVOYW1lOiAocGF0aCkgPT4gcGF0aCxcbiAgICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6IHRzLnN5cy5nZXRDdXJyZW50RGlyZWN0b3J5LFxuICAgICAgZ2V0TmV3TGluZTogKCkgPT4gdHMuc3lzLm5ld0xpbmUsXG4gICAgfTtcbiAgICBjb25zdCBtZXNzYWdlID0gdHMuZm9ybWF0RGlhZ25vc3RpY3MoYWxsRGlhZ25vc3RpY3MsIGZvcm1hdEhvc3QpO1xuICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgfVxuICByZXR1cm4gIWVtaXRTa2lwcGVkO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBkYXRlVGltZSBmcm9tICdkYXRlLXRpbWUnO1xuaW1wb3J0IG1zIGZyb20gJ3ByZXR0eS1tcyc7XG5pbXBvcnQgdHlwZSB7IE91dHB1dE9wdGlvbnMsIFJvbGx1cEJ1aWxkLCBSb2xsdXBPcHRpb25zIH0gZnJvbSAncm9sbHVwJztcbmltcG9ydCB7IHJvbGx1cCwgd2F0Y2ggfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyIH0gZnJvbSAnc2lnbmFsLWV4aXQnO1xuaW1wb3J0IHsgb25FeGl0IH0gZnJvbSAnc2lnbmFsLWV4aXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldENhdGVnb3J5LCBUYXJnZXREZXRhaWwgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBhbGxUYXJnZXRDYXRlZ29yaWVzIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0TmFtZXNwYWNlQW5kTmFtZSwgcmVhZFBhY2thZ2VKc29uIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFueUJ1aWxkZXJUeXBlLCBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGFwcEJ1aWxkZXIsIGZ1bmN0aW9uc0J1aWxkZXIsIGxpYkJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgc2V0dXBQbHVnaW5zIH0gZnJvbSAnLi9wbHVnaW4uanMnO1xuaW1wb3J0IHsgaGFuZGxlRXJyb3IgfSBmcm9tICcuL3JvbGx1cExvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMgfSBmcm9tICcuL3R5cGVTY3JpcHQuanMnO1xuXG5leHBvcnQgY29uc3QgYXBwOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGFwcEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2FwcCBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGFuIGFwcCcsXG4gIGJ1aWxkZXI6IGFwcEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHJldHVybiBidWlsZChhcmd2LCAnYXBwJyk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25zOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGZ1bmN0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2Z1bmN0aW9ucyBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgR0NQL0ZpcmViYXNlIGZ1bmN0aW9ucyBhcHAnLFxuICBidWlsZGVyOiBmdW5jdGlvbnNCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5vbmx5UGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICAgICAgY29uc3QgW3BhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoKTtcbiAgICAgIGlmICghcGFja2FnZUpzb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhwYWNrYWdlRGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWlsZChhcmd2LCAnZnVuY3Rpb25zJyk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGxpYjogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmd1bWVudHNUeXBlPHR5cGVvZiBsaWJCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaWIgW3BhY2thZ2VdJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBhIE5vZGUuanMgLyBSZWFjdCBsaWJyYXJ5JyxcbiAgYnVpbGRlcjogbGliQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdsaWInKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPiwgdGFyZ2V0Q2F0ZWdvcnk6IFRhcmdldENhdGVnb3J5KTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8PSAncHJvZHVjdGlvbic7XG5cbiAgLy8gYHNpbGVudGAgaXMgc3Ryb25nZXIgdGhhbiBgdmVyYm9zZWAuXG4gIGNvbnN0IHZlcmJvc2UgPSAhYXJndi5zaWxlbnQgJiYgYXJndi52ZXJib3NlO1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICBpZiAoIXBhY2thZ2VKc29uKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcGFja2FnZURpclBhdGgpO1xuXG4gIGNvbnN0IGlucHV0cyA9IHZlcmlmeUlucHV0KGFyZ3YsIGN3ZCwgcGFja2FnZURpclBhdGgpO1xuICBjb25zdCB0YXJnZXREZXRhaWwgPSBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnksIGlucHV0cyk7XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ2FyZ3Y6JywgYXJndik7XG4gICAgY29uc29sZS5pbmZvKCdwYWNrYWdlSnNvblBhdGg6JywgcGFja2FnZUpzb25QYXRoKTtcbiAgICBjb25zb2xlLmluZm8oJ1RhcmdldCAoQ2F0ZWdvcnkpOicsIGAke3RhcmdldERldGFpbH0gKCR7dGFyZ2V0Q2F0ZWdvcnl9KWApO1xuICB9XG5cbiAgY29uc3QgW25hbWVzcGFjZV0gPSBnZXROYW1lc3BhY2VBbmROYW1lKHBhY2thZ2VKc29uKTtcbiAgY29uc3QgaXNFc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG5cbiAgaWYgKGFyZ3ZbJ2NvcmUtanMnXSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX0NPUkVKUyA9ICcxJztcbiAgfSBlbHNlIGlmIChhcmd2Wydjb3JlLWpzLXByb3Bvc2FscyddKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfQ09SRUpTX1dJVEhfUFJPUE9TQUxTID0gJzEnO1xuICB9XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19WRVJCT1NFID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkJVSUxEX1RTX1RBUkdFVF9DQVRFR09SWSA9IHRhcmdldENhdGVnb3J5O1xuICBwcm9jZXNzLmVudi5CVUlMRF9UU19UQVJHRVRfREVUQUlMID0gdGFyZ2V0RGV0YWlsO1xuXG4gIGNvbnN0IG91dHB1dE9wdGlvbnNMaXN0ID0gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlRGlyUGF0aCwgaXNFc21QYWNrYWdlKTtcbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ091dHB1dE9wdGlvbnM6Jywgb3V0cHV0T3B0aW9uc0xpc3QpO1xuICB9XG4gIGlmIChvdXRwdXRPcHRpb25zTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IG91dHB1dCBmaWxlcy4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBwcm9jZXNzLmNoZGlyKHBhY2thZ2VEaXJQYXRoKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIGlmICh0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnKSB7XG4gICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhwYWNrYWdlRGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gIH1cblxuICBjb25zdCBvcHRpb25zOiBSb2xsdXBPcHRpb25zID0ge1xuICAgIGlucHV0OlxuICAgICAgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJ1xuICAgICAgICA/IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIGlucHV0cy5tYXAoKGlucHV0LCBpbmRleCkgPT4gW2luZGV4ID09PSAwID8gJ2luZGV4JyA6IHBhdGguYmFzZW5hbWUoaW5wdXQsIHBhdGguZXh0bmFtZShpbnB1dCkpLCBpbnB1dF0pXG4gICAgICAgICAgKVxuICAgICAgICA6IGlucHV0cyxcbiAgICBwbHVnaW5zOiBzZXR1cFBsdWdpbnMoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlSnNvbiwgbmFtZXNwYWNlLCBwYWNrYWdlRGlyUGF0aCwgb3V0cHV0T3B0aW9uc0xpc3QpLFxuICAgIHdhdGNoOiBhcmd2LndhdGNoID8geyBjbGVhclNjcmVlbjogZmFsc2UgfSA6IHVuZGVmaW5lZCxcbiAgfTtcblxuICBjb25zdCBwYXRoVG9SZWxhdGl2ZVBhdGggPSAocGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPik6IHN0cmluZ1tdID0+XG4gICAgKEFycmF5LmlzQXJyYXkocGF0aHMpID8gcGF0aHMgOiBbcGF0aHNdKS5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUocGFja2FnZURpclBhdGgsIHApKTtcbiAgaWYgKGFyZ3Yud2F0Y2gpIHtcbiAgICB3YXRjaFJvbGx1cChhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VEaXJQYXRoLCBvcHRpb25zLCBvdXRwdXRPcHRpb25zTGlzdCwgcGF0aFRvUmVsYXRpdmVQYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWFyZ3Yuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgYEJ1bmRsZXMgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChpbnB1dHMpLmpvaW4oJywgJykpfSDihpIgJHtjaGFsay5ib2xkKFxuICAgICAgICAgICAgcGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbignLCAnKVxuICAgICAgICAgICl9XFxub24gJHtwYWNrYWdlRGlyUGF0aH0gLi4uYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBidW5kbGU6IFJvbGx1cEJ1aWxkIHwgdW5kZWZpbmVkO1xuICAgIGxldCBidWlsZEZhaWxlZCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgX2J1bmRsZSA9IGF3YWl0IHJvbGx1cChvcHRpb25zKTtcbiAgICAgIGJ1bmRsZSA9IF9idW5kbGU7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IF9idW5kbGUud3JpdGUob3B0cykpKTtcblxuICAgICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQ3JlYXRlZCAke3BhdGhUb1JlbGF0aXZlUGF0aChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IG9wdHMuZmlsZSB8fCBvcHRzLmRpciB8fCAnJykpLmpvaW4oXG4gICAgICAgICAgICAgICcsICdcbiAgICAgICAgICAgICl9IGluICR7Y2hhbGsuYm9sZChtcyhEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnVpbGRGYWlsZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGJ1aWxkIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgfVxuICAgIGF3YWl0IGJ1bmRsZT8uY2xvc2UoKTtcbiAgICBpZiAoYnVpbGRGYWlsZWQpIHByb2Nlc3MuZXhpdCgxKTtcblxuICAgIGlmIChcbiAgICAgIHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJlxuICAgICAgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJyAmJlxuICAgICAgIShhd2FpdCBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoYXJndiwgcGFja2FnZURpclBhdGgpKVxuICAgICkge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXRjaFJvbGx1cChcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHRhcmdldERldGFpbDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBvcHRpb25zOiBSb2xsdXBPcHRpb25zLFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdLFxuICBwYXRoVG9SZWxhdGl2ZVBhdGg6IChwYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KSA9PiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGNvbnN0IHdhdGNoZXIgPSB3YXRjaCh7IC4uLm9wdGlvbnMsIG91dHB1dDogb3V0cHV0T3B0aW9uc0xpc3QgfSk7XG5cbiAgY29uc3QgY2xvc2UgPSBhc3luYyAoY29kZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2UpO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsb3NlKTtcbiAgICBpZiAod2F0Y2hlcikgYXdhaXQgd2F0Y2hlci5jbG9zZSgpO1xuICAgIGlmIChjb2RlKSBwcm9jZXNzLmV4aXQoY29kZSk7XG4gIH07XG4gIG9uRXhpdChjbG9zZSBhcyB1bmtub3duIGFzIEhhbmRsZXIpO1xuICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIGNsb3NlKTtcbiAgaWYgKCFwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgcHJvY2Vzcy5zdGRpbi5vbignZW5kJywgY2xvc2UpO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7XG4gIH1cblxuICB3YXRjaGVyLm9uKCdldmVudCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIGhhbmRsZUVycm9yKGV2ZW50LmVycm9yLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdCVU5ETEVfU1RBUlQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc3QgZXZlbnRJbnB1dCA9IGV2ZW50LmlucHV0O1xuICAgICAgICBjb25zdCBpbnB1dEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodHlwZW9mIGV2ZW50SW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaW5wdXRGaWxlcy5wdXNoKGV2ZW50SW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlucHV0RmlsZXMucHVzaChcbiAgICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KGV2ZW50SW5wdXQpID8gZXZlbnRJbnB1dCA6IE9iamVjdC52YWx1ZXMoZXZlbnRJbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgICAgYEJ1bmRsZXMgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChpbnB1dEZpbGVzKS5qb2luKCcsICcpKX0g4oaSICR7Y2hhbGsuYm9sZChcbiAgICAgICAgICAgICAgcGF0aFRvUmVsYXRpdmVQYXRoKGV2ZW50Lm91dHB1dCkuam9pbignLCAnKVxuICAgICAgICAgICAgKX1cXG5vbiAke3BhY2thZ2VEaXJQYXRofSAuLi5gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0JVTkRMRV9FTkQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgYENyZWF0ZWQgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChldmVudC5vdXRwdXQpLmpvaW4oJywgJykpfSBpbiAke2NoYWxrLmJvbGQobXMoZXZlbnQuZHVyYXRpb24pKX1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0YXJnZXREZXRhaWwgIT09ICdhcHAtbm9kZScgJiYgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJykge1xuICAgICAgICAgIGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdFTkQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG5bJHtkYXRlVGltZSgpfV0gd2FpdGluZyBmb3IgY2hhbmdlcy4uLmApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJ3Jlc3VsdCcgaW4gZXZlbnQgJiYgZXZlbnQucmVzdWx0KSB7XG4gICAgICB2b2lkIGV2ZW50LnJlc3VsdC5jbG9zZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUlucHV0KGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LCBjd2Q6IHN0cmluZywgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGFyZ3YuaW5wdXQgJiYgYXJndi5pbnB1dC5sZW5ndGggPiAwKSByZXR1cm4gYXJndi5pbnB1dC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZShjd2QsIHAudG9TdHJpbmcoKSkpO1xuXG4gIGNvbnN0IHNyY0RpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKTtcbiAgZm9yIChjb25zdCBleHQgb2YgWyd0cycsICd0c3gnLCAnY3RzJywgJ210cyddKSB7XG4gICAgY29uc3QgaW5wdXQgPSBwYXRoLmpvaW4oc3JjRGlyUGF0aCwgYGluZGV4LiR7ZXh0fWApO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGlucHV0KSkgcmV0dXJuIFtpbnB1dF07XG4gIH1cblxuICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IGlucHV0IGZpbGUuJyk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0VGFyZ2V0RGV0YWlsKHRhcmdldENhdGVnb3J5OiBzdHJpbmcsIGlucHV0czogc3RyaW5nW10pOiBUYXJnZXREZXRhaWwge1xuICBzd2l0Y2ggKHRhcmdldENhdGVnb3J5KSB7XG4gICAgY2FzZSAnYXBwJzoge1xuICAgICAgcmV0dXJuICdhcHAtbm9kZSc7XG4gICAgfVxuICAgIGNhc2UgJ2Z1bmN0aW9ucyc6IHtcbiAgICAgIHJldHVybiAnZnVuY3Rpb25zJztcbiAgICB9XG4gICAgY2FzZSAnbGliJzoge1xuICAgICAgaWYgKGlucHV0cy5zb21lKChpbnB1dCkgPT4gaW5wdXQuZW5kc1dpdGgoJy50c3gnKSkpIHtcbiAgICAgICAgcmV0dXJuICdsaWItcmVhY3QnO1xuICAgICAgfVxuICAgICAgcmV0dXJuICdsaWInO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zb2xlLmVycm9yKCd0YXJnZXQgb3B0aW9uIG11c3QgYmUgb25lIG9mOiAnICsgYWxsVGFyZ2V0Q2F0ZWdvcmllcy5qb2luKCcsICcpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBtb2R1bGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBwYWNrYWdlSnNvbi5uYW1lICs9ICctZGlzdCc7XG4gIGNvbnN0IGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgY29uc3QgZXNtT3V0cHV0ID0gaXNFc21PdXRwdXQoZXNtUGFja2FnZSwgbW9kdWxlVHlwZSk7XG4gIHBhY2thZ2VKc29uLm1haW4gPSBlc21QYWNrYWdlID09PSBlc21PdXRwdXQgPyAnaW5kZXguanMnIDogZXNtT3V0cHV0ID8gJ2luZGV4Lm1qcycgOiAnaW5kZXguY2pzJztcblxuICAvLyBQcmV2ZW50IEZpcmViYXNlIEZ1bmN0aW9ucyBmcm9tIHJ1bm5pbmcgYGJ1aWxkYCBzY3JpcHQgc2luY2Ugd2UgYXJlIGJ1aWxkaW5nIGNvZGUgYmVmb3JlIGRlcGxveWluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIC8vIGRldkRlcGVuZGVuY2llcyBhcmUgbm90IHJlcXVpcmVkIHNpbmNlIHdlIGFyZSBidWlsZGluZyBjb2RlIGJlZm9yZSBkZXBsb3lpbmcuXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG5cbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSk7XG59XG5cbmZ1bmN0aW9uIGdldE91dHB1dE9wdGlvbnNMaXN0KFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIGlzRXNtUGFja2FnZTogYm9vbGVhblxuKTogT3V0cHV0T3B0aW9uc1tdIHtcbiAgY29uc3Qgb3V0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnKTtcbiAgaWYgKHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgICBmb3JtYXQ6IGlzRXNtT3V0cHV0KGlzRXNtUGFja2FnZSwgYXJndi5tb2R1bGVUeXBlKSA/ICdtb2R1bGUnIDogJ2NvbW1vbmpzJyxcbiAgICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCAmJiAnaW5saW5lJyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8vIFRoZSBmb2xsb3dpbmcgaW1wb3J0IHN0YXRlbWVudCBpbiBhbiBlc20gbW9kdWxlIGNhdXNlcyB0aGUgZm9sbG93aW5nIGVycm9yOlxuICAvLyBTdGF0ZW1lbnQ6XG4gIC8vICAgaW1wb3J0IHsgdXNlUHJldmlvdXMgfSBmcm9tICdyZWFjdC11c2UnO1xuICAvLyBFcnJvcjpcbiAgLy8gICBOYW1lZCBleHBvcnQgJ3VzZVByZXZpb3VzJyBub3QgZm91bmQuIFRoZSByZXF1ZXN0ZWQgbW9kdWxlICdyZWFjdC11c2UnIGlzIGEgQ29tbW9uSlMgbW9kdWxlLFxuICAvLyAgIHdoaWNoIG1heSBub3Qgc3VwcG9ydCBhbGwgbW9kdWxlLmV4cG9ydHMgYXMgbmFtZWQgZXhwb3J0cy5cbiAgLy8gV2UgbmVlZCBjanMgbW9kdWxlcyBmb3Igd2ViIGFwcHMgdG8gYXZvaWQgdGhlIGVycm9yLlxuICAvLyBBbHNvLCBzcGxpdHRpbmcgYSBsaWJyYXJ5IGlzIHVzZWZ1bCBpbiBib3RoIG1vZHVsZXMsIHNvIHByZXNlcnZlTW9kdWxlcyBzaG91bGQgYmUgdHJ1ZS5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSA9IFtdO1xuICBjb25zdCBtb2R1bGVUeXBlID0gYXJndi5tb2R1bGVUeXBlIHx8ICdib3RoJztcbiAgY29uc3QganNFeHQgPSBhcmd2LmpzRXh0ZW5zaW9uIHx8ICdlaXRoZXInO1xuICBpZiAobW9kdWxlVHlwZSA9PT0gJ2NqcycgfHwgbW9kdWxlVHlwZSA9PT0gJ2JvdGgnIHx8IChtb2R1bGVUeXBlID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSkge1xuICAgIG91dHB1dE9wdGlvbnNMaXN0LnB1c2goe1xuICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgZW50cnlGaWxlTmFtZXM6IGpzRXh0ID09PSAnYm90aCcgfHwgKGpzRXh0ID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5janMnLFxuICAgICAgZm9ybWF0OiAnY29tbW9uanMnLFxuICAgICAgcHJlc2VydmVNb2R1bGVzOiB0cnVlLFxuICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCxcbiAgICB9KTtcbiAgfVxuICBpZiAobW9kdWxlVHlwZSA9PT0gJ2VzbScgfHwgbW9kdWxlVHlwZSA9PT0gJ2JvdGgnIHx8IChtb2R1bGVUeXBlID09PSAnZWl0aGVyJyAmJiBpc0VzbVBhY2thZ2UpKSB7XG4gICAgb3V0cHV0T3B0aW9uc0xpc3QucHVzaCh7XG4gICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICBlbnRyeUZpbGVOYW1lczoganNFeHQgPT09ICdib3RoJyB8fCAoanNFeHQgPT09ICdlaXRoZXInICYmIGlzRXNtUGFja2FnZSkgPyAnW25hbWVdLmpzJyA6ICdbbmFtZV0ubWpzJyxcbiAgICAgIGZvcm1hdDogJ21vZHVsZScsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBvdXRwdXRPcHRpb25zTGlzdDtcbn1cblxuZnVuY3Rpb24gaXNFc21PdXRwdXQoaXNFc21QYWNrYWdlOiBib29sZWFuLCBtb2R1bGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG1vZHVsZVR5cGUgPT09ICdlc20nIHx8ICgoIW1vZHVsZVR5cGUgfHwgbW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicpICYmIGlzRXNtUGFja2FnZSk7XG59XG4iLCJpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBSb2xsdXBFcnJvciB9IGZyb20gJ3JvbGx1cCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVFcnJvcihlcnJvcjogUm9sbHVwRXJyb3IsIHJlY292ZXIgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zdCBuYW1lID0gZXJyb3IubmFtZSB8fCAoZXJyb3IuY2F1c2UgYXMgRXJyb3IpPy5uYW1lO1xuICBjb25zdCBuYW1lU2VjdGlvbiA9IG5hbWUgPyBgJHtuYW1lfTogYCA6ICcnO1xuICBjb25zdCBwbHVnaW5TZWN0aW9uID0gZXJyb3IucGx1Z2luID8gYChwbHVnaW4gJHtlcnJvci5wbHVnaW59KSBgIDogJyc7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgJHtwbHVnaW5TZWN0aW9ufSR7bmFtZVNlY3Rpb259JHtlcnJvci5tZXNzYWdlfWA7XG5cbiAgY29uc3Qgb3V0cHV0TGluZXMgPSBbY2hhbGsuYm9sZChjaGFsay5yZWQoYFshXSAke2NoYWxrLmJvbGQobWVzc2FnZS50b1N0cmluZygpKX1gKSldO1xuXG4gIGlmIChlcnJvci51cmwpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmN5YW4oZXJyb3IudXJsKSk7XG4gIH1cblxuICBpZiAoZXJyb3IubG9jKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChgJHtlcnJvci5sb2MuZmlsZSB8fCBlcnJvci5pZH0gKCR7ZXJyb3IubG9jLmxpbmV9OiR7ZXJyb3IubG9jLmNvbHVtbn0pYCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IuaWQpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGVycm9yLmlkKTtcbiAgfVxuXG4gIGlmIChlcnJvci5mcmFtZSkge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuZGltKGVycm9yLmZyYW1lKSk7XG4gIH1cblxuICBpZiAoZXJyb3Iuc3RhY2spIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmRpbShlcnJvci5zdGFjaz8ucmVwbGFjZShgJHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9XFxuYCwgJycpKSk7XG4gIH1cblxuICBvdXRwdXRMaW5lcy5wdXNoKCcnLCAnJyk7XG4gIGNvbnNvbGUuZXJyb3Iob3V0cHV0TGluZXMuam9pbignXFxuJykpO1xuXG4gIGlmICghcmVjb3ZlcikgcHJvY2Vzcy5leGl0KDEpO1xufVxuIiwiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uL2Vudi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsXG4gIG1vZHVsZToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtb2R1bGUgdHlwZTogY2pzIG9yIGVzbScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcnVuOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3J1biA8ZmlsZT4nLFxuICBkZXNjcmliZTogJ1J1biBzY3JpcHQnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcHJvY2Vzcy5jd2QoKSk7XG5cbiAgICBjb25zdCBmaWxlID0gYXJndi5maWxlPy50b1N0cmluZygpID8/ICcnO1xuXG4gICAgLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy91dGlsL2RldGVjdC1idW5cbiAgICBjb25zdCBpc1J1bm5pbmdPbkJ1biA9IHByb2Nlc3MudmVyc2lvbnMuYnVuO1xuICAgIGNvbnN0IHJ1bnRpbWUgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ25vZGUnO1xuICAgIGNvbnN0IGFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/IFsnLS1idW4nXSA6IFsnLS1uby13YXJuaW5ncycsICctLWltcG9ydCcsICd0c3gnXTtcbiAgICBpZiAoYXJndi53YXRjaCkge1xuICAgICAgYXJncy5wdXNoKCctLXdhdGNoJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaChmaWxlKTtcbiAgICBjb25zdCBbLCAuLi5hZGRpdGlvbmFsQXJndW1lbnRzXSA9IGFyZ3YuXztcbiAgICBjb25zdCBydW50aW1lQXJncyA9IFsuLi5hcmdzLCAuLi5hZGRpdGlvbmFsQXJndW1lbnRzLm1hcCgoYXJnKSA9PiBhcmcudG9TdHJpbmcoKSldO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyAnJHtydW50aW1lfSAke3J1bnRpbWVBcmdzLmpvaW4oJyAnKX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHJ1bnRpbWUsIHJ1bnRpbWVBcmdzLCB7XG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52IH0sXG4gICAgfSk7XG4gICAgcHJvY2Vzcy5leGl0KHJldC5zdGF0dXMgPz8gMSk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBhcHAsIGZ1bmN0aW9ucywgbGliIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZC9idWlsZC5qcyc7XG5pbXBvcnQgeyBydW4gfSBmcm9tICcuL2NvbW1hbmRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5yZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCdidWlsZC10cycpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAuY29tbWFuZChhcHApXG4gIC5jb21tYW5kKGZ1bmN0aW9ucylcbiAgLmNvbW1hbmQobGliKVxuICAuY29tbWFuZChydW4pXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuIl0sIm5hbWVzIjpbImVudlZhcnMiLCJsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUiLCJhcmd2IiwiY3dkIiwicmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMiLCJ2ZXJib3NlIiwiY29uc29sZSIsImluZm8iLCJPYmplY3QiLCJrZXlzIiwiY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uIiwiZW52VmFyc0RlZiIsImVudlZhck5hbWVzIiwiU2V0IiwiaW5saW5lIiwiZmxhdE1hcCIsImUiLCJ0b1N0cmluZyIsInNwbGl0IiwiYXV0b0lubGluZSIsIm5hbWUiLCJ1bmRlZmluZWQiLCJwcm9jZXNzIiwiZW52IiwiSlNPTiIsInN0cmluZ2lmeSIsImFsbFRhcmdldENhdGVnb3JpZXMiLCJhc3luYyIsInJlYWRQYWNrYWdlSnNvbiIsImRpclBhdGgiLCJwYWNrYWdlSnNvblBhdGgiLCJwYXRoIiwiam9pbiIsInBhY2thZ2VKc29uVGV4dCIsImZzIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsInBhcnNlIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Iiwic2lsZW50IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiYWxpYXMiLCJidWlsZGVyIiwiaW5wdXQiLCJkZWZhdWx0IiwibWluaWZ5Iiwic291cmNlbWFwIiwiZXh0ZXJuYWwiLCJ3YXRjaCIsImtlZXBJbXBvcnQiLCJidW5kbGVCdWlsdGlucyIsImFwcEJ1aWxkZXIiLCJtb2R1bGVUeXBlIiwiZnVuY3Rpb25zQnVpbGRlciIsIm9ubHlQYWNrYWdlSnNvbiIsImxpYkJ1aWxkZXIiLCJqc0V4dGVuc2lvbiIsInNldHVwUGx1Z2lucyIsInRhcmdldERldGFpbCIsInBhY2thZ2VKc29uIiwibmFtZXNwYWNlIiwicGFja2FnZURpclBhdGgiLCJvdXRwdXRPcHRpb25zTGlzdCIsImV4dGVybmFsRGVwcyIsIm1hcCIsIml0ZW0iLCJkZXBlbmRlbmNpZXMiLCJwdXNoIiwicGVlckRlcGVuZGVuY2llcyIsIm9wdGlvbmFsRGVwZW5kZW5jaWVzIiwiZXhpc3RzU3luYyIsInBhY2thZ2VEaXJzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwicGFja2FnZURpciIsImlzRGlyZWN0b3J5Iiwib3RoZXJQYWNrYWdlSnNvbiIsInJlYWRGaWxlU3luYyIsImV4dGVuc2lvbnMiLCJiYWJlbENvbmZpZ1BhdGgiLCJ1cmwiLCJmaWxlVVJMVG9QYXRoIiwiZGlybmFtZSIsInJlcGxhY2VQbHVnaW4iLCJnZXREZWZhdWx0UGx1Z2luRmFjdG9yeSIsInJlcGxhY2UiLCJqc29uUGx1Z2luIiwianNvbiIsInJlc29sdmVQbHVnaW4iLCJyZXNvbHZlIiwiY29tbW9uanNQbHVnaW4iLCJjb21tb25qcyIsInRlcnNlclBsdWdpbiIsInRlcnNlciIsImFuYWx5emVQbHVnaW4iLCJhbmFseXplIiwicGx1Z2lucyIsImRlbGltaXRlcnMiLCJwcmV2ZW50QXNzaWdubWVudCIsInZhbHVlcyIsIm5vZGVFeHRlcm5hbHMiLCJkZXBzIiwiZGV2RGVwcyIsInBlZXJEZXBzIiwib3B0RGVwcyIsImluY2x1ZGUiLCJSZWdFeHAiLCJleGNsdWRlIiwicHJlZmVyQnVpbHRpbnMiLCJpZCIsImluY2x1ZGVzIiwibW9kdWxlTmFtZXMiLCJpc0JhYmVsSGVscGVyc0J1bmRsZWQiLCJCVUlMRFRTX1VTRV9CQUJMRV9SVU5USU1FIiwiYmFiZWwiLCJjb25maWdGaWxlIiwiYmFiZWxIZWxwZXJzIiwic29tZSIsIm9wdHMiLCJwcmVzZXJ2ZU1vZHVsZXMiLCJwcmVzZXJ2ZURpcmVjdGl2ZXMiLCJzdHJpbmciLCJjb21wcmVzcyIsImRpcmVjdGl2ZXMiLCJzdW1tYXJ5T25seSIsIm1vZHVsZSIsImdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyIsImNvcmVQcm9qZWN0RGlyUGF0aCIsImNvcmVDb25maWdGaWxlIiwidHMiLCJmaW5kQ29uZmlnRmlsZSIsInN5cyIsImZpbGVFeGlzdHMiLCJFcnJvciIsInByb2plY3RzIiwib3V0RGlyIiwiYmFzZW5hbWUiLCJwYXJlbnREaXJQYXRoIiwiZGlyZW50cyIsInJlYWRkaXIiLCJkaXJlbnQiLCJwcm9qZWN0RGlyUGF0aCIsImFsbFN1Y2NlZWRlZCIsInJ1blR5cGVTY3JpcHRDb21waWxlciIsImNvbmZpZyIsInJlYWRDb25maWdGaWxlIiwiY29tcGlsZXJPcHRpb25zIiwiZGVjbGFyYXRpb24iLCJlbWl0RGVjbGFyYXRpb25Pbmx5Iiwibm9FbWl0Iiwibm9FbWl0T25FcnJvciIsImVycm9ycyIsImZpbGVOYW1lcyIsIm9wdGlvbnMiLCJwYXJzZUpzb25Db25maWdGaWxlQ29udGVudCIsInByb2dyYW0iLCJjcmVhdGVQcm9ncmFtIiwicm9vdE5hbWVzIiwiY29uZmlnRmlsZVBhcnNpbmdEaWFnbm9zdGljcyIsImRpYWdub3N0aWNzIiwiZW1pdFNraXBwZWQiLCJlbWl0IiwiYWxsRGlhZ25vc3RpY3MiLCJnZXRQcmVFbWl0RGlhZ25vc3RpY3MiLCJsZW5ndGgiLCJmb3JtYXRIb3N0IiwiZ2V0Q2Fub25pY2FsRmlsZU5hbWUiLCJnZXRDdXJyZW50RGlyZWN0b3J5IiwiZ2V0TmV3TGluZSIsIm5ld0xpbmUiLCJtZXNzYWdlIiwiZm9ybWF0RGlhZ25vc3RpY3MiLCJ3YXJuIiwiYXBwIiwiY29tbWFuZCIsImRlc2NyaWJlIiwiaGFuZGxlciIsImJ1aWxkIiwiZnVuY3Rpb25zIiwicGFja2FnZSIsImVycm9yIiwiZXhpdCIsImdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMiLCJsaWIiLCJ0YXJnZXRDYXRlZ29yeSIsIk5PREVfRU5WIiwiaW5wdXRzIiwicCIsInNyY0RpclBhdGgiLCJleHQiLCJ2ZXJpZnlJbnB1dCIsImVuZHNXaXRoIiwiZGV0ZWN0VGFyZ2V0RGV0YWlsIiwicGFja2FnZU5hbWUiLCJtYXRjaCIsImV4ZWMiLCJnZXROYW1lc3BhY2VBbmROYW1lIiwiaXNFc21QYWNrYWdlIiwiQlVJTERfVFNfQ09SRUpTIiwiQlVJTERfVFNfQ09SRUpTX1dJVEhfUFJPUE9TQUxTIiwiQlVJTERfVFNfVkVSQk9TRSIsIkJVSUxEX1RTX1RBUkdFVF9DQVRFR09SWSIsIkJVSUxEX1RTX1RBUkdFVF9ERVRBSUwiLCJvdXREaXJQYXRoIiwiZGlyIiwiZm9ybWF0IiwiaXNFc21PdXRwdXQiLCJqc0V4dCIsImVudHJ5RmlsZU5hbWVzIiwiZ2V0T3V0cHV0T3B0aW9uc0xpc3QiLCJjaGRpciIsInJtIiwicmVjdXJzaXZlIiwiZm9yY2UiLCJmcm9tRW50cmllcyIsImluZGV4IiwiZXh0bmFtZSIsImNsZWFyU2NyZWVuIiwicGF0aFRvUmVsYXRpdmVQYXRoIiwicGF0aHMiLCJBcnJheSIsImlzQXJyYXkiLCJyZWxhdGl2ZSIsIndhdGNoZXIiLCJvdXRwdXQiLCJjbG9zZSIsInJlbW92ZUxpc3RlbmVyIiwic3RkaW4iLCJjb2RlIiwib25FeGl0Iiwib24iLCJpc1RUWSIsInJlc3VtZSIsImV2ZW50IiwicmVjb3ZlciIsImNhdXNlIiwibmFtZVNlY3Rpb24iLCJwbHVnaW4iLCJvdXRwdXRMaW5lcyIsImNoYWxrIiwiYm9sZCIsInJlZCIsImN5YW4iLCJsb2MiLCJmaWxlIiwibGluZSIsImNvbHVtbiIsImZyYW1lIiwiZGltIiwic3RhY2siLCJoYW5kbGVFcnJvciIsImV2ZW50SW5wdXQiLCJpbnB1dEZpbGVzIiwiZ3JlZW4iLCJtcyIsImR1cmF0aW9uIiwiZGF0ZVRpbWUiLCJyZXN1bHQiLCJ3YXRjaFJvbGx1cCIsImJ1bmRsZSIsImJ1aWxkRmFpbGVkIiwic3RhcnRUaW1lIiwiRGF0ZSIsIm5vdyIsIl9idW5kbGUiLCJyb2xsdXAiLCJQcm9taXNlIiwiYWxsIiwid3JpdGUiLCJlc21QYWNrYWdlIiwiZXNtT3V0cHV0IiwibWFpbiIsInNjcmlwdHMiLCJkZXZEZXBlbmRlbmNpZXMiLCJta2RpciIsIndyaXRlRmlsZSIsInJ1biIsImlzUnVubmluZ09uQnVuIiwidmVyc2lvbnMiLCJidW4iLCJydW50aW1lIiwiYXJncyIsImFkZGl0aW9uYWxBcmd1bWVudHMiLCJfIiwicnVudGltZUFyZ3MiLCJhcmciLCJyZXQiLCJjaGlsZF9wcm9jZXNzIiwic3Bhd25TeW5jIiwic3RkaW8iLCJzdGF0dXMiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJ5YXJncyIsImhpZGVCaW4iLCJzY3JpcHROYW1lIiwiZGVtYW5kQ29tbWFuZCIsInN0cmljdCIsInZlcnNpb24iLCJwYWNrYWdlSnNvbkRpciIsIlVSTCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiXSwibWFwcGluZ3MiOiJ3Z0NBTUEsSUFBSUEsRUFLRyxTQUFTQyxFQUNkQyxFQUNBQyxHQVFBLE9BTktILElBQ0hBLEVBQVVJLEVBQWlDRixFQUFNQyxHQUM3Q0QsRUFBS0csU0FDUEMsUUFBUUMsS0FBSyxtQkFBb0JDLE9BQU9DLEtBQUtULEtBRzFDQSxDQUNULENBS08sU0FBU1UsRUFDZFIsRUFDQUMsR0FFQSxNQUFNUSxFQUFxQyxDQUFBLEVBQ3JDQyxFQUFjLElBQUlDLElBQUksS0FDdEJYLEVBQUtZLFFBQVUsSUFBSUMsUUFBU0MsR0FBTUEsRUFBRUMsV0FBV0MsTUFBTSxTQUNyRGhCLEVBQUtpQixXQUFhWCxPQUFPQyxLQUFLUixFQUFrQ0MsRUFBTUMsSUFBUSxLQUVwRixJQUFLLE1BQU1pQixLQUFRUixPQUNTUyxJQUF0QkMsUUFBUUMsSUFBSUgsS0FFaEJULEVBQVcsZUFBZVMsS0FBVUksS0FBS0MsVUFBVUgsUUFBUUMsSUFBSUgsS0FLakUsT0FISWxCLEVBQUtHLFNBQ1BDLFFBQVFDLEtBQUssbUJBQW9CQyxPQUFPQyxLQUFLRSxJQUV4Q0EsQ0FDVCxDQzNDTyxNQUFNZSxFQUFzQixDQUFDLE1BQU8sWUFBYSxPQ0lqREMsZUFBZUMsRUFBZ0JDLEdBQ3BDLE1BQU1DLEVBQWtCQyxFQUFLQyxLQUFLSCxFQUFTLGdCQUMzQyxJQUNFLE1BQU1JLFFBQXdCQyxFQUFHQyxTQUFTQyxTQUFTTixFQUFpQixRQUNwRSxNQUFPLENBQUNOLEtBQUthLE1BQU1KLEdBQWlDSCxFQUN0RCxDQUFFLE1BQ0EsQ0FFRixNQUFPLE1BQUNULEVBQVdTLEVBQ3JCLENDYk8sTUFBTVEsRUFBdUIsSUFDL0JDLEVBQ0hDLE9BQVEsQ0FDTkMsWUFBYSx1Q0FDYkMsS0FBTSxVQUNOQyxNQUFPLE1DTEVDLEVBQVUsSUFDbEJOLEVBQ0hPLE1BQU8sQ0FDTEosWUFDRSxrSkFDRkMsS0FBTSxRQUNOQyxNQUFPLEtBRVQsVUFBVyxDQUNURixZQUFhLHNDQUNiQyxLQUFNLFVBQ05JLFNBQVMsR0FFWCxvQkFBcUIsQ0FDbkJMLFlBQWEsNkRBQ2JDLEtBQU0sVUFDTkksU0FBUyxHQUVYQyxPQUFRLENBQ05OLFlBQWEsMENBQ2JDLEtBQU0sVUFDTkksU0FBUyxHQUVYRSxVQUFXLENBQ1RQLFlBQWEsdUNBQ2JDLEtBQU0sVUFDTkksU0FBUyxHQUVYRyxTQUFVLENBQ1JSLFlBQWEsb0NBQ2JDLEtBQU0sU0FFUjVCLE9BQVEsQ0FDTjJCLFlBQWEsdUNBQ2JDLEtBQU0sU0FFUixjQUFlLENBQ2JELFlBQWEscURBQ2JDLEtBQU0sVUFDTkksU0FBUyxHQUVYSSxNQUFPLENBQ0xULFlBQWEsdUNBQ2JDLEtBQU0sVUFDTkMsTUFBTyxLQUVUUSxXQUFZLENBQ1ZWLFlBQWEsK0NBQ2JDLEtBQU0sU0FFUlUsZUFBZ0IsQ0FDZFgsWUFBYSxnRUFDYkMsS0FBTSxVQUlHVyxFQUFhLElBQ3JCVCxFQUNIVSxXQUFZLENBQ1ZiLFlBQWEsaUNBQ2JDLEtBQU0sU0FDTkMsTUFBTyxNQUlFWSxFQUFtQixJQUMzQkYsRUFDSEcsZ0JBQWlCLENBQ2ZmLFlBQWEseUNBQ2JDLEtBQU0sWUFJR2UsRUFBYSxJQUNyQmIsRUFDSFUsV0FBWSxDQUNWYixZQUFhLHVDQUNiQyxLQUFNLFNBQ05DLE1BQU8sS0FLVGUsWUFBYSxDQUNYakIsWUFBYSx5RUFDYkMsS0FBTSxTQUNOQyxNQUFPLE1DakVKLFNBQVNnQixFQUNkekQsRUFDQTBELEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEdBRUEsTUFBTUMsRUFBZSxJQUFLL0QsRUFBSytDLFVBQVksSUFBS2lCLElBQUtDLEdBQVNBLEVBQUtsRCxZQVduRSxHQVZJNEMsRUFBWU8sZUFBZSxtQkFDN0JILEVBQWFJLEtBQUssaUJBR3BCSixFQUFhSSxRQUNSN0QsT0FBT0MsS0FBS29ELEVBQVlPLGNBQWdCLE9BQ3hDNUQsT0FBT0MsS0FBS29ELEVBQVlTLGtCQUFvQixDQUFBLE1BQzVDOUQsT0FBT0MsS0FBS29ELEVBQVlVLHNCQUF3QixDQUFBLElBR2pEckMsRUFBR3NDLFdBQVd6QyxFQUFLQyxLQUFLLEtBQU0sS0FBTSxpQkFBa0IsQ0FDeEQsTUFBTXlDLEVBQWN2QyxFQUFHd0MsWUFBWTNDLEVBQUtDLEtBQUssTUFBTyxDQUFFMkMsZUFBZSxJQUNyRSxJQUFLLE1BQU1DLEtBQWNILEVBQWEsQ0FDcEMsSUFBS0csRUFBV0MsY0FBZSxTQUUvQixNQUFNL0MsRUFBa0JDLEVBQUtDLEtBQUssS0FBTTRDLEVBQVd4RCxLQUFNLGdCQUN6RCxJQUFLYyxFQUFHc0MsV0FBVzFDLEdBQWtCLFNBRXJDLE1BQU1nRCxFQUFnQ3RELEtBQUthLE1BQU1ILEVBQUc2QyxhQUFhakQsRUFBaUIsU0FDOUUrQixFQUFZTyxlQUFlVSxFQUFpQjFELE1BQVEsS0FDdEQ2QyxFQUFhSSxRQUNSN0QsT0FBT0MsS0FBS3FFLEVBQWlCVixjQUFnQixPQUM3QzVELE9BQU9DLEtBQUtxRSxFQUFpQlIsa0JBQW9CLENBQUEsTUFDakQ5RCxPQUFPQyxLQUFLcUUsRUFBaUJQLHNCQUF3QixDQUFBLEdBRzlELENBQ0YsQ0FFQSxNQUFNUyxFQUFhLENBQUMsT0FBUSxPQUFRLE1BQU8sT0FBUSxRQUFTLE9BQVEsT0FBUSxNQUFPLFFBQzdFQyxFQUFrQmxELEVBQUtDLEtINUN0QmtELEVBQUlDLGNBQWNwRCxFQUFLcUQsUUFBUXJELEVBQUtxRCxvQkFBb0JGLE9HNENQLG9CQUNsREcsRUFBZ0JDLEVBQXdCQyxHQUN4Q0MsRUFBYUYsRUFBd0JHLEdBQ3JDQyxFQUFnQkosRUFBd0JLLEdBQ3hDQyxFQUFpQk4sRUFBd0JPLEdBQ3pDQyxFQUFlUixFQUF3QlMsR0FDdkNDLEVBQWdCVixFQUF3QlcsR0FDeENDLEVBQW9CLENBQ3hCYixFQUFjLENBR1pjLFdBQVksQ0FBQyxHQUFJLElBQ2pCQyxtQkFBbUIsRUFDbkJDLE9BQVEzRixFQUFxQ1IsRUFBTTZELEtBRXJEeUIsSUFDQWMsRUFBYyxDQUNaQyxNQUFNLEVBQ05DLFNBQVMsRUFDVEMsVUFBVSxFQUNWQyxTQUFTLEVBQ1RDLFFBQVMxQyxFQUFhQyxJQUFLOUMsR0FBUyxJQUFJd0YsT0FBTyxJQUFJeEYsZ0JBQ25EeUYsUUFBUy9DLEdBQWEsSUFBSThDLE9BQU8sTUFBTTlDLGlCQUV6QzRCLEVBQWMsQ0FDWlYsYUFDQThCLGVBQWlCQyxJQUFnQjdHLEVBQUtrRCxnQkFBZ0I0RCxTQUFTRCxLQUVqRW5CLElBQ0F6QyxFQUFXLENBQUU4RCxZQUFhL0csRUFBS2lELFlBQVllLElBQUtDLEdBQVNBLEVBQUtsRCxhQUFlLE1BRXpFaUcsRUFDYSxhQUFqQnRELEdBQWdELGNBQWpCQSxJQUFpQ0ssRUFBYStDLFNBQVMsa0JBaUJ4RixPQWhCQTFGLFFBQVFDLElBQUk0RiwwQkFBNEJELEVBQXdCLEdBQUssSUFDckVoQixFQUFRN0IsS0FDTitDLEVBQU0sQ0FDSkMsV0FBWXBDLEVBQ1pELGFBRUFzQyxhQUFjSixFQUF3QixVQUFZLFVBQ2xETCxRQUFTLGlDQUVQN0MsRUFBa0J1RCxLQUFNQyxHQUFTQSxFQUFLQyxpQkFBbUIsQ0FBQ0MsS0FBd0IsR0FDdEZDLEVBQU8sQ0FBRWhCLFFBQVMsQ0FBQyxXQUFZLGVBRTdCekcsRUFBSzZDLFFBQ1BtRCxFQUFRN0IsS0FBS3lCLEVBQWEsQ0FBRThCLFNBQVUsQ0FBRUMsWUFBWSxNQUV0RDNCLEVBQVE3QixLQUFLMkIsRUFBYyxDQUFFOEIsYUFBYSxLQUNuQzVCLENBQ1QsQ0FJQSxTQUFTWixFQUF3QnlDLEdBQy9CLE9BQU9BLEVBQU9qRixPQUNoQixDQzFHT25CLGVBQWVxRyxFQUNwQjlILEVBQ0ErSCxHQUVBLE1BQU1DLEVBQWlCQyxFQUFHQyxlQUFlSCxFQUFvQkUsRUFBR0UsSUFBSUMsWUFDcEUsSUFBS0osRUFBZ0IsTUFBTSxJQUFJSyxNQUFNLG1DQUFtQ04sTUFDcEUvSCxFQUFLRyxTQUNQQyxRQUFRQyxLQUFLLHVCQUF3QjJILEdBR3ZDLE1BQU1NLEVBQXVDLEdBQzdDLElBQUlDLEVBQVMxRyxFQUFLQyxLQUFLLE9BQVFELEVBQUsyRyxTQUFTVCxHQUFxQixPQUNsRSxHQUFJL0YsRUFBR3NDLFdBQVdpRSxHQUFTLENBQ3pCLE1BQU1FLEVBQWdCNUcsRUFBS3FELFFBQVE2QyxHQUM3QlcsUUFBZ0IxRyxFQUFHQyxTQUFTMEcsUUFBUUYsRUFBZSxDQUFFaEUsZUFBZSxJQUMxRXNELEVBQXFCbEcsRUFBSzRELFFBQVFzQyxHQUNsQyxJQUFLLE1BQU1hLEtBQVVGLEVBQVMsQ0FDNUIsSUFBS0UsRUFBT2pFLGNBQWUsU0FFM0IsTUFBTWtFLEVBQWlCaEgsRUFBSzRELFFBQVFnRCxFQUFlRyxFQUFPMUgsTUFDMUQsR0FBSTJILElBQW1CZCxFQUFvQixTQUUzQyxNQUFNWixFQUFhYyxFQUFHQyxlQUFlVyxFQUFnQlosRUFBR0UsSUFBSUMsWUFDdERHLEVBQVMxRyxFQUFLQyxLQUFLLE9BQVE4RyxFQUFPMUgsS0FBTSxPQUMxQ2lHLEdBQWNuRixFQUFHc0MsV0FBV2lFLElBQzlCRCxFQUFTbkUsS0FBSyxDQUFDMEUsRUFBZ0IxQixFQUFZb0IsR0FFL0MsQ0FDRixNQUNFQSxFQUFTLE9BRVhELEVBQVNuRSxLQUFLLENBQUM0RCxFQUFvQkMsRUFBZ0JPLElBRW5ELElBQUlPLEdBQWUsRUFDbkIsSUFBSyxNQUFPRCxFQUFnQjFCLEVBQVlvQixLQUFXRCxFQUNqRFEsSUFBaUJDLEVBQXNCL0ksRUFBTTZJLEVBQWdCMUIsRUFBWXRGLEVBQUtDLEtBQUtpRyxFQUFvQlEsSUFFekcsT0FBT08sQ0FDVCxDQUVBLFNBQVNDLEVBQ1AvSSxFQUNBNkksRUFDQTFCLEVBQ0FvQixHQUVJdkksRUFBS0csU0FDUEMsUUFBUUMsS0FBSywwQkFBMkJ3SSxFQUFnQjFCLEVBQVlvQixHQUd0RSxNQUFNUyxPQUFFQSxHQUFXZixFQUFHZ0IsZUFBZTlCLEVBQVljLEVBQUdFLElBQUlqRyxVQUN4RDhHLEVBQU9FLGdCQUFrQixJQUNwQkYsRUFBT0UsZ0JBQ1ZDLGFBQWEsRUFDYkMscUJBQXFCLEVBQ3JCQyxRQUFRLEVBQ1JDLGVBQWUsRUFDZmYsVUFFRlMsRUFBT3ZDLFFBQVUsQ0FBQyxZQUNsQixNQUFNOEMsT0FBRUEsRUFBTUMsVUFBRUEsRUFBU0MsUUFBRUEsR0FBWXhCLEVBQUd5QiwyQkFBMkJWLEVBQVFmLEVBQUdFLElBQUtVLEdBRS9FYyxFQUFVMUIsRUFBRzJCLGNBQWMsQ0FBRUgsVUFBU0ksVUFBV0wsRUFBV00sNkJBQThCUCxLQUMxRlEsWUFBRUEsRUFBV0MsWUFBRUEsR0FBZ0JMLEVBQVFNLE9BRXZDQyxFQUFpQixJQUFJakMsRUFBR2tDLHNCQUFzQlIsTUFBYUksS0FBZ0JSLEdBQ2pGLEdBQUlXLEVBQWVFLE9BQVMsRUFBRyxDQUM3QixNQUFNQyxFQUF1QyxDQUMzQ0MscUJBQXVCekksR0FBU0EsRUFDaEMwSSxvQkFBcUJ0QyxFQUFHRSxJQUFJb0Msb0JBQzVCQyxXQUFZQSxJQUFNdkMsRUFBR0UsSUFBSXNDLFNBRXJCQyxFQUFVekMsRUFBRzBDLGtCQUFrQlQsRUFBZ0JHLEdBQ3JEakssUUFBUXdLLEtBQUtGLEVBQ2YsQ0FDQSxPQUFRVixDQUNWLENDaEVPLE1BQU1hLEVBQWdFLENBQzNFQyxRQUFTLGdCQUNUQyxTQUFVLGVBQ1ZySSxRQUFTUyxFQUNUMUIsUUFBYXVKLE1BQUNoTCxHQUNMaUwsRUFBTWpMLEVBQU0sUUFJVmtMLEVBQTRFLENBQ3ZGSixRQUFTLHNCQUNUQyxTQUFVLHFDQUNWckksUUFBU1csRUFDVCxhQUFNMkgsQ0FBUWhMLEdBQ1osSUFBSUEsRUFBS3NELGdCQVNQLE9BQU8ySCxFQUFNakwsRUFBTSxhQVRLLENBQ3hCLE1BQU02RCxFQUFpQmhDLEVBQUs0RCxRQUFRekYsRUFBS21MLFNBQVNwSyxZQUFjLE1BQ3pENEMsRUFBYS9CLFNBQXlCRixFQUFnQm1DLEdBQ3hERixJQUNIdkQsUUFBUWdMLE1BQU0saUNBQWlDeEosT0FDL0NSLFFBQVFpSyxLQUFLLFVBRVRDLEVBQWdDekgsRUFBZ0JGLEVBQWEzRCxFQUFLb0QsV0FDMUUsQ0FHRixHQUdXbUksRUFBZ0UsQ0FDM0VULFFBQVMsZ0JBQ1RDLFNBQVUsa0NBQ1ZySSxRQUFTYSxFQUNUOUIsUUFBYXVKLE1BQUNoTCxHQUNMaUwsRUFBTWpMLEVBQU0sUUFJaEJ5QixlQUFld0osRUFBTWpMLEVBQXFDd0wsR0FDL0RwSyxRQUFRQyxJQUFJb0ssV0FBYSxhQUd6QixNQUFNdEwsR0FBV0gsRUFBS3NDLFFBQVV0QyxFQUFLRyxRQUMvQkYsRUFBTW1CLFFBQVFuQixNQUVkNEQsRUFBaUJoQyxFQUFLNEQsUUFBUXpGLEVBQUttTCxTQUFTcEssWUFBYyxNQUN6RDRDLEVBQWEvQixTQUF5QkYsRUFBZ0JtQyxHQUN4REYsSUFDSHZELFFBQVFnTCxNQUFNLGlDQUFpQ3hKLE9BQy9DUixRQUFRaUssS0FBSyxJQUdmdEwsRUFBa0NDLEVBQU02RCxHQUV4QyxNQUFNNkgsRUFpTFIsU0FBcUIxTCxFQUFxQ0MsRUFBYTRELEdBQ3JFLEdBQUk3RCxFQUFLMkMsT0FBUzNDLEVBQUsyQyxNQUFNeUgsT0FBUyxFQUFHLE9BQU9wSyxFQUFLMkMsTUFBTXFCLElBQUsySCxHQUFNOUosRUFBSzRELFFBQVF4RixFQUFLMEwsRUFBRTVLLGFBRTFGLE1BQU02SyxFQUFhL0osRUFBS0MsS0FBSytCLEVBQWdCLE9BQzdDLElBQUssTUFBTWdJLElBQU8sQ0FBQyxLQUFNLE1BQU8sTUFBTyxPQUFRLENBQzdDLE1BQU1sSixFQUFRZCxFQUFLQyxLQUFLOEosRUFBWSxTQUFTQyxLQUM3QyxHQUFJN0osRUFBR3NDLFdBQVczQixHQUFRLE1BQU8sQ0FBQ0EsRUFDcEMsQ0FFQXZDLFFBQVFnTCxNQUFNLGdDQUNkaEssUUFBUWlLLEtBQUssRUFDZixDQTVMaUJTLENBQVk5TCxFQUFNQyxFQUFLNEQsR0FDaENILEVBNkxSLFNBQTRCOEgsRUFBd0JFLEdBQ2xELE9BQVFGLEdBQ04sSUFBSyxNQUNILE1BQU8sV0FFVCxJQUFLLFlBQ0gsTUFBTyxZQUVULElBQUssTUFDSCxPQUFJRSxFQUFPckUsS0FBTTFFLEdBQVVBLEVBQU1vSixTQUFTLFNBQ2pDLFlBRUYsTUFFVCxRQUNFM0wsUUFBUWdMLE1BQU0saUNBQW1DNUosRUFBb0JNLEtBQUssT0FDMUVWLFFBQVFpSyxLQUFLLEdBR25CLENBaE51QlcsQ0FBbUJSLEVBQWdCRSxHQUVwRHZMLElBQ0ZDLFFBQVFDLEtBQUssUUFBU0wsR0FDdEJJLFFBQVFDLEtBQUssbUJBQW9CdUIsR0FDakN4QixRQUFRQyxLQUFLLHFCQUFzQixHQUFHcUQsTUFBaUI4SCxPQUd6RCxNQUFPNUgsR0xqRUYsU0FBNkJELEdBQ2xDLE1BQU1zSSxFQUFjdEksRUFBWXpDLE1BQU1ILFlBQWMsR0FDOUNtTCxFQUFRLGlCQUFpQkMsS0FBS0YsS0FDM0JySSxFQUFXMUMsR0FBUWdMLEdBQVMsR0FDckMsTUFBTyxDQUFDdEksRUFBVzFDLEVBQ3JCLENLNERzQmtMLENBQW9CekksR0FDbEMwSSxFQUFvQyxXQUFyQjFJLEVBQVluQixLQUU3QnhDLEVBQUssV0FDUG9CLFFBQVFDLElBQUlpTCxnQkFBa0IsSUFDckJ0TSxFQUFLLHVCQUNkb0IsUUFBUUMsSUFBSWtMLCtCQUFpQyxLQUczQ3BNLElBQ0ZpQixRQUFRQyxJQUFJbUwsaUJBQW1CLEtBRWpDcEwsUUFBUUMsSUFBSW9MLHlCQUEyQmpCLEVBQ3ZDcEssUUFBUUMsSUFBSXFMLHVCQUF5QmhKLEVBRXJDLE1BQU1JLEVBOE1SLFNBQ0U5RCxFQUNBMEQsRUFDQUcsRUFDQXdJLEdBRUEsTUFBTU0sRUFBYTlLLEVBQUtDLEtBQUsrQixFQUFnQixRQUM3QyxHQUFxQixhQUFqQkgsR0FBZ0QsY0FBakJBLEVBQ2pDLE1BQU8sQ0FDTCxDQUNFa0osSUFBS0QsRUFDTEUsT0FBUUMsRUFBWVQsRUFBY3JNLEVBQUtvRCxZQUFjLFNBQVcsV0FDaEVOLFVBQVc5QyxFQUFLOEMsV0FBYSxXQWFuQyxNQUFNZ0IsRUFBcUMsR0FDckNWLEVBQWFwRCxFQUFLb0QsWUFBYyxPQUNoQzJKLEVBQVEvTSxFQUFLd0QsYUFBZSxVQUNmLFFBQWZKLEdBQXVDLFNBQWZBLEdBQXlDLFdBQWZBLElBQTRCaUosSUFDaEZ2SSxFQUFrQkssS0FBSyxDQUNyQnlJLElBQUtELEVBQ0xLLGVBQTBCLFNBQVZELEdBQStCLFdBQVZBLElBQXVCVixFQUFnQixZQUFjLGFBQzFGUSxPQUFRLFdBQ1J0RixpQkFBaUIsRUFDakJ6RSxVQUFXOUMsRUFBSzhDLGFBR0QsUUFBZk0sR0FBdUMsU0FBZkEsR0FBeUMsV0FBZkEsR0FBMkJpSixJQUMvRXZJLEVBQWtCSyxLQUFLLENBQ3JCeUksSUFBS0QsRUFDTEssZUFBMEIsU0FBVkQsR0FBK0IsV0FBVkEsR0FBc0JWLEVBQWdCLFlBQWMsYUFDekZRLE9BQVEsU0FDUnRGLGlCQUFpQixFQUNqQnpFLFVBQVc5QyxFQUFLOEMsWUFHcEIsT0FBT2dCLENBQ1QsQ0E3UDRCbUosQ0FBcUJqTixFQUFNMEQsRUFBY0csRUFBZ0J3SSxHQUMvRWxNLEdBQ0ZDLFFBQVFDLEtBQUssaUJBQWtCeUQsR0FFQSxJQUE3QkEsRUFBa0JzRyxTQUNwQmhLLFFBQVFnTCxNQUFNLGtDQUNkaEssUUFBUWlLLEtBQUssSUFHZmpLLFFBQVE4TCxNQUFNckosU0FDUjdCLEVBQUdDLFNBQVNrTCxHQUFHdEwsRUFBS0MsS0FBSytCLEVBQWdCLFFBQVMsQ0FBRXVKLFdBQVcsRUFBTUMsT0FBTyxJQUM3RCxjQUFqQjNKLFNBQ0k0SCxFQUFnQ3pILEVBQWdCRixFQUFhM0QsRUFBS29ELFlBRzFFLE1BQU1xRyxFQUF5QixDQUM3QjlHLE1BQ21CLGNBQWpCZSxFQUNJcEQsT0FBT2dOLFlBQ0w1QixFQUFPMUgsSUFBSSxDQUFDckIsRUFBTzRLLElBQVUsQ0FBVyxJQUFWQSxFQUFjLFFBQVUxTCxFQUFLMkcsU0FBUzdGLEVBQU9kLEVBQUsyTCxRQUFRN0ssSUFBU0EsS0FFbkcrSSxFQUNOMUYsUUFBU3ZDLEVBQWF6RCxFQUFNMEQsRUFBY0MsRUFBYUMsRUFBV0MsRUFBZ0JDLEdBQ2xGZCxNQUFPaEQsRUFBS2dELE1BQVEsQ0FBRXlLLGFBQWEsUUFBVXRNLEdBR3pDdU0sRUFBc0JDLElBQ3pCQyxNQUFNQyxRQUFRRixHQUFTQSxFQUFRLENBQUNBLElBQVEzSixJQUFLMkgsR0FBTTlKLEVBQUtpTSxTQUFTakssRUFBZ0I4SCxJQUNwRixHQUFJM0wsRUFBS2dELE9BK0NYLFNBQ0VoRCxFQUNBMEQsRUFDQUcsRUFDQTRGLEVBQ0EzRixFQUNBNEosR0FFQSxNQUFNSyxFQUFVL0ssRUFBTSxJQUFLeUcsRUFBU3VFLE9BQVFsSyxJQUV0Q21LLEVBQVF4TSxVQUNaTCxRQUFROE0sZUFBZSxvQkFBcUJELEdBQzVDN00sUUFBUStNLE1BQU1ELGVBQWUsTUFBT0QsR0FDaENGLFNBQWVBLEVBQVFFLFFBQ3ZCRyxHQUFNaE4sUUFBUWlLLEtBQUsrQyxJQUV6QkMsRUFBT0osR0FDUDdNLFFBQVFrTixHQUFHLG9CQUFxQkwsR0FDM0I3TSxRQUFRK00sTUFBTUksUUFDakJuTixRQUFRK00sTUFBTUcsR0FBRyxNQUFPTCxHQUN4QjdNLFFBQVErTSxNQUFNSyxVQUdoQlQsRUFBUU8sR0FBRyxRQUFTN00sVUFDbEIsT0FBUWdOLEVBQU1MLE1BQ1osSUFBSyxTQ3BNSixTQUFxQmhELEVBQW9Cc0QsR0FBVSxHQUN4RCxNQUFNeE4sRUFBT2tLLEVBQU1sSyxNQUFTa0ssRUFBTXVELE9BQWlCek4sS0FDN0MwTixFQUFjMU4sRUFBTyxHQUFHQSxNQUFXLEdBRW5Dd0osRUFBVSxHQURNVSxFQUFNeUQsT0FBUyxXQUFXekQsRUFBTXlELFdBQWEsS0FDaENELElBQWN4RCxFQUFNVixVQUVqRG9FLEVBQWMsQ0FBQ0MsRUFBTUMsS0FBS0QsRUFBTUUsSUFBSSxPQUFPRixFQUFNQyxLQUFLdEUsRUFBUTNKLGlCQUVoRXFLLEVBQU1wRyxLQUNSOEosRUFBWTNLLEtBQUs0SyxFQUFNRyxLQUFLOUQsRUFBTXBHLE1BR2hDb0csRUFBTStELElBQ1JMLEVBQVkzSyxLQUFLLEdBQUdpSCxFQUFNK0QsSUFBSUMsTUFBUWhFLEVBQU12RSxPQUFPdUUsRUFBTStELElBQUlFLFFBQVFqRSxFQUFNK0QsSUFBSUcsV0FDdEVsRSxFQUFNdkUsSUFDZmlJLEVBQVkzSyxLQUFLaUgsRUFBTXZFLElBR3JCdUUsRUFBTW1FLE9BQ1JULEVBQVkzSyxLQUFLNEssRUFBTVMsSUFBSXBFLEVBQU1tRSxRQUcvQm5FLEVBQU1xRSxPQUNSWCxFQUFZM0ssS0FBSzRLLEVBQU1TLElBQUlwRSxFQUFNcUUsT0FBT3BLLFFBQVEsR0FBR3VKLElBQWN4RCxFQUFNVixZQUFhLE1BR3RGb0UsRUFBWTNLLEtBQUssR0FBSSxJQUNyQi9ELFFBQVFnTCxNQUFNMEQsRUFBWWhOLEtBQUssT0FFMUI0TSxHQUFTdE4sRUFBUWlLLEtBQUssRUFDN0IsQ0R1S1FxRSxDQUFZakIsRUFBTXJELE9BQU8sR0FDekIsTUFFRixJQUFLLGVBQWdCLENBQ25CLEdBQUlwTCxFQUFLc0MsT0FBUSxNQUVqQixNQUFNcU4sRUFBYWxCLEVBQU05TCxNQUNuQmlOLEVBQXVCLEdBQ0gsaUJBQWZELEVBQ1RDLEVBQVd6TCxLQUFLd0wsR0FFaEJDLEVBQVd6TCxRQUNMeUosTUFBTUMsUUFBUThCLEdBQWNBLEVBQWFyUCxPQUFPNkYsT0FBT3dKLElBRy9EdlAsUUFBUUMsS0FDTjBPLEVBQU1HLEtBQ0osV0FBV0gsRUFBTUMsS0FBS3RCLEVBQW1Ca0MsR0FBWTlOLEtBQUssWUFBWWlOLEVBQU1DLEtBQzFFdEIsRUFBbUJlLEVBQU1ULFFBQVFsTSxLQUFLLGNBQy9CK0IsVUFHYixLQUNGLENBQ0EsSUFBSyxhQUNILEdBQUk3RCxFQUFLc0MsT0FBUSxNQUVqQmxDLFFBQVFDLEtBQ04wTyxFQUFNYyxNQUNKLFdBQVdkLEVBQU1DLEtBQUt0QixFQUFtQmUsRUFBTVQsUUFBUWxNLEtBQUssYUFBYWlOLEVBQU1DLEtBQUtjLEVBQUdyQixFQUFNc0IsZUFJNUUsYUFBakJyTSxHQUFnRCxjQUFqQkEsU0FDM0JvRSxFQUF5QjlILEVBQU02RCxHQUV2QyxNQUVGLElBQUssTUFDSCxHQUFJN0QsRUFBS3NDLE9BQVEsTUFFakJsQyxRQUFRQyxLQUFLLE1BQU0yUCwrQkFLbkIsV0FBWXZCLEdBQVNBLEVBQU13QixRQUN4QnhCLEVBQU13QixPQUFPaEMsU0FHeEIsQ0ExSElpQyxDQUFZbFEsRUFBTTBELEVBQWNHLEVBQWdCNEYsRUFBUzNGLEVBQW1CNEosT0FDdkUsQ0FXTCxJQUFJeUMsRUFWQ25RLEVBQUtzQyxRQUNSbEMsUUFBUUMsS0FDTjBPLEVBQU1HLEtBQ0osV0FBV0gsRUFBTUMsS0FBS3RCLEVBQW1CaEMsR0FBUTVKLEtBQUssWUFBWWlOLEVBQU1DLEtBQ3RFdEIsRUFBbUI1SixFQUFrQkUsSUFBS3NELEdBQVNBLEVBQUs4SCxNQUFROUgsRUFBS3NGLEtBQU8sS0FBSzlLLEtBQUssY0FDL0UrQixVQU1mLElBQUl1TSxHQUFjLEVBQ2xCLElBQ0UsTUFBTUMsRUFBWUMsS0FBS0MsTUFDakJDLFFBQWdCQyxFQUFPaEgsR0FDN0IwRyxFQUFTSyxRQUNIRSxRQUFRQyxJQUFJN00sRUFBa0JFLElBQUtzRCxHQUFTa0osRUFBUUksTUFBTXRKLEtBRTNEdEgsRUFBS3NDLFFBQ1JsQyxRQUFRQyxLQUNOME8sRUFBTWMsTUFDSixXQUFXbkMsRUFBbUI1SixFQUFrQkUsSUFBS3NELEdBQVNBLEVBQUs4SCxNQUFROUgsRUFBS3NGLEtBQU8sS0FBSzlLLEtBQzFGLFlBQ01pTixFQUFNQyxLQUFLYyxFQUFHUSxLQUFLQyxNQUFRRixPQUkzQyxDQUFFLE1BQU9qRixHQUNQZ0YsR0FBYyxFQUNkaFEsUUFBUWdMLE1BQU0sMEJBQTJCQSxFQUMzQyxPQUNNK0UsR0FBUWxDLFNBQ1ZtQyxHQUFhaFAsUUFBUWlLLEtBQUssR0FHWCxhQUFqQjNILEdBQ2lCLGNBQWpCQSxTQUNRb0UsRUFBeUI5SCxFQUFNNkQsSUFFdkN6QyxRQUFRaUssS0FBSyxFQUVqQixDQUNGLENBa0hBNUosZUFBZTZKLEVBQ2J6SCxFQUNBRixFQUNBUCxHQUVBTyxFQUFZekMsTUFBUSxRQUNwQixNQUFNMlAsRUFBa0MsV0FBckJsTixFQUFZbkIsS0FDekJzTyxFQUFZaEUsRUFBWStELEVBQVl6TixHQUMxQ08sRUFBWW9OLEtBQU9GLElBQWVDLEVBQVksV0FBYUEsRUFBWSxZQUFjLG1CQUc5RW5OLEVBQVlxTixlQUVack4sRUFBWXNOLHNCQUVialAsRUFBR0MsU0FBU2lQLE1BQU1yUCxFQUFLQyxLQUFLK0IsRUFBZ0IsUUFBUyxDQUFFdUosV0FBVyxVQUNsRXBMLEVBQUdDLFNBQVNrUCxVQUFVdFAsRUFBS0MsS0FBSytCLEVBQWdCLE9BQVEsZ0JBQWlCdkMsS0FBS0MsVUFBVW9DLEdBQ2hHLENBbURBLFNBQVNtSixFQUFZVCxFQUF1QmpKLEdBQzFDLE1BQXNCLFFBQWZBLEtBQTJCQSxHQUE2QixXQUFmQSxJQUE0QmlKLENBQzlFLENFL1ZBLE1BY2ErRSxFQUFtRSxDQUM5RXRHLFFBQVMsYUFDVEMsU0FBVSxhQUNWckksUUFqQmMsSUFDWE4sRUFDSHlGLE9BQVEsQ0FDTnRGLFlBQWEsNEJBQ2JDLEtBQU0sU0FDTkMsTUFBTyxLQUVUTyxNQUFPLENBQ0xULFlBQWEsdUNBQ2JDLEtBQU0sVUFDTkMsTUFBTyxNQVFUdUksT0FBQUEsQ0FBUWhMLEdBQ05ELEVBQWtDQyxFQUFNb0IsUUFBUW5CLE9BRWhELE1BQU1tUCxFQUFPcFAsRUFBS29QLE1BQU1yTyxZQUFjLEdBR2hDc1EsRUFBaUJqUSxRQUFRa1EsU0FBU0MsSUFDbENDLEVBQVVILEVBQWlCLE1BQVEsT0FDbkNJLEVBQU9KLEVBQWlCLENBQUMsU0FBVyxDQUFDLGdCQUFpQixXQUFZLE9BQ3BFclIsRUFBS2dELE9BQ1B5TyxFQUFLdE4sS0FBSyxXQUVac04sRUFBS3ROLEtBQUtpTCxHQUNWLFVBQVlzQyxHQUF1QjFSLEVBQUsyUixFQUNsQ0MsRUFBYyxJQUFJSCxLQUFTQyxFQUFvQjFOLElBQUs2TixHQUFRQSxFQUFJOVEsYUFDbEVmLEVBQUtHLFNBQ1BDLFFBQVFDLEtBQUssWUFBWW1SLEtBQVdJLEVBQVk5UCxLQUFLLFNBRXZELE1BQU1nUSxFQUFNQyxFQUFjQyxVQUFVUixFQUFTSSxFQUFhLENBQ3hESyxNQUFPLFVBQ1A1USxJQUFLLElBQUtELFFBQVFDLE9BRXBCRCxRQUFRaUssS0FBS3lHLEVBQUlJLFFBQVUsRUFDN0IsR0NyQ0ZDLEVBQXFDL1EsUUFBUUMsV0FFdkMrUSxFQUFNQyxFQUFRalIsUUFBUXBCLE9BQ3pCc1MsV0FBVyxZQUNYN0ksUUFBUXJILEdBQ1IwSSxRQUFRRCxHQUNSQyxRQUFRSSxHQUNSSixRQUFRUyxHQUNSVCxRQUFRc0csR0FDUm1CLGdCQUNBQyxTQUNBQyxRQUdILFdBQ0UsSUFBSUMsRUFBaUI3USxFQUFLcUQsUUFBUSxJQUFJeU4sZ0JBQWdCM04sS0FBSzROLFVBQzNELE1BQVE1USxFQUFHc0MsV0FBV3pDLEVBQUtDLEtBQUs0USxFQUFnQixrQkFDOUNBLEVBQWlCN1EsRUFBS3FELFFBQVF3TixHQUtoQyxPQUhvQnBSLEtBQUthLE1BQU1ILEVBQUc2QyxhQUFhaEQsRUFBS0MsS0FBSzRRLEVBQWdCLGdCQUFpQixTQUd2RUQsT0FDckIsQ0FaV0ksSUFDUkMsT0FBTzlTIn0=
|
|
1
|
+
import e from"node:fs";import o from"node:path";import{readAndApplyEnvironmentVariables as n,yargsOptionsBuilderForEnv as s,removeNpmAndYarnEnvironmentVariables as t}from"@willbooster/shared-lib-node";import i 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*as y from"@rollup/plugin-commonjs";import*as h from"@rollup/plugin-json";import*as b from"@rollup/plugin-node-resolve";import*as j from"@rollup/plugin-replace";import*as g from"@rollup/plugin-terser";import*as v from"rollup-plugin-analyzer";import{keepImport as w}from"rollup-plugin-keep-import";import{nodeExternals as x}from"rollup-plugin-node-externals";import S from"rollup-plugin-preserve-directives";import{string as k}from"rollup-plugin-string";import $ from"node:process";import*as T from"node:child_process";import{createRequire as O}from"node:module";let D;function E(e,o){return D||(D=n(e,o),e.verbose&&console.info("Loaded env vars:",Object.keys(D))),D}function _(e,o){const n={},s=new Set([...(e.inline??[]).flatMap(e=>e.toString().split(",")),...e.autoInline?Object.keys(E(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 N=["app","functions","lib"];async function F(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 R={...s,silent:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"s"}},B={...R,input:{description:'Paths of source code files to be built. The first file is main. If no option is given, "src/index.{ts,tsx}" from package directory is targeted.',type:"array",alias:"i"},"core-js":{description:"Whether or not core-js is employed.",type:"boolean",default:!1},"core-js-proposals":{description:"Whether or not core-js with proposals support is employed.",type:"boolean",default:!1},minify:{description:"Whether or not minification is enabled.",type:"boolean",default:!0},sourcemap:{description:"Whether or not sourcemap is enabled.",type:"boolean",default:!0},external:{description:"Additional external dependencies.",type:"array"},inline:{description:"Environment variables to be inlined.",type:"array"},"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"}},I={...B,moduleType:{description:"esm, cjs, or either (default).",type:"string",alias:"m"}},L={...I,onlyPackageJson:{description:"Whether to generate only package.json.",type:"boolean"}},A={...B,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 U(n,s,t,i,r,a){const c=[...n.external??[]].map(e=>e.toString());if(t.dependencies?.["@prisma/client"]&&c.push("prisma-client"),c.push(...Object.keys(t.dependencies??{}),...Object.keys(t.peerDependencies??{}),...Object.keys(t.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 i=JSON.parse(e.readFileSync(n,"utf8"));t.dependencies?.[i.name??""]&&c.push(...Object.keys(i.dependencies??{}),...Object.keys(i.peerDependencies??{}),...Object.keys(i.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=W(j),u=W(h),$=W(b),T=W(y),O=W(g),D=W(v),E=[d({delimiters:["",""],preventAssignment:!0,values:_(n,r)}),u(),x({deps:!0,devDeps:!1,peerDeps:!0,optDeps:!0,include:c.map(e=>new RegExp(`^${e}(?:\\/.+)?`)),exclude:i&&new RegExp(`^@?${i}(?:\\/.+)?`)}),$({extensions:p,preferBuiltins:e=>!n.bundleBuiltins?.includes(e)}),T(),w({moduleNames:n.keepImport?.map(e=>e.toString())??[]})],N="app-node"===s||"functions"===s||!c.includes("@babel/runtime");return process.env.BUILDTS_USE_BABLE_RUNTIME=N?"":"1",E.push(f({configFile:l,extensions:p,babelHelpers:N?"bundled":"runtime",exclude:/^(.+\/)?node_modules\/.+$/}),...a.some(e=>e.preserveModules)?[S()]:[],k({include:["**/*.csv","**/*.txt"]})),n.minify&&E.push(O({compress:{directives:!1}})),E.push(D({summaryOnly:!0})),E}function W(e){return e.default}const J=O(import.meta.url);async function P(n,s){const t=M(s);if(!t)throw new Error(`Failed to find tsconfig.json in ${s}.`);n.verbose&&console.info("Found tsconfig.json:",t);const i=[];let r=o.join("dist",o.basename(s),"src");if(e.existsSync(r)){const n=o.dirname(s),t=await e.promises.readdir(n,{withFileTypes:!0});s=o.resolve(s);for(const r of t){if(!r.isDirectory())continue;const t=o.resolve(n,r.name);if(t===s)continue;const a=M(t),c=o.join("dist",r.name,"src");a&&e.existsSync(c)&&i.push([t,a,c])}}else r="dist";i.push([s,t,r]);let a=!0;for(const[e,t,r]of i)a&&=await C(n,e,t,o.join(s,r));return a}async function C(n,s,t,i){n.verbose&&console.info("runTypeScriptNative()",s,t,i);const r=o.dirname(t),a=o.join(r,`.build-ts-tsgo.${process.pid}.${Date.now()}.json`);try{await e.promises.writeFile(a,JSON.stringify(await async function(n,s,t){const i={declaration:!0,emitDeclarationOnly:!0,module:"NodeNext",moduleResolution:"NodeNext",noEmit:!1,noEmitOnError:!0,outDir:t,rootDir:"src"};if(await H(o.join(n,"src"))){const s=await async function(o){try{return(await e.promises.readdir(o,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}(o.join(n,"node_modules","@types"));s.includes("node")&&(i.types=s)}return{compilerOptions:i,extends:V(o.dirname(s),s),include:["src/**/*"]}}(s,t,i),void 0,2));const n=T.spawnSync(process.execPath,[G(),"-p",a],{cwd:s,stdio:"inherit"});if(n.error)throw n.error;return 0===n.status}finally{await e.promises.rm(a,{force:!0})}}function M(n){let s=o.resolve(n);for(;;){const n=o.join(s,"tsconfig.json");if(e.existsSync(n))return n;const t=o.dirname(s);if(t===s)return;s=t}}function G(){const e=J.resolve("@typescript/native-preview/package.json");return o.join(o.dirname(e),"bin","tsgo.js")}async function H(n){try{const s=await e.promises.readdir(n,{withFileTypes:!0});for(const t of s){const s=o.join(n,t.name);if(t.isDirectory()){if(await H(s))return!0}else if(/\.[cm]?tsx?$/.test(t.name)&&(await e.promises.readFile(s,"utf8")).includes("node:"))return!0}}catch{return!1}return!1}function V(e,n){const s=o.relative(e,n).replaceAll(o.sep,"/");return s.startsWith(".")?s:`./${s}`}const Y={command:"app [package]",describe:"Build an app",builder:I,handler:async e=>K(e,"app")},z={command:"functions [package]",describe:"Build a GCP/Firebase functions app",builder:L,async handler(e){if(!e.onlyPackageJson)return K(e,"functions");{const n=o.resolve(e.package?.toString()??"."),[s,t]=await F(n);s||(console.error(`Failed to parse package.json (${t}).`),process.exit(1)),await Q(n,s,e.moduleType)}}},q={command:"lib [package]",describe:"Build a Node.js / React library",builder:A,handler:async e=>K(e,"lib")};async function K(n,s){process.env.NODE_ENV||="production";const t=!n.silent&&n.verbose,i=process.cwd(),r=o.resolve(n.package?.toString()??"."),[m,f]=await F(r);m||(console.error(`Failed to parse package.json (${f}).`),process.exit(1)),E(n,r);const y=function(n,s,t){if(n.input&&n.input.length>0)return n.input.map(e=>o.resolve(s,e.toString()));const i=o.join(t,"src");for(const n of["ts","tsx","cts","mts"]){const s=o.join(i,`index.${n}`);if(e.existsSync(s))return[s]}console.error("Failed to detect input file."),process.exit(1)}(n,i,r),h=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: "+N.join(", ")),process.exit(1)}}(s,y);t&&(console.info("argv:",n),console.info("packageJsonPath:",f),console.info("Target (Category):",`${h} (${s})`));const[b]=function(e){const o=e.name?.toString()??"",n=/@([^/]+)\/(.+)/.exec(o),[,s,t]=n??[];return[s,t]}(m),j="module"===m.type;n["core-js"]?process.env.BUILD_TS_COREJS="1":n["core-js-proposals"]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS="1"),t&&(process.env.BUILD_TS_VERBOSE="1"),process.env.BUILD_TS_TARGET_CATEGORY=s,process.env.BUILD_TS_TARGET_DETAIL=h;const g=function(e,n,s,t){const i=o.join(s,"dist");if("app-node"===n||"functions"===n)return[{dir:i,format:X(t,e.moduleType)?"module":"commonjs",sourcemap:e.sourcemap&&"inline"}];const r=[],a=e.moduleType||"both",c=e.jsExtension||"either";("cjs"===a||"both"===a||"either"===a&&!t)&&r.push({dir:i,entryFileNames:"both"===c||"either"===c&&!t?"[name].js":"[name].cjs",format:"commonjs",preserveModules:!0,sourcemap:e.sourcemap});("esm"===a||"both"===a||"either"===a&&t)&&r.push({dir:i,entryFileNames:"both"===c||"either"===c&&t?"[name].js":"[name].mjs",format:"module",preserveModules:!0,sourcemap:e.sourcemap});return r}(n,h,r,j);t&&console.info("OutputOptions:",g),0===g.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"===h&&await Q(r,m,n.moduleType);const v={input:"functions"===h?Object.fromEntries(y.map((e,n)=>[0===n?"index":o.basename(e,o.extname(e)),e])):y,plugins:U(n,h,m,b,r,g),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,t,i){const r=d({...s,output:t}),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}: `:"",t=`${e.plugin?`(plugin ${e.plugin}) `:""}${s}${e.message}`,i=[a.bold(a.red(`[!] ${a.bold(t.toString())}`))];e.url&&i.push(a.cyan(e.url)),e.loc?i.push(`${e.loc.file||e.id} (${e.loc.line}:${e.loc.column})`):e.id&&i.push(e.id),e.frame&&i.push(a.dim(e.frame)),e.stack&&i.push(a.dim(e.stack?.replace(`${s}${e.message}\n`,""))),i.push("",""),console.error(i.join("\n")),o||$.exit(1)}(s.error,!0);break;case"BUNDLE_START":{if(e.silent)break;const o=s.input,t=[];"string"==typeof o?t.push(o):t.push(...Array.isArray(o)?o:Object.values(o)),console.info(a.cyan(`Bundles ${a.bold(i(t).join(", "))} → ${a.bold(i(s.output).join(", "))}\non ${n} ...`));break}case"BUNDLE_END":if(e.silent)break;console.info(a.green(`Created ${a.bold(i(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,h,r,v,g,w);else{let e;n.silent||console.info(a.cyan(`Bundles ${a.bold(w(y).join(", "))} → ${a.bold(w(g.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(g.map(e=>s.write(e))),n.silent||console.info(a.green(`Created ${w(g.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"===h||"functions"===h||await P(n,r)||process.exit(1)}}async function Q(n,s,t){s.name+="-dist";const i="module"===s.type,r=X(i,t);s.main=i===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 X(e,o){return"esm"===o||(!o||"either"===o)&&e}const Z={command:"run <file>",describe:"Run script",builder:{...R,module:{description:"A module type: cjs or esm",type:"string",alias:"m"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"}},handler(e){E(e,process.cwd());const o=e.file?.toString()??"",n=process.versions.bun,s=n?"bun":"node",t=n?["--bun"]:["--no-warnings","--import","tsx"];e.watch&&t.push("--watch"),t.push(o);const[,...i]=e._,r=[...t,...i.map(e=>e.toString())];e.verbose&&console.info(`Running '${s} ${r.join(" ")}'`);const a=T.spawnSync(s,r,{stdio:"inherit",env:{...process.env}});process.exit(a.status??1)}};t(process.env),await i(r(process.argv)).scriptName("build-ts").options(R).command(Y).command(z).command(q).command(Z).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/ICcnO1xuICBjb25zdCBtYXRjaCA9IC9AKFteL10rKVxcLyguKykvLmV4ZWMocGFja2FnZU5hbWUpO1xuICBjb25zdCBbLCBuYW1lc3BhY2UsIG5hbWVdID0gbWF0Y2ggPz8gW107XG4gIHJldHVybiBbbmFtZXNwYWNlLCBuYW1lXTtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAncycsXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmV4cG9ydCBjb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgaW5wdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRocyBvZiBzb3VyY2UgY29kZSBmaWxlcyB0byBiZSBidWlsdC4gVGhlIGZpcnN0IGZpbGUgaXMgbWFpbi4gSWYgbm8gb3B0aW9uIGlzIGdpdmVuLCBcInNyYy9pbmRleC57dHMsdHN4fVwiIGZyb20gcGFja2FnZSBkaXJlY3RvcnkgaXMgdGFyZ2V0ZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnaScsXG4gIH0sXG4gICdjb3JlLWpzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyBpcyBlbXBsb3llZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgJ2NvcmUtanMtcHJvcG9zYWxzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyB3aXRoIHByb3Bvc2FscyBzdXBwb3J0IGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBtaW5pZnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IG1pbmlmaWNhdGlvbiBpcyBlbmFibGVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIHNvdXJjZW1hcDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3Qgc291cmNlbWFwIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgZXh0ZXJuYWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgaW5saW5lOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgaW5saW5lZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdhdXRvLWlubGluZSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lubGluZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBhdCBlbnYgZmlsZXMuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICBrZWVwSW1wb3J0OiB7XG4gICAgZGVzY3JpcHRpb246ICdJZGVudGlmaWVycyB0byBiZSBrZXB0IGFzIGltcG9ydCBzdGF0ZW1lbnRzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgYnVuZGxlQnVpbHRpbnM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ01vZHVsZSBuYW1lcyBzYW1lIHdpdGggYnVpbHRpbnMgKGUuZy4sIHVuZGljaSkgdG8gYmUgYnVuZGxlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYXBwQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIG9yIGVpdGhlciAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLmFwcEJ1aWxkZXIsXG4gIG9ubHlQYWNrYWdlSnNvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBnZW5lcmF0ZSBvbmx5IHBhY2thZ2UuanNvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBsaWJCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgZWl0aGVyLCBvciBib3RoIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG4gIC8vIC5qcyBmaWxlcyBpbiBhIHBhY2thZ2Ugd2l0aCBgXCJ0eXBlXCI6IFwibW9kdWxlXCJgIGFyZSB0cmVhdGVkIGFzIGVzbS5cbiAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byB0cmVhdCB0aGVtIGFzIGNqcyBpbiB0aGUgY2FzZSB3aGVyZSBhIGNqcyBwcm9qZWN0IGltcG9ydHMgYW4gZXNtIHBhY2thZ2UuXG4gIC8vIFRvIGRlYWwgd2l0aCB0aGUgY2FzZSwgd2UgdXNlIC5janMgYW5kIC5tanMgZXh0ZW5zaW9ucyBpbnN0ZWFkIG9mIC5qcyBleHRlbnNpb24uXG4gIGpzRXh0ZW5zaW9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHVzZSAuanMgaW4gY2pzIGFuZC9vciBlc206IGVpdGhlciAoZGVmYXVsdCksIGJvdGgsIG9yIG5vbmUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2onLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQW55QnVpbGRlclR5cGUgPSB0eXBlb2YgYXBwQnVpbGRlciB8IHR5cGVvZiBmdW5jdGlvbnNCdWlsZGVyIHwgdHlwZW9mIGxpYkJ1aWxkZXI7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBiYWJlbCB9IGZyb20gJ0Byb2xsdXAvcGx1Z2luLWJhYmVsJztcbmltcG9ydCAqIGFzIGNvbW1vbmpzIGZyb20gJ0Byb2xsdXAvcGx1Z2luLWNvbW1vbmpzJztcbmltcG9ydCAqIGFzIGpzb24gZnJvbSAnQHJvbGx1cC9wbHVnaW4tanNvbic7XG5pbXBvcnQgKiBhcyByZXNvbHZlIGZyb20gJ0Byb2xsdXAvcGx1Z2luLW5vZGUtcmVzb2x2ZSc7XG5pbXBvcnQgKiBhcyByZXBsYWNlIGZyb20gJ0Byb2xsdXAvcGx1Z2luLXJlcGxhY2UnO1xuaW1wb3J0ICogYXMgdGVyc2VyIGZyb20gJ0Byb2xsdXAvcGx1Z2luLXRlcnNlcic7XG5pbXBvcnQgdHlwZSB7IE91dHB1dE9wdGlvbnMsIFBsdWdpbiB9IGZyb20gJ3JvbGx1cCc7XG5pbXBvcnQgKiBhcyBhbmFseXplIGZyb20gJ3JvbGx1cC1wbHVnaW4tYW5hbHl6ZXInO1xuaW1wb3J0IHsga2VlcEltcG9ydCB9IGZyb20gJ3JvbGx1cC1wbHVnaW4ta2VlcC1pbXBvcnQnO1xuaW1wb3J0IHsgbm9kZUV4dGVybmFscyB9IGZyb20gJ3JvbGx1cC1wbHVnaW4tbm9kZS1leHRlcm5hbHMnO1xuaW1wb3J0IHByZXNlcnZlRGlyZWN0aXZlcyBmcm9tICdyb2xsdXAtcGx1Z2luLXByZXNlcnZlLWRpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAncm9sbHVwLXBsdWdpbi1zdHJpbmcnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEJ1aWxkVHNSb290UGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwUGx1Z2lucyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sXG4gIHRhcmdldERldGFpbDogVGFyZ2V0RGV0YWlsLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdXG4pOiBQbHVnaW5bXSB7XG4gIGNvbnN0IGV4dGVybmFsRGVwcyA9IFsuLi4oYXJndi5leHRlcm5hbCA/PyBbXSldLm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKTtcbiAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydAcHJpc21hL2NsaWVudCddKSB7XG4gICAgZXh0ZXJuYWxEZXBzLnB1c2goJ3ByaXNtYS1jbGllbnQnKTtcbiAgfVxuICAvLyBTaW5jZSBgZGVwczogdHJ1ZWAgZG9lcyBub3Qgd29yayBmb3IgYGltcG9ydCBjaHVuayBmcm9tICdsb2Rhc2guY2h1bmsvaW5kZXguanMnO2BcbiAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgKTtcbiAgLy8gQWRkIGV4dGVybmFsIGRlcGVuZGVuY2llcyBmcm9tIHNpYmxpbmcgcGFja2FnZXNcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKCcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBjb25zdCBwYWNrYWdlRGlycyA9IGZzLnJlYWRkaXJTeW5jKHBhdGguam9pbignLi4nKSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcGFja2FnZURpciBvZiBwYWNrYWdlRGlycykge1xuICAgICAgaWYgKCFwYWNrYWdlRGlyLmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oJy4uJywgcGFja2FnZURpci5uYW1lLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG90aGVyUGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgICAgIGlmIChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltvdGhlclBhY2thZ2VKc29uLm5hbWUgPz8gJyddKSB7XG4gICAgICAgIGV4dGVybmFsRGVwcy5wdXNoKFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhvdGhlclBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5qc29uJywgJy5jdHMnLCAnLm10cycsICcudHMnLCAnLnRzeCddO1xuICBjb25zdCBiYWJlbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZ2V0QnVpbGRUc1Jvb3RQYXRoKCksICdiYWJlbC5jb25maWcubWpzJyk7XG4gIGNvbnN0IHJlcGxhY2VQbHVnaW4gPSBnZXREZWZhdWx0UGx1Z2luRmFjdG9yeShyZXBsYWNlKTtcbiAgY29uc3QganNvblBsdWdpbiA9IGdldERlZmF1bHRQbHVnaW5GYWN0b3J5KGpzb24pO1xuICBjb25zdCByZXNvbHZlUGx1Z2luID0gZ2V0RGVmYXVsdFBsdWdpbkZhY3RvcnkocmVzb2x2ZSk7XG4gIGNvbnN0IGNvbW1vbmpzUGx1Z2luID0gZ2V0RGVmYXVsdFBsdWdpbkZhY3RvcnkoY29tbW9uanMpO1xuICBjb25zdCB0ZXJzZXJQbHVnaW4gPSBnZXREZWZhdWx0UGx1Z2luRmFjdG9yeSh0ZXJzZXIpO1xuICBjb25zdCBhbmFseXplUGx1Z2luID0gZ2V0RGVmYXVsdFBsdWdpbkZhY3RvcnkoYW5hbHl6ZSk7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gW1xuICAgIHJlcGxhY2VQbHVnaW4oe1xuICAgICAgLy8gSWdub3JlIHdvcmQgYm91bmRhcmllcyBhbmQgcmVwbGFjZSBldmVyeSBpbnN0YW5jZSBvZiB0aGUgc3RyaW5nLlxuICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcGx1Z2lucy90cmVlL21hc3Rlci9wYWNrYWdlcy9yZXBsYWNlI3dvcmQtYm91bmRhcmllc1xuICAgICAgZGVsaW1pdGVyczogWycnLCAnJ10sXG4gICAgICBwcmV2ZW50QXNzaWdubWVudDogdHJ1ZSxcbiAgICAgIHZhbHVlczogY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICB9KSxcbiAgICBqc29uUGx1Z2luKCksXG4gICAgbm9kZUV4dGVybmFscyh7XG4gICAgICBkZXBzOiB0cnVlLFxuICAgICAgZGV2RGVwczogZmFsc2UsXG4gICAgICBwZWVyRGVwczogdHJ1ZSxcbiAgICAgIG9wdERlcHM6IHRydWUsXG4gICAgICBpbmNsdWRlOiBleHRlcm5hbERlcHMubWFwKChuYW1lKSA9PiBuZXcgUmVnRXhwKGBeJHtuYW1lfSg/OlxcXFwvLispP2ApKSxcbiAgICAgIGV4Y2x1ZGU6IG5hbWVzcGFjZSAmJiBuZXcgUmVnRXhwKGBeQD8ke25hbWVzcGFjZX0oPzpcXFxcLy4rKT9gKSxcbiAgICB9KSxcbiAgICByZXNvbHZlUGx1Z2luKHtcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICBwcmVmZXJCdWlsdGluczogKGlkOiBzdHJpbmcpID0+ICFhcmd2LmJ1bmRsZUJ1aWx0aW5zPy5pbmNsdWRlcyhpZCksXG4gICAgfSksXG4gICAgY29tbW9uanNQbHVnaW4oKSxcbiAgICBrZWVwSW1wb3J0KHsgbW9kdWxlTmFtZXM6IGFyZ3Yua2VlcEltcG9ydD8ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpID8/IFtdIH0pLFxuICBdO1xuICBjb25zdCBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPVxuICAgIHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnIHx8ICFleHRlcm5hbERlcHMuaW5jbHVkZXMoJ0BiYWJlbC9ydW50aW1lJyk7XG4gIHByb2Nlc3MuZW52LkJVSUxEVFNfVVNFX0JBQkxFX1JVTlRJTUUgPSBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPyAnJyA6ICcxJztcbiAgcGx1Z2lucy5wdXNoKFxuICAgIGJhYmVsKHtcbiAgICAgIGNvbmZpZ0ZpbGU6IGJhYmVsQ29uZmlnUGF0aCxcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICAvLyBXZSBuZWVkIGBydW50aW1lIHNpbmNlIGBidW5kbGVkYCBtYXkgYnJlYWsgZGlyZWN0b3J5IHN0cnVjdHVyZSBieSBjcmVhdGluZyBfdmlydHVhbCBkaXJlY3RvcnkuXG4gICAgICBiYWJlbEhlbHBlcnM6IGlzQmFiZWxIZWxwZXJzQnVuZGxlZCA/ICdidW5kbGVkJyA6ICdydW50aW1lJyxcbiAgICAgIGV4Y2x1ZGU6IC9eKC4rXFwvKT9ub2RlX21vZHVsZXNcXC8uKyQvLFxuICAgIH0pLFxuICAgIC4uLihvdXRwdXRPcHRpb25zTGlzdC5zb21lKChvcHRzKSA9PiBvcHRzLnByZXNlcnZlTW9kdWxlcykgPyBbcHJlc2VydmVEaXJlY3RpdmVzKCldIDogW10pLFxuICAgIHN0cmluZyh7IGluY2x1ZGU6IFsnKiovKi5jc3YnLCAnKiovKi50eHQnXSB9KVxuICApO1xuICBpZiAoYXJndi5taW5pZnkpIHtcbiAgICBwbHVnaW5zLnB1c2godGVyc2VyUGx1Z2luKHsgY29tcHJlc3M6IHsgZGlyZWN0aXZlczogZmFsc2UgfSB9KSk7XG4gIH1cbiAgcGx1Z2lucy5wdXNoKGFuYWx5emVQbHVnaW4oeyBzdW1tYXJ5T25seTogdHJ1ZSB9KSk7XG4gIHJldHVybiBwbHVnaW5zO1xufVxuXG50eXBlIFBsdWdpbkZhY3RvcnkgPSAob3B0aW9ucz86IHVua25vd24pID0+IFBsdWdpbjtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFBsdWdpbkZhY3RvcnkobW9kdWxlOiB7IGRlZmF1bHQ6IHVua25vd24gfSk6IFBsdWdpbkZhY3Rvcnkge1xuICByZXR1cm4gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luRmFjdG9yeTtcbn1cbiIsImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQW55QnVpbGRlclR5cGUgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuXG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgY29yZVByb2plY3REaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjb3JlQ29uZmlnRmlsZSA9IGZpbmRDb25maWdGaWxlKGNvcmVQcm9qZWN0RGlyUGF0aCk7XG4gIGlmICghY29yZUNvbmZpZ0ZpbGUpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgdHNjb25maWcuanNvbiBpbiAke2NvcmVQcm9qZWN0RGlyUGF0aH0uYCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0ZvdW5kIHRzY29uZmlnLmpzb246JywgY29yZUNvbmZpZ0ZpbGUpO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXVtdID0gW107XG4gIGxldCBvdXREaXIgPSBwYXRoLmpvaW4oJ2Rpc3QnLCBwYXRoLmJhc2VuYW1lKGNvcmVQcm9qZWN0RGlyUGF0aCksICdzcmMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMob3V0RGlyKSkge1xuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihwYXJlbnREaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29yZVByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvcmVQcm9qZWN0RGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgaWYgKCFkaXJlbnQuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKHBhcmVudERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGlmIChwcm9qZWN0RGlyUGF0aCA9PT0gY29yZVByb2plY3REaXJQYXRoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgY29uZmlnRmlsZSA9IGZpbmRDb25maWdGaWxlKHByb2plY3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIGRpcmVudC5uYW1lLCAnc3JjJyk7XG4gICAgICBpZiAoY29uZmlnRmlsZSAmJiBmcy5leGlzdHNTeW5jKG91dERpcikpIHtcbiAgICAgICAgcHJvamVjdHMucHVzaChbcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXREaXIgPSAnZGlzdCc7XG4gIH1cbiAgcHJvamVjdHMucHVzaChbY29yZVByb2plY3REaXJQYXRoLCBjb3JlQ29uZmlnRmlsZSwgb3V0RGlyXSk7XG5cbiAgbGV0IGFsbFN1Y2NlZWRlZCA9IHRydWU7XG4gIGZvciAoY29uc3QgW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXJdIG9mIHByb2plY3RzKSB7XG4gICAgYWxsU3VjY2VlZGVkICYmPSBhd2FpdCBydW5UeXBlU2NyaXB0TmF0aXZlKGFyZ3YsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBwYXRoLmpvaW4oY29yZVByb2plY3REaXJQYXRoLCBvdXREaXIpKTtcbiAgfVxuICByZXR1cm4gYWxsU3VjY2VlZGVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5UeXBlU2NyaXB0TmF0aXZlKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgcHJvamVjdERpclBhdGg6IHN0cmluZyxcbiAgY29uZmlnRmlsZTogc3RyaW5nLFxuICBvdXREaXI6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ3J1blR5cGVTY3JpcHROYXRpdmUoKScsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIpO1xuICB9XG5cbiAgY29uc3QgY29uZmlnRmlsZURpclBhdGggPSBwYXRoLmRpcm5hbWUoY29uZmlnRmlsZSk7XG4gIGNvbnN0IHRlbXBDb25maWdGaWxlID0gcGF0aC5qb2luKGNvbmZpZ0ZpbGVEaXJQYXRoLCBgLmJ1aWxkLXRzLXRzZ28uJHtwcm9jZXNzLnBpZH0uJHtEYXRlLm5vdygpfS5qc29uYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgdGVtcENvbmZpZ0ZpbGUsXG4gICAgICBKU09OLnN0cmluZ2lmeShhd2FpdCBjcmVhdGVUeXBlU2NyaXB0TmF0aXZlQ29uZmlnKHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIpLCB1bmRlZmluZWQsIDIpXG4gICAgKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwcm9jZXNzLmV4ZWNQYXRoLCBbZ2V0VHlwZVNjcmlwdE5hdGl2ZVBhdGgoKSwgJy1wJywgdGVtcENvbmZpZ0ZpbGVdLCB7XG4gICAgICBjd2Q6IHByb2plY3REaXJQYXRoLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LmVycm9yKSB0aHJvdyByZXQuZXJyb3I7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPT09IDA7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGVtcENvbmZpZ0ZpbGUsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHlwZVNjcmlwdE5hdGl2ZUNvbmZpZyhcbiAgcHJvamVjdERpclBhdGg6IHN0cmluZyxcbiAgY29uZmlnRmlsZTogc3RyaW5nLFxuICBvdXREaXI6IHN0cmluZ1xuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCBjb21waWxlck9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIGVtaXREZWNsYXJhdGlvbk9ubHk6IHRydWUsXG4gICAgbW9kdWxlOiAnTm9kZU5leHQnLFxuICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlTmV4dCcsXG4gICAgbm9FbWl0OiBmYWxzZSxcbiAgICBub0VtaXRPbkVycm9yOiB0cnVlLFxuICAgIG91dERpcixcbiAgICByb290RGlyOiAnc3JjJyxcbiAgfTtcbiAgaWYgKGF3YWl0IHVzZXNOb2RlUHJvdG9jb2xJbXBvcnQocGF0aC5qb2luKHByb2plY3REaXJQYXRoLCAnc3JjJykpKSB7XG4gICAgY29uc3QgdHlwZXMgPSBhd2FpdCBjb2xsZWN0VHlwZVBhY2thZ2VzKHBhdGguam9pbihwcm9qZWN0RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICdAdHlwZXMnKSk7XG4gICAgaWYgKHR5cGVzLmluY2x1ZGVzKCdub2RlJykpIHtcbiAgICAgIGNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IHR5cGVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGNvbXBpbGVyT3B0aW9ucyxcbiAgICBleHRlbmRzOiB0b1JlbGF0aXZlQ29uZmlnUGF0aChwYXRoLmRpcm5hbWUoY29uZmlnRmlsZSksIGNvbmZpZ0ZpbGUpLFxuICAgIGluY2x1ZGU6IFsnc3JjLyoqLyonXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZENvbmZpZ0ZpbGUoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4oY3VycmVudERpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZSkpIHJldHVybiBjb25maWdGaWxlO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUeXBlU2NyaXB0TmF0aXZlUGF0aCgpOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3L3BhY2thZ2UuanNvbicpO1xuICByZXR1cm4gcGF0aC5qb2luKHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpLCAnYmluJywgJ3RzZ28uanMnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXNlc05vZGVQcm90b2NvbEltcG9ydChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBpZiAoYXdhaXQgdXNlc05vZGVQcm90b2NvbEltcG9ydChjaGlsZFBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoL1xcLltjbV0/dHN4PyQvLnRlc3QoZGlyZW50Lm5hbWUpICYmIChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjaGlsZFBhdGgsICd1dGY4JykpLmluY2x1ZGVzKCdub2RlOicpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFR5cGVQYWNrYWdlcyh0eXBlUm9vdHNEaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIodHlwZVJvb3RzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIHJldHVybiBkaXJlbnRzLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSkubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUmVsYXRpdmVDb25maWdQYXRoKGZyb21EaXJQYXRoOiBzdHJpbmcsIHRvRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZnJvbURpclBhdGgsIHRvRmlsZVBhdGgpLnJlcGxhY2VBbGwocGF0aC5zZXAsICcvJyk7XG4gIHJldHVybiByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLicpID8gcmVsYXRpdmVQYXRoIDogYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgZGF0ZVRpbWUgZnJvbSAnZGF0ZS10aW1lJztcbmltcG9ydCBtcyBmcm9tICdwcmV0dHktbXMnO1xuaW1wb3J0IHR5cGUgeyBPdXRwdXRPcHRpb25zLCBSb2xsdXBCdWlsZCwgUm9sbHVwT3B0aW9ucyB9IGZyb20gJ3JvbGx1cCc7XG5pbXBvcnQgeyByb2xsdXAsIHdhdGNoIH0gZnJvbSAncm9sbHVwJztcbmltcG9ydCB0eXBlIHsgSGFuZGxlciB9IGZyb20gJ3NpZ25hbC1leGl0JztcbmltcG9ydCB7IG9uRXhpdCB9IGZyb20gJ3NpZ25hbC1leGl0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUgfSBmcm9tICcuLi8uLi9lbnYuanMnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlLCBUYXJnZXRDYXRlZ29yeSwgVGFyZ2V0RGV0YWlsIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgYWxsVGFyZ2V0Q2F0ZWdvcmllcyB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldE5hbWVzcGFjZUFuZE5hbWUsIHJlYWRQYWNrYWdlSnNvbiB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBbnlCdWlsZGVyVHlwZSwgYnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBhcHBCdWlsZGVyLCBmdW5jdGlvbnNCdWlsZGVyLCBsaWJCdWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHNldHVwUGx1Z2lucyB9IGZyb20gJy4vcGx1Z2luLmpzJztcbmltcG9ydCB7IGhhbmRsZUVycm9yIH0gZnJvbSAnLi9yb2xsdXBMb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzIH0gZnJvbSAnLi90eXBlU2NyaXB0LmpzJztcblxuZXhwb3J0IGNvbnN0IGFwcDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmd1bWVudHNUeXBlPHR5cGVvZiBhcHBCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdhcHAgW3BhY2thZ2VdJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBhbiBhcHAnLFxuICBidWlsZGVyOiBhcHBCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICByZXR1cm4gYnVpbGQoYXJndiwgJ2FwcCcpO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uczogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmd1bWVudHNUeXBlPHR5cGVvZiBmdW5jdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdmdW5jdGlvbnMgW3BhY2thZ2VdJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBhIEdDUC9GaXJlYmFzZSBmdW5jdGlvbnMgYXBwJyxcbiAgYnVpbGRlcjogZnVuY3Rpb25zQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3Yub25seVBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShhcmd2LnBhY2thZ2U/LnRvU3RyaW5nKCkgPz8gJy4nKTtcbiAgICAgIGNvbnN0IFtwYWNrYWdlSnNvbiwgcGFja2FnZUpzb25QYXRoXSA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aCk7XG4gICAgICBpZiAoIXBhY2thZ2VKc29uKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBwYWNrYWdlLmpzb24gKCR7cGFja2FnZUpzb25QYXRofSkuYCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMocGFja2FnZURpclBhdGgsIHBhY2thZ2VKc29uLCBhcmd2Lm1vZHVsZVR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVpbGQoYXJndiwgJ2Z1bmN0aW9ucycpO1xuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBsaWI6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgbGliQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGliIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYSBOb2RlLmpzIC8gUmVhY3QgbGlicmFyeScsXG4gIGJ1aWxkZXI6IGxpYkJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHJldHVybiBidWlsZChhcmd2LCAnbGliJyk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGQoYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sIHRhcmdldENhdGVnb3J5OiBUYXJnZXRDYXRlZ29yeSk6IFByb21pc2U8dm9pZD4ge1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViB8fD0gJ3Byb2R1Y3Rpb24nO1xuXG4gIC8vIGBzaWxlbnRgIGlzIHN0cm9uZ2VyIHRoYW4gYHZlcmJvc2VgLlxuICBjb25zdCB2ZXJib3NlID0gIWFyZ3Yuc2lsZW50ICYmIGFyZ3YudmVyYm9zZTtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcblxuICBjb25zdCBwYWNrYWdlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShhcmd2LnBhY2thZ2U/LnRvU3RyaW5nKCkgPz8gJy4nKTtcbiAgY29uc3QgW3BhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoKTtcbiAgaWYgKCFwYWNrYWdlSnNvbikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBwYWNrYWdlLmpzb24gKCR7cGFja2FnZUpzb25QYXRofSkuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKTtcblxuICBjb25zdCBpbnB1dHMgPSB2ZXJpZnlJbnB1dChhcmd2LCBjd2QsIHBhY2thZ2VEaXJQYXRoKTtcbiAgY29uc3QgdGFyZ2V0RGV0YWlsID0gZGV0ZWN0VGFyZ2V0RGV0YWlsKHRhcmdldENhdGVnb3J5LCBpbnB1dHMpO1xuXG4gIGlmICh2ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdhcmd2OicsIGFyZ3YpO1xuICAgIGNvbnNvbGUuaW5mbygncGFja2FnZUpzb25QYXRoOicsIHBhY2thZ2VKc29uUGF0aCk7XG4gICAgY29uc29sZS5pbmZvKCdUYXJnZXQgKENhdGVnb3J5KTonLCBgJHt0YXJnZXREZXRhaWx9ICgke3RhcmdldENhdGVnb3J5fSlgKTtcbiAgfVxuXG4gIGNvbnN0IFtuYW1lc3BhY2VdID0gZ2V0TmFtZXNwYWNlQW5kTmFtZShwYWNrYWdlSnNvbik7XG4gIGNvbnN0IGlzRXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuXG4gIGlmIChhcmd2Wydjb3JlLWpzJ10pIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19DT1JFSlMgPSAnMSc7XG4gIH0gZWxzZSBpZiAoYXJndlsnY29yZS1qcy1wcm9wb3NhbHMnXSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX0NPUkVKU19XSVRIX1BST1BPU0FMUyA9ICcxJztcbiAgfVxuXG4gIGlmICh2ZXJib3NlKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVkVSQk9TRSA9ICcxJztcbiAgfVxuICBwcm9jZXNzLmVudi5CVUlMRF9UU19UQVJHRVRfQ0FURUdPUlkgPSB0YXJnZXRDYXRlZ29yeTtcbiAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVEFSR0VUX0RFVEFJTCA9IHRhcmdldERldGFpbDtcblxuICBjb25zdCBvdXRwdXRPcHRpb25zTGlzdCA9IGdldE91dHB1dE9wdGlvbnNMaXN0KGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZURpclBhdGgsIGlzRXNtUGFja2FnZSk7XG4gIGlmICh2ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdPdXRwdXRPcHRpb25zOicsIG91dHB1dE9wdGlvbnNMaXN0KTtcbiAgfVxuICBpZiAob3V0cHV0T3B0aW9uc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRldGVjdCBvdXRwdXQgZmlsZXMuJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgcHJvY2Vzcy5jaGRpcihwYWNrYWdlRGlyUGF0aCk7XG4gIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnKSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICBpZiAodGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJykge1xuICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMocGFja2FnZURpclBhdGgsIHBhY2thZ2VKc29uLCBhcmd2Lm1vZHVsZVR5cGUpO1xuICB9XG5cbiAgY29uc3Qgb3B0aW9uczogUm9sbHVwT3B0aW9ucyA9IHtcbiAgICBpbnB1dDpcbiAgICAgIHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucydcbiAgICAgICAgPyBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBpbnB1dHMubWFwKChpbnB1dCwgaW5kZXgpID0+IFtpbmRleCA9PT0gMCA/ICdpbmRleCcgOiBwYXRoLmJhc2VuYW1lKGlucHV0LCBwYXRoLmV4dG5hbWUoaW5wdXQpKSwgaW5wdXRdKVxuICAgICAgICAgIClcbiAgICAgICAgOiBpbnB1dHMsXG4gICAgcGx1Z2luczogc2V0dXBQbHVnaW5zKGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZUpzb24sIG5hbWVzcGFjZSwgcGFja2FnZURpclBhdGgsIG91dHB1dE9wdGlvbnNMaXN0KSxcbiAgICB3YXRjaDogYXJndi53YXRjaCA/IHsgY2xlYXJTY3JlZW46IGZhbHNlIH0gOiB1bmRlZmluZWQsXG4gIH07XG5cbiAgY29uc3QgcGF0aFRvUmVsYXRpdmVQYXRoID0gKHBhdGhzOiBzdHJpbmcgfCBSZWFkb25seTxzdHJpbmdbXT4pOiBzdHJpbmdbXSA9PlxuICAgIChBcnJheS5pc0FycmF5KHBhdGhzKSA/IHBhdGhzIDogW3BhdGhzXSkubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKHBhY2thZ2VEaXJQYXRoLCBwKSk7XG4gIGlmIChhcmd2LndhdGNoKSB7XG4gICAgd2F0Y2hSb2xsdXAoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlRGlyUGF0aCwgb3B0aW9ucywgb3V0cHV0T3B0aW9uc0xpc3QsIHBhdGhUb1JlbGF0aXZlUGF0aCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgIGBCdW5kbGVzICR7Y2hhbGsuYm9sZChwYXRoVG9SZWxhdGl2ZVBhdGgoaW5wdXRzKS5qb2luKCcsICcpKX0g4oaSICR7Y2hhbGsuYm9sZChcbiAgICAgICAgICAgIHBhdGhUb1JlbGF0aXZlUGF0aChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IG9wdHMuZmlsZSB8fCBvcHRzLmRpciB8fCAnJykpLmpvaW4oJywgJylcbiAgICAgICAgICApfVxcbm9uICR7cGFja2FnZURpclBhdGh9IC4uLmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgYnVuZGxlOiBSb2xsdXBCdWlsZCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYnVpbGRGYWlsZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IF9idW5kbGUgPSBhd2FpdCByb2xsdXAob3B0aW9ucyk7XG4gICAgICBidW5kbGUgPSBfYnVuZGxlO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBfYnVuZGxlLndyaXRlKG9wdHMpKSk7XG5cbiAgICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgYENyZWF0ZWQgJHtwYXRoVG9SZWxhdGl2ZVBhdGgob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBvcHRzLmZpbGUgfHwgb3B0cy5kaXIgfHwgJycpKS5qb2luKFxuICAgICAgICAgICAgICAnLCAnXG4gICAgICAgICAgICApfSBpbiAke2NoYWxrLmJvbGQobXMoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSkpfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGJ1aWxkRmFpbGVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBidWlsZCBkdWUgdG86JywgZXJyb3IpO1xuICAgIH1cbiAgICBhd2FpdCBidW5kbGU/LmNsb3NlKCk7XG4gICAgaWYgKGJ1aWxkRmFpbGVkKSBwcm9jZXNzLmV4aXQoMSk7XG5cbiAgICBpZiAoXG4gICAgICB0YXJnZXREZXRhaWwgIT09ICdhcHAtbm9kZScgJiZcbiAgICAgIHRhcmdldERldGFpbCAhPT0gJ2Z1bmN0aW9ucycgJiZcbiAgICAgICEoYXdhaXQgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSlcbiAgICApIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2F0Y2hSb2xsdXAoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgb3B0aW9uczogUm9sbHVwT3B0aW9ucyxcbiAgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSxcbiAgcGF0aFRvUmVsYXRpdmVQYXRoOiAocGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPikgPT4gc3RyaW5nW11cbik6IHZvaWQge1xuICBjb25zdCB3YXRjaGVyID0gd2F0Y2goeyAuLi5vcHRpb25zLCBvdXRwdXQ6IG91dHB1dE9wdGlvbnNMaXN0IH0pO1xuXG4gIGNvbnN0IGNsb3NlID0gYXN5bmMgKGNvZGU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCd1bmNhdWdodEV4Y2VwdGlvbicsIGNsb3NlKTtcbiAgICBwcm9jZXNzLnN0ZGluLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbG9zZSk7XG4gICAgaWYgKHdhdGNoZXIpIGF3YWl0IHdhdGNoZXIuY2xvc2UoKTtcbiAgICBpZiAoY29kZSkgcHJvY2Vzcy5leGl0KGNvZGUpO1xuICB9O1xuICBvbkV4aXQoY2xvc2UgYXMgdW5rbm93biBhcyBIYW5kbGVyKTtcbiAgcHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCBjbG9zZSk7XG4gIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIHByb2Nlc3Muc3RkaW4ub24oJ2VuZCcsIGNsb3NlKTtcbiAgICBwcm9jZXNzLnN0ZGluLnJlc3VtZSgpO1xuICB9XG5cbiAgd2F0Y2hlci5vbignZXZlbnQnLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICBzd2l0Y2ggKGV2ZW50LmNvZGUpIHtcbiAgICAgIGNhc2UgJ0VSUk9SJzoge1xuICAgICAgICBoYW5kbGVFcnJvcihldmVudC5lcnJvciwgdHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQlVORExFX1NUQVJUJzoge1xuICAgICAgICBpZiAoYXJndi5zaWxlbnQpIGJyZWFrO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50SW5wdXQgPSBldmVudC5pbnB1dDtcbiAgICAgICAgY29uc3QgaW5wdXRGaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKHR5cGVvZiBldmVudElucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlucHV0RmlsZXMucHVzaChldmVudElucHV0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnB1dEZpbGVzLnB1c2goXG4gICAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShldmVudElucHV0KSA/IGV2ZW50SW5wdXQgOiBPYmplY3QudmFsdWVzKGV2ZW50SW5wdXQgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICAgIGBCdW5kbGVzICR7Y2hhbGsuYm9sZChwYXRoVG9SZWxhdGl2ZVBhdGgoaW5wdXRGaWxlcykuam9pbignLCAnKSl9IOKGkiAke2NoYWxrLmJvbGQoXG4gICAgICAgICAgICAgIHBhdGhUb1JlbGF0aXZlUGF0aChldmVudC5vdXRwdXQpLmpvaW4oJywgJylcbiAgICAgICAgICAgICl9XFxub24gJHtwYWNrYWdlRGlyUGF0aH0gLi4uYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdCVU5ETEVfRU5EJzoge1xuICAgICAgICBpZiAoYXJndi5zaWxlbnQpIGJyZWFrO1xuXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgIGBDcmVhdGVkICR7Y2hhbGsuYm9sZChwYXRoVG9SZWxhdGl2ZVBhdGgoZXZlbnQub3V0cHV0KS5qb2luKCcsICcpKX0gaW4gJHtjaGFsay5ib2xkKG1zKGV2ZW50LmR1cmF0aW9uKSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGFyZ2V0RGV0YWlsICE9PSAnYXBwLW5vZGUnICYmIHRhcmdldERldGFpbCAhPT0gJ2Z1bmN0aW9ucycpIHtcbiAgICAgICAgICBhd2FpdCBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoYXJndiwgcGFja2FnZURpclBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRU5EJzoge1xuICAgICAgICBpZiAoYXJndi5zaWxlbnQpIGJyZWFrO1xuXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuWyR7ZGF0ZVRpbWUoKX1dIHdhaXRpbmcgZm9yIGNoYW5nZXMuLi5gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCdyZXN1bHQnIGluIGV2ZW50ICYmIGV2ZW50LnJlc3VsdCkge1xuICAgICAgdm9pZCBldmVudC5yZXN1bHQuY2xvc2UoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlJbnB1dChhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPiwgY3dkOiBzdHJpbmcsIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmIChhcmd2LmlucHV0ICYmIGFyZ3YuaW5wdXQubGVuZ3RoID4gMCkgcmV0dXJuIGFyZ3YuaW5wdXQubWFwKChwKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBwLnRvU3RyaW5nKCkpKTtcblxuICBjb25zdCBzcmNEaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnc3JjJyk7XG4gIGZvciAoY29uc3QgZXh0IG9mIFsndHMnLCAndHN4JywgJ2N0cycsICdtdHMnXSkge1xuICAgIGNvbnN0IGlucHV0ID0gcGF0aC5qb2luKHNyY0RpclBhdGgsIGBpbmRleC4ke2V4dH1gKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhpbnB1dCkpIHJldHVybiBbaW5wdXRdO1xuICB9XG5cbiAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRldGVjdCBpbnB1dCBmaWxlLicpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdFRhcmdldERldGFpbCh0YXJnZXRDYXRlZ29yeTogc3RyaW5nLCBpbnB1dHM6IHN0cmluZ1tdKTogVGFyZ2V0RGV0YWlsIHtcbiAgc3dpdGNoICh0YXJnZXRDYXRlZ29yeSkge1xuICAgIGNhc2UgJ2FwcCc6IHtcbiAgICAgIHJldHVybiAnYXBwLW5vZGUnO1xuICAgIH1cbiAgICBjYXNlICdmdW5jdGlvbnMnOiB7XG4gICAgICByZXR1cm4gJ2Z1bmN0aW9ucyc7XG4gICAgfVxuICAgIGNhc2UgJ2xpYic6IHtcbiAgICAgIGlmIChpbnB1dHMuc29tZSgoaW5wdXQpID0+IGlucHV0LmVuZHNXaXRoKCcudHN4JykpKSB7XG4gICAgICAgIHJldHVybiAnbGliLXJlYWN0JztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnbGliJztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgY29uc29sZS5lcnJvcigndGFyZ2V0IG9wdGlvbiBtdXN0IGJlIG9uZSBvZjogJyArIGFsbFRhcmdldENhdGVnb3JpZXMuam9pbignLCAnKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMoXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgbW9kdWxlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcGFja2FnZUpzb24ubmFtZSArPSAnLWRpc3QnO1xuICBjb25zdCBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gIGNvbnN0IGVzbU91dHB1dCA9IGlzRXNtT3V0cHV0KGVzbVBhY2thZ2UsIG1vZHVsZVR5cGUpO1xuICBwYWNrYWdlSnNvbi5tYWluID0gZXNtUGFja2FnZSA9PT0gZXNtT3V0cHV0ID8gJ2luZGV4LmpzJyA6IGVzbU91dHB1dCA/ICdpbmRleC5tanMnIDogJ2luZGV4LmNqcyc7XG5cbiAgLy8gUHJldmVudCBGaXJlYmFzZSBGdW5jdGlvbnMgZnJvbSBydW5uaW5nIGBidWlsZGAgc2NyaXB0IHNpbmNlIHdlIGFyZSBidWlsZGluZyBjb2RlIGJlZm9yZSBkZXBsb3lpbmcuXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICAvLyBkZXZEZXBlbmRlbmNpZXMgYXJlIG5vdCByZXF1aXJlZCBzaW5jZSB3ZSBhcmUgYnVpbGRpbmcgY29kZSBiZWZvcmUgZGVwbG95aW5nLlxuICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuXG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JywgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbikpO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXRPcHRpb25zTGlzdChcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHRhcmdldERldGFpbDogVGFyZ2V0RGV0YWlsLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW5cbik6IE91dHB1dE9wdGlvbnNbXSB7XG4gIGNvbnN0IG91dERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0Jyk7XG4gIGlmICh0YXJnZXREZXRhaWwgPT09ICdhcHAtbm9kZScgfHwgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJykge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgICAgZm9ybWF0OiBpc0VzbU91dHB1dChpc0VzbVBhY2thZ2UsIGFyZ3YubW9kdWxlVHlwZSkgPyAnbW9kdWxlJyA6ICdjb21tb25qcycsXG4gICAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAgJiYgJ2lubGluZScsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICAvLyBUaGUgZm9sbG93aW5nIGltcG9ydCBzdGF0ZW1lbnQgaW4gYW4gZXNtIG1vZHVsZSBjYXVzZXMgdGhlIGZvbGxvd2luZyBlcnJvcjpcbiAgLy8gU3RhdGVtZW50OlxuICAvLyAgIGltcG9ydCB7IHVzZVByZXZpb3VzIH0gZnJvbSAncmVhY3QtdXNlJztcbiAgLy8gRXJyb3I6XG4gIC8vICAgTmFtZWQgZXhwb3J0ICd1c2VQcmV2aW91cycgbm90IGZvdW5kLiBUaGUgcmVxdWVzdGVkIG1vZHVsZSAncmVhY3QtdXNlJyBpcyBhIENvbW1vbkpTIG1vZHVsZSxcbiAgLy8gICB3aGljaCBtYXkgbm90IHN1cHBvcnQgYWxsIG1vZHVsZS5leHBvcnRzIGFzIG5hbWVkIGV4cG9ydHMuXG4gIC8vIFdlIG5lZWQgY2pzIG1vZHVsZXMgZm9yIHdlYiBhcHBzIHRvIGF2b2lkIHRoZSBlcnJvci5cbiAgLy8gQWxzbywgc3BsaXR0aW5nIGEgbGlicmFyeSBpcyB1c2VmdWwgaW4gYm90aCBtb2R1bGVzLCBzbyBwcmVzZXJ2ZU1vZHVsZXMgc2hvdWxkIGJlIHRydWUuXG4gIGNvbnN0IG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW10gPSBbXTtcbiAgY29uc3QgbW9kdWxlVHlwZSA9IGFyZ3YubW9kdWxlVHlwZSB8fCAnYm90aCc7XG4gIGNvbnN0IGpzRXh0ID0gYXJndi5qc0V4dGVuc2lvbiB8fCAnZWl0aGVyJztcbiAgaWYgKG1vZHVsZVR5cGUgPT09ICdjanMnIHx8IG1vZHVsZVR5cGUgPT09ICdib3RoJyB8fCAobW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicgJiYgIWlzRXNtUGFja2FnZSkpIHtcbiAgICBvdXRwdXRPcHRpb25zTGlzdC5wdXNoKHtcbiAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgIGVudHJ5RmlsZU5hbWVzOiBqc0V4dCA9PT0gJ2JvdGgnIHx8IChqc0V4dCA9PT0gJ2VpdGhlcicgJiYgIWlzRXNtUGFja2FnZSkgPyAnW25hbWVdLmpzJyA6ICdbbmFtZV0uY2pzJyxcbiAgICAgIGZvcm1hdDogJ2NvbW1vbmpzJyxcbiAgICAgIHByZXNlcnZlTW9kdWxlczogdHJ1ZSxcbiAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAsXG4gICAgfSk7XG4gIH1cbiAgaWYgKG1vZHVsZVR5cGUgPT09ICdlc20nIHx8IG1vZHVsZVR5cGUgPT09ICdib3RoJyB8fCAobW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicgJiYgaXNFc21QYWNrYWdlKSkge1xuICAgIG91dHB1dE9wdGlvbnNMaXN0LnB1c2goe1xuICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgZW50cnlGaWxlTmFtZXM6IGpzRXh0ID09PSAnYm90aCcgfHwgKGpzRXh0ID09PSAnZWl0aGVyJyAmJiBpc0VzbVBhY2thZ2UpID8gJ1tuYW1lXS5qcycgOiAnW25hbWVdLm1qcycsXG4gICAgICBmb3JtYXQ6ICdtb2R1bGUnLFxuICAgICAgcHJlc2VydmVNb2R1bGVzOiB0cnVlLFxuICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gb3V0cHV0T3B0aW9uc0xpc3Q7XG59XG5cbmZ1bmN0aW9uIGlzRXNtT3V0cHV0KGlzRXNtUGFja2FnZTogYm9vbGVhbiwgbW9kdWxlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBtb2R1bGVUeXBlID09PSAnZXNtJyB8fCAoKCFtb2R1bGVUeXBlIHx8IG1vZHVsZVR5cGUgPT09ICdlaXRoZXInKSAmJiBpc0VzbVBhY2thZ2UpO1xufVxuIiwiaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUm9sbHVwRXJyb3IgfSBmcm9tICdyb2xsdXAnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyb3I6IFJvbGx1cEVycm9yLCByZWNvdmVyID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc3QgbmFtZSA9IGVycm9yLm5hbWUgfHwgKGVycm9yLmNhdXNlIGFzIEVycm9yKT8ubmFtZTtcbiAgY29uc3QgbmFtZVNlY3Rpb24gPSBuYW1lID8gYCR7bmFtZX06IGAgOiAnJztcbiAgY29uc3QgcGx1Z2luU2VjdGlvbiA9IGVycm9yLnBsdWdpbiA/IGAocGx1Z2luICR7ZXJyb3IucGx1Z2lufSkgYCA6ICcnO1xuICBjb25zdCBtZXNzYWdlID0gYCR7cGx1Z2luU2VjdGlvbn0ke25hbWVTZWN0aW9ufSR7ZXJyb3IubWVzc2FnZX1gO1xuXG4gIGNvbnN0IG91dHB1dExpbmVzID0gW2NoYWxrLmJvbGQoY2hhbGsucmVkKGBbIV0gJHtjaGFsay5ib2xkKG1lc3NhZ2UudG9TdHJpbmcoKSl9YCkpXTtcblxuICBpZiAoZXJyb3IudXJsKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChjaGFsay5jeWFuKGVycm9yLnVybCkpO1xuICB9XG5cbiAgaWYgKGVycm9yLmxvYykge1xuICAgIG91dHB1dExpbmVzLnB1c2goYCR7ZXJyb3IubG9jLmZpbGUgfHwgZXJyb3IuaWR9ICgke2Vycm9yLmxvYy5saW5lfToke2Vycm9yLmxvYy5jb2x1bW59KWApO1xuICB9IGVsc2UgaWYgKGVycm9yLmlkKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChlcnJvci5pZCk7XG4gIH1cblxuICBpZiAoZXJyb3IuZnJhbWUpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmRpbShlcnJvci5mcmFtZSkpO1xuICB9XG5cbiAgaWYgKGVycm9yLnN0YWNrKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChjaGFsay5kaW0oZXJyb3Iuc3RhY2s/LnJlcGxhY2UoYCR7bmFtZVNlY3Rpb259JHtlcnJvci5tZXNzYWdlfVxcbmAsICcnKSkpO1xuICB9XG5cbiAgb3V0cHV0TGluZXMucHVzaCgnJywgJycpO1xuICBjb25zb2xlLmVycm9yKG91dHB1dExpbmVzLmpvaW4oJ1xcbicpKTtcblxuICBpZiAoIXJlY292ZXIpIHByb2Nlc3MuZXhpdCgxKTtcbn1cbiIsImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUgfSBmcm9tICcuLi9lbnYuanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLFxuICBtb2R1bGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbW9kdWxlIHR5cGU6IGNqcyBvciBlc20nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJ1bjogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdydW4gPGZpbGU+JyxcbiAgZGVzY3JpYmU6ICdSdW4gc2NyaXB0JyxcbiAgYnVpbGRlcixcbiAgaGFuZGxlcihhcmd2KSB7XG4gICAgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIHByb2Nlc3MuY3dkKCkpO1xuXG4gICAgY29uc3QgZmlsZSA9IGFyZ3YuZmlsZT8udG9TdHJpbmcoKSA/PyAnJztcblxuICAgIC8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gICAgY29uc3QgaXNSdW5uaW5nT25CdW4gPSBwcm9jZXNzLnZlcnNpb25zLmJ1bjtcbiAgICBjb25zdCBydW50aW1lID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuJyA6ICdub2RlJztcbiAgICBjb25zdCBhcmdzID0gaXNSdW5uaW5nT25CdW4gPyBbJy0tYnVuJ10gOiBbJy0tbm8td2FybmluZ3MnLCAnLS1pbXBvcnQnLCAndHN4J107XG4gICAgaWYgKGFyZ3Yud2F0Y2gpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS13YXRjaCcpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goZmlsZSk7XG4gICAgY29uc3QgWywgLi4uYWRkaXRpb25hbEFyZ3VtZW50c10gPSBhcmd2Ll87XG4gICAgY29uc3QgcnVudGltZUFyZ3MgPSBbLi4uYXJncywgLi4uYWRkaXRpb25hbEFyZ3VtZW50cy5tYXAoKGFyZykgPT4gYXJnLnRvU3RyaW5nKCkpXTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgJyR7cnVudGltZX0gJHtydW50aW1lQXJncy5qb2luKCcgJyl9J2ApO1xuICAgIH1cbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhydW50aW1lLCBydW50aW1lQXJncywge1xuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiB9LFxuICAgIH0pO1xuICAgIHByb2Nlc3MuZXhpdChyZXQuc3RhdHVzID8/IDEpO1xuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYXBwLCBmdW5jdGlvbnMsIGxpYiB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGQuanMnO1xuaW1wb3J0IHsgcnVuIH0gZnJvbSAnLi9jb21tYW5kcy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxucmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnYnVpbGQtdHMnKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLmNvbW1hbmQoYXBwKVxuICAuY29tbWFuZChmdW5jdGlvbnMpXG4gIC5jb21tYW5kKGxpYilcbiAgLmNvbW1hbmQocnVuKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cbiJdLCJuYW1lcyI6WyJlbnZWYXJzIiwibG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIiwiYXJndiIsImN3ZCIsInJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIiwidmVyYm9zZSIsImNvbnNvbGUiLCJpbmZvIiwiT2JqZWN0Iiwia2V5cyIsImNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiIsImVudlZhcnNEZWYiLCJlbnZWYXJOYW1lcyIsIlNldCIsImlubGluZSIsImZsYXRNYXAiLCJlIiwidG9TdHJpbmciLCJzcGxpdCIsImF1dG9JbmxpbmUiLCJuYW1lIiwidW5kZWZpbmVkIiwicHJvY2VzcyIsImVudiIsIkpTT04iLCJzdHJpbmdpZnkiLCJhbGxUYXJnZXRDYXRlZ29yaWVzIiwiYXN5bmMiLCJyZWFkUGFja2FnZUpzb24iLCJkaXJQYXRoIiwicGFja2FnZUpzb25QYXRoIiwicGF0aCIsImpvaW4iLCJwYWNrYWdlSnNvblRleHQiLCJmcyIsInByb21pc2VzIiwicmVhZEZpbGUiLCJwYXJzZSIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwieWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiIsInNpbGVudCIsImRlc2NyaXB0aW9uIiwidHlwZSIsImFsaWFzIiwiYnVpbGRlciIsImlucHV0IiwiZGVmYXVsdCIsIm1pbmlmeSIsInNvdXJjZW1hcCIsImV4dGVybmFsIiwid2F0Y2giLCJrZWVwSW1wb3J0IiwiYnVuZGxlQnVpbHRpbnMiLCJhcHBCdWlsZGVyIiwibW9kdWxlVHlwZSIsImZ1bmN0aW9uc0J1aWxkZXIiLCJvbmx5UGFja2FnZUpzb24iLCJsaWJCdWlsZGVyIiwianNFeHRlbnNpb24iLCJzZXR1cFBsdWdpbnMiLCJ0YXJnZXREZXRhaWwiLCJwYWNrYWdlSnNvbiIsIm5hbWVzcGFjZSIsInBhY2thZ2VEaXJQYXRoIiwib3V0cHV0T3B0aW9uc0xpc3QiLCJleHRlcm5hbERlcHMiLCJtYXAiLCJpdGVtIiwiZGVwZW5kZW5jaWVzIiwicHVzaCIsInBlZXJEZXBlbmRlbmNpZXMiLCJvcHRpb25hbERlcGVuZGVuY2llcyIsImV4aXN0c1N5bmMiLCJwYWNrYWdlRGlycyIsInJlYWRkaXJTeW5jIiwid2l0aEZpbGVUeXBlcyIsInBhY2thZ2VEaXIiLCJpc0RpcmVjdG9yeSIsIm90aGVyUGFja2FnZUpzb24iLCJyZWFkRmlsZVN5bmMiLCJleHRlbnNpb25zIiwiYmFiZWxDb25maWdQYXRoIiwidXJsIiwiZmlsZVVSTFRvUGF0aCIsImRpcm5hbWUiLCJyZXBsYWNlUGx1Z2luIiwiZ2V0RGVmYXVsdFBsdWdpbkZhY3RvcnkiLCJyZXBsYWNlIiwianNvblBsdWdpbiIsImpzb24iLCJyZXNvbHZlUGx1Z2luIiwicmVzb2x2ZSIsImNvbW1vbmpzUGx1Z2luIiwiY29tbW9uanMiLCJ0ZXJzZXJQbHVnaW4iLCJ0ZXJzZXIiLCJhbmFseXplUGx1Z2luIiwiYW5hbHl6ZSIsInBsdWdpbnMiLCJkZWxpbWl0ZXJzIiwicHJldmVudEFzc2lnbm1lbnQiLCJ2YWx1ZXMiLCJub2RlRXh0ZXJuYWxzIiwiZGVwcyIsImRldkRlcHMiLCJwZWVyRGVwcyIsIm9wdERlcHMiLCJpbmNsdWRlIiwiUmVnRXhwIiwiZXhjbHVkZSIsInByZWZlckJ1aWx0aW5zIiwiaWQiLCJpbmNsdWRlcyIsIm1vZHVsZU5hbWVzIiwiaXNCYWJlbEhlbHBlcnNCdW5kbGVkIiwiQlVJTERUU19VU0VfQkFCTEVfUlVOVElNRSIsImJhYmVsIiwiY29uZmlnRmlsZSIsImJhYmVsSGVscGVycyIsInNvbWUiLCJvcHRzIiwicHJlc2VydmVNb2R1bGVzIiwicHJlc2VydmVEaXJlY3RpdmVzIiwic3RyaW5nIiwiY29tcHJlc3MiLCJkaXJlY3RpdmVzIiwic3VtbWFyeU9ubHkiLCJtb2R1bGUiLCJyZXF1aXJlIiwiY3JlYXRlUmVxdWlyZSIsImdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyIsImNvcmVQcm9qZWN0RGlyUGF0aCIsImNvcmVDb25maWdGaWxlIiwiZmluZENvbmZpZ0ZpbGUiLCJFcnJvciIsInByb2plY3RzIiwib3V0RGlyIiwiYmFzZW5hbWUiLCJwYXJlbnREaXJQYXRoIiwiZGlyZW50cyIsInJlYWRkaXIiLCJkaXJlbnQiLCJwcm9qZWN0RGlyUGF0aCIsImFsbFN1Y2NlZWRlZCIsInJ1blR5cGVTY3JpcHROYXRpdmUiLCJjb25maWdGaWxlRGlyUGF0aCIsInRlbXBDb25maWdGaWxlIiwicGlkIiwiRGF0ZSIsIm5vdyIsIndyaXRlRmlsZSIsImNvbXBpbGVyT3B0aW9ucyIsImRlY2xhcmF0aW9uIiwiZW1pdERlY2xhcmF0aW9uT25seSIsIm1vZHVsZVJlc29sdXRpb24iLCJub0VtaXQiLCJub0VtaXRPbkVycm9yIiwicm9vdERpciIsInVzZXNOb2RlUHJvdG9jb2xJbXBvcnQiLCJ0eXBlcyIsInR5cGVSb290c0RpclBhdGgiLCJmaWx0ZXIiLCJjb2xsZWN0VHlwZVBhY2thZ2VzIiwiZXh0ZW5kcyIsInRvUmVsYXRpdmVDb25maWdQYXRoIiwiY3JlYXRlVHlwZVNjcmlwdE5hdGl2ZUNvbmZpZyIsInJldCIsImNoaWxkX3Byb2Nlc3MiLCJzcGF3blN5bmMiLCJleGVjUGF0aCIsImdldFR5cGVTY3JpcHROYXRpdmVQYXRoIiwic3RkaW8iLCJlcnJvciIsInN0YXR1cyIsInJtIiwiZm9yY2UiLCJjdXJyZW50RGlyUGF0aCIsImNoaWxkUGF0aCIsInRlc3QiLCJmcm9tRGlyUGF0aCIsInRvRmlsZVBhdGgiLCJyZWxhdGl2ZVBhdGgiLCJyZWxhdGl2ZSIsInJlcGxhY2VBbGwiLCJzZXAiLCJzdGFydHNXaXRoIiwiYXBwIiwiY29tbWFuZCIsImRlc2NyaWJlIiwiaGFuZGxlciIsImJ1aWxkIiwiZnVuY3Rpb25zIiwicGFja2FnZSIsImV4aXQiLCJnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zIiwibGliIiwidGFyZ2V0Q2F0ZWdvcnkiLCJOT0RFX0VOViIsImlucHV0cyIsImxlbmd0aCIsInAiLCJzcmNEaXJQYXRoIiwiZXh0IiwidmVyaWZ5SW5wdXQiLCJlbmRzV2l0aCIsImRldGVjdFRhcmdldERldGFpbCIsInBhY2thZ2VOYW1lIiwibWF0Y2giLCJleGVjIiwiZ2V0TmFtZXNwYWNlQW5kTmFtZSIsImlzRXNtUGFja2FnZSIsIkJVSUxEX1RTX0NPUkVKUyIsIkJVSUxEX1RTX0NPUkVKU19XSVRIX1BST1BPU0FMUyIsIkJVSUxEX1RTX1ZFUkJPU0UiLCJCVUlMRF9UU19UQVJHRVRfQ0FURUdPUlkiLCJCVUlMRF9UU19UQVJHRVRfREVUQUlMIiwib3V0RGlyUGF0aCIsImRpciIsImZvcm1hdCIsImlzRXNtT3V0cHV0IiwianNFeHQiLCJlbnRyeUZpbGVOYW1lcyIsImdldE91dHB1dE9wdGlvbnNMaXN0IiwiY2hkaXIiLCJyZWN1cnNpdmUiLCJvcHRpb25zIiwiZnJvbUVudHJpZXMiLCJpbmRleCIsImV4dG5hbWUiLCJjbGVhclNjcmVlbiIsInBhdGhUb1JlbGF0aXZlUGF0aCIsInBhdGhzIiwiQXJyYXkiLCJpc0FycmF5Iiwid2F0Y2hlciIsIm91dHB1dCIsImNsb3NlIiwicmVtb3ZlTGlzdGVuZXIiLCJzdGRpbiIsImNvZGUiLCJvbkV4aXQiLCJvbiIsImlzVFRZIiwicmVzdW1lIiwiZXZlbnQiLCJyZWNvdmVyIiwiY2F1c2UiLCJuYW1lU2VjdGlvbiIsIm1lc3NhZ2UiLCJwbHVnaW4iLCJvdXRwdXRMaW5lcyIsImNoYWxrIiwiYm9sZCIsInJlZCIsImN5YW4iLCJsb2MiLCJmaWxlIiwibGluZSIsImNvbHVtbiIsImZyYW1lIiwiZGltIiwic3RhY2siLCJoYW5kbGVFcnJvciIsImV2ZW50SW5wdXQiLCJpbnB1dEZpbGVzIiwiZ3JlZW4iLCJtcyIsImR1cmF0aW9uIiwiZGF0ZVRpbWUiLCJyZXN1bHQiLCJ3YXRjaFJvbGx1cCIsImJ1bmRsZSIsImJ1aWxkRmFpbGVkIiwic3RhcnRUaW1lIiwiX2J1bmRsZSIsInJvbGx1cCIsIlByb21pc2UiLCJhbGwiLCJ3cml0ZSIsImVzbVBhY2thZ2UiLCJlc21PdXRwdXQiLCJtYWluIiwic2NyaXB0cyIsImRldkRlcGVuZGVuY2llcyIsIm1rZGlyIiwicnVuIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsInJ1bnRpbWUiLCJhcmdzIiwiYWRkaXRpb25hbEFyZ3VtZW50cyIsIl8iLCJydW50aW1lQXJncyIsImFyZyIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyIsInlhcmdzIiwiaGlkZUJpbiIsInNjcmlwdE5hbWUiLCJkZW1hbmRDb21tYW5kIiwic3RyaWN0IiwidmVyc2lvbiIsInBhY2thZ2VKc29uRGlyIiwiVVJMIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwiaGVscCJdLCJtYXBwaW5ncyI6IjBoQ0FNQSxJQUFJQSxFQUtHLFNBQVNDLEVBQ2RDLEVBQ0FDLEdBUUEsT0FOS0gsSUFDSEEsRUFBVUksRUFBaUNGLEVBQU1DLEdBQzdDRCxFQUFLRyxTQUNQQyxRQUFRQyxLQUFLLG1CQUFvQkMsT0FBT0MsS0FBS1QsS0FHMUNBLENBQ1QsQ0FLTyxTQUFTVSxFQUNkUixFQUNBQyxHQUVBLE1BQU1RLEVBQXFDLENBQUEsRUFDckNDLEVBQWMsSUFBSUMsSUFBSSxLQUN0QlgsRUFBS1ksUUFBVSxJQUFJQyxRQUFTQyxHQUFNQSxFQUFFQyxXQUFXQyxNQUFNLFNBQ3JEaEIsRUFBS2lCLFdBQWFYLE9BQU9DLEtBQUtSLEVBQWtDQyxFQUFNQyxJQUFRLEtBRXBGLElBQUssTUFBTWlCLEtBQVFSLE9BQ1NTLElBQXRCQyxRQUFRQyxJQUFJSCxLQUVoQlQsRUFBVyxlQUFlUyxLQUFVSSxLQUFLQyxVQUFVSCxRQUFRQyxJQUFJSCxLQUtqRSxPQUhJbEIsRUFBS0csU0FDUEMsUUFBUUMsS0FBSyxtQkFBb0JDLE9BQU9DLEtBQUtFLElBRXhDQSxDQUNULENDM0NPLE1BQU1lLEVBQXNCLENBQUMsTUFBTyxZQUFhLE9DSWpEQyxlQUFlQyxFQUFnQkMsR0FDcEMsTUFBTUMsRUFBa0JDLEVBQUtDLEtBQUtILEVBQVMsZ0JBQzNDLElBQ0UsTUFBTUksUUFBd0JDLEVBQUdDLFNBQVNDLFNBQVNOLEVBQWlCLFFBQ3BFLE1BQU8sQ0FBQ04sS0FBS2EsTUFBTUosR0FBaUNILEVBQ3RELENBQUUsTUFDQSxDQUVGLE1BQU8sTUFBQ1QsRUFBV1MsRUFDckIsQ0NiTyxNQUFNUSxFQUF1QixJQUMvQkMsRUFDSEMsT0FBUSxDQUNOQyxZQUFhLHVDQUNiQyxLQUFNLFVBQ05DLE1BQU8sTUNMRUMsRUFBVSxJ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
|
package/package.json
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "build-ts",
|
|
3
|
-
"version": "17.
|
|
3
|
+
"version": "17.1.1",
|
|
4
|
+
"license": "UNLICENSED",
|
|
5
|
+
"author": "WillBooster Inc.",
|
|
4
6
|
"repository": {
|
|
5
7
|
"type": "git",
|
|
6
8
|
"url": "git+https://github.com/WillBooster/build-ts.git"
|
|
7
9
|
},
|
|
8
|
-
"license": "UNLICENSED",
|
|
9
|
-
"author": "WillBooster Inc.",
|
|
10
|
-
"type": "module",
|
|
11
10
|
"bin": "bin/index.js",
|
|
12
11
|
"files": [
|
|
13
12
|
"bin/",
|
|
14
13
|
"dist/",
|
|
15
14
|
"babel.*"
|
|
16
15
|
],
|
|
16
|
+
"type": "module",
|
|
17
17
|
"scripts": {
|
|
18
18
|
"build": "wb buildIfNeeded --command 'yarn start app'",
|
|
19
19
|
"check-all-for-ai": "yarn check-for-ai && yarn test",
|
|
20
|
-
"check-for-ai": "yarn install > /dev/null && yarn format > /dev/null 2> /dev/null || true && yarn
|
|
20
|
+
"check-for-ai": "yarn install > /dev/null && yarn format > /dev/null 2> /dev/null || true && yarn lint-fix --quiet",
|
|
21
21
|
"cleanup": "yarn format && yarn lint-fix",
|
|
22
|
-
"format": "sort-package-json && yarn prettify",
|
|
23
|
-
"
|
|
22
|
+
"format": "sort-package-json && yarn format-code && yarn prettify",
|
|
23
|
+
"format-code": "oxfmt --write --no-error-on-unmatched-pattern .",
|
|
24
|
+
"lint": "oxlint --no-error-on-unmatched-pattern .",
|
|
24
25
|
"lint-fix": "yarn lint --fix",
|
|
25
26
|
"prepare": "lefthook install || true",
|
|
26
|
-
"prettify": "prettier --cache --color --write \"**/{.*/,}*.{
|
|
27
|
+
"prettify": "prettier --cache --color --no-error-on-unmatched-pattern --write \"**/{.*/,}*.{java}\" \"!**/test{-,/}fixtures/**\" || true",
|
|
27
28
|
"start": "tsx src/index.ts",
|
|
28
29
|
"start-prod": "yarn build && yarn build-ts",
|
|
29
30
|
"test": "vitest run",
|
|
30
31
|
"typecheck": "wb typecheck"
|
|
31
32
|
},
|
|
32
|
-
"prettier": "@willbooster/prettier-config",
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@babel/core": "7.29.0",
|
|
35
35
|
"@babel/plugin-proposal-decorators": "7.29.0",
|
|
@@ -46,7 +46,8 @@
|
|
|
46
46
|
"@rollup/plugin-replace": "6.0.3",
|
|
47
47
|
"@rollup/plugin-terser": "1.0.0",
|
|
48
48
|
"@rollup/pluginutils": "5.3.0",
|
|
49
|
-
"@
|
|
49
|
+
"@typescript/native-preview": "7.0.0-dev.20260410.1",
|
|
50
|
+
"@willbooster/shared-lib-node": "8.5.3",
|
|
50
51
|
"babel-plugin-polyfill-corejs3": "0.14.2",
|
|
51
52
|
"babel-plugin-transform-remove-console": "6.9.4",
|
|
52
53
|
"chalk": "5.6.2",
|
|
@@ -60,50 +61,40 @@
|
|
|
60
61
|
"rollup-plugin-node-externals": "8.1.2",
|
|
61
62
|
"rollup-plugin-preserve-directives": "0.4.0",
|
|
62
63
|
"rollup-plugin-string": "3.0.0",
|
|
63
|
-
"rollup-plugin-ts": "3.4.5",
|
|
64
64
|
"signal-exit": "4.1.0",
|
|
65
65
|
"tsx": "4.21.0",
|
|
66
|
-
"typescript": "5.9.3",
|
|
67
66
|
"yargs": "18.0.0"
|
|
68
67
|
},
|
|
69
68
|
"devDependencies": {
|
|
70
|
-
"@eslint/js": "10.0.1",
|
|
71
69
|
"@tsconfig/node-lts": "24.0.0",
|
|
72
70
|
"@tsconfig/node-ts": "23.6.4",
|
|
73
71
|
"@types/babel__core": "7.20.5",
|
|
74
72
|
"@types/babel__plugin-transform-runtime": "7.9.5",
|
|
75
73
|
"@types/babel__preset-env": "7.10.0",
|
|
76
|
-
"@types/
|
|
77
|
-
"@types/node": "25.5.2",
|
|
74
|
+
"@types/node": "25.6.0",
|
|
78
75
|
"@types/signal-exit": "4.0.0",
|
|
79
76
|
"@types/yargs": "17.0.35",
|
|
80
77
|
"@willbooster/babel-configs": "2.5.1",
|
|
81
|
-
"@willbooster/
|
|
78
|
+
"@willbooster/oxfmt-config": "1.2.1",
|
|
79
|
+
"@willbooster/oxlint-config": "1.4.4",
|
|
82
80
|
"@willbooster/prettier-config": "10.4.0",
|
|
83
|
-
"@willbooster/wb": "13.
|
|
81
|
+
"@willbooster/wb": "13.11.2",
|
|
82
|
+
"build-ts": "17.1.0",
|
|
84
83
|
"conventional-changelog-conventionalcommits": "9.3.1",
|
|
85
|
-
"eslint": "^9",
|
|
86
|
-
"eslint-config-flat-gitignore": "2.3.0",
|
|
87
|
-
"eslint-config-prettier": "10.1.8",
|
|
88
|
-
"eslint-import-resolver-typescript": "4.4.4",
|
|
89
|
-
"eslint-plugin-import-x": "4.16.2",
|
|
90
|
-
"eslint-plugin-sort-class-members": "1.22.1",
|
|
91
|
-
"eslint-plugin-sort-destructure-keys": "3.0.0",
|
|
92
|
-
"eslint-plugin-unicorn": "64.0.0",
|
|
93
|
-
"eslint-plugin-unused-imports": "4.4.1",
|
|
94
|
-
"globals": "17.4.0",
|
|
95
84
|
"lefthook": "2.1.5",
|
|
96
|
-
"
|
|
97
|
-
"
|
|
85
|
+
"oxfmt": "0.45.0",
|
|
86
|
+
"oxlint": "1.60.0",
|
|
87
|
+
"oxlint-tsgolint": "0.21.0",
|
|
88
|
+
"prettier": "3.8.2",
|
|
98
89
|
"prettier-plugin-java": "2.8.1",
|
|
99
90
|
"semantic-release": "25.0.3",
|
|
100
91
|
"sort-package-json": "3.6.1",
|
|
101
92
|
"type-fest": "5.5.0",
|
|
102
|
-
"
|
|
103
|
-
"vitest": "4.1.2"
|
|
93
|
+
"vitest": "4.1.4"
|
|
104
94
|
},
|
|
105
|
-
"
|
|
95
|
+
"prettier": "@willbooster/prettier-config",
|
|
106
96
|
"engines": {
|
|
107
97
|
"node": ">=24"
|
|
108
|
-
}
|
|
98
|
+
},
|
|
99
|
+
"packageManager": "yarn@4.13.0"
|
|
109
100
|
}
|