@aws-cdk/toolkit-lib 0.1.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/LICENSE +202 -0
- package/NOTICE +16 -0
- package/README.md +432 -0
- package/build-info.json +4 -0
- package/db.json.gz +0 -0
- package/lib/actions/deploy/index.d.ts +178 -0
- package/lib/actions/deploy/index.js +78 -0
- package/lib/actions/deploy/private/deploy-options.d.ts +78 -0
- package/lib/actions/deploy/private/deploy-options.js +3 -0
- package/lib/actions/deploy/private/helpers.d.ts +15 -0
- package/lib/actions/deploy/private/helpers.js +41 -0
- package/lib/actions/deploy/private/index.d.ts +2 -0
- package/lib/actions/deploy/private/index.js +19 -0
- package/lib/actions/destroy/index.d.ts +17 -0
- package/lib/actions/destroy/index.js +3 -0
- package/lib/actions/diff/index.d.ts +83 -0
- package/lib/actions/diff/index.js +45 -0
- package/lib/actions/diff/private/helpers.d.ts +7 -0
- package/lib/actions/diff/private/helpers.js +20 -0
- package/lib/actions/diff/private/index.d.ts +1 -0
- package/lib/actions/diff/private/index.js +18 -0
- package/lib/actions/import/index.d.ts +21 -0
- package/lib/actions/import/index.js +3 -0
- package/lib/actions/index.d.ts +6 -0
- package/lib/actions/index.js +23 -0
- package/lib/actions/list/index.d.ts +7 -0
- package/lib/actions/list/index.js +3 -0
- package/lib/actions/rollback/index.d.ts +39 -0
- package/lib/actions/rollback/index.js +3 -0
- package/lib/actions/synth/index.d.ts +12 -0
- package/lib/actions/synth/index.js +3 -0
- package/lib/actions/watch/index.d.ts +35 -0
- package/lib/actions/watch/index.js +3 -0
- package/lib/actions/watch/private/helpers.d.ts +4 -0
- package/lib/actions/watch/private/helpers.js +8 -0
- package/lib/actions/watch/private/index.d.ts +1 -0
- package/lib/actions/watch/private/index.js +18 -0
- package/lib/api/aws-auth/index.d.ts +1 -0
- package/lib/api/aws-auth/index.js +18 -0
- package/lib/api/aws-auth/types.d.ts +32 -0
- package/lib/api/aws-auth/types.js +3 -0
- package/lib/api/aws-cdk.d.ts +25 -0
- package/lib/api/aws-cdk.js +9329 -0
- package/lib/api/aws-cdk.js.map +7 -0
- package/lib/api/cloud-assembly/index.d.ts +3 -0
- package/lib/api/cloud-assembly/index.js +20 -0
- package/lib/api/cloud-assembly/private/cached-source.d.ts +15 -0
- package/lib/api/cloud-assembly/private/cached-source.js +25 -0
- package/lib/api/cloud-assembly/private/context-aware-source.d.ts +45 -0
- package/lib/api/cloud-assembly/private/context-aware-source.js +89 -0
- package/lib/api/cloud-assembly/private/exec.d.ts +13 -0
- package/lib/api/cloud-assembly/private/exec.js +56 -0
- package/lib/api/cloud-assembly/private/identity-source.d.ts +10 -0
- package/lib/api/cloud-assembly/private/identity-source.js +17 -0
- package/lib/api/cloud-assembly/private/index.d.ts +8 -0
- package/lib/api/cloud-assembly/private/index.js +25 -0
- package/lib/api/cloud-assembly/private/prepare-source.d.ts +52 -0
- package/lib/api/cloud-assembly/private/prepare-source.js +166 -0
- package/lib/api/cloud-assembly/private/source-builder.d.ts +29 -0
- package/lib/api/cloud-assembly/private/source-builder.js +121 -0
- package/lib/api/cloud-assembly/private/stack-assembly.d.ts +30 -0
- package/lib/api/cloud-assembly/private/stack-assembly.js +94 -0
- package/lib/api/cloud-assembly/private/stack-selectors.d.ts +2 -0
- package/lib/api/cloud-assembly/private/stack-selectors.js +8 -0
- package/lib/api/cloud-assembly/source-builder.d.ts +113 -0
- package/lib/api/cloud-assembly/source-builder.js +3 -0
- package/lib/api/cloud-assembly/stack-selector.d.ts +81 -0
- package/lib/api/cloud-assembly/stack-selector.js +64 -0
- package/lib/api/cloud-assembly/types.d.ts +7 -0
- package/lib/api/cloud-assembly/types.js +3 -0
- package/lib/api/errors.d.ts +44 -0
- package/lib/api/errors.js +82 -0
- package/lib/api/io/index.d.ts +2 -0
- package/lib/api/io/index.js +19 -0
- package/lib/api/io/io-host.d.ts +15 -0
- package/lib/api/io/io-host.js +3 -0
- package/lib/api/io/io-message.d.ts +59 -0
- package/lib/api/io/io-message.js +3 -0
- package/lib/api/io/private/codes.d.ts +37 -0
- package/lib/api/io/private/codes.js +48 -0
- package/lib/api/io/private/index.d.ts +6 -0
- package/lib/api/io/private/index.js +23 -0
- package/lib/api/io/private/level-priority.d.ts +11 -0
- package/lib/api/io/private/level-priority.js +33 -0
- package/lib/api/io/private/logger.d.ts +40 -0
- package/lib/api/io/private/logger.js +211 -0
- package/lib/api/io/private/messages.d.ts +64 -0
- package/lib/api/io/private/messages.js +159 -0
- package/lib/api/io/private/timer.d.ts +29 -0
- package/lib/api/io/private/timer.js +54 -0
- package/lib/api/io/private/types.d.ts +25 -0
- package/lib/api/io/private/types.js +3 -0
- package/lib/index.d.ts +6 -0
- package/lib/index.js +25 -0
- package/lib/index_bg.wasm +0 -0
- package/lib/toolkit/index.d.ts +1 -0
- package/lib/toolkit/index.js +18 -0
- package/lib/toolkit/private/index.d.ts +9 -0
- package/lib/toolkit/private/index.js +3 -0
- package/lib/toolkit/toolkit.d.ts +142 -0
- package/lib/toolkit/toolkit.js +644 -0
- package/package.json +147 -0
|
@@ -0,0 +1,644 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Toolkit = void 0;
|
|
4
|
+
const path = require("node:path");
|
|
5
|
+
const cxapi = require("@aws-cdk/cx-api");
|
|
6
|
+
const chalk = require("chalk");
|
|
7
|
+
const chokidar = require("chokidar");
|
|
8
|
+
const fs = require("fs-extra");
|
|
9
|
+
const deploy_1 = require("../actions/deploy");
|
|
10
|
+
const private_1 = require("../actions/deploy/private");
|
|
11
|
+
const private_2 = require("../actions/diff/private");
|
|
12
|
+
const private_3 = require("../actions/watch/private");
|
|
13
|
+
const aws_cdk_1 = require("../api/aws-cdk");
|
|
14
|
+
const cloud_assembly_1 = require("../api/cloud-assembly");
|
|
15
|
+
const private_4 = require("../api/cloud-assembly/private");
|
|
16
|
+
const errors_1 = require("../api/errors");
|
|
17
|
+
const private_5 = require("../api/io/private");
|
|
18
|
+
/**
|
|
19
|
+
* The AWS CDK Programmatic Toolkit
|
|
20
|
+
*/
|
|
21
|
+
class Toolkit extends private_4.CloudAssemblySourceBuilder {
|
|
22
|
+
props;
|
|
23
|
+
/**
|
|
24
|
+
* The toolkit stack name used for bootstrapping resources.
|
|
25
|
+
*/
|
|
26
|
+
toolkitStackName;
|
|
27
|
+
/**
|
|
28
|
+
* The IoHost of this Toolkit
|
|
29
|
+
*/
|
|
30
|
+
ioHost;
|
|
31
|
+
_sdkProvider;
|
|
32
|
+
constructor(props = {}) {
|
|
33
|
+
super();
|
|
34
|
+
this.props = props;
|
|
35
|
+
this.toolkitStackName = props.toolkitStackName ?? aws_cdk_1.DEFAULT_TOOLKIT_STACK_NAME;
|
|
36
|
+
// Hacky way to re-use the global IoHost until we have fully removed the need for it
|
|
37
|
+
const globalIoHost = aws_cdk_1.CliIoHost.instance();
|
|
38
|
+
if (props.ioHost) {
|
|
39
|
+
globalIoHost.registerIoHost(props.ioHost);
|
|
40
|
+
}
|
|
41
|
+
let ioHost = globalIoHost;
|
|
42
|
+
if (props.emojis === false) {
|
|
43
|
+
ioHost = (0, private_5.withoutEmojis)(ioHost);
|
|
44
|
+
}
|
|
45
|
+
if (props.color === false) {
|
|
46
|
+
ioHost = (0, private_5.withoutColor)(ioHost);
|
|
47
|
+
}
|
|
48
|
+
// After removing emojis and color, we might end up with floating whitespace at either end of the message
|
|
49
|
+
// This also removes newlines that we currently emit for CLI backwards compatibility.
|
|
50
|
+
this.ioHost = (0, private_5.withTrimmedWhitespace)(ioHost);
|
|
51
|
+
}
|
|
52
|
+
async dispose() {
|
|
53
|
+
// nothing to do yet
|
|
54
|
+
}
|
|
55
|
+
async [Symbol.asyncDispose]() {
|
|
56
|
+
await this.dispose();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Access to the AWS SDK
|
|
60
|
+
*/
|
|
61
|
+
async sdkProvider(action) {
|
|
62
|
+
// @todo this needs to be different instance per action
|
|
63
|
+
if (!this._sdkProvider) {
|
|
64
|
+
this._sdkProvider = await aws_cdk_1.SdkProvider.withAwsCliCompatibleDefaults({
|
|
65
|
+
...this.props.sdkConfig,
|
|
66
|
+
logger: (0, private_5.asSdkLogger)(this.ioHost, action),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return this._sdkProvider;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Helper to provide the CloudAssemblySourceBuilder with required toolkit services
|
|
73
|
+
*/
|
|
74
|
+
async sourceBuilderServices() {
|
|
75
|
+
return {
|
|
76
|
+
ioHost: (0, private_5.withAction)(this.ioHost, 'assembly'),
|
|
77
|
+
sdkProvider: await this.sdkProvider('assembly'),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Synth Action
|
|
82
|
+
*/
|
|
83
|
+
async synth(cx, options = {}) {
|
|
84
|
+
const ioHost = (0, private_5.withAction)(this.ioHost, 'synth');
|
|
85
|
+
const synthTimer = private_5.Timer.start();
|
|
86
|
+
const assembly = await this.assemblyFromSource(cx);
|
|
87
|
+
const stacks = assembly.selectStacksV2(options.stacks ?? private_4.ALL_STACKS);
|
|
88
|
+
const autoValidateStacks = options.validateStacks ? [assembly.selectStacksForValidation()] : [];
|
|
89
|
+
await this.validateStacksMetadata(stacks.concat(...autoValidateStacks), ioHost);
|
|
90
|
+
await synthTimer.endAs(ioHost, 'synth');
|
|
91
|
+
// if we have a single stack, print it to STDOUT
|
|
92
|
+
const message = `Successfully synthesized to ${chalk.blue(path.resolve(stacks.assembly.directory))}`;
|
|
93
|
+
const assemblyData = {
|
|
94
|
+
assemblyDirectory: stacks.assembly.directory,
|
|
95
|
+
stacksCount: stacks.stackCount,
|
|
96
|
+
stackIds: stacks.hierarchicalIds,
|
|
97
|
+
};
|
|
98
|
+
if (stacks.stackCount === 1) {
|
|
99
|
+
const firstStack = stacks.firstStack;
|
|
100
|
+
const template = firstStack.template;
|
|
101
|
+
const obscuredTemplate = (0, aws_cdk_1.obscureTemplate)(template);
|
|
102
|
+
await ioHost.notify((0, private_5.result)(message, 'CDK_TOOLKIT_I1901', {
|
|
103
|
+
...assemblyData,
|
|
104
|
+
stack: {
|
|
105
|
+
stackName: firstStack.stackName,
|
|
106
|
+
hierarchicalId: firstStack.hierarchicalId,
|
|
107
|
+
template,
|
|
108
|
+
stringifiedJson: (0, aws_cdk_1.serializeStructure)(obscuredTemplate, true),
|
|
109
|
+
stringifiedYaml: (0, aws_cdk_1.serializeStructure)(obscuredTemplate, false),
|
|
110
|
+
},
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// not outputting template to stdout, let's explain things to the user a little bit...
|
|
115
|
+
await ioHost.notify((0, private_5.result)(chalk.green(message), 'CDK_TOOLKIT_I1902', assemblyData));
|
|
116
|
+
await ioHost.notify((0, private_5.info)(`Supply a stack id (${stacks.stackArtifacts.map((s) => chalk.green(s.hierarchicalId)).join(', ')}) to display its template.`));
|
|
117
|
+
}
|
|
118
|
+
return new private_4.IdentityCloudAssemblySource(assembly.assembly);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* List Action
|
|
122
|
+
*
|
|
123
|
+
* List selected stacks and their dependencies
|
|
124
|
+
*/
|
|
125
|
+
async list(cx, options = {}) {
|
|
126
|
+
const ioHost = (0, private_5.withAction)(this.ioHost, 'list');
|
|
127
|
+
const synthTimer = private_5.Timer.start();
|
|
128
|
+
const assembly = await this.assemblyFromSource(cx);
|
|
129
|
+
const stackCollection = await assembly.selectStacksV2(options.stacks ?? private_4.ALL_STACKS);
|
|
130
|
+
await synthTimer.endAs(ioHost, 'synth');
|
|
131
|
+
const stacks = stackCollection.withDependencies();
|
|
132
|
+
const message = stacks.map(s => s.id).join('\n');
|
|
133
|
+
await ioHost.notify((0, private_5.result)(message, 'CDK_TOOLKIT_I2901', { stacks }));
|
|
134
|
+
return stacks;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Deploy Action
|
|
138
|
+
*
|
|
139
|
+
* Deploys the selected stacks into an AWS account
|
|
140
|
+
*/
|
|
141
|
+
async deploy(cx, options = {}) {
|
|
142
|
+
const assembly = await this.assemblyFromSource(cx);
|
|
143
|
+
return this._deploy(assembly, 'deploy', options);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Helper to allow deploy being called as part of the watch action.
|
|
147
|
+
*/
|
|
148
|
+
async _deploy(assembly, action, options = {}) {
|
|
149
|
+
const ioHost = (0, private_5.withAction)(this.ioHost, action);
|
|
150
|
+
const synthTimer = private_5.Timer.start();
|
|
151
|
+
const stackCollection = assembly.selectStacksV2(options.stacks ?? private_4.ALL_STACKS);
|
|
152
|
+
await this.validateStacksMetadata(stackCollection, ioHost);
|
|
153
|
+
const synthDuration = await synthTimer.endAs(ioHost, 'synth');
|
|
154
|
+
if (stackCollection.stackCount === 0) {
|
|
155
|
+
await ioHost.notify((0, private_5.error)('This app contains no stacks', 'CDK_TOOLKIT_E5001'));
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const deployments = await this.deploymentsForAction('deploy');
|
|
159
|
+
const migrator = new aws_cdk_1.ResourceMigrator({ deployments, ioHost, action });
|
|
160
|
+
await migrator.tryMigrateResources(stackCollection, options);
|
|
161
|
+
const requireApproval = options.requireApproval ?? deploy_1.RequireApproval.NEVER;
|
|
162
|
+
const parameterMap = (0, private_1.buildParameterMap)(options.parameters?.parameters);
|
|
163
|
+
const hotswapMode = options.hotswap ?? aws_cdk_1.HotswapMode.FULL_DEPLOYMENT;
|
|
164
|
+
if (hotswapMode !== aws_cdk_1.HotswapMode.FULL_DEPLOYMENT) {
|
|
165
|
+
await ioHost.notify((0, private_5.warn)([
|
|
166
|
+
'⚠️ The --hotswap and --hotswap-fallback flags deliberately introduce CloudFormation drift to speed up deployments',
|
|
167
|
+
'⚠️ They should only be used for development - never use them for your production Stacks!',
|
|
168
|
+
].join('\n')));
|
|
169
|
+
}
|
|
170
|
+
const stacks = stackCollection.stackArtifacts;
|
|
171
|
+
const stackOutputs = {};
|
|
172
|
+
const outputsFile = options.outputsFile;
|
|
173
|
+
const buildAsset = async (assetNode) => {
|
|
174
|
+
await deployments.buildSingleAsset(assetNode.assetManifestArtifact, assetNode.assetManifest, assetNode.asset, {
|
|
175
|
+
stack: assetNode.parentStack,
|
|
176
|
+
roleArn: options.roleArn,
|
|
177
|
+
stackName: assetNode.parentStack.stackName,
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
const publishAsset = async (assetNode) => {
|
|
181
|
+
await deployments.publishSingleAsset(assetNode.assetManifest, assetNode.asset, {
|
|
182
|
+
stack: assetNode.parentStack,
|
|
183
|
+
roleArn: options.roleArn,
|
|
184
|
+
stackName: assetNode.parentStack.stackName,
|
|
185
|
+
});
|
|
186
|
+
};
|
|
187
|
+
const deployStack = async (stackNode) => {
|
|
188
|
+
const stack = stackNode.stack;
|
|
189
|
+
if (stackCollection.stackCount !== 1) {
|
|
190
|
+
await ioHost.notify((0, private_5.info)(chalk.bold(stack.displayName)));
|
|
191
|
+
}
|
|
192
|
+
if (!stack.environment) {
|
|
193
|
+
throw new errors_1.ToolkitError(`Stack ${stack.displayName} does not define an environment, and AWS credentials could not be obtained from standard locations or no region was configured.`);
|
|
194
|
+
}
|
|
195
|
+
// The generated stack has no resources
|
|
196
|
+
if (Object.keys(stack.template.Resources || {}).length === 0) {
|
|
197
|
+
// stack is empty and doesn't exist => do nothing
|
|
198
|
+
const stackExists = await deployments.stackExists({ stack });
|
|
199
|
+
if (!stackExists) {
|
|
200
|
+
return ioHost.notify((0, private_5.warn)(`${chalk.bold(stack.displayName)}: stack has no resources, skipping deployment.`));
|
|
201
|
+
}
|
|
202
|
+
// stack is empty, but exists => delete
|
|
203
|
+
await ioHost.notify((0, private_5.warn)(`${chalk.bold(stack.displayName)}: stack has no resources, deleting existing stack.`));
|
|
204
|
+
await this._destroy(assembly, 'deploy', {
|
|
205
|
+
stacks: { patterns: [stack.hierarchicalId], strategy: cloud_assembly_1.StackSelectionStrategy.PATTERN_MUST_MATCH_SINGLE },
|
|
206
|
+
roleArn: options.roleArn,
|
|
207
|
+
ci: options.ci,
|
|
208
|
+
});
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
if (requireApproval !== deploy_1.RequireApproval.NEVER) {
|
|
212
|
+
const currentTemplate = await deployments.readCurrentTemplate(stack);
|
|
213
|
+
if ((0, private_2.diffRequiresApproval)(currentTemplate, stack, requireApproval)) {
|
|
214
|
+
const motivation = '"--require-approval" is enabled and stack includes security-sensitive updates.';
|
|
215
|
+
const question = `${motivation}\nDo you wish to deploy these changes`;
|
|
216
|
+
const confirmed = await ioHost.requestResponse((0, private_5.confirm)('CDK_TOOLKIT_I5060', question, motivation, true, concurrency));
|
|
217
|
+
if (!confirmed) {
|
|
218
|
+
throw new errors_1.ToolkitError('Aborted by user');
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Following are the same semantics we apply with respect to Notification ARNs (dictated by the SDK)
|
|
223
|
+
//
|
|
224
|
+
// - undefined => cdk ignores it, as if it wasn't supported (allows external management).
|
|
225
|
+
// - []: => cdk manages it, and the user wants to wipe it out.
|
|
226
|
+
// - ['arn-1'] => cdk manages it, and the user wants to set it to ['arn-1'].
|
|
227
|
+
const notificationArns = (!!options.notificationArns || !!stack.notificationArns)
|
|
228
|
+
? (options.notificationArns ?? []).concat(stack.notificationArns ?? [])
|
|
229
|
+
: undefined;
|
|
230
|
+
for (const notificationArn of notificationArns ?? []) {
|
|
231
|
+
if (!(0, aws_cdk_1.validateSnsTopicArn)(notificationArn)) {
|
|
232
|
+
throw new errors_1.ToolkitError(`Notification arn ${notificationArn} is not a valid arn for an SNS topic`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
const stackIndex = stacks.indexOf(stack) + 1;
|
|
236
|
+
await ioHost.notify((0, private_5.info)(`${chalk.bold(stack.displayName)}: deploying... [${stackIndex}/${stackCollection.stackCount}]`));
|
|
237
|
+
const deployTimer = private_5.Timer.start();
|
|
238
|
+
let tags = options.tags;
|
|
239
|
+
if (!tags || tags.length === 0) {
|
|
240
|
+
tags = (0, aws_cdk_1.tagsForStack)(stack);
|
|
241
|
+
}
|
|
242
|
+
let deployDuration;
|
|
243
|
+
try {
|
|
244
|
+
let deployResult;
|
|
245
|
+
let rollback = options.rollback;
|
|
246
|
+
let iteration = 0;
|
|
247
|
+
while (!deployResult) {
|
|
248
|
+
if (++iteration > 2) {
|
|
249
|
+
throw new errors_1.ToolkitError('This loop should have stabilized in 2 iterations, but didn\'t. If you are seeing this error, please report it at https://github.com/aws/aws-cdk/issues/new/choose');
|
|
250
|
+
}
|
|
251
|
+
const r = await deployments.deployStack({
|
|
252
|
+
stack,
|
|
253
|
+
deployName: stack.stackName,
|
|
254
|
+
roleArn: options.roleArn,
|
|
255
|
+
toolkitStackName: this.toolkitStackName,
|
|
256
|
+
reuseAssets: options.reuseAssets,
|
|
257
|
+
notificationArns,
|
|
258
|
+
tags,
|
|
259
|
+
deploymentMethod: options.deploymentMethod,
|
|
260
|
+
force: options.force,
|
|
261
|
+
parameters: Object.assign({}, parameterMap['*'], parameterMap[stack.stackName]),
|
|
262
|
+
usePreviousParameters: options.parameters?.keepExistingParameters,
|
|
263
|
+
progress,
|
|
264
|
+
ci: options.ci,
|
|
265
|
+
rollback,
|
|
266
|
+
hotswap: hotswapMode,
|
|
267
|
+
extraUserAgent: options.extraUserAgent,
|
|
268
|
+
hotswapPropertyOverrides: options.hotswapProperties ? (0, private_1.createHotswapPropertyOverrides)(options.hotswapProperties) : undefined,
|
|
269
|
+
assetParallelism: options.assetParallelism,
|
|
270
|
+
});
|
|
271
|
+
switch (r.type) {
|
|
272
|
+
case 'did-deploy-stack':
|
|
273
|
+
deployResult = r;
|
|
274
|
+
break;
|
|
275
|
+
case 'failpaused-need-rollback-first': {
|
|
276
|
+
const motivation = r.reason === 'replacement'
|
|
277
|
+
? `Stack is in a paused fail state (${r.status}) and change includes a replacement which cannot be deployed with "--no-rollback"`
|
|
278
|
+
: `Stack is in a paused fail state (${r.status}) and command line arguments do not include "--no-rollback"`;
|
|
279
|
+
const question = `${motivation}. Perform a regular deployment`;
|
|
280
|
+
if (options.force) {
|
|
281
|
+
await ioHost.notify((0, private_5.warn)(`${motivation}. Rolling back first (--force).`));
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
const confirmed = await ioHost.requestResponse((0, private_5.confirm)('CDK_TOOLKIT_I5050', question, motivation, true, concurrency));
|
|
285
|
+
if (!confirmed) {
|
|
286
|
+
throw new errors_1.ToolkitError('Aborted by user');
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// Perform a rollback
|
|
290
|
+
await this._rollback(assembly, action, {
|
|
291
|
+
stacks: { patterns: [stack.hierarchicalId], strategy: cloud_assembly_1.StackSelectionStrategy.PATTERN_MUST_MATCH_SINGLE },
|
|
292
|
+
orphanFailedResources: options.force,
|
|
293
|
+
});
|
|
294
|
+
// Go around through the 'while' loop again but switch rollback to true.
|
|
295
|
+
rollback = true;
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
case 'replacement-requires-rollback': {
|
|
299
|
+
const motivation = 'Change includes a replacement which cannot be deployed with "--no-rollback"';
|
|
300
|
+
const question = `${motivation}. Perform a regular deployment`;
|
|
301
|
+
// @todo no force here
|
|
302
|
+
if (options.force) {
|
|
303
|
+
await ioHost.notify((0, private_5.warn)(`${motivation}. Proceeding with regular deployment (--force).`));
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
const confirmed = await ioHost.requestResponse((0, private_5.confirm)('CDK_TOOLKIT_I5050', question, motivation, true, concurrency));
|
|
307
|
+
if (!confirmed) {
|
|
308
|
+
throw new errors_1.ToolkitError('Aborted by user');
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// Go around through the 'while' loop again but switch rollback to true.
|
|
312
|
+
rollback = true;
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
default:
|
|
316
|
+
throw new errors_1.ToolkitError(`Unexpected result type from deployStack: ${JSON.stringify(r)}. If you are seeing this error, please report it at https://github.com/aws/aws-cdk/issues/new/choose`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
const message = deployResult.noOp
|
|
320
|
+
? ` ✅ ${stack.displayName} (no changes)`
|
|
321
|
+
: ` ✅ ${stack.displayName}`;
|
|
322
|
+
await ioHost.notify((0, private_5.result)(chalk.green('\n' + message), 'CDK_TOOLKIT_I5900', deployResult));
|
|
323
|
+
deployDuration = await deployTimer.endAs(ioHost, 'deploy');
|
|
324
|
+
if (Object.keys(deployResult.outputs).length > 0) {
|
|
325
|
+
const buffer = ['Outputs:'];
|
|
326
|
+
stackOutputs[stack.stackName] = deployResult.outputs;
|
|
327
|
+
for (const name of Object.keys(deployResult.outputs).sort()) {
|
|
328
|
+
const value = deployResult.outputs[name];
|
|
329
|
+
buffer.push(`${chalk.cyan(stack.id)}.${chalk.cyan(name)} = ${chalk.underline(chalk.cyan(value))}`);
|
|
330
|
+
}
|
|
331
|
+
await ioHost.notify((0, private_5.info)(buffer.join('\n')));
|
|
332
|
+
}
|
|
333
|
+
await ioHost.notify((0, private_5.info)(`Stack ARN:\n${deployResult.stackArn}`));
|
|
334
|
+
}
|
|
335
|
+
catch (e) {
|
|
336
|
+
// It has to be exactly this string because an integration test tests for
|
|
337
|
+
// "bold(stackname) failed: ResourceNotReady: <error>"
|
|
338
|
+
throw new errors_1.ToolkitError([`❌ ${chalk.bold(stack.stackName)} failed:`, ...(e.name ? [`${e.name}:`] : []), e.message].join(' '));
|
|
339
|
+
}
|
|
340
|
+
finally {
|
|
341
|
+
if (options.traceLogs) {
|
|
342
|
+
// deploy calls that originate from watch will come with their own cloudWatchLogMonitor
|
|
343
|
+
const cloudWatchLogMonitor = options.cloudWatchLogMonitor ?? new aws_cdk_1.CloudWatchLogEventMonitor();
|
|
344
|
+
const foundLogGroupsResult = await (0, aws_cdk_1.findCloudWatchLogGroups)(await this.sdkProvider('deploy'), { ioHost, action }, stack);
|
|
345
|
+
cloudWatchLogMonitor.addLogGroups(foundLogGroupsResult.env, foundLogGroupsResult.sdk, foundLogGroupsResult.logGroupNames);
|
|
346
|
+
await ioHost.notify((0, private_5.info)(`The following log groups are added: ${foundLogGroupsResult.logGroupNames}`, 'CDK_TOOLKIT_I5031'));
|
|
347
|
+
}
|
|
348
|
+
// If an outputs file has been specified, create the file path and write stack outputs to it once.
|
|
349
|
+
// Outputs are written after all stacks have been deployed. If a stack deployment fails,
|
|
350
|
+
// all of the outputs from successfully deployed stacks before the failure will still be written.
|
|
351
|
+
if (outputsFile) {
|
|
352
|
+
fs.ensureFileSync(outputsFile);
|
|
353
|
+
await fs.writeJson(outputsFile, stackOutputs, {
|
|
354
|
+
spaces: 2,
|
|
355
|
+
encoding: 'utf8',
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
const duration = synthDuration.asMs + (deployDuration?.asMs ?? 0);
|
|
360
|
+
await ioHost.notify((0, private_5.info)(`\n✨ Total time: ${(0, aws_cdk_1.formatTime)(duration)}s\n`, 'CDK_TOOLKIT_I5001', { duration }));
|
|
361
|
+
};
|
|
362
|
+
const assetBuildTime = options.assetBuildTime ?? deploy_1.AssetBuildTime.ALL_BEFORE_DEPLOY;
|
|
363
|
+
const prebuildAssets = assetBuildTime === deploy_1.AssetBuildTime.ALL_BEFORE_DEPLOY;
|
|
364
|
+
const concurrency = options.concurrency || 1;
|
|
365
|
+
const progress = concurrency > 1 ? aws_cdk_1.StackActivityProgress.EVENTS : options.progress;
|
|
366
|
+
if (concurrency > 1 && options.progress && options.progress != aws_cdk_1.StackActivityProgress.EVENTS) {
|
|
367
|
+
await ioHost.notify((0, private_5.warn)('⚠️ The --concurrency flag only supports --progress "events". Switching to "events".'));
|
|
368
|
+
}
|
|
369
|
+
const stacksAndTheirAssetManifests = stacks.flatMap((stack) => [
|
|
370
|
+
stack,
|
|
371
|
+
...stack.dependencies.filter(cxapi.AssetManifestArtifact.isAssetManifestArtifact),
|
|
372
|
+
]);
|
|
373
|
+
const workGraph = new aws_cdk_1.WorkGraphBuilder({ ioHost, action }, prebuildAssets).build(stacksAndTheirAssetManifests);
|
|
374
|
+
// Unless we are running with '--force', skip already published assets
|
|
375
|
+
if (!options.force) {
|
|
376
|
+
await (0, private_1.removePublishedAssets)(workGraph, deployments, options);
|
|
377
|
+
}
|
|
378
|
+
const graphConcurrency = {
|
|
379
|
+
'stack': concurrency,
|
|
380
|
+
'asset-build': 1, // This will be CPU-bound/memory bound, mostly matters for Docker builds
|
|
381
|
+
'asset-publish': (options.assetParallelism ?? true) ? 8 : 1, // This will be I/O-bound, 8 in parallel seems reasonable
|
|
382
|
+
};
|
|
383
|
+
await workGraph.doParallel(graphConcurrency, {
|
|
384
|
+
deployStack,
|
|
385
|
+
buildAsset,
|
|
386
|
+
publishAsset,
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Watch Action
|
|
391
|
+
*
|
|
392
|
+
* Continuously observe project files and deploy the selected stacks automatically when changes are detected.
|
|
393
|
+
* Implies hotswap deployments.
|
|
394
|
+
*/
|
|
395
|
+
async watch(cx, options) {
|
|
396
|
+
const assembly = await this.assemblyFromSource(cx, false);
|
|
397
|
+
const ioHost = (0, private_5.withAction)(this.ioHost, 'watch');
|
|
398
|
+
const rootDir = options.watchDir ?? process.cwd();
|
|
399
|
+
await ioHost.notify((0, private_5.debug)(`root directory used for 'watch' is: ${rootDir}`));
|
|
400
|
+
if (options.include === undefined && options.exclude === undefined) {
|
|
401
|
+
throw new errors_1.ToolkitError("Cannot use the 'watch' command without specifying at least one directory to monitor. " +
|
|
402
|
+
'Make sure to add a "watch" key to your cdk.json');
|
|
403
|
+
}
|
|
404
|
+
// For the "include" subkey under the "watch" key, the behavior is:
|
|
405
|
+
// 1. No "watch" setting? We error out.
|
|
406
|
+
// 2. "watch" setting without an "include" key? We default to observing "./**".
|
|
407
|
+
// 3. "watch" setting with an empty "include" key? We default to observing "./**".
|
|
408
|
+
// 4. Non-empty "include" key? Just use the "include" key.
|
|
409
|
+
const watchIncludes = (0, private_3.patternsArrayForWatch)(options.include, {
|
|
410
|
+
rootDir,
|
|
411
|
+
returnRootDirIfEmpty: true,
|
|
412
|
+
});
|
|
413
|
+
await ioHost.notify((0, private_5.debug)(`'include' patterns for 'watch': ${JSON.stringify(watchIncludes)}`));
|
|
414
|
+
// For the "exclude" subkey under the "watch" key,
|
|
415
|
+
// the behavior is to add some default excludes in addition to the ones specified by the user:
|
|
416
|
+
// 1. The CDK output directory.
|
|
417
|
+
// 2. Any file whose name starts with a dot.
|
|
418
|
+
// 3. Any directory's content whose name starts with a dot.
|
|
419
|
+
// 4. Any node_modules and its content (even if it's not a JS/TS project, you might be using a local aws-cli package)
|
|
420
|
+
const outdir = options.outdir ?? 'cdk.out';
|
|
421
|
+
const watchExcludes = (0, private_3.patternsArrayForWatch)(options.exclude, {
|
|
422
|
+
rootDir,
|
|
423
|
+
returnRootDirIfEmpty: false,
|
|
424
|
+
}).concat(`${outdir}/**`, '**/.*', '**/.*/**', '**/node_modules/**');
|
|
425
|
+
await ioHost.notify((0, private_5.debug)(`'exclude' patterns for 'watch': ${JSON.stringify(watchExcludes)}`));
|
|
426
|
+
// Since 'cdk deploy' is a relatively slow operation for a 'watch' process,
|
|
427
|
+
// introduce a concurrency latch that tracks the state.
|
|
428
|
+
// This way, if file change events arrive when a 'cdk deploy' is still executing,
|
|
429
|
+
// we will batch them, and trigger another 'cdk deploy' after the current one finishes,
|
|
430
|
+
// making sure 'cdk deploy's always execute one at a time.
|
|
431
|
+
// Here's a diagram showing the state transitions:
|
|
432
|
+
// -------------- -------- file changed -------------- file changed -------------- file changed
|
|
433
|
+
// | | ready event | | ------------------> | | ------------------> | | --------------|
|
|
434
|
+
// | pre-ready | -------------> | open | | deploying | | queued | |
|
|
435
|
+
// | | | | <------------------ | | <------------------ | | <-------------|
|
|
436
|
+
// -------------- -------- 'cdk deploy' done -------------- 'cdk deploy' done --------------
|
|
437
|
+
let latch = 'pre-ready';
|
|
438
|
+
const cloudWatchLogMonitor = options.traceLogs ? new aws_cdk_1.CloudWatchLogEventMonitor() : undefined;
|
|
439
|
+
const deployAndWatch = async () => {
|
|
440
|
+
latch = 'deploying';
|
|
441
|
+
cloudWatchLogMonitor?.deactivate();
|
|
442
|
+
await this.invokeDeployFromWatch(assembly, options, cloudWatchLogMonitor);
|
|
443
|
+
// If latch is still 'deploying' after the 'await', that's fine,
|
|
444
|
+
// but if it's 'queued', that means we need to deploy again
|
|
445
|
+
while (latch === 'queued') {
|
|
446
|
+
// TypeScript doesn't realize latch can change between 'awaits',
|
|
447
|
+
// and thinks the above 'while' condition is always 'false' without the cast
|
|
448
|
+
latch = 'deploying';
|
|
449
|
+
await ioHost.notify((0, private_5.info)("Detected file changes during deployment. Invoking 'cdk deploy' again"));
|
|
450
|
+
await this.invokeDeployFromWatch(assembly, options, cloudWatchLogMonitor);
|
|
451
|
+
}
|
|
452
|
+
latch = 'open';
|
|
453
|
+
cloudWatchLogMonitor?.activate();
|
|
454
|
+
};
|
|
455
|
+
chokidar
|
|
456
|
+
.watch(watchIncludes, {
|
|
457
|
+
ignored: watchExcludes,
|
|
458
|
+
cwd: rootDir,
|
|
459
|
+
})
|
|
460
|
+
.on('ready', async () => {
|
|
461
|
+
latch = 'open';
|
|
462
|
+
await ioHost.notify((0, private_5.debug)("'watch' received the 'ready' event. From now on, all file changes will trigger a deployment"));
|
|
463
|
+
await ioHost.notify((0, private_5.info)("Triggering initial 'cdk deploy'"));
|
|
464
|
+
await deployAndWatch();
|
|
465
|
+
})
|
|
466
|
+
.on('all', async (event, filePath) => {
|
|
467
|
+
if (latch === 'pre-ready') {
|
|
468
|
+
await ioHost.notify((0, private_5.info)(`'watch' is observing ${event === 'addDir' ? 'directory' : 'the file'} '${filePath}' for changes`));
|
|
469
|
+
}
|
|
470
|
+
else if (latch === 'open') {
|
|
471
|
+
await ioHost.notify((0, private_5.info)(`Detected change to '${filePath}' (type: ${event}). Triggering 'cdk deploy'`));
|
|
472
|
+
await deployAndWatch();
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
// this means latch is either 'deploying' or 'queued'
|
|
476
|
+
latch = 'queued';
|
|
477
|
+
await ioHost.notify((0, private_5.info)(`Detected change to '${filePath}' (type: ${event}) while 'cdk deploy' is still running. Will queue for another deployment after this one finishes'`));
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Rollback Action
|
|
483
|
+
*
|
|
484
|
+
* Rolls back the selected stacks.
|
|
485
|
+
*/
|
|
486
|
+
async rollback(cx, options) {
|
|
487
|
+
const assembly = await this.assemblyFromSource(cx);
|
|
488
|
+
return this._rollback(assembly, 'rollback', options);
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Helper to allow rollback being called as part of the deploy or watch action.
|
|
492
|
+
*/
|
|
493
|
+
async _rollback(assembly, action, options) {
|
|
494
|
+
const ioHost = (0, private_5.withAction)(this.ioHost, action);
|
|
495
|
+
const synthTimer = private_5.Timer.start();
|
|
496
|
+
const stacks = assembly.selectStacksV2(options.stacks);
|
|
497
|
+
await this.validateStacksMetadata(stacks, ioHost);
|
|
498
|
+
await synthTimer.endAs(ioHost, 'synth');
|
|
499
|
+
if (stacks.stackCount === 0) {
|
|
500
|
+
await ioHost.notify((0, private_5.error)('No stacks selected', 'CDK_TOOLKIT_E6001'));
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
let anyRollbackable = false;
|
|
504
|
+
for (const stack of stacks.stackArtifacts) {
|
|
505
|
+
await ioHost.notify((0, private_5.info)(`Rolling back ${chalk.bold(stack.displayName)}`));
|
|
506
|
+
const rollbackTimer = private_5.Timer.start();
|
|
507
|
+
const deployments = await this.deploymentsForAction('rollback');
|
|
508
|
+
try {
|
|
509
|
+
const stackResult = await deployments.rollbackStack({
|
|
510
|
+
stack,
|
|
511
|
+
roleArn: options.roleArn,
|
|
512
|
+
toolkitStackName: this.toolkitStackName,
|
|
513
|
+
force: options.orphanFailedResources,
|
|
514
|
+
validateBootstrapStackVersion: options.validateBootstrapStackVersion,
|
|
515
|
+
orphanLogicalIds: options.orphanLogicalIds,
|
|
516
|
+
});
|
|
517
|
+
if (!stackResult.notInRollbackableState) {
|
|
518
|
+
anyRollbackable = true;
|
|
519
|
+
}
|
|
520
|
+
await rollbackTimer.endAs(ioHost, 'rollback');
|
|
521
|
+
}
|
|
522
|
+
catch (e) {
|
|
523
|
+
await ioHost.notify((0, private_5.error)(`\n ❌ ${chalk.bold(stack.displayName)} failed: ${(0, aws_cdk_1.formatErrorMessage)(e)}`, 'CDK_TOOLKIT_E6900'));
|
|
524
|
+
throw new errors_1.ToolkitError('Rollback failed (use --force to orphan failing resources)');
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
if (!anyRollbackable) {
|
|
528
|
+
throw new errors_1.ToolkitError('No stacks were in a state that could be rolled back');
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Destroy Action
|
|
533
|
+
*
|
|
534
|
+
* Destroys the selected Stacks.
|
|
535
|
+
*/
|
|
536
|
+
async destroy(cx, options) {
|
|
537
|
+
const assembly = await this.assemblyFromSource(cx);
|
|
538
|
+
return this._destroy(assembly, 'destroy', options);
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* Helper to allow destroy being called as part of the deploy action.
|
|
542
|
+
*/
|
|
543
|
+
async _destroy(assembly, action, options) {
|
|
544
|
+
const ioHost = (0, private_5.withAction)(this.ioHost, action);
|
|
545
|
+
const synthTimer = private_5.Timer.start();
|
|
546
|
+
// The stacks will have been ordered for deployment, so reverse them for deletion.
|
|
547
|
+
const stacks = await assembly.selectStacksV2(options.stacks).reversed();
|
|
548
|
+
await synthTimer.endAs(ioHost, 'synth');
|
|
549
|
+
const motivation = 'Destroying stacks is an irreversible action';
|
|
550
|
+
const question = `Are you sure you want to delete: ${chalk.red(stacks.hierarchicalIds.join(', '))}`;
|
|
551
|
+
const confirmed = await ioHost.requestResponse((0, private_5.confirm)('CDK_TOOLKIT_I7010', question, motivation, true));
|
|
552
|
+
if (!confirmed) {
|
|
553
|
+
return ioHost.notify((0, private_5.error)('Aborted by user', 'CDK_TOOLKIT_E7010'));
|
|
554
|
+
}
|
|
555
|
+
const destroyTimer = private_5.Timer.start();
|
|
556
|
+
try {
|
|
557
|
+
for (const [index, stack] of stacks.stackArtifacts.entries()) {
|
|
558
|
+
await ioHost.notify((0, private_5.success)(`${chalk.blue(stack.displayName)}: destroying... [${index + 1}/${stacks.stackCount}]`));
|
|
559
|
+
try {
|
|
560
|
+
const deployments = await this.deploymentsForAction(action);
|
|
561
|
+
await deployments.destroyStack({
|
|
562
|
+
stack,
|
|
563
|
+
deployName: stack.stackName,
|
|
564
|
+
roleArn: options.roleArn,
|
|
565
|
+
ci: options.ci,
|
|
566
|
+
});
|
|
567
|
+
await ioHost.notify((0, private_5.success)(`\n ✅ ${chalk.blue(stack.displayName)}: ${action}ed`));
|
|
568
|
+
}
|
|
569
|
+
catch (e) {
|
|
570
|
+
await ioHost.notify((0, private_5.error)(`\n ❌ ${chalk.blue(stack.displayName)}: ${action} failed ${e}`, 'CDK_TOOLKIT_E7900'));
|
|
571
|
+
throw e;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
finally {
|
|
576
|
+
await destroyTimer.endAs(ioHost, 'destroy');
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Validate the stacks for errors and warnings according to the CLI's current settings
|
|
581
|
+
*/
|
|
582
|
+
async validateStacksMetadata(stacks, ioHost) {
|
|
583
|
+
// @TODO define these somewhere central
|
|
584
|
+
const code = (level) => {
|
|
585
|
+
switch (level) {
|
|
586
|
+
case 'error': return 'CDK_ASSEMBLY_E9999';
|
|
587
|
+
case 'warn': return 'CDK_ASSEMBLY_W9999';
|
|
588
|
+
default: return 'CDK_ASSEMBLY_I9999';
|
|
589
|
+
}
|
|
590
|
+
};
|
|
591
|
+
await stacks.validateMetadata(this.props.assemblyFailureAt, async (level, msg) => ioHost.notify({
|
|
592
|
+
time: new Date(),
|
|
593
|
+
level,
|
|
594
|
+
code: code(level),
|
|
595
|
+
message: `[${level} at ${msg.id}] ${msg.entry.data}`,
|
|
596
|
+
data: msg,
|
|
597
|
+
}));
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Creates a Toolkit internal CloudAssembly from a CloudAssemblySource.
|
|
601
|
+
* @param assemblySource the source for the cloud assembly
|
|
602
|
+
* @param cache if the assembly should be cached, default: `true`
|
|
603
|
+
* @returns the CloudAssembly object
|
|
604
|
+
*/
|
|
605
|
+
async assemblyFromSource(assemblySource, cache = true) {
|
|
606
|
+
if (assemblySource instanceof private_4.StackAssembly) {
|
|
607
|
+
return assemblySource;
|
|
608
|
+
}
|
|
609
|
+
if (cache) {
|
|
610
|
+
return new private_4.StackAssembly(await new private_4.CachedCloudAssemblySource(assemblySource).produce());
|
|
611
|
+
}
|
|
612
|
+
return new private_4.StackAssembly(await assemblySource.produce());
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* Create a deployments class
|
|
616
|
+
*/
|
|
617
|
+
async deploymentsForAction(action) {
|
|
618
|
+
return new aws_cdk_1.Deployments({
|
|
619
|
+
sdkProvider: await this.sdkProvider(action),
|
|
620
|
+
toolkitStackName: this.toolkitStackName,
|
|
621
|
+
ioHost: this.ioHost, // @todo temporary while we have to separate IIoHost interfaces
|
|
622
|
+
action,
|
|
623
|
+
});
|
|
624
|
+
}
|
|
625
|
+
async invokeDeployFromWatch(assembly, options, cloudWatchLogMonitor) {
|
|
626
|
+
// watch defaults hotswap to enabled
|
|
627
|
+
const hotswap = options.hotswap ?? aws_cdk_1.HotswapMode.HOTSWAP_ONLY;
|
|
628
|
+
const deployOptions = {
|
|
629
|
+
...options,
|
|
630
|
+
requireApproval: deploy_1.RequireApproval.NEVER,
|
|
631
|
+
cloudWatchLogMonitor,
|
|
632
|
+
hotswap,
|
|
633
|
+
extraUserAgent: `cdk-watch/hotswap-${hotswap === aws_cdk_1.HotswapMode.FULL_DEPLOYMENT ? 'off' : 'on'}`,
|
|
634
|
+
};
|
|
635
|
+
try {
|
|
636
|
+
await this._deploy(assembly, 'watch', deployOptions);
|
|
637
|
+
}
|
|
638
|
+
catch {
|
|
639
|
+
// just continue - deploy will show the error
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
exports.Toolkit = Toolkit;
|
|
644
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvb2xraXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0NBQWtDO0FBQ2xDLHlDQUF5QztBQUN6QywrQkFBK0I7QUFDL0IscUNBQXFDO0FBQ3JDLCtCQUErQjtBQUUvQiw4Q0FBd0Y7QUFDeEYsdURBQWlKO0FBRWpKLHFEQUErRDtBQUsvRCxzREFBaUU7QUFFakUsNENBQTJiO0FBQzNiLDBEQUFxRjtBQUNyRiwyREFBOEo7QUFDOUosMENBQTZDO0FBRTdDLCtDQUE4TDtBQWlFOUw7O0dBRUc7QUFDSCxNQUFhLE9BQVEsU0FBUSxvQ0FBMEI7SUFZakI7SUFYcEM7O09BRUc7SUFDYSxnQkFBZ0IsQ0FBUztJQUV6Qzs7T0FFRztJQUNhLE1BQU0sQ0FBVTtJQUN4QixZQUFZLENBQWU7SUFFbkMsWUFBb0MsUUFBd0IsRUFBRTtRQUM1RCxLQUFLLEVBQUUsQ0FBQztRQUQwQixVQUFLLEdBQUwsS0FBSyxDQUFxQjtRQUU1RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixJQUFJLG9DQUEwQixDQUFDO1FBRTdFLG9GQUFvRjtRQUNwRixNQUFNLFlBQVksR0FBRyxtQkFBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFDLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLFlBQVksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQWEsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxJQUFJLE1BQU0sR0FBRyxZQUF1QixDQUFDO1FBQ3JDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMzQixNQUFNLEdBQUcsSUFBQSx1QkFBYSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDMUIsTUFBTSxHQUFHLElBQUEsc0JBQVksRUFB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QUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7U0FDOUYsQ0FBQztRQUVGLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCw2Q0FBNkM7UUFDL0MsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTFzQkQsMEJBMHNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tICdjaG9raWRhcic7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBUb29sa2l0U2VydmljZXMgfSBmcm9tICcuL3ByaXZhdGUnO1xuaW1wb3J0IHsgQXNzZXRCdWlsZFRpbWUsIHR5cGUgRGVwbG95T3B0aW9ucywgUmVxdWlyZUFwcHJvdmFsIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBsb3knO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZERlcGxveU9wdGlvbnMsIGJ1aWxkUGFyYW1ldGVyTWFwLCBjcmVhdGVIb3Rzd2FwUHJvcGVydHlPdmVycmlkZXMsIHJlbW92ZVB1Ymxpc2hlZEFzc2V0cyB9IGZyb20gJy4uL2FjdGlvbnMvZGVwbG95L3ByaXZhdGUnO1xuaW1wb3J0IHsgdHlwZSBEZXN0cm95T3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvZGVzdHJveSc7XG5pbXBvcnQgeyBkaWZmUmVxdWlyZXNBcHByb3ZhbCB9IGZyb20gJy4uL2FjdGlvbnMvZGlmZi9wcml2YXRlJztcbmltcG9ydCB7IHR5cGUgTGlzdE9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL2xpc3QnO1xuaW1wb3J0IHsgdHlwZSBSb2xsYmFja09wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL3JvbGxiYWNrJztcbmltcG9ydCB7IHR5cGUgU3ludGhPcHRpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9zeW50aCc7XG5pbXBvcnQgeyBXYXRjaE9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL3dhdGNoJztcbmltcG9ydCB7IHBhdHRlcm5zQXJyYXlGb3JXYXRjaCB9IGZyb20gJy4uL2FjdGlvbnMvd2F0Y2gvcHJpdmF0ZSc7XG5pbXBvcnQgeyB0eXBlIFNka0NvbmZpZyB9IGZyb20gJy4uL2FwaS9hd3MtYXV0aCc7XG5pbXBvcnQgeyBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRSwgU2RrUHJvdmlkZXIsIFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdCwgU3RhY2tDb2xsZWN0aW9uLCBEZXBsb3ltZW50cywgSG90c3dhcE1vZGUsIFN0YWNrQWN0aXZpdHlQcm9ncmVzcywgUmVzb3VyY2VNaWdyYXRvciwgb2JzY3VyZVRlbXBsYXRlLCBzZXJpYWxpemVTdHJ1Y3R1cmUsIHRhZ3NGb3JTdGFjaywgQ2xpSW9Ib3N0LCB2YWxpZGF0ZVNuc1RvcGljQXJuLCBDb25jdXJyZW5jeSwgV29ya0dyYXBoQnVpbGRlciwgQXNzZXRCdWlsZE5vZGUsIEFzc2V0UHVibGlzaE5vZGUsIFN0YWNrTm9kZSwgZm9ybWF0RXJyb3JNZXNzYWdlLCBDbG91ZFdhdGNoTG9nRXZlbnRNb25pdG9yLCBmaW5kQ2xvdWRXYXRjaExvZ0dyb3VwcywgZm9ybWF0VGltZSwgU3RhY2tEZXRhaWxzIH0gZnJvbSAnLi4vYXBpL2F3cy1jZGsnO1xuaW1wb3J0IHsgSUNsb3VkQXNzZW1ibHlTb3VyY2UsIFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICcuLi9hcGkvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHsgQUxMX1NUQUNLUywgQ2FjaGVkQ2xvdWRBc3NlbWJseVNvdXJjZSwgQ2xvdWRBc3NlbWJseVNvdXJjZUJ1aWxkZXIsIElkZW50aXR5Q2xvdWRBc3NlbWJseVNvdXJjZSwgU3RhY2tBc3NlbWJseSB9IGZyb20gJy4uL2FwaS9jbG91ZC1hc3NlbWJseS9wcml2YXRlJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uL2FwaS9lcnJvcnMnO1xuaW1wb3J0IHsgSUlvSG9zdCwgSW9NZXNzYWdlQ29kZSwgSW9NZXNzYWdlTGV2ZWwgfSBmcm9tICcuLi9hcGkvaW8nO1xuaW1wb3J0IHsgYXNTZGtMb2dnZXIsIHdpdGhBY3Rpb24sIFRpbWVyLCBjb25maXJtLCBlcnJvciwgaW5mbywgc3VjY2Vzcywgd2FybiwgQWN0aW9uQXdhcmVJb0hvc3QsIGRlYnVnLCByZXN1bHQsIHdpdGhvdXRFbW9qaXMsIHdpdGhvdXRDb2xvciwgd2l0aFRyaW1tZWRXaGl0ZXNwYWNlIH0gZnJvbSAnLi4vYXBpL2lvL3ByaXZhdGUnO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGFjdGlvbiBiZWluZyBwZXJmb3JtZWQgYnkgdGhlIENMSS4gJ25vbmUnIHJlcHJlc2VudHMgdGhlIGFic2VuY2Ugb2YgYW4gYWN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBUb29sa2l0QWN0aW9uID1cbnwgJ2Fzc2VtYmx5J1xufCAnYm9vdHN0cmFwJ1xufCAnc3ludGgnXG58ICdsaXN0J1xufCAnZGlmZidcbnwgJ2RlcGxveSdcbnwgJ3JvbGxiYWNrJ1xufCAnd2F0Y2gnXG58ICdkZXN0cm95J1xufCAnZG9jdG9yJ1xufCAnZ2MnXG58ICdpbXBvcnQnXG58ICdtZXRhZGF0YSdcbnwgJ2luaXQnXG58ICdtaWdyYXRlJztcblxuZXhwb3J0IGludGVyZmFjZSBUb29sa2l0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgSW9Ib3N0IGltcGxlbWVudGF0aW9uLCBoYW5kbGluZyB0aGUgaW5saW5lIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBUb29sa2l0IGFuZCBhbiBpbnRlZ3JhdGlvbi5cbiAgICovXG4gIGlvSG9zdD86IElJb0hvc3Q7XG5cbiAgLyoqXG4gICAqIEFsbG93IGVtb2ppcyBpbiBtZXNzYWdlcyBzZW50IHRvIHRoZSBJb0hvc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVtb2ppcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgQU5TSSBjb2xvcnMgYW5kIGZvcm1hdHRpbmcgaW4gSW9Ib3N0IG1lc3NhZ2VzLlxuICAgKiBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gYGZhbHNlYCBlbmZvcmNlcyB0aGF0IG5vIGNvbG9yIG9yIHN0eWxlIHNob3dzIHVwXG4gICAqIGluIG1lc3NhZ2VzIHNlbnQgdG8gdGhlIElvSG9zdC5cbiAgICogU2V0dGluZyB0aGlzIHZhbHVlIHRvIHRydWUgaXMgYSBuby1vcDsgaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGVmYXVsdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZXRlY3RzIGNvbG9yIGZyb20gdGhlIFRUWSBzdGF0dXMgb2YgdGhlIElvSG9zdFxuICAgKi9cbiAgY29sb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBTREsuXG4gICAqL1xuICBzZGtDb25maWc/OiBTZGtDb25maWc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHRvb2xraXQgc3RhY2sgdG8gYmUgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJDREtUb29sa2l0XCJcbiAgICovXG4gIHRvb2xraXRTdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZhaWwgQ2xvdWQgQXNzZW1ibGllc1xuICAgKlxuICAgKiBAZGVmYXVsdCBcImVycm9yXCJcbiAgICovXG4gIGFzc2VtYmx5RmFpbHVyZUF0PzogJ2Vycm9yJyB8ICd3YXJuJyB8ICdub25lJztcbn1cblxuLyoqXG4gKiBUaGUgQVdTIENESyBQcm9ncmFtbWF0aWMgVG9vbGtpdFxuICovXG5leHBvcnQgY2xhc3MgVG9vbGtpdCBleHRlbmRzIENsb3VkQXNzZW1ibHlTb3VyY2VCdWlsZGVyIGltcGxlbWVudHMgQXN5bmNEaXNwb3NhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSB0b29sa2l0IHN0YWNrIG5hbWUgdXNlZCBmb3IgYm9vdHN0cmFwcGluZyByZXNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdG9vbGtpdFN0YWNrTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSW9Ib3N0IG9mIHRoaXMgVG9vbGtpdFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlvSG9zdDogSUlvSG9zdDtcbiAgcHJpdmF0ZSBfc2RrUHJvdmlkZXI/OiBTZGtQcm92aWRlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogVG9vbGtpdE9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy50b29sa2l0U3RhY2tOYW1lID0gcHJvcHMudG9vbGtpdFN0YWNrTmFtZSA/PyBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRTtcblxuICAgIC8vIEhhY2t5IHdheSB0byByZS11c2UgdGhlIGdsb2JhbCBJb0hvc3QgdW50aWwgd2UgaGF2ZSBmdWxseSByZW1vdmVkIHRoZSBuZWVkIGZvciBpdFxuICAgIGNvbnN0IGdsb2JhbElvSG9zdCA9IENsaUlvSG9zdC5pbnN0YW5jZSgpO1xuICAgIGlmIChwcm9wcy5pb0hvc3QpIHtcbiAgICAgIGdsb2JhbElvSG9zdC5yZWdpc3RlcklvSG9zdChwcm9wcy5pb0hvc3QgYXMgYW55KTtcbiAgICB9XG4gICAgbGV0IGlvSG9zdCA9IGdsb2JhbElvSG9zdCBhcyBJSW9Ib3N0O1xuICAgIGlmIChwcm9wcy5lbW9qaXMgPT09IGZhbHNlKSB7XG4gICAgICBpb0hvc3QgPSB3aXRob3V0RW1vamlzKGlvSG9zdCk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5jb2xvciA9PT0gZmFsc2UpIHtcbiAgICAgIGlvSG9zdCA9IHdpdGhvdXRDb2xvcihpb0hvc3QpO1xuICAgIH1cbiAgICAvLyBBZnRlciByZW1vdmluZyBlbW9qaXMgYW5kIGNvbG9yLCB3ZSBtaWdodCBlbmQgdXAgd2l0aCBmbG9hdGluZyB3aGl0ZXNwYWNlIGF0IGVpdGhlciBlbmQgb2YgdGhlIG1lc3NhZ2VcbiAgICAvLyBUaGlzIGFsc28gcmVtb3ZlcyBuZXdsaW5lcyB0aGF0IHdlIGN1cnJlbnRseSBlbWl0IGZvciBDTEkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgdGhpcy5pb0hvc3QgPSB3aXRoVHJpbW1lZFdoaXRlc3BhY2UoaW9Ib3N0KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIG5vdGhpbmcgdG8gZG8geWV0XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VzcyB0byB0aGUgQVdTIFNES1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZGtQcm92aWRlcihhY3Rpb246IFRvb2xraXRBY3Rpb24pOiBQcm9taXNlPFNka1Byb3ZpZGVyPiB7XG4gICAgLy8gQHRvZG8gdGhpcyBuZWVkcyB0byBiZSBkaWZmZXJlbnQgaW5zdGFuY2UgcGVyIGFjdGlvblxuICAgIGlmICghdGhpcy5fc2RrUHJvdmlkZXIpIHtcbiAgICAgIHRoaXMuX3Nka1Byb3ZpZGVyID0gYXdhaXQgU2RrUHJvdmlkZXIud2l0aEF3c0NsaUNvbXBhdGlibGVEZWZhdWx0cyh7XG4gICAgICAgIC4uLnRoaXMucHJvcHMuc2RrQ29uZmlnLFxuICAgICAgICBsb2dnZXI6IGFzU2RrTG9nZ2VyKHRoaXMuaW9Ib3N0LCBhY3Rpb24pLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3Nka1Byb3ZpZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBwcm92aWRlIHRoZSBDbG91ZEFzc2VtYmx5U291cmNlQnVpbGRlciB3aXRoIHJlcXVpcmVkIHRvb2xraXQgc2VydmljZXNcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzb3VyY2VCdWlsZGVyU2VydmljZXMoKTogUHJvbWlzZTxUb29sa2l0U2VydmljZXM+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaW9Ib3N0OiB3aXRoQWN0aW9uKHRoaXMuaW9Ib3N0LCAnYXNzZW1ibHknKSxcbiAgICAgIHNka1Byb3ZpZGVyOiBhd2FpdCB0aGlzLnNka1Byb3ZpZGVyKCdhc3NlbWJseScpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3ludGggQWN0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3ludGgoY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBTeW50aE9wdGlvbnMgPSB7fSk6IFByb21pc2U8SUNsb3VkQXNzZW1ibHlTb3VyY2U+IHtcbiAgICBjb25zdCBpb0hvc3QgPSB3aXRoQWN0aW9uKHRoaXMuaW9Ib3N0LCAnc3ludGgnKTtcbiAgICBjb25zdCBzeW50aFRpbWVyID0gVGltZXIuc3RhcnQoKTtcbiAgICBjb25zdCBhc3NlbWJseSA9IGF3YWl0IHRoaXMuYXNzZW1ibHlGcm9tU291cmNlKGN4KTtcbiAgICBjb25zdCBzdGFja3MgPSBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihvcHRpb25zLnN0YWNrcyA/PyBBTExfU1RBQ0tTKTtcbiAgICBjb25zdCBhdXRvVmFsaWRhdGVTdGFja3MgPSBvcHRpb25zLnZhbGlkYXRlU3RhY2tzID8gW2Fzc2VtYmx5LnNlbGVjdFN0YWNrc0ZvclZhbGlkYXRpb24oKV0gOiBbXTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlU3RhY2tzTWV0YWRhdGEoc3RhY2tzLmNvbmNhdCguLi5hdXRvVmFsaWRhdGVTdGFja3MpLCBpb0hvc3QpO1xuICAgIGF3YWl0IHN5bnRoVGltZXIuZW5kQXMoaW9Ib3N0LCAnc3ludGgnKTtcblxuICAgIC8vIGlmIHdlIGhhdmUgYSBzaW5nbGUgc3RhY2ssIHByaW50IGl0IHRvIFNURE9VVFxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgU3VjY2Vzc2Z1bGx5IHN5bnRoZXNpemVkIHRvICR7Y2hhbGsuYmx1ZShwYXRoLnJlc29sdmUoc3RhY2tzLmFzc2VtYmx5LmRpcmVjdG9yeSkpfWA7XG4gICAgY29uc3QgYXNzZW1ibHlEYXRhID0ge1xuICAgICAgYXNzZW1ibHlEaXJlY3Rvcnk6IHN0YWNrcy5hc3NlbWJseS5kaXJlY3RvcnksXG4gICAgICBzdGFja3NDb3VudDogc3RhY2tzLnN0YWNrQ291bnQsXG4gICAgICBzdGFja0lkczogc3RhY2tzLmhpZXJhcmNoaWNhbElkcyxcbiAgICB9O1xuXG4gICAgaWYgKHN0YWNrcy5zdGFja0NvdW50ID09PSAxKSB7XG4gICAgICBjb25zdCBmaXJzdFN0YWNrID0gc3RhY2tzLmZpcnN0U3RhY2shO1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBmaXJzdFN0YWNrLnRlbXBsYXRlO1xuICAgICAgY29uc3Qgb2JzY3VyZWRUZW1wbGF0ZSA9IG9ic2N1cmVUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHJlc3VsdChtZXNzYWdlLCAnQ0RLX1RPT0xLSVRfSTE5MDEnLCB7XG4gICAgICAgIC4uLmFzc2VtYmx5RGF0YSxcbiAgICAgICAgc3RhY2s6IHtcbiAgICAgICAgICBzdGFja05hbWU6IGZpcnN0U3RhY2suc3RhY2tOYW1lLFxuICAgICAgICAgIGhpZXJhcmNoaWNhbElkOiBmaXJzdFN0YWNrLmhpZXJhcmNoaWNhbElkLFxuICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgIHN0cmluZ2lmaWVkSnNvbjogc2VyaWFsaXplU3RydWN0dXJlKG9ic2N1cmVkVGVtcGxhdGUsIHRydWUpLFxuICAgICAgICAgIHN0cmluZ2lmaWVkWWFtbDogc2VyaWFsaXplU3RydWN0dXJlKG9ic2N1cmVkVGVtcGxhdGUsIGZhbHNlKSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm90IG91dHB1dHRpbmcgdGVtcGxhdGUgdG8gc3Rkb3V0LCBsZXQncyBleHBsYWluIHRoaW5ncyB0byB0aGUgdXNlciBhIGxpdHRsZSBiaXQuLi5cbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkocmVzdWx0KGNoYWxrLmdyZWVuKG1lc3NhZ2UpLCAnQ0RLX1RPT0xLSVRfSTE5MDInLCBhc3NlbWJseURhdGEpKTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoaW5mbyhgU3VwcGx5IGEgc3RhY2sgaWQgKCR7c3RhY2tzLnN0YWNrQXJ0aWZhY3RzLm1hcCgocykgPT4gY2hhbGsuZ3JlZW4ocy5oaWVyYXJjaGljYWxJZCkpLmpvaW4oJywgJyl9KSB0byBkaXNwbGF5IGl0cyB0ZW1wbGF0ZS5gKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eUNsb3VkQXNzZW1ibHlTb3VyY2UoYXNzZW1ibHkuYXNzZW1ibHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgQWN0aW9uXG4gICAqXG4gICAqIExpc3Qgc2VsZWN0ZWQgc3RhY2tzIGFuZCB0aGVpciBkZXBlbmRlbmNpZXNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsaXN0KGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogTGlzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8U3RhY2tEZXRhaWxzW10+IHtcbiAgICBjb25zdCBpb0hvc3QgPSB3aXRoQWN0aW9uKHRoaXMuaW9Ib3N0LCAnbGlzdCcpO1xuICAgIGNvbnN0IHN5bnRoVGltZXIgPSBUaW1lci5zdGFydCgpO1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gYXdhaXQgdGhpcy5hc3NlbWJseUZyb21Tb3VyY2UoY3gpO1xuICAgIGNvbnN0IHN0YWNrQ29sbGVjdGlvbiA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKG9wdGlvbnMuc3RhY2tzID8/IEFMTF9TVEFDS1MpO1xuICAgIGF3YWl0IHN5bnRoVGltZXIuZW5kQXMoaW9Ib3N0LCAnc3ludGgnKTtcblxuICAgIGNvbnN0IHN0YWNrcyA9IHN0YWNrQ29sbGVjdGlvbi53aXRoRGVwZW5kZW5jaWVzKCk7XG4gICAgY29uc3QgbWVzc2FnZSA9IHN0YWNrcy5tYXAocyA9PiBzLmlkKS5qb2luKCdcXG4nKTtcblxuICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkocmVzdWx0KG1lc3NhZ2UsICdDREtfVE9PTEtJVF9JMjkwMScsIHsgc3RhY2tzIH0pKTtcbiAgICByZXR1cm4gc3RhY2tzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcGxveSBBY3Rpb25cbiAgICpcbiAgICogRGVwbG95cyB0aGUgc2VsZWN0ZWQgc3RhY2tzIGludG8gYW4gQVdTIGFjY291bnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXBsb3koY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBEZXBsb3lPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhc3NlbWJseSA9IGF3YWl0IHRoaXMuYXNzZW1ibHlGcm9tU291cmNlKGN4KTtcbiAgICByZXR1cm4gdGhpcy5fZGVwbG95KGFzc2VtYmx5LCAnZGVwbG95Jywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIGFsbG93IGRlcGxveSBiZWluZyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgd2F0Y2ggYWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZGVwbG95KGFzc2VtYmx5OiBTdGFja0Fzc2VtYmx5LCBhY3Rpb246ICdkZXBsb3knIHwgJ3dhdGNoJywgb3B0aW9uczogRXh0ZW5kZWREZXBsb3lPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBpb0hvc3QgPSB3aXRoQWN0aW9uKHRoaXMuaW9Ib3N0LCBhY3Rpb24pO1xuICAgIGNvbnN0IHN5bnRoVGltZXIgPSBUaW1lci5zdGFydCgpO1xuICAgIGNvbnN0IHN0YWNrQ29sbGVjdGlvbiA9IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKG9wdGlvbnMuc3RhY2tzID8/IEFMTF9TVEFDS1MpO1xuICAgIGF3YWl0IHRoaXMudmFsaWRhdGVTdGFja3NNZXRhZGF0YShzdGFja0NvbGxlY3Rpb24sIGlvSG9zdCk7XG4gICAgY29uc3Qgc3ludGhEdXJhdGlvbiA9IGF3YWl0IHN5bnRoVGltZXIuZW5kQXMoaW9Ib3N0LCAnc3ludGgnKTtcblxuICAgIGlmIChzdGFja0NvbGxlY3Rpb24uc3RhY2tDb3VudCA9PT0gMCkge1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShlcnJvcignVGhpcyBhcHAgY29udGFpbnMgbm8gc3RhY2tzJywgJ0NES19UT09MS0lUX0U1MDAxJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbignZGVwbG95Jyk7XG4gICAgY29uc3QgbWlncmF0b3IgPSBuZXcgUmVzb3VyY2VNaWdyYXRvcih7IGRlcGxveW1lbnRzLCBpb0hvc3QsIGFjdGlvbiB9KTtcblxuICAgIGF3YWl0IG1pZ3JhdG9yLnRyeU1pZ3JhdGVSZXNvdXJjZXMoc3RhY2tDb2xsZWN0aW9uLCBvcHRpb25zKTtcblxuICAgIGNvbnN0IHJlcXVpcmVBcHByb3ZhbCA9IG9wdGlvbnMucmVxdWlyZUFwcHJvdmFsID8/IFJlcXVpcmVBcHByb3ZhbC5ORVZFUjtcblxuICAgIGNvbnN0IHBhcmFtZXRlck1hcCA9IGJ1aWxkUGFyYW1ldGVyTWFwKG9wdGlvbnMucGFyYW1ldGVycz8ucGFyYW1ldGVycyk7XG5cbiAgICBjb25zdCBob3Rzd2FwTW9kZSA9IG9wdGlvbnMuaG90c3dhcCA/PyBIb3Rzd2FwTW9kZS5GVUxMX0RFUExPWU1FTlQ7XG4gICAgaWYgKGhvdHN3YXBNb2RlICE9PSBIb3Rzd2FwTW9kZS5GVUxMX0RFUExPWU1FTlQpIHtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkod2FybihbXG4gICAgICAgICfimqDvuI8gVGhlIC0taG90c3dhcCBhbmQgLS1ob3Rzd2FwLWZhbGxiYWNrIGZsYWdzIGRlbGliZXJhdGVseSBpbnRyb2R1Y2UgQ2xvdWRGb3JtYXRpb24gZHJpZnQgdG8gc3BlZWQgdXAgZGVwbG95bWVudHMnLFxuICAgICAgICAn4pqg77iPIFRoZXkgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGV2ZWxvcG1lbnQgLSBuZXZlciB1c2UgdGhlbSBmb3IgeW91ciBwcm9kdWN0aW9uIFN0YWNrcyEnLFxuICAgICAgXS5qb2luKCdcXG4nKSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWNrcyA9IHN0YWNrQ29sbGVjdGlvbi5zdGFja0FydGlmYWN0cztcbiAgICBjb25zdCBzdGFja091dHB1dHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBjb25zdCBvdXRwdXRzRmlsZSA9IG9wdGlvbnMub3V0cHV0c0ZpbGU7XG5cbiAgICBjb25zdCBidWlsZEFzc2V0ID0gYXN5bmMgKGFzc2V0Tm9kZTogQXNzZXRCdWlsZE5vZGUpID0+IHtcbiAgICAgIGF3YWl0IGRlcGxveW1lbnRzLmJ1aWxkU2luZ2xlQXNzZXQoXG4gICAgICAgIGFzc2V0Tm9kZS5hc3NldE1hbmlmZXN0QXJ0aWZhY3QsXG4gICAgICAgIGFzc2V0Tm9kZS5hc3NldE1hbmlmZXN0LFxuICAgICAgICBhc3NldE5vZGUuYXNzZXQsXG4gICAgICAgIHtcbiAgICAgICAgICBzdGFjazogYXNzZXROb2RlLnBhcmVudFN0YWNrLFxuICAgICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgICBzdGFja05hbWU6IGFzc2V0Tm9kZS5wYXJlbnRTdGFjay5zdGFja05hbWUsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCBwdWJsaXNoQXNzZXQgPSBhc3luYyAoYXNzZXROb2RlOiBBc3NldFB1Ymxpc2hOb2RlKSA9PiB7XG4gICAgICBhd2FpdCBkZXBsb3ltZW50cy5wdWJsaXNoU2luZ2xlQXNzZXQoYXNzZXROb2RlLmFzc2V0TWFuaWZlc3QsIGFzc2V0Tm9kZS5hc3NldCwge1xuICAgICAgICBzdGFjazogYXNzZXROb2RlLnBhcmVudFN0YWNrLFxuICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgIHN0YWNrTmFtZTogYXNzZXROb2RlLnBhcmVudFN0YWNrLnN0YWNrTmFtZSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBkZXBsb3lTdGFjayA9IGFzeW5jIChzdGFja05vZGU6IFN0YWNrTm9kZSkgPT4ge1xuICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja05vZGUuc3RhY2s7XG4gICAgICBpZiAoc3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnQgIT09IDEpIHtcbiAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGNoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc3RhY2suZW52aXJvbm1lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgICBgU3RhY2sgJHtzdGFjay5kaXNwbGF5TmFtZX0gZG9lcyBub3QgZGVmaW5lIGFuIGVudmlyb25tZW50LCBhbmQgQVdTIGNyZWRlbnRpYWxzIGNvdWxkIG5vdCBiZSBvYnRhaW5lZCBmcm9tIHN0YW5kYXJkIGxvY2F0aW9ucyBvciBubyByZWdpb24gd2FzIGNvbmZpZ3VyZWQuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGdlbmVyYXRlZCBzdGFjayBoYXMgbm8gcmVzb3VyY2VzXG4gICAgICBpZiAoT2JqZWN0LmtleXMoc3RhY2sudGVtcGxhdGUuUmVzb3VyY2VzIHx8IHt9KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gc3RhY2sgaXMgZW1wdHkgYW5kIGRvZXNuJ3QgZXhpc3QgPT4gZG8gbm90aGluZ1xuICAgICAgICBjb25zdCBzdGFja0V4aXN0cyA9IGF3YWl0IGRlcGxveW1lbnRzLnN0YWNrRXhpc3RzKHsgc3RhY2sgfSk7XG4gICAgICAgIGlmICghc3RhY2tFeGlzdHMpIHtcbiAgICAgICAgICByZXR1cm4gaW9Ib3N0Lm5vdGlmeSh3YXJuKGAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfTogc3RhY2sgaGFzIG5vIHJlc291cmNlcywgc2tpcHBpbmcgZGVwbG95bWVudC5gKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdGFjayBpcyBlbXB0eSwgYnV0IGV4aXN0cyA9PiBkZWxldGVcbiAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh3YXJuKGAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfTogc3RhY2sgaGFzIG5vIHJlc291cmNlcywgZGVsZXRpbmcgZXhpc3Rpbmcgc3RhY2suYCkpO1xuICAgICAgICBhd2FpdCB0aGlzLl9kZXN0cm95KGFzc2VtYmx5LCAnZGVwbG95Jywge1xuICAgICAgICAgIHN0YWNrczogeyBwYXR0ZXJuczogW3N0YWNrLmhpZXJhcmNoaWNhbElkXSwgc3RyYXRlZ3k6IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuUEFUVEVSTl9NVVNUX01BVENIX1NJTkdMRSB9LFxuICAgICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgICBjaTogb3B0aW9ucy5jaSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVxdWlyZUFwcHJvdmFsICE9PSBSZXF1aXJlQXBwcm92YWwuTkVWRVIpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFRlbXBsYXRlID0gYXdhaXQgZGVwbG95bWVudHMucmVhZEN1cnJlbnRUZW1wbGF0ZShzdGFjayk7XG4gICAgICAgIGlmIChkaWZmUmVxdWlyZXNBcHByb3ZhbChjdXJyZW50VGVtcGxhdGUsIHN0YWNrLCByZXF1aXJlQXBwcm92YWwpKSB7XG4gICAgICAgICAgY29uc3QgbW90aXZhdGlvbiA9ICdcIi0tcmVxdWlyZS1hcHByb3ZhbFwiIGlzIGVuYWJsZWQgYW5kIHN0YWNrIGluY2x1ZGVzIHNlY3VyaXR5LXNlbnNpdGl2ZSB1cGRhdGVzLic7XG4gICAgICAgICAgY29uc3QgcXVlc3Rpb24gPSBgJHttb3RpdmF0aW9ufVxcbkRvIHlvdSB3aXNoIHRvIGRlcGxveSB0aGVzZSBjaGFuZ2VzYDtcbiAgICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKGNvbmZpcm0oJ0NES19UT09MS0lUX0k1MDYwJywgcXVlc3Rpb24sIG1vdGl2YXRpb24sIHRydWUsIGNvbmN1cnJlbmN5KSk7XG4gICAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0Fib3J0ZWQgYnkgdXNlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzYW1lIHNlbWFudGljcyB3ZSBhcHBseSB3aXRoIHJlc3BlY3QgdG8gTm90aWZpY2F0aW9uIEFSTnMgKGRpY3RhdGVkIGJ5IHRoZSBTREspXG4gICAgICAvL1xuICAgICAgLy8gIC0gdW5kZWZpbmVkICA9PiAgY2RrIGlnbm9yZXMgaXQsIGFzIGlmIGl0IHdhc24ndCBzdXBwb3J0ZWQgKGFsbG93cyBleHRlcm5hbCBtYW5hZ2VtZW50KS5cbiAgICAgIC8vICAtIFtdOiAgICAgICAgPT4gIGNkayBtYW5hZ2VzIGl0LCBhbmQgdGhlIHVzZXIgd2FudHMgdG8gd2lwZSBpdCBvdXQuXG4gICAgICAvLyAgLSBbJ2Fybi0xJ10gID0+ICBjZGsgbWFuYWdlcyBpdCwgYW5kIHRoZSB1c2VyIHdhbnRzIHRvIHNldCBpdCB0byBbJ2Fybi0xJ10uXG4gICAgICBjb25zdCBub3RpZmljYXRpb25Bcm5zID0gKCEhb3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zIHx8ICEhc3RhY2subm90aWZpY2F0aW9uQXJucylcbiAgICAgICAgPyAob3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zID8/IFtdKS5jb25jYXQoc3RhY2subm90aWZpY2F0aW9uQXJucyA/PyBbXSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uQXJuIG9mIG5vdGlmaWNhdGlvbkFybnMgPz8gW10pIHtcbiAgICAgICAgaWYgKCF2YWxpZGF0ZVNuc1RvcGljQXJuKG5vdGlmaWNhdGlvbkFybikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBOb3RpZmljYXRpb24gYXJuICR7bm90aWZpY2F0aW9uQXJufSBpcyBub3QgYSB2YWxpZCBhcm4gZm9yIGFuIFNOUyB0b3BpY2ApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YWNrSW5kZXggPSBzdGFja3MuaW5kZXhPZihzdGFjaykgKyAxO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShcbiAgICAgICAgaW5mbyhgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX06IGRlcGxveWluZy4uLiBbJHtzdGFja0luZGV4fS8ke3N0YWNrQ29sbGVjdGlvbi5zdGFja0NvdW50fV1gKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBkZXBsb3lUaW1lciA9IFRpbWVyLnN0YXJ0KCk7XG5cbiAgICAgIGxldCB0YWdzID0gb3B0aW9ucy50YWdzO1xuICAgICAgaWYgKCF0YWdzIHx8IHRhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRhZ3MgPSB0YWdzRm9yU3RhY2soc3RhY2spO1xuICAgICAgfVxuXG4gICAgICBsZXQgZGVwbG95RHVyYXRpb247XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgZGVwbG95UmVzdWx0OiBTdWNjZXNzZnVsRGVwbG95U3RhY2tSZXN1bHQgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IHJvbGxiYWNrID0gb3B0aW9ucy5yb2xsYmFjaztcbiAgICAgICAgbGV0IGl0ZXJhdGlvbiA9IDA7XG4gICAgICAgIHdoaWxlICghZGVwbG95UmVzdWx0KSB7XG4gICAgICAgICAgaWYgKCsraXRlcmF0aW9uID4gMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignVGhpcyBsb29wIHNob3VsZCBoYXZlIHN0YWJpbGl6ZWQgaW4gMiBpdGVyYXRpb25zLCBidXQgZGlkblxcJ3QuIElmIHlvdSBhcmUgc2VlaW5nIHRoaXMgZXJyb3IsIHBsZWFzZSByZXBvcnQgaXQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy9uZXcvY2hvb3NlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgciA9IGF3YWl0IGRlcGxveW1lbnRzLmRlcGxveVN0YWNrKHtcbiAgICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgICAgZGVwbG95TmFtZTogc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgICAgdG9vbGtpdFN0YWNrTmFtZTogdGhpcy50b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAgICAgcmV1c2VBc3NldHM6IG9wdGlvbnMucmV1c2VBc3NldHMsXG4gICAgICAgICAgICBub3RpZmljYXRpb25Bcm5zLFxuICAgICAgICAgICAgdGFncyxcbiAgICAgICAgICAgIGRlcGxveW1lbnRNZXRob2Q6IG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCxcbiAgICAgICAgICAgIGZvcmNlOiBvcHRpb25zLmZvcmNlLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1ldGVyTWFwWycqJ10sIHBhcmFtZXRlck1hcFtzdGFjay5zdGFja05hbWVdKSxcbiAgICAgICAgICAgIHVzZVByZXZpb3VzUGFyYW1ldGVyczogb3B0aW9ucy5wYXJhbWV0ZXJzPy5rZWVwRXhpc3RpbmdQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgcHJvZ3Jlc3MsXG4gICAgICAgICAgICBjaTogb3B0aW9ucy5jaSxcbiAgICAgICAgICAgIHJvbGxiYWNrLFxuICAgICAgICAgICAgaG90c3dhcDogaG90c3dhcE1vZGUsXG4gICAgICAgICAgICBleHRyYVVzZXJBZ2VudDogb3B0aW9ucy5leHRyYVVzZXJBZ2VudCxcbiAgICAgICAgICAgIGhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlczogb3B0aW9ucy5ob3Rzd2FwUHJvcGVydGllcyA/IGNyZWF0ZUhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcyhvcHRpb25zLmhvdHN3YXBQcm9wZXJ0aWVzKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFzc2V0UGFyYWxsZWxpc206IG9wdGlvbnMuYXNzZXRQYXJhbGxlbGlzbSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHN3aXRjaCAoci50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdkaWQtZGVwbG95LXN0YWNrJzpcbiAgICAgICAgICAgICAgZGVwbG95UmVzdWx0ID0gcjtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2ZhaWxwYXVzZWQtbmVlZC1yb2xsYmFjay1maXJzdCc6IHtcbiAgICAgICAgICAgICAgY29uc3QgbW90aXZhdGlvbiA9IHIucmVhc29uID09PSAncmVwbGFjZW1lbnQnXG4gICAgICAgICAgICAgICAgPyBgU3RhY2sgaXMgaW4gYSBwYXVzZWQgZmFpbCBzdGF0ZSAoJHtyLnN0YXR1c30pIGFuZCBjaGFuZ2UgaW5jbHVkZXMgYSByZXBsYWNlbWVudCB3aGljaCBjYW5ub3QgYmUgZGVwbG95ZWQgd2l0aCBcIi0tbm8tcm9sbGJhY2tcImBcbiAgICAgICAgICAgICAgICA6IGBTdGFjayBpcyBpbiBhIHBhdXNlZCBmYWlsIHN0YXRlICgke3Iuc3RhdHVzfSkgYW5kIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZG8gbm90IGluY2x1ZGUgXCItLW5vLXJvbGxiYWNrXCJgO1xuICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvbiA9IGAke21vdGl2YXRpb259LiBQZXJmb3JtIGEgcmVndWxhciBkZXBsb3ltZW50YDtcblxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb3JjZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkod2FybihgJHttb3RpdmF0aW9ufS4gUm9sbGluZyBiYWNrIGZpcnN0ICgtLWZvcmNlKS5gKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgaW9Ib3N0LnJlcXVlc3RSZXNwb25zZShjb25maXJtKCdDREtfVE9PTEtJVF9JNTA1MCcsIHF1ZXN0aW9uLCBtb3RpdmF0aW9uLCB0cnVlLCBjb25jdXJyZW5jeSkpO1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdBYm9ydGVkIGJ5IHVzZXInKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBQZXJmb3JtIGEgcm9sbGJhY2tcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcm9sbGJhY2soYXNzZW1ibHksIGFjdGlvbiwge1xuICAgICAgICAgICAgICAgIHN0YWNrczogeyBwYXR0ZXJuczogW3N0YWNrLmhpZXJhcmNoaWNhbElkXSwgc3RyYXRlZ3k6IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuUEFUVEVSTl9NVVNUX01BVENIX1NJTkdMRSB9LFxuICAgICAgICAgICAgICAgIG9ycGhhbkZhaWxlZFJlc291cmNlczogb3B0aW9ucy5mb3JjZSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgLy8gR28gYXJvdW5kIHRocm91Z2ggdGhlICd3aGlsZScgbG9vcCBhZ2FpbiBidXQgc3dpdGNoIHJvbGxiYWNrIHRvIHRydWUuXG4gICAgICAgICAgICAgIHJvbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ3JlcGxhY2VtZW50LXJlcXVpcmVzLXJvbGxiYWNrJzoge1xuICAgICAgICAgICAgICBjb25zdCBtb3RpdmF0aW9uID0gJ0NoYW5nZSBpbmNsdWRlcyBhIHJlcGxhY2VtZW50IHdoaWNoIGNhbm5vdCBiZSBkZXBsb3llZCB3aXRoIFwiLS1uby1yb2xsYmFja1wiJztcbiAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb24gPSBgJHttb3RpdmF0aW9ufS4gUGVyZm9ybSBhIHJlZ3VsYXIgZGVwbG95bWVudGA7XG5cbiAgICAgICAgICAgICAgLy8gQHRvZG8gbm8gZm9yY2UgaGVyZVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb3JjZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkod2FybihgJHttb3RpdmF0aW9ufS4gUHJvY2VlZGluZyB3aXRoIHJlZ3VsYXIgZGVwbG95bWVudCAoLS1mb3JjZSkuYCkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGlvSG9zdC5yZXF1ZXN0UmVzcG9uc2UoY29uZmlybSgnQ0RLX1RPT0xLSVRfSTUwNTAnLCBxdWVzdGlvbiwgbW90aXZhdGlvbiwgdHJ1ZSwgY29uY3VycmVuY3kpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQWJvcnRlZCBieSB1c2VyJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gR28gYXJvdW5kIHRocm91Z2ggdGhlICd3aGlsZScgbG9vcCBhZ2FpbiBidXQgc3dpdGNoIHJvbGxiYWNrIHRvIHRydWUuXG4gICAgICAgICAgICAgIHJvbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYFVuZXhwZWN0ZWQgcmVzdWx0IHR5cGUgZnJvbSBkZXBsb3lTdGFjazogJHtKU09OLnN0cmluZ2lmeShyKX0uIElmIHlvdSBhcmUgc2VlaW5nIHRoaXMgZXJyb3IsIHBsZWFzZSByZXBvcnQgaXQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy9uZXcvY2hvb3NlYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGRlcGxveVJlc3VsdC5ub09wXG4gICAgICAgICAgPyBgIOKchSAgJHtzdGFjay5kaXNwbGF5TmFtZX0gKG5vIGNoYW5nZXMpYFxuICAgICAgICAgIDogYCDinIUgICR7c3RhY2suZGlzcGxheU5hbWV9YDtcblxuICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHJlc3VsdChjaGFsay5ncmVlbignXFxuJyArIG1lc3NhZ2UpLCAnQ0RLX1RPT0xLSVRfSTU5MDAnLCBkZXBsb3lSZXN1bHQpKTtcbiAgICAgICAgZGVwbG95RHVyYXRpb24gPSBhd2FpdCBkZXBsb3lUaW1lci5lbmRBcyhpb0hvc3QsICdkZXBsb3knKTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGVwbG95UmVzdWx0Lm91dHB1dHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSBbJ091dHB1dHM6J107XG4gICAgICAgICAgc3RhY2tPdXRwdXRzW3N0YWNrLnN0YWNrTmFtZV0gPSBkZXBsb3lSZXN1bHQub3V0cHV0cztcblxuICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXBsb3lSZXN1bHQub3V0cHV0cykuc29ydCgpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRlcGxveVJlc3VsdC5vdXRwdXRzW25hbWVdO1xuICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7Y2hhbGsuY3lhbihzdGFjay5pZCl9LiR7Y2hhbGsuY3lhbihuYW1lKX0gPSAke2NoYWxrLnVuZGVybGluZShjaGFsay5jeWFuKHZhbHVlKSl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoaW5mbyhidWZmZXIuam9pbignXFxuJykpKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGluZm8oYFN0YWNrIEFSTjpcXG4ke2RlcGxveVJlc3VsdC5zdGFja0Fybn1gKSk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgLy8gSXQgaGFzIHRvIGJlIGV4YWN0bHkgdGhpcyBzdHJpbmcgYmVjYXVzZSBhbiBpbnRlZ3JhdGlvbiB0ZXN0IHRlc3RzIGZvclxuICAgICAgICAvLyBcImJvbGQoc3RhY2tuYW1lKSBmYWlsZWQ6IFJlc291cmNlTm90UmVhZHk6IDxlcnJvcj5cIlxuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKFxuICAgICAgICAgIFtg4p2MICAke2NoYWxrLmJvbGQoc3RhY2suc3RhY2tOYW1lKX0gZmFpbGVkOmAsIC4uLihlLm5hbWUgPyBbYCR7ZS5uYW1lfTpgXSA6IFtdKSwgZS5tZXNzYWdlXS5qb2luKCcgJyksXG4gICAgICAgICk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAob3B0aW9ucy50cmFjZUxvZ3MpIHtcbiAgICAgICAgICAvLyBkZXBsb3kgY2FsbHMgdGhhdCBvcmlnaW5hdGUgZnJvbSB3YXRjaCB3aWxsIGNvbWUgd2l0aCB0aGVpciBvd24gY2xvdWRXYXRjaExvZ01vbml0b3JcbiAgICAgICAgICBjb25zdCBjbG91ZFdhdGNoTG9nTW9uaXRvciA9IG9wdGlvbnMuY2xvdWRXYXRjaExvZ01vbml0b3IgPz8gbmV3IENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IoKTtcbiAgICAgICAgICBjb25zdCBmb3VuZExvZ0dyb3Vwc1Jlc3VsdCA9IGF3YWl0IGZpbmRDbG91ZFdhdGNoTG9nR3JvdXBzKGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoJ2RlcGxveScpLCB7IGlvSG9zdCwgYWN0aW9uIH0sIHN0YWNrKTtcbiAgICAgICAgICBjbG91ZFdhdGNoTG9nTW9uaXRvci5hZGRMb2dHcm91cHMoXG4gICAgICAgICAgICBmb3VuZExvZ0dyb3Vwc1Jlc3VsdC5lbnYsXG4gICAgICAgICAgICBmb3VuZExvZ0dyb3Vwc1Jlc3VsdC5zZGssXG4gICAgICAgICAgICBmb3VuZExvZ0dyb3Vwc1Jlc3VsdC5sb2dHcm91cE5hbWVzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGBUaGUgZm9sbG93aW5nIGxvZyBncm91cHMgYXJlIGFkZGVkOiAke2ZvdW5kTG9nR3JvdXBzUmVzdWx0LmxvZ0dyb3VwTmFtZXN9YCwgJ0NES19UT09MS0lUX0k1MDMxJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgYW4gb3V0cHV0cyBmaWxlIGhhcyBiZWVuIHNwZWNpZmllZCwgY3JlYXRlIHRoZSBmaWxlIHBhdGggYW5kIHdyaXRlIHN0YWNrIG91dHB1dHMgdG8gaXQgb25jZS5cbiAgICAgICAgLy8gT3V0cHV0cyBhcmUgd3JpdHRlbiBhZnRlciBhbGwgc3RhY2tzIGhhdmUgYmVlbiBkZXBsb3llZC4gSWYgYSBzdGFjayBkZXBsb3ltZW50IGZhaWxzLFxuICAgICAgICAvLyBhbGwgb2YgdGhlIG91dHB1dHMgZnJvbSBzdWNjZXNzZnVsbHkgZGVwbG95ZWQgc3RhY2tzIGJlZm9yZSB0aGUgZmFpbHVyZSB3aWxsIHN0aWxsIGJlIHdyaXR0ZW4uXG4gICAgICAgIGlmIChvdXRwdXRzRmlsZSkge1xuICAgICAgICAgIGZzLmVuc3VyZUZpbGVTeW5jKG91dHB1dHNGaWxlKTtcbiAgICAgICAgICBhd2FpdCBmcy53cml0ZUpzb24ob3V0cHV0c0ZpbGUsIHN0YWNrT3V0cHV0cywge1xuICAgICAgICAgICAgc3BhY2VzOiAyLFxuICAgICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZHVyYXRpb24gPSBzeW50aER1cmF0aW9uLmFzTXMgKyAoZGVwbG95RHVyYXRpb24/LmFzTXMgPz8gMCk7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGluZm8oYFxcbuKcqCAgVG90YWwgdGltZTogJHtmb3JtYXRUaW1lKGR1cmF0aW9uKX1zXFxuYCwgJ0NES19UT09MS0lUX0k1MDAxJywgeyBkdXJhdGlvbiB9KSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGFzc2V0QnVpbGRUaW1lID0gb3B0aW9ucy5hc3NldEJ1aWxkVGltZSA/PyBBc3NldEJ1aWxkVGltZS5BTExfQkVGT1JFX0RFUExPWTtcbiAgICBjb25zdCBwcmVidWlsZEFzc2V0cyA9IGFzc2V0QnVpbGRUaW1lID09PSBBc3NldEJ1aWxkVGltZS5BTExfQkVGT1JFX0RFUExPWTtcbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IG9wdGlvbnMuY29uY3VycmVuY3kgfHwgMTtcbiAgICBjb25zdCBwcm9ncmVzcyA9IGNvbmN1cnJlbmN5ID4gMSA/IFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFMgOiBvcHRpb25zLnByb2dyZXNzO1xuICAgIGlmIChjb25jdXJyZW5jeSA+IDEgJiYgb3B0aW9ucy5wcm9ncmVzcyAmJiBvcHRpb25zLnByb2dyZXNzICE9IFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFMpIHtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkod2Fybign4pqg77iPIFRoZSAtLWNvbmN1cnJlbmN5IGZsYWcgb25seSBzdXBwb3J0cyAtLXByb2dyZXNzIFwiZXZlbnRzXCIuIFN3aXRjaGluZyB0byBcImV2ZW50c1wiLicpKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFja3NBbmRUaGVpckFzc2V0TWFuaWZlc3RzID0gc3RhY2tzLmZsYXRNYXAoKHN0YWNrKSA9PiBbXG4gICAgICBzdGFjayxcbiAgICAgIC4uLnN0YWNrLmRlcGVuZGVuY2llcy5maWx0ZXIoY3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0LmlzQXNzZXRNYW5pZmVzdEFydGlmYWN0KSxcbiAgICBdKTtcbiAgICBjb25zdCB3b3JrR3JhcGggPSBuZXcgV29ya0dyYXBoQnVpbGRlcih7IGlvSG9zdCwgYWN0aW9uIH0sIHByZWJ1aWxkQXNzZXRzKS5idWlsZChzdGFja3NBbmRUaGVpckFzc2V0TWFuaWZlc3RzKTtcblxuICAgIC8vIFVubGVzcyB3ZSBhcmUgcnVubmluZyB3aXRoICctLWZvcmNlJywgc2tpcCBhbHJlYWR5IHB1Ymxpc2hlZCBhc3NldHNcbiAgICBpZiAoIW9wdGlvbnMuZm9yY2UpIHtcbiAgICAgIGF3YWl0IHJlbW92ZVB1Ymxpc2hlZEFzc2V0cyh3b3JrR3JhcGgsIGRlcGxveW1lbnRzLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCBncmFwaENvbmN1cnJlbmN5OiBDb25jdXJyZW5jeSA9IHtcbiAgICAgICdzdGFjayc6IGNvbmN1cnJlbmN5LFxuICAgICAgJ2Fzc2V0LWJ1aWxkJzogMSwgLy8gVGhpcyB3aWxsIGJlIENQVS1ib3VuZC9tZW1vcnkgYm91bmQsIG1vc3RseSBtYXR0ZXJzIGZvciBEb2NrZXIgYnVpbGRzXG4gICAgICAnYXNzZXQtcHVibGlzaCc6IChvcHRpb25zLmFzc2V0UGFyYWxsZWxpc20gPz8gdHJ1ZSkgPyA4IDogMSwgLy8gVGhpcyB3aWxsIGJlIEkvTy1ib3VuZCwgOCBpbiBwYXJhbGxlbCBzZWVtcyByZWFzb25hYmxlXG4gICAgfTtcblxuICAgIGF3YWl0IHdvcmtHcmFwaC5kb1BhcmFsbGVsKGdyYXBoQ29uY3VycmVuY3ksIHtcbiAgICAgIGRlcGxveVN0YWNrLFxuICAgICAgYnVpbGRBc3NldCxcbiAgICAgIHB1Ymxpc2hBc3NldCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaCBBY3Rpb25cbiAgICpcbiAgICogQ29udGludW91c2x5IG9ic2VydmUgcHJvamVjdCBmaWxlcyBhbmQgZGVwbG95IHRoZSBzZWxlY3RlZCBzdGFja3MgYXV0b21hdGljYWxseSB3aGVuIGNoYW5nZXMgYXJlIGRldGVjdGVkLlxuICAgKiBJbXBsaWVzIGhvdHN3YXAgZGVwbG95bWVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd2F0Y2goY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBXYXRjaE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhc3NlbWJseSA9IGF3YWl0IHRoaXMuYXNzZW1ibHlGcm9tU291cmNlKGN4LCBmYWxzZSk7XG4gICAgY29uc3QgaW9Ib3N0ID0gd2l0aEFjdGlvbih0aGlzLmlvSG9zdCwgJ3dhdGNoJyk7XG4gICAgY29uc3Qgcm9vdERpciA9IG9wdGlvbnMud2F0Y2hEaXIgPz8gcHJvY2Vzcy5jd2QoKTtcbiAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGRlYnVnKGByb290IGRpcmVjdG9yeSB1c2VkIGZvciAnd2F0Y2gnIGlzOiAke3Jvb3REaXJ9YCkpO1xuXG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZSA9PT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuZXhjbHVkZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKFxuICAgICAgICBcIkNhbm5vdCB1c2UgdGhlICd3YXRjaCcgY29tbWFuZCB3aXRob3V0IHNwZWNpZnlpbmcgYXQgbGVhc3Qgb25lIGRpcmVjdG9yeSB0byBtb25pdG9yLiBcIiArXG4gICAgICAgICAgJ01ha2Ugc3VyZSB0byBhZGQgYSBcIndhdGNoXCIga2V5IHRvIHlvdXIgY2RrLmpzb24nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgdGhlIFwiaW5jbHVkZVwiIHN1YmtleSB1bmRlciB0aGUgXCJ3YXRjaFwiIGtleSwgdGhlIGJlaGF2aW9yIGlzOlxuICAgIC8vIDEuIE5vIFwid2F0Y2hcIiBzZXR0aW5nPyBXZSBlcnJvciBvdXQuXG4gICAgLy8gMi4gXCJ3YXRjaFwiIHNldHRpbmcgd2l0aG91dCBhbiBcImluY2x1ZGVcIiBrZXk/IFdlIGRlZmF1bHQgdG8gb2JzZXJ2aW5nIFwiLi8qKlwiLlxuICAgIC8vIDMuIFwid2F0Y2hcIiBzZXR0aW5nIHdpdGggYW4gZW1wdHkgXCJpbmNsdWRlXCIga2V5PyBXZSBkZWZhdWx0IHRvIG9ic2VydmluZyBcIi4vKipcIi5cbiAgICAvLyA0LiBOb24tZW1wdHkgXCJpbmNsdWRlXCIga2V5PyBKdXN0IHVzZSB0aGUgXCJpbmNsdWRlXCIga2V5LlxuICAgIGNvbnN0IHdhdGNoSW5jbHVkZXMgPSBwYXR0ZXJuc0FycmF5Rm9yV2F0Y2gob3B0aW9ucy5pbmNsdWRlLCB7XG4gICAgICByb290RGlyLFxuICAgICAgcmV0dXJuUm9vdERpcklmRW1wdHk6IHRydWUsXG4gICAgfSk7XG4gICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShkZWJ1ZyhgJ2luY2x1ZGUnIHBhdHRlcm5zIGZvciAnd2F0Y2gnOiAke0pTT04uc3RyaW5naWZ5KHdhdGNoSW5jbHVkZXMpfWApKTtcblxuICAgIC8vIEZvciB0aGUgXCJleGNsdWRlXCIgc3Via2V5IHVuZGVyIHRoZSBcIndhdGNoXCIga2V5LFxuICAgIC8vIHRoZSBiZWhhdmlvciBpcyB0byBhZGQgc29tZSBkZWZhdWx0IGV4Y2x1ZGVzIGluIGFkZGl0aW9uIHRvIHRoZSBvbmVzIHNwZWNpZmllZCBieSB0aGUgdXNlcjpcbiAgICAvLyAxLiBUaGUgQ0RLIG91dHB1dCBkaXJlY3RvcnkuXG4gICAgLy8gMi4gQW55IGZpbGUgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCBhIGRvdC5cbiAgICAvLyAzLiBBbnkgZGlyZWN0b3J5J3MgY29udGVudCB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGEgZG90LlxuICAgIC8vIDQuIEFueSBub2RlX21vZHVsZXMgYW5kIGl0cyBjb250ZW50IChldmVuIGlmIGl0J3Mgbm90IGEgSlMvVFMgcHJvamVjdCwgeW91IG1pZ2h0IGJlIHVzaW5nIGEgbG9jYWwgYXdzLWNsaSBwYWNrYWdlKVxuICAgIGNvbnN0IG91dGRpciA9IG9wdGlvbnMub3V0ZGlyID8/ICdjZGsub3V0JztcbiAgICBjb25zdCB3YXRjaEV4Y2x1ZGVzID0gcGF0dGVybnNBcnJheUZvcldhdGNoKG9wdGlvbnMuZXhjbHVkZSwge1xuICAgICAgcm9vdERpcixcbiAgICAgIHJldHVyblJvb3REaXJJZkVtcHR5OiBmYWxzZSxcbiAgICB9KS5jb25jYXQoYCR7b3V0ZGlyfS8qKmAsICcqKi8uKicsICcqKi8uKi8qKicsICcqKi9ub2RlX21vZHVsZXMvKionKTtcbiAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGRlYnVnKGAnZXhjbHVkZScgcGF0dGVybnMgZm9yICd3YXRjaCc6ICR7SlNPTi5zdHJpbmdpZnkod2F0Y2hFeGNsdWRlcyl9YCkpO1xuXG4gICAgLy8gU2luY2UgJ2NkayBkZXBsb3knIGlzIGEgcmVsYXRpdmVseSBzbG93IG9wZXJhdGlvbiBmb3IgYSAnd2F0Y2gnIHByb2Nlc3MsXG4gICAgLy8gaW50cm9kdWNlIGEgY29uY3VycmVuY3kgbGF0Y2ggdGhhdCB0cmFja3MgdGhlIHN0YXRlLlxuICAgIC8vIFRoaXMgd2F5LCBpZiBmaWxlIGNoYW5nZSBldmVudHMgYXJyaXZlIHdoZW4gYSAnY2RrIGRlcGxveScgaXMgc3RpbGwgZXhlY3V0aW5nLFxuICAgIC8vIHdlIHdpbGwgYmF0Y2ggdGhlbSwgYW5kIHRyaWdnZXIgYW5vdGhlciAnY2RrIGRlcGxveScgYWZ0ZXIgdGhlIGN1cnJlbnQgb25lIGZpbmlzaGVzLFxuICAgIC8vIG1ha2luZyBzdXJlICdjZGsgZGVwbG95J3MgIGFsd2F5cyBleGVjdXRlIG9uZSBhdCBhIHRpbWUuXG4gICAgLy8gSGVyZSdzIGEgZGlhZ3JhbSBzaG93aW5nIHRoZSBzdGF0ZSB0cmFuc2l0aW9uczpcbiAgICAvLyAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAtLS0tLS0tLSAgICBmaWxlIGNoYW5nZWQgICAgIC0tLS0tLS0tLS0tLS0tICAgIGZpbGUgY2hhbmdlZCAgICAgLS0tLS0tLS0tLS0tLS0gIGZpbGUgY2hhbmdlZFxuICAgIC8vIHwgICAgICAgICAgICB8ICByZWFkeSBldmVudCAgIHwgICAgICB8IC0tLS0tLS0tLS0tLS0tLS0tLT4gfCAgICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS0tLS0tPiB8ICAgICAgICAgICAgfCAtLS0tLS0tLS0tLS0tLXxcbiAgICAvLyB8IHByZS1yZWFkeSAgfCAtLS0tLS0tLS0tLS0tPiB8IG9wZW4gfCAgICAgICAgICAgICAgICAgICAgIHwgZGVwbG95aW5nICB8ICAgICAgICAgICAgICAgICAgICAgfCAgIHF1ZXVlZCAgIHwgICAgICAgICAgICAgICB8XG4gICAgLy8gfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgIHwgPC0tLS0tLS0tLS0tLS0tLS0tLSB8ICAgICAgICAgICAgfCA8LS0tLS0tLS0tLS0tLS0tLS0tIHwgICAgICAgICAgICB8IDwtLS0tLS0tLS0tLS0tfFxuICAgIC8vIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgIC0tLS0tLS0tICAnY2RrIGRlcGxveScgZG9uZSAgLS0tLS0tLS0tLS0tLS0gICdjZGsgZGVwbG95JyBkb25lICAtLS0tLS0tLS0tLS0tLVxuICAgIGxldCBsYXRjaDogJ3ByZS1yZWFkeScgfCAnb3BlbicgfCAnZGVwbG95aW5nJyB8ICdxdWV1ZWQnID0gJ3ByZS1yZWFkeSc7XG5cbiAgICBjb25zdCBjbG91ZFdhdGNoTG9nTW9uaXRvciA9IG9wdGlvbnMudHJhY2VMb2dzID8gbmV3IENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IoKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZXBsb3lBbmRXYXRjaCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGxhdGNoID0gJ2RlcGxveWluZyc7XG4gICAgICBjbG91ZFdhdGNoTG9nTW9uaXRvcj8uZGVhY3RpdmF0ZSgpO1xuXG4gICAgICBhd2FpdCB0aGlzLmludm9rZURlcGxveUZyb21XYXRjaChhc3NlbWJseSwgb3B0aW9ucywgY2xvdWRXYXRjaExvZ01vbml0b3IpO1xuXG4gICAgICAvLyBJZiBsYXRjaCBpcyBzdGlsbCAnZGVwbG95aW5nJyBhZnRlciB0aGUgJ2F3YWl0JywgdGhhdCdzIGZpbmUsXG4gICAgICAvLyBidXQgaWYgaXQncyAncXVldWVkJywgdGhhdCBtZWFucyB3ZSBuZWVkIHRvIGRlcGxveSBhZ2FpblxuICAgICAgd2hpbGUgKChsYXRjaCBhcyAnZGVwbG95aW5nJyB8ICdxdWV1ZWQnKSA9PT0gJ3F1ZXVlZCcpIHtcbiAgICAgICAgLy8gVHlwZVNjcmlwdCBkb2Vzbid0IHJlYWxpemUgbGF0Y2ggY2FuIGNoYW5nZSBiZXR3ZWVuICdhd2FpdHMnLFxuICAgICAgICAvLyBhbmQgdGhpbmtzIHRoZSBhYm92ZSAnd2hpbGUnIGNvbmRpdGlvbiBpcyBhbHdheXMgJ2ZhbHNlJyB3aXRob3V0IHRoZSBjYXN0XG4gICAgICAgIGxhdGNoID0gJ2RlcGxveWluZyc7XG4gICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoaW5mbyhcIkRldGVjdGVkIGZpbGUgY2hhbmdlcyBkdXJpbmcgZGVwbG95bWVudC4gSW52b2tpbmcgJ2NkayBkZXBsb3knIGFnYWluXCIpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbnZva2VEZXBsb3lGcm9tV2F0Y2goYXNzZW1ibHksIG9wdGlvbnMsIGNsb3VkV2F0Y2hMb2dNb25pdG9yKTtcbiAgICAgIH1cbiAgICAgIGxhdGNoID0gJ29wZW4nO1xuICAgICAgY2xvdWRXYXRjaExvZ01vbml0b3I/LmFjdGl2YXRlKCk7XG4gICAgfTtcblxuICAgIGNob2tpZGFyXG4gICAgICAud2F0Y2god2F0Y2hJbmNsdWRlcywge1xuICAgICAgICBpZ25vcmVkOiB3YXRjaEV4Y2x1ZGVzLFxuICAgICAgICBjd2Q6IHJvb3REaXIsXG4gICAgICB9KVxuICAgICAgLm9uKCdyZWFkeScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgbGF0Y2ggPSAnb3Blbic7XG4gICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoZGVidWcoXCInd2F0Y2gnIHJlY2VpdmVkIHRoZSAncmVhZHknIGV2ZW50LiBGcm9tIG5vdyBvbiwgYWxsIGZpbGUgY2hhbmdlcyB3aWxsIHRyaWdnZXIgYSBkZXBsb3ltZW50XCIpKTtcbiAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKFwiVHJpZ2dlcmluZyBpbml0aWFsICdjZGsgZGVwbG95J1wiKSk7XG4gICAgICAgIGF3YWl0IGRlcGxveUFuZFdhdGNoKCk7XG4gICAgICB9KVxuICAgICAgLm9uKCdhbGwnLCBhc3luYyAoZXZlbnQ6ICdhZGQnIHwgJ2FkZERpcicgfCAnY2hhbmdlJyB8ICd1bmxpbmsnIHwgJ3VubGlua0RpcicsIGZpbGVQYXRoPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChsYXRjaCA9PT0gJ3ByZS1yZWFkeScpIHtcbiAgICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGluZm8oYCd3YXRjaCcgaXMgb2JzZXJ2aW5nICR7ZXZlbnQgPT09ICdhZGREaXInID8gJ2RpcmVjdG9yeScgOiAndGhlIGZpbGUnfSAnJHtmaWxlUGF0aH0nIGZvciBjaGFuZ2VzYCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGxhdGNoID09PSAnb3BlbicpIHtcbiAgICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGluZm8oYERldGVjdGVkIGNoYW5nZSB0byAnJHtmaWxlUGF0aH0nICh0eXBlOiAke2V2ZW50fSkuIFRyaWdnZXJpbmcgJ2NkayBkZXBsb3knYCkpO1xuICAgICAgICAgIGF3YWl0IGRlcGxveUFuZFdhdGNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhpcyBtZWFucyBsYXRjaCBpcyBlaXRoZXIgJ2RlcGxveWluZycgb3IgJ3F1ZXVlZCdcbiAgICAgICAgICBsYXRjaCA9ICdxdWV1ZWQnO1xuICAgICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoaW5mbyhcbiAgICAgICAgICAgIGBEZXRlY3RlZCBjaGFuZ2UgdG8gJyR7ZmlsZVBhdGh9JyAodHlwZTogJHtldmVudH0pIHdoaWxlICdjZGsgZGVwbG95JyBpcyBzdGlsbCBydW5uaW5nLiBXaWxsIHF1ZXVlIGZvciBhbm90aGVyIGRlcGxveW1lbnQgYWZ0ZXIgdGhpcyBvbmUgZmluaXNoZXMnYCxcbiAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUm9sbGJhY2sgQWN0aW9uXG4gICAqXG4gICAqIFJvbGxzIGJhY2sgdGhlIHNlbGVjdGVkIHN0YWNrcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByb2xsYmFjayhjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IFJvbGxiYWNrT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gYXdhaXQgdGhpcy5hc3NlbWJseUZyb21Tb3VyY2UoY3gpO1xuICAgIHJldHVybiB0aGlzLl9yb2xsYmFjayhhc3NlbWJseSwgJ3JvbGxiYWNrJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIGFsbG93IHJvbGxiYWNrIGJlaW5nIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBkZXBsb3kgb3Igd2F0Y2ggYWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfcm9sbGJhY2soYXNzZW1ibHk6IFN0YWNrQXNzZW1ibHksIGFjdGlvbjogJ3JvbGxiYWNrJyB8ICdkZXBsb3knIHwgJ3dhdGNoJywgb3B0aW9uczogUm9sbGJhY2tPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW9Ib3N0ID0gd2l0aEFjdGlvbih0aGlzLmlvSG9zdCwgYWN0aW9uKTtcbiAgICBjb25zdCBzeW50aFRpbWVyID0gVGltZXIuc3RhcnQoKTtcbiAgICBjb25zdCBzdGFja3MgPSBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihvcHRpb25zLnN0YWNrcyk7XG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZVN0YWNrc01ldGFkYXRhKHN0YWNrcywgaW9Ib3N0KTtcbiAgICBhd2FpdCBzeW50aFRpbWVyLmVuZEFzKGlvSG9zdCwgJ3N5bnRoJyk7XG5cbiAgICBpZiAoc3RhY2tzLnN0YWNrQ291bnQgPT09IDApIHtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoZXJyb3IoJ05vIHN0YWNrcyBzZWxlY3RlZCcsICdDREtfVE9PTEtJVF9FNjAwMScpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgYW55Um9sbGJhY2thYmxlID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWNrcy5zdGFja0FydGlmYWN0cykge1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGBSb2xsaW5nIGJhY2sgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX1gKSk7XG4gICAgICBjb25zdCByb2xsYmFja1RpbWVyID0gVGltZXIuc3RhcnQoKTtcbiAgICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbigncm9sbGJhY2snKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YWNrUmVzdWx0ID0gYXdhaXQgZGVwbG95bWVudHMucm9sbGJhY2tTdGFjayh7XG4gICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgIHRvb2xraXRTdGFja05hbWU6IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgICBmb3JjZTogb3B0aW9ucy5vcnBoYW5GYWlsZWRSZXNvdXJjZXMsXG4gICAgICAgICAgdmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb246IG9wdGlvbnMudmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb24sXG4gICAgICAgICAgb3JwaGFuTG9naWNhbElkczogb3B0aW9ucy5vcnBoYW5Mb2dpY2FsSWRzLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFzdGFja1Jlc3VsdC5ub3RJblJvbGxiYWNrYWJsZVN0YXRlKSB7XG4gICAgICAgICAgYW55Um9sbGJhY2thYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCByb2xsYmFja1RpbWVyLmVuZEFzKGlvSG9zdCwgJ3JvbGxiYWNrJyk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShlcnJvcihgXFxuIOKdjCAgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX0gZmFpbGVkOiAke2Zvcm1hdEVycm9yTWVzc2FnZShlKX1gLCAnQ0RLX1RPT0xLSVRfRTY5MDAnKSk7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1JvbGxiYWNrIGZhaWxlZCAodXNlIC0tZm9yY2UgdG8gb3JwaGFuIGZhaWxpbmcgcmVzb3VyY2VzKScpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWFueVJvbGxiYWNrYWJsZSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignTm8gc3RhY2tzIHdlcmUgaW4gYSBzdGF0ZSB0aGF0IGNvdWxkIGJlIHJvbGxlZCBiYWNrJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgQWN0aW9uXG4gICAqXG4gICAqIERlc3Ryb3lzIHRoZSBzZWxlY3RlZCBTdGFja3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVzdHJveShjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IERlc3Ryb3lPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCB0aGlzLmFzc2VtYmx5RnJvbVNvdXJjZShjeCk7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc3Ryb3koYXNzZW1ibHksICdkZXN0cm95Jywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIGFsbG93IGRlc3Ryb3kgYmVpbmcgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIGRlcGxveSBhY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9kZXN0cm95KGFzc2VtYmx5OiBTdGFja0Fzc2VtYmx5LCBhY3Rpb246ICdkZXBsb3knIHwgJ2Rlc3Ryb3knLCBvcHRpb25zOiBEZXN0cm95T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlvSG9zdCA9IHdpdGhBY3Rpb24odGhpcy5pb0hvc3QsIGFjdGlvbik7XG4gICAgY29uc3Qgc3ludGhUaW1lciA9IFRpbWVyLnN0YXJ0KCk7XG4gICAgLy8gVGhlIHN0YWNrcyB3aWxsIGhhdmUgYmVlbiBvcmRlcmVkIGZvciBkZXBsb3ltZW50LCBzbyByZXZlcnNlIHRoZW0gZm9yIGRlbGV0aW9uLlxuICAgIGNvbnN0IHN0YWNrcyA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKG9wdGlvbnMuc3RhY2tzKS5yZXZlcnNlZCgpO1xuICAgIGF3YWl0IHN5bnRoVGltZXIuZW5kQXMoaW9Ib3N0LCAnc3ludGgnKTtcblxuICAgIGNvbnN0IG1vdGl2YXRpb24gPSAnRGVzdHJveWluZyBzdGFja3MgaXMgYW4gaXJyZXZlcnNpYmxlIGFjdGlvbic7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZTogJHtjaGFsay5yZWQoc3RhY2tzLmhpZXJhcmNoaWNhbElkcy5qb2luKCcsICcpKX1gO1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGlvSG9zdC5yZXF1ZXN0UmVzcG9uc2UoY29uZmlybSgnQ0RLX1RPT0xLSVRfSTcwMTAnLCBxdWVzdGlvbiwgbW90aXZhdGlvbiwgdHJ1ZSkpO1xuICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICByZXR1cm4gaW9Ib3N0Lm5vdGlmeShlcnJvcignQWJvcnRlZCBieSB1c2VyJywgJ0NES19UT09MS0lUX0U3MDEwJykpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlc3Ryb3lUaW1lciA9IFRpbWVyLnN0YXJ0KCk7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBzdGFja10gb2Ygc3RhY2tzLnN0YWNrQXJ0aWZhY3RzLmVudHJpZXMoKSkge1xuICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHN1Y2Nlc3MoYCR7Y2hhbGsuYmx1ZShzdGFjay5kaXNwbGF5TmFtZSl9OiBkZXN0cm95aW5nLi4uIFske2luZGV4ICsgMX0vJHtzdGFja3Muc3RhY2tDb3VudH1dYCkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbihhY3Rpb24pO1xuICAgICAgICAgIGF3YWl0IGRlcGxveW1lbnRzLmRlc3Ryb3lTdGFjayh7XG4gICAgICAgICAgICBzdGFjayxcbiAgICAgICAgICAgIGRlcGxveU5hbWU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgICAgIGNpOiBvcHRpb25zLmNpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoc3VjY2VzcyhgXFxuIOKchSAgJHtjaGFsay5ibHVlKHN0YWNrLmRpc3BsYXlOYW1lKX06ICR7YWN0aW9ufWVkYCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShlcnJvcihgXFxuIOKdjCAgJHtjaGFsay5ibHVlKHN0YWNrLmRpc3BsYXlOYW1lKX06ICR7YWN0aW9ufSBmYWlsZWQgJHtlfWAsICdDREtfVE9PTEtJVF9FNzkwMCcpKTtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGRlc3Ryb3lUaW1lci5lbmRBcyhpb0hvc3QsICdkZXN0cm95Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBzdGFja3MgZm9yIGVycm9ycyBhbmQgd2FybmluZ3MgYWNjb3JkaW5nIHRvIHRoZSBDTEkncyBjdXJyZW50IHNldHRpbmdzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlU3RhY2tzTWV0YWRhdGEoc3RhY2tzOiBTdGFja0NvbGxlY3Rpb24sIGlvSG9zdDogQWN0aW9uQXdhcmVJb0hvc3QpIHtcbiAgICAvLyBAVE9ETyBkZWZpbmUgdGhlc2Ugc29tZXdoZXJlIGNlbnRyYWxcbiAgICBjb25zdCBjb2RlID0gKGxldmVsOiBJb01lc3NhZ2VMZXZlbCk6IElvTWVzc2FnZUNvZGUgPT4ge1xuICAgICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgICBjYXNlICdlcnJvcic6IHJldHVybiAnQ0RLX0FTU0VNQkxZX0U5OTk5JztcbiAgICAgICAgY2FzZSAnd2Fybic6IHJldHVybiAnQ0RLX0FTU0VNQkxZX1c5OTk5JztcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuICdDREtfQVNTRU1CTFlfSTk5OTknO1xuICAgICAgfVxuICAgIH07XG4gICAgYXdhaXQgc3RhY2tzLnZhbGlkYXRlTWV0YWRhdGEodGhpcy5wcm9wcy5hc3NlbWJseUZhaWx1cmVBdCwgYXN5bmMgKGxldmVsLCBtc2cpID0+IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgIGxldmVsLFxuICAgICAgY29kZTogY29kZShsZXZlbCksXG4gICAgICBtZXNzYWdlOiBgWyR7bGV2ZWx9IGF0ICR7bXNnLmlkfV0gJHttc2cuZW50cnkuZGF0YX1gLFxuICAgICAgZGF0YTogbXNnLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVG9vbGtpdCBpbnRlcm5hbCBDbG91ZEFzc2VtYmx5IGZyb20gYSBDbG91ZEFzc2VtYmx5U291cmNlLlxuICAgKiBAcGFyYW0gYXNzZW1ibHlTb3VyY2UgdGhlIHNvdXJjZSBmb3IgdGhlIGNsb3VkIGFzc2VtYmx5XG4gICAqIEBwYXJhbSBjYWNoZSBpZiB0aGUgYXNzZW1ibHkgc2hvdWxkIGJlIGNhY2hlZCwgZGVmYXVsdDogYHRydWVgXG4gICAqIEByZXR1cm5zIHRoZSBDbG91ZEFzc2VtYmx5IG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhc3NlbWJseUZyb21Tb3VyY2UoYXNzZW1ibHlTb3VyY2U6IElDbG91ZEFzc2VtYmx5U291cmNlLCBjYWNoZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPFN0YWNrQXNzZW1ibHk+IHtcbiAgICBpZiAoYXNzZW1ibHlTb3VyY2UgaW5zdGFuY2VvZiBTdGFja0Fzc2VtYmx5KSB7XG4gICAgICByZXR1cm4gYXNzZW1ibHlTb3VyY2U7XG4gICAgfVxuXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICByZXR1cm4gbmV3IFN0YWNrQXNzZW1ibHkoYXdhaXQgbmV3IENhY2hlZENsb3VkQXNzZW1ibHlTb3VyY2UoYXNzZW1ibHlTb3VyY2UpLnByb2R1Y2UoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTdGFja0Fzc2VtYmx5KGF3YWl0IGFzc2VtYmx5U291cmNlLnByb2R1Y2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZGVwbG95bWVudHMgY2xhc3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGVwbG95bWVudHNGb3JBY3Rpb24oYWN0aW9uOiBUb29sa2l0QWN0aW9uKTogUHJvbWlzZTxEZXBsb3ltZW50cz4ge1xuICAgIHJldHVybiBuZXcgRGVwbG95bWVudHMoe1xuICAgICAgc2RrUHJvdmlkZXI6IGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoYWN0aW9uKSxcbiAgICAgIHRvb2xraXRTdGFja05hbWU6IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgIGlvSG9zdDogdGhpcy5pb0hvc3QgYXMgYW55LCAvLyBAdG9kbyB0ZW1wb3Jhcnkgd2hpbGUgd2UgaGF2ZSB0byBzZXBhcmF0ZSBJSW9Ib3N0IGludGVyZmFjZXNcbiAgICAgIGFjdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW52b2tlRGVwbG95RnJvbVdhdGNoKFxuICAgIGFzc2VtYmx5OiBTdGFja0Fzc2VtYmx5LFxuICAgIG9wdGlvbnM6IFdhdGNoT3B0aW9ucyxcbiAgICBjbG91ZFdhdGNoTG9nTW9uaXRvcj86IENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHdhdGNoIGRlZmF1bHRzIGhvdHN3YXAgdG8gZW5hYmxlZFxuICAgIGNvbnN0IGhvdHN3YXAgPSBvcHRpb25zLmhvdHN3YXAgPz8gSG90c3dhcE1vZGUuSE9UU1dBUF9PTkxZO1xuICAgIGNvbnN0IGRlcGxveU9wdGlvbnM6IEV4dGVuZGVkRGVwbG95T3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICByZXF1aXJlQXBwcm92YWw6IFJlcXVpcmVBcHByb3ZhbC5ORVZFUixcbiAgICAgIGNsb3VkV2F0Y2hMb2dNb25pdG9yLFxuICAgICAgaG90c3dhcCxcbiAgICAgIGV4dHJhVXNlckFnZW50OiBgY2RrLXdhdGNoL2hvdHN3YXAtJHtob3Rzd2FwID09PSBIb3Rzd2FwTW9kZS5GVUxMX0RFUExPWU1FTlQgPyAnb2ZmJyA6ICdvbid9YCxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2RlcGxveShhc3NlbWJseSwgJ3dhdGNoJywgZGVwbG95T3B0aW9ucyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBqdXN0IGNvbnRpbnVlIC0gZGVwbG95IHdpbGwgc2hvdyB0aGUgZXJyb3JcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|