asksuite-citrus 0.5.3 → 0.5.4

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.
@@ -7,15 +7,26 @@ import * as i0 from "@angular/core";
7
7
  import * as i1 from "@angular/forms";
8
8
  import * as i2 from "@angular/cdk/overlay";
9
9
  import * as i3 from "@angular/common";
10
- import * as i4 from "@angular/cdk/scrolling";
11
- import * as i5 from "../chips/chips.component";
12
- import * as i6 from "../checkbox/checkbox.component";
10
+ import * as i4 from "../chips/chips.component";
11
+ import * as i5 from "../checkbox/checkbox.component";
12
+ import * as i6 from "@ngx-translate/core";
13
13
  const valueAccessor = {
14
14
  provide: NG_VALUE_ACCESSOR,
15
15
  multi: true,
16
16
  useExisting: forwardRef(() => AutocompleteComponent),
17
17
  };
18
18
  export class AutocompleteComponent {
19
+ set listViewport(value) {
20
+ if (value) {
21
+ const listEl = value.nativeElement;
22
+ const scrollThreshold = 50;
23
+ listEl.addEventListener('scroll', (event) => {
24
+ if ((listEl.scrollHeight - listEl.scrollTop - listEl.clientHeight) <= scrollThreshold) {
25
+ this.getMoreItems();
26
+ }
27
+ });
28
+ }
29
+ }
19
30
  constructor(formBuilder, overlay, viewContainerRef, change) {
20
31
  this.formBuilder = formBuilder;
21
32
  this.overlay = overlay;
@@ -24,10 +35,22 @@ export class AutocompleteComponent {
24
35
  this.inputControl = new FormControl("");
25
36
  this.filteredOptions = [];
26
37
  this.paginatedFilteredOptions = [];
38
+ this.selection = [];
27
39
  this.closed = true;
28
40
  this.chipsCollapsed = true;
29
41
  this.checkAllValue = false;
30
42
  this.disabled = false;
43
+ this.showChips = false;
44
+ this.showAllSelectionBtn = false;
45
+ this.showPlaceholder = false;
46
+ this.showExpandedSelectionActions = false;
47
+ this.showSelectAllCheckbox = false;
48
+ this.chipsContainerClasses = {
49
+ "-two": false,
50
+ "-three": false,
51
+ "-four": false,
52
+ "-many": false
53
+ };
31
54
  this._destroy = inject(DestroyRef);
32
55
  this.ITEMS_PER_PAGE = 40;
33
56
  this._pageNumber = 1;
@@ -36,37 +59,59 @@ export class AutocompleteComponent {
36
59
  this.valueProp = '';
37
60
  this.options = [];
38
61
  this.placeholder = '';
39
- this.emptyMessage = 'Nenhuma opção';
62
+ this.emptyMessage = 'NO_OPTIONS';
40
63
  this.selectAll = false;
41
64
  this.onChange = (_) => { };
42
65
  this.onTouched = () => { };
43
66
  this.selectionForm = formBuilder.group({});
44
67
  }
45
68
  ngAfterViewInit() {
69
+ this.checkAllValue = Object.keys(this.selectionForm.value).length === this.options.length
70
+ && this.options.every(value => this.selectionForm.value[value[this.valueProp]]);
46
71
  this.handleInputChange();
47
- this.handleSelectionChange();
48
- this.checkAllValue = this.selectAll;
72
+ this.listenSelectionChange();
49
73
  }
50
74
  handleInputChange() {
51
- this.inputControl.valueChanges.pipe(takeUntilDestroyed(this._destroy), startWith(''), tap(() => {
75
+ this.inputControl.valueChanges.pipe(takeUntilDestroyed(this._destroy), debounceTime(300), startWith(''), tap(() => {
52
76
  this._pageNumber = 1;
53
77
  this._reachedEnd = false;
54
78
  this.paginatedFilteredOptions = [];
55
79
  }), map(value => this.filterFn ? this.filterFn(value || '') : [])).subscribe(items => {
56
80
  this.filteredOptions = items;
57
- this.getMoreItems(0);
81
+ this.getMoreItems();
58
82
  });
59
83
  }
60
- handleSelectionChange() {
84
+ listenSelectionChange() {
85
+ if (Object.keys(this.selectionForm.value).length) {
86
+ this.selection = this.options.filter(option => this.selectionForm.value[option[this.valueProp]]);
87
+ this.updateValidation();
88
+ this.change.detectChanges();
89
+ }
61
90
  this.selectionForm
62
91
  .valueChanges
63
- .pipe(takeUntilDestroyed(this._destroy), debounceTime(100))
92
+ .pipe(takeUntilDestroyed(this._destroy))
64
93
  .subscribe((values) => {
65
94
  this.checkAllValue = Object.keys(values).every(value => values[value]);
66
- this.onChange(this.options.filter(option => values[option[this.valueProp]]));
95
+ this.handleSelectionChange(values);
96
+ this.onChange(this.selection);
67
97
  this.onTouched();
68
98
  });
69
99
  }
100
+ handleSelectionChange(values) {
101
+ this.selection = this.options.filter(option => values[option[this.valueProp]]);
102
+ if (!this.chipsCollapsed) {
103
+ this.chipsCollapsed = this.selection.length < 2;
104
+ }
105
+ this.updateValidation();
106
+ }
107
+ updateChipsContainerClasses() {
108
+ this.chipsContainerClasses = {
109
+ "-two": this.selectedOptions.length === 2,
110
+ "-three": this.selectedOptions.length === 3,
111
+ "-four": this.selectedOptions.length === 4,
112
+ "-many": this.selectedOptions.length >= 5
113
+ };
114
+ }
70
115
  handleOptionSelected(item) {
71
116
  this.selectedOption = item;
72
117
  this.onChange(this.selectedOption);
@@ -74,9 +119,21 @@ export class AutocompleteComponent {
74
119
  this.change.detectChanges();
75
120
  }
76
121
  handleAutocompleteClick() {
77
- this.closed
78
- ? this.showOptions()
79
- : this.hideOptions();
122
+ if (!this.disabled) {
123
+ this.chipsCollapsed = true;
124
+ this.closed
125
+ ? this.showOptions()
126
+ : this.hideOptions();
127
+ }
128
+ this.updateValidation();
129
+ this.updateChipsContainerClasses();
130
+ this.change.detectChanges();
131
+ }
132
+ handleChipsListActionClick() {
133
+ this.chipsCollapsed = !this.chipsCollapsed;
134
+ this.updateValidation();
135
+ this.updateChipsContainerClasses();
136
+ this.change.detectChanges();
80
137
  }
81
138
  showOptions() {
82
139
  this.closed = false;
@@ -85,6 +142,9 @@ export class AutocompleteComponent {
85
142
  this._portal = new TemplatePortal(this.overlayContent, this.viewContainerRef);
86
143
  }
87
144
  this._overlayRef?.attach(this._portal);
145
+ this.updateValidation();
146
+ if (this.paginatedFilteredOptions.length === 0)
147
+ this.getMoreItems();
88
148
  }
89
149
  getOverlayConfig(wrapper) {
90
150
  return this.overlay.create({
@@ -104,33 +164,34 @@ export class AutocompleteComponent {
104
164
  this.chipsCollapsed = true;
105
165
  this._overlayRef?.detach();
106
166
  this.change.detectChanges();
167
+ this._pageNumber = 1;
168
+ this.paginatedFilteredOptions = [];
169
+ this.updateValidation();
170
+ this.change.detectChanges();
107
171
  }
108
172
  handleClick(event) {
109
173
  if (!this.closed
110
174
  && !this.input?.nativeElement.contains(event.target)
111
175
  && !this.list?.nativeElement.contains(event.target)) {
112
176
  this.hideOptions();
177
+ this.updateValidation();
178
+ this.change.detectChanges();
113
179
  }
114
180
  }
115
181
  get selectedOptions() {
116
182
  if (!this.multiple)
117
183
  return this.selectedOption ? [this.selectedOption] : [];
118
- const selected = this.options
119
- .filter(item => this.selectionForm.value[item[this.valueProp]]);
120
184
  return this.chipsCollapsed
121
- ? selected.slice(0, 1)
122
- : selected;
185
+ ? this.selection.slice(0, 1)
186
+ : this.selection;
123
187
  }
124
- handleSelectAll(event) {
125
- const checked = event.target.checked;
188
+ handleSelectAll(checked) {
126
189
  this.selectAllOptions(checked);
190
+ this.updateValidation();
191
+ this.change.detectChanges();
127
192
  }
128
193
  selectAllOptions(selected) {
129
- this.options.forEach(option => {
130
- if (this.selectionForm.value[option[this.valueProp]] === undefined) {
131
- this.selectionForm.addControl(option[this.valueProp], this.formBuilder.control(selected), { emitEvent: false });
132
- }
133
- });
194
+ this.updateFormControls(this.options, this.selectionForm, this.formBuilder, this.valueProp, selected);
134
195
  const newValues = Object.keys(this.selectionForm.controls)
135
196
  .reduce((acc, curr) => {
136
197
  acc[curr] = selected;
@@ -138,7 +199,6 @@ export class AutocompleteComponent {
138
199
  }, {});
139
200
  this.selectionForm.patchValue(newValues);
140
201
  this.selectionForm.updateValueAndValidity();
141
- this.change.detectChanges();
142
202
  }
143
203
  handleChipAction(option) {
144
204
  if (this.multiple) {
@@ -147,43 +207,62 @@ export class AutocompleteComponent {
147
207
  else {
148
208
  this.selectedOption = null;
149
209
  }
210
+ this.updateChipsContainerClasses();
211
+ this.updateValidation();
212
+ this.change.detectChanges();
150
213
  }
151
214
  display(option) {
152
215
  return this.displayFn && this.displayFn(option);
153
216
  }
154
- getMoreItems(scrollIndex) {
155
- if (!this._reachedEnd && (!this.paginatedFilteredOptions.length
156
- || ((scrollIndex + 5) >= (this.ITEMS_PER_PAGE * (this._pageNumber - 1 || 1))))) {
157
- const nextPageItems = this.filteredOptions.slice(this.ITEMS_PER_PAGE * (this._pageNumber - 1), this.ITEMS_PER_PAGE * this._pageNumber);
158
- if (nextPageItems.length) {
159
- nextPageItems.forEach(item => {
160
- if (!this.selectionForm.value[item[this.valueProp]]) {
161
- this.selectionForm.addControl(item[this.valueProp], this.formBuilder.control(this.checkAllValue));
162
- }
163
- });
164
- this.paginatedFilteredOptions = [...this.paginatedFilteredOptions, ...nextPageItems];
165
- this._pageNumber += 1;
217
+ getMoreItems() {
218
+ const nextPageItems = this.filteredOptions.slice(this.ITEMS_PER_PAGE * (this._pageNumber - 1), this.ITEMS_PER_PAGE * this._pageNumber);
219
+ if (nextPageItems.length) {
220
+ this.updateFormControls(nextPageItems, this.selectionForm, this.formBuilder, this.valueProp, this.checkAllValue);
221
+ this.selectionForm.updateValueAndValidity();
222
+ this.paginatedFilteredOptions = [...this.paginatedFilteredOptions, ...nextPageItems];
223
+ this._pageNumber += 1;
224
+ }
225
+ else {
226
+ this._reachedEnd = true;
227
+ }
228
+ this.updateValidation();
229
+ this.change.detectChanges();
230
+ }
231
+ updateFormControls(items, form, fb, propValue, checked) {
232
+ items.forEach(item => {
233
+ if (form.value[item[propValue]] === undefined) {
234
+ form.addControl(item[propValue], fb.control(checked), { emitEvent: false });
166
235
  }
167
- else {
168
- this._reachedEnd = true;
236
+ else if (!form.value[item[propValue]]) {
237
+ form.get(item[propValue])?.setValue(checked, { emitEvent: false });
169
238
  }
170
- }
239
+ });
240
+ }
241
+ updateValidation() {
242
+ this.showChips = Boolean(this.selectedOptions.length) && this.closed;
243
+ this.showAllSelectionBtn = this.multiple && Boolean(this.selection.length > 1) && this.chipsCollapsed;
244
+ this.showPlaceholder = this.closed && !this.selectedOptions.length;
245
+ this.showExpandedSelectionActions = this.multiple && !this.chipsCollapsed;
246
+ this.showSelectAllCheckbox = Boolean(this.paginatedFilteredOptions.length) && this.selectAll;
171
247
  }
172
248
  // Control Value Accessor
173
249
  writeValue(obj) {
174
- if (!obj || (Array.isArray(obj) && !obj.length) && this.selectAll) {
250
+ this.selection = [];
251
+ if ((!obj || (Array.isArray(obj) && !obj.length)) && this.selectAll) {
175
252
  this.selectAllOptions(this.selectAll);
176
253
  return;
177
254
  }
178
255
  if (this.multiple && Array.isArray(obj)) {
179
- obj.forEach((item) => {
180
- this.selectionForm.addControl(item[this.valueProp], this.formBuilder.control(true), { emitEvent: false });
181
- });
256
+ this.selectionForm.reset({}, { emitEvent: false });
257
+ this.updateFormControls(obj, this.selectionForm, this.formBuilder, this.valueProp, true);
182
258
  this.selectionForm.updateValueAndValidity();
183
259
  }
184
260
  else {
185
261
  this.selectedOption = obj;
186
262
  }
263
+ if (this.multiple && !this.selection.length) {
264
+ this.handleSelectionChange(obj);
265
+ }
187
266
  this.change.detectChanges();
188
267
  }
189
268
  registerOnChange(fn) {
@@ -196,11 +275,11 @@ export class AutocompleteComponent {
196
275
  this.disabled = isDisabled;
197
276
  }
198
277
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: AutocompleteComponent, deps: [{ token: i1.FormBuilder }, { token: i2.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
199
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: AutocompleteComponent, selector: "ask-autocomplete", inputs: { filterFn: "filterFn", displayFn: "displayFn", multiple: "multiple", valueProp: "valueProp", options: "options", placeholder: "placeholder", emptyMessage: "emptyMessage", selectAll: "selectAll" }, host: { listeners: { "window:mousedown": "handleClick($event)" } }, providers: [valueAccessor], viewQueries: [{ propertyName: "input", first: true, predicate: ["autocomplete"], descendants: true }, { propertyName: "list", first: true, predicate: ["list"], descendants: true }, { propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true }, { propertyName: "overlayContent", first: true, predicate: ["overlayContent"], descendants: true }], ngImport: i0, template: "<div class=\"autocomplete-wrapper\"\n [class.-closed]=\"closed\"\n [class.-opened]=\"!closed\"\n #wrapper\n>\n <div class=\"autocomplete\" #autocomplete>\n <input class=\"search-field\"\n *ngIf=\"!closed; else selectionOrPlaceholder\"\n [formControl]=\"inputControl\"\n [placeholder]=\"placeholder\"/>\n <ng-template #selectionOrPlaceholder>\n <ng-container *ngIf=\"selectedOptions.length && closed\">\n <div class=\"chip-list\" [class.-collapsed]=\"chipsCollapsed\">\n <ask-chips [style.max-width]=\"chipsCollapsed ? '75%' : '100%'\"\n [showAction]=\"true\"\n *ngFor=\"let option of selectedOptions\"\n (action)=\"handleChipAction(option)\">\n {{display(option)}}\n </ask-chips>\n <span class=\"expand\" data-testid=\"see-more\" *ngIf=\"multiple\" (click)=\"chipsCollapsed = !chipsCollapsed\">\n {{chipsCollapsed ? 'Ver mais' : 'Ver menos'}}\n </span>\n </div>\n </ng-container>\n <span data-testid=\"placeholder\" *ngIf=\"closed && !selectedOptions.length\">{{placeholder}}</span>\n </ng-template>\n <span class=\"btn-expand material-icons\"\n data-testid=\"btn-expand\"\n [class.-disabled]=\"disabled\"\n (click)=\"!disabled && handleAutocompleteClick()\">{{closed ? \"expand_more\" : \"expand_less\"}}</span>\n </div>\n</div>\n\n<ng-template #overlayContent>\n <div #list class=\"menu-container\" [class.-multiple]=\"multiple\">\n <ng-container *ngIf=\"!multiple; else multipleSelection\">\n <cdk-virtual-scroll-viewport [itemSize]=\"36\" class=\"list\" (scrolledIndexChange)=\"getMoreItems($event)\">\n <ng-container *cdkVirtualFor=\"let option of paginatedFilteredOptions\">\n <div class=\"option-item\"\n [class.-highlighted]=\"selectedOption && selectedOption[valueProp] === option[valueProp]\"\n (click)=\"handleOptionSelected(option)\">\n <p class=\"text\">{{display(option)}}</p>\n </div>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n </ng-container>\n <ng-template #multipleSelection>\n <div class=\"option-item\" *ngIf=\"paginatedFilteredOptions.length && selectAll\">\n <ask-checkbox (change)=\"handleSelectAll($event)\" [(ngModel)]=\"checkAllValue\">Selecionar todas</ask-checkbox>\n </div>\n <form data-testid=\"options-form\" *ngIf=\"selectionForm.controls\" [formGroup]=\"selectionForm\">\n <cdk-virtual-scroll-viewport [itemSize]=\"36\" class=\"list-box\" (scrolledIndexChange)=\"getMoreItems($event)\">\n <ng-container *cdkVirtualFor=\"let option of paginatedFilteredOptions\">\n <div class=\"option-item\">\n <ask-checkbox [formControlName]=\"option[valueProp]\">{{display(option)}}</ask-checkbox>\n </div>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n </form>\n </ng-template>\n <span class=\"empty\" *ngIf=\"!filteredOptions.length\">{{emptyMessage}}</span>\n </div>\n</ng-template>\n", styles: [":root{--asksuite-orange: #FF5724;--white: #FFF;--grey-50: #F5F7FA;--grey-100: #E4E7EB;--grey-200: #CBD2D9;--grey-300: #9AA5B1;--grey-400: #7B8794;--grey-500: #616E7C;--grey-600: #52606D;--grey-700: #3E4C59;--grey-800: #2A3042;--grey-900: #1F2933;--yellow-50: #FFF8E2;--yellow-200: #FFECB3;--success-green: #4BAF50;--warning-yellow: #FFC107;--error-red: #E8453E;--shadow: rgba(42, 48, 66, .1607843137);--lightblue-tag: #CDF9F3;--lavender-tag: #D4DAF3;--green-tag: #CEEEAA;--pink-tag: #FBC5FF;--orange-tag: #FED5C9;--purple-tag: #DDBFE5;--yellow-tag: #FFE0B2;--blue-tag: #B2E5FD;--brown-tag: #EFC89C;--whatsapp-green: #68B35D;--facebook-blue: #0084FF;--instagram-pink: #D53E91;--google-blue: #345DC8;--telegram-blue: #34AADF;--telephone-yellow: #FECB00;--primary-background: #FFF;--secondary-background: #EFF3F8;--hover-background: #F5F7FA;--divider-background: #E4E7EB;--font-color-100: #2A3042;--font-color-200: #616E7C;--font-color-300: #9AA5B1}:root{--font-default: $font-default;--font-code: $font-code}:root{--font-xs: $font-xs;--font-sm: $font-sm;--font-md: $font-md;--font-lg: $font-lg;--font-xl: $font-xl;--font-xxl: $font-xxl}:root{--font-weight-regular: $font-weight-regular;--font-weight-medium: $font-weight-medium}:root{--radii-px: $radii-px;--radii-xs: $radii-xs;--radii-sm: $radii-sm;--radii-md: $radii-md;--radii-lg: $radii-lg;--radii-full: $radii-full}.ellipsis,.option-item>.text,.option-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased}*{box-sizing:border-box}*,button,select,textarea{font-family:Inter,sans-serif;font-weight:400}input{font-size:1rem}.autocomplete-wrapper{position:relative;border:1px solid #CBD2D9;border-radius:4px;padding:16px}.autocomplete-wrapper>.autocomplete{display:flex;flex-direction:row;align-items:end;justify-content:space-between}.autocomplete-wrapper.-opened{border-bottom-right-radius:0;border-bottom-left-radius:0}.autocomplete-wrapper.-closed{transition:all ease-in-out .3s;min-height:54px}.search-field{font-style:inherit;width:100%;border:none;height:100%}.search-field:focus{border:none;outline:none}.search-field::placeholder{opacity:.6}.option-item{display:flex;flex-direction:row;align-items:center;padding-left:16px;height:36px;width:100%}.option-item.-highlighted{background-color:#e4e7eb}.option-item:hover{cursor:pointer;background-color:#f5f7fa}.chip-list{overflow:hidden;display:flex;align-items:center;flex-direction:row;flex-wrap:wrap;gap:.5rem;flex:1}.chip-list.-collapsed{height:26px}.chip-list>.expand{color:#616e7c;text-decoration:underline;font-size:12px}.chip-list>.expand:hover{cursor:pointer}.btn-expand:hover{cursor:pointer}.btn-expand.-disabled{color:#7b8794}.list-box,.menu-container>.list{min-height:148px}.menu-container{width:100%;background:white;max-height:165px;overflow-y:auto;border:1px solid #CBD2D9;border-bottom-right-radius:4px;border-bottom-left-radius:4px;border-top:none;padding:8px 0}.menu-container>.empty{text-align:center;display:inline-block;width:100%}.menu-container.-multiple{max-height:210px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i4.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i4.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i4.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i5.ChipsComponent, selector: "ask-chips", inputs: ["appearance", "showAction", "size"], outputs: ["action"] }, { kind: "component", type: i6.CheckboxComponent, selector: "ask-checkbox", inputs: ["value", "disabled"], outputs: ["valueChange", "change", "click", "focus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
278
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: AutocompleteComponent, selector: "ask-autocomplete", inputs: { filterFn: "filterFn", displayFn: "displayFn", multiple: "multiple", valueProp: "valueProp", options: "options", placeholder: "placeholder", emptyMessage: "emptyMessage", selectAll: "selectAll" }, host: { listeners: { "window:mousedown": "handleClick($event)" } }, providers: [valueAccessor], viewQueries: [{ propertyName: "input", first: true, predicate: ["autocomplete"], descendants: true }, { propertyName: "list", first: true, predicate: ["list"], descendants: true }, { propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true }, { propertyName: "overlayContent", first: true, predicate: ["overlayContent"], descendants: true }, { propertyName: "listViewport", first: true, predicate: ["listViewport"], descendants: true }], ngImport: i0, template: "<div class=\"autocomplete-wrapper\"\n [class.-closed]=\"closed\"\n [class.-opened]=\"!closed\"\n #wrapper\n>\n <div class=\"autocomplete\" #autocomplete>\n <input class=\"search-field\"\n *ngIf=\"!closed; else selectionOrPlaceholder\"\n [formControl]=\"inputControl\"\n [placeholder]=\"placeholder\"/>\n <ng-template #selectionOrPlaceholder>\n <ng-container *ngIf=\"showChips\">\n <div class=\"chip-list\" [class.-collapsed]=\"chipsCollapsed\"\n [ngClass]=\"chipsContainerClasses\">\n <ask-chips [style.max-width]=\"chipsCollapsed ? '85%' : '100%'\"\n [showAction]=\"true\"\n *ngFor=\"let option of selectedOptions\"\n (action)=\"handleChipAction(option)\">\n {{display(option)}}\n </ask-chips>\n <span class=\"expand\" data-testid=\"see-more\" *ngIf=\"showAllSelectionBtn\"\n (click)=\"handleChipsListActionClick()\">\n +{{selection.length - 1}}\n </span>\n </div>\n </ng-container>\n <span class=\"empty-placeholder\" data-testid=\"placeholder\" *ngIf=\"closed && !selectedOptions.length\"\n (click)=\"handleAutocompleteClick()\">{{placeholder}}</span>\n </ng-template>\n <span class=\"btn-expand material-icons\"\n data-testid=\"btn-expand\"\n [class.-disabled]=\"disabled\"\n (click)=\"handleAutocompleteClick()\"\n *ngIf=\"chipsCollapsed\">\n {{closed ? \"expand_more\" : \"expand_less\"}}\n </span>\n </div>\n <div class=\"actions\" *ngIf=\"showExpandedSelectionActions\">\n <span class=\"see-more\" data-testid=\"see-less\"\n (click)=\"handleChipsListActionClick()\">\n {{'SEE_LESS' | translate}}\n </span>\n <span class=\"btn-expand material-icons\"\n data-testid=\"btn-expand\"\n [class.-disabled]=\"disabled\"\n (click)=\"handleAutocompleteClick()\">\n {{closed ? \"expand_more\" : \"expand_less\"}}\n </span>\n </div>\n</div>\n\n<ng-template #overlayContent>\n <div #list class=\"menu-container\" [class.-multiple]=\"multiple\">\n <ng-container *ngIf=\"!multiple; else multipleSelection\">\n <div class=\"list\" #listViewport>\n <ng-container *ngFor=\"let option of paginatedFilteredOptions\">\n <div class=\"option-item\"\n [class.-highlighted]=\"selectedOption && selectedOption[valueProp] === option[valueProp]\"\n (click)=\"handleOptionSelected(option)\">\n <p class=\"text\">{{display(option)}}</p>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #multipleSelection>\n <div class=\"option-item\" *ngIf=\"showSelectAllCheckbox\">\n <ask-checkbox (valueChange)=\"handleSelectAll($event)\" [(ngModel)]=\"checkAllValue\">Selecionar todas</ask-checkbox>\n </div>\n <form data-testid=\"options-form\" *ngIf=\"selectionForm.controls\" [formGroup]=\"selectionForm\">\n <div class=\"list-box\" #listViewport>\n <ng-container *ngFor=\"let option of paginatedFilteredOptions\">\n <div class=\"option-item\">\n <ask-checkbox [formControlName]=\"option[valueProp]\">{{display(option)}}</ask-checkbox>\n </div>\n </ng-container>\n </div>\n </form>\n </ng-template>\n <span class=\"empty\" *ngIf=\"!filteredOptions.length\">{{emptyMessage | translate}}</span>\n </div>\n</ng-template>\n", styles: [":root{--asksuite-orange: #FF5724;--white: #FFF;--grey-50: #F5F7FA;--grey-100: #E4E7EB;--grey-200: #CBD2D9;--grey-300: #9AA5B1;--grey-400: #7B8794;--grey-500: #616E7C;--grey-600: #52606D;--grey-700: #3E4C59;--grey-800: #2A3042;--grey-900: #1F2933;--yellow-50: #FFF8E2;--yellow-200: #FFECB3;--success-green: #4BAF50;--warning-yellow: #FFC107;--error-red: #E8453E;--shadow: rgba(42, 48, 66, .1607843137);--lightblue-tag: #CDF9F3;--lavender-tag: #D4DAF3;--green-tag: #CEEEAA;--pink-tag: #FBC5FF;--orange-tag: #FED5C9;--purple-tag: #DDBFE5;--yellow-tag: #FFE0B2;--blue-tag: #B2E5FD;--brown-tag: #EFC89C;--whatsapp-green: #68B35D;--facebook-blue: #0084FF;--instagram-pink: #D53E91;--google-blue: #345DC8;--telegram-blue: #34AADF;--telephone-yellow: #FECB00;--primary-background: #FFF;--secondary-background: #EFF3F8;--hover-background: #F5F7FA;--divider-background: #E4E7EB;--font-color-100: #2A3042;--font-color-200: #616E7C;--font-color-300: #9AA5B1}:root{--font-default: $font-default;--font-code: $font-code}:root{--font-xs: $font-xs;--font-sm: $font-sm;--font-md: $font-md;--font-lg: $font-lg;--font-xl: $font-xl;--font-xxl: $font-xxl}:root{--font-weight-regular: $font-weight-regular;--font-weight-medium: $font-weight-medium}:root{--radii-px: $radii-px;--radii-xs: $radii-xs;--radii-sm: $radii-sm;--radii-md: $radii-md;--radii-lg: $radii-lg;--radii-full: $radii-full}.ellipsis,.option-item>.text,.option-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased}*{box-sizing:border-box}*,button,select,textarea{font-family:Inter,sans-serif;font-weight:400}input{font-size:1rem}.autocomplete-wrapper{position:relative;border:1px solid #CBD2D9;border-radius:4px;padding:16px}.autocomplete-wrapper>.autocomplete{display:flex;flex-direction:row;align-items:flex-end;justify-content:space-between}.autocomplete-wrapper>.actions{width:100%;display:flex;flex-direction:row;justify-content:space-between;align-items:center}.autocomplete-wrapper.-opened{border-bottom-right-radius:0;border-bottom-left-radius:0}.autocomplete-wrapper.-closed{transition:all ease-in-out .3s;min-height:54px}.search-field{font-style:inherit;width:100%;border:none;height:100%}.search-field:focus{border:none;outline:none}.search-field::placeholder{opacity:.6}.option-item{display:flex;flex-direction:row;align-items:center;padding-left:1rem;height:36px;width:100%}.option-item.-highlighted{background-color:#e4e7eb}.option-item:hover{cursor:pointer;background-color:#f5f7fa}.see-more,.chip-list>.expand{color:#616e7c;text-decoration:underline;font-size:.875rem;font-weight:500}.see-more:hover,.chip-list>.expand:hover{cursor:pointer}.chip-list{display:flex;align-items:center;flex-direction:row;flex-wrap:wrap;gap:.5rem;flex:1;max-height:155px;transition:all ease-in-out .3s}.chip-list.-collapsed{height:31px;overflow:hidden;transition:none}.chip-list.-two{height:62px}.chip-list.-three{height:93px}.chip-list.-four{height:124px}.chip-list.-many{overflow-y:auto;height:155px}.btn-expand:hover{cursor:pointer}.btn-expand.-disabled{color:#7b8794}.empty-placeholder:hover{cursor:pointer}.list-box,.menu-container>.list{min-height:1rem;overflow-y:auto}.menu-container{width:100%;background:white;max-height:165px;overflow-y:auto;border:1px solid #CBD2D9;border-bottom-right-radius:4px;border-bottom-left-radius:4px;border-top:none;padding:8px 0}.menu-container>.empty{text-align:center;display:inline-block;width:100%}.menu-container.-multiple{max-height:210px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.ChipsComponent, selector: "ask-chips", inputs: ["appearance", "showAction", "size"], outputs: ["action"] }, { kind: "component", type: i5.CheckboxComponent, selector: "ask-checkbox", inputs: ["value", "disabled"], outputs: ["valueChange", "change", "click", "focus"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
200
279
  }
201
280
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: AutocompleteComponent, decorators: [{
202
281
  type: Component,
203
- args: [{ selector: 'ask-autocomplete', providers: [valueAccessor], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"autocomplete-wrapper\"\n [class.-closed]=\"closed\"\n [class.-opened]=\"!closed\"\n #wrapper\n>\n <div class=\"autocomplete\" #autocomplete>\n <input class=\"search-field\"\n *ngIf=\"!closed; else selectionOrPlaceholder\"\n [formControl]=\"inputControl\"\n [placeholder]=\"placeholder\"/>\n <ng-template #selectionOrPlaceholder>\n <ng-container *ngIf=\"selectedOptions.length && closed\">\n <div class=\"chip-list\" [class.-collapsed]=\"chipsCollapsed\">\n <ask-chips [style.max-width]=\"chipsCollapsed ? '75%' : '100%'\"\n [showAction]=\"true\"\n *ngFor=\"let option of selectedOptions\"\n (action)=\"handleChipAction(option)\">\n {{display(option)}}\n </ask-chips>\n <span class=\"expand\" data-testid=\"see-more\" *ngIf=\"multiple\" (click)=\"chipsCollapsed = !chipsCollapsed\">\n {{chipsCollapsed ? 'Ver mais' : 'Ver menos'}}\n </span>\n </div>\n </ng-container>\n <span data-testid=\"placeholder\" *ngIf=\"closed && !selectedOptions.length\">{{placeholder}}</span>\n </ng-template>\n <span class=\"btn-expand material-icons\"\n data-testid=\"btn-expand\"\n [class.-disabled]=\"disabled\"\n (click)=\"!disabled && handleAutocompleteClick()\">{{closed ? \"expand_more\" : \"expand_less\"}}</span>\n </div>\n</div>\n\n<ng-template #overlayContent>\n <div #list class=\"menu-container\" [class.-multiple]=\"multiple\">\n <ng-container *ngIf=\"!multiple; else multipleSelection\">\n <cdk-virtual-scroll-viewport [itemSize]=\"36\" class=\"list\" (scrolledIndexChange)=\"getMoreItems($event)\">\n <ng-container *cdkVirtualFor=\"let option of paginatedFilteredOptions\">\n <div class=\"option-item\"\n [class.-highlighted]=\"selectedOption && selectedOption[valueProp] === option[valueProp]\"\n (click)=\"handleOptionSelected(option)\">\n <p class=\"text\">{{display(option)}}</p>\n </div>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n </ng-container>\n <ng-template #multipleSelection>\n <div class=\"option-item\" *ngIf=\"paginatedFilteredOptions.length && selectAll\">\n <ask-checkbox (change)=\"handleSelectAll($event)\" [(ngModel)]=\"checkAllValue\">Selecionar todas</ask-checkbox>\n </div>\n <form data-testid=\"options-form\" *ngIf=\"selectionForm.controls\" [formGroup]=\"selectionForm\">\n <cdk-virtual-scroll-viewport [itemSize]=\"36\" class=\"list-box\" (scrolledIndexChange)=\"getMoreItems($event)\">\n <ng-container *cdkVirtualFor=\"let option of paginatedFilteredOptions\">\n <div class=\"option-item\">\n <ask-checkbox [formControlName]=\"option[valueProp]\">{{display(option)}}</ask-checkbox>\n </div>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n </form>\n </ng-template>\n <span class=\"empty\" *ngIf=\"!filteredOptions.length\">{{emptyMessage}}</span>\n </div>\n</ng-template>\n", styles: [":root{--asksuite-orange: #FF5724;--white: #FFF;--grey-50: #F5F7FA;--grey-100: #E4E7EB;--grey-200: #CBD2D9;--grey-300: #9AA5B1;--grey-400: #7B8794;--grey-500: #616E7C;--grey-600: #52606D;--grey-700: #3E4C59;--grey-800: #2A3042;--grey-900: #1F2933;--yellow-50: #FFF8E2;--yellow-200: #FFECB3;--success-green: #4BAF50;--warning-yellow: #FFC107;--error-red: #E8453E;--shadow: rgba(42, 48, 66, .1607843137);--lightblue-tag: #CDF9F3;--lavender-tag: #D4DAF3;--green-tag: #CEEEAA;--pink-tag: #FBC5FF;--orange-tag: #FED5C9;--purple-tag: #DDBFE5;--yellow-tag: #FFE0B2;--blue-tag: #B2E5FD;--brown-tag: #EFC89C;--whatsapp-green: #68B35D;--facebook-blue: #0084FF;--instagram-pink: #D53E91;--google-blue: #345DC8;--telegram-blue: #34AADF;--telephone-yellow: #FECB00;--primary-background: #FFF;--secondary-background: #EFF3F8;--hover-background: #F5F7FA;--divider-background: #E4E7EB;--font-color-100: #2A3042;--font-color-200: #616E7C;--font-color-300: #9AA5B1}:root{--font-default: $font-default;--font-code: $font-code}:root{--font-xs: $font-xs;--font-sm: $font-sm;--font-md: $font-md;--font-lg: $font-lg;--font-xl: $font-xl;--font-xxl: $font-xxl}:root{--font-weight-regular: $font-weight-regular;--font-weight-medium: $font-weight-medium}:root{--radii-px: $radii-px;--radii-xs: $radii-xs;--radii-sm: $radii-sm;--radii-md: $radii-md;--radii-lg: $radii-lg;--radii-full: $radii-full}.ellipsis,.option-item>.text,.option-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased}*{box-sizing:border-box}*,button,select,textarea{font-family:Inter,sans-serif;font-weight:400}input{font-size:1rem}.autocomplete-wrapper{position:relative;border:1px solid #CBD2D9;border-radius:4px;padding:16px}.autocomplete-wrapper>.autocomplete{display:flex;flex-direction:row;align-items:end;justify-content:space-between}.autocomplete-wrapper.-opened{border-bottom-right-radius:0;border-bottom-left-radius:0}.autocomplete-wrapper.-closed{transition:all ease-in-out .3s;min-height:54px}.search-field{font-style:inherit;width:100%;border:none;height:100%}.search-field:focus{border:none;outline:none}.search-field::placeholder{opacity:.6}.option-item{display:flex;flex-direction:row;align-items:center;padding-left:16px;height:36px;width:100%}.option-item.-highlighted{background-color:#e4e7eb}.option-item:hover{cursor:pointer;background-color:#f5f7fa}.chip-list{overflow:hidden;display:flex;align-items:center;flex-direction:row;flex-wrap:wrap;gap:.5rem;flex:1}.chip-list.-collapsed{height:26px}.chip-list>.expand{color:#616e7c;text-decoration:underline;font-size:12px}.chip-list>.expand:hover{cursor:pointer}.btn-expand:hover{cursor:pointer}.btn-expand.-disabled{color:#7b8794}.list-box,.menu-container>.list{min-height:148px}.menu-container{width:100%;background:white;max-height:165px;overflow-y:auto;border:1px solid #CBD2D9;border-bottom-right-radius:4px;border-bottom-left-radius:4px;border-top:none;padding:8px 0}.menu-container>.empty{text-align:center;display:inline-block;width:100%}.menu-container.-multiple{max-height:210px}\n"] }]
282
+ args: [{ selector: 'ask-autocomplete', providers: [valueAccessor], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"autocomplete-wrapper\"\n [class.-closed]=\"closed\"\n [class.-opened]=\"!closed\"\n #wrapper\n>\n <div class=\"autocomplete\" #autocomplete>\n <input class=\"search-field\"\n *ngIf=\"!closed; else selectionOrPlaceholder\"\n [formControl]=\"inputControl\"\n [placeholder]=\"placeholder\"/>\n <ng-template #selectionOrPlaceholder>\n <ng-container *ngIf=\"showChips\">\n <div class=\"chip-list\" [class.-collapsed]=\"chipsCollapsed\"\n [ngClass]=\"chipsContainerClasses\">\n <ask-chips [style.max-width]=\"chipsCollapsed ? '85%' : '100%'\"\n [showAction]=\"true\"\n *ngFor=\"let option of selectedOptions\"\n (action)=\"handleChipAction(option)\">\n {{display(option)}}\n </ask-chips>\n <span class=\"expand\" data-testid=\"see-more\" *ngIf=\"showAllSelectionBtn\"\n (click)=\"handleChipsListActionClick()\">\n +{{selection.length - 1}}\n </span>\n </div>\n </ng-container>\n <span class=\"empty-placeholder\" data-testid=\"placeholder\" *ngIf=\"closed && !selectedOptions.length\"\n (click)=\"handleAutocompleteClick()\">{{placeholder}}</span>\n </ng-template>\n <span class=\"btn-expand material-icons\"\n data-testid=\"btn-expand\"\n [class.-disabled]=\"disabled\"\n (click)=\"handleAutocompleteClick()\"\n *ngIf=\"chipsCollapsed\">\n {{closed ? \"expand_more\" : \"expand_less\"}}\n </span>\n </div>\n <div class=\"actions\" *ngIf=\"showExpandedSelectionActions\">\n <span class=\"see-more\" data-testid=\"see-less\"\n (click)=\"handleChipsListActionClick()\">\n {{'SEE_LESS' | translate}}\n </span>\n <span class=\"btn-expand material-icons\"\n data-testid=\"btn-expand\"\n [class.-disabled]=\"disabled\"\n (click)=\"handleAutocompleteClick()\">\n {{closed ? \"expand_more\" : \"expand_less\"}}\n </span>\n </div>\n</div>\n\n<ng-template #overlayContent>\n <div #list class=\"menu-container\" [class.-multiple]=\"multiple\">\n <ng-container *ngIf=\"!multiple; else multipleSelection\">\n <div class=\"list\" #listViewport>\n <ng-container *ngFor=\"let option of paginatedFilteredOptions\">\n <div class=\"option-item\"\n [class.-highlighted]=\"selectedOption && selectedOption[valueProp] === option[valueProp]\"\n (click)=\"handleOptionSelected(option)\">\n <p class=\"text\">{{display(option)}}</p>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #multipleSelection>\n <div class=\"option-item\" *ngIf=\"showSelectAllCheckbox\">\n <ask-checkbox (valueChange)=\"handleSelectAll($event)\" [(ngModel)]=\"checkAllValue\">Selecionar todas</ask-checkbox>\n </div>\n <form data-testid=\"options-form\" *ngIf=\"selectionForm.controls\" [formGroup]=\"selectionForm\">\n <div class=\"list-box\" #listViewport>\n <ng-container *ngFor=\"let option of paginatedFilteredOptions\">\n <div class=\"option-item\">\n <ask-checkbox [formControlName]=\"option[valueProp]\">{{display(option)}}</ask-checkbox>\n </div>\n </ng-container>\n </div>\n </form>\n </ng-template>\n <span class=\"empty\" *ngIf=\"!filteredOptions.length\">{{emptyMessage | translate}}</span>\n </div>\n</ng-template>\n", styles: [":root{--asksuite-orange: #FF5724;--white: #FFF;--grey-50: #F5F7FA;--grey-100: #E4E7EB;--grey-200: #CBD2D9;--grey-300: #9AA5B1;--grey-400: #7B8794;--grey-500: #616E7C;--grey-600: #52606D;--grey-700: #3E4C59;--grey-800: #2A3042;--grey-900: #1F2933;--yellow-50: #FFF8E2;--yellow-200: #FFECB3;--success-green: #4BAF50;--warning-yellow: #FFC107;--error-red: #E8453E;--shadow: rgba(42, 48, 66, .1607843137);--lightblue-tag: #CDF9F3;--lavender-tag: #D4DAF3;--green-tag: #CEEEAA;--pink-tag: #FBC5FF;--orange-tag: #FED5C9;--purple-tag: #DDBFE5;--yellow-tag: #FFE0B2;--blue-tag: #B2E5FD;--brown-tag: #EFC89C;--whatsapp-green: #68B35D;--facebook-blue: #0084FF;--instagram-pink: #D53E91;--google-blue: #345DC8;--telegram-blue: #34AADF;--telephone-yellow: #FECB00;--primary-background: #FFF;--secondary-background: #EFF3F8;--hover-background: #F5F7FA;--divider-background: #E4E7EB;--font-color-100: #2A3042;--font-color-200: #616E7C;--font-color-300: #9AA5B1}:root{--font-default: $font-default;--font-code: $font-code}:root{--font-xs: $font-xs;--font-sm: $font-sm;--font-md: $font-md;--font-lg: $font-lg;--font-xl: $font-xl;--font-xxl: $font-xxl}:root{--font-weight-regular: $font-weight-regular;--font-weight-medium: $font-weight-medium}:root{--radii-px: $radii-px;--radii-xs: $radii-xs;--radii-sm: $radii-sm;--radii-md: $radii-md;--radii-lg: $radii-lg;--radii-full: $radii-full}.ellipsis,.option-item>.text,.option-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased}*{box-sizing:border-box}*,button,select,textarea{font-family:Inter,sans-serif;font-weight:400}input{font-size:1rem}.autocomplete-wrapper{position:relative;border:1px solid #CBD2D9;border-radius:4px;padding:16px}.autocomplete-wrapper>.autocomplete{display:flex;flex-direction:row;align-items:flex-end;justify-content:space-between}.autocomplete-wrapper>.actions{width:100%;display:flex;flex-direction:row;justify-content:space-between;align-items:center}.autocomplete-wrapper.-opened{border-bottom-right-radius:0;border-bottom-left-radius:0}.autocomplete-wrapper.-closed{transition:all ease-in-out .3s;min-height:54px}.search-field{font-style:inherit;width:100%;border:none;height:100%}.search-field:focus{border:none;outline:none}.search-field::placeholder{opacity:.6}.option-item{display:flex;flex-direction:row;align-items:center;padding-left:1rem;height:36px;width:100%}.option-item.-highlighted{background-color:#e4e7eb}.option-item:hover{cursor:pointer;background-color:#f5f7fa}.see-more,.chip-list>.expand{color:#616e7c;text-decoration:underline;font-size:.875rem;font-weight:500}.see-more:hover,.chip-list>.expand:hover{cursor:pointer}.chip-list{display:flex;align-items:center;flex-direction:row;flex-wrap:wrap;gap:.5rem;flex:1;max-height:155px;transition:all ease-in-out .3s}.chip-list.-collapsed{height:31px;overflow:hidden;transition:none}.chip-list.-two{height:62px}.chip-list.-three{height:93px}.chip-list.-four{height:124px}.chip-list.-many{overflow-y:auto;height:155px}.btn-expand:hover{cursor:pointer}.btn-expand.-disabled{color:#7b8794}.empty-placeholder:hover{cursor:pointer}.list-box,.menu-container>.list{min-height:1rem;overflow-y:auto}.menu-container{width:100%;background:white;max-height:165px;overflow-y:auto;border:1px solid #CBD2D9;border-bottom-right-radius:4px;border-bottom-left-radius:4px;border-top:none;padding:8px 0}.menu-container>.empty{text-align:center;display:inline-block;width:100%}.menu-container.-multiple{max-height:210px}\n"] }]
204
283
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { input: [{
205
284
  type: ViewChild,
206
285
  args: ["autocomplete"]
@@ -213,6 +292,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImpor
213
292
  }], overlayContent: [{
214
293
  type: ViewChild,
215
294
  args: ['overlayContent']
295
+ }], listViewport: [{
296
+ type: ViewChild,
297
+ args: ['listViewport']
216
298
  }], filterFn: [{
217
299
  type: Input
218
300
  }], displayFn: [{
@@ -233,4 +315,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImpor
233
315
  type: HostListener,
234
316
  args: ["window:mousedown", ['$event']]
235
317
  }] } });
236
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fza3N1aXRlLWNpdHJ1cy9zcmMvbGliL2NvbXBvbmVudHMvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc2tzdWl0ZS1jaXRydXMvc3JjL2xpYi9jb21wb25lbnRzL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUVWLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxTQUFTLEVBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFvQyxXQUFXLEVBQWEsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RyxPQUFPLEVBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXZELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7QUFFOUQsTUFBTSxhQUFhLEdBQWE7SUFDOUIsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixLQUFLLEVBQUUsSUFBSTtJQUNYLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUM7Q0FDckQsQ0FBQTtBQVNELE1BQU0sT0FBTyxxQkFBcUI7SUFnRGhDLFlBQW9CLFdBQXdCLEVBQ3hCLE9BQWdCLEVBQ2hCLGdCQUFrQyxFQUNsQyxNQUF5QjtRQUh6QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsV0FBTSxHQUFOLE1BQU0sQ0FBbUI7UUE1Q25DLGlCQUFZLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDbEMsb0JBQWUsR0FBVSxFQUFFLENBQUM7UUFDNUIsNkJBQXdCLEdBQVUsRUFBRSxDQUFDO1FBRXJDLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFFZCxtQkFBYyxHQUFHLElBQUksQ0FBQTtRQUNyQixrQkFBYSxHQUFHLEtBQUssQ0FBQTtRQUNyQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBSW5CLGFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDcEIsbUJBQWMsR0FBRyxFQUFFLENBQUE7UUFDNUIsZ0JBQVcsR0FBRyxDQUFDLENBQUE7UUFDZixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQVM1QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2pCLGNBQVMsR0FBVyxFQUFFLENBQUE7UUFHdEIsWUFBTyxHQUFVLEVBQUUsQ0FBQTtRQUduQixnQkFBVyxHQUFHLEVBQUUsQ0FBQTtRQUdoQixpQkFBWSxHQUFHLGVBQWUsQ0FBQztRQUcvQixjQUFTLEdBQUcsS0FBSyxDQUFBO1FBb01qQixhQUFRLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFFLENBQUMsQ0FBQTtRQU16QixjQUFTLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFBO1FBcE1sQixJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDNUMsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUU3QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDdEMsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQ2pDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDakMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUNiLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQTtZQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQTtZQUN4QixJQUFJLENBQUMsd0JBQXdCLEdBQUcsRUFBRSxDQUFBO1FBQ3BDLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDOUQsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUE7WUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN0QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsSUFBSSxDQUFDLGFBQWE7YUFDZixZQUFZO2FBQ1osSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDMUQsU0FBUyxDQUFDLENBQUMsTUFBZ0MsRUFBRSxFQUFFO1lBQzlDLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUN0RSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDNUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQ2xCLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELG9CQUFvQixDQUFDLElBQVM7UUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDbEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixJQUFJLENBQUMsTUFBTTtZQUNULENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDeEIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUV0RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFlLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7U0FDL0U7UUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE9BQW1CO1FBQzFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDekIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVztZQUN4QyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTtpQkFDdEMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztpQkFDMUMsYUFBYSxDQUFDLENBQUM7b0JBQ2QsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLE9BQU8sRUFBRSxRQUFRO29CQUNqQixRQUFRLEVBQUUsT0FBTztvQkFDakIsUUFBUSxFQUFFLEtBQUs7aUJBQ2hCLENBQUMsQ0FBQztTQUNOLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQTtRQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQzdCLENBQUM7SUFHRCxXQUFXLENBQUMsS0FBaUI7UUFDM0IsSUFDRSxDQUFDLElBQUksQ0FBQyxNQUFNO2VBQ1QsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztlQUNqRCxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDckQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1NBQ25CO0lBQ0gsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFM0UsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU87YUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFbkUsT0FBTyxJQUFJLENBQUMsY0FBYztZQUN4QixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDZixDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQVk7UUFDMUIsTUFBTSxPQUFPLEdBQXNCLEtBQUssQ0FBQyxNQUFPLENBQUMsT0FBTyxDQUFBO1FBRXhELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsUUFBaUI7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDNUIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUNsRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQ2xDLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUNuQixDQUFBO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7YUFDdkQsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3BCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUE7WUFDcEIsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsRUFBOEIsQ0FBQyxDQUFBO1FBRXBDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3hDLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxNQUFXO1FBQzFCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO1NBQ2hFO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztTQUM1QjtJQUVILENBQUM7SUFFRCxPQUFPLENBQUMsTUFBVztRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNqRCxDQUFDO0lBRUQsWUFBWSxDQUFDLFdBQW1CO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTTtlQUMxRCxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2hGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUM5QyxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFDNUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUMsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO2dCQUN4QixhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFO3dCQUNuRCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUM3QyxDQUFBO3FCQUNGO2dCQUNILENBQUMsQ0FBQyxDQUFBO2dCQUNGLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUM7Z0JBQ3JGLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFBO2FBQ3RCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO2FBQ3hCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQseUJBQXlCO0lBRXpCLFVBQVUsQ0FBQyxHQUFnQjtRQUN6QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2pFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDckMsT0FBTztTQUNSO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNuQixJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQzlCLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7WUFDdkIsQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLENBQUM7U0FDN0M7YUFBTTtZQUNMLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFBO1NBQzFCO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBSUQsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBSUQsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBbUI7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDN0IsQ0FBQzs4R0FoUVUscUJBQXFCO2tHQUFyQixxQkFBcUIsNlRBSHJCLENBQUMsYUFBYSxDQUFDLHdZQy9CNUIseWtHQStEQTs7MkZEN0JhLHFCQUFxQjtrQkFQakMsU0FBUzsrQkFDRSxrQkFBa0IsYUFHakIsQ0FBQyxhQUFhLENBQUMsbUJBQ1QsdUJBQXVCLENBQUMsTUFBTTt1TEFJcEIsS0FBSztzQkFBL0IsU0FBUzt1QkFBQyxjQUFjO2dCQUNOLElBQUk7c0JBQXRCLFNBQVM7dUJBQUMsTUFBTTtnQkFDSyxPQUFPO3NCQUE1QixTQUFTO3VCQUFDLFNBQVM7Z0JBQ1MsY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBb0IzQixRQUFRO3NCQURQLEtBQUs7Z0JBSU4sU0FBUztzQkFEUixLQUFLO2dCQUlOLFFBQVE7c0JBRFAsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBSU4sT0FBTztzQkFETixLQUFLO2dCQUlOLFdBQVc7c0JBRFYsS0FBSztnQkFJTixZQUFZO3NCQURYLEtBQUs7Z0JBSU4sU0FBUztzQkFEUixLQUFLO2dCQTJGTixXQUFXO3NCQURWLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBQcm92aWRlcixcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgbWFwLCBzdGFydFdpdGgsIHRhcH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7T3ZlcmxheSwgT3ZlcmxheVJlZn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9vdmVybGF5XCI7XG5pbXBvcnQge1RlbXBsYXRlUG9ydGFsfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3BvcnRhbFwiO1xuaW1wb3J0IHt0YWtlVW50aWxEZXN0cm95ZWR9IGZyb20gXCJAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcFwiO1xuXG5jb25zdCB2YWx1ZUFjY2Vzc29yOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIG11bHRpOiB0cnVlLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBdXRvY29tcGxldGVDb21wb25lbnQpLFxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhc2stYXV0b2NvbXBsZXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFt2YWx1ZUFjY2Vzc29yXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQXV0b2NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG4gIEBWaWV3Q2hpbGQoXCJhdXRvY29tcGxldGVcIikgaW5wdXQ6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWRcbiAgQFZpZXdDaGlsZChcImxpc3RcIikgbGlzdDogRWxlbWVudFJlZiB8IHVuZGVmaW5lZFxuICBAVmlld0NoaWxkKFwid3JhcHBlclwiKSB3cmFwcGVyOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkXG4gIEBWaWV3Q2hpbGQoJ292ZXJsYXlDb250ZW50Jykgb3ZlcmxheUNvbnRlbnQ6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcblxuICBwcm90ZWN0ZWQgaW5wdXRDb250cm9sID0gbmV3IEZvcm1Db250cm9sKFwiXCIpXG4gIHByb3RlY3RlZCBmaWx0ZXJlZE9wdGlvbnM6IGFueVtdID0gW107XG4gIHByb3RlY3RlZCBwYWdpbmF0ZWRGaWx0ZXJlZE9wdGlvbnM6IGFueVtdID0gW107XG4gIHByb3RlY3RlZCBzZWxlY3RlZE9wdGlvbj86IGFueTtcbiAgcHJvdGVjdGVkIGNsb3NlZCA9IHRydWU7XG4gIHByb3RlY3RlZCBzZWxlY3Rpb25Gb3JtOiBGb3JtR3JvdXBcbiAgcHJvdGVjdGVkIGNoaXBzQ29sbGFwc2VkID0gdHJ1ZVxuICBwcm90ZWN0ZWQgY2hlY2tBbGxWYWx1ZSA9IGZhbHNlXG4gIHByb3RlY3RlZCBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX292ZXJsYXlSZWY6IE92ZXJsYXlSZWYgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3BvcnRhbDogVGVtcGxhdGVQb3J0YWw8YW55PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfZGVzdHJveSA9IGluamVjdChEZXN0cm95UmVmKVxuICBwcml2YXRlIHJlYWRvbmx5IElURU1TX1BFUl9QQUdFID0gNDBcbiAgcHJpdmF0ZSBfcGFnZU51bWJlciA9IDFcbiAgcHJpdmF0ZSBfcmVhY2hlZEVuZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGZpbHRlckZuPzogKGl0ZW06IHN0cmluZykgPT4gYW55W107XG5cbiAgQElucHV0KClcbiAgZGlzcGxheUZuPzogKGl0ZW06IGFueSkgPT4gc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIG11bHRpcGxlID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgdmFsdWVQcm9wOiBzdHJpbmcgPSAnJ1xuXG4gIEBJbnB1dCgpXG4gIG9wdGlvbnM6IGFueVtdID0gW11cblxuICBASW5wdXQoKVxuICBwbGFjZWhvbGRlciA9ICcnXG5cbiAgQElucHV0KClcbiAgZW1wdHlNZXNzYWdlID0gJ05lbmh1bWEgb3DDp8Ojbyc7XG5cbiAgQElucHV0KClcbiAgc2VsZWN0QWxsID0gZmFsc2VcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxuICAgICAgICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgY2hhbmdlOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHRoaXMuc2VsZWN0aW9uRm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHt9KVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuaGFuZGxlSW5wdXRDaGFuZ2UoKTtcblxuICAgIHRoaXMuaGFuZGxlU2VsZWN0aW9uQ2hhbmdlKCk7XG5cbiAgICB0aGlzLmNoZWNrQWxsVmFsdWUgPSB0aGlzLnNlbGVjdEFsbDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlSW5wdXRDaGFuZ2UoKSB7XG4gICAgdGhpcy5pbnB1dENvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveSksXG4gICAgICBzdGFydFdpdGgoJycpLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgdGhpcy5fcGFnZU51bWJlciA9IDFcbiAgICAgICAgdGhpcy5fcmVhY2hlZEVuZCA9IGZhbHNlXG4gICAgICAgIHRoaXMucGFnaW5hdGVkRmlsdGVyZWRPcHRpb25zID0gW11cbiAgICAgIH0pLFxuICAgICAgbWFwKHZhbHVlID0+IHRoaXMuZmlsdGVyRm4gPyB0aGlzLmZpbHRlckZuKHZhbHVlIHx8ICcnKSA6IFtdKVxuICAgICkuc3Vic2NyaWJlKGl0ZW1zID0+IHtcbiAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gaXRlbXNcbiAgICAgIHRoaXMuZ2V0TW9yZUl0ZW1zKDApXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlKCkge1xuICAgIHRoaXMuc2VsZWN0aW9uRm9ybVxuICAgICAgLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3kpLCBkZWJvdW5jZVRpbWUoMTAwKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlczoge1trZXk6IHN0cmluZ106IGJvb2xlYW59KSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tBbGxWYWx1ZSA9IE9iamVjdC5rZXlzKHZhbHVlcykuZXZlcnkodmFsdWUgPT4gdmFsdWVzW3ZhbHVlXSlcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLm9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiB2YWx1ZXNbb3B0aW9uW3RoaXMudmFsdWVQcm9wXV0pKVxuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpXG4gICAgICB9KVxuICB9XG5cbiAgaGFuZGxlT3B0aW9uU2VsZWN0ZWQoaXRlbTogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IGl0ZW07XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnNlbGVjdGVkT3B0aW9uKVxuICAgIHRoaXMuaGlkZU9wdGlvbnMoKVxuICAgIHRoaXMuY2hhbmdlLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGhhbmRsZUF1dG9jb21wbGV0ZUNsaWNrKCkge1xuICAgIHRoaXMuY2xvc2VkXG4gICAgICA/IHRoaXMuc2hvd09wdGlvbnMoKVxuICAgICAgOiB0aGlzLmhpZGVPcHRpb25zKClcbiAgfVxuXG4gIHNob3dPcHRpb25zKCkge1xuICAgIHRoaXMuY2xvc2VkID0gZmFsc2VcbiAgICBpZiAoIXRoaXMuX292ZXJsYXlSZWYgJiYgdGhpcy53cmFwcGVyKSB7XG4gICAgICB0aGlzLl9vdmVybGF5UmVmID0gdGhpcy5nZXRPdmVybGF5Q29uZmlnKHRoaXMud3JhcHBlcilcblxuICAgICAgdGhpcy5fcG9ydGFsID0gbmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMub3ZlcmxheUNvbnRlbnQhLCB0aGlzLnZpZXdDb250YWluZXJSZWYpXG4gICAgfVxuXG4gICAgdGhpcy5fb3ZlcmxheVJlZj8uYXR0YWNoKHRoaXMuX3BvcnRhbCk7XG4gIH1cblxuICBwcml2YXRlIGdldE92ZXJsYXlDb25maWcod3JhcHBlcjogRWxlbWVudFJlZikge1xuICAgIHJldHVybiB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcbiAgICAgIHdpZHRoOiB3cmFwcGVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkucG9zaXRpb24oKVxuICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh3cmFwcGVyLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgIC53aXRoUG9zaXRpb25zKFt7XG4gICAgICAgICAgb3JpZ2luWDogXCJzdGFydFwiLFxuICAgICAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXG4gICAgICAgICAgb3ZlcmxheVg6IFwic3RhcnRcIixcbiAgICAgICAgICBvdmVybGF5WTogXCJ0b3BcIlxuICAgICAgICB9XSlcbiAgICB9KTtcbiAgfVxuXG4gIGhpZGVPcHRpb25zKCkge1xuICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNoaXBzQ29sbGFwc2VkID0gdHJ1ZTtcbiAgICB0aGlzLl9vdmVybGF5UmVmPy5kZXRhY2goKVxuICAgIHRoaXMuY2hhbmdlLmRldGVjdENoYW5nZXMoKVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzptb3VzZWRvd25cIiwgWyckZXZlbnQnXSlcbiAgaGFuZGxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5jbG9zZWRcbiAgICAgICYmICF0aGlzLmlucHV0Py5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldClcbiAgICAgICYmICF0aGlzLmxpc3Q/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgdGhpcy5oaWRlT3B0aW9ucygpXG4gICAgfVxuICB9XG5cbiAgZ2V0IHNlbGVjdGVkT3B0aW9ucygpOiBhbnlbXSB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSByZXR1cm4gdGhpcy5zZWxlY3RlZE9wdGlvbiA/IFt0aGlzLnNlbGVjdGVkT3B0aW9uXSA6IFtdXG5cbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMub3B0aW9uc1xuICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gdGhpcy5zZWxlY3Rpb25Gb3JtLnZhbHVlW2l0ZW1bdGhpcy52YWx1ZVByb3BdXSlcblxuICAgIHJldHVybiB0aGlzLmNoaXBzQ29sbGFwc2VkXG4gICAgICA/IHNlbGVjdGVkLnNsaWNlKDAsIDEpXG4gICAgICA6IHNlbGVjdGVkO1xuICB9XG5cbiAgaGFuZGxlU2VsZWN0QWxsKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGNoZWNrZWQgPSAoPEhUTUxJbnB1dEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS5jaGVja2VkXG5cbiAgICB0aGlzLnNlbGVjdEFsbE9wdGlvbnMoY2hlY2tlZCk7XG4gIH1cblxuICBzZWxlY3RBbGxPcHRpb25zKHNlbGVjdGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkZvcm0udmFsdWVbb3B0aW9uW3RoaXMudmFsdWVQcm9wXV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkZvcm0uYWRkQ29udHJvbChcbiAgICAgICAgICBvcHRpb25bdGhpcy52YWx1ZVByb3BdLFxuICAgICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChzZWxlY3RlZCksXG4gICAgICAgICAge2VtaXRFdmVudDogZmFsc2V9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbnN0IG5ld1ZhbHVlcyA9IE9iamVjdC5rZXlzKHRoaXMuc2VsZWN0aW9uRm9ybS5jb250cm9scylcbiAgICAgIC5yZWR1Y2UoKGFjYywgY3VycikgPT4ge1xuICAgICAgICBhY2NbY3Vycl0gPSBzZWxlY3RlZFxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30gYXMge1trZXk6IHN0cmluZ106IGJvb2xlYW59KVxuXG4gICAgdGhpcy5zZWxlY3Rpb25Gb3JtLnBhdGNoVmFsdWUobmV3VmFsdWVzKVxuICAgIHRoaXMuc2VsZWN0aW9uRm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgdGhpcy5jaGFuZ2UuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgaGFuZGxlQ2hpcEFjdGlvbihvcHRpb246IGFueSkge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbkZvcm0uZ2V0KG9wdGlvblt0aGlzLnZhbHVlUHJvcF0pPy5zZXRWYWx1ZShmYWxzZSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gIH1cblxuICBkaXNwbGF5KG9wdGlvbjogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheUZuICYmIHRoaXMuZGlzcGxheUZuKG9wdGlvbilcbiAgfVxuXG4gIGdldE1vcmVJdGVtcyhzY3JvbGxJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLl9yZWFjaGVkRW5kICYmICghdGhpcy5wYWdpbmF0ZWRGaWx0ZXJlZE9wdGlvbnMubGVuZ3RoXG4gICAgICB8fCAoKHNjcm9sbEluZGV4ICsgNSkgPj0gKHRoaXMuSVRFTVNfUEVSX1BBR0UgKiAodGhpcy5fcGFnZU51bWJlciAtIDEgfHwgMSkpKSkpIHtcbiAgICAgIGNvbnN0IG5leHRQYWdlSXRlbXMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucy5zbGljZShcbiAgICAgICAgdGhpcy5JVEVNU19QRVJfUEFHRSAqICh0aGlzLl9wYWdlTnVtYmVyIC0gMSksXG4gICAgICAgIHRoaXMuSVRFTVNfUEVSX1BBR0UgKiB0aGlzLl9wYWdlTnVtYmVyKTtcbiAgICAgIGlmIChuZXh0UGFnZUl0ZW1zLmxlbmd0aCkge1xuICAgICAgICBuZXh0UGFnZUl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbkZvcm0udmFsdWVbaXRlbVt0aGlzLnZhbHVlUHJvcF1dKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkZvcm0uYWRkQ29udHJvbChcbiAgICAgICAgICAgICAgaXRlbVt0aGlzLnZhbHVlUHJvcF0sXG4gICAgICAgICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCh0aGlzLmNoZWNrQWxsVmFsdWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnBhZ2luYXRlZEZpbHRlcmVkT3B0aW9ucyA9IFsuLi50aGlzLnBhZ2luYXRlZEZpbHRlcmVkT3B0aW9ucywgLi4ubmV4dFBhZ2VJdGVtc107XG4gICAgICAgIHRoaXMuX3BhZ2VOdW1iZXIgKz0gMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVhY2hlZEVuZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDb250cm9sIFZhbHVlIEFjY2Vzc29yXG5cbiAgd3JpdGVWYWx1ZShvYmo6IGFueVtdIHwgYW55KTogdm9pZCB7XG4gICAgaWYgKCFvYmogfHwgKEFycmF5LmlzQXJyYXkob2JqKSAmJiAhb2JqLmxlbmd0aCkgJiYgdGhpcy5zZWxlY3RBbGwpIHtcbiAgICAgIHRoaXMuc2VsZWN0QWxsT3B0aW9ucyh0aGlzLnNlbGVjdEFsbClcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIG9iai5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uRm9ybS5hZGRDb250cm9sKFxuICAgICAgICAgIGl0ZW1bdGhpcy52YWx1ZVByb3BdLFxuICAgICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCh0cnVlKSxcbiAgICAgICAgICB7ZW1pdEV2ZW50OiBmYWxzZX0pXG4gICAgICB9KVxuICAgICAgdGhpcy5zZWxlY3Rpb25Gb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IG9ialxuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG9uQ2hhbmdlID0gKF86IGFueSkgPT4ge31cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICBvblRvdWNoZWQgPSAoKSA9PiB7fVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJhdXRvY29tcGxldGUtd3JhcHBlclwiXG4gICAgIFtjbGFzcy4tY2xvc2VkXT1cImNsb3NlZFwiXG4gICAgIFtjbGFzcy4tb3BlbmVkXT1cIiFjbG9zZWRcIlxuICAgICAjd3JhcHBlclxuPlxuICA8ZGl2IGNsYXNzPVwiYXV0b2NvbXBsZXRlXCIgI2F1dG9jb21wbGV0ZT5cbiAgICA8aW5wdXQgY2xhc3M9XCJzZWFyY2gtZmllbGRcIlxuICAgICAgICAgICAqbmdJZj1cIiFjbG9zZWQ7IGVsc2Ugc2VsZWN0aW9uT3JQbGFjZWhvbGRlclwiXG4gICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJpbnB1dENvbnRyb2xcIlxuICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIi8+XG4gICAgPG5nLXRlbXBsYXRlICNzZWxlY3Rpb25PclBsYWNlaG9sZGVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkT3B0aW9ucy5sZW5ndGggJiYgY2xvc2VkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwLWxpc3RcIiBbY2xhc3MuLWNvbGxhcHNlZF09XCJjaGlwc0NvbGxhcHNlZFwiPlxuICAgICAgICAgIDxhc2stY2hpcHMgW3N0eWxlLm1heC13aWR0aF09XCJjaGlwc0NvbGxhcHNlZCA/ICc3NSUnIDogJzEwMCUnXCJcbiAgICAgICAgICAgICAgICAgICAgIFtzaG93QWN0aW9uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBzZWxlY3RlZE9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbik9XCJoYW5kbGVDaGlwQWN0aW9uKG9wdGlvbilcIj5cbiAgICAgICAgICAgIHt7ZGlzcGxheShvcHRpb24pfX1cbiAgICAgICAgICA8L2Fzay1jaGlwcz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImV4cGFuZFwiIGRhdGEtdGVzdGlkPVwic2VlLW1vcmVcIiAqbmdJZj1cIm11bHRpcGxlXCIgKGNsaWNrKT1cImNoaXBzQ29sbGFwc2VkID0gIWNoaXBzQ29sbGFwc2VkXCI+XG4gICAgICAgICAgICB7e2NoaXBzQ29sbGFwc2VkID8gJ1ZlciBtYWlzJyA6ICdWZXIgbWVub3MnfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cInBsYWNlaG9sZGVyXCIgKm5nSWY9XCJjbG9zZWQgJiYgIXNlbGVjdGVkT3B0aW9ucy5sZW5ndGhcIj57e3BsYWNlaG9sZGVyfX08L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8c3BhbiBjbGFzcz1cImJ0bi1leHBhbmQgbWF0ZXJpYWwtaWNvbnNcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwiYnRuLWV4cGFuZFwiXG4gICAgICAgICAgW2NsYXNzLi1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgKGNsaWNrKT1cIiFkaXNhYmxlZCAmJiBoYW5kbGVBdXRvY29tcGxldGVDbGljaygpXCI+e3tjbG9zZWQgPyBcImV4cGFuZF9tb3JlXCIgOiBcImV4cGFuZF9sZXNzXCJ9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNvdmVybGF5Q29udGVudD5cbiAgPGRpdiAjbGlzdCBjbGFzcz1cIm1lbnUtY29udGFpbmVyXCIgW2NsYXNzLi1tdWx0aXBsZV09XCJtdWx0aXBsZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbXVsdGlwbGU7IGVsc2UgbXVsdGlwbGVTZWxlY3Rpb25cIj5cbiAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgW2l0ZW1TaXplXT1cIjM2XCIgY2xhc3M9XCJsaXN0XCIgKHNjcm9sbGVkSW5kZXhDaGFuZ2UpPVwiZ2V0TW9yZUl0ZW1zKCRldmVudClcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqY2RrVmlydHVhbEZvcj1cImxldCBvcHRpb24gb2YgcGFnaW5hdGVkRmlsdGVyZWRPcHRpb25zXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1pdGVtXCJcbiAgICAgICAgICAgICAgIFtjbGFzcy4taGlnaGxpZ2h0ZWRdPVwic2VsZWN0ZWRPcHRpb24gJiYgc2VsZWN0ZWRPcHRpb25bdmFsdWVQcm9wXSA9PT0gb3B0aW9uW3ZhbHVlUHJvcF1cIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZU9wdGlvblNlbGVjdGVkKG9wdGlvbilcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dFwiPnt7ZGlzcGxheShvcHRpb24pfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNtdWx0aXBsZVNlbGVjdGlvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvcHRpb24taXRlbVwiICpuZ0lmPVwicGFnaW5hdGVkRmlsdGVyZWRPcHRpb25zLmxlbmd0aCAmJiBzZWxlY3RBbGxcIj5cbiAgICAgICAgPGFzay1jaGVja2JveCAoY2hhbmdlKT1cImhhbmRsZVNlbGVjdEFsbCgkZXZlbnQpXCIgWyhuZ01vZGVsKV09XCJjaGVja0FsbFZhbHVlXCI+U2VsZWNpb25hciB0b2RhczwvYXNrLWNoZWNrYm94PlxuICAgICAgPC9kaXY+XG4gICAgICA8Zm9ybSBkYXRhLXRlc3RpZD1cIm9wdGlvbnMtZm9ybVwiICpuZ0lmPVwic2VsZWN0aW9uRm9ybS5jb250cm9sc1wiIFtmb3JtR3JvdXBdPVwic2VsZWN0aW9uRm9ybVwiPlxuICAgICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IFtpdGVtU2l6ZV09XCIzNlwiIGNsYXNzPVwibGlzdC1ib3hcIiAoc2Nyb2xsZWRJbmRleENoYW5nZSk9XCJnZXRNb3JlSXRlbXMoJGV2ZW50KVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgb3B0aW9uIG9mIHBhZ2luYXRlZEZpbHRlcmVkT3B0aW9uc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1pdGVtXCI+XG4gICAgICAgICAgICAgIDxhc2stY2hlY2tib3ggW2Zvcm1Db250cm9sTmFtZV09XCJvcHRpb25bdmFsdWVQcm9wXVwiPnt7ZGlzcGxheShvcHRpb24pfX08L2Fzay1jaGVja2JveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cbiAgICAgIDwvZm9ybT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxzcGFuIGNsYXNzPVwiZW1wdHlcIiAqbmdJZj1cIiFmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoXCI+e3tlbXB0eU1lc3NhZ2V9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
318
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fza3N1aXRlLWNpdHJ1cy9zcmMvbGliL2NvbXBvbmVudHMvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc2tzdWl0ZS1jaXRydXMvc3JjL2xpYi9jb21wb25lbnRzL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUVWLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxTQUFTLEVBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFvQyxXQUFXLEVBQWEsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RyxPQUFPLEVBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXZELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7QUFFOUQsTUFBTSxhQUFhLEdBQWE7SUFDOUIsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixLQUFLLEVBQUUsSUFBSTtJQUNYLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUM7Q0FDckQsQ0FBQTtBQVNELE1BQU0sT0FBTyxxQkFBcUI7SUFNaEMsSUFBK0IsWUFBWSxDQUFDLEtBQWlCO1FBQzNELElBQUksS0FBSyxFQUFFO1lBQ1QsTUFBTSxNQUFNLEdBQUksS0FBSyxDQUFDLGFBQWdDLENBQUM7WUFDdkQsTUFBTSxlQUFlLEdB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S0FBSztnQkFJTixRQUFRO3NCQURQLEtBQUs7Z0JBSU4sU0FBUztzQkFEUixLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFJTixXQUFXO3NCQURWLEtBQUs7Z0JBSU4sWUFBWTtzQkFEWCxLQUFLO2dCQUlOLFNBQVM7c0JBRFIsS0FBSztnQkF3SU4sV0FBVztzQkFEVixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgUHJvdmlkZXIsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIG1hcCwgc3RhcnRXaXRoLCB0YXB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge092ZXJsYXksIE92ZXJsYXlSZWZ9IGZyb20gXCJAYW5ndWxhci9jZGsvb3ZlcmxheVwiO1xuaW1wb3J0IHtUZW1wbGF0ZVBvcnRhbH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9wb3J0YWxcIjtcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3BcIjtcblxuY29uc3QgdmFsdWVBY2Nlc3NvcjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBtdWx0aTogdHJ1ZSxcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXV0b2NvbXBsZXRlQ29tcG9uZW50KSxcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXNrLWF1dG9jb21wbGV0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hdXRvY29tcGxldGUuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbdmFsdWVBY2Nlc3Nvcl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEF1dG9jb21wbGV0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBAVmlld0NoaWxkKFwiYXV0b2NvbXBsZXRlXCIpIGlucHV0OiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkXG4gIEBWaWV3Q2hpbGQoXCJsaXN0XCIpIGxpc3Q6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWRcbiAgQFZpZXdDaGlsZChcIndyYXBwZXJcIikgd3JhcHBlcjogRWxlbWVudFJlZiB8IHVuZGVmaW5lZFxuICBAVmlld0NoaWxkKCdvdmVybGF5Q29udGVudCcpIG92ZXJsYXlDb250ZW50OiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBWaWV3Q2hpbGQoJ2xpc3RWaWV3cG9ydCcpIHNldCBsaXN0Vmlld3BvcnQodmFsdWU6IEVsZW1lbnRSZWYpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGNvbnN0IGxpc3RFbCA9ICh2YWx1ZS5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KTtcbiAgICAgIGNvbnN0IHNjcm9sbFRocmVzaG9sZCA9IDUwO1xuICAgICAgbGlzdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKChsaXN0RWwuc2Nyb2xsSGVpZ2h0IC0gbGlzdEVsLnNjcm9sbFRvcCAtIGxpc3RFbC5jbGllbnRIZWlnaHQpIDw9IHNjcm9sbFRocmVzaG9sZCkge1xuICAgICAgICAgIHRoaXMuZ2V0TW9yZUl0ZW1zKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5wdXRDb250cm9sID0gbmV3IEZvcm1Db250cm9sKFwiXCIpXG4gIHByb3RlY3RlZCBmaWx0ZXJlZE9wdGlvbnM6IGFueVtdID0gW107XG4gIHByb3RlY3RlZCBwYWdpbmF0ZWRGaWx0ZXJlZE9wdGlvbnM6IGFueVtdID0gW107XG4gIHByb3RlY3RlZCBzZWxlY3RlZE9wdGlvbj86IGFueTtcbiAgcHJvdGVjdGVkIHNlbGVjdGlvbjogYW55W10gPSBbXTtcbiAgcHJvdGVjdGVkIGNsb3NlZCA9IHRydWU7XG4gIHByb3RlY3RlZCBzZWxlY3Rpb25Gb3JtOiBGb3JtR3JvdXBcbiAgcHJvdGVjdGVkIGNoaXBzQ29sbGFwc2VkID0gdHJ1ZVxuICBwcm90ZWN0ZWQgY2hlY2tBbGxWYWx1ZSA9IGZhbHNlXG4gIHByb3RlY3RlZCBkaXNhYmxlZCA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgc2hvd0NoaXBzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzaG93QWxsU2VsZWN0aW9uQnRuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzaG93UGxhY2Vob2xkZXIgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNob3dFeHBhbmRlZFNlbGVjdGlvbkFjdGlvbnMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNob3dTZWxlY3RBbGxDaGVja2JveCA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgY2hpcHNDb250YWluZXJDbGFzc2VzID0ge1xuICAgIFwiLXR3b1wiOiBmYWxzZSxcbiAgICBcIi10aHJlZVwiOiBmYWxzZSxcbiAgICBcIi1mb3VyXCI6IGZhbHNlLFxuICAgIFwiLW1hbnlcIjogZmFsc2VcbiAgfTtcblxuICBwcml2YXRlIF9vdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9wb3J0YWw6IFRlbXBsYXRlUG9ydGFsPGFueT4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2Rlc3Ryb3kgPSBpbmplY3QoRGVzdHJveVJlZilcbiAgcHJpdmF0ZSByZWFkb25seSBJVEVNU19QRVJfUEFHRSA9IDQwXG4gIHByaXZhdGUgX3BhZ2VOdW1iZXIgPSAxXG4gIHByaXZhdGUgX3JlYWNoZWRFbmQgPSBmYWxzZTtcblxuXG5cbiAgQElucHV0KClcbiAgZmlsdGVyRm4/OiAoaXRlbTogc3RyaW5nKSA9PiBhbnlbXTtcblxuICBASW5wdXQoKVxuICBkaXNwbGF5Rm4/OiAoaXRlbTogYW55KSA9PiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgbXVsdGlwbGUgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICB2YWx1ZVByb3A6IHN0cmluZyA9ICcnXG5cbiAgQElucHV0KClcbiAgb3B0aW9uczogYW55W10gPSBbXVxuXG4gIEBJbnB1dCgpXG4gIHBsYWNlaG9sZGVyID0gJydcblxuICBASW5wdXQoKVxuICBlbXB0eU1lc3NhZ2UgPSAnTk9fT1BUSU9OUyc7XG5cbiAgQElucHV0KClcbiAgc2VsZWN0QWxsID0gZmFsc2VcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxuICAgICAgICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgY2hhbmdlOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHRoaXMuc2VsZWN0aW9uRm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHt9KVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY2hlY2tBbGxWYWx1ZSA9IE9iamVjdC5rZXlzKHRoaXMuc2VsZWN0aW9uRm9ybS52YWx1ZSkubGVuZ3RoID09PSB0aGlzLm9wdGlvbnMubGVuZ3RoXG4gICAgICAmJiB0aGlzLm9wdGlvbnMuZXZlcnkodmFsdWUgPT5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Gb3JtLnZhbHVlW3ZhbHVlW3RoaXMudmFsdWVQcm9wXV0pXG4gICAgdGhpcy5oYW5kbGVJbnB1dENoYW5nZSgpO1xuICAgIHRoaXMubGlzdGVuU2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUlucHV0Q2hhbmdlKCkge1xuICAgIHRoaXMuaW5wdXRDb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3kpLFxuICAgICAgZGVib3VuY2VUaW1lKDMwMCksXG4gICAgICBzdGFydFdpdGgoJycpLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgdGhpcy5fcGFnZU51bWJlciA9IDFcbiAgICAgICAgdGhpcy5fcmVhY2hlZEVuZCA9IGZhbHNlXG4gICAgICAgIHRoaXMucGFnaW5hdGVkRmlsdGVyZWRPcHRpb25zID0gW11cbiAgICAgIH0pLFxuICAgICAgbWFwKHZhbHVlID0+IHRoaXMuZmlsdGVyRm4gPyB0aGlzLmZpbHRlckZuKHZhbHVlIHx8ICcnKSA6IFtdKVxuICAgICkuc3Vic2NyaWJlKGl0ZW1zID0+IHtcbiAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gaXRlbXNcbiAgICAgIHRoaXMuZ2V0TW9yZUl0ZW1zKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5TZWxlY3Rpb25DaGFuZ2UoKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuc2VsZWN0aW9uRm9ybS52YWx1ZSkubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMub3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IHRoaXMuc2VsZWN0aW9uRm9ybS52YWx1ZVtvcHRpb25bdGhpcy52YWx1ZVByb3BdXSlcbiAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbigpO1xuICAgICAgdGhpcy5jaGFuZ2UuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0aW9uRm9ybVxuICAgICAgLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3kpKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWVzOiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0pID0+IHtcbiAgICAgICAgdGhpcy5jaGVja0FsbFZhbHVlID0gT2JqZWN0LmtleXModmFsdWVzKS5ldmVyeSh2YWx1ZSA9PiB2YWx1ZXNbdmFsdWVdKVxuICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdGlvbkNoYW5nZSh2YWx1ZXMpXG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5zZWxlY3Rpb24pXG4gICAgICAgIHRoaXMub25Ub3VjaGVkKClcbiAgICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVNlbGVjdGlvbkNoYW5nZSh2YWx1ZXM6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSkge1xuICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5vcHRpb25zLmZpbHRlcihvcHRpb24gPT4gdmFsdWVzW29wdGlvblt0aGlzLnZhbHVlUHJvcF1dKVxuXG4gICAgaWYgKCF0aGlzLmNoaXBzQ29sbGFwc2VkKSB7XG4gICAgICB0aGlzLmNoaXBzQ29sbGFwc2VkID0gdGhpcy5zZWxlY3Rpb24ubGVuZ3RoIDwgMlxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2hpcHNDb250YWluZXJDbGFzc2VzKCkge1xuICAgIHRoaXMuY2hpcHNDb250YWluZXJDbGFzc2VzID0ge1xuICAgICAgXCItdHdvXCI6IHRoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCA9PT0gMixcbiAgICAgIFwiLXRocmVlXCI6IHRoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCA9PT0gMyxcbiAgICAgIFwiLWZvdXJcIjogdGhpcy5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoID09PSA0LFxuICAgICAgXCItbWFueVwiOiB0aGlzLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGggPj0gNVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU9wdGlvblNlbGVjdGVkKGl0ZW06IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSBpdGVtO1xuICAgIHRoaXMub25DaGFuZ2UodGhpcy5zZWxlY3RlZE9wdGlvbilcbiAgICB0aGlzLmhpZGVPcHRpb25zKClcbiAgICB0aGlzLmNoYW5nZS5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBoYW5kbGVBdXRvY29tcGxldGVDbGljaygpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuY2hpcHNDb2xsYXBzZWQgPSB0cnVlO1xuICAgICAgdGhpcy5jbG9zZWRcbiAgICAgICAgPyB0aGlzLnNob3dPcHRpb25zKClcbiAgICAgICAgOiB0aGlzLmhpZGVPcHRpb25zKClcbiAgICB9XG4gICAgdGhpcy51cGRhdGVWYWxpZGF0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVDaGlwc0NvbnRhaW5lckNsYXNzZXMoKVxuICAgIHRoaXMuY2hhbmdlLmRldGVjdENoYW5nZXMoKVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUNoaXBzTGlzdEFjdGlvbkNsaWNrKCkge1xuICAgIHRoaXMuY2hpcHNDb2xsYXBzZWQgPSAhdGhpcy5jaGlwc0NvbGxhcHNlZDtcbiAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb24oKVxuICAgIHRoaXMudXBkYXRlQ2hpcHNDb250YWluZXJDbGFzc2VzKClcbiAgICB0aGlzLmNoYW5nZS5kZXRlY3RDaGFuZ2VzKClcbiAgfVxuXG4gIHNob3dPcHRpb25zKCkge1xuICAgIHRoaXMuY2xvc2VkID0gZmFsc2VcbiAgICBpZiAoIXRoaXMuX292ZXJsYXlSZWYgJiYgdGhpcy53cmFwcGVyKSB7XG4gICAgICB0aGlzLl9vdmVybGF5UmVmID0gdGhpcy5nZXRPdmVybGF5Q29uZmlnKHRoaXMud3JhcHBlcilcblxuICAgICAgdGhpcy5fcG9ydGFsID0gbmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMub3ZlcmxheUNvbnRlbnQhLCB0aGlzLnZpZXdDb250YWluZXJSZWYpXG4gICAgfVxuXG4gICAgdGhpcy5fb3ZlcmxheVJlZj8uYXR0YWNoKHRoaXMuX3BvcnRhbCk7XG5cbiAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb24oKTtcbiAgICBpZiAodGhpcy5wYWdpbmF0ZWRGaWx0ZXJlZE9wdGlvbnMubGVuZ3RoID09PSAwKSB0aGlzLmdldE1vcmVJdGVtcygpXG4gIH1cblxuICBwcml2YXRlIGdldE92ZXJsYXlDb25maWcod3JhcHBlcjogRWxlbWVudFJlZikge1xuICAgIHJldHVybiB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcbiAgICAgIHdpZHRoOiB3cmFwcGVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkucG9zaXRpb24oKVxuICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh3cmFwcGVyLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgIC53aXRoUG9zaXRpb25zKFt7XG4gICAgICAgICAgb3JpZ2luWDogXCJzdGFydFwiLFxuICAgICAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXG4gICAgICAgICAgb3ZlcmxheVg6IFwic3RhcnRcIixcbiAgICAgICAgICBvdmVybGF5WTogXCJ0b3BcIlxuICAgICAgICB9XSlcbiAgICB9KTtcbiAgfVxuXG4gIGhpZGVPcHRpb25zKCkge1xuICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNoaXBzQ29sbGFwc2VkID0gdHJ1ZTtcbiAgICB0aGlzLl9vdmVybGF5UmVmPy5kZXRhY2goKVxuICAgIHRoaXMuY2hhbmdlLmRldGVjdENoYW5nZXMoKVxuICAgIHRoaXMuX3BhZ2VOdW1iZXIgPSAxO1xuICAgIHRoaXMucGFnaW5hdGVkRmlsdGVyZWRPcHRpb25zID0gW107XG4gICAgdGhpcy51cGRhdGVWYWxpZGF0aW9uKCk7XG4gICAgdGhpcy5jaGFuZ2UuZGV0ZWN0Q2hhbmdlcygpXG4gIH1cblxuICBASG9zdExpc3RlbmVyKFwid2luZG93Om1vdXNlZG93blwiLCBbJyRldmVudCddKVxuICBoYW5kbGVDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmNsb3NlZFxuICAgICAgJiYgIXRoaXMuaW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KVxuICAgICAgJiYgIXRoaXMubGlzdD8ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLmhpZGVPcHRpb25zKClcbiAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbigpO1xuICAgICAgdGhpcy5jaGFuZ2UuZGV0ZWN0Q2hhbmdlcygpXG4gICAgfVxuICB9XG5cbiAgZ2V0IHNlbGVjdGVkT3B0aW9ucygpOiBhbnlbXSB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSByZXR1cm4gdGhpcy5zZWxlY3RlZE9wdGlvbiA/IFt0aGlzLnNlbGVjdGVkT3B0aW9uXSA6IFtdXG5cbiAgICByZXR1cm4gdGhpcy5jaGlwc0NvbGxhcHNlZFxuICAgICAgPyB0aGlzLnNlbGVjdGlvbi5zbGljZSgwLCAxKVxuICAgICAgOiB0aGlzLnNlbGVjdGlvbjtcbiAgfVxuXG4gIGhhbmRsZVNlbGVjdEFsbChjaGVja2VkOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZWxlY3RBbGxPcHRpb25zKGNoZWNrZWQpO1xuICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbigpO1xuICAgIHRoaXMuY2hhbmdlLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHNlbGVjdEFsbE9wdGlvbnMoc2VsZWN0ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnVwZGF0ZUZvcm1Db250cm9scyh0aGlzLm9wdGlvbnMsIHRoaXMuc2VsZWN0aW9uRm9ybSwgdGhpcy5mb3JtQnVpbGRlciwgdGhpcy52YWx1ZVByb3AsIHNlbGVjdGVkKVxuXG4gICAgY29uc3QgbmV3VmFsdWVzID0gT2JqZWN0LmtleXModGhpcy5zZWxlY3Rpb25Gb3JtLmNvbnRyb2xzKVxuICAgICAgLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgIGFjY1tjdXJyXSA9IHNlbGVjdGVkXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSBhcyB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0pXG5cblxuICAgIHRoaXMuc2VsZWN0aW9uRm9ybS5wYXRjaFZhbHVlKG5ld1ZhbHVlcylcbiAgICB0aGlzLnNlbGVjdGlvbkZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgaGFuZGxlQ2hpcEFjdGlvbihvcHRpb246IGFueSkge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbkZvcm0uZ2V0KG9wdGlvblt0aGlzLnZhbHVlUHJvcF0pPy5zZXRWYWx1ZShmYWxzZSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVDaGlwc0NvbnRhaW5lckNsYXNzZXMoKVxuICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbigpO1xuICAgIHRoaXMuY2hhbmdlLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGRpc3BsYXkob3B0aW9uOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5Rm4gJiYgdGhpcy5kaXNwbGF5Rm4ob3B0aW9uKVxuICB9XG5cbiAgZ2V0TW9yZUl0ZW1zKCkge1xuICAgIGNvbnN0IG5leHRQYWdlSXRlbXMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucy5zbGljZShcbiAgICAgIHRoaXMuSVRFTVNfUEVSX1BBR0UgKiAodGhpcy5fcGFnZU51bWJlciAtIDEpLFxuICAgICAgdGhpcy5JVEVNU19QRVJfUEFHRSAqIHRoaXMuX3BhZ2VOdW1iZXIpO1xuICAgIGlmIChuZXh0UGFnZUl0ZW1zLmxlbmd0aCkge1xuICAgICAgdGhpcy51cGRhdGVGb3JtQ29udHJvbHMobmV4dFBhZ2VJdGVtcywgdGhpcy5zZWxlY3Rpb25Gb3JtLCB0aGlzLmZvcm1CdWlsZGVyLCB0aGlzLnZhbHVlUHJvcCwgdGhpcy5jaGVja0FsbFZhbHVlKTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uRm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClcbiAgICAgIHRoaXMucGFnaW5hdGVkRmlsdGVyZWRPcHRpb25zID0gWy4uLnRoaXMucGFnaW5hdGVkRmlsdGVyZWRPcHRpb25zLCAuLi5uZXh0UGFnZUl0ZW1zXTtcbiAgICAgIHRoaXMuX3BhZ2VOdW1iZXIgKz0gMVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZWFjaGVkRW5kID0gdHJ1ZVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb24oKTtcbiAgICB0aGlzLmNoYW5nZS5kZXRlY3RDaGFuZ2VzKClcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRm9ybUNvbnRyb2xzKGl0ZW1zOiBhbnlbXSwgZm9ybTogRm9ybUdyb3VwLCBmYjogRm9ybUJ1aWxkZXIsIHByb3BWYWx1ZTogc3RyaW5nLCBjaGVja2VkOiBib29sZWFuKSB7XG4gICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmIChmb3JtLnZhbHVlW2l0ZW1bcHJvcFZhbHVlXV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3JtLmFkZENvbnRyb2woXG4gICAgICAgICAgaXRlbVtwcm9wVmFsdWVdLFxuICAgICAgICAgIGZiLmNvbnRyb2woY2hlY2tlZCksXG4gICAgICAgICAge2VtaXRFdmVudDogZmFsc2V9XG4gICAgICAgIClcbiAgICAgIH0gZWxzZSBpZiAoIWZvcm0udmFsdWVbaXRlbVtwcm9wVmFsdWVdXSkge1xuICAgICAgICBmb3JtLmdldChpdGVtW3Byb3BWYWx1ZV0pPy5zZXRWYWx1ZShjaGVja2VkLCB7ZW1pdEV2ZW50OiBmYWxzZX0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVWYWxpZGF0aW9uKCkge1xuICAgIHRoaXMuc2hvd0NoaXBzID0gQm9vbGVhbih0aGlzLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGgpICYmIHRoaXMuY2xvc2VkO1xuICAgIHRoaXMuc2hvd0FsbFNlbGVjdGlvbkJ0biA9IHRoaXMubXVsdGlwbGUgJiYgQm9vbGVhbih0aGlzLnNlbGVjdGlvbi5sZW5ndGggPiAxKSAmJiB0aGlzLmNoaXBzQ29sbGFwc2VkO1xuICAgIHRoaXMuc2hvd1BsYWNlaG9sZGVyID0gdGhpcy5jbG9zZWQgJiYgIXRoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aDtcbiAgICB0aGlzLnNob3dFeHBhbmRlZFNlbGVjdGlvbkFjdGlvbnMgPSB0aGlzLm11bHRpcGxlICYmICF0aGlzLmNoaXBzQ29sbGFwc2VkO1xuICAgIHRoaXMuc2hvd1NlbGVjdEFsbENoZWNrYm94ID0gQm9vbGVhbih0aGlzLnBhZ2luYXRlZEZpbHRlcmVkT3B0aW9ucy5sZW5ndGgpICYmIHRoaXMuc2VsZWN0QWxsO1xuICB9XG5cbiAgLy8gQ29udHJvbCBWYWx1ZSBBY2Nlc3NvclxuXG4gIHdyaXRlVmFsdWUob2JqOiBhbnlbXSB8IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uID0gW107XG4gICAgaWYgKCghb2JqIHx8IChBcnJheS5pc0FycmF5KG9iaikgJiYgIW9iai5sZW5ndGgpKSAmJiB0aGlzLnNlbGVjdEFsbCkge1xuICAgICAgdGhpcy5zZWxlY3RBbGxPcHRpb25zKHRoaXMuc2VsZWN0QWxsKVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25Gb3JtLnJlc2V0KHt9LCB7ZW1pdEV2ZW50OiBmYWxzZX0pXG4gICAgICB0aGlzLnVwZGF0ZUZvcm1Db250cm9scyhvYmosIHRoaXMuc2VsZWN0aW9uRm9ybSwgdGhpcy5mb3JtQnVpbGRlciwgdGhpcy52YWx1ZVByb3AsIHRydWUpXG4gICAgICB0aGlzLnNlbGVjdGlvbkZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uID0gb2JqXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgIXRoaXMuc2VsZWN0aW9uLmxlbmd0aCkge1xuICAgICAgdGhpcy5oYW5kbGVTZWxlY3Rpb25DaGFuZ2Uob2JqKVxuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG9uQ2hhbmdlID0gKF86IGFueSkgPT4ge31cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICBvblRvdWNoZWQgPSAoKSA9PiB7fVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJhdXRvY29tcGxldGUtd3JhcHBlclwiXG4gICAgIFtjbGFzcy4tY2xvc2VkXT1cImNsb3NlZFwiXG4gICAgIFtjbGFzcy4tb3BlbmVkXT1cIiFjbG9zZWRcIlxuICAgICAjd3JhcHBlclxuPlxuICA8ZGl2IGNsYXNzPVwiYXV0b2NvbXBsZXRlXCIgI2F1dG9jb21wbGV0ZT5cbiAgICA8aW5wdXQgY2xhc3M9XCJzZWFyY2gtZmllbGRcIlxuICAgICAgICAgICAqbmdJZj1cIiFjbG9zZWQ7IGVsc2Ugc2VsZWN0aW9uT3JQbGFjZWhvbGRlclwiXG4gICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJpbnB1dENvbnRyb2xcIlxuICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIi8+XG4gICAgPG5nLXRlbXBsYXRlICNzZWxlY3Rpb25PclBsYWNlaG9sZGVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dDaGlwc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpcC1saXN0XCIgW2NsYXNzLi1jb2xsYXBzZWRdPVwiY2hpcHNDb2xsYXBzZWRcIlxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNoaXBzQ29udGFpbmVyQ2xhc3Nlc1wiPlxuICAgICAgICAgIDxhc2stY2hpcHMgW3N0eWxlLm1heC13aWR0aF09XCJjaGlwc0NvbGxhcHNlZCA/ICc4NSUnIDogJzEwMCUnXCJcbiAgICAgICAgICAgICAgICAgICAgIFtzaG93QWN0aW9uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBzZWxlY3RlZE9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbik9XCJoYW5kbGVDaGlwQWN0aW9uKG9wdGlvbilcIj5cbiAgICAgICAgICAgIHt7ZGlzcGxheShvcHRpb24pfX1cbiAgICAgICAgICA8L2Fzay1jaGlwcz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImV4cGFuZFwiIGRhdGEtdGVzdGlkPVwic2VlLW1vcmVcIiAqbmdJZj1cInNob3dBbGxTZWxlY3Rpb25CdG5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVDaGlwc0xpc3RBY3Rpb25DbGljaygpXCI+XG4gICAgICAgICAgICAre3tzZWxlY3Rpb24ubGVuZ3RoIC0gMX19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1wbGFjZWhvbGRlclwiIGRhdGEtdGVzdGlkPVwicGxhY2Vob2xkZXJcIiAqbmdJZj1cImNsb3NlZCAmJiAhc2VsZWN0ZWRPcHRpb25zLmxlbmd0aFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQXV0b2NvbXBsZXRlQ2xpY2soKVwiPnt7cGxhY2Vob2xkZXJ9fTwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxzcGFuIGNsYXNzPVwiYnRuLWV4cGFuZCBtYXRlcmlhbC1pY29uc1wiXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJidG4tZXhwYW5kXCJcbiAgICAgICAgICBbY2xhc3MuLWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQXV0b2NvbXBsZXRlQ2xpY2soKVwiXG4gICAgICAgICAgKm5nSWY9XCJjaGlwc0NvbGxhcHNlZFwiPlxuICAgICAge3tjbG9zZWQgPyBcImV4cGFuZF9tb3JlXCIgOiBcImV4cGFuZF9sZXNzXCJ9fVxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJhY3Rpb25zXCIgKm5nSWY9XCJzaG93RXhwYW5kZWRTZWxlY3Rpb25BY3Rpb25zXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJzZWUtbW9yZVwiIGRhdGEtdGVzdGlkPVwic2VlLWxlc3NcIlxuICAgICAgICAgIChjbGljayk9XCJoYW5kbGVDaGlwc0xpc3RBY3Rpb25DbGljaygpXCI+XG4gICAgICAgIHt7J1NFRV9MRVNTJyB8IHRyYW5zbGF0ZX19XG4gICAgPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwiYnRuLWV4cGFuZCBtYXRlcmlhbC1pY29uc1wiXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJidG4tZXhwYW5kXCJcbiAgICAgICAgICBbY2xhc3MuLWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQXV0b2NvbXBsZXRlQ2xpY2soKVwiPlxuICAgICAge3tjbG9zZWQgPyBcImV4cGFuZF9tb3JlXCIgOiBcImV4cGFuZF9sZXNzXCJ9fVxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNvdmVybGF5Q29udGVudD5cbiAgPGRpdiAjbGlzdCBjbGFzcz1cIm1lbnUtY29udGFpbmVyXCIgW2NsYXNzLi1tdWx0aXBsZV09XCJtdWx0aXBsZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbXVsdGlwbGU7IGVsc2UgbXVsdGlwbGVTZWxlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsaXN0XCIgI2xpc3RWaWV3cG9ydD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHBhZ2luYXRlZEZpbHRlcmVkT3B0aW9uc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcHRpb24taXRlbVwiXG4gICAgICAgICAgICAgICBbY2xhc3MuLWhpZ2hsaWdodGVkXT1cInNlbGVjdGVkT3B0aW9uICYmIHNlbGVjdGVkT3B0aW9uW3ZhbHVlUHJvcF0gPT09IG9wdGlvblt2YWx1ZVByb3BdXCJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVPcHRpb25TZWxlY3RlZChvcHRpb24pXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHRcIj57e2Rpc3BsYXkob3B0aW9uKX19PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjbXVsdGlwbGVTZWxlY3Rpb24+XG4gICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uLWl0ZW1cIiAqbmdJZj1cInNob3dTZWxlY3RBbGxDaGVja2JveFwiPlxuICAgICAgICA8YXNrLWNoZWNrYm94ICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVTZWxlY3RBbGwoJGV2ZW50KVwiIFsobmdNb2RlbCldPVwiY2hlY2tBbGxWYWx1ZVwiPlNlbGVjaW9uYXIgdG9kYXM8L2Fzay1jaGVja2JveD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGZvcm0gZGF0YS10ZXN0aWQ9XCJvcHRpb25zLWZvcm1cIiAqbmdJZj1cInNlbGVjdGlvbkZvcm0uY29udHJvbHNcIiBbZm9ybUdyb3VwXT1cInNlbGVjdGlvbkZvcm1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtYm94XCIgI2xpc3RWaWV3cG9ydD5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcGFnaW5hdGVkRmlsdGVyZWRPcHRpb25zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uLWl0ZW1cIj5cbiAgICAgICAgICAgICAgPGFzay1jaGVja2JveCBbZm9ybUNvbnRyb2xOYW1lXT1cIm9wdGlvblt2YWx1ZVByb3BdXCI+e3tkaXNwbGF5KG9wdGlvbil9fTwvYXNrLWNoZWNrYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9mb3JtPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPHNwYW4gY2xhc3M9XCJlbXB0eVwiICpuZ0lmPVwiIWZpbHRlcmVkT3B0aW9ucy5sZW5ndGhcIj57e2VtcHR5TWVzc2FnZSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=