@dynamic-field-kit/angular 1.2.10 → 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 (53) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +113 -4
  3. package/dist/README.md +113 -4
  4. package/dist/components/BaseInput.d.ts +23 -11
  5. package/dist/components/DynamicInput.d.ts +19 -8
  6. package/dist/components/FieldInput.d.ts +15 -7
  7. package/dist/components/MultiFieldInput.d.ts +30 -4
  8. package/dist/esm2022/components/BaseInput.mjs +17 -18
  9. package/dist/esm2022/components/DynamicInput.mjs +166 -84
  10. package/dist/esm2022/components/FieldInput.mjs +54 -26
  11. package/dist/esm2022/components/MultiFieldInput.mjs +282 -29
  12. package/dist/esm2022/fieldRegistryToken.mjs +12 -0
  13. package/dist/esm2022/layout/defaultLayouts.mjs +70 -23
  14. package/dist/esm2022/layout/index.mjs +2 -1
  15. package/dist/esm2022/layout/layoutRegistry.mjs +14 -0
  16. package/dist/esm2022/public-api.mjs +6 -2
  17. package/dist/esm2022/types/layout.mjs +1 -1
  18. package/dist/fesm2022/dynamic-field-kit-angular.mjs +604 -173
  19. package/dist/fesm2022/dynamic-field-kit-angular.mjs.map +1 -1
  20. package/dist/fieldRegistryToken.d.ts +3 -0
  21. package/dist/layout/defaultLayouts.d.ts +21 -3
  22. package/dist/layout/index.d.ts +1 -0
  23. package/dist/layout/layoutRegistry.d.ts +12 -0
  24. package/dist/public-api.d.ts +5 -2
  25. package/dist/types/layout.d.ts +4 -1
  26. package/package.json +19 -8
  27. package/src/components/BaseInput.ts +36 -10
  28. package/src/components/DynamicInput.ts +196 -104
  29. package/src/components/FieldInput.ts +43 -18
  30. package/src/components/MultiFieldInput.ts +275 -19
  31. package/src/fieldRegistryToken.ts +15 -0
  32. package/src/layout/defaultLayouts.ts +42 -10
  33. package/src/layout/index.ts +1 -0
  34. package/src/layout/layoutRegistry.ts +25 -0
  35. package/src/public-api.ts +40 -24
  36. package/src/types/layout.ts +14 -1
  37. package/test/DynamicInput.spec.ts +230 -0
  38. package/test/FieldInput.spec.ts +146 -0
  39. package/test/MultiFieldInput.spec.ts +256 -0
  40. package/test/helpers/renderers.ts +89 -0
  41. package/test/layout.spec.ts +119 -0
  42. package/test/publicApi.spec.ts +64 -0
  43. package/test/setup.ts +12 -0
  44. package/test/smoke.spec.ts +27 -0
  45. package/tsconfig.json +13 -13
  46. package/tsconfig.spec.json +9 -0
  47. package/vitest.config.ts +30 -0
  48. package/src/adapters/tailwind.ts +0 -13
  49. package/src/components/imports.ts +0 -3
  50. package/src/examples/index.ts +0 -4
  51. package/src/examples/registerExample.ts +0 -7
  52. package/src/examples/text-field.component.ts +0 -18
  53. package/src/types.ts +0 -1
@@ -1,31 +1,50 @@
1
1
  import { CommonModule } from '@angular/common';
2
- import { Component, Input, Output, EventEmitter, ViewChild, ViewContainerRef, SimpleChange, } from '@angular/core';
3
- import { fieldRegistry } from '@dynamic-field-kit/core';
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output, ViewChild, ViewContainerRef, } from '@angular/core';
3
+ import { FIELD_REGISTRY } from '../fieldRegistryToken';
4
4
  import { BaseInputComponent } from './BaseInput';
5
5
  import * as i0 from "@angular/core";
6
+ // Only the framework-agnostic FieldRendererProps keys. Domain-specific props
7
+ // reach the renderer through `extraProps` (FieldDescription.props) instead.
8
+ const KNOWN_PROPS = [
9
+ 'value',
10
+ 'label',
11
+ 'placeholder',
12
+ 'required',
13
+ 'disabled',
14
+ 'readOnly',
15
+ 'error',
16
+ 'options',
17
+ 'className',
18
+ 'description',
19
+ ];
6
20
  export class DynamicInput extends BaseInputComponent {
7
21
  type;
22
+ // Extra, framework-agnostic props forwarded verbatim to the renderer.
23
+ extraProps;
8
24
  valueChange = new EventEmitter();
9
- onChange = new EventEmitter(); // backward compat
25
+ onChange = new EventEmitter();
26
+ registry = inject(FIELD_REGISTRY);
10
27
  host;
11
28
  compRef;
12
29
  inputInstance;
13
30
  subscriptions = [];
31
+ // Tracks which KNOWN_PROPS were actually supplied to DynamicInput (via
32
+ // SimpleChanges), independent of TS class-field emit. See applyProps.
33
+ supplied = new Set();
14
34
  ngOnChanges(changes) {
15
- if (changes['type'] && !changes['type'].firstChange && this.host) {
16
- this.render();
17
- return;
35
+ super.ngOnChanges(changes);
36
+ for (const prop of KNOWN_PROPS) {
37
+ if (changes[prop]) {
38
+ this.supplied.add(prop);
39
+ }
18
40
  }
19
41
  if (this.inputInstance) {
20
- this.applyKnownProps(this.inputInstance);
21
- const childChanges = {};
22
- for (const prop in changes) {
23
- childChanges[prop] = new SimpleChange(changes[prop].previousValue, changes[prop].currentValue, changes[prop].firstChange);
24
- }
25
- this.inputInstance.ngOnChanges?.(childChanges);
26
- this.compRef?.changeDetectorRef.detectChanges();
42
+ this.syncPropsToInstance(changes);
43
+ }
44
+ if (changes['type'] && !changes['type'].firstChange && this.host) {
45
+ this.render();
27
46
  }
28
- else if (this.host) {
47
+ else if (!this.inputInstance && this.host) {
29
48
  this.render();
30
49
  }
31
50
  }
@@ -33,6 +52,23 @@ export class DynamicInput extends BaseInputComponent {
33
52
  this.render();
34
53
  }
35
54
  ngOnDestroy() {
55
+ this.cleanup();
56
+ }
57
+ syncPropsToInstance(changes) {
58
+ if (!this.inputInstance) {
59
+ return;
60
+ }
61
+ for (const prop of KNOWN_PROPS) {
62
+ if (changes[prop] && this.inputInstance) {
63
+ this.inputInstance[prop] = this[prop];
64
+ }
65
+ }
66
+ if (changes['extraProps']) {
67
+ this.applyExtraProps(this.inputInstance);
68
+ }
69
+ this.compRef?.changeDetectorRef?.detectChanges();
70
+ }
71
+ cleanup() {
36
72
  this.cleanupSubscriptions();
37
73
  this.cleanupRenderedComponent();
38
74
  }
@@ -40,106 +76,149 @@ export class DynamicInput extends BaseInputComponent {
40
76
  this.subscriptions.forEach((s) => s.unsubscribe());
41
77
  this.subscriptions = [];
42
78
  }
79
+ cleanupRenderedComponent() {
80
+ this.compRef?.destroy();
81
+ this.compRef = undefined;
82
+ this.inputInstance = undefined;
83
+ }
43
84
  render() {
44
- const Renderer = fieldRegistry.get(this.type);
45
- this.cleanupRenderedComponent();
46
- this.cleanupSubscriptions();
85
+ const Renderer = this.registry.get(this.type);
86
+ this.cleanup();
47
87
  this.host.clear();
48
88
  if (!Renderer) {
49
- const el = document.createElement('div');
50
- el.textContent = `Unknown field type: ${this.type}`;
51
- this.host.element.nativeElement.appendChild(el);
89
+ this.renderError(`Unknown field type: ${this.type}`);
52
90
  return;
53
91
  }
92
+ if (this.isComponentType(Renderer)) {
93
+ this.renderComponent(Renderer);
94
+ }
95
+ else if (typeof Renderer === 'function') {
96
+ this.renderFallback(Renderer);
97
+ }
98
+ else {
99
+ this.renderError(`Invalid renderer for type: ${this.type}`);
100
+ }
101
+ }
102
+ // Angular component classes carry a static ɵcmp. Checked instead of
103
+ // reflectComponentType() because the peer range starts at Angular 13 and
104
+ // reflectComponentType is v14+. Plain function renderers have no ɵcmp and
105
+ // fall through to renderFallback. Uses hasOwnProperty (not `in`) so a
106
+ // class that merely extends a component without its own @Component
107
+ // decorator - and would otherwise inherit the parent's static ɵcmp via the
108
+ // prototype chain - is not mistaken for a component in its own right.
109
+ isComponentType(renderer) {
110
+ return (typeof renderer === 'function' &&
111
+ Object.prototype.hasOwnProperty.call(renderer, 'ɵcmp'));
112
+ }
113
+ renderComponent(compType) {
54
114
  try {
55
- const compType = Renderer;
56
115
  const compRef = this.host.createComponent(compType);
57
116
  const instance = compRef.instance;
58
117
  if (!instance) {
59
- throw new Error(`Failed to create instance for ${this.type}`);
60
- }
61
- this.applyKnownProps(instance);
62
- const subA = this.bindOutput(instance, 'valueChange');
63
- if (subA) {
64
- this.subscriptions.push(subA);
65
- }
66
- const subB = this.bindOutput(instance, 'onValueChange');
67
- if (subB) {
68
- this.subscriptions.push(subB);
118
+ this.renderError(`Failed to create instance for ${this.type}`);
119
+ return;
69
120
  }
70
- instance.changeDetectorRef?.detectChanges();
121
+ this.applyProps(instance);
122
+ this.bindOutputs(instance);
71
123
  this.compRef = compRef;
72
124
  this.inputInstance = instance;
73
125
  compRef.changeDetectorRef.detectChanges();
74
126
  }
75
- catch (err) {
76
- // Fallback to function renderer
77
- try {
78
- const props = {
79
- value: this.value,
80
- onValueChange: (v) => this.emitValue(v),
81
- label: this.label,
82
- placeholder: this.placeholder,
83
- required: this.required,
84
- options: this.options,
85
- className: this.className,
86
- description: this.description,
87
- disabled: this.disabled,
88
- errorMessage: this.errorMessage,
89
- };
90
- const out = Renderer(props);
91
- if (typeof out === 'string') {
92
- const el = document.createElement('div');
93
- el.innerHTML = out;
94
- this.host.element.nativeElement.appendChild(el);
95
- }
96
- }
97
- catch (e) {
127
+ catch {
128
+ this.renderError(`Failed to render field: ${this.type}`);
129
+ }
130
+ }
131
+ renderFallback(renderer) {
132
+ try {
133
+ const props = this.getFallbackProps();
134
+ const result = renderer(props);
135
+ if (typeof result === 'string') {
98
136
  const el = document.createElement('div');
99
- el.textContent = `Failed to render field: ${this.type}`;
137
+ el.innerHTML = result;
100
138
  this.host.element.nativeElement.appendChild(el);
101
139
  }
102
140
  }
141
+ catch {
142
+ this.renderError(`Failed to render field: ${this.type}`);
143
+ }
103
144
  }
104
- applyKnownProps(instance) {
105
- const knownProps = [
106
- 'value',
107
- 'label',
108
- 'placeholder',
109
- 'required',
110
- 'disabled',
111
- 'options',
112
- 'className',
113
- 'description',
114
- 'errorMessage',
115
- ];
116
- for (const prop of knownProps) {
117
- if (prop in this && prop in instance) {
118
- instance[prop] = this[prop];
145
+ getFallbackProps() {
146
+ return {
147
+ ...this.extraProps,
148
+ value: this.value,
149
+ onValueChange: (v) => this.emitValue(v),
150
+ label: this.label ?? '',
151
+ placeholder: this.placeholder ?? '',
152
+ required: this.required ?? false,
153
+ disabled: this.disabled ?? false,
154
+ readOnly: this.readOnly ?? false,
155
+ error: this.error,
156
+ options: this.options ?? [],
157
+ className: this.className ?? '',
158
+ description: this.description ?? '',
159
+ };
160
+ }
161
+ // Gates on `this.supplied` (populated from SimpleChanges in ngOnChanges),
162
+ // not on `prop in instanceObj` or `prop in this`. Both `in` checks test a
163
+ // TypeScript class-field emit artifact rather than intent: whether a
164
+ // property slot exists at runtime depends on the compile target
165
+ // (useDefineForClassFields is false below ES2022, true at ES2022+), so the
166
+ // same source can behave oppositely between this package's test build and
167
+ // its shipped ES2022 bundle, where every declared field is always an own
168
+ // property. `this.supplied` instead reflects only whether Angular ever
169
+ // fired a SimpleChange for that input, i.e. whether the prop was *bound*
170
+ // at all - it skips only props DynamicInput was never given a binding
171
+ // for. It is NOT a general "renderer defaults survive" guarantee: Angular
172
+ // fires a firstChange SimpleChange for every bound input even when the
173
+ // bound value is undefined, and FieldInput's template binds all
174
+ // KNOWN_PROPS unconditionally, so on the real
175
+ // MultiFieldInput -> FieldInput -> DynamicInput path every prop counts as
176
+ // supplied and renderer-side defaults (e.g. `@Input() label = 'None'`)
177
+ // are still overwritten with undefined. This only helps when DynamicInput
178
+ // is mounted directly with some inputs left unbound.
179
+ applyProps(instance) {
180
+ const instanceObj = instance;
181
+ for (const prop of KNOWN_PROPS) {
182
+ if (this.supplied.has(prop)) {
183
+ instanceObj[prop] = this[prop];
119
184
  }
120
185
  }
186
+ this.applyExtraProps(instance);
121
187
  }
122
- bindOutput(instance, outputName) {
123
- const output = instance?.[outputName];
124
- if (!output || typeof output.subscribe !== 'function') {
188
+ applyExtraProps(instance) {
189
+ if (!instance || !this.extraProps) {
125
190
  return;
126
191
  }
127
- const sub = output.subscribe((value) => {
128
- this.emitValue(value);
129
- });
130
- return sub;
192
+ const instanceObj = instance;
193
+ for (const [key, value] of Object.entries(this.extraProps)) {
194
+ instanceObj[key] = value;
195
+ }
196
+ }
197
+ bindOutputs(instance) {
198
+ const outputNames = [
199
+ 'valueChange',
200
+ 'onValueChange',
201
+ ];
202
+ for (const outputName of outputNames) {
203
+ const output = instance[outputName];
204
+ if (output && typeof output === 'object' && 'subscribe' in output) {
205
+ const sub = output.subscribe((value) => this.emitValue(value));
206
+ this.subscriptions.push(sub);
207
+ }
208
+ }
131
209
  }
132
210
  emitValue(value) {
133
211
  this.valueChange.emit(value);
134
212
  this.onChange.emit(value);
135
213
  }
136
- cleanupRenderedComponent() {
137
- this.compRef?.destroy();
138
- this.compRef = undefined;
139
- this.inputInstance = undefined;
214
+ renderError(message) {
215
+ const el = document.createElement('div');
216
+ el.textContent = message;
217
+ el.style.color = 'red';
218
+ this.host.element.nativeElement.appendChild(el);
140
219
  }
141
220
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: DynamicInput, deps: null, target: i0.ɵɵFactoryTarget.Component });
142
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: DynamicInput, isStandalone: true, selector: "dfk-dynamic-input", inputs: { type: "type" }, outputs: { valueChange: "valueChange", onChange: "onChange" }, viewQueries: [{ propertyName: "host", first: true, predicate: ["host"], descendants: true, read: ViewContainerRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `<div #host style="display: contents;"></div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
221
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: DynamicInput, isStandalone: true, selector: "dfk-dynamic-input", inputs: { type: "type", extraProps: "extraProps" }, outputs: { valueChange: "valueChange", onChange: "onChange" }, viewQueries: [{ propertyName: "host", first: true, predicate: ["host"], descendants: true, read: ViewContainerRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `<div #host style="display: contents;"></div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
143
222
  }
144
223
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: DynamicInput, decorators: [{
145
224
  type: Component,
@@ -147,10 +226,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
147
226
  selector: 'dfk-dynamic-input',
148
227
  standalone: true,
149
228
  imports: [CommonModule],
229
+ changeDetection: ChangeDetectionStrategy.OnPush,
150
230
  template: `<div #host style="display: contents;"></div>`,
151
231
  }]
152
232
  }], propDecorators: { type: [{
153
233
  type: Input
234
+ }], extraProps: [{
235
+ type: Input
154
236
  }], valueChange: [{
155
237
  type: Output
156
238
  }], onChange: [{
@@ -159,4 +241,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
159
241
  type: ViewChild,
160
242
  args: ['host', { read: ViewContainerRef, static: false }]
161
243
  }] } });
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHluYW1pY0lucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvRHluYW1pY0lucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFNBQVMsRUFDVCxnQkFBZ0IsRUFNaEIsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQWdCLE1BQU0seUJBQXlCLENBQUM7QUFFdEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDOztBQVFqRCxNQUFNLE9BQU8sWUFDWCxTQUFRLGtCQUFrQjtJQUdqQixJQUFJLENBQWdCO0lBQ1YsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDL0MsUUFBUSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUMsQ0FBQyxrQkFBa0I7SUFHaEUsSUFBSSxDQUFvQjtJQUNoQixPQUFPLENBQXFCO0lBQzVCLGFBQWEsQ0FBTztJQUNwQixhQUFhLEdBQW1CLEVBQUUsQ0FBQztJQUUzQyxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sWUFBWSxHQUFrQixFQUFFLENBQUM7WUFDdkMsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDM0IsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksWUFBWSxDQUNuQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxFQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUMxQixDQUFDO1lBQ0osQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNsRCxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxNQUFNO1FBQ1osTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBb0IsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QyxFQUFFLENBQUMsV0FBVyxHQUFHLHVCQUF1QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoRCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLFFBQWdDLENBQUM7WUFDbEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUNsQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDaEUsQ0FBQztZQUVELElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDdEQsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDeEQsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBRUQsUUFBUSxDQUFDLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM1QyxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLGdDQUFnQztZQUNoQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxLQUFLLEdBQVE7b0JBQ2pCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztvQkFDakIsYUFBYSxFQUFFLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFDNUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO29CQUNqQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7b0JBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtvQkFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7b0JBQ3pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztvQkFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO29CQUN2QixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7aUJBQ2hDLENBQUM7Z0JBQ0YsTUFBTSxHQUFHLEdBQUksUUFBd0MsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDNUIsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDekMsRUFBRSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7b0JBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2xELENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN6QyxFQUFFLENBQUMsV0FBVyxHQUFHLDJCQUEyQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sZUFBZSxDQUFDLFFBQWE7UUFDbkMsTUFBTSxVQUFVLEdBQUc7WUFDakIsT0FBTztZQUNQLE9BQU87WUFDUCxhQUFhO1lBQ2IsVUFBVTtZQUNWLFVBQVU7WUFDVixTQUFTO1lBQ1QsV0FBVztZQUNYLGFBQWE7WUFDYixjQUFjO1NBQ2YsQ0FBQztRQUNGLEtBQUssTUFBTSxJQUFJLElBQUksVUFBVSxFQUFFLENBQUM7WUFDOUIsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDckMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFJLElBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxVQUFVLENBQ2hCLFFBQWEsRUFDYixVQUEyQztRQUUzQyxNQUFNLE1BQU0sR0FBRyxRQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN0RCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFJLE1BQTRCLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVPLFNBQVMsQ0FBQyxLQUFVO1FBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztRQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUNqQyxDQUFDO3dHQWhLVSxZQUFZOzRGQUFaLFlBQVksK09BUUksZ0JBQWdCLHlFQVZqQyw4Q0FBOEMsMkRBRDlDLFlBQVk7OzRGQUdYLFlBQVk7a0JBTnhCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsUUFBUSxFQUFFLDhDQUE4QztpQkFDekQ7OEJBS1UsSUFBSTtzQkFBWixLQUFLO2dCQUNhLFdBQVc7c0JBQTdCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFHUCxJQUFJO3NCQURILFNBQVM7dUJBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBPbkNoYW5nZXMsXG4gIEFmdGVyVmlld0luaXQsXG4gIE9uRGVzdHJveSxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVHlwZSxcbiAgU2ltcGxlQ2hhbmdlLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpZWxkUmVnaXN0cnksIEZpZWxkVHlwZUtleSB9IGZyb20gJ0BkeW5hbWljLWZpZWxkLWtpdC9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQmFzZUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9CYXNlSW5wdXQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZmstZHluYW1pYy1pbnB1dCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZTogYDxkaXYgI2hvc3Qgc3R5bGU9XCJkaXNwbGF5OiBjb250ZW50cztcIj48L2Rpdj5gLFxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljSW5wdXRcbiAgZXh0ZW5kcyBCYXNlSW5wdXRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveVxue1xuICBASW5wdXQoKSB0eXBlITogRmllbGRUeXBlS2V5O1xuICBAT3V0cHV0KCkgb3ZlcnJpZGUgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7IC8vIGJhY2t3YXJkIGNvbXBhdFxuXG4gIEBWaWV3Q2hpbGQoJ2hvc3QnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgaG9zdCE6IFZpZXdDb250YWluZXJSZWY7XG4gIHByaXZhdGUgY29tcFJlZj86IENvbXBvbmVudFJlZjxhbnk+O1xuICBwcml2YXRlIGlucHV0SW5zdGFuY2U/OiBhbnk7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ3R5cGUnXSAmJiAhY2hhbmdlc1sndHlwZSddLmZpcnN0Q2hhbmdlICYmIHRoaXMuaG9zdCkge1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbnB1dEluc3RhbmNlKSB7XG4gICAgICB0aGlzLmFwcGx5S25vd25Qcm9wcyh0aGlzLmlucHV0SW5zdGFuY2UpO1xuXG4gICAgICBjb25zdCBjaGlsZENoYW5nZXM6IFNpbXBsZUNoYW5nZXMgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBjaGFuZ2VzKSB7XG4gICAgICAgIGNoaWxkQ2hhbmdlc1twcm9wXSA9IG5ldyBTaW1wbGVDaGFuZ2UoXG4gICAgICAgICAgY2hhbmdlc1twcm9wXS5wcmV2aW91c1ZhbHVlLFxuICAgICAgICAgIGNoYW5nZXNbcHJvcF0uY3VycmVudFZhbHVlLFxuICAgICAgICAgIGNoYW5nZXNbcHJvcF0uZmlyc3RDaGFuZ2VcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbnB1dEluc3RhbmNlLm5nT25DaGFuZ2VzPy4oY2hpbGRDaGFuZ2VzKTtcbiAgICAgIHRoaXMuY29tcFJlZj8uY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ob3N0KSB7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5jbGVhbnVwU3Vic2NyaXB0aW9ucygpO1xuICAgIHRoaXMuY2xlYW51cFJlbmRlcmVkQ29tcG9uZW50KCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBTdWJzY3JpcHRpb25zKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXIoKSB7XG4gICAgY29uc3QgUmVuZGVyZXIgPSBmaWVsZFJlZ2lzdHJ5LmdldCh0aGlzLnR5cGUgYXMgRmllbGRUeXBlS2V5KTtcbiAgICB0aGlzLmNsZWFudXBSZW5kZXJlZENvbXBvbmVudCgpO1xuICAgIHRoaXMuY2xlYW51cFN1YnNjcmlwdGlvbnMoKTtcbiAgICB0aGlzLmhvc3QuY2xlYXIoKTtcbiAgICBpZiAoIVJlbmRlcmVyKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZWwudGV4dENvbnRlbnQgPSBgVW5rbm93biBmaWVsZCB0eXBlOiAke3RoaXMudHlwZX1gO1xuICAgICAgdGhpcy5ob3N0LmVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChlbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbXBUeXBlID0gUmVuZGVyZXIgYXMgdW5rbm93biBhcyBUeXBlPGFueT47XG4gICAgICBjb25zdCBjb21wUmVmID0gdGhpcy5ob3N0LmNyZWF0ZUNvbXBvbmVudChjb21wVHlwZSk7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBSZWYuaW5zdGFuY2U7XG4gICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBpbnN0YW5jZSBmb3IgJHt0aGlzLnR5cGV9YCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwbHlLbm93blByb3BzKGluc3RhbmNlKTtcblxuICAgICAgY29uc3Qgc3ViQSA9IHRoaXMuYmluZE91dHB1dChpbnN0YW5jZSwgJ3ZhbHVlQ2hhbmdlJyk7XG4gICAgICBpZiAoc3ViQSkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdWJBKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN1YkIgPSB0aGlzLmJpbmRPdXRwdXQoaW5zdGFuY2UsICdvblZhbHVlQ2hhbmdlJyk7XG4gICAgICBpZiAoc3ViQikge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdWJCKTtcbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2UuY2hhbmdlRGV0ZWN0b3JSZWY/LmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHRoaXMuY29tcFJlZiA9IGNvbXBSZWY7XG4gICAgICB0aGlzLmlucHV0SW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgIGNvbXBSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gRmFsbGJhY2sgdG8gZnVuY3Rpb24gcmVuZGVyZXJcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb3BzOiBhbnkgPSB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICAgICAgb25WYWx1ZUNoYW5nZTogKHY6IGFueSkgPT4gdGhpcy5lbWl0VmFsdWUodiksXG4gICAgICAgICAgbGFiZWw6IHRoaXMubGFiZWwsXG4gICAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRoaXMucmVxdWlyZWQsXG4gICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWQsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiB0aGlzLmVycm9yTWVzc2FnZSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb3V0ID0gKFJlbmRlcmVyIGFzIChwcm9wczogdW5rbm93bikgPT4gdW5rbm93bikocHJvcHMpO1xuICAgICAgICBpZiAodHlwZW9mIG91dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIGVsLmlubmVySFRNTCA9IG91dDtcbiAgICAgICAgICB0aGlzLmhvc3QuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBlbC50ZXh0Q29udGVudCA9IGBGYWlsZWQgdG8gcmVuZGVyIGZpZWxkOiAke3RoaXMudHlwZX1gO1xuICAgICAgICB0aGlzLmhvc3QuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5S25vd25Qcm9wcyhpbnN0YW5jZTogYW55KSB7XG4gICAgY29uc3Qga25vd25Qcm9wcyA9IFtcbiAgICAgICd2YWx1ZScsXG4gICAgICAnbGFiZWwnLFxuICAgICAgJ3BsYWNlaG9sZGVyJyxcbiAgICAgICdyZXF1aXJlZCcsXG4gICAgICAnZGlzYWJsZWQnLFxuICAgICAgJ29wdGlvbnMnLFxuICAgICAgJ2NsYXNzTmFtZScsXG4gICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgJ2Vycm9yTWVzc2FnZScsXG4gICAgXTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2Yga25vd25Qcm9wcykge1xuICAgICAgaWYgKHByb3AgaW4gdGhpcyAmJiBwcm9wIGluIGluc3RhbmNlKSB7XG4gICAgICAgIGluc3RhbmNlW3Byb3BdID0gKHRoaXMgYXMgYW55KVtwcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJpbmRPdXRwdXQoXG4gICAgaW5zdGFuY2U6IGFueSxcbiAgICBvdXRwdXROYW1lOiAndmFsdWVDaGFuZ2UnIHwgJ29uVmFsdWVDaGFuZ2UnXG4gICk6IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgb3V0cHV0ID0gaW5zdGFuY2U/LltvdXRwdXROYW1lXTtcbiAgICBpZiAoIW91dHB1dCB8fCB0eXBlb2Ygb3V0cHV0LnN1YnNjcmliZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YiA9IChvdXRwdXQgYXMgRXZlbnRFbWl0dGVyPGFueT4pLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgIHRoaXMuZW1pdFZhbHVlKHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3ViO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW51cFJlbmRlcmVkQ29tcG9uZW50KCkge1xuICAgIHRoaXMuY29tcFJlZj8uZGVzdHJveSgpO1xuICAgIHRoaXMuY29tcFJlZiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlucHV0SW5zdGFuY2UgPSB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHluYW1pY0lucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvRHluYW1pY0lucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNULGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDOztBQUVqRCw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLE1BQU0sV0FBVyxHQUFHO0lBQ2xCLE9BQU87SUFDUCxPQUFPO0lBQ1AsYUFBYTtJQUNiLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLGFBQWE7Q0FDTCxDQUFDO0FBU1gsTUFBTSxPQUFPLFlBQ1gsU0FBUSxrQkFBa0I7SUFHakIsSUFBSSxDQUFnQjtJQUM3QixzRUFBc0U7SUFDN0QsVUFBVSxDQUFjO0lBQ2QsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFDbkQsUUFBUSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFFekMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUcxQyxJQUFJLENBQW9CO0lBQ2hCLE9BQU8sQ0FBeUI7SUFDaEMsYUFBYSxDQUFXO0lBQ3hCLGFBQWEsR0FBbUIsRUFBRSxDQUFDO0lBQzNDLHVFQUF1RTtJQUN2RSxzRUFBc0U7SUFDOUQsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFckMsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFM0IsS0FBSyxNQUFNLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUMvQixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEIsQ0FBQzthQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxPQUFzQjtRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBRUQsS0FBSyxNQUFNLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUMvQixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxhQUF5QyxDQUFDLElBQUksQ0FBQyxHQUNuRCxJQUNELENBQUMsSUFBSSxDQUFDLENBQUM7WUFDVixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVPLE9BQU87UUFDYixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDakMsQ0FBQztJQUVPLE1BQU07UUFDWixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVsQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLHVCQUF1QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNyRCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBb0MsQ0FBQyxDQUFDO1FBQzdELENBQUM7YUFBTSxJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLDhCQUE4QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5RCxDQUFDO0lBQ0gsQ0FBQztJQUVELG9FQUFvRTtJQUNwRSx5RUFBeUU7SUFDekUsMEVBQTBFO0lBQzFFLHNFQUFzRTtJQUN0RSxtRUFBbUU7SUFDbkUsMkVBQTJFO0lBQzNFLHNFQUFzRTtJQUM5RCxlQUFlLENBQUMsUUFBaUI7UUFDdkMsT0FBTyxDQUNMLE9BQU8sUUFBUSxLQUFLLFVBQVU7WUFDOUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FDdkQsQ0FBQztJQUNKLENBQUM7SUFFTyxlQUFlLENBQUMsUUFBdUI7UUFDN0MsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUVsQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQ0FBaUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQy9ELE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTNCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM1QyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsSUFBSSxDQUFDLFdBQVcsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0QsQ0FBQztJQUNILENBQUM7SUFFTyxjQUFjLENBQUMsUUFBaUI7UUFDdEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEMsTUFBTSxNQUFNLEdBQUksUUFBdUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUUvRCxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUMvQixNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN6QyxFQUFFLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsRCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLElBQUksQ0FBQyxXQUFXLENBQUMsMkJBQTJCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNELENBQUM7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLE9BQU87WUFDTCxHQUFHLElBQUksQ0FBQyxVQUFVO1lBQ2xCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixhQUFhLEVBQUUsQ0FBQyxDQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2hELEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDdkIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRTtZQUNuQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxLQUFLO1lBQ2hDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUs7WUFDaEMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksS0FBSztZQUNoQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRTtZQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFO1lBQy9CLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUU7U0FDcEMsQ0FBQztJQUNKLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsMEVBQTBFO0lBQzFFLHFFQUFxRTtJQUNyRSxnRUFBZ0U7SUFDaEUsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSx5RUFBeUU7SUFDekUsdUVBQXVFO0lBQ3ZFLHlFQUF5RTtJQUN6RSxzRUFBc0U7SUFDdEUsMEVBQTBFO0lBQzFFLHVFQUF1RTtJQUN2RSxnRUFBZ0U7SUFDaEUsOENBQThDO0lBQzlDLDBFQUEwRTtJQUMxRSx1RUFBdUU7SUFDdkUsMEVBQTBFO0lBQzFFLHFEQUFxRDtJQUM3QyxVQUFVLENBQUMsUUFBaUI7UUFDbEMsTUFBTSxXQUFXLEdBQUcsUUFBbUMsQ0FBQztRQUN4RCxLQUFLLE1BQU0sSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQy9CLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFJLElBQWdDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUQsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTyxlQUFlLENBQUMsUUFBaUI7UUFDdkMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQyxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLFFBQW1DLENBQUM7UUFDeEQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDM0QsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxRQUFpQjtRQUNuQyxNQUFNLFdBQVcsR0FBMkM7WUFDMUQsYUFBYTtZQUNiLGVBQWU7U0FDaEIsQ0FBQztRQUVGLEtBQUssTUFBTSxVQUFVLElBQUksV0FBVyxFQUFFLENBQUM7WUFDckMsTUFBTSxNQUFNLEdBQUksUUFBb0MsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRSxJQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksV0FBVyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNsRSxNQUFNLEdBQUcsR0FDUCxNQUNELENBQUMsU0FBUyxDQUFDLENBQUMsS0FBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLFNBQVMsQ0FBQyxLQUFjO1FBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTyxXQUFXLENBQUMsT0FBZTtRQUNqQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLEVBQUUsQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO1FBQ3pCLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7d0dBMU9VLFlBQVk7NEZBQVosWUFBWSx5UUFZSSxnQkFBZ0IseUVBZGpDLDhDQUE4QywyREFGOUMsWUFBWTs7NEZBSVgsWUFBWTtrQkFQeEIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsUUFBUSxFQUFFLDhDQUE4QztpQkFDekQ7OEJBS1UsSUFBSTtzQkFBWixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ2EsV0FBVztzQkFBN0IsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUtQLElBQUk7c0JBREgsU0FBUzt1QkFBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVHlwZSxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpZWxkVHlwZUtleSwgUHJvcGVydGllcyB9IGZyb20gJ0BkeW5hbWljLWZpZWxkLWtpdC9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRklFTERfUkVHSVNUUlkgfSBmcm9tICcuLi9maWVsZFJlZ2lzdHJ5VG9rZW4nO1xuaW1wb3J0IHsgQmFzZUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9CYXNlSW5wdXQnO1xuXG4vLyBPbmx5IHRoZSBmcmFtZXdvcmstYWdub3N0aWMgRmllbGRSZW5kZXJlclByb3BzIGtleXMuIERvbWFpbi1zcGVjaWZpYyBwcm9wc1xuLy8gcmVhY2ggdGhlIHJlbmRlcmVyIHRocm91Z2ggYGV4dHJhUHJvcHNgIChGaWVsZERlc2NyaXB0aW9uLnByb3BzKSBpbnN0ZWFkLlxuY29uc3QgS05PV05fUFJPUFMgPSBbXG4gICd2YWx1ZScsXG4gICdsYWJlbCcsXG4gICdwbGFjZWhvbGRlcicsXG4gICdyZXF1aXJlZCcsXG4gICdkaXNhYmxlZCcsXG4gICdyZWFkT25seScsXG4gICdlcnJvcicsXG4gICdvcHRpb25zJyxcbiAgJ2NsYXNzTmFtZScsXG4gICdkZXNjcmlwdGlvbicsXG5dIGFzIGNvbnN0O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZmstZHluYW1pYy1pbnB1dCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGA8ZGl2ICNob3N0IHN0eWxlPVwiZGlzcGxheTogY29udGVudHM7XCI+PC9kaXY+YCxcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0lucHV0XG4gIGV4dGVuZHMgQmFzZUlucHV0Q29tcG9uZW50XG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgQElucHV0KCkgdHlwZSE6IEZpZWxkVHlwZUtleTtcbiAgLy8gRXh0cmEsIGZyYW1ld29yay1hZ25vc3RpYyBwcm9wcyBmb3J3YXJkZWQgdmVyYmF0aW0gdG8gdGhlIHJlbmRlcmVyLlxuICBASW5wdXQoKSBleHRyYVByb3BzPzogUHJvcGVydGllcztcbiAgQE91dHB1dCgpIG92ZXJyaWRlIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx1bmtub3duPigpO1xuICBAT3V0cHV0KCkgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHVua25vd24+KCk7XG5cbiAgcHJpdmF0ZSByZWdpc3RyeSA9IGluamVjdChGSUVMRF9SRUdJU1RSWSk7XG5cbiAgQFZpZXdDaGlsZCgnaG9zdCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICBob3N0ITogVmlld0NvbnRhaW5lclJlZjtcbiAgcHJpdmF0ZSBjb21wUmVmPzogQ29tcG9uZW50UmVmPHVua25vd24+O1xuICBwcml2YXRlIGlucHV0SW5zdGFuY2U/OiB1bmtub3duO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIC8vIFRyYWNrcyB3aGljaCBLTk9XTl9QUk9QUyB3ZXJlIGFjdHVhbGx5IHN1cHBsaWVkIHRvIER5bmFtaWNJbnB1dCAodmlhXG4gIC8vIFNpbXBsZUNoYW5nZXMpLCBpbmRlcGVuZGVudCBvZiBUUyBjbGFzcy1maWVsZCBlbWl0LiBTZWUgYXBwbHlQcm9wcy5cbiAgcHJpdmF0ZSBzdXBwbGllZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBLTk9XTl9QUk9QUykge1xuICAgICAgaWYgKGNoYW5nZXNbcHJvcF0pIHtcbiAgICAgICAgdGhpcy5zdXBwbGllZC5hZGQocHJvcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaW5wdXRJbnN0YW5jZSkge1xuICAgICAgdGhpcy5zeW5jUHJvcHNUb0luc3RhbmNlKGNoYW5nZXMpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWyd0eXBlJ10gJiYgIWNoYW5nZXNbJ3R5cGUnXS5maXJzdENoYW5nZSAmJiB0aGlzLmhvc3QpIHtcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5pbnB1dEluc3RhbmNlICYmIHRoaXMuaG9zdCkge1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jUHJvcHNUb0luc3RhbmNlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5wdXRJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBLTk9XTl9QUk9QUykge1xuICAgICAgaWYgKGNoYW5nZXNbcHJvcF0gJiYgdGhpcy5pbnB1dEluc3RhbmNlKSB7XG4gICAgICAgICh0aGlzLmlucHV0SW5zdGFuY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3Byb3BdID0gKFxuICAgICAgICAgIHRoaXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgKVtwcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2V4dHJhUHJvcHMnXSkge1xuICAgICAgdGhpcy5hcHBseUV4dHJhUHJvcHModGhpcy5pbnB1dEluc3RhbmNlKTtcbiAgICB9XG4gICAgdGhpcy5jb21wUmVmPy5jaGFuZ2VEZXRlY3RvclJlZj8uZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cFN1YnNjcmlwdGlvbnMoKTtcbiAgICB0aGlzLmNsZWFudXBSZW5kZXJlZENvbXBvbmVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwU3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW51cFJlbmRlcmVkQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIHRoaXMuY29tcFJlZj8uZGVzdHJveSgpO1xuICAgIHRoaXMuY29tcFJlZiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlucHV0SW5zdGFuY2UgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlcigpOiB2b2lkIHtcbiAgICBjb25zdCBSZW5kZXJlciA9IHRoaXMucmVnaXN0cnkuZ2V0KHRoaXMudHlwZSk7XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgdGhpcy5ob3N0LmNsZWFyKCk7XG5cbiAgICBpZiAoIVJlbmRlcmVyKSB7XG4gICAgICB0aGlzLnJlbmRlckVycm9yKGBVbmtub3duIGZpZWxkIHR5cGU6ICR7dGhpcy50eXBlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ29tcG9uZW50VHlwZShSZW5kZXJlcikpIHtcbiAgICAgIHRoaXMucmVuZGVyQ29tcG9uZW50KFJlbmRlcmVyIGFzIHVua25vd24gYXMgVHlwZTx1bmtub3duPik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgUmVuZGVyZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMucmVuZGVyRmFsbGJhY2soUmVuZGVyZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlckVycm9yKGBJbnZhbGlkIHJlbmRlcmVyIGZvciB0eXBlOiAke3RoaXMudHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICAvLyBBbmd1bGFyIGNvbXBvbmVudCBjbGFzc2VzIGNhcnJ5IGEgc3RhdGljIMm1Y21wLiBDaGVja2VkIGluc3RlYWQgb2ZcbiAgLy8gcmVmbGVjdENvbXBvbmVudFR5cGUoKSBiZWNhdXNlIHRoZSBwZWVyIHJhbmdlIHN0YXJ0cyBhdCBBbmd1bGFyIDEzIGFuZFxuICAvLyByZWZsZWN0Q29tcG9uZW50VHlwZSBpcyB2MTQrLiBQbGFpbiBmdW5jdGlvbiByZW5kZXJlcnMgaGF2ZSBubyDJtWNtcCBhbmRcbiAgLy8gZmFsbCB0aHJvdWdoIHRvIHJlbmRlckZhbGxiYWNrLiBVc2VzIGhhc093blByb3BlcnR5IChub3QgYGluYCkgc28gYVxuICAvLyBjbGFzcyB0aGF0IG1lcmVseSBleHRlbmRzIGEgY29tcG9uZW50IHdpdGhvdXQgaXRzIG93biBAQ29tcG9uZW50XG4gIC8vIGRlY29yYXRvciAtIGFuZCB3b3VsZCBvdGhlcndpc2UgaW5oZXJpdCB0aGUgcGFyZW50J3Mgc3RhdGljIMm1Y21wIHZpYSB0aGVcbiAgLy8gcHJvdG90eXBlIGNoYWluIC0gaXMgbm90IG1pc3Rha2VuIGZvciBhIGNvbXBvbmVudCBpbiBpdHMgb3duIHJpZ2h0LlxuICBwcml2YXRlIGlzQ29tcG9uZW50VHlwZShyZW5kZXJlcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgcmVuZGVyZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZW5kZXJlciwgJ8m1Y21wJylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDb21wb25lbnQoY29tcFR5cGU6IFR5cGU8dW5rbm93bj4pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29tcFJlZiA9IHRoaXMuaG9zdC5jcmVhdGVDb21wb25lbnQoY29tcFR5cGUpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wUmVmLmluc3RhbmNlO1xuXG4gICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgIHRoaXMucmVuZGVyRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgaW5zdGFuY2UgZm9yICR7dGhpcy50eXBlfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwbHlQcm9wcyhpbnN0YW5jZSk7XG4gICAgICB0aGlzLmJpbmRPdXRwdXRzKGluc3RhbmNlKTtcblxuICAgICAgdGhpcy5jb21wUmVmID0gY29tcFJlZjtcbiAgICAgIHRoaXMuaW5wdXRJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgY29tcFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnJlbmRlckVycm9yKGBGYWlsZWQgdG8gcmVuZGVyIGZpZWxkOiAke3RoaXMudHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckZhbGxiYWNrKHJlbmRlcmVyOiB1bmtub3duKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5nZXRGYWxsYmFja1Byb3BzKCk7XG4gICAgICBjb25zdCByZXN1bHQgPSAocmVuZGVyZXIgYXMgKHByb3BzOiB1bmtub3duKSA9PiBzdHJpbmcpKHByb3BzKTtcblxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGVsLmlubmVySFRNTCA9IHJlc3VsdDtcbiAgICAgICAgdGhpcy5ob3N0LmVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChlbCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnJlbmRlckVycm9yKGBGYWlsZWQgdG8gcmVuZGVyIGZpZWxkOiAke3RoaXMudHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEZhbGxiYWNrUHJvcHMoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmV4dHJhUHJvcHMsXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgIG9uVmFsdWVDaGFuZ2U6ICh2OiB1bmtub3duKSA9PiB0aGlzLmVtaXRWYWx1ZSh2KSxcbiAgICAgIGxhYmVsOiB0aGlzLmxhYmVsID8/ICcnLFxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIgPz8gJycsXG4gICAgICByZXF1aXJlZDogdGhpcy5yZXF1aXJlZCA/PyBmYWxzZSxcbiAgICAgIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkID8/IGZhbHNlLFxuICAgICAgcmVhZE9ubHk6IHRoaXMucmVhZE9ubHkgPz8gZmFsc2UsXG4gICAgICBlcnJvcjogdGhpcy5lcnJvcixcbiAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyA/PyBbXSxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUgPz8gJycsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbiA/PyAnJyxcbiAgICB9O1xuICB9XG5cbiAgLy8gR2F0ZXMgb24gYHRoaXMuc3VwcGxpZWRgIChwb3B1bGF0ZWQgZnJvbSBTaW1wbGVDaGFuZ2VzIGluIG5nT25DaGFuZ2VzKSxcbiAgLy8gbm90IG9uIGBwcm9wIGluIGluc3RhbmNlT2JqYCBvciBgcHJvcCBpbiB0aGlzYC4gQm90aCBgaW5gIGNoZWNrcyB0ZXN0IGFcbiAgLy8gVHlwZVNjcmlwdCBjbGFzcy1maWVsZCBlbWl0IGFydGlmYWN0IHJhdGhlciB0aGFuIGludGVudDogd2hldGhlciBhXG4gIC8vIHByb3BlcnR5IHNsb3QgZXhpc3RzIGF0IHJ1bnRpbWUgZGVwZW5kcyBvbiB0aGUgY29tcGlsZSB0YXJnZXRcbiAgLy8gKHVzZURlZmluZUZvckNsYXNzRmllbGRzIGlzIGZhbHNlIGJlbG93IEVTMjAyMiwgdHJ1ZSBhdCBFUzIwMjIrKSwgc28gdGhlXG4gIC8vIHNhbWUgc291cmNlIGNhbiBiZWhhdmUgb3Bwb3NpdGVseSBiZXR3ZWVuIHRoaXMgcGFja2FnZSdzIHRlc3QgYnVpbGQgYW5kXG4gIC8vIGl0cyBzaGlwcGVkIEVTMjAyMiBidW5kbGUsIHdoZXJlIGV2ZXJ5IGRlY2xhcmVkIGZpZWxkIGlzIGFsd2F5cyBhbiBvd25cbiAgLy8gcHJvcGVydHkuIGB0aGlzLnN1cHBsaWVkYCBpbnN0ZWFkIHJlZmxlY3RzIG9ubHkgd2hldGhlciBBbmd1bGFyIGV2ZXJcbiAgLy8gZmlyZWQgYSBTaW1wbGVDaGFuZ2UgZm9yIHRoYXQgaW5wdXQsIGkuZS4gd2hldGhlciB0aGUgcHJvcCB3YXMgKmJvdW5kKlxuICAvLyBhdCBhbGwgLSBpdCBza2lwcyBvbmx5IHByb3BzIER5bmFtaWNJbnB1dCB3YXMgbmV2ZXIgZ2l2ZW4gYSBiaW5kaW5nXG4gIC8vIGZvci4gSXQgaXMgTk9UIGEgZ2VuZXJhbCBcInJlbmRlcmVyIGRlZmF1bHRzIHN1cnZpdmVcIiBndWFyYW50ZWU6IEFuZ3VsYXJcbiAgLy8gZmlyZXMgYSBmaXJzdENoYW5nZSBTaW1wbGVDaGFuZ2UgZm9yIGV2ZXJ5IGJvdW5kIGlucHV0IGV2ZW4gd2hlbiB0aGVcbiAgLy8gYm91bmQgdmFsdWUgaXMgdW5kZWZpbmVkLCBhbmQgRmllbGRJbnB1dCdzIHRlbXBsYXRlIGJpbmRzIGFsbFxuICAvLyBLTk9XTl9QUk9QUyB1bmNvbmRpdGlvbmFsbHksIHNvIG9uIHRoZSByZWFsXG4gIC8vIE11bHRpRmllbGRJbnB1dCAtPiBGaWVsZElucHV0IC0+IER5bmFtaWNJbnB1dCBwYXRoIGV2ZXJ5IHByb3AgY291bnRzIGFzXG4gIC8vIHN1cHBsaWVkIGFuZCByZW5kZXJlci1zaWRlIGRlZmF1bHRzIChlLmcuIGBASW5wdXQoKSBsYWJlbCA9ICdOb25lJ2ApXG4gIC8vIGFyZSBzdGlsbCBvdmVyd3JpdHRlbiB3aXRoIHVuZGVmaW5lZC4gVGhpcyBvbmx5IGhlbHBzIHdoZW4gRHluYW1pY0lucHV0XG4gIC8vIGlzIG1vdW50ZWQgZGlyZWN0bHkgd2l0aCBzb21lIGlucHV0cyBsZWZ0IHVuYm91bmQuXG4gIHByaXZhdGUgYXBwbHlQcm9wcyhpbnN0YW5jZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGluc3RhbmNlT2JqID0gaW5zdGFuY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIEtOT1dOX1BST1BTKSB7XG4gICAgICBpZiAodGhpcy5zdXBwbGllZC5oYXMocHJvcCkpIHtcbiAgICAgICAgaW5zdGFuY2VPYmpbcHJvcF0gPSAodGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYXBwbHlFeHRyYVByb3BzKGluc3RhbmNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlFeHRyYVByb3BzKGluc3RhbmNlOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKCFpbnN0YW5jZSB8fCAhdGhpcy5leHRyYVByb3BzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbmNlT2JqID0gaW5zdGFuY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5leHRyYVByb3BzKSkge1xuICAgICAgaW5zdGFuY2VPYmpba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYmluZE91dHB1dHMoaW5zdGFuY2U6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBvdXRwdXROYW1lczogQXJyYXk8J3ZhbHVlQ2hhbmdlJyB8ICdvblZhbHVlQ2hhbmdlJz4gPSBbXG4gICAgICAndmFsdWVDaGFuZ2UnLFxuICAgICAgJ29uVmFsdWVDaGFuZ2UnLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IG91dHB1dE5hbWUgb2Ygb3V0cHV0TmFtZXMpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IChpbnN0YW5jZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbb3V0cHV0TmFtZV07XG4gICAgICBpZiAob3V0cHV0ICYmIHR5cGVvZiBvdXRwdXQgPT09ICdvYmplY3QnICYmICdzdWJzY3JpYmUnIGluIG91dHB1dCkge1xuICAgICAgICBjb25zdCBzdWIgPSAoXG4gICAgICAgICAgb3V0cHV0IGFzIHsgc3Vic2NyaWJlOiAoY2I6ICh2OiB1bmtub3duKSA9PiB2b2lkKSA9PiBTdWJzY3JpcHRpb24gfVxuICAgICAgICApLnN1YnNjcmliZSgodmFsdWU6IHVua25vd24pID0+IHRoaXMuZW1pdFZhbHVlKHZhbHVlKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHN1Yik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VmFsdWUodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWwudGV4dENvbnRlbnQgPSBtZXNzYWdlO1xuICAgIGVsLnN0eWxlLmNvbG9yID0gJ3JlZCc7XG4gICAgdGhpcy5ob3N0LmVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChlbCk7XG4gIH1cbn1cbiJdfQ==
@@ -1,40 +1,57 @@
1
1
  import { NgIf } from '@angular/common';
2
- import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
3
3
  import { DynamicInput } from './DynamicInput';
4
4
  import * as i0 from "@angular/core";
5
5
  export class FieldInput {
6
+ cdr;
6
7
  fieldDescription;
7
- renderInfos;
8
+ value;
9
+ options;
10
+ disabled;
11
+ readOnly;
12
+ error;
8
13
  onValueChangeField = new EventEmitter();
9
- getFieldValue() {
10
- if (!this.fieldDescription || !this.renderInfos) {
14
+ shouldRender = false;
15
+ get resolvedOptions() {
16
+ if (this.options) {
17
+ return this.options;
18
+ }
19
+ if (!this.fieldDescription?.options) {
11
20
  return undefined;
12
21
  }
13
- const value = this.renderInfos[this.fieldDescription.name];
14
- if (value === undefined && this.fieldDescription.type === 'text') {
15
- return '';
22
+ if (typeof this.fieldDescription.options === 'function') {
23
+ return undefined;
16
24
  }
17
- return value;
25
+ return this.fieldDescription.options;
26
+ }
27
+ constructor(cdr) {
28
+ this.cdr = cdr;
29
+ }
30
+ ngOnChanges(_changes) {
31
+ this.shouldRender = !!this.fieldDescription;
32
+ this.cdr.markForCheck();
18
33
  }
19
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FieldInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
20
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: FieldInput, isStandalone: true, selector: "dfk-field-input", inputs: { fieldDescription: "fieldDescription", renderInfos: "renderInfos" }, outputs: { onValueChangeField: "onValueChangeField" }, ngImport: i0, template: `
34
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FieldInput, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
35
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: FieldInput, isStandalone: true, selector: "dfk-field-input", inputs: { fieldDescription: "fieldDescription", value: "value", options: "options", disabled: "disabled", readOnly: "readOnly", error: "error" }, outputs: { onValueChangeField: "onValueChangeField" }, usesOnChanges: true, ngImport: i0, template: `
21
36
  <dfk-dynamic-input
22
- *ngIf="fieldDescription && renderInfos"
37
+ *ngIf="shouldRender"
23
38
  [type]="fieldDescription!.type"
24
- [value]="getFieldValue()"
39
+ [value]="value"
25
40
  [label]="fieldDescription!.label"
26
41
  [placeholder]="fieldDescription!.placeholder"
27
42
  [required]="fieldDescription!.required"
28
- [description]="fieldDescription!.description"
29
- [options]="fieldDescription!.options"
43
+ [description]="$any(fieldDescription!.description)"
44
+ [options]="resolvedOptions"
30
45
  [className]="fieldDescription!.className"
31
46
  (valueChange)="
32
47
  onValueChangeField.emit({ value: $event, key: fieldDescription!.name })
33
48
  "
34
- [disabled]="false"
35
- [errorMessage]="''"
49
+ [disabled]="disabled"
50
+ [readOnly]="readOnly"
51
+ [error]="$any(error)"
52
+ [extraProps]="fieldDescription!.props"
36
53
  ></dfk-dynamic-input>
37
- `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DynamicInput, selector: "dfk-dynamic-input", inputs: ["type"], outputs: ["valueChange", "onChange"] }] });
54
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DynamicInput, selector: "dfk-dynamic-input", inputs: ["type", "extraProps"], outputs: ["valueChange", "onChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
38
55
  }
39
56
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FieldInput, decorators: [{
40
57
  type: Component,
@@ -42,30 +59,41 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
42
59
  selector: 'dfk-field-input',
43
60
  standalone: true,
44
61
  imports: [NgIf, DynamicInput],
62
+ changeDetection: ChangeDetectionStrategy.OnPush,
45
63
  template: `
46
64
  <dfk-dynamic-input
47
- *ngIf="fieldDescription && renderInfos"
65
+ *ngIf="shouldRender"
48
66
  [type]="fieldDescription!.type"
49
- [value]="getFieldValue()"
67
+ [value]="value"
50
68
  [label]="fieldDescription!.label"
51
69
  [placeholder]="fieldDescription!.placeholder"
52
70
  [required]="fieldDescription!.required"
53
- [description]="fieldDescription!.description"
54
- [options]="fieldDescription!.options"
71
+ [description]="$any(fieldDescription!.description)"
72
+ [options]="resolvedOptions"
55
73
  [className]="fieldDescription!.className"
56
74
  (valueChange)="
57
75
  onValueChangeField.emit({ value: $event, key: fieldDescription!.name })
58
76
  "
59
- [disabled]="false"
60
- [errorMessage]="''"
77
+ [disabled]="disabled"
78
+ [readOnly]="readOnly"
79
+ [error]="$any(error)"
80
+ [extraProps]="fieldDescription!.props"
61
81
  ></dfk-dynamic-input>
62
82
  `,
63
83
  }]
64
- }], propDecorators: { fieldDescription: [{
84
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { fieldDescription: [{
85
+ type: Input
86
+ }], value: [{
87
+ type: Input
88
+ }], options: [{
89
+ type: Input
90
+ }], disabled: [{
91
+ type: Input
92
+ }], readOnly: [{
65
93
  type: Input
66
- }], renderInfos: [{
94
+ }], error: [{
67
95
  type: Input
68
96
  }], onValueChangeField: [{
69
97
  type: Output
70
98
  }] } });
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGRJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0ZpZWxkSW5wdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQXlCOUMsTUFBTSxPQUFPLFVBQVU7SUFDWixnQkFBZ0IsQ0FBb0I7SUFDcEMsV0FBVyxDQUFjO0lBQ3hCLGtCQUFrQixHQUFHLElBQUksWUFBWSxFQUczQyxDQUFDO0lBRUwsYUFBYTtRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDaEQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ2pFLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzt3R0FuQlUsVUFBVTs0RkFBVixVQUFVLGdOQW5CWDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQlQsNERBbEJTLElBQUksNkZBQUUsWUFBWTs7NEZBb0JqQixVQUFVO2tCQXZCdEIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQztvQkFDN0IsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCVDtpQkFDRjs4QkFFVSxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDSSxrQkFBa0I7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWVsZERlc2NyaXB0aW9uLCBQcm9wZXJ0aWVzIH0gZnJvbSAnQGR5bmFtaWMtZmllbGQta2l0L2NvcmUnO1xuaW1wb3J0IHsgRHluYW1pY0lucHV0IH0gZnJvbSAnLi9EeW5hbWljSW5wdXQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZmstZmllbGQtaW5wdXQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbTmdJZiwgRHluYW1pY0lucHV0XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGZrLWR5bmFtaWMtaW5wdXRcbiAgICAgICpuZ0lmPVwiZmllbGREZXNjcmlwdGlvbiAmJiByZW5kZXJJbmZvc1wiXG4gICAgICBbdHlwZV09XCJmaWVsZERlc2NyaXB0aW9uIS50eXBlXCJcbiAgICAgIFt2YWx1ZV09XCJnZXRGaWVsZFZhbHVlKClcIlxuICAgICAgW2xhYmVsXT1cImZpZWxkRGVzY3JpcHRpb24hLmxhYmVsXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZERlc2NyaXB0aW9uIS5wbGFjZWhvbGRlclwiXG4gICAgICBbcmVxdWlyZWRdPVwiZmllbGREZXNjcmlwdGlvbiEucmVxdWlyZWRcIlxuICAgICAgW2Rlc2NyaXB0aW9uXT1cImZpZWxkRGVzY3JpcHRpb24hLmRlc2NyaXB0aW9uXCJcbiAgICAgIFtvcHRpb25zXT1cImZpZWxkRGVzY3JpcHRpb24hLm9wdGlvbnNcIlxuICAgICAgW2NsYXNzTmFtZV09XCJmaWVsZERlc2NyaXB0aW9uIS5jbGFzc05hbWVcIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cIlxuICAgICAgICBvblZhbHVlQ2hhbmdlRmllbGQuZW1pdCh7IHZhbHVlOiAkZXZlbnQsIGtleTogZmllbGREZXNjcmlwdGlvbiEubmFtZSB9KVxuICAgICAgXCJcbiAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiXG4gICAgICBbZXJyb3JNZXNzYWdlXT1cIicnXCJcbiAgICA+PC9kZmstZHluYW1pYy1pbnB1dD5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgRmllbGRJbnB1dCB7XG4gIEBJbnB1dCgpIGZpZWxkRGVzY3JpcHRpb24/OiBGaWVsZERlc2NyaXB0aW9uO1xuICBASW5wdXQoKSByZW5kZXJJbmZvcz86IFByb3BlcnRpZXM7XG4gIEBPdXRwdXQoKSBvblZhbHVlQ2hhbmdlRmllbGQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICB2YWx1ZTogYW55O1xuICAgIGtleTogc3RyaW5nO1xuICB9PigpO1xuXG4gIGdldEZpZWxkVmFsdWUoKSB7XG4gICAgaWYgKCF0aGlzLmZpZWxkRGVzY3JpcHRpb24gfHwgIXRoaXMucmVuZGVySW5mb3MpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlbmRlckluZm9zW3RoaXMuZmllbGREZXNjcmlwdGlvbi5uYW1lXTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmZpZWxkRGVzY3JpcHRpb24udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4iXX0=
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGRJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0ZpZWxkSW5wdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUE0QjlDLE1BQU0sT0FBTyxVQUFVO0lBMkJEO0lBMUJYLGdCQUFnQixDQUFvQjtJQUNwQyxLQUFLLENBQVc7SUFDaEIsT0FBTyxDQUE2QjtJQUNwQyxRQUFRLENBQVc7SUFDbkIsUUFBUSxDQUFXO0lBQ25CLEtBQUssQ0FBcUI7SUFDekIsa0JBQWtCLEdBQUcsSUFBSSxZQUFZLEVBRzNDLENBQUM7SUFFTCxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXJCLElBQUksZUFBZTtRQUNqQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdEIsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDcEMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3hELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7SUFDdkMsQ0FBQztJQUVELFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO0lBQUcsQ0FBQztJQUU5QyxXQUFXLENBQUMsUUFBdUI7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzVDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQzt3R0FoQ1UsVUFBVTs0RkFBVixVQUFVLHlTQXJCWDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CVCw0REFyQlMsSUFBSSw2RkFBRSxZQUFZOzs0RkF1QmpCLFVBQVU7a0JBMUJ0QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDO29CQUM3QixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJUO2lCQUNGO3NGQUVVLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0ksa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmllbGREZXNjcmlwdGlvbiB9IGZyb20gJ0BkeW5hbWljLWZpZWxkLWtpdC9jb3JlJztcbmltcG9ydCB7IER5bmFtaWNJbnB1dCB9IGZyb20gJy4vRHluYW1pY0lucHV0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGZrLWZpZWxkLWlucHV0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nSWYsIER5bmFtaWNJbnB1dF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkZmstZHluYW1pYy1pbnB1dFxuICAgICAgKm5nSWY9XCJzaG91bGRSZW5kZXJcIlxuICAgICAgW3R5cGVdPVwiZmllbGREZXNjcmlwdGlvbiEudHlwZVwiXG4gICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgW2xhYmVsXT1cImZpZWxkRGVzY3JpcHRpb24hLmxhYmVsXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZERlc2NyaXB0aW9uIS5wbGFjZWhvbGRlclwiXG4gICAgICBbcmVxdWlyZWRdPVwiZmllbGREZXNjcmlwdGlvbiEucmVxdWlyZWRcIlxuICAgICAgW2Rlc2NyaXB0aW9uXT1cIiRhbnkoZmllbGREZXNjcmlwdGlvbiEuZGVzY3JpcHRpb24pXCJcbiAgICAgIFtvcHRpb25zXT1cInJlc29sdmVkT3B0aW9uc1wiXG4gICAgICBbY2xhc3NOYW1lXT1cImZpZWxkRGVzY3JpcHRpb24hLmNsYXNzTmFtZVwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwiXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VGaWVsZC5lbWl0KHsgdmFsdWU6ICRldmVudCwga2V5OiBmaWVsZERlc2NyaXB0aW9uIS5uYW1lIH0pXG4gICAgICBcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtyZWFkT25seV09XCJyZWFkT25seVwiXG4gICAgICBbZXJyb3JdPVwiJGFueShlcnJvcilcIlxuICAgICAgW2V4dHJhUHJvcHNdPVwiZmllbGREZXNjcmlwdGlvbiEucHJvcHNcIlxuICAgID48L2Rmay1keW5hbWljLWlucHV0PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBGaWVsZElucHV0IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZmllbGREZXNjcmlwdGlvbj86IEZpZWxkRGVzY3JpcHRpb247XG4gIEBJbnB1dCgpIHZhbHVlPzogdW5rbm93bjtcbiAgQElucHV0KCkgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gIEBJbnB1dCgpIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgQElucHV0KCkgcmVhZE9ubHk/OiBib29sZWFuO1xuICBASW5wdXQoKSBlcnJvcj86IHN0cmluZyB8IHN0cmluZ1tdO1xuICBAT3V0cHV0KCkgb25WYWx1ZUNoYW5nZUZpZWxkID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgdmFsdWU6IHVua25vd247XG4gICAga2V5OiBzdHJpbmc7XG4gIH0+KCk7XG5cbiAgc2hvdWxkUmVuZGVyID0gZmFsc2U7XG5cbiAgZ2V0IHJlc29sdmVkT3B0aW9ucygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5vcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZmllbGREZXNjcmlwdGlvbj8ub3B0aW9ucykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLmZpZWxkRGVzY3JpcHRpb24ub3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmllbGREZXNjcmlwdGlvbi5vcHRpb25zO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25DaGFuZ2VzKF9jaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgdGhpcy5zaG91bGRSZW5kZXIgPSAhIXRoaXMuZmllbGREZXNjcmlwdGlvbjtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIl19