aws-cdk 2.1000.2 → 2.1000.3

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 (118) hide show
  1. package/README.md +1 -1
  2. package/THIRD_PARTY_LICENSES +104 -3196
  3. package/build-info.json +2 -2
  4. package/db.json.gz +0 -0
  5. package/lib/api/aws-auth/account-cache.d.ts +0 -3
  6. package/lib/api/aws-auth/account-cache.js +1 -4
  7. package/lib/api/aws-auth/awscli-compatible.js +1 -1
  8. package/lib/api/aws-auth/credential-plugins.js +4 -4
  9. package/lib/api/aws-auth/sdk-logger.js +2 -2
  10. package/lib/api/aws-auth/sdk-provider.js +3 -3
  11. package/lib/api/aws-auth/sdk.js +3 -3
  12. package/lib/api/aws-auth/tracing.js +1 -1
  13. package/lib/api/bootstrap/bootstrap-environment.js +3 -3
  14. package/lib/api/bootstrap/deploy-bootstrap.js +1 -1
  15. package/lib/api/cxapp/cloud-assembly.js +3 -2
  16. package/lib/api/cxapp/cloud-executable.js +1 -1
  17. package/lib/api/cxapp/environments.js +1 -1
  18. package/lib/api/cxapp/exec.js +1 -1
  19. package/lib/api/deployments/asset-publishing.js +1 -1
  20. package/lib/api/deployments/assets.js +1 -1
  21. package/lib/api/deployments/cloudformation.d.ts +2 -2
  22. package/lib/api/deployments/cloudformation.js +7 -7
  23. package/lib/api/deployments/deploy-stack.d.ts +1 -1
  24. package/lib/api/deployments/deploy-stack.js +8 -8
  25. package/lib/api/deployments/deployments.d.ts +3 -3
  26. package/lib/api/deployments/deployments.js +12 -14
  27. package/lib/api/deployments/hotswap-deployments.js +3 -3
  28. package/lib/api/deployments/nested-stack-helpers.js +3 -3
  29. package/lib/api/environment/environment-access.js +3 -3
  30. package/lib/api/environment/environment-resources.js +3 -3
  31. package/lib/api/evaluate-cloudformation-template.js +2 -2
  32. package/lib/api/garbage-collection/garbage-collector.js +1 -1
  33. package/lib/api/hotswap/appsync-mapping-templates.js +2 -2
  34. package/lib/api/hotswap/common.d.ts +1 -1
  35. package/lib/api/hotswap/common.js +2 -2
  36. package/lib/api/hotswap/lambda-functions.js +5 -3
  37. package/lib/api/logs/find-cloudwatch-logs.js +3 -3
  38. package/lib/api/logs/index.d.ts +2 -0
  39. package/lib/api/logs/index.js +19 -0
  40. package/lib/api/resource-import/importer.d.ts +2 -2
  41. package/lib/api/resource-import/importer.js +1 -1
  42. package/lib/api/resource-import/migrator.js +2 -2
  43. package/lib/api/settings.js +1 -1
  44. package/lib/api/{util → stack-events}/display.js +1 -1
  45. package/lib/api/stack-events/index.d.ts +3 -0
  46. package/lib/api/stack-events/index.js +20 -0
  47. package/lib/api/{util/cloudformation → stack-events}/stack-activity-monitor.d.ts +2 -2
  48. package/lib/api/{util/cloudformation → stack-events}/stack-activity-monitor.js +4 -4
  49. package/lib/api/{util/cloudformation → stack-events}/stack-event-poller.d.ts +1 -1
  50. package/lib/api/{util/cloudformation → stack-events}/stack-event-poller.js +3 -3
  51. package/lib/api/{util/cloudformation → stack-events}/stack-status.js +1 -1
  52. package/lib/api/toolkit-info.js +3 -2
  53. package/lib/api/util/rwlock.js +1 -1
  54. package/lib/api/util/template-body-parameter.js +2 -2
  55. package/lib/api/work-graph/index.d.ts +3 -0
  56. package/lib/api/work-graph/index.js +20 -0
  57. package/lib/{util → api/work-graph}/work-graph-builder.d.ts +4 -1
  58. package/lib/api/work-graph/work-graph-builder.js +169 -0
  59. package/lib/api/work-graph/work-graph-types.js +13 -0
  60. package/lib/{util → api/work-graph}/work-graph.d.ts +9 -2
  61. package/lib/api/work-graph/work-graph.js +349 -0
  62. package/lib/cli/cdk-toolkit.d.ts +3 -3
  63. package/lib/cli/cdk-toolkit.js +19 -17
  64. package/lib/cli/cli-config.js +5 -5
  65. package/lib/cli/cli.js +2 -2
  66. package/lib/cli/parse-command-line-arguments.js +2 -2
  67. package/lib/cli/platform-warnings.js +1 -1
  68. package/lib/cli/user-input.d.ts +3 -10
  69. package/lib/cli/user-input.js +1 -1
  70. package/lib/commands/context.js +3 -3
  71. package/lib/commands/docs.js +1 -1
  72. package/lib/commands/doctor.js +1 -1
  73. package/lib/context-providers/ami.js +1 -1
  74. package/lib/context-providers/availability-zones.js +1 -1
  75. package/lib/context-providers/endpoint-service-availability-zones.js +1 -1
  76. package/lib/context-providers/hosted-zones.js +1 -1
  77. package/lib/context-providers/index.js +3 -3
  78. package/lib/context-providers/keys.js +1 -1
  79. package/lib/context-providers/load-balancers.js +1 -1
  80. package/lib/context-providers/security-groups.js +1 -1
  81. package/lib/context-providers/ssm-parameters.js +1 -1
  82. package/lib/context-providers/vpcs.js +1 -1
  83. package/lib/diff.js +1 -1
  84. package/lib/index.js +80105 -89787
  85. package/lib/init-hooks.js +3 -4
  86. package/lib/init-templates/.init-version.json +1 -1
  87. package/lib/init-templates/.recommended-feature-flags.json +2 -1
  88. package/lib/init.js +3 -3
  89. package/lib/legacy-exports-source.d.ts +1 -1
  90. package/lib/legacy-exports-source.js +2 -2
  91. package/lib/notices.js +5 -5
  92. package/lib/util/archive.js +3 -3
  93. package/lib/util/cloudformation.js +10 -0
  94. package/lib/util/directories.js +3 -2
  95. package/lib/util/format-error.js +22 -0
  96. package/lib/util/index.d.ts +11 -1
  97. package/lib/util/index.js +12 -2
  98. package/lib/util/objects.js +1 -1
  99. package/lib/util/parallel.js +7 -3
  100. package/lib/{serialize.js → util/serialize.js} +3 -3
  101. package/lib/util/version-range.js +1 -1
  102. package/lib/util/yaml-cfn.js +4 -2
  103. package/package.json +17 -16
  104. package/lib/util/error.js +0 -22
  105. package/lib/util/validate-notification-arn.js +0 -10
  106. package/lib/util/work-graph-builder.js +0 -167
  107. package/lib/util/work-graph-types.js +0 -14
  108. package/lib/util/work-graph.js +0 -344
  109. /package/lib/api/{util → stack-events}/display.d.ts +0 -0
  110. /package/lib/api/{util/cloudformation → stack-events}/stack-status.d.ts +0 -0
  111. /package/lib/{util → api/work-graph}/work-graph-types.d.ts +0 -0
  112. /package/lib/{util → cli}/tables.d.ts +0 -0
  113. /package/lib/{util → cli}/tables.js +0 -0
  114. /package/lib/util/{validate-notification-arn.d.ts → cloudformation.d.ts} +0 -0
  115. /package/lib/util/{error.d.ts → format-error.d.ts} +0 -0
  116. /package/lib/{serialize.d.ts → util/serialize.d.ts} +0 -0
  117. /package/lib/{api/util → util}/string-manipulation.d.ts +0 -0
  118. /package/lib/{api/util → util}/string-manipulation.js +0 -0
@@ -0,0 +1,349 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkGraph = void 0;
4
+ const work_graph_types_1 = require("./work-graph-types");
5
+ const messages_1 = require("../../cli/messages");
6
+ const error_1 = require("../../toolkit/error");
7
+ const parallel_1 = require("../../util/parallel");
8
+ class WorkGraph {
9
+ constructor(nodes, props) {
10
+ this.readyPool = [];
11
+ this.lazyDependencies = new Map();
12
+ this.nodes = { ...nodes };
13
+ this.ioHost = props.ioHost;
14
+ this.action = props.action;
15
+ }
16
+ addNodes(...nodes) {
17
+ for (const node of nodes) {
18
+ if (this.nodes[node.id]) {
19
+ throw new error_1.ToolkitError(`Duplicate use of node id: ${node.id}`);
20
+ }
21
+ const ld = this.lazyDependencies.get(node.id);
22
+ if (ld) {
23
+ for (const x of ld) {
24
+ node.dependencies.add(x);
25
+ }
26
+ this.lazyDependencies.delete(node.id);
27
+ }
28
+ this.nodes[node.id] = node;
29
+ }
30
+ }
31
+ removeNode(nodeId) {
32
+ const id = typeof nodeId === 'string' ? nodeId : nodeId.id;
33
+ const removedNode = this.nodes[id];
34
+ this.lazyDependencies.delete(id);
35
+ delete this.nodes[id];
36
+ if (removedNode) {
37
+ for (const node of Object.values(this.nodes)) {
38
+ node.dependencies.delete(removedNode.id);
39
+ }
40
+ }
41
+ }
42
+ /**
43
+ * Return all nodes of a given type
44
+ */
45
+ nodesOfType(type) {
46
+ return Object.values(this.nodes).filter(n => n.type === type);
47
+ }
48
+ /**
49
+ * Return all nodes that depend on a given node
50
+ */
51
+ dependees(nodeId) {
52
+ const id = typeof nodeId === 'string' ? nodeId : nodeId.id;
53
+ return Object.values(this.nodes).filter(n => n.dependencies.has(id));
54
+ }
55
+ /**
56
+ * Add a dependency, that may come before or after the nodes involved
57
+ */
58
+ addDependency(fromId, toId) {
59
+ const node = this.nodes[fromId];
60
+ if (node) {
61
+ node.dependencies.add(toId);
62
+ return;
63
+ }
64
+ let lazyDeps = this.lazyDependencies.get(fromId);
65
+ if (!lazyDeps) {
66
+ lazyDeps = [];
67
+ this.lazyDependencies.set(fromId, lazyDeps);
68
+ }
69
+ lazyDeps.push(toId);
70
+ }
71
+ tryGetNode(id) {
72
+ return this.nodes[id];
73
+ }
74
+ node(id) {
75
+ const ret = this.nodes[id];
76
+ if (!ret) {
77
+ throw new error_1.ToolkitError(`No node with id ${id} among ${Object.keys(this.nodes)}`);
78
+ }
79
+ return ret;
80
+ }
81
+ absorb(graph) {
82
+ this.addNodes(...Object.values(graph.nodes));
83
+ }
84
+ hasFailed() {
85
+ return Object.values(this.nodes).some((n) => n.deploymentState === work_graph_types_1.DeploymentState.FAILED);
86
+ }
87
+ doParallel(concurrency, actions) {
88
+ return this.forAllArtifacts(concurrency, async (x) => {
89
+ switch (x.type) {
90
+ case 'stack':
91
+ await actions.deployStack(x);
92
+ break;
93
+ case 'asset-build':
94
+ await actions.buildAsset(x);
95
+ break;
96
+ case 'asset-publish':
97
+ await actions.publishAsset(x);
98
+ break;
99
+ }
100
+ });
101
+ }
102
+ /**
103
+ * Return the set of unblocked nodes
104
+ */
105
+ async ready() {
106
+ await this.updateReadyPool();
107
+ return this.readyPool;
108
+ }
109
+ forAllArtifacts(n, fn) {
110
+ const graph = this;
111
+ // If 'n' is a number, we limit all concurrency equally (effectively we will be using totalMax)
112
+ // If 'n' is a record, we limit each job independently (effectively we will be using max)
113
+ const max = typeof n === 'number' ?
114
+ {
115
+ 'asset-build': n,
116
+ 'asset-publish': n,
117
+ 'stack': n,
118
+ } : n;
119
+ const totalMax = typeof n === 'number' ? n : sum(Object.values(n));
120
+ return new Promise((ok, fail) => {
121
+ let active = {
122
+ 'asset-build': 0,
123
+ 'asset-publish': 0,
124
+ 'stack': 0,
125
+ };
126
+ function totalActive() {
127
+ return sum(Object.values(active));
128
+ }
129
+ start();
130
+ function start() {
131
+ graph.updateReadyPool().then(() => {
132
+ for (let i = 0; i < graph.readyPool.length;) {
133
+ const node = graph.readyPool[i];
134
+ if (active[node.type] < max[node.type] && totalActive() < totalMax) {
135
+ graph.readyPool.splice(i, 1);
136
+ startOne(node);
137
+ }
138
+ else {
139
+ i += 1;
140
+ }
141
+ }
142
+ if (totalActive() === 0) {
143
+ if (graph.done()) {
144
+ ok();
145
+ }
146
+ // wait for other active deploys to finish before failing
147
+ if (graph.hasFailed()) {
148
+ fail(graph.error);
149
+ }
150
+ }
151
+ }).catch((e) => {
152
+ fail(e);
153
+ });
154
+ }
155
+ function startOne(x) {
156
+ x.deploymentState = work_graph_types_1.DeploymentState.DEPLOYING;
157
+ active[x.type]++;
158
+ void fn(x)
159
+ .finally(() => {
160
+ active[x.type]--;
161
+ })
162
+ .then(() => {
163
+ graph.deployed(x);
164
+ start();
165
+ }).catch((err) => {
166
+ // By recording the failure immediately as the queued task exits, we prevent the next
167
+ // queued task from starting.
168
+ graph.failed(x, err);
169
+ start();
170
+ });
171
+ }
172
+ });
173
+ }
174
+ done() {
175
+ return Object.values(this.nodes).every((n) => work_graph_types_1.DeploymentState.COMPLETED === n.deploymentState);
176
+ }
177
+ deployed(node) {
178
+ node.deploymentState = work_graph_types_1.DeploymentState.COMPLETED;
179
+ }
180
+ failed(node, error) {
181
+ this.error = error;
182
+ node.deploymentState = work_graph_types_1.DeploymentState.FAILED;
183
+ this.skipRest();
184
+ this.readyPool.splice(0);
185
+ }
186
+ toString() {
187
+ return [
188
+ 'digraph D {',
189
+ ...Object.entries(this.nodes).flatMap(([id, node]) => renderNode(id, node)),
190
+ '}',
191
+ ].join('\n');
192
+ function renderNode(id, node) {
193
+ const ret = [];
194
+ if (node.deploymentState === work_graph_types_1.DeploymentState.COMPLETED) {
195
+ ret.push(` ${gv(id, { style: 'filled', fillcolor: 'yellow', comment: node.note })};`);
196
+ }
197
+ else {
198
+ ret.push(` ${gv(id, { comment: node.note })};`);
199
+ }
200
+ for (const dep of node.dependencies) {
201
+ ret.push(` ${gv(id)} -> ${gv(dep)};`);
202
+ }
203
+ return ret;
204
+ }
205
+ }
206
+ /**
207
+ * Ensure all dependencies actually exist. This protects against scenarios such as the following:
208
+ * StackA depends on StackB, but StackB is not selected to deploy. The dependency is redundant
209
+ * and will be dropped.
210
+ * This assumes the manifest comes uncorrupted so we will not fail if a dependency is not found.
211
+ */
212
+ removeUnavailableDependencies() {
213
+ for (const node of Object.values(this.nodes)) {
214
+ const removeDeps = Array.from(node.dependencies).filter((dep) => this.nodes[dep] === undefined);
215
+ removeDeps.forEach((d) => {
216
+ node.dependencies.delete(d);
217
+ });
218
+ }
219
+ }
220
+ /**
221
+ * Remove all asset publishing steps for assets that are already published, and then build
222
+ * that aren't used anymore.
223
+ *
224
+ * Do this in parallel, because there may be a lot of assets in an application (seen in practice: >100 assets)
225
+ */
226
+ async removeUnnecessaryAssets(isUnnecessary) {
227
+ await this.ioHost.notify((0, messages_1.debug)(this.action, 'Checking for previously published assets'));
228
+ const publishes = this.nodesOfType('asset-publish');
229
+ const classifiedNodes = await (0, parallel_1.parallelPromises)(8, publishes.map((assetNode) => async () => [assetNode, await isUnnecessary(assetNode)]));
230
+ const alreadyPublished = classifiedNodes.filter(([_, unnecessary]) => unnecessary).map(([assetNode, _]) => assetNode);
231
+ for (const assetNode of alreadyPublished) {
232
+ this.removeNode(assetNode);
233
+ }
234
+ await this.ioHost.notify((0, messages_1.debug)(this.action, `${publishes.length} total assets, ${publishes.length - alreadyPublished.length} still need to be published`));
235
+ // Now also remove any asset build steps that don't have any dependencies on them anymore
236
+ const unusedBuilds = this.nodesOfType('asset-build').filter(build => this.dependees(build).length === 0);
237
+ for (const unusedBuild of unusedBuilds) {
238
+ this.removeNode(unusedBuild);
239
+ }
240
+ }
241
+ async updateReadyPool() {
242
+ var _a;
243
+ const activeCount = Object.values(this.nodes).filter((x) => x.deploymentState === work_graph_types_1.DeploymentState.DEPLOYING).length;
244
+ const pendingCount = Object.values(this.nodes).filter((x) => x.deploymentState === work_graph_types_1.DeploymentState.PENDING).length;
245
+ const newlyReady = Object.values(this.nodes).filter((x) => x.deploymentState === work_graph_types_1.DeploymentState.PENDING &&
246
+ Array.from(x.dependencies).every((id) => this.node(id).deploymentState === work_graph_types_1.DeploymentState.COMPLETED));
247
+ // Add newly available nodes to the ready pool
248
+ for (const node of newlyReady) {
249
+ node.deploymentState = work_graph_types_1.DeploymentState.QUEUED;
250
+ this.readyPool.push(node);
251
+ }
252
+ // Remove nodes from the ready pool that have already started deploying
253
+ retainOnly(this.readyPool, (node) => node.deploymentState === work_graph_types_1.DeploymentState.QUEUED);
254
+ // Sort by reverse priority
255
+ this.readyPool.sort((a, b) => { var _a, _b; return ((_a = b.priority) !== null && _a !== void 0 ? _a : 0) - ((_b = a.priority) !== null && _b !== void 0 ? _b : 0); });
256
+ if (this.readyPool.length === 0 && activeCount === 0 && pendingCount > 0) {
257
+ const cycle = (_a = this.findCycle()) !== null && _a !== void 0 ? _a : ['No cycle found!'];
258
+ await this.ioHost.notify((0, messages_1.trace)(this.action, `Cycle ${cycle.join(' -> ')} in graph ${this}`));
259
+ throw new error_1.ToolkitError(`Unable to make progress anymore, dependency cycle between remaining artifacts: ${cycle.join(' -> ')} (run with -vv for full graph)`);
260
+ }
261
+ }
262
+ skipRest() {
263
+ for (const node of Object.values(this.nodes)) {
264
+ if ([work_graph_types_1.DeploymentState.QUEUED, work_graph_types_1.DeploymentState.PENDING].includes(node.deploymentState)) {
265
+ node.deploymentState = work_graph_types_1.DeploymentState.SKIPPED;
266
+ }
267
+ }
268
+ }
269
+ /**
270
+ * Find cycles in a graph
271
+ *
272
+ * Not the fastest, but effective and should be rare
273
+ */
274
+ findCycle() {
275
+ const seen = new Set();
276
+ const self = this;
277
+ for (const nodeId of Object.keys(this.nodes)) {
278
+ const cycle = recurse(nodeId, [nodeId]);
279
+ if (cycle) {
280
+ return cycle;
281
+ }
282
+ }
283
+ return undefined;
284
+ function recurse(nodeId, path) {
285
+ var _a;
286
+ if (seen.has(nodeId)) {
287
+ return undefined;
288
+ }
289
+ try {
290
+ for (const dep of (_a = self.nodes[nodeId].dependencies) !== null && _a !== void 0 ? _a : []) {
291
+ const index = path.indexOf(dep);
292
+ if (index > -1) {
293
+ return [...path.slice(index), dep];
294
+ }
295
+ const cycle = recurse(dep, [...path, dep]);
296
+ if (cycle) {
297
+ return cycle;
298
+ }
299
+ }
300
+ return undefined;
301
+ }
302
+ finally {
303
+ seen.add(nodeId);
304
+ }
305
+ }
306
+ }
307
+ /**
308
+ * Whether the `end` node is reachable from the `start` node, following the dependency arrows
309
+ */
310
+ reachable(start, end) {
311
+ const seen = new Set();
312
+ const self = this;
313
+ return recurse(start);
314
+ function recurse(current) {
315
+ if (seen.has(current)) {
316
+ return false;
317
+ }
318
+ seen.add(current);
319
+ if (current === end) {
320
+ return true;
321
+ }
322
+ for (const dep of self.nodes[current].dependencies) {
323
+ if (recurse(dep)) {
324
+ return true;
325
+ }
326
+ }
327
+ return false;
328
+ }
329
+ }
330
+ }
331
+ exports.WorkGraph = WorkGraph;
332
+ function sum(xs) {
333
+ let ret = 0;
334
+ for (const x of xs) {
335
+ ret += x;
336
+ }
337
+ return ret;
338
+ }
339
+ function retainOnly(xs, pred) {
340
+ xs.splice(0, xs.length, ...xs.filter(pred));
341
+ }
342
+ function gv(id, attrs) {
343
+ const attrString = Object.entries(attrs !== null && attrs !== void 0 ? attrs : {}).flatMap(([k, v]) => v !== undefined ? [`${k}="${v}"`] : []).join(',');
344
+ return attrString ? `"${simplifyId(id)}" [${attrString}]` : `"${simplifyId(id)}"`;
345
+ }
346
+ function simplifyId(id) {
347
+ return id.replace(/([0-9a-f]{6})[0-9a-f]{6,}/g, '$1');
348
+ }
349
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yay1ncmFwaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndvcmstZ3JhcGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseURBQTRHO0FBQzVHLGlEQUFrRDtBQUVsRCwrQ0FBbUQ7QUFDbkQsa0RBQXVEO0FBU3ZELE1BQWEsU0FBUztJQVNwQixZQUFtQixLQUErQixFQUFFLEtBQXFCO1FBUHhELGNBQVMsR0FBb0IsRUFBRSxDQUFDO1FBQ2hDLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBTzlELElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO1FBRTFCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDN0IsQ0FBQztJQUVNLFFBQVEsQ0FBQyxHQUFHLEtBQWlCO1FBQ2xDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUN4QixNQUFNLElBQUksb0JBQVksQ0FBQyw2QkFBNkIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDakUsQ0FBQztZQUVELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ1AsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztvQkFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFD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Q0FBQztBQUVELFNBQVMsVUFBVSxDQUFJLEVBQU8sRUFBRSxJQUF1QjtJQUNyRCxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCxTQUFTLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBMEM7SUFDaEUsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLGFBQUwsS0FBSyxjQUFMLEtBQUssR0FBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFckgsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO0FBQ3BGLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxFQUFVO0lBQzVCLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN4RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV29ya05vZGUsIERlcGxveW1lbnRTdGF0ZSwgU3RhY2tOb2RlLCBBc3NldEJ1aWxkTm9kZSwgQXNzZXRQdWJsaXNoTm9kZSB9IGZyb20gJy4vd29yay1ncmFwaC10eXBlcyc7XG5pbXBvcnQgeyBkZWJ1ZywgdHJhY2UgfSBmcm9tICcuLi8uLi9jbGkvbWVzc2FnZXMnO1xuaW1wb3J0IHsgSW9NZXNzYWdpbmcgfSBmcm9tICcuLi8uLi90b29sa2l0L2NsaS1pby1ob3N0JztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3Rvb2xraXQvZXJyb3InO1xuaW1wb3J0IHsgcGFyYWxsZWxQcm9taXNlcyB9IGZyb20gJy4uLy4uL3V0aWwvcGFyYWxsZWwnO1xuXG5leHBvcnQgdHlwZSBDb25jdXJyZW5jeSA9IG51bWJlciB8IFJlY29yZDxXb3JrTm9kZVsndHlwZSddLCBudW1iZXI+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtHcmFwaFByb3BzIHtcbiAgaW9Ib3N0OiBJb01lc3NhZ2luZ1snaW9Ib3N0J107XG4gIGFjdGlvbjogSW9NZXNzYWdpbmdbJ2FjdGlvbiddO1xufVxuXG5leHBvcnQgY2xhc3MgV29ya0dyYXBoIHtcbiAgcHVibGljIHJlYWRvbmx5IG5vZGVzOiBSZWNvcmQ8c3RyaW5nLCBXb3JrTm9kZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhZHlQb29sOiBBcnJheTxXb3JrTm9kZT4gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBsYXp5RGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlvSG9zdDogSW9NZXNzYWdpbmdbJ2lvSG9zdCddO1xuICBwcml2YXRlIHJlYWRvbmx5IGFjdGlvbjogSW9NZXNzYWdpbmdbJ2FjdGlvbiddO1xuXG4gIHB1YmxpYyBlcnJvcj86IEVycm9yO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihub2RlczogUmVjb3JkPHN0cmluZywgV29ya05vZGU+LCBwcm9wczogV29ya0dyYXBoUHJvcHMpIHtcbiAgICB0aGlzLm5vZGVzID0geyAuLi5ub2RlcyB9O1xuXG4gICAgdGhpcy5pb0hvc3QgPSBwcm9wcy5pb0hvc3Q7XG4gICAgdGhpcy5hY3Rpb24gPSBwcm9wcy5hY3Rpb247XG4gIH1cblxuICBwdWJsaWMgYWRkTm9kZXMoLi4ubm9kZXM6IFdvcmtOb2RlW10pIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgIGlmICh0aGlzLm5vZGVzW25vZGUuaWRdKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYER1cGxpY2F0ZSB1c2Ugb2Ygbm9kZSBpZDogJHtub2RlLmlkfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsZCA9IHRoaXMubGF6eURlcGVuZGVuY2llcy5nZXQobm9kZS5pZCk7XG4gICAgICBpZiAobGQpIHtcbiAgICAgICAgZm9yIChjb25zdCB4IG9mIGxkKSB7XG4gICAgICAgICAgbm9kZS5kZXBlbmRlbmNpZXMuYWRkKHgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGF6eURlcGVuZGVuY2llcy5kZWxldGUobm9kZS5pZCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubm9kZXNbbm9kZS5pZF0gPSBub2RlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVOb2RlKG5vZGVJZDogc3RyaW5nIHwgV29ya05vZGUpIHtcbiAgICBjb25zdCBpZCA9IHR5cGVvZiBub2RlSWQgPT09ICdzdHJpbmcnID8gbm9kZUlkIDogbm9kZUlkLmlkO1xuICAgIGNvbnN0IHJlbW92ZWROb2RlID0gdGhpcy5ub2Rlc1tpZF07XG5cbiAgICB0aGlzLmxhenlEZXBlbmRlbmNpZXMuZGVsZXRlKGlkKTtcbiAgICBkZWxldGUgdGhpcy5ub2Rlc1tpZF07XG5cbiAgICBpZiAocmVtb3ZlZE5vZGUpIHtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBPYmplY3QudmFsdWVzKHRoaXMubm9kZXMpKSB7XG4gICAgICAgIG5vZGUuZGVwZW5kZW5jaWVzLmRlbGV0ZShyZW1vdmVkTm9kZS5pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbGwgbm9kZXMgb2YgYSBnaXZlbiB0eXBlXG4gICAqL1xuICBwdWJsaWMgbm9kZXNPZlR5cGU8VCBleHRlbmRzIFdvcmtOb2RlWyd0eXBlJ10+KHR5cGU6IFQpOiBFeHRyYWN0PFdvcmtOb2RlLCB7IHR5cGU6IFQgfT5bXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5ub2RlcykuZmlsdGVyKG4gPT4gbi50eXBlID09PSB0eXBlKSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFsbCBub2RlcyB0aGF0IGRlcGVuZCBvbiBhIGdpdmVuIG5vZGVcbiAgICovXG4gIHB1YmxpYyBkZXBlbmRlZXMobm9kZUlkOiBzdHJpbmcgfCBXb3JrTm9kZSkge1xuICAgIGNvbnN0IGlkID0gdHlwZW9mIG5vZGVJZCA9PT0gJ3N0cmluZycgPyBub2RlSWQgOiBub2RlSWQuaWQ7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5ub2RlcykuZmlsdGVyKG4gPT4gbi5kZXBlbmRlbmNpZXMuaGFzKGlkKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgZGVwZW5kZW5jeSwgdGhhdCBtYXkgY29tZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIG5vZGVzIGludm9sdmVkXG4gICAqL1xuICBwdWJsaWMgYWRkRGVwZW5kZW5jeShmcm9tSWQ6IHN0cmluZywgdG9JZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMubm9kZXNbZnJvbUlkXTtcbiAgICBpZiAobm9kZSkge1xuICAgICAgbm9kZS5kZXBlbmRlbmNpZXMuYWRkKHRvSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgbGF6eURlcHMgPSB0aGlzLmxhenlEZXBlbmRlbmNpZXMuZ2V0KGZyb21JZCk7XG4gICAgaWYgKCFsYXp5RGVwcykge1xuICAgICAgbGF6eURlcHMgPSBbXTtcbiAgICAgIHRoaXMubGF6eURlcGVuZGVuY2llcy5zZXQoZnJvbUlkLCBsYXp5RGVwcyk7XG4gICAgfVxuICAgIGxhenlEZXBzLnB1c2godG9JZCk7XG4gIH1cblxuICBwdWJsaWMgdHJ5R2V0Tm9kZShpZDogc3RyaW5nKTogV29ya05vZGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm5vZGVzW2lkXTtcbiAgfVxuXG4gIHB1YmxpYyBub2RlKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZXQgPSB0aGlzLm5vZGVzW2lkXTtcbiAgICBpZiAoIXJldCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgTm8gbm9kZSB3aXRoIGlkICR7aWR9IGFtb25nICR7T2JqZWN0LmtleXModGhpcy5ub2Rlcyl9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwdWJsaWMgYWJzb3JiKGdyYXBoOiBXb3JrR3JhcGgpIHtcbiAgICB0aGlzLmFkZE5vZGVzKC4uLk9iamVjdC52YWx1ZXMoZ3JhcGgubm9kZXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzRmFpbGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMubm9kZXMpLnNvbWUoKG4pID0+IG4uZGVwbG95bWVudFN0YXRlID09PSBEZXBsb3ltZW50U3RhdGUuRkFJTEVEKTtcbiAgfVxuXG4gIHB1YmxpYyBkb1BhcmFsbGVsKGNvbmN1cnJlbmN5OiBDb25jdXJyZW5jeSwgYWN0aW9uczogV29ya0dyYXBoQWN0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmZvckFsbEFydGlmYWN0cyhjb25jdXJyZW5jeSwgYXN5bmMgKHg6IFdvcmtOb2RlKSA9PiB7XG4gICAgICBzd2l0Y2ggKHgudHlwZSkge1xuICAgICAgICBjYXNlICdzdGFjayc6XG4gICAgICAgICAgYXdhaXQgYWN0aW9ucy5kZXBsb3lTdGFjayh4KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYXNzZXQtYnVpbGQnOlxuICAgICAgICAgIGF3YWl0IGFjdGlvbnMuYnVpbGRBc3NldCh4KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYXNzZXQtcHVibGlzaCc6XG4gICAgICAgICAgYXdhaXQgYWN0aW9ucy5wdWJsaXNoQXNzZXQoeCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzZXQgb2YgdW5ibG9ja2VkIG5vZGVzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVhZHkoKTogUHJvbWlzZTxSZWFkb25seUFycmF5PFdvcmtOb2RlPj4ge1xuICAgIGF3YWl0IHRoaXMudXBkYXRlUmVhZHlQb29sKCk7XG4gICAgcmV0dXJuIHRoaXMucmVhZHlQb29sO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JBbGxBcnRpZmFjdHMobjogQ29uY3VycmVuY3ksIGZuOiAoeDogV29ya05vZGUpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBncmFwaCA9IHRoaXM7XG5cbiAgICAvLyBJZiAnbicgaXMgYSBudW1iZXIsIHdlIGxpbWl0IGFsbCBjb25jdXJyZW5jeSBlcXVhbGx5IChlZmZlY3RpdmVseSB3ZSB3aWxsIGJlIHVzaW5nIHRvdGFsTWF4KVxuICAgIC8vIElmICduJyBpcyBhIHJlY29yZCwgd2UgbGltaXQgZWFjaCBqb2IgaW5kZXBlbmRlbnRseSAoZWZmZWN0aXZlbHkgd2Ugd2lsbCBiZSB1c2luZyBtYXgpXG4gICAgY29uc3QgbWF4OiBSZWNvcmQ8V29ya05vZGVbJ3R5cGUnXSwgbnVtYmVyPiA9IHR5cGVvZiBuID09PSAnbnVtYmVyJyA/XG4gICAgICB7XG4gICAgICAgICdhc3NldC1idWlsZCc6IG4sXG4gICAgICAgICdhc3NldC1wdWJsaXNoJzogbixcbiAgICAgICAgJ3N0YWNrJzogbixcbiAgICAgIH0gOiBuO1xuICAgIGNvbnN0IHRvdGFsTWF4ID0gdHlwZW9mIG4gPT09ICdudW1iZXInID8gbiA6IHN1bShPYmplY3QudmFsdWVzKG4pKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgob2ssIGZhaWwpID0+IHtcbiAgICAgIGxldCBhY3RpdmU6IFJlY29yZDxXb3JrTm9kZVsndHlwZSddLCBudW1iZXI+ID0ge1xuICAgICAgICAnYXNzZXQtYnVpbGQnOiAwLFxuICAgICAgICAnYXNzZXQtcHVibGlzaCc6IDAsXG4gICAgICAgICdzdGFjayc6IDAsXG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gdG90YWxBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiBzdW0oT2JqZWN0LnZhbHVlcyhhY3RpdmUpKTtcbiAgICAgIH1cblxuICAgICAgc3RhcnQoKTtcblxuICAgICAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICAgIGdyYXBoLnVwZGF0ZVJlYWR5UG9vbCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JhcGgucmVhZHlQb29sLmxlbmd0aDsgKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gZ3JhcGgucmVhZHlQb29sW2ldO1xuXG4gICAgICAgICAgICBpZiAoYWN0aXZlW25vZGUudHlwZV0gPCBtYXhbbm9kZS50eXBlXSAmJiB0b3RhbEFjdGl2ZSgpIDwgdG90YWxNYXgpIHtcbiAgICAgICAgICAgICAgZ3JhcGgucmVhZHlQb29sLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgc3RhcnRPbmUobm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRvdGFsQWN0aXZlKCkgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChncmFwaC5kb25lKCkpIHtcbiAgICAgICAgICAgICAgb2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHdhaXQgZm9yIG90aGVyIGFjdGl2ZSBkZXBsb3lzIHRvIGZpbmlzaCBiZWZvcmUgZmFpbGluZ1xuICAgICAgICAgICAgaWYgKGdyYXBoLmhhc0ZhaWxlZCgpKSB7XG4gICAgICAgICAgICAgIGZhaWwoZ3JhcGguZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gc3RhcnRPbmUoeDogV29ya05vZGUpIHtcbiAgICAgICAgeC5kZXBsb3ltZW50U3RhdGUgPSBEZXBsb3ltZW50U3RhdGUuREVQTE9ZSU5HO1xuICAgICAgICBhY3RpdmVbeC50eXBlXSsrO1xuICAgICAgICB2b2lkIGZuKHgpXG4gICAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgYWN0aXZlW3gudHlwZV0tLTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGdyYXBoLmRlcGxveWVkKHgpO1xuICAgICAgICAgICAgc3RhcnQoKTtcbiAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAvLyBCeSByZWNvcmRpbmcgdGhlIGZhaWx1cmUgaW1tZWRpYXRlbHkgYXMgdGhlIHF1ZXVlZCB0YXNrIGV4aXRzLCB3ZSBwcmV2ZW50IHRoZSBuZXh0XG4gICAgICAgICAgICAvLyBxdWV1ZWQgdGFzayBmcm9tIHN0YXJ0aW5nLlxuICAgICAgICAgICAgZ3JhcGguZmFpbGVkKHgsIGVycik7XG4gICAgICAgICAgICBzdGFydCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkb25lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMubm9kZXMpLmV2ZXJ5KChuKSA9PiBEZXBsb3ltZW50U3RhdGUuQ09NUExFVEVEID09PSBuLmRlcGxveW1lbnRTdGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIGRlcGxveWVkKG5vZGU6IFdvcmtOb2RlKSB7XG4gICAgbm9kZS5kZXBsb3ltZW50U3RhdGUgPSBEZXBsb3ltZW50U3RhdGUuQ09NUExFVEVEO1xuICB9XG5cbiAgcHJpdmF0ZSBmYWlsZWQobm9kZTogV29ya05vZGUsIGVycm9yPzogRXJyb3IpIHtcbiAgICB0aGlzLmVycm9yID0gZXJyb3I7XG4gICAgbm9kZS5kZXBsb3ltZW50U3RhdGUgPSBEZXBsb3ltZW50U3RhdGUuRkFJTEVEO1xuICAgIHRoaXMuc2tpcFJlc3QoKTtcbiAgICB0aGlzLnJlYWR5UG9vbC5zcGxpY2UoMCk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdkaWdyYXBoIEQgeycsXG4gICAgICAuLi5PYmplY3QuZW50cmllcyh0aGlzLm5vZGVzKS5mbGF0TWFwKChbaWQsIG5vZGVdKSA9PiByZW5kZXJOb2RlKGlkLCBub2RlKSksXG4gICAgICAnfScsXG4gICAgXS5qb2luKCdcXG4nKTtcblxuICAgIGZ1bmN0aW9uIHJlbmRlck5vZGUoaWQ6IHN0cmluZywgbm9kZTogV29ya05vZGUpOiBzdHJpbmdbXSB7XG4gICAgICBjb25zdCByZXQgPSBbXTtcbiAgICAgIGlmIChub2RlLmRlcGxveW1lbnRTdGF0ZSA9PT0gRGVwbG95bWVudFN0YXRlLkNPTVBMRVRFRCkge1xuICAgICAgICByZXQucHVzaChgICAke2d2KGlkLCB7IHN0eWxlOiAnZmlsbGVkJywgZmlsbGNvbG9yOiAneWVsbG93JywgY29tbWVudDogbm9kZS5ub3RlIH0pfTtgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldC5wdXNoKGAgICR7Z3YoaWQsIHsgY29tbWVudDogbm9kZS5ub3RlIH0pfTtgKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIG5vZGUuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIHJldC5wdXNoKGAgICR7Z3YoaWQpfSAtPiAke2d2KGRlcCl9O2ApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGFsbCBkZXBlbmRlbmNpZXMgYWN0dWFsbHkgZXhpc3QuIFRoaXMgcHJvdGVjdHMgYWdhaW5zdCBzY2VuYXJpb3Mgc3VjaCBhcyB0aGUgZm9sbG93aW5nOlxuICAgKiBTdGFja0EgZGVwZW5kcyBvbiBTdGFja0IsIGJ1dCBTdGFja0IgaXMgbm90IHNlbGVjdGVkIHRvIGRlcGxveS4gVGhlIGRlcGVuZGVuY3kgaXMgcmVkdW5kYW50XG4gICAqIGFuZCB3aWxsIGJlIGRyb3BwZWQuXG4gICAqIFRoaXMgYXNzdW1lcyB0aGUgbWFuaWZlc3QgY29tZXMgdW5jb3JydXB0ZWQgc28gd2Ugd2lsbCBub3QgZmFpbCBpZiBhIGRlcGVuZGVuY3kgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZVVuYXZhaWxhYmxlRGVwZW5kZW5jaWVzKCkge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBPYmplY3QudmFsdWVzKHRoaXMubm9kZXMpKSB7XG4gICAgICBjb25zdCByZW1vdmVEZXBzID0gQXJyYXkuZnJvbShub2RlLmRlcGVuZGVuY2llcykuZmlsdGVyKChkZXApID0+IHRoaXMubm9kZXNbZGVwXSA9PT0gdW5kZWZpbmVkKTtcblxuICAgICAgcmVtb3ZlRGVwcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgIG5vZGUuZGVwZW5kZW5jaWVzLmRlbGV0ZShkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIGFzc2V0IHB1Ymxpc2hpbmcgc3RlcHMgZm9yIGFzc2V0cyB0aGF0IGFyZSBhbHJlYWR5IHB1Ymxpc2hlZCwgYW5kIHRoZW4gYnVpbGRcbiAgICogdGhhdCBhcmVuJ3QgdXNlZCBhbnltb3JlLlxuICAgKlxuICAgKiBEbyB0aGlzIGluIHBhcmFsbGVsLCBiZWNhdXNlIHRoZXJlIG1heSBiZSBhIGxvdCBvZiBhc3NldHMgaW4gYW4gYXBwbGljYXRpb24gKHNlZW4gaW4gcHJhY3RpY2U6ID4xMDAgYXNzZXRzKVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlbW92ZVVubmVjZXNzYXJ5QXNzZXRzKGlzVW5uZWNlc3Nhcnk6ICh4OiBBc3NldFB1Ymxpc2hOb2RlKSA9PiBQcm9taXNlPGJvb2xlYW4+KSB7XG4gICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCAnQ2hlY2tpbmcgZm9yIHByZXZpb3VzbHkgcHVibGlzaGVkIGFzc2V0cycpKTtcblxuICAgIGNvbnN0IHB1Ymxpc2hlcyA9IHRoaXMubm9kZXNPZlR5cGUoJ2Fzc2V0LXB1Ymxpc2gnKTtcblxuICAgIGNvbnN0IGNsYXNzaWZpZWROb2RlcyA9IGF3YWl0IHBhcmFsbGVsUHJvbWlzZXMoXG4gICAgICA4LFxuICAgICAgcHVibGlzaGVzLm1hcCgoYXNzZXROb2RlKSA9PiBhc3luYygpID0+IFthc3NldE5vZGUsIGF3YWl0IGlzVW5uZWNlc3NhcnkoYXNzZXROb2RlKV0gYXMgY29uc3QpKTtcblxuICAgIGNvbnN0IGFscmVhZHlQdWJsaXNoZWQgPSBjbGFzc2lmaWVkTm9kZXMuZmlsdGVyKChbXywgdW5uZWNlc3NhcnldKSA9PiB1bm5lY2Vzc2FyeSkubWFwKChbYXNzZXROb2RlLCBfXSkgPT4gYXNzZXROb2RlKTtcbiAgICBmb3IgKGNvbnN0IGFzc2V0Tm9kZSBvZiBhbHJlYWR5UHVibGlzaGVkKSB7XG4gICAgICB0aGlzLnJlbW92ZU5vZGUoYXNzZXROb2RlKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGAke3B1Ymxpc2hlcy5sZW5ndGh9IHRvdGFsIGFzc2V0cywgJHtwdWJsaXNoZXMubGVuZ3RoIC0gYWxyZWFkeVB1Ymxpc2hlZC5sZW5ndGh9IHN0aWxsIG5lZWQgdG8gYmUgcHVibGlzaGVkYCkpO1xuXG4gICAgLy8gTm93IGFsc28gcmVtb3ZlIGFueSBhc3NldCBidWlsZCBzdGVwcyB0aGF0IGRvbid0IGhhdmUgYW55IGRlcGVuZGVuY2llcyBvbiB0aGVtIGFueW1vcmVcbiAgICBjb25zdCB1bnVzZWRCdWlsZHMgPSB0aGlzLm5vZGVzT2ZUeXBlKCdhc3NldC1idWlsZCcpLmZpbHRlcihidWlsZCA9PiB0aGlzLmRlcGVuZGVlcyhidWlsZCkubGVuZ3RoID09PSAwKTtcbiAgICBmb3IgKGNvbnN0IHVudXNlZEJ1aWxkIG9mIHVudXNlZEJ1aWxkcykge1xuICAgICAgdGhpcy5yZW1vdmVOb2RlKHVudXNlZEJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVJlYWR5UG9vbCgpIHtcbiAgICBjb25zdCBhY3RpdmVDb3VudCA9IE9iamVjdC52YWx1ZXModGhpcy5ub2RlcykuZmlsdGVyKCh4KSA9PiB4LmRlcGxveW1lbnRTdGF0ZSA9PT0gRGVwbG95bWVudFN0YXRlLkRFUExPWUlORykubGVuZ3RoO1xuICAgIGNvbnN0IHBlbmRpbmdDb3VudCA9IE9iamVjdC52YWx1ZXModGhpcy5ub2RlcykuZmlsdGVyKCh4KSA9PiB4LmRlcGxveW1lbnRTdGF0ZSA9PT0gRGVwbG95bWVudFN0YXRlLlBFTkRJTkcpLmxlbmd0aDtcblxuICAgIGNvbnN0IG5ld2x5UmVhZHkgPSBPYmplY3QudmFsdWVzKHRoaXMubm9kZXMpLmZpbHRlcigoeCkgPT5cbiAgICAgIHguZGVwbG95bWVudFN0YXRlID09PSBEZXBsb3ltZW50U3RhdGUuUEVORElORyAmJlxuICAgICAgQXJyYXkuZnJvbSh4LmRlcGVuZGVuY2llcykuZXZlcnkoKGlkKSA9PiB0aGlzLm5vZGUoaWQpLmRlcGxveW1lbnRTdGF0ZSA9PT0gRGVwbG95bWVudFN0YXRlLkNPTVBMRVRFRCkpO1xuXG4gICAgLy8gQWRkIG5ld2x5IGF2YWlsYWJsZSBub2RlcyB0byB0aGUgcmVhZHkgcG9vbFxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBuZXdseVJlYWR5KSB7XG4gICAgICBub2RlLmRlcGxveW1lbnRTdGF0ZSA9IERlcGxveW1lbnRTdGF0ZS5RVUVVRUQ7XG4gICAgICB0aGlzLnJlYWR5UG9vbC5wdXNoKG5vZGUpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBub2RlcyBmcm9tIHRoZSByZWFkeSBwb29sIHRoYXQgaGF2ZSBhbHJlYWR5IHN0YXJ0ZWQgZGVwbG95aW5nXG4gICAgcmV0YWluT25seSh0aGlzLnJlYWR5UG9vbCwgKG5vZGUpID0+IG5vZGUuZGVwbG95bWVudFN0YXRlID09PSBEZXBsb3ltZW50U3RhdGUuUVVFVUVEKTtcblxuICAgIC8vIFNvcnQgYnkgcmV2ZXJzZSBwcmlvcml0eVxuICAgIHRoaXMucmVhZHlQb29sLnNvcnQoKGEsIGIpID0+IChiLnByaW9yaXR5ID8/IDApIC0gKGEucHJpb3JpdHkgPz8gMCkpO1xuXG4gICAgaWYgKHRoaXMucmVhZHlQb29sLmxlbmd0aCA9PT0gMCAmJiBhY3RpdmVDb3VudCA9PT0gMCAmJiBwZW5kaW5nQ291bnQgPiAwKSB7XG4gICAgICBjb25zdCBjeWNsZSA9IHRoaXMuZmluZEN5Y2xlKCkgPz8gWydObyBjeWNsZSBmb3VuZCEnXTtcbiAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeSh0cmFjZSh0aGlzLmFjdGlvbiwgYEN5Y2xlICR7Y3ljbGUuam9pbignIC0+ICcpfSBpbiBncmFwaCAke3RoaXN9YCkpO1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgVW5hYmxlIHRvIG1ha2UgcHJvZ3Jlc3MgYW55bW9yZSwgZGVwZW5kZW5jeSBjeWNsZSBiZXR3ZWVuIHJlbWFpbmluZyBhcnRpZmFjdHM6ICR7Y3ljbGUuam9pbignIC0+ICcpfSAocnVuIHdpdGggLXZ2IGZvciBmdWxsIGdyYXBoKWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2tpcFJlc3QoKSB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIE9iamVjdC52YWx1ZXModGhpcy5ub2RlcykpIHtcbiAgICAgIGlmIChbRGVwbG95bWVudFN0YXRlLlFVRVVFRCwgRGVwbG95bWVudFN0YXRlLlBFTkRJTkddLmluY2x1ZGVzKG5vZGUuZGVwbG95bWVudFN0YXRlKSkge1xuICAgICAgICBub2RlLmRlcGxveW1lbnRTdGF0ZSA9IERlcGxveW1lbnRTdGF0ZS5TS0lQUEVEO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGN5Y2xlcyBpbiBhIGdyYXBoXG4gICAqXG4gICAqIE5vdCB0aGUgZmFzdGVzdCwgYnV0IGVmZmVjdGl2ZSBhbmQgc2hvdWxkIGJlIHJhcmVcbiAgICovXG4gIHB1YmxpYyBmaW5kQ3ljbGUoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBmb3IgKGNvbnN0IG5vZGVJZCBvZiBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKSkge1xuICAgICAgY29uc3QgY3ljbGUgPSByZWN1cnNlKG5vZGVJZCwgW25vZGVJZF0pO1xuICAgICAgaWYgKGN5Y2xlKSB7XG4gICAgICAgIHJldHVybiBjeWNsZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGZ1bmN0aW9uIHJlY3Vyc2Uobm9kZUlkOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgICAgaWYgKHNlZW4uaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVwIG9mIHNlbGYubm9kZXNbbm9kZUlkXS5kZXBlbmRlbmNpZXMgPz8gW10pIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHBhdGguaW5kZXhPZihkZXApO1xuICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gWy4uLnBhdGguc2xpY2UoaW5kZXgpLCBkZXBdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGN5Y2xlID0gcmVjdXJzZShkZXAsIFsuLi5wYXRoLCBkZXBdKTtcbiAgICAgICAgICBpZiAoY3ljbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBjeWNsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vlbi5hZGQobm9kZUlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYGVuZGAgbm9kZSBpcyByZWFjaGFibGUgZnJvbSB0aGUgYHN0YXJ0YCBub2RlLCBmb2xsb3dpbmcgdGhlIGRlcGVuZGVuY3kgYXJyb3dzXG4gICAqL1xuICBwdWJsaWMgcmVhY2hhYmxlKHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiByZWN1cnNlKHN0YXJ0KTtcblxuICAgIGZ1bmN0aW9uIHJlY3Vyc2UoY3VycmVudDogc3RyaW5nKSB7XG4gICAgICBpZiAoc2Vlbi5oYXMoY3VycmVudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc2Vlbi5hZGQoY3VycmVudCk7XG5cbiAgICAgIGlmIChjdXJyZW50ID09PSBlbmQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRlcCBvZiBzZWxmLm5vZGVzW2N1cnJlbnRdLmRlcGVuZGVuY2llcykge1xuICAgICAgICBpZiAocmVjdXJzZShkZXApKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrR3JhcGhBY3Rpb25zIHtcbiAgZGVwbG95U3RhY2s6IChzdGFja05vZGU6IFN0YWNrTm9kZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgYnVpbGRBc3NldDogKGFzc2V0Tm9kZTogQXNzZXRCdWlsZE5vZGUpID0+IFByb21pc2U8dm9pZD47XG4gIHB1Ymxpc2hBc3NldDogKGFzc2V0Tm9kZTogQXNzZXRQdWJsaXNoTm9kZSkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuZnVuY3Rpb24gc3VtKHhzOiBudW1iZXJbXSkge1xuICBsZXQgcmV0ID0gMDtcbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgcmV0ICs9IHg7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gcmV0YWluT25seTxBPih4czogQVtdLCBwcmVkOiAoeDogQSkgPT4gYm9vbGVhbikge1xuICB4cy5zcGxpY2UoMCwgeHMubGVuZ3RoLCAuLi54cy5maWx0ZXIocHJlZCkpO1xufVxuXG5mdW5jdGlvbiBndihpZDogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pIHtcbiAgY29uc3QgYXR0clN0cmluZyA9IE9iamVjdC5lbnRyaWVzKGF0dHJzID8/IHt9KS5mbGF0TWFwKChbaywgdl0pID0+IHYgIT09IHVuZGVmaW5lZCA/IFtgJHtrfT1cIiR7dn1cImBdIDogW10pLmpvaW4oJywnKTtcblxuICByZXR1cm4gYXR0clN0cmluZyA/IGBcIiR7c2ltcGxpZnlJZChpZCl9XCIgWyR7YXR0clN0cmluZ31dYCA6IGBcIiR7c2ltcGxpZnlJZChpZCl9XCJgO1xufVxuXG5mdW5jdGlvbiBzaW1wbGlmeUlkKGlkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGlkLnJlcGxhY2UoLyhbMC05YS1mXXs2fSlbMC05YS1mXXs2LH0vZywgJyQxJyk7XG59XG4iXX0=
@@ -6,8 +6,8 @@ import { CloudExecutable } from '../api/cxapp/cloud-executable';
6
6
  import { type Deployments, DeploymentMethod } from '../api/deployments';
7
7
  import { HotswapMode } from '../api/hotswap/common';
8
8
  import { CloudWatchLogEventMonitor } from '../api/logs/logs-monitor';
9
+ import { StackActivityProgress } from '../api/stack-events';
9
10
  import { type Tag } from '../api/tags';
10
- import { StackActivityProgress } from '../api/util/cloudformation/stack-activity-monitor';
11
11
  import { FromScan } from '../commands/migrate';
12
12
  import { RequireApproval } from '../diff';
13
13
  import { CliIoHost } from '../toolkit/cli-io-host';
@@ -68,11 +68,11 @@ export declare enum AssetBuildTime {
68
68
  * This is intended for expensive Docker image builds; so that if the Docker image build
69
69
  * fails, no stacks are unnecessarily deployed (with the attendant wait time).
70
70
  */
71
- ALL_BEFORE_DEPLOY = 0,
71
+ ALL_BEFORE_DEPLOY = "all-before-deploy",
72
72
  /**
73
73
  * Build assets just-in-time, before publishing
74
74
  */
75
- JUST_IN_TIME = 1
75
+ JUST_IN_TIME = "just-in-time"
76
76
  }
77
77
  /**
78
78
  * Toolkit logic