aws-cdk 2.1113.0 → 2.1114.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.
Files changed (47) hide show
  1. package/THIRD_PARTY_LICENSES +94 -1336
  2. package/build-info.json +2 -2
  3. package/db.json.gz +0 -0
  4. package/lib/cli/cdk-toolkit.js +33 -32
  5. package/lib/cli/cli-config.js +2 -2
  6. package/lib/cli/cli-type-registry.json +1 -1
  7. package/lib/cli/cli.js +15 -15
  8. package/lib/cli/display-version.js +2 -2
  9. package/lib/cli/io-host/cli-io-host.js +5 -5
  10. package/lib/cli/parse-command-line-arguments.js +2 -2
  11. package/lib/cli/root-dir.js +2 -2
  12. package/lib/cli/telemetry/error.d.ts +15 -2
  13. package/lib/cli/telemetry/error.js +63 -11
  14. package/lib/cli/telemetry/schema.d.ts +1 -8
  15. package/lib/cli/telemetry/schema.js +1 -10
  16. package/lib/cli/telemetry/session.js +4 -4
  17. package/lib/cli/telemetry/sink/endpoint-sink.js +3 -3
  18. package/lib/cli/telemetry/sink/file-sink.js +2 -2
  19. package/lib/cli/telemetry/sink/funnel.js +2 -2
  20. package/lib/cli/user-configuration.js +8 -8
  21. package/lib/cli/user-input.d.ts +1 -1
  22. package/lib/cli/user-input.js +1 -1
  23. package/lib/cli/util/npm.js +3 -3
  24. package/lib/commands/context.js +5 -5
  25. package/lib/commands/init/init-hooks.js +2 -2
  26. package/lib/commands/init/init.js +18 -18
  27. package/lib/commands/init/os.js +2 -2
  28. package/lib/commands/migrate.js +14 -14
  29. package/lib/cxapp/cloud-assembly.js +5 -5
  30. package/lib/cxapp/cloud-executable.js +3 -3
  31. package/lib/cxapp/environments.js +3 -3
  32. package/lib/cxapp/exec.js +20 -38
  33. package/lib/index.d.ts +0 -1
  34. package/lib/index.js +42265 -46230
  35. package/package.json +7 -38
  36. package/lib/legacy/aws-auth.d.ts +0 -74
  37. package/lib/legacy/aws-auth.js +0 -47
  38. package/lib/legacy/configuration.d.ts +0 -82
  39. package/lib/legacy/configuration.js +0 -322
  40. package/lib/legacy/index.d.ts +0 -19
  41. package/lib/legacy/index.js +0 -77
  42. package/lib/legacy/logging.d.ts +0 -82
  43. package/lib/legacy/logging.js +0 -154
  44. package/lib/legacy/types.d.ts +0 -31
  45. package/lib/legacy/types.js +0 -3
  46. package/lib/legacy-exports.d.ts +0 -8
  47. package/lib/legacy-exports.js +0 -51
package/package.json CHANGED
@@ -80,12 +80,12 @@
80
80
  "ts-mock-imports": "^1.3.19",
81
81
  "typescript": "5.9",
82
82
  "xml-js": "^1.6.11",
83
- "@aws-cdk/cdk-assets-lib": "^1.4.1",
84
- "@aws-cdk/cloud-assembly-api": "2.2.0",
85
- "@aws-cdk/cloud-assembly-schema": ">=53.7.0",
83
+ "@aws-cdk/cdk-assets-lib": "^1.4.2",
84
+ "@aws-cdk/cloud-assembly-api": "2.2.1",
85
+ "@aws-cdk/cloud-assembly-schema": ">=53.8.0",
86
86
  "@aws-cdk/cloudformation-diff": "2.186.0",
87
87
  "@aws-cdk/cx-api": "^2",
88
- "@aws-cdk/toolkit-lib": "^1.19.1",
88
+ "@aws-cdk/toolkit-lib": "^1.19.2",
89
89
  "@aws-sdk/client-appsync": "^3",
90
90
  "@aws-sdk/client-bedrock-agentcore-control": "^3",
91
91
  "@aws-sdk/client-cloudcontrol": "^3",
@@ -111,6 +111,7 @@
111
111
  "@smithy/middleware-endpoint": "^4.4.23",
112
112
  "@smithy/property-provider": "^4.2.11",
113
113
  "@smithy/shared-ini-file-loader": "^4.4.6",
114
+ "@smithy/smithy-client": "^4.12.7",
114
115
  "@smithy/types": "^4.13.0",
115
116
  "@smithy/util-retry": "^4.2.11",
116
117
  "@smithy/util-waiter": "^4.2.11",
@@ -149,44 +150,12 @@
149
150
  "publishConfig": {
150
151
  "access": "public"
151
152
  },
152
- "version": "2.1113.0",
153
+ "version": "2.1114.0",
153
154
  "types": "lib/index.d.ts",
154
155
  "exports": {
155
156
  "./package.json": "./package.json",
156
157
  "./build-info.json": "./build-info.json",
157
- ".": "./lib/legacy-exports.js",
158
- "./bin/cdk": "./bin/cdk",
159
- "./lib/api/bootstrap/bootstrap-template.yaml": "./lib/api/bootstrap/bootstrap-template.yaml",
160
- "./lib/util": "./lib/legacy-exports.js",
161
- "./lib": "./lib/legacy-exports.js",
162
- "./lib/api/plugin": "./lib/legacy-exports.js",
163
- "./lib/util/content-hash": "./lib/legacy-exports.js",
164
- "./lib/settings": "./lib/legacy-exports.js",
165
- "./lib/api/bootstrap": "./lib/legacy-exports.js",
166
- "./lib/api/cxapp/cloud-assembly": "./lib/legacy-exports.js",
167
- "./lib/api/cxapp/cloud-executable": "./lib/legacy-exports.js",
168
- "./lib/api/cxapp/exec": "./lib/legacy-exports.js",
169
- "./lib/diff": "./lib/legacy-exports.js",
170
- "./lib/api/util/string-manipulation": "./lib/legacy-exports.js",
171
- "./lib/util/console-formatters": "./lib/legacy-exports.js",
172
- "./lib/util/tracing": "./lib/legacy-exports.js",
173
- "./lib/commands/docs": "./lib/legacy-exports.js",
174
- "./lib/api/hotswap/common": "./lib/legacy-exports.js",
175
- "./lib/util/objects": "./lib/legacy-exports.js",
176
- "./lib/api/deployments": "./lib/legacy-exports.js",
177
- "./lib/util/directories": "./lib/legacy-exports.js",
178
- "./lib/version": "./lib/legacy-exports.js",
179
- "./lib/init": "./lib/legacy-exports.js",
180
- "./lib/api/aws-auth/cached": "./lib/legacy-exports.js",
181
- "./lib/api/deploy-stack": "./lib/legacy-exports.js",
182
- "./lib/api/evaluate-cloudformation-template": "./lib/legacy-exports.js",
183
- "./lib/api/aws-auth/credential-plugins": "./lib/legacy-exports.js",
184
- "./lib/api/aws-auth/awscli-compatible": "./lib/legacy-exports.js",
185
- "./lib/notices": "./lib/legacy-exports.js",
186
- "./lib/index": "./lib/legacy-exports.js",
187
- "./lib/api/aws-auth/index.js": "./lib/legacy-exports.js",
188
- "./lib/api/aws-auth": "./lib/legacy-exports.js",
189
- "./lib/logging": "./lib/legacy-exports.js"
158
+ "./lib/api/bootstrap/bootstrap-template.yaml": "./lib/api/bootstrap/bootstrap-template.yaml"
190
159
  },
191
160
  "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\"."
192
161
  }
@@ -1,74 +0,0 @@
1
- import type { AwsCredentialIdentityProvider, Logger, NodeHttpHandlerOptions } from '@smithy/types';
2
- import { SdkProvider as SdkProviderCurrentVersion } from '../api/aws-auth';
3
- /**
4
- * @deprecated
5
- */
6
- export declare function cached<A extends object, B>(obj: A, sym: symbol, fn: () => B): B;
7
- /**
8
- * @deprecated
9
- */
10
- export interface ContextProviderPlugin {
11
- getValue(args: {
12
- [key: string]: any;
13
- }): Promise<any>;
14
- }
15
- /**
16
- * An AWS account
17
- * @deprecated
18
- */
19
- export interface Account {
20
- readonly accountId: string;
21
- readonly partition: string;
22
- }
23
- /**
24
- * Enable tracing in the CDK
25
- *
26
- * @deprecated cannot be enabled from outside the CDK
27
- */
28
- export declare function enableTracing(_enabled: boolean): void;
29
- /**
30
- * Options for individual SDKs
31
- * @deprecated
32
- */
33
- interface SdkHttpOptions {
34
- /**
35
- * Proxy address to use
36
- *
37
- * @default No proxy
38
- */
39
- readonly proxyAddress?: string;
40
- /**
41
- * A path to a certificate bundle that contains a cert to be trusted.
42
- *
43
- * @default No certificate bundle
44
- */
45
- readonly caBundlePath?: string;
46
- }
47
- /**
48
- * Options for the default SDK provider
49
- * @deprecated
50
- */
51
- interface SdkProviderOptions {
52
- /**
53
- * Profile to read from ~/.aws
54
- *
55
- * @default - No profile
56
- */
57
- readonly profile?: string;
58
- /**
59
- * HTTP options for SDK
60
- */
61
- readonly httpOptions?: SdkHttpOptions;
62
- /**
63
- * The logger for sdk calls.
64
- */
65
- readonly logger?: Logger;
66
- }
67
- /**
68
- * @deprecated
69
- */
70
- export declare class SdkProvider {
71
- static withAwsCliCompatibleDefaults(options?: SdkProviderOptions): Promise<SdkProviderCurrentVersion>;
72
- constructor(defaultCredentialProvider: AwsCredentialIdentityProvider, defaultRegion: string, requestHandler?: NodeHttpHandlerOptions, logger?: Logger);
73
- }
74
- export {};
@@ -1,47 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SdkProvider = void 0;
4
- exports.cached = cached;
5
- exports.enableTracing = enableTracing;
6
- const aws_auth_1 = require("../api/aws-auth");
7
- const io_host_1 = require("../cli/io-host");
8
- const singleton_plugin_host_1 = require("../cli/singleton-plugin-host");
9
- /**
10
- * @deprecated
11
- */
12
- function cached(obj, sym, fn) {
13
- if (!(sym in obj)) {
14
- obj[sym] = fn();
15
- }
16
- return obj[sym];
17
- }
18
- /**
19
- * Enable tracing in the CDK
20
- *
21
- * @deprecated cannot be enabled from outside the CDK
22
- */
23
- function enableTracing(_enabled) {
24
- // noop
25
- }
26
- /**
27
- * @deprecated
28
- */
29
- class SdkProvider {
30
- static async withAwsCliCompatibleDefaults(options = {}) {
31
- return aws_auth_1.SdkProvider.withAwsCliCompatibleDefaults({
32
- ...options,
33
- ioHelper: io_host_1.CliIoHost.instance().asIoHelper(),
34
- pluginHost: singleton_plugin_host_1.GLOBAL_PLUGIN_HOST,
35
- }, options.profile);
36
- }
37
- constructor(defaultCredentialProvider, defaultRegion, requestHandler = {}, logger) {
38
- return new aws_auth_1.SdkProvider(defaultCredentialProvider, defaultRegion, {
39
- pluginHost: singleton_plugin_host_1.GLOBAL_PLUGIN_HOST,
40
- ioHelper: io_host_1.CliIoHost.instance().asIoHelper(),
41
- requestHandler: requestHandler, // this is fine it's passed through to the SDK
42
- logger,
43
- });
44
- }
45
- }
46
- exports.SdkProvider = SdkProvider;
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWF1dGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhd3MtYXV0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFnQkEsd0JBS0M7QUF1QkQsc0NBRUM7QUFyQ0QsOENBQTJFO0FBQzNFLDRDQUEyQztBQUMzQyx3RUFBa0U7QUFFbEU7O0dBRUc7QUFDSCxTQUFnQixNQUFNLENBQXNCLEdBQU0sRUFBRSxHQUFXLEVBQUUsRUFBVztJQUMxRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNqQixHQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNELE9BQVEsR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFrQkQ7Ozs7R0FJRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxRQUFpQjtJQUM3QyxPQUFPO0FBQ1QsQ0FBQztBQTZDRDs7R0FFRztBQUNILE1BQWEsV0FBVztJQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsVUFBOEIsRUFBRTtRQUMvRSxPQUFPLHNCQUF5QixDQUFDLDRCQUE0QixDQUFDO1lBQzVELEdBQUcsT0FBTztZQUNWLFFBQVEsRUFBRSxtQkFBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsRUFBRTtZQUMzQyxVQUFVLEVBQUUsMENBQWtCO1NBQy9CLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxZQUNFLHlCQUF3RCxFQUN4RCxhQUFxQixFQUNyQixpQkFBeUMsRUFBRSxFQUMzQyxNQUFlO1FBRWYsT0FBTyxJQUFJLHNCQUF5QixDQUFDLHlCQUF5QixFQUFFLGFBQWEsRUFBRTtZQUM3RSxVQUFVLEVBQUUsMENBQWtCO1lBQzlCLFFBQVEsRUFBRSxtQkFBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsRUFBRTtZQUMzQyxjQUFjLEVBQUUsY0FBcUIsRUFBRSw4Q0FBOEM7WUFDckYsTUFBTTtTQUNQLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXRCRCxrQ0FzQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGlzIGEgbGVnYWN5IHdyYXBwZXIgZm9yIGNvZGUgZnJvbSB0aGUgYXdzLWF1dGggdGhhdCB3ZSB3YW50IHRvIGtlZXAgdGhlIHNpZ25hdHVyZXMgaW50YWN0XG4vLyBXZSBnZW5lcmFsbHkgdXNlIHR3byBkaWZmZXJlbnQgcGF0dGVybnMgaGVyZTpcbi8vIC0gbWFrZSBhIGNvcHkgb2YgdGhlIG9sZCBjb2RlIGFzIGlzXG4vLyAtIHdyYXAgdGhlIG9sZCBjb2RlIGFuZCBhZGQgYSBkZXByZWNhdGlvbiB3YXJuaW5nXG4vLyAtIG1ha2UgYSBuby1vcCBjb3B5IHRoYXQgcHJlc2VydmVzIHRoZSBwcmV2aW91cyBpbnRlcmZhY2UgYnV0IGRvZXNuJ3QgZG8gYW55dGhpbmdcbi8vIFRoaXMgd2F5IHdlIGNhbiBrZWVwIHRoZSBvbGQgY29kZSBydW5uaW5nIHVudGlsIHRoZSBuZXcgY29kZSBpcyBmdWxseSByZWFkeVxuLy8gYW5kIGNhbiBiZSB1c2VkIGJ5IHRoZSB1c2VycyB0aGF0IGFyZSByZWFkeSB0byBtaWdyYXRlXG4vLyBUaGUgb2xkIGNvZGUgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgYXdzLWNka1xuaW1wb3J0IHR5cGUgeyBBd3NDcmVkZW50aWFsSWRlbnRpdHlQcm92aWRlciwgTG9nZ2VyLCBOb2RlSHR0cEhhbmRsZXJPcHRpb25zIH0gZnJvbSAnQHNtaXRoeS90eXBlcyc7XG5pbXBvcnQgeyBTZGtQcm92aWRlciBhcyBTZGtQcm92aWRlckN1cnJlbnRWZXJzaW9uIH0gZnJvbSAnLi4vYXBpL2F3cy1hdXRoJztcbmltcG9ydCB7IENsaUlvSG9zdCB9IGZyb20gJy4uL2NsaS9pby1ob3N0JztcbmltcG9ydCB7IEdMT0JBTF9QTFVHSU5fSE9TVCB9IGZyb20gJy4uL2NsaS9zaW5nbGV0b24tcGx1Z2luLWhvc3QnO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZWQ8QSBleHRlbmRzIG9iamVjdCwgQj4ob2JqOiBBLCBzeW06IHN5bWJvbCwgZm46ICgpID0+IEIpOiBCIHtcbiAgaWYgKCEoc3ltIGluIG9iaikpIHtcbiAgICAob2JqIGFzIGFueSlbc3ltXSA9IGZuKCk7XG4gIH1cbiAgcmV0dXJuIChvYmogYXMgYW55KVtzeW1dO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dFByb3ZpZGVyUGx1Z2luIHtcbiAgZ2V0VmFsdWUoYXJnczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IFByb21pc2U8YW55Pjtcbn1cblxuLyoqXG4gKiBBbiBBV1MgYWNjb3VudFxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50IHtcbiAgcmVhZG9ubHkgYWNjb3VudElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhcnRpdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuYWJsZSB0cmFjaW5nIGluIHRoZSBDREtcbiAqXG4gKiBAZGVwcmVjYXRlZCBjYW5ub3QgYmUgZW5hYmxlZCBmcm9tIG91dHNpZGUgdGhlIENES1xuICovXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlVHJhY2luZyhfZW5hYmxlZDogYm9vbGVhbikge1xuICAvLyBub29wXG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgaW5kaXZpZHVhbCBTREtzXG4gKiBAZGVwcmVjYXRlZFxuICovXG5pbnRlcmZhY2UgU2RrSHR0cE9wdGlvbnMge1xuICAvKipcbiAgICogUHJveHkgYWRkcmVzcyB0byB1c2VcbiAgICpcbiAgICogQGRlZmF1bHQgTm8gcHJveHlcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5QWRkcmVzcz86IHN0cmluZztcblxuICAvKipcbiAgICogQSBwYXRoIHRvIGEgY2VydGlmaWNhdGUgYnVuZGxlIHRoYXQgY29udGFpbnMgYSBjZXJ0IHRvIGJlIHRydXN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vIGNlcnRpZmljYXRlIGJ1bmRsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FCdW5kbGVQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBkZWZhdWx0IFNESyBwcm92aWRlclxuICogQGRlcHJlY2F0ZWRcbiAqL1xuaW50ZXJmYWNlIFNka1Byb3ZpZGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQcm9maWxlIHRvIHJlYWQgZnJvbSB+Ly5hd3NcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9maWxlXG4gICAqL1xuICByZWFkb25seSBwcm9maWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIVFRQIG9wdGlvbnMgZm9yIFNES1xuICAgKi9cbiAgcmVhZG9ubHkgaHR0cE9wdGlvbnM/OiBTZGtIdHRwT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3Igc2RrIGNhbGxzLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nZ2VyPzogTG9nZ2VyO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBjbGFzcyBTZGtQcm92aWRlciB7XG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgd2l0aEF3c0NsaUNvbXBhdGlibGVEZWZhdWx0cyhvcHRpb25zOiBTZGtQcm92aWRlck9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBTZGtQcm92aWRlckN1cnJlbnRWZXJzaW9uLndpdGhBd3NDbGlDb21wYXRpYmxlRGVmYXVsdHMoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGlvSGVscGVyOiBDbGlJb0hvc3QuaW5zdGFuY2UoKS5hc0lvSGVscGVyKCksXG4gICAgICBwbHVnaW5Ib3N0OiBHTE9CQUxfUExVR0lOX0hPU1QsXG4gICAgfSwgb3B0aW9ucy5wcm9maWxlKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBkZWZhdWx0Q3JlZGVudGlhbFByb3ZpZGVyOiBBd3NDcmVkZW50aWFsSWRlbnRpdHlQcm92aWRlcixcbiAgICBkZWZhdWx0UmVnaW9uOiBzdHJpbmcsXG4gICAgcmVxdWVzdEhhbmRsZXI6IE5vZGVIdHRwSGFuZGxlck9wdGlvbnMgPSB7fSxcbiAgICBsb2dnZXI/OiBMb2dnZXIsXG4gICkge1xuICAgIHJldHVybiBuZXcgU2RrUHJvdmlkZXJDdXJyZW50VmVyc2lvbihkZWZhdWx0Q3JlZGVudGlhbFByb3ZpZGVyLCBkZWZhdWx0UmVnaW9uLCB7XG4gICAgICBwbHVnaW5Ib3N0OiBHTE9CQUxfUExVR0lOX0hPU1QsXG4gICAgICBpb0hlbHBlcjogQ2xpSW9Ib3N0Lmluc3RhbmNlKCkuYXNJb0hlbHBlcigpLFxuICAgICAgcmVxdWVzdEhhbmRsZXI6IHJlcXVlc3RIYW5kbGVyIGFzIGFueSwgLy8gdGhpcyBpcyBmaW5lIGl0J3MgcGFzc2VkIHRocm91Z2ggdG8gdGhlIFNES1xuICAgICAgbG9nZ2VyLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -1,82 +0,0 @@
1
- import { Context } from '../api/context';
2
- import { Settings } from '../api/settings';
3
- export declare const PROJECT_CONTEXT = "cdk.context.json";
4
- /**
5
- * @deprecated
6
- */
7
- export declare enum Command {
8
- LS = "ls",
9
- LIST = "list",
10
- DIFF = "diff",
11
- BOOTSTRAP = "bootstrap",
12
- DEPLOY = "deploy",
13
- DESTROY = "destroy",
14
- SYNTHESIZE = "synthesize",
15
- SYNTH = "synth",
16
- METADATA = "metadata",
17
- INIT = "init",
18
- VERSION = "version",
19
- WATCH = "watch",
20
- GC = "gc",
21
- ROLLBACK = "rollback",
22
- IMPORT = "import",
23
- ACKNOWLEDGE = "acknowledge",
24
- ACK = "ack",
25
- NOTICES = "notices",
26
- MIGRATE = "migrate",
27
- CONTEXT = "context",
28
- DOCS = "docs",
29
- DOC = "doc",
30
- DOCTOR = "doctor",
31
- REFACTOR = "refactor",
32
- DRIFT = "drift",
33
- CLI_TELEMETRY = "cli-telemetry"
34
- }
35
- type Arguments = {
36
- readonly _: [Command, ...string[]];
37
- readonly exclusively?: boolean;
38
- readonly STACKS?: string[];
39
- readonly lookups?: boolean;
40
- readonly [name: string]: unknown;
41
- };
42
- interface ConfigurationProps {
43
- /**
44
- * Configuration passed via command line arguments
45
- *
46
- * @default - Nothing passed
47
- */
48
- readonly commandLineArguments?: Arguments;
49
- /**
50
- * Whether or not to use context from `.cdk.json` in user home directory
51
- *
52
- * @default true
53
- */
54
- readonly readUserContext?: boolean;
55
- }
56
- /**
57
- * All sources of settings combined
58
- * @deprecated
59
- */
60
- export declare class Configuration {
61
- private readonly props;
62
- settings: Settings;
63
- context: Context;
64
- readonly defaultConfig: Settings;
65
- private readonly commandLineArguments;
66
- private readonly commandLineContext;
67
- private _projectConfig?;
68
- private _projectContext?;
69
- private loaded;
70
- constructor(props?: ConfigurationProps);
71
- private get projectConfig();
72
- get projectContext(): Settings;
73
- /**
74
- * Load all config
75
- */
76
- load(): Promise<this>;
77
- /**
78
- * Save the project context
79
- */
80
- saveContext(): Promise<this>;
81
- }
82
- export {};
@@ -1,322 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Configuration = exports.Command = exports.PROJECT_CONTEXT = void 0;
4
- const os = require("os");
5
- const fs_path = require("path");
6
- const toolkit_lib_1 = require("@aws-cdk/toolkit-lib");
7
- const fs = require("fs-extra");
8
- const logging_1 = require("./logging");
9
- const context_1 = require("../api/context");
10
- const settings_1 = require("../api/settings");
11
- exports.PROJECT_CONTEXT = 'cdk.context.json';
12
- const PROJECT_CONFIG = 'cdk.json';
13
- const USER_DEFAULTS = '~/.cdk.json';
14
- const CONTEXT_KEY = 'context';
15
- /**
16
- * @deprecated
17
- */
18
- var Command;
19
- (function (Command) {
20
- Command["LS"] = "ls";
21
- Command["LIST"] = "list";
22
- Command["DIFF"] = "diff";
23
- Command["BOOTSTRAP"] = "bootstrap";
24
- Command["DEPLOY"] = "deploy";
25
- Command["DESTROY"] = "destroy";
26
- Command["SYNTHESIZE"] = "synthesize";
27
- Command["SYNTH"] = "synth";
28
- Command["METADATA"] = "metadata";
29
- Command["INIT"] = "init";
30
- Command["VERSION"] = "version";
31
- Command["WATCH"] = "watch";
32
- Command["GC"] = "gc";
33
- Command["ROLLBACK"] = "rollback";
34
- Command["IMPORT"] = "import";
35
- Command["ACKNOWLEDGE"] = "acknowledge";
36
- Command["ACK"] = "ack";
37
- Command["NOTICES"] = "notices";
38
- Command["MIGRATE"] = "migrate";
39
- Command["CONTEXT"] = "context";
40
- Command["DOCS"] = "docs";
41
- Command["DOC"] = "doc";
42
- Command["DOCTOR"] = "doctor";
43
- Command["REFACTOR"] = "refactor";
44
- Command["DRIFT"] = "drift";
45
- Command["CLI_TELEMETRY"] = "cli-telemetry";
46
- })(Command || (exports.Command = Command = {}));
47
- const BUNDLING_COMMANDS = [
48
- Command.DEPLOY,
49
- Command.DIFF,
50
- Command.SYNTH,
51
- Command.SYNTHESIZE,
52
- Command.WATCH,
53
- Command.IMPORT,
54
- ];
55
- /**
56
- * All sources of settings combined
57
- * @deprecated
58
- */
59
- class Configuration {
60
- constructor(props = {}) {
61
- this.props = props;
62
- this.settings = new settings_1.Settings();
63
- this.context = new context_1.Context();
64
- this.defaultConfig = new settings_1.Settings({
65
- versionReporting: true,
66
- assetMetadata: true,
67
- pathMetadata: true,
68
- output: 'cdk.out',
69
- });
70
- this.loaded = false;
71
- this.commandLineArguments = props.commandLineArguments
72
- ? commandLineArgumentsToSettings(props.commandLineArguments)
73
- : new settings_1.Settings();
74
- this.commandLineContext = this.commandLineArguments
75
- .subSettings([CONTEXT_KEY])
76
- .makeReadOnly();
77
- }
78
- get projectConfig() {
79
- if (!this._projectConfig) {
80
- throw new toolkit_lib_1.ToolkitError('#load has not been called yet!');
81
- }
82
- return this._projectConfig;
83
- }
84
- get projectContext() {
85
- if (!this._projectContext) {
86
- throw new toolkit_lib_1.ToolkitError('#load has not been called yet!');
87
- }
88
- return this._projectContext;
89
- }
90
- /**
91
- * Load all config
92
- */
93
- async load() {
94
- const userConfig = await loadAndLog(USER_DEFAULTS);
95
- this._projectConfig = await loadAndLog(PROJECT_CONFIG);
96
- this._projectContext = await loadAndLog(exports.PROJECT_CONTEXT);
97
- // @todo cannot currently be disabled by cli users
98
- const readUserContext = this.props.readUserContext ?? true;
99
- if (userConfig.get(['build'])) {
100
- throw new toolkit_lib_1.ToolkitError('The `build` key cannot be specified in the user config (~/.cdk.json), specify it in the project config (cdk.json) instead');
101
- }
102
- const contextSources = [
103
- { bag: this.commandLineContext },
104
- {
105
- fileName: PROJECT_CONFIG,
106
- bag: this.projectConfig.subSettings([CONTEXT_KEY]).makeReadOnly(),
107
- },
108
- { fileName: exports.PROJECT_CONTEXT, bag: this.projectContext },
109
- ];
110
- if (readUserContext) {
111
- contextSources.push({
112
- fileName: USER_DEFAULTS,
113
- bag: userConfig.subSettings([CONTEXT_KEY]).makeReadOnly(),
114
- });
115
- }
116
- this.context = new context_1.Context(...contextSources);
117
- // Build settings from what's left
118
- this.settings = this.defaultConfig
119
- .merge(userConfig)
120
- .merge(this.projectConfig)
121
- .merge(this.commandLineArguments)
122
- .makeReadOnly();
123
- (0, logging_1.debug)('merged settings:', this.settings.all);
124
- this.loaded = true;
125
- return this;
126
- }
127
- /**
128
- * Save the project context
129
- */
130
- async saveContext() {
131
- if (!this.loaded) {
132
- return this;
133
- } // Avoid overwriting files with nothing
134
- await this.projectContext.save(exports.PROJECT_CONTEXT);
135
- return this;
136
- }
137
- }
138
- exports.Configuration = Configuration;
139
- async function loadAndLog(fileName) {
140
- const ret = await settingsFromFile(fileName);
141
- if (!ret.empty) {
142
- (0, logging_1.debug)(fileName + ':', JSON.stringify(ret.all, undefined, 2));
143
- }
144
- return ret;
145
- }
146
- async function settingsFromFile(fileName) {
147
- let settings;
148
- const expanded = expandHomeDir(fileName);
149
- if (await fs.pathExists(expanded)) {
150
- const data = await fs.readJson(expanded);
151
- settings = new settings_1.Settings(data);
152
- }
153
- else {
154
- settings = new settings_1.Settings();
155
- }
156
- // See https://github.com/aws/aws-cdk/issues/59
157
- prohibitContextKeys(settings, ['default-account', 'default-region'], fileName);
158
- warnAboutContextKey(settings, 'aws:', fileName);
159
- return settings;
160
- }
161
- function prohibitContextKeys(settings, keys, fileName) {
162
- const context = settings.get(['context']);
163
- if (!context || typeof context !== 'object') {
164
- return;
165
- }
166
- for (const key of keys) {
167
- if (key in context) {
168
- throw new toolkit_lib_1.ToolkitError(`The 'context.${key}' key was found in ${fs_path.resolve(fileName)}, but it is no longer supported. Please remove it.`);
169
- }
170
- }
171
- }
172
- function warnAboutContextKey(settings, prefix, fileName) {
173
- const context = settings.get(['context']);
174
- if (!context || typeof context !== 'object') {
175
- return;
176
- }
177
- for (const contextKey of Object.keys(context)) {
178
- if (contextKey.startsWith(prefix)) {
179
- (0, logging_1.warning)(`A reserved context key ('context.${prefix}') key was found in ${fs_path.resolve(fileName)}, it might cause surprising behavior and should be removed.`);
180
- }
181
- }
182
- }
183
- function expandHomeDir(x) {
184
- if (x.startsWith('~')) {
185
- return fs_path.join(os.homedir(), x.slice(1));
186
- }
187
- return x;
188
- }
189
- /**
190
- * Parse CLI arguments into Settings
191
- *
192
- * CLI arguments in must be accessed in the CLI code via
193
- * `configuration.settings.get(['argName'])` instead of via `args.argName`.
194
- *
195
- * The advantage is that they can be configured via `cdk.json` and
196
- * `$HOME/.cdk.json`. Arguments not listed below and accessed via this object
197
- * can only be specified on the command line.
198
- *
199
- * @param argv - the received CLI arguments.
200
- * @returns a new Settings object.
201
- */
202
- function commandLineArgumentsToSettings(argv) {
203
- const context = parseStringContextListToObject(argv);
204
- const tags = parseStringTagsListToObject(expectStringList(argv.tags));
205
- // Determine bundling stacks
206
- let bundlingStacks;
207
- if (BUNDLING_COMMANDS.includes(argv._[0])) {
208
- // If we deploy, diff, synth or watch a list of stacks exclusively we skip
209
- // bundling for all other stacks.
210
- bundlingStacks = argv.exclusively ? argv.STACKS ?? ['**'] : ['**'];
211
- }
212
- else {
213
- // Skip bundling for all stacks
214
- bundlingStacks = [];
215
- }
216
- return new settings_1.Settings({
217
- app: argv.app,
218
- browser: argv.browser,
219
- build: argv.build,
220
- caBundlePath: argv.caBundlePath,
221
- context,
222
- debug: argv.debug,
223
- tags,
224
- language: argv.language,
225
- pathMetadata: argv.pathMetadata,
226
- assetMetadata: argv.assetMetadata,
227
- profile: argv.profile,
228
- plugin: argv.plugin,
229
- requireApproval: argv.requireApproval,
230
- toolkitStackName: argv.toolkitStackName,
231
- toolkitBucket: {
232
- bucketName: argv.bootstrapBucketName,
233
- kmsKeyId: argv.bootstrapKmsKeyId,
234
- },
235
- versionReporting: argv.versionReporting,
236
- staging: argv.staging,
237
- output: argv.output,
238
- outputsFile: argv.outputsFile,
239
- progress: argv.progress,
240
- proxy: argv.proxy,
241
- bundlingStacks,
242
- lookups: argv.lookups,
243
- rollback: argv.rollback,
244
- notices: argv.notices,
245
- assetParallelism: argv['asset-parallelism'],
246
- assetBuildConcurrency: argv['asset-build-concurrency'],
247
- assetPrebuild: argv['asset-prebuild'],
248
- ignoreNoStacks: argv['ignore-no-stacks'],
249
- hotswap: {
250
- ecs: {
251
- minimumHealthyPercent: argv.hotswapEcsMinimumHealthyPercent,
252
- maximumHealthyPercent: argv.hotswapEcsMaximumHealthyPercent,
253
- stabilizationTimeoutSeconds: argv.hotswapEcsStabilizationTimeoutSeconds,
254
- },
255
- },
256
- unstable: argv.unstable,
257
- });
258
- }
259
- function expectStringList(x) {
260
- if (x === undefined) {
261
- return undefined;
262
- }
263
- if (!Array.isArray(x)) {
264
- throw new toolkit_lib_1.ToolkitError(`Expected array, got '${x}'`);
265
- }
266
- const nonStrings = x.filter((e) => typeof e !== 'string');
267
- if (nonStrings.length > 0) {
268
- throw new toolkit_lib_1.ToolkitError(`Expected list of strings, found ${nonStrings}`);
269
- }
270
- return x;
271
- }
272
- function parseStringContextListToObject(argv) {
273
- const context = {};
274
- for (const assignment of argv.context || []) {
275
- const parts = assignment.split(/=(.*)/, 2);
276
- if (parts.length === 2) {
277
- (0, logging_1.debug)('CLI argument context: %s=%s', parts[0], parts[1]);
278
- if (parts[0].match(/^aws:.+/)) {
279
- throw new toolkit_lib_1.ToolkitError(`User-provided context cannot use keys prefixed with 'aws:', but ${parts[0]} was provided.`);
280
- }
281
- context[parts[0]] = parts[1];
282
- }
283
- else {
284
- (0, logging_1.warning)('Context argument is not an assignment (key=value): %s', assignment);
285
- }
286
- }
287
- return context;
288
- }
289
- /**
290
- * Parse tags out of arguments
291
- *
292
- * Return undefined if no tags were provided, return an empty array if only empty
293
- * strings were provided
294
- */
295
- function parseStringTagsListToObject(argTags) {
296
- if (argTags === undefined) {
297
- return undefined;
298
- }
299
- if (argTags.length === 0) {
300
- return undefined;
301
- }
302
- const nonEmptyTags = argTags.filter((t) => t !== '');
303
- if (nonEmptyTags.length === 0) {
304
- return [];
305
- }
306
- const tags = [];
307
- for (const assignment of nonEmptyTags) {
308
- const parts = assignment.split(/=(.*)/, 2);
309
- if (parts.length === 2) {
310
- (0, logging_1.debug)('CLI argument tags: %s=%s', parts[0], parts[1]);
311
- tags.push({
312
- Key: parts[0],
313
- Value: parts[1],
314
- });
315
- }
316
- else {
317
- (0, logging_1.warning)('Tags argument is not an assignment (key=value): %s', assignment);
318
- }
319
- }
320
- return tags.length > 0 ? tags : undefined;
321
- }
322
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUJBQXlCO0FBQ3pCLGdDQUFnQztBQUNoQyxzREFBb0Q7QUFDcEQsK0JBQStCO0FBQy9CLHVDQUEyQztBQUMzQyw0Q0FBeUM7QUFDekMsOENBQTJDO0FBRzlCLFFBQUEsZUFBZSxHQUFHLGtCQUFrQixDQUFDO0FBQ2xELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQztBQUNsQyxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUM7QUFDcEMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDO0FBRTlCOztHQUVHO0FBQ0gsSUFBWSxPQTJCWDtBQTNCRCxXQUFZLE9BQU87SUFDakIsb0JBQVMsQ0FBQTtJQUNULHdCQUFhLENBQUE7SUFDYix3QkFBYSxDQUFBO0lBQ2Isa0NBQXVCLENBQUE7SUFDdkIsNEJBQWlCLENBQUE7SUFDakIsOEJBQW1CLENBQUE7SUFDbkIsb0NBQXlCLENBQUE7SUFDekIsMEJBQWUsQ0FBQTtJQUNmLGdDQUFxQixDQUFBO0lBQ3JCLHdCQUFhLENBQUE7SUFDYiw4QkFBbUIsQ0FBQTtJQUNuQiwwQkFBZSxDQUFBO0lBQ2Ysb0JBQVMsQ0FBQTtJQUNULGdDQUFxQixDQUFBO0lBQ3JCLDRCQUFpQixDQUFBO0lBQ2pCLHNDQUEyQixDQUFBO0lBQzNCLHNCQUFXLENBQUE7SUFDWCw4QkFBbUIsQ0FBQTtJQUNuQiw4QkFBbUIsQ0FBQTtJQUNuQiw4QkFBbUIsQ0FBQTtJQUNuQix3QkFBYSxDQUFBO0lBQ2Isc0JBQVcsQ0FBQTtJQUNYLDRCQUFpQixDQUFBO0lBQ2pCLGdDQUFxQixDQUFBO0lBQ3JCLDBCQUFlLENBQUE7SUFDZiwwQ0FBK0IsQ0FBQTtBQUNqQyxDQUFDLEVBM0JXLE9BQU8sdUJBQVAsT0FBTyxRQTJCbEI7QUFFRCxNQUFNLGlCQUFpQixHQUFHO0lBQ3hCLE9BQU8sQ0FBQyxNQUFN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QUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM5QixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLElBQUksR0FBVSxFQUFFLENBQUM7SUFFdkIsS0FBSyxNQUFNLFVBQVUsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN0QyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsSUFBQSxlQUFLLEVBQUMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ1IsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2IsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDaEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFBLGlCQUFPLEVBQUMsb0RBQW9ELEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDNUUsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgZnNfcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJ0Bhd3MtY2RrL3Rvb2xraXQtbGliJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGRlYnVnLCB3YXJuaW5nIH0gZnJvbSAnLi9sb2dnaW5nJztcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICcuLi9hcGkvY29udGV4dCc7XG5pbXBvcnQgeyBTZXR0aW5ncyB9IGZyb20gJy4uL2FwaS9zZXR0aW5ncyc7XG5pbXBvcnQgdHlwZSB7IFRhZyB9IGZyb20gJy4uL2FwaS90YWdzJztcblxuZXhwb3J0IGNvbnN0IFBST0pFQ1RfQ09OVEVYVCA9ICdjZGsuY29udGV4dC5qc29uJztcbmNvbnN0IFBST0pFQ1RfQ09ORklHID0gJ2Nkay5qc29uJztcbmNvbnN0IFVTRVJfREVGQVVMVFMgPSAnfi8uY2RrLmpzb24nO1xuY29uc3QgQ09OVEVYVF9LRVkgPSAnY29udGV4dCc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGVudW0gQ29tbWFuZCB7XG4gIExTID0gJ2xzJyxcbiAgTElTVCA9ICdsaXN0JyxcbiAgRElGRiA9ICdkaWZmJyxcbiAgQk9PVFNUUkFQID0gJ2Jvb3RzdHJhcCcsXG4gIERFUExPWSA9ICdkZXBsb3knLFxuICBERVNUUk9ZID0gJ2Rlc3Ryb3knLFxuICBTWU5USEVTSVpFID0gJ3N5bnRoZXNpemUnLFxuICBTWU5USCA9ICdzeW50aCcsXG4gIE1FVEFEQVRBID0gJ21ldGFkYXRhJyxcbiAgSU5JVCA9ICdpbml0JyxcbiAgVkVSU0lPTiA9ICd2ZXJzaW9uJyxcbiAgV0FUQ0ggPSAnd2F0Y2gnLFxuICBHQyA9ICdnYycsXG4gIFJPTExCQUNLID0gJ3JvbGxiYWNrJyxcbiAgSU1QT1JUID0gJ2ltcG9ydCcsXG4gIEFDS05PV0xFREdFID0gJ2Fja25vd2xlZGdlJyxcbiAgQUNLID0gJ2FjaycsXG4gIE5PVElDRVMgPSAnbm90aWNlcycsXG4gIE1JR1JBVEUgPSAnbWlncmF0ZScsXG4gIENPTlRFWFQgPSAnY29udGV4dCcsXG4gIERPQ1MgPSAnZG9jcycsXG4gIERPQyA9ICdkb2MnLFxuICBET0NUT1IgPSAnZG9jdG9yJyxcbiAgUkVGQUNUT1IgPSAncmVmYWN0b3InLFxuICBEUklGVCA9ICdkcmlmdCcsXG4gIENMSV9URUxFTUVUUlkgPSAnY2xpLXRlbGVtZXRyeScsXG59XG5cbmNvbnN0IEJVTkRMSU5HX0NPTU1BTkRTID0gW1xuICBDb21tYW5kLkRFUExPWSxcbiAgQ29tbWFuZC5ESUZGLFxuICBDb21tYW5kLlNZTlRILFxuICBDb21tYW5kLlNZTlRIRVNJWkUsXG4gIENvbW1hbmQuV0FUQ0gsXG4gIENvbW1hbmQuSU1QT1JULFxuXTtcblxudHlwZSBBcmd1bWVudHMgPSB7XG4gIHJlYWRvbmx5IF86IFtDb21tYW5kLCAuLi5zdHJpbmdbXV07XG4gIHJlYWRvbmx5IGV4Y2x1c2l2ZWx5PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgU1RBQ0tTPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IGxvb2t1cHM/OiBib29sZWFuO1xuICByZWFkb25seSBbbmFtZTogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmludGVyZmFjZSBDb25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBwYXNzZWQgdmlhIGNvbW1hbmQgbGluZSBhcmd1bWVudHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb3RoaW5nIHBhc3NlZFxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZExpbmVBcmd1bWVudHM/OiBBcmd1bWVudHM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIHVzZSBjb250ZXh0IGZyb20gYC5jZGsuanNvbmAgaW4gdXNlciBob21lIGRpcmVjdG9yeVxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSByZWFkVXNlckNvbnRleHQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFsbCBzb3VyY2VzIG9mIHNldHRpbmdzIGNvbWJpbmVkXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBzZXR0aW5ncyA9IG5ldyBTZXR0aW5ncygpO1xuICBwdWJsaWMgY29udGV4dCA9IG5ldyBDb250ZXh0KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRDb25maWcgPSBuZXcgU2V0dGluZ3Moe1xuICAgIHZlcnNpb25SZXBvcnRpbmc6IHRydWUsXG4gICAgYXNzZXRNZXRhZGF0YTogdHJ1ZSxcbiAgICBwYXRoTWV0YWRhdGE6IHRydWUsXG4gICAgb3V0cHV0OiAnY2RrLm91dCcsXG4gIH0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZExpbmVBcmd1bWVudHM6IFNldHRpbmdzO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRMaW5lQ29udGV4dDogU2V0dGluZ3M7XG4gIHByaXZhdGUgX3Byb2plY3RDb25maWc/OiBTZXR0aW5ncztcbiAgcHJpdmF0ZSBfcHJvamVjdENvbnRleHQ/OiBTZXR0aW5ncztcbiAgcHJpdmF0ZSBsb2FkZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBDb25maWd1cmF0aW9uUHJvcHMgPSB7fSkge1xuICAgIHRoaXMuY29tbWFuZExpbmVBcmd1bWVudHMgPSBwcm9wcy5jb21tYW5kTGluZUFyZ3VtZW50c1xuICAgICAgPyBjb21tYW5kTGluZUFyZ3VtZW50c1RvU2V0dGluZ3MocHJvcHMuY29tbWFuZExpbmVBcmd1bWVudHMpXG4gICAgICA6IG5ldyBTZXR0aW5ncygpO1xuICAgIHRoaXMuY29tbWFuZExpbmVDb250ZXh0ID0gdGhpcy5jb21tYW5kTGluZUFyZ3VtZW50c1xuICAgICAgLnN1YlNldHRpbmdzKFtDT05URVhUX0tFWV0pXG4gICAgICAubWFrZVJlYWRPbmx5KCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBwcm9qZWN0Q29uZmlnKCkge1xuICAgIGlmICghdGhpcy5fcHJvamVjdENvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignI2xvYWQgaGFzIG5vdCBiZWVuIGNhbGxlZCB5ZXQhJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wcm9qZWN0Q29uZmlnO1xuICB9XG5cbiAgcHVibGljIGdldCBwcm9qZWN0Q29udGV4dCgpIHtcbiAgICBpZiAoIXRoaXMuX3Byb2plY3RDb250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCcjbG9hZCBoYXMgbm90IGJlZW4gY2FsbGVkIHlldCEnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Byb2plY3RDb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYWxsIGNvbmZpZ1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWQoKTogUHJvbWlzZTx0aGlzPiB7XG4gICAgY29uc3QgdXNlckNvbmZpZyA9IGF3YWl0IGxvYWRBbmRMb2coVVNFUl9ERUZBVUxUUyk7XG4gICAgdGhpcy5fcHJvamVjdENvbmZpZyA9IGF3YWl0IGxvYWRBbmRMb2coUFJPSkVDVF9DT05GSUcpO1xuICAgIHRoaXMuX3Byb2plY3RDb250ZXh0ID0gYXdhaXQgbG9hZEFuZExvZyhQUk9KRUNUX0NPTlRFWFQpO1xuXG4gICAgLy8gQHRvZG8gY2Fubm90IGN1cnJlbnRseSBiZSBkaXNhYmxlZCBieSBjbGkgdXNlcnNcbiAgICBjb25zdCByZWFkVXNlckNvbnRleHQgPSB0aGlzLnByb3BzLnJlYWRVc2VyQ29udGV4dCA/PyB0cnVlO1xuXG4gICAgaWYgKHVzZXJDb25maWcuZ2V0KFsnYnVpbGQnXSkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICdUaGUgYGJ1aWxkYCBrZXkgY2Fubm90IGJlIHNwZWNpZmllZCBpbiB0aGUgdXNlciBjb25maWcgKH4vLmNkay5qc29uKSwgc3BlY2lmeSBpdCBpbiB0aGUgcHJvamVjdCBjb25maWcgKGNkay5qc29uKSBpbnN0ZWFkJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dFNvdXJjZXMgPSBbXG4gICAgICB7IGJhZzogdGhpcy5jb21tYW5kTGluZUNvbnRleHQgfSxcbiAgICAgIHtcbiAgICAgICAgZmlsZU5hbWU6IFBST0pFQ1RfQ09ORklHLFxuICAgICAgICBiYWc6IHRoaXMucHJvamVjdENvbmZpZy5zdWJTZXR0aW5ncyhbQ09OVEVYVF9LRVldKS5tYWtlUmVhZE9ubHkoKSxcbiAgICAgIH0sXG4gICAgICB7IGZpbGVOYW1lOiBQUk9KRUNUX0NPTlRFWFQsIGJhZzogdGhpcy5wcm9qZWN0Q29udGV4dCB9LFxuICAgIF07XG4gICAgaWYgKHJlYWRVc2VyQ29udGV4dCkge1xuICAgICAgY29udGV4dFNvdXJjZXMucHVzaCh7XG4gICAgICAgIGZpbGVOYW1lOiBVU0VSX0RFRkFVTFRTLFxuICAgICAgICBiYWc6IHVzZXJDb25maWcuc3ViU2V0dGluZ3MoW0NPTlRFWFRfS0VZXSkubWFrZVJlYWRPbmx5KCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRleHQgPSBuZXcgQ29udGV4dCguLi5jb250ZXh0U291cmNlcyk7XG5cbiAgICAvLyBCdWlsZCBzZXR0aW5ncyBmcm9tIHdoYXQncyBsZWZ0XG4gICAgdGhpcy5zZXR0aW5ncyA9IHRoaXMuZGVmYXVsdENvbmZpZ1xuICAgICAgLm1lcmdlKHVzZXJDb25maWcpXG4gICAgICAubWVyZ2UodGhpcy5wcm9qZWN0Q29uZmlnKVxuICAgICAgLm1lcmdlKHRoaXMuY29tbWFuZExpbmVBcmd1bWVudHMpXG4gICAgICAubWFrZVJlYWRPbmx5KCk7XG5cbiAgICBkZWJ1ZygnbWVyZ2VkIHNldHRpbmdzOicsIHRoaXMuc2V0dGluZ3MuYWxsKTtcblxuICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlIHByb2plY3QgY29udGV4dFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNhdmVDb250ZXh0KCk6IFByb21pc2U8dGhpcz4ge1xuICAgIGlmICghdGhpcy5sb2FkZWQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gLy8gQXZvaWQgb3ZlcndyaXRpbmcgZmlsZXMgd2l0aCBub3RoaW5nXG5cbiAgICBhd2FpdCB0aGlzLnByb2plY3RDb250ZXh0LnNhdmUoUFJPSkVDVF9DT05URVhUKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRBbmRMb2coZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8U2V0dGluZ3M+IHtcbiAgY29uc3QgcmV0ID0gYXdhaXQgc2V0dGluZ3NGcm9tRmlsZShmaWxlTmFtZSk7XG4gIGlmICghcmV0LmVtcHR5KSB7XG4gICAgZGVidWcoZmlsZU5hbWUgKyAnOicsIEpTT04uc3RyaW5naWZ5KHJldC5hbGwsIHVuZGVmaW5lZCwgMikpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHRpbmdzRnJvbUZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8U2V0dGluZ3M+IHtcbiAgbGV0IHNldHRpbmdzO1xuICBjb25zdCBleHBhbmRlZCA9IGV4cGFuZEhvbWVEaXIoZmlsZU5hbWUpO1xuICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhleHBhbmRlZCkpIHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgZnMucmVhZEpzb24oZXhwYW5kZWQpO1xuICAgIHNldHRpbmdzID0gbmV3IFNldHRpbmdzKGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHNldHRpbmdzID0gbmV3IFNldHRpbmdzKCk7XG4gIH1cblxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy81OVxuICBwcm9oaWJpdENvbnRleHRLZXlzKHNldHRpbmdzLCBbJ2RlZmF1bHQtYWNjb3VudCcsICdkZWZhdWx0LXJlZ2lvbiddLCBmaWxlTmFtZSk7XG4gIHdhcm5BYm91dENvbnRleHRLZXkoc2V0dGluZ3MsICdhd3M6JywgZmlsZU5hbWUpO1xuXG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuZnVuY3Rpb24gcHJvaGliaXRDb250ZXh0S2V5cyhzZXR0aW5nczogU2V0dGluZ3MsIGtleXM6IHN0cmluZ1tdLCBmaWxlTmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IGNvbnRleHQgPSBzZXR0aW5ncy5nZXQoWydjb250ZXh0J10pO1xuICBpZiAoIWNvbnRleHQgfHwgdHlwZW9mIGNvbnRleHQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmIChrZXkgaW4gY29udGV4dCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgYFRoZSAnY29udGV4dC4ke2tleX0nIGtleSB3YXMgZm91bmQgaW4gJHtmc19wYXRoLnJlc29sdmUoXG4gICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICl9LCBidXQgaXQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gUGxlYXNlIHJlbW92ZSBpdC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2FybkFib3V0Q29udGV4dEtleShzZXR0aW5nczogU2V0dGluZ3MsIHByZWZpeDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IGNvbnRleHQgPSBzZXR0aW5ncy5nZXQoWydjb250ZXh0J10pO1xuICBpZiAoIWNvbnRleHQgfHwgdHlwZW9mIGNvbnRleHQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChjb25zdCBjb250ZXh0S2V5IG9mIE9iamVjdC5rZXlzKGNvbnRleHQpKSB7XG4gICAgaWYgKGNvbnRleHRLZXkuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICB3YXJuaW5nKFxuICAgICAgICBgQSByZXNlcnZlZCBjb250ZXh0IGtleSAoJ2NvbnRleHQuJHtwcmVmaXh9Jykga2V5IHdhcyBmb3VuZCBpbiAke2ZzX3BhdGgucmVzb2x2ZShcbiAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgKX0sIGl0IG1pZ2h0IGNhdXNlIHN1cnByaXNpbmcgYmVoYXZpb3IgYW5kIHNob3VsZCBiZSByZW1vdmVkLmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBleHBhbmRIb21lRGlyKHg6IHN0cmluZykge1xuICBpZiAoeC5zdGFydHNXaXRoKCd+JykpIHtcbiAgICByZXR1cm4gZnNfcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgeC5zbGljZSgxKSk7XG4gIH1cbiAgcmV0dXJuIHg7XG59XG5cbi8qKlxuICogUGFyc2UgQ0xJIGFyZ3VtZW50cyBpbnRvIFNldHRpbmdzXG4gKlxuICogQ0xJIGFyZ3VtZW50cyBpbiBtdXN0IGJlIGFjY2Vzc2VkIGluIHRoZSBDTEkgY29kZSB2aWFcbiAqIGBjb25maWd1cmF0aW9uLnNldHRpbmdzLmdldChbJ2FyZ05hbWUnXSlgIGluc3RlYWQgb2YgdmlhIGBhcmdzLmFyZ05hbWVgLlxuICpcbiAqIFRoZSBhZHZhbnRhZ2UgaXMgdGhhdCB0aGV5IGNhbiBiZSBjb25maWd1cmVkIHZpYSBgY2RrLmpzb25gIGFuZFxuICogYCRIT01FLy5jZGsuanNvbmAuIEFyZ3VtZW50cyBub3QgbGlzdGVkIGJlbG93IGFuZCBhY2Nlc3NlZCB2aWEgdGhpcyBvYmplY3RcbiAqIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLlxuICpcbiAqIEBwYXJhbSBhcmd2IC0gdGhlIHJlY2VpdmVkIENMSSBhcmd1bWVudHMuXG4gKiBAcmV0dXJucyBhIG5ldyBTZXR0aW5ncyBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGNvbW1hbmRMaW5lQXJndW1lbnRzVG9TZXR0aW5ncyhhcmd2OiBBcmd1bWVudHMpOiBTZXR0aW5ncyB7XG4gIGNvbnN0IGNvbnRleHQgPSBwYXJzZVN0cmluZ0NvbnRleHRMaXN0VG9PYmplY3QoYXJndik7XG4gIGNvbnN0IHRhZ3MgPSBwYXJzZVN0cmluZ1RhZ3NMaXN0VG9PYmplY3QoZXhwZWN0U3RyaW5nTGlzdChhcmd2LnRhZ3MpKTtcblxuICAvLyBEZXRlcm1pbmUgYnVuZGxpbmcgc3RhY2tzXG4gIGxldCBidW5kbGluZ1N0YWNrczogc3RyaW5nW107XG4gIGlmIChCVU5ETElOR19DT01NQU5EUy5pbmNsdWRlcyhhcmd2Ll9bMF0pKSB7XG4gICAgLy8gSWYgd2UgZGVwbG95LCBkaWZmLCBzeW50aCBvciB3YXRjaCBhIGxpc3Qgb2Ygc3RhY2tzIGV4Y2x1c2l2ZWx5IHdlIHNraXBcbiAgICAvLyBidW5kbGluZyBmb3IgYWxsIG90aGVyIHN0YWNrcy5cbiAgICBidW5kbGluZ1N0YWNrcyA9IGFyZ3YuZXhjbHVzaXZlbHkgPyBhcmd2LlNUQUNLUyA/PyBbJyoqJ10gOiBbJyoqJ107XG4gIH0gZWxzZSB7XG4gICAgLy8gU2tpcCBidW5kbGluZyBmb3IgYWxsIHN0YWNrc1xuICAgIGJ1bmRsaW5nU3RhY2tzID0gW107XG4gIH1cblxuICByZXR1cm4gbmV3IFNldHRpbmdzKHtcbiAgICBhcHA6IGFyZ3YuYXBwLFxuICAgIGJyb3dzZXI6IGFyZ3YuYnJvd3NlcixcbiAgICBidWlsZDogYXJndi5idWlsZCxcbiAgICBjYUJ1bmRsZVBhdGg6IGFyZ3YuY2FCdW5kbGVQYXRoLFxuICAgIGNvbnRleHQsXG4gICAgZGVidWc6IGFyZ3YuZGVidWcsXG4gICAgdGFncyxcbiAgICBsYW5ndWFnZTogYXJndi5sYW5ndWFnZSxcbiAgICBwYXRoTWV0YWRhdGE6IGFyZ3YucGF0aE1ldGFkYXRhLFxuICAgIGFzc2V0TWV0YWRhdGE6IGFyZ3YuYXNzZXRNZXRhZGF0YSxcbiAgICBwcm9maWxlOiBhcmd2LnByb2ZpbGUsXG4gICAgcGx1Z2luOiBhcmd2LnBsdWdpbixcbiAgICByZXF1aXJlQXBwcm92YWw6IGFyZ3YucmVxdWlyZUFwcHJvdmFsLFxuICAgIHRvb2xraXRTdGFja05hbWU6IGFyZ3YudG9vbGtpdFN0YWNrTmFtZSxcbiAgICB0b29sa2l0QnVja2V0OiB7XG4gICAgICBidWNrZXROYW1lOiBhcmd2LmJvb3RzdHJhcEJ1Y2tldE5hbWUsXG4gICAgICBrbXNLZXlJZDogYXJndi5ib290c3RyYXBLbXNLZXlJZCxcbiAgICB9LFxuICAgIHZlcnNpb25SZXBvcnRpbmc6IGFyZ3YudmVyc2lvblJlcG9ydGluZyxcbiAgICBzdGFnaW5nOiBhcmd2LnN0YWdpbmcsXG4gICAgb3V0cHV0OiBhcmd2Lm91dHB1dCxcbiAgICBvdXRwdXRzRmlsZTogYXJndi5vdXRwdXRzRmlsZSxcbiAgICBwcm9ncmVzczogYXJndi5wcm9ncmVzcyxcbiAgICBwcm94eTogYXJndi5wcm94eSxcbiAgICBidW5kbGluZ1N0YWNrcyxcbiAgICBsb29rdXBzOiBhcmd2Lmxvb2t1cHMsXG4gICAgcm9sbGJhY2s6IGFyZ3Yucm9sbGJhY2ssXG4gICAgbm90aWNlczogYXJndi5ub3RpY2VzLFxuICAgIGFzc2V0UGFyYWxsZWxpc206IGFyZ3ZbJ2Fzc2V0LXBhcmFsbGVsaXNtJ10sXG4gICAgYXNzZXRCdWlsZENvbmN1cnJlbmN5OiBhcmd2Wydhc3NldC1idWlsZC1jb25jdXJyZW5jeSddLFxuICAgIGFzc2V0UHJlYnVpbGQ6IGFyZ3ZbJ2Fzc2V0LXByZWJ1aWxkJ10sXG4gICAgaWdub3JlTm9TdGFja3M6IGFyZ3ZbJ2lnbm9yZS1uby1zdGFja3MnXSxcbiAgICBob3Rzd2FwOiB7XG4gICAgICBlY3M6IHtcbiAgICAgICAgbWluaW11bUhlYWx0aHlQZXJjZW50OiBhcmd2LmhvdHN3YXBFY3NNaW5pbXVtSGVhbHRoeVBlcmNlbnQsXG4gICAgICAgIG1heGltdW1IZWFsdGh5UGVyY2VudDogYXJndi5ob3Rzd2FwRWNzTWF4aW11bUhlYWx0aHlQZXJjZW50LFxuICAgICAgICBzdGFiaWxpemF0aW9uVGltZW91dFNlY29uZHM6IGFyZ3YuaG90c3dhcEVjc1N0YWJpbGl6YXRpb25UaW1lb3V0U2Vjb25kcyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB1bnN0YWJsZTogYXJndi51bnN0YWJsZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4cGVjdFN0cmluZ0xpc3QoeDogdW5rbm93bik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHggPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgRXhwZWN0ZWQgYXJyYXksIGdvdCAnJHt4fSdgKTtcbiAgfVxuICBjb25zdCBub25TdHJpbmdzID0geC5maWx0ZXIoKGUpID0+IHR5cGVvZiBlICE9PSAnc3RyaW5nJyk7XG4gIGlmIChub25TdHJpbmdzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBFeHBlY3RlZCBsaXN0IG9mIHN0cmluZ3MsIGZvdW5kICR7bm9uU3RyaW5nc31gKTtcbiAgfVxuICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gcGFyc2VTdHJpbmdDb250ZXh0TGlzdFRvT2JqZWN0KGFyZ3Y6IEFyZ3VtZW50cyk6IGFueSB7XG4gIGNvbnN0IGNvbnRleHQ6IGFueSA9IHt9O1xuXG4gIGZvciAoY29uc3QgYXNzaWdubWVudCBvZiAoYXJndiBhcyBhbnkpLmNvbnRleHQgfHwgW10pIHtcbiAgICBjb25zdCBwYXJ0cyA9IGFzc2lnbm1lbnQuc3BsaXQoLz0oLiopLywgMik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgZGVidWcoJ0NMSSBhcmd1bWVudCBjb250ZXh0OiAlcz0lcycsIHBhcnRzWzBdLCBwYXJ0c1sxXSk7XG4gICAgICBpZiAocGFydHNbMF0ubWF0Y2goL15hd3M6LisvKSkge1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKFxuICAgICAgICAgIGBVc2VyLXByb3ZpZGVkIGNvbnRleHQgY2Fubm90IHVzZSBrZXlzIHByZWZpeGVkIHdpdGggJ2F3czonLCBidXQgJHtwYXJ0c1swXX0gd2FzIHByb3ZpZGVkLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb250ZXh0W3BhcnRzWzBdXSA9IHBhcnRzWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuaW5nKFxuICAgICAgICAnQ29udGV4dCBhcmd1bWVudCBpcyBub3QgYW4gYXNzaWdubWVudCAoa2V5PXZhbHVlKTogJXMnLFxuICAgICAgICBhc3NpZ25tZW50LFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbi8qKlxuICogUGFyc2UgdGFncyBvdXQgb2YgYXJndW1lbnRzXG4gKlxuICogUmV0dXJuIHVuZGVmaW5lZCBpZiBubyB0YWdzIHdlcmUgcHJvdmlkZWQsIHJldHVybiBhbiBlbXB0eSBhcnJheSBpZiBvbmx5IGVtcHR5XG4gKiBzdHJpbmdzIHdlcmUgcHJvdmlkZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdHJpbmdUYWdzTGlzdFRvT2JqZWN0KFxuICBhcmdUYWdzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbik6IFRhZ1tdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGFyZ1RhZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGFyZ1RhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBub25FbXB0eVRhZ3MgPSBhcmdUYWdzLmZpbHRlcigodCkgPT4gdCAhPT0gJycpO1xuICBpZiAobm9uRW1wdHlUYWdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHRhZ3M6IFRhZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBhc3NpZ25tZW50IG9mIG5vbkVtcHR5VGFncykge1xuICAgIGNvbnN0IHBhcnRzID0gYXNzaWdubWVudC5zcGxpdCgvPSguKikvLCAyKTtcbiAgICBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBkZWJ1ZygnQ0xJIGFyZ3VtZW50IHRhZ3M6ICVzPSVzJywgcGFydHNbMF0sIHBhcnRzWzFdKTtcbiAgICAgIHRhZ3MucHVzaCh7XG4gICAgICAgIEtleTogcGFydHNbMF0sXG4gICAgICAgIFZhbHVlOiBwYXJ0c1sxXSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuaW5nKCdUYWdzIGFyZ3VtZW50IGlzIG5vdCBhbiBhc3NpZ25tZW50IChrZXk9dmFsdWUpOiAlcycsIGFzc2lnbm1lbnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFncy5sZW5ndGggPiAwID8gdGFncyA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==