@marcura/marcura-combobox 6.1.0 → 6.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +24 -24
  2. package/esm2020/lib/combobox.injectables.mjs +5 -5
  3. package/esm2020/lib/combobox.module.mjs +103 -103
  4. package/esm2020/lib/components/abstract-combobox/abstract-combobox.component.mjs +240 -240
  5. package/esm2020/lib/components/abstract-dropdown/abstract-dropdown.component.mjs +230 -230
  6. package/esm2020/lib/components/combobox/combobox.component.mjs +365 -361
  7. package/esm2020/lib/components/combobox-popup-footer/combobox-popup-footer.component.mjs +38 -38
  8. package/esm2020/lib/components/dropdown/dropdown.component.mjs +234 -234
  9. package/esm2020/lib/components/multiselect/multiselect.component.mjs +247 -247
  10. package/esm2020/lib/directives/combobox-item-template.directive.mjs +13 -13
  11. package/esm2020/lib/directives/dropdown-item-template.directive.mjs +13 -13
  12. package/esm2020/lib/directives/dropdown-value-template.directive.mjs +13 -13
  13. package/esm2020/lib/directives/multiselect-item-template.directive.mjs +13 -13
  14. package/esm2020/lib/directives/multiselect-tag-template.directive.mjs +13 -13
  15. package/esm2020/lib/directives/multiselect-tag-wrapper.directive.mjs +60 -60
  16. package/esm2020/lib/model/combobox-changed.event.mjs +4 -4
  17. package/esm2020/lib/model/combobox-item.type.mjs +12 -12
  18. package/esm2020/lib/model/combobox-kendo-component.interface.mjs +2 -2
  19. package/esm2020/lib/model/combobox-localization.interface.mjs +2 -2
  20. package/esm2020/lib/model/combobox-search-fn.type.mjs +1 -1
  21. package/esm2020/lib/model/combobox-search-settings-operator.enum.mjs +6 -6
  22. package/esm2020/lib/model/combobox-search-settings.interface.mjs +2 -2
  23. package/esm2020/lib/model/dropdown-changed.event.mjs +4 -4
  24. package/esm2020/lib/model/dropdown-kendo-component.interface.mjs +2 -2
  25. package/esm2020/lib/model/dropdown-localization.interface.mjs +2 -2
  26. package/esm2020/lib/model/dropdown-localizer.interface.mjs +2 -2
  27. package/esm2020/lib/model/multiselect-changed.event.mjs +4 -4
  28. package/esm2020/lib/model/multiselect-localization.interface.mjs +2 -2
  29. package/esm2020/marcura-marcura-combobox.mjs +4 -4
  30. package/esm2020/public-api.mjs +25 -25
  31. package/fesm2015/marcura-marcura-combobox.mjs +1482 -1478
  32. package/fesm2015/marcura-marcura-combobox.mjs.map +1 -1
  33. package/fesm2020/marcura-marcura-combobox.mjs +1477 -1473
  34. package/fesm2020/marcura-marcura-combobox.mjs.map +1 -1
  35. package/index.d.ts +5 -5
  36. package/lib/combobox.injectables.d.ts +8 -8
  37. package/lib/combobox.module.d.ts +25 -25
  38. package/lib/components/abstract-combobox/abstract-combobox.component.d.ts +59 -59
  39. package/lib/components/abstract-dropdown/abstract-dropdown.component.d.ts +76 -76
  40. package/lib/components/combobox/combobox.component.d.ts +65 -64
  41. package/lib/components/combobox-popup-footer/combobox-popup-footer.component.d.ts +13 -13
  42. package/lib/components/dropdown/dropdown.component.d.ts +45 -45
  43. package/lib/components/multiselect/multiselect.component.d.ts +51 -51
  44. package/lib/directives/combobox-item-template.directive.d.ts +5 -5
  45. package/lib/directives/dropdown-item-template.directive.d.ts +5 -5
  46. package/lib/directives/dropdown-value-template.directive.d.ts +5 -5
  47. package/lib/directives/multiselect-item-template.directive.d.ts +5 -5
  48. package/lib/directives/multiselect-tag-template.directive.d.ts +5 -5
  49. package/lib/directives/multiselect-tag-wrapper.directive.d.ts +21 -21
  50. package/lib/model/combobox-changed.event.d.ts +3 -3
  51. package/lib/model/combobox-item.type.d.ts +4 -4
  52. package/lib/model/combobox-kendo-component.interface.d.ts +7 -7
  53. package/lib/model/combobox-localization.interface.d.ts +5 -5
  54. package/lib/model/combobox-search-fn.type.d.ts +3 -3
  55. package/lib/model/combobox-search-settings-operator.enum.d.ts +4 -4
  56. package/lib/model/combobox-search-settings.interface.d.ts +5 -5
  57. package/lib/model/dropdown-changed.event.d.ts +3 -3
  58. package/lib/model/dropdown-kendo-component.interface.d.ts +6 -6
  59. package/lib/model/dropdown-localization.interface.d.ts +3 -3
  60. package/lib/model/dropdown-localizer.interface.d.ts +5 -5
  61. package/lib/model/multiselect-changed.event.d.ts +3 -3
  62. package/lib/model/multiselect-localization.interface.d.ts +5 -5
  63. package/package.json +1 -1
  64. package/public-api.d.ts +24 -24
@@ -1,361 +1,365 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, forwardRef, HostBinding, Inject, Input, Optional, Renderer2, TemplateRef, ViewChild, } from '@angular/core';
2
- import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { ABSTRACT_CONTROL_COMPONENT, ControlSize, isTrue, OPENABLE_CONTROL_COMPONENT, SIZEABLE_CONTROL_COMPONENT, STATEABLE_CONTROL_COMPONENT, TYPEABLE_CONTROL_COMPONENT, } from '@marcura/marcura-common';
4
- import { ComboBoxComponent as KendoComboBoxComponent } from '@progress/kendo-angular-dropdowns';
5
- import { debounceTime, filter, map } from 'rxjs/operators';
6
- import { COMBOBOX_LOCALIZER } from '../../combobox.injectables';
7
- import { ComboboxItemTemplateDirective } from '../../directives/combobox-item-template.directive';
8
- import { ComboboxChangedEvent } from '../../model/combobox-changed.event';
9
- import { AbstractComboboxComponent } from '../abstract-combobox/abstract-combobox.component';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@angular/common";
12
- import * as i2 from "@angular/forms";
13
- import * as i3 from "@progress/kendo-angular-dropdowns";
14
- import * as i4 from "../combobox-popup-footer/combobox-popup-footer.component";
15
- export class ComboboxComponent extends AbstractComboboxComponent {
16
- get hasHasValueCssClass() {
17
- return this.hasValue;
18
- }
19
- get hasIsHoveredCssClass() {
20
- return this._isHovered.value;
21
- }
22
- get hasIsFocusedCssClass() {
23
- return this.isFocused;
24
- }
25
- get hasIsDisabledCssClass() {
26
- return this.isDisabled;
27
- }
28
- get isSuccessType() {
29
- return this._isSuccessType;
30
- }
31
- get isErrorType() {
32
- return this._isErrorType;
33
- }
34
- get isWarningType() {
35
- return this._isWarningType;
36
- }
37
- get isHighlightedState() {
38
- return this._isHighlightedState;
39
- }
40
- get hasIsLoadingCssClass() {
41
- return this.isLoading || this._isSearching.value;
42
- }
43
- get hasHasResetCssClass() {
44
- return this.hasReset;
45
- }
46
- get hasIsOutlineCssClass() {
47
- return this.isOutline;
48
- }
49
- get loadingText() {
50
- return this._loadingText || this._localization.loadingText;
51
- }
52
- set loadingText(loadingText) {
53
- this._loadingText = loadingText;
54
- }
55
- get noItemsText() {
56
- return this._noItemsText || this._localization.noItemsText;
57
- }
58
- set noItemsText(noItemsText) {
59
- this._noItemsText = noItemsText;
60
- }
61
- get minSearchText() {
62
- return this._minSearchText || this._localization.minSearchText;
63
- }
64
- set minSearchText(minSearchText) {
65
- this._minSearchText = minSearchText;
66
- }
67
- get size() {
68
- return this._size;
69
- }
70
- set size(size) {
71
- if (size) {
72
- this._size = size;
73
- }
74
- this.hasSmallSizeCssClass = this._size === ControlSize.Small;
75
- this.hasMediumSizeCssClass = this._size === ControlSize.Medium;
76
- }
77
- get popupSettings() {
78
- return {
79
- animate: true,
80
- popupClass: `sg-combobox-popup${this.isGroupable ? ' sg-combobox-popup--is-groupable' : ''} ${this.popupClass || ''}`,
81
- };
82
- }
83
- constructor(changeDetectorRef, renderer, _localizer) {
84
- super(changeDetectorRef, renderer);
85
- this._localizer = _localizer;
86
- // TODO: technical-debt this component shouldn't have default value
87
- this.defaultValue = null;
88
- this._size = ControlSize.Medium;
89
- this._loadingText = null;
90
- this._noItemsText = null;
91
- this._minSearchText = null;
92
- this._localization = {
93
- loadingText: 'Loading...',
94
- noItemsText: 'No items found.',
95
- minSearchText: 'Enter {minSearchCharacters} or more characters.',
96
- };
97
- this.itemTemplate = null;
98
- this.hasCssClass = true;
99
- this.hasSmallSizeCssClass = false;
100
- this.hasMediumSizeCssClass = true;
101
- this.shouldSuggest = true;
102
- this.openOnFocus = true;
103
- this.allowCustom = false;
104
- /**
105
- * This field contains factory method for items which will be created placing customizable values inside component. Works when allowCustom is true.
106
- *
107
- * @memberof ComboboxComponent
108
- */
109
- this.itemFactory = (text) => {
110
- return { [this.valueField]: null, [this.textField]: text };
111
- };
112
- this.valueNormalizer = (text$) => text$.pipe(map(() => {
113
- let value = null;
114
- if (!this.component) {
115
- return value;
116
- }
117
- // Can't use this._searchText.value here as it might be empty, consider:
118
- // 1) type custom text, 2) focus out and back in 3) there's a text in searchbar,
119
- // but this._searchText.value is empty.
120
- // So this.component.searchbar.value is to be used.
121
- const text = (this.component.searchbar.value || '').trim();
122
- if (!text) {
123
- return value;
124
- }
125
- if (this.component.value && this.component.value[this.textField].toLowerCase() === text.toLowerCase()) {
126
- value = this.component.value;
127
- }
128
- else if (this.getItem(this._valueNormalizerItems, text)) {
129
- // If areItemsCached is off, then this.data will be lost by this moment,
130
- // so we use a cache this.valueNormalizerItems.
131
- // This is relevant especially in IE/Edge where this.component.value is null,
132
- // so the code falls back to this condition section.
133
- value = this.getItem(this._valueNormalizerItems, text);
134
- }
135
- else if (this.allowCustom) {
136
- value = this.itemFactory(text);
137
- if (this._isSync) {
138
- // Restore original items after selection, otherwise when opening the list
139
- // next time, only the selected item will appear.
140
- this.loadItems();
141
- }
142
- }
143
- else {
144
- // Clears search text if suggestion hasn't been selected.
145
- // Steps to reproduce.
146
- // 1. Use Dymanic Empty sample.
147
- // 2. Type 'to', wait for the list to load, but don't select 'Tokai'. Instead hit Esc key.
148
- // 3. See that the search bar still contains 'to' text, while the value is null,
149
- // which is wrong - search bar text should be removed.
150
- // this.component.searchbar.suggestedText = ''; // This doesn't work.
151
- // As the above line doesn't work, so workaround it by setting form control value to null.
152
- this.valueFormControl.setValue(value);
153
- }
154
- this._valueNormalizerItems = [];
155
- return value;
156
- }));
157
- this._localize();
158
- }
159
- _localize() {
160
- if (!this._localizer) {
161
- return;
162
- }
163
- this._localization = this._localizer.localization;
164
- this._observer.listen(this._localizer.localizationChanged, (localization) => {
165
- this._localization = localization;
166
- });
167
- }
168
- onResetClicked() {
169
- if (!this.hasReset) {
170
- return;
171
- }
172
- this._resetedValue = this.value;
173
- this.focus();
174
- this._reset();
175
- if (this.openOnFocus) {
176
- this.open();
177
- }
178
- }
179
- ngOnInit() {
180
- this._setComponent(this.component);
181
- this.init();
182
- // Opened.
183
- this._observer.listen(this._isOpen.pipe(filter((event) => event.isOpen)), () => {
184
- if (!this.areItemsCached) {
185
- this._hasSearched.next(false);
186
- }
187
- if (this.canLoadItems(this._searchText.value) && this._loadedItems.value.length === 0) {
188
- this.loadItems(this._searchText.value);
189
- }
190
- });
191
- this._observer.listen(this._isOpen.pipe(filter((event) => event.isOpen),
192
- // When clicking reset icon, opened event triggers search event with
193
- // with old searchbar value instead of an empty string.
194
- // So we need to give searchbar a moment before fire opened event.
195
- // Steps to reproduce the bug:
196
- // 1) Search for Vladivostok and select it 2) Reset value with icon
197
- // 3) searchText remains "Vladivostok", but should be "".
198
- debounceTime(50)), () => this.opened.emit());
199
- // Focused.
200
- this._observer.listen(this._isFocused.pipe(filter(isTrue)), () => {
201
- if (this.openOnFocus) {
202
- this.open();
203
- }
204
- });
205
- }
206
- onChanged(value) {
207
- if (!this.hasValueChanged(value)) {
208
- return;
209
- }
210
- value = value === undefined ? this.defaultValue : value;
211
- this.value = value;
212
- this.component.searchbar.suggestedText = '';
213
- this.propagateChanged(value);
214
- this.propagateTouched();
215
- this._emitChanged(value);
216
- if (!value && this._isSync) {
217
- // Restore original items after selection, otherwise when opening the list
218
- // next time, only the previously selected item will appear.
219
- // Steps to reproduce: 1) Select "Cayman Brac", 2) Focus out and focus back,
220
- // 3) Delete a couple of characters with a Backspace from the end and hit Enter.
221
- // 4) Open the list.
222
- this.loadItems();
223
- }
224
- }
225
- _emitChanged(value) {
226
- this.changed.emit(new ComboboxChangedEvent(value));
227
- }
228
- hasValueChanged(value) {
229
- return !this.isItemEqual(this.value, value);
230
- }
231
- }
232
- ComboboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: ComboboxComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: COMBOBOX_LOCALIZER, optional: true }], target: i0.ɵɵFactoryTarget.Component });
233
- ComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: ComboboxComponent, selector: "sg-combobox", inputs: { formControl: "formControl", loadingText: "loadingText", noItemsText: "noItemsText", minSearchText: "minSearchText", shouldSuggest: "shouldSuggest", openOnFocus: "openOnFocus", allowCustom: "allowCustom", size: "size", itemFactory: "itemFactory" }, host: { properties: { "class.sg-combobox": "this.hasCssClass", "class.sg-combobox--has-value": "this.hasHasValueCssClass", "class.sg-combobox--is-hovered": "this.hasIsHoveredCssClass", "class.sg-combobox--is-focused": "this.hasIsFocusedCssClass", "class.sg-combobox--is-disabled": "this.hasIsDisabledCssClass", "class.sg-combobox--type-success": "this.isSuccessType", "class.sg-combobox--type-error": "this.isErrorType", "class.sg-combobox--type-warning": "this.isWarningType", "class.sg-combobox--state-highlighted": "this.isHighlightedState", "class.sg-combobox--is-loading": "this.hasIsLoadingCssClass", "class.sg-combobox--has-reset": "this.hasHasResetCssClass", "class.sg-combobox--is-outline": "this.hasIsOutlineCssClass", "class.sg-combobox--size-small": "this.hasSmallSizeCssClass", "class.sg-combobox--size-medium": "this.hasMediumSizeCssClass" } }, providers: [
234
- {
235
- provide: NG_VALUE_ACCESSOR,
236
- useExisting: forwardRef(() => ComboboxComponent),
237
- multi: true,
238
- },
239
- {
240
- provide: ABSTRACT_CONTROL_COMPONENT,
241
- useExisting: forwardRef(() => ComboboxComponent),
242
- },
243
- {
244
- provide: OPENABLE_CONTROL_COMPONENT,
245
- useExisting: forwardRef(() => ComboboxComponent),
246
- },
247
- {
248
- provide: STATEABLE_CONTROL_COMPONENT,
249
- useExisting: forwardRef(() => ComboboxComponent),
250
- },
251
- {
252
- provide: TYPEABLE_CONTROL_COMPONENT,
253
- useExisting: forwardRef(() => ComboboxComponent),
254
- },
255
- {
256
- provide: SIZEABLE_CONTROL_COMPONENT,
257
- useExisting: forwardRef(() => ComboboxComponent),
258
- },
259
- ], queries: [{ propertyName: "itemTemplate", first: true, predicate: ComboboxItemTemplateDirective, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "component", first: true, predicate: ["component"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<kendo-combobox\r\n #component\r\n [placeholder]=\"placeholder\"\r\n [formControl]=\"valueFormControl\"\r\n [data]=\"combinedItems | async\"\r\n [filterable]=\"isSearchable\"\r\n [valueField]=\"valueKey\"\r\n [textField]=\"textKey\"\r\n [loading]=\"isLoadingSpinnerVisible | async\"\r\n [clearButton]=\"false\"\r\n [popupSettings]=\"popupSettings\"\r\n [listHeight]=\"listHeight\"\r\n [valuePrimitive]=\"isPrimitiveValue\"\r\n [suggest]=\"shouldSuggest\"\r\n [allowCustom]=\"true\"\r\n [valueNormalizer]=\"valueNormalizer\"\r\n (filterChange)=\"onSearched($event)\"\r\n (valueChange)=\"onChanged($event)\"\r\n (open)=\"onOpened()\"\r\n (close)=\"onClosed()\"\r\n (focus)=\"onFocused()\"\r\n (blur)=\"onBlurred()\"\r\n>\r\n <ng-template kendoDropDownListFooterTemplate>\r\n <sg-combobox-popup-footer\r\n [isLoadingTextVisible]=\"isLoadingTextVisible | async\"\r\n [isNoItemsTextVisible]=\"isNoItemsTextVisible | async\"\r\n [isMinSearchTextVisible]=\"isMinSearchTextVisible | async\"\r\n [loadingText]=\"loadingText\"\r\n [noItemsText]=\"noItemsText\"\r\n [minSearchText]=\"minSearchText\"\r\n [minSearchCharacters]=\"minSearchCharacters\"\r\n >\r\n </sg-combobox-popup-footer>\r\n </ng-template>\r\n <ng-template kendoComboBoxNoDataTemplate></ng-template>\r\n <ng-template *ngIf=\"itemTemplate\" kendoComboBoxItemTemplate let-dataItem>\r\n <span [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{item: dataItem}\"></span>\r\n </ng-template>\r\n</kendo-combobox>\r\n<div class=\"sg-combobox__reset\" *ngIf=\"!isDisabled\" (click)=\"onResetClicked()\">\r\n <i class=\"far fa-times\"></i>\r\n</div>\r\n<div class=\"sg-combobox__state-line\"></div>\r\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.ComboBoxComponent, selector: "kendo-combobox", inputs: ["focusableId", "allowCustom", "valueNormalizer", "placeholder", "listHeight", "suggest", "clearButton", "disabled", "readonly", "tabindex", "filterable", "data", "value", "valuePrimitive", "popupSettings", "itemDisabled", "tabIndex", "virtual", "loading", "textField", "valueField", "iconClass"], outputs: ["valueChange", "selectionChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoComboBox"] }, { kind: "directive", type: i3.FooterTemplateDirective, selector: "[kendoDropDownListFooterTemplate],[kendoComboBoxFooterTemplate],[kendoDropDownTreeFooterTemplate],[kendoMultiColumnComboBoxFooterTemplate],[kendoAutoCompleteFooterTemplate],[kendoMultiSelectFooterTemplate],[kendoMultiSelectTreeFooterTemplate]" }, { kind: "directive", type: i3.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { kind: "directive", type: i3.NoDataTemplateDirective, selector: "[kendoDropDownListNoDataTemplate],[kendoDropDownTreeNoDataTemplate],[kendoComboBoxNoDataTemplate],[kendoMultiColumnComboBoxNoDataTemplate],[kendoAutoCompleteNoDataTemplate],[kendoMultiSelectNoDataTemplate],[kendoMultiSelectTreeNoDataTemplate]" }, { kind: "component", type: i4.ComboboxPopupFooterComponent, selector: "sg-combobox-popup-footer", inputs: ["isLoadingTextVisible", "isNoItemsTextVisible", "isMinSearchTextVisible", "loadingText", "noItemsText", "minSearchText", "minSearchCharacters"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
260
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: ComboboxComponent, decorators: [{
261
- type: Component,
262
- args: [{ selector: 'sg-combobox', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
263
- {
264
- provide: NG_VALUE_ACCESSOR,
265
- useExisting: forwardRef(() => ComboboxComponent),
266
- multi: true,
267
- },
268
- {
269
- provide: ABSTRACT_CONTROL_COMPONENT,
270
- useExisting: forwardRef(() => ComboboxComponent),
271
- },
272
- {
273
- provide: OPENABLE_CONTROL_COMPONENT,
274
- useExisting: forwardRef(() => ComboboxComponent),
275
- },
276
- {
277
- provide: STATEABLE_CONTROL_COMPONENT,
278
- useExisting: forwardRef(() => ComboboxComponent),
279
- },
280
- {
281
- provide: TYPEABLE_CONTROL_COMPONENT,
282
- useExisting: forwardRef(() => ComboboxComponent),
283
- },
284
- {
285
- provide: SIZEABLE_CONTROL_COMPONENT,
286
- useExisting: forwardRef(() => ComboboxComponent),
287
- },
288
- ], template: "<kendo-combobox\r\n #component\r\n [placeholder]=\"placeholder\"\r\n [formControl]=\"valueFormControl\"\r\n [data]=\"combinedItems | async\"\r\n [filterable]=\"isSearchable\"\r\n [valueField]=\"valueKey\"\r\n [textField]=\"textKey\"\r\n [loading]=\"isLoadingSpinnerVisible | async\"\r\n [clearButton]=\"false\"\r\n [popupSettings]=\"popupSettings\"\r\n [listHeight]=\"listHeight\"\r\n [valuePrimitive]=\"isPrimitiveValue\"\r\n [suggest]=\"shouldSuggest\"\r\n [allowCustom]=\"true\"\r\n [valueNormalizer]=\"valueNormalizer\"\r\n (filterChange)=\"onSearched($event)\"\r\n (valueChange)=\"onChanged($event)\"\r\n (open)=\"onOpened()\"\r\n (close)=\"onClosed()\"\r\n (focus)=\"onFocused()\"\r\n (blur)=\"onBlurred()\"\r\n>\r\n <ng-template kendoDropDownListFooterTemplate>\r\n <sg-combobox-popup-footer\r\n [isLoadingTextVisible]=\"isLoadingTextVisible | async\"\r\n [isNoItemsTextVisible]=\"isNoItemsTextVisible | async\"\r\n [isMinSearchTextVisible]=\"isMinSearchTextVisible | async\"\r\n [loadingText]=\"loadingText\"\r\n [noItemsText]=\"noItemsText\"\r\n [minSearchText]=\"minSearchText\"\r\n [minSearchCharacters]=\"minSearchCharacters\"\r\n >\r\n </sg-combobox-popup-footer>\r\n </ng-template>\r\n <ng-template kendoComboBoxNoDataTemplate></ng-template>\r\n <ng-template *ngIf=\"itemTemplate\" kendoComboBoxItemTemplate let-dataItem>\r\n <span [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{item: dataItem}\"></span>\r\n </ng-template>\r\n</kendo-combobox>\r\n<div class=\"sg-combobox__reset\" *ngIf=\"!isDisabled\" (click)=\"onResetClicked()\">\r\n <i class=\"far fa-times\"></i>\r\n</div>\r\n<div class=\"sg-combobox__state-line\"></div>\r\n" }]
289
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: undefined, decorators: [{
290
- type: Optional
291
- }, {
292
- type: Inject,
293
- args: [COMBOBOX_LOCALIZER]
294
- }] }]; }, propDecorators: { formControl: [{
295
- type: Input
296
- }], component: [{
297
- type: ViewChild,
298
- args: ['component', { static: true }]
299
- }], itemTemplate: [{
300
- type: ContentChild,
301
- args: [ComboboxItemTemplateDirective, { read: TemplateRef, static: true }]
302
- }], hasCssClass: [{
303
- type: HostBinding,
304
- args: ['class.sg-combobox']
305
- }], hasHasValueCssClass: [{
306
- type: HostBinding,
307
- args: ['class.sg-combobox--has-value']
308
- }], hasIsHoveredCssClass: [{
309
- type: HostBinding,
310
- args: ['class.sg-combobox--is-hovered']
311
- }], hasIsFocusedCssClass: [{
312
- type: HostBinding,
313
- args: ['class.sg-combobox--is-focused']
314
- }], hasIsDisabledCssClass: [{
315
- type: HostBinding,
316
- args: ['class.sg-combobox--is-disabled']
317
- }], isSuccessType: [{
318
- type: HostBinding,
319
- args: ['class.sg-combobox--type-success']
320
- }], isErrorType: [{
321
- type: HostBinding,
322
- args: ['class.sg-combobox--type-error']
323
- }], isWarningType: [{
324
- type: HostBinding,
325
- args: ['class.sg-combobox--type-warning']
326
- }], isHighlightedState: [{
327
- type: HostBinding,
328
- args: ['class.sg-combobox--state-highlighted']
329
- }], hasIsLoadingCssClass: [{
330
- type: HostBinding,
331
- args: ['class.sg-combobox--is-loading']
332
- }], hasHasResetCssClass: [{
333
- type: HostBinding,
334
- args: ['class.sg-combobox--has-reset']
335
- }], hasIsOutlineCssClass: [{
336
- type: HostBinding,
337
- args: ['class.sg-combobox--is-outline']
338
- }], hasSmallSizeCssClass: [{
339
- type: HostBinding,
340
- args: ['class.sg-combobox--size-small']
341
- }], hasMediumSizeCssClass: [{
342
- type: HostBinding,
343
- args: ['class.sg-combobox--size-medium']
344
- }], loadingText: [{
345
- type: Input
346
- }], noItemsText: [{
347
- type: Input
348
- }], minSearchText: [{
349
- type: Input
350
- }], shouldSuggest: [{
351
- type: Input
352
- }], openOnFocus: [{
353
- type: Input
354
- }], allowCustom: [{
355
- type: Input
356
- }], size: [{
357
- type: Input
358
- }], itemFactory: [{
359
- type: Input
360
- }] } });
361
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFdBQVcsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsV0FBVyxFQUVYLE1BQU0sRUFDTiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLDJCQUEyQixFQUMzQiwwQkFBMEIsR0FDM0IsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUMsaUJBQWlCLElBQUksc0JBQXNCLEVBQWdCLE1BQU0sbUNBQW1DLENBQUM7QUFFN0csT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFDaEcsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFHeEUsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sa0RBQWtELENBQUM7Ozs7OztBQWtDM0YsTUFBTSxPQUFPLGlCQUF5QixTQUFRLHlCQUEyRTtJQXNCdkgsSUFDVyxtQkFBbUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxJQUNXLG9CQUFvQjtRQUM3QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFDRCxJQUNXLG9CQUFvQjtRQUM3QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUNELElBQ1cscUJBQXFCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBQ0QsSUFDVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBQ0QsSUFDVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBQ0QsSUFDVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBQ0QsSUFDVyxrQkFBa0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQ1csb0JBQW9CO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztJQUNuRCxDQUFDO0lBQ0QsSUFDVyxtQkFBbUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxJQUNXLG9CQUFvQjtRQUM3QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUtELElBQ1csV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQVcsV0FBVyxDQUFDLFdBQW1CO1FBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxJQUNXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO0lBQzdELENBQUM7SUFDRCxJQUFXLFdBQVcsQ0FBQyxXQUFtQjtRQUN4QyxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFDVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsSUFBVyxhQUFhLENBQUMsYUFBcUI7UUFDNUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7SUFDdEMsQ0FBQztJQU9ELElBQ1csSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBQ0QsSUFBVyxJQUFJLENBQUMsSUFBaUI7UUFDL0IsSUFBSSxJQUFJLEVBQUU7WUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztTQUNuQjtRQUVELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFDN0QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLE1BQU0sQ0FBQztJQUNqRSxDQUFDO0lBVUQsSUFBVyxhQUFhO1FBQ3RCLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSTtZQUNiLFVBQVUsRUFBRSxvQkFBb0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFDeEYsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUNyQixFQUFFO1NBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxZQUNFLGlCQUFvQyxFQUNwQyxRQUFtQixFQUdGLFVBQXFEO1FBRXRFLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUZsQixlQUFVLEdBQVYsVUFBVSxDQUEyQztRQS9IeEUsbUVBQW1FO1FBQzFDLGlCQUFZLEdBQVUsSUFBVyxDQUFDO1FBQ25ELFVBQUssR0FBZ0IsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUN4QyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUNyQyxrQkFBYSxHQUEwQjtZQUM3QyxXQUFXLEVBQUUsWUFBWTtZQUN6QixXQUFXLEVBQUUsaUJBQWlCO1lBQzlCLGFBQWEsRUFBRSxpREFBaUQ7U0FDakUsQ0FBQztRQUlLLGlCQUFZLEdBQTRCLElBQUksQ0FBQztRQUVwQyxnQkFBVyxHQUFZLElBQUksQ0FBQztRQThDckMseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBRXRDLDBCQUFxQixHQUFZLElBQUksQ0FBQztRQXVCdEMsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFFOUIsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFFNUIsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFhcEM7Ozs7V0FJRztRQUVJLGdCQUFXLEdBQTRCLENBQUMsSUFBWSxFQUFTLEVBQUU7WUFDcEUsT0FBTyxFQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQVEsQ0FBQztRQUNsRSxDQUFDLENBQUM7UUF3R0ssb0JBQWUsR0FBRyxDQUFDLEtBQXlCLEVBQU8sRUFBRSxDQUMxRCxLQUFLLENBQUMsSUFBSSxDQUNSLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxJQUFJLEtBQUssR0FBaUIsSUFBSSxDQUFDO1lBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNuQixPQUFPLEtBQUssQ0FBQzthQUNkO1lBQ0Qsd0VBQXdFO1lBQ3hFLGdGQUFnRjtZQUNoRix1Q0FBdUM7WUFDdkMsbURBQW1EO1lBQ25ELE1BQU0sSUFBSSxHQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRW5FLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1QsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUVELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDckcsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO2FBQzlCO2lCQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3pELHdFQUF3RTtnQkFDeEUsK0NBQStDO2dCQUMvQyw2RUFBNkU7Z0JBQzdFLG9EQUFvRDtnQkFDcEQsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3hEO2lCQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDM0IsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRS9CLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDaEIsMEVBQTBFO29CQUMxRSxpREFBaUQ7b0JBQ2pELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztpQkFDbEI7YUFDRjtpQkFBTTtnQkFDTCx5REFBeUQ7Z0JBQ3pELHNCQUFzQjtnQkFDdEIsK0JBQStCO2dCQUMvQiwwRkFBMEY7Z0JBQzFGLGdGQUFnRjtnQkFDaEYsc0RBQXNEO2dCQUN0RCxxRUFBcUU7Z0JBQ3JFLDBGQUEwRjtnQkFDMUYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN2QztZQUVELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7WUFDaEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBdElGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRU8sU0FBUztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7UUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQzFFLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVlLGNBQWM7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUVkLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDYjtJQUNILENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVosVUFBVTtRQUNWLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFO1lBQzdFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMvQjtZQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3JGLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN4QztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMvQixvRUFBb0U7UUFDcEUsdURBQXVEO1FBQ3ZELGtFQUFrRTtRQUNsRSw4QkFBOEI7UUFDOUIsbUVBQW1FO1FBQ25FLHlEQUF5RDtRQUN6RCxZQUFZLENBQUMsRUFBRSxDQUFDLENBQ2pCLEVBQ0QsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FDekIsQ0FBQztRQUVGLFdBQVc7UUFDWCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUU7WUFDL0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNwQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDYjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVlLFNBQVMsQ0FBQyxLQUFZO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLE9BQU87U0FDUjtRQUVELEtBQUssR0FBRyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDeEQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV6QixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDMUIsMEVBQTBFO1lBQzFFLDREQUE0RDtZQUM1RCw0RUFBNEU7WUFDNUUsZ0ZBQWdGO1lBQ2hGLG9CQUFvQjtZQUNwQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDbEI7SUFDSCxDQUFDO0lBb0RrQixZQUFZLENBQUMsS0FBWTtRQUMxQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVrQixlQUFlLENBQUMsS0FBK0I7UUFDaEUsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDOzs4R0FyUlUsaUJBQWlCLDRFQW1JbEIsa0JBQWtCO2tHQW5JakIsaUJBQWlCLG1vQ0E1QmpCO1FBQ1Q7WUFDRSxPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUM7WUFDaEQsS0FBSyxFQUFFLElBQUk7U0FDWjtRQUNEO1lBQ0UsT0FBTyxFQUFFLDBCQUEwQjtZQUNuQyxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDO1NBQ2pEO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsMEJBQTBCO1lBQ25DLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUM7U0FDakQ7UUFDRDtZQUNFLE9BQU8sRUFBRSwyQkFBMkI7WUFDcEMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztTQUNqRDtRQUNEO1lBQ0UsT0FBTyxFQUFFLDBCQUEwQjtZQUNuQyxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDO1NBQ2pEO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsMEJBQTBCO1lBQ25DLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUM7U0FDakQ7S0FDRixvRUFvQmEsNkJBQTZCLDJCQUFTLFdBQVcsd0xDdEZqRSwyc0RBNENBOzJGRHdCYSxpQkFBaUI7a0JBaEM3QixTQUFTOytCQUNFLGFBQWEsbUJBRU4sdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQzs0QkFDaEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLDBCQUEwQjs0QkFDbkMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUM7eUJBQ2pEO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSwwQkFBMEI7NEJBQ25DLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDO3lCQUNqRDt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsMkJBQTJCOzRCQUNwQyxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQzt5QkFDakQ7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLDBCQUEwQjs0QkFDbkMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUM7eUJBQ2pEO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSwwQkFBMEI7NEJBQ25DLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDO3lCQUNqRDtxQkFDRjs7MEJBb0lFLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsa0JBQWtCOzRDQWhJWixXQUFXO3NCQUQxQixLQUFLO2dCQWVDLFNBQVM7c0JBRGYsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUcvQixZQUFZO3NCQURsQixZQUFZO3VCQUFDLDZCQUE2QixFQUFFLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUc5RCxXQUFXO3NCQUQxQixXQUFXO3VCQUFDLG1CQUFtQjtnQkFHckIsbUJBQW1CO3NCQUQ3QixXQUFXO3VCQUFDLDhCQUE4QjtnQkFLaEMsb0JBQW9CO3NCQUQ5QixXQUFXO3VCQUFDLCtCQUErQjtnQkFLakMsb0JBQW9CO3NCQUQ5QixXQUFXO3VCQUFDLCtCQUErQjtnQkFLakMscUJBQXFCO3NCQUQvQixXQUFXO3VCQUFDLGdDQUFnQztnQkFLbEMsYUFBYTtzQkFEdkIsV0FBVzt1QkFBQyxpQ0FBaUM7Z0JBS25DLFdBQVc7c0JBRHJCLFdBQVc7dUJBQUMsK0JBQStCO2dCQUtqQyxhQUFhO3NCQUR2QixXQUFXO3VCQUFDLGlDQUFpQztnQkFLbkMsa0JBQWtCO3NCQUQ1QixXQUFXO3VCQUFDLHNDQUFzQztnQkFLeEMsb0JBQW9CO3NCQUQ5QixXQUFXO3VCQUFDLCtCQUErQjtnQkFLakMsbUJBQW1CO3NCQUQ3QixXQUFXO3VCQUFDLDhCQUE4QjtnQkFLaEMsb0JBQW9CO3NCQUQ5QixXQUFXO3VCQUFDLCtCQUErQjtnQkFLckMsb0JBQW9CO3NCQUQxQixXQUFXO3VCQUFDLCtCQUErQjtnQkFHckMscUJBQXFCO3NCQUQzQixXQUFXO3VCQUFDLGdDQUFnQztnQkFHbEMsV0FBVztzQkFEckIsS0FBSztnQkFRSyxXQUFXO3NCQURyQixLQUFLO2dCQVFLLGFBQWE7c0JBRHZCLEtBQUs7Z0JBUUMsYUFBYTtzQkFEbkIsS0FBSztnQkFHQyxXQUFXO3NCQURqQixLQUFLO2dCQUdDLFdBQVc7c0JBRGpCLEtBQUs7Z0JBR0ssSUFBSTtzQkFEZCxLQUFLO2dCQWtCQyxXQUFXO3NCQURqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFJlbmRlcmVyMixcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Zvcm1Db250cm9sLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQUJTVFJBQ1RfQ09OVFJPTF9DT01QT05FTlQsXG4gIENvbnRyb2xTaXplLFxuICBJU2l6ZWFibGVDb250cm9sQ29tcG9uZW50LFxuICBpc1RydWUsXG4gIE9QRU5BQkxFX0NPTlRST0xfQ09NUE9ORU5ULFxuICBTSVpFQUJMRV9DT05UUk9MX0NPTVBPTkVOVCxcbiAgU1RBVEVBQkxFX0NPTlRST0xfQ09NUE9ORU5ULFxuICBUWVBFQUJMRV9DT05UUk9MX0NPTVBPTkVOVCxcbn0gZnJvbSAnQG1hcmN1cmEvbWFyY3VyYS1jb21tb24nO1xuaW1wb3J0IHtDb21ib0JveENvbXBvbmVudCBhcyBLZW5kb0NvbWJvQm94Q29tcG9uZW50LCBQb3B1cFNldHRpbmdzfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1kcm9wZG93bnMnO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBmaWx0ZXIsIG1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtDT01CT0JPWF9MT0NBTElaRVJ9IGZyb20gJy4uLy4uL2NvbWJvYm94LmluamVjdGFibGVzJztcbmltcG9ydCB7Q29tYm9ib3hJdGVtVGVtcGxhdGVEaXJlY3RpdmV9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY29tYm9ib3gtaXRlbS10ZW1wbGF0ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHtDb21ib2JveENoYW5nZWRFdmVudH0gZnJvbSAnLi4vLi4vbW9kZWwvY29tYm9ib3gtY2hhbmdlZC5ldmVudCc7XG5pbXBvcnQge0lDb21ib2JveExvY2FsaXphdGlvbn0gZnJvbSAnLi4vLi4vbW9kZWwvY29tYm9ib3gtbG9jYWxpemF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQge0lEcm9wZG93bkxvY2FsaXplcn0gZnJvbSAnLi4vLi4vbW9kZWwvZHJvcGRvd24tbG9jYWxpemVyLmludGVyZmFjZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29tYm9ib3hDb21wb25lbnR9IGZyb20gJy4uL2Fic3RyYWN0LWNvbWJvYm94L2Fic3RyYWN0LWNvbWJvYm94LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NnLWNvbWJvYm94JyxcbiAgdGVtcGxhdGVVcmw6ICdjb21ib2JveC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvbWJvYm94Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogQUJTVFJBQ1RfQ09OVFJPTF9DT01QT05FTlQsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb21ib2JveENvbXBvbmVudCksXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBPUEVOQUJMRV9DT05UUk9MX0NPTVBPTkVOVCxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvbWJvYm94Q29tcG9uZW50KSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IFNUQVRFQUJMRV9DT05UUk9MX0NPTVBPTkVOVCxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvbWJvYm94Q29tcG9uZW50KSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IFRZUEVBQkxFX0NPTlRST0xfQ09NUE9ORU5ULFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ29tYm9ib3hDb21wb25lbnQpLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogU0laRUFCTEVfQ09OVFJPTF9DT01QT05FTlQsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb21ib2JveENvbXBvbmVudCksXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tYm9ib3hDb21wb25lbnQ8VEl0ZW0+IGV4dGVuZHMgQWJzdHJhY3RDb21ib2JveENvbXBvbmVudDxUSXRlbSwgVEl0ZW0gfCBudWxsLCBDb21ib2JveENoYW5nZWRFdmVudDxUSXRlbT4+XG4gIGltcGxlbWVudHMgSVNpemVhYmxlQ29udHJvbENvbXBvbmVudCwgT25Jbml0IHtcbiAgQElucHV0KClcbiAgcHVibGljIG92ZXJyaWRlIGZvcm1Db250cm9sITogRm9ybUNvbnRyb2w8VEl0ZW0gfCBudWxsPjtcblxuICAvLyBUT0RPOiB0ZWNobmljYWwtZGVidCB0aGlzIGNvbXBvbmVudCBzaG91bGRuJ3QgaGF2ZSBkZWZhdWx0IHZhbHVlXG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBkZWZhdWx0VmFsdWU6IFRJdGVtID0gbnVsbCBhcyBhbnk7XG4gIHByaXZhdGUgX3NpemU6IENvbnRyb2xTaXplID0gQ29udHJvbFNpemUuTWVkaXVtO1xuICBwcml2YXRlIF9sb2FkaW5nVGV4dDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX25vSXRlbXNUZXh0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbWluU2VhcmNoVGV4dDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2xvY2FsaXphdGlvbjogSUNvbWJvYm94TG9jYWxpemF0aW9uID0ge1xuICAgIGxvYWRpbmdUZXh0OiAnTG9hZGluZy4uLicsXG4gICAgbm9JdGVtc1RleHQ6ICdObyBpdGVtcyBmb3VuZC4nLFxuICAgIG1pblNlYXJjaFRleHQ6ICdFbnRlciB7bWluU2VhcmNoQ2hhcmFjdGVyc30gb3IgbW9yZSBjaGFyYWN0ZXJzLicsXG4gIH07XG4gIEBWaWV3Q2hpbGQoJ2NvbXBvbmVudCcsIHtzdGF0aWM6IHRydWV9KVxuICBwdWJsaWMgY29tcG9uZW50ITogS2VuZG9Db21ib0JveENvbXBvbmVudDtcbiAgQENvbnRlbnRDaGlsZChDb21ib2JveEl0ZW1UZW1wbGF0ZURpcmVjdGl2ZSwge3JlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWV9KVxuICBwdWJsaWMgaXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctY29tYm9ib3gnKVxuICBwdWJsaWMgcmVhZG9ubHkgaGFzQ3NzQ2xhc3M6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLWNvbWJvYm94LS1oYXMtdmFsdWUnKVxuICBwdWJsaWMgZ2V0IGhhc0hhc1ZhbHVlQ3NzQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzVmFsdWU7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1jb21ib2JveC0taXMtaG92ZXJlZCcpXG4gIHB1YmxpYyBnZXQgaGFzSXNIb3ZlcmVkQ3NzQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzSG92ZXJlZC52YWx1ZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLWNvbWJvYm94LS1pcy1mb2N1c2VkJylcbiAgcHVibGljIGdldCBoYXNJc0ZvY3VzZWRDc3NDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0ZvY3VzZWQ7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1jb21ib2JveC0taXMtZGlzYWJsZWQnKVxuICBwdWJsaWMgZ2V0IGhhc0lzRGlzYWJsZWRDc3NDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0Rpc2FibGVkO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctY29tYm9ib3gtLXR5cGUtc3VjY2VzcycpXG4gIHB1YmxpYyBnZXQgaXNTdWNjZXNzVHlwZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdWNjZXNzVHlwZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLWNvbWJvYm94LS10eXBlLWVycm9yJylcbiAgcHVibGljIGdldCBpc0Vycm9yVHlwZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNFcnJvclR5cGU7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1jb21ib2JveC0tdHlwZS13YXJuaW5nJylcbiAgcHVibGljIGdldCBpc1dhcm5pbmdUeXBlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1dhcm5pbmdUeXBlO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctY29tYm9ib3gtLXN0YXRlLWhpZ2hsaWdodGVkJylcbiAgcHVibGljIGdldCBpc0hpZ2hsaWdodGVkU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzSGlnaGxpZ2h0ZWRTdGF0ZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLWNvbWJvYm94LS1pcy1sb2FkaW5nJylcbiAgcHVibGljIGdldCBoYXNJc0xvYWRpbmdDc3NDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmcgfHwgdGhpcy5faXNTZWFyY2hpbmcudmFsdWU7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1jb21ib2JveC0taGFzLXJlc2V0JylcbiAgcHVibGljIGdldCBoYXNIYXNSZXNldENzc0NsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1Jlc2V0O1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctY29tYm9ib3gtLWlzLW91dGxpbmUnKVxuICBwdWJsaWMgZ2V0IGhhc0lzT3V0bGluZUNzc0NsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzT3V0bGluZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLWNvbWJvYm94LS1zaXplLXNtYWxsJylcbiAgcHVibGljIGhhc1NtYWxsU2l6ZUNzc0NsYXNzOiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctY29tYm9ib3gtLXNpemUtbWVkaXVtJylcbiAgcHVibGljIGhhc01lZGl1bVNpemVDc3NDbGFzczogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgbG9hZGluZ1RleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9hZGluZ1RleHQgfHwgdGhpcy5fbG9jYWxpemF0aW9uLmxvYWRpbmdUZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgbG9hZGluZ1RleHQobG9hZGluZ1RleHQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvYWRpbmdUZXh0ID0gbG9hZGluZ1RleHQ7XG4gIH1cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBub0l0ZW1zVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9ub0l0ZW1zVGV4dCB8fCB0aGlzLl9sb2NhbGl6YXRpb24ubm9JdGVtc1RleHQ7XG4gIH1cbiAgcHVibGljIHNldCBub0l0ZW1zVGV4dChub0l0ZW1zVGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbm9JdGVtc1RleHQgPSBub0l0ZW1zVGV4dDtcbiAgfVxuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IG1pblNlYXJjaFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbWluU2VhcmNoVGV4dCB8fCB0aGlzLl9sb2NhbGl6YXRpb24ubWluU2VhcmNoVGV4dDtcbiAgfVxuICBwdWJsaWMgc2V0IG1pblNlYXJjaFRleHQobWluU2VhcmNoVGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbWluU2VhcmNoVGV4dCA9IG1pblNlYXJjaFRleHQ7XG4gIH1cbiAgQElucHV0KClcbiAgcHVibGljIHNob3VsZFN1Z2dlc3Q6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgb3Blbk9uRm9jdXM6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgYWxsb3dDdXN0b206IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgcHVibGljIGdldCBzaXplKCk6IENvbnRyb2xTaXplIHtcbiAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHNpemUoc2l6ZTogQ29udHJvbFNpemUpIHtcbiAgICBpZiAoc2l6ZSkge1xuICAgICAgdGhpcy5fc2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgdGhpcy5oYXNTbWFsbFNpemVDc3NDbGFzcyA9IHRoaXMuX3NpemUgPT09IENvbnRyb2xTaXplLlNtYWxsO1xuICAgIHRoaXMuaGFzTWVkaXVtU2l6ZUNzc0NsYXNzID0gdGhpcy5fc2l6ZSA9PT0gQ29udHJvbFNpemUuTWVkaXVtO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIGZpZWxkIGNvbnRhaW5zIGZhY3RvcnkgbWV0aG9kIGZvciBpdGVtcyB3aGljaCB3aWxsIGJlIGNyZWF0ZWQgcGxhY2luZyBjdXN0b21pemFibGUgdmFsdWVzIGluc2lkZSBjb21wb25lbnQuIFdvcmtzIHdoZW4gYWxsb3dDdXN0b20gaXMgdHJ1ZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaXRlbUZhY3Rvcnk6ICh0ZXh0OiBzdHJpbmcpID0+IFRJdGVtID0gKHRleHQ6IHN0cmluZyk6IFRJdGVtID0+IHtcbiAgICByZXR1cm4ge1t0aGlzLnZhbHVlRmllbGRdOiBudWxsLCBbdGhpcy50ZXh0RmllbGRdOiB0ZXh0fSBhcyBhbnk7XG4gIH07XG4gIHB1YmxpYyBnZXQgcG9wdXBTZXR0aW5ncygpOiBQb3B1cFNldHRpbmdzIHtcbiAgICByZXR1cm4ge1xuICAgICAgYW5pbWF0ZTogdHJ1ZSxcbiAgICAgIHBvcHVwQ2xhc3M6IGBzZy1jb21ib2JveC1wb3B1cCR7dGhpcy5pc0dyb3VwYWJsZSA/ICcgc2ctY29tYm9ib3gtcG9wdXAtLWlzLWdyb3VwYWJsZScgOiAnJ30gJHtcbiAgICAgICAgdGhpcy5wb3B1cENsYXNzIHx8ICcnXG4gICAgICB9YCxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChDT01CT0JPWF9MT0NBTElaRVIpXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9jYWxpemVyOiBJRHJvcGRvd25Mb2NhbGl6ZXI8SUNvbWJvYm94TG9jYWxpemF0aW9uPlxuICApIHtcbiAgICBzdXBlcihjaGFuZ2VEZXRlY3RvclJlZiwgcmVuZGVyZXIpO1xuICAgIHRoaXMuX2xvY2FsaXplKCk7XG4gIH1cblxuICBwcml2YXRlIF9sb2NhbGl6ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2xvY2FsaXplcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xvY2FsaXphdGlvbiA9IHRoaXMuX2xvY2FsaXplci5sb2NhbGl6YXRpb247XG4gICAgdGhpcy5fb2JzZXJ2ZXIubGlzdGVuKHRoaXMuX2xvY2FsaXplci5sb2NhbGl6YXRpb25DaGFuZ2VkLCAobG9jYWxpemF0aW9uKSA9PiB7XG4gICAgICB0aGlzLl9sb2NhbGl6YXRpb24gPSBsb2NhbGl6YXRpb247XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25SZXNldENsaWNrZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc1Jlc2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVzZXRlZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICB0aGlzLmZvY3VzKCk7XG4gICAgdGhpcy5fcmVzZXQoKTtcblxuICAgIGlmICh0aGlzLm9wZW5PbkZvY3VzKSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0Q29tcG9uZW50KHRoaXMuY29tcG9uZW50KTtcbiAgICB0aGlzLmluaXQoKTtcblxuICAgIC8vIE9wZW5lZC5cbiAgICB0aGlzLl9vYnNlcnZlci5saXN0ZW4odGhpcy5faXNPcGVuLnBpcGUoZmlsdGVyKChldmVudCkgPT4gZXZlbnQuaXNPcGVuKSksICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5hcmVJdGVtc0NhY2hlZCkge1xuICAgICAgICB0aGlzLl9oYXNTZWFyY2hlZC5uZXh0KGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY2FuTG9hZEl0ZW1zKHRoaXMuX3NlYXJjaFRleHQudmFsdWUpICYmIHRoaXMuX2xvYWRlZEl0ZW1zLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvYWRJdGVtcyh0aGlzLl9zZWFyY2hUZXh0LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9vYnNlcnZlci5saXN0ZW4oXG4gICAgICB0aGlzLl9pc09wZW4ucGlwZShcbiAgICAgICAgZmlsdGVyKChldmVudCkgPT4gZXZlbnQuaXNPcGVuKSxcbiAgICAgICAgLy8gV2hlbiBjbGlja2luZyByZXNldCBpY29uLCBvcGVuZWQgZXZlbnQgdHJpZ2dlcnMgc2VhcmNoIGV2ZW50IHdpdGhcbiAgICAgICAgLy8gd2l0aCBvbGQgc2VhcmNoYmFyIHZhbHVlIGluc3RlYWQgb2YgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAgICAvLyBTbyB3ZSBuZWVkIHRvIGdpdmUgc2VhcmNoYmFyIGEgbW9tZW50IGJlZm9yZSBmaXJlIG9wZW5lZCBldmVudC5cbiAgICAgICAgLy8gU3RlcHMgdG8gcmVwcm9kdWNlIHRoZSBidWc6XG4gICAgICAgIC8vIDEpIFNlYXJjaCBmb3IgVmxhZGl2b3N0b2sgYW5kIHNlbGVjdCBpdCAyKSBSZXNldCB2YWx1ZSB3aXRoIGljb25cbiAgICAgICAgLy8gMykgc2VhcmNoVGV4dCByZW1haW5zIFwiVmxhZGl2b3N0b2tcIiwgYnV0IHNob3VsZCBiZSBcIlwiLlxuICAgICAgICBkZWJvdW5jZVRpbWUoNTApXG4gICAgICApLFxuICAgICAgKCkgPT4gdGhpcy5vcGVuZWQuZW1pdCgpXG4gICAgKTtcblxuICAgIC8vIEZvY3VzZWQuXG4gICAgdGhpcy5fb2JzZXJ2ZXIubGlzdGVuKHRoaXMuX2lzRm9jdXNlZC5waXBlKGZpbHRlcihpc1RydWUpKSwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMub3Blbk9uRm9jdXMpIHtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25DaGFuZ2VkKHZhbHVlOiBUSXRlbSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNWYWx1ZUNoYW5nZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFsdWUgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5jb21wb25lbnQuc2VhcmNoYmFyLnN1Z2dlc3RlZFRleHQgPSAnJztcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZWQodmFsdWUpO1xuICAgIHRoaXMucHJvcGFnYXRlVG91Y2hlZCgpO1xuICAgIHRoaXMuX2VtaXRDaGFuZ2VkKHZhbHVlKTtcblxuICAgIGlmICghdmFsdWUgJiYgdGhpcy5faXNTeW5jKSB7XG4gICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIGl0ZW1zIGFmdGVyIHNlbGVjdGlvbiwgb3RoZXJ3aXNlIHdoZW4gb3BlbmluZyB0aGUgbGlzdFxuICAgICAgLy8gbmV4dCB0aW1lLCBvbmx5IHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGl0ZW0gd2lsbCBhcHBlYXIuXG4gICAgICAvLyBTdGVwcyB0byByZXByb2R1Y2U6IDEpIFNlbGVjdCBcIkNheW1hbiBCcmFjXCIsIDIpIEZvY3VzIG91dCBhbmQgZm9jdXMgYmFjayxcbiAgICAgIC8vIDMpIERlbGV0ZSBhIGNvdXBsZSBvZiBjaGFyYWN0ZXJzIHdpdGggYSBCYWNrc3BhY2UgZnJvbSB0aGUgZW5kIGFuZCBoaXQgRW50ZXIuXG4gICAgICAvLyA0KSBPcGVuIHRoZSBsaXN0LlxuICAgICAgdGhpcy5sb2FkSXRlbXMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdmFsdWVOb3JtYWxpemVyID0gKHRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz4pOiBhbnkgPT5cbiAgICB0ZXh0JC5waXBlKFxuICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgbGV0IHZhbHVlOiBUSXRlbSB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAoIXRoaXMuY29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIENhbid0IHVzZSB0aGlzLl9zZWFyY2hUZXh0LnZhbHVlIGhlcmUgYXMgaXQgbWlnaHQgYmUgZW1wdHksIGNvbnNpZGVyOlxuICAgICAgICAvLyAxKSB0eXBlIGN1c3RvbSB0ZXh0LCAyKSBmb2N1cyBvdXQgYW5kIGJhY2sgaW4gMykgdGhlcmUncyBhIHRleHQgaW4gc2VhcmNoYmFyLFxuICAgICAgICAvLyBidXQgdGhpcy5fc2VhcmNoVGV4dC52YWx1ZSBpcyBlbXB0eS5cbiAgICAgICAgLy8gU28gdGhpcy5jb21wb25lbnQuc2VhcmNoYmFyLnZhbHVlIGlzIHRvIGJlIHVzZWQuXG4gICAgICAgIGNvbnN0IHRleHQ6IHN0cmluZyA9ICh0aGlzLmNvbXBvbmVudC5zZWFyY2hiYXIudmFsdWUgfHwgJycpLnRyaW0oKTtcblxuICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb21wb25lbnQudmFsdWUgJiYgdGhpcy5jb21wb25lbnQudmFsdWVbdGhpcy50ZXh0RmllbGRdLnRvTG93ZXJDYXNlKCkgPT09IHRleHQudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIHZhbHVlID0gdGhpcy5jb21wb25lbnQudmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRJdGVtKHRoaXMuX3ZhbHVlTm9ybWFsaXplckl0ZW1zLCB0ZXh0KSkge1xuICAgICAgICAgIC8vIElmIGFyZUl0ZW1zQ2FjaGVkIGlzIG9mZiwgdGhlbiB0aGlzLmRhdGEgd2lsbCBiZSBsb3N0IGJ5IHRoaXMgbW9tZW50LFxuICAgICAgICAgIC8vIHNvIHdlIHVzZSBhIGNhY2hlIHRoaXMudmFsdWVOb3JtYWxpemVySXRlbXMuXG4gICAgICAgICAgLy8gVGhpcyBpcyByZWxldmFudCBlc3BlY2lhbGx5IGluIElFL0VkZ2Ugd2hlcmUgdGhpcy5jb21wb25lbnQudmFsdWUgaXMgbnVsbCxcbiAgICAgICAgICAvLyBzbyB0aGUgY29kZSBmYWxscyBiYWNrIHRvIHRoaXMgY29uZGl0aW9uIHNlY3Rpb24uXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLmdldEl0ZW0odGhpcy5fdmFsdWVOb3JtYWxpemVySXRlbXMsIHRleHQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYWxsb3dDdXN0b20pIHtcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuaXRlbUZhY3RvcnkodGV4dCk7XG5cbiAgICAgICAgICBpZiAodGhpcy5faXNTeW5jKSB7XG4gICAgICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIGl0ZW1zIGFmdGVyIHNlbGVjdGlvbiwgb3RoZXJ3aXNlIHdoZW4gb3BlbmluZyB0aGUgbGlzdFxuICAgICAgICAgICAgLy8gbmV4dCB0aW1lLCBvbmx5IHRoZSBzZWxlY3RlZCBpdGVtIHdpbGwgYXBwZWFyLlxuICAgICAgICAgICAgdGhpcy5sb2FkSXRlbXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ2xlYXJzIHNlYXJjaCB0ZXh0IGlmIHN1Z2dlc3Rpb24gaGFzbid0IGJlZW4gc2VsZWN0ZWQuXG4gICAgICAgICAgLy8gU3RlcHMgdG8gcmVwcm9kdWNlLlxuICAgICAgICAgIC8vIDEuIFVzZSBEeW1hbmljIEVtcHR5IHNhbXBsZS5cbiAgICAgICAgICAvLyAyLiBUeXBlICd0bycsIHdhaXQgZm9yIHRoZSBsaXN0IHRvIGxvYWQsIGJ1dCBkb24ndCBzZWxlY3QgJ1Rva2FpJy4gSW5zdGVhZCBoaXQgRXNjIGtleS5cbiAgICAgICAgICAvLyAzLiBTZWUgdGhhdCB0aGUgc2VhcmNoIGJhciBzdGlsbCBjb250YWlucyAndG8nIHRleHQsIHdoaWxlIHRoZSB2YWx1ZSBpcyBudWxsLFxuICAgICAgICAgIC8vIHdoaWNoIGlzIHdyb25nIC0gc2VhcmNoIGJhciB0ZXh0IHNob3VsZCBiZSByZW1vdmVkLlxuICAgICAgICAgIC8vIHRoaXMuY29tcG9uZW50LnNlYXJjaGJhci5zdWdnZXN0ZWRUZXh0ID0gJyc7IC8vIFRoaXMgZG9lc24ndCB3b3JrLlxuICAgICAgICAgIC8vIEFzIHRoZSBhYm92ZSBsaW5lIGRvZXNuJ3Qgd29yaywgc28gd29ya2Fyb3VuZCBpdCBieSBzZXR0aW5nIGZvcm0gY29udHJvbCB2YWx1ZSB0byBudWxsLlxuICAgICAgICAgIHRoaXMudmFsdWVGb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl92YWx1ZU5vcm1hbGl6ZXJJdGVtcyA9IFtdO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9KVxuICAgICk7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIF9lbWl0Q2hhbmdlZCh2YWx1ZTogVEl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZWQuZW1pdChuZXcgQ29tYm9ib3hDaGFuZ2VkRXZlbnQodmFsdWUpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBoYXNWYWx1ZUNoYW5nZWQodmFsdWU6IFRJdGVtIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc0l0ZW1FcXVhbCh0aGlzLnZhbHVlLCB2YWx1ZSk7XG4gIH1cblxufVxuIiwiPGtlbmRvLWNvbWJvYm94XHJcbiAgI2NvbXBvbmVudFxyXG4gIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXHJcbiAgW2Zvcm1Db250cm9sXT1cInZhbHVlRm9ybUNvbnRyb2xcIlxyXG4gIFtkYXRhXT1cImNvbWJpbmVkSXRlbXMgfCBhc3luY1wiXHJcbiAgW2ZpbHRlcmFibGVdPVwiaXNTZWFyY2hhYmxlXCJcclxuICBbdmFsdWVGaWVsZF09XCJ2YWx1ZUtleVwiXHJcbiAgW3RleHRGaWVsZF09XCJ0ZXh0S2V5XCJcclxuICBbbG9hZGluZ109XCJpc0xvYWRpbmdTcGlubmVyVmlzaWJsZSB8IGFzeW5jXCJcclxuICBbY2xlYXJCdXR0b25dPVwiZmFsc2VcIlxyXG4gIFtwb3B1cFNldHRpbmdzXT1cInBvcHVwU2V0dGluZ3NcIlxyXG4gIFtsaXN0SGVpZ2h0XT1cImxpc3RIZWlnaHRcIlxyXG4gIFt2YWx1ZVByaW1pdGl2ZV09XCJpc1ByaW1pdGl2ZVZhbHVlXCJcclxuICBbc3VnZ2VzdF09XCJzaG91bGRTdWdnZXN0XCJcclxuICBbYWxsb3dDdXN0b21dPVwidHJ1ZVwiXHJcbiAgW3ZhbHVlTm9ybWFsaXplcl09XCJ2YWx1ZU5vcm1hbGl6ZXJcIlxyXG4gIChmaWx0ZXJDaGFuZ2UpPVwib25TZWFyY2hlZCgkZXZlbnQpXCJcclxuICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2VkKCRldmVudClcIlxyXG4gIChvcGVuKT1cIm9uT3BlbmVkKClcIlxyXG4gIChjbG9zZSk9XCJvbkNsb3NlZCgpXCJcclxuICAoZm9jdXMpPVwib25Gb2N1c2VkKClcIlxyXG4gIChibHVyKT1cIm9uQmx1cnJlZCgpXCJcclxuPlxyXG4gIDxuZy10ZW1wbGF0ZSBrZW5kb0Ryb3BEb3duTGlzdEZvb3RlclRlbXBsYXRlPlxyXG4gICAgPHNnLWNvbWJvYm94LXBvcHVwLWZvb3RlclxyXG4gICAgICBbaXNMb2FkaW5nVGV4dFZpc2libGVdPVwiaXNMb2FkaW5nVGV4dFZpc2libGUgfCBhc3luY1wiXHJcbiAgICAgIFtpc05vSXRlbXNUZXh0VmlzaWJsZV09XCJpc05vSXRlbXNUZXh0VmlzaWJsZSB8IGFzeW5jXCJcclxuICAgICAgW2lzTWluU2VhcmNoVGV4dFZpc2libGVdPVwiaXNNaW5TZWFyY2hUZXh0VmlzaWJsZSB8IGFzeW5jXCJcclxuICAgICAgW2xvYWRpbmdUZXh0XT1cImxvYWRpbmdUZXh0XCJcclxuICAgICAgW25vSXRlbXNUZXh0XT1cIm5vSXRlbXNUZXh0XCJcclxuICAgICAgW21pblNlYXJjaFRleHRdPVwibWluU2VhcmNoVGV4dFwiXHJcbiAgICAgIFttaW5TZWFyY2hDaGFyYWN0ZXJzXT1cIm1pblNlYXJjaENoYXJhY3RlcnNcIlxyXG4gICAgPlxyXG4gICAgPC9zZy1jb21ib2JveC1wb3B1cC1mb290ZXI+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuICA8bmctdGVtcGxhdGUga2VuZG9Db21ib0JveE5vRGF0YVRlbXBsYXRlPjwvbmctdGVtcGxhdGU+XHJcbiAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaXRlbVRlbXBsYXRlXCIga2VuZG9Db21ib0JveEl0ZW1UZW1wbGF0ZSBsZXQtZGF0YUl0ZW0+XHJcbiAgICA8c3BhbiBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2l0ZW06IGRhdGFJdGVtfVwiPjwvc3Bhbj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L2tlbmRvLWNvbWJvYm94PlxyXG48ZGl2IGNsYXNzPVwic2ctY29tYm9ib3hfX3Jlc2V0XCIgKm5nSWY9XCIhaXNEaXNhYmxlZFwiIChjbGljayk9XCJvblJlc2V0Q2xpY2tlZCgpXCI+XHJcbiAgPGkgY2xhc3M9XCJmYXIgZmEtdGltZXNcIj48L2k+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwic2ctY29tYm9ib3hfX3N0YXRlLWxpbmVcIj48L2Rpdj5cclxuIl19
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, forwardRef, HostBinding, Inject, Input, Optional, Renderer2, TemplateRef, ViewChild, } from '@angular/core';
2
+ import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { ABSTRACT_CONTROL_COMPONENT, ControlSize, isTrue, OPENABLE_CONTROL_COMPONENT, SIZEABLE_CONTROL_COMPONENT, STATEABLE_CONTROL_COMPONENT, TYPEABLE_CONTROL_COMPONENT, } from '@marcura/marcura-common';
4
+ import { ComboBoxComponent as KendoComboBoxComponent } from '@progress/kendo-angular-dropdowns';
5
+ import { debounceTime, filter, map } from 'rxjs/operators';
6
+ import { COMBOBOX_LOCALIZER } from '../../combobox.injectables';
7
+ import { ComboboxItemTemplateDirective } from '../../directives/combobox-item-template.directive';
8
+ import { ComboboxChangedEvent } from '../../model/combobox-changed.event';
9
+ import { AbstractComboboxComponent } from '../abstract-combobox/abstract-combobox.component';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/common";
12
+ import * as i2 from "@angular/forms";
13
+ import * as i3 from "@progress/kendo-angular-dropdowns";
14
+ import * as i4 from "../combobox-popup-footer/combobox-popup-footer.component";
15
+ export class ComboboxComponent extends AbstractComboboxComponent {
16
+ get hasHasValueCssClass() {
17
+ return this.hasValue;
18
+ }
19
+ get hasIsHoveredCssClass() {
20
+ return this._isHovered.value;
21
+ }
22
+ get hasIsFocusedCssClass() {
23
+ return this.isFocused;
24
+ }
25
+ get hasIsDisabledCssClass() {
26
+ return this.isDisabled;
27
+ }
28
+ get isSuccessType() {
29
+ return this._isSuccessType;
30
+ }
31
+ get isErrorType() {
32
+ return this._isErrorType;
33
+ }
34
+ get isWarningType() {
35
+ return this._isWarningType;
36
+ }
37
+ get isHighlightedState() {
38
+ return this._isHighlightedState;
39
+ }
40
+ get hasIsLoadingCssClass() {
41
+ return this.isLoading || this._isSearching.value;
42
+ }
43
+ get hasHasResetCssClass() {
44
+ return this.hasReset;
45
+ }
46
+ get hasIsOutlineCssClass() {
47
+ return this.isOutline;
48
+ }
49
+ get loadingText() {
50
+ return this._loadingText || this._localization.loadingText;
51
+ }
52
+ set loadingText(loadingText) {
53
+ this._loadingText = loadingText;
54
+ }
55
+ get noItemsText() {
56
+ return this._noItemsText || this._localization.noItemsText;
57
+ }
58
+ set noItemsText(noItemsText) {
59
+ this._noItemsText = noItemsText;
60
+ }
61
+ get minSearchText() {
62
+ return this._minSearchText || this._localization.minSearchText;
63
+ }
64
+ set minSearchText(minSearchText) {
65
+ this._minSearchText = minSearchText;
66
+ }
67
+ get size() {
68
+ return this._size;
69
+ }
70
+ set size(size) {
71
+ if (size) {
72
+ this._size = size;
73
+ }
74
+ this.hasSmallSizeCssClass = this._size === ControlSize.Small;
75
+ this.hasMediumSizeCssClass = this._size === ControlSize.Medium;
76
+ }
77
+ get popupSettings() {
78
+ return {
79
+ animate: true,
80
+ appendTo: this.appendPopupToRoot ? 'root' : 'component',
81
+ popupClass: `sg-combobox-popup${this.isGroupable ? ' sg-combobox-popup--is-groupable' : ''} ${this.popupClass || ''}`,
82
+ };
83
+ }
84
+ constructor(changeDetectorRef, renderer, _localizer) {
85
+ super(changeDetectorRef, renderer);
86
+ this._localizer = _localizer;
87
+ // TODO: technical-debt this component shouldn't have default value
88
+ this.defaultValue = null;
89
+ this._size = ControlSize.Medium;
90
+ this._loadingText = null;
91
+ this._noItemsText = null;
92
+ this._minSearchText = null;
93
+ this._localization = {
94
+ loadingText: 'Loading...',
95
+ noItemsText: 'No items found.',
96
+ minSearchText: 'Enter {minSearchCharacters} or more characters.',
97
+ };
98
+ this.itemTemplate = null;
99
+ this.hasCssClass = true;
100
+ this.hasSmallSizeCssClass = false;
101
+ this.hasMediumSizeCssClass = true;
102
+ this.shouldSuggest = true;
103
+ this.openOnFocus = true;
104
+ this.allowCustom = false;
105
+ this.appendPopupToRoot = true;
106
+ /**
107
+ * This field contains factory method for items which will be created placing customizable values inside component. Works when allowCustom is true.
108
+ *
109
+ * @memberof ComboboxComponent
110
+ */
111
+ this.itemFactory = (text) => {
112
+ return { [this.valueField]: null, [this.textField]: text };
113
+ };
114
+ this.valueNormalizer = (text$) => text$.pipe(map(() => {
115
+ let value = null;
116
+ if (!this.component) {
117
+ return value;
118
+ }
119
+ // Can't use this._searchText.value here as it might be empty, consider:
120
+ // 1) type custom text, 2) focus out and back in 3) there's a text in searchbar,
121
+ // but this._searchText.value is empty.
122
+ // So this.component.searchbar.value is to be used.
123
+ const text = (this.component.searchbar.value || '').trim();
124
+ if (!text) {
125
+ return value;
126
+ }
127
+ if (this.component.value && this.component.value[this.textField].toLowerCase() === text.toLowerCase()) {
128
+ value = this.component.value;
129
+ }
130
+ else if (this.getItem(this._valueNormalizerItems, text)) {
131
+ // If areItemsCached is off, then this.data will be lost by this moment,
132
+ // so we use a cache this.valueNormalizerItems.
133
+ // This is relevant especially in IE/Edge where this.component.value is null,
134
+ // so the code falls back to this condition section.
135
+ value = this.getItem(this._valueNormalizerItems, text);
136
+ }
137
+ else if (this.allowCustom) {
138
+ value = this.itemFactory(text);
139
+ if (this._isSync) {
140
+ // Restore original items after selection, otherwise when opening the list
141
+ // next time, only the selected item will appear.
142
+ this.loadItems();
143
+ }
144
+ }
145
+ else {
146
+ // Clears search text if suggestion hasn't been selected.
147
+ // Steps to reproduce.
148
+ // 1. Use Dymanic Empty sample.
149
+ // 2. Type 'to', wait for the list to load, but don't select 'Tokai'. Instead hit Esc key.
150
+ // 3. See that the search bar still contains 'to' text, while the value is null,
151
+ // which is wrong - search bar text should be removed.
152
+ // this.component.searchbar.suggestedText = ''; // This doesn't work.
153
+ // As the above line doesn't work, so workaround it by setting form control value to null.
154
+ this.valueFormControl.setValue(value);
155
+ }
156
+ this._valueNormalizerItems = [];
157
+ return value;
158
+ }));
159
+ this._localize();
160
+ }
161
+ _localize() {
162
+ if (!this._localizer) {
163
+ return;
164
+ }
165
+ this._localization = this._localizer.localization;
166
+ this._observer.listen(this._localizer.localizationChanged, (localization) => {
167
+ this._localization = localization;
168
+ });
169
+ }
170
+ onResetClicked() {
171
+ if (!this.hasReset) {
172
+ return;
173
+ }
174
+ this._resetedValue = this.value;
175
+ this.focus();
176
+ this._reset();
177
+ if (this.openOnFocus) {
178
+ this.open();
179
+ }
180
+ }
181
+ ngOnInit() {
182
+ this._setComponent(this.component);
183
+ this.init();
184
+ // Opened.
185
+ this._observer.listen(this._isOpen.pipe(filter((event) => event.isOpen)), () => {
186
+ if (!this.areItemsCached) {
187
+ this._hasSearched.next(false);
188
+ }
189
+ if (this.canLoadItems(this._searchText.value) && this._loadedItems.value.length === 0) {
190
+ this.loadItems(this._searchText.value);
191
+ }
192
+ });
193
+ this._observer.listen(this._isOpen.pipe(filter((event) => event.isOpen),
194
+ // When clicking reset icon, opened event triggers search event with
195
+ // with old searchbar value instead of an empty string.
196
+ // So we need to give searchbar a moment before fire opened event.
197
+ // Steps to reproduce the bug:
198
+ // 1) Search for Vladivostok and select it 2) Reset value with icon
199
+ // 3) searchText remains "Vladivostok", but should be "".
200
+ debounceTime(50)), () => this.opened.emit());
201
+ // Focused.
202
+ this._observer.listen(this._isFocused.pipe(filter(isTrue)), () => {
203
+ if (this.openOnFocus) {
204
+ this.open();
205
+ }
206
+ });
207
+ }
208
+ onChanged(value) {
209
+ if (!this.hasValueChanged(value)) {
210
+ return;
211
+ }
212
+ value = value === undefined ? this.defaultValue : value;
213
+ this.value = value;
214
+ this.component.searchbar.suggestedText = '';
215
+ this.propagateChanged(value);
216
+ this.propagateTouched();
217
+ this._emitChanged(value);
218
+ if (!value && this._isSync) {
219
+ // Restore original items after selection, otherwise when opening the list
220
+ // next time, only the previously selected item will appear.
221
+ // Steps to reproduce: 1) Select "Cayman Brac", 2) Focus out and focus back,
222
+ // 3) Delete a couple of characters with a Backspace from the end and hit Enter.
223
+ // 4) Open the list.
224
+ this.loadItems();
225
+ }
226
+ }
227
+ _emitChanged(value) {
228
+ this.changed.emit(new ComboboxChangedEvent(value));
229
+ }
230
+ hasValueChanged(value) {
231
+ return !this.isItemEqual(this.value, value);
232
+ }
233
+ }
234
+ ComboboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: ComboboxComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: COMBOBOX_LOCALIZER, optional: true }], target: i0.ɵɵFactoryTarget.Component });
235
+ ComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: ComboboxComponent, selector: "sg-combobox", inputs: { formControl: "formControl", loadingText: "loadingText", noItemsText: "noItemsText", minSearchText: "minSearchText", shouldSuggest: "shouldSuggest", openOnFocus: "openOnFocus", allowCustom: "allowCustom", appendPopupToRoot: "appendPopupToRoot", size: "size", itemFactory: "itemFactory" }, host: { properties: { "class.sg-combobox": "this.hasCssClass", "class.sg-combobox--has-value": "this.hasHasValueCssClass", "class.sg-combobox--is-hovered": "this.hasIsHoveredCssClass", "class.sg-combobox--is-focused": "this.hasIsFocusedCssClass", "class.sg-combobox--is-disabled": "this.hasIsDisabledCssClass", "class.sg-combobox--type-success": "this.isSuccessType", "class.sg-combobox--type-error": "this.isErrorType", "class.sg-combobox--type-warning": "this.isWarningType", "class.sg-combobox--state-highlighted": "this.isHighlightedState", "class.sg-combobox--is-loading": "this.hasIsLoadingCssClass", "class.sg-combobox--has-reset": "this.hasHasResetCssClass", "class.sg-combobox--is-outline": "this.hasIsOutlineCssClass", "class.sg-combobox--size-small": "this.hasSmallSizeCssClass", "class.sg-combobox--size-medium": "this.hasMediumSizeCssClass" } }, providers: [
236
+ {
237
+ provide: NG_VALUE_ACCESSOR,
238
+ useExisting: forwardRef(() => ComboboxComponent),
239
+ multi: true,
240
+ },
241
+ {
242
+ provide: ABSTRACT_CONTROL_COMPONENT,
243
+ useExisting: forwardRef(() => ComboboxComponent),
244
+ },
245
+ {
246
+ provide: OPENABLE_CONTROL_COMPONENT,
247
+ useExisting: forwardRef(() => ComboboxComponent),
248
+ },
249
+ {
250
+ provide: STATEABLE_CONTROL_COMPONENT,
251
+ useExisting: forwardRef(() => ComboboxComponent),
252
+ },
253
+ {
254
+ provide: TYPEABLE_CONTROL_COMPONENT,
255
+ useExisting: forwardRef(() => ComboboxComponent),
256
+ },
257
+ {
258
+ provide: SIZEABLE_CONTROL_COMPONENT,
259
+ useExisting: forwardRef(() => ComboboxComponent),
260
+ },
261
+ ], queries: [{ propertyName: "itemTemplate", first: true, predicate: ComboboxItemTemplateDirective, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "component", first: true, predicate: ["component"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<kendo-combobox\n #component\n [placeholder]=\"placeholder\"\n [formControl]=\"valueFormControl\"\n [data]=\"combinedItems | async\"\n [filterable]=\"isSearchable\"\n [valueField]=\"valueKey\"\n [textField]=\"textKey\"\n [loading]=\"isLoadingSpinnerVisible | async\"\n [clearButton]=\"false\"\n [popupSettings]=\"popupSettings\"\n [listHeight]=\"listHeight\"\n [valuePrimitive]=\"isPrimitiveValue\"\n [suggest]=\"shouldSuggest\"\n [allowCustom]=\"true\"\n [valueNormalizer]=\"valueNormalizer\"\n (filterChange)=\"onSearched($event)\"\n (valueChange)=\"onChanged($event)\"\n (open)=\"onOpened()\"\n (close)=\"onClosed()\"\n (focus)=\"onFocused()\"\n (blur)=\"onBlurred()\"\n>\n <ng-template kendoDropDownListFooterTemplate>\n <sg-combobox-popup-footer\n [isLoadingTextVisible]=\"isLoadingTextVisible | async\"\n [isNoItemsTextVisible]=\"isNoItemsTextVisible | async\"\n [isMinSearchTextVisible]=\"isMinSearchTextVisible | async\"\n [loadingText]=\"loadingText\"\n [noItemsText]=\"noItemsText\"\n [minSearchText]=\"minSearchText\"\n [minSearchCharacters]=\"minSearchCharacters\"\n >\n </sg-combobox-popup-footer>\n </ng-template>\n <ng-template kendoComboBoxNoDataTemplate></ng-template>\n <ng-template *ngIf=\"itemTemplate\" kendoComboBoxItemTemplate let-dataItem>\n <span [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{item: dataItem}\"></span>\n </ng-template>\n</kendo-combobox>\n<div class=\"sg-combobox__reset\" *ngIf=\"!isDisabled\" (click)=\"onResetClicked()\">\n <i class=\"far fa-times\"></i>\n</div>\n<div class=\"sg-combobox__state-line\"></div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.ComboBoxComponent, selector: "kendo-combobox", inputs: ["focusableId", "allowCustom", "valueNormalizer", "placeholder", "listHeight", "suggest", "clearButton", "disabled", "readonly", "tabindex", "filterable", "data", "value", "valuePrimitive", "popupSettings", "itemDisabled", "tabIndex", "virtual", "loading", "textField", "valueField", "iconClass"], outputs: ["valueChange", "selectionChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoComboBox"] }, { kind: "directive", type: i3.FooterTemplateDirective, selector: "[kendoDropDownListFooterTemplate],[kendoComboBoxFooterTemplate],[kendoDropDownTreeFooterTemplate],[kendoMultiColumnComboBoxFooterTemplate],[kendoAutoCompleteFooterTemplate],[kendoMultiSelectFooterTemplate],[kendoMultiSelectTreeFooterTemplate]" }, { kind: "directive", type: i3.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { kind: "directive", type: i3.NoDataTemplateDirective, selector: "[kendoDropDownListNoDataTemplate],[kendoDropDownTreeNoDataTemplate],[kendoComboBoxNoDataTemplate],[kendoMultiColumnComboBoxNoDataTemplate],[kendoAutoCompleteNoDataTemplate],[kendoMultiSelectNoDataTemplate],[kendoMultiSelectTreeNoDataTemplate]" }, { kind: "component", type: i4.ComboboxPopupFooterComponent, selector: "sg-combobox-popup-footer", inputs: ["isLoadingTextVisible", "isNoItemsTextVisible", "isMinSearchTextVisible", "loadingText", "noItemsText", "minSearchText", "minSearchCharacters"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
262
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: ComboboxComponent, decorators: [{
263
+ type: Component,
264
+ args: [{ selector: 'sg-combobox', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
265
+ {
266
+ provide: NG_VALUE_ACCESSOR,
267
+ useExisting: forwardRef(() => ComboboxComponent),
268
+ multi: true,
269
+ },
270
+ {
271
+ provide: ABSTRACT_CONTROL_COMPONENT,
272
+ useExisting: forwardRef(() => ComboboxComponent),
273
+ },
274
+ {
275
+ provide: OPENABLE_CONTROL_COMPONENT,
276
+ useExisting: forwardRef(() => ComboboxComponent),
277
+ },
278
+ {
279
+ provide: STATEABLE_CONTROL_COMPONENT,
280
+ useExisting: forwardRef(() => ComboboxComponent),
281
+ },
282
+ {
283
+ provide: TYPEABLE_CONTROL_COMPONENT,
284
+ useExisting: forwardRef(() => ComboboxComponent),
285
+ },
286
+ {
287
+ provide: SIZEABLE_CONTROL_COMPONENT,
288
+ useExisting: forwardRef(() => ComboboxComponent),
289
+ },
290
+ ], template: "<kendo-combobox\n #component\n [placeholder]=\"placeholder\"\n [formControl]=\"valueFormControl\"\n [data]=\"combinedItems | async\"\n [filterable]=\"isSearchable\"\n [valueField]=\"valueKey\"\n [textField]=\"textKey\"\n [loading]=\"isLoadingSpinnerVisible | async\"\n [clearButton]=\"false\"\n [popupSettings]=\"popupSettings\"\n [listHeight]=\"listHeight\"\n [valuePrimitive]=\"isPrimitiveValue\"\n [suggest]=\"shouldSuggest\"\n [allowCustom]=\"true\"\n [valueNormalizer]=\"valueNormalizer\"\n (filterChange)=\"onSearched($event)\"\n (valueChange)=\"onChanged($event)\"\n (open)=\"onOpened()\"\n (close)=\"onClosed()\"\n (focus)=\"onFocused()\"\n (blur)=\"onBlurred()\"\n>\n <ng-template kendoDropDownListFooterTemplate>\n <sg-combobox-popup-footer\n [isLoadingTextVisible]=\"isLoadingTextVisible | async\"\n [isNoItemsTextVisible]=\"isNoItemsTextVisible | async\"\n [isMinSearchTextVisible]=\"isMinSearchTextVisible | async\"\n [loadingText]=\"loadingText\"\n [noItemsText]=\"noItemsText\"\n [minSearchText]=\"minSearchText\"\n [minSearchCharacters]=\"minSearchCharacters\"\n >\n </sg-combobox-popup-footer>\n </ng-template>\n <ng-template kendoComboBoxNoDataTemplate></ng-template>\n <ng-template *ngIf=\"itemTemplate\" kendoComboBoxItemTemplate let-dataItem>\n <span [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{item: dataItem}\"></span>\n </ng-template>\n</kendo-combobox>\n<div class=\"sg-combobox__reset\" *ngIf=\"!isDisabled\" (click)=\"onResetClicked()\">\n <i class=\"far fa-times\"></i>\n</div>\n<div class=\"sg-combobox__state-line\"></div>\n" }]
291
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: undefined, decorators: [{
292
+ type: Optional
293
+ }, {
294
+ type: Inject,
295
+ args: [COMBOBOX_LOCALIZER]
296
+ }] }]; }, propDecorators: { formControl: [{
297
+ type: Input
298
+ }], component: [{
299
+ type: ViewChild,
300
+ args: ['component', { static: true }]
301
+ }], itemTemplate: [{
302
+ type: ContentChild,
303
+ args: [ComboboxItemTemplateDirective, { read: TemplateRef, static: true }]
304
+ }], hasCssClass: [{
305
+ type: HostBinding,
306
+ args: ['class.sg-combobox']
307
+ }], hasHasValueCssClass: [{
308
+ type: HostBinding,
309
+ args: ['class.sg-combobox--has-value']
310
+ }], hasIsHoveredCssClass: [{
311
+ type: HostBinding,
312
+ args: ['class.sg-combobox--is-hovered']
313
+ }], hasIsFocusedCssClass: [{
314
+ type: HostBinding,
315
+ args: ['class.sg-combobox--is-focused']
316
+ }], hasIsDisabledCssClass: [{
317
+ type: HostBinding,
318
+ args: ['class.sg-combobox--is-disabled']
319
+ }], isSuccessType: [{
320
+ type: HostBinding,
321
+ args: ['class.sg-combobox--type-success']
322
+ }], isErrorType: [{
323
+ type: HostBinding,
324
+ args: ['class.sg-combobox--type-error']
325
+ }], isWarningType: [{
326
+ type: HostBinding,
327
+ args: ['class.sg-combobox--type-warning']
328
+ }], isHighlightedState: [{
329
+ type: HostBinding,
330
+ args: ['class.sg-combobox--state-highlighted']
331
+ }], hasIsLoadingCssClass: [{
332
+ type: HostBinding,
333
+ args: ['class.sg-combobox--is-loading']
334
+ }], hasHasResetCssClass: [{
335
+ type: HostBinding,
336
+ args: ['class.sg-combobox--has-reset']
337
+ }], hasIsOutlineCssClass: [{
338
+ type: HostBinding,
339
+ args: ['class.sg-combobox--is-outline']
340
+ }], hasSmallSizeCssClass: [{
341
+ type: HostBinding,
342
+ args: ['class.sg-combobox--size-small']
343
+ }], hasMediumSizeCssClass: [{
344
+ type: HostBinding,
345
+ args: ['class.sg-combobox--size-medium']
346
+ }], loadingText: [{
347
+ type: Input
348
+ }], noItemsText: [{
349
+ type: Input
350
+ }], minSearchText: [{
351
+ type: Input
352
+ }], shouldSuggest: [{
353
+ type: Input
354
+ }], openOnFocus: [{
355
+ type: Input
356
+ }], allowCustom: [{
357
+ type: Input
358
+ }], appendPopupToRoot: [{
359
+ type: Input
360
+ }], size: [{
361
+ type: Input
362
+ }], itemFactory: [{
363
+ type: Input
364
+ }] } });
365
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFdBQVcsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsV0FBVyxFQUVYLE1BQU0sRUFDTiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLDJCQUEyQixFQUMzQiwwQkFBMEIsR0FDM0IsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUMsaUJBQWlCLElBQUksc0JBQXNCLEVBQWdCLE1BQU0sbUNBQW1DLENBQUM7QUFFN0csT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFDaEcsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFHeEUsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sa0RBQWtELENBQUM7Ozs7OztBQWtDM0YsTUFBTSxPQUFPLGlCQUF5QixTQUFRLHlCQUEy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QyxhQUFhO3NCQURuQixLQUFLO2dCQUdDLFdBQVc7c0JBRGpCLEtBQUs7Z0JBR0MsV0FBVztzQkFEakIsS0FBSztnQkFHQyxpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBR0ssSUFBSTtzQkFEZCxLQUFLO2dCQWtCQyxXQUFXO3NCQURqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFJlbmRlcmVyMixcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Zvcm1Db250cm9sLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQUJTVFJBQ1RfQ09OVFJPTF9DT01QT05FTlQsXG4gIENvbnRyb2xTaXplLFxuICBJU2l6ZWFibGVDb250cm9sQ29tcG9uZW50LFxuICBpc1RydWUsXG4gIE9QRU5BQkxFX0NPTlRST0xfQ09NUE9ORU5ULFxuICBTSVpFQUJMRV9DT05UUk9MX0NPTVBPTkVOVCxcbiAgU1RBVEVBQkxFX0NPTlRST0xfQ09NUE9ORU5ULFxuICBUWVBFQUJMRV9DT05UUk9MX0NPTVBPTkVOVCxcbn0gZnJvbSAnQG1hcmN1cmEvbWFyY3VyYS1jb21tb24nO1xuaW1wb3J0IHtDb21ib0JveENvbXBvbmVudCBhcyBLZW5kb0NvbWJvQm94Q29tcG9uZW50LCBQb3B1cFNldHRpbmdzfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1kcm9wZG93bnMnO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBmaWx0ZXIsIG1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtDT01CT0JPWF9MT0NBTElaRVJ9IGZyb20gJy4uLy4uL2NvbWJvYm94LmluamVjdGFibGVzJztcbmltcG9ydCB7Q29tYm9ib3hJdGVtVGVtcGxhdGVEaXJlY3RpdmV9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY29tYm9ib3gtaXRlbS10ZW1wbGF0ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHtDb21ib2JveENoYW5nZWRFdmVudH0gZnJvbSAnLi4vLi4vbW9kZWwvY29tYm9ib3gtY2hhbmdlZC5ldmVudCc7XG5pbXBvcnQge0lDb21ib2JveExvY2FsaXphdGlvbn0gZnJvbSAnLi4vLi4vbW9kZWwvY29tYm9ib3gtbG9jYWxpemF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQge0lEcm9wZG93bkxvY2FsaXplcn0gZnJvbSAnLi4vLi4vbW9kZWwvZHJvcGRvd24tbG9jYWxpemVyLmludGVyZmFjZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29tYm9ib3hDb21wb25lbnR9IGZyb20gJy4uL2Fic3RyYWN0LWNvbWJvYm94L2Fic3RyYWN0LWNvbWJvYm94LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NnLWNvbWJvYm94JyxcbiAgdGVtcGxhdGVVcmw6ICdjb21ib2JveC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvbWJvYm94Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogQUJTVFJBQ1RfQ09OVFJPTF9DT01QT05FTlQsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb21ib2JveENvbXBvbmVudCksXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBPUEVOQUJMRV9DT05UUk9MX0NPTVBPTkVOVCxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvbWJvYm94Q29tcG9uZW50KSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IFNUQVRFQUJMRV9DT05UUk9MX0NPTVBPTkVOVCxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvbWJvYm94Q29tcG9uZW50KSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IFRZUEVBQkxFX0NPTlRST0xfQ09NUE9ORU5ULFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ29tYm9ib3hDb21wb25lbnQpLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogU0laRUFCTEVfQ09OVFJPTF9DT01QT05FTlQsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb21ib2JveENvbXBvbmVudCksXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tYm9ib3hDb21wb25lbnQ8VEl0ZW0+IGV4dGVuZHMgQWJzdHJhY3RDb21ib2JveENvbXBvbmVudDxUSXRlbSwgVEl0ZW0gfCBudWxsLCBDb21ib2JveENoYW5nZWRFdmVudDxUSXRlbT4+XG4gIGltcGxlbWVudHMgSVNpemVhYmxlQ29udHJvbENvbXBvbmVudCwgT25Jbml0IHtcbiAgQElucHV0KClcbiAgcHVibGljIG92ZXJyaWRlIGZvcm1Db250cm9sITogRm9ybUNvbnRyb2w8VEl0ZW0gfCBudWxsPjtcblxuICAvLyBUT0RPOiB0ZWNobmljYWwtZGVidCB0aGlzIGNvbXBvbmVudCBzaG91bGRuJ3QgaGF2ZSBkZWZhdWx0IHZhbHVlXG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBkZWZhdWx0VmFsdWU6IFRJdGVtID0gbnVsbCBhcyBhbnk7XG4gIHByaXZhdGUgX3NpemU6IENvbnRyb2xTaXplID0gQ29udHJvbFNpemUuTWVkaXVtO1xuICBwcml2YXRlIF9sb2FkaW5nVGV4dDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX25vSXRlbXNUZXh0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbWluU2VhcmNoVGV4dDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2xvY2FsaXphdGlvbjogSUNvbWJvYm94TG9jYWxpemF0aW9uID0ge1xuICAgIGxvYWRpbmdUZXh0OiAnTG9hZGluZy4uLicsXG4gICAgbm9JdGVtc1RleHQ6ICdObyBpdGVtcyBmb3VuZC4nLFxuICAgIG1pblNlYXJjaFRleHQ6ICdFbnRlciB7bWluU2VhcmNoQ2hhcmFjdGVyc30gb3IgbW9yZSBjaGFyYWN0ZXJzLicsXG4gIH07XG4gIEBWaWV3Q2hpbGQoJ2NvbXBvbmVudCcsIHtzdGF0aWM6IHRydWV9KVxuICBwdWJsaWMgY29tcG9uZW50ITogS2VuZG9Db21ib0JveENvbXBvbmVudDtcbiAgQENvbnRlbnRDaGlsZChDb21ib2JveEl0ZW1UZW1wbGF0ZURpcmVjdGl2ZSwge3JlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWV9KVxuICBwdWJsaWMgaXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctY29tYm9ib3gnKVxuICBwdWJsaWMgcmVhZG9ubHkgaGFzQ3NzQ2xhc3M6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLWNvbWJvYm94LS1oYXMtdmFsdWUnKVxuICBwdWJsaWMgZ2V0IGhhc0hhc1ZhbHVlQ3NzQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzVmFsdWU7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1jb21ib2JveC0taXMtaG92ZXJlZCcpXG4gIHB1YmxpYyBnZXQgaGFzSXNIb3ZlcmVkQ3NzQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzSG92ZXJlZC52YWx1ZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLWNvbWJvYm94LS1pcy1mb2N1c2VkJylcbiAgcHVibGljIGdldCBoYXNJc0ZvY3VzZWRDc3NDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0ZvY3VzZWQ7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1jb21ib2JveC0taXMtZGlzYWJsZWQnKVxuICBwdWJsaWMgZ2V0IGhhc0lzRGlzYWJsZWRDc3NDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0Rpc2FibGVkO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctY29tYm9ib3gtLXR5cGUtc3VjY2VzcycpXG4gIHB1YmxpYyBnZXQgaXNTdWNjZXNzVHlwZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdWNjZXNzVHlwZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLWNvbWJvYm94LS10eXBlLWVycm9yJylcbiAgcHVibGljIGdldCBpc0Vycm9yVHlwZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNFcnJvclR5cGU7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1jb21ib2JveC0tdHlwZS13YXJuaW5nJylcbiAgcHVibGljIGdldCBpc1dhcm5pbmdUeXBlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1dhcm5pbmdUeXBlO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctY29tYm9ib3gtLXN0YXRlLWhpZ2hsaWdodGVkJylcbiAgcHVibGljIGdldCBpc0hpZ2hsaWdodGVkU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzSGlnaGxpZ2h0ZWRTdGF0ZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLWNvbWJvYm94LS1pcy1sb2FkaW5nJylcbiAgcHVibGljIGdldCBoYXNJc0xvYWRpbmdDc3NDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmcgfHwgdGhpcy5faXNTZWFyY2hpbmcudmFsdWU7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1jb21ib2JveC0taGFzLXJlc2V0JylcbiAgcHVibGljIGdldCBoYXNIYXNSZXNldENzc0NsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1Jlc2V0O1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctY29tYm9ib3gtLWlzLW91dGxpbmUnKVxuICBwdWJsaWMgZ2V0IGhhc0lzT3V0bGluZUNzc0NsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzT3V0bGluZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLWNvbWJvYm94LS1zaXplLXNtYWxsJylcbiAgcHVibGljIGhhc1NtYWxsU2l6ZUNzc0NsYXNzOiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctY29tYm9ib3gtLXNpemUtbWVkaXVtJylcbiAgcHVibGljIGhhc01lZGl1bVNpemVDc3NDbGFzczogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgbG9hZGluZ1RleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9hZGluZ1RleHQgfHwgdGhpcy5fbG9jYWxpemF0aW9uLmxvYWRpbmdUZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgbG9hZGluZ1RleHQobG9hZGluZ1RleHQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvYWRpbmdUZXh0ID0gbG9hZGluZ1RleHQ7XG4gIH1cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBub0l0ZW1zVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9ub0l0ZW1zVGV4dCB8fCB0aGlzLl9sb2NhbGl6YXRpb24ubm9JdGVtc1RleHQ7XG4gIH1cbiAgcHVibGljIHNldCBub0l0ZW1zVGV4dChub0l0ZW1zVGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbm9JdGVtc1RleHQgPSBub0l0ZW1zVGV4dDtcbiAgfVxuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IG1pblNlYXJjaFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbWluU2VhcmNoVGV4dCB8fCB0aGlzLl9sb2NhbGl6YXRpb24ubWluU2VhcmNoVGV4dDtcbiAgfVxuICBwdWJsaWMgc2V0IG1pblNlYXJjaFRleHQobWluU2VhcmNoVGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbWluU2VhcmNoVGV4dCA9IG1pblNlYXJjaFRleHQ7XG4gIH1cbiAgQElucHV0KClcbiAgcHVibGljIHNob3VsZFN1Z2dlc3Q6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgb3Blbk9uRm9jdXM6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgYWxsb3dDdXN0b206IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgcHVibGljIGFwcGVuZFBvcHVwVG9Sb290OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgcHVibGljIGdldCBzaXplKCk6IENvbnRyb2xTaXplIHtcbiAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHNpemUoc2l6ZTogQ29udHJvbFNpemUpIHtcbiAgICBpZiAoc2l6ZSkge1xuICAgICAgdGhpcy5fc2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgdGhpcy5oYXNTbWFsbFNpemVDc3NDbGFzcyA9IHRoaXMuX3NpemUgPT09IENvbnRyb2xTaXplLlNtYWxsO1xuICAgIHRoaXMuaGFzTWVkaXVtU2l6ZUNzc0NsYXNzID0gdGhpcy5fc2l6ZSA9PT0gQ29udHJvbFNpemUuTWVkaXVtO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIGZpZWxkIGNvbnRhaW5zIGZhY3RvcnkgbWV0aG9kIGZvciBpdGVtcyB3aGljaCB3aWxsIGJlIGNyZWF0ZWQgcGxhY2luZyBjdXN0b21pemFibGUgdmFsdWVzIGluc2lkZSBjb21wb25lbnQuIFdvcmtzIHdoZW4gYWxsb3dDdXN0b20gaXMgdHJ1ZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaXRlbUZhY3Rvcnk6ICh0ZXh0OiBzdHJpbmcpID0+IFRJdGVtID0gKHRleHQ6IHN0cmluZyk6IFRJdGVtID0+IHtcbiAgICByZXR1cm4ge1t0aGlzLnZhbHVlRmllbGRdOiBudWxsLCBbdGhpcy50ZXh0RmllbGRdOiB0ZXh0fSBhcyBhbnk7XG4gIH07XG4gIHB1YmxpYyBnZXQgcG9wdXBTZXR0aW5ncygpOiBQb3B1cFNldHRpbmdzIHtcbiAgICByZXR1cm4ge1xuICAgICAgYW5pbWF0ZTogdHJ1ZSxcbiAgICAgIGFwcGVuZFRvOiB0aGlzLmFwcGVuZFBvcHVwVG9Sb290ID8gJ3Jvb3QnIDogJ2NvbXBvbmVudCcsXG4gICAgICBwb3B1cENsYXNzOiBgc2ctY29tYm9ib3gtcG9wdXAke3RoaXMuaXNHcm91cGFibGUgPyAnIHNnLWNvbWJvYm94LXBvcHVwLS1pcy1ncm91cGFibGUnIDogJyd9ICR7XG4gICAgICAgIHRoaXMucG9wdXBDbGFzcyB8fCAnJ1xuICAgICAgfWAsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoQ09NQk9CT1hfTE9DQUxJWkVSKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvY2FsaXplcjogSURyb3Bkb3duTG9jYWxpemVyPElDb21ib2JveExvY2FsaXphdGlvbj5cbiAgKSB7XG4gICAgc3VwZXIoY2hhbmdlRGV0ZWN0b3JSZWYsIHJlbmRlcmVyKTtcbiAgICB0aGlzLl9sb2NhbGl6ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9jYWxpemUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9sb2NhbGl6ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2NhbGl6YXRpb24gPSB0aGlzLl9sb2NhbGl6ZXIubG9jYWxpemF0aW9uO1xuICAgIHRoaXMuX29ic2VydmVyLmxpc3Rlbih0aGlzLl9sb2NhbGl6ZXIubG9jYWxpemF0aW9uQ2hhbmdlZCwgKGxvY2FsaXphdGlvbikgPT4ge1xuICAgICAgdGhpcy5fbG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9uUmVzZXRDbGlja2VkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNSZXNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc2V0ZWRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgdGhpcy5mb2N1cygpO1xuICAgIHRoaXMuX3Jlc2V0KCk7XG5cbiAgICBpZiAodGhpcy5vcGVuT25Gb2N1cykge1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3NldENvbXBvbmVudCh0aGlzLmNvbXBvbmVudCk7XG4gICAgdGhpcy5pbml0KCk7XG5cbiAgICAvLyBPcGVuZWQuXG4gICAgdGhpcy5fb2JzZXJ2ZXIubGlzdGVuKHRoaXMuX2lzT3Blbi5waXBlKGZpbHRlcigoZXZlbnQpID0+IGV2ZW50LmlzT3BlbikpLCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYXJlSXRlbXNDYWNoZWQpIHtcbiAgICAgICAgdGhpcy5faGFzU2VhcmNoZWQubmV4dChmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNhbkxvYWRJdGVtcyh0aGlzLl9zZWFyY2hUZXh0LnZhbHVlKSAmJiB0aGlzLl9sb2FkZWRJdGVtcy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5sb2FkSXRlbXModGhpcy5fc2VhcmNoVGV4dC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fb2JzZXJ2ZXIubGlzdGVuKFxuICAgICAgdGhpcy5faXNPcGVuLnBpcGUoXG4gICAgICAgIGZpbHRlcigoZXZlbnQpID0+IGV2ZW50LmlzT3BlbiksXG4gICAgICAgIC8vIFdoZW4gY2xpY2tpbmcgcmVzZXQgaWNvbiwgb3BlbmVkIGV2ZW50IHRyaWdnZXJzIHNlYXJjaCBldmVudCB3aXRoXG4gICAgICAgIC8vIHdpdGggb2xkIHNlYXJjaGJhciB2YWx1ZSBpbnN0ZWFkIG9mIGFuIGVtcHR5IHN0cmluZy5cbiAgICAgICAgLy8gU28gd2UgbmVlZCB0byBnaXZlIHNlYXJjaGJhciBhIG1vbWVudCBiZWZvcmUgZmlyZSBvcGVuZWQgZXZlbnQuXG4gICAgICAgIC8vIFN0ZXBzIHRvIHJlcHJvZHVjZSB0aGUgYnVnOlxuICAgICAgICAvLyAxKSBTZWFyY2ggZm9yIFZsYWRpdm9zdG9rIGFuZCBzZWxlY3QgaXQgMikgUmVzZXQgdmFsdWUgd2l0aCBpY29uXG4gICAgICAgIC8vIDMpIHNlYXJjaFRleHQgcmVtYWlucyBcIlZsYWRpdm9zdG9rXCIsIGJ1dCBzaG91bGQgYmUgXCJcIi5cbiAgICAgICAgZGVib3VuY2VUaW1lKDUwKVxuICAgICAgKSxcbiAgICAgICgpID0+IHRoaXMub3BlbmVkLmVtaXQoKVxuICAgICk7XG5cbiAgICAvLyBGb2N1c2VkLlxuICAgIHRoaXMuX29ic2VydmVyLmxpc3Rlbih0aGlzLl9pc0ZvY3VzZWQucGlwZShmaWx0ZXIoaXNUcnVlKSksICgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wZW5PbkZvY3VzKSB7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9uQ2hhbmdlZCh2YWx1ZTogVEl0ZW0pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzVmFsdWVDaGFuZ2VkKHZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhbHVlID0gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHRoaXMuZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuY29tcG9uZW50LnNlYXJjaGJhci5zdWdnZXN0ZWRUZXh0ID0gJyc7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2VkKHZhbHVlKTtcbiAgICB0aGlzLnByb3BhZ2F0ZVRvdWNoZWQoKTtcbiAgICB0aGlzLl9lbWl0Q2hhbmdlZCh2YWx1ZSk7XG5cbiAgICBpZiAoIXZhbHVlICYmIHRoaXMuX2lzU3luYykge1xuICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBpdGVtcyBhZnRlciBzZWxlY3Rpb24sIG90aGVyd2lzZSB3aGVuIG9wZW5pbmcgdGhlIGxpc3RcbiAgICAgIC8vIG5leHQgdGltZSwgb25seSB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBpdGVtIHdpbGwgYXBwZWFyLlxuICAgICAgLy8gU3RlcHMgdG8gcmVwcm9kdWNlOiAxKSBTZWxlY3QgXCJDYXltYW4gQnJhY1wiLCAyKSBGb2N1cyBvdXQgYW5kIGZvY3VzIGJhY2ssXG4gICAgICAvLyAzKSBEZWxldGUgYSBjb3VwbGUgb2YgY2hhcmFjdGVycyB3aXRoIGEgQmFja3NwYWNlIGZyb20gdGhlIGVuZCBhbmQgaGl0IEVudGVyLlxuICAgICAgLy8gNCkgT3BlbiB0aGUgbGlzdC5cbiAgICAgIHRoaXMubG9hZEl0ZW1zKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHZhbHVlTm9ybWFsaXplciA9ICh0ZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+KTogYW55ID0+XG4gICAgdGV4dCQucGlwZShcbiAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZTogVEl0ZW0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYW4ndCB1c2UgdGhpcy5fc2VhcmNoVGV4dC52YWx1ZSBoZXJlIGFzIGl0IG1pZ2h0IGJlIGVtcHR5LCBjb25zaWRlcjpcbiAgICAgICAgLy8gMSkgdHlwZSBjdXN0b20gdGV4dCwgMikgZm9jdXMgb3V0IGFuZCBiYWNrIGluIDMpIHRoZXJlJ3MgYSB0ZXh0IGluIHNlYXJjaGJhcixcbiAgICAgICAgLy8gYnV0IHRoaXMuX3NlYXJjaFRleHQudmFsdWUgaXMgZW1wdHkuXG4gICAgICAgIC8vIFNvIHRoaXMuY29tcG9uZW50LnNlYXJjaGJhci52YWx1ZSBpcyB0byBiZSB1c2VkLlxuICAgICAgICBjb25zdCB0ZXh0OiBzdHJpbmcgPSAodGhpcy5jb21wb25lbnQuc2VhcmNoYmFyLnZhbHVlIHx8ICcnKS50cmltKCk7XG5cbiAgICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50LnZhbHVlICYmIHRoaXMuY29tcG9uZW50LnZhbHVlW3RoaXMudGV4dEZpZWxkXS50b0xvd2VyQ2FzZSgpID09PSB0ZXh0LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuY29tcG9uZW50LnZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SXRlbSh0aGlzLl92YWx1ZU5vcm1hbGl6ZXJJdGVtcywgdGV4dCkpIHtcbiAgICAgICAgICAvLyBJZiBhcmVJdGVtc0NhY2hlZCBpcyBvZmYsIHRoZW4gdGhpcy5kYXRhIHdpbGwgYmUgbG9zdCBieSB0aGlzIG1vbWVudCxcbiAgICAgICAgICAvLyBzbyB3ZSB1c2UgYSBjYWNoZSB0aGlzLnZhbHVlTm9ybWFsaXplckl0ZW1zLlxuICAgICAgICAgIC8vIFRoaXMgaXMgcmVsZXZhbnQgZXNwZWNpYWxseSBpbiBJRS9FZGdlIHdoZXJlIHRoaXMuY29tcG9uZW50LnZhbHVlIGlzIG51bGwsXG4gICAgICAgICAgLy8gc28gdGhlIGNvZGUgZmFsbHMgYmFjayB0byB0aGlzIGNvbmRpdGlvbiBzZWN0aW9uLlxuICAgICAgICAgIHZhbHVlID0gdGhpcy5nZXRJdGVtKHRoaXMuX3ZhbHVlTm9ybWFsaXplckl0ZW1zLCB0ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFsbG93Q3VzdG9tKSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLml0ZW1GYWN0b3J5KHRleHQpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuX2lzU3luYykge1xuICAgICAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBpdGVtcyBhZnRlciBzZWxlY3Rpb24sIG90aGVyd2lzZSB3aGVuIG9wZW5pbmcgdGhlIGxpc3RcbiAgICAgICAgICAgIC8vIG5leHQgdGltZSwgb25seSB0aGUgc2VsZWN0ZWQgaXRlbSB3aWxsIGFwcGVhci5cbiAgICAgICAgICAgIHRoaXMubG9hZEl0ZW1zKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENsZWFycyBzZWFyY2ggdGV4dCBpZiBzdWdnZXN0aW9uIGhhc24ndCBiZWVuIHNlbGVjdGVkLlxuICAgICAgICAgIC8vIFN0ZXBzIHRvIHJlcHJvZHVjZS5cbiAgICAgICAgICAvLyAxLiBVc2UgRHltYW5pYyBFbXB0eSBzYW1wbGUuXG4gICAgICAgICAgLy8gMi4gVHlwZSAndG8nLCB3YWl0IGZvciB0aGUgbGlzdCB0byBsb2FkLCBidXQgZG9uJ3Qgc2VsZWN0ICdUb2thaScuIEluc3RlYWQgaGl0IEVzYyBrZXkuXG4gICAgICAgICAgLy8gMy4gU2VlIHRoYXQgdGhlIHNlYXJjaCBiYXIgc3RpbGwgY29udGFpbnMgJ3RvJyB0ZXh0LCB3aGlsZSB0aGUgdmFsdWUgaXMgbnVsbCxcbiAgICAgICAgICAvLyB3aGljaCBpcyB3cm9uZyAtIHNlYXJjaCBiYXIgdGV4dCBzaG91bGQgYmUgcmVtb3ZlZC5cbiAgICAgICAgICAvLyB0aGlzLmNvbXBvbmVudC5zZWFyY2hiYXIuc3VnZ2VzdGVkVGV4dCA9ICcnOyAvLyBUaGlzIGRvZXNuJ3Qgd29yay5cbiAgICAgICAgICAvLyBBcyB0aGUgYWJvdmUgbGluZSBkb2Vzbid0IHdvcmssIHNvIHdvcmthcm91bmQgaXQgYnkgc2V0dGluZyBmb3JtIGNvbnRyb2wgdmFsdWUgdG8gbnVsbC5cbiAgICAgICAgICB0aGlzLnZhbHVlRm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdmFsdWVOb3JtYWxpemVySXRlbXMgPSBbXTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSlcbiAgICApO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBfZW1pdENoYW5nZWQodmFsdWU6IFRJdGVtKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2VkLmVtaXQobmV3IENvbWJvYm94Q2hhbmdlZEV2ZW50KHZhbHVlKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgaGFzVmFsdWVDaGFuZ2VkKHZhbHVlOiBUSXRlbSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNJdGVtRXF1YWwodGhpcy52YWx1ZSwgdmFsdWUpO1xuICB9XG5cbn1cbiIsIjxrZW5kby1jb21ib2JveFxuICAjY29tcG9uZW50XG4gIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gIFtmb3JtQ29udHJvbF09XCJ2YWx1ZUZvcm1Db250cm9sXCJcbiAgW2RhdGFdPVwiY29tYmluZWRJdGVtcyB8IGFzeW5jXCJcbiAgW2ZpbHRlcmFibGVdPVwiaXNTZWFyY2hhYmxlXCJcbiAgW3ZhbHVlRmllbGRdPVwidmFsdWVLZXlcIlxuICBbdGV4dEZpZWxkXT1cInRleHRLZXlcIlxuICBbbG9hZGluZ109XCJpc0xvYWRpbmdTcGlubmVyVmlzaWJsZSB8IGFzeW5jXCJcbiAgW2NsZWFyQnV0dG9uXT1cImZhbHNlXCJcbiAgW3BvcHVwU2V0dGluZ3NdPVwicG9wdXBTZXR0aW5nc1wiXG4gIFtsaXN0SGVpZ2h0XT1cImxpc3RIZWlnaHRcIlxuICBbdmFsdWVQcmltaXRpdmVdPVwiaXNQcmltaXRpdmVWYWx1ZVwiXG4gIFtzdWdnZXN0XT1cInNob3VsZFN1Z2dlc3RcIlxuICBbYWxsb3dDdXN0b21dPVwidHJ1ZVwiXG4gIFt2YWx1ZU5vcm1hbGl6ZXJdPVwidmFsdWVOb3JtYWxpemVyXCJcbiAgKGZpbHRlckNoYW5nZSk9XCJvblNlYXJjaGVkKCRldmVudClcIlxuICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2VkKCRldmVudClcIlxuICAob3Blbik9XCJvbk9wZW5lZCgpXCJcbiAgKGNsb3NlKT1cIm9uQ2xvc2VkKClcIlxuICAoZm9jdXMpPVwib25Gb2N1c2VkKClcIlxuICAoYmx1cik9XCJvbkJsdXJyZWQoKVwiXG4+XG4gIDxuZy10ZW1wbGF0ZSBrZW5kb0Ryb3BEb3duTGlzdEZvb3RlclRlbXBsYXRlPlxuICAgIDxzZy1jb21ib2JveC1wb3B1cC1mb290ZXJcbiAgICAgIFtpc0xvYWRpbmdUZXh0VmlzaWJsZV09XCJpc0xvYWRpbmdUZXh0VmlzaWJsZSB8IGFzeW5jXCJcbiAgICAgIFtpc05vSXRlbXNUZXh0VmlzaWJsZV09XCJpc05vSXRlbXNUZXh0VmlzaWJsZSB8IGFzeW5jXCJcbiAgICAgIFtpc01pblNlYXJjaFRleHRWaXNpYmxlXT1cImlzTWluU2VhcmNoVGV4dFZpc2libGUgfCBhc3luY1wiXG4gICAgICBbbG9hZGluZ1RleHRdPVwibG9hZGluZ1RleHRcIlxuICAgICAgW25vSXRlbXNUZXh0XT1cIm5vSXRlbXNUZXh0XCJcbiAgICAgIFttaW5TZWFyY2hUZXh0XT1cIm1pblNlYXJjaFRleHRcIlxuICAgICAgW21pblNlYXJjaENoYXJhY3RlcnNdPVwibWluU2VhcmNoQ2hhcmFjdGVyc1wiXG4gICAgPlxuICAgIDwvc2ctY29tYm9ib3gtcG9wdXAtZm9vdGVyPlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUga2VuZG9Db21ib0JveE5vRGF0YVRlbXBsYXRlPjwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSAqbmdJZj1cIml0ZW1UZW1wbGF0ZVwiIGtlbmRvQ29tYm9Cb3hJdGVtVGVtcGxhdGUgbGV0LWRhdGFJdGVtPlxuICAgIDxzcGFuIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1UZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7aXRlbTogZGF0YUl0ZW19XCI+PC9zcGFuPlxuICA8L25nLXRlbXBsYXRlPlxuPC9rZW5kby1jb21ib2JveD5cbjxkaXYgY2xhc3M9XCJzZy1jb21ib2JveF9fcmVzZXRcIiAqbmdJZj1cIiFpc0Rpc2FibGVkXCIgKGNsaWNrKT1cIm9uUmVzZXRDbGlja2VkKClcIj5cbiAgPGkgY2xhc3M9XCJmYXIgZmEtdGltZXNcIj48L2k+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJzZy1jb21ib2JveF9fc3RhdGUtbGluZVwiPjwvZGl2PlxuIl19