cdktn 0.26.0-pre.2 → 0.26.0-pre.20

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 (61) hide show
  1. package/.jsii +11 -11
  2. package/lib/annotations.js +1 -1
  3. package/lib/app.js +1 -1
  4. package/lib/aspect.js +1 -1
  5. package/lib/asset-hash.js +1 -1
  6. package/lib/asset-staging.js +1 -1
  7. package/lib/assets.js +4 -4
  8. package/lib/backends/azurerm-backend.js +2 -2
  9. package/lib/backends/cloud-backend.js +4 -4
  10. package/lib/backends/consul-backend.js +2 -2
  11. package/lib/backends/cos-backend.js +2 -2
  12. package/lib/backends/gcs-backend.js +2 -2
  13. package/lib/backends/http-backend.js +2 -2
  14. package/lib/backends/local-backend.js +2 -2
  15. package/lib/backends/oss-backend.js +2 -2
  16. package/lib/backends/pg-backend.js +2 -2
  17. package/lib/backends/remote-backend.js +4 -4
  18. package/lib/backends/s3-backend.js +2 -2
  19. package/lib/backends/swift-backend.js +2 -2
  20. package/lib/complex-computed-list.js +26 -26
  21. package/lib/functions/provider-function.js +1 -1
  22. package/lib/functions/terraform-functions.generated.js +1 -1
  23. package/lib/hcl/quoted-string-key.d.ts +25 -0
  24. package/lib/hcl/quoted-string-key.js +42 -0
  25. package/lib/hcl/render.js +12 -2
  26. package/lib/ignore-strategy.js +1 -1
  27. package/lib/importable-resource.js +1 -1
  28. package/lib/manifest.js +1 -1
  29. package/lib/resource.js +1 -1
  30. package/lib/terraform-asset.js +1 -1
  31. package/lib/terraform-backend.js +1 -1
  32. package/lib/terraform-count.js +1 -1
  33. package/lib/terraform-data-resource.js +1 -1
  34. package/lib/terraform-data-source.js +1 -1
  35. package/lib/terraform-element.js +1 -1
  36. package/lib/terraform-ephemeral-resource.js +1 -1
  37. package/lib/terraform-functions.js +6 -4
  38. package/lib/terraform-hcl-module.js +1 -1
  39. package/lib/terraform-iterator.js +5 -5
  40. package/lib/terraform-local.js +1 -1
  41. package/lib/terraform-module.js +1 -1
  42. package/lib/terraform-operators.js +1 -1
  43. package/lib/terraform-output.d.ts +1 -0
  44. package/lib/terraform-output.js +19 -2
  45. package/lib/terraform-provider.js +1 -1
  46. package/lib/terraform-provisioner.js +1 -1
  47. package/lib/terraform-remote-state.js +1 -1
  48. package/lib/terraform-resource-targets.js +1 -1
  49. package/lib/terraform-resource.js +1 -1
  50. package/lib/terraform-stack.js +1 -1
  51. package/lib/terraform-variable.js +2 -2
  52. package/lib/testing/index.js +1 -1
  53. package/lib/testing/matchers.js +1 -1
  54. package/lib/tfExpression.d.ts +2 -0
  55. package/lib/tfExpression.js +64 -21
  56. package/lib/tokens/lazy.js +2 -2
  57. package/lib/tokens/resolvable.js +2 -2
  58. package/lib/tokens/string-fragments.js +1 -1
  59. package/lib/tokens/token.js +2 -2
  60. package/lib/upgrade-id-aspect.js +1 -1
  61. package/package.json +1 -1
@@ -76,7 +76,7 @@ class ComplexComputedAttribute extends ComplexResolvable {
76
76
  class StringMap extends ComplexResolvable {
77
77
  terraformResource;
78
78
  terraformAttribute;
79
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.StringMap", version: "0.26.0-pre.2" };
79
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.StringMap", version: "0.26.0-pre.20" };
80
80
  constructor(terraformResource, terraformAttribute) {
81
81
  super(terraformResource, terraformAttribute);
82
82
  this.terraformResource = terraformResource;
@@ -94,7 +94,7 @@ exports.StringMap = StringMap;
94
94
  class NumberMap extends ComplexResolvable {
95
95
  terraformResource;
96
96
  terraformAttribute;
97
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.NumberMap", version: "0.26.0-pre.2" };
97
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.NumberMap", version: "0.26.0-pre.20" };
98
98
  constructor(terraformResource, terraformAttribute) {
99
99
  super(terraformResource, terraformAttribute);
100
100
  this.terraformResource = terraformResource;
@@ -112,7 +112,7 @@ exports.NumberMap = NumberMap;
112
112
  class BooleanMap extends ComplexResolvable {
113
113
  terraformResource;
114
114
  terraformAttribute;
115
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BooleanMap", version: "0.26.0-pre.2" };
115
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BooleanMap", version: "0.26.0-pre.20" };
116
116
  constructor(terraformResource, terraformAttribute) {
117
117
  super(terraformResource, terraformAttribute);
118
118
  this.terraformResource = terraformResource;
@@ -130,7 +130,7 @@ exports.BooleanMap = BooleanMap;
130
130
  class AnyMap extends ComplexResolvable {
131
131
  terraformResource;
132
132
  terraformAttribute;
133
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AnyMap", version: "0.26.0-pre.2" };
133
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AnyMap", version: "0.26.0-pre.20" };
134
134
  constructor(terraformResource, terraformAttribute) {
135
135
  super(terraformResource, terraformAttribute);
136
136
  this.terraformResource = terraformResource;
@@ -148,7 +148,7 @@ exports.AnyMap = AnyMap;
148
148
  class StringMapMap extends ComplexResolvable {
149
149
  terraformResource;
150
150
  terraformAttribute;
151
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.StringMapMap", version: "0.26.0-pre.2" };
151
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.StringMapMap", version: "0.26.0-pre.20" };
152
152
  constructor(terraformResource, terraformAttribute) {
153
153
  super(terraformResource, terraformAttribute);
154
154
  this.terraformResource = terraformResource;
@@ -166,7 +166,7 @@ exports.StringMapMap = StringMapMap;
166
166
  class NumberMapMap extends ComplexResolvable {
167
167
  terraformResource;
168
168
  terraformAttribute;
169
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.NumberMapMap", version: "0.26.0-pre.2" };
169
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.NumberMapMap", version: "0.26.0-pre.20" };
170
170
  constructor(terraformResource, terraformAttribute) {
171
171
  super(terraformResource, terraformAttribute);
172
172
  this.terraformResource = terraformResource;
@@ -184,7 +184,7 @@ exports.NumberMapMap = NumberMapMap;
184
184
  class BooleanMapMap extends ComplexResolvable {
185
185
  terraformResource;
186
186
  terraformAttribute;
187
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BooleanMapMap", version: "0.26.0-pre.2" };
187
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BooleanMapMap", version: "0.26.0-pre.20" };
188
188
  constructor(terraformResource, terraformAttribute) {
189
189
  super(terraformResource, terraformAttribute);
190
190
  this.terraformResource = terraformResource;
@@ -202,7 +202,7 @@ exports.BooleanMapMap = BooleanMapMap;
202
202
  class AnyMapMap extends ComplexResolvable {
203
203
  terraformResource;
204
204
  terraformAttribute;
205
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AnyMapMap", version: "0.26.0-pre.2" };
205
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AnyMapMap", version: "0.26.0-pre.20" };
206
206
  constructor(terraformResource, terraformAttribute) {
207
207
  super(terraformResource, terraformAttribute);
208
208
  this.terraformResource = terraformResource;
@@ -225,7 +225,7 @@ class ComplexComputedList extends ComplexComputedAttribute {
225
225
  terraformAttribute;
226
226
  complexComputedListIndex;
227
227
  wrapsSet;
228
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ComplexComputedList", version: "0.26.0-pre.2" };
228
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ComplexComputedList", version: "0.26.0-pre.20" };
229
229
  constructor(terraformResource, terraformAttribute, complexComputedListIndex, wrapsSet) {
230
230
  super(terraformResource, terraformAttribute);
231
231
  this.terraformResource = terraformResource;
@@ -253,7 +253,7 @@ class ComplexList extends ComplexResolvable {
253
253
  terraformResource;
254
254
  terraformAttribute;
255
255
  wrapsSet;
256
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ComplexList", version: "0.26.0-pre.2" };
256
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ComplexList", version: "0.26.0-pre.20" };
257
257
  constructor(terraformResource, terraformAttribute, wrapsSet) {
258
258
  super(terraformResource, terraformAttribute);
259
259
  this.terraformResource = terraformResource;
@@ -284,7 +284,7 @@ class BooleanList extends ComplexList {
284
284
  terraformResource;
285
285
  terraformAttribute;
286
286
  wrapsSet;
287
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BooleanList", version: "0.26.0-pre.2" };
287
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BooleanList", version: "0.26.0-pre.20" };
288
288
  constructor(terraformResource, terraformAttribute, wrapsSet) {
289
289
  super(terraformResource, terraformAttribute, wrapsSet);
290
290
  this.terraformResource = terraformResource;
@@ -301,7 +301,7 @@ class StringListList extends ComplexList {
301
301
  terraformResource;
302
302
  terraformAttribute;
303
303
  wrapsSet;
304
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.StringListList", version: "0.26.0-pre.2" };
304
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.StringListList", version: "0.26.0-pre.20" };
305
305
  constructor(terraformResource, terraformAttribute, wrapsSet) {
306
306
  super(terraformResource, terraformAttribute, wrapsSet);
307
307
  this.terraformResource = terraformResource;
@@ -318,7 +318,7 @@ class NumberListList extends ComplexList {
318
318
  terraformResource;
319
319
  terraformAttribute;
320
320
  wrapsSet;
321
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.NumberListList", version: "0.26.0-pre.2" };
321
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.NumberListList", version: "0.26.0-pre.20" };
322
322
  constructor(terraformResource, terraformAttribute, wrapsSet) {
323
323
  super(terraformResource, terraformAttribute, wrapsSet);
324
324
  this.terraformResource = terraformResource;
@@ -335,7 +335,7 @@ class BooleanListList extends ComplexList {
335
335
  terraformResource;
336
336
  terraformAttribute;
337
337
  wrapsSet;
338
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BooleanListList", version: "0.26.0-pre.2" };
338
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BooleanListList", version: "0.26.0-pre.20" };
339
339
  constructor(terraformResource, terraformAttribute, wrapsSet) {
340
340
  super(terraformResource, terraformAttribute, wrapsSet);
341
341
  this.terraformResource = terraformResource;
@@ -353,7 +353,7 @@ class AnyListList extends ComplexList {
353
353
  terraformResource;
354
354
  terraformAttribute;
355
355
  wrapsSet;
356
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AnyListList", version: "0.26.0-pre.2" };
356
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AnyListList", version: "0.26.0-pre.20" };
357
357
  constructor(terraformResource, terraformAttribute, wrapsSet) {
358
358
  super(terraformResource, terraformAttribute, wrapsSet);
359
359
  this.terraformResource = terraformResource;
@@ -370,7 +370,7 @@ exports.AnyListList = AnyListList;
370
370
  class ComplexMap extends ComplexResolvable {
371
371
  terraformResource;
372
372
  terraformAttribute;
373
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ComplexMap", version: "0.26.0-pre.2" };
373
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ComplexMap", version: "0.26.0-pre.20" };
374
374
  constructor(terraformResource, terraformAttribute) {
375
375
  super(terraformResource, terraformAttribute);
376
376
  this.terraformResource = terraformResource;
@@ -390,7 +390,7 @@ class ComplexObject extends ComplexComputedAttribute {
390
390
  terraformAttribute;
391
391
  complexObjectIsFromSet;
392
392
  complexObjectIndex;
393
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ComplexObject", version: "0.26.0-pre.2" };
393
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ComplexObject", version: "0.26.0-pre.20" };
394
394
  /**
395
395
  * @param terraformResource
396
396
  * @param terraformAttribute
@@ -431,7 +431,7 @@ class MapList extends ComplexResolvable {
431
431
  terraformResource;
432
432
  terraformAttribute;
433
433
  wrapsSet;
434
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.MapList", version: "0.26.0-pre.2" };
434
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.MapList", version: "0.26.0-pre.20" };
435
435
  constructor(terraformResource, terraformAttribute, wrapsSet) {
436
436
  super(terraformResource, terraformAttribute);
437
437
  this.terraformResource = terraformResource;
@@ -462,7 +462,7 @@ class StringMapList extends MapList {
462
462
  terraformResource;
463
463
  terraformAttribute;
464
464
  wrapsSet;
465
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.StringMapList", version: "0.26.0-pre.2" };
465
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.StringMapList", version: "0.26.0-pre.20" };
466
466
  constructor(terraformResource, terraformAttribute, wrapsSet) {
467
467
  super(terraformResource, terraformAttribute, wrapsSet);
468
468
  this.terraformResource = terraformResource;
@@ -479,7 +479,7 @@ class NumberMapList extends MapList {
479
479
  terraformResource;
480
480
  terraformAttribute;
481
481
  wrapsSet;
482
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.NumberMapList", version: "0.26.0-pre.2" };
482
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.NumberMapList", version: "0.26.0-pre.20" };
483
483
  constructor(terraformResource, terraformAttribute, wrapsSet) {
484
484
  super(terraformResource, terraformAttribute, wrapsSet);
485
485
  this.terraformResource = terraformResource;
@@ -496,7 +496,7 @@ class BooleanMapList extends MapList {
496
496
  terraformResource;
497
497
  terraformAttribute;
498
498
  wrapsSet;
499
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BooleanMapList", version: "0.26.0-pre.2" };
499
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BooleanMapList", version: "0.26.0-pre.20" };
500
500
  constructor(terraformResource, terraformAttribute, wrapsSet) {
501
501
  super(terraformResource, terraformAttribute, wrapsSet);
502
502
  this.terraformResource = terraformResource;
@@ -513,7 +513,7 @@ class AnyMapList extends MapList {
513
513
  terraformResource;
514
514
  terraformAttribute;
515
515
  wrapsSet;
516
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AnyMapList", version: "0.26.0-pre.2" };
516
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AnyMapList", version: "0.26.0-pre.20" };
517
517
  constructor(terraformResource, terraformAttribute, wrapsSet) {
518
518
  super(terraformResource, terraformAttribute, wrapsSet);
519
519
  this.terraformResource = terraformResource;
@@ -529,7 +529,7 @@ exports.AnyMapList = AnyMapList;
529
529
  class StringListMap extends ComplexMap {
530
530
  terraformResource;
531
531
  terraformAttribute;
532
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.StringListMap", version: "0.26.0-pre.2" };
532
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.StringListMap", version: "0.26.0-pre.20" };
533
533
  constructor(terraformResource, terraformAttribute) {
534
534
  super(terraformResource, terraformAttribute);
535
535
  this.terraformResource = terraformResource;
@@ -544,7 +544,7 @@ exports.StringListMap = StringListMap;
544
544
  class NumberListMap extends ComplexMap {
545
545
  terraformResource;
546
546
  terraformAttribute;
547
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.NumberListMap", version: "0.26.0-pre.2" };
547
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.NumberListMap", version: "0.26.0-pre.20" };
548
548
  constructor(terraformResource, terraformAttribute) {
549
549
  super(terraformResource, terraformAttribute);
550
550
  this.terraformResource = terraformResource;
@@ -559,7 +559,7 @@ exports.NumberListMap = NumberListMap;
559
559
  class BooleanListMap extends ComplexMap {
560
560
  terraformResource;
561
561
  terraformAttribute;
562
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BooleanListMap", version: "0.26.0-pre.2" };
562
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BooleanListMap", version: "0.26.0-pre.20" };
563
563
  constructor(terraformResource, terraformAttribute) {
564
564
  super(terraformResource, terraformAttribute);
565
565
  this.terraformResource = terraformResource;
@@ -575,7 +575,7 @@ exports.BooleanListMap = BooleanListMap;
575
575
  class AnyListMap extends ComplexMap {
576
576
  terraformResource;
577
577
  terraformAttribute;
578
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AnyListMap", version: "0.26.0-pre.2" };
578
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AnyListMap", version: "0.26.0-pre.20" };
579
579
  constructor(terraformResource, terraformAttribute) {
580
580
  super(terraformResource, terraformAttribute);
581
581
  this.terraformResource = terraformResource;
@@ -10,7 +10,7 @@ const helpers_1 = require("./helpers");
10
10
  * through which every provider-defined function call flows.
11
11
  */
12
12
  class TerraformProviderFunction {
13
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.TerraformProviderFunction", version: "0.26.0-pre.2" };
13
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.TerraformProviderFunction", version: "0.26.0-pre.20" };
14
14
  /**
15
15
  * Invokes a provider-defined function (Terraform's
16
16
  * `provider::<providerLocalName>::<functionName>(...)` syntax).
@@ -11,7 +11,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
11
11
  const helpers_1 = require("./helpers");
12
12
  // eslint-disable-next-line jsdoc/require-jsdoc
13
13
  class FnGenerated {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.FnGenerated", version: "0.26.0-pre.2" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.FnGenerated", version: "0.26.0-pre.20" };
15
15
  /**
16
16
  * {@link https://developer.hashicorp.com/terraform/language/functions/abs abs} returns the absolute value of the given number. In other words, if the number is zero or positive then it is returned as-is, but if it is negative then it is multiplied by -1 to make it positive before returning it.
17
17
  * @param {number} num
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Copyright (c) HashiCorp, Inc.
3
+ * SPDX-License-Identifier: MPL-2.0
4
+ */
5
+ /**
6
+ * Serializes an object key fragment as the inner content of a Terraform
7
+ * quoted-string literal, without the surrounding quotes.
8
+ *
9
+ * `JSON.stringify` covers quotes, backslashes and most control characters.
10
+ * Terraform quoted strings reject the `\b` and `\f` escapes that JSON emits, so
11
+ * those use four-digit Unicode escapes. `$${` and `%%{` are the Terraform
12
+ * escapes for sequences that would otherwise start a template interpolation or
13
+ * directive.
14
+ *
15
+ * Set `keepTemplates` when the fragment may hold a resolved token, which
16
+ * renders as a `${...}` reference that must stay an interpolation.
17
+ */
18
+ export declare function quotedStringKeyFragment(fragment: string, keepTemplates?: boolean): string;
19
+ /**
20
+ * Serializes an object key as a Terraform quoted-string literal.
21
+ *
22
+ * Set `keepTemplates` when the key may hold a resolved token, which renders as
23
+ * a `${...}` reference that must stay an interpolation.
24
+ */
25
+ export declare function quotedStringKey(key: string, keepTemplates?: boolean): string;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) HashiCorp, Inc.
4
+ * SPDX-License-Identifier: MPL-2.0
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.quotedStringKeyFragment = quotedStringKeyFragment;
8
+ exports.quotedStringKey = quotedStringKey;
9
+ /**
10
+ * Serializes an object key fragment as the inner content of a Terraform
11
+ * quoted-string literal, without the surrounding quotes.
12
+ *
13
+ * `JSON.stringify` covers quotes, backslashes and most control characters.
14
+ * Terraform quoted strings reject the `\b` and `\f` escapes that JSON emits, so
15
+ * those use four-digit Unicode escapes. `$${` and `%%{` are the Terraform
16
+ * escapes for sequences that would otherwise start a template interpolation or
17
+ * directive.
18
+ *
19
+ * Set `keepTemplates` when the fragment may hold a resolved token, which
20
+ * renders as a `${...}` reference that must stay an interpolation.
21
+ */
22
+ function quotedStringKeyFragment(fragment, keepTemplates = false) {
23
+ // Replacer functions, not replacement strings: in a replacement string `$$`
24
+ // is itself an escape for a literal `$` and would undo the escape below.
25
+ const escaped = JSON.stringify(fragment)
26
+ .slice(1, -1)
27
+ .replace(/\\(\\|b|f)/g, (match, selector) => selector === "b" ? "\\u0008" : selector === "f" ? "\\u000c" : match);
28
+ if (keepTemplates) {
29
+ return escaped;
30
+ }
31
+ return escaped.replace(/\$\{/g, () => "$${").replace(/%\{/g, () => "%%{");
32
+ }
33
+ /**
34
+ * Serializes an object key as a Terraform quoted-string literal.
35
+ *
36
+ * Set `keepTemplates` when the key may hold a resolved token, which renders as
37
+ * a `${...}` reference that must stay an interpolation.
38
+ */
39
+ function quotedStringKey(key, keepTemplates = false) {
40
+ return `"${quotedStringKeyFragment(key, keepTemplates)}"`;
41
+ }
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGVkLXN0cmluZy1rZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGNsL3F1b3RlZC1zdHJpbmcta2V5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7O0FBZUgsMERBZUM7QUFRRCwwQ0FFQztBQXRDRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQix1QkFBdUIsQ0FDckMsUUFBZ0IsRUFDaEIsYUFBYSxHQUFHLEtBQUs7SUFFckIsNEVBQTRFO0lBQzVFLHlFQUF5RTtJQUN6RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztTQUNyQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ1osT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFnQixFQUFFLEVBQUUsQ0FDbEQsUUFBUSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FDcEUsQ0FBQztJQUNKLElBQUksYUFBYSxFQUFFLENBQUM7UUFDbEIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixlQUFlLENBQUMsR0FBVyxFQUFFLGFBQWEsR0FBRyxLQUFLO0lBQ2hFLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQztBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbiAqL1xuXG4vKipcbiAqIFNlcmlhbGl6ZXMgYW4gb2JqZWN0IGtleSBmcmFnbWVudCBhcyB0aGUgaW5uZXIgY29udGVudCBvZiBhIFRlcnJhZm9ybVxuICogcXVvdGVkLXN0cmluZyBsaXRlcmFsLCB3aXRob3V0IHRoZSBzdXJyb3VuZGluZyBxdW90ZXMuXG4gKlxuICogYEpTT04uc3RyaW5naWZ5YCBjb3ZlcnMgcXVvdGVzLCBiYWNrc2xhc2hlcyBhbmQgbW9zdCBjb250cm9sIGNoYXJhY3RlcnMuXG4gKiBUZXJyYWZvcm0gcXVvdGVkIHN0cmluZ3MgcmVqZWN0IHRoZSBgXFxiYCBhbmQgYFxcZmAgZXNjYXBlcyB0aGF0IEpTT04gZW1pdHMsIHNvXG4gKiB0aG9zZSB1c2UgZm91ci1kaWdpdCBVbmljb2RlIGVzY2FwZXMuIGAkJHtgIGFuZCBgJSV7YCBhcmUgdGhlIFRlcnJhZm9ybVxuICogZXNjYXBlcyBmb3Igc2VxdWVuY2VzIHRoYXQgd291bGQgb3RoZXJ3aXNlIHN0YXJ0IGEgdGVtcGxhdGUgaW50ZXJwb2xhdGlvbiBvclxuICogZGlyZWN0aXZlLlxuICpcbiAqIFNldCBga2VlcFRlbXBsYXRlc2Agd2hlbiB0aGUgZnJhZ21lbnQgbWF5IGhvbGQgYSByZXNvbHZlZCB0b2tlbiwgd2hpY2hcbiAqIHJlbmRlcnMgYXMgYSBgJHsuLi59YCByZWZlcmVuY2UgdGhhdCBtdXN0IHN0YXkgYW4gaW50ZXJwb2xhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlZFN0cmluZ0tleUZyYWdtZW50KFxuICBmcmFnbWVudDogc3RyaW5nLFxuICBrZWVwVGVtcGxhdGVzID0gZmFsc2UsXG4pOiBzdHJpbmcge1xuICAvLyBSZXBsYWNlciBmdW5jdGlvbnMsIG5vdCByZXBsYWNlbWVudCBzdHJpbmdzOiBpbiBhIHJlcGxhY2VtZW50IHN0cmluZyBgJCRgXG4gIC8vIGlzIGl0c2VsZiBhbiBlc2NhcGUgZm9yIGEgbGl0ZXJhbCBgJGAgYW5kIHdvdWxkIHVuZG8gdGhlIGVzY2FwZSBiZWxvdy5cbiAgY29uc3QgZXNjYXBlZCA9IEpTT04uc3RyaW5naWZ5KGZyYWdtZW50KVxuICAgIC5zbGljZSgxLCAtMSlcbiAgICAucmVwbGFjZSgvXFxcXChcXFxcfGJ8ZikvZywgKG1hdGNoLCBzZWxlY3Rvcjogc3RyaW5nKSA9PlxuICAgICAgc2VsZWN0b3IgPT09IFwiYlwiID8gXCJcXFxcdTAwMDhcIiA6IHNlbGVjdG9yID09PSBcImZcIiA/IFwiXFxcXHUwMDBjXCIgOiBtYXRjaCxcbiAgICApO1xuICBpZiAoa2VlcFRlbXBsYXRlcykge1xuICAgIHJldHVybiBlc2NhcGVkO1xuICB9XG4gIHJldHVybiBlc2NhcGVkLnJlcGxhY2UoL1xcJFxcey9nLCAoKSA9PiBcIiQke1wiKS5yZXBsYWNlKC8lXFx7L2csICgpID0+IFwiJSV7XCIpO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgYW4gb2JqZWN0IGtleSBhcyBhIFRlcnJhZm9ybSBxdW90ZWQtc3RyaW5nIGxpdGVyYWwuXG4gKlxuICogU2V0IGBrZWVwVGVtcGxhdGVzYCB3aGVuIHRoZSBrZXkgbWF5IGhvbGQgYSByZXNvbHZlZCB0b2tlbiwgd2hpY2ggcmVuZGVycyBhc1xuICogYSBgJHsuLi59YCByZWZlcmVuY2UgdGhhdCBtdXN0IHN0YXkgYW4gaW50ZXJwb2xhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlZFN0cmluZ0tleShrZXk6IHN0cmluZywga2VlcFRlbXBsYXRlcyA9IGZhbHNlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcIiR7cXVvdGVkU3RyaW5nS2V5RnJhZ21lbnQoa2V5LCBrZWVwVGVtcGxhdGVzKX1cImA7XG59XG4iXX0=
package/lib/hcl/render.js CHANGED
@@ -25,6 +25,7 @@ exports.renderAttributes = renderAttributes;
25
25
  * Copyright (c) HashiCorp, Inc.
26
26
  * SPDX-License-Identifier: MPL-2.0
27
27
  */
28
+ const quoted_string_key_1 = require("./quoted-string-key");
28
29
  const token_1 = require("../tokens/token");
29
30
  /**
30
31
  *
@@ -40,7 +41,16 @@ function escapeQuotes(str) {
40
41
  *
41
42
  */
42
43
  function wrapIdentifierInQuotesIfNeeded(key) {
43
- return /(^\d)|[^A-Za-z0-9_-]/.test(key) ? `"${key}"` : key;
44
+ if (!/(^\d)|[^A-Za-z0-9_-]/.test(key)) {
45
+ return key;
46
+ }
47
+ // A key containing `${` may be a resolved token reference rather than a
48
+ // literal string, so its `${...}` body is expression syntax, not text to
49
+ // escape. Leave it on the old (unescaped) path to avoid corrupting it.
50
+ if (key.includes("${")) {
51
+ return `"${key}"`;
52
+ }
53
+ return (0, quoted_string_key_1.quotedStringKey)(key, true);
44
54
  }
45
55
  /**
46
56
  *
@@ -697,4 +707,4 @@ ${name} = ${renderFuzzyJsonExpression(value)}
697
707
  .filter((v) => v !== undefined)
698
708
  .join("\n");
699
709
  }
700
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hjbC9yZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFvREEsNENBNkNDO0FBS0QsZ0NBZ0RDO0FBS0QsMENBU0M7QUFLRCw4QkFjQztBQUtELHdDQXNCQztBQUtELHdDQXFDQztBQUtELDRDQTJCQztBQUtELDBDQTJCQztBQUtELHdEQXlCQztBQUtELGtEQXFCQztBQUtELHdDQW1CQztBQUtELG9DQWdCQztBQUtELG9DQU9DO0FBS0Qsb0NBb0JDO0FBS0Qsd0NBT0M7QUFLRCxrQ0FRQztBQUtELG9DQVFDO0FBS0QsMENBMEJDO0FBS0Qsa0NBSUM7QUF5RUQsd0RBV0M7QUE0Q0QsNENBOEhDO0FBbHhCRDs7O0dBR0c7QUFDSCwyQ0FBK0M7QUFFL0M7O0dBRUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxHQUFXO0lBQy9CLG1EQUFtRDtJQUNuRCxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUN0QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsOEJBQThCLENBQUMsR0FBVztJQUNqRCxPQUFPLHNCQUFzQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzdELENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsWUFBWSxDQUFDLEdBQVc7SUFDL0IsSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDZixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxJQUFJ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SSxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDekIsT0FBTyxHQUFHLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBRUQsT0FBTyxHQUFHLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQztJQUM5QixDQUFDLENBQUM7U0FDRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUM7U0FDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuICovXG5pbXBvcnQgeyBUb2tlbml6YXRpb24gfSBmcm9tIFwiLi4vdG9rZW5zL3Rva2VuXCI7XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gZXNjYXBlUXVvdGVzKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gRG9uJ3QgYXR0ZW1wdCB0byBlc2NhcGUgaWYgd2UgaGF2ZSBhbiBleHByZXNzaW9uXG4gIGlmIChzdHIubWF0Y2goL1xcJFxcey8pKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICByZXR1cm4gc3RyLnJlcGxhY2UoLyg/PCFcXFxcKVwiL2csICdcXFxcXCInKTtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiB3cmFwSWRlbnRpZmllckluUXVvdGVzSWZOZWVkZWQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gLyheXFxkKXxbXkEtWmEtejAtOV8tXS8udGVzdChrZXkpID8gYFwiJHtrZXl9XCJgIDoga2V5O1xufVxuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIHJlbmRlclN0cmluZyhzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChzdHIgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gYFwiXCJgO1xuICB9XG5cbiAgaWYgKCFzdHIpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzdHIgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIlVuYWJsZSB0byBwcm9jZXNzIGF0dHJpYnV0ZSB0aGF0IHNob3VsZCBoYXZlIGJlZW4gYSBzdHJpbmcsIGJ1dCBpc24ndFwiLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBsaW5lcyA9IHN0ci5zcGxpdCgvXFxyXFxufFtcXG5cXHJdLyk7XG5cbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGBcIiR7ZXNjYXBlUXVvdGVzKHN0cil9XCJgO1xuXG4gIHJldHVybiBgPDxFT0ZcXG4ke2xpbmVzLmpvaW4oXCJcXG5cIil9XFxuRU9GYDtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5Gb3JNZXRhZGF0YShibG9jazogYW55KTogYW55IHtcbiAgY29uc3QgcmVzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXG4gIGlmICh0eXBlb2YgYmxvY2sgIT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoYmxvY2spKSB7XG4gICAgcmV0dXJuIGJsb2NrO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYmxvY2spKSB7XG4gICAgcmV0dXJuIGJsb2NrLm1hcCgoaSkgPT4gY2xlYW5Gb3JNZXRhZGF0YShpKSk7XG4gIH1cblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYmxvY2spO1xuXG4gIGlmIChrZXlzLmluY2x1ZGVzKFwidmFsdWVcIikpIHtcbiAgICByZXR1cm4gY2xlYW5Gb3JNZXRhZGF0YShibG9jay52YWx1ZSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBibG9ja1trZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhIHJlc29sdmFibGUgd2UgZG9uJ3Qgd2FudCB0byByZWN1cnNlIGludG8gaXRcbiAgICAgIGlmIChUb2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgICByZXNba2V5XSA9IHt9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmVzW2tleV0gPSBjbGVhbkZvck1ldGFkYXRhKHZhbHVlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHZhbHVlICE9IG51bGwgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNba2V5XSkpIHtcbiAgICAgICAgcmVzW2tleV0gPSBbLi4ucmVzW2tleV0sIC4uLnZhbHVlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgcmVzW2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckxpc3QodjogYW55LCBuYW1lPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgeyBpc0Jsb2NrLCBpc19ibG9jaywgdmFsdWUsIHN0b3JhZ2VfY2xhc3NfdHlwZSwgc3RvcmFnZUNsYXNzVHlwZSB9ID0gdjtcbiAgY29uc3QgYmxvY2sgPSBpc0Jsb2NrIHx8IGlzX2Jsb2NrO1xuICBjb25zdCBjbGFzc1R5cGUgPSBzdG9yYWdlQ2xhc3NUeXBlIHx8IHN0b3JhZ2VfY2xhc3NfdHlwZTtcblxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIC8vIHRoaXMgY291bGQgYmUgYW4gZXhwcmVzc2lvbiwgc28gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlXG4gICAgcmV0dXJuIHJlbmRlclN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICBpZiAobmFtZSkge1xuICAgIGlmIChibG9jaykge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0ge2AgKyBgXFxuJHtyZW5kZXJBdHRyaWJ1dGVzKHZhbHVlKX1cXG59YDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIC5tYXAoKHY6IGFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiBgJHtuYW1lfSB7YCArIGBcXG4ke3JlbmRlckF0dHJpYnV0ZXModil9XFxufWA7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBgJHtuYW1lfSA9ICR7cmVuZGVyTGlzdFZhbHVlKHZhbHVlLCBjbGFzc1R5cGUpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke25hbWV9ID0gW1xuJHt2YWx1ZS5tYXAoKHY6IGFueSkgPT4gcmVuZGVyTGlzdFZhbHVlKHYsIGNsYXNzVHlwZSkpLmpvaW4oXCIsXFxuXCIpfVxuXWA7XG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gQSBsaXN0IHR5cGUgb2Ygb25seSBhIHNpbmdsZSBpdGVtXG4gICAgcmV0dXJuIHJlbmRlckxpc3RWYWx1ZSh2YWx1ZSwgY2xhc3NUeXBlKTtcbiAgfVxuXG4gIGlmIChibG9jaykge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKHY6IGFueSkgPT4gcmVuZGVyTGlzdFZhbHVlKHYsIGNsYXNzVHlwZSkpLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICByZXR1cm4gYFtcbiR7dmFsdWUubWFwKCh2OiBhbnkpID0+IHJlbmRlckxpc3RWYWx1ZSh2LCBjbGFzc1R5cGUpKS5qb2luKFwiLFxcblwiKX1cbl1gO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJMaXN0VmFsdWUodmFsdWU6IGFueSwgc3RvcmFnZUNsYXNzVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHN0b3JhZ2VDbGFzc1R5cGUgPT09IFwic3RyaW5nTGlzdFwiKSB7XG4gICAgcmV0dXJuIHJlbmRlclN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgaWYgKHN0b3JhZ2VDbGFzc1R5cGUgPT09IFwibnVtYmVyTGlzdFwiIHx8IHN0b3JhZ2VDbGFzc1R5cGUgPT09IFwiYm9vbGVhbkxpc3RcIikge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG5cbiAgcmV0dXJuIHJlbmRlckJsb2NrKHZhbHVlLCBzdG9yYWdlQ2xhc3NUeXBlKTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyTWFwKG1hcDogYW55KTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBtYXAgPT09IFwic3RyaW5nXCIpIHtcbiAgICAvLyB0aGlzIGNvdWxkIGJlIGFuIGV4cHJlc3Npb24sIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZVxuICAgIHJldHVybiBgXCIke2VzY2FwZVF1b3RlcyhtYXApfVwiYDtcbiAgfVxuICByZXR1cm4gYHtcbiR7T2JqZWN0LmVudHJpZXMobWFwKVxuICAubWFwKChbaywgdl0pID0+IHtcbiAgICBjb25zdCB3cmFwcGVkS2V5ID0gd3JhcElkZW50aWZpZXJJblF1b3Rlc0lmTmVlZGVkKGspO1xuXG4gICAgcmV0dXJuIGAke3dyYXBwZWRLZXl9ID0gJHtyZW5kZXJNYXBWYWx1ZSh2KX1gO1xuICB9KVxuICAuam9pbihcIlxcblwiKX1cbn1gO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJNYXBWYWx1ZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiByZW5kZXJTdHJpbmcodmFsdWUpO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHJlbmRlckxpc3RWYWx1ZSh2YWx1ZSwgXCJ1bmtub3duU3RvcmFnZUNsYXNzXCIpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICB9XG4gICAgcmV0dXJuIHJlbmRlck1hcCh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gYCR7dmFsdWV9YDtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyUmVzb3VyY2UocmVzb3VyY2U6IGFueSkge1xuICBjb25zdCByZXNvdXJjZVR5cGUgPSBPYmplY3Qua2V5cyhyZXNvdXJjZSlbMF07XG4gIGNvbnN0IHJlc291cmNlc1dpdGhUeXBlID0gcmVzb3VyY2VbcmVzb3VyY2VUeXBlXTtcbiAgY29uc3QgcmVzb3VyY2VOYW1lID0gT2JqZWN0LmtleXMocmVzb3VyY2VzV2l0aFR5cGUpWzBdO1xuICBjb25zdCByZXNvdXJjZUF0dHJpYnV0ZXMgPSByZXNvdXJjZXNXaXRoVHlwZVtyZXNvdXJjZU5hbWVdO1xuXG4gIGlmIChyZXNvdXJjZUF0dHJpYnV0ZXMuY29ubmVjdGlvbikge1xuICAgIHJlc291cmNlQXR0cmlidXRlcy5jb25uZWN0aW9uID0ge1xuICAgICAgdmFsdWU6IHJlc291cmNlQXR0cmlidXRlcy5jb25uZWN0aW9uLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgeyBwcm92aXNpb25lciwgZHluYW1pYywgLi4ub3RoZXJBdHRycyB9ID0gcmVzb3VyY2VBdHRyaWJ1dGVzO1xuXG4gIGNvbnN0IGhjbCA9IFtgcmVzb3VyY2UgXCIke3Jlc291cmNlVHlwZX1cIiBcIiR7cmVzb3VyY2VOYW1lfVwiIHtgXTtcblxuICBjb25zdCBhdHRycyA9IHJlbmRlckF0dHJpYnV0ZXMob3RoZXJBdHRycyk7XG5cbiAgaWYgKGF0dHJzKSBoY2wucHVzaChhdHRycyk7XG4gIGlmIChwcm92aXNpb25lcikgaGNsLnB1c2gocmVuZGVyUHJvdmlzaW9uZXJCbG9jayhwcm92aXNpb25lcikpO1xuICBpZiAoZHluYW1pYykgaGNsLnB1c2goLi4ucmVuZGVyRHluYW1pY0Jsb2NrcyhkeW5hbWljKSk7XG5cbiAgaGNsLnB1c2goXCJ9XCIpO1xuXG4gIHJldHVybiB7XG4gICAgaGNsOiBoY2wuam9pbihcIlxcblwiKSxcbiAgICBtZXRhZGF0YToge1xuICAgICAgcmVzb3VyY2U6IHtcbiAgICAgICAgW3Jlc291cmNlVHlwZV06IHtcbiAgICAgICAgICBbcmVzb3VyY2VOYW1lXToge1xuICAgICAgICAgICAgXCIvL1wiOiByZXNvdXJjZUF0dHJpYnV0ZXNbXCIvL1wiXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJEYXRhc291cmNlKGRhdGFTb3VyY2U6IGFueSkge1xuICBjb25zdCBkYXRhU291cmNlVHlwZSA9IE9iamVjdC5rZXlzKGRhdGFTb3VyY2UpWzBdO1xuICBjb25zdCBkYXRhU291cmNlc1dpdGhUeXBlID0gZGF0YVNvdXJjZVtkYXRhU291cmNlVHlwZV07XG4gIGNvbnN0IGRhdGFTb3VyY2VOYW1lID0gT2JqZWN0LmtleXMoZGF0YVNvdXJjZXNXaXRoVHlwZSlbMF07XG4gIGNvbnN0IGRhdGFTb3VyY2VBdHRyaWJ1dGVzID0gZGF0YVNvdXJjZXNXaXRoVHlwZVtkYXRhU291cmNlTmFtZV07XG5cbiAgY29uc3QgeyBkeW5hbWljLCAuLi5vdGhlckF0dHJzIH0gPSBkYXRhU291cmNlQXR0cmlidXRlcztcblxuICBjb25zdCBoY2wgPSBbYGRhdGEgXCIke2RhdGFTb3VyY2VUeXBlfVwiIFwiJHtkYXRhU291cmNlTmFtZX1cIiB7YF07XG5cbiAgY29uc3QgYXR0cnMgPSByZW5kZXJBdHRyaWJ1dGVzKG90aGVyQXR0cnMpO1xuICBpZiAoYXR0cnMpIGhjbC5wdXNoKGF0dHJzKTtcbiAgaWYgKGR5bmFtaWMpIGhjbC5wdXNoKC4uLnJlbmRlckR5bmFtaWNCbG9ja3MoZHluYW1pYykpO1xuICBoY2wucHVzaChcIn1cIik7XG5cbiAgcmV0dXJuIHtcbiAgICBoY2w6IGhjbC5qb2luKFwiXFxuXCIpLFxuICAgIG1ldGFkYXRhOiB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIFtkYXRhU291cmNlVHlwZV06IHtcbiAgICAgICAgICBbZGF0YVNvdXJjZU5hbWVdOiB7XG4gICAgICAgICAgICBcIi8vXCI6IGRhdGFTb3VyY2VBdHRyaWJ1dGVzW1wiLy9cIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRXBoZW1lcmFsKGVwaGVtZXJhbDogYW55KSB7XG4gIGNvbnN0IGVwaGVtZXJhbFR5cGUgPSBPYmplY3Qua2V5cyhlcGhlbWVyYWwpWzBdO1xuICBjb25zdCBlcGhlbWVyYWxzV2l0aFR5cGUgPSBlcGhlbWVyYWxbZXBoZW1lcmFsVHlwZV07XG4gIGNvbnN0IGVwaGVtZXJhbE5hbWUgPSBPYmplY3Qua2V5cyhlcGhlbWVyYWxzV2l0aFR5cGUpWzBdO1xuICBjb25zdCBlcGhlbWVyYWxBdHRyaWJ1dGVzID0gZXBoZW1lcmFsc1dpdGhUeXBlW2VwaGVtZXJhbE5hbWVdO1xuXG4gIGNvbnN0IHsgZHluYW1pYywgLi4ub3RoZXJBdHRycyB9ID0gZXBoZW1lcmFsQXR0cmlidXRlcztcblxuICBjb25zdCBoY2wgPSBbYGVwaGVtZXJhbCBcIiR7ZXBoZW1lcmFsVHlwZX1cIiBcIiR7ZXBoZW1lcmFsTmFtZX1cIiB7YF07XG5cbiAgY29uc3QgYXR0cnMgPSByZW5kZXJBdHRyaWJ1dGVzKG90aGVyQXR0cnMpO1xuICBpZiAoYXR0cnMpIGhjbC5wdXNoKGF0dHJzKTtcbiAgaWYgKGR5bmFtaWMpIGhjbC5wdXNoKC4uLnJlbmRlckR5bmFtaWNCbG9ja3MoZHluYW1pYykpO1xuICBoY2wucHVzaChcIn1cIik7XG5cbiAgcmV0dXJuIHtcbiAgICBoY2w6IGhjbC5qb2luKFwiXFxuXCIpLFxuICAgIG1ldGFkYXRhOiB7XG4gICAgICBlcGhlbWVyYWw6IHtcbiAgICAgICAgW2VwaGVtZXJhbFR5cGVdOiB7XG4gICAgICAgICAgW2VwaGVtZXJhbE5hbWVdOiB7XG4gICAgICAgICAgICBcIi8vXCI6IGVwaGVtZXJhbEF0dHJpYnV0ZXNbXCIvL1wiXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJQcm92aXNpb25lckJsb2NrKHByb3Zpc2lvbmVyczogYW55KSB7XG4gIHJldHVybiBwcm92aXNpb25lcnNcbiAgICAubWFwKChwcm92aXNpb25lcjogYW55KSA9PiB7XG4gICAgICBjb25zdCBwcm92aXNpb25lclR5cGUgPSBPYmplY3Qua2V5cyhwcm92aXNpb25lcilbMF07XG4gICAgICBjb25zdCBwcm92aXNpb25lckF0dHJzID0gcHJvdmlzaW9uZXJbcHJvdmlzaW9uZXJUeXBlXTtcblxuICAgICAgaWYgKHByb3Zpc2lvbmVyQXR0cnMuY29ubmVjdGlvbikge1xuICAgICAgICBwcm92aXNpb25lckF0dHJzLmNvbm5lY3Rpb24gPSB7XG4gICAgICAgICAgdmFsdWU6IHByb3Zpc2lvbmVyQXR0cnMuY29ubmVjdGlvbixcbiAgICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGR5bmFtaWMsIC4uLm90aGVyQXR0cnMgfSA9IHByb3Zpc2lvbmVyQXR0cnM7XG5cbiAgICAgIGNvbnN0IGhjbCA9IFtgcHJvdmlzaW9uZXIgXCIke3Byb3Zpc2lvbmVyVHlwZX1cIiB7YF07XG5cbiAgICAgIGNvbnN0IGF0dHJzID0gcmVuZGVyQXR0cmlidXRlcyhvdGhlckF0dHJzLnZhbHVlIHx8IG90aGVyQXR0cnMpO1xuICAgICAgaWYgKGF0dHJzKSBoY2wucHVzaChhdHRycyk7XG4gICAgICBpZiAoZHluYW1pYykgaGNsLnB1c2goLi4ucmVuZGVyRHluYW1pY0Jsb2NrcyhkeW5hbWljKSk7XG4gICAgICBoY2wucHVzaChcIn1cIik7XG5cbiAgICAgIHJldHVybiBoY2wuam9pbihcIlxcblwiKTtcbiAgICB9KVxuICAgIC5qb2luKFwiXFxuXFxuXCIpO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJEeW5hbWljQmxvY2tzKGR5bmFtaWM6IGFueSkge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZHluYW1pYykubWFwKFxuICAgIChbZHluYW1pY05hbWUsIGR5bmFtaWNBdHRyc106IFtzdHJpbmcsIGFueV0pID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IFtgZHluYW1pYyBcIiR7ZHluYW1pY05hbWV9XCIge2BdO1xuICAgICAgcmVzLnB1c2goXG4gICAgICAgIGBmb3JfZWFjaCA9ICR7cmVuZGVyRnV6enlKc29uRXhwcmVzc2lvbihkeW5hbWljQXR0cnM/LmZvcl9lYWNoKX1gLFxuICAgICAgKTtcbiAgICAgIGlmIChkeW5hbWljQXR0cnM/Lml0ZXJhdG9yKSB7XG4gICAgICAgIHJlcy5wdXNoKGBpdGVyYXRvciA9ICR7ZHluYW1pY0F0dHJzPy5pdGVyYXRvcn1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChkeW5hbWljQXR0cnM/LmxhYmVscykge1xuICAgICAgICByZXMucHVzaChgbGFiZWxzID0gJHtyZW5kZXJGdXp6eUpzb25FeHByZXNzaW9uKGR5bmFtaWNBdHRycz8ubGFiZWxzKX1gKTtcbiAgICAgIH1cbiAgICAgIHJlcy5wdXNoKGBjb250ZW50IHtcbiAgJHtyZW5kZXJBdHRyaWJ1dGVzKGR5bmFtaWNBdHRycy5jb250ZW50KX1cbiAgfWApO1xuICAgICAgcmVzLnB1c2goYH1gKTtcblxuICAgICAgcmV0dXJuIHJlcy5qb2luKFwiXFxuXCIpO1xuICAgIH0sXG4gICk7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclByb3ZpZGVyKHByb3ZpZGVyOiBhbnkpIHtcbiAgY29uc3QgcHJvdmlkZXJOYW1lID0gT2JqZWN0LmtleXMocHJvdmlkZXIpWzBdO1xuICBjb25zdCBwcm92aWRlckF0dHJpYnV0ZXMgPSBwcm92aWRlcltwcm92aWRlck5hbWVdO1xuXG4gIHJldHVybiBwcm92aWRlckF0dHJpYnV0ZXNcbiAgICAubWFwKChwcm92aWRlckluc3RhbmNlOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHsgZHluYW1pYywgLi4ub3RoZXJBdHRycyB9ID0gcHJvdmlkZXJJbnN0YW5jZTtcblxuICAgICAgY29uc3QgaGNsID0gW2Bwcm92aWRlciBcIiR7cHJvdmlkZXJOYW1lfVwiIHtgXTtcblxuICAgICAgY29uc3QgYXR0cnMgPSByZW5kZXJBdHRyaWJ1dGVzKG90aGVyQXR0cnMpO1xuICAgICAgaWYgKGF0dHJzKSBoY2wucHVzaChhdHRycyk7XG4gICAgICBpZiAoZHluYW1pYykgaGNsLnB1c2goLi4ucmVuZGVyRHluYW1pY0Jsb2NrcyhkeW5hbWljKSk7XG5cbiAgICAgIGhjbC5wdXNoKFwifVwiKTtcblxuICAgICAgcmV0dXJuIGhjbC5qb2luKFwiXFxuXCIpO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcXG5cXG5cIik7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1vZHVsZShtb2R1bGU6IGFueSkge1xuICBjb25zdCBtb2R1bGVOYW1lID0gT2JqZWN0LmtleXMobW9kdWxlKVswXTtcbiAgY29uc3QgbW9kdWxlQXR0cmlidXRlcyA9IG1vZHVsZVttb2R1bGVOYW1lXTtcblxuICByZXR1cm4ge1xuICAgIGhjbDogYG1vZHVsZSBcIiR7bW9kdWxlTmFtZX1cIiB7XG4ke3JlbmRlckF0dHJpYnV0ZXMobW9kdWxlQXR0cmlidXRlcyl9XG59YCxcbiAgICBtZXRhZGF0YToge1xuICAgICAgbW9kdWxlOiB7XG4gICAgICAgIFttb2R1bGVOYW1lXToge1xuICAgICAgICAgIFwiLy9cIjogbW9kdWxlQXR0cmlidXRlc1tcIi8vXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJPdXRwdXQob3V0cHV0OiBhbnkpIHtcbiAgY29uc3Qgb3V0cHV0TmFtZSA9IE9iamVjdC5rZXlzKG91dHB1dClbMF07XG4gIGNvbnN0IG91dHB1dEF0dHJpYnV0ZXMgPSBvdXRwdXRbb3V0cHV0TmFtZV07XG5cbiAgcmV0dXJuIGBvdXRwdXQgXCIke291dHB1dE5hbWV9XCIge1xuJHtyZW5kZXJBdHRyaWJ1dGVzKG91dHB1dEF0dHJpYnV0ZXMpfVxufWA7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckxvY2Fscyhsb2NhbHM6IGFueSkge1xuICBpZiAoIWxvY2Fscykge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgY29uc3QgbG9jYWxOYW1lcyA9IE9iamVjdC5rZXlzKGxvY2Fscyk7XG5cbiAgaWYgKGxvY2FsTmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICByZXR1cm4gYGxvY2FscyB7XG4gICAgJHtsb2NhbE5hbWVzXG4gICAgICAuZmlsdGVyKChuYW1lKSA9PiAhIWxvY2Fsc1tuYW1lXS52YWx1ZSlcbiAgICAgIC5tYXAoKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlbmRlckZ1enp5SnNvbkV4cHJlc3Npb24obG9jYWxzW25hbWVdLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9ID0gJHt2YWx1ZX1gO1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiXFxuXCIpfVxufWA7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclZhcmlhYmxlKHZhcmlhYmxlOiBhbnkpIHtcbiAgY29uc3QgdmFyaWFibGVOYW1lID0gT2JqZWN0LmtleXModmFyaWFibGUpWzBdO1xuICBjb25zdCB2YXJpYWJsZUF0dHJpYnV0ZXMgPSB2YXJpYWJsZVt2YXJpYWJsZU5hbWVdO1xuXG4gIHJldHVybiBgdmFyaWFibGUgXCIke3ZhcmlhYmxlTmFtZX1cIiB7XG4ke3JlbmRlckF0dHJpYnV0ZXModmFyaWFibGVBdHRyaWJ1dGVzKX1cbn1gO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJNb3ZlZChtb3ZlOiBhbnkpIHtcbiAgY29uc3QgbW92ZWRCbG9ja3MgPSBtb3ZlLm1hcCgobW92ZUJsb2NrOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYG1vdmVkIHtcbiR7cmVuZGVyQXR0cmlidXRlcyhtb3ZlQmxvY2spfVxufWA7XG4gIH0pO1xuXG4gIHJldHVybiBtb3ZlZEJsb2Nrcy5qb2luKFwiXFxuXCIpO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJJbXBvcnQoaW1wb3J0czogYW55KSB7XG4gIGNvbnN0IGltcG9ydEJsb2NrcyA9IGltcG9ydHMubWFwKChpbXBvcnRCbG9jazogYW55KSA9PiB7XG4gICAgcmV0dXJuIGBpbXBvcnQge1xuJHtyZW5kZXJBdHRyaWJ1dGVzKGltcG9ydEJsb2NrKX1cbn1gO1xuICB9KTtcblxuICByZXR1cm4gaW1wb3J0QmxvY2tzLmpvaW4oXCJcXG5cIik7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRlcnJhZm9ybSh0ZXJyYWZvcm06IGFueSkge1xuICBjb25zdCBibG9ja0F0dHJpYnV0ZXMgPSBbXCJyZXF1aXJlZF9wcm92aWRlcnNcIiwgXCJiYWNrZW5kXCIsIFwiY2xvdWRcIl07XG4gIGNvbnN0IHJlcXVpcmVkUHJvdmlkZXJzID0gYHJlcXVpcmVkX3Byb3ZpZGVycyB7XG4ke3JlbmRlclNpbXBsZUF0dHJpYnV0ZXModGVycmFmb3JtLnJlcXVpcmVkX3Byb3ZpZGVycyl9XG59YDtcblxuICBjb25zdCBiYWNrZW5kcyA9IE9iamVjdC5rZXlzKHRlcnJhZm9ybS5iYWNrZW5kIHx8IHt9KS5tYXAoKGJhY2tlbmROYW1lKSA9PiB7XG4gICAgcmV0dXJuIGBiYWNrZW5kIFwiJHtiYWNrZW5kTmFtZX1cIiB7XG4ke3JlbmRlckF0dHJpYnV0ZXModGVycmFmb3JtLmJhY2tlbmRbYmFja2VuZE5hbWVdKX1cbn1gO1xuICB9KTtcblxuICBjb25zdCBjbG91ZEJhY2tlbmQgPSB0ZXJyYWZvcm0uY2xvdWRcbiAgICA/IGBjbG91ZCB7XG4ke3JlbmRlckF0dHJpYnV0ZXModGVycmFmb3JtLmNsb3VkKX1cbn1gXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgb3RoZXJBdHRyaWJ1dGVzID0gT2JqZWN0LmtleXModGVycmFmb3JtKS5maWx0ZXIoXG4gICAgKGtleSkgPT4gIWJsb2NrQXR0cmlidXRlcy5pbmNsdWRlcyhrZXkpLFxuICApO1xuICByZXR1cm4gYHRlcnJhZm9ybSB7XG4ke3JlcXVpcmVkUHJvdmlkZXJzfVxuJHtbLi4uYmFja2VuZHMsIGNsb3VkQmFja2VuZF0uam9pbihcIlxcblwiKX1cbiR7cmVuZGVyU2ltcGxlQXR0cmlidXRlcyhvdGhlckF0dHJpYnV0ZXMpfVxufWA7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckJsb2NrKGJsb2NrOiBhbnksIF9zdG9yYWdlQ2xhc3NUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHtcbiR7cmVuZGVyQXR0cmlidXRlcyhibG9jayl9XG59YDtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiByZW5kZXJGdXp6eUpzb25PYmplY3QoanNvbk9iamVjdDogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICBcIntcIixcbiAgICAuLi5PYmplY3QuZW50cmllcyhqc29uT2JqZWN0KS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZWRLZXkgPSB3cmFwSWRlbnRpZmllckluUXVvdGVzSWZOZWVkZWQobmFtZSk7XG4gICAgICByZXR1cm4gYCR7d3JhcHBlZEtleX0gPSAke3JlbmRlckZ1enp5SnNvbkV4cHJlc3Npb24odmFsdWUpfWA7XG4gICAgfSksXG4gICAgXCJ9XCIsXG4gIF0uam9pbihcIlxcblwiKTtcbn1cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gcmVuZGVyRnV6enlKc29uRXhwcmVzc2lvbihqc29uRXhwcmVzc2lvbjogYW55KTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoanNvbkV4cHJlc3Npb24pKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIFwiW1wiLFxuICAgICAgLi4uanNvbkV4cHJlc3Npb24ubWFwKCh2YWx1ZSkgPT4gYCR7cmVuZGVyRnV6enlKc29uRXhwcmVzc2lvbih2YWx1ZSl9LGApLFxuICAgICAgXCJdXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBqc29uRXhwcmVzc2lvbiA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiByZW5kZXJGdXp6eUpzb25PYmplY3QoanNvbkV4cHJlc3Npb24pO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBqc29uRXhwcmVzc2lvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlmIChqc29uRXhwcmVzc2lvbiA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIGBcIlwiYDtcbiAgICB9XG5cbiAgICBpZiAoanNvbkV4cHJlc3Npb24uaW5jbHVkZXMoXCIke1wiKSkge1xuICAgICAgcmV0dXJuIGBcIiR7anNvbkV4cHJlc3Npb259XCJgO1xuICAgIH1cblxuICAgIGlmIChwYXJzZUludChqc29uRXhwcmVzc2lvbiwgMTApLnRvU3RyaW5nKCkgPT09IGpzb25FeHByZXNzaW9uKSB7XG4gICAgICByZXR1cm4ganNvbkV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgaWYgKGpzb25FeHByZXNzaW9uLnN0YXJ0c1dpdGgoXCJbXCIpKSB7XG4gICAgICByZXR1cm4ganNvbkV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgaWYgKGpzb25FeHByZXNzaW9uLnN0YXJ0c1dpdGgoXCJ7XCIpKSB7XG4gICAgICByZXR1cm4ganNvbkV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgaWYgKGpzb25FeHByZXNzaW9uLnN0YXJ0c1dpdGgoJ1wiJykpIHtcbiAgICAgIHJldHVybiBqc29uRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gYFwiJHtlc2NhcGVRdW90ZXMoanNvbkV4cHJlc3Npb24pfVwiYDtcbiAgfVxuXG4gIGlmIChqc29uRXhwcmVzc2lvbiA9PT0gXCJ0cnVlXCIgfHwganNvbkV4cHJlc3Npb24gPT09IFwiZmFsc2VcIikge1xuICAgIHJldHVybiBqc29uRXhwcmVzc2lvbiBhcyBzdHJpbmc7XG4gIH1cblxuICBpZiAoanNvbkV4cHJlc3Npb24gPT09IFwibnVsbFwiKSB7XG4gICAgcmV0dXJuIGpzb25FeHByZXNzaW9uO1xuICB9XG5cbiAgcmV0dXJuIGAke2pzb25FeHByZXNzaW9ufWA7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclNpbXBsZUF0dHJpYnV0ZXMoYXR0cmlidXRlczogYW55KTogc3RyaW5nIHtcbiAgaWYgKGF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpXG4gICAgLm1hcChcbiAgICAgIChbbmFtZSwgdmFsdWVdKSA9PlxuICAgICAgICBgICAke25hbWV9ID0gJHtyZW5kZXJGdXp6eUpzb25FeHByZXNzaW9uKHZhbHVlIGFzIGFueSl9YCxcbiAgICApXG4gICAgLmpvaW4oXCJcXG5cIik7XG59XG4vKipcbiAqIERldGVjdHMgYSByZXNvbHZlZC1idXQtZW1wdGllZCBhdHRyaWJ1dGUgZGVzY3JpcHRvcjogYW4gb2JqZWN0IHNoYXBlZCBsaWtlXG4gKiB3aGF0IGBBdHRyaWJ1dGVzRW1pdHRlciNlbWl0VG9IY2xUZXJyYWZvcm1gIGFsd2F5cyBlbWl0cyBmb3IgSENMIHN5bnRoZXNpc1xuICogLSBgeyB2YWx1ZSwgaXNCbG9jaywgdHlwZSwgc3RvcmFnZUNsYXNzVHlwZSB9YCAtIHRoYXQgaGFzIGxvc3QgaXRzIGB2YWx1ZWBcbiAqIGtleS5cbiAqXG4gKiBUaGUgb25seSB3YXkgYSBkZXNjcmlwdG9yIGxvc2VzIGB2YWx1ZWAgaGVyZSBpcyB0aGF0IGl0IHJlc29sdmVkIHRvXG4gKiBgdW5kZWZpbmVkYDogYHJlc29sdmUoKWAgKHNlZSBgdG9rZW5zL3ByaXZhdGUvcmVzb2x2ZS50c2ApIGRlZXAtcmVzb2x2ZXNcbiAqIGV2ZXJ5IGtleSBvZiBhIHBsYWluIG9iamVjdCBhbmQgc2lsZW50bHkgZHJvcHMgYW55IGtleSB3aG9zZSByZXNvbHZlZFxuICogdmFsdWUgaXMgYHVuZGVmaW5lZGAsIGJ1dCBvbmx5IGB2YWx1ZWAgY2FuIGV2ZXIgZG8gdGhhdCAtIGBpc0Jsb2NrYCxcbiAqIGB0eXBlYCwgYW5kIGBzdG9yYWdlQ2xhc3NUeXBlYCBhcmUgZW1pdHRlZCBhcyBsaXRlcmFsIHN0cmluZ3MvYm9vbGVhbnMgYnlcbiAqIHRoZSBnZW5lcmF0b3IsIG5ldmVyIGFzIHRva2Vucy4gU28gYW4gb2JqZWN0IGNhcnJ5aW5nIGV4YWN0bHkgdGhpc1xuICogbWV0YWRhdGEgY29tYmluYXRpb24sIHdpdGggYHZhbHVlYCBhbmQgYGR5bmFtaWNgIGJvdGggYWJzZW50LCBpcyBhbHdheXNcbiAqIHRoZSBsZWZ0b3ZlciBzaGVsbCBvZiBhIGRlc2NyaXB0b3Igd2hvc2UgdmFsdWUgdmFuaXNoZWQsIG5ldmVyIGEgZ2VudWluZVxuICogdXNlci1zdXBwbGllZCBtYXAgKHRob3NlIGRvbid0IGhhcHBlbiB0byBhbHNvIGNhcnJ5IGBpc0Jsb2NrYCArXG4gKiBgc3RvcmFnZUNsYXNzVHlwZWApLlxuICpcbiAqIFRoaXMgaXMgaW50ZW50aW9uYWxseSBub3Qgc3BlY2lmaWMgdG8gd3JpdGUtb25seSBhdHRyaWJ1dGVzOiBhIHdyaXRlLW9ubHlcbiAqIGF0dHJpYnV0ZSB3cmFwcGVkIGJ5IGBtYXJrV3JpdGVPbmx5QXR0cmlidXRlKClgIGFyb3VuZCBhIGBMYXp5YC90b2tlblxuICogcHJvZHVjZXIgdGhhdCByZXNvbHZlcyB0byBgdW5kZWZpbmVkYCBpcyBzaW1wbHkgb25lIGV4YW1wbGUgKGl0IHN1cnZpdmVzXG4gKiB0aGUgZ2VuZXJhdGVkIFwicmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXCIgcHJlLWZpbHRlciBpblxuICogYHN5bnRoZXNpemVIY2xBdHRyaWJ1dGVzKClgIGJlY2F1c2UgdGhhdCBmaWx0ZXIgb25seSBzZWVzIHRoZSBzdGlsbC1cbiAqIHVucmVzb2x2ZWQgdG9rZW4sIG5vdCB3aGF0IGl0IGxhdGVyIHJlc29sdmVzIHRvKSAtIGJ1dCBBTlkgYXR0cmlidXRlXG4gKiBkZXNjcmlwdG9yIHdob3NlIHRva2VuIHJlc29sdmVzIHRvIGB1bmRlZmluZWRgIGluIEhDTCBtb2RlIGhpdHMgdGhpcyBzYW1lXG4gKiBwYXRoIChzZWUgdGhlICMzMTMgSENMLWRlZmVjdHMgZmFtaWx5KS5cbiAqL1xuZnVuY3Rpb24gaXNPcnBoYW5lZEF0dHJpYnV0ZURlc2NyaXB0b3IodjogdW5rbm93bik6IHYgaXMgUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGlmICh0eXBlb2YgdiAhPT0gXCJvYmplY3RcIiB8fCB2ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGhhc093biA9IChrZXk6IHN0cmluZykgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHYsIGtleSk7XG4gIHJldHVybiAoXG4gICAgIWhhc093bihcInZhbHVlXCIpICYmXG4gICAgIWhhc093bihcImR5bmFtaWNcIikgJiZcbiAgICBoYXNPd24oXCJpc0Jsb2NrXCIpICYmXG4gICAgaGFzT3duKFwidHlwZVwiKSAmJlxuICAgIGhhc093bihcInN0b3JhZ2VDbGFzc1R5cGVcIilcbiAgKTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQXR0cmlidXRlcyhhdHRyaWJ1dGVzOiBhbnkpOiBzdHJpbmcge1xuICBpZiAoYXR0cmlidXRlcyA9PT0gdW5kZWZpbmVkIHx8IGF0dHJpYnV0ZXMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcylcbiAgICAubWFwKChbbmFtZSwgdl0pID0+IHtcbiAgICAgIGlmIChuYW1lID09PSBcIi8vXCIpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1ldGFCbG9ja3MgPSBbXCJsaWZlY3ljbGVcIiwgXCJwcm92aXNpb25lclwiXTtcblxuICAgICAgLy9cbiAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgc29tZSBhdHRyaWJ1dGVzIHRoYXQgZG9uJ3QgaGF2ZSB0eXBlIGluZm9ybWF0aW9uXG4gICAgICAvLyBqdXN0IHRyeSB0byBndWVzcyB0aGVtXG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9ID0gJHtyZW5kZXJGdXp6eUpzb25FeHByZXNzaW9uKHYpfWA7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0gPSAke3Z9YDtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0gPSAke3JlbmRlckZ1enp5SnNvbkV4cHJlc3Npb24odil9YDtcbiAgICAgIH0gZWxzZSBpZiAodiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0gPSBudWxsYDtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgIXYuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKSAmJlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgICF2Lmhhc093blByb3BlcnR5KFwiZHluYW1pY1wiKVxuICAgICAgKSB7XG4gICAgICAgIC8vIEFuIG9ycGhhbmVkIGF0dHJpYnV0ZSBkZXNjcmlwdG9yIChpdHMgJ3ZhbHVlJyByZXNvbHZlZCB0b1xuICAgICAgICAvLyBgdW5kZWZpbmVkYCkgY2FycmllcyBvbmx5IGludGVybmFsIG1ldGFkYXRhIGF0IHRoaXMgcG9pbnQgLSBvbWl0XG4gICAgICAgIC8vIHRoZSBhdHRyaWJ1dGUgZW50aXJlbHksIGV4YWN0bHkgYXMgaWYgaXQgaGFkIG5ldmVyIGJlZW4gc2V0LFxuICAgICAgICAvLyBpbnN0ZWFkIG9mIGxlYWtpbmcgdGhhdCBtZXRhZGF0YSBpbnRvIHRoZSBIQ0wgb3V0cHV0IHZpYVxuICAgICAgICAvLyByZW5kZXJGdXp6eUpzb25FeHByZXNzaW9uKCkuIFNlZSBpc09ycGhhbmVkQXR0cmlidXRlRGVzY3JpcHRvcigpLlxuICAgICAgICBpZiAoaXNPcnBoYW5lZEF0dHJpYnV0ZURlc2NyaXB0b3IodikpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhQmxvY2tzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGAke25hbWV9IHtcbiR7cmVuZGVyU2ltcGxlQXR0cmlidXRlcyh2KX1cbn1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtuYW1lfSA9ICR7cmVuZGVyRnV6enlKc29uRXhwcmVzc2lvbih2KX1gO1xuICAgICAgfSBlbHNlIGlmICh2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gUmVmZXJlbmNpbmcgYm90aCBpc0Jsb2NrIGFuZCBpc19ibG9jaywgYmVjYXVzZSBzb21ldGltZXMgd2UgcGFzcyB0aHJvdWdoIGEgc25ha2UgY2FzZSBmaWx0ZXJcbiAgICAgIC8vIHdpdGhpbiBhdHRyaWJ1dGVzLlxuICAgICAgY29uc3Qge1xuICAgICAgICBkeW5hbWljLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgaXNCbG9jayxcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZSxcbiAgICAgICAgaXNfYmxvY2ssXG4gICAgICAgIHN0b3JhZ2VfY2xhc3NfdHlwZSxcbiAgICAgIH0gPSB2IGFzIGFueTtcbiAgICAgIGNvbnN0IGJsb2NrID0gaXNCbG9jayB8fCBpc19ibG9jayB8fCBtZXRhQmxvY2tzLmluY2x1ZGVzKG5hbWUpO1xuICAgICAgY29uc3QgY2xhc3NUeXBlID0gc3RvcmFnZUNsYXNzVHlwZSB8fCBzdG9yYWdlX2NsYXNzX3R5cGU7XG5cbiAgICAgIGlmIChkeW5hbWljKSB7XG4gICAgICAgIHJldHVybiByZW5kZXJEeW5hbWljQmxvY2tzKHtcbiAgICAgICAgICBbbmFtZV06IGR5bmFtaWMudmFsdWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gU2hvcnQgY2lyY3VpdCB0eXBlIGNoZWNraW5nIGlmIHZhbHVlIGlzIGFuIGV4cHJlc3Npb25cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUuaW5jbHVkZXMoXCIke1wiKSkge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0gPSAke3JlbmRlclN0cmluZyh2YWx1ZSl9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKGJsb2NrICYmIHR5cGUgIT09IFwibGlzdFwiICYmIHR5cGUgIT09IFwic2V0XCIpIHtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9IHtcbiR7cmVuZGVyQXR0cmlidXRlcyh2YWx1ZSl9XG59YDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09PSBcImxpc3RcIiB8fCB0eXBlID09PSBcInNldFwiKSB7XG4gICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgIHJldHVybiByZW5kZXJMaXN0KHYsIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtuYW1lfSA9ICR7cmVuZGVyTGlzdCh2KX1gO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09IFwibWFwXCIpIHtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9ID0gJHtyZW5kZXJNYXAodmFsdWUpfWA7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSBcInNpbXBsZVwiKSB7XG4gICAgICAgIGlmIChjbGFzc1R5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYCR7bmFtZX0gPSAke3JlbmRlclN0cmluZyh2YWx1ZSl9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xhc3NUeXBlID09PSBcIm51bWJlclwiIHx8IGNsYXNzVHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICByZXR1cm4gYCR7bmFtZX0gPSAke3ZhbHVlfWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3Qgc3VyZSB3aHkgd2UncmUgaGVyZSwgYnV0IHRoZXJlJ3MgZWl0aGVyIGEgYnVnIGluIHRoZSBwcm92aWRlclxuICAgICAgICAvLyBvciB3ZSBoYXZlIHNraXBwZWQgdGhlIGF0dHJpYnV0ZSB0byByZWR1Y2UgdGhlIHNpemUgb2Ygb3VyIHByb3ZpZGVyXG4gICAgICAgIC8vIEluIGVpdGhlciBjYXNlLCB3ZSBzaG91bGQgdHJ5IHRvIG5vdCBvdXRwdXQgW29iamVjdCBPYmplY3RdIGhlcmVcbiAgICAgICAgLy8gYW5kIHRyeSBhIGJlc3QgYXBwcm94aW1hdGlvbi4gVGhvdWdoLCBpdCB3b3VsZCBub3Qgd29yayBmb3JcbiAgICAgICAgLy8gYmxvY2tzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICByZXR1cm4gYFxuIyBXYXJuaW5nOiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZSBpcyBvZiBhbiB1bmV4cGVjdGVkIHR5cGUuIEVpdGhlciB0aGVyZSdzIGEgcHJvYmxlbSB3aXRoIHRoZSBwcm92aWRlclxuIyBvciBDREtUTiBoYXMgY2hvc2VuIHRvIHNraXAgZ2VuZXJhdGluZyBhIGRldGFpbGVkIHR5cGUgZm9yIHRoaXMgYmVjYXVzZSBpdCBpbmNyZWFzZXMgdGhlIHNpemUgb2YgdGhlIHByb3ZpZGVyIGxpYnJhcnkgc2lnbmlmaWNhbnRseS4gXG4jIFBsZWFzZSBjaGVjayBpZiB0aGlzIHJlc291cmNlIGlzIGluY2x1ZGVkIGluIG91ciBza2lwIGxpc3Q6IFxuIyBodHRwczovL2dpdGh1Yi5jb20vaGFzaGljb3JwL3RlcnJhZm9ybS1jZGsvYmxvYi8xZmI4NTg4MDk1YTU1ZDQ3NWRjNGJlMjg4ODJlYzRmNDIwMDZlYzhkL3BhY2thZ2VzLyU0MGNka3RmL3Byb3ZpZGVyLWdlbmVyYXRvci9saWIvZ2V0L2dlbmVyYXRvci9za2lwcGVkLWF0dHJpYnV0ZXMudHNcbiMgYW5kIGlmIG5vdCwgcGxlYXNlIGNoZWNrIHdpdGggdGhlIHByb3ZpZGVyIGF1dGhvcnMgdG8gc2VlIGlmIHRoZSBwcm92aWRlciBzY2hlbWEgaXMgYWNjdXJhdGUuXG4jIFxuIyBXZSB1bmRlcnN0YW5kIHRoaXMgaXMgbm90IGlkZWFsLCBzbyB3ZSBzdWdnZXN0IHVzaW5nIEpTT04gc3ludGhlc2lzIGluc3RlYWQgb2YgSENMIHN5bnRoZXNpcyBmb3IgdGhpcyBwYXJ0aWN1bGFyIGNhc2UuXG5cbiR7bmFtZX0gPSAke3JlbmRlckZ1enp5SnNvbkV4cHJlc3Npb24odmFsdWUpfVxuYDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gXCJhbnlcIikge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0gPSAke3JlbmRlckZ1enp5SnNvbkV4cHJlc3Npb24odmFsdWUpfWA7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSBcInJlZmVyZW5jZVwiKSB7XG4gICAgICAgIHJldHVybiBgJHtuYW1lfSA9ICR7dmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGAke25hbWV9ID0gJHt2YWx1ZX1gO1xuICAgIH0pXG4gICAgLmZpbHRlcigodikgPT4gdiAhPT0gdW5kZWZpbmVkKVxuICAgIC5qb2luKFwiXFxuXCIpO1xufVxuIl19
710
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hjbC9yZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4REEsNENBNkNDO0FBS0QsZ0NBZ0RDO0FBS0QsMENBU0M7QUFLRCw4QkFjQztBQUtELHdDQXNCQztBQUtELHdDQXFDQztBQUtELDRDQTJCQztBQUtELDBDQTJCQztBQUtELHdEQXlCQztBQUtELGtEQXFCQztBQUtELHdDQW1CQztBQUtELG9DQWdCQztBQUtELG9DQU9DO0FBS0Qsb0NBb0JDO0FBS0Qsd0NBT0M7QUFLRCxrQ0FRQztBQUtELG9DQVFDO0FBS0QsMENBMEJDO0FBS0Qsa0NBSUM7QUF5RUQsd0RBV0M7QUE0Q0QsNENBOEhDO0FBNXhCRDs7O0dBR0c7QUFDSCwyREFBc0Q7QUFDdEQsMkNBQStDO0FBRS9DOztHQUVHO0FBQ0gsU0FBUyxZQUFZLENBQUMsR0FBVztJQUMvQixtREFBbUQ7SUFDbkQsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLDhCQUE4QixDQUFDLEdBQVc7SUFDakQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELHdFQUF3RTtJQUN4RSx5RUFBeUU7SUFDekUsdUVBQXVFO0lBQ3ZFLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNwQixDQUFDO0lBQ0QsT0FBTyxJQUFBLG1DQUFlLEVBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxD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Ozs7Ozs7RUFTZixJQUFJLE1BQU0seUJBQXlCLENBQUMsS0FBSyxDQUFDO0NBQzNDLENBQUM7WUFDTSxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ25CLE9BQU8sR0FBRyxJQUFJLE1BQU0seUJBQXlCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6RCxDQUFDO1FBRUQsSUFBSSxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDekIsT0FBTyxHQUFHLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBRUQsT0FBTyxHQUFHLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQztJQUM5QixDQUFDLENBQUM7U0FDRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUM7U0FDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuICovXG5pbXBvcnQgeyBxdW90ZWRTdHJpbmdLZXkgfSBmcm9tIFwiLi9xdW90ZWQtc3RyaW5nLWtleVwiO1xuaW1wb3J0IHsgVG9rZW5pemF0aW9uIH0gZnJvbSBcIi4uL3Rva2Vucy90b2tlblwiO1xuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVF1b3RlcyhzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIERvbid0IGF0dGVtcHQgdG8gZXNjYXBlIGlmIHdlIGhhdmUgYW4gZXhwcmVzc2lvblxuICBpZiAoc3RyLm1hdGNoKC9cXCRcXHsvKSkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oPzwhXFxcXClcIi9nLCAnXFxcXFwiJyk7XG59XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gd3JhcElkZW50aWZpZXJJblF1b3Rlc0lmTmVlZGVkKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCEvKF5cXGQpfFteQS1aYS16MC05Xy1dLy50ZXN0KGtleSkpIHtcbiAgICByZXR1cm4ga2V5O1xuICB9XG4gIC8vIEEga2V5IGNvbnRhaW5pbmcgYCR7YCBtYXkgYmUgYSByZXNvbHZlZCB0b2tlbiByZWZlcmVuY2UgcmF0aGVyIHRoYW4gYVxuICAvLyBsaXRlcmFsIHN0cmluZywgc28gaXRzIGAkey4uLn1gIGJvZHkgaXMgZXhwcmVzc2lvbiBzeW50YXgsIG5vdCB0ZXh0IHRvXG4gIC8vIGVzY2FwZS4gTGVhdmUgaXQgb24gdGhlIG9sZCAodW5lc2NhcGVkKSBwYXRoIHRvIGF2b2lkIGNvcnJ1cHRpbmcgaXQuXG4gIGlmIChrZXkuaW5jbHVkZXMoXCIke1wiKSkge1xuICAgIHJldHVybiBgXCIke2tleX1cImA7XG4gIH1cbiAgcmV0dXJuIHF1b3RlZFN0cmluZ0tleShrZXksIHRydWUpO1xufVxuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIHJlbmRlclN0cmluZyhzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChzdHIgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gYFwiXCJgO1xuICB9XG5cbiAgaWYgKCFzdHIpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzdHIgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIlVuYWJsZSB0byBwcm9jZXNzIGF0dHJpYnV0ZSB0aGF0IHNob3VsZCBoYXZlIGJlZW4gYSBzdHJpbmcsIGJ1dCBpc24ndFwiLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBsaW5lcyA9IHN0ci5zcGxpdCgvXFxyXFxufFtcXG5cXHJdLyk7XG5cbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGBcIiR7ZXNjYXBlUXVvdGVzKHN0cil9XCJgO1xuXG4gIHJldHVybiBgPDxFT0ZcXG4ke2xpbmVzLmpvaW4oXCJcXG5cIil9XFxuRU9GYDtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5Gb3JNZXRhZGF0YShibG9jazogYW55KTogYW55IHtcbiAgY29uc3QgcmVzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXG4gIGlmICh0eXBlb2YgYmxvY2sgIT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoYmxvY2spKSB7XG4gICAgcmV0dXJuIGJsb2NrO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYmxvY2spKSB7XG4gICAgcmV0dXJuIGJsb2NrLm1hcCgoaSkgPT4gY2xlYW5Gb3JNZXRhZGF0YShpKSk7XG4gIH1cblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYmxvY2spO1xuXG4gIGlmIChrZXlzLmluY2x1ZGVzKFwidmFsdWVcIikpIHtcbiAgICByZXR1cm4gY2xlYW5Gb3JNZXRhZGF0YShibG9jay52YWx1ZSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBibG9ja1trZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhIHJlc29sdmFibGUgd2UgZG9uJ3Qgd2FudCB0byByZWN1cnNlIGludG8gaXRcbiAgICAgIGlmIChUb2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgICByZXNba2V5XSA9IHt9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmVzW2tleV0gPSBjbGVhbkZvck1ldGFkYXRhKHZhbHVlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHZhbHVlICE9IG51bGwgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNba2V5XSkpIHtcbiAgICAgICAgcmVzW2tleV0gPSBbLi4ucmVzW2tleV0sIC4uLnZhbHVlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgcmVzW2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckxpc3QodjogYW55LCBuYW1lPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgeyBpc0Jsb2NrLCBpc19ibG9jaywgdmFsdWUsIHN0b3JhZ2VfY2xhc3NfdHlwZSwgc3RvcmFnZUNsYXNzVHlwZSB9ID0gdjtcbiAgY29uc3QgYmxvY2sgPSBpc0Jsb2NrIHx8IGlzX2Jsb2NrO1xuICBjb25zdCBjbGFzc1R5cGUgPSBzdG9yYWdlQ2xhc3NUeXBlIHx8IHN0b3JhZ2VfY2xhc3NfdHlwZTtcblxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIC8vIHRoaXMgY291bGQgYmUgYW4gZXhwcmVzc2lvbiwgc28gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlXG4gICAgcmV0dXJuIHJlbmRlclN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICBpZiAobmFtZSkge1xuICAgIGlmIChibG9jaykge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0ge2AgKyBgXFxuJHtyZW5kZXJBdHRyaWJ1dGVzKHZhbHVlKX1cXG59YDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIC5tYXAoKHY6IGFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiBgJHtuYW1lfSB7YCArIGBcXG4ke3JlbmRlckF0dHJpYnV0ZXModil9XFxufWA7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBgJHtuYW1lfSA9ICR7cmVuZGVyTGlzdFZhbHVlKHZhbHVlLCBjbGFzc1R5cGUpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke25hbWV9ID0gW1xuJHt2YWx1ZS5tYXAoKHY6IGFueSkgPT4gcmVuZGVyTGlzdFZhbHVlKHYsIGNsYXNzVHlwZSkpLmpvaW4oXCIsXFxuXCIpfVxuXWA7XG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gQSBsaXN0IHR5cGUgb2Ygb25seSBhIHNpbmdsZSBpdGVtXG4gICAgcmV0dXJuIHJlbmRlckxpc3RWYWx1ZSh2YWx1ZSwgY2xhc3NUeXBlKTtcbiAgfVxuXG4gIGlmIChibG9jaykge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKHY6IGFueSkgPT4gcmVuZGVyTGlzdFZhbHVlKHYsIGNsYXNzVHlwZSkpLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICByZXR1cm4gYFtcbiR7dmFsdWUubWFwKCh2OiBhbnkpID0+IHJlbmRlckxpc3RWYWx1ZSh2LCBjbGFzc1R5cGUpKS5qb2luKFwiLFxcblwiKX1cbl1gO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJMaXN0VmFsdWUodmFsdWU6IGFueSwgc3RvcmFnZUNsYXNzVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHN0b3JhZ2VDbGFzc1R5cGUgPT09IFwic3RyaW5nTGlzdFwiKSB7XG4gICAgcmV0dXJuIHJlbmRlclN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgaWYgKHN0b3JhZ2VDbGFzc1R5cGUgPT09IFwibnVtYmVyTGlzdFwiIHx8IHN0b3JhZ2VDbGFzc1R5cGUgPT09IFwiYm9vbGVhbkxpc3RcIikge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG5cbiAgcmV0dXJuIHJlbmRlckJsb2NrKHZhbHVlLCBzdG9yYWdlQ2xhc3NUeXBlKTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyTWFwKG1hcDogYW55KTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBtYXAgPT09IFwic3RyaW5nXCIpIHtcbiAgICAvLyB0aGlzIGNvdWxkIGJlIGFuIGV4cHJlc3Npb24sIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZVxuICAgIHJldHVybiBgXCIke2VzY2FwZVF1b3RlcyhtYXApfVwiYDtcbiAgfVxuICByZXR1cm4gYHtcbiR7T2JqZWN0LmVudHJpZXMobWFwKVxuICAubWFwKChbaywgdl0pID0+IHtcbiAgICBjb25zdCB3cmFwcGVkS2V5ID0gd3JhcElkZW50aWZpZXJJblF1b3Rlc0lmTmVlZGVkKGspO1xuXG4gICAgcmV0dXJuIGAke3dyYXBwZWRLZXl9ID0gJHtyZW5kZXJNYXBWYWx1ZSh2KX1gO1xuICB9KVxuICAuam9pbihcIlxcblwiKX1cbn1gO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJNYXBWYWx1ZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiByZW5kZXJTdHJpbmcodmFsdWUpO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHJlbmRlckxpc3RWYWx1ZSh2YWx1ZSwgXCJ1bmtub3duU3RvcmFnZUNsYXNzXCIpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICB9XG4gICAgcmV0dXJuIHJlbmRlck1hcCh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gYCR7dmFsdWV9YDtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyUmVzb3VyY2UocmVzb3VyY2U6IGFueSkge1xuICBjb25zdCByZXNvdXJjZVR5cGUgPSBPYmplY3Qua2V5cyhyZXNvdXJjZSlbMF07XG4gIGNvbnN0IHJlc291cmNlc1dpdGhUeXBlID0gcmVzb3VyY2VbcmVzb3VyY2VUeXBlXTtcbiAgY29uc3QgcmVzb3VyY2VOYW1lID0gT2JqZWN0LmtleXMocmVzb3VyY2VzV2l0aFR5cGUpWzBdO1xuICBjb25zdCByZXNvdXJjZUF0dHJpYnV0ZXMgPSByZXNvdXJjZXNXaXRoVHlwZVtyZXNvdXJjZU5hbWVdO1xuXG4gIGlmIChyZXNvdXJjZUF0dHJpYnV0ZXMuY29ubmVjdGlvbikge1xuICAgIHJlc291cmNlQXR0cmlidXRlcy5jb25uZWN0aW9uID0ge1xuICAgICAgdmFsdWU6IHJlc291cmNlQXR0cmlidXRlcy5jb25uZWN0aW9uLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgeyBwcm92aXNpb25lciwgZHluYW1pYywgLi4ub3RoZXJBdHRycyB9ID0gcmVzb3VyY2VBdHRyaWJ1dGVzO1xuXG4gIGNvbnN0IGhjbCA9IFtgcmVzb3VyY2UgXCIke3Jlc291cmNlVHlwZX1cIiBcIiR7cmVzb3VyY2VOYW1lfVwiIHtgXTtcblxuICBjb25zdCBhdHRycyA9IHJlbmRlckF0dHJpYnV0ZXMob3RoZXJBdHRycyk7XG5cbiAgaWYgKGF0dHJzKSBoY2wucHVzaChhdHRycyk7XG4gIGlmIChwcm92aXNpb25lcikgaGNsLnB1c2gocmVuZGVyUHJvdmlzaW9uZXJCbG9jayhwcm92aXNpb25lcikpO1xuICBpZiAoZHluYW1pYykgaGNsLnB1c2goLi4ucmVuZGVyRHluYW1pY0Jsb2NrcyhkeW5hbWljKSk7XG5cbiAgaGNsLnB1c2goXCJ9XCIpO1xuXG4gIHJldHVybiB7XG4gICAgaGNsOiBoY2wuam9pbihcIlxcblwiKSxcbiAgICBtZXRhZGF0YToge1xuICAgICAgcmVzb3VyY2U6IHtcbiAgICAgICAgW3Jlc291cmNlVHlwZV06IHtcbiAgICAgICAgICBbcmVzb3VyY2VOYW1lXToge1xuICAgICAgICAgICAgXCIvL1wiOiByZXNvdXJjZUF0dHJpYnV0ZXNbXCIvL1wiXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJEYXRhc291cmNlKGRhdGFTb3VyY2U6IGFueSkge1xuICBjb25zdCBkYXRhU291cmNlVHlwZSA9IE9iamVjdC5rZXlzKGRhdGFTb3VyY2UpWzBdO1xuICBjb25zdCBkYXRhU291cmNlc1dpdGhUeXBlID0gZGF0YVNvdXJjZVtkYXRhU291cmNlVHlwZV07XG4gIGNvbnN0IGRhdGFTb3VyY2VOYW1lID0gT2JqZWN0LmtleXMoZGF0YVNvdXJjZXNXaXRoVHlwZSlbMF07XG4gIGNvbnN0IGRhdGFTb3VyY2VBdHRyaWJ1dGVzID0gZGF0YVNvdXJjZXNXaXRoVHlwZVtkYXRhU291cmNlTmFtZV07XG5cbiAgY29uc3QgeyBkeW5hbWljLCAuLi5vdGhlckF0dHJzIH0gPSBkYXRhU291cmNlQXR0cmlidXRlcztcblxuICBjb25zdCBoY2wgPSBbYGRhdGEgXCIke2RhdGFTb3VyY2VUeXBlfVwiIFwiJHtkYXRhU291cmNlTmFtZX1cIiB7YF07XG5cbiAgY29uc3QgYXR0cnMgPSByZW5kZXJBdHRyaWJ1dGVzKG90aGVyQXR0cnMpO1xuICBpZiAoYXR0cnMpIGhjbC5wdXNoKGF0dHJzKTtcbiAgaWYgKGR5bmFtaWMpIGhjbC5wdXNoKC4uLnJlbmRlckR5bmFtaWNCbG9ja3MoZHluYW1pYykpO1xuICBoY2wucHVzaChcIn1cIik7XG5cbiAgcmV0dXJuIHtcbiAgICBoY2w6IGhjbC5qb2luKFwiXFxuXCIpLFxuICAgIG1ldGFkYXRhOiB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIFtkYXRhU291cmNlVHlwZV06IHtcbiAgICAgICAgICBbZGF0YVNvdXJjZU5hbWVdOiB7XG4gICAgICAgICAgICBcIi8vXCI6IGRhdGFTb3VyY2VBdHRyaWJ1dGVzW1wiLy9cIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRXBoZW1lcmFsKGVwaGVtZXJhbDogYW55KSB7XG4gIGNvbnN0IGVwaGVtZXJhbFR5cGUgPSBPYmplY3Qua2V5cyhlcGhlbWVyYWwpWzBdO1xuICBjb25zdCBlcGhlbWVyYWxzV2l0aFR5cGUgPSBlcGhlbWVyYWxbZXBoZW1lcmFsVHlwZV07XG4gIGNvbnN0IGVwaGVtZXJhbE5hbWUgPSBPYmplY3Qua2V5cyhlcGhlbWVyYWxzV2l0aFR5cGUpWzBdO1xuICBjb25zdCBlcGhlbWVyYWxBdHRyaWJ1dGVzID0gZXBoZW1lcmFsc1dpdGhUeXBlW2VwaGVtZXJhbE5hbWVdO1xuXG4gIGNvbnN0IHsgZHluYW1pYywgLi4ub3RoZXJBdHRycyB9ID0gZXBoZW1lcmFsQXR0cmlidXRlcztcblxuICBjb25zdCBoY2wgPSBbYGVwaGVtZXJhbCBcIiR7ZXBoZW1lcmFsVHlwZX1cIiBcIiR7ZXBoZW1lcmFsTmFtZX1cIiB7YF07XG5cbiAgY29uc3QgYXR0cnMgPSByZW5kZXJBdHRyaWJ1dGVzKG90aGVyQXR0cnMpO1xuICBpZiAoYXR0cnMpIGhjbC5wdXNoKGF0dHJzKTtcbiAgaWYgKGR5bmFtaWMpIGhjbC5wdXNoKC4uLnJlbmRlckR5bmFtaWNCbG9ja3MoZHluYW1pYykpO1xuICBoY2wucHVzaChcIn1cIik7XG5cbiAgcmV0dXJuIHtcbiAgICBoY2w6IGhjbC5qb2luKFwiXFxuXCIpLFxuICAgIG1ldGFkYXRhOiB7XG4gICAgICBlcGhlbWVyYWw6IHtcbiAgICAgICAgW2VwaGVtZXJhbFR5cGVdOiB7XG4gICAgICAgICAgW2VwaGVtZXJhbE5hbWVdOiB7XG4gICAgICAgICAgICBcIi8vXCI6IGVwaGVtZXJhbEF0dHJpYnV0ZXNbXCIvL1wiXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJQcm92aXNpb25lckJsb2NrKHByb3Zpc2lvbmVyczogYW55KSB7XG4gIHJldHVybiBwcm92aXNpb25lcnNcbiAgICAubWFwKChwcm92aXNpb25lcjogYW55KSA9PiB7XG4gICAgICBjb25zdCBwcm92aXNpb25lclR5cGUgPSBPYmplY3Qua2V5cyhwcm92aXNpb25lcilbMF07XG4gICAgICBjb25zdCBwcm92aXNpb25lckF0dHJzID0gcHJvdmlzaW9uZXJbcHJvdmlzaW9uZXJUeXBlXTtcblxuICAgICAgaWYgKHByb3Zpc2lvbmVyQXR0cnMuY29ubmVjdGlvbikge1xuICAgICAgICBwcm92aXNpb25lckF0dHJzLmNvbm5lY3Rpb24gPSB7XG4gICAgICAgICAgdmFsdWU6IHByb3Zpc2lvbmVyQXR0cnMuY29ubmVjdGlvbixcbiAgICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGR5bmFtaWMsIC4uLm90aGVyQXR0cnMgfSA9IHByb3Zpc2lvbmVyQXR0cnM7XG5cbiAgICAgIGNvbnN0IGhjbCA9IFtgcHJvdmlzaW9uZXIgXCIke3Byb3Zpc2lvbmVyVHlwZX1cIiB7YF07XG5cbiAgICAgIGNvbnN0IGF0dHJzID0gcmVuZGVyQXR0cmlidXRlcyhvdGhlckF0dHJzLnZhbHVlIHx8IG90aGVyQXR0cnMpO1xuICAgICAgaWYgKGF0dHJzKSBoY2wucHVzaChhdHRycyk7XG4gICAgICBpZiAoZHluYW1pYykgaGNsLnB1c2goLi4ucmVuZGVyRHluYW1pY0Jsb2NrcyhkeW5hbWljKSk7XG4gICAgICBoY2wucHVzaChcIn1cIik7XG5cbiAgICAgIHJldHVybiBoY2wuam9pbihcIlxcblwiKTtcbiAgICB9KVxuICAgIC5qb2luKFwiXFxuXFxuXCIpO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJEeW5hbWljQmxvY2tzKGR5bmFtaWM6IGFueSkge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZHluYW1pYykubWFwKFxuICAgIChbZHluYW1pY05hbWUsIGR5bmFtaWNBdHRyc106IFtzdHJpbmcsIGFueV0pID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IFtgZHluYW1pYyBcIiR7ZHluYW1pY05hbWV9XCIge2BdO1xuICAgICAgcmVzLnB1c2goXG4gICAgICAgIGBmb3JfZWFjaCA9ICR7cmVuZGVyRnV6enlKc29uRXhwcmVzc2lvbihkeW5hbWljQXR0cnM/LmZvcl9lYWNoKX1gLFxuICAgICAgKTtcbiAgICAgIGlmIChkeW5hbWljQXR0cnM/Lml0ZXJhdG9yKSB7XG4gICAgICAgIHJlcy5wdXNoKGBpdGVyYXRvciA9ICR7ZHluYW1pY0F0dHJzPy5pdGVyYXRvcn1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChkeW5hbWljQXR0cnM/LmxhYmVscykge1xuICAgICAgICByZXMucHVzaChgbGFiZWxzID0gJHtyZW5kZXJGdXp6eUpzb25FeHByZXNzaW9uKGR5bmFtaWNBdHRycz8ubGFiZWxzKX1gKTtcbiAgICAgIH1cbiAgICAgIHJlcy5wdXNoKGBjb250ZW50IHtcbiAgJHtyZW5kZXJBdHRyaWJ1dGVzKGR5bmFtaWNBdHRycy5jb250ZW50KX1cbiAgfWApO1xuICAgICAgcmVzLnB1c2goYH1gKTtcblxuICAgICAgcmV0dXJuIHJlcy5qb2luKFwiXFxuXCIpO1xuICAgIH0sXG4gICk7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclByb3ZpZGVyKHByb3ZpZGVyOiBhbnkpIHtcbiAgY29uc3QgcHJvdmlkZXJOYW1lID0gT2JqZWN0LmtleXMocHJvdmlkZXIpWzBdO1xuICBjb25zdCBwcm92aWRlckF0dHJpYnV0ZXMgPSBwcm92aWRlcltwcm92aWRlck5hbWVdO1xuXG4gIHJldHVybiBwcm92aWRlckF0dHJpYnV0ZXNcbiAgICAubWFwKChwcm92aWRlckluc3RhbmNlOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHsgZHluYW1pYywgLi4ub3RoZXJBdHRycyB9ID0gcHJvdmlkZXJJbnN0YW5jZTtcblxuICAgICAgY29uc3QgaGNsID0gW2Bwcm92aWRlciBcIiR7cHJvdmlkZXJOYW1lfVwiIHtgXTtcblxuICAgICAgY29uc3QgYXR0cnMgPSByZW5kZXJBdHRyaWJ1dGVzKG90aGVyQXR0cnMpO1xuICAgICAgaWYgKGF0dHJzKSBoY2wucHVzaChhdHRycyk7XG4gICAgICBpZiAoZHluYW1pYykgaGNsLnB1c2goLi4ucmVuZGVyRHluYW1pY0Jsb2NrcyhkeW5hbWljKSk7XG5cbiAgICAgIGhjbC5wdXNoKFwifVwiKTtcblxuICAgICAgcmV0dXJuIGhjbC5qb2luKFwiXFxuXCIpO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcXG5cXG5cIik7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1vZHVsZShtb2R1bGU6IGFueSkge1xuICBjb25zdCBtb2R1bGVOYW1lID0gT2JqZWN0LmtleXMobW9kdWxlKVswXTtcbiAgY29uc3QgbW9kdWxlQXR0cmlidXRlcyA9IG1vZHVsZVttb2R1bGVOYW1lXTtcblxuICByZXR1cm4ge1xuICAgIGhjbDogYG1vZHVsZSBcIiR7bW9kdWxlTmFtZX1cIiB7XG4ke3JlbmRlckF0dHJpYnV0ZXMobW9kdWxlQXR0cmlidXRlcyl9XG59YCxcbiAgICBtZXRhZGF0YToge1xuICAgICAgbW9kdWxlOiB7XG4gICAgICAgIFttb2R1bGVOYW1lXToge1xuICAgICAgICAgIFwiLy9cIjogbW9kdWxlQXR0cmlidXRlc1tcIi8vXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJPdXRwdXQob3V0cHV0OiBhbnkpIHtcbiAgY29uc3Qgb3V0cHV0TmFtZSA9IE9iamVjdC5rZXlzKG91dHB1dClbMF07XG4gIGNvbnN0IG91dHB1dEF0dHJpYnV0ZXMgPSBvdXRwdXRbb3V0cHV0TmFtZV07XG5cbiAgcmV0dXJuIGBvdXRwdXQgXCIke291dHB1dE5hbWV9XCIge1xuJHtyZW5kZXJBdHRyaWJ1dGVzKG91dHB1dEF0dHJpYnV0ZXMpfVxufWA7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckxvY2Fscyhsb2NhbHM6IGFueSkge1xuICBpZiAoIWxvY2Fscykge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgY29uc3QgbG9jYWxOYW1lcyA9IE9iamVjdC5rZXlzKGxvY2Fscyk7XG5cbiAgaWYgKGxvY2FsTmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICByZXR1cm4gYGxvY2FscyB7XG4gICAgJHtsb2NhbE5hbWVzXG4gICAgICAuZmlsdGVyKChuYW1lKSA9PiAhIWxvY2Fsc1tuYW1lXS52YWx1ZSlcbiAgICAgIC5tYXAoKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlbmRlckZ1enp5SnNvbkV4cHJlc3Npb24obG9jYWxzW25hbWVdLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9ID0gJHt2YWx1ZX1gO1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiXFxuXCIpfVxufWA7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclZhcmlhYmxlKHZhcmlhYmxlOiBhbnkpIHtcbiAgY29uc3QgdmFyaWFibGVOYW1lID0gT2JqZWN0LmtleXModmFyaWFibGUpWzBdO1xuICBjb25zdCB2YXJpYWJsZUF0dHJpYnV0ZXMgPSB2YXJpYWJsZVt2YXJpYWJsZU5hbWVdO1xuXG4gIHJldHVybiBgdmFyaWFibGUgXCIke3ZhcmlhYmxlTmFtZX1cIiB7XG4ke3JlbmRlckF0dHJpYnV0ZXModmFyaWFibGVBdHRyaWJ1dGVzKX1cbn1gO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJNb3ZlZChtb3ZlOiBhbnkpIHtcbiAgY29uc3QgbW92ZWRCbG9ja3MgPSBtb3ZlLm1hcCgobW92ZUJsb2NrOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYG1vdmVkIHtcbiR7cmVuZGVyQXR0cmlidXRlcyhtb3ZlQmxvY2spfVxufWA7XG4gIH0pO1xuXG4gIHJldHVybiBtb3ZlZEJsb2Nrcy5qb2luKFwiXFxuXCIpO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJJbXBvcnQoaW1wb3J0czogYW55KSB7XG4gIGNvbnN0IGltcG9ydEJsb2NrcyA9IGltcG9ydHMubWFwKChpbXBvcnRCbG9jazogYW55KSA9PiB7XG4gICAgcmV0dXJuIGBpbXBvcnQge1xuJHtyZW5kZXJBdHRyaWJ1dGVzKGltcG9ydEJsb2NrKX1cbn1gO1xuICB9KTtcblxuICByZXR1cm4gaW1wb3J0QmxvY2tzLmpvaW4oXCJcXG5cIik7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRlcnJhZm9ybSh0ZXJyYWZvcm06IGFueSkge1xuICBjb25zdCBibG9ja0F0dHJpYnV0ZXMgPSBbXCJyZXF1aXJlZF9wcm92aWRlcnNcIiwgXCJiYWNrZW5kXCIsIFwiY2xvdWRcIl07XG4gIGNvbnN0IHJlcXVpcmVkUHJvdmlkZXJzID0gYHJlcXVpcmVkX3Byb3ZpZGVycyB7XG4ke3JlbmRlclNpbXBsZUF0dHJpYnV0ZXModGVycmFmb3JtLnJlcXVpcmVkX3Byb3ZpZGVycyl9XG59YDtcblxuICBjb25zdCBiYWNrZW5kcyA9IE9iamVjdC5rZXlzKHRlcnJhZm9ybS5iYWNrZW5kIHx8IHt9KS5tYXAoKGJhY2tlbmROYW1lKSA9PiB7XG4gICAgcmV0dXJuIGBiYWNrZW5kIFwiJHtiYWNrZW5kTmFtZX1cIiB7XG4ke3JlbmRlckF0dHJpYnV0ZXModGVycmFmb3JtLmJhY2tlbmRbYmFja2VuZE5hbWVdKX1cbn1gO1xuICB9KTtcblxuICBjb25zdCBjbG91ZEJhY2tlbmQgPSB0ZXJyYWZvcm0uY2xvdWRcbiAgICA/IGBjbG91ZCB7XG4ke3JlbmRlckF0dHJpYnV0ZXModGVycmFmb3JtLmNsb3VkKX1cbn1gXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgb3RoZXJBdHRyaWJ1dGVzID0gT2JqZWN0LmtleXModGVycmFmb3JtKS5maWx0ZXIoXG4gICAgKGtleSkgPT4gIWJsb2NrQXR0cmlidXRlcy5pbmNsdWRlcyhrZXkpLFxuICApO1xuICByZXR1cm4gYHRlcnJhZm9ybSB7XG4ke3JlcXVpcmVkUHJvdmlkZXJzfVxuJHtbLi4uYmFja2VuZHMsIGNsb3VkQmFja2VuZF0uam9pbihcIlxcblwiKX1cbiR7cmVuZGVyU2ltcGxlQXR0cmlidXRlcyhvdGhlckF0dHJpYnV0ZXMpfVxufWA7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckJsb2NrKGJsb2NrOiBhbnksIF9zdG9yYWdlQ2xhc3NUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHtcbiR7cmVuZGVyQXR0cmlidXRlcyhibG9jayl9XG59YDtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiByZW5kZXJGdXp6eUpzb25PYmplY3QoanNvbk9iamVjdDogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICBcIntcIixcbiAgICAuLi5PYmplY3QuZW50cmllcyhqc29uT2JqZWN0KS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZWRLZXkgPSB3cmFwSWRlbnRpZmllckluUXVvdGVzSWZOZWVkZWQobmFtZSk7XG4gICAgICByZXR1cm4gYCR7d3JhcHBlZEtleX0gPSAke3JlbmRlckZ1enp5SnNvbkV4cHJlc3Npb24odmFsdWUpfWA7XG4gICAgfSksXG4gICAgXCJ9XCIsXG4gIF0uam9pbihcIlxcblwiKTtcbn1cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gcmVuZGVyRnV6enlKc29uRXhwcmVzc2lvbihqc29uRXhwcmVzc2lvbjogYW55KTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoanNvbkV4cHJlc3Npb24pKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIFwiW1wiLFxuICAgICAgLi4uanNvbkV4cHJlc3Npb24ubWFwKCh2YWx1ZSkgPT4gYCR7cmVuZGVyRnV6enlKc29uRXhwcmVzc2lvbih2YWx1ZSl9LGApLFxuICAgICAgXCJdXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBqc29uRXhwcmVzc2lvbiA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiByZW5kZXJGdXp6eUpzb25PYmplY3QoanNvbkV4cHJlc3Npb24pO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBqc29uRXhwcmVzc2lvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlmIChqc29uRXhwcmVzc2lvbiA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIGBcIlwiYDtcbiAgICB9XG5cbiAgICBpZiAoanNvbkV4cHJlc3Npb24uaW5jbHVkZXMoXCIke1wiKSkge1xuICAgICAgcmV0dXJuIGBcIiR7anNvbkV4cHJlc3Npb259XCJgO1xuICAgIH1cblxuICAgIGlmIChwYXJzZUludChqc29uRXhwcmVzc2lvbiwgMTApLnRvU3RyaW5nKCkgPT09IGpzb25FeHByZXNzaW9uKSB7XG4gICAgICByZXR1cm4ganNvbkV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgaWYgKGpzb25FeHByZXNzaW9uLnN0YXJ0c1dpdGgoXCJbXCIpKSB7XG4gICAgICByZXR1cm4ganNvbkV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgaWYgKGpzb25FeHByZXNzaW9uLnN0YXJ0c1dpdGgoXCJ7XCIpKSB7XG4gICAgICByZXR1cm4ganNvbkV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgaWYgKGpzb25FeHByZXNzaW9uLnN0YXJ0c1dpdGgoJ1wiJykpIHtcbiAgICAgIHJldHVybiBqc29uRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gYFwiJHtlc2NhcGVRdW90ZXMoanNvbkV4cHJlc3Npb24pfVwiYDtcbiAgfVxuXG4gIGlmIChqc29uRXhwcmVzc2lvbiA9PT0gXCJ0cnVlXCIgfHwganNvbkV4cHJlc3Npb24gPT09IFwiZmFsc2VcIikge1xuICAgIHJldHVybiBqc29uRXhwcmVzc2lvbiBhcyBzdHJpbmc7XG4gIH1cblxuICBpZiAoanNvbkV4cHJlc3Npb24gPT09IFwibnVsbFwiKSB7XG4gICAgcmV0dXJuIGpzb25FeHByZXNzaW9uO1xuICB9XG5cbiAgcmV0dXJuIGAke2pzb25FeHByZXNzaW9ufWA7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclNpbXBsZUF0dHJpYnV0ZXMoYXR0cmlidXRlczogYW55KTogc3RyaW5nIHtcbiAgaWYgKGF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpXG4gICAgLm1hcChcbiAgICAgIChbbmFtZSwgdmFsdWVdKSA9PlxuICAgICAgICBgICAke25hbWV9ID0gJHtyZW5kZXJGdXp6eUpzb25FeHByZXNzaW9uKHZhbHVlIGFzIGFueSl9YCxcbiAgICApXG4gICAgLmpvaW4oXCJcXG5cIik7XG59XG4vKipcbiAqIERldGVjdHMgYSByZXNvbHZlZC1idXQtZW1wdGllZCBhdHRyaWJ1dGUgZGVzY3JpcHRvcjogYW4gb2JqZWN0IHNoYXBlZCBsaWtlXG4gKiB3aGF0IGBBdHRyaWJ1dGVzRW1pdHRlciNlbWl0VG9IY2xUZXJyYWZvcm1gIGFsd2F5cyBlbWl0cyBmb3IgSENMIHN5bnRoZXNpc1xuICogLSBgeyB2YWx1ZSwgaXNCbG9jaywgdHlwZSwgc3RvcmFnZUNsYXNzVHlwZSB9YCAtIHRoYXQgaGFzIGxvc3QgaXRzIGB2YWx1ZWBcbiAqIGtleS5cbiAqXG4gKiBUaGUgb25seSB3YXkgYSBkZXNjcmlwdG9yIGxvc2VzIGB2YWx1ZWAgaGVyZSBpcyB0aGF0IGl0IHJlc29sdmVkIHRvXG4gKiBgdW5kZWZpbmVkYDogYHJlc29sdmUoKWAgKHNlZSBgdG9rZW5zL3ByaXZhdGUvcmVzb2x2ZS50c2ApIGRlZXAtcmVzb2x2ZXNcbiAqIGV2ZXJ5IGtleSBvZiBhIHBsYWluIG9iamVjdCBhbmQgc2lsZW50bHkgZHJvcHMgYW55IGtleSB3aG9zZSByZXNvbHZlZFxuICogdmFsdWUgaXMgYHVuZGVmaW5lZGAsIGJ1dCBvbmx5IGB2YWx1ZWAgY2FuIGV2ZXIgZG8gdGhhdCAtIGBpc0Jsb2NrYCxcbiAqIGB0eXBlYCwgYW5kIGBzdG9yYWdlQ2xhc3NUeXBlYCBhcmUgZW1pdHRlZCBhcyBsaXRlcmFsIHN0cmluZ3MvYm9vbGVhbnMgYnlcbiAqIHRoZSBnZW5lcmF0b3IsIG5ldmVyIGFzIHRva2Vucy4gU28gYW4gb2JqZWN0IGNhcnJ5aW5nIGV4YWN0bHkgdGhpc1xuICogbWV0YWRhdGEgY29tYmluYXRpb24sIHdpdGggYHZhbHVlYCBhbmQgYGR5bmFtaWNgIGJvdGggYWJzZW50LCBpcyBhbHdheXNcbiAqIHRoZSBsZWZ0b3ZlciBzaGVsbCBvZiBhIGRlc2NyaXB0b3Igd2hvc2UgdmFsdWUgdmFuaXNoZWQsIG5ldmVyIGEgZ2VudWluZVxuICogdXNlci1zdXBwbGllZCBtYXAgKHRob3NlIGRvbid0IGhhcHBlbiB0byBhbHNvIGNhcnJ5IGBpc0Jsb2NrYCArXG4gKiBgc3RvcmFnZUNsYXNzVHlwZWApLlxuICpcbiAqIFRoaXMgaXMgaW50ZW50aW9uYWxseSBub3Qgc3BlY2lmaWMgdG8gd3JpdGUtb25seSBhdHRyaWJ1dGVzOiBhIHdyaXRlLW9ubHlcbiAqIGF0dHJpYnV0ZSB3cmFwcGVkIGJ5IGBtYXJrV3JpdGVPbmx5QXR0cmlidXRlKClgIGFyb3VuZCBhIGBMYXp5YC90b2tlblxuICogcHJvZHVjZXIgdGhhdCByZXNvbHZlcyB0byBgdW5kZWZpbmVkYCBpcyBzaW1wbHkgb25lIGV4YW1wbGUgKGl0IHN1cnZpdmVzXG4gKiB0aGUgZ2VuZXJhdGVkIFwicmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXCIgcHJlLWZpbHRlciBpblxuICogYHN5bnRoZXNpemVIY2xBdHRyaWJ1dGVzKClgIGJlY2F1c2UgdGhhdCBmaWx0ZXIgb25seSBzZWVzIHRoZSBzdGlsbC1cbiAqIHVucmVzb2x2ZWQgdG9rZW4sIG5vdCB3aGF0IGl0IGxhdGVyIHJlc29sdmVzIHRvKSAtIGJ1dCBBTlkgYXR0cmlidXRlXG4gKiBkZXNjcmlwdG9yIHdob3NlIHRva2VuIHJlc29sdmVzIHRvIGB1bmRlZmluZWRgIGluIEhDTCBtb2RlIGhpdHMgdGhpcyBzYW1lXG4gKiBwYXRoIChzZWUgdGhlICMzMTMgSENMLWRlZmVjdHMgZmFtaWx5KS5cbiAqL1xuZnVuY3Rpb24gaXNPcnBoYW5lZEF0dHJpYnV0ZURlc2NyaXB0b3IodjogdW5rbm93bik6IHYgaXMgUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGlmICh0eXBlb2YgdiAhPT0gXCJvYmplY3RcIiB8fCB2ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGhhc093biA9IChrZXk6IHN0cmluZykgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHYsIGtleSk7XG4gIHJldHVybiAoXG4gICAgIWhhc093bihcInZhbHVlXCIpICYmXG4gICAgIWhhc093bihcImR5bmFtaWNcIikgJiZcbiAgICBoYXNPd24oXCJpc0Jsb2NrXCIpICYmXG4gICAgaGFzT3duKFwidHlwZVwiKSAmJlxuICAgIGhhc093bihcInN0b3JhZ2VDbGFzc1R5cGVcIilcbiAgKTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQXR0cmlidXRlcyhhdHRyaWJ1dGVzOiBhbnkpOiBzdHJpbmcge1xuICBpZiAoYXR0cmlidXRlcyA9PT0gdW5kZWZpbmVkIHx8IGF0dHJpYnV0ZXMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcylcbiAgICAubWFwKChbbmFtZSwgdl0pID0+IHtcbiAgICAgIGlmIChuYW1lID09PSBcIi8vXCIpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1ldGFCbG9ja3MgPSBbXCJsaWZlY3ljbGVcIiwgXCJwcm92aXNpb25lclwiXTtcblxuICAgICAgLy9cbiAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgc29tZSBhdHRyaWJ1dGVzIHRoYXQgZG9uJ3QgaGF2ZSB0eXBlIGluZm9ybWF0aW9uXG4gICAgICAvLyBqdXN0IHRyeSB0byBndWVzcyB0aGVtXG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9ID0gJHtyZW5kZXJGdXp6eUpzb25FeHByZXNzaW9uKHYpfWA7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0gPSAke3Z9YDtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0gPSAke3JlbmRlckZ1enp5SnNvbkV4cHJlc3Npb24odil9YDtcbiAgICAgIH0gZWxzZSBpZiAodiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0gPSBudWxsYDtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgIXYuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKSAmJlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgICF2Lmhhc093blByb3BlcnR5KFwiZHluYW1pY1wiKVxuICAgICAgKSB7XG4gICAgICAgIC8vIEFuIG9ycGhhbmVkIGF0dHJpYnV0ZSBkZXNjcmlwdG9yIChpdHMgJ3ZhbHVlJyByZXNvbHZlZCB0b1xuICAgICAgICAvLyBgdW5kZWZpbmVkYCkgY2FycmllcyBvbmx5IGludGVybmFsIG1ldGFkYXRhIGF0IHRoaXMgcG9pbnQgLSBvbWl0XG4gICAgICAgIC8vIHRoZSBhdHRyaWJ1dGUgZW50aXJlbHksIGV4YWN0bHkgYXMgaWYgaXQgaGFkIG5ldmVyIGJlZW4gc2V0LFxuICAgICAgICAvLyBpbnN0ZWFkIG9mIGxlYWtpbmcgdGhhdCBtZXRhZGF0YSBpbnRvIHRoZSBIQ0wgb3V0cHV0IHZpYVxuICAgICAgICAvLyByZW5kZXJGdXp6eUpzb25FeHByZXNzaW9uKCkuIFNlZSBpc09ycGhhbmVkQXR0cmlidXRlRGVzY3JpcHRvcigpLlxuICAgICAgICBpZiAoaXNPcnBoYW5lZEF0dHJpYnV0ZURlc2NyaXB0b3IodikpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhQmxvY2tzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGAke25hbWV9IHtcbiR7cmVuZGVyU2ltcGxlQXR0cmlidXRlcyh2KX1cbn1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtuYW1lfSA9ICR7cmVuZGVyRnV6enlKc29uRXhwcmVzc2lvbih2KX1gO1xuICAgICAgfSBlbHNlIGlmICh2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gUmVmZXJlbmNpbmcgYm90aCBpc0Jsb2NrIGFuZCBpc19ibG9jaywgYmVjYXVzZSBzb21ldGltZXMgd2UgcGFzcyB0aHJvdWdoIGEgc25ha2UgY2FzZSBmaWx0ZXJcbiAgICAgIC8vIHdpdGhpbiBhdHRyaWJ1dGVzLlxuICAgICAgY29uc3Qge1xuICAgICAgICBkeW5hbWljLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgaXNCbG9jayxcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZSxcbiAgICAgICAgaXNfYmxvY2ssXG4gICAgICAgIHN0b3JhZ2VfY2xhc3NfdHlwZSxcbiAgICAgIH0gPSB2IGFzIGFueTtcbiAgICAgIGNvbnN0IGJsb2NrID0gaXNCbG9jayB8fCBpc19ibG9jayB8fCBtZXRhQmxvY2tzLmluY2x1ZGVzKG5hbWUpO1xuICAgICAgY29uc3QgY2xhc3NUeXBlID0gc3RvcmFnZUNsYXNzVHlwZSB8fCBzdG9yYWdlX2NsYXNzX3R5cGU7XG5cbiAgICAgIGlmIChkeW5hbWljKSB7XG4gICAgICAgIHJldHVybiByZW5kZXJEeW5hbWljQmxvY2tzKHtcbiAgICAgICAgICBbbmFtZV06IGR5bmFtaWMudmFsdWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gU2hvcnQgY2lyY3VpdCB0eXBlIGNoZWNraW5nIGlmIHZhbHVlIGlzIGFuIGV4cHJlc3Npb25cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUuaW5jbHVkZXMoXCIke1wiKSkge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0gPSAke3JlbmRlclN0cmluZyh2YWx1ZSl9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKGJsb2NrICYmIHR5cGUgIT09IFwibGlzdFwiICYmIHR5cGUgIT09IFwic2V0XCIpIHtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9IHtcbiR7cmVuZGVyQXR0cmlidXRlcyh2YWx1ZSl9XG59YDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09PSBcImxpc3RcIiB8fCB0eXBlID09PSBcInNldFwiKSB7XG4gICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgIHJldHVybiByZW5kZXJMaXN0KHYsIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtuYW1lfSA9ICR7cmVuZGVyTGlzdCh2KX1gO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09IFwibWFwXCIpIHtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9ID0gJHtyZW5kZXJNYXAodmFsdWUpfWA7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSBcInNpbXBsZVwiKSB7XG4gICAgICAgIGlmIChjbGFzc1R5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYCR7bmFtZX0gPSAke3JlbmRlclN0cmluZyh2YWx1ZSl9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xhc3NUeXBlID09PSBcIm51bWJlclwiIHx8IGNsYXNzVHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICByZXR1cm4gYCR7bmFtZX0gPSAke3ZhbHVlfWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3Qgc3VyZSB3aHkgd2UncmUgaGVyZSwgYnV0IHRoZXJlJ3MgZWl0aGVyIGEgYnVnIGluIHRoZSBwcm92aWRlclxuICAgICAgICAvLyBvciB3ZSBoYXZlIHNraXBwZWQgdGhlIGF0dHJpYnV0ZSB0byByZWR1Y2UgdGhlIHNpemUgb2Ygb3VyIHByb3ZpZGVyXG4gICAgICAgIC8vIEluIGVpdGhlciBjYXNlLCB3ZSBzaG91bGQgdHJ5IHRvIG5vdCBvdXRwdXQgW29iamVjdCBPYmplY3RdIGhlcmVcbiAgICAgICAgLy8gYW5kIHRyeSBhIGJlc3QgYXBwcm94aW1hdGlvbi4gVGhvdWdoLCBpdCB3b3VsZCBub3Qgd29yayBmb3JcbiAgICAgICAgLy8gYmxvY2tzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICByZXR1cm4gYFxuIyBXYXJuaW5nOiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZSBpcyBvZiBhbiB1bmV4cGVjdGVkIHR5cGUuIEVpdGhlciB0aGVyZSdzIGEgcHJvYmxlbSB3aXRoIHRoZSBwcm92aWRlclxuIyBvciBDREtUTiBoYXMgY2hvc2VuIHRvIHNraXAgZ2VuZXJhdGluZyBhIGRldGFpbGVkIHR5cGUgZm9yIHRoaXMgYmVjYXVzZSBpdCBpbmNyZWFzZXMgdGhlIHNpemUgb2YgdGhlIHByb3ZpZGVyIGxpYnJhcnkgc2lnbmlmaWNhbnRseS4gXG4jIFBsZWFzZSBjaGVjayBpZiB0aGlzIHJlc291cmNlIGlzIGluY2x1ZGVkIGluIG91ciBza2lwIGxpc3Q6IFxuIyBodHRwczovL2dpdGh1Yi5jb20vaGFzaGljb3JwL3RlcnJhZm9ybS1jZGsvYmxvYi8xZmI4NTg4MDk1YTU1ZDQ3NWRjNGJlMjg4ODJlYzRmNDIwMDZlYzhkL3BhY2thZ2VzLyU0MGNka3RmL3Byb3ZpZGVyLWdlbmVyYXRvci9saWIvZ2V0L2dlbmVyYXRvci9za2lwcGVkLWF0dHJpYnV0ZXMudHNcbiMgYW5kIGlmIG5vdCwgcGxlYXNlIGNoZWNrIHdpdGggdGhlIHByb3ZpZGVyIGF1dGhvcnMgdG8gc2VlIGlmIHRoZSBwcm92aWRlciBzY2hlbWEgaXMgYWNjdXJhdGUuXG4jIFxuIyBXZSB1bmRlcnN0YW5kIHRoaXMgaXMgbm90IGlkZWFsLCBzbyB3ZSBzdWdnZXN0IHVzaW5nIEpTT04gc3ludGhlc2lzIGluc3RlYWQgb2YgSENMIHN5bnRoZXNpcyBmb3IgdGhpcyBwYXJ0aWN1bGFyIGNhc2UuXG5cbiR7bmFtZX0gPSAke3JlbmRlckZ1enp5SnNvbkV4cHJlc3Npb24odmFsdWUpfVxuYDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gXCJhbnlcIikge1xuICAgICAgICByZXR1cm4gYCR7bmFtZX0gPSAke3JlbmRlckZ1enp5SnNvbkV4cHJlc3Npb24odmFsdWUpfWA7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSBcInJlZmVyZW5jZVwiKSB7XG4gICAgICAgIHJldHVybiBgJHtuYW1lfSA9ICR7dmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGAke25hbWV9ID0gJHt2YWx1ZX1gO1xuICAgIH0pXG4gICAgLmZpbHRlcigodikgPT4gdiAhPT0gdW5kZWZpbmVkKVxuICAgIC5qb2luKFwiXFxuXCIpO1xufVxuIl19
@@ -10,7 +10,7 @@ const fs_1 = require("./private/fs");
10
10
  * directories (with everything inside them).
11
11
  */
12
12
  class ExcludeIgnoreStrategy {
13
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ExcludeIgnoreStrategy", version: "0.26.0-pre.2" };
13
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ExcludeIgnoreStrategy", version: "0.26.0-pre.20" };
14
14
  matcher;
15
15
  cacheKey;
16
16
  // Undefined (the interface default) prunes excluded directories, which is
@@ -9,7 +9,7 @@ const target_versions_1 = require("./validations/target-versions");
9
9
  */
10
10
  class ImportableResource extends terraform_element_1.TerraformElement {
11
11
  config;
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ImportableResource", version: "0.26.0-pre.2" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ImportableResource", version: "0.26.0-pre.20" };
13
13
  constructor(scope, name, config) {
14
14
  super(scope, name, config.terraformResourceType);
15
15
  this.config = config;
package/lib/manifest.js CHANGED
@@ -48,7 +48,7 @@ class Manifest {
48
48
  version;
49
49
  outdir;
50
50
  hclOutput;
51
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.Manifest", version: "0.26.0-pre.2" };
51
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.Manifest", version: "0.26.0-pre.20" };
52
52
  static fileName = "manifest.json";
53
53
  static stacksFolder = "stacks";
54
54
  static stackMetadataPath = "metadata.json";