projen
Version:
CDK for software projects
209 lines • 20.8 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.Tasks = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const component_1 = require("./component");
const logging_1 = require("./logging");
const task_1 = require("./task");
const task_runner_1 = require("./task-runner");
/**
* Defines and manages project tasks.
*
* Tasks extend the projen CLI by adding subcommands to it. Task definitions are
* synthesized into `.projen/tasks.json`.
*/
class Tasks extends component_1.Component {
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Tasks", version: "0.103.12" };
_tasks;
_env;
_shell;
_runner;
constructor(project) {
super(project);
this._tasks = {};
this._env = {};
// Eagerly create the default task runner. The runner is a component that
// owns the `.projen/tasks.json` manifest, so it must be part of the
// construct tree for the manifest to be synthesized.
this._runner = new task_runner_1.ProjenTaskRunner(this);
}
/**
* All tasks.
*/
get all() {
return Object.values(this._tasks);
}
/**
* Adds a task to a project.
* @param name The name of the task
* @param options Task options.
*/
addTask(name, options = {}) {
const task = new task_1.Task(name, options);
if (this._tasks[name]) {
throw new Error(`A task with the name ${name} already exists. To override it, call removeTask first and then create the new task.`);
}
this._tasks[name] = task;
return task;
}
/**
* Removes a task from a project.
*
* @param name The name of the task to remove.
*
* @returns The `Task` that was removed, otherwise `undefined`.
*/
removeTask(name) {
const dependentTasks = this.all.filter((task) => task.steps.find((step) => step.spawn == name));
if (dependentTasks.length > 0) {
const errList = dependentTasks.map((depTask) => depTask.name).join(", ");
throw new Error(`Unable to remove task "${name}" because the following tasks depend on it: ${errList}`);
}
const task = this._tasks[name];
if (task) {
delete this._tasks[name];
return task;
}
else {
return undefined;
}
}
/**
* Adds global environment.
* @param name Environment variable name
* @param value Value
*/
addEnvironment(name, value) {
this._env[name] = value;
}
/**
* Returns a copy of the currently global environment for this project.
*/
get env() {
return {
...this._env,
};
}
/**
* The default shell used to run all task commands, or `undefined` for the
* built-in cross-platform projen shell. Individual tasks and steps can
* override this.
* @see {@link TaskCommonOptions.shell}
*/
get shell() {
return this._shell;
}
/**
* Sets the default shell used to run all task commands.
*/
set shell(shell) {
this._shell = shell;
}
/**
* Finds a task by name. Returns `undefined` if the task cannot be found.
* @param name The name of the task
*/
tryFind(name) {
return this._tasks[name];
}
/**
* Runs the specified task.
*
* @param name The name of the task to run.
* @param args Arguments to pass to the task.
*/
runTask(name, args) {
const task = this._tasks[name];
if (!task) {
throw new Error(`cannot find command ${name}`);
}
this._runner.runTask(task, args);
}
synthesize() {
if (this.project.ejected) {
// Insert a task-runner script so that tasks can be run after ejecting
fs.mkdirSync(path.join(this.project.outdir, "scripts"), {
recursive: true,
});
fs.copyFileSync(
// The bundled task runner lives at <pkg>/lib/run-task.cjs. This file is
// at src/ (ts-jest) or lib/ (compiled); in both cases
// "../lib/run-task.cjs" resolves to the real bundle under lib/.
path.join(__dirname, "..", "lib", "run-task.cjs"), path.join(this.project.outdir, "scripts", "run-task.cjs"));
fs.chmodSync(path.join(this.project.outdir, "scripts", "run-task.cjs"), "755");
}
}
resolveTasksManifest(resolver) {
const obj = {
env: (() => this.renderEnv()),
shell: (() => this._shell?._render()),
tasks: (() => this.renderTasks()),
};
return (resolver.resolve(obj, {
omitEmpty: true,
}) ?? undefined);
}
renderTasks() {
const tasks = {};
for (const task of Object.values(this._tasks).sort((x, y) => x.name.localeCompare(y.name))) {
tasks[task.name] = task._renderSpec();
}
return tasks;
}
renderEnv() {
return Object.keys(this._env).reduce((prev, curr) => ({
...prev,
[curr]: this.getEnvString(curr, this._env[curr]),
}), {});
}
/**
* Ensure that environment variables are persisted as strings
* to prevent type errors when parsing from tasks.json in future
*/
getEnvString(name, value) {
if (typeof value !== "string" && value !== undefined) {
(0, logging_1.warn)(`Received non-string value for environment variable ${name}. Value will be stringified.`);
return String(value);
}
else {
return value;
}
}
}
exports.Tasks = Tasks;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGFza3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsMkNBQXdDO0FBRXhDLHVDQUFpQztBQUdqQyxpQ0FBOEI7QUFFOUIsK0NBQW1FO0FBR25FOzs7OztHQUtHO0FBQ0gsTUFBYSxLQUFNLFNBQVEscUJBQVM7O0lBQ2pCLE1BQU0sQ0FBMkI7SUFDakMsSUFBSSxDQUE2QjtJQUMxQyxNQUFNLENBQWE7SUFDbkIsT0FBTyxDQUFjO0lBRTdCLFlBQVksT0FBZ0I7UUFDMUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWYsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFZix5RUFBeUU7UUFDekUsb0VBQW9FO1FBQ3BFLHFEQUFxRDtRQUNyRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksOEJBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxHQUFHO1FBQ1osT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE9BQU8sQ0FBQyxJQUFZLEVBQUUsVUFBdUIsRUFBRTtRQUNwRCxNQUFNLElBQUksR0FBRyxJQUFJLFdBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FDYix3QkFBd0IsSUFBSSxzRkFBc0YsQ0FDbkgsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FB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QyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDZixHQUFHLElBQUk7WUFDUCxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakQsQ0FBQyxFQUNGLEVBQUUsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNLLFlBQVksQ0FBQyxJQUFZLEVBQUUsS0FBVTtRQUMzQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckQsSUFBQSxjQUFJLEVBQ0Ysc0RBQXNELElBQUksOEJBQThCLENBQ3pGLENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7O0FBak1ILHNCQWtNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IElSZXNvbHZlciB9IGZyb20gXCIuL2ZpbGVcIjtcbmltcG9ydCB7IHdhcm4gfSBmcm9tIFwiLi9sb2dnaW5nXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tIFwiLi9wcm9qZWN0XCI7XG5pbXBvcnQgdHlwZSB7IFRhc2tPcHRpb25zIH0gZnJvbSBcIi4vdGFza1wiO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gXCIuL3Rhc2tcIjtcbmltcG9ydCB0eXBlIHsgVGFza3NNYW5pZmVzdCwgVGFza1NwZWMgfSBmcm9tIFwiLi90YXNrLW1vZGVsXCI7XG5pbXBvcnQgeyBQcm9qZW5UYXNrUnVubmVyLCB0eXBlIElUYXNrUnVubmVyIH0gZnJvbSBcIi4vdGFzay1ydW5uZXJcIjtcbmltcG9ydCB0eXBlIHsgVGFza1NoZWxsIH0gZnJvbSBcIi4vdGFzay1zaGVsbFwiO1xuXG4vKipcbiAqIERlZmluZXMgYW5kIG1hbmFnZXMgcHJvamVjdCB0YXNrcy5cbiAqXG4gKiBUYXNrcyBleHRlbmQgdGhlIHByb2plbiBDTEkgYnkgYWRkaW5nIHN1YmNvbW1hbmRzIHRvIGl0LiBUYXNrIGRlZmluaXRpb25zIGFyZVxuICogc3ludGhlc2l6ZWQgaW50byBgLnByb2plbi90YXNrcy5qc29uYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tzIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfdGFza3M6IHsgW25hbWU6IHN0cmluZ106IFRhc2sgfTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgcHJpdmF0ZSBfc2hlbGw/OiBUYXNrU2hlbGw7XG4gIHByaXZhdGUgX3J1bm5lcjogSVRhc2tSdW5uZXI7XG5cbiAgY29uc3RydWN0b3IocHJvamVjdDogUHJvamVjdCkge1xuICAgIHN1cGVyKHByb2plY3QpO1xuXG4gICAgdGhpcy5fdGFza3MgPSB7fTtcbiAgICB0aGlzLl9lbnYgPSB7fTtcblxuICAgIC8vIEVhZ2VybHkgY3JlYXRlIHRoZSBkZWZhdWx0IHRhc2sgcnVubmVyLiBUaGUgcnVubmVyIGlzIGEgY29tcG9uZW50IHRoYXRcbiAgICAvLyBvd25zIHRoZSBgLnByb2plbi90YXNrcy5qc29uYCBtYW5pZmVzdCwgc28gaXQgbXVzdCBiZSBwYXJ0IG9mIHRoZVxuICAgIC8vIGNvbnN0cnVjdCB0cmVlIGZvciB0aGUgbWFuaWZlc3QgdG8gYmUgc3ludGhlc2l6ZWQuXG4gICAgdGhpcy5fcnVubmVyID0gbmV3IFByb2plblRhc2tSdW5uZXIodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQWxsIHRhc2tzLlxuICAgKi9cbiAgcHVibGljIGdldCBhbGwoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fdGFza3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB0YXNrIHRvIGEgcHJvamVjdC5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHRhc2tcbiAgICogQHBhcmFtIG9wdGlvbnMgVGFzayBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIGFkZFRhc2sobmFtZTogc3RyaW5nLCBvcHRpb25zOiBUYXNrT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgdGFzayA9IG5ldyBUYXNrKG5hbWUsIG9wdGlvbnMpO1xuICAgIGlmICh0aGlzLl90YXNrc1tuYW1lXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQSB0YXNrIHdpdGggdGhlIG5hbWUgJHtuYW1lfSBhbHJlYWR5IGV4aXN0cy4gVG8gb3ZlcnJpZGUgaXQsIGNhbGwgcmVtb3ZlVGFzayBmaXJzdCBhbmQgdGhlbiBjcmVhdGUgdGhlIG5ldyB0YXNrLmAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl90YXNrc1tuYW1lXSA9IHRhc2s7XG4gICAgcmV0dXJuIHRhc2s7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHRhc2sgZnJvbSBhIHByb2plY3QuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0YXNrIHRvIHJlbW92ZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGBUYXNrYCB0aGF0IHdhcyByZW1vdmVkLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlVGFzayhuYW1lOiBzdHJpbmcpOiB1bmRlZmluZWQgfCBUYXNrIHtcbiAgICBjb25zdCBkZXBlbmRlbnRUYXNrcyA9IHRoaXMuYWxsLmZpbHRlcigodGFzaykgPT5cbiAgICAgIHRhc2suc3RlcHMuZmluZCgoc3RlcCkgPT4gc3RlcC5zcGF3biA9PSBuYW1lKSxcbiAgICApO1xuICAgIGlmIChkZXBlbmRlbnRUYXNrcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBlcnJMaXN0ID0gZGVwZW5kZW50VGFza3MubWFwKChkZXBUYXNrKSA9PiBkZXBUYXNrLm5hbWUpLmpvaW4oXCIsIFwiKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVuYWJsZSB0byByZW1vdmUgdGFzayBcIiR7bmFtZX1cIiBiZWNhdXNlIHRoZSBmb2xsb3dpbmcgdGFza3MgZGVwZW5kIG9uIGl0OiAke2Vyckxpc3R9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFzayA9IHRoaXMuX3Rhc2tzW25hbWVdO1xuICAgIGlmICh0YXNrKSB7XG4gICAgICBkZWxldGUgdGhpcy5fdGFza3NbbmFtZV07XG4gICAgICByZXR1cm4gdGFzaztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBnbG9iYWwgZW52aXJvbm1lbnQuXG4gICAqIEBwYXJhbSBuYW1lIEVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVcbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlXG4gICAqL1xuICBwdWJsaWMgYWRkRW52aXJvbm1lbnQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZW52W25hbWVdID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGN1cnJlbnRseSBnbG9iYWwgZW52aXJvbm1lbnQgZm9yIHRoaXMgcHJvamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgZW52KCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLl9lbnYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBzaGVsbCB1c2VkIHRvIHJ1biBhbGwgdGFzayBjb21tYW5kcywgb3IgYHVuZGVmaW5lZGAgZm9yIHRoZVxuICAgKiBidWlsdC1pbiBjcm9zcy1wbGF0Zm9ybSBwcm9qZW4gc2hlbGwuIEluZGl2aWR1YWwgdGFza3MgYW5kIHN0ZXBzIGNhblxuICAgKiBvdmVycmlkZSB0aGlzLlxuICAgKiBAc2VlIHtAbGluayBUYXNrQ29tbW9uT3B0aW9ucy5zaGVsbH1cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hlbGwoKTogVGFza1NoZWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlbGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZGVmYXVsdCBzaGVsbCB1c2VkIHRvIHJ1biBhbGwgdGFzayBjb21tYW5kcy5cbiAgICovXG4gIHB1YmxpYyBzZXQgc2hlbGwoc2hlbGw6IFRhc2tTaGVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3NoZWxsID0gc2hlbGw7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSB0YXNrIGJ5IG5hbWUuIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIHRhc2sgY2Fubm90IGJlIGZvdW5kLlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFza1xuICAgKi9cbiAgcHVibGljIHRyeUZpbmQobmFtZTogc3RyaW5nKTogdW5kZWZpbmVkIHwgVGFzayB7XG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tzW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHNwZWNpZmllZCB0YXNrLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFzayB0byBydW4uXG4gICAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB0YXNrLlxuICAgKi9cbiAgcHVibGljIHJ1blRhc2sobmFtZTogc3RyaW5nLCBhcmdzPzogKHN0cmluZyB8IG51bWJlcilbXSkge1xuICAgIGNvbnN0IHRhc2sgPSB0aGlzLl90YXNrc1tuYW1lXTtcbiAgICBpZiAoIXRhc2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2Fubm90IGZpbmQgY29tbWFuZCAke25hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMuX3J1bm5lci5ydW5UYXNrKHRhc2ssIGFyZ3MpO1xuICB9XG5cbiAgcHVibGljIHN5bnRoZXNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJvamVjdC5lamVjdGVkKSB7XG4gICAgICAvLyBJbnNlcnQgYSB0YXNrLXJ1bm5lciBzY3JpcHQgc28gdGhhdCB0YXNrcyBjYW4gYmUgcnVuIGFmdGVyIGVqZWN0aW5nXG4gICAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKHRoaXMucHJvamVjdC5vdXRkaXIsIFwic2NyaXB0c1wiKSwge1xuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGZzLmNvcHlGaWxlU3luYyhcbiAgICAgICAgLy8gVGhlIGJ1bmRsZWQgdGFzayBydW5uZXIgbGl2ZXMgYXQgPHBrZz4vbGliL3J1bi10YXNrLmNqcy4gVGhpcyBmaWxlIGlzXG4gICAgICAgIC8vIGF0IHNyYy8gKHRzLWplc3QpIG9yIGxpYi8gKGNvbXBpbGVkKTsgaW4gYm90aCBjYXNlc1xuICAgICAgICAvLyBcIi4uL2xpYi9ydW4tdGFzay5janNcIiByZXNvbHZlcyB0byB0aGUgcmVhbCBidW5kbGUgdW5kZXIgbGliLy5cbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLlwiLCBcImxpYlwiLCBcInJ1bi10YXNrLmNqc1wiKSxcbiAgICAgICAgcGF0aC5qb2luKHRoaXMucHJvamVjdC5vdXRkaXIsIFwic2NyaXB0c1wiLCBcInJ1bi10YXNrLmNqc1wiKSxcbiAgICAgICk7XG4gICAgICBmcy5jaG1vZFN5bmMoXG4gICAgICAgIHBhdGguam9pbih0aGlzLnByb2plY3Qub3V0ZGlyLCBcInNjcmlwdHNcIiwgXCJydW4tdGFzay5janNcIiksXG4gICAgICAgIFwiNzU1XCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlVGFza3NNYW5pZmVzdChyZXNvbHZlcjogSVJlc29sdmVyKTogVGFza3NNYW5pZmVzdCB7XG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgZW52OiAoKCkgPT4gdGhpcy5yZW5kZXJFbnYoKSkgYXMgYW55LFxuICAgICAgc2hlbGw6ICgoKSA9PiB0aGlzLl9zaGVsbD8uX3JlbmRlcigpKSBhcyBhbnksXG4gICAgICB0YXNrczogKCgpID0+IHRoaXMucmVuZGVyVGFza3MoKSkgYXMgYW55LFxuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgcmVzb2x2ZXIucmVzb2x2ZShvYmosIHtcbiAgICAgICAgb21pdEVtcHR5OiB0cnVlLFxuICAgICAgfSkgPz8gdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyVGFza3MoKSB7XG4gICAgY29uc3QgdGFza3M6IHsgW25hbWU6IHN0cmluZ106IFRhc2tTcGVjIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHRhc2sgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLl90YXNrcykuc29ydCgoeCwgeSkgPT5cbiAgICAgIHgubmFtZS5sb2NhbGVDb21wYXJlKHkubmFtZSksXG4gICAgKSkge1xuICAgICAgdGFza3NbdGFzay5uYW1lXSA9IHRhc2suX3JlbmRlclNwZWMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFza3M7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckVudigpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fZW52KS5yZWR1Y2UoXG4gICAgICAocHJldiwgY3VycikgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgW2N1cnJdOiB0aGlzLmdldEVudlN0cmluZyhjdXJyLCB0aGlzLl9lbnZbY3Vycl0pLFxuICAgICAgfSksXG4gICAgICB7fSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSB0aGF0IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgcGVyc2lzdGVkIGFzIHN0cmluZ3NcbiAgICogdG8gcHJldmVudCB0eXBlIGVycm9ycyB3aGVuIHBhcnNpbmcgZnJvbSB0YXNrcy5qc29uIGluIGZ1dHVyZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFbnZTdHJpbmcobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgUmVjZWl2ZWQgbm9uLXN0cmluZyB2YWx1ZSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUgJHtuYW1lfS4gVmFsdWUgd2lsbCBiZSBzdHJpbmdpZmllZC5gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG59XG4iXX0=