parse-my-command
Version:
Parse argv with Commander.js without executing the command
152 lines (148 loc) • 19.5 kB
JavaScript
// src/index.ts
import camelCase from "camelcase";
import {
Command,
Option
} from "commander";
// src/noop.ts
var noop = () => {};
// src/index.ts
var commandSettingKeys = [
"_allowExcessArguments",
"_allowUnknownOption",
"_combineFlagAndOptionalValue",
"_defaultCommandName",
"_enablePositionalOptions",
"_passThroughOptions"
];
var getOrThrow = (map, key) => {
const value = map.get(key);
if (value === undefined) {
throw new Error("Expected map value to be present");
}
return value;
};
var findMissingOptions = (command, providedOptionsByCommand) => {
const missingOptionsByCommand = new Map;
let currentCommand = command;
while (currentCommand) {
const missingOptions = new Set;
const providedOptions = providedOptionsByCommand.get(currentCommand);
for (const option of currentCommand.options) {
const optionName = option.negate ? option.long?.replace(/^--no-/, "") : option.long ?? option.short;
if (!optionName) {
continue;
}
const key = camelCase(optionName);
if (providedOptions?.[key] !== undefined) {
continue;
}
missingOptions.add(key);
}
missingOptionsByCommand.set(currentCommand, missingOptions);
currentCommand = currentCommand.parent;
}
return missingOptionsByCommand;
};
var copyCommandSettings = (source, target) => {
const sourcePrivateState = source;
const targetPrivateState = target;
for (const key of commandSettingKeys) {
targetPrivateState[key] = sourcePrivateState[key];
}
target.name(source.name());
target.aliases(source.aliases());
for (const argument of source.registeredArguments) {
target.addArgument(argument);
}
const version = source.version();
if (version) {
target.version(version, source.options.find((option) => option.attributeName() === sourcePrivateState._versionOptionName)?.flags);
}
};
var disableCommandOutput = (command) => {
command.configureOutput({
writeOut: noop,
writeErr: noop,
outputError: noop
});
};
var cloneOption = (option) => {
const newOption = new Option(option.flags, option.description);
newOption.makeOptionMandatory(false);
newOption.default(option.defaultValue, option.defaultValueDescription);
newOption.preset(option.presetArg);
newOption.env(option.envVar);
if (option.parseArg) {
newOption.argParser(option.parseArg);
}
if (option.argChoices) {
newOption.choices(option.argChoices);
}
newOption.conflicts(option.conflictsWith);
newOption.implied = option.implied;
return newOption;
};
var partialParse = (command, argv, options) => {
const providedOptions = new Map;
const providedOptionsSources = new Map;
const commandsMap = new Map;
let matchedCommand;
const setProvidedOptionSource = (command2, optionKey, source) => {
if (!source) {
return;
}
const sourcesMap = providedOptionsSources.get(command2) ?? new Map;
sourcesMap.set(optionKey, source);
providedOptionsSources.set(command2, sourcesMap);
};
const createParserCommand = (parserCommand2, command2) => {
commandsMap.set(parserCommand2, command2);
copyCommandSettings(command2, parserCommand2);
disableCommandOutput(parserCommand2);
parserCommand2.exitOverride();
for (const option of command2.options) {
if (parserCommand2.options.some((parserCommandOption) => parserCommandOption.flags === option.flags)) {
continue;
}
parserCommand2.addOption(cloneOption(option));
}
parserCommand2.hook("preSubcommand", (thisCommand, actionCommand) => {
for (const cmd of [thisCommand, actionCommand]) {
const originalCommand = getOrThrow(commandsMap, cmd);
providedOptions.set(originalCommand, cmd.opts());
for (const optionKey of Object.keys(cmd.opts())) {
setProvidedOptionSource(originalCommand, optionKey, cmd.getOptionValueSource(optionKey));
}
}
});
parserCommand2.action(() => {
const originalCommand = getOrThrow(commandsMap, parserCommand2);
providedOptions.set(originalCommand, parserCommand2.opts());
for (const optionKey of Object.keys(parserCommand2.opts())) {
setProvidedOptionSource(originalCommand, optionKey, parserCommand2.getOptionValueSource(optionKey));
}
matchedCommand = command2;
});
for (const subcommand of command2.commands) {
const parserSubcommand = parserCommand2.command(subcommand.name());
createParserCommand(parserSubcommand, subcommand);
}
return parserCommand2;
};
const parserCommand = createParserCommand(new Command, command);
parserCommand.parse(argv, options);
const missingOptions = matchedCommand ? findMissingOptions(matchedCommand, providedOptions) : new Map;
return {
matchedCommand,
missingOptions,
providedOptions,
providedOptionsSources
};
};
export {
partialParse,
findMissingOptions
};
//# debugId=0F2D30EA8353D1EC64756E2164756E21
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9ub29wLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCBjYW1lbENhc2UgZnJvbSBcImNhbWVsY2FzZVwiO1xuaW1wb3J0IHtcbiAgQ29tbWFuZCxcbiAgT3B0aW9uLFxuICB0eXBlIE9wdGlvblZhbHVlU291cmNlLFxuICB0eXBlIE9wdGlvblZhbHVlcyxcbiAgdHlwZSBQYXJzZU9wdGlvbnMsXG59IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IG5vb3AgfSBmcm9tIFwiLi9ub29wLmpzXCI7XG5cbmNvbnN0IGNvbW1hbmRTZXR0aW5nS2V5cyA9IFtcbiAgXCJfYWxsb3dFeGNlc3NBcmd1bWVudHNcIixcbiAgXCJfYWxsb3dVbmtub3duT3B0aW9uXCIsXG4gIFwiX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZVwiLFxuICBcIl9kZWZhdWx0Q29tbWFuZE5hbWVcIixcbiAgXCJfZW5hYmxlUG9zaXRpb25hbE9wdGlvbnNcIixcbiAgXCJfcGFzc1Rocm91Z2hPcHRpb25zXCIsXG5dIGFzIGNvbnN0O1xuXG50eXBlIENvbW1hbmRTZXR0aW5nS2V5ID0gKHR5cGVvZiBjb21tYW5kU2V0dGluZ0tleXMpW251bWJlcl07XG50eXBlIENvbW1hbmRQcml2YXRlU3RhdGUgPSBDb21tYW5kICZcbiAgUmVjb3JkPENvbW1hbmRTZXR0aW5nS2V5LCB1bmtub3duPiAmIHtcbiAgICBfdmVyc2lvbk9wdGlvbk5hbWU/OiBzdHJpbmc7XG4gIH07XG5cbmNvbnN0IGdldE9yVGhyb3cgPSA8S2V5LCBWYWx1ZT4obWFwOiBNYXA8S2V5LCBWYWx1ZT4sIGtleTogS2V5KTogVmFsdWUgPT4ge1xuICBjb25zdCB2YWx1ZSA9IG1hcC5nZXQoa2V5KTtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBtYXAgdmFsdWUgdG8gYmUgcHJlc2VudFwiKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kTWlzc2luZ09wdGlvbnMgPSAoXG4gIGNvbW1hbmQ6IENvbW1hbmQsXG4gIHByb3ZpZGVkT3B0aW9uc0J5Q29tbWFuZDogTWFwPENvbW1hbmQsIE9wdGlvblZhbHVlcz4sXG4pID0+IHtcbiAgY29uc3QgbWlzc2luZ09wdGlvbnNCeUNvbW1hbmQgPSBuZXcgTWFwPENvbW1hbmQsIFNldDxzdHJpbmc+PigpO1xuXG4gIGxldCBjdXJyZW50Q29tbWFuZDogQ29tbWFuZCB8IHVuZGVmaW5lZCB8IG51bGwgPSBjb21tYW5kO1xuXG4gIHdoaWxlIChjdXJyZW50Q29tbWFuZCkge1xuICAgIGNvbnN0IG1pc3NpbmdPcHRpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgcHJvdmlkZWRPcHRpb25zID0gcHJvdmlkZWRPcHRpb25zQnlDb21tYW5kLmdldChjdXJyZW50Q29tbWFuZCk7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgY3VycmVudENvbW1hbmQub3B0aW9ucykge1xuICAgICAgY29uc3Qgb3B0aW9uTmFtZSA9IG9wdGlvbi5uZWdhdGVcbiAgICAgICAgPyBvcHRpb24ubG9uZz8ucmVwbGFjZSgvXi0tbm8tLywgXCJcIilcbiAgICAgICAgOiAob3B0aW9uLmxvbmcgPz8gb3B0aW9uLnNob3J0KTtcbiAgICAgIGlmICghb3B0aW9uTmFtZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gY2FtZWxDYXNlKG9wdGlvbk5hbWUpO1xuXG4gICAgICBpZiAocHJvdmlkZWRPcHRpb25zPy5ba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBtaXNzaW5nT3B0aW9ucy5hZGQoa2V5KTtcbiAgICB9XG5cbiAgICBtaXNzaW5nT3B0aW9uc0J5Q29tbWFuZC5zZXQoY3VycmVudENvbW1hbmQsIG1pc3NpbmdPcHRpb25zKTtcbiAgICBjdXJyZW50Q29tbWFuZCA9IGN1cnJlbnRDb21tYW5kLnBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBtaXNzaW5nT3B0aW9uc0J5Q29tbWFuZDtcbn07XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxQYXJzZVJlc3VsdCA9IHtcbiAgLyoqXG4gICAqIFRoZSBjb21tYW5kIHdob3NlIGFjdGlvbiB3aWxsIGJlIGV4ZWN1dGVkXG4gICAqL1xuICBtYXRjaGVkQ29tbWFuZDogQ29tbWFuZCB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEEgbWFwIG9mIGNvbW1hbmRzIHRvIGEgc2V0IG9mIG1pc3Npbmcgb3B0aW9ucyBmb3IgdGhhdCBjb21tYW5kXG4gICAqL1xuICBtaXNzaW5nT3B0aW9uczogTWFwPENvbW1hbmQsIFNldDxzdHJpbmc+PjtcbiAgLyoqXG4gICAqIEEgbWFwIG9mIGNvbW1hbmRzIHRvIHRoZSBvcHRpb25zIHByb3ZpZGVkIGZvciB0aGF0IGNvbW1hbmRcbiAgICovXG4gIHByb3ZpZGVkT3B0aW9uczogTWFwPENvbW1hbmQsIE9wdGlvblZhbHVlcz47XG4gIC8qKlxuICAgKiBBIG1hcCBvZiBjb21tYW5kcyB0byBhIG1hcCBvZiBvcHRpb24ga2V5cyB0byB0aGUgc291cmNlIG9mIHRoZSBvcHRpb24gdmFsdWVcbiAgICovXG4gIHByb3ZpZGVkT3B0aW9uc1NvdXJjZXM6IE1hcDxcbiAgICBDb21tYW5kLFxuICAgIE1hcDxzdHJpbmcsIE9wdGlvblZhbHVlU291cmNlIHwgdW5kZWZpbmVkPlxuICA+O1xufTtcblxuY29uc3QgY29weUNvbW1hbmRTZXR0aW5ncyA9IChzb3VyY2U6IENvbW1hbmQsIHRhcmdldDogQ29tbWFuZCkgPT4ge1xuICBjb25zdCBzb3VyY2VQcml2YXRlU3RhdGUgPSBzb3VyY2UgYXMgQ29tbWFuZFByaXZhdGVTdGF0ZTtcbiAgY29uc3QgdGFyZ2V0UHJpdmF0ZVN0YXRlID0gdGFyZ2V0IGFzIENvbW1hbmRQcml2YXRlU3RhdGU7XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgY29tbWFuZFNldHRpbmdLZXlzKSB7XG4gICAgdGFyZ2V0UHJpdmF0ZVN0YXRlW2tleV0gPSBzb3VyY2VQcml2YXRlU3RhdGVba2V5XTtcbiAgfVxuXG4gIHRhcmdldC5uYW1lKHNvdXJjZS5uYW1lKCkpO1xuICB0YXJnZXQuYWxpYXNlcyhzb3VyY2UuYWxpYXNlcygpKTtcbiAgZm9yIChjb25zdCBhcmd1bWVudCBvZiBzb3VyY2UucmVnaXN0ZXJlZEFyZ3VtZW50cykge1xuICAgIHRhcmdldC5hZGRBcmd1bWVudChhcmd1bWVudCk7XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uID0gc291cmNlLnZlcnNpb24oKTtcbiAgaWYgKHZlcnNpb24pIHtcbiAgICB0YXJnZXQudmVyc2lvbihcbiAgICAgIHZlcnNpb24sXG4gICAgICBzb3VyY2Uub3B0aW9ucy5maW5kKFxuICAgICAgICAob3B0aW9uKSA9PlxuICAgICAgICAgIG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCkgPT09IHNvdXJjZVByaXZhdGVTdGF0ZS5fdmVyc2lvbk9wdGlvbk5hbWUsXG4gICAgICApPy5mbGFncyxcbiAgICApO1xuICB9XG59O1xuXG5jb25zdCBkaXNhYmxlQ29tbWFuZE91dHB1dCA9IChjb21tYW5kOiBDb21tYW5kKSA9PiB7XG4gIGNvbW1hbmQuY29uZmlndXJlT3V0cHV0KHtcbiAgICB3cml0ZU91dDogbm9vcCxcbiAgICB3cml0ZUVycjogbm9vcCxcbiAgICBvdXRwdXRFcnJvcjogbm9vcCxcbiAgfSk7XG59O1xuXG5jb25zdCBjbG9uZU9wdGlvbiA9IChvcHRpb246IE9wdGlvbikgPT4ge1xuICBjb25zdCBuZXdPcHRpb24gPSBuZXcgT3B0aW9uKG9wdGlvbi5mbGFncywgb3B0aW9uLmRlc2NyaXB0aW9uKTtcbiAgbmV3T3B0aW9uLm1ha2VPcHRpb25NYW5kYXRvcnkoZmFsc2UpO1xuICBuZXdPcHRpb24uZGVmYXVsdChvcHRpb24uZGVmYXVsdFZhbHVlLCBvcHRpb24uZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24pO1xuXG4gIG5ld09wdGlvbi5wcmVzZXQoKG9wdGlvbiBhcyBPcHRpb24gJiB7IHByZXNldEFyZzogdW5rbm93biB9KS5wcmVzZXRBcmcpO1xuICBuZXdPcHRpb24uZW52KChvcHRpb24gYXMgT3B0aW9uICYgeyBlbnZWYXI6IHN0cmluZyB9KS5lbnZWYXIpO1xuICBpZiAob3B0aW9uLnBhcnNlQXJnKSB7XG4gICAgbmV3T3B0aW9uLmFyZ1BhcnNlcihvcHRpb24ucGFyc2VBcmcpO1xuICB9XG5cbiAgaWYgKG9wdGlvbi5hcmdDaG9pY2VzKSB7XG4gICAgbmV3T3B0aW9uLmNob2ljZXMob3B0aW9uLmFyZ0Nob2ljZXMpO1xuICB9XG5cbiAgbmV3T3B0aW9uLmNvbmZsaWN0cyhcbiAgICAob3B0aW9uIGFzIE9wdGlvbiAmIHsgY29uZmxpY3RzV2l0aDogc3RyaW5nW10gfSkuY29uZmxpY3RzV2l0aCxcbiAgKTtcblxuICAobmV3T3B0aW9uIGFzIE9wdGlvbiAmIHsgaW1wbGllZDogdW5rbm93biB9KS5pbXBsaWVkID0gKFxuICAgIG9wdGlvbiBhcyBPcHRpb24gJiB7IGltcGxpZWQ6IHVua25vd24gfVxuICApLmltcGxpZWQ7XG5cbiAgcmV0dXJuIG5ld09wdGlvbjtcbn07XG5cbi8qKlxuICogUGFydGlhbGx5IHBhcnNlIGFyZ3YgZm9yIGEgY29tbWFuZCB3aXRob3V0IGV4ZWN1dGluZyB0aGUgYWN0aW9uLiBAc2VlIHtAbGluayBDb21tYW5kLnBhcnNlfVxuICpcbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBtYXRjaGVkIGNvbW1hbmQsIHRoZSBwcm92aWRlZCBvcHRpb25zLCBhbmQgdGhlIG1pc3Npbmcgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnRpYWxQYXJzZSA9IChcbiAgY29tbWFuZDogQ29tbWFuZCxcbiAgYXJndjogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBQYXJzZU9wdGlvbnMsXG4pOiBQYXJ0aWFsUGFyc2VSZXN1bHQgPT4ge1xuICBjb25zdCBwcm92aWRlZE9wdGlvbnMgPSBuZXcgTWFwPENvbW1hbmQsIE9wdGlvblZhbHVlcz4oKTtcbiAgY29uc3QgcHJvdmlkZWRPcHRpb25zU291cmNlcyA9IG5ldyBNYXA8XG4gICAgQ29tbWFuZCxcbiAgICBNYXA8c3RyaW5nLCBPcHRpb25WYWx1ZVNvdXJjZSB8IHVuZGVmaW5lZD5cbiAgPigpO1xuICBjb25zdCBjb21tYW5kc01hcCA9IG5ldyBNYXA8Q29tbWFuZCwgQ29tbWFuZD4oKTtcbiAgbGV0IG1hdGNoZWRDb21tYW5kOiBDb21tYW5kIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHNldFByb3ZpZGVkT3B0aW9uU291cmNlID0gKFxuICAgIGNvbW1hbmQ6IENvbW1hbmQsXG4gICAgb3B0aW9uS2V5OiBzdHJpbmcsXG4gICAgc291cmNlOiBPcHRpb25WYWx1ZVNvdXJjZSB8IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VzTWFwID1cbiAgICAgIHByb3ZpZGVkT3B0aW9uc1NvdXJjZXMuZ2V0KGNvbW1hbmQpID8/XG4gICAgICBuZXcgTWFwPHN0cmluZywgT3B0aW9uVmFsdWVTb3VyY2U+KCk7XG4gICAgc291cmNlc01hcC5zZXQob3B0aW9uS2V5LCBzb3VyY2UpO1xuICAgIHByb3ZpZGVkT3B0aW9uc1NvdXJjZXMuc2V0KGNvbW1hbmQsIHNvdXJjZXNNYXApO1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZVBhcnNlckNvbW1hbmQgPSAocGFyc2VyQ29tbWFuZDogQ29tbWFuZCwgY29tbWFuZDogQ29tbWFuZCkgPT4ge1xuICAgIGNvbW1hbmRzTWFwLnNldChwYXJzZXJDb21tYW5kLCBjb21tYW5kKTtcblxuICAgIGNvcHlDb21tYW5kU2V0dGluZ3MoY29tbWFuZCwgcGFyc2VyQ29tbWFuZCk7XG4gICAgZGlzYWJsZUNvbW1hbmRPdXRwdXQocGFyc2VyQ29tbWFuZCk7XG4gICAgcGFyc2VyQ29tbWFuZC5leGl0T3ZlcnJpZGUoKTtcblxuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGNvbW1hbmQub3B0aW9ucykge1xuICAgICAgLy8gU2tpcCBhZGRpbmcgdGhlIG9wdGlvbiBpZiBpdCdzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgICAgaWYgKFxuICAgICAgICBwYXJzZXJDb21tYW5kLm9wdGlvbnMuc29tZShcbiAgICAgICAgICAocGFyc2VyQ29tbWFuZE9wdGlvbikgPT4gcGFyc2VyQ29tbWFuZE9wdGlvbi5mbGFncyA9PT0gb3B0aW9uLmZsYWdzLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHBhcnNlckNvbW1hbmQuYWRkT3B0aW9uKGNsb25lT3B0aW9uKG9wdGlvbikpO1xuICAgIH1cblxuICAgIHBhcnNlckNvbW1hbmQuaG9vayhcInByZVN1YmNvbW1hbmRcIiwgKHRoaXNDb21tYW5kLCBhY3Rpb25Db21tYW5kKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNtZCBvZiBbdGhpc0NvbW1hbmQsIGFjdGlvbkNvbW1hbmRdKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ29tbWFuZCA9IGdldE9yVGhyb3coY29tbWFuZHNNYXAsIGNtZCk7XG4gICAgICAgIHByb3ZpZGVkT3B0aW9ucy5zZXQob3JpZ2luYWxDb21tYW5kLCBjbWQub3B0cygpKTtcblxuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbktleSBvZiBPYmplY3Qua2V5cyhjbWQub3B0cygpKSkge1xuICAgICAgICAgIHNldFByb3ZpZGVkT3B0aW9uU291cmNlKFxuICAgICAgICAgICAgb3JpZ2luYWxDb21tYW5kLFxuICAgICAgICAgICAgb3B0aW9uS2V5LFxuICAgICAgICAgICAgY21kLmdldE9wdGlvblZhbHVlU291cmNlKG9wdGlvbktleSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcGFyc2VyQ29tbWFuZC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ2luYWxDb21tYW5kID0gZ2V0T3JUaHJvdyhjb21tYW5kc01hcCwgcGFyc2VyQ29tbWFuZCk7XG4gICAgICBwcm92aWRlZE9wdGlvbnMuc2V0KG9yaWdpbmFsQ29tbWFuZCwgcGFyc2VyQ29tbWFuZC5vcHRzKCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbktleSBvZiBPYmplY3Qua2V5cyhwYXJzZXJDb21tYW5kLm9wdHMoKSkpIHtcbiAgICAgICAgc2V0UHJvdmlkZWRPcHRpb25Tb3VyY2UoXG4gICAgICAgICAgb3JpZ2luYWxDb21tYW5kLFxuICAgICAgICAgIG9wdGlvbktleSxcbiAgICAgICAgICBwYXJzZXJDb21tYW5kLmdldE9wdGlvblZhbHVlU291cmNlKG9wdGlvbktleSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG1hdGNoZWRDb21tYW5kID0gY29tbWFuZDtcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3Qgc3ViY29tbWFuZCBvZiBjb21tYW5kLmNvbW1hbmRzIGFzIENvbW1hbmRbXSkge1xuICAgICAgY29uc3QgcGFyc2VyU3ViY29tbWFuZCA9IHBhcnNlckNvbW1hbmQuY29tbWFuZChzdWJjb21tYW5kLm5hbWUoKSk7XG4gICAgICBjcmVhdGVQYXJzZXJDb21tYW5kKHBhcnNlclN1YmNvbW1hbmQsIHN1YmNvbW1hbmQpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZXJDb21tYW5kO1xuICB9O1xuXG4gIGNvbnN0IHBhcnNlckNvbW1hbmQgPSBjcmVhdGVQYXJzZXJDb21tYW5kKG5ldyBDb21tYW5kKCksIGNvbW1hbmQpO1xuICBwYXJzZXJDb21tYW5kLnBhcnNlKGFyZ3YsIG9wdGlvbnMpO1xuXG4gIGNvbnN0IG1pc3NpbmdPcHRpb25zID0gbWF0Y2hlZENvbW1hbmRcbiAgICA/IGZpbmRNaXNzaW5nT3B0aW9ucyhtYXRjaGVkQ29tbWFuZCwgcHJvdmlkZWRPcHRpb25zKVxuICAgIDogbmV3IE1hcDxDb21tYW5kLCBTZXQ8c3RyaW5nPj4oKTtcblxuICByZXR1cm4ge1xuICAgIG1hdGNoZWRDb21tYW5kLFxuICAgIG1pc3NpbmdPcHRpb25zLFxuICAgIHByb3ZpZGVkT3B0aW9ucyxcbiAgICBwcm92aWRlZE9wdGlvbnNTb3VyY2VzLFxuICB9O1xufTtcbiIsCiAgICAiZXhwb3J0IGNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBOzs7QUNETyxJQUFNLE9BQU8sTUFBTTs7O0FEVTFCLElBQU0scUJBQXFCO0FBQUEsRUFDekI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBUUEsSUFBTSxhQUFhLENBQWEsS0FBc0IsUUFBb0I7QUFBQSxFQUN4RSxNQUFNLFFBQVEsSUFBSSxJQUFJLEdBQUc7QUFBQSxFQUN6QixJQUFJLFVBQVUsV0FBVztBQUFBLElBQ3ZCLE1BQU0sSUFBSSxNQUFNLGtDQUFrQztBQUFBLEVBQ3BEO0FBQUEsRUFFQSxPQUFPO0FBQUE7QUFHRixJQUFNLHFCQUFxQixDQUNoQyxTQUNBLDZCQUNHO0FBQUEsRUFDSCxNQUFNLDBCQUEwQixJQUFJO0FBQUEsRUFFcEMsSUFBSSxpQkFBNkM7QUFBQSxFQUVqRCxPQUFPLGdCQUFnQjtBQUFBLElBQ3JCLE1BQU0saUJBQWlCLElBQUk7QUFBQSxJQUMzQixNQUFNLGtCQUFrQix5QkFBeUIsSUFBSSxjQUFjO0FBQUEsSUFDbkUsV0FBVyxVQUFVLGVBQWUsU0FBUztBQUFBLE1BQzNDLE1BQU0sYUFBYSxPQUFPLFNBQ3RCLE9BQU8sTUFBTSxRQUFRLFVBQVUsRUFBRSxJQUNoQyxPQUFPLFFBQVEsT0FBTztBQUFBLE1BQzNCLElBQUksQ0FBQyxZQUFZO0FBQUEsUUFDZjtBQUFBLE1BQ0Y7QUFBQSxNQUVBLE1BQU0sTUFBTSxVQUFVLFVBQVU7QUFBQSxNQUVoQyxJQUFJLGtCQUFrQixTQUFTLFdBQVc7QUFBQSxRQUN4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