@dynamic-field-kit/angular 1.3.3 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +50 -3
  3. package/dist/README.md +50 -3
  4. package/dist/components/BaseInput.d.ts +5 -11
  5. package/dist/components/DynamicInput.d.ts +6 -2
  6. package/dist/components/FieldInput.d.ts +6 -2
  7. package/dist/components/MultiFieldInput.d.ts +10 -1
  8. package/dist/esm2022/components/BaseInput.mjs +8 -17
  9. package/dist/esm2022/components/DynamicInput.mjs +67 -14
  10. package/dist/esm2022/components/FieldInput.mjs +39 -20
  11. package/dist/esm2022/components/MultiFieldInput.mjs +87 -13
  12. package/dist/esm2022/fieldRegistryToken.mjs +12 -0
  13. package/dist/esm2022/public-api.mjs +6 -2
  14. package/dist/esm2022/types/layout.mjs +1 -1
  15. package/dist/fesm2022/dynamic-field-kit-angular.mjs +208 -61
  16. package/dist/fesm2022/dynamic-field-kit-angular.mjs.map +1 -1
  17. package/dist/fieldRegistryToken.d.ts +3 -0
  18. package/dist/public-api.d.ts +4 -1
  19. package/dist/types/layout.d.ts +4 -25
  20. package/package.json +14 -16
  21. package/src/components/BaseInput.ts +7 -10
  22. package/src/components/DynamicInput.ts +67 -11
  23. package/src/components/FieldInput.ts +23 -16
  24. package/src/components/MultiFieldInput.ts +101 -8
  25. package/src/fieldRegistryToken.ts +15 -0
  26. package/src/public-api.ts +40 -24
  27. package/src/types/layout.ts +14 -36
  28. package/test/DynamicInput.spec.ts +217 -17
  29. package/test/FieldInput.spec.ts +131 -29
  30. package/test/MultiFieldInput.spec.ts +256 -0
  31. package/test/helpers/renderers.ts +89 -0
  32. package/test/layout.spec.ts +119 -0
  33. package/test/publicApi.spec.ts +64 -0
  34. package/{test.ts → test/setup.ts} +2 -2
  35. package/test/smoke.spec.ts +27 -0
  36. package/tsconfig.json +13 -13
  37. package/tsconfig.spec.json +4 -16
  38. package/vitest.config.ts +30 -0
  39. package/angular.json +0 -27
  40. package/karma.conf.js +0 -37
  41. package/test/angular.spec.ts +0 -102
  42. package/test/integration.spec.ts +0 -57
  43. package/test/layouts.spec.ts +0 -26
@@ -1,6 +1,6 @@
1
1
  import { NgClass, NgFor, NgIf } from '@angular/common';
2
2
  import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, } from '@angular/core';
3
- import { applyComputedValues, canAddGroupItem, canRemoveGroupItem, createGroupItem, } from '@dynamic-field-kit/core';
3
+ import { applyComputedValues, canAddGroupItem, canRemoveGroupItem, createGroupItem, resolveDisabled, resolveOptions, resolveReadOnly, validateField, validateFields, } from '@dynamic-field-kit/core';
4
4
  import { FieldInput } from './FieldInput';
5
5
  import * as i0 from "@angular/core";
6
6
  const DEFAULT_BREAKPOINT = 768;
@@ -9,7 +9,12 @@ export class MultiFieldInput {
9
9
  fieldDescriptions = [];
10
10
  properties;
11
11
  onChange = new EventEmitter();
12
+ validityChange = new EventEmitter();
12
13
  layout = 'column';
14
+ // Top-level form data, threaded down through repeatable groups so a nested
15
+ // field's appearCondition/computeValue can read the root form. Omitted at
16
+ // the top level, where the form's own data is the root.
17
+ rootData;
13
18
  data = {};
14
19
  visibleFields = [];
15
20
  isMobile = false;
@@ -53,6 +58,18 @@ export class MultiFieldInput {
53
58
  trackByIndex(index) {
54
59
  return index;
55
60
  }
61
+ groupTrackByCache = new WeakMap();
62
+ // Returns a stable trackBy per group field: item[keyField] when configured,
63
+ // else the index. Cached by field reference so the template hands Angular the
64
+ // same function each change-detection pass.
65
+ groupTrackBy(field) {
66
+ let fn = this.groupTrackByCache.get(field);
67
+ if (!fn) {
68
+ fn = (index, item) => field.keyField ? item[field.keyField] ?? index : index;
69
+ this.groupTrackByCache.set(field, fn);
70
+ }
71
+ return fn;
72
+ }
56
73
  ngOnInit() {
57
74
  this.updateIsMobile();
58
75
  this.init();
@@ -64,19 +81,25 @@ export class MultiFieldInput {
64
81
  const breakpoint = typeof this.layout === 'object' && this.layout.type === 'responsive'
65
82
  ? this.layout.breakpoint ?? DEFAULT_BREAKPOINT
66
83
  : DEFAULT_BREAKPOINT;
67
- this.isMobile =
68
- typeof window !== 'undefined' && window.innerWidth < breakpoint;
84
+ if (typeof window !== 'undefined' &&
85
+ typeof window.matchMedia === 'function') {
86
+ this.isMobile = window.matchMedia(`(max-width: ${breakpoint - 1}px)`).matches;
87
+ }
88
+ else {
89
+ this.isMobile =
90
+ typeof window !== 'undefined' && window.innerWidth < breakpoint;
91
+ }
69
92
  }
70
93
  init() {
71
94
  if (this.properties) {
72
- this.data = applyComputedValues(this.fieldDescriptions, {
73
- ...this.properties,
74
- });
95
+ this.data = applyComputedValues(this.fieldDescriptions, { ...this.properties }, this.rootData);
75
96
  }
76
97
  this.updateVisibleFields();
98
+ this.validityChange.emit(validateFields(this.fieldDescriptions, this.data, this.rootData));
77
99
  }
78
100
  updateVisibleFields() {
79
- this.visibleFields = this.fieldDescriptions.filter((f) => !f.appearCondition || f.appearCondition(this.data));
101
+ const root = this.rootData ?? this.data;
102
+ this.visibleFields = this.fieldDescriptions.filter((f) => !f.appearCondition || f.appearCondition(this.data, root));
80
103
  }
81
104
  onFieldChange(event) {
82
105
  this.commitData({ ...this.data, [event.key]: event.value });
@@ -85,6 +108,22 @@ export class MultiFieldInput {
85
108
  const value = this.data[field.name];
86
109
  return Array.isArray(value) ? value : [];
87
110
  }
111
+ getResolvedOptions(field) {
112
+ return resolveOptions(field, this.data, this.rootData);
113
+ }
114
+ getDisabled(field) {
115
+ return resolveDisabled(field, this.data, this.rootData);
116
+ }
117
+ getReadOnly(field) {
118
+ return resolveReadOnly(field, this.data, this.rootData);
119
+ }
120
+ getError(field) {
121
+ if (this.getDisabled(field)) {
122
+ return undefined;
123
+ }
124
+ const errors = validateField(field, this.data[field.name], this.data, this.rootData);
125
+ return errors.length > 0 ? errors : undefined;
126
+ }
88
127
  canAddItem(field) {
89
128
  return canAddGroupItem(field, this.getItems(field));
90
129
  }
@@ -114,13 +153,14 @@ export class MultiFieldInput {
114
153
  this.commitData({ ...this.data, [field.name]: items });
115
154
  }
116
155
  commitData(nextData) {
117
- this.data = applyComputedValues(this.fieldDescriptions, nextData);
156
+ this.data = applyComputedValues(this.fieldDescriptions, nextData, this.rootData);
118
157
  this.updateVisibleFields();
119
158
  this.onChange.emit(this.data);
159
+ this.validityChange.emit(validateFields(this.fieldDescriptions, this.data, this.rootData));
120
160
  this.cdr.markForCheck();
121
161
  }
122
162
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: MultiFieldInput, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
123
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: MultiFieldInput, isStandalone: true, selector: "dfk-multi-field-input", inputs: { fieldDescriptions: "fieldDescriptions", properties: "properties", layout: "layout" }, outputs: { onChange: "onChange" }, host: { listeners: { "window:resize": "onWindowResize()" } }, usesOnChanges: true, ngImport: i0, template: `
163
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: MultiFieldInput, isStandalone: true, selector: "dfk-multi-field-input", inputs: { fieldDescriptions: "fieldDescriptions", properties: "properties", layout: "layout", rootData: "rootData" }, outputs: { onChange: "onChange", validityChange: "validityChange" }, host: { listeners: { "window:resize": "onWindowResize()" } }, usesOnChanges: true, ngImport: i0, template: `
124
164
  <div
125
165
  class="p-4 border rounded-lg bg-gray-50"
126
166
  [ngClass]="{
@@ -138,6 +178,10 @@ export class MultiFieldInput {
138
178
  *ngIf="!field.fields"
139
179
  [fieldDescription]="field"
140
180
  [value]="data[field.name]"
181
+ [options]="getResolvedOptions(field)"
182
+ [disabled]="getDisabled(field)"
183
+ [readOnly]="getReadOnly(field)"
184
+ [error]="getError(field)"
141
185
  (onValueChangeField)="onFieldChange($event)"
142
186
  ></dfk-field-input>
143
187
 
@@ -147,7 +191,7 @@ export class MultiFieldInput {
147
191
  *ngFor="
148
192
  let item of getItems(field);
149
193
  let i = index;
150
- trackBy: trackByIndex
194
+ trackBy: groupTrackBy(field)
151
195
  "
152
196
  style="display: flex; align-items: flex-start; gap: 8px;"
153
197
  >
@@ -155,11 +199,19 @@ export class MultiFieldInput {
155
199
  <dfk-multi-field-input
156
200
  [fieldDescriptions]="field.fields"
157
201
  [properties]="item"
202
+ [rootData]="rootData ?? data"
158
203
  (onChange)="onGroupItemChange(field, i, $event)"
159
204
  ></dfk-multi-field-input>
160
205
  </div>
161
206
  <button
162
207
  type="button"
208
+ [attr.aria-label]="
209
+ (field.removeLabel || 'Remove') +
210
+ ' ' +
211
+ (field.label || field.name) +
212
+ ' ' +
213
+ (i + 1)
214
+ "
163
215
  (click)="onGroupItemRemove(field, i)"
164
216
  [disabled]="!canRemoveItem(field)"
165
217
  >
@@ -168,6 +220,9 @@ export class MultiFieldInput {
168
220
  </div>
169
221
  <button
170
222
  type="button"
223
+ [attr.aria-label]="
224
+ (field.addLabel || 'Add') + ' ' + (field.label || field.name)
225
+ "
171
226
  (click)="onGroupItemAdd(field)"
172
227
  [disabled]="!canAddItem(field)"
173
228
  >
@@ -176,7 +231,7 @@ export class MultiFieldInput {
176
231
  </div>
177
232
  </ng-container>
178
233
  </div>
179
- `, isInline: true, dependencies: [{ kind: "component", type: MultiFieldInput, selector: "dfk-multi-field-input", inputs: ["fieldDescriptions", "properties", "layout"], outputs: ["onChange"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FieldInput, selector: "dfk-field-input", inputs: ["fieldDescription", "value"], outputs: ["onValueChangeField"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
234
+ `, isInline: true, dependencies: [{ kind: "component", type: MultiFieldInput, selector: "dfk-multi-field-input", inputs: ["fieldDescriptions", "properties", "layout", "rootData"], outputs: ["onChange", "validityChange"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FieldInput, selector: "dfk-field-input", inputs: ["fieldDescription", "value", "options", "disabled", "readOnly", "error"], outputs: ["onValueChangeField"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
180
235
  }
181
236
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: MultiFieldInput, decorators: [{
182
237
  type: Component,
@@ -209,6 +264,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
209
264
  *ngIf="!field.fields"
210
265
  [fieldDescription]="field"
211
266
  [value]="data[field.name]"
267
+ [options]="getResolvedOptions(field)"
268
+ [disabled]="getDisabled(field)"
269
+ [readOnly]="getReadOnly(field)"
270
+ [error]="getError(field)"
212
271
  (onValueChangeField)="onFieldChange($event)"
213
272
  ></dfk-field-input>
214
273
 
@@ -218,7 +277,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
218
277
  *ngFor="
219
278
  let item of getItems(field);
220
279
  let i = index;
221
- trackBy: trackByIndex
280
+ trackBy: groupTrackBy(field)
222
281
  "
223
282
  style="display: flex; align-items: flex-start; gap: 8px;"
224
283
  >
@@ -226,11 +285,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
226
285
  <dfk-multi-field-input
227
286
  [fieldDescriptions]="field.fields"
228
287
  [properties]="item"
288
+ [rootData]="rootData ?? data"
229
289
  (onChange)="onGroupItemChange(field, i, $event)"
230
290
  ></dfk-multi-field-input>
231
291
  </div>
232
292
  <button
233
293
  type="button"
294
+ [attr.aria-label]="
295
+ (field.removeLabel || 'Remove') +
296
+ ' ' +
297
+ (field.label || field.name) +
298
+ ' ' +
299
+ (i + 1)
300
+ "
234
301
  (click)="onGroupItemRemove(field, i)"
235
302
  [disabled]="!canRemoveItem(field)"
236
303
  >
@@ -239,6 +306,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
239
306
  </div>
240
307
  <button
241
308
  type="button"
309
+ [attr.aria-label]="
310
+ (field.addLabel || 'Add') + ' ' + (field.label || field.name)
311
+ "
242
312
  (click)="onGroupItemAdd(field)"
243
313
  [disabled]="!canAddItem(field)"
244
314
  >
@@ -255,10 +325,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
255
325
  type: Input
256
326
  }], onChange: [{
257
327
  type: Output
328
+ }], validityChange: [{
329
+ type: Output
258
330
  }], layout: [{
259
331
  type: Input
332
+ }], rootData: [{
333
+ type: Input
260
334
  }], onWindowResize: [{
261
335
  type: HostListener,
262
336
  args: ['window:resize']
263
337
  }] } });
264
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlGaWVsZElucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvTXVsdGlGaWVsZElucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsZUFBZSxHQUdoQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBRTFDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBdUUvQixNQUFNLE9BQU8sZUFBZTtJQVVOO0lBVFgsaUJBQWlCLEdBQXVCLEVBQUUsQ0FBQztJQUMzQyxVQUFVLENBQWM7SUFDdkIsUUFBUSxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7SUFDM0MsTUFBTSxHQUFpQixRQUFRLENBQUM7SUFFekMsSUFBSSxHQUFlLEVBQUUsQ0FBQztJQUN0QixhQUFhLEdBQXVCLEVBQUUsQ0FBQztJQUMvQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRXpCLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO0lBQUcsQ0FBQztJQUc5QyxjQUFjO1FBQ1osTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNI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LE9BQU8sb0ZBQUUsS0FBSyxtSEFBRSxJQUFJLDZGQUFFLFVBQVU7OzRGQTREL0IsZUFBZTtrQkFyRTNCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtvQkFDakMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLDJFQUEyRTtvQkFDM0UsMEVBQTBFO29CQUMxRSx3RUFBd0U7b0JBQ3hFLHlFQUF5RTtvQkFDekUsMEVBQTBFO29CQUMxRSx3RUFBd0U7b0JBQ3hFLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsa0JBQWtCO29CQUM1RCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdEVDtpQkFDRjtzRkFFVSxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNFLE1BQU07c0JBQWQsS0FBSztnQkFTTixjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ2xhc3MsIE5nRm9yLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgYXBwbHlDb21wdXRlZFZhbHVlcyxcbiAgY2FuQWRkR3JvdXBJdGVtLFxuICBjYW5SZW1vdmVHcm91cEl0ZW0sXG4gIGNyZWF0ZUdyb3VwSXRlbSxcbiAgRmllbGREZXNjcmlwdGlvbixcbiAgUHJvcGVydGllcyxcbn0gZnJvbSAnQGR5bmFtaWMtZmllbGQta2l0L2NvcmUnO1xuaW1wb3J0IHsgQmFzZUxheW91dENvbmZpZywgTGF5b3V0Q29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvbGF5b3V0JztcbmltcG9ydCB7IEZpZWxkSW5wdXQgfSBmcm9tICcuL0ZpZWxkSW5wdXQnO1xuXG5jb25zdCBERUZBVUxUX0JSRUFLUE9JTlQgPSA3Njg7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Rmay1tdWx0aS1maWVsZC1pbnB1dCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIC8vIFJlcGVhdGFibGUgZmllbGQgZ3JvdXBzIHJlbmRlciBhIG5lc3RlZCA8ZGZrLW11bHRpLWZpZWxkLWlucHV0PiBwZXIgaXRlbVxuICAvLyAoc2VlIHRoZSAjZ3JvdXBUcGwgYmVsb3cpLCBzbyB0aGlzIGNvbXBvbmVudCBpbXBvcnRzIGl0c2VsZi4gVGhhdCdzIHRoZVxuICAvLyBzdXBwb3J0ZWQgd2F5IHRvIGdpdmUgYSBzdGFuZGFsb25lIGNvbXBvbmVudCByZWN1cnNpdmUgdGVtcGxhdGUgdXNhZ2VcbiAgLy8gd2l0aG91dCBhIGNyb3NzLWZpbGUgY2lyY3VsYXIgaW1wb3J0IGJldHdlZW4gRmllbGRJbnB1dCBhbmQgYSBzZXBhcmF0ZVxuICAvLyBncm91cCBjb21wb25lbnQgKHdob3NlIGBpbXBvcnRzYCBhcnJheXMgYXJlIGV2YWx1YXRlZCBlYWdlcmx5IGF0IG1vZHVsZVxuICAvLyBsb2FkIHRpbWUgYW5kIHdvdWxkIGRlYWRsb2NrIG9uIGFuIGFjdHVhbCBjaXJjdWxhciBtb2R1bGUgcmVmZXJlbmNlKS5cbiAgaW1wb3J0czogW05nQ2xhc3MsIE5nRm9yLCBOZ0lmLCBGaWVsZElucHV0LCBNdWx0aUZpZWxkSW5wdXRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInAtNCBib3JkZXIgcm91bmRlZC1sZyBiZy1ncmF5LTUwXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ2ZsZXggZmxleC1jb2wnOiByZXNvbHZlZExheW91dFR5cGUgPT09ICdjb2x1bW4nLFxuICAgICAgICAnZmxleCBmbGV4LXJvdyc6IHJlc29sdmVkTGF5b3V0VHlwZSA9PT0gJ3JvdycsXG4gICAgICAgIGdyaWQ6IHJlc29sdmVkTGF5b3V0VHlwZSA9PT0gJ2dyaWQnXG4gICAgICB9XCJcbiAgICAgIFtzdHlsZS5nYXAucHhdPVwiZ2FwXCJcbiAgICAgIFtzdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zXT1cIlxuICAgICAgICByZXNvbHZlZExheW91dFR5cGUgPT09ICdncmlkJyA/ICdyZXBlYXQoJyArIGNvbHVtbnMgKyAnLCAxZnIpJyA6IG51bGxcbiAgICAgIFwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2YgdmlzaWJsZUZpZWxkczsgdHJhY2tCeTogdHJhY2tCeUZuXCI+XG4gICAgICAgIDxkZmstZmllbGQtaW5wdXRcbiAgICAgICAgICAqbmdJZj1cIiFmaWVsZC5maWVsZHNcIlxuICAgICAgICAgIFtmaWVsZERlc2NyaXB0aW9uXT1cImZpZWxkXCJcbiAgICAgICAgICBbdmFsdWVdPVwiZGF0YVtmaWVsZC5uYW1lXVwiXG4gICAgICAgICAgKG9uVmFsdWVDaGFuZ2VGaWVsZCk9XCJvbkZpZWxkQ2hhbmdlKCRldmVudClcIlxuICAgICAgICA+PC9kZmstZmllbGQtaW5wdXQ+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLmZpZWxkc1wiIFtjbGFzc109XCJmaWVsZC5jbGFzc05hbWVcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQubGFiZWxcIj57eyBmaWVsZC5sYWJlbCB9fTwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICBsZXQgaXRlbSBvZiBnZXRJdGVtcyhmaWVsZCk7XG4gICAgICAgICAgICAgIGxldCBpID0gaW5kZXg7XG4gICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlJbmRleFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogOHB4O1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDFcIj5cbiAgICAgICAgICAgICAgPGRmay1tdWx0aS1maWVsZC1pbnB1dFxuICAgICAgICAgICAgICAgIFtmaWVsZERlc2NyaXB0aW9uc109XCJmaWVsZC5maWVsZHNcIlxuICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkdyb3VwSXRlbUNoYW5nZShmaWVsZCwgaSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L2Rmay1tdWx0aS1maWVsZC1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uR3JvdXBJdGVtUmVtb3ZlKGZpZWxkLCBpKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuUmVtb3ZlSXRlbShmaWVsZClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBmaWVsZC5yZW1vdmVMYWJlbCB8fCAnUmVtb3ZlJyB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cEl0ZW1BZGQoZmllbGQpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuQWRkSXRlbShmaWVsZClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGZpZWxkLmFkZExhYmVsIHx8ICdBZGQnIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpRmllbGRJbnB1dCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZmllbGREZXNjcmlwdGlvbnM6IEZpZWxkRGVzY3JpcHRpb25bXSA9IFtdO1xuICBASW5wdXQoKSBwcm9wZXJ0aWVzPzogUHJvcGVydGllcztcbiAgQE91dHB1dCgpIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9wZXJ0aWVzPigpO1xuICBASW5wdXQoKSBsYXlvdXQ6IExheW91dENvbmZpZyA9ICdjb2x1bW4nO1xuXG4gIGRhdGE6IFByb3BlcnRpZXMgPSB7fTtcbiAgdmlzaWJsZUZpZWxkczogRmllbGREZXNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgaXNNb2JpbGUgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIGNvbnN0IHdhc01vYmlsZSA9IHRoaXMuaXNNb2JpbGU7XG4gICAgdGhpcy51cGRhdGVJc01vYmlsZSgpO1xuICAgIGlmICh3YXNNb2JpbGUgIT09IHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGdldCByZXNvbHZlZExheW91dCgpOiBCYXNlTGF5b3V0Q29uZmlnIHtcbiAgICBpZiAodHlwZW9mIHRoaXMubGF5b3V0ID09PSAnb2JqZWN0JyAmJiB0aGlzLmxheW91dC50eXBlID09PSAncmVzcG9uc2l2ZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzTW9iaWxlID8gdGhpcy5sYXlvdXQubW9iaWxlIDogdGhpcy5sYXlvdXQuZGVza3RvcDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGF5b3V0IGFzIEJhc2VMYXlvdXRDb25maWc7XG4gIH1cblxuICBnZXQgcmVzb2x2ZWRMYXlvdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVkTGF5b3V0O1xuICAgIHJldHVybiB0eXBlb2YgcmVzb2x2ZWQgPT09ICdzdHJpbmcnID8gcmVzb2x2ZWQgOiByZXNvbHZlZC50eXBlO1xuICB9XG5cbiAgZ2V0IGdhcCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlZExheW91dDtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSAnb2JqZWN0JyAmJiByZXNvbHZlZC5nYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJlc29sdmVkLmdhcDtcbiAgICB9XG4gICAgcmV0dXJuIDEyO1xuICB9XG5cbiAgZ2V0IGNvbHVtbnMoKTogbnVtYmVyIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZWRMYXlvdXQ7XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gJ29iamVjdCcgJiYgcmVzb2x2ZWQudHlwZSA9PT0gJ2dyaWQnKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWQuY29sdW1ucyA/PyAyO1xuICAgIH1cbiAgICByZXR1cm4gMjtcbiAgfVxuXG4gIHRyYWNrQnlGbihpbmRleDogbnVtYmVyLCBmaWVsZDogRmllbGREZXNjcmlwdGlvbik6IHN0cmluZyB8IG51bWJlciB7XG4gICAgcmV0dXJuIGZpZWxkLm5hbWUgfHwgaW5kZXg7XG4gIH1cblxuICB0cmFja0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVJc01vYmlsZSgpO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoX2NoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSXNNb2JpbGUoKTogdm9pZCB7XG4gICAgY29uc3QgYnJlYWtwb2ludCA9XG4gICAgICB0eXBlb2YgdGhpcy5sYXlvdXQgPT09ICdvYmplY3QnICYmIHRoaXMubGF5b3V0LnR5cGUgPT09ICdyZXNwb25zaXZlJ1xuICAgICAgICA/IHRoaXMubGF5b3V0LmJyZWFrcG9pbnQgPz8gREVGQVVMVF9CUkVBS1BPSU5UXG4gICAgICAgIDogREVGQVVMVF9CUkVBS1BPSU5UO1xuICAgIHRoaXMuaXNNb2JpbGUgPVxuICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmlubmVyV2lkdGggPCBicmVha3BvaW50O1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0KCkge1xuICAgIGlmICh0aGlzLnByb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMuZGF0YSA9IGFwcGx5Q29tcHV0ZWRWYWx1ZXModGhpcy5maWVsZERlc2NyaXB0aW9ucywge1xuICAgICAgICAuLi50aGlzLnByb3BlcnRpZXMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlRmllbGRzKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVZpc2libGVGaWVsZHMoKSB7XG4gICAgdGhpcy52aXNpYmxlRmllbGRzID0gdGhpcy5maWVsZERlc2NyaXB0aW9ucy5maWx0ZXIoXG4gICAgICAoZikgPT4gIWYuYXBwZWFyQ29uZGl0aW9uIHx8IGYuYXBwZWFyQ29uZGl0aW9uKHRoaXMuZGF0YSlcbiAgICApO1xuICB9XG5cbiAgb25GaWVsZENoYW5nZShldmVudDogeyB2YWx1ZTogdW5rbm93bjsga2V5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMuY29tbWl0RGF0YSh7IC4uLnRoaXMuZGF0YSwgW2V2ZW50LmtleV06IGV2ZW50LnZhbHVlIH0pO1xuICB9XG5cbiAgZ2V0SXRlbXMoZmllbGQ6IEZpZWxkRGVzY3JpcHRpb24pOiBQcm9wZXJ0aWVzW10ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhW2ZpZWxkLm5hbWVdO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/ICh2YWx1ZSBhcyBQcm9wZXJ0aWVzW10pIDogW107XG4gIH1cblxuICBjYW5BZGRJdGVtKGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNhbkFkZEdyb3VwSXRlbShmaWVsZCwgdGhpcy5nZXRJdGVtcyhmaWVsZCkpO1xuICB9XG5cbiAgY2FuUmVtb3ZlSXRlbShmaWVsZDogRmllbGREZXNjcmlwdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjYW5SZW1vdmVHcm91cEl0ZW0oZmllbGQsIHRoaXMuZ2V0SXRlbXMoZmllbGQpKTtcbiAgfVxuXG4gIG9uR3JvdXBJdGVtQWRkKGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhbkFkZEl0ZW0oZmllbGQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcyhmaWVsZCk7XG4gICAgdGhpcy5jb21taXREYXRhKHtcbiAgICAgIC4uLnRoaXMuZGF0YSxcbiAgICAgIFtmaWVsZC5uYW1lXTogWy4uLml0ZW1zLCBjcmVhdGVHcm91cEl0ZW0oZmllbGQpXSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uR3JvdXBJdGVtUmVtb3ZlKGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblJlbW92ZUl0ZW0oZmllbGQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcyhmaWVsZCkuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgdGhpcy5jb21taXREYXRhKHsgLi4udGhpcy5kYXRhLCBbZmllbGQubmFtZV06IGl0ZW1zIH0pO1xuICB9XG5cbiAgb25Hcm91cEl0ZW1DaGFuZ2UoXG4gICAgZmllbGQ6IEZpZWxkRGVzY3JpcHRpb24sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBuZXh0OiBQcm9wZXJ0aWVzXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcyhmaWVsZCkuc2xpY2UoKTtcbiAgICBpdGVtc1tpbmRleF0gPSBuZXh0O1xuICAgIHRoaXMuY29tbWl0RGF0YSh7IC4uLnRoaXMuZGF0YSwgW2ZpZWxkLm5hbWVdOiBpdGVtcyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29tbWl0RGF0YShuZXh0RGF0YTogUHJvcGVydGllcyk6IHZvaWQge1xuICAgIHRoaXMuZGF0YSA9IGFwcGx5Q29tcHV0ZWRWYWx1ZXModGhpcy5maWVsZERlc2NyaXB0aW9ucywgbmV4dERhdGEpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUZpZWxkcygpO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLmRhdGEpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iXX0=
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlGaWVsZElucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvTXVsdGlGaWVsZElucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLGVBQWUsRUFDZixjQUFjLEVBQ2QsZUFBZSxFQUNmLGFBQWEsRUFDYixjQUFjLEdBR2YsTUFBTSx5QkFBeUIsQ0FBQztBQUdqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUUxQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQXNGL0IsTUFBTSxPQUFPLGVBQWU7SUFlTjtJQWRYLGlCQUFpQixHQUF1QixFQUFFLENBQUM7SUFDM0MsVUFBVSxDQUFjO0lBQ3ZCLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO0lBQzFDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztJQUN2RCxNQUFNLEdBQWlCLFFBQVEsQ0FBQztJQUN6QywyRUFBMkU7SUFDM0UsMEVBQTBFO0lBQzFFLHdEQUF3RDtJQUMvQyxRQUFRLENBQWM7SUFFL0IsSUFBSSxHQUFlLEVBQUUsQ0FBQztJQUN0QixhQUFhLEdBQXVCLEVBQUUsQ0FBQztJQUMvQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRXpCLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO0lBQUcsQ0FBQztJQUc5QyxjQUFjO1FBQ1osTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFB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OEtBM0VoQixPQUFPLG9GQUFFLEtBQUssbUhBQUUsSUFBSSw2RkFBRSxVQUFVOzs0RkEyRS9CLGVBQWU7a0JBcEYzQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx1QkFBdUI7b0JBQ2pDLFVBQVUsRUFBRSxJQUFJO29CQUNoQiwyRUFBMkU7b0JBQzNFLDBFQUEwRTtvQkFDMUUsd0VBQXdFO29CQUN4RSx5RUFBeUU7b0JBQ3pFLDBFQUEwRTtvQkFDMUUsd0VBQXdFO29CQUN4RSxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLGtCQUFrQjtvQkFDNUQsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1RVQ7aUJBQ0Y7c0ZBRVUsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNFLE1BQU07c0JBQWQsS0FBSztnQkFJRyxRQUFRO3NCQUFoQixLQUFLO2dCQVNOLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdDbGFzcywgTmdGb3IsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBhcHBseUNvbXB1dGVkVmFsdWVzLFxuICBjYW5BZGRHcm91cEl0ZW0sXG4gIGNhblJlbW92ZUdyb3VwSXRlbSxcbiAgY3JlYXRlR3JvdXBJdGVtLFxuICByZXNvbHZlRGlzYWJsZWQsXG4gIHJlc29sdmVPcHRpb25zLFxuICByZXNvbHZlUmVhZE9ubHksXG4gIHZhbGlkYXRlRmllbGQsXG4gIHZhbGlkYXRlRmllbGRzLFxuICBGaWVsZERlc2NyaXB0aW9uLFxuICBQcm9wZXJ0aWVzLFxufSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XG5pbXBvcnQgeyBCYXNlTGF5b3V0Q29uZmlnLCBMYXlvdXRDb25maWcgfSBmcm9tICcuLi90eXBlcy9sYXlvdXQnO1xuaW1wb3J0IHsgRmllbGRJbnB1dCB9IGZyb20gJy4vRmllbGRJbnB1dCc7XG5cbmNvbnN0IERFRkFVTFRfQlJFQUtQT0lOVCA9IDc2ODtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGZrLW11bHRpLWZpZWxkLWlucHV0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgLy8gUmVwZWF0YWJsZSBmaWVsZCBncm91cHMgcmVuZGVyIGEgbmVzdGVkIDxkZmstbXVsdGktZmllbGQtaW5wdXQ+IHBlciBpdGVtXG4gIC8vIChzZWUgdGhlICNncm91cFRwbCBiZWxvdyksIHNvIHRoaXMgY29tcG9uZW50IGltcG9ydHMgaXRzZWxmLiBUaGF0J3MgdGhlXG4gIC8vIHN1cHBvcnRlZCB3YXkgdG8gZ2l2ZSBhIHN0YW5kYWxvbmUgY29tcG9uZW50IHJlY3Vyc2l2ZSB0ZW1wbGF0ZSB1c2FnZVxuICAvLyB3aXRob3V0IGEgY3Jvc3MtZmlsZSBjaXJjdWxhciBpbXBvcnQgYmV0d2VlbiBGaWVsZElucHV0IGFuZCBhIHNlcGFyYXRlXG4gIC8vIGdyb3VwIGNvbXBvbmVudCAod2hvc2UgYGltcG9ydHNgIGFycmF5cyBhcmUgZXZhbHVhdGVkIGVhZ2VybHkgYXQgbW9kdWxlXG4gIC8vIGxvYWQgdGltZSBhbmQgd291bGQgZGVhZGxvY2sgb24gYW4gYWN0dWFsIGNpcmN1bGFyIG1vZHVsZSByZWZlcmVuY2UpLlxuICBpbXBvcnRzOiBbTmdDbGFzcywgTmdGb3IsIE5nSWYsIEZpZWxkSW5wdXQsIE11bHRpRmllbGRJbnB1dF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicC00IGJvcmRlciByb3VuZGVkLWxnIGJnLWdyYXktNTBcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnZmxleCBmbGV4LWNvbCc6IHJlc29sdmVkTGF5b3V0VHlwZSA9PT0gJ2NvbHVtbicsXG4gICAgICAgICdmbGV4IGZsZXgtcm93JzogcmVzb2x2ZWRMYXlvdXRUeXBlID09PSAncm93JyxcbiAgICAgICAgZ3JpZDogcmVzb2x2ZWRMYXlvdXRUeXBlID09PSAnZ3JpZCdcbiAgICAgIH1cIlxuICAgICAgW3N0eWxlLmdhcC5weF09XCJnYXBcIlxuICAgICAgW3N0eWxlLmdyaWRUZW1wbGF0ZUNvbHVtbnNdPVwiXG4gICAgICAgIHJlc29sdmVkTGF5b3V0VHlwZSA9PT0gJ2dyaWQnID8gJ3JlcGVhdCgnICsgY29sdW1ucyArICcsIDFmciknIDogbnVsbFxuICAgICAgXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiB2aXNpYmxlRmllbGRzOyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cbiAgICAgICAgPGRmay1maWVsZC1pbnB1dFxuICAgICAgICAgICpuZ0lmPVwiIWZpZWxkLmZpZWxkc1wiXG4gICAgICAgICAgW2ZpZWxkRGVzY3JpcHRpb25dPVwiZmllbGRcIlxuICAgICAgICAgIFt2YWx1ZV09XCJkYXRhW2ZpZWxkLm5hbWVdXCJcbiAgICAgICAgICBbb3B0aW9uc109XCJnZXRSZXNvbHZlZE9wdGlvbnMoZmllbGQpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2V0RGlzYWJsZWQoZmllbGQpXCJcbiAgICAgICAgICBbcmVhZE9ubHldPVwiZ2V0UmVhZE9ubHkoZmllbGQpXCJcbiAgICAgICAgICBbZXJyb3JdPVwiZ2V0RXJyb3IoZmllbGQpXCJcbiAgICAgICAgICAob25WYWx1ZUNoYW5nZUZpZWxkKT1cIm9uRmllbGRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID48L2Rmay1maWVsZC1pbnB1dD5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQuZmllbGRzXCIgW2NsYXNzXT1cImZpZWxkLmNsYXNzTmFtZVwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC5sYWJlbFwiPnt7IGZpZWxkLmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgIGxldCBpdGVtIG9mIGdldEl0ZW1zKGZpZWxkKTtcbiAgICAgICAgICAgICAgbGV0IGkgPSBpbmRleDtcbiAgICAgICAgICAgICAgdHJhY2tCeTogZ3JvdXBUcmFja0J5KGZpZWxkKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogOHB4O1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDFcIj5cbiAgICAgICAgICAgICAgPGRmay1tdWx0aS1maWVsZC1pbnB1dFxuICAgICAgICAgICAgICAgIFtmaWVsZERlc2NyaXB0aW9uc109XCJmaWVsZC5maWVsZHNcIlxuICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgIFtyb290RGF0YV09XCJyb290RGF0YSA/PyBkYXRhXCJcbiAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25Hcm91cEl0ZW1DaGFuZ2UoZmllbGQsIGksICRldmVudClcIlxuICAgICAgICAgICAgICA+PC9kZmstbXVsdGktZmllbGQtaW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgKGZpZWxkLnJlbW92ZUxhYmVsIHx8ICdSZW1vdmUnKSArXG4gICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAoZmllbGQubGFiZWwgfHwgZmllbGQubmFtZSkgK1xuICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgKGkgKyAxKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cEl0ZW1SZW1vdmUoZmllbGQsIGkpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5SZW1vdmVJdGVtKGZpZWxkKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGZpZWxkLnJlbW92ZUxhYmVsIHx8ICdSZW1vdmUnIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgIChmaWVsZC5hZGRMYWJlbCB8fCAnQWRkJykgKyAnICcgKyAoZmllbGQubGFiZWwgfHwgZmllbGQubmFtZSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cEl0ZW1BZGQoZmllbGQpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuQWRkSXRlbShmaWVsZClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGZpZWxkLmFkZExhYmVsIHx8ICdBZGQnIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpRmllbGRJbnB1dCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZmllbGREZXNjcmlwdGlvbnM6IEZpZWxkRGVzY3JpcHRpb25bXSA9IFtdO1xuICBASW5wdXQoKSBwcm9wZXJ0aWVzPzogUHJvcGVydGllcztcbiAgQE91dHB1dCgpIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9wZXJ0aWVzPigpO1xuICBAT3V0cHV0KCkgdmFsaWRpdHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFZhbGlkYXRpb25SZXN1bHQ+KCk7XG4gIEBJbnB1dCgpIGxheW91dDogTGF5b3V0Q29uZmlnID0gJ2NvbHVtbic7XG4gIC8vIFRvcC1sZXZlbCBmb3JtIGRhdGEsIHRocmVhZGVkIGRvd24gdGhyb3VnaCByZXBlYXRhYmxlIGdyb3VwcyBzbyBhIG5lc3RlZFxuICAvLyBmaWVsZCdzIGFwcGVhckNvbmRpdGlvbi9jb21wdXRlVmFsdWUgY2FuIHJlYWQgdGhlIHJvb3QgZm9ybS4gT21pdHRlZCBhdFxuICAvLyB0aGUgdG9wIGxldmVsLCB3aGVyZSB0aGUgZm9ybSdzIG93biBkYXRhIGlzIHRoZSByb290LlxuICBASW5wdXQoKSByb290RGF0YT86IFByb3BlcnRpZXM7XG5cbiAgZGF0YTogUHJvcGVydGllcyA9IHt9O1xuICB2aXNpYmxlRmllbGRzOiBGaWVsZERlc2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBpc01vYmlsZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgY29uc3Qgd2FzTW9iaWxlID0gdGhpcy5pc01vYmlsZTtcbiAgICB0aGlzLnVwZGF0ZUlzTW9iaWxlKCk7XG4gICAgaWYgKHdhc01vYmlsZSAhPT0gdGhpcy5pc01vYmlsZSkge1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlc29sdmVkTGF5b3V0KCk6IEJhc2VMYXlvdXRDb25maWcge1xuICAgIGlmICh0eXBlb2YgdGhpcy5sYXlvdXQgPT09ICdvYmplY3QnICYmIHRoaXMubGF5b3V0LnR5cGUgPT09ICdyZXNwb25zaXZlJykge1xuICAgICAgcmV0dXJuIHRoaXMuaXNNb2JpbGUgPyB0aGlzLmxheW91dC5tb2JpbGUgOiB0aGlzLmxheW91dC5kZXNrdG9wO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sYXlvdXQgYXMgQmFzZUxheW91dENvbmZpZztcbiAgfVxuXG4gIGdldCByZXNvbHZlZExheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZWRMYXlvdXQ7XG4gICAgcmV0dXJuIHR5cGVvZiByZXNvbHZlZCA9PT0gJ3N0cmluZycgPyByZXNvbHZlZCA6IHJlc29sdmVkLnR5cGU7XG4gIH1cblxuICBnZXQgZ2FwKCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVkTGF5b3V0O1xuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09ICdvYmplY3QnICYmIHJlc29sdmVkLmdhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWQuZ2FwO1xuICAgIH1cbiAgICByZXR1cm4gMTI7XG4gIH1cblxuICBnZXQgY29sdW1ucygpOiBudW1iZXIge1xuICAgIGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlZExheW91dDtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSAnb2JqZWN0JyAmJiByZXNvbHZlZC50eXBlID09PSAnZ3JpZCcpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZC5jb2x1bW5zID8/IDI7XG4gICAgfVxuICAgIHJldHVybiAyO1xuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gZmllbGQubmFtZSB8fCBpbmRleDtcbiAgfVxuXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBwcml2YXRlIGdyb3VwVHJhY2tCeUNhY2hlID0gbmV3IFdlYWtNYXA8XG4gICAgRmllbGREZXNjcmlwdGlvbixcbiAgICAoaW5kZXg6IG51bWJlciwgaXRlbTogUHJvcGVydGllcykgPT4gdW5rbm93blxuICA+KCk7XG5cbiAgLy8gUmV0dXJucyBhIHN0YWJsZSB0cmFja0J5IHBlciBncm91cCBmaWVsZDogaXRlbVtrZXlGaWVsZF0gd2hlbiBjb25maWd1cmVkLFxuICAvLyBlbHNlIHRoZSBpbmRleC4gQ2FjaGVkIGJ5IGZpZWxkIHJlZmVyZW5jZSBzbyB0aGUgdGVtcGxhdGUgaGFuZHMgQW5ndWxhciB0aGVcbiAgLy8gc2FtZSBmdW5jdGlvbiBlYWNoIGNoYW5nZS1kZXRlY3Rpb24gcGFzcy5cbiAgZ3JvdXBUcmFja0J5KFxuICAgIGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uXG4gICk6IChpbmRleDogbnVtYmVyLCBpdGVtOiBQcm9wZXJ0aWVzKSA9PiB1bmtub3duIHtcbiAgICBsZXQgZm4gPSB0aGlzLmdyb3VwVHJhY2tCeUNhY2hlLmdldChmaWVsZCk7XG4gICAgaWYgKCFmbikge1xuICAgICAgZm4gPSAoaW5kZXg6IG51bWJlciwgaXRlbTogUHJvcGVydGllcykgPT5cbiAgICAgICAgZmllbGQua2V5RmllbGQgPyBpdGVtW2ZpZWxkLmtleUZpZWxkXSA/PyBpbmRleCA6IGluZGV4O1xuICAgICAgdGhpcy5ncm91cFRyYWNrQnlDYWNoZS5zZXQoZmllbGQsIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVJc01vYmlsZSgpO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoX2NoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSXNNb2JpbGUoKTogdm9pZCB7XG4gICAgY29uc3QgYnJlYWtwb2ludCA9XG4gICAgICB0eXBlb2YgdGhpcy5sYXlvdXQgPT09ICdvYmplY3QnICYmIHRoaXMubGF5b3V0LnR5cGUgPT09ICdyZXNwb25zaXZlJ1xuICAgICAgICA/IHRoaXMubGF5b3V0LmJyZWFrcG9pbnQgPz8gREVGQVVMVF9CUkVBS1BPSU5UXG4gICAgICAgIDogREVGQVVMVF9CUkVBS1BPSU5UO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICB0eXBlb2Ygd2luZG93Lm1hdGNoTWVkaWEgPT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIHRoaXMuaXNNb2JpbGUgPSB3aW5kb3cubWF0Y2hNZWRpYShcbiAgICAgICAgYChtYXgtd2lkdGg6ICR7YnJlYWtwb2ludCAtIDF9cHgpYFxuICAgICAgKS5tYXRjaGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzTW9iaWxlID1cbiAgICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmlubmVyV2lkdGggPCBicmVha3BvaW50O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdCgpIHtcbiAgICBpZiAodGhpcy5wcm9wZXJ0aWVzKSB7XG4gICAgICB0aGlzLmRhdGEgPSBhcHBseUNvbXB1dGVkVmFsdWVzKFxuICAgICAgICB0aGlzLmZpZWxkRGVzY3JpcHRpb25zLFxuICAgICAgICB7IC4uLnRoaXMucHJvcGVydGllcyB9LFxuICAgICAgICB0aGlzLnJvb3REYXRhXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVZpc2libGVGaWVsZHMoKTtcbiAgICB0aGlzLnZhbGlkaXR5Q2hhbmdlLmVtaXQoXG4gICAgICB2YWxpZGF0ZUZpZWxkcyh0aGlzLmZpZWxkRGVzY3JpcHRpb25zLCB0aGlzLmRhdGEsIHRoaXMucm9vdERhdGEpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZUZpZWxkcygpIHtcbiAgICBjb25zdCByb290ID0gdGhpcy5yb290RGF0YSA/PyB0aGlzLmRhdGE7XG4gICAgdGhpcy52aXNpYmxlRmllbGRzID0gdGhpcy5maWVsZERlc2NyaXB0aW9ucy5maWx0ZXIoXG4gICAgICAoZikgPT4gIWYuYXBwZWFyQ29uZGl0aW9uIHx8IGYuYXBwZWFyQ29uZGl0aW9uKHRoaXMuZGF0YSwgcm9vdClcbiAgICApO1xuICB9XG5cbiAgb25GaWVsZENoYW5nZShldmVudDogeyB2YWx1ZTogdW5rbm93bjsga2V5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMuY29tbWl0RGF0YSh7IC4uLnRoaXMuZGF0YSwgW2V2ZW50LmtleV06IGV2ZW50LnZhbHVlIH0pO1xuICB9XG5cbiAgZ2V0SXRlbXMoZmllbGQ6IEZpZWxkRGVzY3JpcHRpb24pOiBQcm9wZXJ0aWVzW10ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhW2ZpZWxkLm5hbWVdO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/ICh2YWx1ZSBhcyBQcm9wZXJ0aWVzW10pIDogW107XG4gIH1cblxuICBnZXRSZXNvbHZlZE9wdGlvbnMoZmllbGQ6IEZpZWxkRGVzY3JpcHRpb24pOiBQcm9wZXJ0aWVzW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiByZXNvbHZlT3B0aW9ucyhmaWVsZCwgdGhpcy5kYXRhLCB0aGlzLnJvb3REYXRhKTtcbiAgfVxuXG4gIGdldERpc2FibGVkKGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlc29sdmVEaXNhYmxlZChmaWVsZCwgdGhpcy5kYXRhLCB0aGlzLnJvb3REYXRhKTtcbiAgfVxuXG4gIGdldFJlYWRPbmx5KGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlc29sdmVSZWFkT25seShmaWVsZCwgdGhpcy5kYXRhLCB0aGlzLnJvb3REYXRhKTtcbiAgfVxuXG4gIGdldEVycm9yKGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmdldERpc2FibGVkKGZpZWxkKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVGaWVsZChcbiAgICAgIGZpZWxkLFxuICAgICAgdGhpcy5kYXRhW2ZpZWxkLm5hbWVdLFxuICAgICAgdGhpcy5kYXRhLFxuICAgICAgdGhpcy5yb290RGF0YVxuICAgICk7XG4gICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPiAwID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgY2FuQWRkSXRlbShmaWVsZDogRmllbGREZXNjcmlwdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjYW5BZGRHcm91cEl0ZW0oZmllbGQsIHRoaXMuZ2V0SXRlbXMoZmllbGQpKTtcbiAgfVxuXG4gIGNhblJlbW92ZUl0ZW0oZmllbGQ6IEZpZWxkRGVzY3JpcHRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2FuUmVtb3ZlR3JvdXBJdGVtKGZpZWxkLCB0aGlzLmdldEl0ZW1zKGZpZWxkKSk7XG4gIH1cblxuICBvbkdyb3VwSXRlbUFkZChmaWVsZDogRmllbGREZXNjcmlwdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5BZGRJdGVtKGZpZWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoZmllbGQpO1xuICAgIHRoaXMuY29tbWl0RGF0YSh7XG4gICAgICAuLi50aGlzLmRhdGEsXG4gICAgICBbZmllbGQubmFtZV06IFsuLi5pdGVtcywgY3JlYXRlR3JvdXBJdGVtKGZpZWxkKV0sXG4gICAgfSk7XG4gIH1cblxuICBvbkdyb3VwSXRlbVJlbW92ZShmaWVsZDogRmllbGREZXNjcmlwdGlvbiwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5SZW1vdmVJdGVtKGZpZWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoZmllbGQpLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgIHRoaXMuY29tbWl0RGF0YSh7IC4uLnRoaXMuZGF0YSwgW2ZpZWxkLm5hbWVdOiBpdGVtcyB9KTtcbiAgfVxuXG4gIG9uR3JvdXBJdGVtQ2hhbmdlKFxuICAgIGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgbmV4dDogUHJvcGVydGllc1xuICApOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoZmllbGQpLnNsaWNlKCk7XG4gICAgaXRlbXNbaW5kZXhdID0gbmV4dDtcbiAgICB0aGlzLmNvbW1pdERhdGEoeyAuLi50aGlzLmRhdGEsIFtmaWVsZC5uYW1lXTogaXRlbXMgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbW1pdERhdGEobmV4dERhdGE6IFByb3BlcnRpZXMpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEgPSBhcHBseUNvbXB1dGVkVmFsdWVzKFxuICAgICAgdGhpcy5maWVsZERlc2NyaXB0aW9ucyxcbiAgICAgIG5leHREYXRhLFxuICAgICAgdGhpcy5yb290RGF0YVxuICAgICk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlRmllbGRzKCk7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuZGF0YSk7XG4gICAgdGhpcy52YWxpZGl0eUNoYW5nZS5lbWl0KFxuICAgICAgdmFsaWRhdGVGaWVsZHModGhpcy5maWVsZERlc2NyaXB0aW9ucywgdGhpcy5kYXRhLCB0aGlzLnJvb3REYXRhKVxuICAgICk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,12 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { fieldRegistry } from '@dynamic-field-kit/core';
3
+ // Injecting this token yields the process-wide singleton by default, so code
4
+ // that never provides it keeps working. Provide it on a component/route to give
5
+ // that subtree an isolated set of renderers:
6
+ //
7
+ // providers: [{ provide: FIELD_REGISTRY, useValue: myScopedRegistry }]
8
+ export const FIELD_REGISTRY = new InjectionToken('dfk.FieldRegistry', {
9
+ providedIn: 'root',
10
+ factory: () => fieldRegistry,
11
+ });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRSZWdpc3RyeVRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZpZWxkUmVnaXN0cnlUb2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBaUIsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdkUsNkVBQTZFO0FBQzdFLGdGQUFnRjtBQUNoRiw2Q0FBNkM7QUFDN0MsRUFBRTtBQUNGLHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQzlDLG1CQUFtQixFQUNuQjtJQUNFLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFhO0NBQzdCLENBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWVsZFJlZ2lzdHJ5LCBmaWVsZFJlZ2lzdHJ5IH0gZnJvbSAnQGR5bmFtaWMtZmllbGQta2l0L2NvcmUnO1xuXG4vLyBJbmplY3RpbmcgdGhpcyB0b2tlbiB5aWVsZHMgdGhlIHByb2Nlc3Mtd2lkZSBzaW5nbGV0b24gYnkgZGVmYXVsdCwgc28gY29kZVxuLy8gdGhhdCBuZXZlciBwcm92aWRlcyBpdCBrZWVwcyB3b3JraW5nLiBQcm92aWRlIGl0IG9uIGEgY29tcG9uZW50L3JvdXRlIHRvIGdpdmVcbi8vIHRoYXQgc3VidHJlZSBhbiBpc29sYXRlZCBzZXQgb2YgcmVuZGVyZXJzOlxuLy9cbi8vICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBGSUVMRF9SRUdJU1RSWSwgdXNlVmFsdWU6IG15U2NvcGVkUmVnaXN0cnkgfV1cbmV4cG9ydCBjb25zdCBGSUVMRF9SRUdJU1RSWSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxGaWVsZFJlZ2lzdHJ5PihcbiAgJ2Rmay5GaWVsZFJlZ2lzdHJ5JyxcbiAge1xuICAgIHByb3ZpZGVkSW46ICdyb290JyxcbiAgICBmYWN0b3J5OiAoKSA9PiBmaWVsZFJlZ2lzdHJ5LFxuICB9XG4pO1xuIl19
@@ -10,5 +10,9 @@ export * from './types/layout';
10
10
  // Module
11
11
  export * from './lib/dynamic-field-kit.module';
12
12
  // Optional: expose registry for advanced use cases, but not required for basic usage
13
- export { fieldRegistry } from '@dynamic-field-kit/core';
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQjtBQUVoQixhQUFhO0FBQ2IsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QyxTQUFTO0FBQ1QsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxnQkFBZ0IsQ0FBQztBQUUvQixTQUFTO0FBQ1QsY0FBYyxnQ0FBZ0MsQ0FBQztBQVMvQyxxRkFBcUY7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gcHVibGljLWFwaS50c1xyXG5cclxuLy8gQ29tcG9uZW50c1xyXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudHMvQmFzZUlucHV0JztcclxuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzL0R5bmFtaWNJbnB1dCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9GaWVsZElucHV0JztcclxuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzL011bHRpRmllbGRJbnB1dCc7XHJcblxyXG4vLyBMYXlvdXRcclxuZXhwb3J0ICogZnJvbSAnLi9sYXlvdXQnO1xyXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzL2xheW91dCc7XHJcblxyXG4vLyBNb2R1bGVcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZHluYW1pYy1maWVsZC1raXQubW9kdWxlJztcclxuXHJcbi8vIFJlLWV4cG9ydCB0eXBlcyBmcm9tIGNvcmUgKG9ubHkgdHlwZSwgbm90IGV4cG9ydCAqIClcclxuZXhwb3J0IHR5cGUge1xyXG4gIEZpZWxkRGVzY3JpcHRpb24sXHJcbiAgRmllbGRSZW5kZXJlclByb3BzLFxyXG4gIEZpZWxkVHlwZUtleSxcclxufSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XHJcblxyXG4vLyBPcHRpb25hbDogZXhwb3NlIHJlZ2lzdHJ5IGZvciBhZHZhbmNlZCB1c2UgY2FzZXMsIGJ1dCBub3QgcmVxdWlyZWQgZm9yIGJhc2ljIHVzYWdlXHJcbmV4cG9ydCB7IGZpZWxkUmVnaXN0cnkgfSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XHJcbiJdfQ==
13
+ export { fieldRegistry, FieldRegistry } from '@dynamic-field-kit/core';
14
+ export { validateField, validateFieldAsync, validateFields, validateFieldsAsync, resolveDisabled, resolveReadOnly, resolveOptions, validators, } from '@dynamic-field-kit/core';
15
+ // Scoped registry: provide FIELD_REGISTRY on a component/route to give that
16
+ // subtree an isolated set of renderers.
17
+ export { FIELD_REGISTRY } from './fieldRegistryToken';
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQjtBQUVoQixhQUFhO0FBQ2IsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QyxTQUFTO0FBQ1QsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxnQkFBZ0IsQ0FBQztBQUUvQixTQUFTO0FBQ1QsY0FBYyxnQ0FBZ0MsQ0FBQztBQVMvQyxxRkFBcUY7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RSxPQUFPLEVBQ0wsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixjQUFjLEVBQ2QsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixlQUFlLEVBQ2YsY0FBYyxFQUNkLFVBQVUsR0FDWCxNQUFNLHlCQUF5QixDQUFDO0FBR2pDLDRFQUE0RTtBQUM1RSx3Q0FBd0M7QUFDeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gcHVibGljLWFwaS50c1xuXG4vLyBDb21wb25lbnRzXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudHMvQmFzZUlucHV0JztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9EeW5hbWljSW5wdXQnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzL0ZpZWxkSW5wdXQnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzL011bHRpRmllbGRJbnB1dCc7XG5cbi8vIExheW91dFxuZXhwb3J0ICogZnJvbSAnLi9sYXlvdXQnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy9sYXlvdXQnO1xuXG4vLyBNb2R1bGVcbmV4cG9ydCAqIGZyb20gJy4vbGliL2R5bmFtaWMtZmllbGQta2l0Lm1vZHVsZSc7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBmcm9tIGNvcmUgKG9ubHkgdHlwZSwgbm90IGV4cG9ydCAqIClcbmV4cG9ydCB0eXBlIHtcbiAgRmllbGREZXNjcmlwdGlvbixcbiAgRmllbGRSZW5kZXJlclByb3BzLFxuICBGaWVsZFR5cGVLZXksXG59IGZyb20gJ0BkeW5hbWljLWZpZWxkLWtpdC9jb3JlJztcblxuLy8gT3B0aW9uYWw6IGV4cG9zZSByZWdpc3RyeSBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzLCBidXQgbm90IHJlcXVpcmVkIGZvciBiYXNpYyB1c2FnZVxuZXhwb3J0IHsgZmllbGRSZWdpc3RyeSwgRmllbGRSZWdpc3RyeSB9IGZyb20gJ0BkeW5hbWljLWZpZWxkLWtpdC9jb3JlJztcblxuZXhwb3J0IHtcbiAgdmFsaWRhdGVGaWVsZCxcbiAgdmFsaWRhdGVGaWVsZEFzeW5jLFxuICB2YWxpZGF0ZUZpZWxkcyxcbiAgdmFsaWRhdGVGaWVsZHNBc3luYyxcbiAgcmVzb2x2ZURpc2FibGVkLFxuICByZXNvbHZlUmVhZE9ubHksXG4gIHJlc29sdmVPcHRpb25zLFxuICB2YWxpZGF0b3JzLFxufSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XG5leHBvcnQgdHlwZSB7IFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XG5cbi8vIFNjb3BlZCByZWdpc3RyeTogcHJvdmlkZSBGSUVMRF9SRUdJU1RSWSBvbiBhIGNvbXBvbmVudC9yb3V0ZSB0byBnaXZlIHRoYXRcbi8vIHN1YnRyZWUgYW4gaXNvbGF0ZWQgc2V0IG9mIHJlbmRlcmVycy5cbmV4cG9ydCB7IEZJRUxEX1JFR0lTVFJZIH0gZnJvbSAnLi9maWVsZFJlZ2lzdHJ5VG9rZW4nO1xuIl19
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3R5cGVzL2xheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBHcmlkTGF5b3V0Q29uZmlnIHtcbiAgdHlwZTogJ2dyaWQnO1xuICBjb2x1bW5zPzogbnVtYmVyO1xuICBnYXA/OiBudW1iZXI7XG4gIHdpZHRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvd0xheW91dENvbmZpZyB7XG4gIHR5cGU6ICdyb3cnO1xuICBnYXA/OiBudW1iZXI7XG4gIHdpZHRoPzogc3RyaW5nO1xuICBmbGV4PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5MYXlvdXRDb25maWcge1xuICB0eXBlOiAnY29sdW1uJztcbiAgZ2FwPzogbnVtYmVyO1xuICB3aWR0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQmFzZUxheW91dENvbmZpZyA9XG4gIHwgJ2NvbHVtbidcbiAgfCAncm93J1xuICB8ICdncmlkJ1xuICB8IEdyaWRMYXlvdXRDb25maWdcbiAgfCBSb3dMYXlvdXRDb25maWdcbiAgfCBDb2x1bW5MYXlvdXRDb25maWc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2l2ZUxheW91dENvbmZpZyB7XG4gIHR5cGU6ICdyZXNwb25zaXZlJztcbiAgbW9iaWxlOiBCYXNlTGF5b3V0Q29uZmlnO1xuICBkZXNrdG9wOiBCYXNlTGF5b3V0Q29uZmlnO1xuICBicmVha3BvaW50PzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBMYXlvdXRDb25maWcgPSBCYXNlTGF5b3V0Q29uZmlnIHwgUmVzcG9uc2l2ZUxheW91dENvbmZpZztcbiJdfQ==
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3R5cGVzL2xheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLy8gTGF5b3V0IGNvbmZpZyB0eXBlcyBsaXZlIGluIEBkeW5hbWljLWZpZWxkLWtpdC9jb3JlIHNvIHRoZSBjb250cmFjdCBzdGF5c1xuLy8gaWRlbnRpY2FsIGFjcm9zcyBldmVyeSBmcmFtZXdvcmsgYWRhcHRlci4gUmUtZXhwb3J0ZWQgaGVyZSAod2l0aCB0aGVcbi8vIGhpc3RvcmljYWwgQW5ndWxhciAuLi5Db25maWcgYWxpYXNlcykgdG8gcHJlc2VydmUgZXhpc3RpbmcgaW1wb3J0IHBhdGhzLlxuaW1wb3J0IHR5cGUgeyBCYXNlTGF5b3V0LCBSZXNwb25zaXZlTGF5b3V0IH0gZnJvbSAnQGR5bmFtaWMtZmllbGQta2l0L2NvcmUnO1xuXG5leHBvcnQgdHlwZSB7XG4gIENvbHVtbkxheW91dENvbmZpZyxcbiAgUm93TGF5b3V0Q29uZmlnLFxuICBHcmlkTGF5b3V0Q29uZmlnLFxuICBMYXlvdXRDb25maWcsXG59IGZyb20gJ0BkeW5hbWljLWZpZWxkLWtpdC9jb3JlJztcblxuZXhwb3J0IHR5cGUgQmFzZUxheW91dENvbmZpZyA9IEJhc2VMYXlvdXQ7XG5leHBvcnQgdHlwZSBSZXNwb25zaXZlTGF5b3V0Q29uZmlnID0gUmVzcG9uc2l2ZUxheW91dDtcbiJdfQ==