projen 0.36.6 → 0.37.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +16740 -16583
- package/API.md +7147 -7069
- package/README.md +9 -9
- package/lib/awscdk/auto-discover.js +1 -1
- package/lib/{awscdk-app-ts.d.ts → awscdk/awscdk-app-ts.d.ts} +4 -3
- package/lib/awscdk/awscdk-app-ts.js +189 -0
- package/lib/{awscdk-construct.d.ts → awscdk/awscdk-construct.d.ts} +2 -2
- package/lib/awscdk/awscdk-construct.js +121 -0
- package/lib/awscdk/cdk-config.js +1 -1
- package/lib/awscdk/cdk-tasks.d.ts +1 -1
- package/lib/awscdk/cdk-tasks.js +2 -2
- package/lib/awscdk/index.d.ts +5 -3
- package/lib/awscdk/index.js +6 -4
- package/lib/awscdk/integration-test.d.ts +1 -1
- package/lib/awscdk/integration-test.js +2 -2
- package/lib/awscdk/java-app.js +1 -1
- package/lib/awscdk/lambda-function.d.ts +1 -1
- package/lib/awscdk/lambda-function.js +6 -7
- package/lib/{tasks/builtin-example.task.d.ts → builtin-example.task.d.ts} +0 -0
- package/lib/builtin-example.task.js +4 -0
- package/lib/{construct-lib.d.ts → cdk/construct-lib.d.ts} +0 -0
- package/lib/cdk/construct-lib.js +30 -0
- package/lib/cdk/index.d.ts +3 -0
- package/lib/{json → cdk}/index.js +4 -2
- package/lib/cdk/jsii-docgen.d.ts +12 -0
- package/lib/cdk/jsii-docgen.js +29 -0
- package/lib/{jsii-project.d.ts → cdk/jsii-project.d.ts} +4 -3
- package/lib/cdk/jsii-project.js +188 -0
- package/lib/{cdk8s-app-ts.d.ts → cdk8s/cdk8s-app-ts.d.ts} +1 -1
- package/lib/cdk8s/cdk8s-app-ts.js +134 -0
- package/lib/{cdk8s-construct.d.ts → cdk8s/cdk8s-construct.d.ts} +1 -1
- package/lib/{cdk8s-construct.js → cdk8s/cdk8s-construct.js} +4 -4
- package/lib/cdk8s/index.d.ts +2 -0
- package/lib/{deps → cdk8s}/index.js +3 -3
- package/lib/{cdktf-construct.d.ts → cdktf/cdktf-construct.d.ts} +1 -1
- package/lib/{cdktf-construct.js → cdktf/cdktf-construct.js} +4 -4
- package/lib/cdktf/index.d.ts +1 -0
- package/lib/{git → cdktf}/index.js +2 -2
- package/lib/cli/index.js +5 -5
- package/lib/cli/synth.d.ts +1 -1
- package/lib/cli/synth.js +1 -1
- package/lib/cli/tasks.d.ts +1 -1
- package/lib/cli/tasks.js +1 -1
- package/lib/component.js +1 -1
- package/lib/{deps/dependencies.d.ts → dependencies.d.ts} +101 -3
- package/lib/dependencies.js +206 -0
- package/lib/dev-env.d.ts +1 -1
- package/lib/dev-env.js +2 -2
- package/lib/docker-compose.js +2 -2
- package/lib/file.js +1 -1
- package/lib/{git/gitattributes.d.ts → gitattributes.d.ts} +2 -2
- package/lib/gitattributes.js +62 -0
- package/lib/github/auto-approve.js +1 -1
- package/lib/github/auto-merge.js +1 -1
- package/lib/github/dependabot.js +1 -1
- package/lib/github/github-project.d.ts +193 -0
- package/lib/github/github-project.js +70 -0
- package/lib/github/github.js +1 -1
- package/lib/github/index.d.ts +1 -0
- package/lib/github/index.js +2 -1
- package/lib/github/mergify.js +1 -1
- package/lib/github/pr-template.js +1 -1
- package/lib/github/pull-request-lint.js +1 -1
- package/lib/github/stale.js +1 -1
- package/lib/github/task-workflow.d.ts +1 -1
- package/lib/github/task-workflow.js +2 -2
- package/lib/github/workflows.js +1 -1
- package/lib/gitpod.d.ts +1 -1
- package/lib/gitpod.js +2 -2
- package/lib/ignore-file.js +1 -1
- package/lib/index.d.ts +12 -20
- package/lib/index.js +13 -21
- package/lib/ini.js +1 -1
- package/lib/java/java-project.d.ts +2 -2
- package/lib/java/java-project.js +4 -4
- 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.d.ts +1 -1
- package/lib/java/pom.js +12 -12
- package/lib/java/projenrc.js +4 -4
- package/lib/javascript/bundler.d.ts +1 -1
- package/lib/javascript/bundler.js +4 -4
- package/lib/{eslint.d.ts → javascript/eslint.d.ts} +3 -3
- package/lib/javascript/eslint.js +261 -0
- package/lib/javascript/index.d.ts +8 -2
- package/lib/javascript/index.js +9 -3
- package/lib/{jest.d.ts → javascript/jest.d.ts} +1 -1
- package/lib/{jest.js → javascript/jest.js} +3 -3
- package/lib/{node-package.d.ts → javascript/node-package.d.ts} +2 -2
- package/lib/javascript/node-package.js +683 -0
- package/lib/{node-project.d.ts → javascript/node-project.d.ts} +9 -8
- package/lib/javascript/node-project.js +541 -0
- package/lib/javascript/npm-config.d.ts +1 -1
- package/lib/javascript/npm-config.js +2 -2
- package/lib/javascript/projenrc.js +3 -3
- package/lib/{typescript-config.d.ts → javascript/typescript-config.d.ts} +2 -2
- package/lib/{typescript-config.js → javascript/typescript-config.js} +3 -3
- package/lib/{upgrade-dependencies.d.ts → javascript/upgrade-dependencies.d.ts} +3 -3
- package/lib/javascript/upgrade-dependencies.js +328 -0
- 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.d.ts +1 -1
- package/lib/project-build.js +2 -2
- package/lib/project.d.ts +5 -198
- package/lib/project.js +14 -78
- package/lib/projects.js +1 -1
- package/lib/{json/projenrc.d.ts → projenrc-json.d.ts} +2 -2
- package/lib/{json/projenrc.js → projenrc-json.js} +4 -4
- package/lib/python/pip.d.ts +1 -1
- package/lib/python/pip.js +9 -9
- package/lib/python/poetry.d.ts +1 -1
- package/lib/python/poetry.js +10 -10
- package/lib/python/projenrc.js +4 -4
- package/lib/python/pytest.js +1 -1
- package/lib/python/python-deps.d.ts +2 -2
- package/lib/python/python-deps.js +1 -1
- package/lib/python/python-packaging.d.ts +1 -1
- package/lib/python/python-packaging.js +1 -1
- package/lib/python/python-project.d.ts +1 -1
- package/lib/python/python-project.js +4 -3
- package/lib/python/python-sample.js +1 -1
- package/lib/python/requirements-file.js +4 -4
- package/lib/python/setuppy.js +1 -1
- package/lib/python/setuptools.d.ts +1 -1
- package/lib/python/setuptools.js +2 -2
- package/lib/python/venv.js +1 -1
- package/lib/readme.js +1 -1
- package/lib/release/publisher.d.ts +9 -1
- package/lib/release/publisher.js +7 -4
- package/lib/release/release-trigger.d.ts +19 -0
- package/lib/release/release-trigger.js +7 -2
- package/lib/release/release.d.ts +2 -2
- package/lib/release/release.js +2 -2
- package/lib/{json/run-projenrc.task.d.ts → run-projenrc-json.task.d.ts} +0 -0
- package/lib/run-projenrc-json.task.js +31 -0
- package/lib/sample-file.js +2 -2
- package/lib/semver.js +1 -1
- package/lib/source-code.js +1 -1
- package/lib/{tasks/model.d.ts → task-model.d.ts} +0 -0
- package/lib/task-model.js +3 -0
- package/lib/{tasks/runtime.d.ts → task-runtime.d.ts} +1 -1
- package/lib/task-runtime.js +272 -0
- package/lib/{tasks/task.d.ts → task.d.ts} +1 -1
- package/lib/task.js +195 -0
- package/lib/{tasks/tasks.d.ts → tasks.d.ts} +2 -2
- package/lib/tasks.js +129 -0
- package/lib/textfile.js +1 -1
- package/lib/toml.js +1 -1
- package/lib/typescript/index.d.ts +2 -0
- package/lib/typescript/index.js +3 -1
- package/lib/typescript/projenrc.js +1 -1
- package/lib/typescript/typescript-typedoc.d.ts +12 -0
- package/lib/typescript/typescript-typedoc.js +28 -0
- package/lib/{typescript.d.ts → typescript/typescript.d.ts} +3 -5
- package/lib/typescript/typescript.js +281 -0
- package/lib/util/synth.d.ts +2 -2
- package/lib/util/synth.js +3 -3
- package/lib/version.d.ts +1 -1
- package/lib/version.js +2 -2
- package/lib/vscode/devcontainer.d.ts +1 -1
- package/lib/vscode/devcontainer.js +2 -2
- package/lib/vscode/launch-config.js +1 -1
- package/lib/vscode/vscode.js +1 -1
- package/lib/web/next.d.ts +1 -1
- package/lib/web/next.js +8 -9
- package/lib/web/postcss.d.ts +1 -1
- package/lib/web/postcss.js +2 -2
- package/lib/web/react.d.ts +1 -1
- package/lib/web/react.js +9 -10
- package/lib/web/tailwind.d.ts +1 -1
- package/lib/web/tailwind.js +2 -2
- package/lib/xmlfile.js +1 -1
- package/lib/yaml.js +1 -1
- package/package.json +5 -3
- package/lib/awscdk-app-ts.js +0 -188
- package/lib/awscdk-construct.js +0 -121
- package/lib/cdk8s-app-ts.js +0 -134
- package/lib/construct-lib.js +0 -30
- package/lib/deps/dependencies.js +0 -192
- package/lib/deps/index.d.ts +0 -2
- package/lib/deps/model.d.ts +0 -99
- package/lib/deps/model.js +0 -18
- package/lib/eslint.js +0 -261
- package/lib/git/gitattributes.js +0 -62
- package/lib/git/index.d.ts +0 -1
- package/lib/jsii-docgen.d.ts +0 -10
- package/lib/jsii-docgen.js +0 -23
- package/lib/jsii-project.js +0 -187
- package/lib/json/index.d.ts +0 -1
- package/lib/json/run-projenrc.task.js +0 -31
- package/lib/node-package.js +0 -683
- package/lib/node-project.js +0 -540
- package/lib/tasks/builtin-example.task.js +0 -4
- package/lib/tasks/index.d.ts +0 -4
- package/lib/tasks/index.js +0 -17
- package/lib/tasks/model.js +0 -3
- package/lib/tasks/runtime.js +0 -272
- package/lib/tasks/task.js +0 -195
- package/lib/tasks/tasks.js +0 -129
- package/lib/typescript-typedoc.d.ts +0 -7
- package/lib/typescript-typedoc.js +0 -19
- package/lib/typescript.js +0 -284
- package/lib/upgrade-dependencies.js +0 -328
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.NodeProject = exports.AutoRelease = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const common_1 = require("../common");
|
|
7
|
+
const github_1 = require("../github");
|
|
8
|
+
const constants_1 = require("../github/constants");
|
|
9
|
+
const workflows_model_1 = require("../github/workflows-model");
|
|
10
|
+
const ignore_file_1 = require("../ignore-file");
|
|
11
|
+
const javascript_1 = require("../javascript");
|
|
12
|
+
const license_1 = require("../license");
|
|
13
|
+
const release_1 = require("../release");
|
|
14
|
+
const util_1 = require("../util");
|
|
15
|
+
const version_1 = require("../version");
|
|
16
|
+
const bundler_1 = require("./bundler");
|
|
17
|
+
const jest_1 = require("./jest");
|
|
18
|
+
const node_package_1 = require("./node-package");
|
|
19
|
+
const projenrc_1 = require("./projenrc");
|
|
20
|
+
const PROJEN_SCRIPT = 'projen';
|
|
21
|
+
/**
|
|
22
|
+
* (experimental) Automatic bump modes.
|
|
23
|
+
*
|
|
24
|
+
* @experimental
|
|
25
|
+
*/
|
|
26
|
+
var AutoRelease;
|
|
27
|
+
(function (AutoRelease) {
|
|
28
|
+
AutoRelease[AutoRelease["EVERY_COMMIT"] = 0] = "EVERY_COMMIT";
|
|
29
|
+
AutoRelease[AutoRelease["DAILY"] = 1] = "DAILY";
|
|
30
|
+
})(AutoRelease = exports.AutoRelease || (exports.AutoRelease = {}));
|
|
31
|
+
/**
|
|
32
|
+
* (experimental) Node.js project.
|
|
33
|
+
*
|
|
34
|
+
* @experimental
|
|
35
|
+
* @pjid node
|
|
36
|
+
*/
|
|
37
|
+
class NodeProject extends github_1.GitHubProject {
|
|
38
|
+
/**
|
|
39
|
+
* @experimental
|
|
40
|
+
*/
|
|
41
|
+
constructor(options) {
|
|
42
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13;
|
|
43
|
+
super(options);
|
|
44
|
+
this.package = new node_package_1.NodePackage(this, options);
|
|
45
|
+
this.workflowBootstrapSteps = (_b = options.workflowBootstrapSteps) !== null && _b !== void 0 ? _b : [];
|
|
46
|
+
this.workflowGitIdentity = (_c = options.workflowGitIdentity) !== null && _c !== void 0 ? _c : constants_1.DEFAULT_GITHUB_ACTIONS_USER;
|
|
47
|
+
this.runScriptCommand = (() => {
|
|
48
|
+
switch (this.packageManager) {
|
|
49
|
+
case node_package_1.NodePackageManager.NPM: return 'npm run';
|
|
50
|
+
case node_package_1.NodePackageManager.YARN: return 'yarn run';
|
|
51
|
+
case node_package_1.NodePackageManager.PNPM: return 'pnpm run';
|
|
52
|
+
default: throw new Error(`unexpected package manager ${this.packageManager}`);
|
|
53
|
+
}
|
|
54
|
+
})();
|
|
55
|
+
this.nodeVersion = (_d = options.workflowNodeVersion) !== null && _d !== void 0 ? _d : this.package.minNodeVersion;
|
|
56
|
+
// add PATH for all tasks which includes the project's npm .bin list
|
|
57
|
+
this.tasks.addEnvironment('PATH', '$(npx -c "node -e \\\"console.log(process.env.PATH)\\\"")');
|
|
58
|
+
this.addLicense(options);
|
|
59
|
+
this.npmDistTag = this.package.npmDistTag;
|
|
60
|
+
this.npmRegistry = this.package.npmRegistry;
|
|
61
|
+
if ((_e = options.npmignoreEnabled) !== null && _e !== void 0 ? _e : true) {
|
|
62
|
+
this.npmignore = new ignore_file_1.IgnoreFile(this, '.npmignore');
|
|
63
|
+
}
|
|
64
|
+
this.addDefaultGitIgnore();
|
|
65
|
+
if ((_f = options.gitignore) === null || _f === void 0 ? void 0 : _f.length) {
|
|
66
|
+
for (const i of options.gitignore) {
|
|
67
|
+
this.gitignore.exclude(i);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if ((_g = options.npmignore) === null || _g === void 0 ? void 0 : _g.length) {
|
|
71
|
+
if (!this.npmignore) {
|
|
72
|
+
throw new Error('.npmignore is not defined for an APP project type. Add "npmIgnore: true" to override this');
|
|
73
|
+
}
|
|
74
|
+
for (const i of options.npmignore) {
|
|
75
|
+
this.npmignore.exclude(i);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
this.setScript(PROJEN_SCRIPT, this.package.projenCommand);
|
|
79
|
+
(_h = this.npmignore) === null || _h === void 0 ? void 0 : _h.exclude(`/${common_1.PROJEN_RC}`);
|
|
80
|
+
(_j = this.npmignore) === null || _j === void 0 ? void 0 : _j.exclude(`/${common_1.PROJEN_DIR}/`);
|
|
81
|
+
this.gitignore.include(`/${common_1.PROJEN_RC}`);
|
|
82
|
+
const projen = (_k = options.projenDevDependency) !== null && _k !== void 0 ? _k : true;
|
|
83
|
+
if (projen) {
|
|
84
|
+
const postfix = options.projenVersion ? `@${options.projenVersion}` : '';
|
|
85
|
+
this.addDevDeps(`projen${postfix}`);
|
|
86
|
+
}
|
|
87
|
+
if (!options.defaultReleaseBranch) {
|
|
88
|
+
throw new Error('"defaultReleaseBranch" is temporarily a required option while we migrate its default value from "master" to "main"');
|
|
89
|
+
}
|
|
90
|
+
const buildEnabled = (_l = options.buildWorkflow) !== null && _l !== void 0 ? _l : (this.parent ? false : true);
|
|
91
|
+
const mutableBuilds = (_m = options.mutableBuild) !== null && _m !== void 0 ? _m : true;
|
|
92
|
+
// indicate if we have anti-tamper configured in our workflows. used by e.g. Jest
|
|
93
|
+
// to decide if we can always run with --updateSnapshot
|
|
94
|
+
this.antitamper = buildEnabled && ((_o = options.antitamper) !== null && _o !== void 0 ? _o : true);
|
|
95
|
+
// configure jest if enabled
|
|
96
|
+
// must be before the build/release workflows
|
|
97
|
+
if ((_p = options.jest) !== null && _p !== void 0 ? _p : true) {
|
|
98
|
+
this.jest = new jest_1.Jest(this, options.jestOptions);
|
|
99
|
+
}
|
|
100
|
+
if (buildEnabled) {
|
|
101
|
+
const branch = '${{ github.event.pull_request.head.ref }}';
|
|
102
|
+
const repo = '${{ github.event.pull_request.head.repo.full_name }}';
|
|
103
|
+
const buildJobId = 'build';
|
|
104
|
+
const postBuildSteps = new Array();
|
|
105
|
+
const gitDiffStepId = 'git_diff';
|
|
106
|
+
const hasChangesCondName = 'has_changes';
|
|
107
|
+
const hasChanges = `steps.${gitDiffStepId}.outputs.${hasChangesCondName}`;
|
|
108
|
+
// disable anti-tamper if build workflow is mutable
|
|
109
|
+
const antitamperSteps = ((_q = !mutableBuilds) !== null && _q !== void 0 ? _q : this.antitamper) ? [{
|
|
110
|
+
// anti-tamper check (fails if there were changes to committed files)
|
|
111
|
+
// this will identify any non-committed files generated during build (e.g. test snapshots)
|
|
112
|
+
name: 'Anti-tamper check',
|
|
113
|
+
run: 'git diff --ignore-space-at-eol --exit-code',
|
|
114
|
+
}] : [];
|
|
115
|
+
// run codecov if enabled or a secret token name is passed in
|
|
116
|
+
// AND jest must be configured
|
|
117
|
+
if ((options.codeCov || options.codeCovTokenSecret) && ((_r = this.jest) === null || _r === void 0 ? void 0 : _r.config)) {
|
|
118
|
+
postBuildSteps.push({
|
|
119
|
+
name: 'Upload coverage to Codecov',
|
|
120
|
+
uses: 'codecov/codecov-action@v1',
|
|
121
|
+
with: options.codeCovTokenSecret ? {
|
|
122
|
+
token: `\${{ secrets.${options.codeCovTokenSecret} }}`,
|
|
123
|
+
directory: this.jest.config.coverageDirectory,
|
|
124
|
+
} : {
|
|
125
|
+
directory: this.jest.config.coverageDirectory,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
// use "git diff --exit code" to check if there were changes in the repo
|
|
130
|
+
// and create a step output that will be used in subsequent steps.
|
|
131
|
+
postBuildSteps.push({
|
|
132
|
+
name: 'Check for changes',
|
|
133
|
+
id: gitDiffStepId,
|
|
134
|
+
run: `git diff --exit-code || echo "::set-output name=${hasChangesCondName}::true"`,
|
|
135
|
+
});
|
|
136
|
+
// only if we had changes, commit them and push to the repo note that for
|
|
137
|
+
// forks, this will fail (because the workflow doesn't have permissions.
|
|
138
|
+
// this indicates to users that they need to update their branch manually.
|
|
139
|
+
postBuildSteps.push({
|
|
140
|
+
if: hasChanges,
|
|
141
|
+
name: 'Commit and push changes (if changed)',
|
|
142
|
+
run: `git add . && git commit -m "chore: self mutation" && git push origin HEAD:${branch}`,
|
|
143
|
+
});
|
|
144
|
+
// if we pushed changes, we need to manually update the status check so
|
|
145
|
+
// that the PR will be green (we won't get here for forks with updates
|
|
146
|
+
// because the push would have failed).
|
|
147
|
+
postBuildSteps.push({
|
|
148
|
+
if: hasChanges,
|
|
149
|
+
name: 'Update status check (if changed)',
|
|
150
|
+
run: [
|
|
151
|
+
'gh api',
|
|
152
|
+
'-X POST',
|
|
153
|
+
`/repos/${repo}/check-runs`,
|
|
154
|
+
`-F name="${buildJobId}"`,
|
|
155
|
+
'-F head_sha="$(git rev-parse HEAD)"',
|
|
156
|
+
'-F status="completed"',
|
|
157
|
+
'-F conclusion="success"',
|
|
158
|
+
].join(' '),
|
|
159
|
+
env: {
|
|
160
|
+
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}',
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
// if we pushed changes, we need to mark the current commit as failed, so
|
|
164
|
+
// that GitHub auto-merge does not risk merging this commit before the
|
|
165
|
+
// event for the new commit has registered.
|
|
166
|
+
postBuildSteps.push({
|
|
167
|
+
if: hasChanges,
|
|
168
|
+
name: 'Cancel workflow (if changed)',
|
|
169
|
+
run: [
|
|
170
|
+
'gh api',
|
|
171
|
+
'-X POST',
|
|
172
|
+
`/repos/${repo}/actions/runs/\${{ github.run_id }}/cancel`,
|
|
173
|
+
].join(' '),
|
|
174
|
+
env: {
|
|
175
|
+
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}',
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
postBuildSteps.push(...antitamperSteps);
|
|
179
|
+
if (this.github) {
|
|
180
|
+
this.buildWorkflow = new github_1.TaskWorkflow(this.github, {
|
|
181
|
+
gitIdentity: this.workflowGitIdentity,
|
|
182
|
+
name: 'build',
|
|
183
|
+
jobId: buildJobId,
|
|
184
|
+
triggers: {
|
|
185
|
+
pullRequest: {},
|
|
186
|
+
},
|
|
187
|
+
env: {
|
|
188
|
+
CI: 'true',
|
|
189
|
+
},
|
|
190
|
+
permissions: {
|
|
191
|
+
checks: workflows_model_1.JobPermission.WRITE,
|
|
192
|
+
contents: workflows_model_1.JobPermission.WRITE,
|
|
193
|
+
actions: workflows_model_1.JobPermission.WRITE,
|
|
194
|
+
},
|
|
195
|
+
checkoutWith: mutableBuilds ? {
|
|
196
|
+
ref: branch,
|
|
197
|
+
repository: repo,
|
|
198
|
+
} : undefined,
|
|
199
|
+
preBuildSteps: [
|
|
200
|
+
...antitamperSteps,
|
|
201
|
+
...this.installWorkflowSteps,
|
|
202
|
+
],
|
|
203
|
+
task: this.buildTask,
|
|
204
|
+
postBuildSteps,
|
|
205
|
+
container: options.workflowContainerImage ? { image: options.workflowContainerImage } : undefined,
|
|
206
|
+
});
|
|
207
|
+
this.buildWorkflowJobId = buildJobId;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
const release = (_t = (_s = options.release) !== null && _s !== void 0 ? _s : options.releaseWorkflow) !== null && _t !== void 0 ? _t : (this.parent ? false : true);
|
|
211
|
+
if (release) {
|
|
212
|
+
this.addDevDeps(version_1.Version.STANDARD_VERSION);
|
|
213
|
+
this.release = new release_1.Release(this, {
|
|
214
|
+
versionFile: 'package.json',
|
|
215
|
+
task: this.buildTask,
|
|
216
|
+
branch: (_u = options.defaultReleaseBranch) !== null && _u !== void 0 ? _u : 'main',
|
|
217
|
+
...options,
|
|
218
|
+
releaseWorkflowSetupSteps: [
|
|
219
|
+
...this.installWorkflowSteps,
|
|
220
|
+
...(_v = options.releaseWorkflowSetupSteps) !== null && _v !== void 0 ? _v : [],
|
|
221
|
+
],
|
|
222
|
+
});
|
|
223
|
+
this.publisher = this.release.publisher;
|
|
224
|
+
if ((_w = options.releaseToNpm) !== null && _w !== void 0 ? _w : false) {
|
|
225
|
+
this.release.publisher.publishToNpm({
|
|
226
|
+
distTag: this.package.npmDistTag,
|
|
227
|
+
registry: this.package.npmRegistry,
|
|
228
|
+
npmTokenSecret: this.package.npmTokenSecret,
|
|
229
|
+
codeArtifactOptions: {
|
|
230
|
+
accessKeyIdSecret: (_x = options.codeArtifactOptions) === null || _x === void 0 ? void 0 : _x.accessKeyIdSecret,
|
|
231
|
+
secretAccessKeySecret: (_y = options.codeArtifactOptions) === null || _y === void 0 ? void 0 : _y.secretAccessKeySecret,
|
|
232
|
+
roleToAssume: (_z = options.codeArtifactOptions) === null || _z === void 0 ? void 0 : _z.roleToAssume,
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
// validate that no release options are selected if the release workflow is disabled.
|
|
239
|
+
if (options.releaseToNpm) {
|
|
240
|
+
throw new Error('"releaseToNpm" is not supported for APP projects');
|
|
241
|
+
}
|
|
242
|
+
if (options.releaseEveryCommit) {
|
|
243
|
+
throw new Error('"releaseEveryCommit" is not supported for APP projects');
|
|
244
|
+
}
|
|
245
|
+
if (options.releaseSchedule) {
|
|
246
|
+
throw new Error('"releaseSchedule" is not supported for APP projects');
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if ((_0 = this.github) === null || _0 === void 0 ? void 0 : _0.mergify) {
|
|
250
|
+
this.autoMerge = new github_1.AutoMerge(this.github, {
|
|
251
|
+
buildJob: this.buildWorkflowJobId,
|
|
252
|
+
...options.autoMergeOptions,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
const dependabot = (_1 = options.dependabot) !== null && _1 !== void 0 ? _1 : false;
|
|
256
|
+
const depsUpgrade = (_2 = options.depsUpgrade) !== null && _2 !== void 0 ? _2 : !dependabot;
|
|
257
|
+
if (dependabot && depsUpgrade) {
|
|
258
|
+
throw new Error("'dependabot' cannot be configured together with 'depsUpgrade'");
|
|
259
|
+
}
|
|
260
|
+
if (options.projenUpgradeAutoMerge !== undefined && options.autoApproveProjenUpgrades !== undefined) {
|
|
261
|
+
throw new Error("'projenUpgradeAutoMerge' cannot be configured together with 'autoApproveProjenUpgrades'");
|
|
262
|
+
}
|
|
263
|
+
const projenAutoApprove = (_3 = options.autoApproveProjenUpgrades) !== null && _3 !== void 0 ? _3 : ((_4 = options.projenUpgradeAutoMerge) !== null && _4 !== void 0 ? _4 : false);
|
|
264
|
+
const depsAutoApprove = (_5 = options.autoApproveUpgrades) !== null && _5 !== void 0 ? _5 : false;
|
|
265
|
+
if (projenAutoApprove && !this.autoApprove) {
|
|
266
|
+
throw new Error('Autoamtic approval of projen upgrades requires configuring `autoApproveOptions`');
|
|
267
|
+
}
|
|
268
|
+
if (depsAutoApprove && !this.autoApprove) {
|
|
269
|
+
throw new Error('Autoamtic approval of dependencies upgrades requires configuring `autoApproveOptions`');
|
|
270
|
+
}
|
|
271
|
+
const autoApproveLabel = (condition) => { var _b; return (condition && ((_b = this.autoApprove) === null || _b === void 0 ? void 0 : _b.label)) ? [this.autoApprove.label] : undefined; };
|
|
272
|
+
let ignoresProjen;
|
|
273
|
+
if (dependabot) {
|
|
274
|
+
const defaultOptions = {
|
|
275
|
+
labels: autoApproveLabel(depsAutoApprove),
|
|
276
|
+
};
|
|
277
|
+
const dependabotConf = (_6 = this.github) === null || _6 === void 0 ? void 0 : _6.addDependabot(util_1.deepMerge([defaultOptions, (_7 = options.dependabotOptions) !== null && _7 !== void 0 ? _7 : {}]));
|
|
278
|
+
ignoresProjen = dependabotConf === null || dependabotConf === void 0 ? void 0 : dependabotConf.ignoresProjen;
|
|
279
|
+
}
|
|
280
|
+
if (depsUpgrade) {
|
|
281
|
+
const defaultOptions = {
|
|
282
|
+
// if projen secret is defined we can also upgrade projen here.
|
|
283
|
+
ignoreProjen: !options.projenUpgradeSecret,
|
|
284
|
+
workflowOptions: {
|
|
285
|
+
// if projen secret is defined, use it (otherwise default to GITHUB_TOKEN).
|
|
286
|
+
secret: options.projenUpgradeSecret,
|
|
287
|
+
container: options.workflowContainerImage ? {
|
|
288
|
+
image: options.workflowContainerImage,
|
|
289
|
+
} : undefined,
|
|
290
|
+
labels: autoApproveLabel(depsAutoApprove),
|
|
291
|
+
gitIdentity: this.workflowGitIdentity,
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
const upgradeDependencies = new javascript_1.UpgradeDependencies(this, util_1.deepMerge([defaultOptions, (_8 = options.depsUpgradeOptions) !== null && _8 !== void 0 ? _8 : {}]));
|
|
295
|
+
ignoresProjen = upgradeDependencies.ignoresProjen;
|
|
296
|
+
}
|
|
297
|
+
// create a dedicated workflow to upgrade projen itself if needed
|
|
298
|
+
if (ignoresProjen && this.package.packageName !== 'projen') {
|
|
299
|
+
new javascript_1.UpgradeDependencies(this, {
|
|
300
|
+
include: ['projen'],
|
|
301
|
+
taskName: 'upgrade-projen',
|
|
302
|
+
pullRequestTitle: 'upgrade projen',
|
|
303
|
+
ignoreProjen: false,
|
|
304
|
+
workflow: !!options.projenUpgradeSecret,
|
|
305
|
+
workflowOptions: {
|
|
306
|
+
schedule: javascript_1.UpgradeDependenciesSchedule.expressions((_9 = options.projenUpgradeSchedule) !== null && _9 !== void 0 ? _9 : ['0 6 * * *']),
|
|
307
|
+
container: options.workflowContainerImage ? { image: options.workflowContainerImage } : undefined,
|
|
308
|
+
secret: options.projenUpgradeSecret,
|
|
309
|
+
labels: autoApproveLabel(projenAutoApprove),
|
|
310
|
+
gitIdentity: this.workflowGitIdentity,
|
|
311
|
+
},
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
if ((_10 = options.pullRequestTemplate) !== null && _10 !== void 0 ? _10 : true) {
|
|
315
|
+
(_11 = this.github) === null || _11 === void 0 ? void 0 : _11.addPullRequestTemplate(...(_12 = options.pullRequestTemplateContents) !== null && _12 !== void 0 ? _12 : []);
|
|
316
|
+
}
|
|
317
|
+
const projenrcJs = (_13 = options.projenrcJs) !== null && _13 !== void 0 ? _13 : !options.projenrcJson;
|
|
318
|
+
if (projenrcJs) {
|
|
319
|
+
new projenrc_1.Projenrc(this, options.projenrcJsOptions);
|
|
320
|
+
}
|
|
321
|
+
// add a bundler component - this enables things like Lambda bundling and in the future web bundling.
|
|
322
|
+
this.bundler = new bundler_1.Bundler(this, options.bundlerOptions);
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* @deprecated use `package.allowLibraryDependencies`
|
|
326
|
+
*/
|
|
327
|
+
get allowLibraryDependencies() { return this.package.allowLibraryDependencies; }
|
|
328
|
+
/**
|
|
329
|
+
* @deprecated use `package.entrypoint`
|
|
330
|
+
*/
|
|
331
|
+
get entrypoint() { return this.package.entrypoint; }
|
|
332
|
+
/**
|
|
333
|
+
* (experimental) Minimum node.js version required by this package.
|
|
334
|
+
*
|
|
335
|
+
* @experimental
|
|
336
|
+
*/
|
|
337
|
+
get minNodeVersion() { return this.package.minNodeVersion; }
|
|
338
|
+
/**
|
|
339
|
+
* (experimental) Maximum node version required by this pacakge.
|
|
340
|
+
*
|
|
341
|
+
* @experimental
|
|
342
|
+
*/
|
|
343
|
+
get maxNodeVersion() { return this.package.maxNodeVersion; }
|
|
344
|
+
/**
|
|
345
|
+
* (deprecated) The package manager to use.
|
|
346
|
+
*
|
|
347
|
+
* @deprecated use `package.packageManager`
|
|
348
|
+
*/
|
|
349
|
+
get packageManager() { return this.package.packageManager; }
|
|
350
|
+
/**
|
|
351
|
+
* @deprecated use `package.addField(x, y)`
|
|
352
|
+
*/
|
|
353
|
+
get manifest() {
|
|
354
|
+
return this.package.manifest;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* @experimental
|
|
358
|
+
*/
|
|
359
|
+
addBins(bins) {
|
|
360
|
+
this.package.addBin(bins);
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* (experimental) Replaces the contents of an npm package.json script.
|
|
364
|
+
*
|
|
365
|
+
* @param name The script name.
|
|
366
|
+
* @param command The command to execute.
|
|
367
|
+
* @experimental
|
|
368
|
+
*/
|
|
369
|
+
setScript(name, command) {
|
|
370
|
+
this.package.setScript(name, command);
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* (experimental) Removes the npm script (always successful).
|
|
374
|
+
*
|
|
375
|
+
* @param name The name of the script.
|
|
376
|
+
* @experimental
|
|
377
|
+
*/
|
|
378
|
+
removeScript(name) {
|
|
379
|
+
this.package.removeScript(name);
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* (experimental) Indicates if a script by the name name is defined.
|
|
383
|
+
*
|
|
384
|
+
* @param name The name of the script.
|
|
385
|
+
* @experimental
|
|
386
|
+
*/
|
|
387
|
+
hasScript(name) {
|
|
388
|
+
return this.package.hasScript(name);
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* (deprecated) DEPRECATED.
|
|
392
|
+
*
|
|
393
|
+
* @deprecated use `project.compileTask.exec()`
|
|
394
|
+
*/
|
|
395
|
+
addCompileCommand(...commands) {
|
|
396
|
+
for (const c of commands) {
|
|
397
|
+
this.compileTask.exec(c);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* (deprecated) DEPRECATED.
|
|
402
|
+
*
|
|
403
|
+
* @deprecated use `project.testTask.exec()`
|
|
404
|
+
*/
|
|
405
|
+
addTestCommand(...commands) {
|
|
406
|
+
for (const c of commands) {
|
|
407
|
+
this.testTask.exec(c);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* (experimental) Directly set fields in `package.json`.
|
|
412
|
+
*
|
|
413
|
+
* @param fields The fields to set.
|
|
414
|
+
* @experimental
|
|
415
|
+
*/
|
|
416
|
+
addFields(fields) {
|
|
417
|
+
for (const [name, value] of Object.entries(fields)) {
|
|
418
|
+
this.package.addField(name, value);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* (experimental) Adds keywords to package.json (deduplicated).
|
|
423
|
+
*
|
|
424
|
+
* @param keywords The keywords to add.
|
|
425
|
+
* @experimental
|
|
426
|
+
*/
|
|
427
|
+
addKeywords(...keywords) {
|
|
428
|
+
this.package.addKeywords(...keywords);
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* @experimental
|
|
432
|
+
*/
|
|
433
|
+
get installWorkflowSteps() {
|
|
434
|
+
const install = new Array();
|
|
435
|
+
// first run the workflow bootstrap steps
|
|
436
|
+
install.push(...this.workflowBootstrapSteps);
|
|
437
|
+
if (this.nodeVersion) {
|
|
438
|
+
install.push({
|
|
439
|
+
name: 'Setup Node.js',
|
|
440
|
+
uses: 'actions/setup-node@v2.2.0',
|
|
441
|
+
with: { 'node-version': this.nodeVersion },
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
if (this.package.packageManager === node_package_1.NodePackageManager.PNPM) {
|
|
445
|
+
install.push({
|
|
446
|
+
name: 'Setup pnpm',
|
|
447
|
+
uses: 'pnpm/action-setup@v2.0.1',
|
|
448
|
+
with: { version: '6.14.7' },
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
install.push({
|
|
452
|
+
name: 'Install dependencies',
|
|
453
|
+
run: this.package.installCommand,
|
|
454
|
+
});
|
|
455
|
+
return install;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* (experimental) Defines normal dependencies.
|
|
459
|
+
*
|
|
460
|
+
* @param deps Names modules to install.
|
|
461
|
+
* @experimental
|
|
462
|
+
*/
|
|
463
|
+
addDeps(...deps) {
|
|
464
|
+
return this.package.addDeps(...deps);
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* (experimental) Defines development/test dependencies.
|
|
468
|
+
*
|
|
469
|
+
* @param deps Names modules to install.
|
|
470
|
+
* @experimental
|
|
471
|
+
*/
|
|
472
|
+
addDevDeps(...deps) {
|
|
473
|
+
return this.package.addDevDeps(...deps);
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* (experimental) Defines peer dependencies.
|
|
477
|
+
*
|
|
478
|
+
* When adding peer dependencies, a devDependency will also be added on the
|
|
479
|
+
* pinned version of the declared peer. This will ensure that you are testing
|
|
480
|
+
* your code against the minimum version required from your consumers.
|
|
481
|
+
*
|
|
482
|
+
* @param deps Names modules to install.
|
|
483
|
+
* @experimental
|
|
484
|
+
*/
|
|
485
|
+
addPeerDeps(...deps) {
|
|
486
|
+
return this.package.addPeerDeps(...deps);
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* (experimental) Defines bundled dependencies.
|
|
490
|
+
*
|
|
491
|
+
* Bundled dependencies will be added as normal dependencies as well as to the
|
|
492
|
+
* `bundledDependencies` section of your `package.json`.
|
|
493
|
+
*
|
|
494
|
+
* @param deps Names modules to install.
|
|
495
|
+
* @experimental
|
|
496
|
+
*/
|
|
497
|
+
addBundledDeps(...deps) {
|
|
498
|
+
return this.package.addBundledDeps(...deps);
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* (experimental) Exclude these files from the bundled package.
|
|
502
|
+
*
|
|
503
|
+
* Implemented by project types based on the
|
|
504
|
+
* packaging mechanism. For example, `NodeProject` delegates this to `.npmignore`.
|
|
505
|
+
*
|
|
506
|
+
* @experimental
|
|
507
|
+
*/
|
|
508
|
+
addPackageIgnore(pattern) {
|
|
509
|
+
var _b;
|
|
510
|
+
(_b = this.npmignore) === null || _b === void 0 ? void 0 : _b.addPatterns(pattern);
|
|
511
|
+
}
|
|
512
|
+
addLicense(options) {
|
|
513
|
+
var _b;
|
|
514
|
+
if (this.package.license) {
|
|
515
|
+
new license_1.License(this, {
|
|
516
|
+
spdx: this.package.license,
|
|
517
|
+
copyrightOwner: (_b = options.copyrightOwner) !== null && _b !== void 0 ? _b : options.authorName,
|
|
518
|
+
copyrightPeriod: options.copyrightPeriod,
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
addDefaultGitIgnore() {
|
|
523
|
+
this.gitignore.exclude('# Logs', 'logs', '*.log', 'npm-debug.log*', 'yarn-debug.log*', 'yarn-error.log*', 'lerna-debug.log*', '# Diagnostic reports (https://nodejs.org/api/report.html)', 'report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json', '# Runtime data', 'pids', '*.pid', '*.seed', '*.pid.lock', '# Directory for instrumented libs generated by jscoverage/JSCover', 'lib-cov', '# Coverage directory used by tools like istanbul', 'coverage', '*.lcov', '# nyc test coverage', '.nyc_output', '# Compiled binary addons (https://nodejs.org/api/addons.html)', 'build/Release', '# Dependency directories', 'node_modules/', 'jspm_packages/', '# TypeScript cache', '*.tsbuildinfo', '# Optional eslint cache', '.eslintcache', '# Output of \'npm pack\'', '*.tgz', '# Yarn Integrity file', '.yarn-integrity', '# parcel-bundler cache (https://parceljs.org/)', '.cache');
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* (experimental) Returns the shell command to execute in order to run a task.
|
|
527
|
+
*
|
|
528
|
+
* This will
|
|
529
|
+
* typically be `npx projen TASK`.
|
|
530
|
+
*
|
|
531
|
+
* @param task The task for which the command is required.
|
|
532
|
+
* @experimental
|
|
533
|
+
*/
|
|
534
|
+
runTaskCommand(task) {
|
|
535
|
+
return `${this.package.projenCommand} ${task.name}`;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
exports.NodeProject = NodeProject;
|
|
539
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
540
|
+
NodeProject[_a] = { fqn: "projen.javascript.NodeProject", version: "0.37.1" };
|
|
541
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1wcm9qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2phdmFzY3JpcHQvbm9kZS1wcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsc0NBQWtEO0FBQ2xELHNDQUF5SDtBQUN6SCxtREFBa0U7QUFDbEUsK0RBQW1FO0FBQ25FLGdEQUE0QztBQUM1Qyw4Q0FBNkc7QUFDN0csd0NBQXFDO0FBQ3JDLHdDQUF1RTtBQUV2RSxrQ0FBb0M7QUFDcEMsd0NBQXFDO0FBQ3JDLHVDQUFvRDtBQUNwRCxpQ0FBMkM7QUFDM0MsaURBQXFGO0FBQ3JGLHlDQUF1RDtBQUV2RCxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUM7Ozs7OztBQTRHL0IsSUFBWSxXQU1YO0FBTkQsV0FBWSxXQUFXO0lBRXJCLDZEQUFZLENBQUE7SUFHWiwrQ0FBSyxDQUFBO0FBQ1AsQ0FBQyxFQU5XLFdBQVcsR0FBWCxtQkFBVyxLQUFYLG1CQUFXLFFBTXRCOzs7Ozs7O0FBR0QsTUFBYSxXQUFZLFNBQVEsc0JBQWE7Ozs7SUErRDVDLFlBQVksT0FBMkI7O1FBQ3JDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVmLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSwwQkFBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsc0JBQXNCLFNBQUcsT0FBTyxDQUFDLHNCQUFzQixtQ0FBSSxFQUFFLENBQUM7UUFDbkUsSUFBSSxDQUFDLG1CQUFtQixTQUFHLE9BQU8sQ0FBQyxtQkFBbUIsbUNBQUksdUNBQTJCLENBQUM7UUFFdEYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsR0FBRyxFQUFFO1lBQzVCLFFBQVEsSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDM0IsS0FBSyxpQ0FBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQztnQkFDOUMsS0FBSyxpQ0FBa0IsQ0FBQyxJQUFJLENBQUMs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RUFDbEQsVUFBVSxFQUNWLFFBQVEsRUFFUixxQkFBcUIsRUFDckIsYUFBYSxFQUViLCtEQUErRCxFQUMvRCxlQUFlLEVBRWYsMEJBQTBCLEVBQzFCLGVBQWUsRUFDZixnQkFBZ0IsRUFFaEIsb0JBQW9CLEVBQ3BCLGVBQWUsRUFHZix5QkFBeUIsRUFDekIsY0FBYyxFQUVkLDBCQUEwQixFQUMxQixPQUFPLEVBRVAsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUVqQixnREFBZ0QsRUFDaEQsUUFBUSxDQUNULENBQUM7SUFDSixDQUFDOzs7Ozs7Ozs7O0lBR00sY0FBYyxDQUFDLElBQVU7UUFDOUIsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0RCxDQUFDOztBQXpqQkgsa0NBMGpCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBST0pFTl9ESVIsIFBST0pFTl9SQyB9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQgeyBBdXRvTWVyZ2UsIERlcGVuZGFib3RPcHRpb25zLCBHaXRIdWJQcm9qZWN0LCBHaXRIdWJQcm9qZWN0T3B0aW9ucywgR2l0SWRlbnRpdHksIFRhc2tXb3JrZmxvdyB9IGZyb20gJy4uL2dpdGh1Yic7XG5pbXBvcnQgeyBERUZBVUxUX0dJVEhVQl9BQ1RJT05TX1VTRVIgfSBmcm9tICcuLi9naXRodWIvY29uc3RhbnRzJztcbmltcG9ydCB7IEpvYlBlcm1pc3Npb24sIEpvYlN0ZXAgfSBmcm9tICcuLi9naXRodWIvd29ya2Zsb3dzLW1vZGVsJztcbmltcG9ydCB7IElnbm9yZUZpbGUgfSBmcm9tICcuLi9pZ25vcmUtZmlsZSc7XG5pbXBvcnQgeyBVcGdyYWRlRGVwZW5kZW5jaWVzLCBVcGdyYWRlRGVwZW5kZW5jaWVzT3B0aW9ucywgVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlIH0gZnJvbSAnLi4vamF2YXNjcmlwdCc7XG5pbXBvcnQgeyBMaWNlbnNlIH0gZnJvbSAnLi4vbGljZW5zZSc7XG5pbXBvcnQgeyBSZWxlYXNlLCBSZWxlYXNlUHJvamVjdE9wdGlvbnMsIFB1Ymxpc2hlciB9IGZyb20gJy4uL3JlbGVhc2UnO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gJy4uL3Rhc2snO1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBWZXJzaW9uIH0gZnJvbSAnLi4vdmVyc2lvbic7XG5pbXBvcnQgeyBCdW5kbGVyLCBCdW5kbGVyT3B0aW9ucyB9IGZyb20gJy4vYnVuZGxlcic7XG5pbXBvcnQgeyBKZXN0LCBKZXN0T3B0aW9ucyB9IGZyb20gJy4vamVzdCc7XG5pbXBvcnQgeyBOb2RlUGFja2FnZSwgTm9kZVBhY2thZ2VNYW5hZ2VyLCBOb2RlUGFja2FnZU9wdGlvbnMgfSBmcm9tICcuL25vZGUtcGFja2FnZSc7XG5pbXBvcnQgeyBQcm9qZW5yYywgUHJvamVucmNPcHRpb25zIH0gZnJvbSAnLi9wcm9qZW5yYyc7XG5cbmNvbnN0IFBST0pFTl9TQ1JJUFQgPSAncHJvamVuJztcblxuZXhwb3J0IGludGVyZmFjZSBOb2RlUHJvamVjdE9wdGlvbnMgZXh0ZW5kcyBHaXRIdWJQcm9qZWN0T3B0aW9ucywgTm9kZVBhY2thZ2VPcHRpb25zLCBSZWxlYXNlUHJvamVjdE9wdGlvbnMge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgY29weXJpZ2h0T3duZXI/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGNvcHlyaWdodFBlcmlvZD86IHN0cmluZztcblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgcHJvamVuVmVyc2lvbj86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHByb2plbkRldkRlcGVuZGVuY3k/OiBib29sZWFuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGJ1aWxkV29ya2Zsb3c/OiBib29sZWFuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBtdXRhYmxlQnVpbGQ/OiBib29sZWFuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgY29kZUNvdj86IGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBjb2RlQ292VG9rZW5TZWNyZXQ/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHJlbGVhc2VXb3JrZmxvdz86IGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgcmVsZWFzZT86IGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgZGVmYXVsdFJlbGVhc2VCcmFuY2g6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHdvcmtmbG93Qm9vdHN0cmFwU3RlcHM/OiBhbnlbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHdvcmtmbG93R2l0SWRlbnRpdHk/OiBHaXRJZGVudGl0eTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHJlbGVhc2VUb05wbT86IGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHdvcmtmbG93Tm9kZVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgZGVwZW5kYWJvdD86IGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGRlcGVuZGFib3RPcHRpb25zPzogRGVwZW5kYWJvdE9wdGlvbnM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGRlcHNVcGdyYWRlPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGRlcHNVcGdyYWRlT3B0aW9ucz86IFVwZ3JhZGVEZXBlbmRlbmNpZXNPcHRpb25zO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBwcm9qZW5VcGdyYWRlU2VjcmV0Pzogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHByb2plblVwZ3JhZGVBdXRvTWVyZ2U/OiBib29sZWFuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBhdXRvQXBwcm92ZVByb2plblVwZ3JhZGVzPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBhdXRvQXBwcm92ZVVwZ3JhZGVzPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBwcm9qZW5VcGdyYWRlU2NoZWR1bGU/OiBzdHJpbmdbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IG5wbWlnbm9yZUVuYWJsZWQ/OiBib29sZWFuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IG5wbWlnbm9yZT86IHN0cmluZ1tdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBwdWxsUmVxdWVzdFRlbXBsYXRlPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHB1bGxSZXF1ZXN0VGVtcGxhdGVDb250ZW50cz86IHN0cmluZ1tdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGdpdGlnbm9yZT86IHN0cmluZ1tdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgamVzdD86IGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgamVzdE9wdGlvbnM/OiBKZXN0T3B0aW9ucztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBwcm9qZW5yY0pzPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBwcm9qZW5yY0pzT3B0aW9ucz86IFByb2plbnJjT3B0aW9ucztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGJ1bmRsZXJPcHRpb25zPzogQnVuZGxlck9wdGlvbnM7XG59XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBlbnVtIEF1dG9SZWxlYXNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIEVWRVJZX0NPTU1JVCxcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgREFJTFlcbn1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuZXhwb3J0IGNsYXNzIE5vZGVQcm9qZWN0IGV4dGVuZHMgR2l0SHViUHJvamVjdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIHJlYWRvbmx5IHBhY2thZ2U6IE5vZGVQYWNrYWdlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyByZWFkb25seSBucG1pZ25vcmU/OiBJZ25vcmVGaWxlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyBnZXQgYWxsb3dMaWJyYXJ5RGVwZW5kZW5jaWVzKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5wYWNrYWdlLmFsbG93TGlicmFyeURlcGVuZGVuY2llczsgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBwdWJsaWMgZ2V0IGVudHJ5cG9pbnQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMucGFja2FnZS5lbnRyeXBvaW50OyB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIHJlYWRvbmx5IGF1dG9NZXJnZT86IEF1dG9NZXJnZTtcblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIHJlYWRvbmx5IGJ1aWxkV29ya2Zsb3c/OiBUYXNrV29ya2Zsb3c7XG4gIHB1YmxpYyByZWFkb25seSBidWlsZFdvcmtmbG93Sm9iSWQ/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyByZWFkb25seSBwdWJsaXNoZXI/OiBQdWJsaXNoZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBwdWJsaWMgcmVhZG9ubHkgcmVsZWFzZT86IFJlbGVhc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBwdWJsaWMgZ2V0IG1pbk5vZGVWZXJzaW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLnBhY2thZ2UubWluTm9kZVZlcnNpb247IH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyBnZXQgbWF4Tm9kZVZlcnNpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMucGFja2FnZS5tYXhOb2RlVmVyc2lvbjsgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbm9kZVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIHJlYWRvbmx5IGFudGl0YW1wZXI6IGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHByb3RlY3RlZCByZWFkb25seSBucG1EaXN0VGFnOiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbnBtUmVnaXN0cnk6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIGdldCBwYWNrYWdlTWFuYWdlcigpOiBOb2RlUGFja2FnZU1hbmFnZXIgeyByZXR1cm4gdGhpcy5wYWNrYWdlLnBhY2thZ2VNYW5hZ2VyOyB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyByZWFkb25seSBydW5TY3JpcHRDb21tYW5kOiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIHJlYWRvbmx5IGplc3Q/OiBKZXN0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIGdldCBtYW5pZmVzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlLm1hbmlmZXN0O1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGJ1bmRsZXI6IEJ1bmRsZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3b3JrZmxvd0Jvb3RzdHJhcFN0ZXBzOiBKb2JTdGVwW107XG4gIHByaXZhdGUgcmVhZG9ubHkgd29ya2Zsb3dHaXRJZGVudGl0eTogR2l0SWRlbnRpdHk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTm9kZVByb2plY3RPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICB0aGlzLnBhY2thZ2UgPSBuZXcgTm9kZVBhY2thZ2UodGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy53b3JrZmxvd0Jvb3RzdHJhcFN0ZXBzID0gb3B0aW9ucy53b3JrZmxvd0Jvb3RzdHJhcFN0ZXBzID8/IFtdO1xuICAgIHRoaXMud29ya2Zsb3dHaXRJZGVudGl0eSA9IG9wdGlvbnMud29ya2Zsb3dHaXRJZGVudGl0eSA/PyBERUZBVUxUX0dJVEhVQl9BQ1RJT05TX1VTRVI7XG5cbiAgICB0aGlzLnJ1blNjcmlwdENvbW1hbmQgPSAoKCkgPT4ge1xuICAgICAgc3dpdGNoICh0aGlzLnBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTTogcmV0dXJuICducG0gcnVuJztcbiAgICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjogcmV0dXJuICd5YXJuIHJ1bic7XG4gICAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE06IHJldHVybiAncG5wbSBydW4nO1xuICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgcGFja2FnZSBtYW5hZ2VyICR7dGhpcy5wYWNrYWdlTWFuYWdlcn1gKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgdGhpcy5ub2RlVmVyc2lvbiA9IG9wdGlvbnMud29ya2Zsb3dOb2RlVmVyc2lvbiA/PyB0aGlzLnBhY2thZ2UubWluTm9kZVZlcnNpb247XG5cblxuICAgIC8vIGFkZCBQQVRIIGZvciBhbGwgdGFza3Mgd2hpY2ggaW5jbHVkZXMgdGhlIHByb2plY3QncyBucG0gLmJpbiBsaXN0XG4gICAgdGhpcy50YXNrcy5hZGRFbnZpcm9ubWVudCgnUEFUSCcsICckKG5weCAtYyBcIm5vZGUgLWUgXFxcXFxcXCJjb25zb2xlLmxvZyhwcm9jZXNzLmVudi5QQVRIKVxcXFxcXFwiXCIpJyk7XG5cblxuICAgIHRoaXMuYWRkTGljZW5zZShvcHRpb25zKTtcblxuICAgIHRoaXMubnBtRGlzdFRhZyA9IHRoaXMucGFja2FnZS5ucG1EaXN0VGFnO1xuICAgIHRoaXMubnBtUmVnaXN0cnkgPSB0aGlzLnBhY2thZ2UubnBtUmVnaXN0cnk7XG5cbiAgICBpZiAob3B0aW9ucy5ucG1pZ25vcmVFbmFibGVkID8/IHRydWUpIHtcbiAgICAgIHRoaXMubnBtaWdub3JlID0gbmV3IElnbm9yZUZpbGUodGhpcywgJy5ucG1pZ25vcmUnKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRHaXRJZ25vcmUoKTtcblxuICAgIGlmIChvcHRpb25zLmdpdGlnbm9yZT8ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGkgb2Ygb3B0aW9ucy5naXRpZ25vcmUpIHtcbiAgICAgICAgdGhpcy5naXRpZ25vcmUuZXhjbHVkZShpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5ucG1pZ25vcmU/Lmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLm5wbWlnbm9yZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJy5ucG1pZ25vcmUgaXMgbm90IGRlZmluZWQgZm9yIGFuIEFQUCBwcm9qZWN0IHR5cGUuIEFkZCBcIm5wbUlnbm9yZTogdHJ1ZVwiIHRvIG92ZXJyaWRlIHRoaXMnKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBpIG9mIG9wdGlvbnMubnBtaWdub3JlKSB7XG4gICAgICAgIHRoaXMubnBtaWdub3JlLmV4Y2x1ZGUoaSk7XG4gICAgICB9XG4gICAgfVxuXG5cbiAgICB0aGlzLnNldFNjcmlwdChQUk9KRU5fU0NSSVBULCB0aGlzLnBhY2thZ2UucHJvamVuQ29tbWFuZCk7XG5cbiAgICB0aGlzLm5wbWlnbm9yZT8uZXhjbHVkZShgLyR7UFJPSkVOX1JDfWApO1xuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKGAvJHtQUk9KRU5fRElSfS9gKTtcbiAgICB0aGlzLmdpdGlnbm9yZS5pbmNsdWRlKGAvJHtQUk9KRU5fUkN9YCk7XG5cbiAgICBjb25zdCBwcm9qZW4gPSBvcHRpb25zLnByb2plbkRldkRlcGVuZGVuY3kgPz8gdHJ1ZTtcbiAgICBpZiAocHJvamVuKSB7XG4gICAgICBjb25zdCBwb3N0Zml4ID0gb3B0aW9ucy5wcm9qZW5WZXJzaW9uID8gYEAke29wdGlvbnMucHJvamVuVmVyc2lvbn1gIDogJyc7XG4gICAgICB0aGlzLmFkZERldkRlcHMoYHByb2plbiR7cG9zdGZpeH1gKTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuZGVmYXVsdFJlbGVhc2VCcmFuY2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCJkZWZhdWx0UmVsZWFzZUJyYW5jaFwiIGlzIHRlbXBvcmFyaWx5IGEgcmVxdWlyZWQgb3B0aW9uIHdoaWxlIHdlIG1pZ3JhdGUgaXRzIGRlZmF1bHQgdmFsdWUgZnJvbSBcIm1hc3RlclwiIHRvIFwibWFpblwiJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRFbmFibGVkID0gb3B0aW9ucy5idWlsZFdvcmtmbG93ID8/ICh0aGlzLnBhcmVudCA/IGZhbHNlIDogdHJ1ZSk7XG4gICAgY29uc3QgbXV0YWJsZUJ1aWxkcyA9IG9wdGlvbnMubXV0YWJsZUJ1aWxkID8/IHRydWU7XG5cbiAgICAvLyBpbmRpY2F0ZSBpZiB3ZSBoYXZlIGFudGktdGFtcGVyIGNvbmZpZ3VyZWQgaW4gb3VyIHdvcmtmbG93cy4gdXNlZCBieSBlLmcuIEplc3RcbiAgICAvLyB0byBkZWNpZGUgaWYgd2UgY2FuIGFsd2F5cyBydW4gd2l0aCAtLXVwZGF0ZVNuYXBzaG90XG4gICAgdGhpcy5hbnRpdGFtcGVyID0gYnVpbGRFbmFibGVkICYmIChvcHRpb25zLmFudGl0YW1wZXIgPz8gdHJ1ZSk7XG5cbiAgICAvLyBjb25maWd1cmUgamVzdCBpZiBlbmFibGVkXG4gICAgLy8gbXVzdCBiZSBiZWZvcmUgdGhlIGJ1aWxkL3JlbGVhc2Ugd29ya2Zsb3dzXG4gICAgaWYgKG9wdGlvbnMuamVzdCA/PyB0cnVlKSB7XG4gICAgICB0aGlzLmplc3QgPSBuZXcgSmVzdCh0aGlzLCBvcHRpb25zLmplc3RPcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoYnVpbGRFbmFibGVkKSB7XG4gICAgICBjb25zdCBicmFuY2ggPSAnJHt7IGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QuaGVhZC5yZWYgfX0nO1xuICAgICAgY29uc3QgcmVwbyA9ICcke3sgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5oZWFkLnJlcG8uZnVsbF9uYW1lIH19JztcbiAgICAgIGNvbnN0IGJ1aWxkSm9iSWQgPSAnYnVpbGQnO1xuXG4gICAgICBjb25zdCBwb3N0QnVpbGRTdGVwcyA9IG5ldyBBcnJheTxhbnk+KCk7XG4gICAgICBjb25zdCBnaXREaWZmU3RlcElkID0gJ2dpdF9kaWZmJztcbiAgICAgIGNvbnN0IGhhc0NoYW5nZXNDb25kTmFtZSA9ICdoYXNfY2hhbmdlcyc7XG4gICAgICBjb25zdCBoYXNDaGFuZ2VzID0gYHN0ZXBzLiR7Z2l0RGlmZlN0ZXBJZH0ub3V0cHV0cy4ke2hhc0NoYW5nZXNDb25kTmFtZX1gO1xuXG4gICAgICAvLyBkaXNhYmxlIGFudGktdGFtcGVyIGlmIGJ1aWxkIHdvcmtmbG93IGlzIG11dGFibGVcbiAgICAgIGNvbnN0IGFudGl0YW1wZXJTdGVwcyA9ICghbXV0YWJsZUJ1aWxkcyA/PyB0aGlzLmFudGl0YW1wZXIpID8gW3tcbiAgICAgICAgLy8gYW50aS10YW1wZXIgY2hlY2sgKGZhaWxzIGlmIHRoZXJlIHdlcmUgY2hhbmdlcyB0byBjb21taXR0ZWQgZmlsZXMpXG4gICAgICAgIC8vIHRoaXMgd2lsbCBpZGVudGlmeSBhbnkgbm9uLWNvbW1pdHRlZCBmaWxlcyBnZW5lcmF0ZWQgZHVyaW5nIGJ1aWxkIChlLmcuIHRlc3Qgc25hcHNob3RzKVxuICAgICAgICBuYW1lOiAnQW50aS10YW1wZXIgY2hlY2snLFxuICAgICAgICBydW46ICdnaXQgZGlmZiAtLWlnbm9yZS1zcGFjZS1hdC1lb2wgLS1leGl0LWNvZGUnLFxuICAgICAgfV0gOiBbXTtcblxuICAgICAgLy8gcnVuIGNvZGVjb3YgaWYgZW5hYmxlZCBvciBhIHNlY3JldCB0b2tlbiBuYW1lIGlzIHBhc3NlZCBpblxuICAgICAgLy8gQU5EIGplc3QgbXVzdCBiZSBjb25maWd1cmVkXG4gICAgICBpZiAoKG9wdGlvbnMuY29kZUNvdiB8fCBvcHRpb25zLmNvZGVDb3ZUb2tlblNlY3JldCkgJiYgdGhpcy5qZXN0Py5jb25maWcpIHtcbiAgICAgICAgcG9zdEJ1aWxkU3RlcHMucHVzaCh7XG4gICAgICAgICAgbmFtZTogJ1VwbG9hZCBjb3ZlcmFnZSB0byBDb2RlY292JyxcbiAgICAgICAgICB1c2VzOiAnY29kZWNvdi9jb2RlY292LWFjdGlvbkB2MScsXG4gICAgICAgICAgd2l0aDogb3B0aW9ucy5jb2RlQ292VG9rZW5TZWNyZXQgPyB7XG4gICAgICAgICAgICB0b2tlbjogYFxcJHt7IHNlY3JldHMuJHtvcHRpb25zLmNvZGVDb3ZUb2tlblNlY3JldH0gfX1gLFxuICAgICAgICAgICAgZGlyZWN0b3J5OiB0aGlzLmplc3QuY29uZmlnLmNvdmVyYWdlRGlyZWN0b3J5LFxuICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHRoaXMuamVzdC5jb25maWcuY292ZXJhZ2VEaXJlY3RvcnksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHVzZSBcImdpdCBkaWZmIC0tZXhpdCBjb2RlXCIgdG8gY2hlY2sgaWYgdGhlcmUgd2VyZSBjaGFuZ2VzIGluIHRoZSByZXBvXG4gICAgICAvLyBhbmQgY3JlYXRlIGEgc3RlcCBvdXRwdXQgdGhhdCB3aWxsIGJlIHVzZWQgaW4gc3Vic2VxdWVudCBzdGVwcy5cbiAgICAgIHBvc3RCdWlsZFN0ZXBzLnB1c2goe1xuICAgICAgICBuYW1lOiAnQ2hlY2sgZm9yIGNoYW5nZXMnLFxuICAgICAgICBpZDogZ2l0RGlmZlN0ZXBJZCxcbiAgICAgICAgcnVuOiBgZ2l0IGRpZmYgLS1leGl0LWNvZGUgfHwgZWNobyBcIjo6c2V0LW91dHB1dCBuYW1lPSR7aGFzQ2hhbmdlc0NvbmROYW1lfTo6dHJ1ZVwiYCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBvbmx5IGlmIHdlIGhhZCBjaGFuZ2VzLCBjb21taXQgdGhlbSBhbmQgcHVzaCB0byB0aGUgcmVwbyBub3RlIHRoYXQgZm9yXG4gICAgICAvLyBmb3JrcywgdGhpcyB3aWxsIGZhaWwgKGJlY2F1c2UgdGhlIHdvcmtmbG93IGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9ucy5cbiAgICAgIC8vIHRoaXMgaW5kaWNhdGVzIHRvIHVzZXJzIHRoYXQgdGhleSBuZWVkIHRvIHVwZGF0ZSB0aGVpciBicmFuY2ggbWFudWFsbHkuXG4gICAgICBwb3N0QnVpbGRTdGVwcy5wdXNoKHtcbiAgICAgICAgaWY6IGhhc0NoYW5nZXMsXG4gICAgICAgIG5hbWU6ICdDb21taXQgYW5kIHB1c2ggY2hhbmdlcyAoaWYgY2hhbmdlZCknLFxuICAgICAgICBydW46IGBnaXQgYWRkIC4gJiYgZ2l0IGNvbW1pdCAtbSBcImNob3JlOiBzZWxmIG11dGF0aW9uXCIgJiYgZ2l0IHB1c2ggb3JpZ2luIEhFQUQ6JHticmFuY2h9YCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBpZiB3ZSBwdXNoZWQgY2hhbmdlcywgd2UgbmVlZCB0byBtYW51YWxseSB1cGRhdGUgdGhlIHN0YXR1cyBjaGVjayBzb1xuICAgICAgLy8gdGhhdCB0aGUgUFIgd2lsbCBiZSBncmVlbiAod2Ugd29uJ3QgZ2V0IGhlcmUgZm9yIGZvcmtzIHdpdGggdXBkYXRlc1xuICAgICAgLy8gYmVjYXVzZSB0aGUgcHVzaCB3b3VsZCBoYXZlIGZhaWxlZCkuXG4gICAgICBwb3N0QnVpbGRTdGVwcy5wdXNoKHtcbiAgICAgICAgaWY6IGhhc0NoYW5nZXMsXG4gICAgICAgIG5hbWU6ICdVcGRhdGUgc3RhdHVzIGNoZWNrIChpZiBjaGFuZ2VkKScsXG4gICAgICAgIHJ1bjogW1xuICAgICAgICAgICdnaCBhcGknLFxuICAgICAgICAgICctWCBQT1NUJyxcbiAgICAgICAgICBgL3JlcG9zLyR7cmVwb30vY2hlY2stcnVuc2AsXG4gICAgICAgICAgYC1GIG5hbWU9XCIke2J1aWxkSm9iSWR9XCJgLFxuICAgICAgICAgICctRiBoZWFkX3NoYT1cIiQoZ2l0IHJldi1wYXJzZSBIRUFEKVwiJyxcbiAgICAgICAgICAnLUYgc3RhdHVzPVwiY29tcGxldGVkXCInLFxuICAgICAgICAgICctRiBjb25jbHVzaW9uPVwic3VjY2Vzc1wiJyxcbiAgICAgICAgXS5qb2luKCcgJyksXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gaWYgd2UgcHVzaGVkIGNoYW5nZXMsIHdlIG5lZWQgdG8gbWFyayB0aGUgY3VycmVudCBjb21taXQgYXMgZmFpbGVkLCBzb1xuICAgICAgLy8gdGhhdCBHaXRIdWIgYXV0by1tZXJnZSBkb2VzIG5vdCByaXNrIG1lcmdpbmcgdGhpcyBjb21taXQgYmVmb3JlIHRoZVxuICAgICAgLy8gZXZlbnQgZm9yIHRoZSBuZXcgY29tbWl0IGhhcyByZWdpc3RlcmVkLlxuICAgICAgcG9zdEJ1aWxkU3RlcHMucHVzaCh7XG4gICAgICAgIGlmOiBoYXNDaGFuZ2VzLFxuICAgICAgICBuYW1lOiAnQ2FuY2VsIHdvcmtmbG93IChpZiBjaGFuZ2VkKScsXG4gICAgICAgIHJ1bjogW1xuICAgICAgICAgICdnaCBhcGknLFxuICAgICAgICAgICctWCBQT1NUJyxcbiAgICAgICAgICBgL3JlcG9zLyR7cmVwb30vYWN0aW9ucy9ydW5zL1xcJHt7IGdpdGh1Yi5ydW5faWQgfX0vY2FuY2VsYCxcbiAgICAgICAgXS5qb2luKCcgJyksXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgcG9zdEJ1aWxkU3RlcHMucHVzaCguLi5hbnRpdGFtcGVyU3RlcHMpO1xuXG4gICAgICBpZiAodGhpcy5naXRodWIpIHtcbiAgICAgICAgdGhpcy5idWlsZFdvcmtmbG93ID0gbmV3IFRhc2tXb3JrZmxvdyh0aGlzLmdpdGh1Yiwge1xuICAgICAgICAgIGdpdElkZW50aXR5OiB0aGlzLndvcmtmbG93R2l0SWRlbnRpdHksXG4gICAgICAgICAgbmFtZTogJ2J1aWxkJyxcbiAgICAgICAgICBqb2JJZDogYnVpbGRKb2JJZCxcbiAgICAgICAgICB0cmlnZ2Vyczoge1xuICAgICAgICAgICAgcHVsbFJlcXVlc3Q6IHsgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgQ0k6ICd0cnVlJywgLy8gd2lsbCBjYXVzZSBgTm9kZVByb2plY3RgIHRvIGV4ZWN1dGUgYHlhcm4gaW5zdGFsbGAgd2l0aCBgLS1mcm96ZW4tbG9ja2ZpbGVgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgICAgY2hlY2tzOiBKb2JQZXJtaXNzaW9uLldSSVRFLFxuICAgICAgICAgICAgY29udGVudHM6IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICAgICAgICBhY3Rpb25zOiBKb2JQZXJtaXNzaW9uLldSSVRFLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2hlY2tvdXRXaXRoOiBtdXRhYmxlQnVpbGRzID8ge1xuICAgICAgICAgICAgcmVmOiBicmFuY2gsXG4gICAgICAgICAgICByZXBvc2l0b3J5OiByZXBvLFxuICAgICAgICAgIH0gOiB1bmRlZmluZWQsXG5cbiAgICAgICAgICBwcmVCdWlsZFN0ZXBzOiBbXG4gICAgICAgICAgICAuLi5hbnRpdGFtcGVyU3RlcHMsXG4gICAgICAgICAgICAuLi50aGlzLmluc3RhbGxXb3JrZmxvd1N0ZXBzLCAvLyBpbnN0YWxsIGRlcGVuZGVuY2llcyBzdGVwc1xuICAgICAgICAgIF0sXG5cbiAgICAgICAgICB0YXNrOiB0aGlzLmJ1aWxkVGFzayxcblxuICAgICAgICAgIHBvc3RCdWlsZFN0ZXBzLFxuXG4gICAgICAgICAgY29udGFpbmVyOiBvcHRpb25zLndvcmtmbG93Q29udGFpbmVySW1hZ2UgPyB7IGltYWdlOiBvcHRpb25zLndvcmtmbG93Q29udGFpbmVySW1hZ2UgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYnVpbGRXb3JrZmxvd0pvYklkID0gYnVpbGRKb2JJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZWxlYXNlID0gb3B0aW9ucy5yZWxlYXNlID8/IG9wdGlvbnMucmVsZWFzZVdvcmtmbG93ID8/ICh0aGlzLnBhcmVudCA/IGZhbHNlIDogdHJ1ZSk7XG4gICAgaWYgKHJlbGVhc2UpIHtcbiAgICAgIHRoaXMuYWRkRGV2RGVwcyhWZXJzaW9uLlNUQU5EQVJEX1ZFUlNJT04pO1xuXG4gICAgICB0aGlzLnJlbGVhc2UgPSBuZXcgUmVsZWFzZSh0aGlzLCB7XG4gICAgICAgIHZlcnNpb25GaWxlOiAncGFja2FnZS5qc29uJywgLy8gdGhpcyBpcyB3aGVyZSBcInZlcnNpb25cIiBpcyBzZXQgYWZ0ZXIgYnVtcFxuICAgICAgICB0YXNrOiB0aGlzLmJ1aWxkVGFzayxcbiAgICAgICAgYnJhbmNoOiBvcHRpb25zLmRlZmF1bHRSZWxlYXNlQnJhbmNoID8/ICdtYWluJyxcbiAgICAgICAgLi4ub3B0aW9ucyxcblxuICAgICAgICByZWxlYXNlV29ya2Zsb3dTZXR1cFN0ZXBzOiBbXG4gICAgICAgICAgLi4udGhpcy5pbnN0YWxsV29ya2Zsb3dTdGVwcyxcbiAgICAgICAgICAuLi5vcHRpb25zLnJlbGVhc2VXb3JrZmxvd1NldHVwU3RlcHMgPz8gW10sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5wdWJsaXNoZXIgPSB0aGlzLnJlbGVhc2UucHVibGlzaGVyO1xuXG4gICAgICBpZiAob3B0aW9ucy5yZWxlYXNlVG9OcG0gPz8gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5yZWxlYXNlLnB1Ymxpc2hlci5wdWJsaXNoVG9OcG0oe1xuICAgICAgICAgIGRpc3RUYWc6IHRoaXMucGFja2FnZS5ucG1EaXN0VGFnLFxuICAgICAgICAgIHJlZ2lzdHJ5OiB0aGlzLnBhY2thZ2UubnBtUmVnaXN0cnksXG4gICAgICAgICAgbnBtVG9rZW5TZWNyZXQ6IHRoaXMucGFja2FnZS5ucG1Ub2tlblNlY3JldCxcbiAgICAgICAgICBjb2RlQXJ0aWZhY3RPcHRpb25zOiB7XG4gICAgICAgICAgICBhY2Nlc3NLZXlJZFNlY3JldDogb3B0aW9ucy5jb2RlQXJ0aWZhY3RPcHRpb25zPy5hY2Nlc3NLZXlJZFNlY3JldCxcbiAgICAgICAgICAgIHNlY3JldEFjY2Vzc0tleVNlY3JldDogb3B0aW9ucy5jb2RlQXJ0aWZhY3RPcHRpb25zPy5zZWNyZXRBY2Nlc3NLZXlTZWNyZXQsXG4gICAgICAgICAgICByb2xlVG9Bc3N1bWU6IG9wdGlvbnMuY29kZUFydGlmYWN0T3B0aW9ucz8ucm9sZVRvQXNzdW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHZhbGlkYXRlIHRoYXQgbm8gcmVsZWFzZSBvcHRpb25zIGFyZSBzZWxlY3RlZCBpZiB0aGUgcmVsZWFzZSB3b3JrZmxvdyBpcyBkaXNhYmxlZC5cbiAgICAgIGlmIChvcHRpb25zLnJlbGVhc2VUb05wbSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wicmVsZWFzZVRvTnBtXCIgaXMgbm90IHN1cHBvcnRlZCBmb3IgQVBQIHByb2plY3RzJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnJlbGVhc2VFdmVyeUNvbW1pdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wicmVsZWFzZUV2ZXJ5Q29tbWl0XCIgaXMgbm90IHN1cHBvcnRlZCBmb3IgQVBQIHByb2plY3RzJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnJlbGVhc2VTY2hlZHVsZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wicmVsZWFzZVNjaGVkdWxlXCIgaXMgbm90IHN1cHBvcnRlZCBmb3IgQVBQIHByb2plY3RzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2l0aHViPy5tZXJnaWZ5KSB7XG4gICAgICB0aGlzLmF1dG9NZXJnZSA9IG5ldyBBdXRvTWVyZ2UodGhpcy5naXRodWIsIHtcbiAgICAgICAgYnVpbGRKb2I6IHRoaXMuYnVpbGRXb3JrZmxvd0pvYklkLFxuICAgICAgICAuLi5vcHRpb25zLmF1dG9NZXJnZU9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXBlbmRhYm90ID0gb3B0aW9ucy5kZXBlbmRhYm90ID8/IGZhbHNlO1xuICAgIGNvbnN0IGRlcHNVcGdyYWRlID0gb3B0aW9ucy5kZXBzVXBncmFkZSA/PyAhZGVwZW5kYWJvdDtcblxuICAgIGlmIChkZXBlbmRhYm90ICYmIGRlcHNVcGdyYWRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCInZGVwZW5kYWJvdCcgY2Fubm90IGJlIGNvbmZpZ3VyZWQgdG9nZXRoZXIgd2l0aCAnZGVwc1VwZ3JhZGUnXCIpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnByb2plblVwZ3JhZGVBdXRvTWVyZ2UgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmF1dG9BcHByb3ZlUHJvamVuVXBncmFkZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ3Byb2plblVwZ3JhZGVBdXRvTWVyZ2UnIGNhbm5vdCBiZSBjb25maWd1cmVkIHRvZ2V0aGVyIHdpdGggJ2F1dG9BcHByb3ZlUHJvamVuVXBncmFkZXMnXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plbkF1dG9BcHByb3ZlID0gb3B0aW9ucy5hdXRvQXBwcm92ZVByb2plblVwZ3JhZGVzID8/IChvcHRpb25zLnByb2plblVwZ3JhZGVBdXRvTWVyZ2UgPz8gZmFsc2UpO1xuICAgIGNvbnN0IGRlcHNBdXRvQXBwcm92ZSA9IG9wdGlvbnMuYXV0b0FwcHJvdmVVcGdyYWRlcyA/PyBmYWxzZTtcblxuICAgIGlmIChwcm9qZW5BdXRvQXBwcm92ZSAmJiAhdGhpcy5hdXRvQXBwcm92ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRvYW10aWMgYXBwcm92YWwgb2YgcHJvamVuIHVwZ3JhZGVzIHJlcXVpcmVzIGNvbmZpZ3VyaW5nIGBhdXRvQXBwcm92ZU9wdGlvbnNgJyk7XG4gICAgfVxuXG4gICAgaWYgKGRlcHNBdXRvQXBwcm92ZSAmJiAhdGhpcy5hdXRvQXBwcm92ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRvYW10aWMgYXBwcm92YWwgb2YgZGVwZW5kZW5jaWVzIHVwZ3JhZGVzIHJlcXVpcmVzIGNvbmZpZ3VyaW5nIGBhdXRvQXBwcm92ZU9wdGlvbnNgJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYXV0b0FwcHJvdmVMYWJlbCA9IChjb25kaXRpb246IGJvb2xlYW4pID0+IChjb25kaXRpb24gJiYgdGhpcy5hdXRvQXBwcm92ZT8ubGFiZWwpID8gW3RoaXMuYXV0b0FwcHJvdmUubGFiZWxdIDogdW5kZWZpbmVkO1xuXG4gICAgbGV0IGlnbm9yZXNQcm9qZW47XG4gICAgaWYgKGRlcGVuZGFib3QpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICBsYWJlbHM6IGF1dG9BcHByb3ZlTGFiZWwoZGVwc0F1dG9BcHByb3ZlKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBkZXBlbmRhYm90Q29uZiA9IHRoaXMuZ2l0aHViPy5hZGREZXBlbmRhYm90KGRlZXBNZXJnZShbZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMuZGVwZW5kYWJvdE9wdGlvbnMgPz8ge31dKSk7XG4gICAgICBpZ25vcmVzUHJvamVuID0gZGVwZW5kYWJvdENvbmY/Lmlnbm9yZXNQcm9qZW47XG4gICAgfVxuXG4gICAgaWYgKGRlcHNVcGdyYWRlKSB7XG4gICAgICBjb25zdCBkZWZhdWx0T3B0aW9uczogVXBncmFkZURlcGVuZGVuY2llc09wdGlvbnMgPSB7XG4gICAgICAgIC8vIGlmIHByb2plbiBzZWNyZXQgaXMgZGVmaW5lZCB3ZSBjYW4gYWxzbyB1cGdyYWRlIHByb2plbiBoZXJlLlxuICAgICAgICBpZ25vcmVQcm9qZW46ICFvcHRpb25zLnByb2plblVwZ3JhZGVTZWNyZXQsXG4gICAgICAgIHdvcmtmbG93T3B0aW9uczoge1xuICAgICAgICAgIC8vIGlmIHByb2plbiBzZWNyZXQgaXMgZGVmaW5lZCwgdXNlIGl0IChvdGhlcndpc2UgZGVmYXVsdCB0byBHSVRIVUJfVE9LRU4pLlxuICAgICAgICAgIHNlY3JldDogb3B0aW9ucy5wcm9qZW5VcGdyYWRlU2VjcmV0LFxuICAgICAgICAgIGNvbnRhaW5lcjogb3B0aW9ucy53b3JrZmxvd0NvbnRhaW5lckltYWdlID8ge1xuICAgICAgICAgICAgaW1hZ2U6IG9wdGlvbnMud29ya2Zsb3dDb250YWluZXJJbWFnZSxcbiAgICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgIGxhYmVsczogYXV0b0FwcHJvdmVMYWJlbChkZXBzQXV0b0FwcHJvdmUpLFxuICAgICAgICAgIGdpdElkZW50aXR5OiB0aGlzLndvcmtmbG93R2l0SWRlbnRpdHksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdXBncmFkZURlcGVuZGVuY2llcyA9IG5ldyBVcGdyYWRlRGVwZW5kZW5jaWVzKHRoaXMsIGRlZXBNZXJnZShbZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMuZGVwc1VwZ3JhZGVPcHRpb25zID8/IHt9XSkpO1xuICAgICAgaWdub3Jlc1Byb2plbiA9IHVwZ3JhZGVEZXBlbmRlbmNpZXMuaWdub3Jlc1Byb2plbjtcbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgYSBkZWRpY2F0ZWQgd29ya2Zsb3cgdG8gdXBncmFkZSBwcm9qZW4gaXRzZWxmIGlmIG5lZWRlZFxuICAgIGlmIChpZ25vcmVzUHJvamVuICYmIHRoaXMucGFja2FnZS5wYWNrYWdlTmFtZSAhPT0gJ3Byb2plbicpIHtcblxuICAgICAgbmV3IFVwZ3JhZGVEZXBlbmRlbmNpZXModGhpcywge1xuICAgICAgICBpbmNsdWRlOiBbJ3Byb2plbiddLFxuICAgICAgICB0YXNrTmFtZTogJ3VwZ3JhZGUtcHJvamVuJyxcbiAgICAgICAgcHVsbFJlcXVlc3RUaXRsZTogJ3VwZ3JhZGUgcHJvamVuJyxcbiAgICAgICAgaWdub3JlUHJvamVuOiBmYWxzZSxcbiAgICAgICAgd29ya2Zsb3c6ICEhb3B0aW9ucy5wcm9qZW5VcGdyYWRlU2VjcmV0LFxuICAgICAgICB3b3JrZmxvd09wdGlvbnM6IHtcbiAgICAgICAgICBzY2hlZHVsZTogVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlLmV4cHJlc3Npb25zKG9wdGlvbnMucHJvamVuVXBncmFkZVNjaGVkdWxlID8/IFsnMCA2ICogKiAqJ10pLFxuICAgICAgICAgIGNvbnRhaW5lcjogb3B0aW9ucy53b3JrZmxvd0NvbnRhaW5lckltYWdlID8geyBpbWFnZTogb3B0aW9ucy53b3JrZmxvd0NvbnRhaW5lckltYWdlIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgc2VjcmV0OiBvcHRpb25zLnByb2plblVwZ3JhZGVTZWNyZXQsXG4gICAgICAgICAgbGFiZWxzOiBhdXRvQXBwcm92ZUxhYmVsKHByb2plbkF1dG9BcHByb3ZlKSxcbiAgICAgICAgICBnaXRJZGVudGl0eTogdGhpcy53b3JrZmxvd0dpdElkZW50aXR5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucHVsbFJlcXVlc3RUZW1wbGF0ZSA/PyB0cnVlKSB7XG4gICAgICB0aGlzLmdpdGh1Yj8uYWRkUHVsbFJlcXVlc3RUZW1wbGF0ZSguLi5vcHRpb25zLnB1bGxSZXF1ZXN0VGVtcGxhdGVDb250ZW50cyA/PyBbXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVucmNKcyA9IG9wdGlvbnMucHJvamVucmNKcyA/PyAhb3B0aW9ucy5wcm9qZW5yY0pzb247XG4gICAgaWYgKHByb2plbnJjSnMpIHtcbiAgICAgIG5ldyBQcm9qZW5yYyh0aGlzLCBvcHRpb25zLnByb2plbnJjSnNPcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgYSBidW5kbGVyIGNvbXBvbmVudCAtIHRoaXMgZW5hYmxlcyB0aGluZ3MgbGlrZSBMYW1iZGEgYnVuZGxpbmcgYW5kIGluIHRoZSBmdXR1cmUgd2ViIGJ1bmRsaW5nLlxuICAgIHRoaXMuYnVuZGxlciA9IG5ldyBCdW5kbGVyKHRoaXMsIG9wdGlvbnMuYnVuZGxlck9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFkZEJpbnMoYmluczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgIHRoaXMucGFja2FnZS5hZGRCaW4oYmlucyk7XG4gIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyBzZXRTY3JpcHQobmFtZTogc3RyaW5nLCBjb21tYW5kOiBzdHJpbmcpIHtcbiAgICB0aGlzLnBhY2thZ2Uuc2V0U2NyaXB0KG5hbWUsIGNvbW1hbmQpO1xuICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyByZW1vdmVTY3JpcHQobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5wYWNrYWdlLnJlbW92ZVNjcmlwdChuYW1lKTtcbiAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBwdWJsaWMgaGFzU2NyaXB0KG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2UuaGFzU2NyaXB0KG5hbWUpO1xuICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyBhZGRDb21waWxlQ29tbWFuZCguLi5jb21tYW5kczogc3RyaW5nW10pIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgY29tbWFuZHMpIHtcbiAgICAgIHRoaXMuY29tcGlsZVRhc2suZXhlYyhjKTtcbiAgICB9XG4gIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIGFkZFRlc3RDb21tYW5kKC4uLmNvbW1hbmRzOiBzdHJpbmdbXSkge1xuICAgIGZvciAoY29uc3QgYyBvZiBjb21tYW5kcykge1xuICAgICAgdGhpcy50ZXN0VGFzay5leGVjKGMpO1xuICAgIH1cbiAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBwdWJsaWMgYWRkRmllbGRzKGZpZWxkczogeyBbbmFtZTogc3RyaW5nXTogYW55IH0pIHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmllbGRzKSkge1xuICAgICAgdGhpcy5wYWNrYWdlLmFkZEZpZWxkKG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyBhZGRLZXl3b3JkcyguLi5rZXl3b3Jkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLnBhY2thZ2UuYWRkS2V5d29yZHMoLi4ua2V5d29yZHMpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnN0YWxsV29ya2Zsb3dTdGVwcygpOiBKb2JTdGVwW10ge1xuICAgIGNvbnN0IGluc3RhbGwgPSBuZXcgQXJyYXk8Sm9iU3RlcD4oKTtcblxuICAgIC8vIGZpcnN0IHJ1biB0aGUgd29ya2Zsb3cgYm9vdHN0cmFwIHN0ZXBzXG4gICAgaW5zdGFsbC5wdXNoKC4uLnRoaXMud29ya2Zsb3dCb290c3RyYXBTdGVwcyk7XG5cbiAgICBpZiAodGhpcy5ub2RlVmVyc2lvbikge1xuICAgICAgaW5zdGFsbC5wdXNoKHtcbiAgICAgICAgbmFtZTogJ1NldHVwIE5vZGUuanMnLFxuICAgICAgICB1c2VzOiAnYWN0aW9ucy9zZXR1cC1ub2RlQHYyLjIuMCcsXG4gICAgICAgIHdpdGg6IHsgJ25vZGUtdmVyc2lvbic6IHRoaXMubm9kZVZlcnNpb24gfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBhY2thZ2UucGFja2FnZU1hbmFnZXIgPT09IE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNKSB7XG4gICAgICBpbnN0YWxsLnB1c2goe1xuICAgICAgICBuYW1lOiAnU2V0dXAgcG5wbScsXG4gICAgICAgIHVzZXM6ICdwbnBtL2FjdGlvbi1zZXR1cEB2Mi4wLjEnLFxuICAgICAgICB3aXRoOiB7IHZlcnNpb246ICc2LjE0LjcnIH0sIC8vIGN1cnJlbnQgbGF0ZXN0LiBTaG91bGQgcHJvYmFibHkgYmVjb21lIHR1bmFibGUuXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpbnN0YWxsLnB1c2goe1xuICAgICAgbmFtZTogJ0luc3RhbGwgZGVwZW5kZW5jaWVzJyxcbiAgICAgIHJ1bjogdGhpcy5wYWNrYWdlLmluc3RhbGxDb21tYW5kLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGluc3RhbGw7XG4gIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBwdWJsaWMgYWRkRGVwcyguLi5kZXBzOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2UuYWRkRGVwcyguLi5kZXBzKTtcbiAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBwdWJsaWMgYWRkRGV2RGVwcyguLi5kZXBzOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2UuYWRkRGV2RGVwcyguLi5kZXBzKTtcbiAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyBhZGRQZWVyRGVwcyguLi5kZXBzOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2UuYWRkUGVlckRlcHMoLi4uZGVwcyk7XG4gIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyBhZGRCdW5kbGVkRGVwcyguLi5kZXBzOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2UuYWRkQnVuZGxlZERlcHMoLi4uZGVwcyk7XG4gIH1cblxuICBwdWJsaWMgYWRkUGFja2FnZUlnbm9yZShwYXR0ZXJuOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5wbWlnbm9yZT8uYWRkUGF0dGVybnMocGF0dGVybik7XG4gIH1cblxuICBwcml2YXRlIGFkZExpY2Vuc2Uob3B0aW9uczogTm9kZVByb2plY3RPcHRpb25zKSB7XG4gICAgaWYgKHRoaXMucGFja2FnZS5saWNlbnNlKSB7XG4gICAgICBuZXcgTGljZW5zZSh0aGlzLCB7XG4gICAgICAgIHNwZHg6IHRoaXMucGFja2FnZS5saWNlbnNlLFxuICAgICAgICBjb3B5cmlnaHRPd25lcjogb3B0aW9ucy5jb3B5cmlnaHRPd25lciA/PyBvcHRpb25zLmF1dGhvck5hbWUsXG4gICAgICAgIGNvcHlyaWdodFBlcmlvZDogb3B0aW9ucy5jb3B5cmlnaHRQZXJpb2QsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZERlZmF1bHRHaXRJZ25vcmUoKSB7XG4gICAgdGhpcy5naXRpZ25vcmUuZXhjbHVkZShcbiAgICAgICcjIExvZ3MnLFxuICAgICAgJ2xvZ3MnLFxuICAgICAgJyoubG9nJyxcbiAgICAgICducG0tZGVidWcubG9nKicsXG4gICAgICAneWFybi1kZWJ1Zy5sb2cqJyxcbiAgICAgICd5YXJuLWVycm9yLmxvZyonLFxuICAgICAgJ2xlcm5hLWRlYnVnLmxvZyonLFxuXG4gICAgICAnIyBEaWFnbm9zdGljIHJlcG9ydHMgKGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcmVwb3J0Lmh0bWwpJyxcbiAgICAgICdyZXBvcnQuWzAtOV0qLlswLTldKi5bMC05XSouWzAtOV0qLmpzb24nLFxuXG4gICAgICAnIyBSdW50aW1lIGRhdGEnLFxuICAgICAgJ3BpZHMnLFxuICAgICAgJyoucGlkJyxcbiAgICAgICcqLnNlZWQnLFxuICAgICAgJyoucGlkLmxvY2snLFxuXG4gICAgICAnIyBEaXJlY3RvcnkgZm9yIGluc3RydW1lbnRlZCBsaWJzIGdlbmVyYXRlZCBieSBqc2NvdmVyYWdlL0pTQ292ZXInLFxuICAgICAgJ2xpYi1jb3YnLFxuXG4gICAgICAnIyBDb3ZlcmFnZSBkaXJlY3RvcnkgdXNlZCBieSB0b29scyBsaWtlIGlzdGFuYnVsJyxcbiAgICAgICdjb3ZlcmFnZScsXG4gICAgICAnKi5sY292JyxcblxuICAgICAgJyMgbnljIHRlc3QgY292ZXJhZ2UnLFxuICAgICAgJy5ueWNfb3V0cHV0JyxcblxuICAgICAgJyMgQ29tcGlsZWQgYmluYXJ5IGFkZG9ucyAoaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9hZGRvbnMuaHRtbCknLFxuICAgICAgJ2J1aWxkL1JlbGVhc2UnLFxuXG4gICAgICAnIyBEZXBlbmRlbmN5IGRpcmVjdG9yaWVzJyxcbiAgICAgICdub2RlX21vZHVsZXMvJyxcbiAgICAgICdqc3BtX3BhY2thZ2VzLycsXG5cbiAgICAgICcjIFR5cGVTY3JpcHQgY2FjaGUnLFxuICAgICAgJyoudHNidWlsZGluZm8nLFxuXG5cbiAgICAgICcjIE9wdGlvbmFsIGVzbGludCBjYWNoZScsXG4gICAgICAnLmVzbGludGNhY2hlJyxcblxuICAgICAgJyMgT3V0cHV0IG9mIFxcJ25wbSBwYWNrXFwnJyxcbiAgICAgICcqLnRneicsXG5cbiAgICAgICcjIFlhcm4gSW50ZWdyaXR5IGZpbGUnLFxuICAgICAgJy55YXJuLWludGVncml0eScsXG5cbiAgICAgICcjIHBhcmNlbC1idW5kbGVyIGNhY2hlIChodHRwczovL3BhcmNlbGpzLm9yZy8pJyxcbiAgICAgICcuY2FjaGUnLFxuICAgICk7XG4gIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIHJ1blRhc2tDb21tYW5kKHRhc2s6IFRhc2spIHtcbiAgICByZXR1cm4gYCR7dGhpcy5wYWNrYWdlLnByb2plbkNvbW1hbmR9ICR7dGFzay5uYW1lfWA7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlV29ya2Zsb3dTdGVwcyB7XG4gIHJlYWRvbmx5IGFudGl0YW1wZXI6IGFueVtdO1xuICByZWFkb25seSBpbnN0YWxsOiBhbnlbXTtcbn1cbiJdfQ==
|