@aws-cdk/toolkit-lib 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/CODE_REGISTRY.md +19 -12
  2. package/build-info.json +2 -2
  3. package/db.json.gz +0 -0
  4. package/lib/actions/bootstrap/index.d.ts +174 -0
  5. package/lib/actions/bootstrap/index.js +94 -0
  6. package/lib/actions/bootstrap/private/helpers.d.ts +5 -0
  7. package/lib/actions/bootstrap/private/helpers.js +23 -0
  8. package/lib/actions/bootstrap/private/index.d.ts +1 -0
  9. package/lib/actions/bootstrap/private/index.js +18 -0
  10. package/lib/actions/deploy/index.d.ts +4 -4
  11. package/lib/actions/deploy/index.js +1 -1
  12. package/lib/actions/destroy/index.d.ts +1 -1
  13. package/lib/actions/destroy/index.js +1 -1
  14. package/lib/actions/diff/private/helpers.js +3 -3
  15. package/lib/actions/index.d.ts +1 -0
  16. package/lib/actions/index.js +2 -1
  17. package/lib/actions/list/index.d.ts +4 -0
  18. package/lib/actions/list/index.js +1 -1
  19. package/lib/api/aws-cdk.d.ts +3 -7
  20. package/lib/api/aws-cdk.js +1969 -1336
  21. package/lib/api/aws-cdk.js.map +4 -4
  22. package/lib/api/bootstrap/bootstrap-template.yaml +707 -0
  23. package/lib/api/cloud-assembly/context.d.ts +9 -0
  24. package/lib/api/cloud-assembly/context.js +3 -0
  25. package/lib/api/cloud-assembly/private/context-aware-source.js +5 -5
  26. package/lib/api/cloud-assembly/private/exec.js +3 -3
  27. package/lib/api/cloud-assembly/private/prepare-source.d.ts +1 -1
  28. package/lib/api/cloud-assembly/private/prepare-source.js +6 -5
  29. package/lib/api/cloud-assembly/private/source-builder.js +5 -5
  30. package/lib/api/cloud-assembly/private/stack-assembly.js +7 -7
  31. package/lib/api/io/index.d.ts +1 -2
  32. package/lib/api/io/index.js +1 -17
  33. package/lib/api/io/private/codes.d.ts +39 -55
  34. package/lib/api/io/private/codes.js +71 -59
  35. package/lib/api/io/private/index.d.ts +0 -1
  36. package/lib/api/io/private/index.js +1 -2
  37. package/lib/api/io/private/level-priority.d.ts +1 -1
  38. package/lib/api/io/private/level-priority.js +1 -1
  39. package/lib/api/io/private/logger.d.ts +3 -12
  40. package/lib/api/io/private/logger.js +1 -22
  41. package/lib/api/io/private/messages.d.ts +7 -3
  42. package/lib/api/io/private/messages.js +1 -2
  43. package/lib/api/io/private/timer.d.ts +2 -2
  44. package/lib/api/io/private/timer.js +13 -13
  45. package/lib/api/shared-private.d.ts +1 -0
  46. package/lib/api/shared-private.js +82 -0
  47. package/lib/api/shared-private.js.map +7 -0
  48. package/lib/api/shared-public.d.ts +130 -0
  49. package/lib/api/shared-public.js +100 -0
  50. package/lib/api/shared-public.js.map +7 -0
  51. package/lib/index.d.ts +1 -1
  52. package/lib/index.js +2 -2
  53. package/lib/private/util.d.ts +1 -0
  54. package/lib/private/util.js +715 -0
  55. package/lib/private/util.js.map +7 -0
  56. package/lib/toolkit/private/index.d.ts +10 -1
  57. package/lib/toolkit/private/index.js +18 -1
  58. package/lib/toolkit/toolkit.d.ts +7 -11
  59. package/lib/toolkit/toolkit.js +139 -118
  60. package/lib/toolkit/types.d.ts +9 -0
  61. package/lib/toolkit/types.js +1 -1
  62. package/lib/util/concurrency.d.ts +5 -0
  63. package/lib/util/concurrency.js +11 -0
  64. package/package.json +33 -32
  65. package/lib/api/errors.d.ts +0 -44
  66. package/lib/api/errors.js +0 -82
  67. package/lib/api/io/io-host.d.ts +0 -15
  68. package/lib/api/io/io-host.js +0 -3
  69. package/lib/api/io/io-message.d.ts +0 -59
  70. package/lib/api/io/io-message.js +0 -3
  71. package/lib/api/io/private/types.d.ts +0 -25
  72. package/lib/api/io/private/types.js +0 -3
@@ -6,19 +6,26 @@ const cxapi = require("@aws-cdk/cx-api");
6
6
  const chalk = require("chalk");
7
7
  const chokidar = require("chokidar");
8
8
  const fs = require("fs-extra");
9
+ const private_1 = require("./private");
10
+ const bootstrap_1 = require("../actions/bootstrap");
9
11
  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");
12
+ const private_2 = require("../actions/deploy/private");
13
+ const private_3 = require("../actions/diff/private");
14
+ const private_4 = require("../actions/watch/private");
13
15
  const aws_cdk_1 = require("../api/aws-cdk");
14
16
  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");
17
+ const private_5 = require("../api/cloud-assembly/private");
18
+ const private_6 = require("../api/io/private");
19
+ const shared_private_1 = require("../api/shared-private");
20
+ const shared_public_1 = require("../api/shared-public");
21
+ const util_1 = require("../private/util");
22
+ const concurrency_1 = require("../util/concurrency");
18
23
  /**
19
24
  * The AWS CDK Programmatic Toolkit
25
+ *
26
+ * @document ../../CODE_REGISTRY.md
20
27
  */
21
- class Toolkit extends private_4.CloudAssemblySourceBuilder {
28
+ class Toolkit extends private_5.CloudAssemblySourceBuilder {
22
29
  props;
23
30
  /**
24
31
  * The toolkit stack name used for bootstrapping resources.
@@ -40,14 +47,14 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
40
47
  }
41
48
  let ioHost = globalIoHost;
42
49
  if (props.emojis === false) {
43
- ioHost = (0, private_5.withoutEmojis)(ioHost);
50
+ ioHost = (0, private_6.withoutEmojis)(ioHost);
44
51
  }
45
52
  if (props.color === false) {
46
- ioHost = (0, private_5.withoutColor)(ioHost);
53
+ ioHost = (0, private_6.withoutColor)(ioHost);
47
54
  }
48
55
  // After removing emojis and color, we might end up with floating whitespace at either end of the message
49
56
  // This also removes newlines that we currently emit for CLI backwards compatibility.
50
- this.ioHost = (0, private_5.withTrimmedWhitespace)(ioHost);
57
+ this.ioHost = (0, private_6.withTrimmedWhitespace)(ioHost);
51
58
  }
52
59
  async dispose() {
53
60
  // nothing to do yet
@@ -63,7 +70,7 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
63
70
  if (!this._sdkProvider) {
64
71
  this._sdkProvider = await aws_cdk_1.SdkProvider.withAwsCliCompatibleDefaults({
65
72
  ...this.props.sdkConfig,
66
- logger: (0, private_5.asSdkLogger)(this.ioHost, action),
73
+ logger: (0, private_6.asSdkLogger)(this.ioHost, action),
67
74
  });
68
75
  }
69
76
  return this._sdkProvider;
@@ -73,18 +80,53 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
73
80
  */
74
81
  async sourceBuilderServices() {
75
82
  return {
76
- ioHost: (0, private_5.withAction)(this.ioHost, 'assembly'),
83
+ ioHost: (0, shared_private_1.withAction)(this.ioHost, 'assembly'),
77
84
  sdkProvider: await this.sdkProvider('assembly'),
78
85
  };
79
86
  }
87
+ /**
88
+ * Bootstrap Action
89
+ */
90
+ async bootstrap(environments, options) {
91
+ const ioHost = (0, shared_private_1.withAction)(this.ioHost, 'bootstrap');
92
+ const bootstrapEnvironments = await environments.getEnvironments();
93
+ const source = options.source ?? bootstrap_1.BootstrapSource.default();
94
+ const parameters = options.parameters;
95
+ const bootstrapper = new aws_cdk_1.Bootstrapper(source, { ioHost, action: 'bootstrap' });
96
+ const sdkProvider = await this.sdkProvider('bootstrap');
97
+ const limit = (0, concurrency_1.pLimit)(20);
98
+ // eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
99
+ await Promise.all(bootstrapEnvironments.map((environment) => limit(async () => {
100
+ await ioHost.notify((0, private_6.info)(`${chalk.bold(environment.name)}: bootstrapping...`));
101
+ const bootstrapTimer = private_6.Timer.start();
102
+ try {
103
+ const bootstrapResult = await bootstrapper.bootstrapEnvironment(environment, sdkProvider, {
104
+ ...options,
105
+ toolkitStackName: this.toolkitStackName,
106
+ source,
107
+ parameters: parameters?.parameters,
108
+ usePreviousParameters: parameters?.keepExistingParameters,
109
+ });
110
+ const message = bootstrapResult.noOp
111
+ ? ` ✅ ${environment.name} (no changes)`
112
+ : ` ✅ ${environment.name}`;
113
+ await ioHost.notify((0, private_6.result)(chalk.green('\n' + message), private_6.CODES.CDK_TOOLKIT_I9900, { environment }));
114
+ await bootstrapTimer.endAs(ioHost, 'bootstrap');
115
+ }
116
+ catch (e) {
117
+ await ioHost.notify((0, private_6.error)(`\n ❌ ${chalk.bold(environment.name)} failed: ${(0, util_1.formatErrorMessage)(e)}`, private_6.CODES.CDK_TOOLKIT_E9900));
118
+ throw e;
119
+ }
120
+ })));
121
+ }
80
122
  /**
81
123
  * Synth Action
82
124
  */
83
125
  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);
126
+ const ioHost = (0, shared_private_1.withAction)(this.ioHost, 'synth');
127
+ const synthTimer = private_6.Timer.start();
128
+ const assembly = await (0, private_1.assemblyFromSource)(cx);
129
+ const stacks = assembly.selectStacksV2(options.stacks ?? private_5.ALL_STACKS);
88
130
  const autoValidateStacks = options.validateStacks ? [assembly.selectStacksForValidation()] : [];
89
131
  await this.validateStacksMetadata(stacks.concat(...autoValidateStacks), ioHost);
90
132
  await synthTimer.endAs(ioHost, 'synth');
@@ -98,24 +140,24 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
98
140
  if (stacks.stackCount === 1) {
99
141
  const firstStack = stacks.firstStack;
100
142
  const template = firstStack.template;
101
- const obscuredTemplate = (0, aws_cdk_1.obscureTemplate)(template);
102
- await ioHost.notify((0, private_5.result)(message, private_5.CODES.CDK_TOOLKIT_I1901, {
143
+ const obscuredTemplate = (0, util_1.obscureTemplate)(template);
144
+ await ioHost.notify(private_6.CODES.CDK_TOOLKIT_I1901.msg(message, {
103
145
  ...assemblyData,
104
146
  stack: {
105
147
  stackName: firstStack.stackName,
106
148
  hierarchicalId: firstStack.hierarchicalId,
107
149
  template,
108
- stringifiedJson: (0, aws_cdk_1.serializeStructure)(obscuredTemplate, true),
109
- stringifiedYaml: (0, aws_cdk_1.serializeStructure)(obscuredTemplate, false),
150
+ stringifiedJson: (0, util_1.serializeStructure)(obscuredTemplate, true),
151
+ stringifiedYaml: (0, util_1.serializeStructure)(obscuredTemplate, false),
110
152
  },
111
153
  }));
112
154
  }
113
155
  else {
114
156
  // 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), private_5.CODES.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.`));
157
+ await ioHost.notify((0, private_6.result)(chalk.green(message), private_6.CODES.CDK_TOOLKIT_I1902, assemblyData));
158
+ await ioHost.notify((0, private_6.info)(`Supply a stack id (${stacks.stackArtifacts.map((s) => chalk.green(s.hierarchicalId)).join(', ')}) to display its template.`));
117
159
  }
118
- return new private_4.IdentityCloudAssemblySource(assembly.assembly);
160
+ return new private_5.IdentityCloudAssemblySource(assembly.assembly);
119
161
  }
120
162
  /**
121
163
  * List Action
@@ -123,14 +165,14 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
123
165
  * List selected stacks and their dependencies
124
166
  */
125
167
  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);
168
+ const ioHost = (0, shared_private_1.withAction)(this.ioHost, 'list');
169
+ const synthTimer = private_6.Timer.start();
170
+ const assembly = await (0, private_1.assemblyFromSource)(cx);
171
+ const stackCollection = await assembly.selectStacksV2(options.stacks ?? private_5.ALL_STACKS);
130
172
  await synthTimer.endAs(ioHost, 'synth');
131
173
  const stacks = stackCollection.withDependencies();
132
174
  const message = stacks.map(s => s.id).join('\n');
133
- await ioHost.notify((0, private_5.result)(message, private_5.CODES.CDK_TOOLKIT_I2901, { stacks }));
175
+ await ioHost.notify(private_6.CODES.CDK_TOOLKIT_I2901.msg(message, { stacks }));
134
176
  return stacks;
135
177
  }
136
178
  /**
@@ -139,30 +181,31 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
139
181
  * Deploys the selected stacks into an AWS account
140
182
  */
141
183
  async deploy(cx, options = {}) {
142
- const assembly = await this.assemblyFromSource(cx);
184
+ const assembly = await (0, private_1.assemblyFromSource)(cx);
143
185
  return this._deploy(assembly, 'deploy', options);
144
186
  }
145
187
  /**
146
188
  * Helper to allow deploy being called as part of the watch action.
147
189
  */
148
190
  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);
191
+ const ioHost = (0, shared_private_1.withAction)(this.ioHost, action);
192
+ const synthTimer = private_6.Timer.start();
193
+ const stackCollection = assembly.selectStacksV2(options.stacks ?? private_5.ALL_STACKS);
152
194
  await this.validateStacksMetadata(stackCollection, ioHost);
153
195
  const synthDuration = await synthTimer.endAs(ioHost, 'synth');
154
196
  if (stackCollection.stackCount === 0) {
155
- await ioHost.notify((0, private_5.error)('This app contains no stacks', private_5.CODES.CDK_TOOLKIT_E5001));
197
+ await ioHost.notify((0, private_6.error)('This app contains no stacks', private_6.CODES.CDK_TOOLKIT_E5001));
198
+ await ioHost.notify(private_6.CODES.CDK_TOOLKIT_E5001.msg('This app contains no stacks'));
156
199
  return;
157
200
  }
158
201
  const deployments = await this.deploymentsForAction('deploy');
159
202
  const migrator = new aws_cdk_1.ResourceMigrator({ deployments, ioHost, action });
160
203
  await migrator.tryMigrateResources(stackCollection, options);
161
204
  const requireApproval = options.requireApproval ?? deploy_1.RequireApproval.NEVER;
162
- const parameterMap = (0, private_1.buildParameterMap)(options.parameters?.parameters);
205
+ const parameterMap = (0, private_2.buildParameterMap)(options.parameters?.parameters);
163
206
  const hotswapMode = options.hotswap ?? aws_cdk_1.HotswapMode.FULL_DEPLOYMENT;
164
207
  if (hotswapMode !== aws_cdk_1.HotswapMode.FULL_DEPLOYMENT) {
165
- await ioHost.notify((0, private_5.warn)([
208
+ await ioHost.notify((0, private_6.warn)([
166
209
  '⚠️ The --hotswap and --hotswap-fallback flags deliberately introduce CloudFormation drift to speed up deployments',
167
210
  '⚠️ They should only be used for development - never use them for your production Stacks!',
168
211
  ].join('\n')));
@@ -187,20 +230,20 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
187
230
  const deployStack = async (stackNode) => {
188
231
  const stack = stackNode.stack;
189
232
  if (stackCollection.stackCount !== 1) {
190
- await ioHost.notify((0, private_5.info)(chalk.bold(stack.displayName)));
233
+ await ioHost.notify((0, private_6.info)(chalk.bold(stack.displayName)));
191
234
  }
192
235
  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.`);
236
+ throw new shared_public_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
237
  }
195
238
  // The generated stack has no resources
196
239
  if (Object.keys(stack.template.Resources || {}).length === 0) {
197
240
  // stack is empty and doesn't exist => do nothing
198
241
  const stackExists = await deployments.stackExists({ stack });
199
242
  if (!stackExists) {
200
- return ioHost.notify((0, private_5.warn)(`${chalk.bold(stack.displayName)}: stack has no resources, skipping deployment.`));
243
+ return ioHost.notify((0, private_6.warn)(`${chalk.bold(stack.displayName)}: stack has no resources, skipping deployment.`));
201
244
  }
202
245
  // 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.`));
246
+ await ioHost.notify((0, private_6.warn)(`${chalk.bold(stack.displayName)}: stack has no resources, deleting existing stack.`));
204
247
  await this._destroy(assembly, 'deploy', {
205
248
  stacks: { patterns: [stack.hierarchicalId], strategy: cloud_assembly_1.StackSelectionStrategy.PATTERN_MUST_MATCH_SINGLE },
206
249
  roleArn: options.roleArn,
@@ -210,12 +253,12 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
210
253
  }
211
254
  if (requireApproval !== deploy_1.RequireApproval.NEVER) {
212
255
  const currentTemplate = await deployments.readCurrentTemplate(stack);
213
- if ((0, private_2.diffRequiresApproval)(currentTemplate, stack, requireApproval)) {
256
+ if ((0, private_3.diffRequiresApproval)(currentTemplate, stack, requireApproval)) {
214
257
  const motivation = '"--require-approval" is enabled and stack includes security-sensitive updates.';
215
258
  const question = `${motivation}\nDo you wish to deploy these changes`;
216
- const confirmed = await ioHost.requestResponse((0, private_5.confirm)(private_5.CODES.CDK_TOOLKIT_I5060, question, motivation, true, concurrency));
259
+ const confirmed = await ioHost.requestResponse((0, private_6.confirm)(private_6.CODES.CDK_TOOLKIT_I5060, question, motivation, true, concurrency));
217
260
  if (!confirmed) {
218
- throw new errors_1.ToolkitError('Aborted by user');
261
+ throw new shared_public_1.ToolkitError('Aborted by user');
219
262
  }
220
263
  }
221
264
  }
@@ -228,13 +271,13 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
228
271
  ? (options.notificationArns ?? []).concat(stack.notificationArns ?? [])
229
272
  : undefined;
230
273
  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`);
274
+ if (!(0, util_1.validateSnsTopicArn)(notificationArn)) {
275
+ throw new shared_public_1.ToolkitError(`Notification arn ${notificationArn} is not a valid arn for an SNS topic`);
233
276
  }
234
277
  }
235
278
  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();
279
+ await ioHost.notify((0, private_6.info)(`${chalk.bold(stack.displayName)}: deploying... [${stackIndex}/${stackCollection.stackCount}]`));
280
+ const deployTimer = private_6.Timer.start();
238
281
  let tags = options.tags;
239
282
  if (!tags || tags.length === 0) {
240
283
  tags = (0, aws_cdk_1.tagsForStack)(stack);
@@ -246,7 +289,7 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
246
289
  let iteration = 0;
247
290
  while (!deployResult) {
248
291
  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');
292
+ throw new shared_public_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
293
  }
251
294
  const r = await deployments.deployStack({
252
295
  stack,
@@ -260,12 +303,10 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
260
303
  force: options.force,
261
304
  parameters: Object.assign({}, parameterMap['*'], parameterMap[stack.stackName]),
262
305
  usePreviousParameters: options.parameters?.keepExistingParameters,
263
- progress,
264
- ci: options.ci,
265
306
  rollback,
266
307
  hotswap: hotswapMode,
267
308
  extraUserAgent: options.extraUserAgent,
268
- hotswapPropertyOverrides: options.hotswapProperties ? (0, private_1.createHotswapPropertyOverrides)(options.hotswapProperties) : undefined,
309
+ hotswapPropertyOverrides: options.hotswapProperties ? (0, private_2.createHotswapPropertyOverrides)(options.hotswapProperties) : undefined,
269
310
  assetParallelism: options.assetParallelism,
270
311
  });
271
312
  switch (r.type) {
@@ -278,12 +319,12 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
278
319
  : `Stack is in a paused fail state (${r.status}) and command line arguments do not include "--no-rollback"`;
279
320
  const question = `${motivation}. Perform a regular deployment`;
280
321
  if (options.force) {
281
- await ioHost.notify((0, private_5.warn)(`${motivation}. Rolling back first (--force).`));
322
+ await ioHost.notify((0, private_6.warn)(`${motivation}. Rolling back first (--force).`));
282
323
  }
283
324
  else {
284
- const confirmed = await ioHost.requestResponse((0, private_5.confirm)(private_5.CODES.CDK_TOOLKIT_I5050, question, motivation, true, concurrency));
325
+ const confirmed = await ioHost.requestResponse((0, private_6.confirm)(private_6.CODES.CDK_TOOLKIT_I5050, question, motivation, true, concurrency));
285
326
  if (!confirmed) {
286
- throw new errors_1.ToolkitError('Aborted by user');
327
+ throw new shared_public_1.ToolkitError('Aborted by user');
287
328
  }
288
329
  }
289
330
  // Perform a rollback
@@ -300,12 +341,12 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
300
341
  const question = `${motivation}. Perform a regular deployment`;
301
342
  // @todo no force here
302
343
  if (options.force) {
303
- await ioHost.notify((0, private_5.warn)(`${motivation}. Proceeding with regular deployment (--force).`));
344
+ await ioHost.notify((0, private_6.warn)(`${motivation}. Proceeding with regular deployment (--force).`));
304
345
  }
305
346
  else {
306
- const confirmed = await ioHost.requestResponse((0, private_5.confirm)(private_5.CODES.CDK_TOOLKIT_I5050, question, motivation, true, concurrency));
347
+ const confirmed = await ioHost.requestResponse((0, private_6.confirm)(private_6.CODES.CDK_TOOLKIT_I5050, question, motivation, true, concurrency));
307
348
  if (!confirmed) {
308
- throw new errors_1.ToolkitError('Aborted by user');
349
+ throw new shared_public_1.ToolkitError('Aborted by user');
309
350
  }
310
351
  }
311
352
  // Go around through the 'while' loop again but switch rollback to true.
@@ -313,13 +354,13 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
313
354
  break;
314
355
  }
315
356
  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`);
357
+ throw new shared_public_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
358
  }
318
359
  }
319
360
  const message = deployResult.noOp
320
361
  ? ` ✅ ${stack.displayName} (no changes)`
321
362
  : ` ✅ ${stack.displayName}`;
322
- await ioHost.notify((0, private_5.result)(chalk.green('\n' + message), private_5.CODES.CDK_TOOLKIT_I5900, deployResult));
363
+ await ioHost.notify((0, private_6.result)(chalk.green('\n' + message), private_6.CODES.CDK_TOOLKIT_I5900, deployResult));
323
364
  deployDuration = await deployTimer.endAs(ioHost, 'deploy');
324
365
  if (Object.keys(deployResult.outputs).length > 0) {
325
366
  const buffer = ['Outputs:'];
@@ -328,14 +369,14 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
328
369
  const value = deployResult.outputs[name];
329
370
  buffer.push(`${chalk.cyan(stack.id)}.${chalk.cyan(name)} = ${chalk.underline(chalk.cyan(value))}`);
330
371
  }
331
- await ioHost.notify((0, private_5.info)(buffer.join('\n')));
372
+ await ioHost.notify((0, private_6.info)(buffer.join('\n')));
332
373
  }
333
- await ioHost.notify((0, private_5.info)(`Stack ARN:\n${deployResult.stackArn}`));
374
+ await ioHost.notify((0, private_6.info)(`Stack ARN:\n${deployResult.stackArn}`));
334
375
  }
335
376
  catch (e) {
336
377
  // It has to be exactly this string because an integration test tests for
337
378
  // "bold(stackname) failed: ResourceNotReady: <error>"
338
- throw new errors_1.ToolkitError([`❌ ${chalk.bold(stack.stackName)} failed:`, ...(e.name ? [`${e.name}:`] : []), e.message].join(' '));
379
+ throw new shared_public_1.ToolkitError([`❌ ${chalk.bold(stack.stackName)} failed:`, ...(e.name ? [`${e.name}:`] : []), e.message].join(' '));
339
380
  }
340
381
  finally {
341
382
  if (options.traceLogs) {
@@ -343,7 +384,7 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
343
384
  const cloudWatchLogMonitor = options.cloudWatchLogMonitor ?? new aws_cdk_1.CloudWatchLogEventMonitor();
344
385
  const foundLogGroupsResult = await (0, aws_cdk_1.findCloudWatchLogGroups)(await this.sdkProvider('deploy'), { ioHost, action }, stack);
345
386
  cloudWatchLogMonitor.addLogGroups(foundLogGroupsResult.env, foundLogGroupsResult.sdk, foundLogGroupsResult.logGroupNames);
346
- await ioHost.notify((0, private_5.info)(`The following log groups are added: ${foundLogGroupsResult.logGroupNames}`, private_5.CODES.CDK_TOOLKIT_I5031));
387
+ await ioHost.notify((0, private_6.info)(`The following log groups are added: ${foundLogGroupsResult.logGroupNames}`, private_6.CODES.CDK_TOOLKIT_I5031));
347
388
  }
348
389
  // If an outputs file has been specified, create the file path and write stack outputs to it once.
349
390
  // Outputs are written after all stacks have been deployed. If a stack deployment fails,
@@ -357,23 +398,19 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
357
398
  }
358
399
  }
359
400
  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`, private_5.CODES.CDK_TOOLKIT_I5001, { duration }));
401
+ await ioHost.notify((0, private_6.info)(`\n✨ Total time: ${(0, util_1.formatTime)(duration)}s\n`, private_6.CODES.CDK_TOOLKIT_I5001, { duration }));
361
402
  };
362
403
  const assetBuildTime = options.assetBuildTime ?? deploy_1.AssetBuildTime.ALL_BEFORE_DEPLOY;
363
404
  const prebuildAssets = assetBuildTime === deploy_1.AssetBuildTime.ALL_BEFORE_DEPLOY;
364
405
  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
406
  const stacksAndTheirAssetManifests = stacks.flatMap((stack) => [
370
407
  stack,
371
- ...stack.dependencies.filter(cxapi.AssetManifestArtifact.isAssetManifestArtifact),
408
+ ...stack.dependencies.filter(x => cxapi.AssetManifestArtifact.isAssetManifestArtifact(x)),
372
409
  ]);
373
410
  const workGraph = new aws_cdk_1.WorkGraphBuilder({ ioHost, action }, prebuildAssets).build(stacksAndTheirAssetManifests);
374
411
  // Unless we are running with '--force', skip already published assets
375
412
  if (!options.force) {
376
- await (0, private_1.removePublishedAssets)(workGraph, deployments, options);
413
+ await (0, private_2.removePublishedAssets)(workGraph, deployments, options);
377
414
  }
378
415
  const graphConcurrency = {
379
416
  'stack': concurrency,
@@ -393,12 +430,12 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
393
430
  * Implies hotswap deployments.
394
431
  */
395
432
  async watch(cx, options) {
396
- const assembly = await this.assemblyFromSource(cx, false);
397
- const ioHost = (0, private_5.withAction)(this.ioHost, 'watch');
433
+ const assembly = await (0, private_1.assemblyFromSource)(cx, false);
434
+ const ioHost = (0, shared_private_1.withAction)(this.ioHost, 'watch');
398
435
  const rootDir = options.watchDir ?? process.cwd();
399
- await ioHost.notify((0, private_5.debug)(`root directory used for 'watch' is: ${rootDir}`));
436
+ await ioHost.notify((0, private_6.debug)(`root directory used for 'watch' is: ${rootDir}`));
400
437
  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. " +
438
+ throw new shared_public_1.ToolkitError("Cannot use the 'watch' command without specifying at least one directory to monitor. " +
402
439
  'Make sure to add a "watch" key to your cdk.json');
403
440
  }
404
441
  // For the "include" subkey under the "watch" key, the behavior is:
@@ -406,11 +443,11 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
406
443
  // 2. "watch" setting without an "include" key? We default to observing "./**".
407
444
  // 3. "watch" setting with an empty "include" key? We default to observing "./**".
408
445
  // 4. Non-empty "include" key? Just use the "include" key.
409
- const watchIncludes = (0, private_3.patternsArrayForWatch)(options.include, {
446
+ const watchIncludes = (0, private_4.patternsArrayForWatch)(options.include, {
410
447
  rootDir,
411
448
  returnRootDirIfEmpty: true,
412
449
  });
413
- await ioHost.notify((0, private_5.debug)(`'include' patterns for 'watch': ${JSON.stringify(watchIncludes)}`));
450
+ await ioHost.notify((0, private_6.debug)(`'include' patterns for 'watch': ${JSON.stringify(watchIncludes)}`));
414
451
  // For the "exclude" subkey under the "watch" key,
415
452
  // the behavior is to add some default excludes in addition to the ones specified by the user:
416
453
  // 1. The CDK output directory.
@@ -418,11 +455,11 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
418
455
  // 3. Any directory's content whose name starts with a dot.
419
456
  // 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
457
  const outdir = options.outdir ?? 'cdk.out';
421
- const watchExcludes = (0, private_3.patternsArrayForWatch)(options.exclude, {
458
+ const watchExcludes = (0, private_4.patternsArrayForWatch)(options.exclude, {
422
459
  rootDir,
423
460
  returnRootDirIfEmpty: false,
424
461
  }).concat(`${outdir}/**`, '**/.*', '**/.*/**', '**/node_modules/**');
425
- await ioHost.notify((0, private_5.debug)(`'exclude' patterns for 'watch': ${JSON.stringify(watchExcludes)}`));
462
+ await ioHost.notify((0, private_6.debug)(`'exclude' patterns for 'watch': ${JSON.stringify(watchExcludes)}`));
426
463
  // Since 'cdk deploy' is a relatively slow operation for a 'watch' process,
427
464
  // introduce a concurrency latch that tracks the state.
428
465
  // This way, if file change events arrive when a 'cdk deploy' is still executing,
@@ -446,7 +483,7 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
446
483
  // TypeScript doesn't realize latch can change between 'awaits',
447
484
  // and thinks the above 'while' condition is always 'false' without the cast
448
485
  latch = 'deploying';
449
- await ioHost.notify((0, private_5.info)("Detected file changes during deployment. Invoking 'cdk deploy' again"));
486
+ await ioHost.notify((0, private_6.info)("Detected file changes during deployment. Invoking 'cdk deploy' again"));
450
487
  await this.invokeDeployFromWatch(assembly, options, cloudWatchLogMonitor);
451
488
  }
452
489
  latch = 'open';
@@ -459,22 +496,22 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
459
496
  })
460
497
  .on('ready', async () => {
461
498
  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'"));
499
+ await ioHost.notify((0, private_6.debug)("'watch' received the 'ready' event. From now on, all file changes will trigger a deployment"));
500
+ await ioHost.notify((0, private_6.info)("Triggering initial 'cdk deploy'"));
464
501
  await deployAndWatch();
465
502
  })
466
503
  .on('all', async (event, filePath) => {
467
504
  if (latch === 'pre-ready') {
468
- await ioHost.notify((0, private_5.info)(`'watch' is observing ${event === 'addDir' ? 'directory' : 'the file'} '${filePath}' for changes`));
505
+ await ioHost.notify((0, private_6.info)(`'watch' is observing ${event === 'addDir' ? 'directory' : 'the file'} '${filePath}' for changes`));
469
506
  }
470
507
  else if (latch === 'open') {
471
- await ioHost.notify((0, private_5.info)(`Detected change to '${filePath}' (type: ${event}). Triggering 'cdk deploy'`));
508
+ await ioHost.notify((0, private_6.info)(`Detected change to '${filePath}' (type: ${event}). Triggering 'cdk deploy'`));
472
509
  await deployAndWatch();
473
510
  }
474
511
  else {
475
512
  // this means latch is either 'deploying' or 'queued'
476
513
  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'`));
514
+ await ioHost.notify((0, private_6.info)(`Detected change to '${filePath}' (type: ${event}) while 'cdk deploy' is still running. Will queue for another deployment after this one finishes'`));
478
515
  }
479
516
  });
480
517
  }
@@ -484,26 +521,26 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
484
521
  * Rolls back the selected stacks.
485
522
  */
486
523
  async rollback(cx, options) {
487
- const assembly = await this.assemblyFromSource(cx);
524
+ const assembly = await (0, private_1.assemblyFromSource)(cx);
488
525
  return this._rollback(assembly, 'rollback', options);
489
526
  }
490
527
  /**
491
528
  * Helper to allow rollback being called as part of the deploy or watch action.
492
529
  */
493
530
  async _rollback(assembly, action, options) {
494
- const ioHost = (0, private_5.withAction)(this.ioHost, action);
495
- const synthTimer = private_5.Timer.start();
531
+ const ioHost = (0, shared_private_1.withAction)(this.ioHost, action);
532
+ const synthTimer = private_6.Timer.start();
496
533
  const stacks = assembly.selectStacksV2(options.stacks);
497
534
  await this.validateStacksMetadata(stacks, ioHost);
498
535
  await synthTimer.endAs(ioHost, 'synth');
499
536
  if (stacks.stackCount === 0) {
500
- await ioHost.notify((0, private_5.error)('No stacks selected', private_5.CODES.CDK_TOOLKIT_E6001));
537
+ await ioHost.notify((0, private_6.error)('No stacks selected', private_6.CODES.CDK_TOOLKIT_E6001));
501
538
  return;
502
539
  }
503
540
  let anyRollbackable = false;
504
541
  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();
542
+ await ioHost.notify((0, private_6.info)(`Rolling back ${chalk.bold(stack.displayName)}`));
543
+ const rollbackTimer = private_6.Timer.start();
507
544
  const deployments = await this.deploymentsForAction('rollback');
508
545
  try {
509
546
  const stackResult = await deployments.rollbackStack({
@@ -520,12 +557,12 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
520
557
  await rollbackTimer.endAs(ioHost, 'rollback');
521
558
  }
522
559
  catch (e) {
523
- await ioHost.notify((0, private_5.error)(`\n ❌ ${chalk.bold(stack.displayName)} failed: ${(0, aws_cdk_1.formatErrorMessage)(e)}`, private_5.CODES.CDK_TOOLKIT_E6900));
524
- throw new errors_1.ToolkitError('Rollback failed (use --force to orphan failing resources)');
560
+ await ioHost.notify((0, private_6.error)(`\n ❌ ${chalk.bold(stack.displayName)} failed: ${(0, util_1.formatErrorMessage)(e)}`, private_6.CODES.CDK_TOOLKIT_E6900));
561
+ throw new shared_public_1.ToolkitError('Rollback failed (use --force to orphan failing resources)');
525
562
  }
526
563
  }
527
564
  if (!anyRollbackable) {
528
- throw new errors_1.ToolkitError('No stacks were in a state that could be rolled back');
565
+ throw new shared_public_1.ToolkitError('No stacks were in a state that could be rolled back');
529
566
  }
530
567
  }
531
568
  /**
@@ -534,40 +571,39 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
534
571
  * Destroys the selected Stacks.
535
572
  */
536
573
  async destroy(cx, options) {
537
- const assembly = await this.assemblyFromSource(cx);
574
+ const assembly = await (0, private_1.assemblyFromSource)(cx);
538
575
  return this._destroy(assembly, 'destroy', options);
539
576
  }
540
577
  /**
541
578
  * Helper to allow destroy being called as part of the deploy action.
542
579
  */
543
580
  async _destroy(assembly, action, options) {
544
- const ioHost = (0, private_5.withAction)(this.ioHost, action);
545
- const synthTimer = private_5.Timer.start();
581
+ const ioHost = (0, shared_private_1.withAction)(this.ioHost, action);
582
+ const synthTimer = private_6.Timer.start();
546
583
  // The stacks will have been ordered for deployment, so reverse them for deletion.
547
584
  const stacks = await assembly.selectStacksV2(options.stacks).reversed();
548
585
  await synthTimer.endAs(ioHost, 'synth');
549
586
  const motivation = 'Destroying stacks is an irreversible action';
550
587
  const question = `Are you sure you want to delete: ${chalk.red(stacks.hierarchicalIds.join(', '))}`;
551
- const confirmed = await ioHost.requestResponse((0, private_5.confirm)(private_5.CODES.CDK_TOOLKIT_I7010, question, motivation, true));
588
+ const confirmed = await ioHost.requestResponse((0, private_6.confirm)(private_6.CODES.CDK_TOOLKIT_I7010, question, motivation, true));
552
589
  if (!confirmed) {
553
- return ioHost.notify((0, private_5.error)('Aborted by user', private_5.CODES.CDK_TOOLKIT_E7010));
590
+ return ioHost.notify((0, private_6.error)('Aborted by user', private_6.CODES.CDK_TOOLKIT_E7010));
554
591
  }
555
- const destroyTimer = private_5.Timer.start();
592
+ const destroyTimer = private_6.Timer.start();
556
593
  try {
557
594
  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}]`));
595
+ await ioHost.notify((0, private_6.success)(`${chalk.blue(stack.displayName)}: destroying... [${index + 1}/${stacks.stackCount}]`));
559
596
  try {
560
597
  const deployments = await this.deploymentsForAction(action);
561
598
  await deployments.destroyStack({
562
599
  stack,
563
600
  deployName: stack.stackName,
564
601
  roleArn: options.roleArn,
565
- ci: options.ci,
566
602
  });
567
- await ioHost.notify((0, private_5.success)(`\n ✅ ${chalk.blue(stack.displayName)}: ${action}ed`));
603
+ await ioHost.notify((0, private_6.success)(`\n ✅ ${chalk.blue(stack.displayName)}: ${action}ed`));
568
604
  }
569
605
  catch (e) {
570
- await ioHost.notify((0, private_5.error)(`\n ❌ ${chalk.blue(stack.displayName)}: ${action} failed ${e}`, private_5.CODES.CDK_TOOLKIT_E7900));
606
+ await ioHost.notify((0, private_6.error)(`\n ❌ ${chalk.blue(stack.displayName)}: ${action} failed ${e}`, private_6.CODES.CDK_TOOLKIT_E7900));
571
607
  throw e;
572
608
  }
573
609
  }
@@ -596,21 +632,6 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
596
632
  data: msg,
597
633
  }));
598
634
  }
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
635
  /**
615
636
  * Create a deployments class
616
637
  */
@@ -641,4 +662,4 @@ class Toolkit extends private_4.CloudAssemblySourceBuilder {
641
662
  }
642
663
  }
643
664
  exports.Toolkit = Toolkit;
644
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvb2xraXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0NBQWtDO0FBQ2xDLHlDQUF5QztBQUN6QywrQkFBK0I7QUFDL0IscUNBQXFDO0FBQ3JDLCtCQUErQjtBQUcvQiw4Q0FBd0Y7QUFDeEYsdURBQWlKO0FBRWpKLHFEQUErRDtBQUsvRCxzREFBaUU7QUFFakUsNENBQTJiO0FBQzNiLDBEQUFxRjtBQUNyRiwyREFBOEo7QUFDOUosMENBQTZDO0FBRTdDLCtDQUFxTTtBQWlFck07O0dBRUc7QUFDSCxNQUFhLE9BQVEsU0FBUSxvQ0FBMEI7SUFZakI7SUFYcEM7O09BRUc7SUFDYSxnQkFBZ0IsQ0FBUztJQUV6Qzs7T0FFRztJQUNhLE1BQU0sQ0FBVTtJQUN4QixZQUFZLENBQWU7SUFFbkMsWUFBb0MsUUFBd0IsRUFBRTtRQUM1RCxLQUFLLEVBQUUsQ0FBQztRQUQwQixVQUFLLEdBQUwsS0FBSyxDQUFxQjtRQUU1RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixJQUFJLG9DQUEwQixDQUFDO1FBRTdFLG9GQUFvRjtRQUNwRixNQUFNLFlBQVksR0FBRyxtQkFBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFDLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLFlBQVksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQWEsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxJQUFJLE1BQU0sR0FBRyxZQUF1QixDQUFDO1FBQ3JDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMzQixNQUFNLEdBQUcsSUFBQSx1QkFBYSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDMUIsTUFBTSxHQUFHLElBQUEsc0JBQVksRUFB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cUJBQVcsQ0FBQyxZQUFZLENBQUM7UUFDNUQsTUFBTSxhQUFhLEdBQTBCO1lBQzNDLEdBQUcsT0FBTztZQUNWLGVBQWUsRUFBRSx3QkFBZSxDQUFDLEtBQUs7WUFDdEMsb0JBQW9CO1lBQ3BCLE9BQU87WUFDUCxjQUFjLEVBQUUscUJBQXFCLE9BQU8sS0FBSyxxQkFBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7U0FDOUYsQ0FBQztRQUVGLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCw2Q0FBNkM7UUFDL0MsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTFzQkQsMEJBMHNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tICdjaG9raWRhcic7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBUb29sa2l0U2VydmljZXMgfSBmcm9tICcuL3ByaXZhdGUnO1xuaW1wb3J0IHsgQXNzZW1ibHlEYXRhLCBTdGFja0FuZEFzc2VtYmx5RGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQXNzZXRCdWlsZFRpbWUsIHR5cGUgRGVwbG95T3B0aW9ucywgUmVxdWlyZUFwcHJvdmFsIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBsb3knO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZERlcGxveU9wdGlvbnMsIGJ1aWxkUGFyYW1ldGVyTWFwLCBjcmVhdGVIb3Rzd2FwUHJvcGVydHlPdmVycmlkZXMsIHJlbW92ZVB1Ymxpc2hlZEFzc2V0cyB9IGZyb20gJy4uL2FjdGlvbnMvZGVwbG95L3ByaXZhdGUnO1xuaW1wb3J0IHsgdHlwZSBEZXN0cm95T3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvZGVzdHJveSc7XG5pbXBvcnQgeyBkaWZmUmVxdWlyZXNBcHByb3ZhbCB9IGZyb20gJy4uL2FjdGlvbnMvZGlmZi9wcml2YXRlJztcbmltcG9ydCB7IHR5cGUgTGlzdE9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL2xpc3QnO1xuaW1wb3J0IHsgdHlwZSBSb2xsYmFja09wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL3JvbGxiYWNrJztcbmltcG9ydCB7IHR5cGUgU3ludGhPcHRpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9zeW50aCc7XG5pbXBvcnQgeyBXYXRjaE9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL3dhdGNoJztcbmltcG9ydCB7IHBhdHRlcm5zQXJyYXlGb3JXYXRjaCB9IGZyb20gJy4uL2FjdGlvbnMvd2F0Y2gvcHJpdmF0ZSc7XG5pbXBvcnQgeyB0eXBlIFNka0NvbmZpZyB9IGZyb20gJy4uL2FwaS9hd3MtYXV0aCc7XG5pbXBvcnQgeyBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRSwgU2RrUHJvdmlkZXIsIFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdCwgU3RhY2tDb2xsZWN0aW9uLCBEZXBsb3ltZW50cywgSG90c3dhcE1vZGUsIFN0YWNrQWN0aXZpdHlQcm9ncmVzcywgUmVzb3VyY2VNaWdyYXRvciwgb2JzY3VyZVRlbXBsYXRlLCBzZXJpYWxpemVTdHJ1Y3R1cmUsIHRhZ3NGb3JTdGFjaywgQ2xpSW9Ib3N0LCB2YWxpZGF0ZVNuc1RvcGljQXJuLCBDb25jdXJyZW5jeSwgV29ya0dyYXBoQnVpbGRlciwgQXNzZXRCdWlsZE5vZGUsIEFzc2V0UHVibGlzaE5vZGUsIFN0YWNrTm9kZSwgZm9ybWF0RXJyb3JNZXNzYWdlLCBDbG91ZFdhdGNoTG9nRXZlbnRNb25pdG9yLCBmaW5kQ2xvdWRXYXRjaExvZ0dyb3VwcywgZm9ybWF0VGltZSwgU3RhY2tEZXRhaWxzIH0gZnJvbSAnLi4vYXBpL2F3cy1jZGsnO1xuaW1wb3J0IHsgSUNsb3VkQXNzZW1ibHlTb3VyY2UsIFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICcuLi9hcGkvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHsgQUxMX1NUQUNLUywgQ2FjaGVkQ2xvdWRBc3NlbWJseVNvdXJjZSwgQ2xvdWRBc3NlbWJseVNvdXJjZUJ1aWxkZXIsIElkZW50aXR5Q2xvdWRBc3NlbWJseVNvdXJjZSwgU3RhY2tBc3NlbWJseSB9IGZyb20gJy4uL2FwaS9jbG91ZC1hc3NlbWJseS9wcml2YXRlJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uL2FwaS9lcnJvcnMnO1xuaW1wb3J0IHsgSUlvSG9zdCwgSW9NZXNzYWdlQ29kZSwgSW9NZXNzYWdlTGV2ZWwgfSBmcm9tICcuLi9hcGkvaW8nO1xuaW1wb3J0IHsgYXNTZGtMb2dnZXIsIHdpdGhBY3Rpb24sIFRpbWVyLCBjb25maXJtLCBlcnJvciwgaW5mbywgc3VjY2Vzcywgd2FybiwgQWN0aW9uQXdhcmVJb0hvc3QsIGRlYnVnLCByZXN1bHQsIHdpdGhvdXRFbW9qaXMsIHdpdGhvdXRDb2xvciwgd2l0aFRyaW1tZWRXaGl0ZXNwYWNlLCBDT0RFUyB9IGZyb20gJy4uL2FwaS9pby9wcml2YXRlJztcblxuLyoqXG4gKiBUaGUgY3VycmVudCBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkIGJ5IHRoZSBDTEkuICdub25lJyByZXByZXNlbnRzIHRoZSBhYnNlbmNlIG9mIGFuIGFjdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgVG9vbGtpdEFjdGlvbiA9XG58ICdhc3NlbWJseSdcbnwgJ2Jvb3RzdHJhcCdcbnwgJ3N5bnRoJ1xufCAnbGlzdCdcbnwgJ2RpZmYnXG58ICdkZXBsb3knXG58ICdyb2xsYmFjaydcbnwgJ3dhdGNoJ1xufCAnZGVzdHJveSdcbnwgJ2RvY3RvcidcbnwgJ2djJ1xufCAnaW1wb3J0J1xufCAnbWV0YWRhdGEnXG58ICdpbml0J1xufCAnbWlncmF0ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbGtpdE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIElvSG9zdCBpbXBsZW1lbnRhdGlvbiwgaGFuZGxpbmcgdGhlIGlubGluZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiB0aGUgVG9vbGtpdCBhbmQgYW4gaW50ZWdyYXRpb24uXG4gICAqL1xuICBpb0hvc3Q/OiBJSW9Ib3N0O1xuXG4gIC8qKlxuICAgKiBBbGxvdyBlbW9qaXMgaW4gbWVzc2FnZXMgc2VudCB0byB0aGUgSW9Ib3N0LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbW9qaXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IEFOU0kgY29sb3JzIGFuZCBmb3JtYXR0aW5nIGluIElvSG9zdCBtZXNzYWdlcy5cbiAgICogU2V0dGluZyB0aGlzIHZhbHVlIHRvIGBmYWxzZWAgZW5mb3JjZXMgdGhhdCBubyBjb2xvciBvciBzdHlsZSBzaG93cyB1cFxuICAgKiBpbiBtZXNzYWdlcyBzZW50IHRvIHRoZSBJb0hvc3QuXG4gICAqIFNldHRpbmcgdGhpcyB2YWx1ZSB0byB0cnVlIGlzIGEgbm8tb3A7IGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGRlZmF1bHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGV0ZWN0cyBjb2xvciBmcm9tIHRoZSBUVFkgc3RhdHVzIG9mIHRoZSBJb0hvc3RcbiAgICovXG4gIGNvbG9yPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgU0RLLlxuICAgKi9cbiAgc2RrQ29uZmlnPzogU2RrQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB0b29sa2l0IHN0YWNrIHRvIGJlIHVzZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiQ0RLVG9vbGtpdFwiXG4gICAqL1xuICB0b29sa2l0U3RhY2tOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGYWlsIENsb3VkIEFzc2VtYmxpZXNcbiAgICpcbiAgICogQGRlZmF1bHQgXCJlcnJvclwiXG4gICAqL1xuICBhc3NlbWJseUZhaWx1cmVBdD86ICdlcnJvcicgfCAnd2FybicgfCAnbm9uZSc7XG59XG5cbi8qKlxuICogVGhlIEFXUyBDREsgUHJvZ3JhbW1hdGljIFRvb2xraXRcbiAqL1xuZXhwb3J0IGNsYXNzIFRvb2xraXQgZXh0ZW5kcyBDbG91ZEFzc2VtYmx5U291cmNlQnVpbGRlciBpbXBsZW1lbnRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBUaGUgdG9vbGtpdCBzdGFjayBuYW1lIHVzZWQgZm9yIGJvb3RzdHJhcHBpbmcgcmVzb3VyY2VzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRvb2xraXRTdGFja05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElvSG9zdCBvZiB0aGlzIFRvb2xraXRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpb0hvc3Q6IElJb0hvc3Q7XG4gIHByaXZhdGUgX3Nka1Byb3ZpZGVyPzogU2RrUHJvdmlkZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IFRvb2xraXRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudG9vbGtpdFN0YWNrTmFtZSA9IHByb3BzLnRvb2xraXRTdGFja05hbWUgPz8gREVGQVVMVF9UT09MS0lUX1NUQUNLX05BTUU7XG5cbiAgICAvLyBIYWNreSB3YXkgdG8gcmUtdXNlIHRoZSBnbG9iYWwgSW9Ib3N0IHVudGlsIHdlIGhhdmUgZnVsbHkgcmVtb3ZlZCB0aGUgbmVlZCBmb3IgaXRcbiAgICBjb25zdCBnbG9iYWxJb0hvc3QgPSBDbGlJb0hvc3QuaW5zdGFuY2UoKTtcbiAgICBpZiAocHJvcHMuaW9Ib3N0KSB7XG4gICAgICBnbG9iYWxJb0hvc3QucmVnaXN0ZXJJb0hvc3QocHJvcHMuaW9Ib3N0IGFzIGFueSk7XG4gICAgfVxuICAgIGxldCBpb0hvc3QgPSBnbG9iYWxJb0hvc3QgYXMgSUlvSG9zdDtcbiAgICBpZiAocHJvcHMuZW1vamlzID09PSBmYWxzZSkge1xuICAgICAgaW9Ib3N0ID0gd2l0aG91dEVtb2ppcyhpb0hvc3QpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuY29sb3IgPT09IGZhbHNlKSB7XG4gICAgICBpb0hvc3QgPSB3aXRob3V0Q29sb3IoaW9Ib3N0KTtcbiAgICB9XG4gICAgLy8gQWZ0ZXIgcmVtb3ZpbmcgZW1vamlzIGFuZCBjb2xvciwgd2UgbWlnaHQgZW5kIHVwIHdpdGggZmxvYXRpbmcgd2hpdGVzcGFjZSBhdCBlaXRoZXIgZW5kIG9mIHRoZSBtZXNzYWdlXG4gICAgLy8gVGhpcyBhbHNvIHJlbW92ZXMgbmV3bGluZXMgdGhhdCB3ZSBjdXJyZW50bHkgZW1pdCBmb3IgQ0xJIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgIHRoaXMuaW9Ib3N0ID0gd2l0aFRyaW1tZWRXaGl0ZXNwYWNlKGlvSG9zdCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBub3RoaW5nIHRvIGRvIHlldFxuICB9XG5cbiAgcHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdG8gdGhlIEFXUyBTREtcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2RrUHJvdmlkZXIoYWN0aW9uOiBUb29sa2l0QWN0aW9uKTogUHJvbWlzZTxTZGtQcm92aWRlcj4ge1xuICAgIC8vIEB0b2RvIHRoaXMgbmVlZHMgdG8gYmUgZGlmZmVyZW50IGluc3RhbmNlIHBlciBhY3Rpb25cbiAgICBpZiAoIXRoaXMuX3Nka1Byb3ZpZGVyKSB7XG4gICAgICB0aGlzLl9zZGtQcm92aWRlciA9IGF3YWl0IFNka1Byb3ZpZGVyLndpdGhBd3NDbGlDb21wYXRpYmxlRGVmYXVsdHMoe1xuICAgICAgICAuLi50aGlzLnByb3BzLnNka0NvbmZpZyxcbiAgICAgICAgbG9nZ2VyOiBhc1Nka0xvZ2dlcih0aGlzLmlvSG9zdCwgYWN0aW9uKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zZGtQcm92aWRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gcHJvdmlkZSB0aGUgQ2xvdWRBc3NlbWJseVNvdXJjZUJ1aWxkZXIgd2l0aCByZXF1aXJlZCB0b29sa2l0IHNlcnZpY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgc291cmNlQnVpbGRlclNlcnZpY2VzKCk6IFByb21pc2U8VG9vbGtpdFNlcnZpY2VzPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlvSG9zdDogd2l0aEFjdGlvbih0aGlzLmlvSG9zdCwgJ2Fzc2VtYmx5JyksXG4gICAgICBzZGtQcm92aWRlcjogYXdhaXQgdGhpcy5zZGtQcm92aWRlcignYXNzZW1ibHknKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoIEFjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN5bnRoKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogU3ludGhPcHRpb25zID0ge30pOiBQcm9taXNlPElDbG91ZEFzc2VtYmx5U291cmNlPiB7XG4gICAgY29uc3QgaW9Ib3N0ID0gd2l0aEFjdGlvbih0aGlzLmlvSG9zdCwgJ3N5bnRoJyk7XG4gICAgY29uc3Qgc3ludGhUaW1lciA9IFRpbWVyLnN0YXJ0KCk7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCB0aGlzLmFzc2VtYmx5RnJvbVNvdXJjZShjeCk7XG4gICAgY29uc3Qgc3RhY2tzID0gYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIob3B0aW9ucy5zdGFja3MgPz8gQUxMX1NUQUNLUyk7XG4gICAgY29uc3QgYXV0b1ZhbGlkYXRlU3RhY2tzID0gb3B0aW9ucy52YWxpZGF0ZVN0YWNrcyA/IFthc3NlbWJseS5zZWxlY3RTdGFja3NGb3JWYWxpZGF0aW9uKCldIDogW107XG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZVN0YWNrc01ldGFkYXRhKHN0YWNrcy5jb25jYXQoLi4uYXV0b1ZhbGlkYXRlU3RhY2tzKSwgaW9Ib3N0KTtcbiAgICBhd2FpdCBzeW50aFRpbWVyLmVuZEFzKGlvSG9zdCwgJ3N5bnRoJyk7XG5cbiAgICAvLyBpZiB3ZSBoYXZlIGEgc2luZ2xlIHN0YWNrLCBwcmludCBpdCB0byBTVERPVVRcbiAgICBjb25zdCBtZXNzYWdlID0gYFN1Y2Nlc3NmdWxseSBzeW50aGVzaXplZCB0byAke2NoYWxrLmJsdWUocGF0aC5yZXNvbHZlKHN0YWNrcy5hc3NlbWJseS5kaXJlY3RvcnkpKX1gO1xuICAgIGNvbnN0IGFzc2VtYmx5RGF0YTogQXNzZW1ibHlEYXRhID0ge1xuICAgICAgYXNzZW1ibHlEaXJlY3Rvcnk6IHN0YWNrcy5hc3NlbWJseS5kaXJlY3RvcnksXG4gICAgICBzdGFja3NDb3VudDogc3RhY2tzLnN0YWNrQ291bnQsXG4gICAgICBzdGFja0lkczogc3RhY2tzLmhpZXJhcmNoaWNhbElkcyxcbiAgICB9O1xuXG4gICAgaWYgKHN0YWNrcy5zdGFja0NvdW50ID09PSAxKSB7XG4gICAgICBjb25zdCBmaXJzdFN0YWNrID0gc3RhY2tzLmZpcnN0U3RhY2shO1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBmaXJzdFN0YWNrLnRlbXBsYXRlO1xuICAgICAgY29uc3Qgb2JzY3VyZWRUZW1wbGF0ZSA9IG9ic2N1cmVUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHJlc3VsdChtZXNzYWdlLCBDT0RFUy5DREtfVE9PTEtJVF9JMTkwMSwge1xuICAgICAgICAuLi5hc3NlbWJseURhdGEsXG4gICAgICAgIHN0YWNrOiB7XG4gICAgICAgICAgc3RhY2tOYW1lOiBmaXJzdFN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICBoaWVyYXJjaGljYWxJZDogZmlyc3RTdGFjay5oaWVyYXJjaGljYWxJZCxcbiAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICBzdHJpbmdpZmllZEpzb246IHNlcmlhbGl6ZVN0cnVjdHVyZShvYnNjdXJlZFRlbXBsYXRlLCB0cnVlKSxcbiAgICAgICAgICBzdHJpbmdpZmllZFlhbWw6IHNlcmlhbGl6ZVN0cnVjdHVyZShvYnNjdXJlZFRlbXBsYXRlLCBmYWxzZSksXG4gICAgICAgIH0sXG4gICAgICB9IGFzIFN0YWNrQW5kQXNzZW1ibHlEYXRhKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vdCBvdXRwdXR0aW5nIHRlbXBsYXRlIHRvIHN0ZG91dCwgbGV0J3MgZXhwbGFpbiB0aGluZ3MgdG8gdGhlIHVzZXIgYSBsaXR0bGUgYml0Li4uXG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHJlc3VsdChjaGFsay5ncmVlbihtZXNzYWdlKSwgQ09ERVMuQ0RLX1RPT0xLSVRfSTE5MDIsIGFzc2VtYmx5RGF0YSkpO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGBTdXBwbHkgYSBzdGFjayBpZCAoJHtzdGFja3Muc3RhY2tBcnRpZmFjdHMubWFwKChzKSA9PiBjaGFsay5ncmVlbihzLmhpZXJhcmNoaWNhbElkKSkuam9pbignLCAnKX0pIHRvIGRpc3BsYXkgaXRzIHRlbXBsYXRlLmApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IElkZW50aXR5Q2xvdWRBc3NlbWJseVNvdXJjZShhc3NlbWJseS5hc3NlbWJseSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBBY3Rpb25cbiAgICpcbiAgICogTGlzdCBzZWxlY3RlZCBzdGFja3MgYW5kIHRoZWlyIGRlcGVuZGVuY2llc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGxpc3QoY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBMaXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTdGFja0RldGFpbHNbXT4ge1xuICAgIGNvbnN0IGlvSG9zdCA9IHdpdGhBY3Rpb24odGhpcy5pb0hvc3QsICdsaXN0Jyk7XG4gICAgY29uc3Qgc3ludGhUaW1lciA9IFRpbWVyLnN0YXJ0KCk7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCB0aGlzLmFzc2VtYmx5RnJvbVNvdXJjZShjeCk7XG4gICAgY29uc3Qgc3RhY2tDb2xsZWN0aW9uID0gYXdhaXQgYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIob3B0aW9ucy5zdGFja3MgPz8gQUxMX1NUQUNLUyk7XG4gICAgYXdhaXQgc3ludGhUaW1lci5lbmRBcyhpb0hvc3QsICdzeW50aCcpO1xuXG4gICAgY29uc3Qgc3RhY2tzID0gc3RhY2tDb2xsZWN0aW9uLndpdGhEZXBlbmRlbmNpZXMoKTtcbiAgICBjb25zdCBtZXNzYWdlID0gc3RhY2tzLm1hcChzID0+IHMuaWQpLmpvaW4oJ1xcbicpO1xuXG4gICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShyZXN1bHQobWVzc2FnZSwgQ09ERVMuQ0RLX1RPT0xLSVRfSTI5MDEsIHsgc3RhY2tzIH0pKTtcbiAgICByZXR1cm4gc3RhY2tzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcGxveSBBY3Rpb25cbiAgICpcbiAgICogRGVwbG95cyB0aGUgc2VsZWN0ZWQgc3RhY2tzIGludG8gYW4gQVdTIGFjY291bnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXBsb3koY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBEZXBsb3lPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhc3NlbWJseSA9IGF3YWl0IHRoaXMuYXNzZW1ibHlGcm9tU291cmNlKGN4KTtcbiAgICByZXR1cm4gdGhpcy5fZGVwbG95KGFzc2VtYmx5LCAnZGVwbG95Jywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIGFsbG93IGRlcGxveSBiZWluZyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgd2F0Y2ggYWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZGVwbG95KGFzc2VtYmx5OiBTdGFja0Fzc2VtYmx5LCBhY3Rpb246ICdkZXBsb3knIHwgJ3dhdGNoJywgb3B0aW9uczogRXh0ZW5kZWREZXBsb3lPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBpb0hvc3QgPSB3aXRoQWN0aW9uKHRoaXMuaW9Ib3N0LCBhY3Rpb24pO1xuICAgIGNvbnN0IHN5bnRoVGltZXIgPSBUaW1lci5zdGFydCgpO1xuICAgIGNvbnN0IHN0YWNrQ29sbGVjdGlvbiA9IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKG9wdGlvbnMuc3RhY2tzID8/IEFMTF9TVEFDS1MpO1xuICAgIGF3YWl0IHRoaXMudmFsaWRhdGVTdGFja3NNZXRhZGF0YShzdGFja0NvbGxlY3Rpb24sIGlvSG9zdCk7XG4gICAgY29uc3Qgc3ludGhEdXJhdGlvbiA9IGF3YWl0IHN5bnRoVGltZXIuZW5kQXMoaW9Ib3N0LCAnc3ludGgnKTtcblxuICAgIGlmIChzdGFja0NvbGxlY3Rpb24uc3RhY2tDb3VudCA9PT0gMCkge1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShlcnJvcignVGhpcyBhcHAgY29udGFpbnMgbm8gc3RhY2tzJywgQ09ERVMuQ0RLX1RPT0xLSVRfRTUwMDEpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZXBsb3ltZW50cyA9IGF3YWl0IHRoaXMuZGVwbG95bWVudHNGb3JBY3Rpb24oJ2RlcGxveScpO1xuICAgIGNvbnN0IG1pZ3JhdG9yID0gbmV3IFJlc291cmNlTWlncmF0b3IoeyBkZXBsb3ltZW50cywgaW9Ib3N0LCBhY3Rpb24gfSk7XG5cbiAgICBhd2FpdCBtaWdyYXRvci50cnlNaWdyYXRlUmVzb3VyY2VzKHN0YWNrQ29sbGVjdGlvbiwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCByZXF1aXJlQXBwcm92YWwgPSBvcHRpb25zLnJlcXVpcmVBcHByb3ZhbCA/PyBSZXF1aXJlQXBwcm92YWwuTkVWRVI7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJNYXAgPSBidWlsZFBhcmFtZXRlck1hcChvcHRpb25zLnBhcmFtZXRlcnM/LnBhcmFtZXRlcnMpO1xuXG4gICAgY29uc3QgaG90c3dhcE1vZGUgPSBvcHRpb25zLmhvdHN3YXAgPz8gSG90c3dhcE1vZGUuRlVMTF9ERVBMT1lNRU5UO1xuICAgIGlmIChob3Rzd2FwTW9kZSAhPT0gSG90c3dhcE1vZGUuRlVMTF9ERVBMT1lNRU5UKSB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHdhcm4oW1xuICAgICAgICAn4pqg77iPIFRoZSAtLWhvdHN3YXAgYW5kIC0taG90c3dhcC1mYWxsYmFjayBmbGFncyBkZWxpYmVyYXRlbHkgaW50cm9kdWNlIENsb3VkRm9ybWF0aW9uIGRyaWZ0IHRvIHNwZWVkIHVwIGRlcGxveW1lbnRzJyxcbiAgICAgICAgJ+KaoO+4jyBUaGV5IHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRldmVsb3BtZW50IC0gbmV2ZXIgdXNlIHRoZW0gZm9yIHlvdXIgcHJvZHVjdGlvbiBTdGFja3MhJyxcbiAgICAgIF0uam9pbignXFxuJykpKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFja3MgPSBzdGFja0NvbGxlY3Rpb24uc3RhY2tBcnRpZmFjdHM7XG4gICAgY29uc3Qgc3RhY2tPdXRwdXRzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgY29uc3Qgb3V0cHV0c0ZpbGUgPSBvcHRpb25zLm91dHB1dHNGaWxlO1xuXG4gICAgY29uc3QgYnVpbGRBc3NldCA9IGFzeW5jIChhc3NldE5vZGU6IEFzc2V0QnVpbGROb2RlKSA9PiB7XG4gICAgICBhd2FpdCBkZXBsb3ltZW50cy5idWlsZFNpbmdsZUFzc2V0KFxuICAgICAgICBhc3NldE5vZGUuYXNzZXRNYW5pZmVzdEFydGlmYWN0LFxuICAgICAgICBhc3NldE5vZGUuYXNzZXRNYW5pZmVzdCxcbiAgICAgICAgYXNzZXROb2RlLmFzc2V0LFxuICAgICAgICB7XG4gICAgICAgICAgc3RhY2s6IGFzc2V0Tm9kZS5wYXJlbnRTdGFjayxcbiAgICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgICAgc3RhY2tOYW1lOiBhc3NldE5vZGUucGFyZW50U3RhY2suc3RhY2tOYW1lLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcHVibGlzaEFzc2V0ID0gYXN5bmMgKGFzc2V0Tm9kZTogQXNzZXRQdWJsaXNoTm9kZSkgPT4ge1xuICAgICAgYXdhaXQgZGVwbG95bWVudHMucHVibGlzaFNpbmdsZUFzc2V0KGFzc2V0Tm9kZS5hc3NldE1hbmlmZXN0LCBhc3NldE5vZGUuYXNzZXQsIHtcbiAgICAgICAgc3RhY2s6IGFzc2V0Tm9kZS5wYXJlbnRTdGFjayxcbiAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICBzdGFja05hbWU6IGFzc2V0Tm9kZS5wYXJlbnRTdGFjay5zdGFja05hbWUsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGVwbG95U3RhY2sgPSBhc3luYyAoc3RhY2tOb2RlOiBTdGFja05vZGUpID0+IHtcbiAgICAgIGNvbnN0IHN0YWNrID0gc3RhY2tOb2RlLnN0YWNrO1xuICAgICAgaWYgKHN0YWNrQ29sbGVjdGlvbi5zdGFja0NvdW50ICE9PSAxKSB7XG4gICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoaW5mbyhjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXN0YWNrLmVudmlyb25tZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICAgYFN0YWNrICR7c3RhY2suZGlzcGxheU5hbWV9IGRvZXMgbm90IGRlZmluZSBhbiBlbnZpcm9ubWVudCwgYW5kIEFXUyBjcmVkZW50aWFscyBjb3VsZCBub3QgYmUgb2J0YWluZWQgZnJvbSBzdGFuZGFyZCBsb2NhdGlvbnMgb3Igbm8gcmVnaW9uIHdhcyBjb25maWd1cmVkLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBnZW5lcmF0ZWQgc3RhY2sgaGFzIG5vIHJlc291cmNlc1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHN0YWNrLnRlbXBsYXRlLlJlc291cmNlcyB8fCB7fSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIHN0YWNrIGlzIGVtcHR5IGFuZCBkb2Vzbid0IGV4aXN0ID0+IGRvIG5vdGhpbmdcbiAgICAgICAgY29uc3Qgc3RhY2tFeGlzdHMgPSBhd2FpdCBkZXBsb3ltZW50cy5zdGFja0V4aXN0cyh7IHN0YWNrIH0pO1xuICAgICAgICBpZiAoIXN0YWNrRXhpc3RzKSB7XG4gICAgICAgICAgcmV0dXJuIGlvSG9zdC5ub3RpZnkod2FybihgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX06IHN0YWNrIGhhcyBubyByZXNvdXJjZXMsIHNraXBwaW5nIGRlcGxveW1lbnQuYCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3RhY2sgaXMgZW1wdHksIGJ1dCBleGlzdHMgPT4gZGVsZXRlXG4gICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkod2FybihgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX06IHN0YWNrIGhhcyBubyByZXNvdXJjZXMsIGRlbGV0aW5nIGV4aXN0aW5nIHN0YWNrLmApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fZGVzdHJveShhc3NlbWJseSwgJ2RlcGxveScsIHtcbiAgICAgICAgICBzdGFja3M6IHsgcGF0dGVybnM6IFtzdGFjay5oaWVyYXJjaGljYWxJZF0sIHN0cmF0ZWd5OiBTdGFja1NlbGVjdGlvblN0cmF0ZWd5LlBBVFRFUk5fTVVTVF9NQVRDSF9TSU5HTEUgfSxcbiAgICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgICAgY2k6IG9wdGlvbnMuY2ksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlcXVpcmVBcHByb3ZhbCAhPT0gUmVxdWlyZUFwcHJvdmFsLk5FVkVSKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUZW1wbGF0ZSA9IGF3YWl0IGRlcGxveW1lbnRzLnJlYWRDdXJyZW50VGVtcGxhdGUoc3RhY2spO1xuICAgICAgICBpZiAoZGlmZlJlcXVpcmVzQXBwcm92YWwoY3VycmVudFRlbXBsYXRlLCBzdGFjaywgcmVxdWlyZUFwcHJvdmFsKSkge1xuICAgICAgICAgIGNvbnN0IG1vdGl2YXRpb24gPSAnXCItLXJlcXVpcmUtYXBwcm92YWxcIiBpcyBlbmFibGVkIGFuZCBzdGFjayBpbmNsdWRlcyBzZWN1cml0eS1zZW5zaXRpdmUgdXBkYXRlcy4nO1xuICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gYCR7bW90aXZhdGlvbn1cXG5EbyB5b3Ugd2lzaCB0byBkZXBsb3kgdGhlc2UgY2hhbmdlc2A7XG4gICAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgaW9Ib3N0LnJlcXVlc3RSZXNwb25zZShjb25maXJtKENPREVTLkNES19UT09MS0lUX0k1MDYwLCBxdWVzdGlvbiwgbW90aXZhdGlvbiwgdHJ1ZSwgY29uY3VycmVuY3kpKTtcbiAgICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQWJvcnRlZCBieSB1c2VyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHNhbWUgc2VtYW50aWNzIHdlIGFwcGx5IHdpdGggcmVzcGVjdCB0byBOb3RpZmljYXRpb24gQVJOcyAoZGljdGF0ZWQgYnkgdGhlIFNESylcbiAgICAgIC8vXG4gICAgICAvLyAgLSB1bmRlZmluZWQgID0+ICBjZGsgaWdub3JlcyBpdCwgYXMgaWYgaXQgd2Fzbid0IHN1cHBvcnRlZCAoYWxsb3dzIGV4dGVybmFsIG1hbmFnZW1lbnQpLlxuICAgICAgLy8gIC0gW106ICAgICAgICA9PiAgY2RrIG1hbmFnZXMgaXQsIGFuZCB0aGUgdXNlciB3YW50cyB0byB3aXBlIGl0IG91dC5cbiAgICAgIC8vICAtIFsnYXJuLTEnXSAgPT4gIGNkayBtYW5hZ2VzIGl0LCBhbmQgdGhlIHVzZXIgd2FudHMgdG8gc2V0IGl0IHRvIFsnYXJuLTEnXS5cbiAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbkFybnMgPSAoISFvcHRpb25zLm5vdGlmaWNhdGlvbkFybnMgfHwgISFzdGFjay5ub3RpZmljYXRpb25Bcm5zKVxuICAgICAgICA/IChvcHRpb25zLm5vdGlmaWNhdGlvbkFybnMgPz8gW10pLmNvbmNhdChzdGFjay5ub3RpZmljYXRpb25Bcm5zID8/IFtdKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgZm9yIChjb25zdCBub3RpZmljYXRpb25Bcm4gb2Ygbm90aWZpY2F0aW9uQXJucyA/PyBbXSkge1xuICAgICAgICBpZiAoIXZhbGlkYXRlU25zVG9waWNBcm4obm90aWZpY2F0aW9uQXJuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYE5vdGlmaWNhdGlvbiBhcm4gJHtub3RpZmljYXRpb25Bcm59IGlzIG5vdCBhIHZhbGlkIGFybiBmb3IgYW4gU05TIHRvcGljYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhY2tJbmRleCA9IHN0YWNrcy5pbmRleE9mKHN0YWNrKSArIDE7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KFxuICAgICAgICBpbmZvKGAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfTogZGVwbG95aW5nLi4uIFske3N0YWNrSW5kZXh9LyR7c3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnR9XWApLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRlcGxveVRpbWVyID0gVGltZXIuc3RhcnQoKTtcblxuICAgICAgbGV0IHRhZ3MgPSBvcHRpb25zLnRhZ3M7XG4gICAgICBpZiAoIXRhZ3MgfHwgdGFncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGFncyA9IHRhZ3NGb3JTdGFjayhzdGFjayk7XG4gICAgICB9XG5cbiAgICAgIGxldCBkZXBsb3lEdXJhdGlvbjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBkZXBsb3lSZXN1bHQ6IFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdCB8IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgcm9sbGJhY2sgPSBvcHRpb25zLnJvbGxiYWNrO1xuICAgICAgICBsZXQgaXRlcmF0aW9uID0gMDtcbiAgICAgICAgd2hpbGUgKCFkZXBsb3lSZXN1bHQpIHtcbiAgICAgICAgICBpZiAoKytpdGVyYXRpb24gPiAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdUaGlzIGxvb3Agc2hvdWxkIGhhdmUgc3RhYmlsaXplZCBpbiAyIGl0ZXJhdGlvbnMsIGJ1dCBkaWRuXFwndC4gSWYgeW91IGFyZSBzZWVpbmcgdGhpcyBlcnJvciwgcGxlYXNlIHJlcG9ydCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzL25ldy9jaG9vc2UnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByID0gYXdhaXQgZGVwbG95bWVudHMuZGVwbG95U3RhY2soe1xuICAgICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgICBkZXBsb3lOYW1lOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgICAgICB0b29sa2l0U3RhY2tOYW1lOiB0aGlzLnRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICAgICByZXVzZUFzc2V0czogb3B0aW9ucy5yZXVzZUFzc2V0cyxcbiAgICAgICAgICAgIG5vdGlmaWNhdGlvbkFybnMsXG4gICAgICAgICAgICB0YWdzLFxuICAgICAgICAgICAgZGVwbG95bWVudE1ldGhvZDogb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kLFxuICAgICAgICAgICAgZm9yY2U6IG9wdGlvbnMuZm9yY2UsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBPYmplY3QuYXNzaWduKHt9LCBwYXJhbWV0ZXJNYXBbJyonXSwgcGFyYW1ldGVyTWFwW3N0YWNrLnN0YWNrTmFtZV0pLFxuICAgICAgICAgICAgdXNlUHJldmlvdXNQYXJhbWV0ZXJzOiBvcHRpb25zLnBhcmFtZXRlcnM/LmtlZXBFeGlzdGluZ1BhcmFtZXRlcnMsXG4gICAgICAgICAgICBwcm9ncmVzcyxcbiAgICAgICAgICAgIGNpOiBvcHRpb25zLmNpLFxuICAgICAgICAgICAgcm9sbGJhY2ssXG4gICAgICAgICAgICBob3Rzd2FwOiBob3Rzd2FwTW9kZSxcbiAgICAgICAgICAgIGV4dHJhVXNlckFnZW50OiBvcHRpb25zLmV4dHJhVXNlckFnZW50LFxuICAgICAgICAgICAgaG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzOiBvcHRpb25zLmhvdHN3YXBQcm9wZXJ0aWVzID8gY3JlYXRlSG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzKG9wdGlvbnMuaG90c3dhcFByb3BlcnRpZXMpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXNzZXRQYXJhbGxlbGlzbTogb3B0aW9ucy5hc3NldFBhcmFsbGVsaXNtLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgc3dpdGNoIChyLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RpZC1kZXBsb3ktc3RhY2snOlxuICAgICAgICAgICAgICBkZXBsb3lSZXN1bHQgPSByO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnZmFpbHBhdXNlZC1uZWVkLXJvbGxiYWNrLWZpcnN0Jzoge1xuICAgICAgICAgICAgICBjb25zdCBtb3RpdmF0aW9uID0gci5yZWFzb24gPT09ICdyZXBsYWNlbWVudCdcbiAgICAgICAgICAgICAgICA/IGBTdGFjayBpcyBpbiBhIHBhdXNlZCBmYWlsIHN0YXRlICgke3Iuc3RhdHVzfSkgYW5kIGNoYW5nZSBpbmNsdWRlcyBhIHJlcGxhY2VtZW50IHdoaWNoIGNhbm5vdCBiZSBkZXBsb3llZCB3aXRoIFwiLS1uby1yb2xsYmFja1wiYFxuICAgICAgICAgICAgICAgIDogYFN0YWNrIGlzIGluIGEgcGF1c2VkIGZhaWwgc3RhdGUgKCR7ci5zdGF0dXN9KSBhbmQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBkbyBub3QgaW5jbHVkZSBcIi0tbm8tcm9sbGJhY2tcImA7XG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gYCR7bW90aXZhdGlvbn0uIFBlcmZvcm0gYSByZWd1bGFyIGRlcGxveW1lbnRgO1xuXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcmNlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh3YXJuKGAke21vdGl2YXRpb259LiBSb2xsaW5nIGJhY2sgZmlyc3QgKC0tZm9yY2UpLmApKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKGNvbmZpcm0oQ09ERVMuQ0RLX1RPT0xLSVRfSTUwNTAsIHF1ZXN0aW9uLCBtb3RpdmF0aW9uLCB0cnVlLCBjb25jdXJyZW5jeSkpO1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdBYm9ydGVkIGJ5IHVzZXInKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBQZXJmb3JtIGEgcm9sbGJhY2tcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcm9sbGJhY2soYXNzZW1ibHksIGFjdGlvbiwge1xuICAgICAgICAgICAgICAgIHN0YWNrczogeyBwYXR0ZXJuczogW3N0YWNrLmhpZXJhcmNoaWNhbElkXSwgc3RyYXRlZ3k6IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuUEFUVEVSTl9NVVNUX01BVENIX1NJTkdMRSB9LFxuICAgICAgICAgICAgICAgIG9ycGhhbkZhaWxlZFJlc291cmNlczogb3B0aW9ucy5mb3JjZSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgLy8gR28gYXJvdW5kIHRocm91Z2ggdGhlICd3aGlsZScgbG9vcCBhZ2FpbiBidXQgc3dpdGNoIHJvbGxiYWNrIHRvIHRydWUuXG4gICAgICAgICAgICAgIHJvbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ3JlcGxhY2VtZW50LXJlcXVpcmVzLXJvbGxiYWNrJzoge1xuICAgICAgICAgICAgICBjb25zdCBtb3RpdmF0aW9uID0gJ0NoYW5nZSBpbmNsdWRlcyBhIHJlcGxhY2VtZW50IHdoaWNoIGNhbm5vdCBiZSBkZXBsb3llZCB3aXRoIFwiLS1uby1yb2xsYmFja1wiJztcbiAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb24gPSBgJHttb3RpdmF0aW9ufS4gUGVyZm9ybSBhIHJlZ3VsYXIgZGVwbG95bWVudGA7XG5cbiAgICAgICAgICAgICAgLy8gQHRvZG8gbm8gZm9yY2UgaGVyZVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb3JjZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkod2FybihgJHttb3RpdmF0aW9ufS4gUHJvY2VlZGluZyB3aXRoIHJlZ3VsYXIgZGVwbG95bWVudCAoLS1mb3JjZSkuYCkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGlvSG9zdC5yZXF1ZXN0UmVzcG9uc2UoY29uZmlybShDT0RFUy5DREtfVE9PTEtJVF9JNTA1MCwgcXVlc3Rpb24sIG1vdGl2YXRpb24sIHRydWUsIGNvbmN1cnJlbmN5KSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0Fib3J0ZWQgYnkgdXNlcicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIEdvIGFyb3VuZCB0aHJvdWdoIHRoZSAnd2hpbGUnIGxvb3AgYWdhaW4gYnV0IHN3aXRjaCByb2xsYmFjayB0byB0cnVlLlxuICAgICAgICAgICAgICByb2xsYmFjayA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBVbmV4cGVjdGVkIHJlc3VsdCB0eXBlIGZyb20gZGVwbG95U3RhY2s6ICR7SlNPTi5zdHJpbmdpZnkocil9LiBJZiB5b3UgYXJlIHNlZWluZyB0aGlzIGVycm9yLCBwbGVhc2UgcmVwb3J0IGl0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvbmV3L2Nob29zZWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkZXBsb3lSZXN1bHQubm9PcFxuICAgICAgICAgID8gYCDinIUgICR7c3RhY2suZGlzcGxheU5hbWV9IChubyBjaGFuZ2VzKWBcbiAgICAgICAgICA6IGAg4pyFICAke3N0YWNrLmRpc3BsYXlOYW1lfWA7XG5cbiAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShyZXN1bHQoY2hhbGsuZ3JlZW4oJ1xcbicgKyBtZXNzYWdlKSwgQ09ERVMuQ0RLX1RPT0xLSVRfSTU5MDAsIGRlcGxveVJlc3VsdCkpO1xuICAgICAgICBkZXBsb3lEdXJhdGlvbiA9IGF3YWl0IGRlcGxveVRpbWVyLmVuZEFzKGlvSG9zdCwgJ2RlcGxveScpO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkZXBsb3lSZXN1bHQub3V0cHV0cykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IFsnT3V0cHV0czonXTtcbiAgICAgICAgICBzdGFja091dHB1dHNbc3RhY2suc3RhY2tOYW1lXSA9IGRlcGxveVJlc3VsdC5vdXRwdXRzO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRlcGxveVJlc3VsdC5vdXRwdXRzKS5zb3J0KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGVwbG95UmVzdWx0Lm91dHB1dHNbbmFtZV07XG4gICAgICAgICAgICBidWZmZXIucHVzaChgJHtjaGFsay5jeWFuKHN0YWNrLmlkKX0uJHtjaGFsay5jeWFuKG5hbWUpfSA9ICR7Y2hhbGsudW5kZXJsaW5lKGNoYWxrLmN5YW4odmFsdWUpKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGJ1ZmZlci5qb2luKCdcXG4nKSkpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoaW5mbyhgU3RhY2sgQVJOOlxcbiR7ZGVwbG95UmVzdWx0LnN0YWNrQXJufWApKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAvLyBJdCBoYXMgdG8gYmUgZXhhY3RseSB0aGlzIHN0cmluZyBiZWNhdXNlIGFuIGludGVncmF0aW9uIHRlc3QgdGVzdHMgZm9yXG4gICAgICAgIC8vIFwiYm9sZChzdGFja25hbWUpIGZhaWxlZDogUmVzb3VyY2VOb3RSZWFkeTogPGVycm9yPlwiXG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICAgW2DinYwgICR7Y2hhbGsuYm9sZChzdGFjay5zdGFja05hbWUpfSBmYWlsZWQ6YCwgLi4uKGUubmFtZSA/IFtgJHtlLm5hbWV9OmBdIDogW10pLCBlLm1lc3NhZ2VdLmpvaW4oJyAnKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChvcHRpb25zLnRyYWNlTG9ncykge1xuICAgICAgICAgIC8vIGRlcGxveSBjYWxscyB0aGF0IG9yaWdpbmF0ZSBmcm9tIHdhdGNoIHdpbGwgY29tZSB3aXRoIHRoZWlyIG93biBjbG91ZFdhdGNoTG9nTW9uaXRvclxuICAgICAgICAgIGNvbnN0IGNsb3VkV2F0Y2hMb2dNb25pdG9yID0gb3B0aW9ucy5jbG91ZFdhdGNoTG9nTW9uaXRvciA/PyBuZXcgQ2xvdWRXYXRjaExvZ0V2ZW50TW9uaXRvcigpO1xuICAgICAgICAgIGNvbnN0IGZvdW5kTG9nR3JvdXBzUmVzdWx0ID0gYXdhaXQgZmluZENsb3VkV2F0Y2hMb2dHcm91cHMoYXdhaXQgdGhpcy5zZGtQcm92aWRlcignZGVwbG95JyksIHsgaW9Ib3N0LCBhY3Rpb24gfSwgc3RhY2spO1xuICAgICAgICAgIGNsb3VkV2F0Y2hMb2dNb25pdG9yLmFkZExvZ0dyb3VwcyhcbiAgICAgICAgICAgIGZvdW5kTG9nR3JvdXBzUmVzdWx0LmVudixcbiAgICAgICAgICAgIGZvdW5kTG9nR3JvdXBzUmVzdWx0LnNkayxcbiAgICAgICAgICAgIGZvdW5kTG9nR3JvdXBzUmVzdWx0LmxvZ0dyb3VwTmFtZXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGluZm8oYFRoZSBmb2xsb3dpbmcgbG9nIGdyb3VwcyBhcmUgYWRkZWQ6ICR7Zm91bmRMb2dHcm91cHNSZXN1bHQubG9nR3JvdXBOYW1lc31gLCBDT0RFUy5DREtfVE9PTEtJVF9JNTAzMSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgYW4gb3V0cHV0cyBmaWxlIGhhcyBiZWVuIHNwZWNpZmllZCwgY3JlYXRlIHRoZSBmaWxlIHBhdGggYW5kIHdyaXRlIHN0YWNrIG91dHB1dHMgdG8gaXQgb25jZS5cbiAgICAgICAgLy8gT3V0cHV0cyBhcmUgd3JpdHRlbiBhZnRlciBhbGwgc3RhY2tzIGhhdmUgYmVlbiBkZXBsb3llZC4gSWYgYSBzdGFjayBkZXBsb3ltZW50IGZhaWxzLFxuICAgICAgICAvLyBhbGwgb2YgdGhlIG91dHB1dHMgZnJvbSBzdWNjZXNzZnVsbHkgZGVwbG95ZWQgc3RhY2tzIGJlZm9yZSB0aGUgZmFpbHVyZSB3aWxsIHN0aWxsIGJlIHdyaXR0ZW4uXG4gICAgICAgIGlmIChvdXRwdXRzRmlsZSkge1xuICAgICAgICAgIGZzLmVuc3VyZUZpbGVTeW5jKG91dHB1dHNGaWxlKTtcbiAgICAgICAgICBhd2FpdCBmcy53cml0ZUpzb24ob3V0cHV0c0ZpbGUsIHN0YWNrT3V0cHV0cywge1xuICAgICAgICAgICAgc3BhY2VzOiAyLFxuICAgICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZHVyYXRpb24gPSBzeW50aER1cmF0aW9uLmFzTXMgKyAoZGVwbG95RHVyYXRpb24/LmFzTXMgPz8gMCk7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGluZm8oYFxcbuKcqCAgVG90YWwgdGltZTogJHtmb3JtYXRUaW1lKGR1cmF0aW9uKX1zXFxuYCwgQ09ERVMuQ0RLX1RPT0xLSVRfSTUwMDEsIHsgZHVyYXRpb24gfSkpO1xuICAgIH07XG5cbiAgICBjb25zdCBhc3NldEJ1aWxkVGltZSA9IG9wdGlvbnMuYXNzZXRCdWlsZFRpbWUgPz8gQXNzZXRCdWlsZFRpbWUuQUxMX0JFRk9SRV9ERVBMT1k7XG4gICAgY29uc3QgcHJlYnVpbGRBc3NldHMgPSBhc3NldEJ1aWxkVGltZSA9PT0gQXNzZXRCdWlsZFRpbWUuQUxMX0JFRk9SRV9ERVBMT1k7XG4gICAgY29uc3QgY29uY3VycmVuY3kgPSBvcHRpb25zLmNvbmN1cnJlbmN5IHx8IDE7XG4gICAgY29uc3QgcHJvZ3Jlc3MgPSBjb25jdXJyZW5jeSA+IDEgPyBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuRVZFTlRTIDogb3B0aW9ucy5wcm9ncmVzcztcbiAgICBpZiAoY29uY3VycmVuY3kgPiAxICYmIG9wdGlvbnMucHJvZ3Jlc3MgJiYgb3B0aW9ucy5wcm9ncmVzcyAhPSBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuRVZFTlRTKSB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHdhcm4oJ+KaoO+4jyBUaGUgLS1jb25jdXJyZW5jeSBmbGFnIG9ubHkgc3VwcG9ydHMgLS1wcm9ncmVzcyBcImV2ZW50c1wiLiBTd2l0Y2hpbmcgdG8gXCJldmVudHNcIi4nKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhY2tzQW5kVGhlaXJBc3NldE1hbmlmZXN0cyA9IHN0YWNrcy5mbGF0TWFwKChzdGFjaykgPT4gW1xuICAgICAgc3RhY2ssXG4gICAgICAuLi5zdGFjay5kZXBlbmRlbmNpZXMuZmlsdGVyKGN4YXBpLkFzc2V0TWFuaWZlc3RBcnRpZmFjdC5pc0Fzc2V0TWFuaWZlc3RBcnRpZmFjdCksXG4gICAgXSk7XG4gICAgY29uc3Qgd29ya0dyYXBoID0gbmV3IFdvcmtHcmFwaEJ1aWxkZXIoeyBpb0hvc3QsIGFjdGlvbiB9LCBwcmVidWlsZEFzc2V0cykuYnVpbGQoc3RhY2tzQW5kVGhlaXJBc3NldE1hbmlmZXN0cyk7XG5cbiAgICAvLyBVbmxlc3Mgd2UgYXJlIHJ1bm5pbmcgd2l0aCAnLS1mb3JjZScsIHNraXAgYWxyZWFkeSBwdWJsaXNoZWQgYXNzZXRzXG4gICAgaWYgKCFvcHRpb25zLmZvcmNlKSB7XG4gICAgICBhd2FpdCByZW1vdmVQdWJsaXNoZWRBc3NldHMod29ya0dyYXBoLCBkZXBsb3ltZW50cywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgZ3JhcGhDb25jdXJyZW5jeTogQ29uY3VycmVuY3kgPSB7XG4gICAgICAnc3RhY2snOiBjb25jdXJyZW5jeSxcbiAgICAgICdhc3NldC1idWlsZCc6IDEsIC8vIFRoaXMgd2lsbCBiZSBDUFUtYm91bmQvbWVtb3J5IGJvdW5kLCBtb3N0bHkgbWF0dGVycyBmb3IgRG9ja2VyIGJ1aWxkc1xuICAgICAgJ2Fzc2V0LXB1Ymxpc2gnOiAob3B0aW9ucy5hc3NldFBhcmFsbGVsaXNtID8/IHRydWUpID8gOCA6IDEsIC8vIFRoaXMgd2lsbCBiZSBJL08tYm91bmQsIDggaW4gcGFyYWxsZWwgc2VlbXMgcmVhc29uYWJsZVxuICAgIH07XG5cbiAgICBhd2FpdCB3b3JrR3JhcGguZG9QYXJhbGxlbChncmFwaENvbmN1cnJlbmN5LCB7XG4gICAgICBkZXBsb3lTdGFjayxcbiAgICAgIGJ1aWxkQXNzZXQsXG4gICAgICBwdWJsaXNoQXNzZXQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2ggQWN0aW9uXG4gICAqXG4gICAqIENvbnRpbnVvdXNseSBvYnNlcnZlIHByb2plY3QgZmlsZXMgYW5kIGRlcGxveSB0aGUgc2VsZWN0ZWQgc3RhY2tzIGF1dG9tYXRpY2FsbHkgd2hlbiBjaGFuZ2VzIGFyZSBkZXRlY3RlZC5cbiAgICogSW1wbGllcyBob3Rzd2FwIGRlcGxveW1lbnRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdhdGNoKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogV2F0Y2hPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCB0aGlzLmFzc2VtYmx5RnJvbVNvdXJjZShjeCwgZmFsc2UpO1xuICAgIGNvbnN0IGlvSG9zdCA9IHdpdGhBY3Rpb24odGhpcy5pb0hvc3QsICd3YXRjaCcpO1xuICAgIGNvbnN0IHJvb3REaXIgPSBvcHRpb25zLndhdGNoRGlyID8/IHByb2Nlc3MuY3dkKCk7XG4gICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShkZWJ1Zyhgcm9vdCBkaXJlY3RvcnkgdXNlZCBmb3IgJ3dhdGNoJyBpczogJHtyb290RGlyfWApKTtcblxuICAgIGlmIChvcHRpb25zLmluY2x1ZGUgPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmV4Y2x1ZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgdXNlIHRoZSAnd2F0Y2gnIGNvbW1hbmQgd2l0aG91dCBzcGVjaWZ5aW5nIGF0IGxlYXN0IG9uZSBkaXJlY3RvcnkgdG8gbW9uaXRvci4gXCIgK1xuICAgICAgICAgICdNYWtlIHN1cmUgdG8gYWRkIGEgXCJ3YXRjaFwiIGtleSB0byB5b3VyIGNkay5qc29uJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRm9yIHRoZSBcImluY2x1ZGVcIiBzdWJrZXkgdW5kZXIgdGhlIFwid2F0Y2hcIiBrZXksIHRoZSBiZWhhdmlvciBpczpcbiAgICAvLyAxLiBObyBcIndhdGNoXCIgc2V0dGluZz8gV2UgZXJyb3Igb3V0LlxuICAgIC8vIDIuIFwid2F0Y2hcIiBzZXR0aW5nIHdpdGhvdXQgYW4gXCJpbmNsdWRlXCIga2V5PyBXZSBkZWZhdWx0IHRvIG9ic2VydmluZyBcIi4vKipcIi5cbiAgICAvLyAzLiBcIndhdGNoXCIgc2V0dGluZyB3aXRoIGFuIGVtcHR5IFwiaW5jbHVkZVwiIGtleT8gV2UgZGVmYXVsdCB0byBvYnNlcnZpbmcgXCIuLyoqXCIuXG4gICAgLy8gNC4gTm9uLWVtcHR5IFwiaW5jbHVkZVwiIGtleT8gSnVzdCB1c2UgdGhlIFwiaW5jbHVkZVwiIGtleS5cbiAgICBjb25zdCB3YXRjaEluY2x1ZGVzID0gcGF0dGVybnNBcnJheUZvcldhdGNoKG9wdGlvbnMuaW5jbHVkZSwge1xuICAgICAgcm9vdERpcixcbiAgICAgIHJldHVyblJvb3REaXJJZkVtcHR5OiB0cnVlLFxuICAgIH0pO1xuICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoZGVidWcoYCdpbmNsdWRlJyBwYXR0ZXJucyBmb3IgJ3dhdGNoJzogJHtKU09OLnN0cmluZ2lmeSh3YXRjaEluY2x1ZGVzKX1gKSk7XG5cbiAgICAvLyBGb3IgdGhlIFwiZXhjbHVkZVwiIHN1YmtleSB1bmRlciB0aGUgXCJ3YXRjaFwiIGtleSxcbiAgICAvLyB0aGUgYmVoYXZpb3IgaXMgdG8gYWRkIHNvbWUgZGVmYXVsdCBleGNsdWRlcyBpbiBhZGRpdGlvbiB0byB0aGUgb25lcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXI6XG4gICAgLy8gMS4gVGhlIENESyBvdXRwdXQgZGlyZWN0b3J5LlxuICAgIC8vIDIuIEFueSBmaWxlIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggYSBkb3QuXG4gICAgLy8gMy4gQW55IGRpcmVjdG9yeSdzIGNvbnRlbnQgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCBhIGRvdC5cbiAgICAvLyA0LiBBbnkgbm9kZV9tb2R1bGVzIGFuZCBpdHMgY29udGVudCAoZXZlbiBpZiBpdCdzIG5vdCBhIEpTL1RTIHByb2plY3QsIHlvdSBtaWdodCBiZSB1c2luZyBhIGxvY2FsIGF3cy1jbGkgcGFja2FnZSlcbiAgICBjb25zdCBvdXRkaXIgPSBvcHRpb25zLm91dGRpciA/PyAnY2RrLm91dCc7XG4gICAgY29uc3Qgd2F0Y2hFeGNsdWRlcyA9IHBhdHRlcm5zQXJyYXlGb3JXYXRjaChvcHRpb25zLmV4Y2x1ZGUsIHtcbiAgICAgIHJvb3REaXIsXG4gICAgICByZXR1cm5Sb290RGlySWZFbXB0eTogZmFsc2UsXG4gICAgfSkuY29uY2F0KGAke291dGRpcn0vKipgLCAnKiovLionLCAnKiovLiovKionLCAnKiovbm9kZV9tb2R1bGVzLyoqJyk7XG4gICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShkZWJ1ZyhgJ2V4Y2x1ZGUnIHBhdHRlcm5zIGZvciAnd2F0Y2gnOiAke0pTT04uc3RyaW5naWZ5KHdhdGNoRXhjbHVkZXMpfWApKTtcblxuICAgIC8vIFNpbmNlICdjZGsgZGVwbG95JyBpcyBhIHJlbGF0aXZlbHkgc2xvdyBvcGVyYXRpb24gZm9yIGEgJ3dhdGNoJyBwcm9jZXNzLFxuICAgIC8vIGludHJvZHVjZSBhIGNvbmN1cnJlbmN5IGxhdGNoIHRoYXQgdHJhY2tzIHRoZSBzdGF0ZS5cbiAgICAvLyBUaGlzIHdheSwgaWYgZmlsZSBjaGFuZ2UgZXZlbnRzIGFycml2ZSB3aGVuIGEgJ2NkayBkZXBsb3knIGlzIHN0aWxsIGV4ZWN1dGluZyxcbiAgICAvLyB3ZSB3aWxsIGJhdGNoIHRoZW0sIGFuZCB0cmlnZ2VyIGFub3RoZXIgJ2NkayBkZXBsb3knIGFmdGVyIHRoZSBjdXJyZW50IG9uZSBmaW5pc2hlcyxcbiAgICAvLyBtYWtpbmcgc3VyZSAnY2RrIGRlcGxveSdzICBhbHdheXMgZXhlY3V0ZSBvbmUgYXQgYSB0aW1lLlxuICAgIC8vIEhlcmUncyBhIGRpYWdyYW0gc2hvd2luZyB0aGUgc3RhdGUgdHJhbnNpdGlvbnM6XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgLS0tLS0tLS0gICAgZmlsZSBjaGFuZ2VkICAgICAtLS0tLS0tLS0tLS0tLSAgICBmaWxlIGNoYW5nZWQgICAgIC0tLS0tLS0tLS0tLS0tICBmaWxlIGNoYW5nZWRcbiAgICAvLyB8ICAgICAgICAgICAgfCAgcmVhZHkgZXZlbnQgICB8ICAgICAgfCAtLS0tLS0tLS0tLS0tLS0tLS0+IHwgICAgICAgICAgICB8IC0tLS0tLS0tLS0tLS0tLS0tLT4gfCAgICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS18XG4gICAgLy8gfCBwcmUtcmVhZHkgIHwgLS0tLS0tLS0tLS0tLT4gfCBvcGVuIHwgICAgICAgICAgICAgICAgICAgICB8IGRlcGxveWluZyAgfCAgICAgICAgICAgICAgICAgICAgIHwgICBxdWV1ZWQgICB8ICAgICAgICAgICAgICAgfFxuICAgIC8vIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICB8IDwtLS0tLS0tLS0tLS0tLS0tLS0gfCAgICAgICAgICAgIHwgPC0tLS0tLS0tLS0tLS0tLS0tLSB8ICAgICAgICAgICAgfCA8LS0tLS0tLS0tLS0tLXxcbiAgICAvLyAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAtLS0tLS0tLSAgJ2NkayBkZXBsb3knIGRvbmUgIC0tLS0tLS0tLS0tLS0tICAnY2RrIGRlcGxveScgZG9uZSAgLS0tLS0tLS0tLS0tLS1cbiAgICBsZXQgbGF0Y2g6ICdwcmUtcmVhZHknIHwgJ29wZW4nIHwgJ2RlcGxveWluZycgfCAncXVldWVkJyA9ICdwcmUtcmVhZHknO1xuXG4gICAgY29uc3QgY2xvdWRXYXRjaExvZ01vbml0b3IgPSBvcHRpb25zLnRyYWNlTG9ncyA/IG5ldyBDbG91ZFdhdGNoTG9nRXZlbnRNb25pdG9yKCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVwbG95QW5kV2F0Y2ggPSBhc3luYyAoKSA9PiB7XG4gICAgICBsYXRjaCA9ICdkZXBsb3lpbmcnO1xuICAgICAgY2xvdWRXYXRjaExvZ01vbml0b3I/LmRlYWN0aXZhdGUoKTtcblxuICAgICAgYXdhaXQgdGhpcy5pbnZva2VEZXBsb3lGcm9tV2F0Y2goYXNzZW1ibHksIG9wdGlvbnMsIGNsb3VkV2F0Y2hMb2dNb25pdG9yKTtcblxuICAgICAgLy8gSWYgbGF0Y2ggaXMgc3RpbGwgJ2RlcGxveWluZycgYWZ0ZXIgdGhlICdhd2FpdCcsIHRoYXQncyBmaW5lLFxuICAgICAgLy8gYnV0IGlmIGl0J3MgJ3F1ZXVlZCcsIHRoYXQgbWVhbnMgd2UgbmVlZCB0byBkZXBsb3kgYWdhaW5cbiAgICAgIHdoaWxlICgobGF0Y2ggYXMgJ2RlcGxveWluZycgfCAncXVldWVkJykgPT09ICdxdWV1ZWQnKSB7XG4gICAgICAgIC8vIFR5cGVTY3JpcHQgZG9lc24ndCByZWFsaXplIGxhdGNoIGNhbiBjaGFuZ2UgYmV0d2VlbiAnYXdhaXRzJyxcbiAgICAgICAgLy8gYW5kIHRoaW5rcyB0aGUgYWJvdmUgJ3doaWxlJyBjb25kaXRpb24gaXMgYWx3YXlzICdmYWxzZScgd2l0aG91dCB0aGUgY2FzdFxuICAgICAgICBsYXRjaCA9ICdkZXBsb3lpbmcnO1xuICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGluZm8oXCJEZXRlY3RlZCBmaWxlIGNoYW5nZXMgZHVyaW5nIGRlcGxveW1lbnQuIEludm9raW5nICdjZGsgZGVwbG95JyBhZ2FpblwiKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW52b2tlRGVwbG95RnJvbVdhdGNoKGFzc2VtYmx5LCBvcHRpb25zLCBjbG91ZFdhdGNoTG9nTW9uaXRvcik7XG4gICAgICB9XG4gICAgICBsYXRjaCA9ICdvcGVuJztcbiAgICAgIGNsb3VkV2F0Y2hMb2dNb25pdG9yPy5hY3RpdmF0ZSgpO1xuICAgIH07XG5cbiAgICBjaG9raWRhclxuICAgICAgLndhdGNoKHdhdGNoSW5jbHVkZXMsIHtcbiAgICAgICAgaWdub3JlZDogd2F0Y2hFeGNsdWRlcyxcbiAgICAgICAgY3dkOiByb290RGlyLFxuICAgICAgfSlcbiAgICAgIC5vbigncmVhZHknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxhdGNoID0gJ29wZW4nO1xuICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGRlYnVnKFwiJ3dhdGNoJyByZWNlaXZlZCB0aGUgJ3JlYWR5JyBldmVudC4gRnJvbSBub3cgb24sIGFsbCBmaWxlIGNoYW5nZXMgd2lsbCB0cmlnZ2VyIGEgZGVwbG95bWVudFwiKSk7XG4gICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoaW5mbyhcIlRyaWdnZXJpbmcgaW5pdGlhbCAnY2RrIGRlcGxveSdcIikpO1xuICAgICAgICBhd2FpdCBkZXBsb3lBbmRXYXRjaCgpO1xuICAgICAgfSlcbiAgICAgIC5vbignYWxsJywgYXN5bmMgKGV2ZW50OiAnYWRkJyB8ICdhZGREaXInIHwgJ2NoYW5nZScgfCAndW5saW5rJyB8ICd1bmxpbmtEaXInLCBmaWxlUGF0aD86IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAobGF0Y2ggPT09ICdwcmUtcmVhZHknKSB7XG4gICAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGAnd2F0Y2gnIGlzIG9ic2VydmluZyAke2V2ZW50ID09PSAnYWRkRGlyJyA/ICdkaXJlY3RvcnknIDogJ3RoZSBmaWxlJ30gJyR7ZmlsZVBhdGh9JyBmb3IgY2hhbmdlc2ApKTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXRjaCA9PT0gJ29wZW4nKSB7XG4gICAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGBEZXRlY3RlZCBjaGFuZ2UgdG8gJyR7ZmlsZVBhdGh9JyAodHlwZTogJHtldmVudH0pLiBUcmlnZ2VyaW5nICdjZGsgZGVwbG95J2ApKTtcbiAgICAgICAgICBhd2FpdCBkZXBsb3lBbmRXYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoaXMgbWVhbnMgbGF0Y2ggaXMgZWl0aGVyICdkZXBsb3lpbmcnIG9yICdxdWV1ZWQnXG4gICAgICAgICAgbGF0Y2ggPSAncXVldWVkJztcbiAgICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGluZm8oXG4gICAgICAgICAgICBgRGV0ZWN0ZWQgY2hhbmdlIHRvICcke2ZpbGVQYXRofScgKHR5cGU6ICR7ZXZlbnR9KSB3aGlsZSAnY2RrIGRlcGxveScgaXMgc3RpbGwgcnVubmluZy4gV2lsbCBxdWV1ZSBmb3IgYW5vdGhlciBkZXBsb3ltZW50IGFmdGVyIHRoaXMgb25lIGZpbmlzaGVzJ2AsXG4gICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIEFjdGlvblxuICAgKlxuICAgKiBSb2xscyBiYWNrIHRoZSBzZWxlY3RlZCBzdGFja3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcm9sbGJhY2soY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBSb2xsYmFja09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhc3NlbWJseSA9IGF3YWl0IHRoaXMuYXNzZW1ibHlGcm9tU291cmNlKGN4KTtcbiAgICByZXR1cm4gdGhpcy5fcm9sbGJhY2soYXNzZW1ibHksICdyb2xsYmFjaycsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBhbGxvdyByb2xsYmFjayBiZWluZyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgZGVwbG95IG9yIHdhdGNoIGFjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3JvbGxiYWNrKGFzc2VtYmx5OiBTdGFja0Fzc2VtYmx5LCBhY3Rpb246ICdyb2xsYmFjaycgfCAnZGVwbG95JyB8ICd3YXRjaCcsIG9wdGlvbnM6IFJvbGxiYWNrT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlvSG9zdCA9IHdpdGhBY3Rpb24odGhpcy5pb0hvc3QsIGFjdGlvbik7XG4gICAgY29uc3Qgc3ludGhUaW1lciA9IFRpbWVyLnN0YXJ0KCk7XG4gICAgY29uc3Qgc3RhY2tzID0gYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIob3B0aW9ucy5zdGFja3MpO1xuICAgIGF3YWl0IHRoaXMudmFsaWRhdGVTdGFja3NNZXRhZGF0YShzdGFja3MsIGlvSG9zdCk7XG4gICAgYXdhaXQgc3ludGhUaW1lci5lbmRBcyhpb0hvc3QsICdzeW50aCcpO1xuXG4gICAgaWYgKHN0YWNrcy5zdGFja0NvdW50ID09PSAwKSB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGVycm9yKCdObyBzdGFja3Mgc2VsZWN0ZWQnLCBDT0RFUy5DREtfVE9PTEtJVF9FNjAwMSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBhbnlSb2xsYmFja2FibGUgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3Qgc3RhY2sgb2Ygc3RhY2tzLnN0YWNrQXJ0aWZhY3RzKSB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGluZm8oYFJvbGxpbmcgYmFjayAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfWApKTtcbiAgICAgIGNvbnN0IHJvbGxiYWNrVGltZXIgPSBUaW1lci5zdGFydCgpO1xuICAgICAgY29uc3QgZGVwbG95bWVudHMgPSBhd2FpdCB0aGlzLmRlcGxveW1lbnRzRm9yQWN0aW9uKCdyb2xsYmFjaycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhY2tSZXN1bHQgPSBhd2FpdCBkZXBsb3ltZW50cy5yb2xsYmFja1N0YWNrKHtcbiAgICAgICAgICBzdGFjayxcbiAgICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgICAgdG9vbGtpdFN0YWNrTmFtZTogdGhpcy50b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAgIGZvcmNlOiBvcHRpb25zLm9ycGhhbkZhaWxlZFJlc291cmNlcyxcbiAgICAgICAgICB2YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbjogb3B0aW9ucy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbixcbiAgICAgICAgICBvcnBoYW5Mb2dpY2FsSWRzOiBvcHRpb25zLm9ycGhhbkxvZ2ljYWxJZHMsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXN0YWNrUmVzdWx0Lm5vdEluUm9sbGJhY2thYmxlU3RhdGUpIHtcbiAgICAgICAgICBhbnlSb2xsYmFja2FibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHJvbGxiYWNrVGltZXIuZW5kQXMoaW9Ib3N0LCAncm9sbGJhY2snKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGVycm9yKGBcXG4g4p2MICAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfSBmYWlsZWQ6ICR7Zm9ybWF0RXJyb3JNZXNzYWdlKGUpfWAsIENPREVTLkNES19UT09MS0lUX0U2OTAwKSk7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1JvbGxiYWNrIGZhaWxlZCAodXNlIC0tZm9yY2UgdG8gb3JwaGFuIGZhaWxpbmcgcmVzb3VyY2VzKScpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWFueVJvbGxiYWNrYWJsZSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignTm8gc3RhY2tzIHdlcmUgaW4gYSBzdGF0ZSB0aGF0IGNvdWxkIGJlIHJvbGxlZCBiYWNrJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgQWN0aW9uXG4gICAqXG4gICAqIERlc3Ryb3lzIHRoZSBzZWxlY3RlZCBTdGFja3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVzdHJveShjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IERlc3Ryb3lPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCB0aGlzLmFzc2VtYmx5RnJvbVNvdXJjZShjeCk7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc3Ryb3koYXNzZW1ibHksICdkZXN0cm95Jywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIGFsbG93IGRlc3Ryb3kgYmVpbmcgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIGRlcGxveSBhY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9kZXN0cm95KGFzc2VtYmx5OiBTdGFja0Fzc2VtYmx5LCBhY3Rpb246ICdkZXBsb3knIHwgJ2Rlc3Ryb3knLCBvcHRpb25zOiBEZXN0cm95T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlvSG9zdCA9IHdpdGhBY3Rpb24odGhpcy5pb0hvc3QsIGFjdGlvbik7XG4gICAgY29uc3Qgc3ludGhUaW1lciA9IFRpbWVyLnN0YXJ0KCk7XG4gICAgLy8gVGhlIHN0YWNrcyB3aWxsIGhhdmUgYmVlbiBvcmRlcmVkIGZvciBkZXBsb3ltZW50LCBzbyByZXZlcnNlIHRoZW0gZm9yIGRlbGV0aW9uLlxuICAgIGNvbnN0IHN0YWNrcyA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKG9wdGlvbnMuc3RhY2tzKS5yZXZlcnNlZCgpO1xuICAgIGF3YWl0IHN5bnRoVGltZXIuZW5kQXMoaW9Ib3N0LCAnc3ludGgnKTtcblxuICAgIGNvbnN0IG1vdGl2YXRpb24gPSAnRGVzdHJveWluZyBzdGFja3MgaXMgYW4gaXJyZXZlcnNpYmxlIGFjdGlvbic7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZTogJHtjaGFsay5yZWQoc3RhY2tzLmhpZXJhcmNoaWNhbElkcy5qb2luKCcsICcpKX1gO1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGlvSG9zdC5yZXF1ZXN0UmVzcG9uc2UoY29uZmlybShDT0RFUy5DREtfVE9PTEtJVF9JNzAxMCwgcXVlc3Rpb24sIG1vdGl2YXRpb24sIHRydWUpKTtcbiAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgcmV0dXJuIGlvSG9zdC5ub3RpZnkoZXJyb3IoJ0Fib3J0ZWQgYnkgdXNlcicsIENPREVTLkNES19UT09MS0lUX0U3MDEwKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzdHJveVRpbWVyID0gVGltZXIuc3RhcnQoKTtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHN0YWNrXSBvZiBzdGFja3Muc3RhY2tBcnRpZmFjdHMuZW50cmllcygpKSB7XG4gICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoc3VjY2VzcyhgJHtjaGFsay5ibHVlKHN0YWNrLmRpc3BsYXlOYW1lKX06IGRlc3Ryb3lpbmcuLi4gWyR7aW5kZXggKyAxfS8ke3N0YWNrcy5zdGFja0NvdW50fV1gKSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGVwbG95bWVudHMgPSBhd2FpdCB0aGlzLmRlcGxveW1lbnRzRm9yQWN0aW9uKGFjdGlvbik7XG4gICAgICAgICAgYXdhaXQgZGVwbG95bWVudHMuZGVzdHJveVN0YWNrKHtcbiAgICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgICAgZGVwbG95TmFtZTogc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgICAgY2k6IG9wdGlvbnMuY2ksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShzdWNjZXNzKGBcXG4g4pyFICAke2NoYWxrLmJsdWUoc3RhY2suZGlzcGxheU5hbWUpfTogJHthY3Rpb259ZWRgKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGVycm9yKGBcXG4g4p2MICAke2NoYWxrLmJsdWUoc3RhY2suZGlzcGxheU5hbWUpfTogJHthY3Rpb259IGZhaWxlZCAke2V9YCwgQ09ERVMuQ0RLX1RPT0xLSVRfRTc5MDApKTtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGRlc3Ryb3lUaW1lci5lbmRBcyhpb0hvc3QsICdkZXN0cm95Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBzdGFja3MgZm9yIGVycm9ycyBhbmQgd2FybmluZ3MgYWNjb3JkaW5nIHRvIHRoZSBDTEkncyBjdXJyZW50IHNldHRpbmdzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlU3RhY2tzTWV0YWRhdGEoc3RhY2tzOiBTdGFja0NvbGxlY3Rpb24sIGlvSG9zdDogQWN0aW9uQXdhcmVJb0hvc3QpIHtcbiAgICAvLyBAVE9ETyBkZWZpbmUgdGhlc2Ugc29tZXdoZXJlIGNlbnRyYWxcbiAgICBjb25zdCBjb2RlID0gKGxldmVsOiBJb01lc3NhZ2VMZXZlbCk6IElvTWVzc2FnZUNvZGUgPT4ge1xuICAgICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgICBjYXNlICdlcnJvcic6IHJldHVybiAnQ0RLX0FTU0VNQkxZX0U5OTk5JztcbiAgICAgICAgY2FzZSAnd2Fybic6IHJldHVybiAnQ0RLX0FTU0VNQkxZX1c5OTk5JztcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuICdDREtfQVNTRU1CTFlfSTk5OTknO1xuICAgICAgfVxuICAgIH07XG4gICAgYXdhaXQgc3RhY2tzLnZhbGlkYXRlTWV0YWRhdGEodGhpcy5wcm9wcy5hc3NlbWJseUZhaWx1cmVBdCwgYXN5bmMgKGxldmVsLCBtc2cpID0+IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgIGxldmVsLFxuICAgICAgY29kZTogY29kZShsZXZlbCksXG4gICAgICBtZXNzYWdlOiBgWyR7bGV2ZWx9IGF0ICR7bXNnLmlkfV0gJHttc2cuZW50cnkuZGF0YX1gLFxuICAgICAgZGF0YTogbXNnLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVG9vbGtpdCBpbnRlcm5hbCBDbG91ZEFzc2VtYmx5IGZyb20gYSBDbG91ZEFzc2VtYmx5U291cmNlLlxuICAgKiBAcGFyYW0gYXNzZW1ibHlTb3VyY2UgdGhlIHNvdXJjZSBmb3IgdGhlIGNsb3VkIGFzc2VtYmx5XG4gICAqIEBwYXJhbSBjYWNoZSBpZiB0aGUgYXNzZW1ibHkgc2hvdWxkIGJlIGNhY2hlZCwgZGVmYXVsdDogYHRydWVgXG4gICAqIEByZXR1cm5zIHRoZSBDbG91ZEFzc2VtYmx5IG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhc3NlbWJseUZyb21Tb3VyY2UoYXNzZW1ibHlTb3VyY2U6IElDbG91ZEFzc2VtYmx5U291cmNlLCBjYWNoZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPFN0YWNrQXNzZW1ibHk+IHtcbiAgICBpZiAoYXNzZW1ibHlTb3VyY2UgaW5zdGFuY2VvZiBTdGFja0Fzc2VtYmx5KSB7XG4gICAgICByZXR1cm4gYXNzZW1ibHlTb3VyY2U7XG4gICAgfVxuXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICByZXR1cm4gbmV3IFN0YWNrQXNzZW1ibHkoYXdhaXQgbmV3IENhY2hlZENsb3VkQXNzZW1ibHlTb3VyY2UoYXNzZW1ibHlTb3VyY2UpLnByb2R1Y2UoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTdGFja0Fzc2VtYmx5KGF3YWl0IGFzc2VtYmx5U291cmNlLnByb2R1Y2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZGVwbG95bWVudHMgY2xhc3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGVwbG95bWVudHNGb3JBY3Rpb24oYWN0aW9uOiBUb29sa2l0QWN0aW9uKTogUHJvbWlzZTxEZXBsb3ltZW50cz4ge1xuICAgIHJldHVybiBuZXcgRGVwbG95bWVudHMoe1xuICAgICAgc2RrUHJvdmlkZXI6IGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoYWN0aW9uKSxcbiAgICAgIHRvb2xraXRTdGFja05hbWU6IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgIGlvSG9zdDogdGhpcy5pb0hvc3QgYXMgYW55LCAvLyBAdG9kbyB0ZW1wb3Jhcnkgd2hpbGUgd2UgaGF2ZSB0byBzZXBhcmF0ZSBJSW9Ib3N0IGludGVyZmFjZXNcbiAgICAgIGFjdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW52b2tlRGVwbG95RnJvbVdhdGNoKFxuICAgIGFzc2VtYmx5OiBTdGFja0Fzc2VtYmx5LFxuICAgIG9wdGlvbnM6IFdhdGNoT3B0aW9ucyxcbiAgICBjbG91ZFdhdGNoTG9nTW9uaXRvcj86IENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHdhdGNoIGRlZmF1bHRzIGhvdHN3YXAgdG8gZW5hYmxlZFxuICAgIGNvbnN0IGhvdHN3YXAgPSBvcHRpb25zLmhvdHN3YXAgPz8gSG90c3dhcE1vZGUuSE9UU1dBUF9PTkxZO1xuICAgIGNvbnN0IGRlcGxveU9wdGlvbnM6IEV4dGVuZGVkRGVwbG95T3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICByZXF1aXJlQXBwcm92YWw6IFJlcXVpcmVBcHByb3ZhbC5ORVZFUixcbiAgICAgIGNsb3VkV2F0Y2hMb2dNb25pdG9yLFxuICAgICAgaG90c3dhcCxcbiAgICAgIGV4dHJhVXNlckFnZW50OiBgY2RrLXdhdGNoL2hvdHN3YXAtJHtob3Rzd2FwID09PSBIb3Rzd2FwTW9kZS5GVUxMX0RFUExPWU1FTlQgPyAnb2ZmJyA6ICdvbid9YCxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2RlcGxveShhc3NlbWJseSwgJ3dhdGNoJywgZGVwbG95T3B0aW9ucyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBqdXN0IGNvbnRpbnVlIC0gZGVwbG95IHdpbGwgc2hvdyB0aGUgZXJyb3JcbiAgICB9XG4gIH1cbn1cbiJdfQ==
665
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvb2xraXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0NBQWtDO0FBQ2xDLHlDQUF5QztBQUN6QywrQkFBK0I7QUFDL0IscUNBQXFDO0FBQ3JDLCtCQUErQjtBQUMvQix1Q0FBZ0U7QUFFaEUsb0RBQWdHO0FBQ2hHLDhDQUF3RjtBQUN4Rix1REFBaUo7QUFFakoscURBQStEO0FBSy9ELHNEQUFpRTtBQUVqRSw0Q0FBd1Y7QUFDeFYsMERBQXFGO0FBQ3JGLDJEQUFtSTtBQUVuSSwrQ0FBc0s7QUFDdEssMERBQXNFO0FBQ3RFLHdEQUFtRTtBQUNuRSwwQ0FBMkg7QUFDM0gscURBQTZDO0FBNkM3Qzs7OztHQUlHO0FBQ0gsTUFBYSxPQUFRLFNBQVEsb0NBQTBCO0lBWWpCO0lBWHBDOztPQUVHO0lBQ2EsZ0JBQWdCLENBQVM7SUFFekM7O09BRUc7SUFDYSxNQUFNLENBQVU7SUFDeEIsWUFBWSxDQUFlO0lBRW5DLFlBQW9DLFFBQXdCLEVBQUU7UUFDNUQsS0FBSyxFQUFFLENBQUM7UUFEMEIsVUFBSyxHQUFMLEtBQUssQ0FBcUI7UUFFNUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxvQ0FBMEIsQ0FBQztRQUU3RSxvRkFBb0Y7UUFDcEYsTUFBTSxZQUFZLEdBQUcsbUJBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixZQUFZLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFhLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEdBQUcsWUFBdUIsQ0FBQztRQUNyQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDM0IsTUFBTSxHQUFHLElBQUEsdUJBQWEsRUFBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFB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LE1BQWEsRUFBRSwrREFBK0Q7WUFDM0YsTUFBTTtTQUNQLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMscUJBQXFCLENBQ2pDLFFBQXVCLEVBQ3ZCLE9BQXFCLEVBQ3JCLG9CQUFnRDtRQUVoRCxvQ0FBb0M7UUFDcEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxxQkFBVyxDQUFDLFlBQVksQ0FBQztRQUM1RCxNQUFNLGFBQWEsR0FBMEI7WUFDM0MsR0FBRyxPQUFPO1lBQ1YsZUFBZSxFQUFFLHdCQUFlLENBQUMsS0FBSztZQUN0QyxvQkFBb0I7WUFDcEIsT0FBTztZQUNQLGNBQWMsRUFBRSxxQkFBcUIsT0FBTyxLQUFLLHFCQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtTQUM5RixDQUFDO1FBRUYsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLDZDQUE2QztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBNXRCRCwwQkE0dEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIGNob2tpZGFyIGZyb20gJ2Nob2tpZGFyJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGFzc2VtYmx5RnJvbVNvdXJjZSwgVG9vbGtpdFNlcnZpY2VzIH0gZnJvbSAnLi9wcml2YXRlJztcbmltcG9ydCB7IEFzc2VtYmx5RGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQm9vdHN0cmFwRW52aXJvbm1lbnRzLCBCb290c3RyYXBPcHRpb25zLCBCb290c3RyYXBTb3VyY2UgfSBmcm9tICcuLi9hY3Rpb25zL2Jvb3RzdHJhcCc7XG5pbXBvcnQgeyBBc3NldEJ1aWxkVGltZSwgdHlwZSBEZXBsb3lPcHRpb25zLCBSZXF1aXJlQXBwcm92YWwgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGxveSc7XG5pbXBvcnQgeyB0eXBlIEV4dGVuZGVkRGVwbG95T3B0aW9ucywgYnVpbGRQYXJhbWV0ZXJNYXAsIGNyZWF0ZUhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcywgcmVtb3ZlUHVibGlzaGVkQXNzZXRzIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBsb3kvcHJpdmF0ZSc7XG5pbXBvcnQgeyB0eXBlIERlc3Ryb3lPcHRpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXN0cm95JztcbmltcG9ydCB7IGRpZmZSZXF1aXJlc0FwcHJvdmFsIH0gZnJvbSAnLi4vYWN0aW9ucy9kaWZmL3ByaXZhdGUnO1xuaW1wb3J0IHsgdHlwZSBMaXN0T3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvbGlzdCc7XG5pbXBvcnQgeyB0eXBlIFJvbGxiYWNrT3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvcm9sbGJhY2snO1xuaW1wb3J0IHsgdHlwZSBTeW50aE9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL3N5bnRoJztcbmltcG9ydCB7IFdhdGNoT3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvd2F0Y2gnO1xuaW1wb3J0IHsgcGF0dGVybnNBcnJheUZvcldhdGNoIH0gZnJvbSAnLi4vYWN0aW9ucy93YXRjaC9wcml2YXRlJztcbmltcG9ydCB7IHR5cGUgU2RrQ29uZmlnIH0gZnJvbSAnLi4vYXBpL2F3cy1hdXRoJztcbmltcG9ydCB7IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FLCBCb290c3RyYXBwZXIsIFNka1Byb3ZpZGVyLCBTdWNjZXNzZnVsRGVwbG95U3RhY2tSZXN1bHQsIFN0YWNrQ29sbGVjdGlvbiwgRGVwbG95bWVudHMsIEhvdHN3YXBNb2RlLCBSZXNvdXJjZU1pZ3JhdG9yLCB0YWdzRm9yU3RhY2ssIENsaUlvSG9zdCwgQ29uY3VycmVuY3ksIFdvcmtHcmFwaEJ1aWxkZXIsIEFzc2V0QnVpbGROb2RlLCBBc3NldFB1Ymxpc2hOb2RlLCBTdGFja05vZGUsIENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IsIGZpbmRDbG91ZFdhdGNoTG9nR3JvdXBzLCBTdGFja0RldGFpbHMgfSBmcm9tICcuLi9hcGkvYXdzLWNkayc7XG5pbXBvcnQgeyBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgU3RhY2tTZWxlY3Rpb25TdHJhdGVneSB9IGZyb20gJy4uL2FwaS9jbG91ZC1hc3NlbWJseSc7XG5pbXBvcnQgeyBBTExfU1RBQ0tTLCBDbG91ZEFzc2VtYmx5U291cmNlQnVpbGRlciwgSWRlbnRpdHlDbG91ZEFzc2VtYmx5U291cmNlLCBTdGFja0Fzc2VtYmx5IH0gZnJvbSAnLi4vYXBpL2Nsb3VkLWFzc2VtYmx5L3ByaXZhdGUnO1xuaW1wb3J0IHsgSUlvSG9zdCwgSW9NZXNzYWdlQ29kZSwgSW9NZXNzYWdlTGV2ZWwgfSBmcm9tICcuLi9hcGkvaW8nO1xuaW1wb3J0IHsgYXNTZGtMb2dnZXIsIFRpbWVyLCBjb25maXJtLCBlcnJvciwgaW5mbywgc3VjY2Vzcywgd2FybiwgZGVidWcsIHJlc3VsdCwgd2l0aG91dEVtb2ppcywgd2l0aG91dENvbG9yLCB3aXRoVHJpbW1lZFdoaXRlc3BhY2UsIENPREVTIH0gZnJvbSAnLi4vYXBpL2lvL3ByaXZhdGUnO1xuaW1wb3J0IHsgQWN0aW9uQXdhcmVJb0hvc3QsIHdpdGhBY3Rpb24gfSBmcm9tICcuLi9hcGkvc2hhcmVkLXByaXZhdGUnO1xuaW1wb3J0IHsgVG9vbGtpdEFjdGlvbiwgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vYXBpL3NoYXJlZC1wdWJsaWMnO1xuaW1wb3J0IHsgb2JzY3VyZVRlbXBsYXRlLCBzZXJpYWxpemVTdHJ1Y3R1cmUsIHZhbGlkYXRlU25zVG9waWNBcm4sIGZvcm1hdFRpbWUsIGZvcm1hdEVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3ByaXZhdGUvdXRpbCc7XG5pbXBvcnQgeyBwTGltaXQgfSBmcm9tICcuLi91dGlsL2NvbmN1cnJlbmN5JztcblxuZXhwb3J0IGludGVyZmFjZSBUb29sa2l0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgSW9Ib3N0IGltcGxlbWVudGF0aW9uLCBoYW5kbGluZyB0aGUgaW5saW5lIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBUb29sa2l0IGFuZCBhbiBpbnRlZ3JhdGlvbi5cbiAgICovXG4gIGlvSG9zdD86IElJb0hvc3Q7XG5cbiAgLyoqXG4gICAqIEFsbG93IGVtb2ppcyBpbiBtZXNzYWdlcyBzZW50IHRvIHRoZSBJb0hvc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVtb2ppcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgQU5TSSBjb2xvcnMgYW5kIGZvcm1hdHRpbmcgaW4gSW9Ib3N0IG1lc3NhZ2VzLlxuICAgKiBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gYGZhbHNlYCBlbmZvcmNlcyB0aGF0IG5vIGNvbG9yIG9yIHN0eWxlIHNob3dzIHVwXG4gICAqIGluIG1lc3NhZ2VzIHNlbnQgdG8gdGhlIElvSG9zdC5cbiAgICogU2V0dGluZyB0aGlzIHZhbHVlIHRvIHRydWUgaXMgYSBuby1vcDsgaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGVmYXVsdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZXRlY3RzIGNvbG9yIGZyb20gdGhlIFRUWSBzdGF0dXMgb2YgdGhlIElvSG9zdFxuICAgKi9cbiAgY29sb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBTREsuXG4gICAqL1xuICBzZGtDb25maWc/OiBTZGtDb25maWc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHRvb2xraXQgc3RhY2sgdG8gYmUgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJDREtUb29sa2l0XCJcbiAgICovXG4gIHRvb2xraXRTdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZhaWwgQ2xvdWQgQXNzZW1ibGllc1xuICAgKlxuICAgKiBAZGVmYXVsdCBcImVycm9yXCJcbiAgICovXG4gIGFzc2VtYmx5RmFpbHVyZUF0PzogJ2Vycm9yJyB8ICd3YXJuJyB8ICdub25lJztcbn1cblxuLyoqXG4gKiBUaGUgQVdTIENESyBQcm9ncmFtbWF0aWMgVG9vbGtpdFxuICpcbiAqIEBkb2N1bWVudCAuLi8uLi9DT0RFX1JFR0lTVFJZLm1kXG4gKi9cbmV4cG9ydCBjbGFzcyBUb29sa2l0IGV4dGVuZHMgQ2xvdWRBc3NlbWJseVNvdXJjZUJ1aWxkZXIgaW1wbGVtZW50cyBBc3luY0Rpc3Bvc2FibGUge1xuICAvKipcbiAgICogVGhlIHRvb2xraXQgc3RhY2sgbmFtZSB1c2VkIGZvciBib290c3RyYXBwaW5nIHJlc291cmNlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0b29sa2l0U3RhY2tOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJb0hvc3Qgb2YgdGhpcyBUb29sa2l0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW9Ib3N0OiBJSW9Ib3N0O1xuICBwcml2YXRlIF9zZGtQcm92aWRlcj86IFNka1Byb3ZpZGVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBUb29sa2l0T3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnRvb2xraXRTdGFja05hbWUgPSBwcm9wcy50b29sa2l0U3RhY2tOYW1lID8/IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FO1xuXG4gICAgLy8gSGFja3kgd2F5IHRvIHJlLXVzZSB0aGUgZ2xvYmFsIElvSG9zdCB1bnRpbCB3ZSBoYXZlIGZ1bGx5IHJlbW92ZWQgdGhlIG5lZWQgZm9yIGl0XG4gICAgY29uc3QgZ2xvYmFsSW9Ib3N0ID0gQ2xpSW9Ib3N0Lmluc3RhbmNlKCk7XG4gICAgaWYgKHByb3BzLmlvSG9zdCkge1xuICAgICAgZ2xvYmFsSW9Ib3N0LnJlZ2lzdGVySW9Ib3N0KHByb3BzLmlvSG9zdCBhcyBhbnkpO1xuICAgIH1cbiAgICBsZXQgaW9Ib3N0ID0gZ2xvYmFsSW9Ib3N0IGFzIElJb0hvc3Q7XG4gICAgaWYgKHByb3BzLmVtb2ppcyA9PT0gZmFsc2UpIHtcbiAgICAgIGlvSG9zdCA9IHdpdGhvdXRFbW9qaXMoaW9Ib3N0KTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmNvbG9yID09PSBmYWxzZSkge1xuICAgICAgaW9Ib3N0ID0gd2l0aG91dENvbG9yKGlvSG9zdCk7XG4gICAgfVxuICAgIC8vIEFmdGVyIHJlbW92aW5nIGVtb2ppcyBhbmQgY29sb3IsIHdlIG1pZ2h0IGVuZCB1cCB3aXRoIGZsb2F0aW5nIHdoaXRlc3BhY2UgYXQgZWl0aGVyIGVuZCBvZiB0aGUgbWVzc2FnZVxuICAgIC8vIFRoaXMgYWxzbyByZW1vdmVzIG5ld2xpbmVzIHRoYXQgd2UgY3VycmVudGx5IGVtaXQgZm9yIENMSSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICB0aGlzLmlvSG9zdCA9IHdpdGhUcmltbWVkV2hpdGVzcGFjZShpb0hvc3QpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gbm90aGluZyB0byBkbyB5ZXRcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kaXNwb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXNzIHRvIHRoZSBBV1MgU0RLXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNka1Byb3ZpZGVyKGFjdGlvbjogVG9vbGtpdEFjdGlvbik6IFByb21pc2U8U2RrUHJvdmlkZXI+IHtcbiAgICAvLyBAdG9kbyB0aGlzIG5lZWRzIHRvIGJlIGRpZmZlcmVudCBpbnN0YW5jZSBwZXIgYWN0aW9uXG4gICAgaWYgKCF0aGlzLl9zZGtQcm92aWRlcikge1xuICAgICAgdGhpcy5fc2RrUHJvdmlkZXIgPSBhd2FpdCBTZGtQcm92aWRlci53aXRoQXdzQ2xpQ29tcGF0aWJsZURlZmF1bHRzKHtcbiAgICAgICAgLi4udGhpcy5wcm9wcy5zZGtDb25maWcsXG4gICAgICAgIGxvZ2dlcjogYXNTZGtMb2dnZXIodGhpcy5pb0hvc3QsIGFjdGlvbiksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2RrUHJvdmlkZXI7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIHByb3ZpZGUgdGhlIENsb3VkQXNzZW1ibHlTb3VyY2VCdWlsZGVyIHdpdGggcmVxdWlyZWQgdG9vbGtpdCBzZXJ2aWNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHNvdXJjZUJ1aWxkZXJTZXJ2aWNlcygpOiBQcm9taXNlPFRvb2xraXRTZXJ2aWNlcz4ge1xuICAgIHJldHVybiB7XG4gICAgICBpb0hvc3Q6IHdpdGhBY3Rpb24odGhpcy5pb0hvc3QsICdhc3NlbWJseScpLFxuICAgICAgc2RrUHJvdmlkZXI6IGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoJ2Fzc2VtYmx5JyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCb290c3RyYXAgQWN0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYm9vdHN0cmFwKGVudmlyb25tZW50czogQm9vdHN0cmFwRW52aXJvbm1lbnRzLCBvcHRpb25zOiBCb290c3RyYXBPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW9Ib3N0ID0gd2l0aEFjdGlvbih0aGlzLmlvSG9zdCwgJ2Jvb3RzdHJhcCcpO1xuICAgIGNvbnN0IGJvb3RzdHJhcEVudmlyb25tZW50cyA9IGF3YWl0IGVudmlyb25tZW50cy5nZXRFbnZpcm9ubWVudHMoKTtcbiAgICBjb25zdCBzb3VyY2UgPSBvcHRpb25zLnNvdXJjZSA/PyBCb290c3RyYXBTb3VyY2UuZGVmYXVsdCgpO1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBvcHRpb25zLnBhcmFtZXRlcnM7XG4gICAgY29uc3QgYm9vdHN0cmFwcGVyID0gbmV3IEJvb3RzdHJhcHBlcihzb3VyY2UsIHsgaW9Ib3N0LCBhY3Rpb246ICdib290c3RyYXAnIH0pO1xuICAgIGNvbnN0IHNka1Byb3ZpZGVyID0gYXdhaXQgdGhpcy5zZGtQcm92aWRlcignYm9vdHN0cmFwJyk7XG4gICAgY29uc3QgbGltaXQgPSBwTGltaXQoMjApO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoYm9vdHN0cmFwRW52aXJvbm1lbnRzLm1hcCgoZW52aXJvbm1lbnQ6IGN4YXBpLkVudmlyb25tZW50KSA9PiBsaW1pdChhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGluZm8oYCR7Y2hhbGsuYm9sZChlbnZpcm9ubWVudC5uYW1lKX06IGJvb3RzdHJhcHBpbmcuLi5gKSk7XG4gICAgICBjb25zdCBib290c3RyYXBUaW1lciA9IFRpbWVyLnN0YXJ0KCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJvb3RzdHJhcFJlc3VsdCA9IGF3YWl0IGJvb3RzdHJhcHBlci5ib290c3RyYXBFbnZpcm9ubWVudChcbiAgICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgICBzZGtQcm92aWRlcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgdG9vbGtpdFN0YWNrTmFtZTogdGhpcy50b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycz8ucGFyYW1ldGVycyxcbiAgICAgICAgICAgIHVzZVByZXZpb3VzUGFyYW1ldGVyczogcGFyYW1ldGVycz8ua2VlcEV4aXN0aW5nUGFyYW1ldGVycyxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYm9vdHN0cmFwUmVzdWx0Lm5vT3BcbiAgICAgICAgICA/IGAg4pyFICAke2Vudmlyb25tZW50Lm5hbWV9IChubyBjaGFuZ2VzKWBcbiAgICAgICAgICA6IGAg4pyFICAke2Vudmlyb25tZW50Lm5hbWV9YDtcblxuICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHJlc3VsdChjaGFsay5ncmVlbignXFxuJyArIG1lc3NhZ2UpLCBDT0RFUy5DREtfVE9PTEtJVF9JOTkwMCwgeyBlbnZpcm9ubWVudCB9KSk7XG4gICAgICAgIGF3YWl0IGJvb3RzdHJhcFRpbWVyLmVuZEFzKGlvSG9zdCwgJ2Jvb3RzdHJhcCcpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGVycm9yKGBcXG4g4p2MICAke2NoYWxrLmJvbGQoZW52aXJvbm1lbnQubmFtZSl9IGZhaWxlZDogJHtmb3JtYXRFcnJvck1lc3NhZ2UoZSl9YCwgQ09ERVMuQ0RLX1RPT0xLSVRfRTk5MDApKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9KSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoIEFjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN5bnRoKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogU3ludGhPcHRpb25zID0ge30pOiBQcm9taXNlPElDbG91ZEFzc2VtYmx5U291cmNlPiB7XG4gICAgY29uc3QgaW9Ib3N0ID0gd2l0aEFjdGlvbih0aGlzLmlvSG9zdCwgJ3N5bnRoJyk7XG4gICAgY29uc3Qgc3ludGhUaW1lciA9IFRpbWVyLnN0YXJ0KCk7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCBhc3NlbWJseUZyb21Tb3VyY2UoY3gpO1xuICAgIGNvbnN0IHN0YWNrcyA9IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKG9wdGlvbnMuc3RhY2tzID8/IEFMTF9TVEFDS1MpO1xuICAgIGNvbnN0IGF1dG9WYWxpZGF0ZVN0YWNrcyA9IG9wdGlvbnMudmFsaWRhdGVTdGFja3MgPyBbYXNzZW1ibHkuc2VsZWN0U3RhY2tzRm9yVmFsaWRhdGlvbigpXSA6IFtdO1xuICAgIGF3YWl0IHRoaXMudmFsaWRhdGVTdGFja3NNZXRhZGF0YShzdGFja3MuY29uY2F0KC4uLmF1dG9WYWxpZGF0ZVN0YWNrcyksIGlvSG9zdCk7XG4gICAgYXdhaXQgc3ludGhUaW1lci5lbmRBcyhpb0hvc3QsICdzeW50aCcpO1xuXG4gICAgLy8gaWYgd2UgaGF2ZSBhIHNpbmdsZSBzdGFjaywgcHJpbnQgaXQgdG8gU1RET1VUXG4gICAgY29uc3QgbWVzc2FnZSA9IGBTdWNjZXNzZnVsbHkgc3ludGhlc2l6ZWQgdG8gJHtjaGFsay5ibHVlKHBhdGgucmVzb2x2ZShzdGFja3MuYXNzZW1ibHkuZGlyZWN0b3J5KSl9YDtcbiAgICBjb25zdCBhc3NlbWJseURhdGE6IEFzc2VtYmx5RGF0YSA9IHtcbiAgICAgIGFzc2VtYmx5RGlyZWN0b3J5OiBzdGFja3MuYXNzZW1ibHkuZGlyZWN0b3J5LFxuICAgICAgc3RhY2tzQ291bnQ6IHN0YWNrcy5zdGFja0NvdW50LFxuICAgICAgc3RhY2tJZHM6IHN0YWNrcy5oaWVyYXJjaGljYWxJZHMsXG4gICAgfTtcblxuICAgIGlmIChzdGFja3Muc3RhY2tDb3VudCA9PT0gMSkge1xuICAgICAgY29uc3QgZmlyc3RTdGFjayA9IHN0YWNrcy5maXJzdFN0YWNrITtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZmlyc3RTdGFjay50ZW1wbGF0ZTtcbiAgICAgIGNvbnN0IG9ic2N1cmVkVGVtcGxhdGUgPSBvYnNjdXJlVGVtcGxhdGUodGVtcGxhdGUpO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShDT0RFUy5DREtfVE9PTEtJVF9JMTkwMS5tc2cobWVzc2FnZSwge1xuICAgICAgICAuLi5hc3NlbWJseURhdGEsXG4gICAgICAgIHN0YWNrOiB7XG4gICAgICAgICAgc3RhY2tOYW1lOiBmaXJzdFN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICBoaWVyYXJjaGljYWxJZDogZmlyc3RTdGFjay5oaWVyYXJjaGljYWxJZCxcbiAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICBzdHJpbmdpZmllZEpzb246IHNlcmlhbGl6ZVN0cnVjdHVyZShvYnNjdXJlZFRlbXBsYXRlLCB0cnVlKSxcbiAgICAgICAgICBzdHJpbmdpZmllZFlhbWw6IHNlcmlhbGl6ZVN0cnVjdHVyZShvYnNjdXJlZFRlbXBsYXRlLCBmYWxzZSksXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vdCBvdXRwdXR0aW5nIHRlbXBsYXRlIHRvIHN0ZG91dCwgbGV0J3MgZXhwbGFpbiB0aGluZ3MgdG8gdGhlIHVzZXIgYSBsaXR0bGUgYml0Li4uXG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHJlc3VsdChjaGFsay5ncmVlbihtZXNzYWdlKSwgQ09ERVMuQ0RLX1RPT0xLSVRfSTE5MDIsIGFzc2VtYmx5RGF0YSkpO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGBTdXBwbHkgYSBzdGFjayBpZCAoJHtzdGFja3Muc3RhY2tBcnRpZmFjdHMubWFwKChzKSA9PiBjaGFsay5ncmVlbihzLmhpZXJhcmNoaWNhbElkKSkuam9pbignLCAnKX0pIHRvIGRpc3BsYXkgaXRzIHRlbXBsYXRlLmApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IElkZW50aXR5Q2xvdWRBc3NlbWJseVNvdXJjZShhc3NlbWJseS5hc3NlbWJseSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBBY3Rpb25cbiAgICpcbiAgICogTGlzdCBzZWxlY3RlZCBzdGFja3MgYW5kIHRoZWlyIGRlcGVuZGVuY2llc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGxpc3QoY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBMaXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTdGFja0RldGFpbHNbXT4ge1xuICAgIGNvbnN0IGlvSG9zdCA9IHdpdGhBY3Rpb24odGhpcy5pb0hvc3QsICdsaXN0Jyk7XG4gICAgY29uc3Qgc3ludGhUaW1lciA9IFRpbWVyLnN0YXJ0KCk7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCBhc3NlbWJseUZyb21Tb3VyY2UoY3gpO1xuICAgIGNvbnN0IHN0YWNrQ29sbGVjdGlvbiA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKG9wdGlvbnMuc3RhY2tzID8/IEFMTF9TVEFDS1MpO1xuICAgIGF3YWl0IHN5bnRoVGltZXIuZW5kQXMoaW9Ib3N0LCAnc3ludGgnKTtcblxuICAgIGNvbnN0IHN0YWNrcyA9IHN0YWNrQ29sbGVjdGlvbi53aXRoRGVwZW5kZW5jaWVzKCk7XG4gICAgY29uc3QgbWVzc2FnZSA9IHN0YWNrcy5tYXAocyA9PiBzLmlkKS5qb2luKCdcXG4nKTtcblxuICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoQ09ERVMuQ0RLX1RPT0xLSVRfSTI5MDEubXNnKG1lc3NhZ2UsIHsgc3RhY2tzIH0pKTtcbiAgICByZXR1cm4gc3RhY2tzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcGxveSBBY3Rpb25cbiAgICpcbiAgICogRGVwbG95cyB0aGUgc2VsZWN0ZWQgc3RhY2tzIGludG8gYW4gQVdTIGFjY291bnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXBsb3koY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBEZXBsb3lPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhc3NlbWJseSA9IGF3YWl0IGFzc2VtYmx5RnJvbVNvdXJjZShjeCk7XG4gICAgcmV0dXJuIHRoaXMuX2RlcGxveShhc3NlbWJseSwgJ2RlcGxveScsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBhbGxvdyBkZXBsb3kgYmVpbmcgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIHdhdGNoIGFjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2RlcGxveShhc3NlbWJseTogU3RhY2tBc3NlbWJseSwgYWN0aW9uOiAnZGVwbG95JyB8ICd3YXRjaCcsIG9wdGlvbnM6IEV4dGVuZGVkRGVwbG95T3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgaW9Ib3N0ID0gd2l0aEFjdGlvbih0aGlzLmlvSG9zdCwgYWN0aW9uKTtcbiAgICBjb25zdCBzeW50aFRpbWVyID0gVGltZXIuc3RhcnQoKTtcbiAgICBjb25zdCBzdGFja0NvbGxlY3Rpb24gPSBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihvcHRpb25zLnN0YWNrcyA/PyBBTExfU1RBQ0tTKTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlU3RhY2tzTWV0YWRhdGEoc3RhY2tDb2xsZWN0aW9uLCBpb0hvc3QpO1xuICAgIGNvbnN0IHN5bnRoRHVyYXRpb24gPSBhd2FpdCBzeW50aFRpbWVyLmVuZEFzKGlvSG9zdCwgJ3N5bnRoJyk7XG5cbiAgICBpZiAoc3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnQgPT09IDApIHtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoZXJyb3IoJ1RoaXMgYXBwIGNvbnRhaW5zIG5vIHN0YWNrcycsIENPREVTLkNES19UT09MS0lUX0U1MDAxKSk7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KENPREVTLkNES19UT09MS0lUX0U1MDAxLm1zZygnVGhpcyBhcHAgY29udGFpbnMgbm8gc3RhY2tzJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbignZGVwbG95Jyk7XG4gICAgY29uc3QgbWlncmF0b3IgPSBuZXcgUmVzb3VyY2VNaWdyYXRvcih7IGRlcGxveW1lbnRzLCBpb0hvc3QsIGFjdGlvbiB9KTtcblxuICAgIGF3YWl0IG1pZ3JhdG9yLnRyeU1pZ3JhdGVSZXNvdXJjZXMoc3RhY2tDb2xsZWN0aW9uLCBvcHRpb25zKTtcblxuICAgIGNvbnN0IHJlcXVpcmVBcHByb3ZhbCA9IG9wdGlvbnMucmVxdWlyZUFwcHJvdmFsID8/IFJlcXVpcmVBcHByb3ZhbC5ORVZFUjtcblxuICAgIGNvbnN0IHBhcmFtZXRlck1hcCA9IGJ1aWxkUGFyYW1ldGVyTWFwKG9wdGlvbnMucGFyYW1ldGVycz8ucGFyYW1ldGVycyk7XG5cbiAgICBjb25zdCBob3Rzd2FwTW9kZSA9IG9wdGlvbnMuaG90c3dhcCA/PyBIb3Rzd2FwTW9kZS5GVUxMX0RFUExPWU1FTlQ7XG4gICAgaWYgKGhvdHN3YXBNb2RlICE9PSBIb3Rzd2FwTW9kZS5GVUxMX0RFUExPWU1FTlQpIHtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkod2FybihbXG4gICAgICAgICfimqDvuI8gVGhlIC0taG90c3dhcCBhbmQgLS1ob3Rzd2FwLWZhbGxiYWNrIGZsYWdzIGRlbGliZXJhdGVseSBpbnRyb2R1Y2UgQ2xvdWRGb3JtYXRpb24gZHJpZnQgdG8gc3BlZWQgdXAgZGVwbG95bWVudHMnLFxuICAgICAgICAn4pqg77iPIFRoZXkgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGV2ZWxvcG1lbnQgLSBuZXZlciB1c2UgdGhlbSBmb3IgeW91ciBwcm9kdWN0aW9uIFN0YWNrcyEnLFxuICAgICAgXS5qb2luKCdcXG4nKSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWNrcyA9IHN0YWNrQ29sbGVjdGlvbi5zdGFja0FydGlmYWN0cztcbiAgICBjb25zdCBzdGFja091dHB1dHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBjb25zdCBvdXRwdXRzRmlsZSA9IG9wdGlvbnMub3V0cHV0c0ZpbGU7XG5cbiAgICBjb25zdCBidWlsZEFzc2V0ID0gYXN5bmMgKGFzc2V0Tm9kZTogQXNzZXRCdWlsZE5vZGUpID0+IHtcbiAgICAgIGF3YWl0IGRlcGxveW1lbnRzLmJ1aWxkU2luZ2xlQXNzZXQoXG4gICAgICAgIGFzc2V0Tm9kZS5hc3NldE1hbmlmZXN0QXJ0aWZhY3QsXG4gICAgICAgIGFzc2V0Tm9kZS5hc3NldE1hbmlmZXN0LFxuICAgICAgICBhc3NldE5vZGUuYXNzZXQsXG4gICAgICAgIHtcbiAgICAgICAgICBzdGFjazogYXNzZXROb2RlLnBhcmVudFN0YWNrLFxuICAgICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgICBzdGFja05hbWU6IGFzc2V0Tm9kZS5wYXJlbnRTdGFjay5zdGFja05hbWUsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCBwdWJsaXNoQXNzZXQgPSBhc3luYyAoYXNzZXROb2RlOiBBc3NldFB1Ymxpc2hOb2RlKSA9PiB7XG4gICAgICBhd2FpdCBkZXBsb3ltZW50cy5wdWJsaXNoU2luZ2xlQXNzZXQoYXNzZXROb2RlLmFzc2V0TWFuaWZlc3QsIGFzc2V0Tm9kZS5hc3NldCwge1xuICAgICAgICBzdGFjazogYXNzZXROb2RlLnBhcmVudFN0YWNrLFxuICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgIHN0YWNrTmFtZTogYXNzZXROb2RlLnBhcmVudFN0YWNrLnN0YWNrTmFtZSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBkZXBsb3lTdGFjayA9IGFzeW5jIChzdGFja05vZGU6IFN0YWNrTm9kZSkgPT4ge1xuICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja05vZGUuc3RhY2s7XG4gICAgICBpZiAoc3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnQgIT09IDEpIHtcbiAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGNoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc3RhY2suZW52aXJvbm1lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgICBgU3RhY2sgJHtzdGFjay5kaXNwbGF5TmFtZX0gZG9lcyBub3QgZGVmaW5lIGFuIGVudmlyb25tZW50LCBhbmQgQVdTIGNyZWRlbnRpYWxzIGNvdWxkIG5vdCBiZSBvYnRhaW5lZCBmcm9tIHN0YW5kYXJkIGxvY2F0aW9ucyBvciBubyByZWdpb24gd2FzIGNvbmZpZ3VyZWQuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGdlbmVyYXRlZCBzdGFjayBoYXMgbm8gcmVzb3VyY2VzXG4gICAgICBpZiAoT2JqZWN0LmtleXMoc3RhY2sudGVtcGxhdGUuUmVzb3VyY2VzIHx8IHt9KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gc3RhY2sgaXMgZW1wdHkgYW5kIGRvZXNuJ3QgZXhpc3QgPT4gZG8gbm90aGluZ1xuICAgICAgICBjb25zdCBzdGFja0V4aXN0cyA9IGF3YWl0IGRlcGxveW1lbnRzLnN0YWNrRXhpc3RzKHsgc3RhY2sgfSk7XG4gICAgICAgIGlmICghc3RhY2tFeGlzdHMpIHtcbiAgICAgICAgICByZXR1cm4gaW9Ib3N0Lm5vdGlmeSh3YXJuKGAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfTogc3RhY2sgaGFzIG5vIHJlc291cmNlcywgc2tpcHBpbmcgZGVwbG95bWVudC5gKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdGFjayBpcyBlbXB0eSwgYnV0IGV4aXN0cyA9PiBkZWxldGVcbiAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh3YXJuKGAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfTogc3RhY2sgaGFzIG5vIHJlc291cmNlcywgZGVsZXRpbmcgZXhpc3Rpbmcgc3RhY2suYCkpO1xuICAgICAgICBhd2FpdCB0aGlzLl9kZXN0cm95KGFzc2VtYmx5LCAnZGVwbG95Jywge1xuICAgICAgICAgIHN0YWNrczogeyBwYXR0ZXJuczogW3N0YWNrLmhpZXJhcmNoaWNhbElkXSwgc3RyYXRlZ3k6IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuUEFUVEVSTl9NVVNUX01BVENIX1NJTkdMRSB9LFxuICAgICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgICBjaTogb3B0aW9ucy5jaSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVxdWlyZUFwcHJvdmFsICE9PSBSZXF1aXJlQXBwcm92YWwuTkVWRVIpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFRlbXBsYXRlID0gYXdhaXQgZGVwbG95bWVudHMucmVhZEN1cnJlbnRUZW1wbGF0ZShzdGFjayk7XG4gICAgICAgIGlmIChkaWZmUmVxdWlyZXNBcHByb3ZhbChjdXJyZW50VGVtcGxhdGUsIHN0YWNrLCByZXF1aXJlQXBwcm92YWwpKSB7XG4gICAgICAgICAgY29uc3QgbW90aXZhdGlvbiA9ICdcIi0tcmVxdWlyZS1hcHByb3ZhbFwiIGlzIGVuYWJsZWQgYW5kIHN0YWNrIGluY2x1ZGVzIHNlY3VyaXR5LXNlbnNpdGl2ZSB1cGRhdGVzLic7XG4gICAgICAgICAgY29uc3QgcXVlc3Rpb24gPSBgJHttb3RpdmF0aW9ufVxcbkRvIHlvdSB3aXNoIHRvIGRlcGxveSB0aGVzZSBjaGFuZ2VzYDtcbiAgICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKGNvbmZpcm0oQ09ERVMuQ0RLX1RPT0xLSVRfSTUwNjAsIHF1ZXN0aW9uLCBtb3RpdmF0aW9uLCB0cnVlLCBjb25jdXJyZW5jeSkpO1xuICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdBYm9ydGVkIGJ5IHVzZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc2FtZSBzZW1hbnRpY3Mgd2UgYXBwbHkgd2l0aCByZXNwZWN0IHRvIE5vdGlmaWNhdGlvbiBBUk5zIChkaWN0YXRlZCBieSB0aGUgU0RLKVxuICAgICAgLy9cbiAgICAgIC8vICAtIHVuZGVmaW5lZCAgPT4gIGNkayBpZ25vcmVzIGl0LCBhcyBpZiBpdCB3YXNuJ3Qgc3VwcG9ydGVkIChhbGxvd3MgZXh0ZXJuYWwgbWFuYWdlbWVudCkuXG4gICAgICAvLyAgLSBbXTogICAgICAgID0+ICBjZGsgbWFuYWdlcyBpdCwgYW5kIHRoZSB1c2VyIHdhbnRzIHRvIHdpcGUgaXQgb3V0LlxuICAgICAgLy8gIC0gWydhcm4tMSddICA9PiAgY2RrIG1hbmFnZXMgaXQsIGFuZCB0aGUgdXNlciB3YW50cyB0byBzZXQgaXQgdG8gWydhcm4tMSddLlxuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uQXJucyA9ICghIW9wdGlvbnMubm90aWZpY2F0aW9uQXJucyB8fCAhIXN0YWNrLm5vdGlmaWNhdGlvbkFybnMpXG4gICAgICAgID8gKG9wdGlvbnMubm90aWZpY2F0aW9uQXJucyA/PyBbXSkuY29uY2F0KHN0YWNrLm5vdGlmaWNhdGlvbkFybnMgPz8gW10pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBmb3IgKGNvbnN0IG5vdGlmaWNhdGlvbkFybiBvZiBub3RpZmljYXRpb25Bcm5zID8/IFtdKSB7XG4gICAgICAgIGlmICghdmFsaWRhdGVTbnNUb3BpY0Fybihub3RpZmljYXRpb25Bcm4pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgTm90aWZpY2F0aW9uIGFybiAke25vdGlmaWNhdGlvbkFybn0gaXMgbm90IGEgdmFsaWQgYXJuIGZvciBhbiBTTlMgdG9waWNgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGFja0luZGV4ID0gc3RhY2tzLmluZGV4T2Yoc3RhY2spICsgMTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoXG4gICAgICAgIGluZm8oYCR7Y2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSl9OiBkZXBsb3lpbmcuLi4gWyR7c3RhY2tJbmRleH0vJHtzdGFja0NvbGxlY3Rpb24uc3RhY2tDb3VudH1dYCksXG4gICAgICApO1xuICAgICAgY29uc3QgZGVwbG95VGltZXIgPSBUaW1lci5zdGFydCgpO1xuXG4gICAgICBsZXQgdGFncyA9IG9wdGlvbnMudGFncztcbiAgICAgIGlmICghdGFncyB8fCB0YWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0YWdzID0gdGFnc0ZvclN0YWNrKHN0YWNrKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGRlcGxveUR1cmF0aW9uO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGRlcGxveVJlc3VsdDogU3VjY2Vzc2Z1bERlcGxveVN0YWNrUmVzdWx0IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCByb2xsYmFjayA9IG9wdGlvbnMucm9sbGJhY2s7XG4gICAgICAgIGxldCBpdGVyYXRpb24gPSAwO1xuICAgICAgICB3aGlsZSAoIWRlcGxveVJlc3VsdCkge1xuICAgICAgICAgIGlmICgrK2l0ZXJhdGlvbiA+IDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1RoaXMgbG9vcCBzaG91bGQgaGF2ZSBzdGFiaWxpemVkIGluIDIgaXRlcmF0aW9ucywgYnV0IGRpZG5cXCd0LiBJZiB5b3UgYXJlIHNlZWluZyB0aGlzIGVycm9yLCBwbGVhc2UgcmVwb3J0IGl0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvbmV3L2Nob29zZScpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBkZXBsb3ltZW50cy5kZXBsb3lTdGFjayh7XG4gICAgICAgICAgICBzdGFjayxcbiAgICAgICAgICAgIGRlcGxveU5hbWU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgICAgIHRvb2xraXRTdGFja05hbWU6IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgICAgIHJldXNlQXNzZXRzOiBvcHRpb25zLnJldXNlQXNzZXRzLFxuICAgICAgICAgICAgbm90aWZpY2F0aW9uQXJucyxcbiAgICAgICAgICAgIHRhZ3MsXG4gICAgICAgICAgICBkZXBsb3ltZW50TWV0aG9kOiBvcHRpb25zLmRlcGxveW1lbnRNZXRob2QsXG4gICAgICAgICAgICBmb3JjZTogb3B0aW9ucy5mb3JjZSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IE9iamVjdC5hc3NpZ24oe30sIHBhcmFtZXRlck1hcFsnKiddLCBwYXJhbWV0ZXJNYXBbc3RhY2suc3RhY2tOYW1lXSksXG4gICAgICAgICAgICB1c2VQcmV2aW91c1BhcmFtZXRlcnM6IG9wdGlvbnMucGFyYW1ldGVycz8ua2VlcEV4aXN0aW5nUGFyYW1ldGVycyxcbiAgICAgICAgICAgIHJvbGxiYWNrLFxuICAgICAgICAgICAgaG90c3dhcDogaG90c3dhcE1vZGUsXG4gICAgICAgICAgICBleHRyYVVzZXJBZ2VudDogb3B0aW9ucy5leHRyYVVzZXJBZ2VudCxcbiAgICAgICAgICAgIGhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlczogb3B0aW9ucy5ob3Rzd2FwUHJvcGVydGllcyA/IGNyZWF0ZUhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcyhvcHRpb25zLmhvdHN3YXBQcm9wZXJ0aWVzKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFzc2V0UGFyYWxsZWxpc206IG9wdGlvbnMuYXNzZXRQYXJhbGxlbGlzbSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHN3aXRjaCAoci50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdkaWQtZGVwbG95LXN0YWNrJzpcbiAgICAgICAgICAgICAgZGVwbG95UmVzdWx0ID0gcjtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2ZhaWxwYXVzZWQtbmVlZC1yb2xsYmFjay1maXJzdCc6IHtcbiAgICAgICAgICAgICAgY29uc3QgbW90aXZhdGlvbiA9IHIucmVhc29uID09PSAncmVwbGFjZW1lbnQnXG4gICAgICAgICAgICAgICAgPyBgU3RhY2sgaXMgaW4gYSBwYXVzZWQgZmFpbCBzdGF0ZSAoJHtyLnN0YXR1c30pIGFuZCBjaGFuZ2UgaW5jbHVkZXMgYSByZXBsYWNlbWVudCB3aGljaCBjYW5ub3QgYmUgZGVwbG95ZWQgd2l0aCBcIi0tbm8tcm9sbGJhY2tcImBcbiAgICAgICAgICAgICAgICA6IGBTdGFjayBpcyBpbiBhIHBhdXNlZCBmYWlsIHN0YXRlICgke3Iuc3RhdHVzfSkgYW5kIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZG8gbm90IGluY2x1ZGUgXCItLW5vLXJvbGxiYWNrXCJgO1xuICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvbiA9IGAke21vdGl2YXRpb259LiBQZXJmb3JtIGEgcmVndWxhciBkZXBsb3ltZW50YDtcblxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb3JjZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkod2FybihgJHttb3RpdmF0aW9ufS4gUm9sbGluZyBiYWNrIGZpcnN0ICgtLWZvcmNlKS5gKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgaW9Ib3N0LnJlcXVlc3RSZXNwb25zZShjb25maXJtKENPREVTLkNES19UT09MS0lUX0k1MDUwLCBxdWVzdGlvbiwgbW90aXZhdGlvbiwgdHJ1ZSwgY29uY3VycmVuY3kpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQWJvcnRlZCBieSB1c2VyJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUGVyZm9ybSBhIHJvbGxiYWNrXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JvbGxiYWNrKGFzc2VtYmx5LCBhY3Rpb24sIHtcbiAgICAgICAgICAgICAgICBzdGFja3M6IHsgcGF0dGVybnM6IFtzdGFjay5oaWVyYXJjaGljYWxJZF0sIHN0cmF0ZWd5OiBTdGFja1NlbGVjdGlvblN0cmF0ZWd5LlBBVFRFUk5fTVVTVF9NQVRDSF9TSU5HTEUgfSxcbiAgICAgICAgICAgICAgICBvcnBoYW5GYWlsZWRSZXNvdXJjZXM6IG9wdGlvbnMuZm9yY2UsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIEdvIGFyb3VuZCB0aHJvdWdoIHRoZSAnd2hpbGUnIGxvb3AgYWdhaW4gYnV0IHN3aXRjaCByb2xsYmFjayB0byB0cnVlLlxuICAgICAgICAgICAgICByb2xsYmFjayA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdyZXBsYWNlbWVudC1yZXF1aXJlcy1yb2xsYmFjayc6IHtcbiAgICAgICAgICAgICAgY29uc3QgbW90aXZhdGlvbiA9ICdDaGFuZ2UgaW5jbHVkZXMgYSByZXBsYWNlbWVudCB3aGljaCBjYW5ub3QgYmUgZGVwbG95ZWQgd2l0aCBcIi0tbm8tcm9sbGJhY2tcIic7XG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gYCR7bW90aXZhdGlvbn0uIFBlcmZvcm0gYSByZWd1bGFyIGRlcGxveW1lbnRgO1xuXG4gICAgICAgICAgICAgIC8vIEB0b2RvIG5vIGZvcmNlIGhlcmVcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZm9yY2UpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHdhcm4oYCR7bW90aXZhdGlvbn0uIFByb2NlZWRpbmcgd2l0aCByZWd1bGFyIGRlcGxveW1lbnQgKC0tZm9yY2UpLmApKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKGNvbmZpcm0oQ09ERVMuQ0RLX1RPT0xLSVRfSTUwNTAsIHF1ZXN0aW9uLCBtb3RpdmF0aW9uLCB0cnVlLCBjb25jdXJyZW5jeSkpO1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdBYm9ydGVkIGJ5IHVzZXInKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBHbyBhcm91bmQgdGhyb3VnaCB0aGUgJ3doaWxlJyBsb29wIGFnYWluIGJ1dCBzd2l0Y2ggcm9sbGJhY2sgdG8gdHJ1ZS5cbiAgICAgICAgICAgICAgcm9sbGJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgVW5leHBlY3RlZCByZXN1bHQgdHlwZSBmcm9tIGRlcGxveVN0YWNrOiAke0pTT04uc3RyaW5naWZ5KHIpfS4gSWYgeW91IGFyZSBzZWVpbmcgdGhpcyBlcnJvciwgcGxlYXNlIHJlcG9ydCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzL25ldy9jaG9vc2VgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXNzYWdlID0gZGVwbG95UmVzdWx0Lm5vT3BcbiAgICAgICAgICA/IGAg4pyFICAke3N0YWNrLmRpc3BsYXlOYW1lfSAobm8gY2hhbmdlcylgXG4gICAgICAgICAgOiBgIOKchSAgJHtzdGFjay5kaXNwbGF5TmFtZX1gO1xuXG4gICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkocmVzdWx0KGNoYWxrLmdyZWVuKCdcXG4nICsgbWVzc2FnZSksIENPREVTLkNES19UT09MS0lUX0k1OTAwLCBkZXBsb3lSZXN1bHQpKTtcbiAgICAgICAgZGVwbG95RHVyYXRpb24gPSBhd2FpdCBkZXBsb3lUaW1lci5lbmRBcyhpb0hvc3QsICdkZXBsb3knKTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGVwbG95UmVzdWx0Lm91dHB1dHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSBbJ091dHB1dHM6J107XG4gICAgICAgICAgc3RhY2tPdXRwdXRzW3N0YWNrLnN0YWNrTmFtZV0gPSBkZXBsb3lSZXN1bHQub3V0cHV0cztcblxuICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXBsb3lSZXN1bHQub3V0cHV0cykuc29ydCgpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRlcGxveVJlc3VsdC5vdXRwdXRzW25hbWVdO1xuICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7Y2hhbGsuY3lhbihzdGFjay5pZCl9LiR7Y2hhbGsuY3lhbihuYW1lKX0gPSAke2NoYWxrLnVuZGVybGluZShjaGFsay5jeWFuKHZhbHVlKSl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoaW5mbyhidWZmZXIuam9pbignXFxuJykpKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGluZm8oYFN0YWNrIEFSTjpcXG4ke2RlcGxveVJlc3VsdC5zdGFja0Fybn1gKSk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgLy8gSXQgaGFzIHRvIGJlIGV4YWN0bHkgdGhpcyBzdHJpbmcgYmVjYXVzZSBhbiBpbnRlZ3JhdGlvbiB0ZXN0IHRlc3RzIGZvclxuICAgICAgICAvLyBcImJvbGQoc3RhY2tuYW1lKSBmYWlsZWQ6IFJlc291cmNlTm90UmVhZHk6IDxlcnJvcj5cIlxuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKFxuICAgICAgICAgIFtg4p2MICAke2NoYWxrLmJvbGQoc3RhY2suc3RhY2tOYW1lKX0gZmFpbGVkOmAsIC4uLihlLm5hbWUgPyBbYCR7ZS5uYW1lfTpgXSA6IFtdKSwgZS5tZXNzYWdlXS5qb2luKCcgJyksXG4gICAgICAgICk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAob3B0aW9ucy50cmFjZUxvZ3MpIHtcbiAgICAgICAgICAvLyBkZXBsb3kgY2FsbHMgdGhhdCBvcmlnaW5hdGUgZnJvbSB3YXRjaCB3aWxsIGNvbWUgd2l0aCB0aGVpciBvd24gY2xvdWRXYXRjaExvZ01vbml0b3JcbiAgICAgICAgICBjb25zdCBjbG91ZFdhdGNoTG9nTW9uaXRvciA9IG9wdGlvbnMuY2xvdWRXYXRjaExvZ01vbml0b3IgPz8gbmV3IENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IoKTtcbiAgICAgICAgICBjb25zdCBmb3VuZExvZ0dyb3Vwc1Jlc3VsdCA9IGF3YWl0IGZpbmRDbG91ZFdhdGNoTG9nR3JvdXBzKGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoJ2RlcGxveScpLCB7IGlvSG9zdCwgYWN0aW9uIH0sIHN0YWNrKTtcbiAgICAgICAgICBjbG91ZFdhdGNoTG9nTW9uaXRvci5hZGRMb2dHcm91cHMoXG4gICAgICAgICAgICBmb3VuZExvZ0dyb3Vwc1Jlc3VsdC5lbnYsXG4gICAgICAgICAgICBmb3VuZExvZ0dyb3Vwc1Jlc3VsdC5zZGssXG4gICAgICAgICAgICBmb3VuZExvZ0dyb3Vwc1Jlc3VsdC5sb2dHcm91cE5hbWVzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGBUaGUgZm9sbG93aW5nIGxvZyBncm91cHMgYXJlIGFkZGVkOiAke2ZvdW5kTG9nR3JvdXBzUmVzdWx0LmxvZ0dyb3VwTmFtZXN9YCwgQ09ERVMuQ0RLX1RPT0xLSVRfSTUwMzEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGFuIG91dHB1dHMgZmlsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIGNyZWF0ZSB0aGUgZmlsZSBwYXRoIGFuZCB3cml0ZSBzdGFjayBvdXRwdXRzIHRvIGl0IG9uY2UuXG4gICAgICAgIC8vIE91dHB1dHMgYXJlIHdyaXR0ZW4gYWZ0ZXIgYWxsIHN0YWNrcyBoYXZlIGJlZW4gZGVwbG95ZWQuIElmIGEgc3RhY2sgZGVwbG95bWVudCBmYWlscyxcbiAgICAgICAgLy8gYWxsIG9mIHRoZSBvdXRwdXRzIGZyb20gc3VjY2Vzc2Z1bGx5IGRlcGxveWVkIHN0YWNrcyBiZWZvcmUgdGhlIGZhaWx1cmUgd2lsbCBzdGlsbCBiZSB3cml0dGVuLlxuICAgICAgICBpZiAob3V0cHV0c0ZpbGUpIHtcbiAgICAgICAgICBmcy5lbnN1cmVGaWxlU3luYyhvdXRwdXRzRmlsZSk7XG4gICAgICAgICAgYXdhaXQgZnMud3JpdGVKc29uKG91dHB1dHNGaWxlLCBzdGFja091dHB1dHMsIHtcbiAgICAgICAgICAgIHNwYWNlczogMixcbiAgICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gc3ludGhEdXJhdGlvbi5hc01zICsgKGRlcGxveUR1cmF0aW9uPy5hc01zID8/IDApO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGBcXG7inKggIFRvdGFsIHRpbWU6ICR7Zm9ybWF0VGltZShkdXJhdGlvbil9c1xcbmAsIENPREVTLkNES19UT09MS0lUX0k1MDAxLCB7IGR1cmF0aW9uIH0pKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYXNzZXRCdWlsZFRpbWUgPSBvcHRpb25zLmFzc2V0QnVpbGRUaW1lID8/IEFzc2V0QnVpbGRUaW1lLkFMTF9CRUZPUkVfREVQTE9ZO1xuICAgIGNvbnN0IHByZWJ1aWxkQXNzZXRzID0gYXNzZXRCdWlsZFRpbWUgPT09IEFzc2V0QnVpbGRUaW1lLkFMTF9CRUZPUkVfREVQTE9ZO1xuICAgIGNvbnN0IGNvbmN1cnJlbmN5ID0gb3B0aW9ucy5jb25jdXJyZW5jeSB8fCAxO1xuXG4gICAgY29uc3Qgc3RhY2tzQW5kVGhlaXJBc3NldE1hbmlmZXN0cyA9IHN0YWNrcy5mbGF0TWFwKChzdGFjaykgPT4gW1xuICAgICAgc3RhY2ssXG4gICAgICAuLi5zdGFjay5kZXBlbmRlbmNpZXMuZmlsdGVyKHggPT4gY3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0LmlzQXNzZXRNYW5pZmVzdEFydGlmYWN0KHgpKSxcbiAgICBdKTtcbiAgICBjb25zdCB3b3JrR3JhcGggPSBuZXcgV29ya0dyYXBoQnVpbGRlcih7IGlvSG9zdCwgYWN0aW9uIH0sIHByZWJ1aWxkQXNzZXRzKS5idWlsZChzdGFja3NBbmRUaGVpckFzc2V0TWFuaWZlc3RzKTtcblxuICAgIC8vIFVubGVzcyB3ZSBhcmUgcnVubmluZyB3aXRoICctLWZvcmNlJywgc2tpcCBhbHJlYWR5IHB1Ymxpc2hlZCBhc3NldHNcbiAgICBpZiAoIW9wdGlvbnMuZm9yY2UpIHtcbiAgICAgIGF3YWl0IHJlbW92ZVB1Ymxpc2hlZEFzc2V0cyh3b3JrR3JhcGgsIGRlcGxveW1lbnRzLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCBncmFwaENvbmN1cnJlbmN5OiBDb25jdXJyZW5jeSA9IHtcbiAgICAgICdzdGFjayc6IGNvbmN1cnJlbmN5LFxuICAgICAgJ2Fzc2V0LWJ1aWxkJzogMSwgLy8gVGhpcyB3aWxsIGJlIENQVS1ib3VuZC9tZW1vcnkgYm91bmQsIG1vc3RseSBtYXR0ZXJzIGZvciBEb2NrZXIgYnVpbGRzXG4gICAgICAnYXNzZXQtcHVibGlzaCc6IChvcHRpb25zLmFzc2V0UGFyYWxsZWxpc20gPz8gdHJ1ZSkgPyA4IDogMSwgLy8gVGhpcyB3aWxsIGJlIEkvTy1ib3VuZCwgOCBpbiBwYXJhbGxlbCBzZWVtcyByZWFzb25hYmxlXG4gICAgfTtcblxuICAgIGF3YWl0IHdvcmtHcmFwaC5kb1BhcmFsbGVsKGdyYXBoQ29uY3VycmVuY3ksIHtcbiAgICAgIGRlcGxveVN0YWNrLFxuICAgICAgYnVpbGRBc3NldCxcbiAgICAgIHB1Ymxpc2hBc3NldCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaCBBY3Rpb25cbiAgICpcbiAgICogQ29udGludW91c2x5IG9ic2VydmUgcHJvamVjdCBmaWxlcyBhbmQgZGVwbG95IHRoZSBzZWxlY3RlZCBzdGFja3MgYXV0b21hdGljYWxseSB3aGVuIGNoYW5nZXMgYXJlIGRldGVjdGVkLlxuICAgKiBJbXBsaWVzIGhvdHN3YXAgZGVwbG95bWVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd2F0Y2goY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBXYXRjaE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhc3NlbWJseSA9IGF3YWl0IGFzc2VtYmx5RnJvbVNvdXJjZShjeCwgZmFsc2UpO1xuICAgIGNvbnN0IGlvSG9zdCA9IHdpdGhBY3Rpb24odGhpcy5pb0hvc3QsICd3YXRjaCcpO1xuICAgIGNvbnN0IHJvb3REaXIgPSBvcHRpb25zLndhdGNoRGlyID8/IHByb2Nlc3MuY3dkKCk7XG4gICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShkZWJ1Zyhgcm9vdCBkaXJlY3RvcnkgdXNlZCBmb3IgJ3dhdGNoJyBpczogJHtyb290RGlyfWApKTtcblxuICAgIGlmIChvcHRpb25zLmluY2x1ZGUgPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmV4Y2x1ZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgdXNlIHRoZSAnd2F0Y2gnIGNvbW1hbmQgd2l0aG91dCBzcGVjaWZ5aW5nIGF0IGxlYXN0IG9uZSBkaXJlY3RvcnkgdG8gbW9uaXRvci4gXCIgK1xuICAgICAgICAgICdNYWtlIHN1cmUgdG8gYWRkIGEgXCJ3YXRjaFwiIGtleSB0byB5b3VyIGNkay5qc29uJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRm9yIHRoZSBcImluY2x1ZGVcIiBzdWJrZXkgdW5kZXIgdGhlIFwid2F0Y2hcIiBrZXksIHRoZSBiZWhhdmlvciBpczpcbiAgICAvLyAxLiBObyBcIndhdGNoXCIgc2V0dGluZz8gV2UgZXJyb3Igb3V0LlxuICAgIC8vIDIuIFwid2F0Y2hcIiBzZXR0aW5nIHdpdGhvdXQgYW4gXCJpbmNsdWRlXCIga2V5PyBXZSBkZWZhdWx0IHRvIG9ic2VydmluZyBcIi4vKipcIi5cbiAgICAvLyAzLiBcIndhdGNoXCIgc2V0dGluZyB3aXRoIGFuIGVtcHR5IFwiaW5jbHVkZVwiIGtleT8gV2UgZGVmYXVsdCB0byBvYnNlcnZpbmcgXCIuLyoqXCIuXG4gICAgLy8gNC4gTm9uLWVtcHR5IFwiaW5jbHVkZVwiIGtleT8gSnVzdCB1c2UgdGhlIFwiaW5jbHVkZVwiIGtleS5cbiAgICBjb25zdCB3YXRjaEluY2x1ZGVzID0gcGF0dGVybnNBcnJheUZvcldhdGNoKG9wdGlvbnMuaW5jbHVkZSwge1xuICAgICAgcm9vdERpcixcbiAgICAgIHJldHVyblJvb3REaXJJZkVtcHR5OiB0cnVlLFxuICAgIH0pO1xuICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoZGVidWcoYCdpbmNsdWRlJyBwYXR0ZXJucyBmb3IgJ3dhdGNoJzogJHtKU09OLnN0cmluZ2lmeSh3YXRjaEluY2x1ZGVzKX1gKSk7XG5cbiAgICAvLyBGb3IgdGhlIFwiZXhjbHVkZVwiIHN1YmtleSB1bmRlciB0aGUgXCJ3YXRjaFwiIGtleSxcbiAgICAvLyB0aGUgYmVoYXZpb3IgaXMgdG8gYWRkIHNvbWUgZGVmYXVsdCBleGNsdWRlcyBpbiBhZGRpdGlvbiB0byB0aGUgb25lcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXI6XG4gICAgLy8gMS4gVGhlIENESyBvdXRwdXQgZGlyZWN0b3J5LlxuICAgIC8vIDIuIEFueSBmaWxlIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggYSBkb3QuXG4gICAgLy8gMy4gQW55IGRpcmVjdG9yeSdzIGNvbnRlbnQgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCBhIGRvdC5cbiAgICAvLyA0LiBBbnkgbm9kZV9tb2R1bGVzIGFuZCBpdHMgY29udGVudCAoZXZlbiBpZiBpdCdzIG5vdCBhIEpTL1RTIHByb2plY3QsIHlvdSBtaWdodCBiZSB1c2luZyBhIGxvY2FsIGF3cy1jbGkgcGFja2FnZSlcbiAgICBjb25zdCBvdXRkaXIgPSBvcHRpb25zLm91dGRpciA/PyAnY2RrLm91dCc7XG4gICAgY29uc3Qgd2F0Y2hFeGNsdWRlcyA9IHBhdHRlcm5zQXJyYXlGb3JXYXRjaChvcHRpb25zLmV4Y2x1ZGUsIHtcbiAgICAgIHJvb3REaXIsXG4gICAgICByZXR1cm5Sb290RGlySWZFbXB0eTogZmFsc2UsXG4gICAgfSkuY29uY2F0KGAke291dGRpcn0vKipgLCAnKiovLionLCAnKiovLiovKionLCAnKiovbm9kZV9tb2R1bGVzLyoqJyk7XG4gICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShkZWJ1ZyhgJ2V4Y2x1ZGUnIHBhdHRlcm5zIGZvciAnd2F0Y2gnOiAke0pTT04uc3RyaW5naWZ5KHdhdGNoRXhjbHVkZXMpfWApKTtcblxuICAgIC8vIFNpbmNlICdjZGsgZGVwbG95JyBpcyBhIHJlbGF0aXZlbHkgc2xvdyBvcGVyYXRpb24gZm9yIGEgJ3dhdGNoJyBwcm9jZXNzLFxuICAgIC8vIGludHJvZHVjZSBhIGNvbmN1cnJlbmN5IGxhdGNoIHRoYXQgdHJhY2tzIHRoZSBzdGF0ZS5cbiAgICAvLyBUaGlzIHdheSwgaWYgZmlsZSBjaGFuZ2UgZXZlbnRzIGFycml2ZSB3aGVuIGEgJ2NkayBkZXBsb3knIGlzIHN0aWxsIGV4ZWN1dGluZyxcbiAgICAvLyB3ZSB3aWxsIGJhdGNoIHRoZW0sIGFuZCB0cmlnZ2VyIGFub3RoZXIgJ2NkayBkZXBsb3knIGFmdGVyIHRoZSBjdXJyZW50IG9uZSBmaW5pc2hlcyxcbiAgICAvLyBtYWtpbmcgc3VyZSAnY2RrIGRlcGxveSdzICBhbHdheXMgZXhlY3V0ZSBvbmUgYXQgYSB0aW1lLlxuICAgIC8vIEhlcmUncyBhIGRpYWdyYW0gc2hvd2luZyB0aGUgc3RhdGUgdHJhbnNpdGlvbnM6XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgLS0tLS0tLS0gICAgZmlsZSBjaGFuZ2VkICAgICAtLS0tLS0tLS0tLS0tLSAgICBmaWxlIGNoYW5nZWQgICAgIC0tLS0tLS0tLS0tLS0tICBmaWxlIGNoYW5nZWRcbiAgICAvLyB8ICAgICAgICAgICAgfCAgcmVhZHkgZXZlbnQgICB8ICAgICAgfCAtLS0tLS0tLS0tLS0tLS0tLS0+IHwgICAgICAgICAgICB8IC0tLS0tLS0tLS0tLS0tLS0tLT4gfCAgICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS18XG4gICAgLy8gfCBwcmUtcmVhZHkgIHwgLS0tLS0tLS0tLS0tLT4gfCBvcGVuIHwgICAgICAgICAgICAgICAgICAgICB8IGRlcGxveWluZyAgfCAgICAgICAgICAgICAgICAgICAgIHwgICBxdWV1ZWQgICB8ICAgICAgICAgICAgICAgfFxuICAgIC8vIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICB8IDwtLS0tLS0tLS0tLS0tLS0tLS0gfCAgICAgICAgICAgIHwgPC0tLS0tLS0tLS0tLS0tLS0tLSB8ICAgICAgICAgICAgfCA8LS0tLS0tLS0tLS0tLXxcbiAgICAvLyAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAtLS0tLS0tLSAgJ2NkayBkZXBsb3knIGRvbmUgIC0tLS0tLS0tLS0tLS0tICAnY2RrIGRlcGxveScgZG9uZSAgLS0tLS0tLS0tLS0tLS1cbiAgICBsZXQgbGF0Y2g6ICdwcmUtcmVhZHknIHwgJ29wZW4nIHwgJ2RlcGxveWluZycgfCAncXVldWVkJyA9ICdwcmUtcmVhZHknO1xuXG4gICAgY29uc3QgY2xvdWRXYXRjaExvZ01vbml0b3IgPSBvcHRpb25zLnRyYWNlTG9ncyA/IG5ldyBDbG91ZFdhdGNoTG9nRXZlbnRNb25pdG9yKCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVwbG95QW5kV2F0Y2ggPSBhc3luYyAoKSA9PiB7XG4gICAgICBsYXRjaCA9ICdkZXBsb3lpbmcnO1xuICAgICAgY2xvdWRXYXRjaExvZ01vbml0b3I/LmRlYWN0aXZhdGUoKTtcblxuICAgICAgYXdhaXQgdGhpcy5pbnZva2VEZXBsb3lGcm9tV2F0Y2goYXNzZW1ibHksIG9wdGlvbnMsIGNsb3VkV2F0Y2hMb2dNb25pdG9yKTtcblxuICAgICAgLy8gSWYgbGF0Y2ggaXMgc3RpbGwgJ2RlcGxveWluZycgYWZ0ZXIgdGhlICdhd2FpdCcsIHRoYXQncyBmaW5lLFxuICAgICAgLy8gYnV0IGlmIGl0J3MgJ3F1ZXVlZCcsIHRoYXQgbWVhbnMgd2UgbmVlZCB0byBkZXBsb3kgYWdhaW5cbiAgICAgIHdoaWxlICgobGF0Y2ggYXMgJ2RlcGxveWluZycgfCAncXVldWVkJykgPT09ICdxdWV1ZWQnKSB7XG4gICAgICAgIC8vIFR5cGVTY3JpcHQgZG9lc24ndCByZWFsaXplIGxhdGNoIGNhbiBjaGFuZ2UgYmV0d2VlbiAnYXdhaXRzJyxcbiAgICAgICAgLy8gYW5kIHRoaW5rcyB0aGUgYWJvdmUgJ3doaWxlJyBjb25kaXRpb24gaXMgYWx3YXlzICdmYWxzZScgd2l0aG91dCB0aGUgY2FzdFxuICAgICAgICBsYXRjaCA9ICdkZXBsb3lpbmcnO1xuICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGluZm8oXCJEZXRlY3RlZCBmaWxlIGNoYW5nZXMgZHVyaW5nIGRlcGxveW1lbnQuIEludm9raW5nICdjZGsgZGVwbG95JyBhZ2FpblwiKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW52b2tlRGVwbG95RnJvbVdhdGNoKGFzc2VtYmx5LCBvcHRpb25zLCBjbG91ZFdhdGNoTG9nTW9uaXRvcik7XG4gICAgICB9XG4gICAgICBsYXRjaCA9ICdvcGVuJztcbiAgICAgIGNsb3VkV2F0Y2hMb2dNb25pdG9yPy5hY3RpdmF0ZSgpO1xuICAgIH07XG5cbiAgICBjaG9raWRhclxuICAgICAgLndhdGNoKHdhdGNoSW5jbHVkZXMsIHtcbiAgICAgICAgaWdub3JlZDogd2F0Y2hFeGNsdWRlcyxcbiAgICAgICAgY3dkOiByb290RGlyLFxuICAgICAgfSlcbiAgICAgIC5vbigncmVhZHknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxhdGNoID0gJ29wZW4nO1xuICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGRlYnVnKFwiJ3dhdGNoJyByZWNlaXZlZCB0aGUgJ3JlYWR5JyBldmVudC4gRnJvbSBub3cgb24sIGFsbCBmaWxlIGNoYW5nZXMgd2lsbCB0cmlnZ2VyIGEgZGVwbG95bWVudFwiKSk7XG4gICAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoaW5mbyhcIlRyaWdnZXJpbmcgaW5pdGlhbCAnY2RrIGRlcGxveSdcIikpO1xuICAgICAgICBhd2FpdCBkZXBsb3lBbmRXYXRjaCgpO1xuICAgICAgfSlcbiAgICAgIC5vbignYWxsJywgYXN5bmMgKGV2ZW50OiAnYWRkJyB8ICdhZGREaXInIHwgJ2NoYW5nZScgfCAndW5saW5rJyB8ICd1bmxpbmtEaXInLCBmaWxlUGF0aD86IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAobGF0Y2ggPT09ICdwcmUtcmVhZHknKSB7XG4gICAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGAnd2F0Y2gnIGlzIG9ic2VydmluZyAke2V2ZW50ID09PSAnYWRkRGlyJyA/ICdkaXJlY3RvcnknIDogJ3RoZSBmaWxlJ30gJyR7ZmlsZVBhdGh9JyBmb3IgY2hhbmdlc2ApKTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXRjaCA9PT0gJ29wZW4nKSB7XG4gICAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGBEZXRlY3RlZCBjaGFuZ2UgdG8gJyR7ZmlsZVBhdGh9JyAodHlwZTogJHtldmVudH0pLiBUcmlnZ2VyaW5nICdjZGsgZGVwbG95J2ApKTtcbiAgICAgICAgICBhd2FpdCBkZXBsb3lBbmRXYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoaXMgbWVhbnMgbGF0Y2ggaXMgZWl0aGVyICdkZXBsb3lpbmcnIG9yICdxdWV1ZWQnXG4gICAgICAgICAgbGF0Y2ggPSAncXVldWVkJztcbiAgICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGluZm8oXG4gICAgICAgICAgICBgRGV0ZWN0ZWQgY2hhbmdlIHRvICcke2ZpbGVQYXRofScgKHR5cGU6ICR7ZXZlbnR9KSB3aGlsZSAnY2RrIGRlcGxveScgaXMgc3RpbGwgcnVubmluZy4gV2lsbCBxdWV1ZSBmb3IgYW5vdGhlciBkZXBsb3ltZW50IGFmdGVyIHRoaXMgb25lIGZpbmlzaGVzJ2AsXG4gICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIEFjdGlvblxuICAgKlxuICAgKiBSb2xscyBiYWNrIHRoZSBzZWxlY3RlZCBzdGFja3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcm9sbGJhY2soY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBSb2xsYmFja09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhc3NlbWJseSA9IGF3YWl0IGFzc2VtYmx5RnJvbVNvdXJjZShjeCk7XG4gICAgcmV0dXJuIHRoaXMuX3JvbGxiYWNrKGFzc2VtYmx5LCAncm9sbGJhY2snLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gYWxsb3cgcm9sbGJhY2sgYmVpbmcgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIGRlcGxveSBvciB3YXRjaCBhY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9yb2xsYmFjayhhc3NlbWJseTogU3RhY2tBc3NlbWJseSwgYWN0aW9uOiAncm9sbGJhY2snIHwgJ2RlcGxveScgfCAnd2F0Y2gnLCBvcHRpb25zOiBSb2xsYmFja09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpb0hvc3QgPSB3aXRoQWN0aW9uKHRoaXMuaW9Ib3N0LCBhY3Rpb24pO1xuICAgIGNvbnN0IHN5bnRoVGltZXIgPSBUaW1lci5zdGFydCgpO1xuICAgIGNvbnN0IHN0YWNrcyA9IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKG9wdGlvbnMuc3RhY2tzKTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlU3RhY2tzTWV0YWRhdGEoc3RhY2tzLCBpb0hvc3QpO1xuICAgIGF3YWl0IHN5bnRoVGltZXIuZW5kQXMoaW9Ib3N0LCAnc3ludGgnKTtcblxuICAgIGlmIChzdGFja3Muc3RhY2tDb3VudCA9PT0gMCkge1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShlcnJvcignTm8gc3RhY2tzIHNlbGVjdGVkJywgQ09ERVMuQ0RLX1RPT0xLSVRfRTYwMDEpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgYW55Um9sbGJhY2thYmxlID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWNrcy5zdGFja0FydGlmYWN0cykge1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGBSb2xsaW5nIGJhY2sgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX1gKSk7XG4gICAgICBjb25zdCByb2xsYmFja1RpbWVyID0gVGltZXIuc3RhcnQoKTtcbiAgICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbigncm9sbGJhY2snKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YWNrUmVzdWx0ID0gYXdhaXQgZGVwbG95bWVudHMucm9sbGJhY2tTdGFjayh7XG4gICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgIHRvb2xraXRTdGFja05hbWU6IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgICBmb3JjZTogb3B0aW9ucy5vcnBoYW5GYWlsZWRSZXNvdXJjZXMsXG4gICAgICAgICAgdmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb246IG9wdGlvbnMudmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb24sXG4gICAgICAgICAgb3JwaGFuTG9naWNhbElkczogb3B0aW9ucy5vcnBoYW5Mb2dpY2FsSWRzLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFzdGFja1Jlc3VsdC5ub3RJblJvbGxiYWNrYWJsZVN0YXRlKSB7XG4gICAgICAgICAgYW55Um9sbGJhY2thYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCByb2xsYmFja1RpbWVyLmVuZEFzKGlvSG9zdCwgJ3JvbGxiYWNrJyk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShlcnJvcihgXFxuIOKdjCAgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX0gZmFpbGVkOiAke2Zvcm1hdEVycm9yTWVzc2FnZShlKX1gLCBDT0RFUy5DREtfVE9PTEtJVF9FNjkwMCkpO1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdSb2xsYmFjayBmYWlsZWQgKHVzZSAtLWZvcmNlIHRvIG9ycGhhbiBmYWlsaW5nIHJlc291cmNlcyknKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFhbnlSb2xsYmFja2FibGUpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ05vIHN0YWNrcyB3ZXJlIGluIGEgc3RhdGUgdGhhdCBjb3VsZCBiZSByb2xsZWQgYmFjaycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IEFjdGlvblxuICAgKlxuICAgKiBEZXN0cm95cyB0aGUgc2VsZWN0ZWQgU3RhY2tzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlc3Ryb3koY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBEZXN0cm95T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gYXdhaXQgYXNzZW1ibHlGcm9tU291cmNlKGN4KTtcbiAgICByZXR1cm4gdGhpcy5fZGVzdHJveShhc3NlbWJseSwgJ2Rlc3Ryb3knLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gYWxsb3cgZGVzdHJveSBiZWluZyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgZGVwbG95IGFjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2Rlc3Ryb3koYXNzZW1ibHk6IFN0YWNrQXNzZW1ibHksIGFjdGlvbjogJ2RlcGxveScgfCAnZGVzdHJveScsIG9wdGlvbnM6IERlc3Ryb3lPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW9Ib3N0ID0gd2l0aEFjdGlvbih0aGlzLmlvSG9zdCwgYWN0aW9uKTtcbiAgICBjb25zdCBzeW50aFRpbWVyID0gVGltZXIuc3RhcnQoKTtcbiAgICAvLyBUaGUgc3RhY2tzIHdpbGwgaGF2ZSBiZWVuIG9yZGVyZWQgZm9yIGRlcGxveW1lbnQsIHNvIHJldmVyc2UgdGhlbSBmb3IgZGVsZXRpb24uXG4gICAgY29uc3Qgc3RhY2tzID0gYXdhaXQgYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIob3B0aW9ucy5zdGFja3MpLnJldmVyc2VkKCk7XG4gICAgYXdhaXQgc3ludGhUaW1lci5lbmRBcyhpb0hvc3QsICdzeW50aCcpO1xuXG4gICAgY29uc3QgbW90aXZhdGlvbiA9ICdEZXN0cm95aW5nIHN0YWNrcyBpcyBhbiBpcnJldmVyc2libGUgYWN0aW9uJztcbiAgICBjb25zdCBxdWVzdGlvbiA9IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlOiAke2NoYWxrLnJlZChzdGFja3MuaGllcmFyY2hpY2FsSWRzLmpvaW4oJywgJykpfWA7XG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgaW9Ib3N0LnJlcXVlc3RSZXNwb25zZShjb25maXJtKENPREVTLkNES19UT09MS0lUX0k3MDEwLCBxdWVzdGlvbiwgbW90aXZhdGlvbiwgdHJ1ZSkpO1xuICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICByZXR1cm4gaW9Ib3N0Lm5vdGlmeShlcnJvcignQWJvcnRlZCBieSB1c2VyJywgQ09ERVMuQ0RLX1RPT0xLSVRfRTcwMTApKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXN0cm95VGltZXIgPSBUaW1lci5zdGFydCgpO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgc3RhY2tdIG9mIHN0YWNrcy5zdGFja0FydGlmYWN0cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShzdWNjZXNzKGAke2NoYWxrLmJsdWUoc3RhY2suZGlzcGxheU5hbWUpfTogZGVzdHJveWluZy4uLiBbJHtpbmRleCArIDF9LyR7c3RhY2tzLnN0YWNrQ291bnR9XWApKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkZXBsb3ltZW50cyA9IGF3YWl0IHRoaXMuZGVwbG95bWVudHNGb3JBY3Rpb24oYWN0aW9uKTtcbiAgICAgICAgICBhd2FpdCBkZXBsb3ltZW50cy5kZXN0cm95U3RhY2soe1xuICAgICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgICBkZXBsb3lOYW1lOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShzdWNjZXNzKGBcXG4g4pyFICAke2NoYWxrLmJsdWUoc3RhY2suZGlzcGxheU5hbWUpfTogJHthY3Rpb259ZWRgKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGVycm9yKGBcXG4g4p2MICAke2NoYWxrLmJsdWUoc3RhY2suZGlzcGxheU5hbWUpfTogJHthY3Rpb259IGZhaWxlZCAke2V9YCwgQ09ERVMuQ0RLX1RPT0xLSVRfRTc5MDApKTtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGRlc3Ryb3lUaW1lci5lbmRBcyhpb0hvc3QsICdkZXN0cm95Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBzdGFja3MgZm9yIGVycm9ycyBhbmQgd2FybmluZ3MgYWNjb3JkaW5nIHRvIHRoZSBDTEkncyBjdXJyZW50IHNldHRpbmdzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlU3RhY2tzTWV0YWRhdGEoc3RhY2tzOiBTdGFja0NvbGxlY3Rpb24sIGlvSG9zdDogQWN0aW9uQXdhcmVJb0hvc3QpIHtcbiAgICAvLyBAVE9ETyBkZWZpbmUgdGhlc2Ugc29tZXdoZXJlIGNlbnRyYWxcbiAgICBjb25zdCBjb2RlID0gKGxldmVsOiBJb01lc3NhZ2VMZXZlbCk6IElvTWVzc2FnZUNvZGUgPT4ge1xuICAgICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgICBjYXNlICdlcnJvcic6IHJldHVybiAnQ0RLX0FTU0VNQkxZX0U5OTk5JztcbiAgICAgICAgY2FzZSAnd2Fybic6IHJldHVybiAnQ0RLX0FTU0VNQkxZX1c5OTk5JztcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuICdDREtfQVNTRU1CTFlfSTk5OTknO1xuICAgICAgfVxuICAgIH07XG4gICAgYXdhaXQgc3RhY2tzLnZhbGlkYXRlTWV0YWRhdGEodGhpcy5wcm9wcy5hc3NlbWJseUZhaWx1cmVBdCwgYXN5bmMgKGxldmVsLCBtc2cpID0+IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgIGxldmVsLFxuICAgICAgY29kZTogY29kZShsZXZlbCksXG4gICAgICBtZXNzYWdlOiBgWyR7bGV2ZWx9IGF0ICR7bXNnLmlkfV0gJHttc2cuZW50cnkuZGF0YX1gLFxuICAgICAgZGF0YTogbXNnLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBkZXBsb3ltZW50cyBjbGFzc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZXBsb3ltZW50c0ZvckFjdGlvbihhY3Rpb246IFRvb2xraXRBY3Rpb24pOiBQcm9taXNlPERlcGxveW1lbnRzPiB7XG4gICAgcmV0dXJuIG5ldyBEZXBsb3ltZW50cyh7XG4gICAgICBzZGtQcm92aWRlcjogYXdhaXQgdGhpcy5zZGtQcm92aWRlcihhY3Rpb24pLFxuICAgICAgdG9vbGtpdFN0YWNrTmFtZTogdGhpcy50b29sa2l0U3RhY2tOYW1lLFxuICAgICAgaW9Ib3N0OiB0aGlzLmlvSG9zdCBhcyBhbnksIC8vIEB0b2RvIHRlbXBvcmFyeSB3aGlsZSB3ZSBoYXZlIHRvIHNlcGFyYXRlIElJb0hvc3QgaW50ZXJmYWNlc1xuICAgICAgYWN0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbnZva2VEZXBsb3lGcm9tV2F0Y2goXG4gICAgYXNzZW1ibHk6IFN0YWNrQXNzZW1ibHksXG4gICAgb3B0aW9uczogV2F0Y2hPcHRpb25zLFxuICAgIGNsb3VkV2F0Y2hMb2dNb25pdG9yPzogQ2xvdWRXYXRjaExvZ0V2ZW50TW9uaXRvcixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gd2F0Y2ggZGVmYXVsdHMgaG90c3dhcCB0byBlbmFibGVkXG4gICAgY29uc3QgaG90c3dhcCA9IG9wdGlvbnMuaG90c3dhcCA/PyBIb3Rzd2FwTW9kZS5IT1RTV0FQX09OTFk7XG4gICAgY29uc3QgZGVwbG95T3B0aW9uczogRXh0ZW5kZWREZXBsb3lPcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHJlcXVpcmVBcHByb3ZhbDogUmVxdWlyZUFwcHJvdmFsLk5FVkVSLFxuICAgICAgY2xvdWRXYXRjaExvZ01vbml0b3IsXG4gICAgICBob3Rzd2FwLFxuICAgICAgZXh0cmFVc2VyQWdlbnQ6IGBjZGstd2F0Y2gvaG90c3dhcC0ke2hvdHN3YXAgPT09IEhvdHN3YXBNb2RlLkZVTExfREVQTE9ZTUVOVCA/ICdvZmYnIDogJ29uJ31gLFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fZGVwbG95KGFzc2VtYmx5LCAnd2F0Y2gnLCBkZXBsb3lPcHRpb25zKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGp1c3QgY29udGludWUgLSBkZXBsb3kgd2lsbCBzaG93IHRoZSBlcnJvclxuICAgIH1cbiAgfVxufVxuIl19