projen 0.100.6 → 0.101.0
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 +714 -116
- 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 +9 -9
- package/lib/awscdk/integ-runner.js +9 -3
- package/lib/awscdk/integration-test.js +12 -6
- 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 +5 -5
- package/lib/cdk/jsii-docgen.js +3 -3
- package/lib/cdk/jsii-project.js +1 -1
- package/lib/cdk8s/auto-discover.js +2 -2
- package/lib/cdk8s/cdk8s-app-py.js +3 -3
- package/lib/cdk8s/cdk8s-app-ts.js +4 -4
- 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 +17 -10
- package/lib/cdktf/cdktf-construct.js +1 -1
- package/lib/circleci/circleci.js +1 -1
- package/lib/cli/cmds/run-task.js +4 -1
- package/lib/cli/task-runtime.js +152 -78
- package/lib/common.d.ts +1 -1
- package/lib/common.js +2 -2
- package/lib/component.js +1 -1
- 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 +2 -1
- package/lib/ini.js +1 -1
- package/lib/java/java-project.js +1 -1
- package/lib/java/junit.js +3 -3
- package/lib/java/maven-compile.js +3 -3
- package/lib/java/maven-packaging.js +3 -3
- package/lib/java/maven-sample.js +1 -1
- package/lib/java/pom.js +2 -2
- package/lib/java/projenrc.js +3 -3
- package/lib/javascript/biome/biome.js +1 -1
- package/lib/javascript/bundler.js +3 -3
- package/lib/javascript/eslint.js +1 -1
- package/lib/javascript/jest.js +4 -4
- package/lib/javascript/license-checker.js +5 -5
- package/lib/javascript/node-package.js +1 -1
- package/lib/javascript/node-project.js +13 -4
- package/lib/javascript/npm-config.js +1 -1
- package/lib/javascript/prettier.js +1 -1
- package/lib/javascript/projenrc.js +3 -3
- package/lib/javascript/typescript-config.js +2 -2
- package/lib/javascript/upgrade-dependencies.js +4 -4
- 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 +17 -5
- package/lib/python/poetry.js +7 -7
- package/lib/python/projenrc.js +3 -3
- 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.js +1 -1
- 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 +8 -3
- package/lib/python/uv.js +6 -6
- package/lib/python/venv.js +1 -1
- package/lib/readme.js +1 -1
- package/lib/release/bump-version.d.ts +1 -1
- package/lib/release/bump-version.js +6 -2
- 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 +141 -129
- package/lib/sample-file.js +2 -2
- package/lib/source-code.js +1 -1
- package/lib/task-model.d.ts +144 -4
- package/lib/task-model.js +1 -1
- package/lib/task-shell.d.ts +63 -0
- package/lib/task-shell.js +87 -0
- package/lib/task.d.ts +52 -2
- package/lib/task.js +71 -10
- package/lib/tasks.d.ts +13 -0
- package/lib/tasks.js +19 -2
- package/lib/testing.js +1 -1
- package/lib/textfile.js +1 -1
- package/lib/toml.js +1 -1
- package/lib/typescript/projenrc-ts.js +1 -1
- package/lib/typescript/projenrc.js +1 -1
- package/lib/typescript/typescript-typedoc.js +9 -3
- package/lib/typescript/typescript.js +8 -10
- package/lib/util/exec.d.ts +34 -70
- package/lib/util/exec.js +57 -51
- package/lib/version.d.ts +1 -1
- package/lib/version.js +5 -5
- 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 +9 -9
- package/lib/web/postcss.js +1 -1
- package/lib/web/react.js +7 -7
- package/lib/web/tailwind.js +1 -1
- package/lib/xmlfile.js +1 -1
- package/lib/yaml.js +1 -1
- package/package.json +4 -4
|
@@ -180,9 +180,13 @@ async function bump(cwd, options) {
|
|
|
180
180
|
* Determine based on releaseable commits whether we should release or not
|
|
181
181
|
*/
|
|
182
182
|
async function hasNewInterestingCommits(options) {
|
|
183
|
-
|
|
183
|
+
// `$LATEST_TAG` is provided to the command as an environment variable
|
|
184
|
+
// (rather than interpolated into the command string), consistent with how
|
|
185
|
+
// `nextVersionCommand` receives it.
|
|
186
|
+
const findCommits = options.releasableCommits ?? version_1.ReleasableCommits.everyCommit().cmd;
|
|
184
187
|
const commitsSinceLastTag = (await exec_1.rawShell.tryCapture(findCommits, {
|
|
185
188
|
cwd: options.cwd,
|
|
189
|
+
env: { LATEST_TAG: options.latestTag },
|
|
186
190
|
}))?.split("\n");
|
|
187
191
|
const numCommitsSinceLastTag = commitsSinceLastTag?.length ?? 0;
|
|
188
192
|
logging.info(`Number of commits since ${options.latestTag}: ${numCommitsSinceLastTag}`);
|
|
@@ -285,4 +289,4 @@ function determineLatestTag(options) {
|
|
|
285
289
|
}
|
|
286
290
|
return { latestVersion, latestTag, isFirstRelease };
|
|
287
291
|
}
|
|
288
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVtcC12ZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlbGVhc2UvYnVtcC12ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0pBLG9CQTBKQztBQTlTRCwyQkFBZ0Q7QUFDaEQsK0JBQXFDO0FBRXJDLG1DQUFpQztBQUNqQyxvREFBc0M7QUFFdEMsMkNBS3FCO0FBQ3JCLHVDQUE2QztBQUM3Qyx3Q0FBK0M7QUFDL0MsNkRBQTJEO0FBNkgzRDs7Ozs7Ozs7R0FRRztBQUNJLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBVyxFQUFFLE9BQW9CO0lBQzFELE1BQU0sV0FBVyxHQUFHLElBQUEsV0FBSSxFQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztJQUN0QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ25DLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7SUFDbkMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQztJQUNoRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFBLFdBQUksRUFBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sYUFBYSxHQUFHLElBQUEsV0FBSSxFQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkQsTUFBTSxjQUFjLEdBQUcsSUFBQSxXQUFJLEVBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV6RCxJQUFJLEtBQUssSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUM3QixNQUFNLElBQUksS0FBSyxDQUNiLDJE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SUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFN0IsbUVBQW1FO0lBQ25FLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztJQUMzQixJQUFJLFNBQVMsQ0FBQztJQUVkLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNwQixTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxPQUFPLEdBQUcsR0FBRyxNQUFNLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDMUQsU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLElBQUksVUFBVSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNoRSxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxnQ0FBZ0M7SUFDaEMsSUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQzlCLElBQUksTUFBTSxJQUFJLGFBQWEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMvQyxhQUFhLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELGdDQUFnQztJQUNoQyxJQUFJLGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxhQUFhLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLENBQUM7QUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb21pc2VzIGFzIGZzLCBleGlzdHNTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSBcImNvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29uZmlnLXNwZWNcIjtcbmltcG9ydCB7IGNvbXBhcmUgfSBmcm9tIFwic2VtdmVyXCI7XG5pbXBvcnQgKiBhcyBsb2dnaW5nIGZyb20gXCIuLi9sb2dnaW5nXCI7XG5pbXBvcnQgdHlwZSB7IEJ1bXBUeXBlIH0gZnJvbSBcIi4vYnVtcC10eXBlXCI7XG5pbXBvcnQge1xuICBwYXJzZUJ1bXBUeXBlLFxuICBwZXJmb3JtQnVtcCxcbiAgcmVsYXRpdmVCdW1wVHlwZSxcbiAgcmVuZGVyQnVtcFR5cGUsXG59IGZyb20gXCIuL2J1bXAtdHlwZVwiO1xuaW1wb3J0IHsgZ2l0LCByYXdTaGVsbCB9IGZyb20gXCIuLi91dGlsL2V4ZWNcIjtcbmltcG9ydCB7IFJlbGVhc2FibGVDb21taXRzIH0gZnJvbSBcIi4uL3ZlcnNpb25cIjtcbmltcG9ydCB7IENvbW1pdEFuZFRhZ1ZlcnNpb24gfSBmcm9tIFwiLi9jb21taXQtdGFnLXZlcnNpb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBCdW1wT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiBhIC5qc29uIGZpbGUgdG8gc2V0IGB2ZXJzaW9uYC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25GaWxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjaGFuZ2Vsb2cgZmlsZSB0byBnZW5lcmF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZWxvZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2UgYSBwcmUtcmVsZWFzZSBzdWZmaXguXG4gICAqIEBkZWZhdWx0IC0gbm9ybWFsIHZlcnNpb25pbmdcbiAgICovXG4gIHJlYWRvbmx5IHByZXJlbGVhc2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIG1ham9yIHZlcnNpb24gbGluZS4gVGhpcyBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgbGF0ZXN0IHZlcnNpb25cbiAgICogYW5kIGFsc28gZW5mb3JjZSB0aGF0IG5ldyBtYWpvciB2ZXJzaW9ucyBhcmUgbm90IHJlbGVhc2VkIGFjY2lkZW50YWxseS5cbiAgICpcbiAgICogQ2FuIG5vdCBiZSBzZXQgdG9nZXRoZXIgd2l0aCBgbWluTWFqb3JWZXJzaW9uYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbnkgdmVyc2lvbiBpcyBzdXBwb3J0ZWRcbiAgICovXG4gIHJlYWRvbmx5IG1ham9yVmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgbWluaW1hbCBtYWpvciB2ZXJzaW9uLiBUaGlzIGlzIHVzZWQgaWYgeW91IHdhbnQgdG8gc3RhcnQgd2l0aFxuICAgKiBhIHNwZWNpZmljIG1ham9yIHZlcnNpb24sIGFuZCBpbmNyZW1lbnQgZnJvbSB0aGVyZSBvbi5cbiAgICogVGhpcyBjYW4gYmUgdXNlZnVsIHRvIHNldCB0byAxLCBhcyBicmVha2luZyBjaGFuZ2VzIGJlZm9yZSB0aGUgMS54IG1ham9yXG4gICAqIHJlbGVhc2UgYXJlIG5vdCBpbmNyZW1lbnRpbmcgdGhlIG1ham9yIHZlcnNpb24gbnVtYmVyLlxuICAgKlxuICAgKiBDYW4gbm90IGJlIHNldCB0b2dldGhlciB3aXRoIGBtYWpvclZlcnNpb25gLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG1pbmltdW0gdmVyc2lvbiBpcyBiZWluZyBlbmZvcmNlZFxuICAgKi9cbiAgcmVhZG9ubHkgbWluTWFqb3JWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBtaW5vciB2ZXJzaW9uIGxpbmUuIFRoaXMgaXMgdXNlZCB0byBzZWxlY3QgdGhlIGxhdGVzdCB2ZXJzaW9uXG4gICAqIGFuZCBhbHNvIGVuZm9yY2UgdGhhdCBuZXcgbWlub3IgdmVyc2lvbnMgYXJlIG5vdCByZWxlYXNlZCBhY2NpZGVudGFsbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYW55IHZlcnNpb24gaXMgc3VwcG9ydGVkXG4gICAqL1xuICByZWFkb25seSBtaW5vclZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIGEgZmlsZSB3aGljaCB3aWxsIGluY2x1ZGUgdGhlIG91dHB1dCB2ZXJzaW9uIG51bWJlciAoYSB0ZXh0IGZpbGUpLlxuICAgKlxuICAgKiBSZWxhdGl2ZSB0byBjd2QuXG4gICAqXG4gICAqIEBleGFtcGxlIFwiLnZlcnNpb24udHh0XCJcbiAgICovXG4gIHJlYWRvbmx5IGJ1bXBGaWxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHdoaWNoIHdpbGwgaW5jbHVkZSB0aGUgcmVsZWFzZSB0YWcgKGEgdGV4dCBmaWxlKS5cbiAgICpcbiAgICogUmVsYXRpdmUgdG8gY3dkLlxuICAgKlxuICAgKiBAZXhhbXBsZSBcIi5yZWxlYXNldGFnLnR4dFwiXG4gICAqL1xuICByZWFkb25seSByZWxlYXNlVGFnRmlsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJlZml4IGFwcGxpZWQgdG8gcmVsZWFzZSB0YWdzLiBCdW1wcyB3aWxsIGJlIG1hZGUgYmFzZWQgb24gdGhlIGxhdGVzdFxuICAgKiB2ZXJzaW9uIGZvdW5kIHdpdGggdGhpcyBwcmVmaXguXG4gICAqL1xuICByZWFkb25seSB0YWdQcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gdmFsdWVzIHRoYXQgd291bGQgYXBwZW5kIHRvIHZlcnNpb25yYyBmaWxlIG9yIG92ZXJ3cml0ZSB2YWx1ZXNcbiAgICogY29taW5nIHRvIHRoYXQgZnJvbSBkZWZhdWx0IG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25yY09wdGlvbnM/OiBDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgc2hlbGwgY29tbWFuZCB0byBsaXN0IGFsbCByZWxlYXNlIGNvbW1pdHMgc2luY2UgdGhlIGxhdGVzdCB0YWcuXG4gICAqXG4gICAqIEEgbmV3IHJlbGVhc2Ugd2lsbCBiZSBpbml0aWF0ZWQsIGlmIHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgY29tbWl0cyBpcyBncmVhdGVyIHRoYW4gemVyby5cbiAgICpcbiAgICogYCRMQVRFU1RfVEFHYCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbCBsYXRlc3QgdGFnIGZvciB0aGUgZ2l2ZW4gcHJlZml4LlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImdpdCBsb2cgLS1vbmVsaW5lICRMQVRFU1RfVEFHLi5IRUFEXCJcbiAgICovXG4gIHJlYWRvbmx5IHJlbGVhc2FibGVDb21taXRzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYGNvbW1pdC1hbmQtdGFnLXZlcnNpb25gIGNvbXBhdGlibGUgcGFja2FnZSB1c2VkIHRvIGJ1bXAgdGhlIHBhY2thZ2UgdmVyc2lvbiwgYXMgYSBkZXBlbmRlbmN5IHN0cmluZy5cbiAgICpcbiAgICogVGhpcyBjYW4gYmUgYW55IGNvbXBhdGlibGUgcGFja2FnZSB2ZXJzaW9uLCBpbmNsdWRpbmcgdGhlIGRlcHJlY2F0ZWQgYHN0YW5kYXJkLXZlcnNpb25AOWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiY29tbWl0LWFuZC10YWctdmVyc2lvbkAxMlwiXG4gICAqL1xuICByZWFkb25seSBidW1wUGFja2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBzaGVsbCBjb21tYW5kIHRvIGNvbnRyb2wgdGhlIG5leHQgdmVyc2lvbiB0byByZWxlYXNlLlxuICAgKlxuICAgKiBJZiBwcmVzZW50LCB0aGlzIHNoZWxsIGNvbW1hbmQgd2lsbCBiZSBydW4gYmVmb3JlIHRoZSBidW1wIGlzIGV4ZWN1dGVkLCBhbmRcbiAgICogaXQgZGV0ZXJtaW5lcyB3aGF0IHZlcnNpb24gdG8gcmVsZWFzZS4gSXQgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUgZm9sbG93aW5nXG4gICAqIGVudmlyb25tZW50OlxuICAgKlxuICAgKiAtIFdvcmtpbmcgZGlyZWN0b3J5OiB0aGUgcHJvamVjdCBkaXJlY3RvcnkuXG4gICAqIC0gYCRWRVJTSU9OYDogdGhlIGN1cnJlbnQgdmVyc2lvbi4gTG9va3MgbGlrZSBgMS4yLjNgLlxuICAgKiAtIGAkTEFURVNUX1RBR2A6IHRoZSBtb3N0IHJlY2VudCB0YWcuIExvb2tzIGxpa2UgYHByZWZpeC12MS4yLjNgLCBvciBtYXkgYmUgdW5zZXQuXG4gICAqXG4gICAqIFRoZSBjb21tYW5kIHNob3VsZCBwcmludCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0byBgc3Rkb3V0YDpcbiAgICpcbiAgICogLSBOb3RoaW5nOiB0aGUgbmV4dCB2ZXJzaW9uIG51bWJlciB3aWxsIGJlIGRldGVybWluZWQgYmFzZWQgb24gY29tbWl0IGhpc3RvcnkuXG4gICAqIC0gYHgueS56YDogdGhlIG5leHQgdmVyc2lvbiBudW1iZXIgd2lsbCBiZSBgeC55LnpgLlxuICAgKiAtIGBtYWpvcnxtaW5vcnxwYXRjaGA6IHRoZSBuZXh0IHZlcnNpb24gbnVtYmVyIHdpbGwgYmUgdGhlIGN1cnJlbnQgdmVyc2lvbiBudW1iZXJcbiAgICogICB3aXRoIHRoZSBpbmRpY2F0ZWQgY29tcG9uZW50IGJ1bXBlZC5cbiAgICpcbiAgICogVGhpcyBzZXR0aW5nIGNhbm5vdCBiZSBzcGVjaWZpZWQgdG9nZXRoZXIgd2l0aCBgbWluTWFqb3JWZXJzaW9uYDsgdGhlIGludm9rZWRcbiAgICogc2NyaXB0IGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgdGhlIGVmZmVjdHMgb2YgYG1pbk1ham9yVmVyc2lvbmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIG5leHQgdmVyc2lvbiB3aWxsIGJlIGRldGVybWluZWQgYmFzZWQgb24gdGhlIGNvbW1pdCBoaXN0b3J5IGFuZCBwcm9qZWN0IHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dFZlcnNpb25Db21tYW5kPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIGdpdCB0YWdzIGFuZCB1c2VzIGBjb21taXQtYW5kLXRhZy12ZXJzaW9uYCB0byBidW1wXG4gKiB0byB0aGUgbmV4dCB2ZXJzaW9uIGJhc2VkIG9uIGNvbW1pdHMuXG4gKlxuICogVGhpcyBleHBlY3RzIGBjb21taXQtYW5kLXRhZy12ZXJzaW9uYCB0byBiZSBpbnN0YWxsZWQgaW4gdGhlIHBhdGguXG4gKlxuICogQHBhcmFtIGN3ZCB3b3JraW5nIGRpcmVjdG9yeSAoZ2l0IHJlcG9zaXRvcnkpXG4gKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidW1wKGN3ZDogc3RyaW5nLCBvcHRpb25zOiBCdW1wT3B0aW9ucykge1xuICBjb25zdCB2ZXJzaW9uRmlsZSA9IGpvaW4oY3dkLCBvcHRpb25zLnZlcnNpb25GaWxlKTtcbiAgY29uc3QgcHJlcmVsZWFzZSA9IG9wdGlvbnMucHJlcmVsZWFzZTtcbiAgY29uc3QgbWFqb3IgPSBvcHRpb25zLm1ham9yVmVyc2lvbjtcbiAgY29uc3QgbWlub3IgPSBvcHRpb25zLm1pbm9yVmVyc2lvbjtcbiAgY29uc3QgbWluTWFqb3JWZXJzaW9uID0gb3B0aW9ucy5taW5NYWpvclZlcnNpb247XG4gIGNvbnN0IHRhZ1ByZWZpeCA9IG9wdGlvbnMudGFnUHJlZml4ID8/IFwiXCI7XG4gIGNvbnN0IGJ1bXBGaWxlID0gam9pbihjd2QsIG9wdGlvbnMuYnVtcEZpbGUpO1xuICBjb25zdCBjaGFuZ2Vsb2dGaWxlID0gam9pbihjd2QsIG9wdGlvbnMuY2hhbmdlbG9nKTtcbiAgY29uc3QgcmVsZWFzZVRhZ0ZpbGUgPSBqb2luKGN3ZCwgb3B0aW9ucy5yZWxlYXNlVGFnRmlsZSk7XG5cbiAgaWYgKG1ham9yICYmIG1pbk1ham9yVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBtaW5NYWpvclZlcnNpb24gYW5kIG1ham9yVmVyc2lvbiBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5gLFxuICAgICk7XG4gIH1cbiAgaWYgKG9wdGlvbnMubmV4dFZlcnNpb25Db21tYW5kICYmIG1pbk1ham9yVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBtaW5NYWpvclZlcnNpb24gYW5kIG5leHRWZXJzaW9uQ29tbWFuZCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5gLFxuICAgICk7XG4gIH1cbiAgaWYgKG1pbm9yICYmICFtYWpvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgbWlub3JWZXJzaW9uIGFuZCBtYWpvclZlcnNpb24gbXVzdCBiZSB1c2VkIHRvZ2V0aGVyLmApO1xuICB9XG5cbiAgYXdhaXQgZnMubWtkaXIoZGlybmFtZShidW1wRmlsZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5ta2RpcihkaXJuYW1lKGNoYW5nZWxvZ0ZpbGUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMubWtkaXIoZGlybmFtZShyZWxlYXNlVGFnRmlsZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHsgbGF0ZXN0VmVyc2lvbiwgbGF0ZXN0VGFnLCBpc0ZpcnN0UmVsZWFzZSB9ID0gZGV0ZXJtaW5lTGF0ZXN0VGFnKHtcbiAgICBjd2QsXG4gICAgbWFqb3IsXG4gICAgbWlub3IsXG4gICAgcHJlcmVsZWFzZSxcbiAgICBwcmVmaXg6IHRhZ1ByZWZpeCxcbiAgfSk7XG5cbiAgLy8gV3JpdGUgdGhlIGN1cnJlbnQgdmVyc2lvbiBpbnRvIHRoZSB2ZXJzaW9uIGZpbGUgc28gdGhhdCBDQVRWIHdpbGwga25vdyB0aGUgY3VycmVudCB2ZXJzaW9uXG4gIGNvbnN0IHsgY29udGVudHMsIG5ld2xpbmUgfSA9IGF3YWl0IHRyeVJlYWRWZXJzaW9uRmlsZSh2ZXJzaW9uRmlsZSk7XG4gIGNvbnRlbnRzLnZlcnNpb24gPSBsYXRlc3RWZXJzaW9uO1xuICBsb2dnaW5nLmluZm8oXG4gICAgYFVwZGF0ZSAke3ZlcnNpb25GaWxlfSB0byBsYXRlc3QgcmVzb2x2ZWQgdmVyc2lvbjogJHtsYXRlc3RWZXJzaW9ufWAsXG4gICk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICB2ZXJzaW9uRmlsZSxcbiAgICBKU09OLnN0cmluZ2lmeShjb250ZW50cywgdW5kZWZpbmVkLCAyKSArIChuZXdsaW5lID8gXCJcXG5cIiA6IFwiXCIpLFxuICApO1xuXG4gIC8vIERldGVybWluZSB0aGUgaW5pdGlhbCBidW1wIHN0YXR1cy4gQ0FUViB3aWxsIGFsd2F5cyBkbyBhIHBhdGNoIGV2ZW4gaWZcbiAgLy8gdGhlcmUgYXJlIG5vIGNvbW1pdHMsIHNvIGxvb2sgYXQgY29tbWl0cyBvdXJzZWx2ZXMgZmlyc3QgdG8gZGVjaWRlXG4gIC8vIGlmIHdlIGV2ZW4gc2hvdWxkIGRvIG5vdGhpbmcgYXQgYWxsLlxuICBjb25zdCBzaG91bGRSZWxlYXNlID0gaXNGaXJzdFJlbGVhc2VcbiAgICA/IHRydWVcbiAgICA6IGF3YWl0IGhhc05ld0ludGVyZXN0aW5nQ29tbWl0cyh7XG4gICAgICAgIGN3ZCxcbiAgICAgICAgbGF0ZXN0VGFnLFxuICAgICAgICByZWxlYXNhYmxlQ29tbWl0czogb3B0aW9ucy5yZWxlYXNhYmxlQ29tbWl0cyxcbiAgICAgIH0pO1xuXG4gIGNvbnN0IGNhdHYgPSBuZXcgQ29tbWl0QW5kVGFnVmVyc2lvbihvcHRpb25zLmJ1bXBQYWNrYWdlLCBjd2QsIHtcbiAgICB2ZXJzaW9uRmlsZSxcbiAgICBjaGFuZ2Vsb2dGaWxlLFxuICAgIHByZXJlbGVhc2UsXG4gICAgY29uZmlnT3B0aW9uczogb3B0aW9ucy52ZXJzaW9ucmNPcHRpb25zLFxuICAgIHRhZ1ByZWZpeCxcbiAgfSk7XG5cbiAgLy8gV2UgdXNlZCB0byB0cmFuc2xhdGUgYGlzRmlyc3RSZWxlYXNlYCB0byB0aGUgYC0tZmlyc3QtcmVsZWFzZWAgZmxhZyBvZiBDQVRWLlxuICAvLyBXaGF0IHRoYXQgZG9lcyBpcyBza2lwIGEgYnVtcCwgb25seSBnZW5lcmF0ZSB0aGUgY2hhbmdlbG9nLlxuICAvL1xuICAvLyBPdXIgYHsgYnVtcDogbm9uZSB9YCBkb2VzIHRoZSBzYW1lLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNhcnJ5IG92ZXIgdGhpc1xuICAvLyBmbGFnIGFueW1vcmUuXG4gIGxldCBidW1wVHlwZTogQnVtcFR5cGUgPVxuICAgIHNob3VsZFJlbGVhc2UgJiYgIWlzRmlyc3RSZWxlYXNlXG4gICAgICA/IHJlbGF0aXZlQnVtcFR5cGUobGF0ZXN0VmVyc2lvbiwgYXdhaXQgY2F0di5kcnlSdW4oKSlcbiAgICAgIDogeyBidW1wOiBcIm5vbmVcIiB9O1xuXG4gIGxvZ2dpbmcuaW5mbyhgQnVtcCBmcm9tIGNvbW1pdHM6ICR7cmVuZGVyQnVtcFR5cGUoYnVtcFR5cGUpfWApO1xuICBpZiAob3B0aW9ucy5uZXh0VmVyc2lvbkNvbW1hbmQpIHtcbiAgICBjb25zdCBuZXh0VmVyc2lvbiA9IGF3YWl0IHJhd1NoZWxsLmNhcHR1cmUob3B0aW9ucy5uZXh0VmVyc2lvbkNvbW1hbmQsIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudjoge1xuICAgICAgICBWRVJTSU9OOiBsYXRlc3RWZXJzaW9uLFxuICAgICAgICBTVUdHRVNURURfQlVNUDogcmVuZGVyQnVtcFR5cGUoYnVtcFR5cGUpLFxuICAgICAgICAuLi4obGF0ZXN0VGFnID8geyBMQVRFU1RfVEFHOiBsYXRlc3RUYWcgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAobmV4dFZlcnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJ1bXBUeXBlID0gcGFyc2VCdW1wVHlwZShuZXh0VmVyc2lvbik7XG4gICAgICAgIGxvZ2dpbmcuaW5mbyhcbiAgICAgICAgICBgQnVtcCBmcm9tIG5leHRWZXJzaW9uQ29tbWFuZDogJHtyZW5kZXJCdW1wVHlwZShidW1wVHlwZSl9YCxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBuZXh0VmVyc2lvbkNvbW1hbmQgXCIke29wdGlvbnMubmV4dFZlcnNpb25Db21tYW5kfVwiIHJldHVybmVkIGludmFsaWQgb3V0cHV0OiAke2V9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXNwZWN0IG1pbk1ham9yVmVyc2lvbiB0byBjb3JyZWN0IHRoZSByZXN1bHQgb2YgdGhlIG5leHRWZXJzaW9uQ29tbWFuZFxuICBpZiAobWluTWFqb3JWZXJzaW9uKSB7XG4gICAgY29uc3QgYnVtcGVkVmVyc2lvbiA9IHBlcmZvcm1CdW1wKGxhdGVzdFZlcnNpb24sIGJ1bXBUeXBlKTtcbiAgICBjb25zdCBbbWFqb3JWZXJzaW9uXSA9IGJ1bXBlZFZlcnNpb24uc3BsaXQoXCIuXCIpO1xuICAgIGNvbnN0IG1ham9yVmVyc2lvbk51bWJlciA9IHBhcnNlSW50KG1ham9yVmVyc2lvbiwgMTApO1xuICAgIGlmIChtYWpvclZlcnNpb25OdW1iZXIgPCBtaW5NYWpvclZlcnNpb24pIHtcbiAgICAgIGJ1bXBUeXBlID0geyBidW1wOiBcImFic29sdXRlXCIsIGFic29sdXRlOiBgJHttaW5NYWpvclZlcnNpb259LjAuMGAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBJbnZva2UgQ0FUViB3aXRoIHRoZSBvcHRpb25zIHdlIGxhbmRlZCBvbi4gSWYgd2UgZGVjaWRlZCBub3QgdG8gZG8gYSBidW1wLFxuICAvLyB3ZSB3aWxsIHVzZSB0aGlzIHRvIHJlZ2VuZXJhdGUgdGhlIGNoYW5nZWxvZyBvZiB0aGUgbW9zdCByZWNlbnQgdmVyc2lvbi5cbiAgY29uc3QgbmV3UmVsZWFzZSA9IGJ1bXBUeXBlLmJ1bXAgIT09IFwibm9uZVwiO1xuXG4gIC8vIElmIHdlJ3JlIG5vdCBkb2luZyBhIG5ldyByZWxlYXNlIGFuZCB0aGlzIGlzIG5vdCB0aGVcbiAgLy8gZmlyc3QgcmVsZWFzZSwgd2UncmUganVzdCByZWdlbmVyYXRpbmcgdGhlIHByZXZpb3VzIGNoYW5nZWxvZyBhZ2Fpbi5cbiAgaWYgKCFuZXdSZWxlYXNlICYmICFpc0ZpcnN0UmVsZWFzZSkge1xuICAgIGF3YWl0IGNhdHYucmVnZW5lcmF0ZVByZXZpb3VzQ2hhbmdlTG9nKGxhdGVzdFZlcnNpb24sIGxhdGVzdFRhZyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlIHdlJ3JlIGVpdGhlciBkb2luZyBhIGJ1bXAgKyByZWxlYXNlLCBvciB3ZSdyZSByZWxlYXNpbmcgdGhlXG4gICAgLy8gZmlyc3QgdmVyc2lvbiBhcyAwLjAuMCAod2hpY2ggaXMgYWxyZWFkeSB0aGUgbnVtYmVyIGluIHRoZSBmaWxlIHNvIHdlXG4gICAgLy8gc2tpcCBidW1waW5nKS5cbiAgICBhd2FpdCBjYXR2Lmludm9rZSh7XG4gICAgICByZWxlYXNlQXM6IG5ld1JlbGVhc2UgPyByZW5kZXJCdW1wVHlwZShidW1wVHlwZSkgOiB1bmRlZmluZWQsXG4gICAgICBza2lwQnVtcDogIW5ld1JlbGVhc2UsXG4gICAgfSk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSB0aGUgdmVyc2lvbiB0aGF0IHdlIGVuZGVkIHVwIHdpdGhcbiAgY29uc3QgbmV3VmVyc2lvbiA9IChhd2FpdCB0cnlSZWFkVmVyc2lvbkZpbGUodmVyc2lvbkZpbGUpKS52ZXJzaW9uO1xuICBpZiAoIW5ld1ZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1bXAgZmFpbGVkOiAke3ZlcnNpb25GaWxlfSBkb2VzIG5vdCBoYXZlIGEgdmVyc2lvbiBzZXRgKTtcbiAgfVxuICBpZiAobWFqb3IpIHtcbiAgICBpZiAoIW5ld1ZlcnNpb24uc3RhcnRzV2l0aChgJHttYWpvcn0uYCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGJ1bXAgZmFpbGVkOiB0aGlzIGJyYW5jaCBpcyBjb25maWd1cmVkIHRvIG9ubHkgcHVibGlzaCB2JHttYWpvcn0gcmVsZWFzZXMgLSBidW1wIHJlc3VsdGVkIGluICR7bmV3VmVyc2lvbn1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgaWYgKG1pbm9yKSB7XG4gICAgaWYgKCFuZXdWZXJzaW9uLnN0YXJ0c1dpdGgoYCR7bWFqb3J9LiR7bWlub3J9YCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGJ1bXAgZmFpbGVkOiB0aGlzIGJyYW5jaCBpcyBjb25maWd1cmVkIHRvIG9ubHkgcHVibGlzaCB2JHttYWpvcn0uJHttaW5vcn0gcmVsZWFzZXMgLSBidW1wIHJlc3VsdGVkIGluICR7bmV3VmVyc2lvbn1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXBvcnQgY3VyZW50IHN0YXR1cyBpbnRvIHRoZSBkaXN0LyBkaXJlY3RvcnlcbiAgY29uc3QgbmV3VGFnID0gYCR7dGFnUHJlZml4fXYke25ld1ZlcnNpb259YDtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKGJ1bXBGaWxlLCBuZXdWZXJzaW9uKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHJlbGVhc2VUYWdGaWxlLCBuZXdUYWcpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBiYXNlZCBvbiByZWxlYXNlYWJsZSBjb21taXRzIHdoZXRoZXIgd2Ugc2hvdWxkIHJlbGVhc2Ugb3Igbm90XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhc05ld0ludGVyZXN0aW5nQ29tbWl0cyhvcHRpb25zOiB7XG4gIHJlbGVhc2FibGVDb21taXRzPzogc3RyaW5nO1xuICBsYXRlc3RUYWc6IHN0cmluZztcbiAgY3dkOiBzdHJpbmc7XG59KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGZpbmRDb21taXRzID0gKFxuICAgIG9wdGlvbnMucmVsZWFzYWJsZUNvbW1pdHMgPz8gUmVsZWFzYWJsZUNvbW1pdHMuZXZlcnlDb21taXQoKS5jbWRcbiAgKS5yZXBsYWNlKFwiJExBVEVTVF9UQUdcIiwgb3B0aW9ucy5sYXRlc3RUYWcpO1xuXG4gIGNvbnN0IGNvbW1pdHNTaW5jZUxhc3RUYWcgPSAoXG4gICAgYXdhaXQgcmF3U2hlbGwudHJ5Q2FwdHVyZShmaW5kQ29tbWl0cywge1xuICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICB9KVxuICApPy5zcGxpdChcIlxcblwiKTtcbiAgY29uc3QgbnVtQ29tbWl0c1NpbmNlTGFzdFRhZyA9IGNvbW1pdHNTaW5jZUxhc3RUYWc/Lmxlbmd0aCA/PyAwO1xuICBsb2dnaW5nLmluZm8oXG4gICAgYE51bWJlciBvZiBjb21taXRzIHNpbmNlICR7b3B0aW9ucy5sYXRlc3RUYWd9OiAke251bUNvbW1pdHNTaW5jZUxhc3RUYWd9YCxcbiAgKTtcblxuICAvLyBOb3RoaW5nIHRvIHJlbGVhc2UgcmlnaHQgbm93XG4gIGlmIChudW1Db21taXRzU2luY2VMYXN0VGFnID09PSAwKSB7XG4gICAgbG9nZ2luZy5pbmZvKFwiTm8gbmV3IGludGVyZXN0aW5nIGNvbW1pdHMuXCIpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0cnlSZWFkVmVyc2lvbkZpbGUoXG4gIHZlcnNpb25GaWxlOiBzdHJpbmcsXG4pOiBQcm9taXNlPHsgY29udGVudHM6IGFueTsgdmVyc2lvbj86IHN0cmluZzsgbmV3bGluZTogYm9vbGVhbiB9PiB7XG4gIGlmICghZXhpc3RzU3luYyh2ZXJzaW9uRmlsZSkpIHtcbiAgICByZXR1cm4geyBjb250ZW50czoge30sIG5ld2xpbmU6IHRydWUgfTtcbiAgfVxuICBjb25zdCByYXcgPSBhd2FpdCBmcy5yZWFkRmlsZSh2ZXJzaW9uRmlsZSwgXCJ1dGYtOFwiKTtcbiAgY29uc3QgY29udGVudHMgPSBKU09OLnBhcnNlKHJhdyk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb250ZW50cyxcbiAgICB2ZXJzaW9uOiBjb250ZW50cy52ZXJzaW9uLFxuICAgIG5ld2xpbmU6IHJhdy5lbmRzV2l0aChcIlxcblwiKSxcbiAgfTtcbn1cblxuaW50ZXJmYWNlIExhdGVzdFRhZ09wdGlvbnMge1xuICAvKipcbiAgICogV29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIGdpdCByZXBvc2l0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgY3dkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNYWpvciB2ZXJzaW9uIHRvIHNlbGVjdCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFqb3I/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNaW5vciB2ZXJzaW9uIHRvIHNlbGVjdCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgbWlub3I/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBBIHByZS1yZWxlYXNlIHN1ZmZpeC5cbiAgICovXG4gIHJlYWRvbmx5IHByZXJlbGVhc2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIHByZWZpeCBhcHBsaWVkIHRvIGFsbCB0YWdzLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgbGF0ZXN0IHJlbGVhc2UgdGFnLlxuICogQHBhcmFtIG1ham9yIChvcHRpb25hbCkgQSBtYWpvciB2ZXJzaW9uIGxpbmUgdG8gc2VsZWN0IGZyb21cbiAqIEBwYXJhbSBwcmVyZWxlYXNlIChvcHRpb25hbCkgQSBwcmUtcmVsZWFzZSBzdWZmaXguXG4gKiBAcmV0dXJucyB0aGUgbGF0ZXN0IHRhZywgYW5kIHdoZXRoZXIgaXQgaXMgdGhlIGZpcnN0IHJlbGVhc2Ugb3Igbm90XG4gKi9cbmZ1bmN0aW9uIGRldGVybWluZUxhdGVzdFRhZyhvcHRpb25zOiBMYXRlc3RUYWdPcHRpb25zKToge1xuICBsYXRlc3RWZXJzaW9uOiBzdHJpbmc7XG4gIGxhdGVzdFRhZzogc3RyaW5nO1xuICBpc0ZpcnN0UmVsZWFzZTogYm9vbGVhbjtcbn0ge1xuICBjb25zdCB7IGN3ZCwgbWFqb3IsIG1pbm9yLCBwcmVyZWxlYXNlLCBwcmVmaXggfSA9IG9wdGlvbnM7XG5cbiAgLy8gZmlsdGVyIG9ubHkgdGFncyBmb3IgdGhpcyBwcmVmaXggYW5kIG1ham9yIHZlcnNpb24gaWYgc3BlY2lmaWVkIChzdGFydCB3aXRoIFwidk5OLlwiKS5cbiAgbGV0IHByZWZpeEZpbHRlcjogc3RyaW5nO1xuICBpZiAobWFqb3IgIT09IHVuZGVmaW5lZCAmJiBtaW5vciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcHJlZml4RmlsdGVyID0gYCR7cHJlZml4fXYke21ham9yfS4ke21pbm9yfS4qYDtcbiAgfSBlbHNlIGlmIChtYWpvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcHJlZml4RmlsdGVyID0gYCR7cHJlZml4fXYke21ham9yfS4qYDtcbiAgfSBlbHNlIHtcbiAgICBwcmVmaXhGaWx0ZXIgPSBgJHtwcmVmaXh9dipgO1xuICB9XG5cbiAgY29uc3Qgc3Rkb3V0ID0gZ2l0LmNhcHR1cmUoXG4gICAgW1xuICAgICAgXCItY1wiLFxuICAgICAgXCJ2ZXJzaW9uc29ydC5zdWZmaXg9LVwiLCAvLyBtYWtlcyBzdXJlIHByZS1yZWxlYXNlIHZlcnNpb25zIGFyZSBsaXN0ZWQgYWZ0ZXIgdGhlIHByaW1hcnkgdmVyc2lvblxuICAgICAgXCJ0YWdcIixcbiAgICAgIFwiLS1zb3J0PS12ZXJzaW9uOnJlZm5hbWVcIiwgLy8gc29ydCBhcyB2ZXJzaW9ucyBhbmQgbm90IGxleGljb2dyYXBoaWNhbGx5XG4gICAgICBcIi0tbGlzdFwiLFxuICAgICAgcHJlZml4RmlsdGVyLFxuICAgIF0sXG4gICAgeyBjd2QgfSxcbiAgKTtcblxuICBsZXQgdGFncyA9IHN0ZG91dD8uc3BsaXQoXCJcXG5cIik7XG5cbiAgLy8gaWYgcHJlcmVsZWFzZSBpcyBzZXQgYW5kIHRoZXJlIGFyZSBleGlzdGluZyBwcmVyZWxlYXNlIHRhZ3MsIGZpbHRlciB2ZXJzaW9ucyB0aGF0IGVuZCB3aXRoIFwiLVBSRS5kZGRcIi5cbiAgY29uc3QgcHJlcmVsZWFzZVRhZ3MgPSB0YWdzLmZpbHRlcigoeCkgPT5cbiAgICBuZXcgUmVnRXhwKGAtJHtwcmVyZWxlYXNlfVxcXFwuWzAtOV0rJGApLnRlc3QoeCksXG4gICk7XG4gIGlmIChwcmVyZWxlYXNlICYmIHByZXJlbGVhc2VUYWdzLmxlbmd0aCA+IDApIHtcbiAgICBsZXQgcHJlcmVsZWFzZVRhZyA9IHByZXJlbGVhc2VUYWdzWzBdO1xuXG4gICAgLyoqXG4gICAgICogQ292ZXIgdGhlIGZvbGxvd2luZyBjYXNlIHNwZWNpZmljYWxseVxuICAgICAqIDEgLSB2MS4wLjBcbiAgICAgKiAyIC0gdjEuMC4xLWJldGEuMFxuICAgICAqIDMgLSB2MS4wLjEtYmV0YS4xXG4gICAgICogNCAtIHYxLjAuMVxuICAgICAqIDUgLSBub3cgcHVibGlzaCBhIG5ldyByZWxlYXNlIG9uIHRoZSBwcmVyZWxlYXNlIGJyYW5jaFxuICAgICAqICAgIGJ5IHNldHRpbmcgdGhlIGxhdGVzdFRhZyBhcyB2MS4wLjEgaW5zdGVhZCBvZiB2MS4wLjEtYmV0YS4xXG4gICAgICovXG4gICAgY29uc3QgcmVsZWFzZVRhZ3MgPSB0YWdzLmZpbHRlcigoeCkgPT5cbiAgICAgIG5ldyBSZWdFeHAoYF4ke3ByZWZpeH12KFswLTldKylcXFxcLihbMC05XSspXFxcXC4oWzAtOV0rKSRgKS50ZXN0KHgpLFxuICAgICk7XG5cbiAgICBsZXQgcmVsZWFzZVRhZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZWxlYXNlVGFncy5sZW5ndGggPiAwKSB7XG4gICAgICByZWxlYXNlVGFnID0gcmVsZWFzZVRhZ3NbMF07XG4gICAgfVxuXG4gICAgaWYgKHByZWZpeCkge1xuICAgICAgcmVsZWFzZVRhZyA9IHJlbGVhc2VUYWc/LnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKTtcbiAgICAgIHByZXJlbGVhc2VUYWcgPSBwcmVyZWxlYXNlVGFnLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAocmVsZWFzZVRhZyAmJiBjb21wYXJlKHJlbGVhc2VUYWcsIHByZXJlbGVhc2VUYWcpID09PSAxKSB7XG4gICAgICB0YWdzID0gcmVsZWFzZVRhZ3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhZ3MgPSBwcmVyZWxlYXNlVGFncztcbiAgICB9XG4gIH1cblxuICB0YWdzID0gdGFncy5maWx0ZXIoKHgpID0+IHgpO1xuXG4gIC8vIGlmIGEgcHJlLXJlbGVhc2UgdGFnIGlzIHVzZWQsIHRoZW4gYWRkIGl0IHRvIHRoZSBpbml0aWFsIHZlcnNpb25cbiAgbGV0IGlzRmlyc3RSZWxlYXNlID0gZmFsc2U7XG4gIGxldCBsYXRlc3RUYWc7XG5cbiAgaWYgKHRhZ3MubGVuZ3RoID4gMCkge1xuICAgIGxhdGVzdFRhZyA9IHRhZ3NbMF07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaW5pdGlhbCA9IGAke3ByZWZpeH12JHttYWpvciA/PyAwfS4ke21pbm9yID8/IDB9LjBgO1xuICAgIGxhdGVzdFRhZyA9IHByZXJlbGVhc2UgPyBgJHtpbml0aWFsfS0ke3ByZXJlbGVhc2V9LjBgIDogaW5pdGlhbDtcbiAgICBpc0ZpcnN0UmVsZWFzZSA9IHRydWU7XG4gIH1cblxuICAvLyByZW1vdmUgdGFnIHByZWZpeCAoaWYgZXhpc3RzKVxuICBsZXQgbGF0ZXN0VmVyc2lvbiA9IGxhdGVzdFRhZztcbiAgaWYgKHByZWZpeCAmJiBsYXRlc3RWZXJzaW9uLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgIGxhdGVzdFZlcnNpb24gPSBsYXRlc3RWZXJzaW9uLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKTtcbiAgfVxuXG4gIC8vIHJlbW92ZSBcInZcIiBwcmVmaXggKGlmIGV4aXN0cylcbiAgaWYgKGxhdGVzdFZlcnNpb24uc3RhcnRzV2l0aChcInZcIikpIHtcbiAgICBsYXRlc3RWZXJzaW9uID0gbGF0ZXN0VmVyc2lvbi5zdWJzdHJpbmcoMSk7XG4gIH1cblxuICByZXR1cm4geyBsYXRlc3RWZXJzaW9uLCBsYXRlc3RUYWcsIGlzRmlyc3RSZWxlYXNlIH07XG59XG4iXX0=
|
|
292
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVtcC12ZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlbGVhc2UvYnVtcC12ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0pBLG9CQTBKQztBQTlTRCwyQkFBZ0Q7QUFDaEQsK0JBQXFDO0FBRXJDLG1DQUFpQztBQUNqQyxvREFBc0M7QUFFdEMsMkNBS3FCO0FBQ3JCLHVDQUE2QztBQUM3Qyx3Q0FBK0M7QUFDL0MsNkRBQTJEO0FBNkgzRDs7Ozs7Ozs7R0FRRztBQUNJLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBVyxFQUFFLE9BQW9CO0lBQzFELE1BQU0sV0FBVyxHQUFHLElBQUEsV0FBSSxFQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztJQUN0QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ25DLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7SUFDbkMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQztJQUNoRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFBLFdBQUksRUFBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sYUFBYSxHQUFHLElBQUEsV0FBSSxFQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkQsTUFBTSxjQUFjLEdBQUcsSUFBQSxXQUFJLEVBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV6RCxJQUFJLEtBQUssSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUM3QixNQUFNLElBQUksS0FBSyxDQUNiLDJE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XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSBcImNvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29uZmlnLXNwZWNcIjtcbmltcG9ydCB7IGNvbXBhcmUgfSBmcm9tIFwic2VtdmVyXCI7XG5pbXBvcnQgKiBhcyBsb2dnaW5nIGZyb20gXCIuLi9sb2dnaW5nXCI7XG5pbXBvcnQgdHlwZSB7IEJ1bXBUeXBlIH0gZnJvbSBcIi4vYnVtcC10eXBlXCI7XG5pbXBvcnQge1xuICBwYXJzZUJ1bXBUeXBlLFxuICBwZXJmb3JtQnVtcCxcbiAgcmVsYXRpdmVCdW1wVHlwZSxcbiAgcmVuZGVyQnVtcFR5cGUsXG59IGZyb20gXCIuL2J1bXAtdHlwZVwiO1xuaW1wb3J0IHsgZ2l0LCByYXdTaGVsbCB9IGZyb20gXCIuLi91dGlsL2V4ZWNcIjtcbmltcG9ydCB7IFJlbGVhc2FibGVDb21taXRzIH0gZnJvbSBcIi4uL3ZlcnNpb25cIjtcbmltcG9ydCB7IENvbW1pdEFuZFRhZ1ZlcnNpb24gfSBmcm9tIFwiLi9jb21taXQtdGFnLXZlcnNpb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBCdW1wT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiBhIC5qc29uIGZpbGUgdG8gc2V0IGB2ZXJzaW9uYC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25GaWxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjaGFuZ2Vsb2cgZmlsZSB0byBnZW5lcmF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZWxvZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2UgYSBwcmUtcmVsZWFzZSBzdWZmaXguXG4gICAqIEBkZWZhdWx0IC0gbm9ybWFsIHZlcnNpb25pbmdcbiAgICovXG4gIHJlYWRvbmx5IHByZXJlbGVhc2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIG1ham9yIHZlcnNpb24gbGluZS4gVGhpcyBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgbGF0ZXN0IHZlcnNpb25cbiAgICogYW5kIGFsc28gZW5mb3JjZSB0aGF0IG5ldyBtYWpvciB2ZXJzaW9ucyBhcmUgbm90IHJlbGVhc2VkIGFjY2lkZW50YWxseS5cbiAgICpcbiAgICogQ2FuIG5vdCBiZSBzZXQgdG9nZXRoZXIgd2l0aCBgbWluTWFqb3JWZXJzaW9uYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbnkgdmVyc2lvbiBpcyBzdXBwb3J0ZWRcbiAgICovXG4gIHJlYWRvbmx5IG1ham9yVmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgbWluaW1hbCBtYWpvciB2ZXJzaW9uLiBUaGlzIGlzIHVzZWQgaWYgeW91IHdhbnQgdG8gc3RhcnQgd2l0aFxuICAgKiBhIHNwZWNpZmljIG1ham9yIHZlcnNpb24sIGFuZCBpbmNyZW1lbnQgZnJvbSB0aGVyZSBvbi5cbiAgICogVGhpcyBjYW4gYmUgdXNlZnVsIHRvIHNldCB0byAxLCBhcyBicmVha2luZyBjaGFuZ2VzIGJlZm9yZSB0aGUgMS54IG1ham9yXG4gICAqIHJlbGVhc2UgYXJlIG5vdCBpbmNyZW1lbnRpbmcgdGhlIG1ham9yIHZlcnNpb24gbnVtYmVyLlxuICAgKlxuICAgKiBDYW4gbm90IGJlIHNldCB0b2dldGhlciB3aXRoIGBtYWpvclZlcnNpb25gLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG1pbmltdW0gdmVyc2lvbiBpcyBiZWluZyBlbmZvcmNlZFxuICAgKi9cbiAgcmVhZG9ubHkgbWluTWFqb3JWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBtaW5vciB2ZXJzaW9uIGxpbmUuIFRoaXMgaXMgdXNlZCB0byBzZWxlY3QgdGhlIGxhdGVzdCB2ZXJzaW9uXG4gICAqIGFuZCBhbHNvIGVuZm9yY2UgdGhhdCBuZXcgbWlub3IgdmVyc2lvbnMgYXJlIG5vdCByZWxlYXNlZCBhY2NpZGVudGFsbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYW55IHZlcnNpb24gaXMgc3VwcG9ydGVkXG4gICAqL1xuICByZWFkb25seSBtaW5vclZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIGEgZmlsZSB3aGljaCB3aWxsIGluY2x1ZGUgdGhlIG91dHB1dCB2ZXJzaW9uIG51bWJlciAoYSB0ZXh0IGZpbGUpLlxuICAgKlxuICAgKiBSZWxhdGl2ZSB0byBjd2QuXG4gICAqXG4gICAqIEBleGFtcGxlIFwiLnZlcnNpb24udHh0XCJcbiAgICovXG4gIHJlYWRvbmx5IGJ1bXBGaWxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHdoaWNoIHdpbGwgaW5jbHVkZSB0aGUgcmVsZWFzZSB0YWcgKGEgdGV4dCBmaWxlKS5cbiAgICpcbiAgICogUmVsYXRpdmUgdG8gY3dkLlxuICAgKlxuICAgKiBAZXhhbXBsZSBcIi5yZWxlYXNldGFnLnR4dFwiXG4gICAqL1xuICByZWFkb25seSByZWxlYXNlVGFnRmlsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJlZml4IGFwcGxpZWQgdG8gcmVsZWFzZSB0YWdzLiBCdW1wcyB3aWxsIGJlIG1hZGUgYmFzZWQgb24gdGhlIGxhdGVzdFxuICAgKiB2ZXJzaW9uIGZvdW5kIHdpdGggdGhpcyBwcmVmaXguXG4gICAqL1xuICByZWFkb25seSB0YWdQcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gdmFsdWVzIHRoYXQgd291bGQgYXBwZW5kIHRvIHZlcnNpb25yYyBmaWxlIG9yIG92ZXJ3cml0ZSB2YWx1ZXNcbiAgICogY29taW5nIHRvIHRoYXQgZnJvbSBkZWZhdWx0IG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25yY09wdGlvbnM/OiBDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgc2hlbGwgY29tbWFuZCB0byBsaXN0IGFsbCByZWxlYXNlIGNvbW1pdHMgc2luY2UgdGhlIGxhdGVzdCB0YWcuXG4gICAqXG4gICAqIEEgbmV3IHJlbGVhc2Ugd2lsbCBiZSBpbml0aWF0ZWQsIGlmIHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgY29tbWl0cyBpcyBncmVhdGVyIHRoYW4gemVyby5cbiAgICpcbiAgICogYCRMQVRFU1RfVEFHYCBpcyBhdmFpbGFibGUgYXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgKHNldCB0byB0aGUgYWN0dWFsIGxhdGVzdCB0YWcgZm9yIHRoZSBnaXZlbiBwcmVmaXgpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImdpdCBsb2cgLS1vbmVsaW5lICRMQVRFU1RfVEFHLi5IRUFEXCJcbiAgICovXG4gIHJlYWRvbmx5IHJlbGVhc2FibGVDb21taXRzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYGNvbW1pdC1hbmQtdGFnLXZlcnNpb25gIGNvbXBhdGlibGUgcGFja2FnZSB1c2VkIHRvIGJ1bXAgdGhlIHBhY2thZ2UgdmVyc2lvbiwgYXMgYSBkZXBlbmRlbmN5IHN0cmluZy5cbiAgICpcbiAgICogVGhpcyBjYW4gYmUgYW55IGNvbXBhdGlibGUgcGFja2FnZSB2ZXJzaW9uLCBpbmNsdWRpbmcgdGhlIGRlcHJlY2F0ZWQgYHN0YW5kYXJkLXZlcnNpb25AOWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiY29tbWl0LWFuZC10YWctdmVyc2lvbkAxMlwiXG4gICAqL1xuICByZWFkb25seSBidW1wUGFja2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBzaGVsbCBjb21tYW5kIHRvIGNvbnRyb2wgdGhlIG5leHQgdmVyc2lvbiB0byByZWxlYXNlLlxuICAgKlxuICAgKiBJZiBwcmVzZW50LCB0aGlzIHNoZWxsIGNvbW1hbmQgd2lsbCBiZSBydW4gYmVmb3JlIHRoZSBidW1wIGlzIGV4ZWN1dGVkLCBhbmRcbiAgICogaXQgZGV0ZXJtaW5lcyB3aGF0IHZlcnNpb24gdG8gcmVsZWFzZS4gSXQgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUgZm9sbG93aW5nXG4gICAqIGVudmlyb25tZW50OlxuICAgKlxuICAgKiAtIFdvcmtpbmcgZGlyZWN0b3J5OiB0aGUgcHJvamVjdCBkaXJlY3RvcnkuXG4gICAqIC0gYCRWRVJTSU9OYDogdGhlIGN1cnJlbnQgdmVyc2lvbi4gTG9va3MgbGlrZSBgMS4yLjNgLlxuICAgKiAtIGAkTEFURVNUX1RBR2A6IHRoZSBtb3N0IHJlY2VudCB0YWcuIExvb2tzIGxpa2UgYHByZWZpeC12MS4yLjNgLCBvciBtYXkgYmUgdW5zZXQuXG4gICAqXG4gICAqIFRoZSBjb21tYW5kIHNob3VsZCBwcmludCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0byBgc3Rkb3V0YDpcbiAgICpcbiAgICogLSBOb3RoaW5nOiB0aGUgbmV4dCB2ZXJzaW9uIG51bWJlciB3aWxsIGJlIGRldGVybWluZWQgYmFzZWQgb24gY29tbWl0IGhpc3RvcnkuXG4gICAqIC0gYHgueS56YDogdGhlIG5leHQgdmVyc2lvbiBudW1iZXIgd2lsbCBiZSBgeC55LnpgLlxuICAgKiAtIGBtYWpvcnxtaW5vcnxwYXRjaGA6IHRoZSBuZXh0IHZlcnNpb24gbnVtYmVyIHdpbGwgYmUgdGhlIGN1cnJlbnQgdmVyc2lvbiBudW1iZXJcbiAgICogICB3aXRoIHRoZSBpbmRpY2F0ZWQgY29tcG9uZW50IGJ1bXBlZC5cbiAgICpcbiAgICogVGhpcyBzZXR0aW5nIGNhbm5vdCBiZSBzcGVjaWZpZWQgdG9nZXRoZXIgd2l0aCBgbWluTWFqb3JWZXJzaW9uYDsgdGhlIGludm9rZWRcbiAgICogc2NyaXB0IGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgdGhlIGVmZmVjdHMgb2YgYG1pbk1ham9yVmVyc2lvbmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIG5leHQgdmVyc2lvbiB3aWxsIGJlIGRldGVybWluZWQgYmFzZWQgb24gdGhlIGNvbW1pdCBoaXN0b3J5IGFuZCBwcm9qZWN0IHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dFZlcnNpb25Db21tYW5kPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIGdpdCB0YWdzIGFuZCB1c2VzIGBjb21taXQtYW5kLXRhZy12ZXJzaW9uYCB0byBidW1wXG4gKiB0byB0aGUgbmV4dCB2ZXJzaW9uIGJhc2VkIG9uIGNvbW1pdHMuXG4gKlxuICogVGhpcyBleHBlY3RzIGBjb21taXQtYW5kLXRhZy12ZXJzaW9uYCB0byBiZSBpbnN0YWxsZWQgaW4gdGhlIHBhdGguXG4gKlxuICogQHBhcmFtIGN3ZCB3b3JraW5nIGRpcmVjdG9yeSAoZ2l0IHJlcG9zaXRvcnkpXG4gKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidW1wKGN3ZDogc3RyaW5nLCBvcHRpb25zOiBCdW1wT3B0aW9ucykge1xuICBjb25zdCB2ZXJzaW9uRmlsZSA9IGpvaW4oY3dkLCBvcHRpb25zLnZlcnNpb25GaWxlKTtcbiAgY29uc3QgcHJlcmVsZWFzZSA9IG9wdGlvbnMucHJlcmVsZWFzZTtcbiAgY29uc3QgbWFqb3IgPSBvcHRpb25zLm1ham9yVmVyc2lvbjtcbiAgY29uc3QgbWlub3IgPSBvcHRpb25zLm1pbm9yVmVyc2lvbjtcbiAgY29uc3QgbWluTWFqb3JWZXJzaW9uID0gb3B0aW9ucy5taW5NYWpvclZlcnNpb247XG4gIGNvbnN0IHRhZ1ByZWZpeCA9IG9wdGlvbnMudGFnUHJlZml4ID8/IFwiXCI7XG4gIGNvbnN0IGJ1bXBGaWxlID0gam9pbihjd2QsIG9wdGlvbnMuYnVtcEZpbGUpO1xuICBjb25zdCBjaGFuZ2Vsb2dGaWxlID0gam9pbihjd2QsIG9wdGlvbnMuY2hhbmdlbG9nKTtcbiAgY29uc3QgcmVsZWFzZVRhZ0ZpbGUgPSBqb2luKGN3ZCwgb3B0aW9ucy5yZWxlYXNlVGFnRmlsZSk7XG5cbiAgaWYgKG1ham9yICYmIG1pbk1ham9yVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBtaW5NYWpvclZlcnNpb24gYW5kIG1ham9yVmVyc2lvbiBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5gLFxuICAgICk7XG4gIH1cbiAgaWYgKG9wdGlvbnMubmV4dFZlcnNpb25Db21tYW5kICYmIG1pbk1ham9yVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBtaW5NYWpvclZlcnNpb24gYW5kIG5leHRWZXJzaW9uQ29tbWFuZCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5gLFxuICAgICk7XG4gIH1cbiAgaWYgKG1pbm9yICYmICFtYWpvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgbWlub3JWZXJzaW9uIGFuZCBtYWpvclZlcnNpb24gbXVzdCBiZSB1c2VkIHRvZ2V0aGVyLmApO1xuICB9XG5cbiAgYXdhaXQgZnMubWtkaXIoZGlybmFtZShidW1wRmlsZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5ta2RpcihkaXJuYW1lKGNoYW5nZWxvZ0ZpbGUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMubWtkaXIoZGlybmFtZShyZWxlYXNlVGFnRmlsZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHsgbGF0ZXN0VmVyc2lvbiwgbGF0ZXN0VGFnLCBpc0ZpcnN0UmVsZWFzZSB9ID0gZGV0ZXJtaW5lTGF0ZXN0VGFnKHtcbiAgICBjd2QsXG4gICAgbWFqb3IsXG4gICAgbWlub3IsXG4gICAgcHJlcmVsZWFzZSxcbiAgICBwcmVmaXg6IHRhZ1ByZWZpeCxcbiAgfSk7XG5cbiAgLy8gV3JpdGUgdGhlIGN1cnJlbnQgdmVyc2lvbiBpbnRvIHRoZSB2ZXJzaW9uIGZpbGUgc28gdGhhdCBDQVRWIHdpbGwga25vdyB0aGUgY3VycmVudCB2ZXJzaW9uXG4gIGNvbnN0IHsgY29udGVudHMsIG5ld2xpbmUgfSA9IGF3YWl0IHRyeVJlYWRWZXJzaW9uRmlsZSh2ZXJzaW9uRmlsZSk7XG4gIGNvbnRlbnRzLnZlcnNpb24gPSBsYXRlc3RWZXJzaW9uO1xuICBsb2dnaW5nLmluZm8oXG4gICAgYFVwZGF0ZSAke3ZlcnNpb25GaWxlfSB0byBsYXRlc3QgcmVzb2x2ZWQgdmVyc2lvbjogJHtsYXRlc3RWZXJzaW9ufWAsXG4gICk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICB2ZXJzaW9uRmlsZSxcbiAgICBKU09OLnN0cmluZ2lmeShjb250ZW50cywgdW5kZWZpbmVkLCAyKSArIChuZXdsaW5lID8gXCJcXG5cIiA6IFwiXCIpLFxuICApO1xuXG4gIC8vIERldGVybWluZSB0aGUgaW5pdGlhbCBidW1wIHN0YXR1cy4gQ0FUViB3aWxsIGFsd2F5cyBkbyBhIHBhdGNoIGV2ZW4gaWZcbiAgLy8gdGhlcmUgYXJlIG5vIGNvbW1pdHMsIHNvIGxvb2sgYXQgY29tbWl0cyBvdXJzZWx2ZXMgZmlyc3QgdG8gZGVjaWRlXG4gIC8vIGlmIHdlIGV2ZW4gc2hvdWxkIGRvIG5vdGhpbmcgYXQgYWxsLlxuICBjb25zdCBzaG91bGRSZWxlYXNlID0gaXNGaXJzdFJlbGVhc2VcbiAgICA/IHRydWVcbiAgICA6IGF3YWl0IGhhc05ld0ludGVyZXN0aW5nQ29tbWl0cyh7XG4gICAgICAgIGN3ZCxcbiAgICAgICAgbGF0ZXN0VGFnLFxuICAgICAgICByZWxlYXNhYmxlQ29tbWl0czogb3B0aW9ucy5yZWxlYXNhYmxlQ29tbWl0cyxcbiAgICAgIH0pO1xuXG4gIGNvbnN0IGNhdHYgPSBuZXcgQ29tbWl0QW5kVGFnVmVyc2lvbihvcHRpb25zLmJ1bXBQYWNrYWdlLCBjd2QsIHtcbiAgICB2ZXJzaW9uRmlsZSxcbiAgICBjaGFuZ2Vsb2dGaWxlLFxuICAgIHByZXJlbGVhc2UsXG4gICAgY29uZmlnT3B0aW9uczogb3B0aW9ucy52ZXJzaW9ucmNPcHRpb25zLFxuICAgIHRhZ1ByZWZpeCxcbiAgfSk7XG5cbiAgLy8gV2UgdXNlZCB0byB0cmFuc2xhdGUgYGlzRmlyc3RSZWxlYXNlYCB0byB0aGUgYC0tZmlyc3QtcmVsZWFzZWAgZmxhZyBvZiBDQVRWLlxuICAvLyBXaGF0IHRoYXQgZG9lcyBpcyBza2lwIGEgYnVtcCwgb25seSBnZW5lcmF0ZSB0aGUgY2hhbmdlbG9nLlxuICAvL1xuICAvLyBPdXIgYHsgYnVtcDogbm9uZSB9YCBkb2VzIHRoZSBzYW1lLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNhcnJ5IG92ZXIgdGhpc1xuICAvLyBmbGFnIGFueW1vcmUuXG4gIGxldCBidW1wVHlwZTogQnVtcFR5cGUgPVxuICAgIHNob3VsZFJlbGVhc2UgJiYgIWlzRmlyc3RSZWxlYXNlXG4gICAgICA/IHJlbGF0aXZlQnVtcFR5cGUobGF0ZXN0VmVyc2lvbiwgYXdhaXQgY2F0di5kcnlSdW4oKSlcbiAgICAgIDogeyBidW1wOiBcIm5vbmVcIiB9O1xuXG4gIGxvZ2dpbmcuaW5mbyhgQnVtcCBmcm9tIGNvbW1pdHM6ICR7cmVuZGVyQnVtcFR5cGUoYnVtcFR5cGUpfWApO1xuICBpZiAob3B0aW9ucy5uZXh0VmVyc2lvbkNvbW1hbmQpIHtcbiAgICBjb25zdCBuZXh0VmVyc2lvbiA9IGF3YWl0IHJhd1NoZWxsLmNhcHR1cmUob3B0aW9ucy5uZXh0VmVyc2lvbkNvbW1hbmQsIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudjoge1xuICAgICAgICBWRVJTSU9OOiBsYXRlc3RWZXJzaW9uLFxuICAgICAgICBTVUdHRVNURURfQlVNUDogcmVuZGVyQnVtcFR5cGUoYnVtcFR5cGUpLFxuICAgICAgICAuLi4obGF0ZXN0VGFnID8geyBMQVRFU1RfVEFHOiBsYXRlc3RUYWcgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAobmV4dFZlcnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJ1bXBUeXBlID0gcGFyc2VCdW1wVHlwZShuZXh0VmVyc2lvbik7XG4gICAgICAgIGxvZ2dpbmcuaW5mbyhcbiAgICAgICAgICBgQnVtcCBmcm9tIG5leHRWZXJzaW9uQ29tbWFuZDogJHtyZW5kZXJCdW1wVHlwZShidW1wVHlwZSl9YCxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBuZXh0VmVyc2lvbkNvbW1hbmQgXCIke29wdGlvbnMubmV4dFZlcnNpb25Db21tYW5kfVwiIHJldHVybmVkIGludmFsaWQgb3V0cHV0OiAke2V9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXNwZWN0IG1pbk1ham9yVmVyc2lvbiB0byBjb3JyZWN0IHRoZSByZXN1bHQgb2YgdGhlIG5leHRWZXJzaW9uQ29tbWFuZFxuICBpZiAobWluTWFqb3JWZXJzaW9uKSB7XG4gICAgY29uc3QgYnVtcGVkVmVyc2lvbiA9IHBlcmZvcm1CdW1wKGxhdGVzdFZlcnNpb24sIGJ1bXBUeXBlKTtcbiAgICBjb25zdCBbbWFqb3JWZXJzaW9uXSA9IGJ1bXBlZFZlcnNpb24uc3BsaXQoXCIuXCIpO1xuICAgIGNvbnN0IG1ham9yVmVyc2lvbk51bWJlciA9IHBhcnNlSW50KG1ham9yVmVyc2lvbiwgMTApO1xuICAgIGlmIChtYWpvclZlcnNpb25OdW1iZXIgPCBtaW5NYWpvclZlcnNpb24pIHtcbiAgICAgIGJ1bXBUeXBlID0geyBidW1wOiBcImFic29sdXRlXCIsIGFic29sdXRlOiBgJHttaW5NYWpvclZlcnNpb259LjAuMGAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBJbnZva2UgQ0FUViB3aXRoIHRoZSBvcHRpb25zIHdlIGxhbmRlZCBvbi4gSWYgd2UgZGVjaWRlZCBub3QgdG8gZG8gYSBidW1wLFxuICAvLyB3ZSB3aWxsIHVzZSB0aGlzIHRvIHJlZ2VuZXJhdGUgdGhlIGNoYW5nZWxvZyBvZiB0aGUgbW9zdCByZWNlbnQgdmVyc2lvbi5cbiAgY29uc3QgbmV3UmVsZWFzZSA9IGJ1bXBUeXBlLmJ1bXAgIT09IFwibm9uZVwiO1xuXG4gIC8vIElmIHdlJ3JlIG5vdCBkb2luZyBhIG5ldyByZWxlYXNlIGFuZCB0aGlzIGlzIG5vdCB0aGVcbiAgLy8gZmlyc3QgcmVsZWFzZSwgd2UncmUganVzdCByZWdlbmVyYXRpbmcgdGhlIHByZXZpb3VzIGNoYW5nZWxvZyBhZ2Fpbi5cbiAgaWYgKCFuZXdSZWxlYXNlICYmICFpc0ZpcnN0UmVsZWFzZSkge1xuICAgIGF3YWl0IGNhdHYucmVnZW5lcmF0ZVByZXZpb3VzQ2hhbmdlTG9nKGxhdGVzdFZlcnNpb24sIGxhdGVzdFRhZyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlIHdlJ3JlIGVpdGhlciBkb2luZyBhIGJ1bXAgKyByZWxlYXNlLCBvciB3ZSdyZSByZWxlYXNpbmcgdGhlXG4gICAgLy8gZmlyc3QgdmVyc2lvbiBhcyAwLjAuMCAod2hpY2ggaXMgYWxyZWFkeSB0aGUgbnVtYmVyIGluIHRoZSBmaWxlIHNvIHdlXG4gICAgLy8gc2tpcCBidW1waW5nKS5cbiAgICBhd2FpdCBjYXR2Lmludm9rZSh7XG4gICAgICByZWxlYXNlQXM6IG5ld1JlbGVhc2UgPyByZW5kZXJCdW1wVHlwZShidW1wVHlwZSkgOiB1bmRlZmluZWQsXG4gICAgICBza2lwQnVtcDogIW5ld1JlbGVhc2UsXG4gICAgfSk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSB0aGUgdmVyc2lvbiB0aGF0IHdlIGVuZGVkIHVwIHdpdGhcbiAgY29uc3QgbmV3VmVyc2lvbiA9IChhd2FpdCB0cnlSZWFkVmVyc2lvbkZpbGUodmVyc2lvbkZpbGUpKS52ZXJzaW9uO1xuICBpZiAoIW5ld1ZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1bXAgZmFpbGVkOiAke3ZlcnNpb25GaWxlfSBkb2VzIG5vdCBoYXZlIGEgdmVyc2lvbiBzZXRgKTtcbiAgfVxuICBpZiAobWFqb3IpIHtcbiAgICBpZiAoIW5ld1ZlcnNpb24uc3RhcnRzV2l0aChgJHttYWpvcn0uYCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGJ1bXAgZmFpbGVkOiB0aGlzIGJyYW5jaCBpcyBjb25maWd1cmVkIHRvIG9ubHkgcHVibGlzaCB2JHttYWpvcn0gcmVsZWFzZXMgLSBidW1wIHJlc3VsdGVkIGluICR7bmV3VmVyc2lvbn1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgaWYgKG1pbm9yKSB7XG4gICAgaWYgKCFuZXdWZXJzaW9uLnN0YXJ0c1dpdGgoYCR7bWFqb3J9LiR7bWlub3J9YCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGJ1bXAgZmFpbGVkOiB0aGlzIGJyYW5jaCBpcyBjb25maWd1cmVkIHRvIG9ubHkgcHVibGlzaCB2JHttYWpvcn0uJHttaW5vcn0gcmVsZWFzZXMgLSBidW1wIHJlc3VsdGVkIGluICR7bmV3VmVyc2lvbn1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXBvcnQgY3VyZW50IHN0YXR1cyBpbnRvIHRoZSBkaXN0LyBkaXJlY3RvcnlcbiAgY29uc3QgbmV3VGFnID0gYCR7dGFnUHJlZml4fXYke25ld1ZlcnNpb259YDtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKGJ1bXBGaWxlLCBuZXdWZXJzaW9uKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHJlbGVhc2VUYWdGaWxlLCBuZXdUYWcpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBiYXNlZCBvbiByZWxlYXNlYWJsZSBjb21taXRzIHdoZXRoZXIgd2Ugc2hvdWxkIHJlbGVhc2Ugb3Igbm90XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhc05ld0ludGVyZXN0aW5nQ29tbWl0cyhvcHRpb25zOiB7XG4gIHJlbGVhc2FibGVDb21taXRzPzogc3RyaW5nO1xuICBsYXRlc3RUYWc6IHN0cmluZztcbiAgY3dkOiBzdHJpbmc7XG59KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIGAkTEFURVNUX1RBR2AgaXMgcHJvdmlkZWQgdG8gdGhlIGNvbW1hbmQgYXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGVcbiAgLy8gKHJhdGhlciB0aGFuIGludGVycG9sYXRlZCBpbnRvIHRoZSBjb21tYW5kIHN0cmluZyksIGNvbnNpc3RlbnQgd2l0aCBob3dcbiAgLy8gYG5leHRWZXJzaW9uQ29tbWFuZGAgcmVjZWl2ZXMgaXQuXG4gIGNvbnN0IGZpbmRDb21taXRzID1cbiAgICBvcHRpb25zLnJlbGVhc2FibGVDb21taXRzID8/IFJlbGVhc2FibGVDb21taXRzLmV2ZXJ5Q29tbWl0KCkuY21kO1xuXG4gIGNvbnN0IGNvbW1pdHNTaW5jZUxhc3RUYWcgPSAoXG4gICAgYXdhaXQgcmF3U2hlbGwudHJ5Q2FwdHVyZShmaW5kQ29tbWl0cywge1xuICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgIGVudjogeyBMQVRFU1RfVEFHOiBvcHRpb25zLmxhdGVzdFRhZyB9LFxuICAgIH0pXG4gICk/LnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCBudW1Db21taXRzU2luY2VMYXN0VGFnID0gY29tbWl0c1NpbmNlTGFzdFRhZz8ubGVuZ3RoID8/IDA7XG4gIGxvZ2dpbmcuaW5mbyhcbiAgICBgTnVtYmVyIG9mIGNvbW1pdHMgc2luY2UgJHtvcHRpb25zLmxhdGVzdFRhZ306ICR7bnVtQ29tbWl0c1NpbmNlTGFzdFRhZ31gLFxuICApO1xuXG4gIC8vIE5vdGhpbmcgdG8gcmVsZWFzZSByaWdodCBub3dcbiAgaWYgKG51bUNvbW1pdHNTaW5jZUxhc3RUYWcgPT09IDApIHtcbiAgICBsb2dnaW5nLmluZm8oXCJObyBuZXcgaW50ZXJlc3RpbmcgY29tbWl0cy5cIik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRyeVJlYWRWZXJzaW9uRmlsZShcbiAgdmVyc2lvbkZpbGU6IHN0cmluZyxcbik6IFByb21pc2U8eyBjb250ZW50czogYW55OyB2ZXJzaW9uPzogc3RyaW5nOyBuZXdsaW5lOiBib29sZWFuIH0+IHtcbiAgaWYgKCFleGlzdHNTeW5jKHZlcnNpb25GaWxlKSkge1xuICAgIHJldHVybiB7IGNvbnRlbnRzOiB7fSwgbmV3bGluZTogdHJ1ZSB9O1xuICB9XG4gIGNvbnN0IHJhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKHZlcnNpb25GaWxlLCBcInV0Zi04XCIpO1xuICBjb25zdCBjb250ZW50cyA9IEpTT04ucGFyc2UocmF3KTtcblxuICByZXR1cm4ge1xuICAgIGNvbnRlbnRzLFxuICAgIHZlcnNpb246IGNvbnRlbnRzLnZlcnNpb24sXG4gICAgbmV3bGluZTogcmF3LmVuZHNXaXRoKFwiXFxuXCIpLFxuICB9O1xufVxuXG5pbnRlcmZhY2UgTGF0ZXN0VGFnT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXb3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgZ2l0IHJlcG9zaXRvcnkuXG4gICAqL1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcbiAgLyoqXG4gICAqIE1ham9yIHZlcnNpb24gdG8gc2VsZWN0IGZyb20uXG4gICAqL1xuICByZWFkb25seSBtYWpvcj86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1pbm9yIHZlcnNpb24gdG8gc2VsZWN0IGZyb20uXG4gICAqL1xuICByZWFkb25seSBtaW5vcj86IG51bWJlcjtcbiAgLyoqXG4gICAqIEEgcHJlLXJlbGVhc2Ugc3VmZml4LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlcmVsZWFzZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEEgcHJlZml4IGFwcGxpZWQgdG8gYWxsIHRhZ3MuXG4gICAqL1xuICByZWFkb25seSBwcmVmaXg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBsYXRlc3QgcmVsZWFzZSB0YWcuXG4gKiBAcGFyYW0gbWFqb3IgKG9wdGlvbmFsKSBBIG1ham9yIHZlcnNpb24gbGluZSB0byBzZWxlY3QgZnJvbVxuICogQHBhcmFtIHByZXJlbGVhc2UgKG9wdGlvbmFsKSBBIHByZS1yZWxlYXNlIHN1ZmZpeC5cbiAqIEByZXR1cm5zIHRoZSBsYXRlc3QgdGFnLCBhbmQgd2hldGhlciBpdCBpcyB0aGUgZmlyc3QgcmVsZWFzZSBvciBub3RcbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5lTGF0ZXN0VGFnKG9wdGlvbnM6IExhdGVzdFRhZ09wdGlvbnMpOiB7XG4gIGxhdGVzdFZlcnNpb246IHN0cmluZztcbiAgbGF0ZXN0VGFnOiBzdHJpbmc7XG4gIGlzRmlyc3RSZWxlYXNlOiBib29sZWFuO1xufSB7XG4gIGNvbnN0IHsgY3dkLCBtYWpvciwgbWlub3IsIHByZXJlbGVhc2UsIHByZWZpeCB9ID0gb3B0aW9ucztcblxuICAvLyBmaWx0ZXIgb25seSB0YWdzIGZvciB0aGlzIHByZWZpeCBhbmQgbWFqb3IgdmVyc2lvbiBpZiBzcGVjaWZpZWQgKHN0YXJ0IHdpdGggXCJ2Tk4uXCIpLlxuICBsZXQgcHJlZml4RmlsdGVyOiBzdHJpbmc7XG4gIGlmIChtYWpvciAhPT0gdW5kZWZpbmVkICYmIG1pbm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBwcmVmaXhGaWx0ZXIgPSBgJHtwcmVmaXh9diR7bWFqb3J9LiR7bWlub3J9LipgO1xuICB9IGVsc2UgaWYgKG1ham9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBwcmVmaXhGaWx0ZXIgPSBgJHtwcmVmaXh9diR7bWFqb3J9LipgO1xuICB9IGVsc2Uge1xuICAgIHByZWZpeEZpbHRlciA9IGAke3ByZWZpeH12KmA7XG4gIH1cblxuICBjb25zdCBzdGRvdXQgPSBnaXQuY2FwdHVyZShcbiAgICBbXG4gICAgICBcIi1jXCIsXG4gICAgICBcInZlcnNpb25zb3J0LnN1ZmZpeD0tXCIsIC8vIG1ha2VzIHN1cmUgcHJlLXJlbGVhc2UgdmVyc2lvbnMgYXJlIGxpc3RlZCBhZnRlciB0aGUgcHJpbWFyeSB2ZXJzaW9uXG4gICAgICBcInRhZ1wiLFxuICAgICAgXCItLXNvcnQ9LXZlcnNpb246cmVmbmFtZVwiLCAvLyBzb3J0IGFzIHZlcnNpb25zIGFuZCBub3QgbGV4aWNvZ3JhcGhpY2FsbHlcbiAgICAgIFwiLS1saXN0XCIsXG4gICAgICBwcmVmaXhGaWx0ZXIsXG4gICAgXSxcbiAgICB7IGN3ZCB9LFxuICApO1xuXG4gIGxldCB0YWdzID0gc3Rkb3V0Py5zcGxpdChcIlxcblwiKTtcblxuICAvLyBpZiBwcmVyZWxlYXNlIGlzIHNldCBhbmQgdGhlcmUgYXJlIGV4aXN0aW5nIHByZXJlbGVhc2UgdGFncywgZmlsdGVyIHZlcnNpb25zIHRoYXQgZW5kIHdpdGggXCItUFJFLmRkZFwiLlxuICBjb25zdCBwcmVyZWxlYXNlVGFncyA9IHRhZ3MuZmlsdGVyKCh4KSA9PlxuICAgIG5ldyBSZWdFeHAoYC0ke3ByZXJlbGVhc2V9XFxcXC5bMC05XSskYCkudGVzdCh4KSxcbiAgKTtcbiAgaWYgKHByZXJlbGVhc2UgJiYgcHJlcmVsZWFzZVRhZ3MubGVuZ3RoID4gMCkge1xuICAgIGxldCBwcmVyZWxlYXNlVGFnID0gcHJlcmVsZWFzZVRhZ3NbMF07XG5cbiAgICAvKipcbiAgICAgKiBDb3ZlciB0aGUgZm9sbG93aW5nIGNhc2Ugc3BlY2lmaWNhbGx5XG4gICAgICogMSAtIHYxLjAuMFxuICAgICAqIDIgLSB2MS4wLjEtYmV0YS4wXG4gICAgICogMyAtIHYxLjAuMS1iZXRhLjFcbiAgICAgKiA0IC0gdjEuMC4xXG4gICAgICogNSAtIG5vdyBwdWJsaXNoIGEgbmV3IHJlbGVhc2Ugb24gdGhlIHByZXJlbGVhc2UgYnJhbmNoXG4gICAgICogICAgYnkgc2V0dGluZyB0aGUgbGF0ZXN0VGFnIGFzIHYxLjAuMSBpbnN0ZWFkIG9mIHYxLjAuMS1iZXRhLjFcbiAgICAgKi9cbiAgICBjb25zdCByZWxlYXNlVGFncyA9IHRhZ3MuZmlsdGVyKCh4KSA9PlxuICAgICAgbmV3IFJlZ0V4cChgXiR7cHJlZml4fXYoWzAtOV0rKVxcXFwuKFswLTldKylcXFxcLihbMC05XSspJGApLnRlc3QoeCksXG4gICAgKTtcblxuICAgIGxldCByZWxlYXNlVGFnOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlbGVhc2VUYWdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlbGVhc2VUYWcgPSByZWxlYXNlVGFnc1swXTtcbiAgICB9XG5cbiAgICBpZiAocHJlZml4KSB7XG4gICAgICByZWxlYXNlVGFnID0gcmVsZWFzZVRhZz8uc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpO1xuICAgICAgcHJlcmVsZWFzZVRhZyA9IHByZXJlbGVhc2VUYWcuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpO1xuICAgIH1cblxuICAgIGlmIChyZWxlYXNlVGFnICYmIGNvbXBhcmUocmVsZWFzZVRhZywgcHJlcmVsZWFzZVRhZykgPT09IDEpIHtcbiAgICAgIHRhZ3MgPSByZWxlYXNlVGFncztcbiAgICB9IGVsc2Uge1xuICAgICAgdGFncyA9IHByZXJlbGVhc2VUYWdzO1xuICAgIH1cbiAgfVxuXG4gIHRhZ3MgPSB0YWdzLmZpbHRlcigoeCkgPT4geCk7XG5cbiAgLy8gaWYgYSBwcmUtcmVsZWFzZSB0YWcgaXMgdXNlZCwgdGhlbiBhZGQgaXQgdG8gdGhlIGluaXRpYWwgdmVyc2lvblxuICBsZXQgaXNGaXJzdFJlbGVhc2UgPSBmYWxzZTtcbiAgbGV0IGxhdGVzdFRhZztcblxuICBpZiAodGFncy5sZW5ndGggPiAwKSB7XG4gICAgbGF0ZXN0VGFnID0gdGFnc1swXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbml0aWFsID0gYCR7cHJlZml4fXYke21ham9yID8/IDB9LiR7bWlub3IgPz8gMH0uMGA7XG4gICAgbGF0ZXN0VGFnID0gcHJlcmVsZWFzZSA/IGAke2luaXRpYWx9LSR7cHJlcmVsZWFzZX0uMGAgOiBpbml0aWFsO1xuICAgIGlzRmlyc3RSZWxlYXNlID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIHJlbW92ZSB0YWcgcHJlZml4IChpZiBleGlzdHMpXG4gIGxldCBsYXRlc3RWZXJzaW9uID0gbGF0ZXN0VGFnO1xuICBpZiAocHJlZml4ICYmIGxhdGVzdFZlcnNpb24uc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgbGF0ZXN0VmVyc2lvbiA9IGxhdGVzdFZlcnNpb24uc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpO1xuICB9XG5cbiAgLy8gcmVtb3ZlIFwidlwiIHByZWZpeCAoaWYgZXhpc3RzKVxuICBpZiAobGF0ZXN0VmVyc2lvbi5zdGFydHNXaXRoKFwidlwiKSkge1xuICAgIGxhdGVzdFZlcnNpb24gPSBsYXRlc3RWZXJzaW9uLnN1YnN0cmluZygxKTtcbiAgfVxuXG4gIHJldHVybiB7IGxhdGVzdFZlcnNpb24sIGxhdGVzdFRhZywgaXNGaXJzdFJlbGVhc2UgfTtcbn1cbiJdfQ==
|
package/lib/release/publisher.js
CHANGED
|
@@ -48,7 +48,7 @@ const PUBLISH_JOB_PREFIX = "release_";
|
|
|
48
48
|
* Under the hood, it uses https://github.com/cdklabs/publib
|
|
49
49
|
*/
|
|
50
50
|
class Publisher extends component_1.Component {
|
|
51
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.release.Publisher", version: "0.
|
|
51
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.release.Publisher", version: "0.101.0" };
|
|
52
52
|
static PUBLISH_GIT_TASK_NAME = "publish:git";
|
|
53
53
|
buildJobId;
|
|
54
54
|
artifactName;
|
|
@@ -7,7 +7,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
|
7
7
|
* and release artifact automation
|
|
8
8
|
*/
|
|
9
9
|
class ReleaseTrigger {
|
|
10
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.release.ReleaseTrigger", version: "0.
|
|
10
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.release.ReleaseTrigger", version: "0.101.0" };
|
|
11
11
|
/**
|
|
12
12
|
* Creates a manual release trigger.
|
|
13
13
|
*
|
package/lib/release/release.js
CHANGED
|
@@ -64,7 +64,7 @@ const DEPENDENT_JOB_CONDITIONAL = `needs.${BUILD_JOBID}.outputs.${TAG_EXISTS_OUT
|
|
|
64
64
|
* By default, no branches are released. To add branches, call `addBranch()`.
|
|
65
65
|
*/
|
|
66
66
|
class Release extends component_1.Component {
|
|
67
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.release.Release", version: "0.
|
|
67
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.release.Release", version: "0.101.0" };
|
|
68
68
|
static ANTI_TAMPER_CMD = "git diff --ignore-space-at-eol --exit-code";
|
|
69
69
|
/**
|
|
70
70
|
* Returns the `Release` component of a project or `undefined` if the project
|
package/lib/renovatebot.js
CHANGED
|
@@ -68,7 +68,7 @@ var RenovatebotMinimumReleaseAgeBehaviour;
|
|
|
68
68
|
* Ignores the versions controlled by Projen.
|
|
69
69
|
*/
|
|
70
70
|
class Renovatebot extends component_1.Component {
|
|
71
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Renovatebot", version: "0.
|
|
71
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Renovatebot", version: "0.101.0" };
|
|
72
72
|
/**
|
|
73
73
|
* The file holding the renovatebot configuration
|
|
74
74
|
*/
|
package/lib/run-task.cjs
CHANGED
|
@@ -1641,7 +1641,7 @@ var require_package = __commonJS({
|
|
|
1641
1641
|
},
|
|
1642
1642
|
devDependencies: {
|
|
1643
1643
|
"@biomejs/biome": "^2",
|
|
1644
|
-
"@jsii/check-node": "^1.
|
|
1644
|
+
"@jsii/check-node": "^1.137.0",
|
|
1645
1645
|
"@types/conventional-changelog-config-spec": "^2.1.5",
|
|
1646
1646
|
"@types/ini": "^1.3.34",
|
|
1647
1647
|
"@types/jest": "^30",
|
|
@@ -1662,9 +1662,9 @@ var require_package = __commonJS({
|
|
|
1662
1662
|
jest: "^30",
|
|
1663
1663
|
"jest-junit": "^17",
|
|
1664
1664
|
jsii: "6.0.x",
|
|
1665
|
-
"jsii-diff": "^1.
|
|
1665
|
+
"jsii-diff": "^1.137.0",
|
|
1666
1666
|
"jsii-docgen": "^10.5.0",
|
|
1667
|
-
"jsii-pacmak": "^1.
|
|
1667
|
+
"jsii-pacmak": "^1.137.0",
|
|
1668
1668
|
"jsii-rosetta": "6.0.x",
|
|
1669
1669
|
json2jsii: "^0.5.19",
|
|
1670
1670
|
"license-checker": "^25.0.1",
|
|
@@ -1733,7 +1733,7 @@ var require_package = __commonJS({
|
|
|
1733
1733
|
publishConfig: {
|
|
1734
1734
|
access: "public"
|
|
1735
1735
|
},
|
|
1736
|
-
version: "0.
|
|
1736
|
+
version: "0.101.0",
|
|
1737
1737
|
jest: {
|
|
1738
1738
|
coverageProvider: "v8",
|
|
1739
1739
|
coverageReporters: [
|
|
@@ -14295,7 +14295,7 @@ function createPath(path62) {
|
|
|
14295
14295
|
|
|
14296
14296
|
// src/common.ts
|
|
14297
14297
|
var PROJEN_DIR = ".projen";
|
|
14298
|
-
var TASKS_MANIFEST_VERSION =
|
|
14298
|
+
var TASKS_MANIFEST_VERSION = 3;
|
|
14299
14299
|
var IS_TEST_RUN = process.env.NODE_ENV === "test";
|
|
14300
14300
|
var packageVersion = require_package().version;
|
|
14301
14301
|
|
|
@@ -14408,71 +14408,23 @@ function shimTool(file) {
|
|
|
14408
14408
|
}
|
|
14409
14409
|
var npm = shimTool("npm");
|
|
14410
14410
|
var npx = shimTool("npx");
|
|
14411
|
-
|
|
14412
|
-
|
|
14413
|
-
|
|
14414
|
-
|
|
14415
|
-
|
|
14416
|
-
|
|
14417
|
-
|
|
14418
|
-
|
|
14419
|
-
|
|
14420
|
-
|
|
14421
|
-
|
|
14422
|
-
|
|
14423
|
-
|
|
14424
|
-
|
|
14425
|
-
|
|
14426
|
-
|
|
14427
|
-
|
|
14428
|
-
});
|
|
14429
|
-
return {
|
|
14430
|
-
status: result.status,
|
|
14431
|
-
stdout: result.stdout ?? null,
|
|
14432
|
-
stderr: result.stderr ?? null,
|
|
14433
|
-
error: result.error
|
|
14434
|
-
};
|
|
14435
|
-
},
|
|
14436
|
-
/**
|
|
14437
|
-
* Runs a user-supplied shell command line and resolves its trimmed STDOUT.
|
|
14438
|
-
* Rejects if the command exits non-zero.
|
|
14439
|
-
*/
|
|
14440
|
-
capture: async (command, options) => {
|
|
14441
|
-
const result = rawShell.exec(command, {
|
|
14442
|
-
cwd: options.cwd,
|
|
14443
|
-
env: { ...process.env, ...options.env },
|
|
14444
|
-
capture: true
|
|
14445
|
-
});
|
|
14446
|
-
if (result.error) {
|
|
14447
|
-
throw result.error;
|
|
14448
|
-
}
|
|
14449
|
-
if (result.status !== 0) {
|
|
14450
|
-
const error = new Error(
|
|
14451
|
-
`Command failed (exit code ${result.status}): ${command}`
|
|
14452
|
-
);
|
|
14453
|
-
error.status = result.status;
|
|
14454
|
-
error.stderr = result.stderr;
|
|
14455
|
-
throw error;
|
|
14456
|
-
}
|
|
14457
|
-
return (result.stdout?.toString("utf-8") ?? "").trim();
|
|
14458
|
-
},
|
|
14459
|
-
/**
|
|
14460
|
-
* Runs a user-supplied shell command line and resolves its trimmed STDOUT,
|
|
14461
|
-
* or `undefined` if the command failed or produced no output.
|
|
14462
|
-
*/
|
|
14463
|
-
tryCapture: async (command, options) => {
|
|
14464
|
-
const result = rawShell.exec(command, {
|
|
14465
|
-
cwd: options.cwd,
|
|
14466
|
-
env: { ...process.env, ...options.env },
|
|
14467
|
-
capture: true
|
|
14468
|
-
});
|
|
14469
|
-
if (result.error || result.status !== 0) {
|
|
14470
|
-
return void 0;
|
|
14471
|
-
}
|
|
14472
|
-
const out = (result.stdout?.toString("utf-8") ?? "").trim();
|
|
14473
|
-
return out || void 0;
|
|
14474
|
-
}
|
|
14475
|
-
};
|
|
14411
|
+
function systemShell(command, options) {
|
|
14412
|
+
debug(`${command} (cwd: ${options.cwd})`);
|
|
14413
|
+
const result = child_process.spawnSync(command, {
|
|
14414
|
+
cwd: options.cwd,
|
|
14415
|
+
shell: true,
|
|
14416
|
+
maxBuffer: MAX_BUFFER,
|
|
14417
|
+
env: options.env,
|
|
14418
|
+
// "pipe" for STDERR (when capturing) means it appears in exceptions.
|
|
14419
|
+
stdio: options.capture ? ["inherit", "pipe", "pipe"] : "inherit"
|
|
14420
|
+
});
|
|
14421
|
+
return {
|
|
14422
|
+
status: result.status,
|
|
14423
|
+
stdout: result.stdout ?? null,
|
|
14424
|
+
stderr: result.stderr ?? null,
|
|
14425
|
+
error: result.error
|
|
14426
|
+
};
|
|
14427
|
+
}
|
|
14476
14428
|
|
|
14477
14429
|
// src/cli/task-runtime.ts
|
|
14478
14430
|
var parseConflictJSONModule = require_lib2();
|
|
@@ -14480,6 +14432,9 @@ var parseConflictJSON = parseConflictJSONModule?.default ?? parseConflictJSONMod
|
|
|
14480
14432
|
var ENV_TRIM_LEN = 20;
|
|
14481
14433
|
var ARGS_MARKER = "$@";
|
|
14482
14434
|
var QUOTED_ARGS_MARKER = `"${ARGS_MARKER}"`;
|
|
14435
|
+
function quoteArg(arg) {
|
|
14436
|
+
return '"' + arg.replace(/(["$`\\])/g, "\\$1") + '"';
|
|
14437
|
+
}
|
|
14483
14438
|
var TaskRuntime = class _TaskRuntime {
|
|
14484
14439
|
/**
|
|
14485
14440
|
* The project-relative path of the tasks manifest file.
|
|
@@ -14636,7 +14591,11 @@ var RunTask = class {
|
|
|
14636
14591
|
this.logDebug((0, import_chalk2.gray)("No actions have been specified for this task."));
|
|
14637
14592
|
return;
|
|
14638
14593
|
}
|
|
14639
|
-
this.env = await this.resolveEnvironment(
|
|
14594
|
+
this.env = await this.resolveEnvironment(
|
|
14595
|
+
this.envParam,
|
|
14596
|
+
parents,
|
|
14597
|
+
this.resolveShell()
|
|
14598
|
+
);
|
|
14640
14599
|
const envlogs = [];
|
|
14641
14600
|
for (const [k, v] of Object.entries(this.env)) {
|
|
14642
14601
|
const vv = v ?? "";
|
|
@@ -14646,7 +14605,7 @@ var RunTask = class {
|
|
|
14646
14605
|
if (envlogs.length) {
|
|
14647
14606
|
this.logDebug((0, import_chalk2.gray)(`${(0, import_chalk2.underline)("env")}: ${envlogs.join(" ")}`));
|
|
14648
14607
|
}
|
|
14649
|
-
if (!await this.evalCondition(task)) {
|
|
14608
|
+
if (!await this.evalCondition(task, this.resolveShell())) {
|
|
14650
14609
|
this.log("condition exited with non-zero - skipping");
|
|
14651
14610
|
return;
|
|
14652
14611
|
}
|
|
@@ -14663,7 +14622,8 @@ var RunTask = class {
|
|
|
14663
14622
|
);
|
|
14664
14623
|
}
|
|
14665
14624
|
for (const step of task.steps) {
|
|
14666
|
-
|
|
14625
|
+
const stepShell = this.resolveShell(step);
|
|
14626
|
+
if (!await this.evalCondition(step, stepShell)) {
|
|
14667
14627
|
this.log("condition exited with non-zero - skipping");
|
|
14668
14628
|
continue;
|
|
14669
14629
|
}
|
|
@@ -14683,42 +14643,50 @@ var RunTask = class {
|
|
|
14683
14643
|
);
|
|
14684
14644
|
}
|
|
14685
14645
|
const execs = step.exec ? [step.exec] : [];
|
|
14686
|
-
const env = await this.evalEnvironment(step.env ?? {});
|
|
14646
|
+
const env = await this.evalEnvironment(step.env ?? {}, stepShell);
|
|
14687
14647
|
if (step.builtin) {
|
|
14688
14648
|
execs.push(this.renderBuiltin(step.builtin));
|
|
14689
14649
|
}
|
|
14650
|
+
if (step.execArgs) {
|
|
14651
|
+
const argv = [];
|
|
14652
|
+
let placed = false;
|
|
14653
|
+
for (const element of step.execArgs) {
|
|
14654
|
+
if (element === ARGS_MARKER) {
|
|
14655
|
+
argv.push(...argsList);
|
|
14656
|
+
placed = true;
|
|
14657
|
+
} else {
|
|
14658
|
+
argv.push(element);
|
|
14659
|
+
}
|
|
14660
|
+
}
|
|
14661
|
+
if (!placed) {
|
|
14662
|
+
argv.push(...argsList);
|
|
14663
|
+
}
|
|
14664
|
+
execs.push(argv);
|
|
14665
|
+
}
|
|
14690
14666
|
for (const exec of execs) {
|
|
14691
|
-
let hasError = false;
|
|
14692
14667
|
let command = exec;
|
|
14693
|
-
if (command
|
|
14694
|
-
|
|
14695
|
-
|
|
14696
|
-
|
|
14697
|
-
|
|
14698
|
-
|
|
14699
|
-
|
|
14700
|
-
|
|
14701
|
-
|
|
14702
|
-
|
|
14703
|
-
const cwd2 = step.cwd;
|
|
14704
|
-
try {
|
|
14705
|
-
const result = await this.shell({
|
|
14706
|
-
command,
|
|
14707
|
-
cwd: cwd2,
|
|
14708
|
-
extraEnv: env
|
|
14709
|
-
});
|
|
14710
|
-
hasError = result.status !== 0;
|
|
14711
|
-
} catch (e) {
|
|
14712
|
-
if (e?.message?.startsWith("non-zero exit code:")) {
|
|
14713
|
-
hasError = true;
|
|
14668
|
+
if (typeof command === "string") {
|
|
14669
|
+
if (command.includes(QUOTED_ARGS_MARKER)) {
|
|
14670
|
+
command = command.replace(
|
|
14671
|
+
QUOTED_ARGS_MARKER,
|
|
14672
|
+
argsList.map(quoteArg).join(" ")
|
|
14673
|
+
);
|
|
14674
|
+
} else if (command.includes(ARGS_MARKER)) {
|
|
14675
|
+
command = command.replace(ARGS_MARKER, argsList.join(" "));
|
|
14676
|
+
} else {
|
|
14677
|
+
command = [command, ...argsList].join(" ");
|
|
14714
14678
|
}
|
|
14715
|
-
throw e;
|
|
14716
14679
|
}
|
|
14717
|
-
|
|
14680
|
+
const cwd2 = step.cwd;
|
|
14681
|
+
const result = await this.shell({
|
|
14682
|
+
command,
|
|
14683
|
+
cwd: cwd2,
|
|
14684
|
+
extraEnv: env,
|
|
14685
|
+
shell: stepShell
|
|
14686
|
+
});
|
|
14687
|
+
if (result.status !== 0) {
|
|
14718
14688
|
throw new Error(
|
|
14719
|
-
`Task "${this.fullname}" failed when executing "${command}" (cwd: ${(0, import_path.resolve)(
|
|
14720
|
-
cwd2 ?? this.workdir
|
|
14721
|
-
)})`
|
|
14689
|
+
`Task "${this.fullname}" failed when executing "${Array.isArray(command) ? command.join(" ") : command}" (cwd: ${(0, import_path.resolve)(cwd2 ?? this.workdir)})`
|
|
14722
14690
|
);
|
|
14723
14691
|
}
|
|
14724
14692
|
}
|
|
@@ -14731,15 +14699,15 @@ var RunTask = class {
|
|
|
14731
14699
|
* evaluates to false (exits with non-zero), indicating that the task should
|
|
14732
14700
|
* be skipped.
|
|
14733
14701
|
*/
|
|
14734
|
-
async evalCondition(taskOrStep) {
|
|
14702
|
+
async evalCondition(taskOrStep, shell) {
|
|
14735
14703
|
if (!taskOrStep.condition) {
|
|
14736
14704
|
return true;
|
|
14737
14705
|
}
|
|
14738
14706
|
this.log((0, import_chalk2.gray)(`${(0, import_chalk2.underline)("condition")}: ${taskOrStep.condition}`));
|
|
14739
14707
|
const result = await this.shell({
|
|
14740
14708
|
command: taskOrStep.condition,
|
|
14741
|
-
|
|
14742
|
-
|
|
14709
|
+
quiet: true,
|
|
14710
|
+
shell
|
|
14743
14711
|
});
|
|
14744
14712
|
if (result.status === 0) {
|
|
14745
14713
|
return true;
|
|
@@ -14750,12 +14718,17 @@ var RunTask = class {
|
|
|
14750
14718
|
/**
|
|
14751
14719
|
* Evaluates environment variables from shell commands (e.g. `$(xx)`)
|
|
14752
14720
|
*/
|
|
14753
|
-
async evalEnvironment(env) {
|
|
14721
|
+
async evalEnvironment(env, shell) {
|
|
14754
14722
|
const output = {};
|
|
14755
14723
|
for (const [key, value] of Object.entries(env ?? {})) {
|
|
14756
14724
|
if (String(value).startsWith("$(") && String(value).endsWith(")")) {
|
|
14757
14725
|
const query = value.substring(2, value.length - 1);
|
|
14758
|
-
const result = await this.
|
|
14726
|
+
const result = await this.shell({
|
|
14727
|
+
command: query,
|
|
14728
|
+
quiet: true,
|
|
14729
|
+
captureOutput: true,
|
|
14730
|
+
shell
|
|
14731
|
+
});
|
|
14759
14732
|
if (result.status !== 0) {
|
|
14760
14733
|
const error = result.error ? result.error.stack : result.stderr?.toString().trim() || result.stdout?.toString().trim() || `command exited with code ${result.status}`;
|
|
14761
14734
|
warn(
|
|
@@ -14778,7 +14751,7 @@ var RunTask = class {
|
|
|
14778
14751
|
* `$(xx)` for allowing environment to be evaluated by executing a shell
|
|
14779
14752
|
* command and obtaining its result.
|
|
14780
14753
|
*/
|
|
14781
|
-
async resolveEnvironment(envParam, parents) {
|
|
14754
|
+
async resolveEnvironment(envParam, parents, shell) {
|
|
14782
14755
|
let env = this.runtime.manifest.env ?? {};
|
|
14783
14756
|
for (const parent of parents) {
|
|
14784
14757
|
env = {
|
|
@@ -14791,7 +14764,14 @@ var RunTask = class {
|
|
|
14791
14764
|
...this.task.env ?? {},
|
|
14792
14765
|
...envParam
|
|
14793
14766
|
};
|
|
14794
|
-
return this.evalEnvironment(env
|
|
14767
|
+
return this.evalEnvironment(env, shell);
|
|
14768
|
+
}
|
|
14769
|
+
/**
|
|
14770
|
+
* Resolves the shell for a step's command (or the task's, when no step is
|
|
14771
|
+
* given): step, then task, then project default, then "projen".
|
|
14772
|
+
*/
|
|
14773
|
+
resolveShell(step) {
|
|
14774
|
+
return step?.shell ?? this.task.shell ?? this.runtime.manifest.shell ?? "projen";
|
|
14795
14775
|
}
|
|
14796
14776
|
/**
|
|
14797
14777
|
* Returns the "full name" of the task which includes all it's parent task names concatenated by chevrons.
|
|
@@ -14812,10 +14792,9 @@ var RunTask = class {
|
|
|
14812
14792
|
const quiet = options.quiet ?? false;
|
|
14813
14793
|
if (!quiet) {
|
|
14814
14794
|
const log2 = new Array();
|
|
14815
|
-
|
|
14816
|
-
|
|
14817
|
-
|
|
14818
|
-
log2.push(options.command);
|
|
14795
|
+
log2.push(
|
|
14796
|
+
Array.isArray(options.command) ? options.command.join(" ") : options.command
|
|
14797
|
+
);
|
|
14819
14798
|
if (options.cwd) {
|
|
14820
14799
|
log2.push(`(cwd: ${options.cwd})`);
|
|
14821
14800
|
}
|
|
@@ -14827,30 +14806,63 @@ var RunTask = class {
|
|
|
14827
14806
|
`invalid workdir (cwd): ${cwd2} must be an existing directory`
|
|
14828
14807
|
);
|
|
14829
14808
|
}
|
|
14809
|
+
const shell = options.shell ?? "projen";
|
|
14810
|
+
if (typeof shell === "string" && shell !== "projen" && shell !== "system") {
|
|
14811
|
+
throw new Error(
|
|
14812
|
+
`unknown built-in shell ${JSON.stringify(
|
|
14813
|
+
shell
|
|
14814
|
+
)}; use the built-in "projen" or "system" shells, or a TaskShell.command([...]) invocation`
|
|
14815
|
+
);
|
|
14816
|
+
}
|
|
14817
|
+
const capture2 = options.captureOutput ?? false;
|
|
14818
|
+
const command = options.command;
|
|
14830
14819
|
const env = {
|
|
14831
14820
|
...process.env,
|
|
14832
14821
|
...this.env,
|
|
14833
14822
|
...options.extraEnv
|
|
14834
14823
|
};
|
|
14835
|
-
|
|
14836
|
-
|
|
14837
|
-
|
|
14838
|
-
|
|
14839
|
-
|
|
14840
|
-
|
|
14841
|
-
|
|
14842
|
-
|
|
14824
|
+
if (shell === "system") {
|
|
14825
|
+
if (Array.isArray(command)) {
|
|
14826
|
+
const [program, ...args] = command;
|
|
14827
|
+
try {
|
|
14828
|
+
tool(program).run(args, { cwd: cwd2, env, inheritStdio: true });
|
|
14829
|
+
return { status: 0 };
|
|
14830
|
+
} catch (e) {
|
|
14831
|
+
if (typeof e?.status === "number") {
|
|
14832
|
+
return { status: e.status };
|
|
14833
|
+
}
|
|
14834
|
+
throw e;
|
|
14835
|
+
}
|
|
14836
|
+
}
|
|
14837
|
+
return systemShell(command, { cwd: cwd2, env, capture: capture2 });
|
|
14843
14838
|
}
|
|
14844
|
-
|
|
14839
|
+
const builder = this.buildDaxCommand(command, shell);
|
|
14840
|
+
const result = await builder.cwd(cwd2).env(env).stdout(capture2 ? "piped" : "inherit").stderr(capture2 ? "piped" : "inherit").noThrow();
|
|
14841
|
+
return {
|
|
14842
|
+
status: result.code,
|
|
14843
|
+
stdout: capture2 ? Buffer.from(result.stdoutBytes) : null,
|
|
14844
|
+
stderr: capture2 ? Buffer.from(result.stderrBytes) : null
|
|
14845
|
+
};
|
|
14845
14846
|
}
|
|
14846
|
-
|
|
14847
|
-
|
|
14848
|
-
|
|
14849
|
-
|
|
14850
|
-
|
|
14851
|
-
|
|
14852
|
-
|
|
14853
|
-
|
|
14847
|
+
/**
|
|
14848
|
+
* Builds the dax command for the "projen" shell or an explicit invocation.
|
|
14849
|
+
* (The "system" shell is handled host-side, not here.) `command` is a shell
|
|
14850
|
+
* line (string) or an `execArgs` argv (string[]); `shell` is `"projen"` or an
|
|
14851
|
+
* invocation argv such as `["bash", "-c"]`.
|
|
14852
|
+
*/
|
|
14853
|
+
buildDaxCommand(command, shell) {
|
|
14854
|
+
if (Array.isArray(shell)) {
|
|
14855
|
+
const [program, ...flags] = shell;
|
|
14856
|
+
const commandLine = Array.isArray(command) ? command.map(quoteArg).join(" ") : command;
|
|
14857
|
+
return $2`${program} ${[...flags, commandLine]}`;
|
|
14858
|
+
}
|
|
14859
|
+
return Array.isArray(command) ? (
|
|
14860
|
+
// execArgs: shell-free argv (each element escaped; `.cmd` shims resolved).
|
|
14861
|
+
$2`${command[0]} ${command.slice(1)}`
|
|
14862
|
+
) : (
|
|
14863
|
+
// string command, parsed in-process by dax's cross-platform shell.
|
|
14864
|
+
$2.raw`${command}`
|
|
14865
|
+
);
|
|
14854
14866
|
}
|
|
14855
14867
|
renderBuiltin(builtin) {
|
|
14856
14868
|
let moduleRoot = __dirname;
|
package/lib/sample-file.js
CHANGED
|
@@ -45,7 +45,7 @@ const util_1 = require("./util");
|
|
|
45
45
|
* Use this for creating example code files or other resources.
|
|
46
46
|
*/
|
|
47
47
|
class SampleFile extends component_1.Component {
|
|
48
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.SampleFile", version: "0.
|
|
48
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.SampleFile", version: "0.101.0" };
|
|
49
49
|
filePath;
|
|
50
50
|
options;
|
|
51
51
|
/**
|
|
@@ -96,7 +96,7 @@ exports.SampleFile = SampleFile;
|
|
|
96
96
|
* Renders the given files into the directory if the directory does not exist. Use this to create sample code files
|
|
97
97
|
*/
|
|
98
98
|
class SampleDir extends component_1.Component {
|
|
99
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.SampleDir", version: "0.
|
|
99
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.SampleDir", version: "0.101.0" };
|
|
100
100
|
dir;
|
|
101
101
|
options;
|
|
102
102
|
/**
|
package/lib/source-code.js
CHANGED
|
@@ -9,7 +9,7 @@ const textfile_1 = require("./textfile");
|
|
|
9
9
|
*/
|
|
10
10
|
class SourceCode extends component_1.Component {
|
|
11
11
|
filePath;
|
|
12
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.SourceCode", version: "0.
|
|
12
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.SourceCode", version: "0.101.0" };
|
|
13
13
|
file;
|
|
14
14
|
indentLevel = 0;
|
|
15
15
|
indent;
|