@repka-kit/ts
Version:
Next generation build tools for monorepo: lint, bundle and package your TypeScript projects
274 lines (268 loc) • 35.1 kB
JavaScript
import { ChildProcess, spawn } from 'node:child_process';
import { o as once } from './chunk.gqGVJwT_.js';
const levels = ["debug", "info", "warn", "error", "fatal"];
const enabledLevelsAfter = (level) => {
if (level === "off") {
return [];
}
const index = levels.findIndex((item) => item === level);
if (index === -1) {
throw new Error("Invalid level");
}
return levels.slice(index);
};
const isLevel = (level) => {
return levels.includes(level);
};
const verbosityFromProcessArgs = (args = process.argv) => {
const index = args.findIndex((value) => value === "--log-level");
if (index === -1) {
return void 0;
}
const level = args[index + 1];
if (level === "silent" || level === "off") {
return "off";
}
if (!isLevel(level)) {
return void 0;
}
return level;
};
const verbosityFromEnv = () => {
const level = process.env["LOG_LEVEL"];
if (level === "silent" || level === "off") {
return "off";
}
if (!isLevel(level)) {
return void 0;
}
return level;
};
const getVerbosityConfig = () => {
const argsLevel = verbosityFromProcessArgs();
const envLevel = verbosityFromEnv();
return argsLevel ?? envLevel ?? "info";
};
const noop = (..._args) => {
return;
};
const log = (...args) => {
console.log(...args);
};
const error = (...args) => {
console.error(...args);
};
const shouldEnableTip = () => !process.env["CI"] && !process.stdout.isTTY;
const createLogger = (deps = { getVerbosityConfig, log, error, shouldEnableTip }) => {
const logLevel = deps.getVerbosityConfig();
const enabled = enabledLevelsAfter(logLevel);
return levels.reduce(
(acc, lvl) => {
return {
...acc,
[lvl]: enabled.includes(lvl) ? ["fatal", "error"].includes(lvl) ? deps.error : deps.log : noop
};
},
{
logLevel,
log: enabled.includes("info") ? deps.log : noop,
tip: enabled.includes("info") && deps.shouldEnableTip() ? deps.log : noop
}
);
};
const createDelegatingLogger = (opts) => Object.freeze({
get logLevel() {
return opts.parent.logLevel;
},
debug(...params) {
opts.parent.debug(...params);
},
info(...params) {
opts.parent.info(...params);
},
log(...params) {
opts.parent.log(...params);
},
tip(...params) {
opts.parent.tip(...params);
},
warn(...params) {
opts.parent.warn(...params);
},
error(...params) {
opts.parent.error(...params);
},
fatal(...params) {
opts.parent.fatal(...params);
}
});
let defaultLoggerFactory;
const configureDefaultLogger = (factory) => {
if (defaultLoggerFactory) {
const error2 = {
stack: ""
};
Error.captureStackTrace(error2);
logger.debug("Cannot override default logger multiple times", error2.stack);
return;
}
defaultLoggerFactory = factory;
};
const defaultLogger = once(() => {
let factory = defaultLoggerFactory;
if (!factory) {
factory = () => createLogger();
}
return factory();
});
const logger = createDelegatingLogger({
get parent() {
return defaultLogger();
}
});
function captureStackTrace(remove = 0) {
const stackContainer = {
stack: ""
};
Error.captureStackTrace(stackContainer);
const stackTrace = stackContainer.stack.split("\n").slice(6 + remove).join("\n");
return {
/**
* Captured stack trace information
*/
stackTrace,
/**
* Can be called in asynchronous callback to enrich exceptions with additional information
* @param err Exception to enrich - it is going to have its `.stack` prop mutated
* @returns Same exception
*/
prepareForRethrow: (err) => {
const oldStackTrace = err.stack ?? "".split("\n").slice(1).join("\n");
err.stack = `${err.name || "Error"}: ${err.message}
${oldStackTrace}
${stackTrace}`;
return err;
}
};
}
function isSpawnArgs(args) {
return !(args[0] instanceof ChildProcess) && typeof args[0] === "string";
}
function spawnWithSpawnParameters(parameters) {
const [child, [command, args, opts]] = isSpawnArgs(parameters) ? [
spawn(...parameters),
parameters
] : [
parameters[0],
[
parameters[0].spawnfile,
parameters[0].spawnargs.slice(1),
parameters[1]
]
];
return {
child,
command,
args,
opts
};
}
async function spawnToPromise(...parameters) {
const { child, command, args, opts } = spawnWithSpawnParameters(parameters);
const { prepareForRethrow } = captureStackTrace();
const exitCodes = opts.exitCodes;
const cwd = opts.cwd ? opts.cwd.toString() : void 0;
const cmd = () => [command, ...args].join(" ");
logger.debug([">", cmd()].join(" "), ...cwd ? [`in ${cwd}`] : []);
await new Promise(
(res, rej) => child.on("close", (code, signal) => {
if (typeof code === "number") {
if (exitCodes !== "inherit" && exitCodes !== "any" && !exitCodes.includes(code)) {
rej(
prepareForRethrow(
new Error(`Command "${cmd()}" has failed with code ${code}`)
)
);
} else {
res();
}
} else if (signal) {
rej(
prepareForRethrow(
new Error(`Failed to execute command "${cmd()}" - ${signal}`)
)
);
} else {
throw prepareForRethrow(new Error("Expected signal or error code"));
}
}).on("error", rej)
);
if (exitCodes === "inherit") {
if (typeof child.exitCode === "number" && (typeof process.exitCode !== "number" || process.exitCode === 0)) {
process.exitCode = child.exitCode;
}
}
}
function includesAnyOf(target, hasAnyOfArgs) {
return hasAnyOfArgs.some((variant) => target.includes(variant));
}
function removeArgsFrom(target, args, opts) {
const result = [...target];
for (const arg of args) {
const index = target.findIndex(
(value) => typeof arg === "string" ? value === arg : arg.test(value)
);
if (index !== -1) {
result.splice(index, (opts == null ? void 0 : opts.numValues) ? opts.numValues + 1 : 1);
}
}
return result;
}
function setScript(script) {
return (state) => {
return {
...state,
preArgs: [script, ...state.preArgs]
};
};
}
function removeInputArgs(args, opts) {
return (state) => {
return {
...state,
inputArgs: removeArgsFrom(state.inputArgs, args, opts)
};
};
}
function setDefaultArgs(args, values = [], condition, apply) {
return (state) => {
if (condition) {
if (!condition(state)) {
return state;
}
}
if (includesAnyOf(state.inputArgs, args)) {
return state;
}
const set = apply ? apply : (args2, to) => ({
...to,
preArgs: [...state.preArgs, ...args2]
});
return set([args[0], ...values], state);
};
}
const removeLogLevelOption = () => removeInputArgs(["--log-level"], { numValues: 1 });
function cliArgsPipe(transforms, inputArgs) {
const {
preArgs,
inputArgs: modifiedInputArgs,
postArgs
} = transforms.reduce((acc, transform) => transform(acc), {
inputArgs,
preArgs: [],
postArgs: []
});
return [...preArgs, ...modifiedInputArgs, ...postArgs];
}
export { spawnWithSpawnParameters as a, createLogger as b, configureDefaultLogger as c, cliArgsPipe as d, setScript as e, setDefaultArgs as f, includesAnyOf as g, removeInputArgs as h, isSpawnArgs as i, logger as l, removeLogLevelOption as r, spawnToPromise as s };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2h1bmsuMkVYMjVfQ0cuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2dnZXIvbG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL3N0YWNrVHJhY2UudHMiLCIuLi9zcmMvY2hpbGQtcHJvY2Vzcy9zcGF3blRvUHJvbWlzZS50cyIsIi4uL3NyYy91dGlscy9jbGlBcmdzUGlwZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBvbmNlIH0gZnJvbSAnQHV0aWxzL3RzJztcblxuY29uc3QgbGV2ZWxzID0gWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InLCAnZmF0YWwnXSBhcyBjb25zdDtcblxudHlwZSBMb2dMZXZlbCA9IHR5cGVvZiBsZXZlbHNbbnVtYmVyXTtcblxudHlwZSBQYXJhbXMgPSBQYXJhbWV0ZXJzPHR5cGVvZiBjb25zb2xlLmxvZz47XG5cbnR5cGUgTG9nZ2VyID0ge1xuICBsb2dMZXZlbDogTG9nTGV2ZWw7XG4gIGRlYnVnKC4uLnBhcmFtczogUGFyYW1zKTogdm9pZDtcbiAgaW5mbyguLi5wYXJhbXM6IFBhcmFtcyk6IHZvaWQ7XG4gIC8vIGFsaWFzIGZvciBpbmZvXG4gIGxvZyguLi5wYXJhbXM6IFBhcmFtcyk6IHZvaWQ7XG4gIC8vIHNwZWNpYWwgdHJlYXRtZW50LCBkaXNhYmxlZCBvbiBDSS9UVFlcbiAgdGlwKC4uLnBhcmFtczogUGFyYW1zKTogdm9pZDtcbiAgd2FybiguLi5wYXJhbXM6IFBhcmFtcyk6IHZvaWQ7XG4gIGVycm9yKC4uLnBhcmFtczogUGFyYW1zKTogdm9pZDtcbiAgZmF0YWwoLi4ucGFyYW1zOiBQYXJhbXMpOiB2b2lkO1xufTtcblxuY29uc3QgZW5hYmxlZExldmVsc0FmdGVyID0gKGxldmVsOiBMb2dMZXZlbCB8ICdvZmYnKSA9PiB7XG4gIGlmIChsZXZlbCA9PT0gJ29mZicpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgaW5kZXggPSBsZXZlbHMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtID09PSBsZXZlbCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGV2ZWwnKTtcbiAgfVxuICByZXR1cm4gbGV2ZWxzLnNsaWNlKGluZGV4KTtcbn07XG5cbmNvbnN0IGlzTGV2ZWwgPSAobGV2ZWw/OiBzdHJpbmcpOiBsZXZlbCBpcyBMb2dMZXZlbCA9PiB7XG4gIHJldHVybiBsZXZlbHMuaW5jbHVkZXMobGV2ZWwgYXMgTG9nTGV2ZWwpO1xufTtcblxuY29uc3QgdmVyYm9zaXR5RnJvbVByb2Nlc3NBcmdzID0gKFxuICBhcmdzID0gcHJvY2Vzcy5hcmd2XG4pOiBMb2dMZXZlbCB8ICdvZmYnIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgaW5kZXggPSBhcmdzLmZpbmRJbmRleCgodmFsdWUpID0+IHZhbHVlID09PSAnLS1sb2ctbGV2ZWwnKTtcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgbGV2ZWwgPSBhcmdzW2luZGV4ICsgMV07XG4gIGlmIChsZXZlbCA9PT0gJ3NpbGVudCcgfHwgbGV2ZWwgPT09ICdvZmYnKSB7XG4gICAgcmV0dXJuICdvZmYnO1xuICB9XG4gIGlmICghaXNMZXZlbChsZXZlbCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBsZXZlbDtcbn07XG5cbmNvbnN0IHZlcmJvc2l0eUZyb21FbnYgPSAoKTogTG9nTGV2ZWwgfCAnb2ZmJyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGxldmVsID0gcHJvY2Vzcy5lbnZbJ0xPR19MRVZFTCddO1xuICBpZiAobGV2ZWwgPT09ICdzaWxlbnQnIHx8IGxldmVsID09PSAnb2ZmJykge1xuICAgIHJldHVybiAnb2ZmJztcbiAgfVxuICBpZiAoIWlzTGV2ZWwobGV2ZWwpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gbGV2ZWw7XG59O1xuXG5jb25zdCBnZXRWZXJib3NpdHlDb25maWcgPSAoKSA9PiB7XG4gIGNvbnN0IGFyZ3NMZXZlbCA9IHZlcmJvc2l0eUZyb21Qcm9jZXNzQXJncygpO1xuICBjb25zdCBlbnZMZXZlbCA9IHZlcmJvc2l0eUZyb21FbnYoKTtcbiAgcmV0dXJuIGFyZ3NMZXZlbCA/PyBlbnZMZXZlbCA/PyAnaW5mbyc7XG59O1xuXG5jb25zdCBub29wID0gKC4uLl9hcmdzOiBQYXJhbXMpID0+IHtcbiAgcmV0dXJuO1xufTtcblxuY29uc3QgbG9nID0gKC4uLmFyZ3M6IFBhcmFtcykgPT4ge1xuICBjb25zb2xlLmxvZyguLi5hcmdzKTtcbn07XG5cbmNvbnN0IGVycm9yID0gKC4uLmFyZ3M6IFBhcmFtcykgPT4ge1xuICBjb25zb2xlLmVycm9yKC4uLmFyZ3MpO1xufTtcblxuY29uc3Qgc2hvdWxkRW5hYmxlVGlwID0gKCkgPT4gIXByb2Nlc3MuZW52WydDSSddICYmICFwcm9jZXNzLnN0ZG91dC5pc1RUWTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxvZ2dlciA9IChcbiAgZGVwcyA9IHsgZ2V0VmVyYm9zaXR5Q29uZmlnLCBsb2csIGVycm9yLCBzaG91bGRFbmFibGVUaXAgfVxuKSA9PiB7XG4gIGNvbnN0IGxvZ0xldmVsID0gZGVwcy5nZXRWZXJib3NpdHlDb25maWcoKTtcbiAgY29uc3QgZW5hYmxlZCA9IGVuYWJsZWRMZXZlbHNBZnRlcihsb2dMZXZlbCk7XG4gIHJldHVybiBsZXZlbHMucmVkdWNlKFxuICAgIChhY2MsIGx2bCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYWNjLFxuICAgICAgICBbbHZsXTogZW5hYmxlZC5pbmNsdWRlcyhsdmwpXG4gICAgICAgICAgPyBbJ2ZhdGFsJywgJ2Vycm9yJ10uaW5jbHVkZXMobHZsKVxuICAgICAgICAgICAgPyBkZXBzLmVycm9yXG4gICAgICAgICAgICA6IGRlcHMubG9nXG4gICAgICAgICAgOiBub29wLFxuICAgICAgfTtcbiAgICB9LFxuICAgIHtcbiAgICAgIGxvZ0xldmVsLFxuICAgICAgbG9nOiBlbmFibGVkLmluY2x1ZGVzKCdpbmZvJykgPyBkZXBzLmxvZyA6IG5vb3AsXG4gICAgICB0aXA6IGVuYWJsZWQuaW5jbHVkZXMoJ2luZm8nKSAmJiBkZXBzLnNob3VsZEVuYWJsZVRpcCgpID8gZGVwcy5sb2cgOiBub29wLFxuICAgIH0gYXMgTG9nZ2VyXG4gICk7XG59O1xuXG5jb25zdCBjcmVhdGVEZWxlZ2F0aW5nTG9nZ2VyID0gKG9wdHM6IHsgcGFyZW50OiBMb2dnZXIgfSk6IExvZ2dlciA9PlxuICBPYmplY3QuZnJlZXplKHtcbiAgICBnZXQgbG9nTGV2ZWwoKSB7XG4gICAgICByZXR1cm4gb3B0cy5wYXJlbnQubG9nTGV2ZWw7XG4gICAgfSxcbiAgICBkZWJ1ZyguLi5wYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgICAgb3B0cy5wYXJlbnQuZGVidWcoLi4ucGFyYW1zKTtcbiAgICB9LFxuICAgIGluZm8oLi4ucGFyYW1zOiBQYXJhbXMpOiB2b2lkIHtcbiAgICAgIG9wdHMucGFyZW50LmluZm8oLi4ucGFyYW1zKTtcbiAgICB9LFxuICAgIGxvZyguLi5wYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgICAgb3B0cy5wYXJlbnQubG9nKC4uLnBhcmFtcyk7XG4gICAgfSxcbiAgICB0aXAoLi4ucGFyYW1zOiBQYXJhbXMpOiB2b2lkIHtcbiAgICAgIG9wdHMucGFyZW50LnRpcCguLi5wYXJhbXMpO1xuICAgIH0sXG4gICAgd2FybiguLi5wYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgICAgb3B0cy5wYXJlbnQud2FybiguLi5wYXJhbXMpO1xuICAgIH0sXG4gICAgZXJyb3IoLi4ucGFyYW1zOiBQYXJhbXMpOiB2b2lkIHtcbiAgICAgIG9wdHMucGFyZW50LmVycm9yKC4uLnBhcmFtcyk7XG4gICAgfSxcbiAgICBmYXRhbCguLi5wYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgICAgb3B0cy5wYXJlbnQuZmF0YWwoLi4ucGFyYW1zKTtcbiAgICB9LFxuICB9KTtcblxubGV0IGRlZmF1bHRMb2dnZXJGYWN0b3J5OiAoKCkgPT4gTG9nZ2VyKSB8IG51bGw7XG5cbmV4cG9ydCBjb25zdCBjb25maWd1cmVEZWZhdWx0TG9nZ2VyID0gKGZhY3Rvcnk6ICgpID0+IExvZ2dlcikgPT4ge1xuICBpZiAoZGVmYXVsdExvZ2dlckZhY3RvcnkpIHtcbiAgICBjb25zdCBlcnJvciA9IHtcbiAgICAgIHN0YWNrOiAnJyxcbiAgICB9O1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVycm9yKTtcbiAgICBsb2dnZXIuZGVidWcoJ0Nhbm5vdCBvdmVycmlkZSBkZWZhdWx0IGxvZ2dlciBtdWx0aXBsZSB0aW1lcycsIGVycm9yLnN0YWNrKTtcbiAgICByZXR1cm47XG4gIH1cbiAgZGVmYXVsdExvZ2dlckZhY3RvcnkgPSBmYWN0b3J5O1xufTtcblxuY29uc3QgZGVmYXVsdExvZ2dlciA9IG9uY2UoKCkgPT4ge1xuICBsZXQgZmFjdG9yeSA9IGRlZmF1bHRMb2dnZXJGYWN0b3J5O1xuICBpZiAoIWZhY3RvcnkpIHtcbiAgICBmYWN0b3J5ID0gKCkgPT4gY3JlYXRlTG9nZ2VyKCk7XG4gIH1cbiAgcmV0dXJuIGZhY3RvcnkoKTtcbn0pO1xuXG4vKipcbiAqIERlZmF1bHQgbG9nZ2VyIGluc3RhbmNlIGNhbiBiZSBjb25maWd1cmVkIG9uY2UgYXQgc3RhcnR1cFxuICovXG5leHBvcnQgY29uc3QgbG9nZ2VyOiBMb2dnZXIgPSBjcmVhdGVEZWxlZ2F0aW5nTG9nZ2VyKHtcbiAgZ2V0IHBhcmVudCgpIHtcbiAgICByZXR1cm4gZGVmYXVsdExvZ2dlcigpO1xuICB9LFxufSk7XG4iLCIvKipcbiAqIENhcHR1cmUgdGhlIHN0YWNrIHRyYWNlIGFuZCBhbGxvdyB0byBlbnJpY2ggZXhjZXB0aW9ucyB0aHJvd24gaW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrc1xuICogd2l0aCBhZGRpdGlvbmFsIHN0YWNrIGluZm9ybWF0aW9uIGNhcHR1cmVkIGF0IHRoZSBtb21lbnQgb2YgdGhlIGNhbGwgb2YgdGhpcyBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZVN0YWNrVHJhY2UocmVtb3ZlID0gMCkge1xuICBjb25zdCBzdGFja0NvbnRhaW5lciA9IHtcbiAgICBzdGFjazogJycsXG4gIH07XG4gIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHN0YWNrQ29udGFpbmVyKTtcbiAgY29uc3Qgc3RhY2tUcmFjZSA9IHN0YWNrQ29udGFpbmVyLnN0YWNrXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5zbGljZSg2ICsgcmVtb3ZlKVxuICAgIC5qb2luKCdcXG4nKTtcbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBDYXB0dXJlZCBzdGFjayB0cmFjZSBpbmZvcm1hdGlvblxuICAgICAqL1xuICAgIHN0YWNrVHJhY2UsXG4gICAgLyoqXG4gICAgICogQ2FuIGJlIGNhbGxlZCBpbiBhc3luY2hyb25vdXMgY2FsbGJhY2sgdG8gZW5yaWNoIGV4Y2VwdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gICAgICogQHBhcmFtIGVyciBFeGNlcHRpb24gdG8gZW5yaWNoIC0gaXQgaXMgZ29pbmcgdG8gaGF2ZSBpdHMgYC5zdGFja2AgcHJvcCBtdXRhdGVkXG4gICAgICogQHJldHVybnMgU2FtZSBleGNlcHRpb25cbiAgICAgKi9cbiAgICBwcmVwYXJlRm9yUmV0aHJvdzogKGVycjogRXJyb3IpID0+IHtcbiAgICAgIGNvbnN0IG9sZFN0YWNrVHJhY2UgPSBlcnIuc3RhY2sgPz8gJycuc3BsaXQoJ1xcbicpLnNsaWNlKDEpLmpvaW4oJ1xcbicpO1xuICAgICAgZXJyLnN0YWNrID0gYCR7ZXJyLm5hbWUgfHwgJ0Vycm9yJ306ICR7XG4gICAgICAgIGVyci5tZXNzYWdlXG4gICAgICB9XFxuJHtvbGRTdGFja1RyYWNlfVxcbiR7c3RhY2tUcmFjZX1gO1xuICAgICAgcmV0dXJuIGVycjtcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBTcGF3bk9wdGlvbnMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IENoaWxkUHJvY2VzcyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQXNzaWduIH0gZnJvbSAndXRpbGl0eS10eXBlcyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci9sb2dnZXInO1xuaW1wb3J0IHsgY2FwdHVyZVN0YWNrVHJhY2UgfSBmcm9tICcuLi91dGlscy9zdGFja1RyYWNlJztcblxuZXhwb3J0IHR5cGUgU3Bhd25Ub1Byb21pc2VPcHRzID0ge1xuICAvKipcbiAgICogU3BlY2lmeSBleGl0IGNvZGVzIHdoaWNoIHNob3VsZCBub3QgcmVzdWx0IGluIHRocm93aW5nIGFuIGVycm9yIHdoZW5cbiAgICogdGhlIHByb2Nlc3MgaGFzIGZpbmlzaGVkLCBlLmcuIHNwZWNpZnlpbmcgYFswXWAgbWVhbnMgaWYgcHJvY2VzcyBmaW5pc2hlZFxuICAgKiB3aXRoIHplcm8gZXhpdCBjb2RlIHRoZW4gdGhlIHByb21pc2Ugd2lsbCByZXNvbHZlIGluc3RlYWQgb2YgcmVqZWN0aW5nLlxuICAgKlxuICAgKiBBbHRlcm5hdGl2ZWx5LCBzcGVjaWZ5IGBpbmhlcml0YCB0byBzYXZlIHN0YXR1cyBjb2RlIHRvIHRoZSBjdXJyZW50IGBwcm9jZXNzLmV4aXRDb2RlYFxuICAgKlxuICAgKiBBbHRlcm5hdGl2ZWx5LCBjb21wbGV0ZWx5IGlnbm9yZSB0aGUgZXhpdCBjb2RlIChlLmcuIHlvdSBmb2xsb3cgdXAgYW5kIGludGVycm9nYXRlXG4gICAqIHRoZSBwcm9jZXNzIGNvZGUgbWFudWFsbHkgYWZ0ZXJ3YXJkcylcbiAgICovXG4gIGV4aXRDb2RlczogbnVtYmVyW10gfCAnaW5oZXJpdCcgfCAnYW55Jztcbn07XG5cbnR5cGUgU2hhcmVkT3B0cyA9IFBpY2s8U3Bhd25PcHRpb25zLCAnY3dkJz47XG5cbnR5cGUgU3Bhd25BcmdzPEUgZXh0ZW5kcyBvYmplY3Q+ID0gW1xuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgb3B0aW9uczogQXNzaWduPFNwYXduT3B0aW9ucywgRT5cbl07XG5cbmV4cG9ydCB0eXBlIFNwYXduT3B0aW9uc1dpdGhFeHRyYTxFIGV4dGVuZHMgb2JqZWN0ID0gU3Bhd25Ub1Byb21pc2VPcHRzPiA9XG4gIEFzc2lnbjxTcGF3bk9wdGlvbnMsIEU+O1xuXG5leHBvcnQgdHlwZSBTcGF3blBhcmFtZXRlck1peDxFIGV4dGVuZHMgb2JqZWN0ID0gU3Bhd25Ub1Byb21pc2VPcHRzPiA9XG4gIHwgW2NwOiBDaGlsZFByb2Nlc3MsIGV4dHJhT3B0czogQXNzaWduPEUsIFNoYXJlZE9wdHM+XVxuICB8IFNwYXduQXJnczxFPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3Bhd25BcmdzPEUgZXh0ZW5kcyBvYmplY3Q+KFxuICBhcmdzOiBTcGF3blBhcmFtZXRlck1peDxFPlxuKTogYXJncyBpcyBTcGF3bkFyZ3M8RT4ge1xuICByZXR1cm4gIShhcmdzWzBdIGluc3RhbmNlb2YgQ2hpbGRQcm9jZXNzKSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3bldpdGhTcGF3blBhcmFtZXRlcnM8RSBleHRlbmRzIG9iamVjdD4oXG4gIHBhcmFtZXRlcnM6IFNwYXduUGFyYW1ldGVyTWl4PEU+XG4pIHtcbiAgY29uc3QgW2NoaWxkLCBbY29tbWFuZCwgYXJncywgb3B0c11dID0gaXNTcGF3bkFyZ3MocGFyYW1ldGVycylcbiAgICA/IFtcbiAgICAgICAgc3Bhd24oLi4uKHBhcmFtZXRlcnMgYXMgdW5rbm93biBhcyBQYXJhbWV0ZXJzPHR5cGVvZiBzcGF3bj4pKSxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgIF1cbiAgICA6IFtcbiAgICAgICAgcGFyYW1ldGVyc1swXSxcbiAgICAgICAgW1xuICAgICAgICAgIHBhcmFtZXRlcnNbMF0uc3Bhd25maWxlLFxuICAgICAgICAgIHBhcmFtZXRlcnNbMF0uc3Bhd25hcmdzLnNsaWNlKDEpLFxuICAgICAgICAgIHBhcmFtZXRlcnNbMV0gYXMgQXNzaWduPFNwYXduT3B0aW9ucywgRT4sXG4gICAgICAgIF0sXG4gICAgICBdO1xuICByZXR1cm4ge1xuICAgIGNoaWxkLFxuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICBvcHRzLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Ub1Byb21pc2UoXG4gIC4uLnBhcmFtZXRlcnM6IFNwYXduUGFyYW1ldGVyTWl4XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBjaGlsZCwgY29tbWFuZCwgYXJncywgb3B0cyB9ID0gc3Bhd25XaXRoU3Bhd25QYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuICBjb25zdCB7IHByZXBhcmVGb3JSZXRocm93IH0gPSBjYXB0dXJlU3RhY2tUcmFjZSgpO1xuXG4gIGNvbnN0IGV4aXRDb2RlcyA9IG9wdHMuZXhpdENvZGVzO1xuXG4gIGNvbnN0IGN3ZCA9IG9wdHMuY3dkID8gb3B0cy5jd2QudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBjbWQgPSAoKSA9PiBbY29tbWFuZCwgLi4uYXJnc10uam9pbignICcpO1xuXG4gIGxvZ2dlci5kZWJ1ZyhbJz4nLCBjbWQoKV0uam9pbignICcpLCAuLi4oY3dkID8gW2BpbiAke2N3ZH1gXSA6IFtdKSk7XG5cbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlcywgcmVqKSA9PlxuICAgIGNoaWxkXG4gICAgICAub24oJ2Nsb3NlJywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGNvZGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXhpdENvZGVzICE9PSAnaW5oZXJpdCcgJiZcbiAgICAgICAgICAgIGV4aXRDb2RlcyAhPT0gJ2FueScgJiZcbiAgICAgICAgICAgICFleGl0Q29kZXMuaW5jbHVkZXMoY29kZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJlaihcbiAgICAgICAgICAgICAgcHJlcGFyZUZvclJldGhyb3coXG4gICAgICAgICAgICAgICAgbmV3IEVycm9yKGBDb21tYW5kIFwiJHtjbWQoKX1cIiBoYXMgZmFpbGVkIHdpdGggY29kZSAke2NvZGV9YClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNpZ25hbCkge1xuICAgICAgICAgIHJlaihcbiAgICAgICAgICAgIHByZXBhcmVGb3JSZXRocm93KFxuICAgICAgICAgICAgICBuZXcgRXJyb3IoYEZhaWxlZCB0byBleGVjdXRlIGNvbW1hbmQgXCIke2NtZCgpfVwiIC0gJHtzaWduYWx9YClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHByZXBhcmVGb3JSZXRocm93KG5ldyBFcnJvcignRXhwZWN0ZWQgc2lnbmFsIG9yIGVycm9yIGNvZGUnKSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAub24oJ2Vycm9yJywgcmVqKVxuICApO1xuICAvLyBpbmhlcml0IGV4aXQgY29kZVxuICBpZiAoZXhpdENvZGVzID09PSAnaW5oZXJpdCcpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgY2hpbGQuZXhpdENvZGUgPT09ICdudW1iZXInICYmXG4gICAgICAodHlwZW9mIHByb2Nlc3MuZXhpdENvZGUgIT09ICdudW1iZXInIHx8IHByb2Nlc3MuZXhpdENvZGUgPT09IDApXG4gICAgKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gY2hpbGQuZXhpdENvZGU7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaW5jbHVkZXNBbnlPZih0YXJnZXQ6IHN0cmluZ1tdLCBoYXNBbnlPZkFyZ3M6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBoYXNBbnlPZkFyZ3Muc29tZSgodmFyaWFudCkgPT4gdGFyZ2V0LmluY2x1ZGVzKHZhcmlhbnQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEFmdGVyQW55T2YoXG4gIHRhcmdldDogc3RyaW5nW10sXG4gIGluc2VydDogc3RyaW5nW10sXG4gIGhhc0FueU9mQXJnczogc3RyaW5nW11cbikge1xuICBjb25zdCBpbmRleCA9IHRhcmdldC5maW5kSW5kZXgoKHZhbHVlKSA9PiBoYXNBbnlPZkFyZ3MuaW5jbHVkZXModmFsdWUpKTtcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gWy4uLnRhcmdldF07XG4gIHJlc3VsdC5zcGxpY2UoaW5kZXggKyAxLCAwLCAuLi5pbnNlcnQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQXJnc0Zyb20oXG4gIHRhcmdldDogc3RyaW5nW10sXG4gIGFyZ3M6IEFycmF5PHN0cmluZyB8IFJlZ0V4cD4sXG4gIG9wdHM/OiB7IG51bVZhbHVlczogbnVtYmVyIH1cbikge1xuICBjb25zdCByZXN1bHQgPSBbLi4udGFyZ2V0XTtcbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGNvbnN0IGluZGV4ID0gdGFyZ2V0LmZpbmRJbmRleCgodmFsdWUpID0+XG4gICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyA/IHZhbHVlID09PSBhcmcgOiBhcmcudGVzdCh2YWx1ZSlcbiAgICApO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJlc3VsdC5zcGxpY2UoaW5kZXgsIG9wdHM/Lm51bVZhbHVlcyA/IG9wdHMubnVtVmFsdWVzICsgMSA6IDEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0U2NyaXB0KHNjcmlwdDogc3RyaW5nKSB7XG4gIHJldHVybiAoc3RhdGU6IENsaUFyZ3MpOiBDbGlBcmdzID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBwcmVBcmdzOiBbc2NyaXB0LCAuLi5zdGF0ZS5wcmVBcmdzXSxcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSW5wdXRBcmdzKFxuICBhcmdzOiBBcnJheTxzdHJpbmcgfCBSZWdFeHA+LFxuICBvcHRzPzogeyBudW1WYWx1ZXM6IG51bWJlciB9XG4pIHtcbiAgcmV0dXJuIChzdGF0ZTogQ2xpQXJncykgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGlucHV0QXJnczogcmVtb3ZlQXJnc0Zyb20oc3RhdGUuaW5wdXRBcmdzLCBhcmdzLCBvcHRzKSxcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdEFyZ3MoXG4gIGFyZ3M6IFtzdHJpbmcsIC4uLnN0cmluZ1tdXSxcbiAgdmFsdWVzOiBzdHJpbmdbXSA9IFtdLFxuICBjb25kaXRpb24/OiAoc3RhdGU6IENsaUFyZ3MpID0+IGJvb2xlYW4sXG4gIGFwcGx5PzogKGFyZ3M6IHN0cmluZ1tdLCBzdGF0ZTogQ2xpQXJncykgPT4gQ2xpQXJnc1xuKSB7XG4gIHJldHVybiAoc3RhdGU6IENsaUFyZ3MpID0+IHtcbiAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICBpZiAoIWNvbmRpdGlvbihzdGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5jbHVkZXNBbnlPZihzdGF0ZS5pbnB1dEFyZ3MsIGFyZ3MpKSB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICAgIGNvbnN0IHNldDogTm9uTnVsbGFibGU8dHlwZW9mIGFwcGx5PiA9IGFwcGx5XG4gICAgICA/IGFwcGx5XG4gICAgICA6IChhcmdzLCB0bykgPT4gKHtcbiAgICAgICAgICAuLi50byxcbiAgICAgICAgICBwcmVBcmdzOiBbLi4uc3RhdGUucHJlQXJncywgLi4uYXJnc10sXG4gICAgICAgIH0pO1xuICAgIHJldHVybiBzZXQoW2FyZ3NbMF0sIC4uLnZhbHVlc10sIHN0YXRlKTtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxvZ0xldmVsT3B0aW9uID0gKCkgPT5cbiAgcmVtb3ZlSW5wdXRBcmdzKFsnLS1sb2ctbGV2ZWwnXSwgeyBudW1WYWx1ZXM6IDEgfSk7XG5cbmV4cG9ydCB0eXBlIENsaUFyZ3MgPSB7XG4gIC8qKlxuICAgKiBFeHRyYSBhcmd1bWVudHMgdGhhdCBnbyBiZWZvcmUgYXJndW1lbnRzIHBhc3NlZCBpbiBieSB0aGUgdXNlclxuICAgKi9cbiAgcHJlQXJnczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBBcmd1bWVudHMgYXMgcGFzc2VkIGluIGJ5IHRoZSB1c2VyLCBjb3VsZCBiZSBtb2RpZmllZCBieVxuICAgKiB0cmFuc2Zvcm1zIHRoYXQgY29tZSBiZWZvcmUgY3VycmVudFxuICAgKi9cbiAgaW5wdXRBcmdzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEV4dHJhIGFyZ3VtZW50cyB0aGF0IGdvIGFmdGVyIGFyZ3VtZW50cyBwYXNzZWQgaW4gYnkgdGhlIHVzZXJcbiAgICovXG4gIHBvc3RBcmdzOiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIENsaUFyZ3NUcmFuc2Zvcm0gPSAoc3RhdGU6IENsaUFyZ3MpID0+IENsaUFyZ3M7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGlBcmdzUGlwZShcbiAgdHJhbnNmb3JtczogQ2xpQXJnc1RyYW5zZm9ybVtdLFxuICBpbnB1dEFyZ3M6IHN0cmluZ1tdXG4pIHtcbiAgY29uc3Qge1xuICAgIHByZUFyZ3MsXG4gICAgaW5wdXRBcmdzOiBtb2RpZmllZElucHV0QXJncyxcbiAgICBwb3N0QXJncyxcbiAgfSA9IHRyYW5zZm9ybXMucmVkdWNlPENsaUFyZ3M+KChhY2MsIHRyYW5zZm9ybSkgPT4gdHJhbnNmb3JtKGFjYyksIHtcbiAgICBpbnB1dEFyZ3MsXG4gICAgcHJlQXJnczogW10sXG4gICAgcG9zdEFyZ3M6IFtdLFxuICB9KTtcbiAgcmV0dXJuIFsuLi5wcmVBcmdzLCAuLi5tb2RpZmllZElucHV0QXJncywgLi4ucG9zdEFyZ3NdO1xufVxuIl0sIm5hbWVzIjpbImVycm9yIiwiYXJncyJdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsTUFBTSxTQUFTLENBQUMsT0FBQSxFQUFTLE1BQVEsRUFBQSxNQUFBLEVBQVEsU0FBUyxPQUFPLENBQUEsQ0FBQTtBQW1CekQsTUFBTSxrQkFBQSxHQUFxQixDQUFDLEtBQTRCLEtBQUE7QUFDdEQsRUFBQSxJQUFJLFVBQVUsS0FBTyxFQUFBO0FBQ25CLElBQUEsT0FBTyxFQUFDLENBQUE7QUFBQSxHQUNWO0FBQ0EsRUFBQSxNQUFNLFFBQVEsTUFBTyxDQUFBLFNBQUEsQ0FBVSxDQUFDLElBQUEsS0FBUyxTQUFTLEtBQUssQ0FBQSxDQUFBO0FBQ3ZELEVBQUEsSUFBSSxVQUFVLENBQUksQ0FBQSxFQUFBO0FBQ2hCLElBQU0sTUFBQSxJQUFJLE1BQU0sZUFBZSxDQUFBLENBQUE7QUFBQSxHQUNqQztBQUNBLEVBQU8sT0FBQSxNQUFBLENBQU8sTUFBTSxLQUFLLENBQUEsQ0FBQTtBQUMzQixDQUFBLENBQUE7QUFFQSxNQUFNLE9BQUEsR0FBVSxDQUFDLEtBQXNDLEtBQUE7QUFDckQsRUFBTyxPQUFBLE1BQUEsQ0FBTyxTQUFTLEtBQWlCLENBQUEsQ0FBQTtBQUMxQyxDQUFBLENBQUE7QUFFQSxNQUFNLHdCQUEyQixHQUFBLENBQy9CLElBQU8sR0FBQSxPQUFBLENBQVEsSUFDa0IsS0FBQTtBQUNqQyxFQUFBLE1BQU0sUUFBUSxJQUFLLENBQUEsU0FBQSxDQUFVLENBQUMsS0FBQSxLQUFVLFVBQVUsYUFBYSxDQUFBLENBQUE7QUFDL0QsRUFBQSxJQUFJLFVBQVUsQ0FBSSxDQUFBLEVBQUE7QUFDaEIsSUFBTyxPQUFBLEtBQUEsQ0FBQSxDQUFBO0FBQUEsR0FDVDtBQUNBLEVBQU0sTUFBQSxLQUFBLEdBQVEs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