@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
@@ -11,7 +11,9 @@ export interface AttributeTypeModel {
11
11
  readonly typeModelType: string;
12
12
  readonly hasReferenceClass: boolean;
13
13
  readonly isTokenizable: boolean;
14
+ readonly isStoredClassUnavailable: boolean;
14
15
  }
16
+ export declare function describeTerraformType(model: AttributeTypeModel): string;
15
17
  export declare class SkippedAttributeTypeModel implements AttributeTypeModel {
16
18
  constructor();
17
19
  get typeModelType(): string;
@@ -25,6 +27,7 @@ export declare class SkippedAttributeTypeModel implements AttributeTypeModel {
25
27
  get toHclTerraformFunction(): string;
26
28
  get hasReferenceClass(): boolean;
27
29
  get isTokenizable(): boolean;
30
+ get isStoredClassUnavailable(): boolean;
28
31
  }
29
32
  export declare class SimpleAttributeTypeModel implements AttributeTypeModel {
30
33
  readonly type: string;
@@ -40,6 +43,7 @@ export declare class SimpleAttributeTypeModel implements AttributeTypeModel {
40
43
  get toHclTerraformFunction(): string;
41
44
  get hasReferenceClass(): boolean;
42
45
  get isTokenizable(): boolean;
46
+ get isStoredClassUnavailable(): boolean;
43
47
  }
44
48
  export declare class StructAttributeTypeModel implements AttributeTypeModel {
45
49
  readonly struct: Struct;
@@ -54,9 +58,14 @@ export declare class StructAttributeTypeModel implements AttributeTypeModel {
54
58
  get toHclTerraformFunction(): string;
55
59
  get hasReferenceClass(): boolean;
56
60
  get isTokenizable(): boolean;
61
+ get isStoredClassUnavailable(): boolean;
57
62
  }
58
63
  export interface CollectionAttributeTypeModel extends AttributeTypeModel {
59
64
  elementType: AttributeTypeModel;
65
+ readonly resolvedStoredClass: {
66
+ name: string;
67
+ collapsed: boolean;
68
+ } | undefined;
60
69
  }
61
70
  export declare class ListAttributeTypeModel implements CollectionAttributeTypeModel {
62
71
  readonly elementType: AttributeTypeModel;
@@ -68,12 +77,17 @@ export declare class ListAttributeTypeModel implements CollectionAttributeTypeMo
68
77
  get isComplex(): boolean;
69
78
  getStoredClassInitializer(name: string): string;
70
79
  get storedClassType(): string;
80
+ get resolvedStoredClass(): {
81
+ name: string;
82
+ collapsed: boolean;
83
+ } | undefined;
71
84
  get inputTypeDefinition(): string;
72
85
  getAttributeAccessFunction(name: string): string;
73
86
  get toTerraformFunction(): string;
74
87
  get toHclTerraformFunction(): string;
75
88
  get hasReferenceClass(): boolean;
76
89
  get isTokenizable(): boolean;
90
+ get isStoredClassUnavailable(): boolean;
77
91
  }
78
92
  export declare class SetAttributeTypeModel implements CollectionAttributeTypeModel {
79
93
  readonly elementType: AttributeTypeModel;
@@ -85,12 +99,17 @@ export declare class SetAttributeTypeModel implements CollectionAttributeTypeMod
85
99
  get isComplex(): boolean;
86
100
  getStoredClassInitializer(name: string): string;
87
101
  get storedClassType(): string;
102
+ get resolvedStoredClass(): {
103
+ name: string;
104
+ collapsed: boolean;
105
+ } | undefined;
88
106
  get inputTypeDefinition(): string;
89
107
  getAttributeAccessFunction(name: string): string;
90
108
  get toTerraformFunction(): string;
91
109
  get toHclTerraformFunction(): string;
92
110
  get hasReferenceClass(): boolean;
93
111
  get isTokenizable(): boolean;
112
+ get isStoredClassUnavailable(): boolean;
94
113
  }
95
114
  export declare class MapAttributeTypeModel implements CollectionAttributeTypeModel {
96
115
  readonly elementType: AttributeTypeModel;
@@ -100,11 +119,16 @@ export declare class MapAttributeTypeModel implements CollectionAttributeTypeMod
100
119
  get isComplex(): boolean;
101
120
  getStoredClassInitializer(name: string): string;
102
121
  get storedClassType(): string;
122
+ get resolvedStoredClass(): {
123
+ name: string;
124
+ collapsed: boolean;
125
+ } | undefined;
103
126
  get inputTypeDefinition(): string;
104
127
  getAttributeAccessFunction(name: string): string;
105
128
  get toTerraformFunction(): string;
106
129
  get toHclTerraformFunction(): string;
107
130
  get hasReferenceClass(): boolean;
108
131
  get isTokenizable(): boolean;
132
+ get isStoredClassUnavailable(): boolean;
109
133
  }
110
134
  //# sourceMappingURL=attribute-type-model.d.ts.map
@@ -1,7 +1,32 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MapAttributeTypeModel = exports.SetAttributeTypeModel = exports.ListAttributeTypeModel = exports.StructAttributeTypeModel = exports.SimpleAttributeTypeModel = exports.SkippedAttributeTypeModel = void 0;
3
+ exports.MapAttributeTypeModel = exports.SetAttributeTypeModel = exports.ListAttributeTypeModel = exports.StructAttributeTypeModel = exports.SimpleAttributeTypeModel = exports.SkippedAttributeTypeModel = exports.describeTerraformType = void 0;
4
4
  const util_1 = require("../../../util");
5
+ const supported_stored_classes_1 = require("./supported-stored-classes");
6
+ // Describes the Terraform type of an attribute as its `list(...)`/`set(...)`/`map(...)`
7
+ // composed notation (matching how Terraform itself describes nested collection types),
8
+ // for use in generated JSDoc. Used only for collapsed/fallback getters (see
9
+ // AttributesEmitter) so it never needs to be exhaustive/perfectly stable for every shape.
10
+ function describeTerraformType(model) {
11
+ switch (model.typeModelType) {
12
+ case "list":
13
+ return `list(${describeTerraformType(model.elementType)})`;
14
+ case "set":
15
+ return `set(${describeTerraformType(model.elementType)})`;
16
+ case "map":
17
+ return `map(${describeTerraformType(model.elementType)})`;
18
+ case "struct":
19
+ return "object";
20
+ default:
21
+ // Covers both SimpleAttributeTypeModel (storedClassType is the Terraform primitive
22
+ // name, e.g. "string" | "number" | "boolean" | "any") and SkippedAttributeTypeModel
23
+ // (storedClassType is always "any").
24
+ return model.storedClassType === "boolean"
25
+ ? "bool"
26
+ : model.storedClassType;
27
+ }
28
+ }
29
+ exports.describeTerraformType = describeTerraformType;
5
30
  class SkippedAttributeTypeModel {
6
31
  constructor() { }
7
32
  get typeModelType() {
@@ -38,6 +63,9 @@ class SkippedAttributeTypeModel {
38
63
  get isTokenizable() {
39
64
  return false;
40
65
  }
66
+ get isStoredClassUnavailable() {
67
+ return false;
68
+ }
41
69
  }
42
70
  exports.SkippedAttributeTypeModel = SkippedAttributeTypeModel;
43
71
  class SimpleAttributeTypeModel {
@@ -83,6 +111,9 @@ class SimpleAttributeTypeModel {
83
111
  get isTokenizable() {
84
112
  return true;
85
113
  }
114
+ get isStoredClassUnavailable() {
115
+ return false;
116
+ }
86
117
  }
87
118
  exports.SimpleAttributeTypeModel = SimpleAttributeTypeModel;
88
119
  class StructAttributeTypeModel {
@@ -120,6 +151,9 @@ class StructAttributeTypeModel {
120
151
  get isTokenizable() {
121
152
  return false;
122
153
  }
154
+ get isStoredClassUnavailable() {
155
+ return false;
156
+ }
123
157
  }
124
158
  exports.StructAttributeTypeModel = StructAttributeTypeModel;
125
159
  class ListAttributeTypeModel {
@@ -149,13 +183,16 @@ class ListAttributeTypeModel {
149
183
  return `new ${this.storedClassType}(this, "${name}", false)`;
150
184
  }
151
185
  else {
152
- return `new cdktn.${(0, util_1.uppercaseFirst)(this.storedClassType)}(this, "${name}", false)`;
186
+ return `new cdktn.${this.resolvedStoredClass.name}(this, "${name}", false)`;
153
187
  }
154
188
  }
155
189
  }
156
190
  get storedClassType() {
157
191
  return `${this.elementType.storedClassType}List`;
158
192
  }
193
+ get resolvedStoredClass() {
194
+ return (0, supported_stored_classes_1.resolveStoredClassName)(this.storedClassType, this.elementType.typeModelType);
195
+ }
159
196
  get inputTypeDefinition() {
160
197
  if (this.isSingleItem) {
161
198
  return this.elementType.inputTypeDefinition;
@@ -207,6 +244,33 @@ class ListAttributeTypeModel {
207
244
  return false;
208
245
  }
209
246
  }
247
+ // Complex (struct) elements generate their own class in the provider output, so they
248
+ // are always fine. Otherwise a stored class is only emitted if resolvedStoredClass
249
+ // finds one - see getStoredClassInitializer above. Note: hasReferenceClass (which
250
+ // triggers a stored_class getter) is only ever true here when isSingleItem or isComplex
251
+ // is true, and isSingleItem is only set for struct/block nesting (which is also
252
+ // isComplex), so this check only needs to guard the non-complex, non-single-item case.
253
+ //
254
+ // storedClassType is itself built up recursively (elementType.storedClassType is
255
+ // composed the same way for nested collections), so it already fully encodes the
256
+ // entire nested chain in one string (e.g. map(map(list(string))) composes all the way
257
+ // up to "stringListMapMap"). resolvedStoredClass first checks this type's own composed
258
+ // name (e.g. "StringListMapMap") against the fixed set of hand-written core classes; if
259
+ // that name doesn't exist, it falls back to the nearest typed "Any"-wrapper that still
260
+ // encodes this type's own layer and its element's layer (e.g. "AnyMapMap"), collapsing
261
+ // only the unsupported inner shape while preserving typed navigation for the outer
262
+ // layers; only if neither exists does it fall through to the plain, untyped getter (see
263
+ // AttributeModel.getterType). It must NOT also OR in
264
+ // elementType.isStoredClassUnavailable, since an inner element's un-composed name (e.g.
265
+ // "StringList" for a plain list(string) nested inside a map) is never separately
266
+ // instantiated and is irrelevant on its own; ORing it in would produce false positives
267
+ // that regress supported nestings such as map(list(string)) => cdktn.StringListMap.
268
+ get isStoredClassUnavailable() {
269
+ if (this.isComplex) {
270
+ return false;
271
+ }
272
+ return this.resolvedStoredClass === undefined;
273
+ }
210
274
  }
211
275
  exports.ListAttributeTypeModel = ListAttributeTypeModel;
212
276
  class SetAttributeTypeModel {
@@ -236,13 +300,16 @@ class SetAttributeTypeModel {
236
300
  return `new ${this.storedClassType}(this, "${name}", true)`;
237
301
  }
238
302
  else {
239
- return `new cdktn.${(0, util_1.uppercaseFirst)(this.storedClassType)}(this, "${name}", true)`;
303
+ return `new cdktn.${this.resolvedStoredClass.name}(this, "${name}", true)`;
240
304
  }
241
305
  }
242
306
  }
243
307
  get storedClassType() {
244
308
  return `${this.elementType.storedClassType}List`;
245
309
  }
310
+ get resolvedStoredClass() {
311
+ return (0, supported_stored_classes_1.resolveStoredClassName)(this.storedClassType, this.elementType.typeModelType);
312
+ }
246
313
  get inputTypeDefinition() {
247
314
  if (this.isSingleItem) {
248
315
  return this.elementType.inputTypeDefinition;
@@ -301,6 +368,14 @@ class SetAttributeTypeModel {
301
368
  return false;
302
369
  }
303
370
  }
371
+ // See comment on ListAttributeTypeModel.isStoredClassUnavailable above - same
372
+ // reasoning applies here.
373
+ get isStoredClassUnavailable() {
374
+ if (this.isComplex) {
375
+ return false;
376
+ }
377
+ return this.resolvedStoredClass === undefined;
378
+ }
304
379
  }
305
380
  exports.SetAttributeTypeModel = SetAttributeTypeModel;
306
381
  class MapAttributeTypeModel {
@@ -321,12 +396,15 @@ class MapAttributeTypeModel {
321
396
  return `new ${this.storedClassType}(this, "${name}")`;
322
397
  }
323
398
  else {
324
- return `new cdktn.${(0, util_1.uppercaseFirst)(this.storedClassType)}(this, "${name}")`;
399
+ return `new cdktn.${this.resolvedStoredClass.name}(this, "${name}")`;
325
400
  }
326
401
  }
327
402
  get storedClassType() {
328
403
  return `${this.elementType.storedClassType}Map`;
329
404
  }
405
+ get resolvedStoredClass() {
406
+ return (0, supported_stored_classes_1.resolveStoredClassName)(this.storedClassType, this.elementType.typeModelType);
407
+ }
330
408
  get inputTypeDefinition() {
331
409
  // map of booleans has token support, but booleans don't
332
410
  if (this.elementType.storedClassType === "boolean") {
@@ -371,6 +449,14 @@ class MapAttributeTypeModel {
371
449
  return false;
372
450
  }
373
451
  }
452
+ // See comment on ListAttributeTypeModel.isStoredClassUnavailable above - same
453
+ // reasoning applies here (MapAttributeTypeModel.hasReferenceClass is just isComplex).
454
+ get isStoredClassUnavailable() {
455
+ if (this.isComplex) {
456
+ return false;
457
+ }
458
+ return this.resolvedStoredClass === undefined;
459
+ }
374
460
  }
375
461
  exports.MapAttributeTypeModel = MapAttributeTypeModel;
376
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLXR5cGUtbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ2V0L2dlbmVyYXRvci9tb2RlbHMvYXR0cmlidXRlLXR5cGUtbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0Esd0NBQThEO0FBZ0I5RCxNQUFhLHlCQUF5QjtJQUNwQyxnQkFBZSxDQUFDO0lBRWhCLElBQUksYUFBYTtRQUNmLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQseUJBQXlCLENBQUMsS0FBYTtRQUNyQyxXQUFXO1FBQ1gsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELDBCQUEwQixDQUFDLElBQVk7UUFDckMsT0FBTyxtQ0FBbUMsSUFBSSxJQUFJLENBQUM7SUFDckQsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLE9BQU8sc0JBQXNCLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksc0JBQXNCO1FBQ3hCLE9BQU8seUJBQXlCLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FBL0NELDhEQStDQztBQUVELE1BQWEsd0JBQXdCO0lBQ25DLFlBQTRCLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFRO0lBQUcsQ0FBQztJQUU1QyxJQUFJLGFBQWE7UUFDZixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHlCQUF5QixDQUFDLEtBQWE7UUFDckMsV0FBVztRQUNYLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixPQUFPLDZCQUE2QixDQUFDO1FBQ3ZDLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRUQsMEJBQTBCLENBQUMsSUFBWTtRQUNyQyxPQUFPLFdBQVcsSUFBQSxxQkFBYyxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQztJQUNwRSxDQUFDO0lBRUQsSUFBSSxtQkFBbUI7UUFDckIsT0FBTyxTQUFTLElBQUksQ0FBQyxJQUFJLGFBQWEsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxzQkFBc0I7UUFDeEIsT0FBTyxTQUFTLElBQUksQ0FBQyxJQUFJLGdCQUFnQixDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQW5ERCw0REFtREM7QUFFRCxNQUFhLHdCQUF3QjtJQUNuQyxZQUE0QixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUFHLENBQUM7SUFFOUMsSUFBSSxhQUFhO1FBQ2YsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHlCQUF5QixDQUFDLElBQVk7UUFDcEMsT0FBTyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLFdBQVcsSUFBSSxJQUFJLENBQUM7SUFDbkUsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxJQUFZO1FBQ3JDLG1DQUFtQztRQUNuQyxPQUFPLG1DQUFtQyxJQUFJLElBQUksQ0FBQztJQUNyRCxDQUFDO0lBRUQsSUFBSSxtQkFBbUI7UUFDckIsT0FBTyxHQUFHLElBQUEsb0JBQWEsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDekQsQ0FBQztJQUVELElBQUksc0JBQXNCO1FBQ3hCLE9BQU8sR0FBRyxJQUFBLG9CQUFhLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FBM0NELDREQTJDQztBQU1ELE1BQWEsc0JBQXNCO0lBQ2pDLFlBQ2tCLFdBQStCLEVBQy9CLFlBQXFCLEVBQ3BCLE9BQWdCO1FBRmpCLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixpQkFBWSxHQUFaLFlBQVksQ0FBUztRQUNwQixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBRWpDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDO1FBQ3hELENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7SUFDcEMsQ0FBQztJQUVELHlCQUF5QixDQUFDLElBQVk7UUFDcEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsT0FBTyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSwwQkFBMEIsSUFBSSxJQUFJLENBQUM7UUFDbkYsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxPQUFPLElBQUksQ0FBQyxlQUFlLFdBQVcsSUFBSSxXQUFXLENBQUM7WUFDL0QsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sYUFBYSxJQUFBLHFCQUFjLEVBQ2hDLElBQUksQ0FBQyxlQUFlLENBQ3JCLFdBQVcsSUFBSSxXQUFXLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsTUFBTSxDQUFDO0lBQ25ELENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNyQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUM7UUFDOUMsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUQsT0FBTyx3REFBd0QsQ0FBQztRQUNsRSxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUIsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSx3QkFBd0IsQ0FBQztRQUNyRSxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2RCxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsd0JBQXdCLENBQUM7UUFDekUsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBRUQsMEJBQTBCLENBQUMsSUFBWTtRQUNyQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekMsS0FBSyxRQUFRO2dCQUNYLE9BQU8sMEJBQTBCLElBQUksSUFBSSxDQUFDO1lBQzVDLEtBQUssUUFBUTtnQkFDWCxPQUFPLGdDQUFnQyxJQUFJLElBQUksQ0FBQztRQUNwRCxDQUFDO1FBRUQsT0FBTyxtQ0FBbUMsSUFBSSxJQUFJLENBQUM7SUFDckQsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsT0FBTyxvQkFBb0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUM7SUFDdEYsQ0FBQztJQUVELElBQUksc0JBQXNCO1FBQ3hCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQztRQUNqRCxDQUFDO1FBRUQsT0FBTyx1QkFBdUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsS0FBSyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUM7SUFDNUYsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekMsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxDQUFDO1lBQ2QsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxDQUFDO1lBQ2Q7Z0JBQ0UsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQS9GRCx3REErRkM7QUFFRCxNQUFhLHFCQUFxQjtJQUNoQyxZQUNrQixXQUErQixFQUMvQixZQUFxQixFQUNwQixPQUFnQjtRQUZqQixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDL0IsaUJBQVksR0FBWixZQUFZLENBQVM7UUFDcEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUVqQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLEtBQUssQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7SUFDcEMsQ0FBQztJQUVELHlCQUF5QixDQUFDLElBQVk7UUFDcEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsT0FBTyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSwwQkFBMEIsSUFBSSxJQUFJLENBQUM7UUFDbkYsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxPQUFPLElBQUksQ0FBQyxlQUFlLFdBQVcsSUFBSSxVQUFVLENBQUM7WUFDOUQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sYUFBYSxJQUFBLHFCQUFjLEVBQ2hDLElBQUksQ0FBQyxlQUFlLENBQ3JCLFdBQVcsSUFBSSxVQUFVLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsTUFBTSxDQUFDO0lBQ25ELENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNyQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUM7UUFDOUMsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUQsT0FBTyx3REFBd0QsQ0FBQztRQUNsRSxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUIsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSx3QkFBd0IsQ0FBQztRQUNyRSxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2RCxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsd0JBQXdCLENBQUM7UUFDekUsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBRUQsMEJBQTBCLENBQUMsSUFBWTtRQUNyQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekMsS0FBSyxRQUFRO2dCQUNYLE9BQU8sMENBQTBDLElBQUksS0FBSyxDQUFDO1lBQzdELEtBQUssUUFBUTtnQkFDWCxPQUFPLHlFQUF5RSxJQUFJLE1BQU0sQ0FBQztRQUMvRixDQUFDO1FBRUQsNkZBQTZGO1FBQzdGLCtGQUErRjtRQUMvRix3RUFBd0U7UUFDeEUsMEVBQTBFO1FBQzFFLHdEQUF3RDtRQUN4RCxPQUFPLHFFQUFxRSxJQUFJLE1BQU0sQ0FBQztJQUN6RixDQUFDO0lBRUQsSUFBSSxtQkFBbUI7UUFDckIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDO1FBQzlDLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxvQkFBb0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUM7UUFDdEYsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLHNCQUFzQjtRQUN4QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUM7UUFDakQsQ0FBQztRQUNELE9BQU8sdUJBQXVCLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLEtBQUssSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDO0lBQzVGLENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLEtBQUssUUFBUTtnQkFDWCxPQUFPLElBQUksQ0FBQztZQUNkLEtBQUssUUFBUTtnQkFDWCxPQUFPLElBQUksQ0FBQztZQUNkO2dCQUNFLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFwR0Qsc0RBb0dDO0FBRUQsTUFBYSxxQkFBcUI7SUFDaEMsWUFBNEIsV0FBK0I7UUFBL0IsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO0lBQUcsQ0FBQztJQUUvRCxJQUFJLGFBQWE7UUFDZixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO0lBQ3BDLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxJQUFZO1FBQ3BDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLE9BQU8sT0FBTyxJQUFJLENBQUMsZUFBZSxXQUFXLElBQUksSUFBSSxDQUFDO1FBQ3hELENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxhQUFhLElBQUEscUJBQWMsRUFDaEMsSUFBSSxDQUFDLGVBQWUsQ0FDckIsV0FBVyxJQUFJLElBQUksQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEtBQUssQ0FBQztJQUNsRCxDQUFDO0lBRUQsSUFBSSxtQkFBbUI7UUFDckIsd0RBQXdEO1FBQ3hELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkQsT0FBTyxxQkFBcUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLHlCQUF5QixDQUFDO1FBQ3hGLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQixPQUFPLG9CQUFvQixJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsd0JBQXdCLENBQUM7UUFDdEYsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdkQsT0FBTyxvQkFBb0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsd0JBQXdCLENBQUM7UUFDMUYsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLG9CQUFvQixJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsSUFBSSxDQUFDO1FBQ2xFLENBQUM7SUFDSCxDQUFDO0lBRUQsMEJBQTBCLENBQUMsSUFBWTtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNuRSxPQUFPLG1DQUFtQyxJQUFJLElBQUksQ0FBQztRQUNyRCxDQUFDO1FBRUQsT0FBTyxXQUFXLElBQUEscUJBQWMsRUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FDckIsY0FBYyxJQUFJLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxtQkFBbUI7UUFDckIsT0FBTyxvQkFBb0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsR0FBRyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxJQUFJLHNCQUFzQjtRQUN4QixPQUFPLHVCQUF1QixJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixHQUFHLENBQUM7SUFDM0UsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLEtBQUssUUFBUTtnQkFDWCxPQUFPLElBQUksQ0FBQztZQUNkLEtBQUssUUFBUTtnQkFDWCxPQUFPLElBQUksQ0FBQztZQUNkLEtBQUssU0FBUztnQkFDWixPQUFPLElBQUksQ0FBQztZQUNkLEtBQUssS0FBSztnQkFDUixPQUFPLElBQUksQ0FBQztZQUNkO2dCQUNFLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE5RUQsc0RBOEVDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7IFN0cnVjdCB9IGZyb20gXCIuL3N0cnVjdFwiO1xuaW1wb3J0IHsgdXBwZXJjYXNlRmlyc3QsIGRvd25jYXNlRmlyc3QgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZVR5cGVNb2RlbCB7XG4gIHJlYWRvbmx5IHN0cnVjdD86IFN0cnVjdDsgLy8gY29tcGxleCBvYmplY3QgdHlwZSBjb250YWluZWQgd2l0aGluIHRoZSB0eXBlXG4gIHJlYWRvbmx5IGlzQ29tcGxleDogYm9vbGVhbjsgLy8gYmFzaWNhbGx5IHRoZSBzYW1lIGFzIGhhdmluZyBhIHN0cnVjdFxuICBnZXRTdG9yZWRDbGFzc0luaXRpYWxpemVyKG5hbWU6IHN0cmluZyk6IHN0cmluZzsgLy8gaW5pdGlhbGl6ZXIgZm9yIGtlZXBpbmcgY2xhc3MgbmVlZGVkIHRvIGtlZXAgdHJhY2sgb2YgcmVmZXJlbmNlIGFjY2Vzc1xuICByZWFkb25seSBzdG9yZWRDbGFzc1R5cGU6IHN0cmluZzsgLy8gdXNlZCBtYWlubHkgYnkgY29sbGVjdGlvbiB0eXBlcyB0byBnZW5lcmF0ZSB0aGVpciBzdG9yZWQgY2xhc3MgaW5pdGlhbGl6ZXJcbiAgcmVhZG9ubHkgaW5wdXRUeXBlRGVmaW5pdGlvbjogc3RyaW5nOyAvLyB0aGlzIGlzIHRoZSB0eXBlIHVzZWQgZm9yIGlucHV0dGluZyB2YWx1ZXNcbiAgZ2V0QXR0cmlidXRlQWNjZXNzRnVuY3Rpb24obmFtZTogc3RyaW5nKTogc3RyaW5nOyAvLyB0aGlzIGlzIGZvciBnZXR0aW5nIHJlZmVyZW5jZSBmb3Igc2ltcGxlIHR5cGVzXG4gIHJlYWRvbmx5IHRvVGVycmFmb3JtRnVuY3Rpb246IHN0cmluZzsgLy8gdGhpcyBpcyBmb3IgY29udmVydGluZyBpbnB1dCB2YWx1ZXMgdG8gVGVycmFmb3JtIHN5bnRheFxuICByZWFkb25seSB0b0hjbFRlcnJhZm9ybUZ1bmN0aW9uOiBzdHJpbmc7IC8vIHRoaXMgaXMgZm9yIGNvbnZlcnRpbmcgaW5wdXQgdmFsdWVzIHRvIFRlcnJhZm9ybSBzeW50YXggaW4gSENMXG4gIHJlYWRvbmx5IHR5cGVNb2RlbFR5cGU6IHN0cmluZzsgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byB1c2UgaW5zdGFuY2VvZlxuICByZWFkb25seSBoYXNSZWZlcmVuY2VDbGFzczogYm9vbGVhbjsgLy8gdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBzdG9yZWRfY2xhc3MgZ2V0dGVyIHNob3VsZCBiZSB1c2VkXG4gIHJlYWRvbmx5IGlzVG9rZW5pemFibGU6IGJvb2xlYW47IC8vIGNhbiB0aGUgdHlwZSBiZSByZXByZXNlbnRlZCBieSBhIHRva2VuIHR5cGVcbn1cblxuZXhwb3J0IGNsYXNzIFNraXBwZWRBdHRyaWJ1dGVUeXBlTW9kZWwgaW1wbGVtZW50cyBBdHRyaWJ1dGVUeXBlTW9kZWwge1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgZ2V0IHR5cGVNb2RlbFR5cGUoKSB7XG4gICAgcmV0dXJuIFwic2ltcGxlXCI7XG4gIH1cblxuICBnZXQgc3RydWN0KCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgaXNDb21wbGV4KCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldFN0b3JlZENsYXNzSW5pdGlhbGl6ZXIoX25hbWU6IHN0cmluZykge1xuICAgIC8vIG5vdCB1c2VkXG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICBnZXQgc3RvcmVkQ2xhc3NUeXBlKCkge1xuICAgIHJldHVybiBcImFueVwiO1xuICB9XG5cbiAgZ2V0IGlucHV0VHlwZURlZmluaXRpb24oKSB7XG4gICAgcmV0dXJuIFwiYW55XCI7XG4gIH1cblxuICBnZXRBdHRyaWJ1dGVBY2Nlc3NGdW5jdGlvbihuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYHRoaXMuaW50ZXJwb2xhdGlvbkZvckF0dHJpYnV0ZSgnJHtuYW1lfScpYDtcbiAgfVxuXG4gIGdldCB0b1RlcnJhZm9ybUZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBgY2RrdG4uYW55VG9UZXJyYWZvcm1gO1xuICB9XG5cbiAgZ2V0IHRvSGNsVGVycmFmb3JtRnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGBjZGt0bi5hbnlUb0hjbFRlcnJhZm9ybWA7XG4gIH1cblxuICBnZXQgaGFzUmVmZXJlbmNlQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IGlzVG9rZW5pemFibGUoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTaW1wbGVBdHRyaWJ1dGVUeXBlTW9kZWwgaW1wbGVtZW50cyBBdHRyaWJ1dGVUeXBlTW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3RyaW5nKSB7fVxuXG4gIGdldCB0eXBlTW9kZWxUeXBlKCkge1xuICAgIHJldHVybiBcInNpbXBsZVwiO1xuICB9XG5cbiAgZ2V0IHN0cnVjdCgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0IGlzQ29tcGxleCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRTdG9yZWRDbGFzc0luaXRpYWxpemVyKF9uYW1lOiBzdHJpbmcpIHtcbiAgICAvLyBub3QgdXNlZFxuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgZ2V0IHN0b3JlZENsYXNzVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlO1xuICB9XG5cbiAgZ2V0IGlucHV0VHlwZURlZmluaXRpb24oKSB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBcImJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlO1xuICAgIH1cbiAgfVxuXG4gIGdldEF0dHJpYnV0ZUFjY2Vzc0Z1bmN0aW9uKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBgdGhpcy5nZXQke3VwcGVyY2FzZUZpcnN0KHRoaXMudHlwZSl9QXR0cmlidXRlKCcke25hbWV9JylgO1xuICB9XG5cbiAgZ2V0IHRvVGVycmFmb3JtRnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGBjZGt0bi4ke3RoaXMudHlwZX1Ub1RlcnJhZm9ybWA7XG4gIH1cblxuICBnZXQgdG9IY2xUZXJyYWZvcm1GdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYGNka3RuLiR7dGhpcy50eXBlfVRvSGNsVGVycmFmb3JtYDtcbiAgfVxuXG4gIGdldCBoYXNSZWZlcmVuY2VDbGFzcygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgaXNUb2tlbml6YWJsZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsIGltcGxlbWVudHMgQXR0cmlidXRlVHlwZU1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHN0cnVjdDogU3RydWN0KSB7fVxuXG4gIGdldCB0eXBlTW9kZWxUeXBlKCkge1xuICAgIHJldHVybiBcInN0cnVjdFwiO1xuICB9XG5cbiAgZ2V0IGlzQ29tcGxleCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFN0b3JlZENsYXNzSW5pdGlhbGl6ZXIobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGBuZXcgJHt0aGlzLnN0cnVjdC5vdXRwdXRSZWZlcmVuY2VOYW1lfSh0aGlzLCBcIiR7bmFtZX1cIilgO1xuICB9XG5cbiAgZ2V0IHN0b3JlZENsYXNzVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJ1Y3QubmFtZTtcbiAgfVxuXG4gIGdldCBpbnB1dFR5cGVEZWZpbml0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnN0cnVjdC5uYW1lO1xuICB9XG5cbiAgZ2V0QXR0cmlidXRlQWNjZXNzRnVuY3Rpb24obmFtZTogc3RyaW5nKSB7XG4gICAgLy8gVGhpcyBzaG91bG4ndCBhY3R1YWxseSBiZSBjYWxsZWRcbiAgICByZXR1cm4gYHRoaXMuaW50ZXJwb2xhdGlvbkZvckF0dHJpYnV0ZSgnJHtuYW1lfScpYDtcbiAgfVxuXG4gIGdldCB0b1RlcnJhZm9ybUZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBgJHtkb3duY2FzZUZpcnN0KHRoaXMuc3RydWN0Lm5hbWUpfVRvVGVycmFmb3JtYDtcbiAgfVxuXG4gIGdldCB0b0hjbFRlcnJhZm9ybUZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBgJHtkb3duY2FzZUZpcnN0KHRoaXMuc3RydWN0Lm5hbWUpfVRvSGNsVGVycmFmb3JtYDtcbiAgfVxuXG4gIGdldCBoYXNSZWZlcmVuY2VDbGFzcygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldCBpc1Rva2VuaXphYmxlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25BdHRyaWJ1dGVUeXBlTW9kZWwgZXh0ZW5kcyBBdHRyaWJ1dGVUeXBlTW9kZWwge1xuICBlbGVtZW50VHlwZTogQXR0cmlidXRlVHlwZU1vZGVsO1xufVxuXG5leHBvcnQgY2xhc3MgTGlzdEF0dHJpYnV0ZVR5cGVNb2RlbCBpbXBsZW1lbnRzIENvbGxlY3Rpb25BdHRyaWJ1dGVUeXBlTW9kZWwge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudFR5cGU6IEF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXNTaW5nbGVJdGVtOiBib29sZWFuLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaXNCbG9jazogYm9vbGVhbixcbiAgKSB7XG4gICAgaWYgKHRoaXMuc3RydWN0KSB7XG4gICAgICB0aGlzLnN0cnVjdC5pc1NpbmdsZUl0ZW0gPSB0aGlzLmlzU2luZ2xlSXRlbSB8fCBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBnZXQgdHlwZU1vZGVsVHlwZSgpIHtcbiAgICByZXR1cm4gXCJsaXN0XCI7XG4gIH1cblxuICBnZXQgc3RydWN0KCkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnN0cnVjdDtcbiAgfVxuXG4gIGdldCBpc0NvbXBsZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUuaXNDb21wbGV4O1xuICB9XG5cbiAgZ2V0U3RvcmVkQ2xhc3NJbml0aWFsaXplcihuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pc1NpbmdsZUl0ZW0pIHtcbiAgICAgIHJldHVybiBgbmV3ICR7dGhpcy5lbGVtZW50VHlwZS5zdG9yZWRDbGFzc1R5cGV9T3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiJHtuYW1lfVwiKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmlzQ29tcGxleCkge1xuICAgICAgICByZXR1cm4gYG5ldyAke3RoaXMuc3RvcmVkQ2xhc3NUeXBlfSh0aGlzLCBcIiR7bmFtZX1cIiwgZmFsc2UpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBgbmV3IGNka3RuLiR7dXBwZXJjYXNlRmlyc3QoXG4gICAgICAgICAgdGhpcy5zdG9yZWRDbGFzc1R5cGUsXG4gICAgICAgICl9KHRoaXMsIFwiJHtuYW1lfVwiLCBmYWxzZSlgO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBzdG9yZWRDbGFzc1R5cGUoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZWxlbWVudFR5cGUuc3RvcmVkQ2xhc3NUeXBlfUxpc3RgO1xuICB9XG5cbiAgZ2V0IGlucHV0VHlwZURlZmluaXRpb24oKSB7XG4gICAgaWYgKHRoaXMuaXNTaW5nbGVJdGVtKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS5pbnB1dFR5cGVEZWZpbml0aW9uO1xuICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50VHlwZS5zdG9yZWRDbGFzc1R5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gXCJBcnJheTxib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU+IHwgY2RrdG4uSVJlc29sdmFibGVcIjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNDb21wbGV4KSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5lbGVtZW50VHlwZS5zdG9yZWRDbGFzc1R5cGV9W10gfCBjZGt0bi5JUmVzb2x2YWJsZWA7XG4gICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnRUeXBlLnR5cGVNb2RlbFR5cGUgIT09IFwic2ltcGxlXCIpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmVsZW1lbnRUeXBlLmlucHV0VHlwZURlZmluaXRpb259W10gfCBjZGt0bi5JUmVzb2x2YWJsZWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmVsZW1lbnRUeXBlLmlucHV0VHlwZURlZmluaXRpb259W11gO1xuICAgIH1cbiAgfVxuXG4gIGdldEF0dHJpYnV0ZUFjY2Vzc0Z1bmN0aW9uKG5hbWU6IHN0cmluZykge1xuICAgIHN3aXRjaCAodGhpcy5lbGVtZW50VHlwZS5zdG9yZWRDbGFzc1R5cGUpIHtcbiAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgcmV0dXJuIGB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJyR7bmFtZX0nKWA7XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgIHJldHVybiBgdGhpcy5nZXROdW1iZXJMaXN0QXR0cmlidXRlKCcke25hbWV9JylgO1xuICAgIH1cblxuICAgIHJldHVybiBgdGhpcy5pbnRlcnBvbGF0aW9uRm9yQXR0cmlidXRlKCcke25hbWV9JylgO1xuICB9XG5cbiAgZ2V0IHRvVGVycmFmb3JtRnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuaXNTaW5nbGVJdGVtKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS50b1RlcnJhZm9ybUZ1bmN0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gYGNka3RuLmxpc3RNYXBwZXIoJHt0aGlzLmVsZW1lbnRUeXBlLnRvVGVycmFmb3JtRnVuY3Rpb259LCAke3RoaXMuaXNCbG9ja30pYDtcbiAgfVxuXG4gIGdldCB0b0hjbFRlcnJhZm9ybUZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmlzU2luZ2xlSXRlbSkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUudG9IY2xUZXJyYWZvcm1GdW5jdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gYGNka3RuLmxpc3RNYXBwZXJIY2woJHt0aGlzLmVsZW1lbnRUeXBlLnRvSGNsVGVycmFmb3JtRnVuY3Rpb259LCAke3RoaXMuaXNCbG9ja30pYDtcbiAgfVxuXG4gIGdldCBoYXNSZWZlcmVuY2VDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1NpbmdsZUl0ZW0gfHwgdGhpcy5pc0NvbXBsZXg7XG4gIH1cblxuICBnZXQgaXNUb2tlbml6YWJsZSgpIHtcbiAgICBzd2l0Y2ggKHRoaXMuZWxlbWVudFR5cGUuc3RvcmVkQ2xhc3NUeXBlKSB7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldEF0dHJpYnV0ZVR5cGVNb2RlbCBpbXBsZW1lbnRzIENvbGxlY3Rpb25BdHRyaWJ1dGVUeXBlTW9kZWwge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudFR5cGU6IEF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXNTaW5nbGVJdGVtOiBib29sZWFuLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaXNCbG9jazogYm9vbGVhbixcbiAgKSB7XG4gICAgaWYgKHRoaXMuc3RydWN0KSB7XG4gICAgICB0aGlzLnN0cnVjdC5pc1NpbmdsZUl0ZW0gPSB0aGlzLmlzU2luZ2xlSXRlbSB8fCBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBnZXQgdHlwZU1vZGVsVHlwZSgpIHtcbiAgICByZXR1cm4gXCJzZXRcIjtcbiAgfVxuXG4gIGdldCBzdHJ1Y3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUuc3RydWN0O1xuICB9XG5cbiAgZ2V0IGlzQ29tcGxleCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS5pc0NvbXBsZXg7XG4gIH1cblxuICBnZXRTdG9yZWRDbGFzc0luaXRpYWxpemVyKG5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzU2luZ2xlSXRlbSkge1xuICAgICAgcmV0dXJuIGBuZXcgJHt0aGlzLmVsZW1lbnRUeXBlLnN0b3JlZENsYXNzVHlwZX1PdXRwdXRSZWZlcmVuY2UodGhpcywgXCIke25hbWV9XCIpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuaXNDb21wbGV4KSB7XG4gICAgICAgIHJldHVybiBgbmV3ICR7dGhpcy5zdG9yZWRDbGFzc1R5cGV9KHRoaXMsIFwiJHtuYW1lfVwiLCB0cnVlKWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYG5ldyBjZGt0bi4ke3VwcGVyY2FzZUZpcnN0KFxuICAgICAgICAgIHRoaXMuc3RvcmVkQ2xhc3NUeXBlLFxuICAgICAgICApfSh0aGlzLCBcIiR7bmFtZX1cIiwgdHJ1ZSlgO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBzdG9yZWRDbGFzc1R5cGUoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZWxlbWVudFR5cGUuc3RvcmVkQ2xhc3NUeXBlfUxpc3RgO1xuICB9XG5cbiAgZ2V0IGlucHV0VHlwZURlZmluaXRpb24oKSB7XG4gICAgaWYgKHRoaXMuaXNTaW5nbGVJdGVtKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS5pbnB1dFR5cGVEZWZpbml0aW9uO1xuICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50VHlwZS5zdG9yZWRDbGFzc1R5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gXCJBcnJheTxib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU+IHwgY2RrdG4uSVJlc29sdmFibGVcIjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNDb21wbGV4KSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5lbGVtZW50VHlwZS5zdG9yZWRDbGFzc1R5cGV9W10gfCBjZGt0bi5JUmVzb2x2YWJsZWA7XG4gICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnRUeXBlLnR5cGVNb2RlbFR5cGUgIT09IFwic2ltcGxlXCIpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmVsZW1lbnRUeXBlLmlucHV0VHlwZURlZmluaXRpb259W10gfCBjZGt0bi5JUmVzb2x2YWJsZWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmVsZW1lbnRUeXBlLmlucHV0VHlwZURlZmluaXRpb259W11gO1xuICAgIH1cbiAgfVxuXG4gIGdldEF0dHJpYnV0ZUFjY2Vzc0Z1bmN0aW9uKG5hbWU6IHN0cmluZykge1xuICAgIHN3aXRjaCAodGhpcy5lbGVtZW50VHlwZS5zdG9yZWRDbGFzc1R5cGUpIHtcbiAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgcmV0dXJuIGBjZGt0bi5Gbi50b2xpc3QodGhpcy5nZXRMaXN0QXR0cmlidXRlKCcke25hbWV9JykpYDtcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgcmV0dXJuIGBjZGt0bi5Ub2tlbi5hc051bWJlckxpc3QoY2RrdG4uRm4udG9saXN0KHRoaXMuZ2V0TnVtYmVyTGlzdEF0dHJpYnV0ZSgnJHtuYW1lfScpKSlgO1xuICAgIH1cblxuICAgIC8vIFRva2VuLmFzQW55IGlzIHJlcXVpcmVkIGJlY2F1c2UgdG9saXN0IHJldHVybnMgYW4gQXJyYXkgZW5jb2RlZCB0b2tlbiB3aGljaCB0aGUgbGlzdE1hcHBlclxuICAgIC8vIHdvdWxkIHRyeSB0byBtYXAgb3ZlciB3aGVuIHRoaXMgaXMgcGFzc2VkIHRvIGFub3RoZXIgcmVzb3VyY2UuIFdpdGggVG9rZW4uYXNBbnkoKSBpdCBpcyBsZWZ0XG4gICAgLy8gYXMgaXMgYnkgdGhlIGxpc3RNYXBwZXIgYW5kIGlzIGxhdGVyIHByb3Blcmx5IHJlc29sdmVkIHRvIGEgcmVmZXJlbmNlXG4gICAgLy8gKHRoaXMgb25seSB3b3JrcyBpbiBUeXBlU2NyaXB0IGN1cnJlbnRseSwgc2FtZSBhcyBmb3IgcmVmZXJlbmNpbmcgbGlzdHNcbiAgICAvLyBbc2VlIFwiaW50ZXJwb2xhdGlvbkZvckF0dHJpYnV0ZSguLi4pXCIgZnVydGhlciBiZWxvd10pXG4gICAgcmV0dXJuIGBjZGt0bi5Ub2tlbi5hc0FueShjZGt0bi5Gbi50b2xpc3QodGhpcy5pbnRlcnBvbGF0aW9uRm9yQXR0cmlidXRlKCcke25hbWV9JykpKWA7XG4gIH1cblxuICBnZXQgdG9UZXJyYWZvcm1GdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5pc1NpbmdsZUl0ZW0pIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnRvVGVycmFmb3JtRnVuY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgY2RrdG4ubGlzdE1hcHBlcigke3RoaXMuZWxlbWVudFR5cGUudG9UZXJyYWZvcm1GdW5jdGlvbn0sICR7dGhpcy5pc0Jsb2NrfSlgO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0b0hjbFRlcnJhZm9ybUZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmlzU2luZ2xlSXRlbSkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUudG9IY2xUZXJyYWZvcm1GdW5jdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIGBjZGt0bi5saXN0TWFwcGVySGNsKCR7dGhpcy5lbGVtZW50VHlwZS50b0hjbFRlcnJhZm9ybUZ1bmN0aW9ufSwgJHt0aGlzLmlzQmxvY2t9KWA7XG4gIH1cblxuICBnZXQgaGFzUmVmZXJlbmNlQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNTaW5nbGVJdGVtIHx8IHRoaXMuaXNDb21wbGV4O1xuICB9XG5cbiAgZ2V0IGlzVG9rZW5pemFibGUoKSB7XG4gICAgc3dpdGNoICh0aGlzLmVsZW1lbnRUeXBlLnN0b3JlZENsYXNzVHlwZSkge1xuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXBBdHRyaWJ1dGVUeXBlTW9kZWwgaW1wbGVtZW50cyBDb2xsZWN0aW9uQXR0cmlidXRlVHlwZU1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGVsZW1lbnRUeXBlOiBBdHRyaWJ1dGVUeXBlTW9kZWwpIHt9XG5cbiAgZ2V0IHR5cGVNb2RlbFR5cGUoKSB7XG4gICAgcmV0dXJuIFwibWFwXCI7XG4gIH1cblxuICBnZXQgc3RydWN0KCkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnN0cnVjdDtcbiAgfVxuXG4gIGdldCBpc0NvbXBsZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUuaXNDb21wbGV4O1xuICB9XG5cbiAgZ2V0U3RvcmVkQ2xhc3NJbml0aWFsaXplcihuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pc0NvbXBsZXgpIHtcbiAgICAgIHJldHVybiBgbmV3ICR7dGhpcy5zdG9yZWRDbGFzc1R5cGV9KHRoaXMsIFwiJHtuYW1lfVwiKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgbmV3IGNka3RuLiR7dXBwZXJjYXNlRmlyc3QoXG4gICAgICAgIHRoaXMuc3RvcmVkQ2xhc3NUeXBlLFxuICAgICAgKX0odGhpcywgXCIke25hbWV9XCIpYDtcbiAgICB9XG4gIH1cblxuICBnZXQgc3RvcmVkQ2xhc3NUeXBlKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmVsZW1lbnRUeXBlLnN0b3JlZENsYXNzVHlwZX1NYXBgO1xuICB9XG5cbiAgZ2V0IGlucHV0VHlwZURlZmluaXRpb24oKSB7XG4gICAgLy8gbWFwIG9mIGJvb2xlYW5zIGhhcyB0b2tlbiBzdXBwb3J0LCBidXQgYm9vbGVhbnMgZG9uJ3RcbiAgICBpZiAodGhpcy5lbGVtZW50VHlwZS5zdG9yZWRDbGFzc1R5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gYHsgW2tleTogc3RyaW5nXTogKCR7dGhpcy5lbGVtZW50VHlwZS5zdG9yZWRDbGFzc1R5cGV9IHwgY2RrdG4uSVJlc29sdmFibGUpIH1gO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbXBsZXgpIHtcbiAgICAgIHJldHVybiBgeyBba2V5OiBzdHJpbmddOiAke3RoaXMuZWxlbWVudFR5cGUuc3RvcmVkQ2xhc3NUeXBlfSB9IHwgY2RrdG4uSVJlc29sdmFibGVgO1xuICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50VHlwZS50eXBlTW9kZWxUeXBlICE9PSBcInNpbXBsZVwiKSB7XG4gICAgICByZXR1cm4gYHsgW2tleTogc3RyaW5nXTogJHt0aGlzLmVsZW1lbnRUeXBlLmlucHV0VHlwZURlZmluaXRpb259IH0gfCBjZGt0bi5JUmVzb2x2YWJsZWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgeyBba2V5OiBzdHJpbmddOiAke3RoaXMuZWxlbWVudFR5cGUuc3RvcmVkQ2xhc3NUeXBlfSB9YDtcbiAgICB9XG4gIH1cblxuICBnZXRBdHRyaWJ1dGVBY2Nlc3NGdW5jdGlvbihuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuaXNDb21wbGV4ICYmIHRoaXMuZWxlbWVudFR5cGUudHlwZU1vZGVsVHlwZSAhPT0gXCJzaW1wbGVcIikge1xuICAgICAgcmV0dXJuIGB0aGlzLmludGVycG9sYXRpb25Gb3JBdHRyaWJ1dGUoJyR7bmFtZX0nKWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGB0aGlzLmdldCR7dXBwZXJjYXNlRmlyc3QoXG4gICAgICB0aGlzLnN0b3JlZENsYXNzVHlwZSxcbiAgICApfUF0dHJpYnV0ZSgnJHtuYW1lfScpYDtcbiAgfVxuXG4gIGdldCB0b1RlcnJhZm9ybUZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBgY2RrdG4uaGFzaE1hcHBlcigke3RoaXMuZWxlbWVudFR5cGUudG9UZXJyYWZvcm1GdW5jdGlvbn0pYDtcbiAgfVxuXG4gIGdldCB0b0hjbFRlcnJhZm9ybUZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBgY2RrdG4uaGFzaE1hcHBlckhjbCgke3RoaXMuZWxlbWVudFR5cGUudG9IY2xUZXJyYWZvcm1GdW5jdGlvbn0pYDtcbiAgfVxuXG4gIGdldCBoYXNSZWZlcmVuY2VDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc0NvbXBsZXg7XG4gIH1cblxuICBnZXQgaXNUb2tlbml6YWJsZSgpIHtcbiAgICBzd2l0Y2ggKHRoaXMuZWxlbWVudFR5cGUuc3RvcmVkQ2xhc3NUeXBlKSB7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSBcImFueVwiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
462
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLXR5cGUtbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ2V0L2dlbmVyYXRvci9tb2RlbHMvYXR0cmlidXRlLXR5cGUtbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0Esd0NBQThEO0FBQzlELHlFQUFvRTtBQWlCcEUsd0ZBQXdGO0FBQ3hGLHVGQUF1RjtBQUN2Riw0RUFBNEU7QUFDNUUsMEZBQTBGO0FBQzFGLFNBQWdCLHFCQUFxQixDQUFDLEtBQXlCO0lBQzdELFFBQVEsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzVCLEtBQUssTUFBTTtZQUNULE9BQU8sUUFBUSxxQkFBcUIsQ0FDakMsS0FBc0MsQ0FBQyxXQUFXLENBQ3BELEdBQUcsQ0FBQztRQUNQLEtBQUssS0FBSztZQUNSLE9BQU8sT0FBTyxxQkFBcUIsQ0FDaEMsS0FBc0MsQ0FBQyxXQUFXLENBQ3BELEdBQUcsQ0FBQztRQUNQLEtBQUssS0FBSztZQUNSLE9BQU8sT0FBTyxxQkFBcUIsQ0FDaEMsS0FBc0MsQ0FBQyxXQUFXLENBQ3BELEdBQUcsQ0FBQztRQUNQLEtBQUssUUFBUTtZQUNYLE9BQU8sUUFBUSxDQUFDO1FBQ2xCO1lBQ0UsbUZBQW1GO1lBQ25GLG9GQUFvRjtZQUNwRixxQ0FBcUM7WUFDckMsT0FBTyxLQUFLLENBQUMsZUFBZSxLQUFLLFNBQVM7Z0JBQ3hDLENBQUMsQ0FBQyxNQUFNO2dCQUNSLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7QUFDSCxDQUFDO0FBeEJELHNEQXdCQztBQUVELE1BQWEseUJBQXlCO0lBQ3BDLGdCQUFlLENBQUM7SUFFaEIsSUFBSSxhQUFhO1FBQ2YsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLEtBQUssQ0FB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SUFDckUsQ0FBQztJQUVELElBQUksc0JBQXNCO1FBQ3hCLE9BQU8sdUJBQXVCLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLEdBQUcsQ0FBQztJQUMzRSxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekMsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxDQUFDO1lBQ2QsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxDQUFDO1lBQ2QsS0FBSyxTQUFTO2dCQUNaLE9BQU8sSUFBSSxDQUFDO1lBQ2QsS0FBSyxLQUFLO2dCQUNSLE9BQU8sSUFBSSxDQUFDO1lBQ2Q7Z0JBQ0UsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsc0ZBQXNGO0lBQ3RGLElBQUksd0JBQXdCO1FBQzFCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixLQUFLLFNBQVMsQ0FBQztJQUNoRCxDQUFDO0NBQ0Y7QUE1RkQsc0RBNEZDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7IFN0cnVjdCB9IGZyb20gXCIuL3N0cnVjdFwiO1xuaW1wb3J0IHsgdXBwZXJjYXNlRmlyc3QsIGRvd25jYXNlRmlyc3QgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbFwiO1xuaW1wb3J0IHsgcmVzb2x2ZVN0b3JlZENsYXNzTmFtZSB9IGZyb20gXCIuL3N1cHBvcnRlZC1zdG9yZWQtY2xhc3Nlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZVR5cGVNb2RlbCB7XG4gIHJlYWRvbmx5IHN0cnVjdD86IFN0cnVjdDsgLy8gY29tcGxleCBvYmplY3QgdHlwZSBjb250YWluZWQgd2l0aGluIHRoZSB0eXBlXG4gIHJlYWRvbmx5IGlzQ29tcGxleDogYm9vbGVhbjsgLy8gYmFzaWNhbGx5IHRoZSBzYW1lIGFzIGhhdmluZyBhIHN0cnVjdFxuICBnZXRTdG9yZWRDbGFzc0luaXRpYWxpemVyKG5hbWU6IHN0cmluZyk6IHN0cmluZzsgLy8gaW5pdGlhbGl6ZXIgZm9yIGtlZXBpbmcgY2xhc3MgbmVlZGVkIHRvIGtlZXAgdHJhY2sgb2YgcmVmZXJlbmNlIGFjY2Vzc1xuICByZWFkb25seSBzdG9yZWRDbGFzc1R5cGU6IHN0cmluZzsgLy8gdXNlZCBtYWlubHkgYnkgY29sbGVjdGlvbiB0eXBlcyB0byBnZW5lcmF0ZSB0aGVpciBzdG9yZWQgY2xhc3MgaW5pdGlhbGl6ZXJcbiAgcmVhZG9ubHkgaW5wdXRUeXBlRGVmaW5pdGlvbjogc3RyaW5nOyAvLyB0aGlzIGlzIHRoZSB0eXBlIHVzZWQgZm9yIGlucHV0dGluZyB2YWx1ZXNcbiAgZ2V0QXR0cmlidXRlQWNjZXNzRnVuY3Rpb24obmFtZTogc3RyaW5nKTogc3RyaW5nOyAvLyB0aGlzIGlzIGZvciBnZXR0aW5nIHJlZmVyZW5jZSBmb3Igc2ltcGxlIHR5cGVzXG4gIHJlYWRvbmx5IHRvVGVycmFmb3JtRnVuY3Rpb246IHN0cmluZzsgLy8gdGhpcyBpcyBmb3IgY29udmVydGluZyBpbnB1dCB2YWx1ZXMgdG8gVGVycmFmb3JtIHN5bnRheFxuICByZWFkb25seSB0b0hjbFRlcnJhZm9ybUZ1bmN0aW9uOiBzdHJpbmc7IC8vIHRoaXMgaXMgZm9yIGNvbnZlcnRpbmcgaW5wdXQgdmFsdWVzIHRvIFRlcnJhZm9ybSBzeW50YXggaW4gSENMXG4gIHJlYWRvbmx5IHR5cGVNb2RlbFR5cGU6IHN0cmluZzsgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byB1c2UgaW5zdGFuY2VvZlxuICByZWFkb25seSBoYXNSZWZlcmVuY2VDbGFzczogYm9vbGVhbjsgLy8gdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBzdG9yZWRfY2xhc3MgZ2V0dGVyIHNob3VsZCBiZSB1c2VkXG4gIHJlYWRvbmx5IGlzVG9rZW5pemFibGU6IGJvb2xlYW47IC8vIGNhbiB0aGUgdHlwZSBiZSByZXByZXNlbnRlZCBieSBhIHRva2VuIHR5cGVcbiAgcmVhZG9ubHkgaXNTdG9yZWRDbGFzc1VuYXZhaWxhYmxlOiBib29sZWFuOyAvLyB0cnVlIHdoZW4gbm8gXCJjZGt0bi48TmFtZT5cIiBzdG9yZWQgY2xhc3MgKG5vdCBldmVuIGEgY29sbGFwc2VkIG5lYXJlc3QtQW55IHdyYXBwZXIpIGlzIGF2YWlsYWJsZSBmb3IgdGhpcyB0eXBlXG59XG5cbi8vIERlc2NyaWJlcyB0aGUgVGVycmFmb3JtIHR5cGUgb2YgYW4gYXR0cmlidXRlIGFzIGl0cyBgbGlzdCguLi4pYC9gc2V0KC4uLilgL2BtYXAoLi4uKWBcbi8vIGNvbXBvc2VkIG5vdGF0aW9uIChtYXRjaGluZyBob3cgVGVycmFmb3JtIGl0c2VsZiBkZXNjcmliZXMgbmVzdGVkIGNvbGxlY3Rpb24gdHlwZXMpLFxuLy8gZm9yIHVzZSBpbiBnZW5lcmF0ZWQgSlNEb2MuIFVzZWQgb25seSBmb3IgY29sbGFwc2VkL2ZhbGxiYWNrIGdldHRlcnMgKHNlZVxuLy8gQXR0cmlidXRlc0VtaXR0ZXIpIHNvIGl0IG5ldmVyIG5lZWRzIHRvIGJlIGV4aGF1c3RpdmUvcGVyZmVjdGx5IHN0YWJsZSBmb3IgZXZlcnkgc2hhcGUuXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVUZXJyYWZvcm1UeXBlKG1vZGVsOiBBdHRyaWJ1dGVUeXBlTW9kZWwpOiBzdHJpbmcge1xuICBzd2l0Y2ggKG1vZGVsLnR5cGVNb2RlbFR5cGUpIHtcbiAgICBjYXNlIFwibGlzdFwiOlxuICAgICAgcmV0dXJuIGBsaXN0KCR7ZGVzY3JpYmVUZXJyYWZvcm1UeXBlKFxuICAgICAgICAobW9kZWwgYXMgQ29sbGVjdGlvbkF0dHJpYnV0ZVR5cGVNb2RlbCkuZWxlbWVudFR5cGUsXG4gICAgICApfSlgO1xuICAgIGNhc2UgXCJzZXRcIjpcbiAgICAgIHJldHVybiBgc2V0KCR7ZGVzY3JpYmVUZXJyYWZvcm1UeXBlKFxuICAgICAgICAobW9kZWwgYXMgQ29sbGVjdGlvbkF0dHJpYnV0ZVR5cGVNb2RlbCkuZWxlbWVudFR5cGUsXG4gICAgICApfSlgO1xuICAgIGNhc2UgXCJtYXBcIjpcbiAgICAgIHJldHVybiBgbWFwKCR7ZGVzY3JpYmVUZXJyYWZvcm1UeXBlKFxuICAgICAgICAobW9kZWwgYXMgQ29sbGVjdGlvbkF0dHJpYnV0ZVR5cGVNb2RlbCkuZWxlbWVudFR5cGUsXG4gICAgICApfSlgO1xuICAgIGNhc2UgXCJzdHJ1Y3RcIjpcbiAgICAgIHJldHVybiBcIm9iamVjdFwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBDb3ZlcnMgYm90aCBTaW1wbGVBdHRyaWJ1dGVUeXBlTW9kZWwgKHN0b3JlZENsYXNzVHlwZSBpcyB0aGUgVGVycmFmb3JtIHByaW1pdGl2ZVxuICAgICAgLy8gbmFtZSwgZS5nLiBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB8IFwiYm9vbGVhblwiIHwgXCJhbnlcIikgYW5kIFNraXBwZWRBdHRyaWJ1dGVUeXBlTW9kZWxcbiAgICAgIC8vIChzdG9yZWRDbGFzc1R5cGUgaXMgYWx3YXlzIFwiYW55XCIpLlxuICAgICAgcmV0dXJuIG1vZGVsLnN0b3JlZENsYXNzVHlwZSA9PT0gXCJib29sZWFuXCJcbiAgICAgICAgPyBcImJvb2xcIlxuICAgICAgICA6IG1vZGVsLnN0b3JlZENsYXNzVHlwZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2tpcHBlZEF0dHJpYnV0ZVR5cGVNb2RlbCBpbXBsZW1lbnRzIEF0dHJpYnV0ZVR5cGVNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBnZXQgdHlwZU1vZGVsVHlwZSgpIHtcbiAgICByZXR1cm4gXCJzaW1wbGVcIjtcbiAgfVxuXG4gIGdldCBzdHJ1Y3QoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldCBpc0NvbXBsZXgoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0U3RvcmVkQ2xhc3NJbml0aWFsaXplcihfbmFtZTogc3RyaW5nKSB7XG4gICAgLy8gbm90IHVzZWRcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIGdldCBzdG9yZWRDbGFzc1R5cGUoKSB7XG4gICAgcmV0dXJuIFwiYW55XCI7XG4gIH1cblxuICBnZXQgaW5wdXRUeXBlRGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4gXCJhbnlcIjtcbiAgfVxuXG4gIGdldEF0dHJpYnV0ZUFjY2Vzc0Z1bmN0aW9uKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBgdGhpcy5pbnRlcnBvbGF0aW9uRm9yQXR0cmlidXRlKCcke25hbWV9JylgO1xuICB9XG5cbiAgZ2V0IHRvVGVycmFmb3JtRnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGBjZGt0bi5hbnlUb1RlcnJhZm9ybWA7XG4gIH1cblxuICBnZXQgdG9IY2xUZXJyYWZvcm1GdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYGNka3RuLmFueVRvSGNsVGVycmFmb3JtYDtcbiAgfVxuXG4gIGdldCBoYXNSZWZlcmVuY2VDbGFzcygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgaXNUb2tlbml6YWJsZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgaXNTdG9yZWRDbGFzc1VuYXZhaWxhYmxlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2ltcGxlQXR0cmlidXRlVHlwZU1vZGVsIGltcGxlbWVudHMgQXR0cmlidXRlVHlwZU1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZykge31cblxuICBnZXQgdHlwZU1vZGVsVHlwZSgpIHtcbiAgICByZXR1cm4gXCJzaW1wbGVcIjtcbiAgfVxuXG4gIGdldCBzdHJ1Y3QoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldCBpc0NvbXBsZXgoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0U3RvcmVkQ2xhc3NJbml0aWFsaXplcihfbmFtZTogc3RyaW5nKSB7XG4gICAgLy8gbm90IHVzZWRcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIGdldCBzdG9yZWRDbGFzc1R5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZTtcbiAgfVxuXG4gIGdldCBpbnB1dFR5cGVEZWZpbml0aW9uKCkge1xuICAgIGlmICh0aGlzLnR5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gXCJib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGVcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudHlwZTtcbiAgICB9XG4gIH1cblxuICBnZXRBdHRyaWJ1dGVBY2Nlc3NGdW5jdGlvbihuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYHRoaXMuZ2V0JHt1cHBlcmNhc2VGaXJzdCh0aGlzLnR5cGUpfUF0dHJpYnV0ZSgnJHtuYW1lfScpYDtcbiAgfVxuXG4gIGdldCB0b1RlcnJhZm9ybUZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBgY2RrdG4uJHt0aGlzLnR5cGV9VG9UZXJyYWZvcm1gO1xuICB9XG5cbiAgZ2V0IHRvSGNsVGVycmFmb3JtRnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGBjZGt0bi4ke3RoaXMudHlwZX1Ub0hjbFRlcnJhZm9ybWA7XG4gIH1cblxuICBnZXQgaGFzUmVmZXJlbmNlQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IGlzVG9rZW5pemFibGUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXQgaXNTdG9yZWRDbGFzc1VuYXZhaWxhYmxlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsIGltcGxlbWVudHMgQXR0cmlidXRlVHlwZU1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHN0cnVjdDogU3RydWN0KSB7fVxuXG4gIGdldCB0eXBlTW9kZWxUeXBlKCkge1xuICAgIHJldHVybiBcInN0cnVjdFwiO1xuICB9XG5cbiAgZ2V0IGlzQ29tcGxleCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFN0b3JlZENsYXNzSW5pdGlhbGl6ZXIobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGBuZXcgJHt0aGlzLnN0cnVjdC5vdXRwdXRSZWZlcmVuY2VOYW1lfSh0aGlzLCBcIiR7bmFtZX1cIilgO1xuICB9XG5cbiAgZ2V0IHN0b3JlZENsYXNzVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJ1Y3QubmFtZTtcbiAgfVxuXG4gIGdldCBpbnB1dFR5cGVEZWZpbml0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnN0cnVjdC5uYW1lO1xuICB9XG5cbiAgZ2V0QXR0cmlidXRlQWNjZXNzRnVuY3Rpb24obmFtZTogc3RyaW5nKSB7XG4gICAgLy8gVGhpcyBzaG91bG4ndCBhY3R1YWxseSBiZSBjYWxsZWRcbiAgICByZXR1cm4gYHRoaXMuaW50ZXJwb2xhdGlvbkZvckF0dHJpYnV0ZSgnJHtuYW1lfScpYDtcbiAgfVxuXG4gIGdldCB0b1RlcnJhZm9ybUZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBgJHtkb3duY2FzZUZpcnN0KHRoaXMuc3RydWN0Lm5hbWUpfVRvVGVycmFmb3JtYDtcbiAgfVxuXG4gIGdldCB0b0hjbFRlcnJhZm9ybUZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBgJHtkb3duY2FzZUZpcnN0KHRoaXMuc3RydWN0Lm5hbWUpfVRvSGNsVGVycmFmb3JtYDtcbiAgfVxuXG4gIGdldCBoYXNSZWZlcmVuY2VDbGFzcygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldCBpc1Rva2VuaXphYmxlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldCBpc1N0b3JlZENsYXNzVW5hdmFpbGFibGUoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbkF0dHJpYnV0ZVR5cGVNb2RlbCBleHRlbmRzIEF0dHJpYnV0ZVR5cGVNb2RlbCB7XG4gIGVsZW1lbnRUeXBlOiBBdHRyaWJ1dGVUeXBlTW9kZWw7XG4gIC8vIFJlc29sdmVzIHRoZSBcImNka3RuLjxuYW1lPlwiIHN0b3JlZCBjbGFzcyB0byBpbnN0YW50aWF0ZSBmb3IgdGhpcyAobm9uLWNvbXBsZXgpXG4gIC8vIGNvbGxlY3Rpb24gdHlwZSwgYW5kIHdoZXRoZXIgdGhhdCByZXNvbHV0aW9uIGNvbGxhcHNlZCBhIGRlZXBlciwgdW5zdXBwb3J0ZWQgbmVzdGluZ1xuICAvLyBpbnRvIHRoZSBuZWFyZXN0IHR5cGVkIFwiQW55XCItd3JhcHBlci4gdW5kZWZpbmVkIG9ubHkgZGVmZW5zaXZlbHkgLSBzZWVcbiAgLy8gcmVzb2x2ZVN0b3JlZENsYXNzTmFtZSBpbiBzdXBwb3J0ZWQtc3RvcmVkLWNsYXNzZXMudHMuXG4gIHJlYWRvbmx5IHJlc29sdmVkU3RvcmVkQ2xhc3M6XG4gICAgfCB7IG5hbWU6IHN0cmluZzsgY29sbGFwc2VkOiBib29sZWFuIH1cbiAgICB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIExpc3RBdHRyaWJ1dGVUeXBlTW9kZWwgaW1wbGVtZW50cyBDb2xsZWN0aW9uQXR0cmlidXRlVHlwZU1vZGVsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGVsZW1lbnRUeXBlOiBBdHRyaWJ1dGVUeXBlTW9kZWwsXG4gICAgcHVibGljIHJlYWRvbmx5IGlzU2luZ2xlSXRlbTogYm9vbGVhbixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGlzQmxvY2s6IGJvb2xlYW4sXG4gICkge1xuICAgIGlmICh0aGlzLnN0cnVjdCkge1xuICAgICAgdGhpcy5zdHJ1Y3QuaXNTaW5nbGVJdGVtID0gdGhpcy5pc1NpbmdsZUl0ZW0gfHwgZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHR5cGVNb2RlbFR5cGUoKSB7XG4gICAgcmV0dXJuIFwibGlzdFwiO1xuICB9XG5cbiAgZ2V0IHN0cnVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS5zdHJ1Y3Q7XG4gIH1cblxuICBnZXQgaXNDb21wbGV4KCkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLmlzQ29tcGxleDtcbiAgfVxuXG4gIGdldFN0b3JlZENsYXNzSW5pdGlhbGl6ZXIobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaXNTaW5nbGVJdGVtKSB7XG4gICAgICByZXR1cm4gYG5ldyAke3RoaXMuZWxlbWVudFR5cGUuc3RvcmVkQ2xhc3NUeXBlfU91dHB1dFJlZmVyZW5jZSh0aGlzLCBcIiR7bmFtZX1cIilgO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5pc0NvbXBsZXgpIHtcbiAgICAgICAgcmV0dXJuIGBuZXcgJHt0aGlzLnN0b3JlZENsYXNzVHlwZX0odGhpcywgXCIke25hbWV9XCIsIGZhbHNlKWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYG5ldyBjZGt0bi4ke3RoaXMucmVzb2x2ZWRTdG9yZWRDbGFzcyEubmFtZX0odGhpcywgXCIke25hbWV9XCIsIGZhbHNlKWA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHN0b3JlZENsYXNzVHlwZSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5lbGVtZW50VHlwZS5zdG9yZWRDbGFzc1R5cGV9TGlzdGA7XG4gIH1cblxuICBnZXQgcmVzb2x2ZWRTdG9yZWRDbGFzcygpIHtcbiAgICByZXR1cm4gcmVzb2x2ZVN0b3JlZENsYXNzTmFtZShcbiAgICAgIHRoaXMuc3RvcmVkQ2xhc3NUeXBlLFxuICAgICAgdGhpcy5lbGVtZW50VHlwZS50eXBlTW9kZWxUeXBlLFxuICAgICk7XG4gIH1cblxuICBnZXQgaW5wdXRUeXBlRGVmaW5pdGlvbigpIHtcbiAgICBpZiAodGhpcy5pc1NpbmdsZUl0ZW0pIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLmlucHV0VHlwZURlZmluaXRpb247XG4gICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnRUeXBlLnN0b3JlZENsYXNzVHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBcIkFycmF5PGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZT4gfCBjZGt0bi5JUmVzb2x2YWJsZVwiO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbXBsZXgpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmVsZW1lbnRUeXBlLnN0b3JlZENsYXNzVHlwZX1bXSB8IGNka3RuLklSZXNvbHZhYmxlYDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudFR5cGUudHlwZU1vZGVsVHlwZSAhPT0gXCJzaW1wbGVcIikge1xuICAgICAgcmV0dXJuIGAke3RoaXMuZWxlbWVudFR5cGUuaW5wdXRUeXBlRGVmaW5pdGlvbn1bXSB8IGNka3RuLklSZXNvbHZhYmxlYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGAke3RoaXMuZWxlbWVudFR5cGUuaW5wdXRUeXBlRGVmaW5pdGlvbn1bXWA7XG4gICAgfVxuICB9XG5cbiAgZ2V0QXR0cmlidXRlQWNjZXNzRnVuY3Rpb24obmFtZTogc3RyaW5nKSB7XG4gICAgc3dpdGNoICh0aGlzLmVsZW1lbnRUeXBlLnN0b3JlZENsYXNzVHlwZSkge1xuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICByZXR1cm4gYHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnJHtuYW1lfScpYDtcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgcmV0dXJuIGB0aGlzLmdldE51bWJlckxpc3RBdHRyaWJ1dGUoJyR7bmFtZX0nKWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGB0aGlzLmludGVycG9sYXRpb25Gb3JBdHRyaWJ1dGUoJyR7bmFtZX0nKWA7XG4gIH1cblxuICBnZXQgdG9UZXJyYWZvcm1GdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5pc1NpbmdsZUl0ZW0pIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnRvVGVycmFmb3JtRnVuY3Rpb247XG4gICAgfVxuICAgIHJldHVybiBgY2RrdG4ubGlzdE1hcHBlcigke3RoaXMuZWxlbWVudFR5cGUudG9UZXJyYWZvcm1GdW5jdGlvbn0sICR7dGhpcy5pc0Jsb2NrfSlgO1xuICB9XG5cbiAgZ2V0IHRvSGNsVGVycmFmb3JtRnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuaXNTaW5nbGVJdGVtKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS50b0hjbFRlcnJhZm9ybUZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHJldHVybiBgY2RrdG4ubGlzdE1hcHBlckhjbCgke3RoaXMuZWxlbWVudFR5cGUudG9IY2xUZXJyYWZvcm1GdW5jdGlvbn0sICR7dGhpcy5pc0Jsb2NrfSlgO1xuICB9XG5cbiAgZ2V0IGhhc1JlZmVyZW5jZUNsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLmlzU2luZ2xlSXRlbSB8fCB0aGlzLmlzQ29tcGxleDtcbiAgfVxuXG4gIGdldCBpc1Rva2VuaXphYmxlKCkge1xuICAgIHN3aXRjaCAodGhpcy5lbGVtZW50VHlwZS5zdG9yZWRDbGFzc1R5cGUpIHtcbiAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbXBsZXggKHN0cnVjdCkgZWxlbWVudHMgZ2VuZXJhdGUgdGhlaXIgb3duIGNsYXNzIGluIHRoZSBwcm92aWRlciBvdXRwdXQsIHNvIHRoZXlcbiAgLy8gYXJlIGFsd2F5cyBmaW5lLiBPdGhlcndpc2UgYSBzdG9yZWQgY2xhc3MgaXMgb25seSBlbWl0dGVkIGlmIHJlc29sdmVkU3RvcmVkQ2xhc3NcbiAgLy8gZmluZHMgb25lIC0gc2VlIGdldFN0b3JlZENsYXNzSW5pdGlhbGl6ZXIgYWJvdmUuIE5vdGU6IGhhc1JlZmVyZW5jZUNsYXNzICh3aGljaFxuICAvLyB0cmlnZ2VycyBhIHN0b3JlZF9jbGFzcyBnZXR0ZXIpIGlzIG9ubHkgZXZlciB0cnVlIGhlcmUgd2hlbiBpc1NpbmdsZUl0ZW0gb3IgaXNDb21wbGV4XG4gIC8vIGlzIHRydWUsIGFuZCBpc1NpbmdsZUl0ZW0gaXMgb25seSBzZXQgZm9yIHN0cnVjdC9ibG9jayBuZXN0aW5nICh3aGljaCBpcyBhbHNvXG4gIC8vIGlzQ29tcGxleCksIHNvIHRoaXMgY2hlY2sgb25seSBuZWVkcyB0byBndWFyZCB0aGUgbm9uLWNvbXBsZXgsIG5vbi1zaW5nbGUtaXRlbSBjYXNlLlxuICAvL1xuICAvLyBzdG9yZWRDbGFzc1R5cGUgaXMgaXRzZWxmIGJ1aWx0IHVwIHJlY3Vyc2l2ZWx5IChlbGVtZW50VHlwZS5zdG9yZWRDbGFzc1R5cGUgaXNcbiAgLy8gY29tcG9zZWQgdGhlIHNhbWUgd2F5IGZvciBuZXN0ZWQgY29sbGVjdGlvbnMpLCBzbyBpdCBhbHJlYWR5IGZ1bGx5IGVuY29kZXMgdGhlXG4gIC8vIGVudGlyZSBuZXN0ZWQgY2hhaW4gaW4gb25lIHN0cmluZyAoZS5nLiBtYXAobWFwKGxpc3Qoc3RyaW5nKSkpIGNvbXBvc2VzIGFsbCB0aGUgd2F5XG4gIC8vIHVwIHRvIFwic3RyaW5nTGlzdE1hcE1hcFwiKS4gcmVzb2x2ZWRTdG9yZWRDbGFzcyBmaXJzdCBjaGVja3MgdGhpcyB0eXBlJ3Mgb3duIGNvbXBvc2VkXG4gIC8vIG5hbWUgKGUuZy4gXCJTdHJpbmdMaXN0TWFwTWFwXCIpIGFnYWluc3QgdGhlIGZpeGVkIHNldCBvZiBoYW5kLXdyaXR0ZW4gY29yZSBjbGFzc2VzOyBpZlxuICAvLyB0aGF0IG5hbWUgZG9lc24ndCBleGlzdCwgaXQgZmFsbHMgYmFjayB0byB0aGUgbmVhcmVzdCB0eXBlZCBcIkFueVwiLXdyYXBwZXIgdGhhdCBzdGlsbFxuICAvLyBlbmNvZGVzIHRoaXMgdHlwZSdzIG93biBsYXllciBhbmQgaXRzIGVsZW1lbnQncyBsYXllciAoZS5nLiBcIkFueU1hcE1hcFwiKSwgY29sbGFwc2luZ1xuICAvLyBvbmx5IHRoZSB1bnN1cHBvcnRlZCBpbm5lciBzaGFwZSB3aGlsZSBwcmVzZXJ2aW5nIHR5cGVkIG5hdmlnYXRpb24gZm9yIHRoZSBvdXRlclxuICAvLyBsYXllcnM7IG9ubHkgaWYgbmVpdGhlciBleGlzdHMgZG9lcyBpdCBmYWxsIHRocm91Z2ggdG8gdGhlIHBsYWluLCB1bnR5cGVkIGdldHRlciAoc2VlXG4gIC8vIEF0dHJpYnV0ZU1vZGVsLmdldHRlclR5cGUpLiBJdCBtdXN0IE5PVCBhbHNvIE9SIGluXG4gIC8vIGVsZW1lbnRUeXBlLmlzU3RvcmVkQ2xhc3NVbmF2YWlsYWJsZSwgc2luY2UgYW4gaW5uZXIgZWxlbWVudCdzIHVuLWNvbXBvc2VkIG5hbWUgKGUuZy5cbiAgLy8gXCJTdHJpbmdMaXN0XCIgZm9yIGEgcGxhaW4gbGlzdChzdHJpbmcpIG5lc3RlZCBpbnNpZGUgYSBtYXApIGlzIG5ldmVyIHNlcGFyYXRlbHlcbiAgLy8gaW5zdGFudGlhdGVkIGFuZCBpcyBpcnJlbGV2YW50IG9uIGl0cyBvd247IE9SaW5nIGl0IGluIHdvdWxkIHByb2R1Y2UgZmFsc2UgcG9zaXRpdmVzXG4gIC8vIHRoYXQgcmVncmVzcyBzdXBwb3J0ZWQgbmVzdGluZ3Mgc3VjaCBhcyBtYXAobGlzdChzdHJpbmcpKSA9PiBjZGt0bi5TdHJpbmdMaXN0TWFwLlxuICBnZXQgaXNTdG9yZWRDbGFzc1VuYXZhaWxhYmxlKCkge1xuICAgIGlmICh0aGlzLmlzQ29tcGxleCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZFN0b3JlZENsYXNzID09PSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldEF0dHJpYnV0ZVR5cGVNb2RlbCBpbXBsZW1lbnRzIENvbGxlY3Rpb25BdHRyaWJ1dGVUeXBlTW9kZWwge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudFR5cGU6IEF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXNTaW5nbGVJdGVtOiBib29sZWFuLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaXNCbG9jazogYm9vbGVhbixcbiAgKSB7XG4gICAgaWYgKHRoaXMuc3RydWN0KSB7XG4gICAgICB0aGlzLnN0cnVjdC5pc1NpbmdsZUl0ZW0gPSB0aGlzLmlzU2luZ2xlSXRlbSB8fCBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBnZXQgdHlwZU1vZGVsVHlwZSgpIHtcbiAgICByZXR1cm4gXCJzZXRcIjtcbiAgfVxuXG4gIGdldCBzdHJ1Y3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUuc3RydWN0O1xuICB9XG5cbiAgZ2V0IGlzQ29tcGxleCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS5pc0NvbXBsZXg7XG4gIH1cblxuICBnZXRTdG9yZWRDbGFzc0luaXRpYWxpemVyKG5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzU2luZ2xlSXRlbSkge1xuICAgICAgcmV0dXJuIGBuZXcgJHt0aGlzLmVsZW1lbnRUeXBlLnN0b3JlZENsYXNzVHlwZX1PdXRwdXRSZWZlcmVuY2UodGhpcywgXCIke25hbWV9XCIpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuaXNDb21wbGV4KSB7XG4gICAgICAgIHJldHVybiBgbmV3ICR7dGhpcy5zdG9yZWRDbGFzc1R5cGV9KHRoaXMsIFwiJHtuYW1lfVwiLCB0cnVlKWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYG5ldyBjZGt0bi4ke3RoaXMucmVzb2x2ZWRTdG9yZWRDbGFzcyEubmFtZX0odGhpcywgXCIke25hbWV9XCIsIHRydWUpYDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgc3RvcmVkQ2xhc3NUeXBlKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmVsZW1lbnRUeXBlLnN0b3JlZENsYXNzVHlwZX1MaXN0YDtcbiAgfVxuXG4gIGdldCByZXNvbHZlZFN0b3JlZENsYXNzKCkge1xuICAgIHJldHVybiByZXNvbHZlU3RvcmVkQ2xhc3NOYW1lKFxuICAgICAgdGhpcy5zdG9yZWRDbGFzc1R5cGUsXG4gICAgICB0aGlzLmVsZW1lbnRUeXBlLnR5cGVNb2RlbFR5cGUsXG4gICAgKTtcbiAgfVxuXG4gIGdldCBpbnB1dFR5cGVEZWZpbml0aW9uKCkge1xuICAgIGlmICh0aGlzLmlzU2luZ2xlSXRlbSkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUuaW5wdXRUeXBlRGVmaW5pdGlvbjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudFR5cGUuc3RvcmVkQ2xhc3NUeXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIFwiQXJyYXk8Ym9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlPiB8IGNka3RuLklSZXNvbHZhYmxlXCI7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzQ29tcGxleCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuZWxlbWVudFR5cGUuc3RvcmVkQ2xhc3NUeXBlfVtdIHwgY2RrdG4uSVJlc29sdmFibGVgO1xuICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50VHlwZS50eXBlTW9kZWxUeXBlICE9PSBcInNpbXBsZVwiKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5lbGVtZW50VHlwZS5pbnB1dFR5cGVEZWZpbml0aW9ufVtdIHwgY2RrdG4uSVJlc29sdmFibGVgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5lbGVtZW50VHlwZS5pbnB1dFR5cGVEZWZpbml0aW9ufVtdYDtcbiAgICB9XG4gIH1cblxuICBnZXRBdHRyaWJ1dGVBY2Nlc3NGdW5jdGlvbihuYW1lOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKHRoaXMuZWxlbWVudFR5cGUuc3RvcmVkQ2xhc3NUeXBlKSB7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiBgY2RrdG4uRm4udG9saXN0KHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnJHtuYW1lfScpKWA7XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgIHJldHVybiBgY2RrdG4uVG9rZW4uYXNOdW1iZXJMaXN0KGNka3RuLkZuLnRvbGlzdCh0aGlzLmdldE51bWJlckxpc3RBdHRyaWJ1dGUoJyR7bmFtZX0nKSkpYDtcbiAgICB9XG5cbiAgICAvLyBUb2tlbi5hc0FueSBpcyByZXF1aXJlZCBiZWNhdXNlIHRvbGlzdCByZXR1cm5zIGFuIEFycmF5IGVuY29kZWQgdG9rZW4gd2hpY2ggdGhlIGxpc3RNYXBwZXJcbiAgICAvLyB3b3VsZCB0cnkgdG8gbWFwIG92ZXIgd2hlbiB0aGlzIGlzIHBhc3NlZCB0byBhbm90aGVyIHJlc291cmNlLiBXaXRoIFRva2VuLmFzQW55KCkgaXQgaXMgbGVmdFxuICAgIC8vIGFzIGlzIGJ5IHRoZSBsaXN0TWFwcGVyIGFuZCBpcyBsYXRlciBwcm9wZXJseSByZXNvbHZlZCB0byBhIHJlZmVyZW5jZVxuICAgIC8vICh0aGlzIG9ubHkgd29ya3MgaW4gVHlwZVNjcmlwdCBjdXJyZW50bHksIHNhbWUgYXMgZm9yIHJlZmVyZW5jaW5nIGxpc3RzXG4gICAgLy8gW3NlZSBcImludGVycG9sYXRpb25Gb3JBdHRyaWJ1dGUoLi4uKVwiIGZ1cnRoZXIgYmVsb3ddKVxuICAgIHJldHVybiBgY2RrdG4uVG9rZW4uYXNBbnkoY2RrdG4uRm4udG9saXN0KHRoaXMuaW50ZXJwb2xhdGlvbkZvckF0dHJpYnV0ZSgnJHtuYW1lfScpKSlgO1xuICB9XG5cbiAgZ2V0IHRvVGVycmFmb3JtRnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuaXNTaW5nbGVJdGVtKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS50b1RlcnJhZm9ybUZ1bmN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYGNka3RuLmxpc3RNYXBwZXIoJHt0aGlzLmVsZW1lbnRUeXBlLnRvVGVycmFmb3JtRnVuY3Rpb259LCAke3RoaXMuaXNCbG9ja30pYDtcbiAgICB9XG4gIH1cblxuICBnZXQgdG9IY2xUZXJyYWZvcm1GdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5pc1NpbmdsZUl0ZW0pIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnRvSGNsVGVycmFmb3JtRnVuY3Rpb247XG4gICAgfVxuICAgIHJldHVybiBgY2RrdG4ubGlzdE1hcHBlckhjbCgke3RoaXMuZWxlbWVudFR5cGUudG9IY2xUZXJyYWZvcm1GdW5jdGlvbn0sICR7dGhpcy5pc0Jsb2NrfSlgO1xuICB9XG5cbiAgZ2V0IGhhc1JlZmVyZW5jZUNsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLmlzU2luZ2xlSXRlbSB8fCB0aGlzLmlzQ29tcGxleDtcbiAgfVxuXG4gIGdldCBpc1Rva2VuaXphYmxlKCkge1xuICAgIHN3aXRjaCAodGhpcy5lbGVtZW50VHlwZS5zdG9yZWRDbGFzc1R5cGUpIHtcbiAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlZSBjb21tZW50IG9uIExpc3RBdHRyaWJ1dGVUeXBlTW9kZWwuaXNTdG9yZWRDbGFzc1VuYXZhaWxhYmxlIGFib3ZlIC0gc2FtZVxuICAvLyByZWFzb25pbmcgYXBwbGllcyBoZXJlLlxuICBnZXQgaXNTdG9yZWRDbGFzc1VuYXZhaWxhYmxlKCkge1xuICAgIGlmICh0aGlzLmlzQ29tcGxleCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZFN0b3JlZENsYXNzID09PSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hcEF0dHJpYnV0ZVR5cGVNb2RlbCBpbXBsZW1lbnRzIENvbGxlY3Rpb25BdHRyaWJ1dGVUeXBlTW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZWxlbWVudFR5cGU6IEF0dHJpYnV0ZVR5cGVNb2RlbCkge31cblxuICBnZXQgdHlwZU1vZGVsVHlwZSgpIHtcbiAgICByZXR1cm4gXCJtYXBcIjtcbiAgfVxuXG4gIGdldCBzdHJ1Y3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUuc3RydWN0O1xuICB9XG5cbiAgZ2V0IGlzQ29tcGxleCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS5pc0NvbXBsZXg7XG4gIH1cblxuICBnZXRTdG9yZWRDbGFzc0luaXRpYWxpemVyKG5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzQ29tcGxleCkge1xuICAgICAgcmV0dXJuIGBuZXcgJHt0aGlzLnN0b3JlZENsYXNzVHlwZX0odGhpcywgXCIke25hbWV9XCIpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBuZXcgY2RrdG4uJHt0aGlzLnJlc29sdmVkU3RvcmVkQ2xhc3MhLm5hbWV9KHRoaXMsIFwiJHtuYW1lfVwiKWA7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHN0b3JlZENsYXNzVHlwZSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5lbGVtZW50VHlwZS5zdG9yZWRDbGFzc1R5cGV9TWFwYDtcbiAgfVxuXG4gIGdldCByZXNvbHZlZFN0b3JlZENsYXNzKCkge1xuICAgIHJldHVybiByZXNvbHZlU3RvcmVkQ2xhc3NOYW1lKFxuICAgICAgdGhpcy5zdG9yZWRDbGFzc1R5cGUsXG4gICAgICB0aGlzLmVsZW1lbnRUeXBlLnR5cGVNb2RlbFR5cGUsXG4gICAgKTtcbiAgfVxuXG4gIGdldCBpbnB1dFR5cGVEZWZpbml0aW9uKCkge1xuICAgIC8vIG1hcCBvZiBib29sZWFucyBoYXMgdG9rZW4gc3VwcG9ydCwgYnV0IGJvb2xlYW5zIGRvbid0XG4gICAgaWYgKHRoaXMuZWxlbWVudFR5cGUuc3RvcmVkQ2xhc3NUeXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIGB7IFtrZXk6IHN0cmluZ106ICgke3RoaXMuZWxlbWVudFR5cGUuc3RvcmVkQ2xhc3NUeXBlfSB8IGNka3RuLklSZXNvbHZhYmxlKSB9YDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNDb21wbGV4KSB7XG4gICAgICByZXR1cm4gYHsgW2tleTogc3RyaW5nXTogJHt0aGlzLmVsZW1lbnRUeXBlLnN0b3JlZENsYXNzVHlwZX0gfSB8IGNka3RuLklSZXNvbHZhYmxlYDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudFR5cGUudHlwZU1vZGVsVHlwZSAhPT0gXCJzaW1wbGVcIikge1xuICAgICAgcmV0dXJuIGB7IFtrZXk6IHN0cmluZ106ICR7dGhpcy5lbGVtZW50VHlwZS5pbnB1dFR5cGVEZWZpbml0aW9ufSB9IHwgY2RrdG4uSVJlc29sdmFibGVgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYHsgW2tleTogc3RyaW5nXTogJHt0aGlzLmVsZW1lbnRUeXBlLnN0b3JlZENsYXNzVHlwZX0gfWA7XG4gICAgfVxuICB9XG5cbiAgZ2V0QXR0cmlidXRlQWNjZXNzRnVuY3Rpb24obmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmlzQ29tcGxleCAmJiB0aGlzLmVsZW1lbnRUeXBlLnR5cGVNb2RlbFR5cGUgIT09IFwic2ltcGxlXCIpIHtcbiAgICAgIHJldHVybiBgdGhpcy5pbnRlcnBvbGF0aW9uRm9yQXR0cmlidXRlKCcke25hbWV9JylgO1xuICAgIH1cblxuICAgIHJldHVybiBgdGhpcy5nZXQke3VwcGVyY2FzZUZpcnN0KFxuICAgICAgdGhpcy5zdG9yZWRDbGFzc1R5cGUsXG4gICAgKX1BdHRyaWJ1dGUoJyR7bmFtZX0nKWA7XG4gIH1cblxuICBnZXQgdG9UZXJyYWZvcm1GdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYGNka3RuLmhhc2hNYXBwZXIoJHt0aGlzLmVsZW1lbnRUeXBlLnRvVGVycmFmb3JtRnVuY3Rpb259KWA7XG4gIH1cblxuICBnZXQgdG9IY2xUZXJyYWZvcm1GdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYGNka3RuLmhhc2hNYXBwZXJIY2woJHt0aGlzLmVsZW1lbnRUeXBlLnRvSGNsVGVycmFmb3JtRnVuY3Rpb259KWA7XG4gIH1cblxuICBnZXQgaGFzUmVmZXJlbmNlQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb21wbGV4O1xuICB9XG5cbiAgZ2V0IGlzVG9rZW5pemFibGUoKSB7XG4gICAgc3dpdGNoICh0aGlzLmVsZW1lbnRUeXBlLnN0b3JlZENsYXNzVHlwZSkge1xuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gU2VlIGNvbW1lbnQgb24gTGlzdEF0dHJpYnV0ZVR5cGVNb2RlbC5pc1N0b3JlZENsYXNzVW5hdmFpbGFibGUgYWJvdmUgLSBzYW1lXG4gIC8vIHJlYXNvbmluZyBhcHBsaWVzIGhlcmUgKE1hcEF0dHJpYnV0ZVR5cGVNb2RlbC5oYXNSZWZlcmVuY2VDbGFzcyBpcyBqdXN0IGlzQ29tcGxleCkuXG4gIGdldCBpc1N0b3JlZENsYXNzVW5hdmFpbGFibGUoKSB7XG4gICAgaWYgKHRoaXMuaXNDb21wbGV4KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc29sdmVkU3RvcmVkQ2xhc3MgPT09IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
@@ -1,5 +1,6 @@
1
1
  export * from "./attribute-model";
2
2
  export * from "./attribute-type-model";
3
+ export * from "./provider-function-model";
3
4
  export * from "./resource-model";
4
5
  export * from "./scope";
5
6
  export * from "./struct";
@@ -18,7 +18,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
18
18
  // SPDX-License-Identifier: MPL-2.0
19
19
  __exportStar(require("./attribute-model"), exports);
20
20
  __exportStar(require("./attribute-type-model"), exports);
21
+ __exportStar(require("./provider-function-model"), exports);
21
22
  __exportStar(require("./resource-model"), exports);
22
23
  __exportStar(require("./scope"), exports);
23
24
  __exportStar(require("./struct"), exports);
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ2V0L2dlbmVyYXRvci9tb2RlbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsb0RBQWtDO0FBQ2xDLHlEQUF1QztBQUN2QyxtREFBaUM7QUFDakMsMENBQXdCO0FBQ3hCLDJDQUF5QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5leHBvcnQgKiBmcm9tIFwiLi9hdHRyaWJ1dGUtbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2F0dHJpYnV0ZS10eXBlLW1vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXNvdXJjZS1tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2NvcGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0cnVjdFwiO1xuIl19
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ2V0L2dlbmVyYXRvci9tb2RlbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsb0RBQWtDO0FBQ2xDLHlEQUF1QztBQUN2Qyw0REFBMEM7QUFDMUMsbURBQWlDO0FBQ2pDLDBDQUF3QjtBQUN4QiwyQ0FBeUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuZXhwb3J0ICogZnJvbSBcIi4vYXR0cmlidXRlLW1vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hdHRyaWJ1dGUtdHlwZS1tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcHJvdmlkZXItZnVuY3Rpb24tbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jlc291cmNlLW1vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zY29wZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RydWN0XCI7XG4iXX0=
@@ -0,0 +1,102 @@
1
+ import { FunctionSignature } from "@cdktn/commons";
2
+ /**
3
+ * A provider-defined function parameter (positional or the trailing
4
+ * variadic one), mapped to the jsii-safe TypeScript type used in the
5
+ * generated method signature.
6
+ */
7
+ export interface ProviderFunctionParameterModel {
8
+ readonly terraformName: string;
9
+ readonly name: string;
10
+ readonly tsType: string;
11
+ /**
12
+ * The JSDoc type expression emitted inside the `@param {...}` braces.
13
+ * A pure type expression only - prose (Terraform list/set semantics,
14
+ * `cdktn.Token.nullValue()` guidance) belongs in `docstringNote`.
15
+ */
16
+ readonly docstringType: string;
17
+ /**
18
+ * Prose appended after the parameter name (and `description`, if any) in
19
+ * the emitted `@param` line - e.g. set-ordering semantics or how to pass
20
+ * an explicit Terraform `null`. Official JSDoc places only the type
21
+ * expression inside the braces, so this must never be folded into
22
+ * `docstringType`.
23
+ */
24
+ readonly docstringNote?: string;
25
+ readonly description?: string;
26
+ /**
27
+ * True when this (fixed, non-variadic) parameter is emitted as a
28
+ * jsii-optional TypeScript parameter (`name?: T`) - see the
29
+ * is_nullable/trailing-compatibility handling in `applyNullability`.
30
+ * Never set on the variadic parameter: an array parameter can't be `?`.
31
+ */
32
+ readonly optional?: boolean;
33
+ }
34
+ /**
35
+ * A single provider-defined function, mapped to a static method on the
36
+ * generated `<Provider>ProviderFunctions` class.
37
+ */
38
+ export interface ProviderFunctionModel {
39
+ readonly terraformName: string;
40
+ readonly methodName: string;
41
+ readonly description?: string;
42
+ readonly summary?: string;
43
+ /**
44
+ * Terraform (>=1.8) deprecation message for the function, surfaced as an
45
+ * `@deprecated` JSDoc tag. OpenTofu never emits this field - see
46
+ * `FunctionSignature.deprecation_message`.
47
+ */
48
+ readonly deprecationMessage?: string;
49
+ readonly returnTsType: string;
50
+ /**
51
+ * The `@returns {...}` JSDoc type, describing the conceptual/Terraform
52
+ * shape of the return value - see `mapReturnType`. This deliberately can
53
+ * differ from `returnTsType` (e.g. a `bool` return is declared
54
+ * `cdktn.IResolvable` but documented as `boolean | IResolvable`), the same
55
+ * way a parameter's `docstringType` can differ from its `tsType`.
56
+ */
57
+ readonly returnDocstringType: string;
58
+ /**
59
+ * Prose appended after the `@returns {...}` braces (e.g. Terraform
60
+ * list/set semantics) - the return-side counterpart of a parameter's
61
+ * `docstringNote`.
62
+ */
63
+ readonly returnDocstringNote?: string;
64
+ /**
65
+ * Wraps the `cdktn.TerraformProviderFunction.invoke(...)` call expression
66
+ * into the method's `return` statement (e.g. wrapping it in
67
+ * `cdktn.Token.asString(...)`, or returning it unwrapped for `bool`).
68
+ */
69
+ readonly wrapReturn: (invokeExpression: string) => string;
70
+ readonly parameters: ProviderFunctionParameterModel[];
71
+ readonly variadicParameter?: ProviderFunctionParameterModel;
72
+ }
73
+ /**
74
+ * All provider-defined functions of a single provider, mapped to a single
75
+ * generated `providers/<provider>/provider-functions/index.ts` file.
76
+ */
77
+ export interface ProviderFunctionsModel {
78
+ readonly providerName: string;
79
+ readonly className: string;
80
+ readonly functions: ProviderFunctionModel[];
81
+ }
82
+ /**
83
+ * Throws if the provider's own config schema declares an attribute whose
84
+ * generated property name (see `AttributeModel.name` /
85
+ * `escapeAttributeName`) is exactly "functions", while the provider also
86
+ * declares provider-defined functions. That combination would collide with
87
+ * the memoized `functions` getter `ResourceEmitter` emits on the provider
88
+ * class (see `resource-emitter.ts`'s `emitFunctionsGetter`) - one would
89
+ * silently shadow the other. Same loud-failure convention as
90
+ * `assertNoMethodNameCollisions`/`assertNoParameterNameCollisions` above:
91
+ * generation is aborted rather than silently picking a winner.
92
+ */
93
+ export declare function assertNoFunctionsGetterCollision(providerName: string, attributeNames: string[]): void;
94
+ /**
95
+ * Builds the model for a provider's `provider-functions/index.ts` file from
96
+ * its provider schema `functions` map. Returns `undefined` when the provider
97
+ * declares no functions - callers should skip emitting the file entirely.
98
+ */
99
+ export declare function buildProviderFunctionsModel(providerName: string, functions: {
100
+ [name: string]: FunctionSignature;
101
+ } | undefined): ProviderFunctionsModel | undefined;
102
+ //# sourceMappingURL=provider-function-model.d.ts.map