@aws-cdk/cloudformation-diff 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +2 -0
  3. package/README.md +12 -0
  4. package/lib/diff/index.d.ts +9 -0
  5. package/lib/diff/index.js +92 -0
  6. package/lib/diff/maybe-parsed.d.ts +14 -0
  7. package/lib/diff/maybe-parsed.js +14 -0
  8. package/lib/diff/template-and-changeset-diff-merger.d.ts +33 -0
  9. package/lib/diff/template-and-changeset-diff-merger.js +128 -0
  10. package/lib/diff/types.d.ts +368 -0
  11. package/lib/diff/types.js +498 -0
  12. package/lib/diff/util.d.ts +57 -0
  13. package/lib/diff/util.js +199 -0
  14. package/lib/diff-template.d.ts +25 -0
  15. package/lib/diff-template.js +212 -0
  16. package/lib/diffable.d.ts +22 -0
  17. package/lib/diffable.js +47 -0
  18. package/lib/format-table.d.ts +6 -0
  19. package/lib/format-table.js +108 -0
  20. package/lib/format.d.ts +106 -0
  21. package/lib/format.js +436 -0
  22. package/lib/iam/iam-changes.d.ts +66 -0
  23. package/lib/iam/iam-changes.js +421 -0
  24. package/lib/iam/iam-identity-center.d.ts +78 -0
  25. package/lib/iam/iam-identity-center.js +46 -0
  26. package/lib/iam/managed-policy.d.ts +11 -0
  27. package/lib/iam/managed-policy.js +33 -0
  28. package/lib/iam/statement.d.ts +113 -0
  29. package/lib/iam/statement.js +270 -0
  30. package/lib/index.d.ts +4 -0
  31. package/lib/index.js +24 -0
  32. package/lib/network/security-group-changes.d.ts +32 -0
  33. package/lib/network/security-group-changes.js +99 -0
  34. package/lib/network/security-group-rule.d.ts +50 -0
  35. package/lib/network/security-group-rule.js +97 -0
  36. package/lib/render-intrinsics.d.ts +21 -0
  37. package/lib/render-intrinsics.js +78 -0
  38. package/lib/util.d.ts +7 -0
  39. package/lib/util.js +62 -0
  40. package/package.json +80 -0
@@ -0,0 +1,421 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IamChanges = void 0;
4
+ const service_spec_types_1 = require("@aws-cdk/service-spec-types");
5
+ const chalk = require("chalk");
6
+ const iam_identity_center_1 = require("./iam-identity-center");
7
+ const managed_policy_1 = require("./managed-policy");
8
+ const statement_1 = require("./statement");
9
+ const diffable_1 = require("../diffable");
10
+ const render_intrinsics_1 = require("../render-intrinsics");
11
+ const util_1 = require("../util");
12
+ /**
13
+ * Changes to IAM statements and IAM identity center
14
+ */
15
+ class IamChanges {
16
+ constructor(props) {
17
+ // each entry in a DiffableCollection is used to generate a single row of the security changes table that is presented for cdk diff and cdk deploy.
18
+ this.statements = new diffable_1.DiffableCollection();
19
+ this.managedPolicies = new diffable_1.DiffableCollection();
20
+ this.ssoPermissionSets = new diffable_1.DiffableCollection();
21
+ this.ssoAssignments = new diffable_1.DiffableCollection();
22
+ this.ssoInstanceACAConfigs = new diffable_1.DiffableCollection();
23
+ for (const propertyChange of props.propertyChanges) {
24
+ this.readPropertyChange(propertyChange);
25
+ }
26
+ for (const resourceChange of props.resourceChanges) {
27
+ this.readResourceChange(resourceChange);
28
+ }
29
+ this.statements.calculateDiff();
30
+ this.managedPolicies.calculateDiff();
31
+ this.ssoPermissionSets.calculateDiff();
32
+ this.ssoAssignments.calculateDiff();
33
+ this.ssoInstanceACAConfigs.calculateDiff();
34
+ }
35
+ get hasChanges() {
36
+ return (this.statements.hasChanges
37
+ || this.managedPolicies.hasChanges
38
+ || this.ssoPermissionSets.hasChanges
39
+ || this.ssoAssignments.hasChanges
40
+ || this.ssoInstanceACAConfigs.hasChanges);
41
+ }
42
+ /**
43
+ * Return whether the changes include broadened permissions
44
+ *
45
+ * Permissions are broadened if positive statements are added or
46
+ * negative statements are removed, or if managed policies are added.
47
+ */
48
+ get permissionsBroadened() {
49
+ return this.statements.additions.some(s => !s.isNegativeStatement)
50
+ || this.statements.removals.some(s => s.isNegativeStatement)
51
+ || this.managedPolicies.hasAdditions
52
+ || this.ssoPermissionSets.hasAdditions
53
+ || this.ssoAssignments.hasAdditions
54
+ || this.ssoInstanceACAConfigs.hasAdditions;
55
+ }
56
+ /**
57
+ * Return a summary table of changes
58
+ */
59
+ summarizeStatements() {
60
+ const ret = [];
61
+ const header = ['', 'Resource', 'Effect', 'Action', 'Principal', 'Condition'];
62
+ // First generate all lines, then sort on Resource so that similar resources are together
63
+ for (const statement of this.statements.additions) {
64
+ const renderedStatement = statement.render();
65
+ ret.push([
66
+ '+',
67
+ renderedStatement.resource,
68
+ renderedStatement.effect,
69
+ renderedStatement.action,
70
+ renderedStatement.principal,
71
+ renderedStatement.condition,
72
+ ].map(s => chalk.green(s)));
73
+ }
74
+ for (const statement of this.statements.removals) {
75
+ const renderedStatement = statement.render();
76
+ ret.push([
77
+ '-',
78
+ renderedStatement.resource,
79
+ renderedStatement.effect,
80
+ renderedStatement.action,
81
+ renderedStatement.principal,
82
+ renderedStatement.condition,
83
+ ].map(s => chalk.red(s)));
84
+ }
85
+ // Sort by 2nd column
86
+ ret.sort((0, util_1.makeComparator)((row) => [row[1]]));
87
+ ret.splice(0, 0, header);
88
+ return ret;
89
+ }
90
+ summarizeManagedPolicies() {
91
+ const ret = [];
92
+ const header = ['', 'Resource', 'Managed Policy ARN'];
93
+ for (const att of this.managedPolicies.additions) {
94
+ ret.push([
95
+ '+',
96
+ att.identityArn,
97
+ att.managedPolicyArn,
98
+ ].map(s => chalk.green(s)));
99
+ }
100
+ for (const att of this.managedPolicies.removals) {
101
+ ret.push([
102
+ '-',
103
+ att.identityArn,
104
+ att.managedPolicyArn,
105
+ ].map(s => chalk.red(s)));
106
+ }
107
+ // Sort by 2nd column
108
+ ret.sort((0, util_1.makeComparator)((row) => [row[1]]));
109
+ ret.splice(0, 0, header);
110
+ return ret;
111
+ }
112
+ summarizeSsoAssignments() {
113
+ const ret = [];
114
+ const header = ['', 'Resource', 'InstanceArn', 'PermissionSetArn', 'PrincipalId', 'PrincipalType', 'TargetId', 'TargetType'];
115
+ for (const att of this.ssoAssignments.additions) {
116
+ ret.push([
117
+ '+',
118
+ att.cfnLogicalId || '',
119
+ att.ssoInstanceArn || '',
120
+ att.permissionSetArn || '',
121
+ att.principalId || '',
122
+ att.principalType || '',
123
+ att.targetId || '',
124
+ att.targetType || '',
125
+ ].map(s => chalk.green(s)));
126
+ }
127
+ for (const att of this.ssoAssignments.removals) {
128
+ ret.push([
129
+ '-',
130
+ att.cfnLogicalId || '',
131
+ att.ssoInstanceArn || '',
132
+ att.permissionSetArn || '',
133
+ att.principalId || '',
134
+ att.principalType || '',
135
+ att.targetId || '',
136
+ att.targetType || '',
137
+ ].map(s => chalk.red(s)));
138
+ }
139
+ // Sort by resource name to ensure a unique value is used for sorting
140
+ ret.sort((0, util_1.makeComparator)((row) => [row[1]]));
141
+ ret.splice(0, 0, header);
142
+ return ret;
143
+ }
144
+ summarizeSsoInstanceACAConfigs() {
145
+ var _a, _b;
146
+ const ret = [];
147
+ const header = ['', 'Resource', 'InstanceArn', 'AccessControlAttributes'];
148
+ function formatAccessControlAttribute(aca) {
149
+ var _a;
150
+ return `Key: ${aca === null || aca === void 0 ? void 0 : aca.Key}, Values: [${(_a = aca === null || aca === void 0 ? void 0 : aca.Value) === null || _a === void 0 ? void 0 : _a.Source.join(', ')}]`;
151
+ }
152
+ for (const att of this.ssoInstanceACAConfigs.additions) {
153
+ ret.push([
154
+ '+',
155
+ att.cfnLogicalId || '',
156
+ att.ssoInstanceArn || '',
157
+ ((_a = att.accessControlAttributes) === null || _a === void 0 ? void 0 : _a.map(formatAccessControlAttribute).join('\n')) || '',
158
+ ].map(s => chalk.green(s)));
159
+ }
160
+ for (const att of this.ssoInstanceACAConfigs.removals) {
161
+ ret.push([
162
+ '-',
163
+ att.cfnLogicalId || '',
164
+ att.ssoInstanceArn || '',
165
+ ((_b = att.accessControlAttributes) === null || _b === void 0 ? void 0 : _b.map(formatAccessControlAttribute).join('\n')) || '',
166
+ ].map(s => chalk.red(s)));
167
+ }
168
+ // Sort by resource name to ensure a unique value is used for sorting
169
+ ret.sort((0, util_1.makeComparator)((row) => [row[1]]));
170
+ ret.splice(0, 0, header);
171
+ return ret;
172
+ }
173
+ summarizeSsoPermissionSets() {
174
+ var _a, _b;
175
+ const ret = [];
176
+ const header = ['', 'Resource', 'InstanceArn', 'PermissionSet name', 'PermissionsBoundary', 'CustomerManagedPolicyReferences'];
177
+ function formatManagedPolicyRef(s) {
178
+ return `Name: ${(s === null || s === void 0 ? void 0 : s.Name) || ''}, Path: ${(s === null || s === void 0 ? void 0 : s.Path) || ''}`;
179
+ }
180
+ function formatSsoPermissionsBoundary(ssoPb) {
181
+ // ManagedPolicyArn OR CustomerManagedPolicyReference can be specified -- but not both.
182
+ if ((ssoPb === null || ssoPb === void 0 ? void 0 : ssoPb.ManagedPolicyArn) !== undefined) {
183
+ return `ManagedPolicyArn: ${(ssoPb === null || ssoPb === void 0 ? void 0 : ssoPb.ManagedPolicyArn) || ''}`;
184
+ }
185
+ else if ((ssoPb === null || ssoPb === void 0 ? void 0 : ssoPb.CustomerManagedPolicyReference) !== undefined) {
186
+ return `CustomerManagedPolicyReference: {\n ${formatManagedPolicyRef(ssoPb === null || ssoPb === void 0 ? void 0 : ssoPb.CustomerManagedPolicyReference)}\n}`;
187
+ }
188
+ else {
189
+ return '';
190
+ }
191
+ }
192
+ for (const att of this.ssoPermissionSets.additions) {
193
+ ret.push([
194
+ '+',
195
+ att.cfnLogicalId || '',
196
+ att.ssoInstanceArn || '',
197
+ att.name || '',
198
+ formatSsoPermissionsBoundary(att.ssoPermissionsBoundary),
199
+ ((_a = att.ssoCustomerManagedPolicyReferences) === null || _a === void 0 ? void 0 : _a.map(formatManagedPolicyRef).join('\n')) || '',
200
+ ].map(s => chalk.green(s)));
201
+ }
202
+ for (const att of this.ssoPermissionSets.removals) {
203
+ ret.push([
204
+ '-',
205
+ att.cfnLogicalId || '',
206
+ att.ssoInstanceArn || '',
207
+ att.name || '',
208
+ formatSsoPermissionsBoundary(att.ssoPermissionsBoundary),
209
+ ((_b = att.ssoCustomerManagedPolicyReferences) === null || _b === void 0 ? void 0 : _b.map(formatManagedPolicyRef).join('\n')) || '',
210
+ ].map(s => chalk.red(s)));
211
+ }
212
+ // Sort by resource name to ensure a unique value is used for sorting
213
+ ret.sort((0, util_1.makeComparator)((row) => [row[1]]));
214
+ ret.splice(0, 0, header);
215
+ return ret;
216
+ }
217
+ /**
218
+ * Return a machine-readable version of the changes.
219
+ * This is only used in tests.
220
+ *
221
+ * @internal
222
+ */
223
+ _toJson() {
224
+ return (0, util_1.deepRemoveUndefined)({
225
+ statementAdditions: (0, util_1.dropIfEmpty)(this.statements.additions.map(s => s._toJson())),
226
+ statementRemovals: (0, util_1.dropIfEmpty)(this.statements.removals.map(s => s._toJson())),
227
+ managedPolicyAdditions: (0, util_1.dropIfEmpty)(this.managedPolicies.additions.map(s => s._toJson())),
228
+ managedPolicyRemovals: (0, util_1.dropIfEmpty)(this.managedPolicies.removals.map(s => s._toJson())),
229
+ });
230
+ }
231
+ readPropertyChange(propertyChange) {
232
+ switch (propertyChange.scrutinyType) {
233
+ case service_spec_types_1.PropertyScrutinyType.InlineIdentityPolicies:
234
+ // AWS::IAM::{ Role | User | Group }.Policies
235
+ this.statements.addOld(...this.readIdentityPolicies(propertyChange.oldValue, propertyChange.resourceLogicalId));
236
+ this.statements.addNew(...this.readIdentityPolicies(propertyChange.newValue, propertyChange.resourceLogicalId));
237
+ break;
238
+ case service_spec_types_1.PropertyScrutinyType.InlineResourcePolicy:
239
+ // Any PolicyDocument on a resource (including AssumeRolePolicyDocument)
240
+ this.statements.addOld(...this.readResourceStatements(propertyChange.oldValue, propertyChange.resourceLogicalId));
241
+ this.statements.addNew(...this.readResourceStatements(propertyChange.newValue, propertyChange.resourceLogicalId));
242
+ break;
243
+ case service_spec_types_1.PropertyScrutinyType.ManagedPolicies:
244
+ // Just a list of managed policies
245
+ this.managedPolicies.addOld(...this.readManagedPolicies(propertyChange.oldValue, propertyChange.resourceLogicalId));
246
+ this.managedPolicies.addNew(...this.readManagedPolicies(propertyChange.newValue, propertyChange.resourceLogicalId));
247
+ break;
248
+ }
249
+ }
250
+ readResourceChange(resourceChange) {
251
+ switch (resourceChange.scrutinyType) {
252
+ case service_spec_types_1.ResourceScrutinyType.IdentityPolicyResource:
253
+ // AWS::IAM::Policy
254
+ this.statements.addOld(...this.readIdentityPolicyResource(resourceChange.oldProperties));
255
+ this.statements.addNew(...this.readIdentityPolicyResource(resourceChange.newProperties));
256
+ break;
257
+ case service_spec_types_1.ResourceScrutinyType.ResourcePolicyResource:
258
+ // AWS::*::{Bucket,Queue,Topic}Policy
259
+ this.statements.addOld(...this.readResourcePolicyResource(resourceChange.oldProperties));
260
+ this.statements.addNew(...this.readResourcePolicyResource(resourceChange.newProperties));
261
+ break;
262
+ case service_spec_types_1.ResourceScrutinyType.LambdaPermission:
263
+ this.statements.addOld(...this.readLambdaStatements(resourceChange.oldProperties));
264
+ this.statements.addNew(...this.readLambdaStatements(resourceChange.newProperties));
265
+ break;
266
+ case service_spec_types_1.ResourceScrutinyType.SsoPermissionSet:
267
+ this.ssoPermissionSets.addOld(...this.readSsoPermissionSet(resourceChange.oldProperties, resourceChange.resourceLogicalId));
268
+ this.ssoPermissionSets.addNew(...this.readSsoPermissionSet(resourceChange.newProperties, resourceChange.resourceLogicalId));
269
+ break;
270
+ case service_spec_types_1.ResourceScrutinyType.SsoAssignmentResource:
271
+ this.ssoAssignments.addOld(...this.readSsoAssignments(resourceChange.oldProperties, resourceChange.resourceLogicalId));
272
+ this.ssoAssignments.addNew(...this.readSsoAssignments(resourceChange.newProperties, resourceChange.resourceLogicalId));
273
+ break;
274
+ case service_spec_types_1.ResourceScrutinyType.SsoInstanceACAConfigResource:
275
+ this.ssoInstanceACAConfigs.addOld(...this.readSsoInstanceACAConfigs(resourceChange.oldProperties, resourceChange.resourceLogicalId));
276
+ this.ssoInstanceACAConfigs.addNew(...this.readSsoInstanceACAConfigs(resourceChange.newProperties, resourceChange.resourceLogicalId));
277
+ break;
278
+ }
279
+ }
280
+ /**
281
+ * Parse a list of policies on an identity
282
+ */
283
+ readIdentityPolicies(policies, logicalId) {
284
+ if (policies === undefined || !Array.isArray(policies)) {
285
+ return [];
286
+ }
287
+ const appliesToPrincipal = 'AWS:${' + logicalId + '}';
288
+ return (0, util_1.flatMap)(policies, (policy) => {
289
+ var _a;
290
+ // check if the Policy itself is not an intrinsic, like an Fn::If
291
+ const unparsedStatement = ((_a = policy.PolicyDocument) === null || _a === void 0 ? void 0 : _a.Statement)
292
+ ? policy.PolicyDocument.Statement
293
+ : policy;
294
+ return defaultPrincipal(appliesToPrincipal, (0, statement_1.parseStatements)((0, render_intrinsics_1.renderIntrinsics)(unparsedStatement)));
295
+ });
296
+ }
297
+ /**
298
+ * Parse an IAM::Policy resource
299
+ */
300
+ readIdentityPolicyResource(properties) {
301
+ if (properties === undefined) {
302
+ return [];
303
+ }
304
+ properties = (0, render_intrinsics_1.renderIntrinsics)(properties);
305
+ const principals = (properties.Groups || []).concat(properties.Users || []).concat(properties.Roles || []);
306
+ return (0, util_1.flatMap)(principals, (principal) => {
307
+ const ref = 'AWS:' + principal;
308
+ return defaultPrincipal(ref, (0, statement_1.parseStatements)(properties.PolicyDocument.Statement));
309
+ });
310
+ }
311
+ readSsoInstanceACAConfigs(properties, logicalId) {
312
+ if (properties === undefined) {
313
+ return [];
314
+ }
315
+ properties = (0, render_intrinsics_1.renderIntrinsics)(properties);
316
+ return [new iam_identity_center_1.SsoInstanceACAConfig({
317
+ cfnLogicalId: '${' + logicalId + '}',
318
+ ssoInstanceArn: properties.InstanceArn,
319
+ accessControlAttributes: properties.AccessControlAttributes,
320
+ })];
321
+ }
322
+ readSsoAssignments(properties, logicalId) {
323
+ if (properties === undefined) {
324
+ return [];
325
+ }
326
+ properties = (0, render_intrinsics_1.renderIntrinsics)(properties);
327
+ return [new iam_identity_center_1.SsoAssignment({
328
+ cfnLogicalId: '${' + logicalId + '}',
329
+ ssoInstanceArn: properties.InstanceArn,
330
+ permissionSetArn: properties.PermissionSetArn,
331
+ principalId: properties.PrincipalId,
332
+ principalType: properties.PrincipalType,
333
+ targetId: properties.TargetId,
334
+ targetType: properties.TargetType,
335
+ })];
336
+ }
337
+ readSsoPermissionSet(properties, logicalId) {
338
+ if (properties === undefined) {
339
+ return [];
340
+ }
341
+ properties = (0, render_intrinsics_1.renderIntrinsics)(properties);
342
+ return [new iam_identity_center_1.SsoPermissionSet({
343
+ cfnLogicalId: '${' + logicalId + '}',
344
+ name: properties.Name,
345
+ ssoInstanceArn: properties.InstanceArn,
346
+ ssoCustomerManagedPolicyReferences: properties.CustomerManagedPolicyReferences,
347
+ ssoPermissionsBoundary: properties.PermissionsBoundary,
348
+ })];
349
+ }
350
+ readResourceStatements(policy, logicalId) {
351
+ if (policy === undefined) {
352
+ return [];
353
+ }
354
+ const appliesToResource = '${' + logicalId + '.Arn}';
355
+ return defaultResource(appliesToResource, (0, statement_1.parseStatements)((0, render_intrinsics_1.renderIntrinsics)(policy.Statement)));
356
+ }
357
+ /**
358
+ * Parse an AWS::*::{Bucket,Topic,Queue}policy
359
+ */
360
+ readResourcePolicyResource(properties) {
361
+ if (properties === undefined) {
362
+ return [];
363
+ }
364
+ properties = (0, render_intrinsics_1.renderIntrinsics)(properties);
365
+ const policyKeys = Object.keys(properties).filter(key => key.indexOf('Policy') > -1);
366
+ // Find the key that identifies the resource(s) this policy applies to
367
+ const resourceKeys = Object.keys(properties).filter(key => !policyKeys.includes(key) && !key.endsWith('Name'));
368
+ let resources = resourceKeys.length === 1 ? properties[resourceKeys[0]] : ['???'];
369
+ // For some resources, this is a singleton string, for some it's an array
370
+ if (!Array.isArray(resources)) {
371
+ resources = [resources];
372
+ }
373
+ return (0, util_1.flatMap)(resources, (resource) => {
374
+ return defaultResource(resource, (0, statement_1.parseStatements)(properties[policyKeys[0]].Statement));
375
+ });
376
+ }
377
+ readManagedPolicies(policyArns, logicalId) {
378
+ if (!policyArns) {
379
+ return [];
380
+ }
381
+ const rep = '${' + logicalId + '}';
382
+ return managed_policy_1.ManagedPolicyAttachment.parseManagedPolicies(rep, (0, render_intrinsics_1.renderIntrinsics)(policyArns));
383
+ }
384
+ readLambdaStatements(properties) {
385
+ if (!properties) {
386
+ return [];
387
+ }
388
+ return [(0, statement_1.parseLambdaPermission)((0, render_intrinsics_1.renderIntrinsics)(properties))];
389
+ }
390
+ }
391
+ exports.IamChanges = IamChanges;
392
+ IamChanges.IamPropertyScrutinies = [
393
+ service_spec_types_1.PropertyScrutinyType.InlineIdentityPolicies,
394
+ service_spec_types_1.PropertyScrutinyType.InlineResourcePolicy,
395
+ service_spec_types_1.PropertyScrutinyType.ManagedPolicies,
396
+ ];
397
+ IamChanges.IamResourceScrutinies = [
398
+ service_spec_types_1.ResourceScrutinyType.ResourcePolicyResource,
399
+ service_spec_types_1.ResourceScrutinyType.IdentityPolicyResource,
400
+ service_spec_types_1.ResourceScrutinyType.LambdaPermission,
401
+ service_spec_types_1.ResourceScrutinyType.SsoAssignmentResource,
402
+ service_spec_types_1.ResourceScrutinyType.SsoInstanceACAConfigResource,
403
+ service_spec_types_1.ResourceScrutinyType.SsoPermissionSet,
404
+ ];
405
+ /**
406
+ * Set an undefined or wildcarded principal on these statements
407
+ */
408
+ function defaultPrincipal(principal, statements) {
409
+ statements.forEach(s => s.principals.replaceEmpty(principal));
410
+ statements.forEach(s => s.principals.replaceStar(principal));
411
+ return statements;
412
+ }
413
+ /**
414
+ * Set an undefined or wildcarded resource on these statements
415
+ */
416
+ function defaultResource(resource, statements) {
417
+ statements.forEach(s => s.resources.replaceEmpty(resource));
418
+ statements.forEach(s => s.resources.replaceStar(resource));
419
+ return statements;
420
+ }
421
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWFtLWNoYW5nZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpYW0tY2hhbmdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxvRUFBeUY7QUFDekYsK0JBQStCO0FBQy9CLCtEQUF3STtBQUN4SSxxREFBOEU7QUFDOUUsMkNBQStGO0FBRy9GLDBDQUFpRDtBQUNqRCw0REFBd0Q7QUFDeEQsa0NBQW9GO0FBT3BGOztHQUVHO0FBQ0gsTUFBYSxVQUFVO0lBdUJyQixZQUFZLEtBQXNCO1FBUGxDLG1KQUFtSjtRQUNuSSxlQUFVLEdBQUcsSUFBSSw2QkFBa0IsRUFBYSxDQUFDO1FBQ2pELG9CQUFlLEdBQUcsSUFBSSw2QkFBa0IsRUFBMkIsQ0FBQztRQUNwRSxzQkFBaUIsR0FBRyxJQUFJLDZCQUFrQixFQUFvQixDQUFDO1FBQy9ELG1CQUFjLEdBQUcsSUFBSSw2QkFBa0IsRUFBaUIsQ0FBQztRQUN6RCwwQkFBcUIsR0FBRyxJQUFJLDZCQUFrQixFQUF3QixDQUFDO1FBR3JGLEtBQUssTUFBTSxjQUFjLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsS0FBSyxNQUFNLGNBQWMsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFF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UyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcm9wZXJ0eVNjcnV0aW55VHlwZSwgUmVzb3VyY2VTY3J1dGlueVR5cGUgfSBmcm9tICdAYXdzLWNkay9zZXJ2aWNlLXNwZWMtdHlwZXMnO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgSVNzb0luc3RhbmNlQUNBQ29uZmlnLCBJU3NvUGVybWlzc2lvblNldCwgU3NvQXNzaWdubWVudCwgU3NvSW5zdGFuY2VBQ0FDb25maWcsIFNzb1Blcm1pc3Npb25TZXQgfSBmcm9tICcuL2lhbS1pZGVudGl0eS1jZW50ZXInO1xuaW1wb3J0IHsgTWFuYWdlZFBvbGljeUF0dGFjaG1lbnQsIE1hbmFnZWRQb2xpY3lKc29uIH0gZnJvbSAnLi9tYW5hZ2VkLXBvbGljeSc7XG5pbXBvcnQgeyBwYXJzZUxhbWJkYVBlcm1pc3Npb24sIHBhcnNlU3RhdGVtZW50cywgU3RhdGVtZW50LCBTdGF0ZW1lbnRKc29uIH0gZnJvbSAnLi9zdGF0ZW1lbnQnO1xuaW1wb3J0IHsgTWF5YmVQYXJzZWQgfSBmcm9tICcuLi9kaWZmL21heWJlLXBhcnNlZCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUNoYW5nZSwgUHJvcGVydHlNYXAsIFJlc291cmNlQ2hhbmdlIH0gZnJvbSAnLi4vZGlmZi90eXBlcyc7XG5pbXBvcnQgeyBEaWZmYWJsZUNvbGxlY3Rpb24gfSBmcm9tICcuLi9kaWZmYWJsZSc7XG5pbXBvcnQgeyByZW5kZXJJbnRyaW5zaWNzIH0gZnJvbSAnLi4vcmVuZGVyLWludHJpbnNpY3MnO1xuaW1wb3J0IHsgZGVlcFJlbW92ZVVuZGVmaW5lZCwgZHJvcElmRW1wdHksIGZsYXRNYXAsIG1ha2VDb21wYXJhdG9yIH0gZnJvbSAnLi4vdXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWFtQ2hhbmdlc1Byb3BzIHtcbiAgcHJvcGVydHlDaGFuZ2VzOiBQcm9wZXJ0eUNoYW5nZVtdO1xuICByZXNvdXJjZUNoYW5nZXM6IFJlc291cmNlQ2hhbmdlW107XG59XG5cbi8qKlxuICogQ2hhbmdlcyB0byBJQU0gc3RhdGVtZW50cyBhbmQgSUFNIGlkZW50aXR5IGNlbnRlclxuICovXG5leHBvcnQgY2xhc3MgSWFtQ2hhbmdlcyB7XG4gIHB1YmxpYyBzdGF0aWMgSWFtUHJvcGVydHlTY3J1dGluaWVzID0gW1xuICAgIFByb3BlcnR5U2NydXRpbnlUeXBlLklubGluZUlkZW50aXR5UG9saWNpZXMsXG4gICAgUHJvcGVydHlTY3J1dGlueVR5cGUuSW5saW5lUmVzb3VyY2VQb2xpY3ksXG4gICAgUHJvcGVydHlTY3J1dGlueVR5cGUuTWFuYWdlZFBvbGljaWVzLFxuICBdO1xuXG4gIHB1YmxpYyBzdGF0aWMgSWFtUmVzb3VyY2VTY3J1dGluaWVzID0gW1xuICAgIFJlc291cmNlU2NydXRpbnlUeXBlLlJlc291cmNlUG9saWN5UmVzb3VyY2UsXG4gICAgUmVzb3VyY2VTY3J1dGlueVR5cGUuSWRlbnRpdHlQb2xpY3lSZXNvdXJjZSxcbiAgICBSZXNvdXJjZVNjcnV0aW55VHlwZS5MYW1iZGFQZXJtaXNzaW9uLFxuICAgIFJlc291cmNlU2NydXRpbnlUeXBlLlNzb0Fzc2lnbm1lbnRSZXNvdXJjZSxcbiAgICBSZXNvdXJjZVNjcnV0aW55VHlwZS5Tc29JbnN0YW5jZUFDQUNvbmZpZ1Jlc291cmNlLFxuICAgIFJlc291cmNlU2NydXRpbnlUeXBlLlNzb1Blcm1pc3Npb25TZXQsXG4gIF07XG5cbiAgLy8gZWFjaCBlbnRyeSBpbiBhIERpZmZhYmxlQ29sbGVjdGlvbiBpcyB1c2VkIHRvIGdlbmVyYXRlIGEgc2luZ2xlIHJvdyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlcyB0YWJsZSB0aGF0IGlzIHByZXNlbnRlZCBmb3IgY2RrIGRpZmYgYW5kIGNkayBkZXBsb3kuXG4gIHB1YmxpYyByZWFkb25seSBzdGF0ZW1lbnRzID0gbmV3IERpZmZhYmxlQ29sbGVjdGlvbjxTdGF0ZW1lbnQ+KCk7XG4gIHB1YmxpYyByZWFkb25seSBtYW5hZ2VkUG9saWNpZXMgPSBuZXcgRGlmZmFibGVDb2xsZWN0aW9uPE1hbmFnZWRQb2xpY3lBdHRhY2htZW50PigpO1xuICBwdWJsaWMgcmVhZG9ubHkgc3NvUGVybWlzc2lvblNldHMgPSBuZXcgRGlmZmFibGVDb2xsZWN0aW9uPFNzb1Blcm1pc3Npb25TZXQ+KCk7XG4gIHB1YmxpYyByZWFkb25seSBzc29Bc3NpZ25tZW50cyA9IG5ldyBEaWZmYWJsZUNvbGxlY3Rpb248U3NvQXNzaWdubWVudD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IHNzb0luc3RhbmNlQUNBQ29uZmlncyA9IG5ldyBEaWZmYWJsZUNvbGxlY3Rpb248U3NvSW5zdGFuY2VBQ0FDb25maWc+KCk7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IElhbUNoYW5nZXNQcm9wcykge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlDaGFuZ2Ugb2YgcHJvcHMucHJvcGVydHlDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnJlYWRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eUNoYW5nZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVzb3VyY2VDaGFuZ2Ugb2YgcHJvcHMucmVzb3VyY2VDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnJlYWRSZXNvdXJjZUNoYW5nZShyZXNvdXJjZUNoYW5nZSk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZW1lbnRzLmNhbGN1bGF0ZURpZmYoKTtcbiAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5jYWxjdWxhdGVEaWZmKCk7XG4gICAgdGhpcy5zc29QZXJtaXNzaW9uU2V0cy5jYWxjdWxhdGVEaWZmKCk7XG4gICAgdGhpcy5zc29Bc3NpZ25tZW50cy5jYWxjdWxhdGVEaWZmKCk7XG4gICAgdGhpcy5zc29JbnN0YW5jZUFDQUNvbmZpZ3MuY2FsY3VsYXRlRGlmZigpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNDaGFuZ2VzKCkge1xuICAgIHJldHVybiAodGhpcy5zdGF0ZW1lbnRzLmhhc0NoYW5nZXNcbiAgICAgIHx8IHRoaXMubWFuYWdlZFBvbGljaWVzLmhhc0NoYW5nZXNcbiAgICAgIHx8IHRoaXMuc3NvUGVybWlzc2lvblNldHMuaGFzQ2hhbmdlc1xuICAgICAgfHwgdGhpcy5zc29Bc3NpZ25tZW50cy5oYXNDaGFuZ2VzXG4gICAgICB8fCB0aGlzLnNzb0luc3RhbmNlQUNBQ29uZmlncy5oYXNDaGFuZ2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgY2hhbmdlcyBpbmNsdWRlIGJyb2FkZW5lZCBwZXJtaXNzaW9uc1xuICAgKlxuICAgKiBQZXJtaXNzaW9ucyBhcmUgYnJvYWRlbmVkIGlmIHBvc2l0aXZlIHN0YXRlbWVudHMgYXJlIGFkZGVkIG9yXG4gICAqIG5lZ2F0aXZlIHN0YXRlbWVudHMgYXJlIHJlbW92ZWQsIG9yIGlmIG1hbmFnZWQgcG9saWNpZXMgYXJlIGFkZGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBwZXJtaXNzaW9uc0Jyb2FkZW5lZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnRzLmFkZGl0aW9ucy5zb21lKHMgPT4gIXMuaXNOZWdhdGl2ZVN0YXRlbWVudClcbiAgICAgICAgfHwgdGhpcy5zdGF0ZW1lbnRzLnJlbW92YWxzLnNvbWUocyA9PiBzLmlzTmVnYXRpdmVTdGF0ZW1lbnQpXG4gICAgICAgIHx8IHRoaXMubWFuYWdlZFBvbGljaWVzLmhhc0FkZGl0aW9uc1xuICAgICAgICB8fCB0aGlzLnNzb1Blcm1pc3Npb25TZXRzLmhhc0FkZGl0aW9uc1xuICAgICAgICB8fCB0aGlzLnNzb0Fzc2lnbm1lbnRzLmhhc0FkZGl0aW9uc1xuICAgICAgICB8fCB0aGlzLnNzb0luc3RhbmNlQUNBQ29uZmlncy5oYXNBZGRpdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgc3VtbWFyeSB0YWJsZSBvZiBjaGFuZ2VzXG4gICAqL1xuICBwdWJsaWMgc3VtbWFyaXplU3RhdGVtZW50cygpOiBzdHJpbmdbXVtdIHtcbiAgICBjb25zdCByZXQ6IHN0cmluZ1tdW10gPSBbXTtcblxuICAgIGNvbnN0IGhlYWRlciA9IFsnJywgJ1Jlc291cmNlJywgJ0VmZmVjdCcsICdBY3Rpb24nLCAnUHJpbmNpcGFsJywgJ0NvbmRpdGlvbiddO1xuXG4gICAgLy8gRmlyc3QgZ2VuZXJhdGUgYWxsIGxpbmVzLCB0aGVuIHNvcnQgb24gUmVzb3VyY2Ugc28gdGhhdCBzaW1pbGFyIHJlc291cmNlcyBhcmUgdG9nZXRoZXJcbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiB0aGlzLnN0YXRlbWVudHMuYWRkaXRpb25zKSB7XG4gICAgICBjb25zdCByZW5kZXJlZFN0YXRlbWVudCA9IHN0YXRlbWVudC5yZW5kZXIoKTtcbiAgICAgIHJldC5wdXNoKFtcbiAgICAgICAgJysnLFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5yZXNvdXJjZSxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuZWZmZWN0LFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5hY3Rpb24sXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LnByaW5jaXBhbCxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuY29uZGl0aW9uLFxuICAgICAgXS5tYXAocyA9PiBjaGFsay5ncmVlbihzKSkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiB0aGlzLnN0YXRlbWVudHMucmVtb3ZhbHMpIHtcbiAgICAgIGNvbnN0IHJlbmRlcmVkU3RhdGVtZW50ID0gc3RhdGVtZW50LnJlbmRlcigpO1xuICAgICAgcmV0LnB1c2goW1xuICAgICAgICAnLScsXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LnJlc291cmNlLFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5lZmZlY3QsXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LmFjdGlvbixcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQucHJpbmNpcGFsLFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5jb25kaXRpb24sXG4gICAgICBdLm1hcChzID0+IGNoYWxrLnJlZChzKSkpO1xuICAgIH1cblxuICAgIC8vIFNvcnQgYnkgMm5kIGNvbHVtblxuICAgIHJldC5zb3J0KG1ha2VDb21wYXJhdG9yKChyb3c6IHN0cmluZ1tdKSA9PiBbcm93WzFdXSkpO1xuXG4gICAgcmV0LnNwbGljZSgwLCAwLCBoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHB1YmxpYyBzdW1tYXJpemVNYW5hZ2VkUG9saWNpZXMoKTogc3RyaW5nW11bXSB7XG4gICAgY29uc3QgcmV0OiBzdHJpbmdbXVtdID0gW107XG4gICAgY29uc3QgaGVhZGVyID0gWycnLCAnUmVzb3VyY2UnLCAnTWFuYWdlZCBQb2xpY3kgQVJOJ107XG5cbiAgICBmb3IgKGNvbnN0IGF0dCBvZiB0aGlzLm1hbmFnZWRQb2xpY2llcy5hZGRpdGlvbnMpIHtcbiAgICAgIHJldC5wdXNoKFtcbiAgICAgICAgJysnLFxuICAgICAgICBhdHQuaWRlbnRpdHlBcm4sXG4gICAgICAgIGF0dC5tYW5hZ2VkUG9saWN5QXJuLFxuICAgICAgXS5tYXAocyA9PiBjaGFsay5ncmVlbihzKSkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGF0dCBvZiB0aGlzLm1hbmFnZWRQb2xpY2llcy5yZW1vdmFscykge1xuICAgICAgcmV0LnB1c2goW1xuICAgICAgICAnLScsXG4gICAgICAgIGF0dC5pZGVudGl0eUFybixcbiAgICAgICAgYXR0Lm1hbmFnZWRQb2xpY3lBcm4sXG4gICAgICBdLm1hcChzID0+IGNoYWxrLnJlZChzKSkpO1xuICAgIH1cblxuICAgIC8vIFNvcnQgYnkgMm5kIGNvbHVtblxuICAgIHJldC5zb3J0KG1ha2VDb21wYXJhdG9yKChyb3c6IHN0cmluZ1tdKSA9PiBbcm93WzFdXSkpO1xuXG4gICAgcmV0LnNwbGljZSgwLCAwLCBoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHB1YmxpYyBzdW1tYXJpemVTc29Bc3NpZ25tZW50cygpOiBzdHJpbmdbXVtdIHtcbiAgICBjb25zdCByZXQ6IHN0cmluZ1tdW10gPSBbXTtcbiAgICBjb25zdCBoZWFkZXIgPSBbJycsICdSZXNvdXJjZScsICdJbnN0YW5jZUFybicsICdQZXJtaXNzaW9uU2V0QXJuJywgJ1ByaW5jaXBhbElkJywgJ1ByaW5jaXBhbFR5cGUnLCAnVGFyZ2V0SWQnLCAnVGFyZ2V0VHlwZSddO1xuXG4gICAgZm9yIChjb25zdCBhdHQgb2YgdGhpcy5zc29Bc3NpZ25tZW50cy5hZGRpdGlvbnMpIHtcbiAgICAgIHJldC5wdXNoKFtcbiAgICAgICAgJysnLFxuICAgICAgICBhdHQuY2ZuTG9naWNhbElkIHx8ICcnLFxuICAgICAgICBhdHQuc3NvSW5zdGFuY2VBcm4gfHwgJycsXG4gICAgICAgIGF0dC5wZXJtaXNzaW9uU2V0QXJuIHx8ICcnLFxuICAgICAgICBhdHQucHJpbmNpcGFsSWQgfHwgJycsXG4gICAgICAgIGF0dC5wcmluY2lwYWxUeXBlIHx8ICcnLFxuICAgICAgICBhdHQudGFyZ2V0SWQgfHwgJycsXG4gICAgICAgIGF0dC50YXJnZXRUeXBlIHx8ICcnLFxuICAgICAgXS5tYXAocyA9PiBjaGFsay5ncmVlbihzKSkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGF0dCBvZiB0aGlzLnNzb0Fzc2lnbm1lbnRzLnJlbW92YWxzKSB7XG4gICAgICByZXQucHVzaChbXG4gICAgICAgICctJyxcbiAgICAgICAgYXR0LmNmbkxvZ2ljYWxJZCB8fCAnJyxcbiAgICAgICAgYXR0LnNzb0luc3RhbmNlQXJuIHx8ICcnLFxuICAgICAgICBhdHQucGVybWlzc2lvblNldEFybiB8fCAnJyxcbiAgICAgICAgYXR0LnByaW5jaXBhbElkIHx8ICcnLFxuICAgICAgICBhdHQucHJpbmNpcGFsVHlwZSB8fCAnJyxcbiAgICAgICAgYXR0LnRhcmdldElkIHx8ICcnLFxuICAgICAgICBhdHQudGFyZ2V0VHlwZSB8fCAnJyxcbiAgICAgIF0ubWFwKHMgPT4gY2hhbGsucmVkKHMpKSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBieSByZXNvdXJjZSBuYW1lIHRvIGVuc3VyZSBhIHVuaXF1ZSB2YWx1ZSBpcyB1c2VkIGZvciBzb3J0aW5nXG4gICAgcmV0LnNvcnQobWFrZUNvbXBhcmF0b3IoKHJvdzogc3RyaW5nW10pID0+IFtyb3dbMV1dKSk7XG4gICAgcmV0LnNwbGljZSgwLCAwLCBoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHB1YmxpYyBzdW1tYXJpemVTc29JbnN0YW5jZUFDQUNvbmZpZ3MoKTogc3RyaW5nW11bXSB7XG4gICAgY29uc3QgcmV0OiBzdHJpbmdbXVtdID0gW107XG4gICAgY29uc3QgaGVhZGVyID0gWycnLCAnUmVzb3VyY2UnLCAnSW5zdGFuY2VBcm4nLCAnQWNjZXNzQ29udHJvbEF0dHJpYnV0ZXMnXTtcblxuICAgIGZ1bmN0aW9uIGZvcm1hdEFjY2Vzc0NvbnRyb2xBdHRyaWJ1dGUoYWNhOiBJU3NvSW5zdGFuY2VBQ0FDb25maWcuQWNjZXNzQ29udHJvbEF0dHJpYnV0ZSk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gYEtleTogJHthY2E/LktleX0sIFZhbHVlczogWyR7YWNhPy5WYWx1ZT8uU291cmNlLmpvaW4oJywgJyl9XWA7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhdHQgb2YgdGhpcy5zc29JbnN0YW5jZUFDQUNvbmZpZ3MuYWRkaXRpb25zKSB7XG4gICAgICByZXQucHVzaChbXG4gICAgICAgICcrJyxcbiAgICAgICAgYXR0LmNmbkxvZ2ljYWxJZCB8fCAnJyxcbiAgICAgICAgYXR0LnNzb0luc3RhbmNlQXJuIHx8ICcnLFxuICAgICAgICBhdHQuYWNjZXNzQ29udHJvbEF0dHJpYnV0ZXM/Lm1hcChmb3JtYXRBY2Nlc3NDb250cm9sQXR0cmlidXRlKS5qb2luKCdcXG4nKSB8fCAnJyxcbiAgICAgIF0ubWFwKHMgPT4gY2hhbGsuZ3JlZW4ocykpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBhdHQgb2YgdGhpcy5zc29JbnN0YW5jZUFDQUNvbmZpZ3MucmVtb3ZhbHMpIHtcbiAgICAgIHJldC5wdXNoKFtcbiAgICAgICAgJy0nLFxuICAgICAgICBhdHQuY2ZuTG9naWNhbElkIHx8ICcnLFxuICAgICAgICBhdHQuc3NvSW5zdGFuY2VBcm4gfHwgJycsXG4gICAgICAgIGF0dC5hY2Nlc3NDb250cm9sQXR0cmlidXRlcz8ubWFwKGZvcm1hdEFjY2Vzc0NvbnRyb2xBdHRyaWJ1dGUpLmpvaW4oJ1xcbicpIHx8ICcnLFxuICAgICAgXS5tYXAocyA9PiBjaGFsay5yZWQocykpKTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGJ5IHJlc291cmNlIG5hbWUgdG8gZW5zdXJlIGEgdW5pcXVlIHZhbHVlIGlzIHVzZWQgZm9yIHNvcnRpbmdcbiAgICByZXQuc29ydChtYWtlQ29tcGFyYXRvcigocm93OiBzdHJpbmdbXSkgPT4gW3Jvd1sxXV0pKTtcbiAgICByZXQuc3BsaWNlKDAsIDAsIGhlYWRlcik7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIHN1bW1hcml6ZVNzb1Blcm1pc3Npb25TZXRzKCk6IHN0cmluZ1tdW10ge1xuICAgIGNvbnN0IHJldDogc3RyaW5nW11bXSA9IFtdO1xuICAgIGNvbnN0IGhlYWRlciA9IFsnJywgJ1Jlc291cmNlJywgJ0luc3RhbmNlQXJuJywgJ1Blcm1pc3Npb25TZXQgbmFtZScsICdQZXJtaXNzaW9uc0JvdW5kYXJ5JywgJ0N1c3RvbWVyTWFuYWdlZFBvbGljeVJlZmVyZW5jZXMnXTtcblxuICAgIGZ1bmN0aW9uIGZvcm1hdE1hbmFnZWRQb2xpY3lSZWYoczogSVNzb1Blcm1pc3Npb25TZXQuQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBgTmFtZTogJHtzPy5OYW1lIHx8ICcnfSwgUGF0aDogJHtzPy5QYXRoIHx8ICcnfWA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZm9ybWF0U3NvUGVybWlzc2lvbnNCb3VuZGFyeShzc29QYjogSVNzb1Blcm1pc3Npb25TZXQuUGVybWlzc2lvbnNCb3VuZGFyeSB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgICAvLyBNYW5hZ2VkUG9saWN5QXJuIE9SIEN1c3RvbWVyTWFuYWdlZFBvbGljeVJlZmVyZW5jZSBjYW4gYmUgc3BlY2lmaWVkIC0tIGJ1dCBub3QgYm90aC5cbiAgICAgIGlmIChzc29QYj8uTWFuYWdlZFBvbGljeUFybiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBgTWFuYWdlZFBvbGljeUFybjogJHtzc29QYj8uTWFuYWdlZFBvbGljeUFybiB8fCAnJ31gO1xuICAgICAgfSBlbHNlIGlmIChzc29QYj8uQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGBDdXN0b21lck1hbmFnZWRQb2xpY3lSZWZlcmVuY2U6IHtcXG4gICR7Zm9ybWF0TWFuYWdlZFBvbGljeVJlZihzc29QYj8uQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlKX1cXG59YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGF0dCBvZiB0aGlzLnNzb1Blcm1pc3Npb25TZXRzLmFkZGl0aW9ucykge1xuICAgICAgcmV0LnB1c2goW1xuICAgICAgICAnKycsXG4gICAgICAgIGF0dC5jZm5Mb2dpY2FsSWQgfHwgJycsXG4gICAgICAgIGF0dC5zc29JbnN0YW5jZUFybiB8fCAnJyxcbiAgICAgICAgYXR0Lm5hbWUgfHwgJycsXG4gICAgICAgIGZvcm1hdFNzb1Blcm1pc3Npb25zQm91bmRhcnkoYXR0LnNzb1Blcm1pc3Npb25zQm91bmRhcnkpLFxuICAgICAgICBhdHQuc3NvQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlcz8ubWFwKGZvcm1hdE1hbmFnZWRQb2xpY3lSZWYpLmpvaW4oJ1xcbicpIHx8ICcnLFxuICAgICAgXS5tYXAocyA9PiBjaGFsay5ncmVlbihzKSkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGF0dCBvZiB0aGlzLnNzb1Blcm1pc3Npb25TZXRzLnJlbW92YWxzKSB7XG4gICAgICByZXQucHVzaChbXG4gICAgICAgICctJyxcbiAgICAgICAgYXR0LmNmbkxvZ2ljYWxJZCB8fCAnJyxcbiAgICAgICAgYXR0LnNzb0luc3RhbmNlQXJuIHx8ICcnLFxuICAgICAgICBhdHQubmFtZSB8fCAnJyxcbiAgICAgICAgZm9ybWF0U3NvUGVybWlzc2lvbnNCb3VuZGFyeShhdHQuc3NvUGVybWlzc2lvbnNCb3VuZGFyeSksXG4gICAgICAgIGF0dC5zc29DdXN0b21lck1hbmFnZWRQb2xpY3lSZWZlcmVuY2VzPy5tYXAoZm9ybWF0TWFuYWdlZFBvbGljeVJlZikuam9pbignXFxuJykgfHwgJycsXG4gICAgICBdLm1hcChzID0+IGNoYWxrLnJlZChzKSkpO1xuICAgIH1cblxuICAgIC8vIFNvcnQgYnkgcmVzb3VyY2UgbmFtZSB0byBlbnN1cmUgYSB1bmlxdWUgdmFsdWUgaXMgdXNlZCBmb3Igc29ydGluZ1xuICAgIHJldC5zb3J0KG1ha2VDb21wYXJhdG9yKChyb3c6IHN0cmluZ1tdKSA9PiBbcm93WzFdXSkpO1xuICAgIHJldC5zcGxpY2UoMCwgMCwgaGVhZGVyKTtcblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbWFjaGluZS1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBjaGFuZ2VzLlxuICAgKiBUaGlzIGlzIG9ubHkgdXNlZCBpbiB0ZXN0cy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3RvSnNvbigpOiBJYW1DaGFuZ2VzSnNvbiB7XG4gICAgcmV0dXJuIGRlZXBSZW1vdmVVbmRlZmluZWQoe1xuICAgICAgc3RhdGVtZW50QWRkaXRpb25zOiBkcm9wSWZFbXB0eSh0aGlzLnN0YXRlbWVudHMuYWRkaXRpb25zLm1hcChzID0+IHMuX3RvSnNvbigpKSksXG4gICAgICBzdGF0ZW1lbnRSZW1vdmFsczogZHJvcElmRW1wdHkodGhpcy5zdGF0ZW1lbnRzLnJlbW92YWxzLm1hcChzID0+IHMuX3RvSnNvbigpKSksXG4gICAgICBtYW5hZ2VkUG9saWN5QWRkaXRpb25zOiBkcm9wSWZFbXB0eSh0aGlzLm1hbmFnZWRQb2xpY2llcy5hZGRpdGlvbnMubWFwKHMgPT4gcy5fdG9Kc29uKCkpKSxcbiAgICAgIG1hbmFnZWRQb2xpY3lSZW1vdmFsczogZHJvcElmRW1wdHkodGhpcy5tYW5hZ2VkUG9saWNpZXMucmVtb3ZhbHMubWFwKHMgPT4gcy5fdG9Kc29uKCkpKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5Q2hhbmdlOiBQcm9wZXJ0eUNoYW5nZSkge1xuICAgIHN3aXRjaCAocHJvcGVydHlDaGFuZ2Uuc2NydXRpbnlUeXBlKSB7XG4gICAgICBjYXNlIFByb3BlcnR5U2NydXRpbnlUeXBlLklubGluZUlkZW50aXR5UG9saWNpZXM6XG4gICAgICAgIC8vIEFXUzo6SUFNOjp7IFJvbGUgfCBVc2VyIHwgR3JvdXAgfS5Qb2xpY2llc1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkT2xkKC4uLnRoaXMucmVhZElkZW50aXR5UG9saWNpZXMocHJvcGVydHlDaGFuZ2Uub2xkVmFsdWUsIHByb3BlcnR5Q2hhbmdlLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGROZXcoLi4udGhpcy5yZWFkSWRlbnRpdHlQb2xpY2llcyhwcm9wZXJ0eUNoYW5nZS5uZXdWYWx1ZSwgcHJvcGVydHlDaGFuZ2UucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByb3BlcnR5U2NydXRpbnlUeXBlLklubGluZVJlc291cmNlUG9saWN5OlxuICAgICAgICAvLyBBbnkgUG9saWN5RG9jdW1lbnQgb24gYSByZXNvdXJjZSAoaW5jbHVkaW5nIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudClcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLmFkZE9sZCguLi50aGlzLnJlYWRSZXNvdXJjZVN0YXRlbWVudHMocHJvcGVydHlDaGFuZ2Uub2xkVmFsdWUsIHByb3BlcnR5Q2hhbmdlLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGROZXcoLi4udGhpcy5yZWFkUmVzb3VyY2VTdGF0ZW1lbnRzKHByb3BlcnR5Q2hhbmdlLm5ld1ZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJvcGVydHlTY3J1dGlueVR5cGUuTWFuYWdlZFBvbGljaWVzOlxuICAgICAgICAvLyBKdXN0IGEgbGlzdCBvZiBtYW5hZ2VkIHBvbGljaWVzXG4gICAgICAgIHRoaXMubWFuYWdlZFBvbGljaWVzLmFkZE9sZCguLi50aGlzLnJlYWRNYW5hZ2VkUG9saWNpZXMocHJvcGVydHlDaGFuZ2Uub2xkVmFsdWUsIHByb3BlcnR5Q2hhbmdlLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICAgIHRoaXMubWFuYWdlZFBvbGljaWVzLmFkZE5ldyguLi50aGlzLnJlYWRNYW5hZ2VkUG9saWNpZXMocHJvcGVydHlDaGFuZ2UubmV3VmFsdWUsIHByb3BlcnR5Q2hhbmdlLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVhZFJlc291cmNlQ2hhbmdlKHJlc291cmNlQ2hhbmdlOiBSZXNvdXJjZUNoYW5nZSkge1xuICAgIHN3aXRjaCAocmVzb3VyY2VDaGFuZ2Uuc2NydXRpbnlUeXBlKSB7XG4gICAgICBjYXNlIFJlc291cmNlU2NydXRpbnlUeXBlLklkZW50aXR5UG9saWN5UmVzb3VyY2U6XG4gICAgICAgIC8vIEFXUzo6SUFNOjpQb2xpY3lcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLmFkZE9sZCguLi50aGlzLnJlYWRJZGVudGl0eVBvbGljeVJlc291cmNlKHJlc291cmNlQ2hhbmdlLm9sZFByb3BlcnRpZXMpKTtcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLmFkZE5ldyguLi50aGlzLnJlYWRJZGVudGl0eVBvbGljeVJlc291cmNlKHJlc291cmNlQ2hhbmdlLm5ld1Byb3BlcnRpZXMpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlc291cmNlU2NydXRpbnlUeXBlLlJlc291cmNlUG9saWN5UmVzb3VyY2U6XG4gICAgICAgIC8vIEFXUzo6Kjo6e0J1Y2tldCxRdWV1ZSxUb3BpY31Qb2xpY3lcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLmFkZE9sZCguLi50aGlzLnJlYWRSZXNvdXJjZVBvbGljeVJlc291cmNlKHJlc291cmNlQ2hhbmdlLm9sZFByb3BlcnRpZXMpKTtcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLmFkZE5ldyguLi50aGlzLnJlYWRSZXNvdXJjZVBvbGljeVJlc291cmNlKHJlc291cmNlQ2hhbmdlLm5ld1Byb3BlcnRpZXMpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlc291cmNlU2NydXRpbnlUeXBlLkxhbWJkYVBlcm1pc3Npb246XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkTGFtYmRhU3RhdGVtZW50cyhyZXNvdXJjZUNoYW5nZS5vbGRQcm9wZXJ0aWVzKSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGROZXcoLi4udGhpcy5yZWFkTGFtYmRhU3RhdGVtZW50cyhyZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSZXNvdXJjZVNjcnV0aW55VHlwZS5Tc29QZXJtaXNzaW9uU2V0OlxuICAgICAgICB0aGlzLnNzb1Blcm1pc3Npb25TZXRzLmFkZE9sZCguLi50aGlzLnJlYWRTc29QZXJtaXNzaW9uU2V0KHJlc291cmNlQ2hhbmdlLm9sZFByb3BlcnRpZXMsIHJlc291cmNlQ2hhbmdlLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICAgIHRoaXMuc3NvUGVybWlzc2lvblNldHMuYWRkTmV3KC4uLnRoaXMucmVhZFNzb1Blcm1pc3Npb25TZXQocmVzb3VyY2VDaGFuZ2UubmV3UHJvcGVydGllcywgcmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlc291cmNlU2NydXRpbnlUeXBlLlNzb0Fzc2lnbm1lbnRSZXNvdXJjZTpcbiAgICAgICAgdGhpcy5zc29Bc3NpZ25tZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkU3NvQXNzaWdubWVudHMocmVzb3VyY2VDaGFuZ2Uub2xkUHJvcGVydGllcywgcmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICAgICAgdGhpcy5zc29Bc3NpZ25tZW50cy5hZGROZXcoLi4udGhpcy5yZWFkU3NvQXNzaWdubWVudHMocmVzb3VyY2VDaGFuZ2UubmV3UHJvcGVydGllcywgcmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlc291cmNlU2NydXRpbnlUeXBlLlNzb0luc3RhbmNlQUNBQ29uZmlnUmVzb3VyY2U6XG4gICAgICAgIHRoaXMuc3NvSW5zdGFuY2VBQ0FDb25maWdzLmFkZE9sZCguLi50aGlzLnJlYWRTc29JbnN0YW5jZUFDQUNvbmZpZ3MocmVzb3VyY2VDaGFuZ2Uub2xkUHJvcGVydGllcywgcmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICAgICAgdGhpcy5zc29JbnN0YW5jZUFDQUNvbmZpZ3MuYWRkTmV3KC4uLnRoaXMucmVhZFNzb0luc3RhbmNlQUNBQ29uZmlncyhyZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzLCByZXNvdXJjZUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYSBsaXN0IG9mIHBvbGljaWVzIG9uIGFuIGlkZW50aXR5XG4gICAqL1xuICBwcml2YXRlIHJlYWRJZGVudGl0eVBvbGljaWVzKHBvbGljaWVzOiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogU3RhdGVtZW50W10ge1xuICAgIGlmIChwb2xpY2llcyA9PT0gdW5kZWZpbmVkIHx8ICFBcnJheS5pc0FycmF5KHBvbGljaWVzKSkgeyByZXR1cm4gW107IH1cblxuICAgIGNvbnN0IGFwcGxpZXNUb1ByaW5jaXBhbCA9ICdBV1M6JHsnICsgbG9naWNhbElkICsgJ30nO1xuXG4gICAgcmV0dXJuIGZsYXRNYXAocG9saWNpZXMsIChwb2xpY3k6IGFueSkgPT4ge1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIFBvbGljeSBpdHNlbGYgaXMgbm90IGFuIGludHJpbnNpYywgbGlrZSBhbiBGbjo6SWZcbiAgICAgIGNvbnN0IHVucGFyc2VkU3RhdGVtZW50ID0gcG9saWN5LlBvbGljeURvY3VtZW50Py5TdGF0ZW1lbnRcbiAgICAgICAgPyBwb2xpY3kuUG9saWN5RG9jdW1lbnQuU3RhdGVtZW50XG4gICAgICAgIDogcG9saWN5O1xuICAgICAgcmV0dXJuIGRlZmF1bHRQcmluY2lwYWwoYXBwbGllc1RvUHJpbmNpcGFsLCBwYXJzZVN0YXRlbWVudHMocmVuZGVySW50cmluc2ljcyh1bnBhcnNlZFN0YXRlbWVudCkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbiBJQU06OlBvbGljeSByZXNvdXJjZVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkSWRlbnRpdHlQb2xpY3lSZXNvdXJjZShwcm9wZXJ0aWVzOiBhbnkpOiBTdGF0ZW1lbnRbXSB7XG4gICAgaWYgKHByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH1cblxuICAgIHByb3BlcnRpZXMgPSByZW5kZXJJbnRyaW5zaWNzKHByb3BlcnRpZXMpO1xuXG4gICAgY29uc3QgcHJpbmNpcGFscyA9IChwcm9wZXJ0aWVzLkdyb3VwcyB8fCBbXSkuY29uY2F0KHByb3BlcnRpZXMuVXNlcnMgfHwgW10pLmNvbmNhdChwcm9wZXJ0aWVzLlJvbGVzIHx8IFtdKTtcbiAgICByZXR1cm4gZmxhdE1hcChwcmluY2lwYWxzLCAocHJpbmNpcGFsOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHJlZiA9ICdBV1M6JyArIHByaW5jaXBhbDtcbiAgICAgIHJldHVybiBkZWZhdWx0UHJpbmNpcGFsKHJlZiwgcGFyc2VTdGF0ZW1lbnRzKHByb3BlcnRpZXMuUG9saWN5RG9jdW1lbnQuU3RhdGVtZW50KSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRTc29JbnN0YW5jZUFDQUNvbmZpZ3MocHJvcGVydGllczogYW55LCBsb2dpY2FsSWQ6IHN0cmluZyk6IFNzb0luc3RhbmNlQUNBQ29uZmlnW10ge1xuICAgIGlmIChwcm9wZXJ0aWVzID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIFtdOyB9XG5cbiAgICBwcm9wZXJ0aWVzID0gcmVuZGVySW50cmluc2ljcyhwcm9wZXJ0aWVzKTtcblxuICAgIHJldHVybiBbbmV3IFNzb0luc3RhbmNlQUNBQ29uZmlnKHtcbiAgICAgIGNmbkxvZ2ljYWxJZDogJyR7JyArIGxvZ2ljYWxJZCArICd9JyxcbiAgICAgIHNzb0luc3RhbmNlQXJuOiBwcm9wZXJ0aWVzLkluc3RhbmNlQXJuLFxuICAgICAgYWNjZXNzQ29udHJvbEF0dHJpYnV0ZXM6IHByb3BlcnRpZXMuQWNjZXNzQ29udHJvbEF0dHJpYnV0ZXMsXG4gICAgfSldO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkU3NvQXNzaWdubWVudHMocHJvcGVydGllczogYW55LCBsb2dpY2FsSWQ6IHN0cmluZyk6IFNzb0Fzc2lnbm1lbnRbXSB7XG4gICAgaWYgKHByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH1cblxuICAgIHByb3BlcnRpZXMgPSByZW5kZXJJbnRyaW5zaWNzKHByb3BlcnRpZXMpO1xuXG4gICAgcmV0dXJuIFtuZXcgU3NvQXNzaWdubWVudCh7XG4gICAgICBjZm5Mb2dpY2FsSWQ6ICckeycgKyBsb2dpY2FsSWQgKyAnfScsXG4gICAgICBzc29JbnN0YW5jZUFybjogcHJvcGVydGllcy5JbnN0YW5jZUFybixcbiAgICAgIHBlcm1pc3Npb25TZXRBcm46IHByb3BlcnRpZXMuUGVybWlzc2lvblNldEFybixcbiAgICAgIHByaW5jaXBhbElkOiBwcm9wZXJ0aWVzLlByaW5jaXBhbElkLFxuICAgICAgcHJpbmNpcGFsVHlwZTogcHJvcGVydGllcy5QcmluY2lwYWxUeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHByb3BlcnRpZXMuVGFyZ2V0SWQsXG4gICAgICB0YXJnZXRUeXBlOiBwcm9wZXJ0aWVzLlRhcmdldFR5cGUsXG4gICAgfSldO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkU3NvUGVybWlzc2lvblNldChwcm9wZXJ0aWVzOiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogU3NvUGVybWlzc2lvblNldFtdIHtcbiAgICBpZiAocHJvcGVydGllcyA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBbXTsgfVxuXG4gICAgcHJvcGVydGllcyA9IHJlbmRlckludHJpbnNpY3MocHJvcGVydGllcyk7XG5cbiAgICByZXR1cm4gW25ldyBTc29QZXJtaXNzaW9uU2V0KHtcbiAgICAgIGNmbkxvZ2ljYWxJZDogJyR7JyArIGxvZ2ljYWxJZCArICd9JyxcbiAgICAgIG5hbWU6IHByb3BlcnRpZXMuTmFtZSxcbiAgICAgIHNzb0luc3RhbmNlQXJuOiBwcm9wZXJ0aWVzLkluc3RhbmNlQXJuLFxuICAgICAgc3NvQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlczogcHJvcGVydGllcy5DdXN0b21lck1hbmFnZWRQb2xpY3lSZWZlcmVuY2VzLFxuICAgICAgc3NvUGVybWlzc2lvbnNCb3VuZGFyeTogcHJvcGVydGllcy5QZXJtaXNzaW9uc0JvdW5kYXJ5LFxuICAgIH0pXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZFJlc291cmNlU3RhdGVtZW50cyhwb2xpY3k6IGFueSwgbG9naWNhbElkOiBzdHJpbmcpOiBTdGF0ZW1lbnRbXSB7XG4gICAgaWYgKHBvbGljeSA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBbXTsgfVxuXG4gICAgY29uc3QgYXBwbGllc1RvUmVzb3VyY2UgPSAnJHsnICsgbG9naWNhbElkICsgJy5Bcm59JztcbiAgICByZXR1cm4gZGVmYXVsdFJlc291cmNlKGFwcGxpZXNUb1Jlc291cmNlLCBwYXJzZVN0YXRlbWVudHMocmVuZGVySW50cmluc2ljcyhwb2xpY3kuU3RhdGVtZW50KSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGFuIEFXUzo6Kjo6e0J1Y2tldCxUb3BpYyxRdWV1ZX1wb2xpY3lcbiAgICovXG4gIHByaXZhdGUgcmVhZFJlc291cmNlUG9saWN5UmVzb3VyY2UocHJvcGVydGllczogYW55KTogU3RhdGVtZW50W10ge1xuICAgIGlmIChwcm9wZXJ0aWVzID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIFtdOyB9XG5cbiAgICBwcm9wZXJ0aWVzID0gcmVuZGVySW50cmluc2ljcyhwcm9wZXJ0aWVzKTtcblxuICAgIGNvbnN0IHBvbGljeUtleXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5maWx0ZXIoa2V5ID0+IGtleS5pbmRleE9mKCdQb2xpY3knKSA+IC0xKTtcblxuICAgIC8vIEZpbmQgdGhlIGtleSB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlKHMpIHRoaXMgcG9saWN5IGFwcGxpZXMgdG9cbiAgICBjb25zdCByZXNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5maWx0ZXIoa2V5ID0+ICFwb2xpY3lLZXlzLmluY2x1ZGVzKGtleSkgJiYgIWtleS5lbmRzV2l0aCgnTmFtZScpKTtcbiAgICBsZXQgcmVzb3VyY2VzID0gcmVzb3VyY2VLZXlzLmxlbmd0aCA9PT0gMSA/IHByb3BlcnRpZXNbcmVzb3VyY2VLZXlzWzBdXSA6IFsnPz8/J107XG5cbiAgICAvLyBGb3Igc29tZSByZXNvdXJjZXMsIHRoaXMgaXMgYSBzaW5nbGV0b24gc3RyaW5nLCBmb3Igc29tZSBpdCdzIGFuIGFycmF5XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc291cmNlcykpIHtcbiAgICAgIHJlc291cmNlcyA9IFtyZXNvdXJjZXNdO1xuICAgIH1cblxuICAgIHJldHVybiBmbGF0TWFwKHJlc291cmNlcywgKHJlc291cmNlOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBkZWZhdWx0UmVzb3VyY2UocmVzb3VyY2UsIHBhcnNlU3RhdGVtZW50cyhwcm9wZXJ0aWVzW3BvbGljeUtleXNbMF1dLlN0YXRlbWVudCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkTWFuYWdlZFBvbGljaWVzKHBvbGljeUFybnM6IGFueSwgbG9naWNhbElkOiBzdHJpbmcpOiBNYW5hZ2VkUG9saWN5QXR0YWNobWVudFtdIHtcbiAgICBpZiAoIXBvbGljeUFybnMpIHsgcmV0dXJuIFtdOyB9XG5cbiAgICBjb25zdCByZXAgPSAnJHsnICsgbG9naWNhbElkICsgJ30nO1xuICAgIHJldHVybiBNYW5hZ2VkUG9saWN5QXR0YWNobWVudC5wYXJzZU1hbmFnZWRQb2xpY2llcyhyZXAsIHJlbmRlckludHJpbnNpY3MocG9saWN5QXJucykpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkTGFtYmRhU3RhdGVtZW50cyhwcm9wZXJ0aWVzPzogUHJvcGVydHlNYXApOiBTdGF0ZW1lbnRbXSB7XG4gICAgaWYgKCFwcm9wZXJ0aWVzKSB7IHJldHVybiBbXTsgfVxuXG4gICAgcmV0dXJuIFtwYXJzZUxhbWJkYVBlcm1pc3Npb24ocmVuZGVySW50cmluc2ljcyhwcm9wZXJ0aWVzKSldO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGFuIHVuZGVmaW5lZCBvciB3aWxkY2FyZGVkIHByaW5jaXBhbCBvbiB0aGVzZSBzdGF0ZW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRQcmluY2lwYWwocHJpbmNpcGFsOiBzdHJpbmcsIHN0YXRlbWVudHM6IFN0YXRlbWVudFtdKSB7XG4gIHN0YXRlbWVudHMuZm9yRWFjaChzID0+IHMucHJpbmNpcGFscy5yZXBsYWNlRW1wdHkocHJpbmNpcGFsKSk7XG4gIHN0YXRlbWVudHMuZm9yRWFjaChzID0+IHMucHJpbmNpcGFscy5yZXBsYWNlU3RhcihwcmluY2lwYWwpKTtcbiAgcmV0dXJuIHN0YXRlbWVudHM7XG59XG5cbi8qKlxuICogU2V0IGFuIHVuZGVmaW5lZCBvciB3aWxkY2FyZGVkIHJlc291cmNlIG9uIHRoZXNlIHN0YXRlbWVudHNcbiAqL1xuZnVuY3Rpb24gZGVmYXVsdFJlc291cmNlKHJlc291cmNlOiBzdHJpbmcsIHN0YXRlbWVudHM6IFN0YXRlbWVudFtdKSB7XG4gIHN0YXRlbWVudHMuZm9yRWFjaChzID0+IHMucmVzb3VyY2VzLnJlcGxhY2VFbXB0eShyZXNvdXJjZSkpO1xuICBzdGF0ZW1lbnRzLmZvckVhY2gocyA9PiBzLnJlc291cmNlcy5yZXBsYWNlU3RhcihyZXNvdXJjZSkpO1xuICByZXR1cm4gc3RhdGVtZW50cztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJYW1DaGFuZ2VzSnNvbiB7XG4gIHN0YXRlbWVudEFkZGl0aW9ucz86IEFycmF5PE1heWJlUGFyc2VkPFN0YXRlbWVudEpzb24+PjtcbiAgc3RhdGVtZW50UmVtb3ZhbHM/OiBBcnJheTxNYXliZVBhcnNlZDxTdGF0ZW1lbnRKc29uPj47XG4gIG1hbmFnZWRQb2xpY3lBZGRpdGlvbnM/OiBBcnJheTxNYXliZVBhcnNlZDxNYW5hZ2VkUG9saWN5SnNvbj4+O1xuICBtYW5hZ2VkUG9saWN5UmVtb3ZhbHM/OiBBcnJheTxNYXliZVBhcnNlZDxNYW5hZ2VkUG9saWN5SnNvbj4+O1xufVxuIl19
@@ -0,0 +1,78 @@
1
+ /**
2
+ * This namespace should be a subset of the L1 CfnPermissionSet, other than
3
+ * capitalization, since the values come from from a parsed CFN template.
4
+ */
5
+ export declare namespace ISsoPermissionSet {
6
+ interface Props {
7
+ readonly name: string | undefined;
8
+ readonly cfnLogicalId: string | undefined;
9
+ readonly ssoInstanceArn: string | undefined;
10
+ readonly ssoPermissionsBoundary: ISsoPermissionSet.PermissionsBoundary | undefined;
11
+ readonly ssoCustomerManagedPolicyReferences: ISsoPermissionSet.CustomerManagedPolicyReference[] | undefined;
12
+ }
13
+ interface PermissionsBoundary {
14
+ readonly CustomerManagedPolicyReference?: CustomerManagedPolicyReference;
15
+ readonly ManagedPolicyArn?: string;
16
+ }
17
+ interface CustomerManagedPolicyReference {
18
+ readonly Name: string | undefined;
19
+ readonly Path: string | undefined;
20
+ }
21
+ }
22
+ export declare class SsoPermissionSet implements ISsoPermissionSet.Props {
23
+ readonly name: string | undefined;
24
+ readonly cfnLogicalId: string | undefined;
25
+ readonly ssoInstanceArn: string | undefined;
26
+ readonly ssoPermissionsBoundary: ISsoPermissionSet.PermissionsBoundary | undefined;
27
+ readonly ssoCustomerManagedPolicyReferences: ISsoPermissionSet.CustomerManagedPolicyReference[] | undefined;
28
+ constructor(props: ISsoPermissionSet.Props);
29
+ equal(other: SsoPermissionSet): boolean;
30
+ }
31
+ export declare namespace ISsoAssignment {
32
+ interface Props {
33
+ readonly ssoInstanceArn: string | undefined;
34
+ readonly cfnLogicalId: string | undefined;
35
+ readonly permissionSetArn: string | undefined;
36
+ readonly principalId: string | undefined;
37
+ readonly principalType: string | undefined;
38
+ readonly targetId: string | undefined;
39
+ readonly targetType: string | undefined;
40
+ }
41
+ }
42
+ export declare class SsoAssignment implements ISsoAssignment.Props {
43
+ readonly cfnLogicalId: string | undefined;
44
+ readonly ssoInstanceArn: string | undefined;
45
+ readonly permissionSetArn: string | undefined;
46
+ readonly principalId: string | undefined;
47
+ readonly principalType: string | undefined;
48
+ readonly targetId: string | undefined;
49
+ readonly targetType: string | undefined;
50
+ constructor(props: ISsoAssignment.Props);
51
+ equal(other: SsoAssignment): boolean;
52
+ }
53
+ /**
54
+ * AWS::SSO::InstanceAccessControlAttributeConfiguration
55
+ */
56
+ export interface ISsoInstanceACAConfigProps {
57
+ ssoInstanceArn: string;
58
+ }
59
+ export declare namespace ISsoInstanceACAConfig {
60
+ type AccessControlAttribute = {
61
+ Key: string | undefined;
62
+ Value: {
63
+ Source: string[];
64
+ } | undefined;
65
+ } | undefined;
66
+ interface Props {
67
+ readonly ssoInstanceArn: string | undefined;
68
+ readonly cfnLogicalId: string | undefined;
69
+ readonly accessControlAttributes?: AccessControlAttribute[] | undefined;
70
+ }
71
+ }
72
+ export declare class SsoInstanceACAConfig implements ISsoInstanceACAConfig.Props {
73
+ readonly cfnLogicalId: string | undefined;
74
+ readonly ssoInstanceArn: string | undefined;
75
+ readonly accessControlAttributes?: ISsoInstanceACAConfig.AccessControlAttribute[] | undefined;
76
+ constructor(props: ISsoInstanceACAConfig.Props);
77
+ equal(other: SsoInstanceACAConfig): boolean;
78
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SsoInstanceACAConfig = exports.SsoAssignment = exports.SsoPermissionSet = void 0;
4
+ // namespace object imports won't work in the bundle for function exports
5
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
6
+ const deepEqual = require('fast-deep-equal');
7
+ class SsoPermissionSet {
8
+ constructor(props) {
9
+ this.cfnLogicalId = props.cfnLogicalId;
10
+ this.name = props.name;
11
+ this.ssoInstanceArn = props.ssoInstanceArn;
12
+ this.ssoPermissionsBoundary = props.ssoPermissionsBoundary;
13
+ this.ssoCustomerManagedPolicyReferences = props.ssoCustomerManagedPolicyReferences;
14
+ }
15
+ equal(other) {
16
+ return deepEqual(this, other);
17
+ }
18
+ }
19
+ exports.SsoPermissionSet = SsoPermissionSet;
20
+ class SsoAssignment {
21
+ constructor(props) {
22
+ this.cfnLogicalId = props.cfnLogicalId;
23
+ this.ssoInstanceArn = props.ssoInstanceArn;
24
+ this.permissionSetArn = props.permissionSetArn;
25
+ this.principalId = props.principalId;
26
+ this.principalType = props.principalType;
27
+ this.targetId = props.targetId;
28
+ this.targetType = props.targetType;
29
+ }
30
+ equal(other) {
31
+ return deepEqual(this, other);
32
+ }
33
+ }
34
+ exports.SsoAssignment = SsoAssignment;
35
+ class SsoInstanceACAConfig {
36
+ constructor(props) {
37
+ this.cfnLogicalId = props.cfnLogicalId;
38
+ this.ssoInstanceArn = props.ssoInstanceArn;
39
+ this.accessControlAttributes = props.accessControlAttributes;
40
+ }
41
+ equal(other) {
42
+ return deepEqual(this, other);
43
+ }
44
+ }
45
+ exports.SsoInstanceACAConfig = SsoInstanceACAConfig;
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWFtLWlkZW50aXR5LWNlbnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImlhbS1pZGVudGl0eS1jZW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXlFO0FBQ3pFLGlFQUFpRTtBQUNqRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQXdCN0MsTUFBYSxnQkFBZ0I7SUFPM0IsWUFBWSxLQUE4QjtRQUN4QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztRQUMzQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDLHNCQUFzQixDQUFDO1FBQzNELElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxLQUFLLENBQUMsa0NBQWtDLENBQUM7SUFDckYsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUF1QjtRQUNsQyxPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBbEJELDRDQWtCQztBQWNELE1BQWEsYUFBYTtJQVN4QixZQUFZLEtBQTJCO1FBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFDM0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFvQjtRQUMvQixPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBdEJELHNDQXNCQztBQXNCRCxNQUFhLG9CQUFvQjtJQUsvQixZQUFZLEtBQWtDO1FBQzVDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFDM0MsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQztJQUMvRCxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQTJCO1FBQ3RDLE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFkRCxvREFjQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIG5hbWVzcGFjZSBvYmplY3QgaW1wb3J0cyB3b24ndCB3b3JrIGluIHRoZSBidW5kbGUgZm9yIGZ1bmN0aW9uIGV4cG9ydHNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBkZWVwRXF1YWwgPSByZXF1aXJlKCdmYXN0LWRlZXAtZXF1YWwnKTtcblxuLyoqXG4gKiBUaGlzIG5hbWVzcGFjZSBzaG91bGQgYmUgYSBzdWJzZXQgb2YgdGhlIEwxIENmblBlcm1pc3Npb25TZXQsIG90aGVyIHRoYW5cbiAqIGNhcGl0YWxpemF0aW9uLCBzaW5jZSB0aGUgdmFsdWVzIGNvbWUgZnJvbSBmcm9tIGEgcGFyc2VkIENGTiB0ZW1wbGF0ZS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBJU3NvUGVybWlzc2lvblNldCB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgUHJvcHMge1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSBjZm5Mb2dpY2FsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSBzc29JbnN0YW5jZUFybjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHJlYWRvbmx5IHNzb1Blcm1pc3Npb25zQm91bmRhcnk6IElTc29QZXJtaXNzaW9uU2V0LlBlcm1pc3Npb25zQm91bmRhcnkgfCB1bmRlZmluZWQ7XG4gICAgcmVhZG9ubHkgc3NvQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlczogSVNzb1Blcm1pc3Npb25TZXQuQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlW10gfCB1bmRlZmluZWQ7XG4gIH1cbiAgZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uc0JvdW5kYXJ5IHtcbiAgICByZWFkb25seSBDdXN0b21lck1hbmFnZWRQb2xpY3lSZWZlcmVuY2U/OiBDdXN0b21lck1hbmFnZWRQb2xpY3lSZWZlcmVuY2U7XG4gICAgcmVhZG9ubHkgTWFuYWdlZFBvbGljeUFybj86IHN0cmluZztcbiAgfVxuICBleHBvcnQgaW50ZXJmYWNlIEN1c3RvbWVyTWFuYWdlZFBvbGljeVJlZmVyZW5jZSB7XG4gICAgcmVhZG9ubHkgTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHJlYWRvbmx5IFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3NvUGVybWlzc2lvblNldCBpbXBsZW1lbnRzIElTc29QZXJtaXNzaW9uU2V0LlByb3BzIHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHJlYWRvbmx5IGNmbkxvZ2ljYWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgc3NvSW5zdGFuY2VBcm46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHJlYWRvbmx5IHNzb1Blcm1pc3Npb25zQm91bmRhcnk6IElTc29QZXJtaXNzaW9uU2V0LlBlcm1pc3Npb25zQm91bmRhcnkgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSBzc29DdXN0b21lck1hbmFnZWRQb2xpY3lSZWZlcmVuY2VzOiBJU3NvUGVybWlzc2lvblNldC5DdXN0b21lck1hbmFnZWRQb2xpY3lSZWZlcmVuY2VbXSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSVNzb1Blcm1pc3Npb25TZXQuUHJvcHMpIHtcbiAgICB0aGlzLmNmbkxvZ2ljYWxJZCA9IHByb3BzLmNmbkxvZ2ljYWxJZDtcbiAgICB0aGlzLm5hbWUgPSBwcm9wcy5uYW1lO1xuICAgIHRoaXMuc3NvSW5zdGFuY2VBcm4gPSBwcm9wcy5zc29JbnN0YW5jZUFybjtcbiAgICB0aGlzLnNzb1Blcm1pc3Npb25zQm91bmRhcnkgPSBwcm9wcy5zc29QZXJtaXNzaW9uc0JvdW5kYXJ5O1xuICAgIHRoaXMuc3NvQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlcyA9IHByb3BzLnNzb0N1c3RvbWVyTWFuYWdlZFBvbGljeVJlZmVyZW5jZXM7XG4gIH1cblxuICBwdWJsaWMgZXF1YWwob3RoZXI6IFNzb1Blcm1pc3Npb25TZXQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZGVlcEVxdWFsKHRoaXMsIG90aGVyKTtcbiAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIElTc29Bc3NpZ25tZW50IHtcbiAgZXhwb3J0IGludGVyZmFjZSBQcm9wcyB7XG4gICAgcmVhZG9ubHkgc3NvSW5zdGFuY2VBcm46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSBjZm5Mb2dpY2FsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSBwZXJtaXNzaW9uU2V0QXJuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcmVhZG9ubHkgcHJpbmNpcGFsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSBwcmluY2lwYWxUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcmVhZG9ubHkgdGFyZ2V0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSB0YXJnZXRUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNzb0Fzc2lnbm1lbnQgaW1wbGVtZW50cyBJU3NvQXNzaWdubWVudC5Qcm9wcyB7XG4gIHB1YmxpYyByZWFkb25seSBjZm5Mb2dpY2FsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHJlYWRvbmx5IHNzb0luc3RhbmNlQXJuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uU2V0QXJuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSBwcmluY2lwYWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpbmNpcGFsVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldFR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSVNzb0Fzc2lnbm1lbnQuUHJvcHMpIHtcbiAgICB0aGlzLmNmbkxvZ2ljYWxJZCA9IHByb3BzLmNmbkxvZ2ljYWxJZDtcbiAgICB0aGlzLnNzb0luc3RhbmNlQXJuID0gcHJvcHMuc3NvSW5zdGFuY2VBcm47XG4gICAgdGhpcy5wZXJtaXNzaW9uU2V0QXJuID0gcHJvcHMucGVybWlzc2lvblNldEFybjtcbiAgICB0aGlzLnByaW5jaXBhbElkID0gcHJvcHMucHJpbmNpcGFsSWQ7XG4gICAgdGhpcy5wcmluY2lwYWxUeXBlID0gcHJvcHMucHJpbmNpcGFsVHlwZTtcbiAgICB0aGlzLnRhcmdldElkID0gcHJvcHMudGFyZ2V0SWQ7XG4gICAgdGhpcy50YXJnZXRUeXBlID0gcHJvcHMudGFyZ2V0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBlcXVhbChvdGhlcjogU3NvQXNzaWdubWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkZWVwRXF1YWwodGhpcywgb3RoZXIpO1xuICB9XG59XG5cbi8qKlxuICogQVdTOjpTU086Okluc3RhbmNlQWNjZXNzQ29udHJvbEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3NvSW5zdGFuY2VBQ0FDb25maWdQcm9wcyB7XG4gIHNzb0luc3RhbmNlQXJuOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgSVNzb0luc3RhbmNlQUNBQ29uZmlnIHtcbiAgZXhwb3J0IHR5cGUgQWNjZXNzQ29udHJvbEF0dHJpYnV0ZSA9IHtcbiAgICBLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBWYWx1ZTogeyBTb3VyY2U6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ7XG4gIH0gfCB1bmRlZmluZWQ7XG5cbiAgZXhwb3J0IGludGVyZmFjZSBQcm9wcyB7XG4gICAgcmVhZG9ubHkgc3NvSW5zdGFuY2VBcm46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSBjZm5Mb2dpY2FsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSBhY2Nlc3NDb250cm9sQXR0cmlidXRlcz86IEFjY2Vzc0NvbnRyb2xBdHRyaWJ1dGVbXSB8IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3NvSW5zdGFuY2VBQ0FDb25maWcgaW1wbGVtZW50cyBJU3NvSW5zdGFuY2VBQ0FDb25maWcuUHJvcHMge1xuICBwdWJsaWMgcmVhZG9ubHkgY2ZuTG9naWNhbElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSBzc29JbnN0YW5jZUFybjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgYWNjZXNzQ29udHJvbEF0dHJpYnV0ZXM/OiBJU3NvSW5zdGFuY2VBQ0FDb25maWcuQWNjZXNzQ29udHJvbEF0dHJpYnV0ZVtdIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBJU3NvSW5zdGFuY2VBQ0FDb25maWcuUHJvcHMpIHtcbiAgICB0aGlzLmNmbkxvZ2ljYWxJZCA9IHByb3BzLmNmbkxvZ2ljYWxJZDtcbiAgICB0aGlzLnNzb0luc3RhbmNlQXJuID0gcHJvcHMuc3NvSW5zdGFuY2VBcm47XG4gICAgdGhpcy5hY2Nlc3NDb250cm9sQXR0cmlidXRlcyA9IHByb3BzLmFjY2Vzc0NvbnRyb2xBdHRyaWJ1dGVzO1xuICB9XG5cbiAgcHVibGljIGVxdWFsKG90aGVyOiBTc29JbnN0YW5jZUFDQUNvbmZpZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkZWVwRXF1YWwodGhpcywgb3RoZXIpO1xuICB9XG59XG4iXX0=