projen 0.101.2 → 0.101.4
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/.jsii +878 -110
- package/lib/ai-instructions.js +2 -2
- package/lib/awscdk/auto-discover.js +6 -6
- package/lib/awscdk/awscdk-app-java.js +1 -1
- package/lib/awscdk/awscdk-app-py.js +1 -1
- package/lib/awscdk/awscdk-app-ts.js +1 -1
- package/lib/awscdk/awscdk-construct.js +1 -1
- package/lib/awscdk/awscdk-deps-java.js +1 -1
- package/lib/awscdk/awscdk-deps-js.js +1 -1
- package/lib/awscdk/awscdk-deps-py.js +1 -1
- package/lib/awscdk/awscdk-deps.js +1 -1
- package/lib/awscdk/cdk-config.js +3 -3
- package/lib/awscdk/cdk-tasks.js +1 -1
- package/lib/awscdk/integration-test.js +1 -1
- package/lib/awscdk/lambda-extension.js +1 -1
- package/lib/awscdk/lambda-function.js +2 -2
- package/lib/build/build-workflow.js +1 -1
- package/lib/cdk/auto-discover-base.js +2 -2
- package/lib/cdk/construct-lib.js +1 -1
- package/lib/cdk/integration-test-base.js +1 -1
- package/lib/cdk/jsii-build.js +1 -1
- package/lib/cdk/jsii-docgen.js +1 -1
- package/lib/cdk/jsii-project.js +1 -1
- package/lib/cdk8s/auto-discover.js +2 -2
- package/lib/cdk8s/cdk8s-app-py.js +1 -1
- package/lib/cdk8s/cdk8s-app-ts.js +1 -1
- package/lib/cdk8s/cdk8s-construct.js +1 -1
- package/lib/cdk8s/cdk8s-deps-py.js +1 -1
- package/lib/cdk8s/cdk8s-deps.js +1 -1
- package/lib/cdk8s/integration-test.js +1 -1
- package/lib/cdktf/cdktf-construct.js +1 -1
- package/lib/circleci/circleci.js +1 -1
- package/lib/cli/task-runtime.js +34 -7
- package/lib/component.d.ts +70 -0
- package/lib/component.js +183 -3
- package/lib/dependencies.js +1 -1
- package/lib/dev-env.js +1 -1
- package/lib/docker-compose/docker-compose-service.js +1 -1
- package/lib/docker-compose/docker-compose.js +1 -1
- package/lib/file.js +1 -1
- package/lib/gitattributes.js +1 -1
- package/lib/github/actions-provider.js +1 -1
- package/lib/github/auto-approve.js +1 -1
- package/lib/github/auto-merge.js +1 -1
- package/lib/github/auto-queue.js +1 -1
- package/lib/github/dependabot.js +1 -1
- package/lib/github/dependency-review.js +1 -1
- package/lib/github/github-credentials.js +1 -1
- package/lib/github/github-project.js +1 -1
- package/lib/github/github.js +1 -1
- package/lib/github/merge-queue.js +1 -1
- package/lib/github/mergify.js +1 -1
- package/lib/github/pr-template.js +1 -1
- package/lib/github/pull-request-backport.js +1 -1
- package/lib/github/pull-request-lint.js +1 -1
- package/lib/github/stale.js +1 -1
- package/lib/github/task-workflow-job.js +1 -1
- package/lib/github/task-workflow.js +1 -1
- package/lib/github/workflow-actions.js +1 -1
- package/lib/github/workflow-jobs.js +1 -1
- package/lib/github/workflow-steps.js +1 -1
- package/lib/github/workflows.js +1 -1
- package/lib/gitlab/configuration.js +1 -1
- package/lib/gitlab/gitlab-configuration.js +1 -1
- package/lib/gitlab/nested-configuration.js +1 -1
- package/lib/gitpod.js +1 -1
- package/lib/ignore-file.js +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -1
- package/lib/ini.js +1 -1
- package/lib/java/java-project.js +1 -1
- package/lib/java/junit.js +1 -1
- package/lib/java/maven-compile.js +1 -1
- package/lib/java/maven-packaging.js +1 -1
- package/lib/java/maven-sample.js +1 -1
- package/lib/java/pom.js +2 -2
- package/lib/java/projenrc.js +1 -1
- package/lib/javascript/biome/biome.js +1 -1
- package/lib/javascript/bundler.js +1 -1
- package/lib/javascript/eslint.js +1 -1
- package/lib/javascript/jest.js +4 -4
- package/lib/javascript/license-checker.js +1 -1
- package/lib/javascript/node-package.js +1 -1
- package/lib/javascript/node-project.js +1 -1
- package/lib/javascript/npm-config.js +1 -1
- package/lib/javascript/prettier.js +1 -1
- package/lib/javascript/projenrc.js +1 -1
- package/lib/javascript/typescript-config.js +2 -2
- package/lib/javascript/upgrade-dependencies.js +2 -2
- package/lib/javascript/yarnrc.js +1 -1
- package/lib/json-patch.js +1 -1
- package/lib/json.js +1 -1
- package/lib/license.js +1 -1
- package/lib/logger.js +1 -1
- package/lib/makefile.js +1 -1
- package/lib/object-file.js +1 -1
- package/lib/project-build.js +1 -1
- package/lib/project-tree.js +1 -1
- package/lib/project.js +1 -1
- package/lib/projects.js +1 -1
- package/lib/projenrc-json.js +1 -1
- package/lib/projenrc.js +1 -1
- package/lib/python/pip.js +1 -1
- package/lib/python/poetry.js +2 -2
- package/lib/python/projenrc.js +1 -1
- package/lib/python/pyproject-toml-file.js +1 -1
- package/lib/python/pytest-sample.js +1 -1
- package/lib/python/pytest.js +1 -1
- package/lib/python/python-project.d.ts +1 -1
- package/lib/python/python-project.js +2 -2
- package/lib/python/python-sample.js +1 -1
- package/lib/python/requirements-file.js +1 -1
- package/lib/python/setuppy.js +1 -1
- package/lib/python/setuptools.js +1 -1
- package/lib/python/uv.js +1 -1
- package/lib/python/venv.js +1 -1
- package/lib/readme.js +1 -1
- package/lib/release/publisher.js +1 -1
- package/lib/release/release-trigger.js +1 -1
- package/lib/release/release.js +1 -1
- package/lib/renovatebot.js +1 -1
- package/lib/run-task.cjs +20 -3
- package/lib/sample-file.js +2 -2
- package/lib/script-runner.d.ts +35 -0
- package/lib/script-runner.js +22 -0
- package/lib/source-code.js +1 -1
- package/lib/task-shell.js +1 -1
- package/lib/task.js +1 -1
- package/lib/tasks.js +1 -1
- package/lib/testing.js +1 -1
- package/lib/textfile.js +1 -1
- package/lib/toml.js +1 -1
- package/lib/typescript/index.d.ts +1 -0
- package/lib/typescript/index.js +2 -1
- package/lib/typescript/projenrc-ts.d.ts +11 -3
- package/lib/typescript/projenrc-ts.js +38 -6
- package/lib/typescript/projenrc.d.ts +14 -3
- package/lib/typescript/projenrc.js +36 -18
- package/lib/typescript/typescript-runner.d.ts +146 -0
- package/lib/typescript/typescript-runner.js +134 -0
- package/lib/typescript/typescript-typedoc.js +1 -1
- package/lib/typescript/typescript.d.ts +14 -0
- package/lib/typescript/typescript.js +12 -6
- package/lib/util/recreate.d.ts +30 -0
- package/lib/util/recreate.js +38 -0
- package/lib/version.js +2 -2
- package/lib/vscode/devcontainer.js +1 -1
- package/lib/vscode/extensions.js +1 -1
- package/lib/vscode/launch-config.js +1 -1
- package/lib/vscode/settings.js +1 -1
- package/lib/vscode/vscode.js +1 -1
- package/lib/web/next.js +3 -3
- package/lib/web/postcss.js +1 -1
- package/lib/web/react.js +3 -3
- package/lib/web/tailwind.js +1 -1
- package/lib/xmlfile.js +1 -1
- package/lib/yaml.js +1 -1
- package/package.json +2 -2
package/lib/cli/task-runtime.js
CHANGED
|
@@ -62,6 +62,23 @@ const QUOTED_ARGS_MARKER = `"${ARGS_MARKER}"`;
|
|
|
62
62
|
function quoteArg(arg) {
|
|
63
63
|
return '"' + arg.replace(/(["$`\\])/g, "\\$1") + '"';
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* dax's built-in cross-platform shell only implements a subset of POSIX shell
|
|
67
|
+
* syntax and throws a terse `Not implemented: ...` for the rest. Rewrite those
|
|
68
|
+
* into a short, actionable error that points at the system-shell escape hatch;
|
|
69
|
+
* pass every other error through unchanged.
|
|
70
|
+
*/
|
|
71
|
+
function enrichBuiltinShellError(error, command) {
|
|
72
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
73
|
+
if (!/Not implemented:/.test(message)) {
|
|
74
|
+
/* v8 ignore next */
|
|
75
|
+
return error;
|
|
76
|
+
}
|
|
77
|
+
const commandLine = Array.isArray(command) ? command.join(" ") : command;
|
|
78
|
+
return new Error("projen's built-in shell can't run this command:\n" +
|
|
79
|
+
` ${commandLine}\n` +
|
|
80
|
+
"To use your system's shell instead, set this task to TaskShell.system().");
|
|
81
|
+
}
|
|
65
82
|
/**
|
|
66
83
|
* The runtime component of the tasks engine.
|
|
67
84
|
*/
|
|
@@ -493,12 +510,22 @@ class RunTask {
|
|
|
493
510
|
}
|
|
494
511
|
// Otherwise run through dax: the "projen" shell or an explicit invocation.
|
|
495
512
|
const builder = this.buildDaxCommand(command, shell);
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
513
|
+
let result;
|
|
514
|
+
try {
|
|
515
|
+
result = await builder
|
|
516
|
+
.cwd(cwd)
|
|
517
|
+
.env(env)
|
|
518
|
+
.stdout(capture ? "piped" : "inherit")
|
|
519
|
+
.stderr(capture ? "piped" : "inherit")
|
|
520
|
+
.noThrow();
|
|
521
|
+
}
|
|
522
|
+
catch (e) {
|
|
523
|
+
// dax's in-process shell throws a terse `Not implemented: ...` for shell
|
|
524
|
+
// syntax it does not support (e.g. `$(...)` command substitution); turn
|
|
525
|
+
// that into an actionable error that points at the system-shell escape
|
|
526
|
+
// hatch. Other errors pass through unchanged.
|
|
527
|
+
throw enrichBuiltinShellError(e, command);
|
|
528
|
+
}
|
|
502
529
|
return {
|
|
503
530
|
status: result.code,
|
|
504
531
|
stdout: capture ? Buffer.from(result.stdoutBytes) : null,
|
|
@@ -548,4 +575,4 @@ class RunTask {
|
|
|
548
575
|
return `"${process.execPath}" "${program}"`;
|
|
549
576
|
}
|
|
550
577
|
}
|
|
551
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS90YXNrLXJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkJBQXdEO0FBQ3hELCtCQUE4QztBQUM5QywyQ0FBNkI7QUFDN0IsK0JBQThCO0FBQzlCLGlDQUF3QztBQUN4Qyw2QkFBd0I7QUFDeEIsc0NBQStEO0FBQy9ELG9EQUFzQztBQUV0Qyx1Q0FBaUQ7QUFFakQscUVBQXFFO0FBQ3JFLGdGQUFnRjtBQUNoRixnRkFBZ0Y7QUFDaEYsMkVBQTJFO0FBQzNFLG1FQUFtRTtBQUNuRSxpRUFBaUU7QUFDakUsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUMvRCxNQUFNLGlCQUFpQixHQUNyQix1QkFBdUIsRUFBRSxPQUFPLElBQUksdUJBQXVCLENBQUM7QUFFOUQsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQztBQUN6QixNQUFNLGtCQUFrQixHQUFHLElBQUksV0FBVyxHQUFHLENBQUM7QUFFOUM7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLEdBQVc7SUFDM0IsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3ZELENBQUM7QUE4QkQ7O0dBRUc7QUFDSCxNQUFhLFdBQVc7SUFDdEI7O09BRUc7SUFDSSxNQUFNLENBQVUsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNwRCxtQkFBVSxFQUNWLFlBQVksQ0FDYixDQUFDO0lBRUY7Ozs7Ozs7OztPQVNHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBZSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztR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QUMsSUFBQSxXQUFJLEVBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxNQUFNLE1BQU0sR0FBRyxJQUFBLGNBQU8sRUFBQyxVQUFVLENBQUMsQ0FBQztZQUNuQyxJQUFJLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1lBQzlELENBQUM7WUFDRCxVQUFVLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUM3QixJQUFBLFdBQUksRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLEdBQUcsT0FBTyxVQUFVLENBQUMsQ0FDOUMsQ0FBQztRQUNGLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxNQUFNLE9BQU8sR0FBRyxDQUFDO0lBQzlDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYywgc3RhdFN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcInV0aWxcIjtcbmltcG9ydCB7IGdyYXksIHVuZGVybGluZSB9IGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgJCB9IGZyb20gXCJkYXhcIjtcbmltcG9ydCB7IFBST0pFTl9ESVIsIFRBU0tTX01BTklGRVNUX1ZFUlNJT04gfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQgKiBhcyBsb2dnaW5nIGZyb20gXCIuLi9sb2dnaW5nXCI7XG5pbXBvcnQgdHlwZSB7IFRhc2tzTWFuaWZlc3QsIFRhc2tTcGVjLCBUYXNrU3RlcCB9IGZyb20gXCIuLi90YXNrLW1vZGVsXCI7XG5pbXBvcnQgeyBzeXN0ZW1TaGVsbCwgdG9vbCB9IGZyb20gXCIuLi91dGlsL2V4ZWNcIjtcblxuLy8gYXZvaWRzIGEgKGZhbHNlIHBvc2l0aXZlKSBlc2J1aWxkIHdhcm5pbmcgYWJvdXQgaW5jb3JyZWN0IGltcG9ydHMuXG4vLyBgPy5kZWZhdWx0ID8/IG1vZHVsZWAga2VlcHMgdGhpcyB3b3JraW5nIGJvdGggYXMgYSBwbGFpbiBDb21tb25KUyByZXF1aXJlIGFuZFxuLy8gd2hlbiB0aGUgZGVwZW5kZW5jeSBpcyBpbnRlcm9wLXdyYXBwZWQgaW5zaWRlIHRoZSBidW5kbGVkIHJ1bi10YXNrLmNqcyAod2hlcmVcbi8vIGByZXF1aXJlKC4uLilgIG1heSB5aWVsZCBgeyBkZWZhdWx0OiBmbiB9YCBpbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbikuIFNlZVxuLy8gcHJvamVuIzQ0MDcgKFwicGFyc2VDb25mbGljdEpTT04gaXMgbm90IGEgZnVuY3Rpb25cIiBhZnRlciBlamVjdCkuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3QgcGFyc2VDb25mbGljdEpTT05Nb2R1bGUgPSByZXF1aXJlKFwicGFyc2UtY29uZmxpY3QtanNvblwiKTtcbmNvbnN0IHBhcnNlQ29uZmxpY3RKU09OID1cbiAgcGFyc2VDb25mbGljdEpTT05Nb2R1bGU/LmRlZmF1bHQgPz8gcGFyc2VDb25mbGljdEpTT05Nb2R1bGU7XG5cbmNvbnN0IEVOVl9UUklNX0xFTiA9IDIwO1xuY29uc3QgQVJHU19NQVJLRVIgPSBcIiRAXCI7XG5jb25zdCBRVU9URURfQVJHU19NQVJLRVIgPSBgXCIke0FSR1NfTUFSS0VSfVwiYDtcblxuLyoqXG4gKiBEb3VibGUtcXVvdGVzIGEgc2luZ2xlIGFyZ3VtZW50IHNvIGl0IGlzIHBhc3NlZCB0aHJvdWdoIHZlcmJhdGltLCBlc2NhcGluZyB0aGVcbiAqIGNoYXJhY3RlcnMgdGhhdCBzdGF5IHNwZWNpYWwgaW5zaWRlIGRvdWJsZSBxdW90ZXMuIChEb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlOlxuICogZGF4J3Mgc2hlbGwgbGFja3MgdGhlIFBPU0lYIGAnXFwnJ2AgZXNjYXBlLilcbiAqL1xuZnVuY3Rpb24gcXVvdGVBcmcoYXJnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gJ1wiJyArIGFyZy5yZXBsYWNlKC8oW1wiJGBcXFxcXSkvZywgXCJcXFxcJDFcIikgKyAnXCInO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZWQgcmVzdWx0IG9mIGBzaGVsbCgpYCAoYSBzdWJzZXQgb2Ygbm9kZSdzIGBTcGF3blN5bmNSZXR1cm5zYCkuXG4gKi9cbmludGVyZmFjZSBTaGVsbFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgZXhpdCBjb2RlIG9mIHRoZSBjb21tYW5kLCBvciBgbnVsbGAgaWYgdGhlIHByb2Nlc3Mgd2FzIHRlcm1pbmF0ZWQgYnkgYVxuICAgKiBzaWduYWwgb3IgbmV2ZXIgc3Bhd25lZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FwdHVyZWQgc3Rkb3V0LiBPbmx5IHBvcHVsYXRlZCB3aGVuIHN0ZG91dCBpcyBwaXBlZCAoZS5nLiB3aGVuIGV2YWx1YXRpbmdcbiAgICogZW52aXJvbm1lbnQgdmFyaWFibGVzKTsgYG51bGxgL2B1bmRlZmluZWRgIHdoZW4gc3RkaW8gaXMgaW5oZXJpdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3Rkb3V0PzogQnVmZmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FwdHVyZWQgc3RkZXJyLiBTZWUgYHN0ZG91dGAuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI/OiBCdWZmZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBlcnJvciByYWlzZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBzcGF3biB0aGUgY29tbWFuZCAobm90IGEgbm9uLXplcm8gZXhpdFxuICAgKiBjb2RlLCB3aGljaCBpcyByZXBvcnRlZCB2aWEgYHN0YXR1c2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3I/OiBFcnJvcjtcbn1cblxuLyoqXG4gKiBUaGUgcnVudGltZSBjb21wb25lbnQgb2YgdGhlIHRhc2tzIGVuZ2luZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tSdW50aW1lIHtcbiAgLyoqXG4gICAqIFRoZSBwcm9qZWN0LXJlbGF0aXZlIHBhdGggb2YgdGhlIHRhc2tzIG1hbmlmZXN0IGZpbGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1BTklGRVNUX0ZJTEUgPSBwYXRoLnBvc2l4LmpvaW4oXG4gICAgUFJPSkVOX0RJUixcbiAgICBcInRhc2tzLmpzb25cIixcbiAgKTtcblxuICAvKipcbiAgICogT25lLXNob3QgZW50cnlwb2ludCBmb3IgdGhlIHN0YW5kYWxvbmUgdGFzayBydW5uZXIuXG4gICAqXG4gICAqIENyZWF0ZXMgYSBydW50aW1lIHJvb3RlZCBhdCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgcnVucyB0aGUgbmFtZWRcbiAgICogdGFzaywgYW5kIGNvbnZlcnRzIGFueSBmYWlsdXJlIGludG8gYSBub24temVybyBwcm9jZXNzIGV4aXQgY29kZS4gVGhpcyBpc1xuICAgKiB0aGUgc2luZ2xlIGxpbmUgaW52b2tlZCBieSB0aGUgYnVuZGxlZCBgc2NyaXB0cy9ydW4tdGFzay5janNgIHRoYXRcbiAgICogXCJwcm9qZW4gZWplY3RcIiBlbWl0cywgd2hpY2gga2VlcHMgdGhlIGdlbmVyYXRlZCBidW5kbGUgZm9vdGVyIHRyaXZpYWwuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0YXNrIHRvIHJ1bi4gRGVmYXVsdHMgdG8gYHByb2Nlc3MuYXJndlsyXWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIG1haW4obmFtZTogc3RyaW5nID0gcHJvY2Vzcy5hcmd2WzJdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldyBUYXNrUnVudGltZShcIi5cIikucnVuVGFzayhuYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZT8uc3RhY2sgPz8gU3RyaW5nKGUpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIHRhc2tzLmpzb25cbiAgICovXG4gIHByaXZhdGUgX21hbmlmZXN0OiBUYXNrc01hbmlmZXN0ID0geyB0YXNrczoge30gfTtcblxuICAvKipcbiAgICogVGhlIHJhdyBjb250ZW50cyBvZiB0aGUgY3VycmVudGx5IGxvYWRlZCBtYW5pZmVzdCwgdXNlZCB0byBkZXRlY3QgY2hhbmdlc1xuICAgKiBvbiBkaXNrIHNvIHRoZSBydW50aW1lIGNhbiByZWxvYWQgYSByZWdlbmVyYXRlZCBtYW5pZmVzdCBtaWQtcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBfaWRlbnRpdHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCBhbmQgdGhlIGN3ZCBmb3IgZXhlY3V0aW5nIHRhc2tzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtkaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih3b3JrZGlyOiBzdHJpbmcpIHtcbiAgICB0aGlzLndvcmtkaXIgPSByZXNvbHZlKHdvcmtkaXIpO1xuICAgIC8vIFBlcmZvcm0gdGhlIGluaXRpYWwgbG9hZC4gVGhpcyBhbHNvIHZlcmlmaWVzIHRoZSBtYW5pZmVzdCdzIHNjaGVtYVxuICAgIC8vIHZlcnNpb24uXG4gICAgdGhpcy5yZWxvYWRNYW5pZmVzdElmQ2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0YXNrcy5qc29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1hbmlmZXN0KCk6IFRhc2tzTWFuaWZlc3Qge1xuICAgIHJldHVybiB0aGlzLl9tYW5pZmVzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdGFza3MgbWFuaWZlc3QgZmlsZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IG1hbmlmZXN0UGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBqb2luKHRoaXMud29ya2RpciwgVGFza1J1bnRpbWUuTUFOSUZFU1RfRklMRSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRhc2tzIGluIHRoaXMgcHJvamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdGFza3MoKTogVGFza1NwZWNbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5tYW5pZmVzdC50YXNrcyA/PyB7fSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIHRhc2sgYnkgbmFtZSwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLlxuICAgKi9cbiAgcHVibGljIHRyeUZpbmRUYXNrKG5hbWU6IHN0cmluZyk6IFRhc2tTcGVjIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMubWFuaWZlc3QudGFza3MpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hbmlmZXN0LnRhc2tzW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHRhc2suXG4gICAqIEBwYXJhbSBuYW1lIFRoZSB0YXNrIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcnVuVGFzayhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBhcmdzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW10sXG4gICAgZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBIHByZXZpb3VzbHkgZXhlY3V0ZWQgdGFzayAobW9zdCBpbXBvcnRhbnRseSB0aGUgXCJkZWZhdWx0XCIvc3ludGggdGFzayxcbiAgICAvLyB3aGljaCBgYnVpbGRgIHNwYXducyBmaXJzdCkgbWF5IGhhdmUgcmVnZW5lcmF0ZWQgYC5wcm9qZW4vdGFza3MuanNvbmAuXG4gICAgLy8gUGljayB1cCBhbnkgc3VjaCBjaGFuZ2VzIGJlZm9yZSByZXNvbHZpbmcgYW5kIHJ1bm5pbmcgdGhpcyB0YXNrIHNvIHdlXG4gICAgLy8gbmV2ZXIgZXhlY3V0ZSBhIHN0YWxlLCBpbi1tZW1vcnkgZGVmaW5pdGlvbi5cbiAgICB0aGlzLnJlbG9hZE1hbmlmZXN0SWZDaGFuZ2VkKCk7XG5cbiAgICBjb25zdCB0YXNrID0gdGhpcy50cnlGaW5kVGFzayhuYW1lKTtcbiAgICBpZiAoIXRhc2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2Fubm90IGZpbmQgY29tbWFuZCAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFJ1blRhc2sodGhpcywgdGFzaywgcGFyZW50cywgYXJncywgZW52KS5ydW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1yZWFkcyB0aGUgdGFza3MgbWFuaWZlc3QgZnJvbSBkaXNrIGlmIGl0cyBjb250ZW50cyBjaGFuZ2VkIHNpbmNlIGl0IHdhc1xuICAgKiBsYXN0IGxvYWRlZCwgdmVyaWZ5aW5nIGl0cyBzY2hlbWEgdmVyc2lvbiBhbG9uZyB0aGUgd2F5LlxuICAgKlxuICAgKiBDaGFuZ2UgZGV0ZWN0aW9uIGNvbXBhcmVzIHRoZSByYXcgZmlsZSBjb250ZW50cywgc28gYW4gdW5jaGFuZ2VkIG1hbmlmZXN0XG4gICAqIGlzIG5vdCByZS12ZXJpZmllZCBvciByZS1hZG9wdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWxvYWRNYW5pZmVzdElmQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5tYW5pZmVzdFBhdGgpKSB7XG4gICAgICAvLyBObyBtYW5pZmVzdCBvbiBkaXNrOiB0cmVhdCBhcyBhbiBlbXB0eSBwcm9qZWN0IChsZWdhY3kgYmVoYXZpb3IpLlxuICAgICAgdGhpcy5fbWFuaWZlc3QgPSB7IHRhc2tzOiB7fSB9O1xuICAgICAgdGhpcy5faWRlbnRpdHkgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmF3ID0gcmVhZEZpbGVTeW5jKHRoaXMubWFuaWZlc3RQYXRoLCBcInV0Zi04XCIpO1xuICAgIGlmIChyYXcgPT09IHRoaXMuX2lkZW50aXR5KSB7XG4gICAgICByZXR1cm47IC8vIHVuY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBsb2FkXG4gICAgfVxuXG4gICAgY29uc3QgbWFuaWZlc3Q6IFRhc2tzTWFuaWZlc3QgPSBwYXJzZUNvbmZsaWN0SlNPTihyYXcsIHVuZGVmaW5lZCwgXCJ0aGVpcnNcIik7XG5cbiAgICAvLyBBIHByZXZpb3VzbHkgbG9hZGVkIG1hbmlmZXN0IG1lYW5zIHRoaXMgaXMgYSAqcmVsb2FkKiAoZS5nLiB0aGVcbiAgICAvLyBcImRlZmF1bHRcIi9zeW50aCB0YXNrIHJlZ2VuZXJhdGVkIHRoZSBmaWxlIG1pZC1ydW4pLCBhcyBvcHBvc2VkIHRvIHRoZVxuICAgIC8vIGluaXRpYWwgbG9hZCBwZXJmb3JtZWQgYnkgdGhlIGNvbnN0cnVjdG9yLlxuICAgIGNvbnN0IGlzUmVsb2FkID0gdGhpcy5faWRlbnRpdHkgIT09IHVuZGVmaW5lZDtcblxuICAgIHRoaXMudmVyaWZ5TWFuaWZlc3QobWFuaWZlc3QpO1xuICAgIHRoaXMuX21hbmlmZXN0ID0gbWFuaWZlc3Q7XG4gICAgdGhpcy5faWRlbnRpdHkgPSByYXc7XG5cbiAgICBpZiAoaXNSZWxvYWQpIHtcbiAgICAgIGxvZ2dpbmcuZGVidWcoXG4gICAgICAgIGAke1Rhc2tSdW50aW1lLk1BTklGRVNUX0ZJTEV9IGNoYW5nZWQgb24gZGlzazsgc3VjY2Vzc2Z1bGx5IGxvYWRlZCB0aGUgbmV3IHRhc2tzIG1hbmlmZXN0LmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBmcmVzaGx5IHJlYWQgbWFuaWZlc3Q6XG4gICAqXG4gICAqIC0gTGVnYWN5IG1hbmlmZXN0cyAobm8gYG1hbmlmZXN0VmVyc2lvbmApIGFyZSBhY2NlcHRlZCBhcy1pcyBmb3IgYmFja3dhcmRzXG4gICAqICAgY29tcGF0aWJpbGl0eS5cbiAgICogLSBNYW5pZmVzdHMgZnJvbSBhIG5ld2VyIHByb2plbiAoYSBoaWdoZXIgYG1hbmlmZXN0VmVyc2lvbmApIGFyZSBhY2NlcHRlZFxuICAgKiAgIHdpdGggYSB3YXJuaW5nLCBzaW5jZSB0aGlzIHJ1bnRpbWUgbWF5IG5vdCB1bmRlcnN0YW5kIHRoZSBzY2hlbWEuXG4gICAqL1xuICBwcml2YXRlIHZlcmlmeU1hbmlmZXN0KG1hbmlmZXN0OiBUYXNrc01hbmlmZXN0KTogdm9pZCB7XG4gICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IG1hbmlmZXN0cyBnZW5lcmF0ZWQgYmVmb3JlIHZlcnNpb25pbmcgY2Fycnkgbm9cbiAgICAvLyB2ZXJzaW9uLlxuICAgIGlmIChtYW5pZmVzdC5tYW5pZmVzdFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtYW5pZmVzdC5tYW5pZmVzdFZlcnNpb24gPiBUQVNLU19NQU5JRkVTVF9WRVJTSU9OKSB7XG4gICAgICBsb2dnaW5nLndhcm4oXG4gICAgICAgIGAke1Rhc2tSdW50aW1lLk1BTklGRVNUX0ZJTEV9IHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb2plbiBgICtcbiAgICAgICAgICBgKG1hbmlmZXN0IHZlcnNpb24gJHttYW5pZmVzdC5tYW5pZmVzdFZlcnNpb259LCB0aGlzIHByb2plbiBzdXBwb3J0cyB1cCB0byAke1RBU0tTX01BTklGRVNUX1ZFUlNJT059KS4gYCArXG4gICAgICAgICAgYFNvbWUgdGFza3MgbWF5IG5vdCBiZWhhdmUgYXMgZXhwZWN0ZWQ7IGNvbnNpZGVyIHVwZ3JhZGluZyBwcm9qZW4uYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFJ1blRhc2sge1xuICBwcml2YXRlIGVudjogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRzOiBzdHJpbmdbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHdvcmtkaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJ1bnRpbWU6IFRhc2tSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFzazogVGFza1NwZWMsXG4gICAgcGFyZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFyZ3M6IEFycmF5PHN0cmluZyB8IG51bWJlcj4gPSBbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVudlBhcmFtOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLndvcmtkaXIgPSB0YXNrLmN3ZCA/PyB0aGlzLnJ1bnRpbWUud29ya2RpcjtcbiAgICB0aGlzLnBhcmVudHMgPSBwYXJlbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSB0YXNrLiBUaGlzIHdhcyBwcmV2aW91c2x5IGRvbmUgaW4gdGhlIGNvbnN0cnVjdG9yLCBidXQgaXMgbm93XG4gICAqIGFuIGFzeW5jIG1ldGhvZCBzaW5jZSBzaGVsbCBleGVjdXRpb24gaXMgYXN5bmNocm9ub3VzIChlLmcuIGRheCBvblxuICAgKiBXaW5kb3dzKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB0YXNrLCBhcmdzLCBwYXJlbnRzIH0gPSB0aGlzO1xuXG4gICAgaWYgKCF0YXNrLnN0ZXBzIHx8IHRhc2suc3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvZ0RlYnVnKGdyYXkoXCJObyBhY3Rpb25zIGhhdmUgYmVlbiBzcGVjaWZpZWQgZm9yIHRoaXMgdGFzay5cIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZW52ID0gYXdhaXQgdGhpcy5yZXNvbHZlRW52aXJvbm1lbnQoXG4gICAgICB0aGlzLmVudlBhcmFtLFxuICAgICAgcGFyZW50cyxcbiAgICAgIHRoaXMucmVzb2x2ZVNoZWxsKCksXG4gICAgKTtcblxuICAgIGNvbnN0IGVudmxvZ3MgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudikpIHtcbiAgICAgIGNvbnN0IHZ2ID0gdiA/PyBcIlwiO1xuICAgICAgY29uc3QgdHJpbW1lZCA9XG4gICAgICAgIHZ2Lmxlbmd0aCA+IEVOVl9UUklNX0xFTiA/IHZ2LnN1YnN0cmluZygwLCBFTlZfVFJJTV9MRU4pICsgXCIuLi5cIiA6IHZ2O1xuICAgICAgZW52bG9ncy5wdXNoKGAke2t9PSR7dHJpbW1lZH1gKTtcbiAgICB9XG5cbiAgICBpZiAoZW52bG9ncy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubG9nRGVidWcoZ3JheShgJHt1bmRlcmxpbmUoXCJlbnZcIil9OiAke2VudmxvZ3Muam9pbihcIiBcIil9YCkpO1xuICAgIH1cblxuICAgIC8vIGV2YWx1YXRlIGNvbmRpdGlvblxuICAgIGlmICghKGF3YWl0IHRoaXMuZXZhbENvbmRpdGlvbih0YXNrLCB0aGlzLnJlc29sdmVTaGVsbCgpKSkpIHtcbiAgICAgIHRoaXMubG9nKFwiY29uZGl0aW9uIGV4aXRlZCB3aXRoIG5vbi16ZXJvIC0gc2tpcHBpbmdcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdmVyaWZ5IHdlIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgZGVmaW5lZFxuICAgIGNvbnN0IG1lcmdlZCA9IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRoaXMuZW52IH07XG4gICAgY29uc3QgbWlzc2luZyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRhc2sucmVxdWlyZWRFbnYgPz8gW10pIHtcbiAgICAgIGlmICghKG5hbWUgaW4gbWVyZ2VkKSkge1xuICAgICAgICBtaXNzaW5nLnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbWlzc2luZyByZXF1aXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6ICR7bWlzc2luZy5qb2luKFwiLFwiKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgdGFzay5zdGVwcykge1xuICAgICAgY29uc3Qgc3RlcFNoZWxsID0gdGhpcy5yZXNvbHZlU2hlbGwoc3RlcCk7XG5cbiAgICAgIC8vIGV2YWx1YXRlIHN0ZXAgY29uZGl0aW9uXG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmV2YWxDb25kaXRpb24oc3RlcCwgc3RlcFNoZWxsKSkpIHtcbiAgICAgICAgdGhpcy5sb2coXCJjb25kaXRpb24gZXhpdGVkIHdpdGggbm9uLXplcm8gLSBza2lwcGluZ1wiKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFyZ3NMaXN0OiBzdHJpbmdbXSA9IFtcbiAgICAgICAgLi4uKHN0ZXAuYXJncyB8fCBbXSksXG4gICAgICAgIC4uLihzdGVwLnJlY2VpdmVBcmdzID8gYXJncyA6IFtdKSxcbiAgICAgIF0ubWFwKChhKSA9PiBhLnRvU3RyaW5nKCkpO1xuXG4gICAgICBpZiAoc3RlcC5zYXkpIHtcbiAgICAgICAgbG9nZ2luZy5pbmZvKHRoaXMuZm10TG9nKHN0ZXAuc2F5KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGVwLnNwYXduKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucnVudGltZS5ydW5UYXNrKFxuICAgICAgICAgIHN0ZXAuc3Bhd24sXG4gICAgICAgICAgWy4uLnRoaXMucGFyZW50cywgdGhpcy50YXNrLm5hbWVdLFxuICAgICAgICAgIGFyZ3NMaXN0LFxuICAgICAgICAgIHN0ZXAuZW52LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGVjczogQXJyYXk8c3RyaW5nIHwgc3RyaW5nW10+ID0gc3RlcC5leGVjID8gW3N0ZXAuZXhlY10gOiBbXTtcblxuICAgICAgLy8gUGFyc2Ugc3RlcC1zcGVjaWZpYyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZXZhbEVudmlyb25tZW50KHN0ZXAuZW52ID8/IHt9LCBzdGVwU2hlbGwpO1xuXG4gICAgICBpZiAoc3RlcC5idWlsdGluKSB7XG4gICAgICAgIGV4ZWNzLnB1c2godGhpcy5yZW5kZXJCdWlsdGluKHN0ZXAuYnVpbHRpbikpO1xuICAgICAgfVxuXG4gICAgICAvLyBgZXhlY0FyZ3NgIGlzIGFuIGV4cGxpY2l0IGFyZ3YgKHRoZSBwcm9ncmFtIGZvbGxvd2VkIGJ5IGl0cyBhcmd1bWVudHMpLlxuICAgICAgLy8gSXQgaXMgaGFuZGVkIHRvIGBzaGVsbCgpYCBhcyBhbiBhcnJheSByYXRoZXIgdGhhbiBhIHJlbmRlcmVkIHN0cmluZywgc29cbiAgICAgIC8vIGl0IHJ1bnMgd2l0aG91dCBhIHNoZWxsIGFuZCBldmVyeSBlbGVtZW50IGlzIHBhc3NlZCB0aHJvdWdoIHZlcmJhdGltIC1cbiAgICAgIC8vIHdoaWNoIGlzIHdoYXQgbGV0cyBjYWxsZXJzIGF2b2lkIHRoaW5raW5nIGFib3V0IHF1b3RpbmcuIEZpeGVkL3JlY2VpdmVkXG4gICAgICAvLyBhcmdzIGFyZSBzcGxpY2VkIGluIHdoZXJldmVyIGEgYCRAYCBtYXJrZXIgZWxlbWVudCBhcHBlYXJzIChtaXJyb3JpbmdcbiAgICAgIC8vIHRoZSBzdHJpbmcgYGV4ZWNgIGJlaGF2aW9yKSwgb3IgYXBwZW5kZWQgYXQgdGhlIGVuZCBpZiB0aGVyZSBpcyBub25lLlxuICAgICAgaWYgKHN0ZXAuZXhlY0FyZ3MpIHtcbiAgICAgICAgY29uc3QgYXJndjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IHBsYWNlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygc3RlcC5leGVjQXJncykge1xuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBBUkdTX01BUktFUikge1xuICAgICAgICAgICAgYXJndi5wdXNoKC4uLmFyZ3NMaXN0KTtcbiAgICAgICAgICAgIHBsYWNlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFyZ3YucHVzaChlbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwbGFjZWQpIHtcbiAgICAgICAgICBhcmd2LnB1c2goLi4uYXJnc0xpc3QpO1xuICAgICAgICB9XG4gICAgICAgIGV4ZWNzLnB1c2goYXJndik7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZXhlYyBvZiBleGVjcykge1xuICAgICAgICBsZXQgY29tbWFuZCA9IGV4ZWM7XG5cbiAgICAgICAgLy8gQSBzdHJpbmcgY29tbWFuZCBpcyBhIHNoZWxsIGxpbmU6IHNwbGljZSB0YXNrIGFyZ3MgaW4gcGVyIHRoZSBgJEBgXG4gICAgICAgIC8vIG1hcmtlciBydWxlcy4gQW4gYGV4ZWNBcmdzYCBhcmd2IGFscmVhZHkgY2FycmllcyBpdHMgYXJncywgdW50b3VjaGVkLlxuICAgICAgICBpZiAodHlwZW9mIGNvbW1hbmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAoY29tbWFuZC5pbmNsdWRlcyhRVU9URURfQVJHU19NQVJLRVIpKSB7XG4gICAgICAgICAgICAvLyBgXCIkQFwiYDogc3BsaWNlIGVhY2ggYXJnIGluIGFzIGEgc2VwYXJhdGUgdmVyYmF0aW0gd29yZCAobGlrZVxuICAgICAgICAgICAgLy8gYmFzaCdzIHF1b3RlZCBgXCIkQFwiYCksIHNvIHdoaXRlc3BhY2UgYW5kIG1ldGFjaGFyYWN0ZXJzIHN1cnZpdmUuXG4gICAgICAgICAgICBjb21tYW5kID0gY29tbWFuZC5yZXBsYWNlKFxuICAgICAgICAgICAgICBRVU9URURfQVJHU19NQVJLRVIsXG4gICAgICAgICAgICAgIGFyZ3NMaXN0Lm1hcChxdW90ZUFyZykuam9pbihcIiBcIiksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5pbmNsdWRlcyhBUkdTX01BUktFUikpIHtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnJlcGxhY2UoQVJHU19NQVJLRVIsIGFyZ3NMaXN0LmpvaW4oXCIgXCIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tbWFuZCA9IFtjb21tYW5kLCAuLi5hcmdzTGlzdF0uam9pbihcIiBcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3dkID0gc3RlcC5jd2Q7XG4gICAgICAgIC8vIEEgdGhyb3duIGVycm9yIChlLmcuIHNwYXduIGZhaWx1cmUpIHByb3BhZ2F0ZXM7IGEgbm9uLXplcm8gZXhpdCBpc1xuICAgICAgICAvLyByZXBvcnRlZCB2aWEgYHJlc3VsdC5zdGF0dXNgLlxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNoZWxsKHtcbiAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgIGN3ZCxcbiAgICAgICAgICBleHRyYUVudjogZW52LFxuICAgICAgICAgIHNoZWxsOiBzdGVwU2hlbGwsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUYXNrIFwiJHt0aGlzLmZ1bGxuYW1lfVwiIGZhaWxlZCB3aGVuIGV4ZWN1dGluZyBcIiR7XG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY29tbWFuZCkgPyBjb21tYW5kLmpvaW4oXCIgXCIpIDogY29tbWFuZFxuICAgICAgICAgICAgfVwiIChjd2Q6ICR7cmVzb2x2ZShjd2QgPz8gdGhpcy53b3JrZGlyKX0pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgYSB0YXNrIHNob3VsZCBiZSBleGVjdXRlZCBiYXNlZCBvbiBcImNvbmRpdGlvblwiLlxuICAgKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIHNob3VsZCBiZSBleGVjdXRlZCBvciBmYWxzZSBpZiB0aGUgY29uZGl0aW9uXG4gICAqIGV2YWx1YXRlcyB0byBmYWxzZSAoZXhpdHMgd2l0aCBub24temVybyksIGluZGljYXRpbmcgdGhhdCB0aGUgdGFzayBzaG91bGRcbiAgICogYmUgc2tpcHBlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXZhbENvbmRpdGlvbihcbiAgICB0YXNrT3JTdGVwOiBUYXNrU3BlYyB8IFRhc2tTdGVwLFxuICAgIHNoZWxsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKSB7XG4gICAgLy8gbm8gY29uZGl0aW9uLCBjYXJyeSBvblxuICAgIGlmICghdGFza09yU3RlcC5jb25kaXRpb24pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMubG9nKGdyYXkoYCR7dW5kZXJsaW5lKFwiY29uZGl0aW9uXCIpfTogJHt0YXNrT3JTdGVwLmNvbmRpdGlvbn1gKSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaGVsbCh7XG4gICAgICBjb21tYW5kOiB0YXNrT3JTdGVwLmNvbmRpdGlvbixcbiAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgc2hlbGwsXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBzaGVsbCBjb21tYW5kcyAoZS5nLiBgJCh4eClgKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBldmFsRW52aXJvbm1lbnQoXG4gICAgZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgICBzaGVsbDogc3RyaW5nIHwgc3RyaW5nW10sXG4gICkge1xuICAgIGNvbnN0IG91dHB1dDogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudiA/PyB7fSkpIHtcbiAgICAgIGlmIChTdHJpbmcodmFsdWUpLnN0YXJ0c1dpdGgoXCIkKFwiKSAmJiBTdHJpbmcodmFsdWUpLmVuZHNXaXRoKFwiKVwiKSkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IHZhbHVlLnN1YnN0cmluZygyLCB2YWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaGVsbCh7XG4gICAgICAgICAgY29tbWFuZDogcXVlcnksXG4gICAgICAgICAgcXVpZXQ6IHRydWUsXG4gICAgICAgICAgY2FwdHVyZU91dHB1dDogdHJ1ZSxcbiAgICAgICAgICBzaGVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3JcbiAgICAgICAgICAgID8gcmVzdWx0LmVycm9yLnN0YWNrXG4gICAgICAgICAgICA6IHJlc3VsdC5zdGRlcnI/LnRvU3RyaW5nKCkudHJpbSgpIHx8XG4gICAgICAgICAgICAgIHJlc3VsdC5zdGRvdXQ/LnRvU3RyaW5nKCkudHJpbSgpIHx8XG4gICAgICAgICAgICAgIGBjb21tYW5kIGV4aXRlZCB3aXRoIGNvZGUgJHtyZXN1bHQuc3RhdHVzfWA7XG5cbiAgICAgICAgICBsb2dnaW5nLndhcm4oXG4gICAgICAgICAgICB0aGlzLmZtdExvZyhcbiAgICAgICAgICAgICAgYCR7dW5kZXJsaW5lKGtleSl9OiB1bmFibGUgdG8gZXZhbHVhdGUgXCIke3F1ZXJ5fVwiLiBFbnZpcm9ubWVudCB2YXJpYWJsZSB3aWxsIGJlIHNraXBwZWQuIENoZWNrIHRoYXQgdGhlIGNvbW1hbmQgZXhpc3RzIGFuZCBydW5zIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZ2dpbmcud2Fybih0aGlzLmZtdExvZyhgJHt1bmRlcmxpbmUoa2V5KX06ICR7ZXJyb3J9YCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dHB1dFtrZXldID0gcmVzdWx0LnN0ZG91dD8udG9TdHJpbmcoXCJ1dGYtOFwiKS50cmltKCkgPz8gXCJcIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciBhIHRhc2suIE5hbWVseSwgaXQgc3VwcG9ydHMgdGhpcyBzeW50YXhcbiAgICogYCQoeHgpYCBmb3IgYWxsb3dpbmcgZW52aXJvbm1lbnQgdG8gYmUgZXZhbHVhdGVkIGJ5IGV4ZWN1dGluZyBhIHNoZWxsXG4gICAqIGNvbW1hbmQgYW5kIG9idGFpbmluZyBpdHMgcmVzdWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlRW52aXJvbm1lbnQoXG4gICAgZW52UGFyYW06IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9LFxuICAgIHBhcmVudHM6IHN0cmluZ1tdLFxuICAgIHNoZWxsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKSB7XG4gICAgbGV0IGVudiA9IHRoaXMucnVudGltZS5tYW5pZmVzdC5lbnYgPz8ge307XG5cbiAgICAvLyBhZGQgZW52IGZyb20gYWxsIHBhcmVudCB0YXNrcyBvbmUgYnkgb25lXG4gICAgZm9yIChjb25zdCBwYXJlbnQgb2YgcGFyZW50cykge1xuICAgICAgZW52ID0ge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIC4uLih0aGlzLnJ1bnRpbWUudHJ5RmluZFRhc2socGFyZW50KT8uZW52ID8/IHt9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgdGFzayBlbnZpcm9ubWVudCwgdGhlbiB0aGUgc3BlY2lmaWMgZW52IGxhc3RcbiAgICBlbnYgPSB7XG4gICAgICAuLi5lbnYsXG4gICAgICAuLi4odGhpcy50YXNrLmVudiA/PyB7fSksXG4gICAgICAuLi5lbnZQYXJhbSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXZhbEVudmlyb25tZW50KGVudiwgc2hlbGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzaGVsbCBmb3IgYSBzdGVwJ3MgY29tbWFuZCAob3IgdGhlIHRhc2sncywgd2hlbiBubyBzdGVwIGlzXG4gICAqIGdpdmVuKTogc3RlcCwgdGhlbiB0YXNrLCB0aGVuIHByb2plY3QgZGVmYXVsdCwgdGhlbiBcInByb2plblwiLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlU2hlbGwoc3RlcD86IFRhc2tTdGVwKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiAoXG4gICAgICBzdGVwPy5zaGVsbCA/PyB0aGlzLnRhc2suc2hlbGwgPz8gdGhpcy5ydW50aW1lLm1hbmlmZXN0LnNoZWxsID8/IFwicHJvamVuXCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFwiZnVsbCBuYW1lXCIgb2YgdGhlIHRhc2sgd2hpY2ggaW5jbHVkZXMgYWxsIGl0J3MgcGFyZW50IHRhc2sgbmFtZXMgY29uY2F0ZW5hdGVkIGJ5IGNoZXZyb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgZnVsbG5hbWUoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnBhcmVudHMsIHRoaXMudGFzay5uYW1lXS5qb2luKFwiIMK7IFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgbG9nZ2luZy52ZXJib3NlKHRoaXMuZm10TG9nKC4uLmFyZ3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nRGVidWcoLi4uYXJnczogYW55W10pIHtcbiAgICBsb2dnaW5nLmRlYnVnKHRoaXMuZm10TG9nKC4uLmFyZ3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgZm10TG9nKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgcmV0dXJuIGZvcm1hdChgJHt1bmRlcmxpbmUodGhpcy5mdWxsbmFtZSl9IHxgLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2hlbGwob3B0aW9uczogU2hlbGxPcHRpb25zKTogUHJvbWlzZTxTaGVsbFJlc3VsdD4ge1xuICAgIGNvbnN0IHF1aWV0ID0gb3B0aW9ucy5xdWlldCA/PyBmYWxzZTtcbiAgICBpZiAoIXF1aWV0KSB7XG4gICAgICBjb25zdCBsb2cgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgICBsb2cucHVzaChcbiAgICAgICAgQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbW1hbmQpXG4gICAgICAgICAgPyBvcHRpb25zLmNvbW1hbmQuam9pbihcIiBcIilcbiAgICAgICAgICA6IG9wdGlvbnMuY29tbWFuZCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChvcHRpb25zLmN3ZCkge1xuICAgICAgICBsb2cucHVzaChgKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nKGxvZy5qb2luKFwiIFwiKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3dkID0gb3B0aW9ucy5jd2QgPz8gdGhpcy53b3JrZGlyO1xuICAgIGlmICghZXhpc3RzU3luYyhjd2QpIHx8ICFzdGF0U3luYyhjd2QpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGludmFsaWQgd29ya2RpciAoY3dkKTogJHtjd2R9IG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlc29sdmVkIHNoZWxsIGlzIG9uZSBvZjpcbiAgICAvLyAtIFwicHJvamVuXCIgKGRlZmF1bHQpOiBkYXgncyBpbi1wcm9jZXNzIGNyb3NzLXBsYXRmb3JtIHNoZWxsLCBzbyBQT1NJWC1zdHlsZVxuICAgIC8vICAgdGFzayBzeW50YXggKGBta2RpciAtcGAsIGAmJmAsIGAkVkFSYCwgLi4uKSB3b3JrcyB0aGUgc2FtZSBldmVyeXdoZXJlLlxuICAgIC8vIC0gXCJzeXN0ZW1cIjogdGhlIGhvc3QncyBuYXRpdmUgc2hlbGwgKGAvYmluL3NoYCwgb3IgYGNtZC5leGVgIG9uIFdpbmRvd3MpLlxuICAgIC8vIC0gYW4gYXJndiwgZS5nLiBbXCJiYXNoXCIsXCItY1wiXTogYSBzaGVsbCBpbnZvY2F0aW9uIHdpdGggdGhlIGNvbW1hbmQgYXBwZW5kZWRcbiAgICAvLyAgIGFzIGl0cyBmaW5hbCBhcmd1bWVudC5cbiAgICBjb25zdCBzaGVsbCA9IG9wdGlvbnMuc2hlbGwgPz8gXCJwcm9qZW5cIjtcbiAgICBpZiAodHlwZW9mIHNoZWxsID09PSBcInN0cmluZ1wiICYmIHNoZWxsICE9PSBcInByb2plblwiICYmIHNoZWxsICE9PSBcInN5c3RlbVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB1bmtub3duIGJ1aWx0LWluIHNoZWxsICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgc2hlbGwsXG4gICAgICAgICl9OyB1c2UgdGhlIGJ1aWx0LWluIFwicHJvamVuXCIgb3IgXCJzeXN0ZW1cIiBzaGVsbHMsIG9yIGEgVGFza1NoZWxsLmNvbW1hbmQoWy4uLl0pIGludm9jYXRpb25gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBzdGRvdXQvc3RkZXJyIGFyZSBjYXB0dXJlZCBvbmx5IHdoZW4gYXNrZWQgKGUuZy4gYCQoLi4uKWAgZW52IGV2YWwpO1xuICAgIC8vIG90aGVyd2lzZSB0aGV5IGFyZSBpbmhlcml0ZWQgc28gb3V0cHV0IHN0cmVhbXMgdGhyb3VnaC5cbiAgICBjb25zdCBjYXB0dXJlID0gb3B0aW9ucy5jYXB0dXJlT3V0cHV0ID8/IGZhbHNlO1xuXG4gICAgY29uc3QgY29tbWFuZCA9IG9wdGlvbnMuY29tbWFuZDtcbiAgICBjb25zdCBlbnYgPSB7XG4gICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgIC4uLnRoaXMuZW52LFxuICAgICAgLi4ub3B0aW9ucy5leHRyYUVudixcbiAgICB9O1xuXG4gICAgLy8gXCJzeXN0ZW1cIjogdGhlIGhvc3QtbmF0aXZlIGVuZ2luZS4gQSBzdHJpbmcgY29tbWFuZCBydW5zIHRocm91Z2ggdGhlIE9TXG4gICAgLy8gc2hlbGw7IGFuIGBleGVjQXJnc2AgYXJndiBpcyBzcGF3bmVkIGRpcmVjdGx5IChzaGVsbC1mcmVlKSwgc28gdGhlIHJlYWxcbiAgICAvLyBiaW5hcnkgcnVucyB3aXRoIG5vIGRheCBidWlsdC1pbnMuIChPbmx5IGAkKC4uLilgL2NvbmRpdGlvbiBldmFsIGNhcHR1cmVzLFxuICAgIC8vIGFuZCB0aG9zZSBhbHdheXMgcGFzcyBhIHN0cmluZywgc28gYW4gYXJyYXkgY29tbWFuZCBuZXZlciBuZWVkcyBjYXB0dXJlLilcbiAgICBpZiAoc2hlbGwgPT09IFwic3lzdGVtXCIpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbW1hbmQpKSB7XG4gICAgICAgIGNvbnN0IFtwcm9ncmFtLCAuLi5hcmdzXSA9IGNvbW1hbmQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdG9vbChwcm9ncmFtKS5ydW4oYXJncywgeyBjd2QsIGVudiwgaW5oZXJpdFN0ZGlvOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMCB9O1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGU/LnN0YXR1cyA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBlLnN0YXR1cyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3lzdGVtU2hlbGwoY29tbWFuZCwgeyBjd2QsIGVudiwgY2FwdHVyZSB9KTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgcnVuIHRocm91Z2ggZGF4OiB0aGUgXCJwcm9qZW5cIiBzaGVsbCBvciBhbiBleHBsaWNpdCBpbnZvY2F0aW9uLlxuICAgIGNvbnN0IGJ1aWxkZXIgPSB0aGlzLmJ1aWxkRGF4Q29tbWFuZChjb21tYW5kLCBzaGVsbCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZGVyXG4gICAgICAuY3dkKGN3ZClcbiAgICAgIC5lbnYoZW52KVxuICAgICAgLnN0ZG91dChjYXB0dXJlID8gXCJwaXBlZFwiIDogXCJpbmhlcml0XCIpXG4gICAgICAuc3RkZXJyKGNhcHR1cmUgPyBcInBpcGVkXCIgOiBcImluaGVyaXRcIilcbiAgICAgIC5ub1Rocm93KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiByZXN1bHQuY29kZSxcbiAgICAgIHN0ZG91dDogY2FwdHVyZSA/IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGRvdXRCeXRlcykgOiBudWxsLFxuICAgICAgc3RkZXJyOiBjYXB0dXJlID8gQnVmZmVyLmZyb20ocmVzdWx0LnN0ZGVyckJ5dGVzKSA6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRheCBjb21tYW5kIGZvciB0aGUgXCJwcm9qZW5cIiBzaGVsbCBvciBhbiBleHBsaWNpdCBpbnZvY2F0aW9uLlxuICAgKiAoVGhlIFwic3lzdGVtXCIgc2hlbGwgaXMgaGFuZGxlZCBob3N0LXNpZGUsIG5vdCBoZXJlLikgYGNvbW1hbmRgIGlzIGEgc2hlbGxcbiAgICogbGluZSAoc3RyaW5nKSBvciBhbiBgZXhlY0FyZ3NgIGFyZ3YgKHN0cmluZ1tdKTsgYHNoZWxsYCBpcyBgXCJwcm9qZW5cImAgb3IgYW5cbiAgICogaW52b2NhdGlvbiBhcmd2IHN1Y2ggYXMgYFtcImJhc2hcIiwgXCItY1wiXWAuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRGF4Q29tbWFuZChcbiAgICBjb21tYW5kOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBzaGVsbDogc3RyaW5nIHwgc3RyaW5nW10sXG4gICkge1xuICAgIC8vIEFuIGludm9jYXRpb24gKGUuZy4gW1wiYmFzaFwiLFwiLWNcIl0sIFtcIm5weFwiLFwiLS1ub1wiLFwiLWNcIl0pOiBhcHBlbmQgdGhlXG4gICAgLy8gY29tbWFuZCBhcyBpdHMgZmluYWwgYXJndW1lbnQuIEEgc3RyaW5nIGlzIGFwcGVuZGVkIGFzLWlzOyBhbiBgZXhlY0FyZ3NgXG4gICAgLy8gYXJndiBpcyByZW5kZXJlZCB0byBhIHF1b3RlZCBjb21tYW5kIGxpbmUgc28gdGhlIHNoZWxsIHJlLXBhcnNlcyB0aGUgc2FtZVxuICAgIC8vIGFyZ3YuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2hlbGwpKSB7XG4gICAgICBjb25zdCBbcHJvZ3JhbSwgLi4uZmxhZ3NdID0gc2hlbGw7XG4gICAgICBjb25zdCBjb21tYW5kTGluZSA9IEFycmF5LmlzQXJyYXkoY29tbWFuZClcbiAgICAgICAgPyBjb21tYW5kLm1hcChxdW90ZUFyZykuam9pbihcIiBcIilcbiAgICAgICAgOiBjb21tYW5kO1xuICAgICAgcmV0dXJuICRgJHtwcm9ncmFtfSAke1suLi5mbGFncywgY29tbWFuZExpbmVdfWA7XG4gICAgfVxuXG4gICAgLy8gVGhlIGJ1aWx0LWluIFwicHJvamVuXCIgc2hlbGwgKGRheCkuXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY29tbWFuZClcbiAgICAgID8gLy8gZXhlY0FyZ3M6IHNoZWxsLWZyZWUgYXJndiAoZWFjaCBlbGVtZW50IGVzY2FwZWQ7IGAuY21kYCBzaGltcyByZXNvbHZlZCkuXG4gICAgICAgICRgJHtjb21tYW5kWzBdfSAke2NvbW1hbmQuc2xpY2UoMSl9YFxuICAgICAgOiAvLyBzdHJpbmcgY29tbWFuZCwgcGFyc2VkIGluLXByb2Nlc3MgYnkgZGF4J3MgY3Jvc3MtcGxhdGZvcm0gc2hlbGwuXG4gICAgICAgICQucmF3YCR7Y29tbWFuZH1gO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJCdWlsdGluKGJ1aWx0aW46IHN0cmluZykge1xuICAgIC8vIExvY2F0ZSBwcm9qZW4ncyBwYWNrYWdlIHJvb3QgYnkgd2Fsa2luZyB1cCBmcm9tIHRoaXMgbW9kdWxlJ3MgZGlyZWN0b3J5XG4gICAgLy8gdW50aWwgd2UgZmluZCBhIHBhY2thZ2UuanNvbi4gVGhpcyB3b3JrcyB3aGV0aGVyIHRoZSBjb2RlIHJ1bnMgZnJvbSB0aGVcbiAgICAvLyBjb21waWxlZCBmaWxlIChsaWIvY2xpL3Rhc2stcnVudGltZS5qcykgb3IgZnJvbSB0aGUgYnVuZGxlZCBydW4tdGFzay5janNcbiAgICAvLyAobGliL3J1bi10YXNrLmNqcyksIHdoaWNoIGxpdmUgYXQgZGlmZmVyZW50IGRlcHRocyAtIHNvIGEgaGFyZC1jb2RlZFxuICAgIC8vIHJlbGF0aXZlIHBhdGggdG8gcGFja2FnZS5qc29uIHdvdWxkIGJlIHdyb25nIGluIG9uZSBvZiB0aGUgdHdvIGNhc2VzLlxuICAgIGxldCBtb2R1bGVSb290ID0gX19kaXJuYW1lO1xuICAgIHdoaWxlICghZXhpc3RzU3luYyhqb2luKG1vZHVsZVJvb3QsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gZGlybmFtZShtb2R1bGVSb290KTtcbiAgICAgIGlmIChwYXJlbnQgPT09IG1vZHVsZVJvb3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGxvY2F0ZSB0aGUgcHJvamVuIHBhY2thZ2Ugcm9vdFwiKTtcbiAgICAgIH1cbiAgICAgIG1vZHVsZVJvb3QgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGNvbnN0IHByb2dyYW0gPSByZXF1aXJlLnJlc29sdmUoXG4gICAgICBqb2luKG1vZHVsZVJvb3QsIFwibGliXCIsIGAke2J1aWx0aW59LnRhc2suanNgKSxcbiAgICApO1xuICAgIHJldHVybiBgXCIke3Byb2Nlc3MuZXhlY1BhdGh9XCIgXCIke3Byb2dyYW19XCJgO1xuICB9XG59XG5cbmludGVyZmFjZSBTaGVsbE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgdG8gcnVuLiBBIHN0cmluZyBpcyBleGVjdXRlZCBhcyBhIHNoZWxsIGNvbW1hbmQgbGluZTsgYVxuICAgKiBzdHJpbmcgYXJyYXkgaXMgYW4gZXhwbGljaXQgYXJndiAocHJvZ3JhbSArIGFyZ3VtZW50cykgZXhlY3V0ZWQgd2l0aG91dCBhXG4gICAqIHNoZWxsLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBAZGVmYXVsdCAtIHByb2plY3QgZGlyXG4gICAqL1xuICByZWFkb25seSBjd2Q/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDYXB0dXJlIHN0ZG91dC9zdGRlcnIgKHNvIHRoZSBjYWxsZXIgY2FuIHJlYWQgdGhlbSBmcm9tIHRoZSByZXN1bHQpXG4gICAqIGluc3RlYWQgb2YgaW5oZXJpdGluZyB0aGUgcGFyZW50J3Mgc3RyZWFtcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNhcHR1cmVPdXRwdXQ/OiBib29sZWFuO1xuICAvKiogQGRlZmF1bHQgZmFsc2UgKi9cbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSBleHRyYUVudj86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZCB9O1xuICAvKipcbiAgICogVGhlIHJlc29sdmVkIHNoZWxsIHRvIGludGVycHJldCB0aGUgY29tbWFuZCAoZS5nLiBcInByb2plblwiLCBcImJhc2ggLWNcIikuXG4gICAqIEBkZWZhdWx0IFwicHJvamVuXCJcbiAgICovXG4gIHJlYWRvbmx5IHNoZWxsPzogc3RyaW5nIHwgc3RyaW5nW107XG59XG4iXX0=
|
|
578
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS90YXNrLXJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkJBQXdEO0FBQ3hELCtCQUE4QztBQUM5QywyQ0FBNkI7QUFDN0IsK0JBQThCO0FBQzlCLGlDQUF3QztBQUN4Qyw2QkFBd0I7QUFDeEIsc0NBQStEO0FBQy9ELG9EQUFzQztBQUV0Qyx1Q0FBaUQ7QUFFakQscUVBQXFFO0FBQ3JFLGdGQUFnRjtBQUNoRixnRkFBZ0Y7QUFDaEYsMkVBQTJFO0FBQzNFLG1FQUFtRTtBQUNuRSxpRUFBaUU7QUFDakUsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUMvRCxNQUFNLGlCQUFpQixHQUNyQix1QkFBdUIsRUFBRSxPQUFPLElBQUksdUJBQXVCLENBQUM7QUFFOUQsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQztBQUN6QixNQUFNLGtCQUFrQixHQUFHLElBQUksV0FBVyxHQUFHLENBQUM7QUFFOUM7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLEdBQVc7SUFDM0IsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3ZELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsdUJBQXVCLENBQzlCLEtBQWMsRUFDZCxPQUEwQjtJQUUxQixNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFB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T0FBTyxDQUFDLE9BQU8sQ0FDN0IsSUFBQSxXQUFJLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sVUFBVSxDQUFDLENBQzlDLENBQUM7UUFDRixPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsTUFBTSxPQUFPLEdBQUcsQ0FBQztJQUM5QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMsIHN0YXRTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBncmF5LCB1bmRlcmxpbmUgfSBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7ICQgfSBmcm9tIFwiZGF4XCI7XG5pbXBvcnQgeyBQUk9KRU5fRElSLCBUQVNLU19NQU5JRkVTVF9WRVJTSU9OIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0ICogYXMgbG9nZ2luZyBmcm9tIFwiLi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHR5cGUgeyBUYXNrc01hbmlmZXN0LCBUYXNrU3BlYywgVGFza1N0ZXAgfSBmcm9tIFwiLi4vdGFzay1tb2RlbFwiO1xuaW1wb3J0IHsgc3lzdGVtU2hlbGwsIHRvb2wgfSBmcm9tIFwiLi4vdXRpbC9leGVjXCI7XG5cbi8vIGF2b2lkcyBhIChmYWxzZSBwb3NpdGl2ZSkgZXNidWlsZCB3YXJuaW5nIGFib3V0IGluY29ycmVjdCBpbXBvcnRzLlxuLy8gYD8uZGVmYXVsdCA/PyBtb2R1bGVgIGtlZXBzIHRoaXMgd29ya2luZyBib3RoIGFzIGEgcGxhaW4gQ29tbW9uSlMgcmVxdWlyZSBhbmRcbi8vIHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgaW50ZXJvcC13cmFwcGVkIGluc2lkZSB0aGUgYnVuZGxlZCBydW4tdGFzay5janMgKHdoZXJlXG4vLyBgcmVxdWlyZSguLi4pYCBtYXkgeWllbGQgYHsgZGVmYXVsdDogZm4gfWAgaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24pLiBTZWVcbi8vIHByb2plbiM0NDA3IChcInBhcnNlQ29uZmxpY3RKU09OIGlzIG5vdCBhIGZ1bmN0aW9uXCIgYWZ0ZXIgZWplY3QpLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IHBhcnNlQ29uZmxpY3RKU09OTW9kdWxlID0gcmVxdWlyZShcInBhcnNlLWNvbmZsaWN0LWpzb25cIik7XG5jb25zdCBwYXJzZUNvbmZsaWN0SlNPTiA9XG4gIHBhcnNlQ29uZmxpY3RKU09OTW9kdWxlPy5kZWZhdWx0ID8/IHBhcnNlQ29uZmxpY3RKU09OTW9kdWxlO1xuXG5jb25zdCBFTlZfVFJJTV9MRU4gPSAyMDtcbmNvbnN0IEFSR1NfTUFSS0VSID0gXCIkQFwiO1xuY29uc3QgUVVPVEVEX0FSR1NfTUFSS0VSID0gYFwiJHtBUkdTX01BUktFUn1cImA7XG5cbi8qKlxuICogRG91YmxlLXF1b3RlcyBhIHNpbmdsZSBhcmd1bWVudCBzbyBpdCBpcyBwYXNzZWQgdGhyb3VnaCB2ZXJiYXRpbSwgZXNjYXBpbmcgdGhlXG4gKiBjaGFyYWN0ZXJzIHRoYXQgc3RheSBzcGVjaWFsIGluc2lkZSBkb3VibGUgcXVvdGVzLiAoRG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZTpcbiAqIGRheCdzIHNoZWxsIGxhY2tzIHRoZSBQT1NJWCBgJ1xcJydgIGVzY2FwZS4pXG4gKi9cbmZ1bmN0aW9uIHF1b3RlQXJnKGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuICdcIicgKyBhcmcucmVwbGFjZSgvKFtcIiRgXFxcXF0pL2csIFwiXFxcXCQxXCIpICsgJ1wiJztcbn1cblxuLyoqXG4gKiBkYXgncyBidWlsdC1pbiBjcm9zcy1wbGF0Zm9ybSBzaGVsbCBvbmx5IGltcGxlbWVudHMgYSBzdWJzZXQgb2YgUE9TSVggc2hlbGxcbiAqIHN5bnRheCBhbmQgdGhyb3dzIGEgdGVyc2UgYE5vdCBpbXBsZW1lbnRlZDogLi4uYCBmb3IgdGhlIHJlc3QuIFJld3JpdGUgdGhvc2VcbiAqIGludG8gYSBzaG9ydCwgYWN0aW9uYWJsZSBlcnJvciB0aGF0IHBvaW50cyBhdCB0aGUgc3lzdGVtLXNoZWxsIGVzY2FwZSBoYXRjaDtcbiAqIHBhc3MgZXZlcnkgb3RoZXIgZXJyb3IgdGhyb3VnaCB1bmNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGVucmljaEJ1aWx0aW5TaGVsbEVycm9yKFxuICBlcnJvcjogdW5rbm93bixcbiAgY29tbWFuZDogc3RyaW5nIHwgc3RyaW5nW10sXG4pOiB1bmtub3duIHtcbiAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgaWYgKCEvTm90IGltcGxlbWVudGVkOi8udGVzdChtZXNzYWdlKSkge1xuICAgIC8qIHY4IGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgY29uc3QgY29tbWFuZExpbmUgPSBBcnJheS5pc0FycmF5KGNvbW1hbmQpID8gY29tbWFuZC5qb2luKFwiIFwiKSA6IGNvbW1hbmQ7XG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgXCJwcm9qZW4ncyBidWlsdC1pbiBzaGVsbCBjYW4ndCBydW4gdGhpcyBjb21tYW5kOlxcblwiICtcbiAgICAgIGAgICR7Y29tbWFuZExpbmV9XFxuYCArXG4gICAgICBcIlRvIHVzZSB5b3VyIHN5c3RlbSdzIHNoZWxsIGluc3RlYWQsIHNldCB0aGlzIHRhc2sgdG8gVGFza1NoZWxsLnN5c3RlbSgpLlwiLFxuICApO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZWQgcmVzdWx0IG9mIGBzaGVsbCgpYCAoYSBzdWJzZXQgb2Ygbm9kZSdzIGBTcGF3blN5bmNSZXR1cm5zYCkuXG4gKi9cbmludGVyZmFjZSBTaGVsbFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgZXhpdCBjb2RlIG9mIHRoZSBjb21tYW5kLCBvciBgbnVsbGAgaWYgdGhlIHByb2Nlc3Mgd2FzIHRlcm1pbmF0ZWQgYnkgYVxuICAgKiBzaWduYWwgb3IgbmV2ZXIgc3Bhd25lZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FwdHVyZWQgc3Rkb3V0LiBPbmx5IHBvcHVsYXRlZCB3aGVuIHN0ZG91dCBpcyBwaXBlZCAoZS5nLiB3aGVuIGV2YWx1YXRpbmdcbiAgICogZW52aXJvbm1lbnQgdmFyaWFibGVzKTsgYG51bGxgL2B1bmRlZmluZWRgIHdoZW4gc3RkaW8gaXMgaW5oZXJpdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3Rkb3V0PzogQnVmZmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FwdHVyZWQgc3RkZXJyLiBTZWUgYHN0ZG91dGAuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI/OiBCdWZmZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBlcnJvciByYWlzZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBzcGF3biB0aGUgY29tbWFuZCAobm90IGEgbm9uLXplcm8gZXhpdFxuICAgKiBjb2RlLCB3aGljaCBpcyByZXBvcnRlZCB2aWEgYHN0YXR1c2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3I/OiBFcnJvcjtcbn1cblxuLyoqXG4gKiBUaGUgcnVudGltZSBjb21wb25lbnQgb2YgdGhlIHRhc2tzIGVuZ2luZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tSdW50aW1lIHtcbiAgLyoqXG4gICAqIFRoZSBwcm9qZWN0LXJlbGF0aXZlIHBhdGggb2YgdGhlIHRhc2tzIG1hbmlmZXN0IGZpbGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1BTklGRVNUX0ZJTEUgPSBwYXRoLnBvc2l4LmpvaW4oXG4gICAgUFJPSkVOX0RJUixcbiAgICBcInRhc2tzLmpzb25cIixcbiAgKTtcblxuICAvKipcbiAgICogT25lLXNob3QgZW50cnlwb2ludCBmb3IgdGhlIHN0YW5kYWxvbmUgdGFzayBydW5uZXIuXG4gICAqXG4gICAqIENyZWF0ZXMgYSBydW50aW1lIHJvb3RlZCBhdCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgcnVucyB0aGUgbmFtZWRcbiAgICogdGFzaywgYW5kIGNvbnZlcnRzIGFueSBmYWlsdXJlIGludG8gYSBub24temVybyBwcm9jZXNzIGV4aXQgY29kZS4gVGhpcyBpc1xuICAgKiB0aGUgc2luZ2xlIGxpbmUgaW52b2tlZCBieSB0aGUgYnVuZGxlZCBgc2NyaXB0cy9ydW4tdGFzay5janNgIHRoYXRcbiAgICogXCJwcm9qZW4gZWplY3RcIiBlbWl0cywgd2hpY2gga2VlcHMgdGhlIGdlbmVyYXRlZCBidW5kbGUgZm9vdGVyIHRyaXZpYWwuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0YXNrIHRvIHJ1bi4gRGVmYXVsdHMgdG8gYHByb2Nlc3MuYXJndlsyXWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIG1haW4obmFtZTogc3RyaW5nID0gcHJvY2Vzcy5hcmd2WzJdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldyBUYXNrUnVudGltZShcIi5cIikucnVuVGFzayhuYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZT8uc3RhY2sgPz8gU3RyaW5nKGUpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIHRhc2tzLmpzb25cbiAgICovXG4gIHByaXZhdGUgX21hbmlmZXN0OiBUYXNrc01hbmlmZXN0ID0geyB0YXNrczoge30gfTtcblxuICAvKipcbiAgICogVGhlIHJhdyBjb250ZW50cyBvZiB0aGUgY3VycmVudGx5IGxvYWRlZCBtYW5pZmVzdCwgdXNlZCB0byBkZXRlY3QgY2hhbmdlc1xuICAgKiBvbiBkaXNrIHNvIHRoZSBydW50aW1lIGNhbiByZWxvYWQgYSByZWdlbmVyYXRlZCBtYW5pZmVzdCBtaWQtcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBfaWRlbnRpdHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCBhbmQgdGhlIGN3ZCBmb3IgZXhlY3V0aW5nIHRhc2tzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtkaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih3b3JrZGlyOiBzdHJpbmcpIHtcbiAgICB0aGlzLndvcmtkaXIgPSByZXNvbHZlKHdvcmtkaXIpO1xuICAgIC8vIFBlcmZvcm0gdGhlIGluaXRpYWwgbG9hZC4gVGhpcyBhbHNvIHZlcmlmaWVzIHRoZSBtYW5pZmVzdCdzIHNjaGVtYVxuICAgIC8vIHZlcnNpb24uXG4gICAgdGhpcy5yZWxvYWRNYW5pZmVzdElmQ2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0YXNrcy5qc29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1hbmlmZXN0KCk6IFRhc2tzTWFuaWZlc3Qge1xuICAgIHJldHVybiB0aGlzLl9tYW5pZmVzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdGFza3MgbWFuaWZlc3QgZmlsZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IG1hbmlmZXN0UGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBqb2luKHRoaXMud29ya2RpciwgVGFza1J1bnRpbWUuTUFOSUZFU1RfRklMRSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRhc2tzIGluIHRoaXMgcHJvamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdGFza3MoKTogVGFza1NwZWNbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5tYW5pZmVzdC50YXNrcyA/PyB7fSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIHRhc2sgYnkgbmFtZSwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLlxuICAgKi9cbiAgcHVibGljIHRyeUZpbmRUYXNrKG5hbWU6IHN0cmluZyk6IFRhc2tTcGVjIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMubWFuaWZlc3QudGFza3MpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hbmlmZXN0LnRhc2tzW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHRhc2suXG4gICAqIEBwYXJhbSBuYW1lIFRoZSB0YXNrIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcnVuVGFzayhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBhcmdzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW10sXG4gICAgZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBIHByZXZpb3VzbHkgZXhlY3V0ZWQgdGFzayAobW9zdCBpbXBvcnRhbnRseSB0aGUgXCJkZWZhdWx0XCIvc3ludGggdGFzayxcbiAgICAvLyB3aGljaCBgYnVpbGRgIHNwYXducyBmaXJzdCkgbWF5IGhhdmUgcmVnZW5lcmF0ZWQgYC5wcm9qZW4vdGFza3MuanNvbmAuXG4gICAgLy8gUGljayB1cCBhbnkgc3VjaCBjaGFuZ2VzIGJlZm9yZSByZXNvbHZpbmcgYW5kIHJ1bm5pbmcgdGhpcyB0YXNrIHNvIHdlXG4gICAgLy8gbmV2ZXIgZXhlY3V0ZSBhIHN0YWxlLCBpbi1tZW1vcnkgZGVmaW5pdGlvbi5cbiAgICB0aGlzLnJlbG9hZE1hbmlmZXN0SWZDaGFuZ2VkKCk7XG5cbiAgICBjb25zdCB0YXNrID0gdGhpcy50cnlGaW5kVGFzayhuYW1lKTtcbiAgICBpZiAoIXRhc2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2Fubm90IGZpbmQgY29tbWFuZCAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFJ1blRhc2sodGhpcywgdGFzaywgcGFyZW50cywgYXJncywgZW52KS5ydW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1yZWFkcyB0aGUgdGFza3MgbWFuaWZlc3QgZnJvbSBkaXNrIGlmIGl0cyBjb250ZW50cyBjaGFuZ2VkIHNpbmNlIGl0IHdhc1xuICAgKiBsYXN0IGxvYWRlZCwgdmVyaWZ5aW5nIGl0cyBzY2hlbWEgdmVyc2lvbiBhbG9uZyB0aGUgd2F5LlxuICAgKlxuICAgKiBDaGFuZ2UgZGV0ZWN0aW9uIGNvbXBhcmVzIHRoZSByYXcgZmlsZSBjb250ZW50cywgc28gYW4gdW5jaGFuZ2VkIG1hbmlmZXN0XG4gICAqIGlzIG5vdCByZS12ZXJpZmllZCBvciByZS1hZG9wdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWxvYWRNYW5pZmVzdElmQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5tYW5pZmVzdFBhdGgpKSB7XG4gICAgICAvLyBObyBtYW5pZmVzdCBvbiBkaXNrOiB0cmVhdCBhcyBhbiBlbXB0eSBwcm9qZWN0IChsZWdhY3kgYmVoYXZpb3IpLlxuICAgICAgdGhpcy5fbWFuaWZlc3QgPSB7IHRhc2tzOiB7fSB9O1xuICAgICAgdGhpcy5faWRlbnRpdHkgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmF3ID0gcmVhZEZpbGVTeW5jKHRoaXMubWFuaWZlc3RQYXRoLCBcInV0Zi04XCIpO1xuICAgIGlmIChyYXcgPT09IHRoaXMuX2lkZW50aXR5KSB7XG4gICAgICByZXR1cm47IC8vIHVuY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBsb2FkXG4gICAgfVxuXG4gICAgY29uc3QgbWFuaWZlc3Q6IFRhc2tzTWFuaWZlc3QgPSBwYXJzZUNvbmZsaWN0SlNPTihyYXcsIHVuZGVmaW5lZCwgXCJ0aGVpcnNcIik7XG5cbiAgICAvLyBBIHByZXZpb3VzbHkgbG9hZGVkIG1hbmlmZXN0IG1lYW5zIHRoaXMgaXMgYSAqcmVsb2FkKiAoZS5nLiB0aGVcbiAgICAvLyBcImRlZmF1bHRcIi9zeW50aCB0YXNrIHJlZ2VuZXJhdGVkIHRoZSBmaWxlIG1pZC1ydW4pLCBhcyBvcHBvc2VkIHRvIHRoZVxuICAgIC8vIGluaXRpYWwgbG9hZCBwZXJmb3JtZWQgYnkgdGhlIGNvbnN0cnVjdG9yLlxuICAgIGNvbnN0IGlzUmVsb2FkID0gdGhpcy5faWRlbnRpdHkgIT09IHVuZGVmaW5lZDtcblxuICAgIHRoaXMudmVyaWZ5TWFuaWZlc3QobWFuaWZlc3QpO1xuICAgIHRoaXMuX21hbmlmZXN0ID0gbWFuaWZlc3Q7XG4gICAgdGhpcy5faWRlbnRpdHkgPSByYXc7XG5cbiAgICBpZiAoaXNSZWxvYWQpIHtcbiAgICAgIGxvZ2dpbmcuZGVidWcoXG4gICAgICAgIGAke1Rhc2tSdW50aW1lLk1BTklGRVNUX0ZJTEV9IGNoYW5nZWQgb24gZGlzazsgc3VjY2Vzc2Z1bGx5IGxvYWRlZCB0aGUgbmV3IHRhc2tzIG1hbmlmZXN0LmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBmcmVzaGx5IHJlYWQgbWFuaWZlc3Q6XG4gICAqXG4gICAqIC0gTGVnYWN5IG1hbmlmZXN0cyAobm8gYG1hbmlmZXN0VmVyc2lvbmApIGFyZSBhY2NlcHRlZCBhcy1pcyBmb3IgYmFja3dhcmRzXG4gICAqICAgY29tcGF0aWJpbGl0eS5cbiAgICogLSBNYW5pZmVzdHMgZnJvbSBhIG5ld2VyIHByb2plbiAoYSBoaWdoZXIgYG1hbmlmZXN0VmVyc2lvbmApIGFyZSBhY2NlcHRlZFxuICAgKiAgIHdpdGggYSB3YXJuaW5nLCBzaW5jZSB0aGlzIHJ1bnRpbWUgbWF5IG5vdCB1bmRlcnN0YW5kIHRoZSBzY2hlbWEuXG4gICAqL1xuICBwcml2YXRlIHZlcmlmeU1hbmlmZXN0KG1hbmlmZXN0OiBUYXNrc01hbmlmZXN0KTogdm9pZCB7XG4gICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IG1hbmlmZXN0cyBnZW5lcmF0ZWQgYmVmb3JlIHZlcnNpb25pbmcgY2Fycnkgbm9cbiAgICAvLyB2ZXJzaW9uLlxuICAgIGlmIChtYW5pZmVzdC5tYW5pZmVzdFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtYW5pZmVzdC5tYW5pZmVzdFZlcnNpb24gPiBUQVNLU19NQU5JRkVTVF9WRVJTSU9OKSB7XG4gICAgICBsb2dnaW5nLndhcm4oXG4gICAgICAgIGAke1Rhc2tSdW50aW1lLk1BTklGRVNUX0ZJTEV9IHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb2plbiBgICtcbiAgICAgICAgICBgKG1hbmlmZXN0IHZlcnNpb24gJHttYW5pZmVzdC5tYW5pZmVzdFZlcnNpb259LCB0aGlzIHByb2plbiBzdXBwb3J0cyB1cCB0byAke1RBU0tTX01BTklGRVNUX1ZFUlNJT059KS4gYCArXG4gICAgICAgICAgYFNvbWUgdGFza3MgbWF5IG5vdCBiZWhhdmUgYXMgZXhwZWN0ZWQ7IGNvbnNpZGVyIHVwZ3JhZGluZyBwcm9qZW4uYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFJ1blRhc2sge1xuICBwcml2YXRlIGVudjogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRzOiBzdHJpbmdbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHdvcmtkaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJ1bnRpbWU6IFRhc2tSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFzazogVGFza1NwZWMsXG4gICAgcGFyZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFyZ3M6IEFycmF5PHN0cmluZyB8IG51bWJlcj4gPSBbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVudlBhcmFtOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLndvcmtkaXIgPSB0YXNrLmN3ZCA/PyB0aGlzLnJ1bnRpbWUud29ya2RpcjtcbiAgICB0aGlzLnBhcmVudHMgPSBwYXJlbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSB0YXNrLiBUaGlzIHdhcyBwcmV2aW91c2x5IGRvbmUgaW4gdGhlIGNvbnN0cnVjdG9yLCBidXQgaXMgbm93XG4gICAqIGFuIGFzeW5jIG1ldGhvZCBzaW5jZSBzaGVsbCBleGVjdXRpb24gaXMgYXN5bmNocm9ub3VzIChlLmcuIGRheCBvblxuICAgKiBXaW5kb3dzKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB0YXNrLCBhcmdzLCBwYXJlbnRzIH0gPSB0aGlzO1xuXG4gICAgaWYgKCF0YXNrLnN0ZXBzIHx8IHRhc2suc3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvZ0RlYnVnKGdyYXkoXCJObyBhY3Rpb25zIGhhdmUgYmVlbiBzcGVjaWZpZWQgZm9yIHRoaXMgdGFzay5cIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZW52ID0gYXdhaXQgdGhpcy5yZXNvbHZlRW52aXJvbm1lbnQoXG4gICAgICB0aGlzLmVudlBhcmFtLFxuICAgICAgcGFyZW50cyxcbiAgICAgIHRoaXMucmVzb2x2ZVNoZWxsKCksXG4gICAgKTtcblxuICAgIGNvbnN0IGVudmxvZ3MgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudikpIHtcbiAgICAgIGNvbnN0IHZ2ID0gdiA/PyBcIlwiO1xuICAgICAgY29uc3QgdHJpbW1lZCA9XG4gICAgICAgIHZ2Lmxlbmd0aCA+IEVOVl9UUklNX0xFTiA/IHZ2LnN1YnN0cmluZygwLCBFTlZfVFJJTV9MRU4pICsgXCIuLi5cIiA6IHZ2O1xuICAgICAgZW52bG9ncy5wdXNoKGAke2t9PSR7dHJpbW1lZH1gKTtcbiAgICB9XG5cbiAgICBpZiAoZW52bG9ncy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubG9nRGVidWcoZ3JheShgJHt1bmRlcmxpbmUoXCJlbnZcIil9OiAke2VudmxvZ3Muam9pbihcIiBcIil9YCkpO1xuICAgIH1cblxuICAgIC8vIGV2YWx1YXRlIGNvbmRpdGlvblxuICAgIGlmICghKGF3YWl0IHRoaXMuZXZhbENvbmRpdGlvbih0YXNrLCB0aGlzLnJlc29sdmVTaGVsbCgpKSkpIHtcbiAgICAgIHRoaXMubG9nKFwiY29uZGl0aW9uIGV4aXRlZCB3aXRoIG5vbi16ZXJvIC0gc2tpcHBpbmdcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdmVyaWZ5IHdlIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgZGVmaW5lZFxuICAgIGNvbnN0IG1lcmdlZCA9IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRoaXMuZW52IH07XG4gICAgY29uc3QgbWlzc2luZyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRhc2sucmVxdWlyZWRFbnYgPz8gW10pIHtcbiAgICAgIGlmICghKG5hbWUgaW4gbWVyZ2VkKSkge1xuICAgICAgICBtaXNzaW5nLnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbWlzc2luZyByZXF1aXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6ICR7bWlzc2luZy5qb2luKFwiLFwiKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgdGFzay5zdGVwcykge1xuICAgICAgY29uc3Qgc3RlcFNoZWxsID0gdGhpcy5yZXNvbHZlU2hlbGwoc3RlcCk7XG5cbiAgICAgIC8vIGV2YWx1YXRlIHN0ZXAgY29uZGl0aW9uXG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmV2YWxDb25kaXRpb24oc3RlcCwgc3RlcFNoZWxsKSkpIHtcbiAgICAgICAgdGhpcy5sb2coXCJjb25kaXRpb24gZXhpdGVkIHdpdGggbm9uLXplcm8gLSBza2lwcGluZ1wiKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFyZ3NMaXN0OiBzdHJpbmdbXSA9IFtcbiAgICAgICAgLi4uKHN0ZXAuYXJncyB8fCBbXSksXG4gICAgICAgIC4uLihzdGVwLnJlY2VpdmVBcmdzID8gYXJncyA6IFtdKSxcbiAgICAgIF0ubWFwKChhKSA9PiBhLnRvU3RyaW5nKCkpO1xuXG4gICAgICBpZiAoc3RlcC5zYXkpIHtcbiAgICAgICAgbG9nZ2luZy5pbmZvKHRoaXMuZm10TG9nKHN0ZXAuc2F5KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGVwLnNwYXduKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucnVudGltZS5ydW5UYXNrKFxuICAgICAgICAgIHN0ZXAuc3Bhd24sXG4gICAgICAgICAgWy4uLnRoaXMucGFyZW50cywgdGhpcy50YXNrLm5hbWVdLFxuICAgICAgICAgIGFyZ3NMaXN0LFxuICAgICAgICAgIHN0ZXAuZW52LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGVjczogQXJyYXk8c3RyaW5nIHwgc3RyaW5nW10+ID0gc3RlcC5leGVjID8gW3N0ZXAuZXhlY10gOiBbXTtcblxuICAgICAgLy8gUGFyc2Ugc3RlcC1zcGVjaWZpYyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZXZhbEVudmlyb25tZW50KHN0ZXAuZW52ID8/IHt9LCBzdGVwU2hlbGwpO1xuXG4gICAgICBpZiAoc3RlcC5idWlsdGluKSB7XG4gICAgICAgIGV4ZWNzLnB1c2godGhpcy5yZW5kZXJCdWlsdGluKHN0ZXAuYnVpbHRpbikpO1xuICAgICAgfVxuXG4gICAgICAvLyBgZXhlY0FyZ3NgIGlzIGFuIGV4cGxpY2l0IGFyZ3YgKHRoZSBwcm9ncmFtIGZvbGxvd2VkIGJ5IGl0cyBhcmd1bWVudHMpLlxuICAgICAgLy8gSXQgaXMgaGFuZGVkIHRvIGBzaGVsbCgpYCBhcyBhbiBhcnJheSByYXRoZXIgdGhhbiBhIHJlbmRlcmVkIHN0cmluZywgc29cbiAgICAgIC8vIGl0IHJ1bnMgd2l0aG91dCBhIHNoZWxsIGFuZCBldmVyeSBlbGVtZW50IGlzIHBhc3NlZCB0aHJvdWdoIHZlcmJhdGltIC1cbiAgICAgIC8vIHdoaWNoIGlzIHdoYXQgbGV0cyBjYWxsZXJzIGF2b2lkIHRoaW5raW5nIGFib3V0IHF1b3RpbmcuIEZpeGVkL3JlY2VpdmVkXG4gICAgICAvLyBhcmdzIGFyZSBzcGxpY2VkIGluIHdoZXJldmVyIGEgYCRAYCBtYXJrZXIgZWxlbWVudCBhcHBlYXJzIChtaXJyb3JpbmdcbiAgICAgIC8vIHRoZSBzdHJpbmcgYGV4ZWNgIGJlaGF2aW9yKSwgb3IgYXBwZW5kZWQgYXQgdGhlIGVuZCBpZiB0aGVyZSBpcyBub25lLlxuICAgICAgaWYgKHN0ZXAuZXhlY0FyZ3MpIHtcbiAgICAgICAgY29uc3QgYXJndjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IHBsYWNlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygc3RlcC5leGVjQXJncykge1xuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBBUkdTX01BUktFUikge1xuICAgICAgICAgICAgYXJndi5wdXNoKC4uLmFyZ3NMaXN0KTtcbiAgICAgICAgICAgIHBsYWNlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFyZ3YucHVzaChlbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwbGFjZWQpIHtcbiAgICAgICAgICBhcmd2LnB1c2goLi4uYXJnc0xpc3QpO1xuICAgICAgICB9XG4gICAgICAgIGV4ZWNzLnB1c2goYXJndik7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZXhlYyBvZiBleGVjcykge1xuICAgICAgICBsZXQgY29tbWFuZCA9IGV4ZWM7XG5cbiAgICAgICAgLy8gQSBzdHJpbmcgY29tbWFuZCBpcyBhIHNoZWxsIGxpbmU6IHNwbGljZSB0YXNrIGFyZ3MgaW4gcGVyIHRoZSBgJEBgXG4gICAgICAgIC8vIG1hcmtlciBydWxlcy4gQW4gYGV4ZWNBcmdzYCBhcmd2IGFscmVhZHkgY2FycmllcyBpdHMgYXJncywgdW50b3VjaGVkLlxuICAgICAgICBpZiAodHlwZW9mIGNvbW1hbmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAoY29tbWFuZC5pbmNsdWRlcyhRVU9URURfQVJHU19NQVJLRVIpKSB7XG4gICAgICAgICAgICAvLyBgXCIkQFwiYDogc3BsaWNlIGVhY2ggYXJnIGluIGFzIGEgc2VwYXJhdGUgdmVyYmF0aW0gd29yZCAobGlrZVxuICAgICAgICAgICAgLy8gYmFzaCdzIHF1b3RlZCBgXCIkQFwiYCksIHNvIHdoaXRlc3BhY2UgYW5kIG1ldGFjaGFyYWN0ZXJzIHN1cnZpdmUuXG4gICAgICAgICAgICBjb21tYW5kID0gY29tbWFuZC5yZXBsYWNlKFxuICAgICAgICAgICAgICBRVU9URURfQVJHU19NQVJLRVIsXG4gICAgICAgICAgICAgIGFyZ3NMaXN0Lm1hcChxdW90ZUFyZykuam9pbihcIiBcIiksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5pbmNsdWRlcyhBUkdTX01BUktFUikpIHtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnJlcGxhY2UoQVJHU19NQVJLRVIsIGFyZ3NMaXN0LmpvaW4oXCIgXCIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tbWFuZCA9IFtjb21tYW5kLCAuLi5hcmdzTGlzdF0uam9pbihcIiBcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3dkID0gc3RlcC5jd2Q7XG4gICAgICAgIC8vIEEgdGhyb3duIGVycm9yIChlLmcuIHNwYXduIGZhaWx1cmUpIHByb3BhZ2F0ZXM7IGEgbm9uLXplcm8gZXhpdCBpc1xuICAgICAgICAvLyByZXBvcnRlZCB2aWEgYHJlc3VsdC5zdGF0dXNgLlxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNoZWxsKHtcbiAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgIGN3ZCxcbiAgICAgICAgICBleHRyYUVudjogZW52LFxuICAgICAgICAgIHNoZWxsOiBzdGVwU2hlbGwsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUYXNrIFwiJHt0aGlzLmZ1bGxuYW1lfVwiIGZhaWxlZCB3aGVuIGV4ZWN1dGluZyBcIiR7XG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY29tbWFuZCkgPyBjb21tYW5kLmpvaW4oXCIgXCIpIDogY29tbWFuZFxuICAgICAgICAgICAgfVwiIChjd2Q6ICR7cmVzb2x2ZShjd2QgPz8gdGhpcy53b3JrZGlyKX0pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgYSB0YXNrIHNob3VsZCBiZSBleGVjdXRlZCBiYXNlZCBvbiBcImNvbmRpdGlvblwiLlxuICAgKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIHNob3VsZCBiZSBleGVjdXRlZCBvciBmYWxzZSBpZiB0aGUgY29uZGl0aW9uXG4gICAqIGV2YWx1YXRlcyB0byBmYWxzZSAoZXhpdHMgd2l0aCBub24temVybyksIGluZGljYXRpbmcgdGhhdCB0aGUgdGFzayBzaG91bGRcbiAgICogYmUgc2tpcHBlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXZhbENvbmRpdGlvbihcbiAgICB0YXNrT3JTdGVwOiBUYXNrU3BlYyB8IFRhc2tTdGVwLFxuICAgIHNoZWxsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKSB7XG4gICAgLy8gbm8gY29uZGl0aW9uLCBjYXJyeSBvblxuICAgIGlmICghdGFza09yU3RlcC5jb25kaXRpb24pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMubG9nKGdyYXkoYCR7dW5kZXJsaW5lKFwiY29uZGl0aW9uXCIpfTogJHt0YXNrT3JTdGVwLmNvbmRpdGlvbn1gKSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaGVsbCh7XG4gICAgICBjb21tYW5kOiB0YXNrT3JTdGVwLmNvbmRpdGlvbixcbiAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgc2hlbGwsXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBzaGVsbCBjb21tYW5kcyAoZS5nLiBgJCh4eClgKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBldmFsRW52aXJvbm1lbnQoXG4gICAgZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgICBzaGVsbDogc3RyaW5nIHwgc3RyaW5nW10sXG4gICkge1xuICAgIGNvbnN0IG91dHB1dDogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudiA/PyB7fSkpIHtcbiAgICAgIGlmIChTdHJpbmcodmFsdWUpLnN0YXJ0c1dpdGgoXCIkKFwiKSAmJiBTdHJpbmcodmFsdWUpLmVuZHNXaXRoKFwiKVwiKSkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IHZhbHVlLnN1YnN0cmluZygyLCB2YWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaGVsbCh7XG4gICAgICAgICAgY29tbWFuZDogcXVlcnksXG4gICAgICAgICAgcXVpZXQ6IHRydWUsXG4gICAgICAgICAgY2FwdHVyZU91dHB1dDogdHJ1ZSxcbiAgICAgICAgICBzaGVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3JcbiAgICAgICAgICAgID8gcmVzdWx0LmVycm9yLnN0YWNrXG4gICAgICAgICAgICA6IHJlc3VsdC5zdGRlcnI/LnRvU3RyaW5nKCkudHJpbSgpIHx8XG4gICAgICAgICAgICAgIHJlc3VsdC5zdGRvdXQ/LnRvU3RyaW5nKCkudHJpbSgpIHx8XG4gICAgICAgICAgICAgIGBjb21tYW5kIGV4aXRlZCB3aXRoIGNvZGUgJHtyZXN1bHQuc3RhdHVzfWA7XG5cbiAgICAgICAgICBsb2dnaW5nLndhcm4oXG4gICAgICAgICAgICB0aGlzLmZtdExvZyhcbiAgICAgICAgICAgICAgYCR7dW5kZXJsaW5lKGtleSl9OiB1bmFibGUgdG8gZXZhbHVhdGUgXCIke3F1ZXJ5fVwiLiBFbnZpcm9ubWVudCB2YXJpYWJsZSB3aWxsIGJlIHNraXBwZWQuIENoZWNrIHRoYXQgdGhlIGNvbW1hbmQgZXhpc3RzIGFuZCBydW5zIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZ2dpbmcud2Fybih0aGlzLmZtdExvZyhgJHt1bmRlcmxpbmUoa2V5KX06ICR7ZXJyb3J9YCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dHB1dFtrZXldID0gcmVzdWx0LnN0ZG91dD8udG9TdHJpbmcoXCJ1dGYtOFwiKS50cmltKCkgPz8gXCJcIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciBhIHRhc2suIE5hbWVseSwgaXQgc3VwcG9ydHMgdGhpcyBzeW50YXhcbiAgICogYCQoeHgpYCBmb3IgYWxsb3dpbmcgZW52aXJvbm1lbnQgdG8gYmUgZXZhbHVhdGVkIGJ5IGV4ZWN1dGluZyBhIHNoZWxsXG4gICAqIGNvbW1hbmQgYW5kIG9idGFpbmluZyBpdHMgcmVzdWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlRW52aXJvbm1lbnQoXG4gICAgZW52UGFyYW06IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9LFxuICAgIHBhcmVudHM6IHN0cmluZ1tdLFxuICAgIHNoZWxsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKSB7XG4gICAgbGV0IGVudiA9IHRoaXMucnVudGltZS5tYW5pZmVzdC5lbnYgPz8ge307XG5cbiAgICAvLyBhZGQgZW52IGZyb20gYWxsIHBhcmVudCB0YXNrcyBvbmUgYnkgb25lXG4gICAgZm9yIChjb25zdCBwYXJlbnQgb2YgcGFyZW50cykge1xuICAgICAgZW52ID0ge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIC4uLih0aGlzLnJ1bnRpbWUudHJ5RmluZFRhc2socGFyZW50KT8uZW52ID8/IHt9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgdGFzayBlbnZpcm9ubWVudCwgdGhlbiB0aGUgc3BlY2lmaWMgZW52IGxhc3RcbiAgICBlbnYgPSB7XG4gICAgICAuLi5lbnYsXG4gICAgICAuLi4odGhpcy50YXNrLmVudiA/PyB7fSksXG4gICAgICAuLi5lbnZQYXJhbSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXZhbEVudmlyb25tZW50KGVudiwgc2hlbGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzaGVsbCBmb3IgYSBzdGVwJ3MgY29tbWFuZCAob3IgdGhlIHRhc2sncywgd2hlbiBubyBzdGVwIGlzXG4gICAqIGdpdmVuKTogc3RlcCwgdGhlbiB0YXNrLCB0aGVuIHByb2plY3QgZGVmYXVsdCwgdGhlbiBcInByb2plblwiLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlU2hlbGwoc3RlcD86IFRhc2tTdGVwKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiAoXG4gICAgICBzdGVwPy5zaGVsbCA/PyB0aGlzLnRhc2suc2hlbGwgPz8gdGhpcy5ydW50aW1lLm1hbmlmZXN0LnNoZWxsID8/IFwicHJvamVuXCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFwiZnVsbCBuYW1lXCIgb2YgdGhlIHRhc2sgd2hpY2ggaW5jbHVkZXMgYWxsIGl0J3MgcGFyZW50IHRhc2sgbmFtZXMgY29uY2F0ZW5hdGVkIGJ5IGNoZXZyb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgZnVsbG5hbWUoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnBhcmVudHMsIHRoaXMudGFzay5uYW1lXS5qb2luKFwiIMK7IFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgbG9nZ2luZy52ZXJib3NlKHRoaXMuZm10TG9nKC4uLmFyZ3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nRGVidWcoLi4uYXJnczogYW55W10pIHtcbiAgICBsb2dnaW5nLmRlYnVnKHRoaXMuZm10TG9nKC4uLmFyZ3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgZm10TG9nKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgcmV0dXJuIGZvcm1hdChgJHt1bmRlcmxpbmUodGhpcy5mdWxsbmFtZSl9IHxgLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2hlbGwob3B0aW9uczogU2hlbGxPcHRpb25zKTogUHJvbWlzZTxTaGVsbFJlc3VsdD4ge1xuICAgIGNvbnN0IHF1aWV0ID0gb3B0aW9ucy5xdWlldCA/PyBmYWxzZTtcbiAgICBpZiAoIXF1aWV0KSB7XG4gICAgICBjb25zdCBsb2cgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgICBsb2cucHVzaChcbiAgICAgICAgQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbW1hbmQpXG4gICAgICAgICAgPyBvcHRpb25zLmNvbW1hbmQuam9pbihcIiBcIilcbiAgICAgICAgICA6IG9wdGlvbnMuY29tbWFuZCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChvcHRpb25zLmN3ZCkge1xuICAgICAgICBsb2cucHVzaChgKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nKGxvZy5qb2luKFwiIFwiKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3dkID0gb3B0aW9ucy5jd2QgPz8gdGhpcy53b3JrZGlyO1xuICAgIGlmICghZXhpc3RzU3luYyhjd2QpIHx8ICFzdGF0U3luYyhjd2QpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGludmFsaWQgd29ya2RpciAoY3dkKTogJHtjd2R9IG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlc29sdmVkIHNoZWxsIGlzIG9uZSBvZjpcbiAgICAvLyAtIFwicHJvamVuXCIgKGRlZmF1bHQpOiBkYXgncyBpbi1wcm9jZXNzIGNyb3NzLXBsYXRmb3JtIHNoZWxsLCBzbyBQT1NJWC1zdHlsZVxuICAgIC8vICAgdGFzayBzeW50YXggKGBta2RpciAtcGAsIGAmJmAsIGAkVkFSYCwgLi4uKSB3b3JrcyB0aGUgc2FtZSBldmVyeXdoZXJlLlxuICAgIC8vIC0gXCJzeXN0ZW1cIjogdGhlIGhvc3QncyBuYXRpdmUgc2hlbGwgKGAvYmluL3NoYCwgb3IgYGNtZC5leGVgIG9uIFdpbmRvd3MpLlxuICAgIC8vIC0gYW4gYXJndiwgZS5nLiBbXCJiYXNoXCIsXCItY1wiXTogYSBzaGVsbCBpbnZvY2F0aW9uIHdpdGggdGhlIGNvbW1hbmQgYXBwZW5kZWRcbiAgICAvLyAgIGFzIGl0cyBmaW5hbCBhcmd1bWVudC5cbiAgICBjb25zdCBzaGVsbCA9IG9wdGlvbnMuc2hlbGwgPz8gXCJwcm9qZW5cIjtcbiAgICBpZiAodHlwZW9mIHNoZWxsID09PSBcInN0cmluZ1wiICYmIHNoZWxsICE9PSBcInByb2plblwiICYmIHNoZWxsICE9PSBcInN5c3RlbVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB1bmtub3duIGJ1aWx0LWluIHNoZWxsICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgc2hlbGwsXG4gICAgICAgICl9OyB1c2UgdGhlIGJ1aWx0LWluIFwicHJvamVuXCIgb3IgXCJzeXN0ZW1cIiBzaGVsbHMsIG9yIGEgVGFza1NoZWxsLmNvbW1hbmQoWy4uLl0pIGludm9jYXRpb25gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBzdGRvdXQvc3RkZXJyIGFyZSBjYXB0dXJlZCBvbmx5IHdoZW4gYXNrZWQgKGUuZy4gYCQoLi4uKWAgZW52IGV2YWwpO1xuICAgIC8vIG90aGVyd2lzZSB0aGV5IGFyZSBpbmhlcml0ZWQgc28gb3V0cHV0IHN0cmVhbXMgdGhyb3VnaC5cbiAgICBjb25zdCBjYXB0dXJlID0gb3B0aW9ucy5jYXB0dXJlT3V0cHV0ID8/IGZhbHNlO1xuXG4gICAgY29uc3QgY29tbWFuZCA9IG9wdGlvbnMuY29tbWFuZDtcbiAgICBjb25zdCBlbnYgPSB7XG4gICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgIC4uLnRoaXMuZW52LFxuICAgICAgLi4ub3B0aW9ucy5leHRyYUVudixcbiAgICB9O1xuXG4gICAgLy8gXCJzeXN0ZW1cIjogdGhlIGhvc3QtbmF0aXZlIGVuZ2luZS4gQSBzdHJpbmcgY29tbWFuZCBydW5zIHRocm91Z2ggdGhlIE9TXG4gICAgLy8gc2hlbGw7IGFuIGBleGVjQXJnc2AgYXJndiBpcyBzcGF3bmVkIGRpcmVjdGx5IChzaGVsbC1mcmVlKSwgc28gdGhlIHJlYWxcbiAgICAvLyBiaW5hcnkgcnVucyB3aXRoIG5vIGRheCBidWlsdC1pbnMuIChPbmx5IGAkKC4uLilgL2NvbmRpdGlvbiBldmFsIGNhcHR1cmVzLFxuICAgIC8vIGFuZCB0aG9zZSBhbHdheXMgcGFzcyBhIHN0cmluZywgc28gYW4gYXJyYXkgY29tbWFuZCBuZXZlciBuZWVkcyBjYXB0dXJlLilcbiAgICBpZiAoc2hlbGwgPT09IFwic3lzdGVtXCIpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbW1hbmQpKSB7XG4gICAgICAgIGNvbnN0IFtwcm9ncmFtLCAuLi5hcmdzXSA9IGNvbW1hbmQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdG9vbChwcm9ncmFtKS5ydW4oYXJncywgeyBjd2QsIGVudiwgaW5oZXJpdFN0ZGlvOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMCB9O1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGU/LnN0YXR1cyA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBlLnN0YXR1cyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3lzdGVtU2hlbGwoY29tbWFuZCwgeyBjd2QsIGVudiwgY2FwdHVyZSB9KTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgcnVuIHRocm91Z2ggZGF4OiB0aGUgXCJwcm9qZW5cIiBzaGVsbCBvciBhbiBleHBsaWNpdCBpbnZvY2F0aW9uLlxuICAgIGNvbnN0IGJ1aWxkZXIgPSB0aGlzLmJ1aWxkRGF4Q29tbWFuZChjb21tYW5kLCBzaGVsbCk7XG5cbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBidWlsZGVyXG4gICAgICAgIC5jd2QoY3dkKVxuICAgICAgICAuZW52KGVudilcbiAgICAgICAgLnN0ZG91dChjYXB0dXJlID8gXCJwaXBlZFwiIDogXCJpbmhlcml0XCIpXG4gICAgICAgIC5zdGRlcnIoY2FwdHVyZSA/IFwicGlwZWRcIiA6IFwiaW5oZXJpdFwiKVxuICAgICAgICAubm9UaHJvdygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGRheCdzIGluLXByb2Nlc3Mgc2hlbGwgdGhyb3dzIGEgdGVyc2UgYE5vdCBpbXBsZW1lbnRlZDogLi4uYCBmb3Igc2hlbGxcbiAgICAgIC8vIHN5bnRheCBpdCBkb2VzIG5vdCBzdXBwb3J0IChlLmcuIGAkKC4uLilgIGNvbW1hbmQgc3Vic3RpdHV0aW9uKTsgdHVyblxuICAgICAgLy8gdGhhdCBpbnRvIGFuIGFjdGlvbmFibGUgZXJyb3IgdGhhdCBwb2ludHMgYXQgdGhlIHN5c3RlbS1zaGVsbCBlc2NhcGVcbiAgICAgIC8vIGhhdGNoLiBPdGhlciBlcnJvcnMgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZC5cbiAgICAgIHRocm93IGVucmljaEJ1aWx0aW5TaGVsbEVycm9yKGUsIGNvbW1hbmQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IHJlc3VsdC5jb2RlLFxuICAgICAgc3Rkb3V0OiBjYXB0dXJlID8gQnVmZmVyLmZyb20ocmVzdWx0LnN0ZG91dEJ5dGVzKSA6IG51bGwsXG4gICAgICBzdGRlcnI6IGNhcHR1cmUgPyBCdWZmZXIuZnJvbShyZXN1bHQuc3RkZXJyQnl0ZXMpIDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGF4IGNvbW1hbmQgZm9yIHRoZSBcInByb2plblwiIHNoZWxsIG9yIGFuIGV4cGxpY2l0IGludm9jYXRpb24uXG4gICAqIChUaGUgXCJzeXN0ZW1cIiBzaGVsbCBpcyBoYW5kbGVkIGhvc3Qtc2lkZSwgbm90IGhlcmUuKSBgY29tbWFuZGAgaXMgYSBzaGVsbFxuICAgKiBsaW5lIChzdHJpbmcpIG9yIGFuIGBleGVjQXJnc2AgYXJndiAoc3RyaW5nW10pOyBgc2hlbGxgIGlzIGBcInByb2plblwiYCBvciBhblxuICAgKiBpbnZvY2F0aW9uIGFyZ3Ygc3VjaCBhcyBgW1wiYmFzaFwiLCBcIi1jXCJdYC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGREYXhDb21tYW5kKFxuICAgIGNvbW1hbmQ6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIHNoZWxsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKSB7XG4gICAgLy8gQW4gaW52b2NhdGlvbiAoZS5nLiBbXCJiYXNoXCIsXCItY1wiXSwgW1wibnB4XCIsXCItLW5vXCIsXCItY1wiXSk6IGFwcGVuZCB0aGVcbiAgICAvLyBjb21tYW5kIGFzIGl0cyBmaW5hbCBhcmd1bWVudC4gQSBzdHJpbmcgaXMgYXBwZW5kZWQgYXMtaXM7IGFuIGBleGVjQXJnc2BcbiAgICAvLyBhcmd2IGlzIHJlbmRlcmVkIHRvIGEgcXVvdGVkIGNvbW1hbmQgbGluZSBzbyB0aGUgc2hlbGwgcmUtcGFyc2VzIHRoZSBzYW1lXG4gICAgLy8gYXJndi5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzaGVsbCkpIHtcbiAgICAgIGNvbnN0IFtwcm9ncmFtLCAuLi5mbGFnc10gPSBzaGVsbDtcbiAgICAgIGNvbnN0IGNvbW1hbmRMaW5lID0gQXJyYXkuaXNBcnJheShjb21tYW5kKVxuICAgICAgICA/IGNvbW1hbmQubWFwKHF1b3RlQXJnKS5qb2luKFwiIFwiKVxuICAgICAgICA6IGNvbW1hbmQ7XG4gICAgICByZXR1cm4gJGAke3Byb2dyYW19ICR7Wy4uLmZsYWdzLCBjb21tYW5kTGluZV19YDtcbiAgICB9XG5cbiAgICAvLyBUaGUgYnVpbHQtaW4gXCJwcm9qZW5cIiBzaGVsbCAoZGF4KS5cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShjb21tYW5kKVxuICAgICAgPyAvLyBleGVjQXJnczogc2hlbGwtZnJlZSBhcmd2IChlYWNoIGVsZW1lbnQgZXNjYXBlZDsgYC5jbWRgIHNoaW1zIHJlc29sdmVkKS5cbiAgICAgICAgJGAke2NvbW1hbmRbMF19ICR7Y29tbWFuZC5zbGljZSgxKX1gXG4gICAgICA6IC8vIHN0cmluZyBjb21tYW5kLCBwYXJzZWQgaW4tcHJvY2VzcyBieSBkYXgncyBjcm9zcy1wbGF0Zm9ybSBzaGVsbC5cbiAgICAgICAgJC5yYXdgJHtjb21tYW5kfWA7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckJ1aWx0aW4oYnVpbHRpbjogc3RyaW5nKSB7XG4gICAgLy8gTG9jYXRlIHByb2plbidzIHBhY2thZ2Ugcm9vdCBieSB3YWxraW5nIHVwIGZyb20gdGhpcyBtb2R1bGUncyBkaXJlY3RvcnlcbiAgICAvLyB1bnRpbCB3ZSBmaW5kIGEgcGFja2FnZS5qc29uLiBUaGlzIHdvcmtzIHdoZXRoZXIgdGhlIGNvZGUgcnVucyBmcm9tIHRoZVxuICAgIC8vIGNvbXBpbGVkIGZpbGUgKGxpYi9jbGkvdGFzay1ydW50aW1lLmpzKSBvciBmcm9tIHRoZSBidW5kbGVkIHJ1bi10YXNrLmNqc1xuICAgIC8vIChsaWIvcnVuLXRhc2suY2pzKSwgd2hpY2ggbGl2ZSBhdCBkaWZmZXJlbnQgZGVwdGhzIC0gc28gYSBoYXJkLWNvZGVkXG4gICAgLy8gcmVsYXRpdmUgcGF0aCB0byBwYWNrYWdlLmpzb24gd291bGQgYmUgd3JvbmcgaW4gb25lIG9mIHRoZSB0d28gY2FzZXMuXG4gICAgbGV0IG1vZHVsZVJvb3QgPSBfX2Rpcm5hbWU7XG4gICAgd2hpbGUgKCFleGlzdHNTeW5jKGpvaW4obW9kdWxlUm9vdCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKG1vZHVsZVJvb3QpO1xuICAgICAgaWYgKHBhcmVudCA9PT0gbW9kdWxlUm9vdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmFibGUgdG8gbG9jYXRlIHRoZSBwcm9qZW4gcGFja2FnZSByb290XCIpO1xuICAgICAgfVxuICAgICAgbW9kdWxlUm9vdCA9IHBhcmVudDtcbiAgICB9XG4gICAgY29uc3QgcHJvZ3JhbSA9IHJlcXVpcmUucmVzb2x2ZShcbiAgICAgIGpvaW4obW9kdWxlUm9vdCwgXCJsaWJcIiwgYCR7YnVpbHRpbn0udGFzay5qc2ApLFxuICAgICk7XG4gICAgcmV0dXJuIGBcIiR7cHJvY2Vzcy5leGVjUGF0aH1cIiBcIiR7cHJvZ3JhbX1cImA7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFNoZWxsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgY29tbWFuZCB0byBydW4uIEEgc3RyaW5nIGlzIGV4ZWN1dGVkIGFzIGEgc2hlbGwgY29tbWFuZCBsaW5lOyBhXG4gICAqIHN0cmluZyBhcnJheSBpcyBhbiBleHBsaWNpdCBhcmd2IChwcm9ncmFtICsgYXJndW1lbnRzKSBleGVjdXRlZCB3aXRob3V0IGFcbiAgICogc2hlbGwuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEBkZWZhdWx0IC0gcHJvamVjdCBkaXJcbiAgICovXG4gIHJlYWRvbmx5IGN3ZD86IHN0cmluZztcbiAgLyoqXG4gICAqIENhcHR1cmUgc3Rkb3V0L3N0ZGVyciAoc28gdGhlIGNhbGxlciBjYW4gcmVhZCB0aGVtIGZyb20gdGhlIHJlc3VsdClcbiAgICogaW5zdGVhZCBvZiBpbmhlcml0aW5nIHRoZSBwYXJlbnQncyBzdHJlYW1zLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FwdHVyZU91dHB1dD86IGJvb2xlYW47XG4gIC8qKiBAZGVmYXVsdCBmYWxzZSAqL1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGV4dHJhRW52PzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH07XG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgc2hlbGwgdG8gaW50ZXJwcmV0IHRoZSBjb21tYW5kIChlLmcuIFwicHJvamVuXCIsIFwiYmFzaCAtY1wiKS5cbiAgICogQGRlZmF1bHQgXCJwcm9qZW5cIlxuICAgKi9cbiAgcmVhZG9ubHkgc2hlbGw/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cbiJdfQ==
|
package/lib/component.d.ts
CHANGED
|
@@ -26,3 +26,73 @@ export declare class Component extends Construct {
|
|
|
26
26
|
*/
|
|
27
27
|
postSynthesize(): void;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* A {@link Component} that is created *detached* from any project and attached
|
|
31
|
+
* to one later via {@link FutureComponent.attach}.
|
|
32
|
+
*
|
|
33
|
+
* Like a regular component, but constructed without a project. It improves on a
|
|
34
|
+
* naive deferred component in three ways:
|
|
35
|
+
*
|
|
36
|
+
* - Use-before-attach is an error, not a silent footgun. The constructor hands
|
|
37
|
+
* the caller a guard proxy; touching `project`, `node`, `synthesize()` or any
|
|
38
|
+
* subclass feature before `attach()` throws.
|
|
39
|
+
* - No global shadow-tree leak. Each instance gets its own throwaway shadow
|
|
40
|
+
* root, so detached components never share an id counter and the root becomes
|
|
41
|
+
* garbage once the component is reparented on attach.
|
|
42
|
+
* - `attach()` returns the unwrapped component, so callers can opt out of the
|
|
43
|
+
* proxy entirely.
|
|
44
|
+
*
|
|
45
|
+
* The constructor takes no arguments (`super()`). A subclass that needs options
|
|
46
|
+
* captures them itself, reading the local parameter inside its constructor - NOT
|
|
47
|
+
* `this.options`, which the guard blocks until attach.
|
|
48
|
+
*
|
|
49
|
+
* ```ts
|
|
50
|
+
* class Worker extends FutureComponent {
|
|
51
|
+
* private readonly options: WorkerOptions;
|
|
52
|
+
* constructor(options: WorkerOptions = {}) {
|
|
53
|
+
* super();
|
|
54
|
+
* this.options = options; // set: allowed
|
|
55
|
+
* }
|
|
56
|
+
* protected init() {
|
|
57
|
+
* // this.project is available here
|
|
58
|
+
* }
|
|
59
|
+
* }
|
|
60
|
+
*
|
|
61
|
+
* const w = new Worker({ retries: 3 });
|
|
62
|
+
* // w.project; // throws: not attached yet
|
|
63
|
+
* const real = w.attach(project); // reparents, runs init(), returns the bare instance
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare abstract class FutureComponent extends Component {
|
|
67
|
+
private readonly newTargetName;
|
|
68
|
+
private attachedState;
|
|
69
|
+
constructor();
|
|
70
|
+
/**
|
|
71
|
+
* Whether `attach()` has been called. A convenience for tests/introspection;
|
|
72
|
+
* prefer `tryAttach()` over reading this and branching.
|
|
73
|
+
*/
|
|
74
|
+
get attached(): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Project-dependent setup. Runs once, from `attach()`, when `this.project` is
|
|
77
|
+
* finally available.
|
|
78
|
+
*/
|
|
79
|
+
protected init(): void;
|
|
80
|
+
/**
|
|
81
|
+
* Attach the component to a scope. Only now does it become usable.
|
|
82
|
+
*
|
|
83
|
+
* Returns the real, unwrapped component (not the proxy). A component may be
|
|
84
|
+
* attached exactly once; attaching an already-attached component throws (copy
|
|
85
|
+
* it first to attach a variant elsewhere). Use `tryAttach()` if you don't care
|
|
86
|
+
* whether it has already been attached.
|
|
87
|
+
*/
|
|
88
|
+
attach(scope: IConstruct, id?: string): this;
|
|
89
|
+
/**
|
|
90
|
+
* Attach the component if it isn't already, without caring *where*.
|
|
91
|
+
*
|
|
92
|
+
* Unlike `attach()`, never throws on an already-attached component: if attached
|
|
93
|
+
* anywhere at all, the existing instance is returned and `scope` is ignored.
|
|
94
|
+
* Use `attach()` when attaching to a specific scope is part of your contract
|
|
95
|
+
* and a pre-existing attachment elsewhere would be a bug.
|
|
96
|
+
*/
|
|
97
|
+
tryAttach(scope: IConstruct, id?: string): this;
|
|
98
|
+
}
|
package/lib/component.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Component = void 0;
|
|
3
|
+
exports.FutureComponent = exports.Component = void 0;
|
|
4
4
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
5
5
|
const constructs_1 = require("constructs");
|
|
6
6
|
const constructs_2 = require("./util/constructs");
|
|
@@ -16,7 +16,7 @@ const componentId = (scope) => {
|
|
|
16
16
|
* @param id Unique id of the component. If not provided, an unstable AutoId is generated.
|
|
17
17
|
*/
|
|
18
18
|
class Component extends constructs_1.Construct {
|
|
19
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Component", version: "0.101.
|
|
19
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Component", version: "0.101.4" };
|
|
20
20
|
/**
|
|
21
21
|
* Test whether the given construct is a component.
|
|
22
22
|
*/
|
|
@@ -45,4 +45,184 @@ class Component extends constructs_1.Construct {
|
|
|
45
45
|
postSynthesize() { }
|
|
46
46
|
}
|
|
47
47
|
exports.Component = Component;
|
|
48
|
-
|
|
48
|
+
/**
|
|
49
|
+
* Internal flag key read by the detached-guard proxy. A symbol so it never
|
|
50
|
+
* collides with a real (string-keyed) member and is always readable through the
|
|
51
|
+
* guard (symbol access is never blocked).
|
|
52
|
+
*/
|
|
53
|
+
const FUTURE_ATTACHED = Symbol.for("projen.future.attached");
|
|
54
|
+
/**
|
|
55
|
+
* The members a detached future component is allowed to expose. Reading anything
|
|
56
|
+
* else before attach throws. (`copy` is the copyable capability method a
|
|
57
|
+
* copyable subclass adds, per the `recreate()` convention.)
|
|
58
|
+
*/
|
|
59
|
+
const DETACHED_ALLOWLIST = new Set([
|
|
60
|
+
"attach",
|
|
61
|
+
"tryAttach",
|
|
62
|
+
"attached",
|
|
63
|
+
"copy",
|
|
64
|
+
"constructor",
|
|
65
|
+
"toString",
|
|
66
|
+
]);
|
|
67
|
+
/**
|
|
68
|
+
* Wrap a freshly constructed {@link FutureComponent} in a guard proxy.
|
|
69
|
+
*
|
|
70
|
+
* Two jobs:
|
|
71
|
+
*
|
|
72
|
+
* 1. Block use before attach. While detached, any property read outside
|
|
73
|
+
* {@link DETACHED_ALLOWLIST} (and outside symbol keys, which always pass so
|
|
74
|
+
* `instanceof`, jsii and inspection keep working) throws instead of silently
|
|
75
|
+
* returning shadow-tree state.
|
|
76
|
+
* 2. "Drop" itself on attach. Once attached, the guard is a transparent
|
|
77
|
+
* pass-through: a single boolean check, then `Reflect`. Every method it
|
|
78
|
+
* returns is bound to the *real* target, so the moment you call one method
|
|
79
|
+
* the work continues on the bare object with no further proxy traps.
|
|
80
|
+
*
|
|
81
|
+
* Only `get` is guarded. `set` is intentionally left open so a subclass
|
|
82
|
+
* constructor can assign its own fields (e.g. `this.options = options`).
|
|
83
|
+
*/
|
|
84
|
+
function guardDetached(target) {
|
|
85
|
+
const boundCache = new Map();
|
|
86
|
+
const handler = {
|
|
87
|
+
get(t, prop) {
|
|
88
|
+
// never present as a thenable, or `await futureComponent` would hang/throw
|
|
89
|
+
if (prop === "then") {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
const attached = t[FUTURE_ATTACHED] === true;
|
|
93
|
+
const allowed = attached || typeof prop !== "string" || DETACHED_ALLOWLIST.has(prop);
|
|
94
|
+
if (!allowed) {
|
|
95
|
+
const name = t.newTargetName ?? t.constructor.name;
|
|
96
|
+
throw new Error(`Cannot access '${String(prop)}' on ${name}: a future component is ` +
|
|
97
|
+
`not usable until it is attached. Call attach(scope) first, or pass ` +
|
|
98
|
+
`it to a Project which attaches it for you.`);
|
|
99
|
+
}
|
|
100
|
+
// bind functions to the *real* target so that, once invoked, all internal
|
|
101
|
+
// `this` access happens on the bare object with no proxy involvement.
|
|
102
|
+
const value = Reflect.get(t, prop, t);
|
|
103
|
+
if (typeof value === "function") {
|
|
104
|
+
let bound = boundCache.get(prop);
|
|
105
|
+
if (!bound) {
|
|
106
|
+
bound = value.bind(t);
|
|
107
|
+
boundCache.set(prop, bound);
|
|
108
|
+
}
|
|
109
|
+
return bound;
|
|
110
|
+
}
|
|
111
|
+
return value;
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
return new Proxy(target, handler);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* A {@link Component} that is created *detached* from any project and attached
|
|
118
|
+
* to one later via {@link FutureComponent.attach}.
|
|
119
|
+
*
|
|
120
|
+
* Like a regular component, but constructed without a project. It improves on a
|
|
121
|
+
* naive deferred component in three ways:
|
|
122
|
+
*
|
|
123
|
+
* - Use-before-attach is an error, not a silent footgun. The constructor hands
|
|
124
|
+
* the caller a guard proxy; touching `project`, `node`, `synthesize()` or any
|
|
125
|
+
* subclass feature before `attach()` throws.
|
|
126
|
+
* - No global shadow-tree leak. Each instance gets its own throwaway shadow
|
|
127
|
+
* root, so detached components never share an id counter and the root becomes
|
|
128
|
+
* garbage once the component is reparented on attach.
|
|
129
|
+
* - `attach()` returns the unwrapped component, so callers can opt out of the
|
|
130
|
+
* proxy entirely.
|
|
131
|
+
*
|
|
132
|
+
* The constructor takes no arguments (`super()`). A subclass that needs options
|
|
133
|
+
* captures them itself, reading the local parameter inside its constructor - NOT
|
|
134
|
+
* `this.options`, which the guard blocks until attach.
|
|
135
|
+
*
|
|
136
|
+
* ```ts
|
|
137
|
+
* class Worker extends FutureComponent {
|
|
138
|
+
* private readonly options: WorkerOptions;
|
|
139
|
+
* constructor(options: WorkerOptions = {}) {
|
|
140
|
+
* super();
|
|
141
|
+
* this.options = options; // set: allowed
|
|
142
|
+
* }
|
|
143
|
+
* protected init() {
|
|
144
|
+
* // this.project is available here
|
|
145
|
+
* }
|
|
146
|
+
* }
|
|
147
|
+
*
|
|
148
|
+
* const w = new Worker({ retries: 3 });
|
|
149
|
+
* // w.project; // throws: not attached yet
|
|
150
|
+
* const real = w.attach(project); // reparents, runs init(), returns the bare instance
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
class FutureComponent extends Component {
|
|
154
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.FutureComponent", version: "0.101.4" };
|
|
155
|
+
newTargetName;
|
|
156
|
+
attachedState = false;
|
|
157
|
+
constructor() {
|
|
158
|
+
// Each future component gets its OWN shadow root. Unlike a single global
|
|
159
|
+
// shadow tree, detached components never collide on an id counter, and the
|
|
160
|
+
// root is collected once we reparent on attach().
|
|
161
|
+
const shadow = new constructs_1.RootConstruct();
|
|
162
|
+
(0, constructs_2.tagAsProject)(shadow);
|
|
163
|
+
super(shadow);
|
|
164
|
+
this.newTargetName = new.target.name;
|
|
165
|
+
// Hand the caller a guarded proxy. `this` here is still the bare object;
|
|
166
|
+
// returning it makes the proxy the instance seen by `new`. Because the base
|
|
167
|
+
// constructor returns an object, subclass constructors transparently adopt
|
|
168
|
+
// the proxy as their `this` too.
|
|
169
|
+
return guardDetached(this);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Whether `attach()` has been called. A convenience for tests/introspection;
|
|
173
|
+
* prefer `tryAttach()` over reading this and branching.
|
|
174
|
+
*/
|
|
175
|
+
get attached() {
|
|
176
|
+
return this.attachedState;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Project-dependent setup. Runs once, from `attach()`, when `this.project` is
|
|
180
|
+
* finally available.
|
|
181
|
+
*/
|
|
182
|
+
init() { }
|
|
183
|
+
/**
|
|
184
|
+
* Attach the component to a scope. Only now does it become usable.
|
|
185
|
+
*
|
|
186
|
+
* Returns the real, unwrapped component (not the proxy). A component may be
|
|
187
|
+
* attached exactly once; attaching an already-attached component throws (copy
|
|
188
|
+
* it first to attach a variant elsewhere). Use `tryAttach()` if you don't care
|
|
189
|
+
* whether it has already been attached.
|
|
190
|
+
*/
|
|
191
|
+
attach(scope, id) {
|
|
192
|
+
if (this.attachedState) {
|
|
193
|
+
throw new Error(`${this.newTargetName} is already attached to '${this.project.node.path}'. ` +
|
|
194
|
+
`Use \`tryAttach\` or \`copy\` it to attach a variant.`);
|
|
195
|
+
}
|
|
196
|
+
// constructs has no public reparent, so build a fresh node on the real
|
|
197
|
+
// scope. The per-instance shadow root and its original node become an
|
|
198
|
+
// unreachable island and are collected.
|
|
199
|
+
this.node = new constructs_1.Node(this, scope, id ?? componentId(scope));
|
|
200
|
+
// The component already carries the component tag (set by the base
|
|
201
|
+
// constructor, which is idempotent against the same object); re-add the
|
|
202
|
+
// metadata to the new node and resolve the real project.
|
|
203
|
+
this.node.addMetadata("type", "component");
|
|
204
|
+
this.node.addMetadata("construct", this.newTargetName);
|
|
205
|
+
this.project = (0, constructs_2.findClosestProject)(scope, this.newTargetName);
|
|
206
|
+
this.attachedState = true;
|
|
207
|
+
// Flip the guard into transparent pass-through for any proxy handles the
|
|
208
|
+
// caller still holds. Symbol key, so the guard can always read it.
|
|
209
|
+
this[FUTURE_ATTACHED] = true;
|
|
210
|
+
// project is now available, run project-dependent setup
|
|
211
|
+
this.init();
|
|
212
|
+
// hand back the bare object so the caller can drop the proxy entirely
|
|
213
|
+
return this;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Attach the component if it isn't already, without caring *where*.
|
|
217
|
+
*
|
|
218
|
+
* Unlike `attach()`, never throws on an already-attached component: if attached
|
|
219
|
+
* anywhere at all, the existing instance is returned and `scope` is ignored.
|
|
220
|
+
* Use `attach()` when attaching to a specific scope is part of your contract
|
|
221
|
+
* and a pre-existing attachment elsewhere would be a bug.
|
|
222
|
+
*/
|
|
223
|
+
tryAttach(scope, id) {
|
|
224
|
+
return this.attachedState ? this : this.attach(scope, id);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
exports.FutureComponent = FutureComponent;
|
|
228
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsMkNBQTREO0FBRTVELGtEQUsyQjtBQUUzQixNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBc0IsQ0FBQztBQUNsRCxNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtJQUN4QyxNQUFNLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNCLE9BQU8sU0FBUyxNQUFNLEVBQUUsQ0FBQztBQUMzQixDQUFDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBYSxTQUFVLFNBQVEsc0JBQVM7O0lBQ3RDOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFNO1FBQzlCLE9BQU8sSUFBQSx3QkFBVyxFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFZSxPQUFPLENBQVU7SUFFakMsWUFBWSxLQUFpQixFQUFFLEVBQVc7UUFDeEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELElBQUEsMkJBQWMsRUFBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFBLCtC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RCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFWixzRUFBc0U7UUFDdEUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFNBQVMsQ0FBQyxLQUFpQixFQUFFLEVBQVc7UUFDN0MsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7O0FBM0ZILDBDQTRGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIE5vZGUsIFJvb3RDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSBcIi4vcHJvamVjdFwiO1xuaW1wb3J0IHtcbiAgaXNDb21wb25lbnQsXG4gIGZpbmRDbG9zZXN0UHJvamVjdCxcbiAgdGFnQXNDb21wb25lbnQsXG4gIHRhZ0FzUHJvamVjdCxcbn0gZnJvbSBcIi4vdXRpbC9jb25zdHJ1Y3RzXCI7XG5cbmNvbnN0IGF1dG9JZHMgPSBuZXcgV2Vha01hcDxJQ29uc3RydWN0LCBudW1iZXI+KCk7XG5jb25zdCBjb21wb25lbnRJZCA9IChzY29wZTogSUNvbnN0cnVjdCkgPT4ge1xuICBjb25zdCBuZXh0SWQgPSAoYXV0b0lkcy5nZXQoc2NvcGUpID8/IDApICsgMTtcbiAgYXV0b0lkcy5zZXQoc2NvcGUsIG5leHRJZCk7XG4gIHJldHVybiBgQXV0b0lkJHtuZXh0SWR9YDtcbn07XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHByb2plY3QgY29tcG9uZW50LlxuICogQHBhcmFtIHByb2plY3RcbiAqIEBwYXJhbSBpZCBVbmlxdWUgaWQgb2YgdGhlIGNvbXBvbmVudC4gSWYgbm90IHByb3ZpZGVkLCBhbiB1bnN0YWJsZSBBdXRvSWQgaXMgZ2VuZXJhdGVkLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gY29uc3RydWN0IGlzIGEgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpc0NvbXBvbmVudCh4OiBhbnkpOiB4IGlzIENvbXBvbmVudCB7XG4gICAgcmV0dXJuIGlzQ29tcG9uZW50KHgpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHByb2plY3Q6IFByb2plY3Q7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IElDb25zdHJ1Y3QsIGlkPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkIHx8IGAke25ldy50YXJnZXQubmFtZX0jJHtjb21wb25lbnRJZChzY29wZSl9YCk7XG4gICAgdGFnQXNDb21wb25lbnQodGhpcyk7XG4gICAgdGhpcy5ub2RlLmFkZE1ldGFkYXRhKFwidHlwZVwiLCBcImNvbXBvbmVudFwiKTtcbiAgICB0aGlzLm5vZGUuYWRkTWV0YWRhdGEoXCJjb25zdHJ1Y3RcIiwgbmV3LnRhcmdldC5uYW1lKTtcblxuICAgIHRoaXMucHJvamVjdCA9IGZpbmRDbG9zZXN0UHJvamVjdChzY29wZSwgbmV3LnRhcmdldC5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYmVmb3JlIHN5bnRoZXNpcy5cbiAgICovXG4gIHB1YmxpYyBwcmVTeW50aGVzaXplKCkge31cblxuICAvKipcbiAgICogU3ludGhlc2l6ZXMgZmlsZXMgdG8gdGhlIHByb2plY3Qgb3V0cHV0IGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBzeW50aGVzaXplKCkge31cblxuICAvKipcbiAgICogQ2FsbGVkIGFmdGVyIHN5bnRoZXNpcy4gT3JkZXIgaXMgKm5vdCogZ3VhcmFudGVlZC5cbiAgICovXG4gIHB1YmxpYyBwb3N0U3ludGhlc2l6ZSgpIHt9XG59XG5cbi8qKlxuICogSW50ZXJuYWwgZmxhZyBrZXkgcmVhZCBieSB0aGUgZGV0YWNoZWQtZ3VhcmQgcHJveHkuIEEgc3ltYm9sIHNvIGl0IG5ldmVyXG4gKiBjb2xsaWRlcyB3aXRoIGEgcmVhbCAoc3RyaW5nLWtleWVkKSBtZW1iZXIgYW5kIGlzIGFsd2F5cyByZWFkYWJsZSB0aHJvdWdoIHRoZVxuICogZ3VhcmQgKHN5bWJvbCBhY2Nlc3MgaXMgbmV2ZXIgYmxvY2tlZCkuXG4gKi9cbmNvbnN0IEZVVFVSRV9BVFRBQ0hFRCA9IFN5bWJvbC5mb3IoXCJwcm9qZW4uZnV0dXJlLmF0dGFjaGVkXCIpO1xuXG4vKipcbiAqIFRoZSBtZW1iZXJzIGEgZGV0YWNoZWQgZnV0dXJlIGNvbXBvbmVudCBpcyBhbGxvd2VkIHRvIGV4cG9zZS4gUmVhZGluZyBhbnl0aGluZ1xuICogZWxzZSBiZWZvcmUgYXR0YWNoIHRocm93cy4gKGBjb3B5YCBpcyB0aGUgY29weWFibGUgY2FwYWJpbGl0eSBtZXRob2QgYVxuICogY29weWFibGUgc3ViY2xhc3MgYWRkcywgcGVyIHRoZSBgcmVjcmVhdGUoKWAgY29udmVudGlvbi4pXG4gKi9cbmNvbnN0IERFVEFDSEVEX0FMTE9XTElTVCA9IG5ldyBTZXQ8UHJvcGVydHlLZXk+KFtcbiAgXCJhdHRhY2hcIixcbiAgXCJ0cnlBdHRhY2hcIixcbiAgXCJhdHRhY2hlZFwiLFxuICBcImNvcHlcIixcbiAgXCJjb25zdHJ1Y3RvclwiLFxuICBcInRvU3RyaW5nXCIsXG5dKTtcblxuLyoqXG4gKiBXcmFwIGEgZnJlc2hseSBjb25zdHJ1Y3RlZCB7QGxpbmsgRnV0dXJlQ29tcG9uZW50fSBpbiBhIGd1YXJkIHByb3h5LlxuICpcbiAqIFR3byBqb2JzOlxuICpcbiAqIDEuIEJsb2NrIHVzZSBiZWZvcmUgYXR0YWNoLiBXaGlsZSBkZXRhY2hlZCwgYW55IHByb3BlcnR5IHJlYWQgb3V0c2lkZVxuICogICAge0BsaW5rIERFVEFDSEVEX0FMTE9XTElTVH0gKGFuZCBvdXRzaWRlIHN5bWJvbCBrZXlzLCB3aGljaCBhbHdheXMgcGFzcyBzb1xuICogICAgYGluc3RhbmNlb2ZgLCBqc2lpIGFuZCBpbnNwZWN0aW9uIGtlZXAgd29ya2luZykgdGhyb3dzIGluc3RlYWQgb2Ygc2lsZW50bHlcbiAqICAgIHJldHVybmluZyBzaGFkb3ctdHJlZSBzdGF0ZS5cbiAqIDIuIFwiRHJvcFwiIGl0c2VsZiBvbiBhdHRhY2guIE9uY2UgYXR0YWNoZWQsIHRoZSBndWFyZCBpcyBhIHRyYW5zcGFyZW50XG4gKiAgICBwYXNzLXRocm91Z2g6IGEgc2luZ2xlIGJvb2xlYW4gY2hlY2ssIHRoZW4gYFJlZmxlY3RgLiBFdmVyeSBtZXRob2QgaXRcbiAqICAgIHJldHVybnMgaXMgYm91bmQgdG8gdGhlICpyZWFsKiB0YXJnZXQsIHNvIHRoZSBtb21lbnQgeW91IGNhbGwgb25lIG1ldGhvZFxuICogICAgdGhlIHdvcmsgY29udGludWVzIG9uIHRoZSBiYXJlIG9iamVjdCB3aXRoIG5vIGZ1cnRoZXIgcHJveHkgdHJhcHMuXG4gKlxuICogT25seSBgZ2V0YCBpcyBndWFyZGVkLiBgc2V0YCBpcyBpbnRlbnRpb25hbGx5IGxlZnQgb3BlbiBzbyBhIHN1YmNsYXNzXG4gKiBjb25zdHJ1Y3RvciBjYW4gYXNzaWduIGl0cyBvd24gZmllbGRzIChlLmcuIGB0aGlzLm9wdGlvbnMgPSBvcHRpb25zYCkuXG4gKi9cbmZ1bmN0aW9uIGd1YXJkRGV0YWNoZWQ8VCBleHRlbmRzIG9iamVjdD4odGFyZ2V0OiBUKTogVCB7XG4gIGNvbnN0IGJvdW5kQ2FjaGUgPSBuZXcgTWFwPFByb3BlcnR5S2V5LCAoLi4uYXJnczogYW55W10pID0+IGFueT4oKTtcbiAgY29uc3QgaGFuZGxlcjogUHJveHlIYW5kbGVyPFQ+ID0ge1xuICAgIGdldCh0LCBwcm9wKSB7XG4gICAgICAvLyBuZXZlciBwcmVzZW50IGFzIGEgdGhlbmFibGUsIG9yIGBhd2FpdCBmdXR1cmVDb21wb25lbnRgIHdvdWxkIGhhbmcvdGhyb3dcbiAgICAgIGlmIChwcm9wID09PSBcInRoZW5cIikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdHRhY2hlZCA9ICh0IGFzIGFueSlbRlVUVVJFX0FUVEFDSEVEXSA9PT0gdHJ1ZTtcbiAgICAgIGNvbnN0IGFsbG93ZWQgPVxuICAgICAgICBhdHRhY2hlZCB8fCB0eXBlb2YgcHJvcCAhPT0gXCJzdHJpbmdcIiB8fCBERVRBQ0hFRF9BTExPV0xJU1QuaGFzKHByb3ApO1xuXG4gICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9ICh0IGFzIGFueSkubmV3VGFyZ2V0TmFtZSA/PyB0LmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGFjY2VzcyAnJHtTdHJpbmcocHJvcCl9JyBvbiAke25hbWV9OiBhIGZ1dHVyZSBjb21wb25lbnQgaXMgYCArXG4gICAgICAgICAgICBgbm90IHVzYWJsZSB1bnRpbCBpdCBpcyBhdHRhY2hlZC4gQ2FsbCBhdHRhY2goc2NvcGUpIGZpcnN0LCBvciBwYXNzIGAgK1xuICAgICAgICAgICAgYGl0IHRvIGEgUHJvamVjdCB3aGljaCBhdHRhY2hlcyBpdCBmb3IgeW91LmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIGJpbmQgZnVuY3Rpb25zIHRvIHRoZSAqcmVhbCogdGFyZ2V0IHNvIHRoYXQsIG9uY2UgaW52b2tlZCwgYWxsIGludGVybmFsXG4gICAgICAvLyBgdGhpc2AgYWNjZXNzIGhhcHBlbnMgb24gdGhlIGJhcmUgb2JqZWN0IHdpdGggbm8gcHJveHkgaW52b2x2ZW1lbnQuXG4gICAgICBjb25zdCB2YWx1ZSA9IFJlZmxlY3QuZ2V0KHQsIHByb3AsIHQpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGxldCBib3VuZCA9IGJvdW5kQ2FjaGUuZ2V0KHByb3ApO1xuICAgICAgICBpZiAoIWJvdW5kKSB7XG4gICAgICAgICAgYm91bmQgPSAodmFsdWUgYXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpLmJpbmQodCk7XG4gICAgICAgICAgYm91bmRDYWNoZS5zZXQocHJvcCwgYm91bmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBib3VuZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICB9O1xuICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7XG59XG5cbi8qKlxuICogTWFrZSBhIHNwZWNpZmljIHByb3BlcnR5IHdyaXRhYmxlIGFnYWluLlxuICovXG50eXBlIFdyaXRlYWJsZVByb3A8VCwgSyBleHRlbmRzIGtleW9mIFQ+ID0gT21pdDxULCBLPiAmIHtcbiAgLXJlYWRvbmx5IFtQIGluIEtdOiBUW1BdO1xufTtcblxuLyoqXG4gKiBBIHtAbGluayBDb21wb25lbnR9IHRoYXQgaXMgY3JlYXRlZCAqZGV0YWNoZWQqIGZyb20gYW55IHByb2plY3QgYW5kIGF0dGFjaGVkXG4gKiB0byBvbmUgbGF0ZXIgdmlhIHtAbGluayBGdXR1cmVDb21wb25lbnQuYXR0YWNofS5cbiAqXG4gKiBMaWtlIGEgcmVndWxhciBjb21wb25lbnQsIGJ1dCBjb25zdHJ1Y3RlZCB3aXRob3V0IGEgcHJvamVjdC4gSXQgaW1wcm92ZXMgb24gYVxuICogbmFpdmUgZGVmZXJyZWQgY29tcG9uZW50IGluIHRocmVlIHdheXM6XG4gKlxuICogLSBVc2UtYmVmb3JlLWF0dGFjaCBpcyBhbiBlcnJvciwgbm90IGEgc2lsZW50IGZvb3RndW4uIFRoZSBjb25zdHJ1Y3RvciBoYW5kc1xuICogICB0aGUgY2FsbGVyIGEgZ3VhcmQgcHJveHk7IHRvdWNoaW5nIGBwcm9qZWN0YCwgYG5vZGVgLCBgc3ludGhlc2l6ZSgpYCBvciBhbnlcbiAqICAgc3ViY2xhc3MgZmVhdHVyZSBiZWZvcmUgYGF0dGFjaCgpYCB0aHJvd3MuXG4gKiAtIE5vIGdsb2JhbCBzaGFkb3ctdHJlZSBsZWFrLiBFYWNoIGluc3RhbmNlIGdldHMgaXRzIG93biB0aHJvd2F3YXkgc2hhZG93XG4gKiAgIHJvb3QsIHNvIGRldGFjaGVkIGNvbXBvbmVudHMgbmV2ZXIgc2hhcmUgYW4gaWQgY291bnRlciBhbmQgdGhlIHJvb3QgYmVjb21lc1xuICogICBnYXJiYWdlIG9uY2UgdGhlIGNvbXBvbmVudCBpcyByZXBhcmVudGVkIG9uIGF0dGFjaC5cbiAqIC0gYGF0dGFjaCgpYCByZXR1cm5zIHRoZSB1bndyYXBwZWQgY29tcG9uZW50LCBzbyBjYWxsZXJzIGNhbiBvcHQgb3V0IG9mIHRoZVxuICogICBwcm94eSBlbnRpcmVseS5cbiAqXG4gKiBUaGUgY29uc3RydWN0b3IgdGFrZXMgbm8gYXJndW1lbnRzIChgc3VwZXIoKWApLiBBIHN1YmNsYXNzIHRoYXQgbmVlZHMgb3B0aW9uc1xuICogY2FwdHVyZXMgdGhlbSBpdHNlbGYsIHJlYWRpbmcgdGhlIGxvY2FsIHBhcmFtZXRlciBpbnNpZGUgaXRzIGNvbnN0cnVjdG9yIC0gTk9UXG4gKiBgdGhpcy5vcHRpb25zYCwgd2hpY2ggdGhlIGd1YXJkIGJsb2NrcyB1bnRpbCBhdHRhY2guXG4gKlxuICogYGBgdHNcbiAqIGNsYXNzIFdvcmtlciBleHRlbmRzIEZ1dHVyZUNvbXBvbmVudCB7XG4gKiAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogV29ya2VyT3B0aW9ucztcbiAqICAgY29uc3RydWN0b3Iob3B0aW9uczogV29ya2VyT3B0aW9ucyA9IHt9KSB7XG4gKiAgICAgc3VwZXIoKTtcbiAqICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOyAvLyBzZXQ6IGFsbG93ZWRcbiAqICAgfVxuICogICBwcm90ZWN0ZWQgaW5pdCgpIHtcbiAqICAgICAvLyB0aGlzLnByb2plY3QgaXMgYXZhaWxhYmxlIGhlcmVcbiAqICAgfVxuICogfVxuICpcbiAqIGNvbnN0IHcgPSBuZXcgV29ya2VyKHsgcmV0cmllczogMyB9KTtcbiAqIC8vIHcucHJvamVjdDsgICAgICAgICAgICAgICAgICAvLyB0aHJvd3M6IG5vdCBhdHRhY2hlZCB5ZXRcbiAqIGNvbnN0IHJlYWwgPSB3LmF0dGFjaChwcm9qZWN0KTsgLy8gcmVwYXJlbnRzLCBydW5zIGluaXQoKSwgcmV0dXJucyB0aGUgYmFyZSBpbnN0YW5jZVxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGdXR1cmVDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IG5ld1RhcmdldE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBhdHRhY2hlZFN0YXRlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRWFjaCBmdXR1cmUgY29tcG9uZW50IGdldHMgaXRzIE9XTiBzaGFkb3cgcm9vdC4gVW5saWtlIGEgc2luZ2xlIGdsb2JhbFxuICAgIC8vIHNoYWRvdyB0cmVlLCBkZXRhY2hlZCBjb21wb25lbnRzIG5ldmVyIGNvbGxpZGUgb24gYW4gaWQgY291bnRlciwgYW5kIHRoZVxuICAgIC8vIHJvb3QgaXMgY29sbGVjdGVkIG9uY2Ugd2UgcmVwYXJlbnQgb24gYXR0YWNoKCkuXG4gICAgY29uc3Qgc2hhZG93ID0gbmV3IFJvb3RDb25zdHJ1Y3QoKTtcbiAgICB0YWdBc1Byb2plY3Qoc2hhZG93KTtcbiAgICBzdXBlcihzaGFkb3cpO1xuXG4gICAgdGhpcy5uZXdUYXJnZXROYW1lID0gbmV3LnRhcmdldC5uYW1lO1xuXG4gICAgLy8gSGFuZCB0aGUgY2FsbGVyIGEgZ3VhcmRlZCBwcm94eS4gYHRoaXNgIGhlcmUgaXMgc3RpbGwgdGhlIGJhcmUgb2JqZWN0O1xuICAgIC8vIHJldHVybmluZyBpdCBtYWtlcyB0aGUgcHJveHkgdGhlIGluc3RhbmNlIHNlZW4gYnkgYG5ld2AuIEJlY2F1c2UgdGhlIGJhc2VcbiAgICAvLyBjb25zdHJ1Y3RvciByZXR1cm5zIGFuIG9iamVjdCwgc3ViY2xhc3MgY29uc3RydWN0b3JzIHRyYW5zcGFyZW50bHkgYWRvcHRcbiAgICAvLyB0aGUgcHJveHkgYXMgdGhlaXIgYHRoaXNgIHRvby5cbiAgICByZXR1cm4gZ3VhcmREZXRhY2hlZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGBhdHRhY2goKWAgaGFzIGJlZW4gY2FsbGVkLiBBIGNvbnZlbmllbmNlIGZvciB0ZXN0cy9pbnRyb3NwZWN0aW9uO1xuICAgKiBwcmVmZXIgYHRyeUF0dGFjaCgpYCBvdmVyIHJlYWRpbmcgdGhpcyBhbmQgYnJhbmNoaW5nLlxuICAgKi9cbiAgcHVibGljIGdldCBhdHRhY2hlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hdHRhY2hlZFN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2plY3QtZGVwZW5kZW50IHNldHVwLiBSdW5zIG9uY2UsIGZyb20gYGF0dGFjaCgpYCwgd2hlbiBgdGhpcy5wcm9qZWN0YCBpc1xuICAgKiBmaW5hbGx5IGF2YWlsYWJsZS5cbiAgICovXG4gIHByb3RlY3RlZCBpbml0KCk6IHZvaWQge31cblxuICAvKipcbiAgICogQXR0YWNoIHRoZSBjb21wb25lbnQgdG8gYSBzY29wZS4gT25seSBub3cgZG9lcyBpdCBiZWNvbWUgdXNhYmxlLlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSByZWFsLCB1bndyYXBwZWQgY29tcG9uZW50IChub3QgdGhlIHByb3h5KS4gQSBjb21wb25lbnQgbWF5IGJlXG4gICAqIGF0dGFjaGVkIGV4YWN0bHkgb25jZTsgYXR0YWNoaW5nIGFuIGFscmVhZHktYXR0YWNoZWQgY29tcG9uZW50IHRocm93cyAoY29weVxuICAgKiBpdCBmaXJzdCB0byBhdHRhY2ggYSB2YXJpYW50IGVsc2V3aGVyZSkuIFVzZSBgdHJ5QXR0YWNoKClgIGlmIHlvdSBkb24ndCBjYXJlXG4gICAqIHdoZXRoZXIgaXQgaGFzIGFscmVhZHkgYmVlbiBhdHRhY2hlZC5cbiAgICovXG4gIHB1YmxpYyBhdHRhY2goc2NvcGU6IElDb25zdHJ1Y3QsIGlkPzogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuYXR0YWNoZWRTdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHt0aGlzLm5ld1RhcmdldE5hbWV9IGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gJyR7dGhpcy5wcm9qZWN0Lm5vZGUucGF0aH0nLiBgICtcbiAgICAgICAgICBgVXNlIFxcYHRyeUF0dGFjaFxcYCBvciBcXGBjb3B5XFxgIGl0IHRvIGF0dGFjaCBhIHZhcmlhbnQuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIGNvbnN0cnVjdHMgaGFzIG5vIHB1YmxpYyByZXBhcmVudCwgc28gYnVpbGQgYSBmcmVzaCBub2RlIG9uIHRoZSByZWFsXG4gICAgLy8gc2NvcGUuIFRoZSBwZXItaW5zdGFuY2Ugc2hhZG93IHJvb3QgYW5kIGl0cyBvcmlnaW5hbCBub2RlIGJlY29tZSBhblxuICAgIC8vIHVucmVhY2hhYmxlIGlzbGFuZCBhbmQgYXJlIGNvbGxlY3RlZC5cbiAgICAodGhpcyBhcyBXcml0ZWFibGVQcm9wPHRoaXMsIFwibm9kZVwiPikubm9kZSA9IG5ldyBOb2RlKFxuICAgICAgdGhpcyxcbiAgICAgIHNjb3BlLFxuICAgICAgaWQgPz8gY29tcG9uZW50SWQoc2NvcGUpLFxuICAgICk7XG5cbiAgICAvLyBUaGUgY29tcG9uZW50IGFscmVhZHkgY2FycmllcyB0aGUgY29tcG9uZW50IHRhZyAoc2V0IGJ5IHRoZSBiYXNlXG4gICAgLy8gY29uc3RydWN0b3IsIHdoaWNoIGlzIGlkZW1wb3RlbnQgYWdhaW5zdCB0aGUgc2FtZSBvYmplY3QpOyByZS1hZGQgdGhlXG4gICAgLy8gbWV0YWRhdGEgdG8gdGhlIG5ldyBub2RlIGFuZCByZXNvbHZlIHRoZSByZWFsIHByb2plY3QuXG4gICAgdGhpcy5ub2RlLmFkZE1ldGFkYXRhKFwidHlwZVwiLCBcImNvbXBvbmVudFwiKTtcbiAgICB0aGlzLm5vZGUuYWRkTWV0YWRhdGEoXCJjb25zdHJ1Y3RcIiwgdGhpcy5uZXdUYXJnZXROYW1lKTtcbiAgICAodGhpcyBhcyBXcml0ZWFibGVQcm9wPHRoaXMsIFwicHJvamVjdFwiPikucHJvamVjdCA9IGZpbmRDbG9zZXN0UHJvamVjdChcbiAgICAgIHNjb3BlLFxuICAgICAgdGhpcy5uZXdUYXJnZXROYW1lLFxuICAgICk7XG5cbiAgICB0aGlzLmF0dGFjaGVkU3RhdGUgPSB0cnVlO1xuICAgIC8vIEZsaXAgdGhlIGd1YXJkIGludG8gdHJhbnNwYXJlbnQgcGFzcy10aHJvdWdoIGZvciBhbnkgcHJveHkgaGFuZGxlcyB0aGVcbiAgICAvLyBjYWxsZXIgc3RpbGwgaG9sZHMuIFN5bWJvbCBrZXksIHNvIHRoZSBndWFyZCBjYW4gYWx3YXlzIHJlYWQgaXQuXG4gICAgKHRoaXMgYXMgYW55KVtGVVRVUkVfQVRUQUNIRURdID0gdHJ1ZTtcblxuICAgIC8vIHByb2plY3QgaXMgbm93IGF2YWlsYWJsZSwgcnVuIHByb2plY3QtZGVwZW5kZW50IHNldHVwXG4gICAgdGhpcy5pbml0KCk7XG5cbiAgICAvLyBoYW5kIGJhY2sgdGhlIGJhcmUgb2JqZWN0IHNvIHRoZSBjYWxsZXIgY2FuIGRyb3AgdGhlIHByb3h5IGVudGlyZWx5XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIHRoZSBjb21wb25lbnQgaWYgaXQgaXNuJ3QgYWxyZWFkeSwgd2l0aG91dCBjYXJpbmcgKndoZXJlKi5cbiAgICpcbiAgICogVW5saWtlIGBhdHRhY2goKWAsIG5ldmVyIHRocm93cyBvbiBhbiBhbHJlYWR5LWF0dGFjaGVkIGNvbXBvbmVudDogaWYgYXR0YWNoZWRcbiAgICogYW55d2hlcmUgYXQgYWxsLCB0aGUgZXhpc3RpbmcgaW5zdGFuY2UgaXMgcmV0dXJuZWQgYW5kIGBzY29wZWAgaXMgaWdub3JlZC5cbiAgICogVXNlIGBhdHRhY2goKWAgd2hlbiBhdHRhY2hpbmcgdG8gYSBzcGVjaWZpYyBzY29wZSBpcyBwYXJ0IG9mIHlvdXIgY29udHJhY3RcbiAgICogYW5kIGEgcHJlLWV4aXN0aW5nIGF0dGFjaG1lbnQgZWxzZXdoZXJlIHdvdWxkIGJlIGEgYnVnLlxuICAgKi9cbiAgcHVibGljIHRyeUF0dGFjaChzY29wZTogSUNvbnN0cnVjdCwgaWQ/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRhY2hlZFN0YXRlID8gdGhpcyA6IHRoaXMuYXR0YWNoKHNjb3BlLCBpZCk7XG4gIH1cbn1cbiJdfQ==
|
package/lib/dependencies.js
CHANGED
|
@@ -51,7 +51,7 @@ const json_1 = require("./json");
|
|
|
51
51
|
* `nodeProject.addDeps()` or use the generic API of `project.deps`:
|
|
52
52
|
*/
|
|
53
53
|
class Dependencies extends component_1.Component {
|
|
54
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Dependencies", version: "0.101.
|
|
54
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Dependencies", version: "0.101.4" };
|
|
55
55
|
/**
|
|
56
56
|
* The project-relative path of the deps manifest file.
|
|
57
57
|
*/
|
package/lib/dev-env.js
CHANGED
|
@@ -6,7 +6,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
|
6
6
|
* Options for specifying the Docker image of the container.
|
|
7
7
|
*/
|
|
8
8
|
class DevEnvironmentDockerImage {
|
|
9
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DevEnvironmentDockerImage", version: "0.101.
|
|
9
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DevEnvironmentDockerImage", version: "0.101.4" };
|
|
10
10
|
/**
|
|
11
11
|
* A publicly available Docker image.
|
|
12
12
|
* @example 'ubuntu:latest'
|