@skyux/lookup 6.3.3 → 6.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/documentation.json +909 -927
- package/esm2020/lib/modules/autocomplete/autocomplete-adapter.service.mjs +12 -8
- package/esm2020/lib/modules/autocomplete/autocomplete-default-search-function.mjs +1 -1
- package/esm2020/lib/modules/autocomplete/autocomplete-input.directive.mjs +82 -69
- package/esm2020/lib/modules/autocomplete/autocomplete.component.mjs +377 -381
- package/esm2020/lib/modules/country-field/country-field.component.mjs +170 -152
- package/esm2020/lib/modules/lookup/lookup-autocomplete-adapter.mjs +14 -8
- package/esm2020/lib/modules/lookup/lookup-show-more-async-modal.component.mjs +65 -58
- package/esm2020/lib/modules/lookup/lookup-show-more-modal.component.mjs +49 -41
- package/esm2020/lib/modules/lookup/lookup.component.mjs +231 -222
- package/esm2020/lib/modules/lookup/types/lookup-show-more-custom-picker-context.mjs +1 -1
- package/esm2020/lib/modules/lookup/types/lookup-show-more-native-picker-async-context.mjs +1 -1
- package/esm2020/lib/modules/lookup/types/lookup-show-more-native-picker-context.mjs +1 -1
- package/esm2020/lib/modules/search/search-adapter.service.mjs +22 -21
- package/esm2020/lib/modules/search/search.component.mjs +68 -67
- package/esm2020/testing/country-field/country-field-fixture.mjs +1 -1
- package/fesm2015/skyux-lookup-testing.mjs.map +1 -1
- package/fesm2015/skyux-lookup.mjs +1075 -1021
- package/fesm2015/skyux-lookup.mjs.map +1 -1
- package/fesm2020/skyux-lookup-testing.mjs.map +1 -1
- package/fesm2020/skyux-lookup.mjs +1073 -1019
- package/fesm2020/skyux-lookup.mjs.map +1 -1
- package/lib/modules/autocomplete/autocomplete-adapter.service.d.ts +1 -3
- package/lib/modules/autocomplete/autocomplete-input.directive.d.ts +3 -16
- package/lib/modules/autocomplete/autocomplete.component.d.ts +20 -76
- package/lib/modules/country-field/country-field.component.d.ts +14 -36
- package/lib/modules/lookup/lookup-autocomplete-adapter.d.ts +6 -8
- package/lib/modules/lookup/lookup-show-more-async-modal.component.d.ts +9 -16
- package/lib/modules/lookup/lookup-show-more-modal.component.d.ts +3 -4
- package/lib/modules/lookup/lookup.component.d.ts +17 -42
- package/lib/modules/lookup/types/lookup-show-more-native-picker-async-context.d.ts +1 -1
- package/lib/modules/lookup/types/lookup-show-more-native-picker-context.d.ts +1 -1
- package/lib/modules/search/search-adapter.service.d.ts +1 -5
- package/lib/modules/search/search.component.d.ts +11 -22
- package/package.json +10 -10
- package/testing/country-field/country-field-fixture.d.ts +1 -1
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
var _SkyAutocompleteComponent_instances, _SkyAutocompleteComponent_activeElementIndex, _SkyAutocompleteComponent_adapterService, _SkyAutocompleteComponent_affixer, _SkyAutocompleteComponent_affixService, _SkyAutocompleteComponent_changeDetector, _SkyAutocompleteComponent_elementRef, _SkyAutocompleteComponent_inputBoxHostSvc, _SkyAutocompleteComponent_inputDirectiveUnsubscribe, _SkyAutocompleteComponent_messageStreamSub, _SkyAutocompleteComponent_ngUnsubscribe, _SkyAutocompleteComponent_overlay, _SkyAutocompleteComponent_overlayService, _SkyAutocompleteComponent_overlayFocusableElements, _SkyAutocompleteComponent_currentSearchSub, _SkyAutocompleteComponent__data, _SkyAutocompleteComponent__debounceTime, _SkyAutocompleteComponent__descriptorProperty, _SkyAutocompleteComponent__highlightText, _SkyAutocompleteComponent__inputDirective, _SkyAutocompleteComponent__messageStream, _SkyAutocompleteComponent__propertiesToSearch, _SkyAutocompleteComponent__resultsRef, _SkyAutocompleteComponent__search, _SkyAutocompleteComponent__searchResults, _SkyAutocompleteComponent__searchResultTemplate, _SkyAutocompleteComponent__searchResultsLimit, _SkyAutocompleteComponent__searchTextMinimumCharacters, _SkyAutocompleteComponent_searchTextChanged, _SkyAutocompleteComponent_performSearch, _SkyAutocompleteComponent_cancelCurrentSearch, _SkyAutocompleteComponent_getHighlightText, _SkyAutocompleteComponent_selectSearchResultById, _SkyAutocompleteComponent_openDropdown, _SkyAutocompleteComponent_closeDropdown, _SkyAutocompleteComponent_setActiveDescendant, _SkyAutocompleteComponent_removeActiveDescendant, _SkyAutocompleteComponent_resetSearch, _SkyAutocompleteComponent_addInputEventListeners, _SkyAutocompleteComponent_destroyOverlay, _SkyAutocompleteComponent_createAffixer, _SkyAutocompleteComponent_destroyAffixer, _SkyAutocompleteComponent_initMessageStream, _SkyAutocompleteComponent_initOverlayFocusableElements, _SkyAutocompleteComponent_getActiveElement, _SkyAutocompleteComponent_removeFocusedClass, _SkyAutocompleteComponent_addFocusedClass;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
1
3
|
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, Input, Optional, Output, TemplateRef, ViewChild, } from '@angular/core';
|
|
2
4
|
import { SkyAffixAutoFitContext, SkyAffixService, SkyOverlayService, } from '@skyux/core';
|
|
3
5
|
import { SkyInputBoxHostService } from '@skyux/forms';
|
|
@@ -20,12 +22,7 @@ import * as i8 from "./autocomplete-search-async-disabled.pipe";
|
|
|
20
22
|
let uniqueId = 0;
|
|
21
23
|
export class SkyAutocompleteComponent {
|
|
22
24
|
constructor(changeDetector, elementRef, affixService, adapterService, overlayService, inputBoxHostSvc) {
|
|
23
|
-
this
|
|
24
|
-
this.elementRef = elementRef;
|
|
25
|
-
this.affixService = affixService;
|
|
26
|
-
this.adapterService = adapterService;
|
|
27
|
-
this.overlayService = overlayService;
|
|
28
|
-
this.inputBoxHostSvc = inputBoxHostSvc;
|
|
25
|
+
_SkyAutocompleteComponent_instances.add(this);
|
|
29
26
|
/**
|
|
30
27
|
* @internal
|
|
31
28
|
* Indicates whether to display a button in the dropdown that opens a picker where users can view all options.
|
|
@@ -52,26 +49,59 @@ export class SkyAutocompleteComponent {
|
|
|
52
49
|
* Fires when users select the button to view all options.
|
|
53
50
|
*/
|
|
54
51
|
this.showMoreClick = new EventEmitter();
|
|
52
|
+
/**
|
|
53
|
+
* Fires when users select items in the dropdown list.
|
|
54
|
+
*/
|
|
55
|
+
this.selectionChange = new EventEmitter();
|
|
55
56
|
/**
|
|
56
57
|
* Fires when users enter new search information and allows results to be
|
|
57
58
|
* returned via an observable.
|
|
58
59
|
*/
|
|
59
60
|
this.searchAsync = new EventEmitter();
|
|
60
61
|
this.isOpen = false;
|
|
62
|
+
this.searchText = '';
|
|
61
63
|
this.isSearchingAsync = false;
|
|
62
64
|
/**
|
|
63
65
|
* Index that indicates which descendant of the overlay currently has focus.
|
|
64
66
|
*/
|
|
65
|
-
this
|
|
66
|
-
this
|
|
67
|
-
this
|
|
67
|
+
_SkyAutocompleteComponent_activeElementIndex.set(this, -1);
|
|
68
|
+
_SkyAutocompleteComponent_adapterService.set(this, void 0);
|
|
69
|
+
_SkyAutocompleteComponent_affixer.set(this, void 0);
|
|
70
|
+
_SkyAutocompleteComponent_affixService.set(this, void 0);
|
|
71
|
+
_SkyAutocompleteComponent_changeDetector.set(this, void 0);
|
|
72
|
+
_SkyAutocompleteComponent_elementRef.set(this, void 0);
|
|
73
|
+
_SkyAutocompleteComponent_inputBoxHostSvc.set(this, void 0);
|
|
74
|
+
_SkyAutocompleteComponent_inputDirectiveUnsubscribe.set(this, new Subject());
|
|
75
|
+
_SkyAutocompleteComponent_messageStreamSub.set(this, void 0);
|
|
76
|
+
_SkyAutocompleteComponent_ngUnsubscribe.set(this, new Subject());
|
|
77
|
+
_SkyAutocompleteComponent_overlay.set(this, void 0);
|
|
78
|
+
_SkyAutocompleteComponent_overlayService.set(this, void 0);
|
|
68
79
|
/**
|
|
69
80
|
* Elements within the autocomplete dropdown that are focusable.
|
|
70
81
|
* These are typically the search results and action buttons, but could also be
|
|
71
82
|
* elements provided in the consumer's own template.
|
|
72
83
|
*/
|
|
73
|
-
this
|
|
74
|
-
this
|
|
84
|
+
_SkyAutocompleteComponent_overlayFocusableElements.set(this, []);
|
|
85
|
+
_SkyAutocompleteComponent_currentSearchSub.set(this, void 0);
|
|
86
|
+
_SkyAutocompleteComponent__data.set(this, void 0);
|
|
87
|
+
_SkyAutocompleteComponent__debounceTime.set(this, void 0);
|
|
88
|
+
_SkyAutocompleteComponent__descriptorProperty.set(this, void 0);
|
|
89
|
+
_SkyAutocompleteComponent__highlightText.set(this, void 0);
|
|
90
|
+
_SkyAutocompleteComponent__inputDirective.set(this, void 0);
|
|
91
|
+
_SkyAutocompleteComponent__messageStream.set(this, new Subject());
|
|
92
|
+
_SkyAutocompleteComponent__propertiesToSearch.set(this, void 0);
|
|
93
|
+
_SkyAutocompleteComponent__resultsRef.set(this, void 0);
|
|
94
|
+
_SkyAutocompleteComponent__search.set(this, void 0);
|
|
95
|
+
_SkyAutocompleteComponent__searchResults.set(this, void 0);
|
|
96
|
+
_SkyAutocompleteComponent__searchResultTemplate.set(this, void 0);
|
|
97
|
+
_SkyAutocompleteComponent__searchResultsLimit.set(this, void 0);
|
|
98
|
+
_SkyAutocompleteComponent__searchTextMinimumCharacters.set(this, void 0);
|
|
99
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_changeDetector, changeDetector, "f");
|
|
100
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_elementRef, elementRef, "f");
|
|
101
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_affixService, affixService, "f");
|
|
102
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_adapterService, adapterService, "f");
|
|
103
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_overlayService, overlayService, "f");
|
|
104
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_inputBoxHostSvc, inputBoxHostSvc, "f");
|
|
75
105
|
const id = ++uniqueId;
|
|
76
106
|
this.resultsListId = `sky-autocomplete-list-${id}`;
|
|
77
107
|
this.resultsWrapperId = `sky-autocomplete-wrapper-${id}`;
|
|
@@ -82,10 +112,10 @@ export class SkyAutocompleteComponent {
|
|
|
82
112
|
* changes due to server calls, use `search` or `searchAsync` instead.
|
|
83
113
|
*/
|
|
84
114
|
set data(value) {
|
|
85
|
-
this
|
|
115
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent__data, value, "f");
|
|
86
116
|
}
|
|
87
117
|
get data() {
|
|
88
|
-
return this
|
|
118
|
+
return __classPrivateFieldGet(this, _SkyAutocompleteComponent__data, "f") || [];
|
|
89
119
|
}
|
|
90
120
|
/**
|
|
91
121
|
* Specifies how many milliseconds to wait before searching while users
|
|
@@ -93,10 +123,10 @@ export class SkyAutocompleteComponent {
|
|
|
93
123
|
* @default 0
|
|
94
124
|
*/
|
|
95
125
|
set debounceTime(value) {
|
|
96
|
-
this
|
|
126
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent__debounceTime, value, "f");
|
|
97
127
|
}
|
|
98
128
|
get debounceTime() {
|
|
99
|
-
return this
|
|
129
|
+
return __classPrivateFieldGet(this, _SkyAutocompleteComponent__debounceTime, "f") || 0;
|
|
100
130
|
}
|
|
101
131
|
/**
|
|
102
132
|
* Specifies an object property to display in the text input after users
|
|
@@ -104,31 +134,31 @@ export class SkyAutocompleteComponent {
|
|
|
104
134
|
* @default "name"
|
|
105
135
|
*/
|
|
106
136
|
set descriptorProperty(value) {
|
|
107
|
-
this
|
|
137
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent__descriptorProperty, value, "f");
|
|
108
138
|
}
|
|
109
139
|
get descriptorProperty() {
|
|
110
|
-
return this
|
|
140
|
+
return __classPrivateFieldGet(this, _SkyAutocompleteComponent__descriptorProperty, "f") || 'name';
|
|
111
141
|
}
|
|
112
142
|
/**
|
|
113
143
|
* Specifies an observable of `SkyAutocompleteMessage` that can close the dropdown.
|
|
114
144
|
* @internal
|
|
115
145
|
*/
|
|
116
146
|
set messageStream(value) {
|
|
117
|
-
this
|
|
118
|
-
this.
|
|
147
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent__messageStream, value ?? new Subject(), "f");
|
|
148
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_initMessageStream).call(this);
|
|
119
149
|
}
|
|
120
150
|
get messageStream() {
|
|
121
|
-
return this
|
|
151
|
+
return __classPrivateFieldGet(this, _SkyAutocompleteComponent__messageStream, "f");
|
|
122
152
|
}
|
|
123
153
|
/**
|
|
124
154
|
* Specifies the object properties to search.
|
|
125
155
|
* @default ["name"]
|
|
126
156
|
*/
|
|
127
157
|
set propertiesToSearch(value) {
|
|
128
|
-
this
|
|
158
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent__propertiesToSearch, value, "f");
|
|
129
159
|
}
|
|
130
160
|
get propertiesToSearch() {
|
|
131
|
-
return this
|
|
161
|
+
return __classPrivateFieldGet(this, _SkyAutocompleteComponent__propertiesToSearch, "f") || ['name'];
|
|
132
162
|
}
|
|
133
163
|
/**
|
|
134
164
|
* Specifies a function to dynamically manage the data source when users
|
|
@@ -139,10 +169,10 @@ export class SkyAutocompleteComponent {
|
|
|
139
169
|
* `search`.
|
|
140
170
|
*/
|
|
141
171
|
set search(value) {
|
|
142
|
-
this
|
|
172
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent__search, value, "f");
|
|
143
173
|
}
|
|
144
174
|
get search() {
|
|
145
|
-
return (this
|
|
175
|
+
return (__classPrivateFieldGet(this, _SkyAutocompleteComponent__search, "f") ||
|
|
146
176
|
skyAutocompleteDefaultSearchFunction({
|
|
147
177
|
propertiesToSearch: this.propertiesToSearch,
|
|
148
178
|
searchFilters: this.searchFilters,
|
|
@@ -154,10 +184,10 @@ export class SkyAutocompleteComponent {
|
|
|
154
184
|
* as `item` variables that reference all of the object properties of the search results.
|
|
155
185
|
*/
|
|
156
186
|
set searchResultTemplate(value) {
|
|
157
|
-
this
|
|
187
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent__searchResultTemplate, value, "f");
|
|
158
188
|
}
|
|
159
189
|
get searchResultTemplate() {
|
|
160
|
-
return this
|
|
190
|
+
return __classPrivateFieldGet(this, _SkyAutocompleteComponent__searchResultTemplate, "f") || this.defaultSearchResultTemplate;
|
|
161
191
|
}
|
|
162
192
|
/**
|
|
163
193
|
* Specifies the minimum number of characters that users must enter before
|
|
@@ -166,11 +196,12 @@ export class SkyAutocompleteComponent {
|
|
|
166
196
|
* @default 1
|
|
167
197
|
*/
|
|
168
198
|
set searchTextMinimumCharacters(value) {
|
|
169
|
-
this
|
|
199
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent__searchTextMinimumCharacters, value, "f");
|
|
170
200
|
}
|
|
171
201
|
get searchTextMinimumCharacters() {
|
|
172
|
-
return this
|
|
173
|
-
|
|
202
|
+
return __classPrivateFieldGet(this, _SkyAutocompleteComponent__searchTextMinimumCharacters, "f") &&
|
|
203
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent__searchTextMinimumCharacters, "f") > 0
|
|
204
|
+
? __classPrivateFieldGet(this, _SkyAutocompleteComponent__searchTextMinimumCharacters, "f")
|
|
174
205
|
: 1;
|
|
175
206
|
}
|
|
176
207
|
/**
|
|
@@ -178,126 +209,117 @@ export class SkyAutocompleteComponent {
|
|
|
178
209
|
* By default, the component displays all matching results.
|
|
179
210
|
*/
|
|
180
211
|
set searchResultsLimit(value) {
|
|
181
|
-
this
|
|
212
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent__searchResultsLimit, value, "f");
|
|
182
213
|
}
|
|
183
214
|
get searchResultsLimit() {
|
|
184
|
-
if (this
|
|
185
|
-
return this
|
|
215
|
+
if (__classPrivateFieldGet(this, _SkyAutocompleteComponent__searchResultsLimit, "f") && __classPrivateFieldGet(this, _SkyAutocompleteComponent__searchResultsLimit, "f") > 0) {
|
|
216
|
+
return __classPrivateFieldGet(this, _SkyAutocompleteComponent__searchResultsLimit, "f");
|
|
186
217
|
}
|
|
187
218
|
else {
|
|
188
|
-
return this.enableShowMore ? 5 : this
|
|
219
|
+
return this.enableShowMore ? 5 : __classPrivateFieldGet(this, _SkyAutocompleteComponent__searchResultsLimit, "f");
|
|
189
220
|
}
|
|
190
221
|
}
|
|
191
|
-
/**
|
|
192
|
-
* Fires when users select items in the dropdown list.
|
|
193
|
-
*/
|
|
194
|
-
get selectionChange() {
|
|
195
|
-
return this._selectionChange;
|
|
196
|
-
}
|
|
197
222
|
//#endregion
|
|
198
223
|
//#region template_properties
|
|
199
224
|
get searchResults() {
|
|
200
|
-
return this
|
|
225
|
+
return __classPrivateFieldGet(this, _SkyAutocompleteComponent__searchResults, "f") || [];
|
|
226
|
+
}
|
|
227
|
+
set searchResults(value) {
|
|
228
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent__searchResults, value, "f");
|
|
201
229
|
}
|
|
202
230
|
get highlightText() {
|
|
203
|
-
return this
|
|
231
|
+
return __classPrivateFieldGet(this, _SkyAutocompleteComponent__highlightText, "f") || [];
|
|
232
|
+
}
|
|
233
|
+
set highlightText(value) {
|
|
234
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent__highlightText, value, "f");
|
|
204
235
|
}
|
|
205
236
|
get showActionsArea() {
|
|
206
237
|
return this.showAddButton || this.enableShowMore;
|
|
207
238
|
}
|
|
208
239
|
set inputDirective(directive) {
|
|
209
|
-
if (
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
240
|
+
if (!directive) {
|
|
241
|
+
throw Error([
|
|
242
|
+
'The SkyAutocompleteComponent requires a ContentChild input or',
|
|
243
|
+
'textarea bound with the SkyAutocomplete directive. For example:',
|
|
244
|
+
'`<input type="text" skyAutocomplete>`.',
|
|
245
|
+
].join(' '));
|
|
246
|
+
}
|
|
247
|
+
if (__classPrivateFieldGet(this, _SkyAutocompleteComponent__inputDirective, "f") !== directive) {
|
|
217
248
|
// Unsubscribe from old subscriptions on any previous input directive
|
|
218
|
-
this.
|
|
219
|
-
this
|
|
220
|
-
this.
|
|
221
|
-
this.
|
|
222
|
-
.pipe(takeUntil(this
|
|
249
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_inputDirectiveUnsubscribe, "f").next();
|
|
250
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent__inputDirective, directive, "f");
|
|
251
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent__inputDirective, "f").displayWith = this.descriptorProperty;
|
|
252
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent__inputDirective, "f").textChanges
|
|
253
|
+
.pipe(takeUntil(__classPrivateFieldGet(this, _SkyAutocompleteComponent_inputDirectiveUnsubscribe, "f")), debounceTime(this.debounceTime), switchMap((change) => {
|
|
223
254
|
this.isSearchingAsync = true;
|
|
224
255
|
return of(change);
|
|
225
256
|
}))
|
|
226
257
|
.subscribe((change) => {
|
|
227
|
-
this.
|
|
258
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_searchTextChanged).call(this, change.value);
|
|
228
259
|
});
|
|
229
|
-
this.
|
|
230
|
-
.pipe(takeUntil(this
|
|
260
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent__inputDirective, "f").blur
|
|
261
|
+
.pipe(takeUntil(__classPrivateFieldGet(this, _SkyAutocompleteComponent_inputDirectiveUnsubscribe, "f")))
|
|
231
262
|
.subscribe(() => {
|
|
232
|
-
|
|
233
|
-
this.
|
|
234
|
-
|
|
263
|
+
directive.restoreInputTextValueToPreviousState();
|
|
264
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_closeDropdown).call(this);
|
|
265
|
+
directive.onTouched();
|
|
235
266
|
});
|
|
236
|
-
this.
|
|
237
|
-
.pipe(takeUntil(this
|
|
267
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent__inputDirective, "f").focus
|
|
268
|
+
.pipe(takeUntil(__classPrivateFieldGet(this, _SkyAutocompleteComponent_inputDirectiveUnsubscribe, "f")))
|
|
238
269
|
.subscribe(() => {
|
|
239
270
|
if (this.showActionsArea) {
|
|
240
|
-
this.
|
|
271
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_openDropdown).call(this);
|
|
241
272
|
}
|
|
242
273
|
});
|
|
243
274
|
}
|
|
244
275
|
}
|
|
245
276
|
get inputDirective() {
|
|
246
|
-
return this
|
|
277
|
+
return __classPrivateFieldGet(this, _SkyAutocompleteComponent__inputDirective, "f");
|
|
247
278
|
}
|
|
248
279
|
set resultsRef(value) {
|
|
249
280
|
if (value) {
|
|
250
|
-
this
|
|
251
|
-
this.
|
|
252
|
-
this.
|
|
281
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent__resultsRef, value, "f");
|
|
282
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_destroyAffixer).call(this);
|
|
283
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_createAffixer).call(this);
|
|
253
284
|
}
|
|
254
285
|
}
|
|
255
286
|
get resultsRef() {
|
|
256
|
-
return this
|
|
257
|
-
}
|
|
258
|
-
ngAfterContentInit() {
|
|
259
|
-
if (!this.inputDirective) {
|
|
260
|
-
throw Error([
|
|
261
|
-
'The SkyAutocompleteComponent requires a ContentChild input or',
|
|
262
|
-
'textarea bound with the SkyAutocomplete directive. For example:',
|
|
263
|
-
'`<input type="text" skyAutocomplete>`.',
|
|
264
|
-
].join(' '));
|
|
265
|
-
}
|
|
287
|
+
return __classPrivateFieldGet(this, _SkyAutocompleteComponent__resultsRef, "f");
|
|
266
288
|
}
|
|
267
289
|
ngAfterViewInit() {
|
|
268
|
-
this.
|
|
290
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_addInputEventListeners).call(this);
|
|
269
291
|
}
|
|
270
292
|
ngOnDestroy() {
|
|
271
|
-
this.
|
|
272
|
-
this.
|
|
273
|
-
this.
|
|
274
|
-
this.
|
|
275
|
-
this.
|
|
276
|
-
this.
|
|
277
|
-
this.
|
|
293
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_cancelCurrentSearch).call(this);
|
|
294
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_inputDirectiveUnsubscribe, "f").next();
|
|
295
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_inputDirectiveUnsubscribe, "f").complete();
|
|
296
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_ngUnsubscribe, "f").next();
|
|
297
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_ngUnsubscribe, "f").complete();
|
|
298
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_destroyAffixer).call(this);
|
|
299
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_destroyOverlay).call(this);
|
|
278
300
|
}
|
|
279
301
|
addButtonClicked() {
|
|
280
302
|
this.addClick.emit();
|
|
281
303
|
this.inputDirective.restoreInputTextValueToPreviousState();
|
|
282
|
-
this.
|
|
304
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_closeDropdown).call(this);
|
|
283
305
|
}
|
|
284
306
|
handleKeydown(event) {
|
|
285
307
|
/* Sanity check */
|
|
286
308
|
/* istanbul ignore else */
|
|
287
309
|
if (event.key) {
|
|
288
310
|
const key = event.key.toLowerCase();
|
|
289
|
-
const activeElement = this.
|
|
311
|
+
const activeElement = __classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_getActiveElement).call(this);
|
|
290
312
|
const activeElementId = activeElement?.id;
|
|
291
313
|
const targetIsSearchResult = this.searchResults.find((r) => r.elementId === activeElementId);
|
|
292
314
|
switch (key) {
|
|
293
315
|
case 'enter':
|
|
294
316
|
if (targetIsSearchResult) {
|
|
295
|
-
this.
|
|
317
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_selectSearchResultById).call(this, activeElementId);
|
|
296
318
|
if (!this.showActionsArea) {
|
|
297
|
-
this.
|
|
319
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_closeDropdown).call(this);
|
|
298
320
|
}
|
|
299
321
|
else {
|
|
300
|
-
this.
|
|
322
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_resetSearch).call(this);
|
|
301
323
|
}
|
|
302
324
|
}
|
|
303
325
|
else {
|
|
@@ -310,43 +332,43 @@ export class SkyAutocompleteComponent {
|
|
|
310
332
|
break;
|
|
311
333
|
case 'tab':
|
|
312
334
|
if (targetIsSearchResult) {
|
|
313
|
-
this.
|
|
335
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_selectSearchResultById).call(this, activeElementId);
|
|
314
336
|
}
|
|
315
337
|
else {
|
|
316
338
|
this.inputDirective.restoreInputTextValueToPreviousState();
|
|
317
339
|
}
|
|
318
|
-
this.
|
|
340
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_closeDropdown).call(this);
|
|
319
341
|
break;
|
|
320
342
|
case 'escape':
|
|
321
|
-
this.
|
|
343
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_closeDropdown).call(this);
|
|
322
344
|
break;
|
|
323
345
|
case 'arrowdown':
|
|
324
346
|
case 'down':
|
|
325
|
-
this.
|
|
326
|
-
if (this
|
|
327
|
-
this.
|
|
328
|
-
this
|
|
329
|
-
this
|
|
347
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_removeFocusedClass).call(this);
|
|
348
|
+
if (__classPrivateFieldGet(this, _SkyAutocompleteComponent_activeElementIndex, "f") ===
|
|
349
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_overlayFocusableElements, "f").length - 1 ||
|
|
350
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_activeElementIndex, "f") === -1) {
|
|
351
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_activeElementIndex, 0, "f");
|
|
330
352
|
}
|
|
331
353
|
else {
|
|
332
|
-
this
|
|
354
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_activeElementIndex, __classPrivateFieldGet(this, _SkyAutocompleteComponent_activeElementIndex, "f") + 1, "f");
|
|
333
355
|
}
|
|
334
|
-
this.
|
|
335
|
-
this.
|
|
356
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_addFocusedClass).call(this);
|
|
357
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_changeDetector, "f").markForCheck();
|
|
336
358
|
event.preventDefault();
|
|
337
359
|
event.stopPropagation();
|
|
338
360
|
break;
|
|
339
361
|
case 'arrowup':
|
|
340
362
|
case 'up':
|
|
341
|
-
this.
|
|
342
|
-
if (this
|
|
343
|
-
this
|
|
363
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_removeFocusedClass).call(this);
|
|
364
|
+
if (__classPrivateFieldGet(this, _SkyAutocompleteComponent_activeElementIndex, "f") <= 0) {
|
|
365
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_activeElementIndex, __classPrivateFieldGet(this, _SkyAutocompleteComponent_overlayFocusableElements, "f").length - 1, "f");
|
|
344
366
|
}
|
|
345
367
|
else {
|
|
346
|
-
this
|
|
368
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_activeElementIndex, __classPrivateFieldGet(this, _SkyAutocompleteComponent_activeElementIndex, "f") - 1, "f");
|
|
347
369
|
}
|
|
348
|
-
this.
|
|
349
|
-
this.
|
|
370
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_addFocusedClass).call(this);
|
|
371
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_changeDetector, "f").markForCheck();
|
|
350
372
|
event.preventDefault();
|
|
351
373
|
event.stopPropagation();
|
|
352
374
|
break;
|
|
@@ -356,310 +378,284 @@ export class SkyAutocompleteComponent {
|
|
|
356
378
|
moreButtonClicked() {
|
|
357
379
|
this.showMoreClick.emit({ inputValue: this.searchText });
|
|
358
380
|
this.inputDirective.restoreInputTextValueToPreviousState();
|
|
359
|
-
this.
|
|
381
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_closeDropdown).call(this);
|
|
360
382
|
}
|
|
361
383
|
onResultMouseDown(id, event) {
|
|
362
|
-
this.
|
|
384
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_selectSearchResultById).call(this, id);
|
|
363
385
|
if (!this.showActionsArea) {
|
|
364
|
-
this.
|
|
386
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_closeDropdown).call(this);
|
|
365
387
|
}
|
|
366
388
|
else {
|
|
367
|
-
this.
|
|
389
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_resetSearch).call(this);
|
|
368
390
|
}
|
|
369
391
|
event.preventDefault();
|
|
370
392
|
event.stopPropagation();
|
|
371
393
|
}
|
|
372
394
|
onResultMouseMove(id) {
|
|
373
|
-
if (id !== this
|
|
374
|
-
this.
|
|
375
|
-
this
|
|
376
|
-
this.
|
|
377
|
-
this.
|
|
395
|
+
if (id !== __classPrivateFieldGet(this, _SkyAutocompleteComponent_activeElementIndex, "f")) {
|
|
396
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_removeFocusedClass).call(this);
|
|
397
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_activeElementIndex, id, "f");
|
|
398
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_addFocusedClass).call(this);
|
|
399
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_changeDetector, "f").markForCheck();
|
|
378
400
|
}
|
|
379
401
|
}
|
|
380
402
|
isElementFocused(ref) {
|
|
381
|
-
return ref === this
|
|
382
|
-
}
|
|
383
|
-
searchTextChanged(searchText) {
|
|
384
|
-
const isEmpty = !searchText || !searchText.trim() || searchText.match(/^\s+$/);
|
|
385
|
-
if (isEmpty) {
|
|
386
|
-
// Emit selectionChange if value has been cleared.
|
|
387
|
-
if (this.inputDirective.value) {
|
|
388
|
-
this.inputDirective.value = undefined;
|
|
389
|
-
this.selectionChange.emit({
|
|
390
|
-
selectedItem: undefined,
|
|
391
|
-
});
|
|
392
|
-
}
|
|
393
|
-
if (!this.showActionsArea) {
|
|
394
|
-
this.closeDropdown();
|
|
395
|
-
}
|
|
396
|
-
else {
|
|
397
|
-
this.resetSearch();
|
|
398
|
-
}
|
|
399
|
-
this.isSearchingAsync = false;
|
|
400
|
-
this.changeDetector.markForCheck();
|
|
401
|
-
return;
|
|
402
|
-
}
|
|
403
|
-
const isLongEnough = searchText.length >= this.searchTextMinimumCharacters;
|
|
404
|
-
const isDifferent = searchText !== this.searchText;
|
|
405
|
-
this.searchText = searchText.trim();
|
|
406
|
-
if (isLongEnough && isDifferent) {
|
|
407
|
-
this.cancelCurrentSearch();
|
|
408
|
-
this.currentSearchSub = this.performSearch()
|
|
409
|
-
.pipe(take(1))
|
|
410
|
-
.subscribe((result) => {
|
|
411
|
-
const items = result.items.filter((item) => {
|
|
412
|
-
return item && this.descriptorProperty in item;
|
|
413
|
-
});
|
|
414
|
-
this.isSearchingAsync = false;
|
|
415
|
-
this._searchResults = items.map((r, i) => {
|
|
416
|
-
const result = {
|
|
417
|
-
elementId: `${this.resultsListId}-item-${i}`,
|
|
418
|
-
data: r,
|
|
419
|
-
};
|
|
420
|
-
return result;
|
|
421
|
-
});
|
|
422
|
-
this.searchResultsCount = result.totalCount;
|
|
423
|
-
this._highlightText = this.getHighlightText(this.searchText);
|
|
424
|
-
this.removeFocusedClass();
|
|
425
|
-
this.removeActiveDescendant();
|
|
426
|
-
if (this.searchResults.length > 0) {
|
|
427
|
-
this.activeElementIndex = 0;
|
|
428
|
-
}
|
|
429
|
-
else {
|
|
430
|
-
this.activeElementIndex = -1;
|
|
431
|
-
}
|
|
432
|
-
this.changeDetector.markForCheck();
|
|
433
|
-
if (this.isOpen) {
|
|
434
|
-
// Let the results populate in the DOM before recalculating placement.
|
|
435
|
-
setTimeout(() => {
|
|
436
|
-
this.affixer.reaffix();
|
|
437
|
-
this.changeDetector.detectChanges();
|
|
438
|
-
this.initOverlayFocusableElements();
|
|
439
|
-
});
|
|
440
|
-
}
|
|
441
|
-
else {
|
|
442
|
-
this.openDropdown();
|
|
443
|
-
this.changeDetector.markForCheck();
|
|
444
|
-
}
|
|
445
|
-
});
|
|
446
|
-
}
|
|
447
|
-
else {
|
|
448
|
-
this.isSearchingAsync = false;
|
|
449
|
-
this.changeDetector.markForCheck();
|
|
450
|
-
}
|
|
403
|
+
return ref === __classPrivateFieldGet(this, _SkyAutocompleteComponent_overlayFocusableElements, "f")[__classPrivateFieldGet(this, _SkyAutocompleteComponent_activeElementIndex, "f")];
|
|
451
404
|
}
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
this.
|
|
460
|
-
|
|
461
|
-
}
|
|
462
|
-
const result = this.search(this.searchText, this.data);
|
|
463
|
-
if (result instanceof Array) {
|
|
464
|
-
return of({
|
|
465
|
-
items: result,
|
|
466
|
-
totalCount: result.length,
|
|
405
|
+
}
|
|
406
|
+
_SkyAutocompleteComponent_activeElementIndex = new WeakMap(), _SkyAutocompleteComponent_adapterService = new WeakMap(), _SkyAutocompleteComponent_affixer = new WeakMap(), _SkyAutocompleteComponent_affixService = new WeakMap(), _SkyAutocompleteComponent_changeDetector = new WeakMap(), _SkyAutocompleteComponent_elementRef = new WeakMap(), _SkyAutocompleteComponent_inputBoxHostSvc = new WeakMap(), _SkyAutocompleteComponent_inputDirectiveUnsubscribe = new WeakMap(), _SkyAutocompleteComponent_messageStreamSub = new WeakMap(), _SkyAutocompleteComponent_ngUnsubscribe = new WeakMap(), _SkyAutocompleteComponent_overlay = new WeakMap(), _SkyAutocompleteComponent_overlayService = new WeakMap(), _SkyAutocompleteComponent_overlayFocusableElements = new WeakMap(), _SkyAutocompleteComponent_currentSearchSub = new WeakMap(), _SkyAutocompleteComponent__data = new WeakMap(), _SkyAutocompleteComponent__debounceTime = new WeakMap(), _SkyAutocompleteComponent__descriptorProperty = new WeakMap(), _SkyAutocompleteComponent__highlightText = new WeakMap(), _SkyAutocompleteComponent__inputDirective = new WeakMap(), _SkyAutocompleteComponent__messageStream = new WeakMap(), _SkyAutocompleteComponent__propertiesToSearch = new WeakMap(), _SkyAutocompleteComponent__resultsRef = new WeakMap(), _SkyAutocompleteComponent__search = new WeakMap(), _SkyAutocompleteComponent__searchResults = new WeakMap(), _SkyAutocompleteComponent__searchResultTemplate = new WeakMap(), _SkyAutocompleteComponent__searchResultsLimit = new WeakMap(), _SkyAutocompleteComponent__searchTextMinimumCharacters = new WeakMap(), _SkyAutocompleteComponent_instances = new WeakSet(), _SkyAutocompleteComponent_searchTextChanged = function _SkyAutocompleteComponent_searchTextChanged(searchText) {
|
|
407
|
+
const isEmpty = !searchText || !searchText.trim() || searchText.match(/^\s+$/);
|
|
408
|
+
if (isEmpty) {
|
|
409
|
+
// Emit selectionChange if value has been cleared.
|
|
410
|
+
if (this.inputDirective.value) {
|
|
411
|
+
this.inputDirective.value = undefined;
|
|
412
|
+
this.selectionChange.emit({
|
|
413
|
+
selectedItem: undefined,
|
|
467
414
|
});
|
|
468
415
|
}
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
items,
|
|
472
|
-
totalCount: items.length,
|
|
473
|
-
};
|
|
474
|
-
}));
|
|
475
|
-
}
|
|
476
|
-
cancelCurrentSearch() {
|
|
477
|
-
if (this.currentSearchSub) {
|
|
478
|
-
this.currentSearchSub.unsubscribe();
|
|
479
|
-
this.currentSearchSub = undefined;
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
/**
|
|
483
|
-
* Returns the text to highlight based on exact matches, case-insensitive matches, and matches for corresponding diacritical characters (a will match à).
|
|
484
|
-
*/
|
|
485
|
-
getHighlightText(searchText) {
|
|
486
|
-
const normalizedSearchText = normalizeDiacritics(searchText)
|
|
487
|
-
.toLocaleUpperCase()
|
|
488
|
-
.trim();
|
|
489
|
-
if (!normalizedSearchText) {
|
|
490
|
-
return [];
|
|
416
|
+
if (!this.showActionsArea) {
|
|
417
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_closeDropdown).call(this);
|
|
491
418
|
}
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
const value = this._searchResults[i].data[this.descriptorProperty]
|
|
495
|
-
.toString()
|
|
496
|
-
.toLocaleUpperCase();
|
|
497
|
-
const normalizedDataValue = normalizeDiacritics(value);
|
|
498
|
-
let offset = 0;
|
|
499
|
-
let index;
|
|
500
|
-
while ((index = normalizedDataValue.indexOf(normalizedSearchText, offset)) > -1) {
|
|
501
|
-
const matchedString = value.slice(index, index + searchText.length);
|
|
502
|
-
offset = index + searchText.length;
|
|
503
|
-
matchesToHighlight = matchesToHighlight.concat(matchedString);
|
|
504
|
-
}
|
|
419
|
+
else {
|
|
420
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_resetSearch).call(this);
|
|
505
421
|
}
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
422
|
+
this.isSearchingAsync = false;
|
|
423
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_changeDetector, "f").markForCheck();
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
const isLongEnough = searchText.length >= this.searchTextMinimumCharacters;
|
|
427
|
+
const isDifferent = searchText !== this.searchText;
|
|
428
|
+
this.searchText = searchText.trim();
|
|
429
|
+
if (isLongEnough && isDifferent) {
|
|
430
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_cancelCurrentSearch).call(this);
|
|
431
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_currentSearchSub, __classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_performSearch).call(this)
|
|
432
|
+
.pipe(take(1))
|
|
433
|
+
.subscribe((result) => {
|
|
434
|
+
const items = result.items.filter((item) => {
|
|
435
|
+
return item && this.descriptorProperty in item;
|
|
518
436
|
});
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
wrapperClass: this.wrapperClass,
|
|
437
|
+
this.isSearchingAsync = false;
|
|
438
|
+
this.searchResults = items.map((r, i) => {
|
|
439
|
+
const result = {
|
|
440
|
+
elementId: `${this.resultsListId}-item-${i}`,
|
|
441
|
+
data: r,
|
|
442
|
+
};
|
|
443
|
+
return result;
|
|
527
444
|
});
|
|
528
|
-
|
|
529
|
-
this.
|
|
530
|
-
this
|
|
531
|
-
this.
|
|
532
|
-
this.
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
this.removeActiveDescendant();
|
|
540
|
-
this.changeDetector.markForCheck();
|
|
541
|
-
}
|
|
542
|
-
setActiveDescendant() {
|
|
543
|
-
const activeElement = this.overlayFocusableElements[this.activeElementIndex];
|
|
544
|
-
/* Sanity check */
|
|
545
|
-
/* istanbul ignore else */
|
|
546
|
-
if (activeElement) {
|
|
547
|
-
this.inputDirective.setActiveDescendant(activeElement.id);
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
removeActiveDescendant() {
|
|
551
|
-
this.inputDirective.setActiveDescendant(null);
|
|
552
|
-
}
|
|
553
|
-
resetSearch() {
|
|
554
|
-
this._searchResults = [];
|
|
555
|
-
this.searchText = '';
|
|
556
|
-
this._highlightText = [];
|
|
557
|
-
this.activeElementIndex = -1;
|
|
558
|
-
this.searchResultsCount = undefined;
|
|
559
|
-
this.removeActiveDescendant();
|
|
560
|
-
this.initOverlayFocusableElements();
|
|
561
|
-
this.changeDetector.markForCheck();
|
|
562
|
-
}
|
|
563
|
-
addInputEventListeners() {
|
|
564
|
-
const element = this.elementRef.nativeElement;
|
|
565
|
-
observableFromEvent(element, 'keydown')
|
|
566
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
567
|
-
.subscribe((event) => {
|
|
568
|
-
this.handleKeydown(event);
|
|
569
|
-
});
|
|
570
|
-
observableFromEvent(window, 'resize')
|
|
571
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
572
|
-
.subscribe(() => {
|
|
573
|
-
/* istanbul ignore else */
|
|
445
|
+
this.searchResultsCount = result.totalCount;
|
|
446
|
+
this.highlightText = __classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_getHighlightText).call(this, this.searchText);
|
|
447
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_removeFocusedClass).call(this);
|
|
448
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_removeActiveDescendant).call(this);
|
|
449
|
+
if (this.searchResults.length > 0) {
|
|
450
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_activeElementIndex, 0, "f");
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_activeElementIndex, -1, "f");
|
|
454
|
+
}
|
|
455
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_changeDetector, "f").markForCheck();
|
|
574
456
|
if (this.isOpen) {
|
|
575
|
-
|
|
457
|
+
// Let the results populate in the DOM before recalculating placement.
|
|
458
|
+
setTimeout(() => {
|
|
459
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_affixer, "f").reaffix();
|
|
460
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_changeDetector, "f").detectChanges();
|
|
461
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_initOverlayFocusableElements).call(this);
|
|
462
|
+
});
|
|
576
463
|
}
|
|
577
|
-
|
|
464
|
+
else {
|
|
465
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_openDropdown).call(this);
|
|
466
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_changeDetector, "f").markForCheck();
|
|
467
|
+
}
|
|
468
|
+
}), "f");
|
|
578
469
|
}
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
470
|
+
else {
|
|
471
|
+
this.isSearchingAsync = false;
|
|
472
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_changeDetector, "f").markForCheck();
|
|
473
|
+
}
|
|
474
|
+
}, _SkyAutocompleteComponent_performSearch = function _SkyAutocompleteComponent_performSearch() {
|
|
475
|
+
if (!this.searchAsyncDisabled && this.searchAsync.observers.length > 0) {
|
|
476
|
+
const searchAsyncArgs = {
|
|
477
|
+
displayType: 'popover',
|
|
478
|
+
offset: 0,
|
|
479
|
+
searchText: this.searchText,
|
|
480
|
+
};
|
|
481
|
+
this.searchAsync.emit(searchAsyncArgs);
|
|
482
|
+
return searchAsyncArgs.result;
|
|
483
|
+
}
|
|
484
|
+
const result = this.search(this.searchText, this.data);
|
|
485
|
+
if (result instanceof Array) {
|
|
486
|
+
return of({
|
|
487
|
+
items: result,
|
|
488
|
+
totalCount: result.length,
|
|
489
|
+
});
|
|
584
490
|
}
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
491
|
+
return from(result).pipe(map((items) => {
|
|
492
|
+
return {
|
|
493
|
+
items,
|
|
494
|
+
totalCount: items.length,
|
|
495
|
+
};
|
|
496
|
+
}));
|
|
497
|
+
}, _SkyAutocompleteComponent_cancelCurrentSearch = function _SkyAutocompleteComponent_cancelCurrentSearch() {
|
|
498
|
+
if (__classPrivateFieldGet(this, _SkyAutocompleteComponent_currentSearchSub, "f")) {
|
|
499
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_currentSearchSub, "f").unsubscribe();
|
|
500
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_currentSearchSub, undefined, "f");
|
|
501
|
+
}
|
|
502
|
+
}, _SkyAutocompleteComponent_getHighlightText = function _SkyAutocompleteComponent_getHighlightText(searchText) {
|
|
503
|
+
const normalizedSearchText = normalizeDiacritics(searchText)
|
|
504
|
+
.toLocaleUpperCase()
|
|
505
|
+
.trim();
|
|
506
|
+
if (!normalizedSearchText) {
|
|
507
|
+
return [];
|
|
508
|
+
}
|
|
509
|
+
let matchesToHighlight = [];
|
|
510
|
+
for (let i = 0, n = this.searchResults.length; i < n; i++) {
|
|
511
|
+
const value = this.searchResults[i].data[this.descriptorProperty]
|
|
512
|
+
.toString()
|
|
513
|
+
.toLocaleUpperCase();
|
|
514
|
+
const normalizedDataValue = normalizeDiacritics(value);
|
|
515
|
+
let offset = 0;
|
|
516
|
+
let index;
|
|
517
|
+
while ((index = normalizedDataValue.indexOf(normalizedSearchText, offset)) > -1) {
|
|
518
|
+
const matchedString = value.slice(index, index + searchText.length);
|
|
519
|
+
offset = index + searchText.length;
|
|
520
|
+
matchesToHighlight = matchesToHighlight.concat(matchedString);
|
|
599
521
|
}
|
|
600
522
|
}
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
523
|
+
// Remove any duplicates from the array.
|
|
524
|
+
return [...new Set(matchesToHighlight)];
|
|
525
|
+
}, _SkyAutocompleteComponent_selectSearchResultById = function _SkyAutocompleteComponent_selectSearchResultById(id) {
|
|
526
|
+
const result = this.searchResults.find((r) => r.elementId === id);
|
|
527
|
+
/* istanbul ignore else */
|
|
528
|
+
if (result) {
|
|
529
|
+
const data = result.data;
|
|
530
|
+
this.searchText = data[this.descriptorProperty];
|
|
531
|
+
this.inputDirective.value = data;
|
|
532
|
+
this.selectionChange.emit({
|
|
533
|
+
selectedItem: data,
|
|
534
|
+
});
|
|
606
535
|
}
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
536
|
+
}, _SkyAutocompleteComponent_openDropdown = function _SkyAutocompleteComponent_openDropdown() {
|
|
537
|
+
if (!__classPrivateFieldGet(this, _SkyAutocompleteComponent_overlay, "f")) {
|
|
538
|
+
const overlay = __classPrivateFieldGet(this, _SkyAutocompleteComponent_overlayService, "f").create({
|
|
539
|
+
enableClose: false,
|
|
540
|
+
enablePointerEvents: true,
|
|
541
|
+
wrapperClass: this.wrapperClass,
|
|
542
|
+
});
|
|
543
|
+
overlay.attachTemplate(this.resultsTemplateRef);
|
|
544
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_overlay, overlay, "f");
|
|
545
|
+
this.isOpen = true;
|
|
546
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_changeDetector, "f").markForCheck();
|
|
547
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_initOverlayFocusableElements).call(this);
|
|
548
|
+
}
|
|
549
|
+
}, _SkyAutocompleteComponent_closeDropdown = function _SkyAutocompleteComponent_closeDropdown() {
|
|
550
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_resetSearch).call(this);
|
|
551
|
+
this.isOpen = false;
|
|
552
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_destroyOverlay).call(this);
|
|
553
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_removeActiveDescendant).call(this);
|
|
554
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_changeDetector, "f").markForCheck();
|
|
555
|
+
}, _SkyAutocompleteComponent_setActiveDescendant = function _SkyAutocompleteComponent_setActiveDescendant() {
|
|
556
|
+
const activeElement = __classPrivateFieldGet(this, _SkyAutocompleteComponent_overlayFocusableElements, "f")[__classPrivateFieldGet(this, _SkyAutocompleteComponent_activeElementIndex, "f")];
|
|
557
|
+
/* Sanity check */
|
|
558
|
+
/* istanbul ignore else */
|
|
559
|
+
if (activeElement) {
|
|
560
|
+
this.inputDirective.setActiveDescendant(activeElement.id);
|
|
561
|
+
}
|
|
562
|
+
}, _SkyAutocompleteComponent_removeActiveDescendant = function _SkyAutocompleteComponent_removeActiveDescendant() {
|
|
563
|
+
this.inputDirective.setActiveDescendant(null);
|
|
564
|
+
}, _SkyAutocompleteComponent_resetSearch = function _SkyAutocompleteComponent_resetSearch() {
|
|
565
|
+
this.searchResults = [];
|
|
566
|
+
this.searchText = '';
|
|
567
|
+
this.highlightText = [];
|
|
568
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_activeElementIndex, -1, "f");
|
|
569
|
+
this.searchResultsCount = undefined;
|
|
570
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_removeActiveDescendant).call(this);
|
|
571
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_initOverlayFocusableElements).call(this);
|
|
572
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_changeDetector, "f").markForCheck();
|
|
573
|
+
}, _SkyAutocompleteComponent_addInputEventListeners = function _SkyAutocompleteComponent_addInputEventListeners() {
|
|
574
|
+
const element = __classPrivateFieldGet(this, _SkyAutocompleteComponent_elementRef, "f").nativeElement;
|
|
575
|
+
observableFromEvent(element, 'keydown')
|
|
576
|
+
.pipe(takeUntil(__classPrivateFieldGet(this, _SkyAutocompleteComponent_ngUnsubscribe, "f")))
|
|
577
|
+
.subscribe((event) => {
|
|
578
|
+
this.handleKeydown(event);
|
|
579
|
+
});
|
|
580
|
+
observableFromEvent(window, 'resize')
|
|
581
|
+
.pipe(takeUntil(__classPrivateFieldGet(this, _SkyAutocompleteComponent_ngUnsubscribe, "f")))
|
|
582
|
+
.subscribe(() => {
|
|
583
|
+
/* istanbul ignore else */
|
|
584
|
+
if (this.isOpen && this.resultsRef) {
|
|
585
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_adapterService, "f").setDropdownWidth(__classPrivateFieldGet(this, _SkyAutocompleteComponent_elementRef, "f"), this.resultsRef, !!__classPrivateFieldGet(this, _SkyAutocompleteComponent_inputBoxHostSvc, "f"));
|
|
631
586
|
}
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
587
|
+
});
|
|
588
|
+
}, _SkyAutocompleteComponent_destroyOverlay = function _SkyAutocompleteComponent_destroyOverlay() {
|
|
589
|
+
if (__classPrivateFieldGet(this, _SkyAutocompleteComponent_overlay, "f")) {
|
|
590
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_overlayService, "f").close(__classPrivateFieldGet(this, _SkyAutocompleteComponent_overlay, "f"));
|
|
591
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_overlay, undefined, "f");
|
|
592
|
+
}
|
|
593
|
+
}, _SkyAutocompleteComponent_createAffixer = function _SkyAutocompleteComponent_createAffixer() {
|
|
594
|
+
/* Sanity check */
|
|
595
|
+
/* istanbul ignore else */
|
|
596
|
+
if (!__classPrivateFieldGet(this, _SkyAutocompleteComponent_affixer, "f") && this.resultsRef) {
|
|
597
|
+
const affixer = __classPrivateFieldGet(this, _SkyAutocompleteComponent_affixService, "f").createAffixer(this.resultsRef);
|
|
598
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_adapterService, "f").setDropdownWidth(__classPrivateFieldGet(this, _SkyAutocompleteComponent_elementRef, "f"), this.resultsRef, !!__classPrivateFieldGet(this, _SkyAutocompleteComponent_inputBoxHostSvc, "f"));
|
|
599
|
+
affixer.affixTo(__classPrivateFieldGet(this, _SkyAutocompleteComponent_elementRef, "f").nativeElement, {
|
|
600
|
+
autoFitContext: SkyAffixAutoFitContext.Viewport,
|
|
601
|
+
enableAutoFit: true,
|
|
602
|
+
isSticky: true,
|
|
603
|
+
placement: 'below',
|
|
604
|
+
horizontalAlignment: 'left',
|
|
644
605
|
});
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
606
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_affixer, affixer, "f");
|
|
607
|
+
}
|
|
608
|
+
}, _SkyAutocompleteComponent_destroyAffixer = function _SkyAutocompleteComponent_destroyAffixer() {
|
|
609
|
+
if (__classPrivateFieldGet(this, _SkyAutocompleteComponent_affixer, "f")) {
|
|
610
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_affixer, "f").destroy();
|
|
611
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_affixer, undefined, "f");
|
|
612
|
+
}
|
|
613
|
+
}, _SkyAutocompleteComponent_initMessageStream = function _SkyAutocompleteComponent_initMessageStream() {
|
|
614
|
+
if (__classPrivateFieldGet(this, _SkyAutocompleteComponent_messageStreamSub, "f")) {
|
|
615
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_messageStreamSub, "f").unsubscribe();
|
|
616
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_messageStreamSub, undefined, "f");
|
|
617
|
+
}
|
|
618
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_messageStreamSub, this.messageStream.subscribe((message) => {
|
|
619
|
+
switch (message.type) {
|
|
620
|
+
case SkyAutocompleteMessageType.CloseDropdown:
|
|
621
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_closeDropdown).call(this);
|
|
622
|
+
break;
|
|
623
|
+
case SkyAutocompleteMessageType.RepositionDropdown:
|
|
624
|
+
// Settimeout waits for changes in DOM (e.g., tokens being removed)
|
|
625
|
+
setTimeout(() => {
|
|
626
|
+
/* istanbul ignore else */
|
|
627
|
+
if (__classPrivateFieldGet(this, _SkyAutocompleteComponent_affixer, "f")) {
|
|
628
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_affixer, "f").reaffix();
|
|
629
|
+
}
|
|
630
|
+
});
|
|
631
|
+
break;
|
|
652
632
|
}
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
633
|
+
}), "f");
|
|
634
|
+
}, _SkyAutocompleteComponent_initOverlayFocusableElements = function _SkyAutocompleteComponent_initOverlayFocusableElements() {
|
|
635
|
+
// Wait for dropdown elements to render.
|
|
636
|
+
setTimeout(() => {
|
|
637
|
+
if (__classPrivateFieldGet(this, _SkyAutocompleteComponent_overlay, "f")) {
|
|
638
|
+
__classPrivateFieldSet(this, _SkyAutocompleteComponent_overlayFocusableElements, __classPrivateFieldGet(this, _SkyAutocompleteComponent_adapterService, "f").getOverlayFocusableElements(__classPrivateFieldGet(this, _SkyAutocompleteComponent_overlay, "f")), "f");
|
|
639
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_overlayFocusableElements, "f").forEach((el) => {
|
|
640
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_adapterService, "f").setTabIndex(el, -1);
|
|
641
|
+
});
|
|
642
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_addFocusedClass).call(this);
|
|
658
643
|
}
|
|
659
|
-
}
|
|
660
|
-
}
|
|
644
|
+
});
|
|
645
|
+
}, _SkyAutocompleteComponent_getActiveElement = function _SkyAutocompleteComponent_getActiveElement() {
|
|
646
|
+
return __classPrivateFieldGet(this, _SkyAutocompleteComponent_overlayFocusableElements, "f")[__classPrivateFieldGet(this, _SkyAutocompleteComponent_activeElementIndex, "f")];
|
|
647
|
+
}, _SkyAutocompleteComponent_removeFocusedClass = function _SkyAutocompleteComponent_removeFocusedClass() {
|
|
648
|
+
if (__classPrivateFieldGet(this, _SkyAutocompleteComponent_activeElementIndex, "f") > -1) {
|
|
649
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_adapterService, "f").removeCSSClass(__classPrivateFieldGet(this, _SkyAutocompleteComponent_overlayFocusableElements, "f")[__classPrivateFieldGet(this, _SkyAutocompleteComponent_activeElementIndex, "f")], 'sky-autocomplete-descendant-focus');
|
|
650
|
+
}
|
|
651
|
+
}, _SkyAutocompleteComponent_addFocusedClass = function _SkyAutocompleteComponent_addFocusedClass() {
|
|
652
|
+
if (__classPrivateFieldGet(this, _SkyAutocompleteComponent_activeElementIndex, "f") > -1) {
|
|
653
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_adapterService, "f").addCSSClass(__classPrivateFieldGet(this, _SkyAutocompleteComponent_overlayFocusableElements, "f")[__classPrivateFieldGet(this, _SkyAutocompleteComponent_activeElementIndex, "f")], 'sky-autocomplete-descendant-focus');
|
|
654
|
+
__classPrivateFieldGet(this, _SkyAutocompleteComponent_instances, "m", _SkyAutocompleteComponent_setActiveDescendant).call(this);
|
|
655
|
+
}
|
|
656
|
+
};
|
|
661
657
|
SkyAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyAutocompleteComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyAffixService }, { token: i2.SkyAutocompleteAdapterService }, { token: i1.SkyOverlayService }, { token: i3.SkyInputBoxHostService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
662
|
-
SkyAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: SkyAutocompleteComponent, selector: "sky-autocomplete", inputs: { ariaLabelledBy: "ariaLabelledBy", data: "data", debounceTime: "debounceTime", descriptorProperty: "descriptorProperty", enableShowMore: "enableShowMore", messageStream: "messageStream", wrapperClass: "wrapperClass", propertiesToSearch: "propertiesToSearch", search: "search", searchResultTemplate: "searchResultTemplate", searchTextMinimumCharacters: "searchTextMinimumCharacters", searchFilters: "searchFilters", searchResultsLimit: "searchResultsLimit", showAddButton: "showAddButton", noResultsFoundText: "noResultsFoundText", searchAsyncDisabled: "searchAsyncDisabled" }, outputs: { addClick: "addClick", showMoreClick: "showMoreClick", selectionChange: "selectionChange", searchAsync: "searchAsync" }, providers: [SkyAutocompleteAdapterService], queries: [{ propertyName: "inputDirective", first: true, predicate: SkyAutocompleteInputDirective, descendants: true }], viewQueries: [{ propertyName: "defaultSearchResultTemplate", first: true, predicate: ["defaultSearchResultTemplate"], descendants: true, read: TemplateRef }, { propertyName: "resultsTemplateRef", first: true, predicate: ["resultsTemplateRef"], descendants: true, read: TemplateRef }, { propertyName: "resultsRef", first: true, predicate: ["resultsRef"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n class=\"sky-autocomplete\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen && searchText\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-owns]=\"isOpen ? resultsListId : null\"\n [attr.id]=\"resultsWrapperId\"\n>\n <ng-content></ng-content>\n</div>\n\n<ng-template #resultsTemplateRef>\n <div\n class=\"sky-autocomplete-results-container\"\n [skyThemeClass]=\"{\n 'sky-shadow': 'default',\n 'sky-elevation-4': 'modern'\n }\"\n (keydown)=\"handleKeydown($event)\"\n #resultsRef\n >\n <div\n *ngIf=\"isSearchingAsync; else resultControlsTemplateRef\"\n class=\"sky-autocomplete-results-waiting\"\n >\n <sky-wait [isWaiting]=\"true\"></sky-wait>\n </div>\n </div>\n</ng-template>\n\n<ng-template #resultControlsTemplateRef>\n <div\n *ngIf=\"searchText && (!showActionsArea || searchResults.length > 0)\"\n class=\"sky-autocomplete-results\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.id]=\"resultsListId\"\n >\n <ng-container *ngFor=\"let result of searchResults; let i = index\">\n <div\n *ngIf=\"!searchResultsLimit || i < searchResultsLimit\"\n class=\"sky-autocomplete-result\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isElementFocused(searchResultEl)\"\n [attr.id]=\"result.elementId\"\n [skyHighlight]=\"highlightText\"\n (mousedown)=\"onResultMouseDown(result.elementId, $event)\"\n (mousemove)=\"onResultMouseMove(i)\"\n #searchResultEl\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchResultTemplate;\n context: { item: result.data }\n \"\n >\n </ng-container>\n </div>\n </ng-container>\n <div\n *ngIf=\"searchResults.length === 0\"\n class=\"sky-deemphasized sky-padding-squish-default\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n </div>\n <div *ngIf=\"showActionsArea\" class=\"sky-autocomplete-actions\">\n <button\n *ngIf=\"enableShowMore && (!searchText || searchResults.length > 0)\"\n class=\"sky-autocomplete-action sky-autocomplete-action-more sky-btn sky-btn-link\"\n type=\"button\"\n (mousedown)=\"moreButtonClicked()\"\n >\n <ng-container\n *ngIf=\"\n !(\n searchAsync\n | skyAutocompleteSearchAsyncDisabled: searchAsyncDisabled\n ) &&\n searchResults.length === 0 &&\n !searchText\n \"\n >\n {{ 'skyux_autocomplete_show_all' | skyLibResources }}\n </ng-container>\n <ng-container\n *ngIf=\"\n (searchAsync\n | skyAutocompleteSearchAsyncDisabled: searchAsyncDisabled) &&\n !searchText\n \"\n >\n {{\n 'skyux_autocomplete_show_all_count'\n | skyLibResources: (data.length | skyNumeric: { truncate: false })\n }}\n </ng-container>\n <ng-container *ngIf=\"searchText\">\n {{\n 'skyux_autocomplete_show_matches_count'\n | skyLibResources\n : (searchResultsCount === undefined\n ? data.length\n : (searchResultsCount | skyNumeric: { truncate: false }))\n }}\n </ng-container>\n </button>\n <div\n *ngIf=\"searchText && searchResults.length === 0\"\n class=\"sky-font-deemphasized sky-autocomplete-actions-no-results\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n <button\n *ngIf=\"showAddButton\"\n class=\"sky-autocomplete-action sky-autocomplete-action-add sky-btn sky-btn-link\"\n tabindex=\"0\"\n type=\"button\"\n [class.focused]=\"isElementFocused(addButtonEl)\"\n (mousedown)=\"addButtonClicked()\"\n #addButtonEl\n >\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"add\" iconType=\"skyux\"></sky-icon>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"plus-circle\"></sky-icon>\n {{ 'skyux_autocomplete_add' | skyLibResources }}\n </button>\n </div>\n</ng-template>\n\n<ng-template let-item=\"item\" #defaultSearchResultTemplate>\n {{ item[descriptorProperty] }}\n</ng-template>\n", styles: [".sky-autocomplete-results-container{position:fixed;background-color:#fff}.sky-autocomplete-results-waiting{height:70px}.sky-autocomplete-results{display:flex;flex-direction:column;padding:4px;overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px)}.sky-autocomplete-result{color:#212327;margin-bottom:4px;padding:3px 20px;cursor:pointer}.sky-autocomplete-result:last-child{margin-bottom:0}.sky-autocomplete-actions{border-top:1px solid #cdcfd2}.sky-autocomplete-actions .sky-autocomplete-action{border:none}.sky-autocomplete-actions .sky-autocomplete-actions-no-results{display:inline-block;padding:7px 13px}.sky-autocomplete-action-add{float:right}.sky-autocomplete-action-add sky-icon{padding-right:5px}.sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:#eeeeef}.sky-autocomplete-descendant-focus.sky-autocomplete-action{outline:thin dotted;outline:-webkit-focus-ring-color auto 5px}::ng-deep .sky-theme-modern .sky-autocomplete-results-container{border-radius:6px}::ng-deep .sky-theme-modern .sky-autocomplete-results{padding:10px 0}::ng-deep .sky-theme-modern .sky-autocomplete-result{margin-bottom:0;padding:10px 0 10px 15px}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:inherit}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus{border:none;box-shadow:inset 0 0 0 2px #1870b8,0 1px 8px #0000004d}\n"], components: [{ type: i4.λ14, selector: "sky-wait", inputs: ["ariaLabel", "isWaiting", "isFullPage", "isNonBlocking"] }, { type: i4.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }], directives: [{ type: i5.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.λ11, selector: "[skyHighlight]", inputs: ["skyHighlight"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i5.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }], pipes: { "skyLibResources": i7.SkyLibResourcesPipe, "skyAutocompleteSearchAsyncDisabled": i8.SkyAutcompleteSearchAsyncDisabledPipe, "skyNumeric": i1.SkyNumericPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
658
|
+
SkyAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: SkyAutocompleteComponent, selector: "sky-autocomplete", inputs: { ariaLabelledBy: "ariaLabelledBy", data: "data", debounceTime: "debounceTime", descriptorProperty: "descriptorProperty", enableShowMore: "enableShowMore", messageStream: "messageStream", wrapperClass: "wrapperClass", propertiesToSearch: "propertiesToSearch", search: "search", searchResultTemplate: "searchResultTemplate", searchTextMinimumCharacters: "searchTextMinimumCharacters", searchFilters: "searchFilters", searchResultsLimit: "searchResultsLimit", showAddButton: "showAddButton", noResultsFoundText: "noResultsFoundText", searchAsyncDisabled: "searchAsyncDisabled" }, outputs: { addClick: "addClick", showMoreClick: "showMoreClick", selectionChange: "selectionChange", searchAsync: "searchAsync" }, providers: [SkyAutocompleteAdapterService], queries: [{ propertyName: "inputDirective", first: true, predicate: SkyAutocompleteInputDirective, descendants: true }], viewQueries: [{ propertyName: "defaultSearchResultTemplate", first: true, predicate: ["defaultSearchResultTemplate"], descendants: true, read: TemplateRef, static: true }, { propertyName: "resultsTemplateRef", first: true, predicate: ["resultsTemplateRef"], descendants: true, read: TemplateRef }, { propertyName: "resultsRef", first: true, predicate: ["resultsRef"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n class=\"sky-autocomplete\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen && searchText\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-owns]=\"isOpen ? resultsListId : null\"\n [attr.id]=\"resultsWrapperId\"\n>\n <ng-content></ng-content>\n</div>\n\n<ng-template #resultsTemplateRef>\n <div\n class=\"sky-autocomplete-results-container\"\n [skyThemeClass]=\"{\n 'sky-shadow': 'default',\n 'sky-elevation-4': 'modern'\n }\"\n (keydown)=\"handleKeydown($event)\"\n #resultsRef\n >\n <div\n *ngIf=\"isSearchingAsync; else resultControlsTemplateRef\"\n class=\"sky-autocomplete-results-waiting\"\n >\n <sky-wait [isWaiting]=\"true\"></sky-wait>\n </div>\n </div>\n</ng-template>\n\n<ng-template #resultControlsTemplateRef>\n <div\n *ngIf=\"searchText && (!showActionsArea || searchResults.length > 0)\"\n class=\"sky-autocomplete-results\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.id]=\"resultsListId\"\n >\n <ng-container *ngFor=\"let result of searchResults; let i = index\">\n <div\n *ngIf=\"!searchResultsLimit || i < searchResultsLimit\"\n class=\"sky-autocomplete-result\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isElementFocused(searchResultEl)\"\n [attr.id]=\"result.elementId\"\n [skyHighlight]=\"highlightText\"\n (mousedown)=\"onResultMouseDown(result.elementId, $event)\"\n (mousemove)=\"onResultMouseMove(i)\"\n #searchResultEl\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchResultTemplate;\n context: { item: result.data }\n \"\n >\n </ng-container>\n </div>\n </ng-container>\n <div\n *ngIf=\"searchResults.length === 0\"\n class=\"sky-deemphasized sky-padding-squish-default\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n </div>\n <div *ngIf=\"showActionsArea\" class=\"sky-autocomplete-actions\">\n <button\n *ngIf=\"enableShowMore && (!searchText || searchResults.length > 0)\"\n class=\"sky-autocomplete-action sky-autocomplete-action-more sky-btn sky-btn-link\"\n type=\"button\"\n (mousedown)=\"moreButtonClicked()\"\n >\n <ng-container\n *ngIf=\"\n !(\n searchAsync\n | skyAutocompleteSearchAsyncDisabled: searchAsyncDisabled\n ) &&\n searchResults.length === 0 &&\n !searchText\n \"\n >\n {{ 'skyux_autocomplete_show_all' | skyLibResources }}\n </ng-container>\n <ng-container\n *ngIf=\"\n (searchAsync\n | skyAutocompleteSearchAsyncDisabled: searchAsyncDisabled) &&\n !searchText\n \"\n >\n {{\n 'skyux_autocomplete_show_all_count'\n | skyLibResources: (data.length | skyNumeric: { truncate: false })\n }}\n </ng-container>\n <ng-container *ngIf=\"searchText\">\n {{\n 'skyux_autocomplete_show_matches_count'\n | skyLibResources\n : (searchResultsCount === undefined\n ? data.length\n : (searchResultsCount | skyNumeric: { truncate: false }))\n }}\n </ng-container>\n </button>\n <div\n *ngIf=\"searchText && searchResults.length === 0\"\n class=\"sky-font-deemphasized sky-autocomplete-actions-no-results\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n <button\n *ngIf=\"showAddButton\"\n class=\"sky-autocomplete-action sky-autocomplete-action-add sky-btn sky-btn-link\"\n tabindex=\"0\"\n type=\"button\"\n [class.focused]=\"isElementFocused(addButtonEl)\"\n (mousedown)=\"addButtonClicked()\"\n #addButtonEl\n >\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"add\" iconType=\"skyux\"></sky-icon>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"plus-circle\"></sky-icon>\n {{ 'skyux_autocomplete_add' | skyLibResources }}\n </button>\n </div>\n</ng-template>\n\n<ng-template let-item=\"item\" #defaultSearchResultTemplate>\n {{ item[descriptorProperty] }}\n</ng-template>\n", styles: [".sky-autocomplete-results-container{position:fixed;background-color:#fff}.sky-autocomplete-results-waiting{height:70px}.sky-autocomplete-results{display:flex;flex-direction:column;padding:4px;overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px)}.sky-autocomplete-result{color:#212327;margin-bottom:4px;padding:3px 20px;cursor:pointer}.sky-autocomplete-result:last-child{margin-bottom:0}.sky-autocomplete-actions{border-top:1px solid #cdcfd2}.sky-autocomplete-actions .sky-autocomplete-action{border:none}.sky-autocomplete-actions .sky-autocomplete-actions-no-results{display:inline-block;padding:7px 13px}.sky-autocomplete-action-add{float:right}.sky-autocomplete-action-add sky-icon{padding-right:5px}.sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:#eeeeef}.sky-autocomplete-descendant-focus.sky-autocomplete-action{outline:thin dotted;outline:-webkit-focus-ring-color auto 5px}::ng-deep .sky-theme-modern .sky-autocomplete-results-container{border-radius:6px}::ng-deep .sky-theme-modern .sky-autocomplete-results{padding:10px 0}::ng-deep .sky-theme-modern .sky-autocomplete-result{margin-bottom:0;padding:10px 0 10px 15px}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:inherit}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus{border:none;box-shadow:inset 0 0 0 2px #1870b8,0 1px 8px #0000004d}\n"], components: [{ type: i4.λ14, selector: "sky-wait", inputs: ["ariaLabel", "isWaiting", "isFullPage", "isNonBlocking"] }, { type: i4.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }], directives: [{ type: i5.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.λ11, selector: "[skyHighlight]", inputs: ["skyHighlight"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i5.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }], pipes: { "skyLibResources": i7.SkyLibResourcesPipe, "skyAutocompleteSearchAsyncDisabled": i8.SkyAutcompleteSearchAsyncDisabledPipe, "skyNumeric": i1.SkyNumericPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
663
659
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyAutocompleteComponent, decorators: [{
|
|
664
660
|
type: Component,
|
|
665
661
|
args: [{ selector: 'sky-autocomplete', providers: [SkyAutocompleteAdapterService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n class=\"sky-autocomplete\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen && searchText\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-owns]=\"isOpen ? resultsListId : null\"\n [attr.id]=\"resultsWrapperId\"\n>\n <ng-content></ng-content>\n</div>\n\n<ng-template #resultsTemplateRef>\n <div\n class=\"sky-autocomplete-results-container\"\n [skyThemeClass]=\"{\n 'sky-shadow': 'default',\n 'sky-elevation-4': 'modern'\n }\"\n (keydown)=\"handleKeydown($event)\"\n #resultsRef\n >\n <div\n *ngIf=\"isSearchingAsync; else resultControlsTemplateRef\"\n class=\"sky-autocomplete-results-waiting\"\n >\n <sky-wait [isWaiting]=\"true\"></sky-wait>\n </div>\n </div>\n</ng-template>\n\n<ng-template #resultControlsTemplateRef>\n <div\n *ngIf=\"searchText && (!showActionsArea || searchResults.length > 0)\"\n class=\"sky-autocomplete-results\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.id]=\"resultsListId\"\n >\n <ng-container *ngFor=\"let result of searchResults; let i = index\">\n <div\n *ngIf=\"!searchResultsLimit || i < searchResultsLimit\"\n class=\"sky-autocomplete-result\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isElementFocused(searchResultEl)\"\n [attr.id]=\"result.elementId\"\n [skyHighlight]=\"highlightText\"\n (mousedown)=\"onResultMouseDown(result.elementId, $event)\"\n (mousemove)=\"onResultMouseMove(i)\"\n #searchResultEl\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchResultTemplate;\n context: { item: result.data }\n \"\n >\n </ng-container>\n </div>\n </ng-container>\n <div\n *ngIf=\"searchResults.length === 0\"\n class=\"sky-deemphasized sky-padding-squish-default\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n </div>\n <div *ngIf=\"showActionsArea\" class=\"sky-autocomplete-actions\">\n <button\n *ngIf=\"enableShowMore && (!searchText || searchResults.length > 0)\"\n class=\"sky-autocomplete-action sky-autocomplete-action-more sky-btn sky-btn-link\"\n type=\"button\"\n (mousedown)=\"moreButtonClicked()\"\n >\n <ng-container\n *ngIf=\"\n !(\n searchAsync\n | skyAutocompleteSearchAsyncDisabled: searchAsyncDisabled\n ) &&\n searchResults.length === 0 &&\n !searchText\n \"\n >\n {{ 'skyux_autocomplete_show_all' | skyLibResources }}\n </ng-container>\n <ng-container\n *ngIf=\"\n (searchAsync\n | skyAutocompleteSearchAsyncDisabled: searchAsyncDisabled) &&\n !searchText\n \"\n >\n {{\n 'skyux_autocomplete_show_all_count'\n | skyLibResources: (data.length | skyNumeric: { truncate: false })\n }}\n </ng-container>\n <ng-container *ngIf=\"searchText\">\n {{\n 'skyux_autocomplete_show_matches_count'\n | skyLibResources\n : (searchResultsCount === undefined\n ? data.length\n : (searchResultsCount | skyNumeric: { truncate: false }))\n }}\n </ng-container>\n </button>\n <div\n *ngIf=\"searchText && searchResults.length === 0\"\n class=\"sky-font-deemphasized sky-autocomplete-actions-no-results\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n <button\n *ngIf=\"showAddButton\"\n class=\"sky-autocomplete-action sky-autocomplete-action-add sky-btn sky-btn-link\"\n tabindex=\"0\"\n type=\"button\"\n [class.focused]=\"isElementFocused(addButtonEl)\"\n (mousedown)=\"addButtonClicked()\"\n #addButtonEl\n >\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"add\" iconType=\"skyux\"></sky-icon>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"plus-circle\"></sky-icon>\n {{ 'skyux_autocomplete_add' | skyLibResources }}\n </button>\n </div>\n</ng-template>\n\n<ng-template let-item=\"item\" #defaultSearchResultTemplate>\n {{ item[descriptorProperty] }}\n</ng-template>\n", styles: [".sky-autocomplete-results-container{position:fixed;background-color:#fff}.sky-autocomplete-results-waiting{height:70px}.sky-autocomplete-results{display:flex;flex-direction:column;padding:4px;overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px)}.sky-autocomplete-result{color:#212327;margin-bottom:4px;padding:3px 20px;cursor:pointer}.sky-autocomplete-result:last-child{margin-bottom:0}.sky-autocomplete-actions{border-top:1px solid #cdcfd2}.sky-autocomplete-actions .sky-autocomplete-action{border:none}.sky-autocomplete-actions .sky-autocomplete-actions-no-results{display:inline-block;padding:7px 13px}.sky-autocomplete-action-add{float:right}.sky-autocomplete-action-add sky-icon{padding-right:5px}.sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:#eeeeef}.sky-autocomplete-descendant-focus.sky-autocomplete-action{outline:thin dotted;outline:-webkit-focus-ring-color auto 5px}::ng-deep .sky-theme-modern .sky-autocomplete-results-container{border-radius:6px}::ng-deep .sky-theme-modern .sky-autocomplete-results{padding:10px 0}::ng-deep .sky-theme-modern .sky-autocomplete-result{margin-bottom:0;padding:10px 0 10px 15px}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:inherit}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus{border:none;box-shadow:inset 0 0 0 2px #1870b8,0 1px 8px #0000004d}\n"] }]
|
|
@@ -709,7 +705,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
|
|
|
709
705
|
type: ViewChild,
|
|
710
706
|
args: ['defaultSearchResultTemplate', {
|
|
711
707
|
read: TemplateRef,
|
|
712
|
-
static:
|
|
708
|
+
static: true,
|
|
713
709
|
}]
|
|
714
710
|
}], inputDirective: [{
|
|
715
711
|
type: ContentChild,
|
|
@@ -725,4 +721,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
|
|
|
725
721
|
read: ElementRef,
|
|
726
722
|
}]
|
|
727
723
|
}] } });
|
|
728
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9sb29rdXAvc3JjL2xpYi9tb2R1bGVzL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xvb2t1cC9zcmMvbGliL21vZHVsZXMvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGVBQWUsRUFHZixpQkFBaUIsR0FDbEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXRELE9BQU8sRUFFTCxPQUFPLEVBRVAsSUFBSSxFQUNKLFNBQVMsSUFBSSxtQkFBbUIsRUFDaEMsRUFBRSxHQUNILE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUV4RSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM5RixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUvRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7OztBQWdCL0UsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBU2pCLE1BQU0sT0FBTyx3QkFBd0I7SUF5WG5DLFlBQ1UsY0FBaUMsRUFDakMsVUFBc0IsRUFDdEIsWUFBNkIsRUFDN0IsY0FBNkMsRUFDN0MsY0FBaUMsRUFDckIsZUFBd0M7UUFMcEQsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBQ2pDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQWlCO1FBQzdCLG1CQUFjLEdBQWQsY0FBYyxDQUErQjtRQUM3QyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDckIsb0JBQWUsR0FBZixlQUFlLENBQXlCO1FBeFU5RDs7O1dBR0c7UUFFSSxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQW9IOUI7OztXQUdHO1FBRUksa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFTN0I7Ozs7V0FJRztRQUVJLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUVuQzs7O1dBR0c7UUFFSSxhQUFRLEdBQXVCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFekQ7OztXQUdHO1FBRUksa0JBQWEsR0FBOEMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVVyRjs7O1dBR0c7UUFFSSxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFrQyxDQUFDO1FBY2pFLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFZZixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUF1RmhDOztXQUVHO1FBQ0ssdUJBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFJeEIsOEJBQXlCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUloRCxrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFJNUM7Ozs7V0FJRztRQUNLLDZCQUF3QixHQUFrQixFQUFFLENBQUM7UUFpQjdDLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFrQyxDQUFDO1FBVTVFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcseUJBQXlCLEVBQUUsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyw0QkFBNEIsRUFBRSxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQXZYRDs7OztPQUlHO0lBQ0gsSUFDVyxJQUFJLENBQUMsS0FBWTtRQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQ1csWUFBWSxDQUFDLEtBQWE7UUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFDVyxrQkFBa0IsQ0FBQyxLQUFhO1FBQ3pDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQVcsa0JBQWtCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixJQUFJLE1BQU0sQ0FBQztJQUM1QyxDQUFDO0lBU0Q7OztPQUdHO0lBQ0gsSUFDVyxhQUFhLENBQUMsS0FBc0M7UUFDN0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQVFEOzs7T0FHRztJQUNILElBQ1csa0JBQWtCLENBQUMsS0FBZTtRQUMzQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLGtCQUFrQjtRQUMzQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsSUFDVyxNQUFNLENBQUMsS0FBb0M7UUFDcEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNmLE9BQU8sQ0FDTCxJQUFJLENBQUMsT0FBTztZQUNaLG9DQUFvQyxDQUFDO2dCQUNuQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO2dCQUMzQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7YUFDbEMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQ1csb0JBQW9CLENBQUMsS0FBMkI7UUFDekQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBVyxvQkFBb0I7UUFDN0IsT0FBTyxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLDJCQUEyQixDQUFDO0lBQ3hFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQ1csMkJBQTJCLENBQUMsS0FBYTtRQUNsRCxJQUFJLENBQUMsNEJBQTRCLEdBQUcsS0FBSyxDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFXLDJCQUEyQjtRQUNwQyxPQUFPLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxDQUFDO1lBQzFDLENBQUMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCO1lBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBWUQ7OztPQUdHO0lBQ0gsSUFDVyxrQkFBa0IsQ0FBQyxLQUFhO1FBQ3pDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQVcsa0JBQWtCO1FBQzNCLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzVCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO1NBQ2pDO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1NBQzNEO0lBQ0gsQ0FBQztJQXNDRDs7T0FFRztJQUNILElBQ1csZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0lBU0QsWUFBWTtJQUVaLDZCQUE2QjtJQUU3QixJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQVVELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUNuRCxDQUFDO0lBY0QsSUFDWSxjQUFjLENBQUMsU0FBd0M7UUFDakUsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRTtZQUN0QyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNkLE1BQU0sS0FBSyxDQUNUO29CQUNFLCtEQUErRDtvQkFDL0QsaUVBQWlFO29CQUNqRSx3Q0FBd0M7aUJBQ3pDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUNaLENBQUM7YUFDSDtZQUVELHFFQUFxRTtZQUNyRSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFdEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7WUFFakMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBRTNELElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVztpQkFDN0IsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsRUFDekMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDL0IsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7Z0JBQzdCLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxDQUNIO2lCQUNBLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUNwQixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxDQUFDO1lBRUwsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJO2lCQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO2lCQUMvQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxjQUFjLENBQUMsb0NBQW9DLEVBQUUsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxDQUFDO1lBRUwsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLO2lCQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO2lCQUMvQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDeEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2lCQUNyQjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDSCxDQUFDO0lBRUQsSUFBWSxjQUFjO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBT0QsSUFHWSxVQUFVLENBQUMsS0FBaUI7UUFDdEMsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN6QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3RCO0lBQ0gsQ0FBQztJQUVELElBQVksVUFBVTtRQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQXNETSxrQkFBa0I7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDeEIsTUFBTSxLQUFLLENBQ1Q7Z0JBQ0UsK0RBQStEO2dCQUMvRCxpRUFBaUU7Z0JBQ2pFLHdDQUF3QzthQUN6QyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FDWixDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRU0sZUFBZTtRQUNwQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLG9DQUFvQyxFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTSxhQUFhLENBQUMsS0FBb0I7UUFDdkMsa0JBQWtCO1FBQ2xCLDBCQUEwQjtRQUMxQixJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDYixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzlDLE1BQU0sZUFBZSxHQUFHLGFBQWEsRUFBRSxFQUFFLENBQUM7WUFDMUMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDbEQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssZUFBZSxDQUN2QyxDQUFDO1lBRUYsUUFBUSxHQUFHLEVBQUU7Z0JBQ1gsS0FBSyxPQUFPO29CQUNWLElBQUksb0JBQW9CLEVBQUU7d0JBQ3hCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsQ0FBQzt3QkFFN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7NEJBQ3pCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzt5QkFDdEI7NkJBQU07NEJBQ0wsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO3lCQUNwQjtxQkFDRjt5QkFBTTt3QkFDTCxJQUFJLGFBQWEsRUFBRTs0QkFDakIsYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO3lCQUMxRDtxQkFDRjtvQkFFRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDeEIsTUFBTTtnQkFFUixLQUFLLEtBQUs7b0JBQ1IsSUFBSSxvQkFBb0IsRUFBRTt3QkFDeEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDO3FCQUM5Qzt5QkFBTTt3QkFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLG9DQUFvQyxFQUFFLENBQUM7cUJBQzVEO29CQUVELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDckIsTUFBTTtnQkFFUixLQUFLLFFBQVE7b0JBQ1gsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNyQixNQUFNO2dCQUVSLEtBQUssV0FBVyxDQUFDO2dCQUNqQixLQUFLLE1BQU07b0JBQ1QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQzFCLElBQ0UsSUFBSSxDQUFDLGtCQUFrQjt3QkFDckIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sR0FBRyxDQUFDO3dCQUMxQyxJQUFJLENBQUMsa0JBQWtCLEtBQUssQ0FBQyxDQUFDLEVBQzlCO3dCQUNBLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7cUJBQzdCO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO3FCQUN2RDtvQkFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ25DLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN4QixNQUFNO2dCQUVSLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssSUFBSTtvQkFDUCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDMUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxFQUFFO3dCQUNoQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7cUJBQ3BFO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO3FCQUN2RDtvQkFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ25DLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN4QixNQUFNO2FBQ1Q7U0FDRjtJQUNILENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQ0FBb0MsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU0saUJBQWlCLENBQUMsRUFBVSxFQUFFLEtBQWlCO1FBQ3BELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVoQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7YUFBTTtZQUNMLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQjtRQUVELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVNLGlCQUFpQixDQUFDLEVBQVU7UUFDakMsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ2xDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDcEM7SUFDSCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsR0FBZ0I7UUFDdEMsT0FBTyxHQUFHLEtBQUssSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxVQUFrQjtRQUMxQyxNQUFNLE9BQU8sR0FDWCxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWpFLElBQUksT0FBTyxFQUFFO1lBQ1gsa0RBQWtEO1lBQ2xELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7b0JBQ3hCLFlBQVksRUFBRSxTQUFTO2lCQUN4QixDQUFDLENBQUM7YUFDSjtZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUN6QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDdEI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3BCO1lBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUM5QixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRW5DLE9BQU87U0FDUjtRQUVELE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLDJCQUEyQixDQUFDO1FBQzNFLE1BQU0sV0FBVyxHQUFHLFVBQVUsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRW5ELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXBDLElBQUksWUFBWSxJQUFJLFdBQVcsRUFBRTtZQUMvQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUUzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRTtpQkFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDYixTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDcEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFXLEVBQUUsRUFBRTtvQkFDaEQsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQztnQkFDakQsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztnQkFFOUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN2QyxNQUFNLE1BQU0sR0FBZ0M7d0JBQzFDLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLFNBQVMsQ0FBQyxFQUFFO3dCQUM1QyxJQUFJLEVBQUUsQ0FBQztxQkFDUixDQUFDO29CQUNGLE9BQU8sTUFBTSxDQUFDO2dCQUNoQixDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztnQkFFNUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQzlCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNqQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO2lCQUM3QjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQzlCO2dCQUVELElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBRW5DLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDZixzRUFBc0U7b0JBQ3RFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7d0JBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDcEMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7b0JBQ3RDLENBQUMsQ0FBQyxDQUFDO2lCQUNKO3FCQUFNO29CQUNMLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztpQkFDcEM7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDTCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBQzlCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDcEM7SUFDSCxDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdEUsTUFBTSxlQUFlLEdBQW1DO2dCQUN0RCxXQUFXLEVBQUUsU0FBUztnQkFDdEIsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2FBQzVCLENBQUM7WUFFRixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUV2QyxPQUFPLGVBQWUsQ0FBQyxNQUFNLENBQUM7U0FDL0I7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZELElBQUksTUFBTSxZQUFZLEtBQUssRUFBRTtZQUMzQixPQUFPLEVBQUUsQ0FBQztnQkFDUixLQUFLLEVBQUUsTUFBTTtnQkFDYixVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU07YUFDMUIsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ3RCLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1osT0FBTztnQkFDTCxLQUFLO2dCQUNMLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTTthQUN6QixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FBQyxVQUFrQjtRQUN6QyxNQUFNLG9CQUFvQixHQUFHLG1CQUFtQixDQUFDLFVBQVUsQ0FBQzthQUN6RCxpQkFBaUIsRUFBRTthQUNuQixJQUFJLEVBQUUsQ0FBQztRQUNWLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUN6QixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBRUQsSUFBSSxrQkFBa0IsR0FBYSxFQUFFLENBQUM7UUFDdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO2lCQUMvRCxRQUFRLEVBQUU7aUJBQ1YsaUJBQWlCLEVBQVksQ0FBQztZQUNqQyxNQUFNLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXZELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNmLElBQUksS0FBYSxDQUFDO1lBQ2xCLE9BQ0UsQ0FBQyxLQUFLLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQ3hFO2dCQUNBLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3BFLE1BQU0sR0FBRyxLQUFLLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztnQkFDbkMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQy9EO1NBQ0Y7UUFFRCx3Q0FBd0M7UUFDeEMsT0FBTyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxFQUFVO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2RSxrQkFBa0I7UUFDbEIsMEJBQTBCO1FBQzFCLElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO2dCQUN4QixZQUFZLEVBQUUsTUFBTTthQUNyQixDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO2dCQUN6QyxXQUFXLEVBQUUsS0FBSztnQkFDbEIsbUJBQW1CLEVBQUUsSUFBSTtnQkFDekIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO2FBQ2hDLENBQUMsQ0FBQztZQUVILE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFFaEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztTQUNyQztJQUNILENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLE1BQU0sYUFBYSxHQUNqQixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDekQsa0JBQWtCO1FBQ2xCLDBCQUEwQjtRQUMxQixJQUFJLGFBQWEsRUFBRTtZQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMzRDtJQUNILENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU8sV0FBVztRQUNqQixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUNwQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFFOUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQzthQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUNuQyxTQUFTLENBQUMsQ0FBQyxLQUFvQixFQUFFLEVBQUU7WUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztRQUVMLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7YUFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDbkMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLDBCQUEwQjtZQUMxQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FDbEMsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsVUFBVSxFQUNmLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUN2QixDQUFDO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRU8sYUFBYTtRQUNuQixrQkFBa0I7UUFDbEIsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUVqRSxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUNsQyxJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxVQUFVLEVBQ2YsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQ3ZCLENBQUM7WUFFRixPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFO2dCQUM3QyxjQUFjLEVBQUUsc0JBQXNCLENBQUMsUUFBUTtnQkFDL0MsYUFBYSxFQUFFLElBQUk7Z0JBQ25CLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFNBQVMsRUFBRSxPQUFPO2dCQUNsQixtQkFBbUIsRUFBRSxNQUFNO2FBQzVCLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVPLGNBQWM7UUFDcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLHdCQUF3QjtRQUN4QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDckM7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxhQUFhO2lCQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDbkMsU0FBUyxDQUFDLENBQUMsT0FBK0IsRUFBRSxFQUFFO2dCQUM3QyxRQUFRLE9BQU8sQ0FBQyxJQUFJLEVBQUU7b0JBQ3BCLEtBQUssMEJBQTBCLENBQUMsYUFBYTt3QkFDM0MsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUNyQixNQUFNO29CQUNSLEtBQUssMEJBQTBCLENBQUMsa0JBQWtCO3dCQUNoRCxtRUFBbUU7d0JBQ25FLFVBQVUsQ0FBQyxHQUFHLEVBQUU7NEJBQ2QsMEJBQTBCOzRCQUMxQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0NBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7NkJBQ3hCO3dCQUNILENBQUMsQ0FBQyxDQUFDO3dCQUNILE1BQU07aUJBQ1Q7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0gsQ0FBQztJQUVPLDRCQUE0QjtRQUNsQyx3Q0FBd0M7UUFDeEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDaEIsSUFBSSxDQUFDLHdCQUF3QjtvQkFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2hFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtvQkFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUN4QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUNoQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQ3RELG1DQUFtQyxDQUNwQyxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FDN0IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUN0RCxtQ0FBbUMsQ0FDcEMsQ0FBQztZQUNGLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQzs7cUhBMTJCVSx3QkFBd0I7eUdBQXhCLHdCQUF3Qix3dkJBSHhCLENBQUMsNkJBQTZCLENBQUMsc0VBMFE1Qiw2QkFBNkIsdUtBTG5DLFdBQVcsbUhBNkRYLFdBQVcsbUdBS1gsVUFBVSw2QkN0WXBCLCswSUE2SUE7MkZEM0VhLHdCQUF3QjtrQkFQcEMsU0FBUzsrQkFDRSxrQkFBa0IsYUFHakIsQ0FBQyw2QkFBNkIsQ0FBQyxtQkFDekIsdUJBQXVCLENBQUMsTUFBTTs7MEJBaVk1QyxRQUFROzRDQXBYSixjQUFjO3NCQURwQixLQUFLO2dCQVNLLElBQUk7c0JBRGQsS0FBSztnQkFlSyxZQUFZO3NCQUR0QixLQUFLO2dCQWVLLGtCQUFrQjtzQkFENUIsS0FBSztnQkFjQyxjQUFjO3NCQURwQixLQUFLO2dCQVFLLGFBQWE7c0JBRHZCLEtBQUs7Z0JBY0MsWUFBWTtzQkFEbEIsS0FBSztnQkFRSyxrQkFBa0I7c0JBRDVCLEtBQUs7Z0JBa0JLLE1BQU07c0JBRGhCLEtBQUs7Z0JBcUJLLG9CQUFvQjtzQkFEOUIsS0FBSztnQkFnQkssMkJBQTJCO3NCQURyQyxLQUFLO2dCQW1CQyxhQUFhO3NCQURuQixLQUFLO2dCQVFLLGtCQUFrQjtzQkFENUIsS0FBSztnQkFrQkMsYUFBYTtzQkFEbkIsS0FBSztnQkFRQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBU0MsbUJBQW1CO3NCQUR6QixLQUFLO2dCQVFDLFFBQVE7c0JBRGQsTUFBTTtnQkFRQSxhQUFhO3NCQURuQixNQUFNO2dCQU9JLGVBQWU7c0JBRHpCLE1BQU07Z0JBVUEsV0FBVztzQkFEakIsTUFBTTtnQkFxQ0MsMkJBQTJCO3NCQUpsQyxTQUFTO3VCQUFDLDZCQUE2QixFQUFFO3dCQUN4QyxJQUFJLEVBQUUsV0FBVzt3QkFDakIsTUFBTSxFQUFFLEtBQUs7cUJBQ2Q7Z0JBSVcsY0FBYztzQkFEekIsWUFBWTt1QkFBQyw2QkFBNkI7Z0JBMERuQyxrQkFBa0I7c0JBSHpCLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUU7d0JBQy9CLElBQUksRUFBRSxXQUFXO3FCQUNsQjtnQkFNVyxVQUFVO3NCQUhyQixTQUFTO3VCQUFDLFlBQVksRUFBRTt3QkFDdkIsSUFBSSxFQUFFLFVBQVU7cUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFNreUFmZml4QXV0b0ZpdENvbnRleHQsXG4gIFNreUFmZml4U2VydmljZSxcbiAgU2t5QWZmaXhlcixcbiAgU2t5T3ZlcmxheUluc3RhbmNlLFxuICBTa3lPdmVybGF5U2VydmljZSxcbn0gZnJvbSAnQHNreXV4L2NvcmUnO1xuaW1wb3J0IHsgU2t5SW5wdXRCb3hIb3N0U2VydmljZSB9IGZyb20gJ0Bza3l1eC9mb3Jtcyc7XG5cbmltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIFN1YnNjcmlwdGlvbixcbiAgZnJvbSxcbiAgZnJvbUV2ZW50IGFzIG9ic2VydmFibGVGcm9tRXZlbnQsXG4gIG9mLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgbWFwLCBzd2l0Y2hNYXAsIHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgbm9ybWFsaXplRGlhY3JpdGljcyB9IGZyb20gJy4uL3NoYXJlZC9za3ktbG9va3VwLXN0cmluZy11dGlscyc7XG5cbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZUFkYXB0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9hdXRvY29tcGxldGUtYWRhcHRlci5zZXJ2aWNlJztcbmltcG9ydCB7IHNreUF1dG9jb21wbGV0ZURlZmF1bHRTZWFyY2hGdW5jdGlvbiB9IGZyb20gJy4vYXV0b2NvbXBsZXRlLWRlZmF1bHQtc2VhcmNoLWZ1bmN0aW9uJztcbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlIH0gZnJvbSAnLi9hdXRvY29tcGxldGUtaW5wdXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZU1lc3NhZ2UgfSBmcm9tICcuL3R5cGVzL2F1dG9jb21wbGV0ZS1tZXNzYWdlJztcbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZU1lc3NhZ2VUeXBlIH0gZnJvbSAnLi90eXBlcy9hdXRvY29tcGxldGUtbWVzc2FnZS10eXBlJztcbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZVNlYXJjaEFzeW5jQXJncyB9IGZyb20gJy4vdHlwZXMvYXV0b2NvbXBsZXRlLXNlYXJjaC1hc3luYy1hcmdzJztcbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZVNlYXJjaEFzeW5jUmVzdWx0IH0gZnJvbSAnLi90eXBlcy9hdXRvY29tcGxldGUtc2VhcmNoLWFzeW5jLXJlc3VsdCc7XG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVTZWFyY2hGdW5jdGlvbiB9IGZyb20gJy4vdHlwZXMvYXV0b2NvbXBsZXRlLXNlYXJjaC1mdW5jdGlvbic7XG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVTZWFyY2hGdW5jdGlvbkZpbHRlciB9IGZyb20gJy4vdHlwZXMvYXV0b2NvbXBsZXRlLXNlYXJjaC1mdW5jdGlvbi1maWx0ZXInO1xuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlU2VsZWN0aW9uQ2hhbmdlIH0gZnJvbSAnLi90eXBlcy9hdXRvY29tcGxldGUtc2VsZWN0aW9uLWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVTaG93TW9yZUFyZ3MgfSBmcm9tICcuL3R5cGVzL2F1dG9jb21wbGV0ZS1zaG93LW1vcmUtYXJncyc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmludGVyZmFjZSBTa3lBdXRvY29tcGxldGVTZWFyY2hSZXN1bHQge1xuICBlbGVtZW50SWQ6IHN0cmluZztcbiAgZGF0YTogYW55O1xufVxuXG5sZXQgdW5pcXVlSWQgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktYXV0b2NvbXBsZXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtTa3lBdXRvY29tcGxldGVBZGFwdGVyU2VydmljZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lBdXRvY29tcGxldGVDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXRcbntcbiAgLy8jcmVnaW9uIHB1YmxpY19hcGlcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBIVE1MIGVsZW1lbnQgSUQgKHdpdGhvdXQgdGhlIGxlYWRpbmcgYCNgKSBvZiB0aGUgZWxlbWVudCB0aGF0IGxhYmVsc1xuICAgKiB0aGUgYXV0b2NvbXBsZXRlIHRleHQgaW5wdXQuIFRoaXMgc2V0cyB0aGUgaW5wdXQncyBgYXJpYS1sYWJlbGxlZGJ5YCBhdHRyaWJ1dGVcbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcmlhTGFiZWxsZWRCeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBzdGF0aWMgZGF0YSBzb3VyY2UgZm9yIHRoZSBhdXRvY29tcGxldGUgY29tcG9uZW50IHRvIHNlYXJjaFxuICAgKiB3aGVuIHVzZXJzIGVudGVyIHRleHQuIEZvciBhIGR5bmFtaWMgZGF0YSBzb3VyY2Ugc3VjaCBhcyBhbiBhcnJheSB0aGF0XG4gICAqIGNoYW5nZXMgZHVlIHRvIHNlcnZlciBjYWxscywgdXNlIGBzZWFyY2hgIG9yIGBzZWFyY2hBc3luY2AgaW5zdGVhZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGF0YSh2YWx1ZTogYW55W10pIHtcbiAgICB0aGlzLl9kYXRhID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGEoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgbWFueSBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgc2VhcmNoaW5nIHdoaWxlIHVzZXJzXG4gICAqIGVudGVyIHRleHQgaW4gdGhlIGF1dG9jb21wbGV0ZSBmaWVsZC5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkZWJvdW5jZVRpbWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2RlYm91bmNlVGltZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBkZWJvdW5jZVRpbWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGVib3VuY2VUaW1lIHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFuIG9iamVjdCBwcm9wZXJ0eSB0byBkaXNwbGF5IGluIHRoZSB0ZXh0IGlucHV0IGFmdGVyIHVzZXJzXG4gICAqIHNlbGVjdCBhbiBpdGVtIGluIHRoZSBkcm9wZG93biBsaXN0LlxuICAgKiBAZGVmYXVsdCBcIm5hbWVcIlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkZXNjcmlwdG9yUHJvcGVydHkodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Rlc2NyaXB0b3JQcm9wZXJ0eSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBkZXNjcmlwdG9yUHJvcGVydHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGVzY3JpcHRvclByb3BlcnR5IHx8ICduYW1lJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gZGlzcGxheSBhIGJ1dHRvbiBpbiB0aGUgZHJvcGRvd24gdGhhdCBvcGVucyBhIHBpY2tlciB3aGVyZSB1c2VycyBjYW4gdmlldyBhbGwgb3B0aW9ucy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlbmFibGVTaG93TW9yZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYW4gb2JzZXJ2YWJsZSBvZiBgU2t5QXV0b2NvbXBsZXRlTWVzc2FnZWAgdGhhdCBjYW4gY2xvc2UgdGhlIGRyb3Bkb3duLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbWVzc2FnZVN0cmVhbSh2YWx1ZTogU3ViamVjdDxTa3lBdXRvY29tcGxldGVNZXNzYWdlPikge1xuICAgIHRoaXMuX21lc3NhZ2VTdHJlYW0gPSB2YWx1ZTtcbiAgICB0aGlzLmluaXRNZXNzYWdlU3RyZWFtKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1lc3NhZ2VTdHJlYW0oKTogU3ViamVjdDxTa3lBdXRvY29tcGxldGVNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VTdHJlYW07XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgd3JhcHBlckNsYXNzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIG9iamVjdCBwcm9wZXJ0aWVzIHRvIHNlYXJjaC5cbiAgICogQGRlZmF1bHQgW1wibmFtZVwiXVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBwcm9wZXJ0aWVzVG9TZWFyY2godmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcHJvcGVydGllc1RvU2VhcmNoID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHByb3BlcnRpZXNUb1NlYXJjaCgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3BlcnRpZXNUb1NlYXJjaCB8fCBbJ25hbWUnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBmdW5jdGlvbiB0byBkeW5hbWljYWxseSBtYW5hZ2UgdGhlIGRhdGEgc291cmNlIHdoZW4gdXNlcnNcbiAgICogY2hhbmdlIHRoZSB0ZXh0IGluIHRoZSBhdXRvY29tcGxldGUgZmllbGQuIFRoZSBzZWFyY2ggZnVuY3Rpb24gbXVzdCByZXR1cm5cbiAgICogYW4gYXJyYXkgb3IgYSBwcm9taXNlIG9mIGFuIGFycmF5LiBUaGUgYHNlYXJjaGAgcHJvcGVydHkgaXMgcGFydGljdWxhcmx5XG4gICAqIHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHNvdXJjZSBkb2VzIG5vdCBsaXZlIGluIHRoZSBzb3VyY2UgY29kZS4gSWYgdGhlXG4gICAqIHNlYXJjaCByZXF1aXJlcyBjYWxsaW5nIGEgcmVtb3RlIGRhdGEgc291cmNlLCB1c2UgYHNlYXJjaEFzeW5jYCBpbnN0ZWFkIG9mXG4gICAqIGBzZWFyY2hgLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWFyY2godmFsdWU6IFNreUF1dG9jb21wbGV0ZVNlYXJjaEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5fc2VhcmNoID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlYXJjaCgpOiBTa3lBdXRvY29tcGxldGVTZWFyY2hGdW5jdGlvbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX3NlYXJjaCB8fFxuICAgICAgc2t5QXV0b2NvbXBsZXRlRGVmYXVsdFNlYXJjaEZ1bmN0aW9uKHtcbiAgICAgICAgcHJvcGVydGllc1RvU2VhcmNoOiB0aGlzLnByb3BlcnRpZXNUb1NlYXJjaCxcbiAgICAgICAgc2VhcmNoRmlsdGVyczogdGhpcy5zZWFyY2hGaWx0ZXJzLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIHRlbXBsYXRlIHRvIGZvcm1hdCBlYWNoIHNlYXJjaCByZXN1bHQgaW4gdGhlIGRyb3Bkb3duIGxpc3QuXG4gICAqIFRoZSBhdXRvY29tcGxldGUgY29tcG9uZW50IGluamVjdHMgc2VhcmNoIHJlc3VsdCB2YWx1ZXMgaW50byB0aGUgdGVtcGxhdGVcbiAgICogYXMgYGl0ZW1gIHZhcmlhYmxlcyB0aGF0IHJlZmVyZW5jZSBhbGwgb2YgdGhlIG9iamVjdCBwcm9wZXJ0aWVzIG9mIHRoZSBzZWFyY2ggcmVzdWx0cy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VhcmNoUmVzdWx0VGVtcGxhdGUodmFsdWU6IFRlbXBsYXRlUmVmPHVua25vd24+KSB7XG4gICAgdGhpcy5fc2VhcmNoUmVzdWx0VGVtcGxhdGUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VhcmNoUmVzdWx0VGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hSZXN1bHRUZW1wbGF0ZSB8fCB0aGlzLmRlZmF1bHRTZWFyY2hSZXN1bHRUZW1wbGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB1c2VycyBtdXN0IGVudGVyIGJlZm9yZVxuICAgKiB0aGUgYXV0b2NvbXBsZXRlIGNvbXBvbmVudCBzZWFyY2hlcyB0aGUgZGF0YSBzb3VyY2UgYW5kIGRpc3BsYXlzIHNlYXJjaFxuICAgKiByZXN1bHRzIGluIHRoZSBkcm9wZG93biBsaXN0LlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNlYXJjaFRleHRNaW5pbXVtQ2hhcmFjdGVycyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc2VhcmNoVGV4dE1pbmltdW1DaGFyYWN0ZXJzID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlYXJjaFRleHRNaW5pbXVtQ2hhcmFjdGVycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hUZXh0TWluaW11bUNoYXJhY3RlcnMgPiAwXG4gICAgICA/IHRoaXMuX3NlYXJjaFRleHRNaW5pbXVtQ2hhcmFjdGVyc1xuICAgICAgOiAxO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhbiBhcnJheSBvZiBmdW5jdGlvbnMgdG8gY2FsbCBhZ2FpbnN0IGVhY2ggc2VhcmNoIHJlc3VsdCBpbiBvcmRlclxuICAgKiB0byBmaWx0ZXIgdGhlIHNlYXJjaCByZXN1bHRzIHdoZW4gdXNpbmcgdGhlIGRlZmF1bHQgc2VhcmNoIGZ1bmN0aW9uLiBXaGVuXG4gICAqIHVzaW5nIHRoZSBgc2VhcmNoYCBwcm9wZXJ0eSB0byBzcGVjaWZ5IGEgY3VzdG9tIHNlYXJjaCBmdW5jdGlvbiwgeW91IG11c3RcbiAgICogbWFudWFsbHkgYXBwbHkgZmlsdGVycyBpbnNpZGUgdGhhdCBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGB0cnVlYFxuICAgKiBvciBgZmFsc2VgIGZvciBlYWNoIHJlc3VsdCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIGRpc3BsYXkgaXQgaW4gdGhlIGRyb3Bkb3duIGxpc3QuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2VhcmNoRmlsdGVyczogU2t5QXV0b2NvbXBsZXRlU2VhcmNoRnVuY3Rpb25GaWx0ZXJbXTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWFyY2ggcmVzdWx0cyB0byBkaXNwbGF5IGluIHRoZSBkcm9wZG93biBsaXN0LlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgY29tcG9uZW50IGRpc3BsYXlzIGFsbCBtYXRjaGluZyByZXN1bHRzLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWFyY2hSZXN1bHRzTGltaXQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3NlYXJjaFJlc3VsdHNMaW1pdCA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWFyY2hSZXN1bHRzTGltaXQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fc2VhcmNoUmVzdWx0c0xpbWl0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2VhcmNoUmVzdWx0c0xpbWl0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmFibGVTaG93TW9yZSA/IDUgOiB0aGlzLl9zZWFyY2hSZXN1bHRzTGltaXQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBkaXNwbGF5IGEgYnV0dG9uIHRoYXQgbGV0cyB1c2VycyBhZGQgb3B0aW9ucyB0byB0aGUgZGF0YSBzb3VyY2UuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd0FkZEJ1dHRvbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHRleHQgdG8gZGlzcGxheSB3aGVuIG5vIHNlYXJjaCByZXN1bHRzIGFyZSBmb3VuZC5cbiAgICogQGRlZmF1bHQgXCJObyBtYXRjaGVzIGZvdW5kXCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBub1Jlc3VsdHNGb3VuZFRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEFsbG93cyBhc3luYyBzZWFyY2ggdG8gYmUgZGlzYWJsZWQgZXZlbiB3aGVuIGEgbGlzdGVuZXIgaXMgc3BlY2lmaWVkIGZvclxuICAgKiB0aGUgYHNlYXJjaEFzeW5jYCBvdXRwdXQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2VhcmNoQXN5bmNEaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogRmlyZXMgd2hlbiB1c2VycyBzZWxlY3QgdGhlIGJ1dHRvbiB0byBhZGQgb3B0aW9ucyB0byB0aGUgZGF0YSBzb3VyY2UuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGFkZENsaWNrOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIHNlbGVjdCB0aGUgYnV0dG9uIHRvIHZpZXcgYWxsIG9wdGlvbnMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHNob3dNb3JlQ2xpY2s6IEV2ZW50RW1pdHRlcjxTa3lBdXRvY29tcGxldGVTaG93TW9yZUFyZ3M+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIHNlbGVjdCBpdGVtcyBpbiB0aGUgZHJvcGRvd24gbGlzdC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbkNoYW5nZSgpOiBFdmVudEVtaXR0ZXI8U2t5QXV0b2NvbXBsZXRlU2VsZWN0aW9uQ2hhbmdlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbkNoYW5nZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIGVudGVyIG5ldyBzZWFyY2ggaW5mb3JtYXRpb24gYW5kIGFsbG93cyByZXN1bHRzIHRvIGJlXG4gICAqIHJldHVybmVkIHZpYSBhbiBvYnNlcnZhYmxlLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWFyY2hBc3luYyA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5QXV0b2NvbXBsZXRlU2VhcmNoQXN5bmNBcmdzPigpO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiB0ZW1wbGF0ZV9wcm9wZXJ0aWVzXG5cbiAgcHVibGljIGdldCBzZWFyY2hSZXN1bHRzKCk6IFNreUF1dG9jb21wbGV0ZVNlYXJjaFJlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoUmVzdWx0cyB8fCBbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGlnaGxpZ2h0VGV4dCgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZ2hsaWdodFRleHQgfHwgW107XG4gIH1cblxuICBwdWJsaWMgaXNPcGVuID0gZmFsc2U7XG5cbiAgcHVibGljIHJlc3VsdHNMaXN0SWQ6IHN0cmluZztcblxuICBwdWJsaWMgcmVzdWx0c1dyYXBwZXJJZDogc3RyaW5nO1xuXG4gIHB1YmxpYyBzZWFyY2hUZXh0OiBzdHJpbmc7XG5cbiAgcHVibGljIGdldCBzaG93QWN0aW9uc0FyZWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FkZEJ1dHRvbiB8fCB0aGlzLmVuYWJsZVNob3dNb3JlO1xuICB9XG5cbiAgcHVibGljIGlzU2VhcmNoaW5nQXN5bmMgPSBmYWxzZTtcblxuICBwdWJsaWMgc2VhcmNoUmVzdWx0c0NvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgQFZpZXdDaGlsZCgnZGVmYXVsdFNlYXJjaFJlc3VsdFRlbXBsYXRlJywge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICAgIHN0YXRpYzogZmFsc2UsXG4gIH0pXG4gIHByaXZhdGUgZGVmYXVsdFNlYXJjaFJlc3VsdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKFNreUF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlKVxuICBwcml2YXRlIHNldCBpbnB1dERpcmVjdGl2ZShkaXJlY3RpdmU6IFNreUF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlKSB7XG4gICAgaWYgKHRoaXMuX2lucHV0RGlyZWN0aXZlICE9PSBkaXJlY3RpdmUpIHtcbiAgICAgIGlmICghZGlyZWN0aXZlKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgICdUaGUgU2t5QXV0b2NvbXBsZXRlQ29tcG9uZW50IHJlcXVpcmVzIGEgQ29udGVudENoaWxkIGlucHV0IG9yJyxcbiAgICAgICAgICAgICd0ZXh0YXJlYSBib3VuZCB3aXRoIHRoZSBTa3lBdXRvY29tcGxldGUgZGlyZWN0aXZlLiBGb3IgZXhhbXBsZTonLFxuICAgICAgICAgICAgJ2A8aW5wdXQgdHlwZT1cInRleHRcIiBza3lBdXRvY29tcGxldGU+YC4nLFxuICAgICAgICAgIF0uam9pbignICcpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gb2xkIHN1YnNjcmlwdGlvbnMgb24gYW55IHByZXZpb3VzIGlucHV0IGRpcmVjdGl2ZVxuICAgICAgdGhpcy5pbnB1dERpcmVjdGl2ZVVuc3Vic2NyaWJlLm5leHQoKTtcblxuICAgICAgdGhpcy5faW5wdXREaXJlY3RpdmUgPSBkaXJlY3RpdmU7XG5cbiAgICAgIHRoaXMuX2lucHV0RGlyZWN0aXZlLmRpc3BsYXlXaXRoID0gdGhpcy5kZXNjcmlwdG9yUHJvcGVydHk7XG5cbiAgICAgIHRoaXMuX2lucHV0RGlyZWN0aXZlLnRleHRDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmlucHV0RGlyZWN0aXZlVW5zdWJzY3JpYmUpLFxuICAgICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZSksXG4gICAgICAgICAgc3dpdGNoTWFwKChjaGFuZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNTZWFyY2hpbmdBc3luYyA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gb2YoY2hhbmdlKTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2VhcmNoVGV4dENoYW5nZWQoY2hhbmdlLnZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2lucHV0RGlyZWN0aXZlLmJsdXJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuaW5wdXREaXJlY3RpdmVVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaW5wdXREaXJlY3RpdmUucmVzdG9yZUlucHV0VGV4dFZhbHVlVG9QcmV2aW91c1N0YXRlKCk7XG4gICAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgdGhpcy5pbnB1dERpcmVjdGl2ZS5vblRvdWNoZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2lucHV0RGlyZWN0aXZlLmZvY3VzXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmlucHV0RGlyZWN0aXZlVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5zaG93QWN0aW9uc0FyZWEpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkRyb3Bkb3duKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCBpbnB1dERpcmVjdGl2ZSgpOiBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2lucHV0RGlyZWN0aXZlO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgncmVzdWx0c1RlbXBsYXRlUmVmJywge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICB9KVxuICBwcml2YXRlIHJlc3VsdHNUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQFZpZXdDaGlsZCgncmVzdWx0c1JlZicsIHtcbiAgICByZWFkOiBFbGVtZW50UmVmLFxuICB9KVxuICBwcml2YXRlIHNldCByZXN1bHRzUmVmKHZhbHVlOiBFbGVtZW50UmVmKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl9yZXN1bHRzUmVmID0gdmFsdWU7XG4gICAgICB0aGlzLmRlc3Ryb3lBZmZpeGVyKCk7XG4gICAgICB0aGlzLmNyZWF0ZUFmZml4ZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCByZXN1bHRzUmVmKCk6IEVsZW1lbnRSZWYge1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHRzUmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGV4IHRoYXQgaW5kaWNhdGVzIHdoaWNoIGRlc2NlbmRhbnQgb2YgdGhlIG92ZXJsYXkgY3VycmVudGx5IGhhcyBmb2N1cy5cbiAgICovXG4gIHByaXZhdGUgYWN0aXZlRWxlbWVudEluZGV4ID0gLTE7XG5cbiAgcHJpdmF0ZSBhZmZpeGVyOiBTa3lBZmZpeGVyO1xuXG4gIHByaXZhdGUgaW5wdXREaXJlY3RpdmVVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBtZXNzYWdlU3RyZWFtU3ViOiBTdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIG92ZXJsYXk6IFNreU92ZXJsYXlJbnN0YW5jZTtcblxuICAvKipcbiAgICogRWxlbWVudHMgd2l0aGluIHRoZSBhdXRvY29tcGxldGUgZHJvcGRvd24gdGhhdCBhcmUgZm9jdXNhYmxlLlxuICAgKiBUaGVzZSBhcmUgdHlwaWNhbGx5IHRoZSBzZWFyY2ggcmVzdWx0cyBhbmQgYWN0aW9uIGJ1dHRvbnMsIGJ1dCBjb3VsZCBhbHNvIGJlXG4gICAqIGVsZW1lbnRzIHByb3ZpZGVkIGluIHRoZSBjb25zdW1lcidzIG93biB0ZW1wbGF0ZS5cbiAgICovXG4gIHByaXZhdGUgb3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzOiBIVE1MRWxlbWVudFtdID0gW107XG5cbiAgcHJpdmF0ZSBjdXJyZW50U2VhcmNoU3ViOiBTdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSBfZGF0YTogYW55W107XG4gIHByaXZhdGUgX2RlYm91bmNlVGltZTogbnVtYmVyO1xuICBwcml2YXRlIF9kZXNjcmlwdG9yUHJvcGVydHk6IHN0cmluZztcbiAgcHJpdmF0ZSBfaGlnaGxpZ2h0VGV4dDogc3RyaW5nW107XG4gIHByaXZhdGUgX2lucHV0RGlyZWN0aXZlOiBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZTtcbiAgcHJpdmF0ZSBfbWVzc2FnZVN0cmVhbTogU3ViamVjdDxTa3lBdXRvY29tcGxldGVNZXNzYWdlPjtcbiAgcHJpdmF0ZSBfcHJvcGVydGllc1RvU2VhcmNoOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSBfcmVzdWx0c1JlZjogRWxlbWVudFJlZjtcbiAgcHJpdmF0ZSBfc2VhcmNoOiBTa3lBdXRvY29tcGxldGVTZWFyY2hGdW5jdGlvbjtcbiAgcHJpdmF0ZSBfc2VhcmNoUmVzdWx0czogU2t5QXV0b2NvbXBsZXRlU2VhcmNoUmVzdWx0W107XG4gIHByaXZhdGUgX3NlYXJjaFJlc3VsdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcbiAgcHJpdmF0ZSBfc2VhcmNoUmVzdWx0c0xpbWl0OiBudW1iZXI7XG4gIHByaXZhdGUgX3NlYXJjaFRleHRNaW5pbXVtQ2hhcmFjdGVyczogbnVtYmVyO1xuICBwcml2YXRlIF9zZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNreUF1dG9jb21wbGV0ZVNlbGVjdGlvbkNoYW5nZT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBhZmZpeFNlcnZpY2U6IFNreUFmZml4U2VydmljZSxcbiAgICBwcml2YXRlIGFkYXB0ZXJTZXJ2aWNlOiBTa3lBdXRvY29tcGxldGVBZGFwdGVyU2VydmljZSxcbiAgICBwcml2YXRlIG92ZXJsYXlTZXJ2aWNlOiBTa3lPdmVybGF5U2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGlucHV0Qm94SG9zdFN2Yz86IFNreUlucHV0Qm94SG9zdFNlcnZpY2VcbiAgKSB7XG4gICAgY29uc3QgaWQgPSArK3VuaXF1ZUlkO1xuICAgIHRoaXMucmVzdWx0c0xpc3RJZCA9IGBza3ktYXV0b2NvbXBsZXRlLWxpc3QtJHtpZH1gO1xuICAgIHRoaXMucmVzdWx0c1dyYXBwZXJJZCA9IGBza3ktYXV0b2NvbXBsZXRlLXdyYXBwZXItJHtpZH1gO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5wdXREaXJlY3RpdmUpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBbXG4gICAgICAgICAgJ1RoZSBTa3lBdXRvY29tcGxldGVDb21wb25lbnQgcmVxdWlyZXMgYSBDb250ZW50Q2hpbGQgaW5wdXQgb3InLFxuICAgICAgICAgICd0ZXh0YXJlYSBib3VuZCB3aXRoIHRoZSBTa3lBdXRvY29tcGxldGUgZGlyZWN0aXZlLiBGb3IgZXhhbXBsZTonLFxuICAgICAgICAgICdgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc2t5QXV0b2NvbXBsZXRlPmAuJyxcbiAgICAgICAgXS5qb2luKCcgJylcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZElucHV0RXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbEN1cnJlbnRTZWFyY2goKTtcbiAgICB0aGlzLmlucHV0RGlyZWN0aXZlVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuaW5wdXREaXJlY3RpdmVVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5kZXN0cm95QWZmaXhlcigpO1xuICAgIHRoaXMuZGVzdHJveU92ZXJsYXkoKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRCdXR0b25DbGlja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkQ2xpY2suZW1pdCgpO1xuICAgIHRoaXMuaW5wdXREaXJlY3RpdmUucmVzdG9yZUlucHV0VGV4dFZhbHVlVG9QcmV2aW91c1N0YXRlKCk7XG4gICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIC8qIFNhbml0eSBjaGVjayAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGV2ZW50LmtleSkge1xuICAgICAgY29uc3Qga2V5ID0gZXZlbnQua2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5nZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50SWQgPSBhY3RpdmVFbGVtZW50Py5pZDtcbiAgICAgIGNvbnN0IHRhcmdldElzU2VhcmNoUmVzdWx0ID0gdGhpcy5zZWFyY2hSZXN1bHRzLmZpbmQoXG4gICAgICAgIChyKSA9PiByLmVsZW1lbnRJZCA9PT0gYWN0aXZlRWxlbWVudElkXG4gICAgICApO1xuXG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlICdlbnRlcic6XG4gICAgICAgICAgaWYgKHRhcmdldElzU2VhcmNoUmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFNlYXJjaFJlc3VsdEJ5SWQoYWN0aXZlRWxlbWVudElkKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dBY3Rpb25zQXJlYSkge1xuICAgICAgICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMucmVzZXRTZWFyY2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgYWN0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZWRvd24nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd0YWInOlxuICAgICAgICAgIGlmICh0YXJnZXRJc1NlYXJjaFJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RTZWFyY2hSZXN1bHRCeUlkKGFjdGl2ZUVsZW1lbnRJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREaXJlY3RpdmUucmVzdG9yZUlucHV0VGV4dFZhbHVlVG9QcmV2aW91c1N0YXRlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZXNjYXBlJzpcbiAgICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdhcnJvd2Rvd24nOlxuICAgICAgICBjYXNlICdkb3duJzpcbiAgICAgICAgICB0aGlzLnJlbW92ZUZvY3VzZWRDbGFzcygpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRWxlbWVudEluZGV4ID09PVxuICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlGb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxIHx8XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUVsZW1lbnRJbmRleCA9PT0gLTFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRWxlbWVudEluZGV4ID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVFbGVtZW50SW5kZXggPSB0aGlzLmFjdGl2ZUVsZW1lbnRJbmRleCArIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYWRkRm9jdXNlZENsYXNzKCk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Fycm93dXAnOlxuICAgICAgICBjYXNlICd1cCc6XG4gICAgICAgICAgdGhpcy5yZW1vdmVGb2N1c2VkQ2xhc3MoKTtcbiAgICAgICAgICBpZiAodGhpcy5hY3RpdmVFbGVtZW50SW5kZXggPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVFbGVtZW50SW5kZXggPSB0aGlzLm92ZXJsYXlGb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUVsZW1lbnRJbmRleCA9IHRoaXMuYWN0aXZlRWxlbWVudEluZGV4IC0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hZGRGb2N1c2VkQ2xhc3MoKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1vcmVCdXR0b25DbGlja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd01vcmVDbGljay5lbWl0KHsgaW5wdXRWYWx1ZTogdGhpcy5zZWFyY2hUZXh0IH0pO1xuICAgIHRoaXMuaW5wdXREaXJlY3RpdmUucmVzdG9yZUlucHV0VGV4dFZhbHVlVG9QcmV2aW91c1N0YXRlKCk7XG4gICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gIH1cblxuICBwdWJsaWMgb25SZXN1bHRNb3VzZURvd24oaWQ6IHN0cmluZywgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdFNlYXJjaFJlc3VsdEJ5SWQoaWQpO1xuXG4gICAgaWYgKCF0aGlzLnNob3dBY3Rpb25zQXJlYSkge1xuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzZXRTZWFyY2goKTtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHVibGljIG9uUmVzdWx0TW91c2VNb3ZlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoaWQgIT09IHRoaXMuYWN0aXZlRWxlbWVudEluZGV4KSB7XG4gICAgICB0aGlzLnJlbW92ZUZvY3VzZWRDbGFzcygpO1xuICAgICAgdGhpcy5hY3RpdmVFbGVtZW50SW5kZXggPSBpZDtcbiAgICAgIHRoaXMuYWRkRm9jdXNlZENsYXNzKCk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0VsZW1lbnRGb2N1c2VkKHJlZjogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVmID09PSB0aGlzLm92ZXJsYXlGb2N1c2FibGVFbGVtZW50c1t0aGlzLmFjdGl2ZUVsZW1lbnRJbmRleF07XG4gIH1cblxuICBwcml2YXRlIHNlYXJjaFRleHRDaGFuZ2VkKHNlYXJjaFRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGlzRW1wdHkgPVxuICAgICAgIXNlYXJjaFRleHQgfHwgIXNlYXJjaFRleHQudHJpbSgpIHx8IHNlYXJjaFRleHQubWF0Y2goL15cXHMrJC8pO1xuXG4gICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgIC8vIEVtaXQgc2VsZWN0aW9uQ2hhbmdlIGlmIHZhbHVlIGhhcyBiZWVuIGNsZWFyZWQuXG4gICAgICBpZiAodGhpcy5pbnB1dERpcmVjdGl2ZS52YWx1ZSkge1xuICAgICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHtcbiAgICAgICAgICBzZWxlY3RlZEl0ZW06IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5zaG93QWN0aW9uc0FyZWEpIHtcbiAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlc2V0U2VhcmNoKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXNTZWFyY2hpbmdBc3luYyA9IGZhbHNlO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzTG9uZ0Vub3VnaCA9IHNlYXJjaFRleHQubGVuZ3RoID49IHRoaXMuc2VhcmNoVGV4dE1pbmltdW1DaGFyYWN0ZXJzO1xuICAgIGNvbnN0IGlzRGlmZmVyZW50ID0gc2VhcmNoVGV4dCAhPT0gdGhpcy5zZWFyY2hUZXh0O1xuXG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gc2VhcmNoVGV4dC50cmltKCk7XG5cbiAgICBpZiAoaXNMb25nRW5vdWdoICYmIGlzRGlmZmVyZW50KSB7XG4gICAgICB0aGlzLmNhbmNlbEN1cnJlbnRTZWFyY2goKTtcblxuICAgICAgdGhpcy5jdXJyZW50U2VhcmNoU3ViID0gdGhpcy5wZXJmb3JtU2VhcmNoKClcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbXMgPSByZXN1bHQuaXRlbXMuZmlsdGVyKChpdGVtOiBuZXZlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0gJiYgdGhpcy5kZXNjcmlwdG9yUHJvcGVydHkgaW4gaXRlbTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMuaXNTZWFyY2hpbmdBc3luYyA9IGZhbHNlO1xuXG4gICAgICAgICAgdGhpcy5fc2VhcmNoUmVzdWx0cyA9IGl0ZW1zLm1hcCgociwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBTa3lBdXRvY29tcGxldGVTZWFyY2hSZXN1bHQgPSB7XG4gICAgICAgICAgICAgIGVsZW1lbnRJZDogYCR7dGhpcy5yZXN1bHRzTGlzdElkfS1pdGVtLSR7aX1gLFxuICAgICAgICAgICAgICBkYXRhOiByLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNDb3VudCA9IHJlc3VsdC50b3RhbENvdW50O1xuXG4gICAgICAgICAgdGhpcy5faGlnaGxpZ2h0VGV4dCA9IHRoaXMuZ2V0SGlnaGxpZ2h0VGV4dCh0aGlzLnNlYXJjaFRleHQpO1xuICAgICAgICAgIHRoaXMucmVtb3ZlRm9jdXNlZENsYXNzKCk7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBY3RpdmVEZXNjZW5kYW50KCk7XG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoUmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUVsZW1lbnRJbmRleCA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRWxlbWVudEluZGV4ID0gLTE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgLy8gTGV0IHRoZSByZXN1bHRzIHBvcHVsYXRlIGluIHRoZSBET00gYmVmb3JlIHJlY2FsY3VsYXRpbmcgcGxhY2VtZW50LlxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuYWZmaXhlci5yZWFmZml4KCk7XG4gICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICB0aGlzLmluaXRPdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5Ecm9wZG93bigpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzU2VhcmNoaW5nQXN5bmMgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwZXJmb3JtU2VhcmNoKCk6IE9ic2VydmFibGU8U2t5QXV0b2NvbXBsZXRlU2VhcmNoQXN5bmNSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoQXN5bmNEaXNhYmxlZCAmJiB0aGlzLnNlYXJjaEFzeW5jLm9ic2VydmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzZWFyY2hBc3luY0FyZ3M6IFNreUF1dG9jb21wbGV0ZVNlYXJjaEFzeW5jQXJncyA9IHtcbiAgICAgICAgZGlzcGxheVR5cGU6ICdwb3BvdmVyJyxcbiAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICBzZWFyY2hUZXh0OiB0aGlzLnNlYXJjaFRleHQsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnNlYXJjaEFzeW5jLmVtaXQoc2VhcmNoQXN5bmNBcmdzKTtcblxuICAgICAgcmV0dXJuIHNlYXJjaEFzeW5jQXJncy5yZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWFyY2godGhpcy5zZWFyY2hUZXh0LCB0aGlzLmRhdGEpO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICByZXR1cm4gb2Yoe1xuICAgICAgICBpdGVtczogcmVzdWx0LFxuICAgICAgICB0b3RhbENvdW50OiByZXN1bHQubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb20ocmVzdWx0KS5waXBlKFxuICAgICAgbWFwKChpdGVtcykgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgIHRvdGFsQ291bnQ6IGl0ZW1zLmxlbmd0aCxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsQ3VycmVudFNlYXJjaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50U2VhcmNoU3ViKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTZWFyY2hTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuY3VycmVudFNlYXJjaFN1YiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGV4dCB0byBoaWdobGlnaHQgYmFzZWQgb24gZXhhY3QgbWF0Y2hlcywgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGVzLCBhbmQgbWF0Y2hlcyBmb3IgY29ycmVzcG9uZGluZyBkaWFjcml0aWNhbCBjaGFyYWN0ZXJzIChhIHdpbGwgbWF0Y2ggw6ApLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRIaWdobGlnaHRUZXh0KHNlYXJjaFRleHQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoVGV4dCA9IG5vcm1hbGl6ZURpYWNyaXRpY3Moc2VhcmNoVGV4dClcbiAgICAgIC50b0xvY2FsZVVwcGVyQ2FzZSgpXG4gICAgICAudHJpbSgpO1xuICAgIGlmICghbm9ybWFsaXplZFNlYXJjaFRleHQpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBsZXQgbWF0Y2hlc1RvSGlnaGxpZ2h0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBuID0gdGhpcy5fc2VhcmNoUmVzdWx0cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fc2VhcmNoUmVzdWx0c1tpXS5kYXRhW3RoaXMuZGVzY3JpcHRvclByb3BlcnR5XVxuICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAudG9Mb2NhbGVVcHBlckNhc2UoKSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBub3JtYWxpemVkRGF0YVZhbHVlID0gbm9ybWFsaXplRGlhY3JpdGljcyh2YWx1ZSk7XG5cbiAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgbGV0IGluZGV4OiBudW1iZXI7XG4gICAgICB3aGlsZSAoXG4gICAgICAgIChpbmRleCA9IG5vcm1hbGl6ZWREYXRhVmFsdWUuaW5kZXhPZihub3JtYWxpemVkU2VhcmNoVGV4dCwgb2Zmc2V0KSkgPiAtMVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRTdHJpbmcgPSB2YWx1ZS5zbGljZShpbmRleCwgaW5kZXggKyBzZWFyY2hUZXh0Lmxlbmd0aCk7XG4gICAgICAgIG9mZnNldCA9IGluZGV4ICsgc2VhcmNoVGV4dC5sZW5ndGg7XG4gICAgICAgIG1hdGNoZXNUb0hpZ2hsaWdodCA9IG1hdGNoZXNUb0hpZ2hsaWdodC5jb25jYXQobWF0Y2hlZFN0cmluZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGVzIGZyb20gdGhlIGFycmF5LlxuICAgIHJldHVybiBbLi4ubmV3IFNldChtYXRjaGVzVG9IaWdobGlnaHQpXTtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0U2VhcmNoUmVzdWx0QnlJZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWFyY2hSZXN1bHRzLmZpbmQoKHIpID0+IHIuZWxlbWVudElkID09PSBpZCkuZGF0YTtcbiAgICAvKiBTYW5pdHkgY2hlY2sgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IHJlc3VsdFt0aGlzLmRlc2NyaXB0b3JQcm9wZXJ0eV07XG4gICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnZhbHVlID0gcmVzdWx0O1xuICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7XG4gICAgICAgIHNlbGVjdGVkSXRlbTogcmVzdWx0LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRHJvcGRvd24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm92ZXJsYXkpIHtcbiAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNyZWF0ZSh7XG4gICAgICAgIGVuYWJsZUNsb3NlOiBmYWxzZSxcbiAgICAgICAgZW5hYmxlUG9pbnRlckV2ZW50czogdHJ1ZSxcbiAgICAgICAgd3JhcHBlckNsYXNzOiB0aGlzLndyYXBwZXJDbGFzcyxcbiAgICAgIH0pO1xuXG4gICAgICBvdmVybGF5LmF0dGFjaFRlbXBsYXRlKHRoaXMucmVzdWx0c1RlbXBsYXRlUmVmKTtcblxuICAgICAgdGhpcy5vdmVybGF5ID0gb3ZlcmxheTtcbiAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB0aGlzLmluaXRPdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsb3NlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldFNlYXJjaCgpO1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5kZXN0cm95T3ZlcmxheSgpO1xuICAgIHRoaXMucmVtb3ZlQWN0aXZlRGVzY2VuZGFudCgpO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHNldEFjdGl2ZURlc2NlbmRhbnQoKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlRWxlbWVudCA9XG4gICAgICB0aGlzLm92ZXJsYXlGb2N1c2FibGVFbGVtZW50c1t0aGlzLmFjdGl2ZUVsZW1lbnRJbmRleF07XG4gICAgLyogU2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoYWN0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5pbnB1dERpcmVjdGl2ZS5zZXRBY3RpdmVEZXNjZW5kYW50KGFjdGl2ZUVsZW1lbnQuaWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlQWN0aXZlRGVzY2VuZGFudCgpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnNldEFjdGl2ZURlc2NlbmRhbnQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0U2VhcmNoKCk6IHZvaWQge1xuICAgIHRoaXMuX3NlYXJjaFJlc3VsdHMgPSBbXTtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICB0aGlzLl9oaWdobGlnaHRUZXh0ID0gW107XG4gICAgdGhpcy5hY3RpdmVFbGVtZW50SW5kZXggPSAtMTtcbiAgICB0aGlzLnNlYXJjaFJlc3VsdHNDb3VudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlbW92ZUFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICB0aGlzLmluaXRPdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMoKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRJbnB1dEV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgIG9ic2VydmFibGVGcm9tRXZlbnQoZWxlbWVudCwgJ2tleWRvd24nKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUtleWRvd24oZXZlbnQpO1xuICAgICAgfSk7XG5cbiAgICBvYnNlcnZhYmxlRnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLnNldERyb3Bkb3duV2lkdGgoXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYsXG4gICAgICAgICAgICB0aGlzLnJlc3VsdHNSZWYsXG4gICAgICAgICAgICAhIXRoaXMuaW5wdXRCb3hIb3N0U3ZjXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lPdmVybGF5KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm92ZXJsYXkpIHtcbiAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuY2xvc2UodGhpcy5vdmVybGF5KTtcbiAgICAgIHRoaXMub3ZlcmxheSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUFmZml4ZXIoKTogdm9pZCB7XG4gICAgLyogU2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoIXRoaXMuYWZmaXhlcikge1xuICAgICAgY29uc3QgYWZmaXhlciA9IHRoaXMuYWZmaXhTZXJ2aWNlLmNyZWF0ZUFmZml4ZXIodGhpcy5yZXN1bHRzUmVmKTtcblxuICAgICAgdGhpcy5hZGFwdGVyU2VydmljZS5zZXREcm9wZG93bldpZHRoKFxuICAgICAgICB0aGlzLmVsZW1lbnRSZWYsXG4gICAgICAgIHRoaXMucmVzdWx0c1JlZixcbiAgICAgICAgISF0aGlzLmlucHV0Qm94SG9zdFN2Y1xuICAgICAgKTtcblxuICAgICAgYWZmaXhlci5hZmZpeFRvKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB7XG4gICAgICAgIGF1dG9GaXRDb250ZXh0OiBTa3lBZmZpeEF1dG9GaXRDb250ZXh0LlZpZXdwb3J0LFxuICAgICAgICBlbmFibGVBdXRvRml0OiB0cnVlLFxuICAgICAgICBpc1N0aWNreTogdHJ1ZSxcbiAgICAgICAgcGxhY2VtZW50OiAnYmVsb3cnLFxuICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OiAnbGVmdCcsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5hZmZpeGVyID0gYWZmaXhlcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lBZmZpeGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFmZml4ZXIpIHtcbiAgICAgIHRoaXMuYWZmaXhlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLmFmZml4ZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0TWVzc2FnZVN0cmVhbSgpOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodGhpcy5tZXNzYWdlU3RyZWFtU3ViKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTdHJlYW1TdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tZXNzYWdlU3RyZWFtKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTdHJlYW1TdWIgPSB0aGlzLm1lc3NhZ2VTdHJlYW1cbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKG1lc3NhZ2U6IFNreUF1dG9jb21wbGV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTa3lBdXRvY29tcGxldGVNZXNzYWdlVHlwZS5DbG9zZURyb3Bkb3duOlxuICAgICAgICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNreUF1dG9jb21wbGV0ZU1lc3NhZ2VUeXBlLlJlcG9zaXRpb25Ecm9wZG93bjpcbiAgICAgICAgICAgICAgLy8gU2V0dGltZW91dCB3YWl0cyBmb3IgY2hhbmdlcyBpbiBET00gKGUuZy4sIHRva2VucyBiZWluZyByZW1vdmVkKVxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFmZml4ZXIpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWZmaXhlci5yZWFmZml4KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRPdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMoKTogdm9pZCB7XG4gICAgLy8gV2FpdCBmb3IgZHJvcGRvd24gZWxlbWVudHMgdG8gcmVuZGVyLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMub3ZlcmxheSkge1xuICAgICAgICB0aGlzLm92ZXJsYXlGb2N1c2FibGVFbGVtZW50cyA9XG4gICAgICAgICAgdGhpcy5hZGFwdGVyU2VydmljZS5nZXRPdmVybGF5Rm9jdXNhYmxlRWxlbWVudHModGhpcy5vdmVybGF5KTtcbiAgICAgICAgdGhpcy5vdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLnNldFRhYkluZGV4KGVsLCAtMSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFkZEZvY3VzZWRDbGFzcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBY3RpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5vdmVybGF5Rm9jdXNhYmxlRWxlbWVudHNbdGhpcy5hY3RpdmVFbGVtZW50SW5kZXhdO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVGb2N1c2VkQ2xhc3MoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlRWxlbWVudEluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuYWRhcHRlclNlcnZpY2UucmVtb3ZlQ1NTQ2xhc3MoXG4gICAgICAgIHRoaXMub3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzW3RoaXMuYWN0aXZlRWxlbWVudEluZGV4XSxcbiAgICAgICAgJ3NreS1hdXRvY29tcGxldGUtZGVzY2VuZGFudC1mb2N1cydcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRGb2N1c2VkQ2xhc3MoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlRWxlbWVudEluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuYWRhcHRlclNlcnZpY2UuYWRkQ1NTQ2xhc3MoXG4gICAgICAgIHRoaXMub3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzW3RoaXMuYWN0aXZlRWxlbWVudEluZGV4XSxcbiAgICAgICAgJ3NreS1hdXRvY29tcGxldGUtZGVzY2VuZGFudC1mb2N1cydcbiAgICAgICk7XG4gICAgICB0aGlzLnNldEFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgYXJpYS1hdXRvY29tcGxldGU9XCJsaXN0XCJcbiAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICBjbGFzcz1cInNreS1hdXRvY29tcGxldGVcIlxuICByb2xlPVwiY29tYm9ib3hcIlxuICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlbiAmJiBzZWFyY2hUZXh0XCJcbiAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZEJ5XCJcbiAgW2F0dHIuYXJpYS1vd25zXT1cImlzT3BlbiA/IHJlc3VsdHNMaXN0SWQgOiBudWxsXCJcbiAgW2F0dHIuaWRdPVwicmVzdWx0c1dyYXBwZXJJZFwiXG4+XG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3Jlc3VsdHNUZW1wbGF0ZVJlZj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic2t5LWF1dG9jb21wbGV0ZS1yZXN1bHRzLWNvbnRhaW5lclwiXG4gICAgW3NreVRoZW1lQ2xhc3NdPVwie1xuICAgICAgJ3NreS1zaGFkb3cnOiAnZGVmYXVsdCcsXG4gICAgICAnc2t5LWVsZXZhdGlvbi00JzogJ21vZGVybidcbiAgICB9XCJcbiAgICAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duKCRldmVudClcIlxuICAgICNyZXN1bHRzUmVmXG4gID5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cImlzU2VhcmNoaW5nQXN5bmM7IGVsc2UgcmVzdWx0Q29udHJvbHNUZW1wbGF0ZVJlZlwiXG4gICAgICBjbGFzcz1cInNreS1hdXRvY29tcGxldGUtcmVzdWx0cy13YWl0aW5nXCJcbiAgICA+XG4gICAgICA8c2t5LXdhaXQgW2lzV2FpdGluZ109XCJ0cnVlXCI+PC9za3ktd2FpdD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Jlc3VsdENvbnRyb2xzVGVtcGxhdGVSZWY+XG4gIDxkaXZcbiAgICAqbmdJZj1cInNlYXJjaFRleHQgJiYgKCFzaG93QWN0aW9uc0FyZWEgfHwgc2VhcmNoUmVzdWx0cy5sZW5ndGggPiAwKVwiXG4gICAgY2xhc3M9XCJza3ktYXV0b2NvbXBsZXRlLXJlc3VsdHNcIlxuICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkQnlcIlxuICAgIFthdHRyLmlkXT1cInJlc3VsdHNMaXN0SWRcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcmVzdWx0IG9mIHNlYXJjaFJlc3VsdHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCIhc2VhcmNoUmVzdWx0c0xpbWl0IHx8IGkgPCBzZWFyY2hSZXN1bHRzTGltaXRcIlxuICAgICAgICBjbGFzcz1cInNreS1hdXRvY29tcGxldGUtcmVzdWx0XCJcbiAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNFbGVtZW50Rm9jdXNlZChzZWFyY2hSZXN1bHRFbClcIlxuICAgICAgICBbYXR0ci5pZF09XCJyZXN1bHQuZWxlbWVudElkXCJcbiAgICAgICAgW3NreUhpZ2hsaWdodF09XCJoaWdobGlnaHRUZXh0XCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJvblJlc3VsdE1vdXNlRG93bihyZXN1bHQuZWxlbWVudElkLCAkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlbW92ZSk9XCJvblJlc3VsdE1vdXNlTW92ZShpKVwiXG4gICAgICAgICNzZWFyY2hSZXN1bHRFbFxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIHNlYXJjaFJlc3VsdFRlbXBsYXRlO1xuICAgICAgICAgICAgY29udGV4dDogeyBpdGVtOiByZXN1bHQuZGF0YSB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwic2VhcmNoUmVzdWx0cy5sZW5ndGggPT09IDBcIlxuICAgICAgY2xhc3M9XCJza3ktZGVlbXBoYXNpemVkIHNreS1wYWRkaW5nLXNxdWlzaC1kZWZhdWx0XCJcbiAgICA+XG4gICAgICB7e1xuICAgICAgICBub1Jlc3VsdHNGb3VuZFRleHQgfHxcbiAgICAgICAgICAoJ3NreXV4X2F1dG9jb21wbGV0ZV9ub19yZXN1bHRzJyB8IHNreUxpYlJlc291cmNlcylcbiAgICAgIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwic2hvd0FjdGlvbnNBcmVhXCIgY2xhc3M9XCJza3ktYXV0b2NvbXBsZXRlLWFjdGlvbnNcIj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cImVuYWJsZVNob3dNb3JlICYmICghc2VhcmNoVGV4dCB8fCBzZWFyY2hSZXN1bHRzLmxlbmd0aCA+IDApXCJcbiAgICAgIGNsYXNzPVwic2t5LWF1dG9jb21wbGV0ZS1hY3Rpb24gc2t5LWF1dG9jb21wbGV0ZS1hY3Rpb24tbW9yZSBza3ktYnRuIHNreS1idG4tbGlua1wiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChtb3VzZWRvd24pPVwibW9yZUJ1dHRvbkNsaWNrZWQoKVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICEoXG4gICAgICAgICAgICBzZWFyY2hBc3luY1xuICAgICAgICAgICAgfCBza3lBdXRvY29tcGxldGVTZWFyY2hBc3luY0Rpc2FibGVkOiBzZWFyY2hBc3luY0Rpc2FibGVkXG4gICAgICAgICAgKSAmJlxuICAgICAgICAgIHNlYXJjaFJlc3VsdHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgIXNlYXJjaFRleHRcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAge3sgJ3NreXV4X2F1dG9jb21wbGV0ZV9zaG93X2FsbCcgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIChzZWFyY2hBc3luY1xuICAgICAgICAgICAgfCBza3lBdXRvY29tcGxldGVTZWFyY2hBc3luY0Rpc2FibGVkOiBzZWFyY2hBc3luY0Rpc2FibGVkKSAmJlxuICAgICAgICAgICFzZWFyY2hUZXh0XG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIHt7XG4gICAgICAgICAgJ3NreXV4X2F1dG9jb21wbGV0ZV9zaG93X2FsbF9jb3VudCdcbiAgICAgICAgICAgIHwgc2t5TGliUmVzb3VyY2VzOiAoZGF0YS5sZW5ndGggfCBza3lOdW1lcmljOiB7IHRydW5jYXRlOiBmYWxzZSB9KVxuICAgICAgICB9fVxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VhcmNoVGV4dFwiPlxuICAgICAgICB7e1xuICAgICAgICAgICdza3l1eF9hdXRvY29tcGxldGVfc2hvd19tYXRjaGVzX2NvdW50J1xuICAgICAgICAgICAgfCBza3lMaWJSZXNvdXJjZXNcbiAgICAgICAgICAgICAgOiAoc2VhcmNoUmVzdWx0c0NvdW50ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgID8gZGF0YS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgIDogKHNlYXJjaFJlc3VsdHNDb3VudCB8IHNreU51bWVyaWM6IHsgdHJ1bmNhdGU6IGZhbHNlIH0pKVxuICAgICAgICB9fVxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9idXR0b24+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJzZWFyY2hUZXh0ICYmIHNlYXJjaFJlc3VsdHMubGVuZ3RoID09PSAwXCJcbiAgICAgIGNsYXNzPVwic2t5LWZvbnQtZGVlbXBoYXNpemVkIHNreS1hdXRvY29tcGxldGUtYWN0aW9ucy1uby1yZXN1bHRzXCJcbiAgICA+XG4gICAgICB7e1xuICAgICAgICBub1Jlc3VsdHNGb3VuZFRleHQgfHxcbiAgICAgICAgICAoJ3NreXV4X2F1dG9jb21wbGV0ZV9ub19yZXN1bHRzJyB8IHNreUxpYlJlc291cmNlcylcbiAgICAgIH19XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJzaG93QWRkQnV0dG9uXCJcbiAgICAgIGNsYXNzPVwic2t5LWF1dG9jb21wbGV0ZS1hY3Rpb24gc2t5LWF1dG9jb21wbGV0ZS1hY3Rpb24tYWRkIHNreS1idG4gc2t5LWJ0bi1saW5rXCJcbiAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFtjbGFzcy5mb2N1c2VkXT1cImlzRWxlbWVudEZvY3VzZWQoYWRkQnV0dG9uRWwpXCJcbiAgICAgIChtb3VzZWRvd24pPVwiYWRkQnV0dG9uQ2xpY2tlZCgpXCJcbiAgICAgICNhZGRCdXR0b25FbFxuICAgID5cbiAgICAgIDxza3ktaWNvbiAqc2t5VGhlbWVJZj1cIidtb2Rlcm4nXCIgaWNvbj1cImFkZFwiIGljb25UeXBlPVwic2t5dXhcIj48L3NreS1pY29uPlxuICAgICAgPHNreS1pY29uICpza3lUaGVtZUlmPVwiJ2RlZmF1bHQnXCIgaWNvbj1cInBsdXMtY2lyY2xlXCI+PC9za3ktaWNvbj5cbiAgICAgIHt7ICdza3l1eF9hdXRvY29tcGxldGVfYWRkJyB8IHNreUxpYlJlc291cmNlcyB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIiAjZGVmYXVsdFNlYXJjaFJlc3VsdFRlbXBsYXRlPlxuICB7eyBpdGVtW2Rlc2NyaXB0b3JQcm9wZXJ0eV0gfX1cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
724
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9sb29rdXAvc3JjL2xpYi9tb2R1bGVzL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xvb2t1cC9zcmMvbGliL21vZHVsZXMvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsZUFBZSxFQUdmLGlCQUFpQixHQUNsQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdEQsT0FBTyxFQUVMLE9BQU8sRUFFUCxJQUFJLEVBQ0osU0FBUyxJQUFJLG1CQUFtQixFQUNoQyxFQUFFLEdBQ0gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXhFLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFN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cG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBTa3lBZmZpeEF1dG9GaXRDb250ZXh0LFxuICBTa3lBZmZpeFNlcnZpY2UsXG4gIFNreUFmZml4ZXIsXG4gIFNreU92ZXJsYXlJbnN0YW5jZSxcbiAgU2t5T3ZlcmxheVNlcnZpY2UsXG59IGZyb20gJ0Bza3l1eC9jb3JlJztcbmltcG9ydCB7IFNreUlucHV0Qm94SG9zdFNlcnZpY2UgfSBmcm9tICdAc2t5dXgvZm9ybXMnO1xuXG5pbXBvcnQge1xuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBTdWJzY3JpcHRpb24sXG4gIGZyb20sXG4gIGZyb21FdmVudCBhcyBvYnNlcnZhYmxlRnJvbUV2ZW50LFxuICBvZixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIG1hcCwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZURpYWNyaXRpY3MgfSBmcm9tICcuLi9zaGFyZWQvc2t5LWxvb2t1cC1zdHJpbmctdXRpbHMnO1xuXG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVBZGFwdGVyU2VydmljZSB9IGZyb20gJy4vYXV0b2NvbXBsZXRlLWFkYXB0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBza3lBdXRvY29tcGxldGVEZWZhdWx0U2VhcmNoRnVuY3Rpb24gfSBmcm9tICcuL2F1dG9jb21wbGV0ZS1kZWZhdWx0LXNlYXJjaC1mdW5jdGlvbic7XG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4vYXV0b2NvbXBsZXRlLWlucHV0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVNZXNzYWdlIH0gZnJvbSAnLi90eXBlcy9hdXRvY29tcGxldGUtbWVzc2FnZSc7XG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVNZXNzYWdlVHlwZSB9IGZyb20gJy4vdHlwZXMvYXV0b2NvbXBsZXRlLW1lc3NhZ2UtdHlwZSc7XG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVTZWFyY2hBc3luY0FyZ3MgfSBmcm9tICcuL3R5cGVzL2F1dG9jb21wbGV0ZS1zZWFyY2gtYXN5bmMtYXJncyc7XG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVTZWFyY2hBc3luY1Jlc3VsdCB9IGZyb20gJy4vdHlwZXMvYXV0b2NvbXBsZXRlLXNlYXJjaC1hc3luYy1yZXN1bHQnO1xuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlU2VhcmNoRnVuY3Rpb24gfSBmcm9tICcuL3R5cGVzL2F1dG9jb21wbGV0ZS1zZWFyY2gtZnVuY3Rpb24nO1xuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlU2VhcmNoRnVuY3Rpb25GaWx0ZXIgfSBmcm9tICcuL3R5cGVzL2F1dG9jb21wbGV0ZS1zZWFyY2gtZnVuY3Rpb24tZmlsdGVyJztcbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZVNlbGVjdGlvbkNoYW5nZSB9IGZyb20gJy4vdHlwZXMvYXV0b2NvbXBsZXRlLXNlbGVjdGlvbi1jaGFuZ2UnO1xuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlU2hvd01vcmVBcmdzIH0gZnJvbSAnLi90eXBlcy9hdXRvY29tcGxldGUtc2hvdy1tb3JlLWFyZ3MnO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5pbnRlcmZhY2UgU2t5QXV0b2NvbXBsZXRlU2VhcmNoUmVzdWx0IHtcbiAgZWxlbWVudElkOiBzdHJpbmc7XG4gIGRhdGE6IGFueTtcbn1cblxubGV0IHVuaXF1ZUlkID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LWF1dG9jb21wbGV0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hdXRvY29tcGxldGUuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbU2t5QXV0b2NvbXBsZXRlQWRhcHRlclNlcnZpY2VdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2t5QXV0b2NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgLy8jcmVnaW9uIHB1YmxpY19hcGlcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBIVE1MIGVsZW1lbnQgSUQgKHdpdGhvdXQgdGhlIGxlYWRpbmcgYCNgKSBvZiB0aGUgZWxlbWVudCB0aGF0IGxhYmVsc1xuICAgKiB0aGUgYXV0b2NvbXBsZXRlIHRleHQgaW5wdXQuIFRoaXMgc2V0cyB0aGUgaW5wdXQncyBgYXJpYS1sYWJlbGxlZGJ5YCBhdHRyaWJ1dGVcbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcmlhTGFiZWxsZWRCeTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBzdGF0aWMgZGF0YSBzb3VyY2UgZm9yIHRoZSBhdXRvY29tcGxldGUgY29tcG9uZW50IHRvIHNlYXJjaFxuICAgKiB3aGVuIHVzZXJzIGVudGVyIHRleHQuIEZvciBhIGR5bmFtaWMgZGF0YSBzb3VyY2Ugc3VjaCBhcyBhbiBhcnJheSB0aGF0XG4gICAqIGNoYW5nZXMgZHVlIHRvIHNlcnZlciBjYWxscywgdXNlIGBzZWFyY2hgIG9yIGBzZWFyY2hBc3luY2AgaW5zdGVhZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGF0YSh2YWx1ZTogYW55W10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfZGF0YSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy4jX2RhdGEgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIGhvdyBtYW55IG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBzZWFyY2hpbmcgd2hpbGUgdXNlcnNcbiAgICogZW50ZXIgdGV4dCBpbiB0aGUgYXV0b2NvbXBsZXRlIGZpZWxkLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRlYm91bmNlVGltZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX2RlYm91bmNlVGltZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBkZWJvdW5jZVRpbWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy4jX2RlYm91bmNlVGltZSB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhbiBvYmplY3QgcHJvcGVydHkgdG8gZGlzcGxheSBpbiB0aGUgdGV4dCBpbnB1dCBhZnRlciB1c2Vyc1xuICAgKiBzZWxlY3QgYW4gaXRlbSBpbiB0aGUgZHJvcGRvd24gbGlzdC5cbiAgICogQGRlZmF1bHQgXCJuYW1lXCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGVzY3JpcHRvclByb3BlcnR5KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfZGVzY3JpcHRvclByb3BlcnR5ID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0b3JQcm9wZXJ0eSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiNfZGVzY3JpcHRvclByb3BlcnR5IHx8ICduYW1lJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gZGlzcGxheSBhIGJ1dHRvbiBpbiB0aGUgZHJvcGRvd24gdGhhdCBvcGVucyBhIHBpY2tlciB3aGVyZSB1c2VycyBjYW4gdmlldyBhbGwgb3B0aW9ucy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlbmFibGVTaG93TW9yZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYW4gb2JzZXJ2YWJsZSBvZiBgU2t5QXV0b2NvbXBsZXRlTWVzc2FnZWAgdGhhdCBjYW4gY2xvc2UgdGhlIGRyb3Bkb3duLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbWVzc2FnZVN0cmVhbSh2YWx1ZTogU3ViamVjdDxTa3lBdXRvY29tcGxldGVNZXNzYWdlPiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19tZXNzYWdlU3RyZWFtID0gdmFsdWUgPz8gbmV3IFN1YmplY3Q8U2t5QXV0b2NvbXBsZXRlTWVzc2FnZT4oKTtcbiAgICB0aGlzLiNpbml0TWVzc2FnZVN0cmVhbSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBtZXNzYWdlU3RyZWFtKCk6IFN1YmplY3Q8U2t5QXV0b2NvbXBsZXRlTWVzc2FnZT4ge1xuICAgIHJldHVybiB0aGlzLiNfbWVzc2FnZVN0cmVhbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB3cmFwcGVyQ2xhc3M6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBvYmplY3QgcHJvcGVydGllcyB0byBzZWFyY2guXG4gICAqIEBkZWZhdWx0IFtcIm5hbWVcIl1cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgcHJvcGVydGllc1RvU2VhcmNoKHZhbHVlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19wcm9wZXJ0aWVzVG9TZWFyY2ggPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcHJvcGVydGllc1RvU2VhcmNoKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy4jX3Byb3BlcnRpZXNUb1NlYXJjaCB8fCBbJ25hbWUnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBmdW5jdGlvbiB0byBkeW5hbWljYWxseSBtYW5hZ2UgdGhlIGRhdGEgc291cmNlIHdoZW4gdXNlcnNcbiAgICogY2hhbmdlIHRoZSB0ZXh0IGluIHRoZSBhdXRvY29tcGxldGUgZmllbGQuIFRoZSBzZWFyY2ggZnVuY3Rpb24gbXVzdCByZXR1cm5cbiAgICogYW4gYXJyYXkgb3IgYSBwcm9taXNlIG9mIGFuIGFycmF5LiBUaGUgYHNlYXJjaGAgcHJvcGVydHkgaXMgcGFydGljdWxhcmx5XG4gICAqIHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHNvdXJjZSBkb2VzIG5vdCBsaXZlIGluIHRoZSBzb3VyY2UgY29kZS4gSWYgdGhlXG4gICAqIHNlYXJjaCByZXF1aXJlcyBjYWxsaW5nIGEgcmVtb3RlIGRhdGEgc291cmNlLCB1c2UgYHNlYXJjaEFzeW5jYCBpbnN0ZWFkIG9mXG4gICAqIGBzZWFyY2hgLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWFyY2godmFsdWU6IFNreUF1dG9jb21wbGV0ZVNlYXJjaEZ1bmN0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX3NlYXJjaCA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWFyY2goKTogU2t5QXV0b2NvbXBsZXRlU2VhcmNoRnVuY3Rpb24ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLiNfc2VhcmNoIHx8XG4gICAgICBza3lBdXRvY29tcGxldGVEZWZhdWx0U2VhcmNoRnVuY3Rpb24oe1xuICAgICAgICBwcm9wZXJ0aWVzVG9TZWFyY2g6IHRoaXMucHJvcGVydGllc1RvU2VhcmNoLFxuICAgICAgICBzZWFyY2hGaWx0ZXJzOiB0aGlzLnNlYXJjaEZpbHRlcnMsXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIGEgdGVtcGxhdGUgdG8gZm9ybWF0IGVhY2ggc2VhcmNoIHJlc3VsdCBpbiB0aGUgZHJvcGRvd24gbGlzdC5cbiAgICogVGhlIGF1dG9jb21wbGV0ZSBjb21wb25lbnQgaW5qZWN0cyBzZWFyY2ggcmVzdWx0IHZhbHVlcyBpbnRvIHRoZSB0ZW1wbGF0ZVxuICAgKiBhcyBgaXRlbWAgdmFyaWFibGVzIHRoYXQgcmVmZXJlbmNlIGFsbCBvZiB0aGUgb2JqZWN0IHByb3BlcnRpZXMgb2YgdGhlIHNlYXJjaCByZXN1bHRzLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWFyY2hSZXN1bHRUZW1wbGF0ZSh2YWx1ZTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfc2VhcmNoUmVzdWx0VGVtcGxhdGUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VhcmNoUmVzdWx0VGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLiNfc2VhcmNoUmVzdWx0VGVtcGxhdGUgfHwgdGhpcy5kZWZhdWx0U2VhcmNoUmVzdWx0VGVtcGxhdGU7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgdXNlcnMgbXVzdCBlbnRlciBiZWZvcmVcbiAgICogdGhlIGF1dG9jb21wbGV0ZSBjb21wb25lbnQgc2VhcmNoZXMgdGhlIGRhdGEgc291cmNlIGFuZCBkaXNwbGF5cyBzZWFyY2hcbiAgICogcmVzdWx0cyBpbiB0aGUgZHJvcGRvd24gbGlzdC5cbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWFyY2hUZXh0TWluaW11bUNoYXJhY3RlcnModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19zZWFyY2hUZXh0TWluaW11bUNoYXJhY3RlcnMgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VhcmNoVGV4dE1pbmltdW1DaGFyYWN0ZXJzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuI19zZWFyY2hUZXh0TWluaW11bUNoYXJhY3RlcnMgJiZcbiAgICAgIHRoaXMuI19zZWFyY2hUZXh0TWluaW11bUNoYXJhY3RlcnMgPiAwXG4gICAgICA/IHRoaXMuI19zZWFyY2hUZXh0TWluaW11bUNoYXJhY3RlcnNcbiAgICAgIDogMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYW4gYXJyYXkgb2YgZnVuY3Rpb25zIHRvIGNhbGwgYWdhaW5zdCBlYWNoIHNlYXJjaCByZXN1bHQgaW4gb3JkZXJcbiAgICogdG8gZmlsdGVyIHRoZSBzZWFyY2ggcmVzdWx0cyB3aGVuIHVzaW5nIHRoZSBkZWZhdWx0IHNlYXJjaCBmdW5jdGlvbi4gV2hlblxuICAgKiB1c2luZyB0aGUgYHNlYXJjaGAgcHJvcGVydHkgdG8gc3BlY2lmeSBhIGN1c3RvbSBzZWFyY2ggZnVuY3Rpb24sIHlvdSBtdXN0XG4gICAqIG1hbnVhbGx5IGFwcGx5IGZpbHRlcnMgaW5zaWRlIHRoYXQgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBtdXN0IHJldHVybiBgdHJ1ZWBcbiAgICogb3IgYGZhbHNlYCBmb3IgZWFjaCByZXN1bHQgdG8gaW5kaWNhdGUgd2hldGhlciB0byBkaXNwbGF5IGl0IGluIHRoZSBkcm9wZG93biBsaXN0LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNlYXJjaEZpbHRlcnM6IFNreUF1dG9jb21wbGV0ZVNlYXJjaEZ1bmN0aW9uRmlsdGVyW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VhcmNoIHJlc3VsdHMgdG8gZGlzcGxheSBpbiB0aGUgZHJvcGRvd24gbGlzdC5cbiAgICogQnkgZGVmYXVsdCwgdGhlIGNvbXBvbmVudCBkaXNwbGF5cyBhbGwgbWF0Y2hpbmcgcmVzdWx0cy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VhcmNoUmVzdWx0c0xpbWl0KHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfc2VhcmNoUmVzdWx0c0xpbWl0ID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlYXJjaFJlc3VsdHNMaW1pdCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLiNfc2VhcmNoUmVzdWx0c0xpbWl0ICYmIHRoaXMuI19zZWFyY2hSZXN1bHRzTGltaXQgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy4jX3NlYXJjaFJlc3VsdHNMaW1pdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlU2hvd01vcmUgPyA1IDogdGhpcy4jX3NlYXJjaFJlc3VsdHNMaW1pdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGRpc3BsYXkgYSBidXR0b24gdGhhdCBsZXRzIHVzZXJzIGFkZCBvcHRpb25zIHRvIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93QWRkQnV0dG9uID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgdGV4dCB0byBkaXNwbGF5IHdoZW4gbm8gc2VhcmNoIHJlc3VsdHMgYXJlIGZvdW5kLlxuICAgKiBAZGVmYXVsdCBcIk5vIG1hdGNoZXMgZm91bmRcIlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIG5vUmVzdWx0c0ZvdW5kVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQWxsb3dzIGFzeW5jIHNlYXJjaCB0byBiZSBkaXNhYmxlZCBldmVuIHdoZW4gYSBsaXN0ZW5lciBpcyBzcGVjaWZpZWQgZm9yXG4gICAqIHRoZSBgc2VhcmNoQXN5bmNgIG91dHB1dC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZWFyY2hBc3luY0Rpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIHNlbGVjdCB0aGUgYnV0dG9uIHRvIGFkZCBvcHRpb25zIHRvIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgYWRkQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIHNlbGVjdCB0aGUgYnV0dG9uIHRvIHZpZXcgYWxsIG9wdGlvbnMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHNob3dNb3JlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFNreUF1dG9jb21wbGV0ZVNob3dNb3JlQXJncz4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB1c2VycyBzZWxlY3QgaXRlbXMgaW4gdGhlIGRyb3Bkb3duIGxpc3QuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5QXV0b2NvbXBsZXRlU2VsZWN0aW9uQ2hhbmdlPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIGVudGVyIG5ldyBzZWFyY2ggaW5mb3JtYXRpb24gYW5kIGFsbG93cyByZXN1bHRzIHRvIGJlXG4gICAqIHJldHVybmVkIHZpYSBhbiBvYnNlcnZhYmxlLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWFyY2hBc3luYyA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5QXV0b2NvbXBsZXRlU2VhcmNoQXN5bmNBcmdzPigpO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiB0ZW1wbGF0ZV9wcm9wZXJ0aWVzXG5cbiAgcHVibGljIGdldCBzZWFyY2hSZXN1bHRzKCk6IFNreUF1dG9jb21wbGV0ZVNlYXJjaFJlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy4jX3NlYXJjaFJlc3VsdHMgfHwgW107XG4gIH1cblxuICBwdWJsaWMgc2V0IHNlYXJjaFJlc3VsdHModmFsdWU6IFNreUF1dG9jb21wbGV0ZVNlYXJjaFJlc3VsdFtdKSB7XG4gICAgdGhpcy4jX3NlYXJjaFJlc3VsdHMgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGlnaGxpZ2h0VGV4dCgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuI19oaWdobGlnaHRUZXh0IHx8IFtdO1xuICB9XG5cbiAgcHVibGljIHNldCBoaWdobGlnaHRUZXh0KHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuI19oaWdobGlnaHRUZXh0ID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgaXNPcGVuID0gZmFsc2U7XG5cbiAgcHVibGljIHJlc3VsdHNMaXN0SWQ6IHN0cmluZztcblxuICBwdWJsaWMgcmVzdWx0c1dyYXBwZXJJZDogc3RyaW5nO1xuXG4gIHB1YmxpYyBzZWFyY2hUZXh0ID0gJyc7XG5cbiAgcHVibGljIGdldCBzaG93QWN0aW9uc0FyZWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FkZEJ1dHRvbiB8fCB0aGlzLmVuYWJsZVNob3dNb3JlO1xuICB9XG5cbiAgcHVibGljIGlzU2VhcmNoaW5nQXN5bmMgPSBmYWxzZTtcblxuICBwdWJsaWMgc2VhcmNoUmVzdWx0c0NvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgQFZpZXdDaGlsZCgnZGVmYXVsdFNlYXJjaFJlc3VsdFRlbXBsYXRlJywge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICAgIHN0YXRpYzogdHJ1ZSxcbiAgfSlcbiAgcHJpdmF0ZSBkZWZhdWx0U2VhcmNoUmVzdWx0VGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKFNreUF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlKVxuICBwcml2YXRlIHNldCBpbnB1dERpcmVjdGl2ZShcbiAgICBkaXJlY3RpdmU6IFNreUF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIGlmICghZGlyZWN0aXZlKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgW1xuICAgICAgICAgICdUaGUgU2t5QXV0b2NvbXBsZXRlQ29tcG9uZW50IHJlcXVpcmVzIGEgQ29udGVudENoaWxkIGlucHV0IG9yJyxcbiAgICAgICAgICAndGV4dGFyZWEgYm91bmQgd2l0aCB0aGUgU2t5QXV0b2NvbXBsZXRlIGRpcmVjdGl2ZS4gRm9yIGV4YW1wbGU6JyxcbiAgICAgICAgICAnYDxpbnB1dCB0eXBlPVwidGV4dFwiIHNreUF1dG9jb21wbGV0ZT5gLicsXG4gICAgICAgIF0uam9pbignICcpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLiNfaW5wdXREaXJlY3RpdmUgIT09IGRpcmVjdGl2ZSkge1xuICAgICAgLy8gVW5zdWJzY3JpYmUgZnJvbSBvbGQgc3Vic2NyaXB0aW9ucyBvbiBhbnkgcHJldmlvdXMgaW5wdXQgZGlyZWN0aXZlXG4gICAgICB0aGlzLiNpbnB1dERpcmVjdGl2ZVVuc3Vic2NyaWJlLm5leHQoKTtcblxuICAgICAgdGhpcy4jX2lucHV0RGlyZWN0aXZlID0gZGlyZWN0aXZlO1xuXG4gICAgICB0aGlzLiNfaW5wdXREaXJlY3RpdmUuZGlzcGxheVdpdGggPSB0aGlzLmRlc2NyaXB0b3JQcm9wZXJ0eTtcblxuICAgICAgdGhpcy4jX2lucHV0RGlyZWN0aXZlLnRleHRDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLiNpbnB1dERpcmVjdGl2ZVVuc3Vic2NyaWJlKSxcbiAgICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWUpLFxuICAgICAgICAgIHN3aXRjaE1hcCgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzU2VhcmNoaW5nQXN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIG9mKGNoYW5nZSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChjaGFuZ2UpID0+IHtcbiAgICAgICAgICB0aGlzLiNzZWFyY2hUZXh0Q2hhbmdlZChjaGFuZ2UudmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgdGhpcy4jX2lucHV0RGlyZWN0aXZlLmJsdXJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI2lucHV0RGlyZWN0aXZlVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBkaXJlY3RpdmUucmVzdG9yZUlucHV0VGV4dFZhbHVlVG9QcmV2aW91c1N0YXRlKCk7XG4gICAgICAgICAgdGhpcy4jY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgIGRpcmVjdGl2ZS5vblRvdWNoZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuI19pbnB1dERpcmVjdGl2ZS5mb2N1c1xuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jaW5wdXREaXJlY3RpdmVVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnNob3dBY3Rpb25zQXJlYSkge1xuICAgICAgICAgICAgdGhpcy4jb3BlbkRyb3Bkb3duKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCBpbnB1dERpcmVjdGl2ZSgpOiBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSB7XG4gICAgcmV0dXJuIHRoaXMuI19pbnB1dERpcmVjdGl2ZSE7XG4gIH1cblxuICBAVmlld0NoaWxkKCdyZXN1bHRzVGVtcGxhdGVSZWYnLCB7XG4gICAgcmVhZDogVGVtcGxhdGVSZWYsXG4gIH0pXG4gIHByaXZhdGUgcmVzdWx0c1RlbXBsYXRlUmVmITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQFZpZXdDaGlsZCgncmVzdWx0c1JlZicsIHtcbiAgICByZWFkOiBFbGVtZW50UmVmLFxuICB9KVxuICBwcml2YXRlIHNldCByZXN1bHRzUmVmKHZhbHVlOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLiNfcmVzdWx0c1JlZiA9IHZhbHVlO1xuICAgICAgdGhpcy4jZGVzdHJveUFmZml4ZXIoKTtcbiAgICAgIHRoaXMuI2NyZWF0ZUFmZml4ZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCByZXN1bHRzUmVmKCk6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNfcmVzdWx0c1JlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRleCB0aGF0IGluZGljYXRlcyB3aGljaCBkZXNjZW5kYW50IG9mIHRoZSBvdmVybGF5IGN1cnJlbnRseSBoYXMgZm9jdXMuXG4gICAqL1xuICAjYWN0aXZlRWxlbWVudEluZGV4ID0gLTE7XG5cbiAgI2FkYXB0ZXJTZXJ2aWNlOiBTa3lBdXRvY29tcGxldGVBZGFwdGVyU2VydmljZTtcblxuICAjYWZmaXhlcjogU2t5QWZmaXhlciB8IHVuZGVmaW5lZDtcblxuICAjYWZmaXhTZXJ2aWNlOiBTa3lBZmZpeFNlcnZpY2U7XG5cbiAgI2NoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZjtcblxuICAjZWxlbWVudFJlZjogRWxlbWVudFJlZjtcblxuICAjaW5wdXRCb3hIb3N0U3ZjOiBTa3lJbnB1dEJveEhvc3RTZXJ2aWNlIHwgdW5kZWZpbmVkO1xuXG4gICNpbnB1dERpcmVjdGl2ZVVuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAjbWVzc2FnZVN0cmVhbVN1YjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gICNuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAjb3ZlcmxheTogU2t5T3ZlcmxheUluc3RhbmNlIHwgdW5kZWZpbmVkO1xuXG4gICNvdmVybGF5U2VydmljZTogU2t5T3ZlcmxheVNlcnZpY2U7XG5cbiAgLyoqXG4gICAqIEVsZW1lbnRzIHdpdGhpbiB0aGUgYXV0b2NvbXBsZXRlIGRyb3Bkb3duIHRoYXQgYXJlIGZvY3VzYWJsZS5cbiAgICogVGhlc2UgYXJlIHR5cGljYWxseSB0aGUgc2VhcmNoIHJlc3VsdHMgYW5kIGFjdGlvbiBidXR0b25zLCBidXQgY291bGQgYWxzbyBiZVxuICAgKiBlbGVtZW50cyBwcm92aWRlZCBpbiB0aGUgY29uc3VtZXIncyBvd24gdGVtcGxhdGUuXG4gICAqL1xuICAjb3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzOiBIVE1MRWxlbWVudFtdID0gW107XG5cbiAgI2N1cnJlbnRTZWFyY2hTdWI6IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICAjX2RhdGE6IGFueVtdIHwgdW5kZWZpbmVkO1xuXG4gICNfZGVib3VuY2VUaW1lOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgI19kZXNjcmlwdG9yUHJvcGVydHk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAjX2hpZ2hsaWdodFRleHQ6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gICNfaW5wdXREaXJlY3RpdmU6IFNreUF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlIHwgdW5kZWZpbmVkO1xuXG4gICNfbWVzc2FnZVN0cmVhbSA9IG5ldyBTdWJqZWN0PFNreUF1dG9jb21wbGV0ZU1lc3NhZ2U+KCk7XG5cbiAgI19wcm9wZXJ0aWVzVG9TZWFyY2g6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gICNfcmVzdWx0c1JlZjogRWxlbWVudFJlZiB8IHVuZGVmaW5lZDtcblxuICAjX3NlYXJjaDogU2t5QXV0b2NvbXBsZXRlU2VhcmNoRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG5cbiAgI19zZWFyY2hSZXN1bHRzOiBTa3lBdXRvY29tcGxldGVTZWFyY2hSZXN1bHRbXSB8IHVuZGVmaW5lZDtcblxuICAjX3NlYXJjaFJlc3VsdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICAjX3NlYXJjaFJlc3VsdHNMaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICNfc2VhcmNoVGV4dE1pbmltdW1DaGFyYWN0ZXJzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgYWZmaXhTZXJ2aWNlOiBTa3lBZmZpeFNlcnZpY2UsXG4gICAgYWRhcHRlclNlcnZpY2U6IFNreUF1dG9jb21wbGV0ZUFkYXB0ZXJTZXJ2aWNlLFxuICAgIG92ZXJsYXlTZXJ2aWNlOiBTa3lPdmVybGF5U2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBpbnB1dEJveEhvc3RTdmM/OiBTa3lJbnB1dEJveEhvc3RTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yID0gY2hhbmdlRGV0ZWN0b3I7XG4gICAgdGhpcy4jZWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7XG4gICAgdGhpcy4jYWZmaXhTZXJ2aWNlID0gYWZmaXhTZXJ2aWNlO1xuICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlID0gYWRhcHRlclNlcnZpY2U7XG4gICAgdGhpcy4jb3ZlcmxheVNlcnZpY2UgPSBvdmVybGF5U2VydmljZTtcbiAgICB0aGlzLiNpbnB1dEJveEhvc3RTdmMgPSBpbnB1dEJveEhvc3RTdmM7XG5cbiAgICBjb25zdCBpZCA9ICsrdW5pcXVlSWQ7XG4gICAgdGhpcy5yZXN1bHRzTGlzdElkID0gYHNreS1hdXRvY29tcGxldGUtbGlzdC0ke2lkfWA7XG4gICAgdGhpcy5yZXN1bHRzV3JhcHBlcklkID0gYHNreS1hdXRvY29tcGxldGUtd3JhcHBlci0ke2lkfWA7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuI2FkZElucHV0RXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLiNjYW5jZWxDdXJyZW50U2VhcmNoKCk7XG4gICAgdGhpcy4jaW5wdXREaXJlY3RpdmVVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy4jaW5wdXREaXJlY3RpdmVVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB0aGlzLiNkZXN0cm95QWZmaXhlcigpO1xuICAgIHRoaXMuI2Rlc3Ryb3lPdmVybGF5KCk7XG4gIH1cblxuICBwdWJsaWMgYWRkQnV0dG9uQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZENsaWNrLmVtaXQoKTtcbiAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnJlc3RvcmVJbnB1dFRleHRWYWx1ZVRvUHJldmlvdXNTdGF0ZSgpO1xuICAgIHRoaXMuI2Nsb3NlRHJvcGRvd24oKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgLyogU2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZXZlbnQua2V5KSB7XG4gICAgICBjb25zdCBrZXkgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLiNnZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50SWQgPSBhY3RpdmVFbGVtZW50Py5pZDtcbiAgICAgIGNvbnN0IHRhcmdldElzU2VhcmNoUmVzdWx0ID0gdGhpcy5zZWFyY2hSZXN1bHRzLmZpbmQoXG4gICAgICAgIChyKSA9PiByLmVsZW1lbnRJZCA9PT0gYWN0aXZlRWxlbWVudElkXG4gICAgICApO1xuXG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlICdlbnRlcic6XG4gICAgICAgICAgaWYgKHRhcmdldElzU2VhcmNoUmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLiNzZWxlY3RTZWFyY2hSZXN1bHRCeUlkKGFjdGl2ZUVsZW1lbnRJZCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5zaG93QWN0aW9uc0FyZWEpIHtcbiAgICAgICAgICAgICAgdGhpcy4jY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy4jcmVzZXRTZWFyY2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgYWN0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZWRvd24nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd0YWInOlxuICAgICAgICAgIGlmICh0YXJnZXRJc1NlYXJjaFJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy4jc2VsZWN0U2VhcmNoUmVzdWx0QnlJZChhY3RpdmVFbGVtZW50SWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnJlc3RvcmVJbnB1dFRleHRWYWx1ZVRvUHJldmlvdXNTdGF0ZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuI2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdlc2NhcGUnOlxuICAgICAgICAgIHRoaXMuI2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdhcnJvd2Rvd24nOlxuICAgICAgICBjYXNlICdkb3duJzpcbiAgICAgICAgICB0aGlzLiNyZW1vdmVGb2N1c2VkQ2xhc3MoKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPT09XG4gICAgICAgICAgICAgIHRoaXMuI292ZXJsYXlGb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxIHx8XG4gICAgICAgICAgICB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPT09IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPSB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggKyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLiNhZGRGb2N1c2VkQ2xhc3MoKTtcbiAgICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Fycm93dXAnOlxuICAgICAgICBjYXNlICd1cCc6XG4gICAgICAgICAgdGhpcy4jcmVtb3ZlRm9jdXNlZENsYXNzKCk7XG4gICAgICAgICAgaWYgKHRoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPVxuICAgICAgICAgICAgICB0aGlzLiNvdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jYWN0aXZlRWxlbWVudEluZGV4ID0gdGhpcy4jYWN0aXZlRWxlbWVudEluZGV4IC0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy4jYWRkRm9jdXNlZENsYXNzKCk7XG4gICAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbW9yZUJ1dHRvbkNsaWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TW9yZUNsaWNrLmVtaXQoeyBpbnB1dFZhbHVlOiB0aGlzLnNlYXJjaFRleHQgfSk7XG4gICAgdGhpcy5pbnB1dERpcmVjdGl2ZS5yZXN0b3JlSW5wdXRUZXh0VmFsdWVUb1ByZXZpb3VzU3RhdGUoKTtcbiAgICB0aGlzLiNjbG9zZURyb3Bkb3duKCk7XG4gIH1cblxuICBwdWJsaWMgb25SZXN1bHRNb3VzZURvd24oaWQ6IHN0cmluZywgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLiNzZWxlY3RTZWFyY2hSZXN1bHRCeUlkKGlkKTtcblxuICAgIGlmICghdGhpcy5zaG93QWN0aW9uc0FyZWEpIHtcbiAgICAgIHRoaXMuI2Nsb3NlRHJvcGRvd24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jcmVzZXRTZWFyY2goKTtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHVibGljIG9uUmVzdWx0TW91c2VNb3ZlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoaWQgIT09IHRoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleCkge1xuICAgICAgdGhpcy4jcmVtb3ZlRm9jdXNlZENsYXNzKCk7XG4gICAgICB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPSBpZDtcbiAgICAgIHRoaXMuI2FkZEZvY3VzZWRDbGFzcygpO1xuICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGlzRWxlbWVudEZvY3VzZWQocmVmOiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZWYgPT09IHRoaXMuI292ZXJsYXlGb2N1c2FibGVFbGVtZW50c1t0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXhdO1xuICB9XG5cbiAgI3NlYXJjaFRleHRDaGFuZ2VkKHNlYXJjaFRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IGlzRW1wdHkgPVxuICAgICAgIXNlYXJjaFRleHQgfHwgIXNlYXJjaFRleHQudHJpbSgpIHx8IHNlYXJjaFRleHQubWF0Y2goL15cXHMrJC8pO1xuXG4gICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgIC8vIEVtaXQgc2VsZWN0aW9uQ2hhbmdlIGlmIHZhbHVlIGhhcyBiZWVuIGNsZWFyZWQuXG4gICAgICBpZiAodGhpcy5pbnB1dERpcmVjdGl2ZS52YWx1ZSkge1xuICAgICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHtcbiAgICAgICAgICBzZWxlY3RlZEl0ZW06IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5zaG93QWN0aW9uc0FyZWEpIHtcbiAgICAgICAgdGhpcy4jY2xvc2VEcm9wZG93bigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jcmVzZXRTZWFyY2goKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc1NlYXJjaGluZ0FzeW5jID0gZmFsc2U7XG4gICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzTG9uZ0Vub3VnaCA9IHNlYXJjaFRleHQubGVuZ3RoID49IHRoaXMuc2VhcmNoVGV4dE1pbmltdW1DaGFyYWN0ZXJzO1xuICAgIGNvbnN0IGlzRGlmZmVyZW50ID0gc2VhcmNoVGV4dCAhPT0gdGhpcy5zZWFyY2hUZXh0O1xuXG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gc2VhcmNoVGV4dC50cmltKCk7XG5cbiAgICBpZiAoaXNMb25nRW5vdWdoICYmIGlzRGlmZmVyZW50KSB7XG4gICAgICB0aGlzLiNjYW5jZWxDdXJyZW50U2VhcmNoKCk7XG5cbiAgICAgIHRoaXMuI2N1cnJlbnRTZWFyY2hTdWIgPSB0aGlzLiNwZXJmb3JtU2VhcmNoKClcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbXMgPSByZXN1bHQuaXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtICYmIHRoaXMuZGVzY3JpcHRvclByb3BlcnR5IGluIGl0ZW07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLmlzU2VhcmNoaW5nQXN5bmMgPSBmYWxzZTtcblxuICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0cyA9IGl0ZW1zLm1hcCgociwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBTa3lBdXRvY29tcGxldGVTZWFyY2hSZXN1bHQgPSB7XG4gICAgICAgICAgICAgIGVsZW1lbnRJZDogYCR7dGhpcy5yZXN1bHRzTGlzdElkfS1pdGVtLSR7aX1gLFxuICAgICAgICAgICAgICBkYXRhOiByLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNDb3VudCA9IHJlc3VsdC50b3RhbENvdW50O1xuXG4gICAgICAgICAgdGhpcy5oaWdobGlnaHRUZXh0ID0gdGhpcy4jZ2V0SGlnaGxpZ2h0VGV4dCh0aGlzLnNlYXJjaFRleHQpO1xuICAgICAgICAgIHRoaXMuI3JlbW92ZUZvY3VzZWRDbGFzcygpO1xuICAgICAgICAgIHRoaXMuI3JlbW92ZUFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hSZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleCA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleCA9IC0xO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICAvLyBMZXQgdGhlIHJlc3VsdHMgcG9wdWxhdGUgaW4gdGhlIERPTSBiZWZvcmUgcmVjYWxjdWxhdGluZyBwbGFjZW1lbnQuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy4jYWZmaXhlciEucmVhZmZpeCgpO1xuICAgICAgICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIHRoaXMuI2luaXRPdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNvcGVuRHJvcGRvd24oKTtcbiAgICAgICAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNTZWFyY2hpbmdBc3luYyA9IGZhbHNlO1xuICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgI3BlcmZvcm1TZWFyY2goKTogT2JzZXJ2YWJsZTxTa3lBdXRvY29tcGxldGVTZWFyY2hBc3luY1Jlc3VsdD4ge1xuICAgIGlmICghdGhpcy5zZWFyY2hBc3luY0Rpc2FibGVkICYmIHRoaXMuc2VhcmNoQXN5bmMub2JzZXJ2ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNlYXJjaEFzeW5jQXJnczogU2t5QXV0b2NvbXBsZXRlU2VhcmNoQXN5bmNBcmdzID0ge1xuICAgICAgICBkaXNwbGF5VHlwZTogJ3BvcG92ZXInLFxuICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgIHNlYXJjaFRleHQ6IHRoaXMuc2VhcmNoVGV4dCxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc2VhcmNoQXN5bmMuZW1pdChzZWFyY2hBc3luY0FyZ3MpO1xuXG4gICAgICByZXR1cm4gc2VhcmNoQXN5bmNBcmdzLnJlc3VsdCE7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWFyY2godGhpcy5zZWFyY2hUZXh0LCB0aGlzLmRhdGEpO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICByZXR1cm4gb2Yoe1xuICAgICAgICBpdGVtczogcmVzdWx0LFxuICAgICAgICB0b3RhbENvdW50OiByZXN1bHQubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb20ocmVzdWx0KS5waXBlKFxuICAgICAgbWFwKChpdGVtcykgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgIHRvdGFsQ291bnQ6IGl0ZW1zLmxlbmd0aCxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gICNjYW5jZWxDdXJyZW50U2VhcmNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNjdXJyZW50U2VhcmNoU3ViKSB7XG4gICAgICB0aGlzLiNjdXJyZW50U2VhcmNoU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLiNjdXJyZW50U2VhcmNoU3ViID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXh0IHRvIGhpZ2hsaWdodCBiYXNlZCBvbiBleGFjdCBtYXRjaGVzLCBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoZXMsIGFuZCBtYXRjaGVzIGZvciBjb3JyZXNwb25kaW5nIGRpYWNyaXRpY2FsIGNoYXJhY3RlcnMgKGEgd2lsbCBtYXRjaCDDoCkuXG4gICAqL1xuICAjZ2V0SGlnaGxpZ2h0VGV4dChzZWFyY2hUZXh0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaFRleHQgPSBub3JtYWxpemVEaWFjcml0aWNzKHNlYXJjaFRleHQpXG4gICAgICAudG9Mb2NhbGVVcHBlckNhc2UoKVxuICAgICAgLnRyaW0oKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWRTZWFyY2hUZXh0KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgbGV0IG1hdGNoZXNUb0hpZ2hsaWdodDogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbiA9IHRoaXMuc2VhcmNoUmVzdWx0cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZWFyY2hSZXN1bHRzW2ldLmRhdGFbdGhpcy5kZXNjcmlwdG9yUHJvcGVydHldXG4gICAgICAgIC50b1N0cmluZygpXG4gICAgICAgIC50b0xvY2FsZVVwcGVyQ2FzZSgpIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRhVmFsdWUgPSBub3JtYWxpemVEaWFjcml0aWNzKHZhbHVlKTtcblxuICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICBsZXQgaW5kZXg6IG51bWJlcjtcbiAgICAgIHdoaWxlIChcbiAgICAgICAgKGluZGV4ID0gbm9ybWFsaXplZERhdGFWYWx1ZS5pbmRleE9mKG5vcm1hbGl6ZWRTZWFyY2hUZXh0LCBvZmZzZXQpKSA+IC0xXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZFN0cmluZyA9IHZhbHVlLnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaFRleHQubGVuZ3RoKTtcbiAgICAgICAgb2Zmc2V0ID0gaW5kZXggKyBzZWFyY2hUZXh0Lmxlbmd0aDtcbiAgICAgICAgbWF0Y2hlc1RvSGlnaGxpZ2h0ID0gbWF0Y2hlc1RvSGlnaGxpZ2h0LmNvbmNhdChtYXRjaGVkU3RyaW5nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW55IGR1cGxpY2F0ZXMgZnJvbSB0aGUgYXJyYXkuXG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KG1hdGNoZXNUb0hpZ2hsaWdodCldO1xuICB9XG5cbiAgI3NlbGVjdFNlYXJjaFJlc3VsdEJ5SWQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VhcmNoUmVzdWx0cy5maW5kKChyKSA9PiByLmVsZW1lbnRJZCA9PT0gaWQpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgY29uc3QgZGF0YSA9IHJlc3VsdC5kYXRhO1xuICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gZGF0YVt0aGlzLmRlc2NyaXB0b3JQcm9wZXJ0eV07XG4gICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnZhbHVlID0gZGF0YTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoe1xuICAgICAgICBzZWxlY3RlZEl0ZW06IGRhdGEsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAjb3BlbkRyb3Bkb3duKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy4jb3ZlcmxheSkge1xuICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMuI292ZXJsYXlTZXJ2aWNlLmNyZWF0ZSh7XG4gICAgICAgIGVuYWJsZUNsb3NlOiBmYWxzZSxcbiAgICAgICAgZW5hYmxlUG9pbnRlckV2ZW50czogdHJ1ZSxcbiAgICAgICAgd3JhcHBlckNsYXNzOiB0aGlzLndyYXBwZXJDbGFzcyxcbiAgICAgIH0pO1xuXG4gICAgICBvdmVybGF5LmF0dGFjaFRlbXBsYXRlKHRoaXMucmVzdWx0c1RlbXBsYXRlUmVmKTtcblxuICAgICAgdGhpcy4jb3ZlcmxheSA9IG92ZXJsYXk7XG4gICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuI2luaXRPdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMoKTtcbiAgICB9XG4gIH1cblxuICAjY2xvc2VEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLiNyZXNldFNlYXJjaCgpO1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy4jZGVzdHJveU92ZXJsYXkoKTtcbiAgICB0aGlzLiNyZW1vdmVBY3RpdmVEZXNjZW5kYW50KCk7XG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAjc2V0QWN0aXZlRGVzY2VuZGFudCgpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ID1cbiAgICAgIHRoaXMuI292ZXJsYXlGb2N1c2FibGVFbGVtZW50c1t0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXhdO1xuICAgIC8qIFNhbml0eSBjaGVjayAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuaW5wdXREaXJlY3RpdmUuc2V0QWN0aXZlRGVzY2VuZGFudChhY3RpdmVFbGVtZW50LmlkKTtcbiAgICB9XG4gIH1cblxuICAjcmVtb3ZlQWN0aXZlRGVzY2VuZGFudCgpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnNldEFjdGl2ZURlc2NlbmRhbnQobnVsbCk7XG4gIH1cblxuICAjcmVzZXRTZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzID0gW107XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XG4gICAgdGhpcy5oaWdobGlnaHRUZXh0ID0gW107XG4gICAgdGhpcy4jYWN0aXZlRWxlbWVudEluZGV4ID0gLTE7XG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzQ291bnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy4jcmVtb3ZlQWN0aXZlRGVzY2VuZGFudCgpO1xuICAgIHRoaXMuI2luaXRPdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMoKTtcbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gICNhZGRJbnB1dEV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLiNlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBvYnNlcnZhYmxlRnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGVsZW1lbnQsICdrZXlkb3duJylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlS2V5ZG93bihldmVudCk7XG4gICAgICB9KTtcblxuICAgIG9ic2VydmFibGVGcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAodGhpcy5pc09wZW4gJiYgdGhpcy5yZXN1bHRzUmVmKSB7XG4gICAgICAgICAgdGhpcy4jYWRhcHRlclNlcnZpY2Uuc2V0RHJvcGRvd25XaWR0aChcbiAgICAgICAgICAgIHRoaXMuI2VsZW1lbnRSZWYsXG4gICAgICAgICAgICB0aGlzLnJlc3VsdHNSZWYsXG4gICAgICAgICAgICAhIXRoaXMuI2lucHV0Qm94SG9zdFN2Y1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgI2Rlc3Ryb3lPdmVybGF5KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNvdmVybGF5KSB7XG4gICAgICB0aGlzLiNvdmVybGF5U2VydmljZS5jbG9zZSh0aGlzLiNvdmVybGF5KTtcbiAgICAgIHRoaXMuI292ZXJsYXkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgI2NyZWF0ZUFmZml4ZXIoKTogdm9pZCB7XG4gICAgLyogU2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoIXRoaXMuI2FmZml4ZXIgJiYgdGhpcy5yZXN1bHRzUmVmKSB7XG4gICAgICBjb25zdCBhZmZpeGVyID0gdGhpcy4jYWZmaXhTZXJ2aWNlLmNyZWF0ZUFmZml4ZXIodGhpcy5yZXN1bHRzUmVmKTtcblxuICAgICAgdGhpcy4jYWRhcHRlclNlcnZpY2Uuc2V0RHJvcGRvd25XaWR0aChcbiAgICAgICAgdGhpcy4jZWxlbWVudFJlZixcbiAgICAgICAgdGhpcy5yZXN1bHRzUmVmLFxuICAgICAgICAhIXRoaXMuI2lucHV0Qm94SG9zdFN2Y1xuICAgICAgKTtcblxuICAgICAgYWZmaXhlci5hZmZpeFRvKHRoaXMuI2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwge1xuICAgICAgICBhdXRvRml0Q29udGV4dDogU2t5QWZmaXhBdXRvRml0Q29udGV4dC5WaWV3cG9ydCxcbiAgICAgICAgZW5hYmxlQXV0b0ZpdDogdHJ1ZSxcbiAgICAgICAgaXNTdGlja3k6IHRydWUsXG4gICAgICAgIHBsYWNlbWVudDogJ2JlbG93JyxcbiAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudDogJ2xlZnQnLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuI2FmZml4ZXIgPSBhZmZpeGVyO1xuICAgIH1cbiAgfVxuXG4gICNkZXN0cm95QWZmaXhlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy4jYWZmaXhlcikge1xuICAgICAgdGhpcy4jYWZmaXhlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLiNhZmZpeGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gICNpbml0TWVzc2FnZVN0cmVhbSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy4jbWVzc2FnZVN0cmVhbVN1Yikge1xuICAgICAgdGhpcy4jbWVzc2FnZVN0cmVhbVN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy4jbWVzc2FnZVN0cmVhbVN1YiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLiNtZXNzYWdlU3RyZWFtU3ViID0gdGhpcy5tZXNzYWdlU3RyZWFtLnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xuICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBTa3lBdXRvY29tcGxldGVNZXNzYWdlVHlwZS5DbG9zZURyb3Bkb3duOlxuICAgICAgICAgIHRoaXMuI2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTa3lBdXRvY29tcGxldGVNZXNzYWdlVHlwZS5SZXBvc2l0aW9uRHJvcGRvd246XG4gICAgICAgICAgLy8gU2V0dGltZW91dCB3YWl0cyBmb3IgY2hhbmdlcyBpbiBET00gKGUuZy4sIHRva2VucyBiZWluZyByZW1vdmVkKVxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgIGlmICh0aGlzLiNhZmZpeGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuI2FmZml4ZXIucmVhZmZpeCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgI2luaXRPdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMoKTogdm9pZCB7XG4gICAgLy8gV2FpdCBmb3IgZHJvcGRvd24gZWxlbWVudHMgdG8gcmVuZGVyLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI292ZXJsYXkpIHtcbiAgICAgICAgdGhpcy4jb3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzID1cbiAgICAgICAgICB0aGlzLiNhZGFwdGVyU2VydmljZS5nZXRPdmVybGF5Rm9jdXNhYmxlRWxlbWVudHModGhpcy4jb3ZlcmxheSk7XG4gICAgICAgIHRoaXMuI292ZXJsYXlGb2N1c2FibGVFbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlLnNldFRhYkluZGV4KGVsLCAtMSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNhZGRGb2N1c2VkQ2xhc3MoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gICNnZXRBY3RpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy4jb3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzW3RoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleF07XG4gIH1cblxuICAjcmVtb3ZlRm9jdXNlZENsYXNzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPiAtMSkge1xuICAgICAgdGhpcy4jYWRhcHRlclNlcnZpY2UucmVtb3ZlQ1NTQ2xhc3MoXG4gICAgICAgIHRoaXMuI292ZXJsYXlGb2N1c2FibGVFbGVtZW50c1t0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXhdLFxuICAgICAgICAnc2t5LWF1dG9jb21wbGV0ZS1kZXNjZW5kYW50LWZvY3VzJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAjYWRkRm9jdXNlZENsYXNzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPiAtMSkge1xuICAgICAgdGhpcy4jYWRhcHRlclNlcnZpY2UuYWRkQ1NTQ2xhc3MoXG4gICAgICAgIHRoaXMuI292ZXJsYXlGb2N1c2FibGVFbGVtZW50c1t0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXhdLFxuICAgICAgICAnc2t5LWF1dG9jb21wbGV0ZS1kZXNjZW5kYW50LWZvY3VzJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuI3NldEFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgYXJpYS1hdXRvY29tcGxldGU9XCJsaXN0XCJcbiAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICBjbGFzcz1cInNreS1hdXRvY29tcGxldGVcIlxuICByb2xlPVwiY29tYm9ib3hcIlxuICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlbiAmJiBzZWFyY2hUZXh0XCJcbiAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZEJ5XCJcbiAgW2F0dHIuYXJpYS1vd25zXT1cImlzT3BlbiA/IHJlc3VsdHNMaXN0SWQgOiBudWxsXCJcbiAgW2F0dHIuaWRdPVwicmVzdWx0c1dyYXBwZXJJZFwiXG4+XG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3Jlc3VsdHNUZW1wbGF0ZVJlZj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic2t5LWF1dG9jb21wbGV0ZS1yZXN1bHRzLWNvbnRhaW5lclwiXG4gICAgW3NreVRoZW1lQ2xhc3NdPVwie1xuICAgICAgJ3NreS1zaGFkb3cnOiAnZGVmYXVsdCcsXG4gICAgICAnc2t5LWVsZXZhdGlvbi00JzogJ21vZGVybidcbiAgICB9XCJcbiAgICAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duKCRldmVudClcIlxuICAgICNyZXN1bHRzUmVmXG4gID5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cImlzU2VhcmNoaW5nQXN5bmM7IGVsc2UgcmVzdWx0Q29udHJvbHNUZW1wbGF0ZVJlZlwiXG4gICAgICBjbGFzcz1cInNreS1hdXRvY29tcGxldGUtcmVzdWx0cy13YWl0aW5nXCJcbiAgICA+XG4gICAgICA8c2t5LXdhaXQgW2lzV2FpdGluZ109XCJ0cnVlXCI+PC9za3ktd2FpdD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Jlc3VsdENvbnRyb2xzVGVtcGxhdGVSZWY+XG4gIDxkaXZcbiAgICAqbmdJZj1cInNlYXJjaFRleHQgJiYgKCFzaG93QWN0aW9uc0FyZWEgfHwgc2VhcmNoUmVzdWx0cy5sZW5ndGggPiAwKVwiXG4gICAgY2xhc3M9XCJza3ktYXV0b2NvbXBsZXRlLXJlc3VsdHNcIlxuICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkQnlcIlxuICAgIFthdHRyLmlkXT1cInJlc3VsdHNMaXN0SWRcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcmVzdWx0IG9mIHNlYXJjaFJlc3VsdHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCIhc2VhcmNoUmVzdWx0c0xpbWl0IHx8IGkgPCBzZWFyY2hSZXN1bHRzTGltaXRcIlxuICAgICAgICBjbGFzcz1cInNreS1hdXRvY29tcGxldGUtcmVzdWx0XCJcbiAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNFbGVtZW50Rm9jdXNlZChzZWFyY2hSZXN1bHRFbClcIlxuICAgICAgICBbYXR0ci5pZF09XCJyZXN1bHQuZWxlbWVudElkXCJcbiAgICAgICAgW3NreUhpZ2hsaWdodF09XCJoaWdobGlnaHRUZXh0XCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJvblJlc3VsdE1vdXNlRG93bihyZXN1bHQuZWxlbWVudElkLCAkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlbW92ZSk9XCJvblJlc3VsdE1vdXNlTW92ZShpKVwiXG4gICAgICAgICNzZWFyY2hSZXN1bHRFbFxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIHNlYXJjaFJlc3VsdFRlbXBsYXRlO1xuICAgICAgICAgICAgY29udGV4dDogeyBpdGVtOiByZXN1bHQuZGF0YSB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwic2VhcmNoUmVzdWx0cy5sZW5ndGggPT09IDBcIlxuICAgICAgY2xhc3M9XCJza3ktZGVlbXBoYXNpemVkIHNreS1wYWRkaW5nLXNxdWlzaC1kZWZhdWx0XCJcbiAgICA+XG4gICAgICB7e1xuICAgICAgICBub1Jlc3VsdHNGb3VuZFRleHQgfHxcbiAgICAgICAgICAoJ3NreXV4X2F1dG9jb21wbGV0ZV9ub19yZXN1bHRzJyB8IHNreUxpYlJlc291cmNlcylcbiAgICAgIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwic2hvd0FjdGlvbnNBcmVhXCIgY2xhc3M9XCJza3ktYXV0b2NvbXBsZXRlLWFjdGlvbnNcIj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cImVuYWJsZVNob3dNb3JlICYmICghc2VhcmNoVGV4dCB8fCBzZWFyY2hSZXN1bHRzLmxlbmd0aCA+IDApXCJcbiAgICAgIGNsYXNzPVwic2t5LWF1dG9jb21wbGV0ZS1hY3Rpb24gc2t5LWF1dG9jb21wbGV0ZS1hY3Rpb24tbW9yZSBza3ktYnRuIHNreS1idG4tbGlua1wiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChtb3VzZWRvd24pPVwibW9yZUJ1dHRvbkNsaWNrZWQoKVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICEoXG4gICAgICAgICAgICBzZWFyY2hBc3luY1xuICAgICAgICAgICAgfCBza3lBdXRvY29tcGxldGVTZWFyY2hBc3luY0Rpc2FibGVkOiBzZWFyY2hBc3luY0Rpc2FibGVkXG4gICAgICAgICAgKSAmJlxuICAgICAgICAgIHNlYXJjaFJlc3VsdHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgIXNlYXJjaFRleHRcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAge3sgJ3NreXV4X2F1dG9jb21wbGV0ZV9zaG93X2FsbCcgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIChzZWFyY2hBc3luY1xuICAgICAgICAgICAgfCBza3lBdXRvY29tcGxldGVTZWFyY2hBc3luY0Rpc2FibGVkOiBzZWFyY2hBc3luY0Rpc2FibGVkKSAmJlxuICAgICAgICAgICFzZWFyY2hUZXh0XG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIHt7XG4gICAgICAgICAgJ3NreXV4X2F1dG9jb21wbGV0ZV9zaG93X2FsbF9jb3VudCdcbiAgICAgICAgICAgIHwgc2t5TGliUmVzb3VyY2VzOiAoZGF0YS5sZW5ndGggfCBza3lOdW1lcmljOiB7IHRydW5jYXRlOiBmYWxzZSB9KVxuICAgICAgICB9fVxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VhcmNoVGV4dFwiPlxuICAgICAgICB7e1xuICAgICAgICAgICdza3l1eF9hdXRvY29tcGxldGVfc2hvd19tYXRjaGVzX2NvdW50J1xuICAgICAgICAgICAgfCBza3lMaWJSZXNvdXJjZXNcbiAgICAgICAgICAgICAgOiAoc2VhcmNoUmVzdWx0c0NvdW50ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgID8gZGF0YS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgIDogKHNlYXJjaFJlc3VsdHNDb3VudCB8IHNreU51bWVyaWM6IHsgdHJ1bmNhdGU6IGZhbHNlIH0pKVxuICAgICAgICB9fVxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9idXR0b24+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJzZWFyY2hUZXh0ICYmIHNlYXJjaFJlc3VsdHMubGVuZ3RoID09PSAwXCJcbiAgICAgIGNsYXNzPVwic2t5LWZvbnQtZGVlbXBoYXNpemVkIHNreS1hdXRvY29tcGxldGUtYWN0aW9ucy1uby1yZXN1bHRzXCJcbiAgICA+XG4gICAgICB7e1xuICAgICAgICBub1Jlc3VsdHNGb3VuZFRleHQgfHxcbiAgICAgICAgICAoJ3NreXV4X2F1dG9jb21wbGV0ZV9ub19yZXN1bHRzJyB8IHNreUxpYlJlc291cmNlcylcbiAgICAgIH19XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJzaG93QWRkQnV0dG9uXCJcbiAgICAgIGNsYXNzPVwic2t5LWF1dG9jb21wbGV0ZS1hY3Rpb24gc2t5LWF1dG9jb21wbGV0ZS1hY3Rpb24tYWRkIHNreS1idG4gc2t5LWJ0bi1saW5rXCJcbiAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFtjbGFzcy5mb2N1c2VkXT1cImlzRWxlbWVudEZvY3VzZWQoYWRkQnV0dG9uRWwpXCJcbiAgICAgIChtb3VzZWRvd24pPVwiYWRkQnV0dG9uQ2xpY2tlZCgpXCJcbiAgICAgICNhZGRCdXR0b25FbFxuICAgID5cbiAgICAgIDxza3ktaWNvbiAqc2t5VGhlbWVJZj1cIidtb2Rlcm4nXCIgaWNvbj1cImFkZFwiIGljb25UeXBlPVwic2t5dXhcIj48L3NreS1pY29uPlxuICAgICAgPHNreS1pY29uICpza3lUaGVtZUlmPVwiJ2RlZmF1bHQnXCIgaWNvbj1cInBsdXMtY2lyY2xlXCI+PC9za3ktaWNvbj5cbiAgICAgIHt7ICdza3l1eF9hdXRvY29tcGxldGVfYWRkJyB8IHNreUxpYlJlc291cmNlcyB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIiAjZGVmYXVsdFNlYXJjaFJlc3VsdFRlbXBsYXRlPlxuICB7eyBpdGVtW2Rlc2NyaXB0b3JQcm9wZXJ0eV0gfX1cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|