@cdktn/provider-generator 0.24.0-pre.9 → 0.24.0-pre.91

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 (124) hide show
  1. package/.spec.swcrc +22 -0
  2. package/LICENSE +355 -0
  3. package/README.md +1 -1
  4. package/build/__tests__/edge-provider-schema/builder.d.ts +9 -3
  5. package/build/__tests__/edge-provider-schema/builder.js +6 -3
  6. package/build/__tests__/edge-provider-schema/cli.js +8 -3
  7. package/build/__tests__/edge-provider-schema/index.js +119 -1
  8. package/build/__tests__/provider.test.js +4 -1
  9. package/build/get/__tests__/generator/ephemeral-resources.test.d.ts +2 -0
  10. package/build/get/__tests__/generator/ephemeral-resources.test.js +49 -0
  11. package/build/get/__tests__/generator/module-generator.test.js +12 -12
  12. package/build/get/__tests__/generator/provider-functions.test.d.ts +2 -0
  13. package/build/get/__tests__/generator/provider-functions.test.js +176 -0
  14. package/build/get/__tests__/generator/provider-source-matching.test.d.ts +2 -0
  15. package/build/get/__tests__/generator/provider-source-matching.test.js +45 -0
  16. package/build/get/__tests__/generator/provider.test.js +9 -1
  17. package/build/get/__tests__/generator/supported-stored-classes.test.d.ts +2 -0
  18. package/build/get/__tests__/generator/supported-stored-classes.test.js +137 -0
  19. package/build/get/__tests__/generator/types.test.js +44 -1
  20. package/build/get/__tests__/generator/write-only.test.d.ts +2 -0
  21. package/build/get/__tests__/generator/write-only.test.js +65 -0
  22. package/build/get/__tests__/target-versions.test.d.ts +2 -0
  23. package/build/get/__tests__/target-versions.test.js +171 -0
  24. package/build/get/constructs-maker.d.ts +8 -1
  25. package/build/get/constructs-maker.js +46 -10
  26. package/build/get/generator/emitter/attributes-emitter.d.ts +13 -2
  27. package/build/get/generator/emitter/attributes-emitter.js +71 -5
  28. package/build/get/generator/emitter/index.d.ts +1 -0
  29. package/build/get/generator/emitter/index.js +2 -1
  30. package/build/get/generator/emitter/provider-functions-emitter.d.ts +11 -0
  31. package/build/get/generator/emitter/provider-functions-emitter.js +94 -0
  32. package/build/get/generator/emitter/resource-emitter.d.ts +5 -1
  33. package/build/get/generator/emitter/resource-emitter.js +83 -7
  34. package/build/get/generator/emitter/struct-emitter.js +10 -10
  35. package/build/get/generator/models/attribute-model.d.ts +4 -0
  36. package/build/get/generator/models/attribute-model.js +50 -4
  37. package/build/get/generator/models/attribute-type-model.d.ts +24 -0
  38. package/build/get/generator/models/attribute-type-model.js +91 -5
  39. package/build/get/generator/models/index.d.ts +1 -0
  40. package/build/get/generator/models/index.js +2 -1
  41. package/build/get/generator/models/provider-function-model.d.ts +102 -0
  42. package/build/get/generator/models/provider-function-model.js +667 -0
  43. package/build/get/generator/models/resource-model.d.ts +3 -0
  44. package/build/get/generator/models/resource-model.js +13 -4
  45. package/build/get/generator/models/struct.d.ts +2 -0
  46. package/build/get/generator/models/struct.js +6 -2
  47. package/build/get/generator/models/supported-stored-classes.d.ts +5 -0
  48. package/build/get/generator/models/supported-stored-classes.js +86 -0
  49. package/build/get/generator/module-generator.js +3 -3
  50. package/build/get/generator/provider-generator.d.ts +2 -0
  51. package/build/get/generator/provider-generator.js +41 -6
  52. package/build/get/generator/resource-parser.js +3 -1
  53. package/jest.config.js +16 -9
  54. package/package.json +28 -27
  55. package/package.sh +1 -1
  56. package/src/__tests__/__snapshots__/edge-provider-schema.test.ts.snap +4 -0
  57. package/src/__tests__/__snapshots__/provider.test.ts.snap +2828 -2828
  58. package/src/__tests__/edge-provider-schema/builder.ts +201 -0
  59. package/src/__tests__/edge-provider-schema/cli.ts +51 -0
  60. package/src/__tests__/edge-provider-schema/index.ts +284 -0
  61. package/src/__tests__/edge-provider-schema.test.ts +24 -0
  62. package/src/__tests__/provider.test.ts +183 -0
  63. package/src/get/__tests__/constructs-maker.test.ts +118 -0
  64. package/src/get/__tests__/generator/__snapshots__/complex-computed-types.test.ts.snap +5 -5
  65. package/src/get/__tests__/generator/__snapshots__/ephemeral-resources.test.ts.snap +524 -0
  66. package/src/get/__tests__/generator/__snapshots__/export-sharding.test.ts.snap +3310 -3310
  67. package/src/get/__tests__/generator/__snapshots__/module-generator.test.ts.snap +355 -355
  68. package/src/get/__tests__/generator/__snapshots__/nested-types.test.ts.snap +8 -8
  69. package/src/get/__tests__/generator/__snapshots__/provider-functions.test.ts.snap +444 -0
  70. package/src/get/__tests__/generator/__snapshots__/provider.test.ts.snap +8 -8
  71. package/src/get/__tests__/generator/__snapshots__/resource-types.test.ts.snap +126 -126
  72. package/src/get/__tests__/generator/__snapshots__/skipped-attributes.test.ts.snap +17 -17
  73. package/src/get/__tests__/generator/__snapshots__/types.test.ts.snap +201 -52
  74. package/src/get/__tests__/generator/__snapshots__/write-only.test.ts.snap +262 -0
  75. package/src/get/__tests__/generator/complex-computed-types.test.ts +28 -0
  76. package/src/get/__tests__/generator/deep-nested-attributes.test.ts +56 -0
  77. package/src/get/__tests__/generator/description-escaping.test.ts +84 -0
  78. package/src/get/__tests__/generator/empty-provider-resources.test.ts +26 -0
  79. package/src/get/__tests__/generator/ephemeral-resources.test.ts +46 -0
  80. package/src/get/__tests__/generator/export-sharding.test.ts +169 -0
  81. package/src/get/__tests__/generator/fixtures/deeply-nested-collections.test.fixture.json +129 -0
  82. package/src/get/__tests__/generator/fixtures/ephemeral-resources.test.fixture.json +160 -0
  83. package/src/get/__tests__/generator/fixtures/provider-functions-collision.test.fixture.json +31 -0
  84. package/src/get/__tests__/generator/fixtures/provider-functions-synthetic.test.fixture.json +192 -0
  85. package/src/get/__tests__/generator/fixtures/provider-functions.test.fixture.json +170 -0
  86. package/src/get/__tests__/generator/fixtures/write-only.test.fixture.json +58 -0
  87. package/src/get/__tests__/generator/import-style.test.ts +129 -0
  88. package/src/get/__tests__/generator/module-generator.test.ts +528 -0
  89. package/src/get/__tests__/generator/nested-types.test.ts +54 -0
  90. package/src/get/__tests__/generator/provider-functions.test.ts +262 -0
  91. package/src/get/__tests__/generator/provider-source-matching.test.ts +84 -0
  92. package/src/get/__tests__/generator/provider.test.ts +59 -0
  93. package/src/get/__tests__/generator/resource-types.test.ts +118 -0
  94. package/src/get/__tests__/generator/skipped-attributes.test.ts +72 -0
  95. package/src/get/__tests__/generator/supported-stored-classes.test.ts +147 -0
  96. package/src/get/__tests__/generator/types.test.ts +686 -0
  97. package/src/get/__tests__/generator/versions-file.test.ts +72 -0
  98. package/src/get/__tests__/generator/write-only.test.ts +71 -0
  99. package/src/get/__tests__/target-versions.test.ts +206 -0
  100. package/src/get/__tests__/util.ts +75 -0
  101. package/src/get/constructs-maker.ts +885 -0
  102. package/src/get/generator/custom-defaults.ts +493 -0
  103. package/src/get/generator/emitter/attributes-emitter.ts +316 -0
  104. package/src/get/generator/emitter/index.ts +6 -0
  105. package/src/get/generator/emitter/provider-functions-emitter.ts +117 -0
  106. package/src/get/generator/emitter/resource-emitter.ts +330 -0
  107. package/src/get/generator/emitter/struct-emitter.ts +683 -0
  108. package/src/get/generator/loop-detection.ts +81 -0
  109. package/src/get/generator/models/attribute-model.ts +273 -0
  110. package/src/get/generator/models/attribute-type-model.ts +560 -0
  111. package/src/get/generator/models/index.ts +8 -0
  112. package/src/get/generator/models/provider-function-model.ts +872 -0
  113. package/src/get/generator/models/resource-model.ts +183 -0
  114. package/src/get/generator/models/scope.ts +54 -0
  115. package/src/get/generator/models/struct.ts +124 -0
  116. package/src/get/generator/models/supported-stored-classes.ts +88 -0
  117. package/src/get/generator/module-generator.ts +234 -0
  118. package/src/get/generator/provider-generator.ts +428 -0
  119. package/src/get/generator/resource-parser.ts +764 -0
  120. package/src/get/generator/sanitized-comments.ts +49 -0
  121. package/src/get/generator/skipped-attributes.ts +27 -0
  122. package/src/index.ts +40 -0
  123. package/src/util.ts +26 -0
  124. package/tsconfig.json +1 -2
@@ -4,30 +4,68 @@ exports.ResourceEmitter = void 0;
4
4
  const attributes_emitter_1 = require("./attributes-emitter");
5
5
  const sanitized_comments_1 = require("../sanitized-comments");
6
6
  class ResourceEmitter {
7
- constructor(code) {
7
+ constructor(code, importExtension) {
8
8
  this.code = code;
9
+ this.importExtension = importExtension;
9
10
  this.attributesEmitter = new attributes_emitter_1.AttributesEmitter(this.code);
10
11
  }
11
12
  emit(resource) {
12
13
  this.code.line();
14
+ if (resource.isProvider && resource.providerFunctionsModel) {
15
+ // Sibling-directory import: providers/<provider>/provider/index.ts
16
+ // (the emitted file) and providers/<provider>/provider-functions/
17
+ // index.ts are siblings under providers/<provider>/, so unlike the
18
+ // child-folder struct imports this one has to step up a level.
19
+ this.code.line(`import { ${resource.providerFunctionsModel.className} } from '../provider-functions/index${this.importExtension}';`);
20
+ }
13
21
  const comment = (0, sanitized_comments_1.sanitizedComment)(this.code);
14
22
  comment.line(`Represents a {@link ${resource.linkToDocs} ${resource.terraformResourceType}}`);
15
23
  comment.end();
16
24
  this.code.openBlock(`export class ${resource.className} extends cdktn.${resource.parentClassName}`);
17
25
  this.emitHeader("STATIC PROPERTIES");
18
26
  this.emitStaticProperties(resource);
19
- this.emitHeader("STATIC Methods");
20
- this.emitStaticMethods(resource);
27
+ if (!resource.isEphemeralResource) {
28
+ this.emitHeader("STATIC Methods");
29
+ this.emitStaticMethods(resource);
30
+ }
21
31
  this.emitHeader("INITIALIZER");
22
32
  this.emitInitializer(resource);
23
33
  this.emitHeader("ATTRIBUTES");
24
34
  this.emitResourceAttributes(resource);
35
+ if (resource.isProvider && resource.providerFunctionsModel) {
36
+ this.emitHeader("PROVIDER-DEFINED FUNCTIONS");
37
+ this.emitFunctionsGetter(resource.providerFunctionsModel);
38
+ }
25
39
  // synthesis
26
40
  this.emitHeader("SYNTHESIS");
27
41
  this.emitResourceSynthesis(resource);
28
42
  this.emitHclResourceSynthesis(resource);
29
43
  this.code.closeBlock(); // construct
30
44
  }
45
+ // Emits a memoized `functions` getter on a provider class that declares
46
+ // provider-defined functions. The local name to invoke functions under is
47
+ // derived from `this.terraformResourceType`, not baked in as the schema
48
+ // name constant: terraform-provider.ts keys both `required_providers` and
49
+ // the `provider` block directly off `terraformResourceType`, so whatever
50
+ // this instance's `terraformResourceType` is IS its correct
51
+ // required_providers local name (it already accounts for a `name`
52
+ // override in the cdktf.json provider constraint, see
53
+ // ConstructsMakerProviderTarget/TerraformProviderConstraint) - the
54
+ // instance always knows its own correct local name, so there is no need
55
+ // for a providerLocalName override parameter here.
56
+ emitFunctionsGetter(model) {
57
+ this.code.line(`private _functions?: ${model.className};`);
58
+ this.code.line();
59
+ const comment = (0, sanitized_comments_1.sanitizedComment)(this.code);
60
+ comment.line(`Provider-defined functions of the ${model.providerName} provider.`);
61
+ comment.end();
62
+ this.code.openBlock(`public get functions(): ${model.className}`);
63
+ this.code.openBlock(`if (!this._functions)`);
64
+ this.code.line(`this._functions = new ${model.className}(this.terraformResourceType);`);
65
+ this.code.closeBlock();
66
+ this.code.line(`return this._functions;`);
67
+ this.code.closeBlock();
68
+ }
31
69
  emitHeader(title) {
32
70
  this.code.line();
33
71
  this.code.line("// " + "=".repeat(title.length));
@@ -53,8 +91,9 @@ class ResourceEmitter {
53
91
  this.code.line();
54
92
  this.code.openBlock(`protected synthesizeHclAttributes(): { [name: string]: any }`);
55
93
  this.code.open(`const attrs = {`);
94
+ const registerWriteOnlyUsage = this.supportsWriteOnlyRegistration(resource);
56
95
  for (const att of resource.synthesizableAttributes) {
57
- this.attributesEmitter.emitToHclTerraform(att, false);
96
+ this.attributesEmitter.emitToHclTerraform(att, false, registerWriteOnlyUsage);
58
97
  }
59
98
  this.code.close(`};`);
60
99
  if (resource.synthesizableAttributes.length > 0) {
@@ -71,12 +110,31 @@ class ResourceEmitter {
71
110
  this.code.line();
72
111
  this.code.openBlock(`protected synthesizeAttributes(): { [name: string]: any }`);
73
112
  this.code.open(`return {`);
113
+ const registerWriteOnlyUsage = this.supportsWriteOnlyRegistration(resource);
74
114
  for (const att of resource.synthesizableAttributes) {
75
- this.attributesEmitter.emitToTerraform(att, false);
115
+ this.attributesEmitter.emitToTerraform(att, false, registerWriteOnlyUsage);
76
116
  }
77
117
  this.code.close(`};`);
78
118
  this.code.closeBlock();
79
119
  }
120
+ // `markWriteOnlyAttribute` (called from generated `synthesizeAttributes()`/
121
+ // `synthesizeHclAttributes()` for write-only attributes, see
122
+ // AttributesEmitter#emitToTerraform/#emitToHclTerraform) lives on
123
+ // TerraformResource - so only managed resources can register write-only
124
+ // usage; data sources, providers, and ephemeral resources only get the
125
+ // deprecated getter.
126
+ //
127
+ // write-only is fundamentally a state concept - the value is passed to
128
+ // the provider but never persisted to state - so gating this on
129
+ // TerraformResource is a semantic choice, not a capability one: ephemeral
130
+ // resources have no state at all, and, consistent with that, no provider
131
+ // schema in the RFC-04 sweep (including vault's 16 ephemeral resources)
132
+ // marks an ephemeral attribute write_only. So ephemeral classes
133
+ // deliberately land in the same "getter only" bucket as data sources and
134
+ // providers.
135
+ supportsWriteOnlyRegistration(resource) {
136
+ return resource.parentClassName === "TerraformResource";
137
+ }
80
138
  emitResourceAttributes(resource) {
81
139
  for (const att of resource.attributes) {
82
140
  this.attributesEmitter.emit(att, this.attributesEmitter.needsResetEscape(att, resource.attributes), this.attributesEmitter.needsInputEscape(att, resource.attributes));
@@ -85,7 +143,11 @@ class ResourceEmitter {
85
143
  emitInitializer(resource) {
86
144
  this.code.line();
87
145
  const comment = (0, sanitized_comments_1.sanitizedComment)(this.code);
88
- comment.line(`Create a new {@link ${resource.linkToDocs} ${resource.terraformResourceType}} ${resource.isDataSource ? "Data Source" : "Resource"}`);
146
+ comment.line(`Create a new {@link ${resource.linkToDocs} ${resource.terraformResourceType}} ${resource.isDataSource
147
+ ? "Data Source"
148
+ : resource.isEphemeralResource
149
+ ? "Ephemeral Resource"
150
+ : "Resource"}`);
89
151
  comment.line(``);
90
152
  comment.line(`@param scope The scope in which to define this construct`);
91
153
  comment.line(`@param id The scoped construct ID. Must be unique amongst siblings in the same scope`);
@@ -95,6 +157,9 @@ class ResourceEmitter {
95
157
  if (resource.isProvider) {
96
158
  this.emitProviderSuper(resource);
97
159
  }
160
+ else if (resource.isEphemeralResource) {
161
+ this.emitEphemeralResourceSuper(resource);
162
+ }
98
163
  else {
99
164
  this.emitResourceSuper(resource);
100
165
  }
@@ -122,6 +187,17 @@ class ResourceEmitter {
122
187
  this.code.line(`forEach: config.forEach`);
123
188
  this.code.close(`});`);
124
189
  }
190
+ emitEphemeralResourceSuper(resource) {
191
+ this.code.open(`super(scope, id, {`);
192
+ this.code.line(`terraformResourceType: '${resource.terraformResourceType}',`);
193
+ this.emitTerraformGeneratorMetadata(resource);
194
+ this.code.line(`provider: config.provider,`);
195
+ this.code.line(`dependsOn: config.dependsOn,`);
196
+ this.code.line(`count: config.count,`);
197
+ this.code.line(`lifecycle: config.lifecycle,`);
198
+ this.code.line(`forEach: config.forEach`);
199
+ this.code.close(`});`);
200
+ }
125
201
  emitProviderSuper(resource) {
126
202
  this.code.open(`super(scope, id, {`);
127
203
  this.code.line(`terraformResourceType: '${resource.terraformResourceType}',`);
@@ -144,4 +220,4 @@ class ResourceEmitter {
144
220
  }
145
221
  }
146
222
  exports.ResourceEmitter = ResourceEmitter;
147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtZW1pdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9nZXQvZ2VuZXJhdG9yL2VtaXR0ZXIvcmVzb3VyY2UtZW1pdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSw2REFBeUQ7QUFDekQsOERBQXlEO0FBRXpELE1BQWEsZUFBZTtJQUcxQixZQUE2QixJQUFlO1FBQWYsU0FBSSxHQUFKLElBQUksQ0FBVztRQUMxQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxzQ0FBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVNLElBQUksQ0FBQyxRQUF1QjtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWdCLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsdUJBQXVCLFFBQVEsQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDLHFCQUFxQixHQUFHLENBQ2hGLENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDakIsZ0JBQWdCLFFBQVEsQ0FBQyxTQUFTLGtCQUFrQixRQUFRLENBQUMsZUFBZSxFQUFFLENBQy9FLENBQUM7UUFFRixJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXBDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEs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bi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyBDb2RlTWFrZXIgfSBmcm9tIFwiY29kZW1ha2VyXCI7XG5pbXBvcnQgeyBSZXNvdXJjZU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsc1wiO1xuaW1wb3J0IHsgQXR0cmlidXRlc0VtaXR0ZXIgfSBmcm9tIFwiLi9hdHRyaWJ1dGVzLWVtaXR0ZXJcIjtcbmltcG9ydCB7IHNhbml0aXplZENvbW1lbnQgfSBmcm9tIFwiLi4vc2FuaXRpemVkLWNvbW1lbnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUVtaXR0ZXIge1xuICBhdHRyaWJ1dGVzRW1pdHRlcjogQXR0cmlidXRlc0VtaXR0ZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb2RlOiBDb2RlTWFrZXIpIHtcbiAgICB0aGlzLmF0dHJpYnV0ZXNFbWl0dGVyID0gbmV3IEF0dHJpYnV0ZXNFbWl0dGVyKHRoaXMuY29kZSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgY29uc3QgY29tbWVudCA9IHNhbml0aXplZENvbW1lbnQodGhpcy5jb2RlKTtcbiAgICBjb21tZW50LmxpbmUoXG4gICAgICBgUmVwcmVzZW50cyBhIHtAbGluayAke3Jlc291cmNlLmxpbmtUb0RvY3N9ICR7cmVzb3VyY2UudGVycmFmb3JtUmVzb3VyY2VUeXBlfX1gLFxuICAgICk7XG4gICAgY29tbWVudC5lbmQoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYGV4cG9ydCBjbGFzcyAke3Jlc291cmNlLmNsYXNzTmFtZX0gZXh0ZW5kcyBjZGt0bi4ke3Jlc291cmNlLnBhcmVudENsYXNzTmFtZX1gLFxuICAgICk7XG5cbiAgICB0aGlzLmVtaXRIZWFkZXIoXCJTVEFUSUMgUFJPUEVSVElFU1wiKTtcbiAgICB0aGlzLmVtaXRTdGF0aWNQcm9wZXJ0aWVzKHJlc291cmNlKTtcblxuICAgIHRoaXMuZW1pdEhlYWRlcihcIlNUQVRJQyBNZXRob2RzXCIpO1xuICAgIHRoaXMuZW1pdFN0YXRpY01ldGhvZHMocmVzb3VyY2UpO1xuXG4gICAgdGhpcy5lbWl0SGVhZGVyKFwiSU5JVElBTElaRVJcIik7XG4gICAgdGhpcy5lbWl0SW5pdGlhbGl6ZXIocmVzb3VyY2UpO1xuXG4gICAgdGhpcy5lbWl0SGVhZGVyKFwiQVRUUklCVVRFU1wiKTtcbiAgICB0aGlzLmVtaXRSZXNvdXJjZUF0dHJpYnV0ZXMocmVzb3VyY2UpO1xuXG4gICAgLy8gc3ludGhlc2lzXG4gICAgdGhpcy5lbWl0SGVhZGVyKFwiU1lOVEhFU0lTXCIpO1xuICAgIHRoaXMuZW1pdFJlc291cmNlU3ludGhlc2lzKHJlc291cmNlKTtcbiAgICB0aGlzLmVtaXRIY2xSZXNvdXJjZVN5bnRoZXNpcyhyZXNvdXJjZSk7XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpOyAvLyBjb25zdHJ1Y3RcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEhlYWRlcih0aXRsZTogc3RyaW5nKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZShcIi8vIFwiICsgXCI9XCIucmVwZWF0KHRpdGxlLmxlbmd0aCkpO1xuICAgIHRoaXMuY29kZS5saW5lKGAvLyAke3RpdGxlfWApO1xuICAgIHRoaXMuY29kZS5saW5lKFwiLy8gXCIgKyBcIj1cIi5yZXBlYXQodGl0bGUubGVuZ3RoKSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRTdGF0aWNQcm9wZXJ0aWVzKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgcHVibGljIHN0YXRpYyByZWFkb25seSB0ZlJlc291cmNlVHlwZSA9IFwiJHtyZXNvdXJjZS50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9XCI7YCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U3RhdGljTWV0aG9kcyhyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIGNvbnN0IGNvbW1lbnQgPSBzYW5pdGl6ZWRDb21tZW50KHRoaXMuY29kZSk7XG4gICAgY29tbWVudC5saW5lKFxuICAgICAgYEdlbmVyYXRlcyBDREtUTiBjb2RlIGZvciBpbXBvcnRpbmcgYSAke3Jlc291cmNlLmNsYXNzTmFtZX0gcmVzb3VyY2UgdXBvbiBydW5uaW5nIFwiY2RrdG4gcGxhbiA8c3RhY2stbmFtZT5cImAsXG4gICAgKTtcbiAgICBjb21tZW50LmxpbmUoYEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0YCk7XG4gICAgY29tbWVudC5saW5lKFxuICAgICAgYEBwYXJhbSBpbXBvcnRUb0lkIFRoZSBjb25zdHJ1Y3QgaWQgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvbmZpZyBmb3IgdGhlICR7cmVzb3VyY2UuY2xhc3NOYW1lfSB0byBpbXBvcnRgLFxuICAgICk7XG4gICAgY29tbWVudC5saW5lKFxuICAgICAgYEBwYXJhbSBpbXBvcnRGcm9tSWQgVGhlIGlkIG9mIHRoZSBleGlzdGluZyAke3Jlc291cmNlLmNsYXNzTmFtZX0gdGhhdCBzaG91bGQgYmUgaW1wb3J0ZWQuIFJlZmVyIHRvIHRoZSB7QGxpbmsgJHtyZXNvdXJjZS5saW5rVG9Eb2NzfSNpbXBvcnQgaW1wb3J0IHNlY3Rpb259IGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoaXMgcmVzb3VyY2UgZm9yIHRoZSBpZCB0byB1c2VgLFxuICAgICk7XG4gICAgY29tbWVudC5saW5lKFxuICAgICAgYEBwYXJhbSBwcm92aWRlcj8gT3B0aW9uYWwgaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVyIHdoZXJlIHRoZSAke3Jlc291cmNlLmNsYXNzTmFtZX0gdG8gaW1wb3J0IGlzIGZvdW5kYCxcbiAgICApO1xuICAgIGNvbW1lbnQuZW5kKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUNvbmZpZ0ZvckltcG9ydChzY29wZTogQ29uc3RydWN0LCBpbXBvcnRUb0lkOiBzdHJpbmcsIGltcG9ydEZyb21JZDogc3RyaW5nLCBwcm92aWRlcj86IGNka3RuLlRlcnJhZm9ybVByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2RrdG4uSW1wb3J0YWJsZVJlc291cmNlKHNjb3BlLCBpbXBvcnRUb0lkLCB7IHRlcnJhZm9ybVJlc291cmNlVHlwZTogXCIke3Jlc291cmNlLnRlcnJhZm9ybVJlc291cmNlVHlwZX1cIiwgaW1wb3J0SWQ6IGltcG9ydEZyb21JZCwgcHJvdmlkZXIgfSk7XG4gICAgICB9YCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0SGNsUmVzb3VyY2VTeW50aGVzaXMocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkIHN5bnRoZXNpemVIY2xBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9YCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuKGBjb25zdCBhdHRycyA9IHtgKTtcblxuICAgIGZvciAoY29uc3QgYXR0IG9mIHJlc291cmNlLnN5bnRoZXNpemFibGVBdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLmF0dHJpYnV0ZXNFbWl0dGVyLmVtaXRUb0hjbFRlcnJhZm9ybShhdHQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2UoYH07YCk7XG5cbiAgICBpZiAocmVzb3VyY2Uuc3ludGhlc2l6YWJsZUF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQgKSlgLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYHJldHVybiBhdHRycztgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVzb3VyY2VTeW50aGVzaXMocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkIHN5bnRoZXNpemVBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9YCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuKGByZXR1cm4ge2ApO1xuXG4gICAgZm9yIChjb25zdCBhdHQgb2YgcmVzb3VyY2Uuc3ludGhlc2l6YWJsZUF0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuYXR0cmlidXRlc0VtaXR0ZXIuZW1pdFRvVGVycmFmb3JtKGF0dCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZShgfTtgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVzb3VyY2VBdHRyaWJ1dGVzKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgZm9yIChjb25zdCBhdHQgb2YgcmVzb3VyY2UuYXR0cmlidXRlcykge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVzRW1pdHRlci5lbWl0KFxuICAgICAgICBhdHQsXG4gICAgICAgIHRoaXMuYXR0cmlidXRlc0VtaXR0ZXIubmVlZHNSZXNldEVzY2FwZShhdHQsIHJlc291cmNlLmF0dHJpYnV0ZXMpLFxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXNFbWl0dGVyLm5lZWRzSW5wdXRFc2NhcGUoYXR0LCByZXNvdXJjZS5hdHRyaWJ1dGVzKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0SW5pdGlhbGl6ZXIocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIGNvbnN0IGNvbW1lbnQgPSBzYW5pdGl6ZWRDb21tZW50KHRoaXMuY29kZSk7XG4gICAgY29tbWVudC5saW5lKFxuICAgICAgYENyZWF0ZSBhIG5ldyB7QGxpbmsgJHtyZXNvdXJjZS5saW5rVG9Eb2NzfSAke1xuICAgICAgICByZXNvdXJjZS50ZXJyYWZvcm1SZXNvdXJjZVR5cGVcbiAgICAgIH19ICR7cmVzb3VyY2UuaXNEYXRhU291cmNlID8gXCJEYXRhIFNvdXJjZVwiIDogXCJSZXNvdXJjZVwifWAsXG4gICAgKTtcbiAgICBjb21tZW50LmxpbmUoYGApO1xuICAgIGNvbW1lbnQubGluZShgQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RgKTtcbiAgICBjb21tZW50LmxpbmUoXG4gICAgICBgQHBhcmFtIGlkIFRoZSBzY29wZWQgY29uc3RydWN0IElELiBNdXN0IGJlIHVuaXF1ZSBhbW9uZ3N0IHNpYmxpbmdzIGluIHRoZSBzYW1lIHNjb3BlYCxcbiAgICApO1xuICAgIGNvbW1lbnQubGluZShgQHBhcmFtIG9wdGlvbnMgJHtyZXNvdXJjZS5jb25maWdTdHJ1Y3QuYXR0cmlidXRlVHlwZX1gKTtcbiAgICBjb21tZW50LmVuZCgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNvbmZpZzogJHtyZXNvdXJjZS5jb25maWdTdHJ1Y3QuYXR0cmlidXRlVHlwZX0pYCxcbiAgICApO1xuXG4gICAgaWYgKHJlc291cmNlLmlzUHJvdmlkZXIpIHtcbiAgICAgIHRoaXMuZW1pdFByb3ZpZGVyU3VwZXIocmVzb3VyY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRSZXNvdXJjZVN1cGVyKHJlc291cmNlKTtcbiAgICB9XG5cbiAgICAvLyBpbml0aWFsaXplIGNvbmZpZyBwcm9wZXJ0aWVzXG4gICAgZm9yIChjb25zdCBhdHQgb2YgcmVzb3VyY2UuY29uZmlnU3RydWN0LmFzc2lnbmFibGVBdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAoYXR0LnNldHRlclR5cGUuX3R5cGUgPT09IFwic3RvcmVkX2NsYXNzXCIpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYHRoaXMuJHthdHQuc3RvcmFnZU5hbWV9LmludGVybmFsVmFsdWUgPSBjb25maWcuJHthdHQubmFtZX07YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKGB0aGlzLiR7YXR0LnN0b3JhZ2VOYW1lfSA9IGNvbmZpZy4ke2F0dC5uYW1lfTtgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVzb3VyY2VTdXBlcihyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5vcGVuKGBzdXBlcihzY29wZSwgaWQsIHtgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6ICcke3Jlc291cmNlLnRlcnJhZm9ybVJlc291cmNlVHlwZX0nLGAsXG4gICAgKTtcbiAgICB0aGlzLmVtaXRUZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YShyZXNvdXJjZSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHByb3ZpZGVyOiBjb25maWcucHJvdmlkZXIsYCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYGRlcGVuZHNPbjogY29uZmlnLmRlcGVuZHNPbixgKTtcbiAgICB0aGlzLmNvZGUubGluZShgY291bnQ6IGNvbmZpZy5jb3VudCxgKTtcbiAgICB0aGlzLmNvZGUubGluZShgbGlmZWN5Y2xlOiBjb25maWcubGlmZWN5Y2xlLGApO1xuICAgIHRoaXMuY29kZS5saW5lKGBwcm92aXNpb25lcnM6IGNvbmZpZy5wcm92aXNpb25lcnMsYCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYGNvbm5lY3Rpb246IGNvbmZpZy5jb25uZWN0aW9uLGApO1xuICAgIHRoaXMuY29kZS5saW5lKGBmb3JFYWNoOiBjb25maWcuZm9yRWFjaGApO1xuICAgIHRoaXMuY29kZS5jbG9zZShgfSk7YCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRQcm92aWRlclN1cGVyKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgdGhpcy5jb2RlLm9wZW4oYHN1cGVyKHNjb3BlLCBpZCwge2ApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHRlcnJhZm9ybVJlc291cmNlVHlwZTogJyR7cmVzb3VyY2UudGVycmFmb3JtUmVzb3VyY2VUeXBlfScsYCxcbiAgICApO1xuICAgIHRoaXMuZW1pdFRlcnJhZm9ybUdlbmVyYXRvck1ldGFkYXRhKHJlc291cmNlKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGB0ZXJyYWZvcm1Qcm92aWRlclNvdXJjZTogJyR7cmVzb3VyY2UudGVycmFmb3JtUHJvdmlkZXJTb3VyY2V9J2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2UoYH0pO2ApO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGEocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICB0aGlzLmNvZGUub3BlbihgdGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGE6IHtgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBwcm92aWRlck5hbWU6ICcke3Jlc291cmNlLnByb3ZpZGVyfScke1xuICAgICAgICByZXNvdXJjZS5wcm92aWRlclZlcnNpb24gfHwgcmVzb3VyY2UucHJvdmlkZXJWZXJzaW9uQ29uc3RyYWludFxuICAgICAgICAgID8gXCIsXCJcbiAgICAgICAgICA6IFwiXCJcbiAgICAgIH1gLFxuICAgICk7XG5cbiAgICBpZiAocmVzb3VyY2UucHJvdmlkZXJWZXJzaW9uKSB7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHByb3ZpZGVyVmVyc2lvbjogJyR7cmVzb3VyY2UucHJvdmlkZXJWZXJzaW9ufScke1xuICAgICAgICAgIHJlc291cmNlLnByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQgPyBcIixcIiA6IFwiXCJcbiAgICAgICAgfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChyZXNvdXJjZS5wcm92aWRlclZlcnNpb25Db25zdHJhaW50KSB7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQ6ICcke3Jlc291cmNlLnByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnR9J2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZShgfSxgKTtcbiAgfVxufVxuIl19
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtZW1pdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9nZXQvZ2VuZXJhdG9yL2VtaXR0ZXIvcmVzb3VyY2UtZW1pdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSw2REFBeUQ7QUFDekQsOERBQXlEO0FBRXpELE1BQWEsZUFBZTtJQUcxQixZQUNtQixJQUFlLEVBQ2YsZUFBdUI7UUFEdkIsU0FBSSxHQUFKLElBQUksQ0FBVztRQUNmLG9CQUFlLEdBQWYsZUFBZSxDQUFRO1FBRXhDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLHNDQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU0sSUFBSSxDQUFDLFFBQXVCO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFakIsSUFBSSxRQUFRLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzNELG1FQUFtRTtZQUNuRSxrRUFBa0U7WUFDbEUsbUVBQW1FO1lBQ25FLCtEQUErRDtZQUMvRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWixZQUFZLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLHVDQUF1QyxJQUFJLENBQUMsZUFBZSxJQUFJLENBQ3JILENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBQSxxQ0FBZ0IsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsT0FBTyxDQUFDLElBQUksQ0FDVix1QkFBdUIsUUFBUSxDQUFDLFVBQVUsSUFBSSxRQUFRLENBQUMscUJBQXFCLEdBQUcsQ0FDaEYsQ0FBQztRQUNGLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUNqQixnQkFBZ0IsUUFBUSxDQUFDLFNBQVMsa0JBQWtCLFFBQVEsQ0FBQyxl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QVEsQ0FBQyxRQUFRLElBQ2pDLFFBQVEsQ0FBQyxlQUFlLElBQUksUUFBUSxDQUFDLHlCQUF5QjtZQUM1RCxDQUFDLENBQUMsR0FBRztZQUNMLENBQUMsQ0FBQyxFQUNOLEVBQUUsQ0FDSCxDQUFDO1FBRUYsSUFBSSxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1oscUJBQXFCLFFBQVEsQ0FBQyxlQUFlLElBQzNDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUM3QyxFQUFFLENBQ0gsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLCtCQUErQixRQUFRLENBQUMseUJBQXlCLEdBQUcsQ0FDckUsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0NBQ0Y7QUFsVUQsMENBa1VDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7IENvZGVNYWtlciB9IGZyb20gXCJjb2RlbWFrZXJcIjtcbmltcG9ydCB7IFJlc291cmNlTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxzXCI7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzRW1pdHRlciB9IGZyb20gXCIuL2F0dHJpYnV0ZXMtZW1pdHRlclwiO1xuaW1wb3J0IHsgc2FuaXRpemVkQ29tbWVudCB9IGZyb20gXCIuLi9zYW5pdGl6ZWQtY29tbWVudHNcIjtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlRW1pdHRlciB7XG4gIGF0dHJpYnV0ZXNFbWl0dGVyOiBBdHRyaWJ1dGVzRW1pdHRlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvZGU6IENvZGVNYWtlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGltcG9ydEV4dGVuc2lvbjogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLmF0dHJpYnV0ZXNFbWl0dGVyID0gbmV3IEF0dHJpYnV0ZXNFbWl0dGVyKHRoaXMuY29kZSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG5cbiAgICBpZiAocmVzb3VyY2UuaXNQcm92aWRlciAmJiByZXNvdXJjZS5wcm92aWRlckZ1bmN0aW9uc01vZGVsKSB7XG4gICAgICAvLyBTaWJsaW5nLWRpcmVjdG9yeSBpbXBvcnQ6IHByb3ZpZGVycy88cHJvdmlkZXI+L3Byb3ZpZGVyL2luZGV4LnRzXG4gICAgICAvLyAodGhlIGVtaXR0ZWQgZmlsZSkgYW5kIHByb3ZpZGVycy88cHJvdmlkZXI+L3Byb3ZpZGVyLWZ1bmN0aW9ucy9cbiAgICAgIC8vIGluZGV4LnRzIGFyZSBzaWJsaW5ncyB1bmRlciBwcm92aWRlcnMvPHByb3ZpZGVyPi8sIHNvIHVubGlrZSB0aGVcbiAgICAgIC8vIGNoaWxkLWZvbGRlciBzdHJ1Y3QgaW1wb3J0cyB0aGlzIG9uZSBoYXMgdG8gc3RlcCB1cCBhIGxldmVsLlxuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGBpbXBvcnQgeyAke3Jlc291cmNlLnByb3ZpZGVyRnVuY3Rpb25zTW9kZWwuY2xhc3NOYW1lfSB9IGZyb20gJy4uL3Byb3ZpZGVyLWZ1bmN0aW9ucy9pbmRleCR7dGhpcy5pbXBvcnRFeHRlbnNpb259JztgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21tZW50ID0gc2FuaXRpemVkQ29tbWVudCh0aGlzLmNvZGUpO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBSZXByZXNlbnRzIGEge0BsaW5rICR7cmVzb3VyY2UubGlua1RvRG9jc30gJHtyZXNvdXJjZS50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9fWAsXG4gICAgKTtcbiAgICBjb21tZW50LmVuZCgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgZXhwb3J0IGNsYXNzICR7cmVzb3VyY2UuY2xhc3NOYW1lfSBleHRlbmRzIGNka3RuLiR7cmVzb3VyY2UucGFyZW50Q2xhc3NOYW1lfWAsXG4gICAgKTtcblxuICAgIHRoaXMuZW1pdEhlYWRlcihcIlNUQVRJQyBQUk9QRVJUSUVTXCIpO1xuICAgIHRoaXMuZW1pdFN0YXRpY1Byb3BlcnRpZXMocmVzb3VyY2UpO1xuXG4gICAgaWYgKCFyZXNvdXJjZS5pc0VwaGVtZXJhbFJlc291cmNlKSB7XG4gICAgICB0aGlzLmVtaXRIZWFkZXIoXCJTVEFUSUMgTWV0aG9kc1wiKTtcbiAgICAgIHRoaXMuZW1pdFN0YXRpY01ldGhvZHMocmVzb3VyY2UpO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdEhlYWRlcihcIklOSVRJQUxJWkVSXCIpO1xuICAgIHRoaXMuZW1pdEluaXRpYWxpemVyKHJlc291cmNlKTtcblxuICAgIHRoaXMuZW1pdEhlYWRlcihcIkFUVFJJQlVURVNcIik7XG4gICAgdGhpcy5lbWl0UmVzb3VyY2VBdHRyaWJ1dGVzKHJlc291cmNlKTtcblxuICAgIGlmIChyZXNvdXJjZS5pc1Byb3ZpZGVyICYmIHJlc291cmNlLnByb3ZpZGVyRnVuY3Rpb25zTW9kZWwpIHtcbiAgICAgIHRoaXMuZW1pdEhlYWRlcihcIlBST1ZJREVSLURFRklORUQgRlVOQ1RJT05TXCIpO1xuICAgICAgdGhpcy5lbWl0RnVuY3Rpb25zR2V0dGVyKHJlc291cmNlLnByb3ZpZGVyRnVuY3Rpb25zTW9kZWwpO1xuICAgIH1cblxuICAgIC8vIHN5bnRoZXNpc1xuICAgIHRoaXMuZW1pdEhlYWRlcihcIlNZTlRIRVNJU1wiKTtcbiAgICB0aGlzLmVtaXRSZXNvdXJjZVN5bnRoZXNpcyhyZXNvdXJjZSk7XG4gICAgdGhpcy5lbWl0SGNsUmVzb3VyY2VTeW50aGVzaXMocmVzb3VyY2UpO1xuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTsgLy8gY29uc3RydWN0XG4gIH1cblxuICAvLyBFbWl0cyBhIG1lbW9pemVkIGBmdW5jdGlvbnNgIGdldHRlciBvbiBhIHByb3ZpZGVyIGNsYXNzIHRoYXQgZGVjbGFyZXNcbiAgLy8gcHJvdmlkZXItZGVmaW5lZCBmdW5jdGlvbnMuIFRoZSBsb2NhbCBuYW1lIHRvIGludm9rZSBmdW5jdGlvbnMgdW5kZXIgaXNcbiAgLy8gZGVyaXZlZCBmcm9tIGB0aGlzLnRlcnJhZm9ybVJlc291cmNlVHlwZWAsIG5vdCBiYWtlZCBpbiBhcyB0aGUgc2NoZW1hXG4gIC8vIG5hbWUgY29uc3RhbnQ6IHRlcnJhZm9ybS1wcm92aWRlci50cyBrZXlzIGJvdGggYHJlcXVpcmVkX3Byb3ZpZGVyc2AgYW5kXG4gIC8vIHRoZSBgcHJvdmlkZXJgIGJsb2NrIGRpcmVjdGx5IG9mZiBgdGVycmFmb3JtUmVzb3VyY2VUeXBlYCwgc28gd2hhdGV2ZXJcbiAgLy8gdGhpcyBpbnN0YW5jZSdzIGB0ZXJyYWZvcm1SZXNvdXJjZVR5cGVgIGlzIElTIGl0cyBjb3JyZWN0XG4gIC8vIHJlcXVpcmVkX3Byb3ZpZGVycyBsb2NhbCBuYW1lIChpdCBhbHJlYWR5IGFjY291bnRzIGZvciBhIGBuYW1lYFxuICAvLyBvdmVycmlkZSBpbiB0aGUgY2RrdGYuanNvbiBwcm92aWRlciBjb25zdHJhaW50LCBzZWVcbiAgLy8gQ29uc3RydWN0c01ha2VyUHJvdmlkZXJUYXJnZXQvVGVycmFmb3JtUHJvdmlkZXJDb25zdHJhaW50KSAtIHRoZVxuICAvLyBpbnN0YW5jZSBhbHdheXMga25vd3MgaXRzIG93biBjb3JyZWN0IGxvY2FsIG5hbWUsIHNvIHRoZXJlIGlzIG5vIG5lZWRcbiAgLy8gZm9yIGEgcHJvdmlkZXJMb2NhbE5hbWUgb3ZlcnJpZGUgcGFyYW1ldGVyIGhlcmUuXG4gIHByaXZhdGUgZW1pdEZ1bmN0aW9uc0dldHRlcihcbiAgICBtb2RlbDogTm9uTnVsbGFibGU8UmVzb3VyY2VNb2RlbFtcInByb3ZpZGVyRnVuY3Rpb25zTW9kZWxcIl0+LFxuICApIHtcbiAgICB0aGlzLmNvZGUubGluZShgcHJpdmF0ZSBfZnVuY3Rpb25zPzogJHttb2RlbC5jbGFzc05hbWV9O2ApO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG5cbiAgICBjb25zdCBjb21tZW50ID0gc2FuaXRpemVkQ29tbWVudCh0aGlzLmNvZGUpO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBQcm92aWRlci1kZWZpbmVkIGZ1bmN0aW9ucyBvZiB0aGUgJHttb2RlbC5wcm92aWRlck5hbWV9IHByb3ZpZGVyLmAsXG4gICAgKTtcbiAgICBjb21tZW50LmVuZCgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYHB1YmxpYyBnZXQgZnVuY3Rpb25zKCk6ICR7bW9kZWwuY2xhc3NOYW1lfWApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYGlmICghdGhpcy5fZnVuY3Rpb25zKWApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHRoaXMuX2Z1bmN0aW9ucyA9IG5ldyAke21vZGVsLmNsYXNzTmFtZX0odGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGUpO2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gdGhpcy5fZnVuY3Rpb25zO2ApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRIZWFkZXIodGl0bGU6IHN0cmluZykge1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXCIvLyBcIiArIFwiPVwiLnJlcGVhdCh0aXRsZS5sZW5ndGgpKTtcbiAgICB0aGlzLmNvZGUubGluZShgLy8gJHt0aXRsZX1gKTtcbiAgICB0aGlzLmNvZGUubGluZShcIi8vIFwiICsgXCI9XCIucmVwZWF0KHRpdGxlLmxlbmd0aCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U3RhdGljUHJvcGVydGllcyhyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGZSZXNvdXJjZVR5cGUgPSBcIiR7cmVzb3VyY2UudGVycmFmb3JtUmVzb3VyY2VUeXBlfVwiO2AsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN0YXRpY01ldGhvZHMocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICBjb25zdCBjb21tZW50ID0gc2FuaXRpemVkQ29tbWVudCh0aGlzLmNvZGUpO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBHZW5lcmF0ZXMgQ0RLVE4gY29kZSBmb3IgaW1wb3J0aW5nIGEgJHtyZXNvdXJjZS5jbGFzc05hbWV9IHJlc291cmNlIHVwb24gcnVubmluZyBcImNka3RuIHBsYW4gPHN0YWNrLW5hbWU+XCJgLFxuICAgICk7XG4gICAgY29tbWVudC5saW5lKGBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdGApO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBAcGFyYW0gaW1wb3J0VG9JZCBUaGUgY29uc3RydWN0IGlkIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBjb25maWcgZm9yIHRoZSAke3Jlc291cmNlLmNsYXNzTmFtZX0gdG8gaW1wb3J0YCxcbiAgICApO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBAcGFyYW0gaW1wb3J0RnJvbUlkIFRoZSBpZCBvZiB0aGUgZXhpc3RpbmcgJHtyZXNvdXJjZS5jbGFzc05hbWV9IHRoYXQgc2hvdWxkIGJlIGltcG9ydGVkLiBSZWZlciB0byB0aGUge0BsaW5rICR7cmVzb3VyY2UubGlua1RvRG9jc30jaW1wb3J0IGltcG9ydCBzZWN0aW9ufSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIHJlc291cmNlIGZvciB0aGUgaWQgdG8gdXNlYCxcbiAgICApO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBAcGFyYW0gcHJvdmlkZXI/IE9wdGlvbmFsIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlciB3aGVyZSB0aGUgJHtyZXNvdXJjZS5jbGFzc05hbWV9IHRvIGltcG9ydCBpcyBmb3VuZGAsXG4gICAgKTtcbiAgICBjb21tZW50LmVuZCgpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVDb25maWdGb3JJbXBvcnQoc2NvcGU6IENvbnN0cnVjdCwgaW1wb3J0VG9JZDogc3RyaW5nLCBpbXBvcnRGcm9tSWQ6IHN0cmluZywgcHJvdmlkZXI/OiBjZGt0bi5UZXJyYWZvcm1Qcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IGNka3RuLkltcG9ydGFibGVSZXNvdXJjZShzY29wZSwgaW1wb3J0VG9JZCwgeyB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IFwiJHtyZXNvdXJjZS50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9XCIsIGltcG9ydElkOiBpbXBvcnRGcm9tSWQsIHByb3ZpZGVyIH0pO1xuICAgICAgfWAsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEhjbFJlc291cmNlU3ludGhlc2lzKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByb3RlY3RlZCBzeW50aGVzaXplSGNsQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUub3BlbihgY29uc3QgYXR0cnMgPSB7YCk7XG5cbiAgICBjb25zdCByZWdpc3RlcldyaXRlT25seVVzYWdlID0gdGhpcy5zdXBwb3J0c1dyaXRlT25seVJlZ2lzdHJhdGlvbihyZXNvdXJjZSk7XG4gICAgZm9yIChjb25zdCBhdHQgb2YgcmVzb3VyY2Uuc3ludGhlc2l6YWJsZUF0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuYXR0cmlidXRlc0VtaXR0ZXIuZW1pdFRvSGNsVGVycmFmb3JtKFxuICAgICAgICBhdHQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICByZWdpc3RlcldyaXRlT25seVVzYWdlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2UoYH07YCk7XG5cbiAgICBpZiAocmVzb3VyY2Uuc3ludGhlc2l6YWJsZUF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQgKSlgLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYHJldHVybiBhdHRycztgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVzb3VyY2VTeW50aGVzaXMocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkIHN5bnRoZXNpemVBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9YCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuKGByZXR1cm4ge2ApO1xuXG4gICAgY29uc3QgcmVnaXN0ZXJXcml0ZU9ubHlVc2FnZSA9IHRoaXMuc3VwcG9ydHNXcml0ZU9ubHlSZWdpc3RyYXRpb24ocmVzb3VyY2UpO1xuICAgIGZvciAoY29uc3QgYXR0IG9mIHJlc291cmNlLnN5bnRoZXNpemFibGVBdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLmF0dHJpYnV0ZXNFbWl0dGVyLmVtaXRUb1RlcnJhZm9ybShcbiAgICAgICAgYXR0LFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgcmVnaXN0ZXJXcml0ZU9ubHlVc2FnZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlKGB9O2ApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICAvLyBgbWFya1dyaXRlT25seUF0dHJpYnV0ZWAgKGNhbGxlZCBmcm9tIGdlbmVyYXRlZCBgc3ludGhlc2l6ZUF0dHJpYnV0ZXMoKWAvXG4gIC8vIGBzeW50aGVzaXplSGNsQXR0cmlidXRlcygpYCBmb3Igd3JpdGUtb25seSBhdHRyaWJ1dGVzLCBzZWVcbiAgLy8gQXR0cmlidXRlc0VtaXR0ZXIjZW1pdFRvVGVycmFmb3JtLyNlbWl0VG9IY2xUZXJyYWZvcm0pIGxpdmVzIG9uXG4gIC8vIFRlcnJhZm9ybVJlc291cmNlIC0gc28gb25seSBtYW5hZ2VkIHJlc291cmNlcyBjYW4gcmVnaXN0ZXIgd3JpdGUtb25seVxuICAvLyB1c2FnZTsgZGF0YSBzb3VyY2VzLCBwcm92aWRlcnMsIGFuZCBlcGhlbWVyYWwgcmVzb3VyY2VzIG9ubHkgZ2V0IHRoZVxuICAvLyBkZXByZWNhdGVkIGdldHRlci5cbiAgLy9cbiAgLy8gd3JpdGUtb25seSBpcyBmdW5kYW1lbnRhbGx5IGEgc3RhdGUgY29uY2VwdCAtIHRoZSB2YWx1ZSBpcyBwYXNzZWQgdG9cbiAgLy8gdGhlIHByb3ZpZGVyIGJ1dCBuZXZlciBwZXJzaXN0ZWQgdG8gc3RhdGUgLSBzbyBnYXRpbmcgdGhpcyBvblxuICAvLyBUZXJyYWZvcm1SZXNvdXJjZSBpcyBhIHNlbWFudGljIGNob2ljZSwgbm90IGEgY2FwYWJpbGl0eSBvbmU6IGVwaGVtZXJhbFxuICAvLyByZXNvdXJjZXMgaGF2ZSBubyBzdGF0ZSBhdCBhbGwsIGFuZCwgY29uc2lzdGVudCB3aXRoIHRoYXQsIG5vIHByb3ZpZGVyXG4gIC8vIHNjaGVtYSBpbiB0aGUgUkZDLTA0IHN3ZWVwIChpbmNsdWRpbmcgdmF1bHQncyAxNiBlcGhlbWVyYWwgcmVzb3VyY2VzKVxuICAvLyBtYXJrcyBhbiBlcGhlbWVyYWwgYXR0cmlidXRlIHdyaXRlX29ubHkuIFNvIGVwaGVtZXJhbCBjbGFzc2VzXG4gIC8vIGRlbGliZXJhdGVseSBsYW5kIGluIHRoZSBzYW1lIFwiZ2V0dGVyIG9ubHlcIiBidWNrZXQgYXMgZGF0YSBzb3VyY2VzIGFuZFxuICAvLyBwcm92aWRlcnMuXG4gIHByaXZhdGUgc3VwcG9ydHNXcml0ZU9ubHlSZWdpc3RyYXRpb24ocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVzb3VyY2UucGFyZW50Q2xhc3NOYW1lID09PSBcIlRlcnJhZm9ybVJlc291cmNlXCI7XG4gIH1cblxuICBwcml2YXRlIGVtaXRSZXNvdXJjZUF0dHJpYnV0ZXMocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICBmb3IgKGNvbnN0IGF0dCBvZiByZXNvdXJjZS5hdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLmF0dHJpYnV0ZXNFbWl0dGVyLmVtaXQoXG4gICAgICAgIGF0dCxcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzRW1pdHRlci5uZWVkc1Jlc2V0RXNjYXBlKGF0dCwgcmVzb3VyY2UuYXR0cmlidXRlcyksXG4gICAgICAgIHRoaXMuYXR0cmlidXRlc0VtaXR0ZXIubmVlZHNJbnB1dEVzY2FwZShhdHQsIHJlc291cmNlLmF0dHJpYnV0ZXMpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRJbml0aWFsaXplcihyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgY29uc3QgY29tbWVudCA9IHNhbml0aXplZENvbW1lbnQodGhpcy5jb2RlKTtcbiAgICBjb21tZW50LmxpbmUoXG4gICAgICBgQ3JlYXRlIGEgbmV3IHtAbGluayAke3Jlc291cmNlLmxpbmtUb0RvY3N9ICR7XG4gICAgICAgIHJlc291cmNlLnRlcnJhZm9ybVJlc291cmNlVHlwZVxuICAgICAgfX0gJHtcbiAgICAgICAgcmVzb3VyY2UuaXNEYXRhU291cmNlXG4gICAgICAgICAgPyBcIkRhdGEgU291cmNlXCJcbiAgICAgICAgICA6IHJlc291cmNlLmlzRXBoZW1lcmFsUmVzb3VyY2VcbiAgICAgICAgICAgID8gXCJFcGhlbWVyYWwgUmVzb3VyY2VcIlxuICAgICAgICAgICAgOiBcIlJlc291cmNlXCJcbiAgICAgIH1gLFxuICAgICk7XG4gICAgY29tbWVudC5saW5lKGBgKTtcbiAgICBjb21tZW50LmxpbmUoYEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0YCk7XG4gICAgY29tbWVudC5saW5lKFxuICAgICAgYEBwYXJhbSBpZCBUaGUgc2NvcGVkIGNvbnN0cnVjdCBJRC4gTXVzdCBiZSB1bmlxdWUgYW1vbmdzdCBzaWJsaW5ncyBpbiB0aGUgc2FtZSBzY29wZWAsXG4gICAgKTtcbiAgICBjb21tZW50LmxpbmUoYEBwYXJhbSBvcHRpb25zICR7cmVzb3VyY2UuY29uZmlnU3RydWN0LmF0dHJpYnV0ZVR5cGV9YCk7XG4gICAgY29tbWVudC5lbmQoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjb25maWc6ICR7cmVzb3VyY2UuY29uZmlnU3RydWN0LmF0dHJpYnV0ZVR5cGV9KWAsXG4gICAgKTtcblxuICAgIGlmIChyZXNvdXJjZS5pc1Byb3ZpZGVyKSB7XG4gICAgICB0aGlzLmVtaXRQcm92aWRlclN1cGVyKHJlc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHJlc291cmNlLmlzRXBoZW1lcmFsUmVzb3VyY2UpIHtcbiAgICAgIHRoaXMuZW1pdEVwaGVtZXJhbFJlc291cmNlU3VwZXIocmVzb3VyY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRSZXNvdXJjZVN1cGVyKHJlc291cmNlKTtcbiAgICB9XG5cbiAgICAvLyBpbml0aWFsaXplIGNvbmZpZyBwcm9wZXJ0aWVzXG4gICAgZm9yIChjb25zdCBhdHQgb2YgcmVzb3VyY2UuY29uZmlnU3RydWN0LmFzc2lnbmFibGVBdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAoYXR0LnNldHRlclR5cGUuX3R5cGUgPT09IFwic3RvcmVkX2NsYXNzXCIpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYHRoaXMuJHthdHQuc3RvcmFnZU5hbWV9LmludGVybmFsVmFsdWUgPSBjb25maWcuJHthdHQubmFtZX07YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKGB0aGlzLiR7YXR0LnN0b3JhZ2VOYW1lfSA9IGNvbmZpZy4ke2F0dC5uYW1lfTtgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVzb3VyY2VTdXBlcihyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5vcGVuKGBzdXBlcihzY29wZSwgaWQsIHtgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6ICcke3Jlc291cmNlLnRlcnJhZm9ybVJlc291cmNlVHlwZX0nLGAsXG4gICAgKTtcbiAgICB0aGlzLmVtaXRUZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YShyZXNvdXJjZSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHByb3ZpZGVyOiBjb25maWcucHJvdmlkZXIsYCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYGRlcGVuZHNPbjogY29uZmlnLmRlcGVuZHNPbixgKTtcbiAgICB0aGlzLmNvZGUubGluZShgY291bnQ6IGNvbmZpZy5jb3VudCxgKTtcbiAgICB0aGlzLmNvZGUubGluZShgbGlmZWN5Y2xlOiBjb25maWcubGlmZWN5Y2xlLGApO1xuICAgIHRoaXMuY29kZS5saW5lKGBwcm92aXNpb25lcnM6IGNvbmZpZy5wcm92aXNpb25lcnMsYCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYGNvbm5lY3Rpb246IGNvbmZpZy5jb25uZWN0aW9uLGApO1xuICAgIHRoaXMuY29kZS5saW5lKGBmb3JFYWNoOiBjb25maWcuZm9yRWFjaGApO1xuICAgIHRoaXMuY29kZS5jbG9zZShgfSk7YCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRFcGhlbWVyYWxSZXNvdXJjZVN1cGVyKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgdGhpcy5jb2RlLm9wZW4oYHN1cGVyKHNjb3BlLCBpZCwge2ApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHRlcnJhZm9ybVJlc291cmNlVHlwZTogJyR7cmVzb3VyY2UudGVycmFmb3JtUmVzb3VyY2VUeXBlfScsYCxcbiAgICApO1xuICAgIHRoaXMuZW1pdFRlcnJhZm9ybUdlbmVyYXRvck1ldGFkYXRhKHJlc291cmNlKTtcbiAgICB0aGlzLmNvZGUubGluZShgcHJvdmlkZXI6IGNvbmZpZy5wcm92aWRlcixgKTtcbiAgICB0aGlzLmNvZGUubGluZShgZGVwZW5kc09uOiBjb25maWcuZGVwZW5kc09uLGApO1xuICAgIHRoaXMuY29kZS5saW5lKGBjb3VudDogY29uZmlnLmNvdW50LGApO1xuICAgIHRoaXMuY29kZS5saW5lKGBsaWZlY3ljbGU6IGNvbmZpZy5saWZlY3ljbGUsYCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYGZvckVhY2g6IGNvbmZpZy5mb3JFYWNoYCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlKGB9KTtgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFByb3ZpZGVyU3VwZXIocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICB0aGlzLmNvZGUub3Blbihgc3VwZXIoc2NvcGUsIGlkLCB7YCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiAnJHtyZXNvdXJjZS50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9JyxgLFxuICAgICk7XG4gICAgdGhpcy5lbWl0VGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGEocmVzb3VyY2UpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHRlcnJhZm9ybVByb3ZpZGVyU291cmNlOiAnJHtyZXNvdXJjZS50ZXJyYWZvcm1Qcm92aWRlclNvdXJjZX0nYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZShgfSk7YCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRUZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YShyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5vcGVuKGB0ZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YToge2ApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHByb3ZpZGVyTmFtZTogJyR7cmVzb3VyY2UucHJvdmlkZXJ9JyR7XG4gICAgICAgIHJlc291cmNlLnByb3ZpZGVyVmVyc2lvbiB8fCByZXNvdXJjZS5wcm92aWRlclZlcnNpb25Db25zdHJhaW50XG4gICAgICAgICAgPyBcIixcIlxuICAgICAgICAgIDogXCJcIlxuICAgICAgfWAsXG4gICAgKTtcblxuICAgIGlmIChyZXNvdXJjZS5wcm92aWRlclZlcnNpb24pIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgcHJvdmlkZXJWZXJzaW9uOiAnJHtyZXNvdXJjZS5wcm92aWRlclZlcnNpb259JyR7XG4gICAgICAgICAgcmVzb3VyY2UucHJvdmlkZXJWZXJzaW9uQ29uc3RyYWludCA/IFwiLFwiIDogXCJcIlxuICAgICAgICB9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHJlc291cmNlLnByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgcHJvdmlkZXJWZXJzaW9uQ29uc3RyYWludDogJyR7cmVzb3VyY2UucHJvdmlkZXJWZXJzaW9uQ29uc3RyYWludH0nYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlKGB9LGApO1xuICB9XG59XG4iXX0=