ngx-dropdown-list 1.1.0 → 1.2.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/README.md +2 -2
- package/esm2020/ngx-dropdown-list.mjs +5 -0
- package/esm2020/public_api.mjs +2 -0
- package/esm2020/src/ngx-dropdown-list/anchor/anchor.component.mjs +149 -0
- package/esm2020/src/ngx-dropdown-list/dropdown/dropdown.component.mjs +252 -0
- package/esm2020/src/ngx-dropdown-list/dropdown-list.component.mjs +233 -0
- package/esm2020/src/ngx-dropdown-list/dropdown-list.module.mjs +38 -0
- package/esm2020/src/ngx-dropdown-list/filter/input-filter.component.mjs +44 -0
- package/esm2020/src/ngx-dropdown-list/group-item/group-item.component.mjs +25 -0
- package/esm2020/src/ngx-dropdown-list/index.mjs +3 -0
- package/esm2020/src/ngx-dropdown-list/item/item.component.mjs +77 -0
- package/esm2020/src/ngx-dropdown-list/types/index.mjs +3 -0
- package/esm2020/src/ngx-dropdown-list/types/selection-group-items.types.mjs +2 -0
- package/esm2020/src/ngx-dropdown-list/types/selection-item.types.mjs +2 -0
- package/esm2020/src/ngx-dropdown-list/utils/util.mjs +59 -0
- package/fesm2015/ngx-dropdown-list.mjs +854 -0
- package/fesm2015/ngx-dropdown-list.mjs.map +1 -0
- package/fesm2020/ngx-dropdown-list.mjs +854 -0
- package/fesm2020/ngx-dropdown-list.mjs.map +1 -0
- package/ngx-dropdown-list.d.ts +1 -5
- package/package.json +26 -48
- package/src/ngx-dropdown-list/anchor/anchor.component.d.ts +6 -3
- package/src/ngx-dropdown-list/dropdown/dropdown.component.d.ts +5 -2
- package/src/ngx-dropdown-list/dropdown-list.component.d.ts +7 -4
- package/src/ngx-dropdown-list/dropdown-list.module.d.ts +12 -0
- package/src/ngx-dropdown-list/filter/input-filter.component.d.ts +3 -0
- package/src/ngx-dropdown-list/group-item/group-item.component.d.ts +3 -0
- package/src/ngx-dropdown-list/item/item.component.d.ts +3 -0
- package/bundles/ngx-dropdown-list.umd.js +0 -1180
- package/bundles/ngx-dropdown-list.umd.js.map +0 -1
- package/bundles/ngx-dropdown-list.umd.min.js +0 -2
- package/bundles/ngx-dropdown-list.umd.min.js.map +0 -1
- package/esm2015/ngx-dropdown-list.js +0 -14
- package/esm2015/public_api.js +0 -6
- package/esm2015/src/ngx-dropdown-list/anchor/anchor.component.js +0 -226
- package/esm2015/src/ngx-dropdown-list/dropdown/dropdown.component.js +0 -339
- package/esm2015/src/ngx-dropdown-list/dropdown-list.component.js +0 -290
- package/esm2015/src/ngx-dropdown-list/dropdown-list.module.js +0 -32
- package/esm2015/src/ngx-dropdown-list/filter/input-filter.component.js +0 -64
- package/esm2015/src/ngx-dropdown-list/group-item/group-item.component.js +0 -37
- package/esm2015/src/ngx-dropdown-list/index.js +0 -7
- package/esm2015/src/ngx-dropdown-list/item/item.component.js +0 -104
- package/esm2015/src/ngx-dropdown-list/types/index.js +0 -7
- package/esm2015/src/ngx-dropdown-list/types/selection-group-items.types.js +0 -16
- package/esm2015/src/ngx-dropdown-list/types/selection-item.types.js +0 -20
- package/esm2015/src/ngx-dropdown-list/utils/util.js +0 -73
- package/esm5/ngx-dropdown-list.js +0 -14
- package/esm5/public_api.js +0 -6
- package/esm5/src/ngx-dropdown-list/anchor/anchor.component.js +0 -272
- package/esm5/src/ngx-dropdown-list/dropdown/dropdown.component.js +0 -408
- package/esm5/src/ngx-dropdown-list/dropdown-list.component.js +0 -361
- package/esm5/src/ngx-dropdown-list/dropdown-list.module.js +0 -36
- package/esm5/src/ngx-dropdown-list/filter/input-filter.component.js +0 -79
- package/esm5/src/ngx-dropdown-list/group-item/group-item.component.js +0 -47
- package/esm5/src/ngx-dropdown-list/index.js +0 -7
- package/esm5/src/ngx-dropdown-list/item/item.component.js +0 -120
- package/esm5/src/ngx-dropdown-list/types/index.js +0 -7
- package/esm5/src/ngx-dropdown-list/types/selection-group-items.types.js +0 -16
- package/esm5/src/ngx-dropdown-list/types/selection-item.types.js +0 -20
- package/esm5/src/ngx-dropdown-list/utils/util.js +0 -96
- package/fesm2015/ngx-dropdown-list.js +0 -890
- package/fesm2015/ngx-dropdown-list.js.map +0 -1
- package/fesm5/ngx-dropdown-list.js +0 -1137
- package/fesm5/ngx-dropdown-list.js.map +0 -1
- package/ngx-dropdown-list.metadata.json +0 -1
|
@@ -1,1180 +0,0 @@
|
|
|
1
|
-
(function (global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('@angular/forms')) :
|
|
3
|
-
typeof define === 'function' && define.amd ? define('ngx-dropdown-list', ['exports', '@angular/core', '@angular/common', '@angular/forms'], factory) :
|
|
4
|
-
(factory((global['ngx-dropdown-list'] = {}),global.ng.core,global.ng.common,global.ng.forms));
|
|
5
|
-
}(this, (function (exports,core,common,forms) { 'use strict';
|
|
6
|
-
|
|
7
|
-
/*! *****************************************************************************
|
|
8
|
-
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
9
|
-
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
|
10
|
-
this file except in compliance with the License. You may obtain a copy of the
|
|
11
|
-
License at http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
|
|
13
|
-
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
-
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
|
|
15
|
-
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
|
|
16
|
-
MERCHANTABLITY OR NON-INFRINGEMENT.
|
|
17
|
-
|
|
18
|
-
See the Apache Version 2.0 License for specific language governing permissions
|
|
19
|
-
and limitations under the License.
|
|
20
|
-
***************************************************************************** */
|
|
21
|
-
function __values(o) {
|
|
22
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
|
|
23
|
-
if (m)
|
|
24
|
-
return m.call(o);
|
|
25
|
-
return {
|
|
26
|
-
next: function () {
|
|
27
|
-
if (o && i >= o.length)
|
|
28
|
-
o = void 0;
|
|
29
|
-
return { value: o && o[i++], done: !o };
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* @fileoverview added by tsickle
|
|
36
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
37
|
-
*/
|
|
38
|
-
/**
|
|
39
|
-
* check whether the provided items contains group
|
|
40
|
-
* @param {?} items
|
|
41
|
-
* @return {?}
|
|
42
|
-
*/
|
|
43
|
-
function hasGroup(items) {
|
|
44
|
-
return items ? (items.find(function (item) { return item.group; }) != null) : false;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* clear all selections from the provide items.
|
|
48
|
-
* @param {?} items the dropdown items, can be group or item
|
|
49
|
-
* @return {?}
|
|
50
|
-
*/
|
|
51
|
-
function clearAllSelection(items) {
|
|
52
|
-
var e_1, _a;
|
|
53
|
-
if (hasGroup(items)) {
|
|
54
|
-
try {
|
|
55
|
-
for (var items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {
|
|
56
|
-
var groupItem = items_1_1.value;
|
|
57
|
-
if (groupItem.items) {
|
|
58
|
-
groupItem.items.filter(function (item) { return item.selected; }).forEach(function (item) { return item.selected = false; });
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
catch (e_1_1) {
|
|
63
|
-
e_1 = { error: e_1_1 };
|
|
64
|
-
}
|
|
65
|
-
finally {
|
|
66
|
-
try {
|
|
67
|
-
if (items_1_1 && !items_1_1.done && (_a = items_1.return))
|
|
68
|
-
_a.call(items_1);
|
|
69
|
-
}
|
|
70
|
-
finally {
|
|
71
|
-
if (e_1)
|
|
72
|
-
throw e_1.error;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
// clear the selection of previous selected item
|
|
78
|
-
items.filter(function (item) { return item.selected; }).forEach(function (item) { return item.selected = false; });
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* stop all propagation and default actions
|
|
83
|
-
* @param {?} event
|
|
84
|
-
* @return {?}
|
|
85
|
-
*/
|
|
86
|
-
function stopPropagationAndDefault(event) {
|
|
87
|
-
event.stopImmediatePropagation();
|
|
88
|
-
event.stopPropagation();
|
|
89
|
-
event.preventDefault();
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* check whether the provided value is number of not
|
|
93
|
-
* @param {?} value
|
|
94
|
-
* @return {?}
|
|
95
|
-
*/
|
|
96
|
-
function isNumber(value) {
|
|
97
|
-
return !(value == null || isNaN(value) || value.length === 0);
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* get the selected item from the items list (including item and group)
|
|
101
|
-
* @param {?} items
|
|
102
|
-
* @return {?}
|
|
103
|
-
*/
|
|
104
|
-
function getFirstSelectedItem(items) {
|
|
105
|
-
var e_2, _a;
|
|
106
|
-
if (!items) {
|
|
107
|
-
return undefined;
|
|
108
|
-
}
|
|
109
|
-
/** @type {?} */
|
|
110
|
-
var selectedItem;
|
|
111
|
-
if (hasGroup(items)) {
|
|
112
|
-
try {
|
|
113
|
-
for (var items_2 = __values(items), items_2_1 = items_2.next(); !items_2_1.done; items_2_1 = items_2.next()) {
|
|
114
|
-
var item = items_2_1.value;
|
|
115
|
-
selectedItem = item.items ? item.items.find(function (subItem) { return subItem.selected; }) : undefined;
|
|
116
|
-
if (selectedItem) {
|
|
117
|
-
break;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
catch (e_2_1) {
|
|
122
|
-
e_2 = { error: e_2_1 };
|
|
123
|
-
}
|
|
124
|
-
finally {
|
|
125
|
-
try {
|
|
126
|
-
if (items_2_1 && !items_2_1.done && (_a = items_2.return))
|
|
127
|
-
_a.call(items_2);
|
|
128
|
-
}
|
|
129
|
-
finally {
|
|
130
|
-
if (e_2)
|
|
131
|
-
throw e_2.error;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
selectedItem = items ? items.find(function (item) { return item.selected; }) : undefined;
|
|
137
|
-
}
|
|
138
|
-
return selectedItem;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* @fileoverview added by tsickle
|
|
143
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
144
|
-
*/
|
|
145
|
-
var DropdownListComponent = /** @class */ (function () {
|
|
146
|
-
function DropdownListComponent() {
|
|
147
|
-
/**
|
|
148
|
-
* bind to [multiSelection], the flag for multi-select (checkbox) mode.
|
|
149
|
-
*/
|
|
150
|
-
this.multiSelection = false;
|
|
151
|
-
/**
|
|
152
|
-
* bind to [filterBox] for displaying the filter input text box
|
|
153
|
-
*/
|
|
154
|
-
this.filterBox = false;
|
|
155
|
-
/**
|
|
156
|
-
* bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
|
|
157
|
-
*/
|
|
158
|
-
this.allowClear = true;
|
|
159
|
-
/**
|
|
160
|
-
* bind to [formatNumber] for show formatted number text
|
|
161
|
-
*/
|
|
162
|
-
this.formatNumber = false;
|
|
163
|
-
/**
|
|
164
|
-
* for 2-way binding of [selectedValue], using async event to
|
|
165
|
-
* prevent "ExpressionChangedAfterItHasBeenCheckedError".
|
|
166
|
-
*/
|
|
167
|
-
this.selectedValueChange = new core.EventEmitter(true);
|
|
168
|
-
/**
|
|
169
|
-
* [selectionChange] event that will be triggered when changing of the selection.
|
|
170
|
-
* Using async event to prevent "ExpressionChangedAfterItHasBeenCheckedError".
|
|
171
|
-
*/
|
|
172
|
-
this.selectionChange = new core.EventEmitter(true);
|
|
173
|
-
/**
|
|
174
|
-
* visibility flag of drop down
|
|
175
|
-
*/
|
|
176
|
-
this.dropdownVisibility = false;
|
|
177
|
-
}
|
|
178
|
-
Object.defineProperty(DropdownListComponent.prototype, "selectedText", {
|
|
179
|
-
/**
|
|
180
|
-
* current selected text
|
|
181
|
-
*/
|
|
182
|
-
get: /**
|
|
183
|
-
* current selected text
|
|
184
|
-
* @return {?}
|
|
185
|
-
*/ function () {
|
|
186
|
-
if (!this.multiSelection) {
|
|
187
|
-
/** @type {?} */
|
|
188
|
-
var selectedItem = getFirstSelectedItem(this.items);
|
|
189
|
-
return selectedItem ? selectedItem.text : undefined;
|
|
190
|
-
}
|
|
191
|
-
},
|
|
192
|
-
enumerable: true,
|
|
193
|
-
configurable: true
|
|
194
|
-
});
|
|
195
|
-
/**
|
|
196
|
-
* triggered with (selectionChange) event, emits (selectedValueChange) and (selectionChange)
|
|
197
|
-
*/
|
|
198
|
-
/**
|
|
199
|
-
* triggered with (selectionChange) event, emits (selectedValueChange) and (selectionChange)
|
|
200
|
-
* @param {?} event
|
|
201
|
-
* @return {?}
|
|
202
|
-
*/
|
|
203
|
-
DropdownListComponent.prototype.onSelectionChange = /**
|
|
204
|
-
* triggered with (selectionChange) event, emits (selectedValueChange) and (selectionChange)
|
|
205
|
-
* @param {?} event
|
|
206
|
-
* @return {?}
|
|
207
|
-
*/
|
|
208
|
-
function (event) {
|
|
209
|
-
this.selectedValueChange.emit(event);
|
|
210
|
-
this.selectionChange.emit(event);
|
|
211
|
-
};
|
|
212
|
-
/**
|
|
213
|
-
* triggered with (anchorClick) event, controlling the "open" and "close" of the dropdown
|
|
214
|
-
*/
|
|
215
|
-
/**
|
|
216
|
-
* triggered with (anchorClick) event, controlling the "open" and "close" of the dropdown
|
|
217
|
-
* @param {?} event
|
|
218
|
-
* @return {?}
|
|
219
|
-
*/
|
|
220
|
-
DropdownListComponent.prototype.onAnchorClick = /**
|
|
221
|
-
* triggered with (anchorClick) event, controlling the "open" and "close" of the dropdown
|
|
222
|
-
* @param {?} event
|
|
223
|
-
* @return {?}
|
|
224
|
-
*/
|
|
225
|
-
function (event) {
|
|
226
|
-
if (this.disabled) {
|
|
227
|
-
stopPropagationAndDefault(event);
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
if (this._isSelectionOpen()) {
|
|
231
|
-
this._hideItemList();
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
this._showItemsList();
|
|
235
|
-
}
|
|
236
|
-
stopPropagationAndDefault(event);
|
|
237
|
-
};
|
|
238
|
-
/**
|
|
239
|
-
* triggered with (itemClick) event, closes the dropdown in non-checkbox mode
|
|
240
|
-
*/
|
|
241
|
-
/**
|
|
242
|
-
* triggered with (itemClick) event, closes the dropdown in non-checkbox mode
|
|
243
|
-
* @return {?}
|
|
244
|
-
*/
|
|
245
|
-
DropdownListComponent.prototype.onItemClick = /**
|
|
246
|
-
* triggered with (itemClick) event, closes the dropdown in non-checkbox mode
|
|
247
|
-
* @return {?}
|
|
248
|
-
*/
|
|
249
|
-
function () {
|
|
250
|
-
if (!this.multiSelection) {
|
|
251
|
-
this._hideItemList();
|
|
252
|
-
}
|
|
253
|
-
};
|
|
254
|
-
/**
|
|
255
|
-
* triggered with (clearanceClick) event, clearing all selections
|
|
256
|
-
* and emits (selectedValueChange) and (selectionChange) event for empty value
|
|
257
|
-
*/
|
|
258
|
-
/**
|
|
259
|
-
* triggered with (clearanceClick) event, clearing all selections
|
|
260
|
-
* and emits (selectedValueChange) and (selectionChange) event for empty value
|
|
261
|
-
* @param {?} event
|
|
262
|
-
* @return {?}
|
|
263
|
-
*/
|
|
264
|
-
DropdownListComponent.prototype.onClearanceClick = /**
|
|
265
|
-
* triggered with (clearanceClick) event, clearing all selections
|
|
266
|
-
* and emits (selectedValueChange) and (selectionChange) event for empty value
|
|
267
|
-
* @param {?} event
|
|
268
|
-
* @return {?}
|
|
269
|
-
*/
|
|
270
|
-
function (event) {
|
|
271
|
-
if (!this.multiSelection) {
|
|
272
|
-
this.selectedValue = void 0;
|
|
273
|
-
this.selectedValueChange.emit(undefined);
|
|
274
|
-
this.selectionChange.emit(undefined);
|
|
275
|
-
clearAllSelection(this.items);
|
|
276
|
-
}
|
|
277
|
-
stopPropagationAndDefault(event);
|
|
278
|
-
};
|
|
279
|
-
/**
|
|
280
|
-
* triggered with (dropdownBlur) event, closes the dropdown
|
|
281
|
-
*/
|
|
282
|
-
/**
|
|
283
|
-
* triggered with (dropdownBlur) event, closes the dropdown
|
|
284
|
-
* @return {?}
|
|
285
|
-
*/
|
|
286
|
-
DropdownListComponent.prototype.onItemsBlur = /**
|
|
287
|
-
* triggered with (dropdownBlur) event, closes the dropdown
|
|
288
|
-
* @return {?}
|
|
289
|
-
*/
|
|
290
|
-
function () {
|
|
291
|
-
if (this._isSelectionOpen()) {
|
|
292
|
-
this._hideItemList();
|
|
293
|
-
}
|
|
294
|
-
};
|
|
295
|
-
/**
|
|
296
|
-
* close the dropdown
|
|
297
|
-
*/
|
|
298
|
-
/**
|
|
299
|
-
* close the dropdown
|
|
300
|
-
* @private
|
|
301
|
-
* @return {?}
|
|
302
|
-
*/
|
|
303
|
-
DropdownListComponent.prototype._hideItemList = /**
|
|
304
|
-
* close the dropdown
|
|
305
|
-
* @private
|
|
306
|
-
* @return {?}
|
|
307
|
-
*/
|
|
308
|
-
function () {
|
|
309
|
-
// hide the dropdown element (has some problem for using CSS directly, using this as a workaround)
|
|
310
|
-
this._dropdownElement.classList.remove('visible');
|
|
311
|
-
this._dropdownElement.style.display = 'none';
|
|
312
|
-
this.dropdownVisibility = false;
|
|
313
|
-
};
|
|
314
|
-
/**
|
|
315
|
-
* open the dropdown
|
|
316
|
-
*/
|
|
317
|
-
/**
|
|
318
|
-
* open the dropdown
|
|
319
|
-
* @private
|
|
320
|
-
* @return {?}
|
|
321
|
-
*/
|
|
322
|
-
DropdownListComponent.prototype._showItemsList = /**
|
|
323
|
-
* open the dropdown
|
|
324
|
-
* @private
|
|
325
|
-
* @return {?}
|
|
326
|
-
*/
|
|
327
|
-
function () {
|
|
328
|
-
// display the dropdown element (has some problem for using CSS directly, using this as a workaround)
|
|
329
|
-
this._dropdownElement.classList.add('visible');
|
|
330
|
-
this._dropdownElement.style.display = 'block';
|
|
331
|
-
this.dropdownVisibility = true;
|
|
332
|
-
// scrolling to the selected item
|
|
333
|
-
if (this._selectedElement) {
|
|
334
|
-
this._selectedElement.scrollIntoView({ behavior: 'instant', block: 'center' });
|
|
335
|
-
}
|
|
336
|
-
// setting the focus
|
|
337
|
-
if (this.filterBox && !this.multiSelection) {
|
|
338
|
-
this._filterInputElement.focus();
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
this._dropdownElement.focus();
|
|
342
|
-
}
|
|
343
|
-
};
|
|
344
|
-
/**
|
|
345
|
-
* visibility status of dropdown
|
|
346
|
-
*/
|
|
347
|
-
/**
|
|
348
|
-
* visibility status of dropdown
|
|
349
|
-
* @private
|
|
350
|
-
* @return {?}
|
|
351
|
-
*/
|
|
352
|
-
DropdownListComponent.prototype._isSelectionOpen = /**
|
|
353
|
-
* visibility status of dropdown
|
|
354
|
-
* @private
|
|
355
|
-
* @return {?}
|
|
356
|
-
*/
|
|
357
|
-
function () {
|
|
358
|
-
return this.dropdownVisibility;
|
|
359
|
-
};
|
|
360
|
-
Object.defineProperty(DropdownListComponent.prototype, "_dropdownElement", {
|
|
361
|
-
/**
|
|
362
|
-
* get the real dropdown element (for focusing and visibility controlling), the <span> not the <dropdown>
|
|
363
|
-
*/
|
|
364
|
-
get: /**
|
|
365
|
-
* get the real dropdown element (for focusing and visibility controlling), the <span> not the <dropdown>
|
|
366
|
-
* @private
|
|
367
|
-
* @return {?}
|
|
368
|
-
*/ function () {
|
|
369
|
-
return this.dropdownRef ? this.dropdownRef.nativeElement ? this.dropdownRef.nativeElement.firstElementChild : null : null;
|
|
370
|
-
},
|
|
371
|
-
enumerable: true,
|
|
372
|
-
configurable: true
|
|
373
|
-
});
|
|
374
|
-
Object.defineProperty(DropdownListComponent.prototype, "_filterInputElement", {
|
|
375
|
-
/**
|
|
376
|
-
* get the real filter element (for focusing), the <input> not the <input-filter>
|
|
377
|
-
*/
|
|
378
|
-
get: /**
|
|
379
|
-
* get the real filter element (for focusing), the <input> not the <input-filter>
|
|
380
|
-
* @private
|
|
381
|
-
* @return {?}
|
|
382
|
-
*/ function () {
|
|
383
|
-
return this._dropdownElement ?
|
|
384
|
-
this._dropdownElement.firstElementChild ? this._dropdownElement.firstElementChild.firstElementChild : null : null;
|
|
385
|
-
},
|
|
386
|
-
enumerable: true,
|
|
387
|
-
configurable: true
|
|
388
|
-
});
|
|
389
|
-
Object.defineProperty(DropdownListComponent.prototype, "_selectedElement", {
|
|
390
|
-
/**
|
|
391
|
-
* get the HTMLElement of selected item, for doing (scrollIntoView) scrolling to the selected item
|
|
392
|
-
*/
|
|
393
|
-
get: /**
|
|
394
|
-
* get the HTMLElement of selected item, for doing (scrollIntoView) scrolling to the selected item
|
|
395
|
-
* @private
|
|
396
|
-
* @return {?}
|
|
397
|
-
*/ function () {
|
|
398
|
-
/** @type {?} */
|
|
399
|
-
var selectedItem = getFirstSelectedItem(this.items);
|
|
400
|
-
return selectedItem ? ( /** @type {?} */(document.getElementById(selectedItem.id))) : undefined;
|
|
401
|
-
},
|
|
402
|
-
enumerable: true,
|
|
403
|
-
configurable: true
|
|
404
|
-
});
|
|
405
|
-
DropdownListComponent.decorators = [
|
|
406
|
-
{ type: core.Component, args: [{
|
|
407
|
-
selector: 'ngx-dropdown-list',
|
|
408
|
-
template: "\n <span class=\"ngx-select\">\n <anchor (anchorClick)=\"onAnchorClick($event)\" (clearanceClick)=\"onClearanceClick($event)\"\n [checkbox]=\"multiSelection\"\n [formatNumber]=\"formatNumber\"\n [suffixText]=\"suffixText\"\n [placeHolder]=\"placeHolder\"\n [allowClear]=\"allowClear\"\n [openStatus]=\"dropdownVisibility\"\n [selectedText]=\"selectedText\"\n [disabled]=\"disabled\">\n </anchor>\n <dropdown #dropdown (dropdownBlur) = \"onItemsBlur()\" (selectionChange)=\"onSelectionChange($event)\"\n [items]=\"items\"\n [checkbox]=\"multiSelection\"\n [filterBox]=\"filterBox\"\n [formatNumber]=\"formatNumber\"\n [suffixText]=\"suffixText\"\n [(selectedValue)]=\"selectedValue\"\n (itemClick) = \"onItemClick()\"\n [disabled]=\"disabled\">\n </dropdown>\n </span>\n ",
|
|
409
|
-
styles: [":host *,:host :after,:host :before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}:host .ngx-select{border-radius:4px;font-size:14px;position:relative;display:inline-block;width:100%;height:34px;background:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}"]
|
|
410
|
-
}] }
|
|
411
|
-
];
|
|
412
|
-
DropdownListComponent.propDecorators = {
|
|
413
|
-
dropdownRef: [{ type: core.ViewChild, args: ['dropdown', { read: core.ElementRef },] }],
|
|
414
|
-
placeHolder: [{ type: core.Input }],
|
|
415
|
-
items: [{ type: core.Input }],
|
|
416
|
-
multiSelection: [{ type: core.Input }],
|
|
417
|
-
selectedValue: [{ type: core.Input }],
|
|
418
|
-
filterBox: [{ type: core.Input }],
|
|
419
|
-
suffixText: [{ type: core.Input }],
|
|
420
|
-
disabled: [{ type: core.Input }],
|
|
421
|
-
allowClear: [{ type: core.Input }],
|
|
422
|
-
formatNumber: [{ type: core.Input }],
|
|
423
|
-
selectedValueChange: [{ type: core.Output }],
|
|
424
|
-
selectionChange: [{ type: core.Output }]
|
|
425
|
-
};
|
|
426
|
-
return DropdownListComponent;
|
|
427
|
-
}());
|
|
428
|
-
|
|
429
|
-
/**
|
|
430
|
-
* @fileoverview added by tsickle
|
|
431
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
432
|
-
*/
|
|
433
|
-
var ItemComponent = /** @class */ (function () {
|
|
434
|
-
function ItemComponent() {
|
|
435
|
-
/**
|
|
436
|
-
* bind to [formatNumber], the flag for formatting the number
|
|
437
|
-
*/
|
|
438
|
-
this.formatNumber = false;
|
|
439
|
-
/**
|
|
440
|
-
* bind to [itemClick] event, triggers when clicking the item of dropdown
|
|
441
|
-
*/
|
|
442
|
-
this.itemClick = new core.EventEmitter();
|
|
443
|
-
/**
|
|
444
|
-
* bind to [checkStatusChange] event, triggers when check status is changed in checkbox mode.
|
|
445
|
-
*/
|
|
446
|
-
this.checkStatusChange = new core.EventEmitter();
|
|
447
|
-
}
|
|
448
|
-
/**
|
|
449
|
-
* check whether needs to format number for the provided text
|
|
450
|
-
*/
|
|
451
|
-
/**
|
|
452
|
-
* check whether needs to format number for the provided text
|
|
453
|
-
* @param {?} value
|
|
454
|
-
* @return {?}
|
|
455
|
-
*/
|
|
456
|
-
ItemComponent.prototype.needFormatNumber = /**
|
|
457
|
-
* check whether needs to format number for the provided text
|
|
458
|
-
* @param {?} value
|
|
459
|
-
* @return {?}
|
|
460
|
-
*/
|
|
461
|
-
function (value) {
|
|
462
|
-
return isNumber(value) && this.formatNumber;
|
|
463
|
-
};
|
|
464
|
-
/**
|
|
465
|
-
* triggered when clicking the item, emits the [itemClick] event
|
|
466
|
-
*/
|
|
467
|
-
/**
|
|
468
|
-
* triggered when clicking the item, emits the [itemClick] event
|
|
469
|
-
* @param {?} item
|
|
470
|
-
* @return {?}
|
|
471
|
-
*/
|
|
472
|
-
ItemComponent.prototype.onItemClick = /**
|
|
473
|
-
* triggered when clicking the item, emits the [itemClick] event
|
|
474
|
-
* @param {?} item
|
|
475
|
-
* @return {?}
|
|
476
|
-
*/
|
|
477
|
-
function (item) {
|
|
478
|
-
this.itemClick.emit(item);
|
|
479
|
-
};
|
|
480
|
-
/**
|
|
481
|
-
* triggered when checking status changed in checkbox mode, emits the [checkStatusChange] event
|
|
482
|
-
*/
|
|
483
|
-
/**
|
|
484
|
-
* triggered when checking status changed in checkbox mode, emits the [checkStatusChange] event
|
|
485
|
-
* @param {?} item
|
|
486
|
-
* @return {?}
|
|
487
|
-
*/
|
|
488
|
-
ItemComponent.prototype.onCheckStatusChange = /**
|
|
489
|
-
* triggered when checking status changed in checkbox mode, emits the [checkStatusChange] event
|
|
490
|
-
* @param {?} item
|
|
491
|
-
* @return {?}
|
|
492
|
-
*/
|
|
493
|
-
function (item) {
|
|
494
|
-
this.checkStatusChange.emit(item);
|
|
495
|
-
};
|
|
496
|
-
ItemComponent.decorators = [
|
|
497
|
-
{ type: core.Component, args: [{
|
|
498
|
-
selector: 'item',
|
|
499
|
-
template: "\n <label [class.container-checkbox]=\"checkbox\"\n [class.container-selection]=\"!checkbox && !item.selected\"\n [class.container-selection-selected]=\"!checkbox && item.selected\"\n [id]=\"item.id\" (mousedown)=\"onItemClick(item)\">\n {{needFormatNumber(item.text)? (item.text | number:'1.0-2') : item.text}}{{suffixText? suffixText : ''}}\n <ng-container *ngIf=\"checkbox\">\n <input type='checkbox' [id]=\"'checkbox-'+item.text\" (change)=\"onCheckStatusChange(item)\" [checked]=\"item.selected\">\n <span class=\"checkmark\" [id]=\"'checkmark-'+item.text\"></span>\n </ng-container>\n </label>",
|
|
500
|
-
styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.container-checkbox,.container-selection,.container-selection-selected,.dropdown-item{background:0 0;display:list-item;list-style:none;position:relative;width:100%;height:auto;cursor:pointer;color:#495057;padding-bottom:5px;padding-top:5px;padding-left:12px}.container-checkbox{padding-left:35px}.container-checkbox input{position:absolute;opacity:0;cursor:pointer}.container-checkbox .checkmark{position:absolute;top:5px;left:10px;height:15px;width:15px;border:1px solid rgba(0,0,0,.3);background-color:#fff;border-radius:4px}.container-checkbox .checkmark:after{content:\"\";position:absolute;display:none;left:5px;top:2px;width:4px;height:7px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.container-checkbox:hover input~.checkmark{background-color:#ccc}.container-checkbox input:checked~.checkmark{background-color:#2196f3;border:1px solid #2196f3}.container-checkbox input:checked~.checkmark:after{display:block}.container-checkbox:hover{color:#66afe9}.container-selection,.container-selection-selected{padding-left:12px}.container-selection-selected:hover,.container-selection:hover{color:#495057;background:#e0ffff}.container-selection-selected{color:#fff;background:#6495ed}"]
|
|
501
|
-
}] }
|
|
502
|
-
];
|
|
503
|
-
ItemComponent.propDecorators = {
|
|
504
|
-
checkbox: [{ type: core.Input }],
|
|
505
|
-
item: [{ type: core.Input }],
|
|
506
|
-
formatNumber: [{ type: core.Input }],
|
|
507
|
-
suffixText: [{ type: core.Input }],
|
|
508
|
-
itemClick: [{ type: core.Output }],
|
|
509
|
-
checkStatusChange: [{ type: core.Output }]
|
|
510
|
-
};
|
|
511
|
-
return ItemComponent;
|
|
512
|
-
}());
|
|
513
|
-
|
|
514
|
-
/**
|
|
515
|
-
* @fileoverview added by tsickle
|
|
516
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
517
|
-
*/
|
|
518
|
-
var GroupItemComponent = /** @class */ (function () {
|
|
519
|
-
function GroupItemComponent() {
|
|
520
|
-
}
|
|
521
|
-
/**
|
|
522
|
-
* prevent all clicking event from happening
|
|
523
|
-
*/
|
|
524
|
-
/**
|
|
525
|
-
* prevent all clicking event from happening
|
|
526
|
-
* @param {?} event
|
|
527
|
-
* @return {?}
|
|
528
|
-
*/
|
|
529
|
-
GroupItemComponent.prototype.onItemGroupClick = /**
|
|
530
|
-
* prevent all clicking event from happening
|
|
531
|
-
* @param {?} event
|
|
532
|
-
* @return {?}
|
|
533
|
-
*/
|
|
534
|
-
function (event) {
|
|
535
|
-
event.stopImmediatePropagation();
|
|
536
|
-
event.stopPropagation();
|
|
537
|
-
event.preventDefault();
|
|
538
|
-
};
|
|
539
|
-
GroupItemComponent.decorators = [
|
|
540
|
-
{ type: core.Component, args: [{
|
|
541
|
-
selector: 'group-item',
|
|
542
|
-
template: "\n <label class=\"dropdown-item dropdown-item-group\" (mousedown)=\"onItemGroupClick($event)\">{{item.group}}</label>\n ",
|
|
543
|
-
styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.container-checkbox,.container-selection,.container-selection-selected,.dropdown-item{background:0 0;display:list-item;list-style:none;position:relative;width:100%;height:auto;cursor:pointer;color:#495057;padding-bottom:5px;padding-top:5px;padding-left:12px}.container-checkbox{padding-left:35px}.container-checkbox input{position:absolute;opacity:0;cursor:pointer}.container-checkbox .checkmark{position:absolute;top:5px;left:10px;height:15px;width:15px;border:1px solid rgba(0,0,0,.3);background-color:#fff;border-radius:4px}.container-checkbox .checkmark:after{content:\"\";position:absolute;display:none;left:5px;top:2px;width:4px;height:7px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.container-checkbox:hover input~.checkmark{background-color:#ccc}.container-checkbox input:checked~.checkmark{background-color:#2196f3;border:1px solid #2196f3}.container-checkbox input:checked~.checkmark:after{display:block}.container-checkbox:hover{color:#66afe9}.container-selection,.container-selection-selected{padding-left:12px}.container-selection-selected:hover,.container-selection:hover{color:#495057;background:#e0ffff}.container-selection-selected{color:#fff;background:#6495ed}.dropdown-item-group{font-weight:700}.dropdown-item-group:hover{cursor:default}"]
|
|
544
|
-
}] }
|
|
545
|
-
];
|
|
546
|
-
GroupItemComponent.propDecorators = {
|
|
547
|
-
item: [{ type: core.Input }]
|
|
548
|
-
};
|
|
549
|
-
return GroupItemComponent;
|
|
550
|
-
}());
|
|
551
|
-
|
|
552
|
-
/**
|
|
553
|
-
* @fileoverview added by tsickle
|
|
554
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
555
|
-
*/
|
|
556
|
-
var InputFilterComponent = /** @class */ (function () {
|
|
557
|
-
function InputFilterComponent() {
|
|
558
|
-
/**
|
|
559
|
-
* bind to [inputFilterBlur], emits with (blur) of filter input box
|
|
560
|
-
*/
|
|
561
|
-
this.inputFilterBlur = new core.EventEmitter();
|
|
562
|
-
/**
|
|
563
|
-
* bind to [filterValueChange], for 2-way binding of filterValue
|
|
564
|
-
*/
|
|
565
|
-
this.filterValueChange = new core.EventEmitter();
|
|
566
|
-
}
|
|
567
|
-
/**
|
|
568
|
-
* triggers with (blur) event, emits the (inputFilterBlur) event
|
|
569
|
-
*/
|
|
570
|
-
/**
|
|
571
|
-
* triggers with (blur) event, emits the (inputFilterBlur) event
|
|
572
|
-
* @param {?} event
|
|
573
|
-
* @return {?}
|
|
574
|
-
*/
|
|
575
|
-
InputFilterComponent.prototype.onFilterTextBlur = /**
|
|
576
|
-
* triggers with (blur) event, emits the (inputFilterBlur) event
|
|
577
|
-
* @param {?} event
|
|
578
|
-
* @return {?}
|
|
579
|
-
*/
|
|
580
|
-
function (event) {
|
|
581
|
-
this.inputFilterBlur.emit(event);
|
|
582
|
-
};
|
|
583
|
-
/**
|
|
584
|
-
* triggers with (input) event, emits the (filterValueChange) event for 2-way binding of filterValue
|
|
585
|
-
*/
|
|
586
|
-
/**
|
|
587
|
-
* triggers with (input) event, emits the (filterValueChange) event for 2-way binding of filterValue
|
|
588
|
-
* @return {?}
|
|
589
|
-
*/
|
|
590
|
-
InputFilterComponent.prototype.onChange = /**
|
|
591
|
-
* triggers with (input) event, emits the (filterValueChange) event for 2-way binding of filterValue
|
|
592
|
-
* @return {?}
|
|
593
|
-
*/
|
|
594
|
-
function () {
|
|
595
|
-
this.filterValueChange.emit(this.filterValue);
|
|
596
|
-
};
|
|
597
|
-
InputFilterComponent.decorators = [
|
|
598
|
-
{ type: core.Component, args: [{
|
|
599
|
-
selector: 'input-filter',
|
|
600
|
-
template: "\n <input type=\"text\" class=\"filter-box\" [(ngModel)]=\"filterValue\" (input)=\"onChange()\" (blur)=\"onFilterTextBlur($event)\">\n ",
|
|
601
|
-
styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.filter-box{width:calc(100% - 10px);height:28px;border-radius:4px;border:1px solid #ccc;margin:1px 5px 5px;padding-left:5px;font-size:12px;box-sizing:border-box;color:#495057}.filter-box:focus{outline:0;border-color:#ccc}"]
|
|
602
|
-
}] }
|
|
603
|
-
];
|
|
604
|
-
InputFilterComponent.propDecorators = {
|
|
605
|
-
filterValue: [{ type: core.Input }],
|
|
606
|
-
inputFilterBlur: [{ type: core.Output }],
|
|
607
|
-
filterValueChange: [{ type: core.Output }]
|
|
608
|
-
};
|
|
609
|
-
return InputFilterComponent;
|
|
610
|
-
}());
|
|
611
|
-
|
|
612
|
-
/**
|
|
613
|
-
* @fileoverview added by tsickle
|
|
614
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
615
|
-
*/
|
|
616
|
-
var AnchorComponent = /** @class */ (function () {
|
|
617
|
-
function AnchorComponent(_decimalPipe) {
|
|
618
|
-
this._decimalPipe = _decimalPipe;
|
|
619
|
-
/**
|
|
620
|
-
* bind to [checkbox] for checking whether the clearance flag should be shown or not.
|
|
621
|
-
*/
|
|
622
|
-
this.checkbox = false;
|
|
623
|
-
/**
|
|
624
|
-
* bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
|
|
625
|
-
*/
|
|
626
|
-
this.allowClear = true;
|
|
627
|
-
/**
|
|
628
|
-
* bind to [openStatus], it's the visibility status of dropdown, for showing the arrow on anchor
|
|
629
|
-
*/
|
|
630
|
-
this.openStatus = false;
|
|
631
|
-
/**
|
|
632
|
-
* bind to [disabled] for disabling the anchor
|
|
633
|
-
*/
|
|
634
|
-
this.disabled = false;
|
|
635
|
-
/**
|
|
636
|
-
* will be triggered when clicking the anchor
|
|
637
|
-
*/
|
|
638
|
-
this.anchorClick = new core.EventEmitter();
|
|
639
|
-
/**
|
|
640
|
-
* will be triggered when clicking the clearance
|
|
641
|
-
*/
|
|
642
|
-
this.clearanceClick = new core.EventEmitter();
|
|
643
|
-
}
|
|
644
|
-
Object.defineProperty(AnchorComponent.prototype, "showClearanceFlag", {
|
|
645
|
-
/**
|
|
646
|
-
* flag for showing the clearance flag
|
|
647
|
-
*/
|
|
648
|
-
get: /**
|
|
649
|
-
* flag for showing the clearance flag
|
|
650
|
-
* @return {?}
|
|
651
|
-
*/ function () {
|
|
652
|
-
return !this.checkbox && this.selectedText && this.allowClear;
|
|
653
|
-
},
|
|
654
|
-
enumerable: true,
|
|
655
|
-
configurable: true
|
|
656
|
-
});
|
|
657
|
-
Object.defineProperty(AnchorComponent.prototype, "anchorDisplayText", {
|
|
658
|
-
/**
|
|
659
|
-
* the text displays on anchor
|
|
660
|
-
*/
|
|
661
|
-
get: /**
|
|
662
|
-
* the text displays on anchor
|
|
663
|
-
* @return {?}
|
|
664
|
-
*/ function () {
|
|
665
|
-
/** @type {?} */
|
|
666
|
-
var anchorDisplayText = this.selectedText ? (this.formatNumber ? (isNumber(this.selectedText) ?
|
|
667
|
-
this._decimalPipe.transform(this.selectedText, '1.0-2') : this.selectedText) :
|
|
668
|
-
this.selectedText) + (this.suffixText ? this.suffixText : '') : this.placeHolder;
|
|
669
|
-
/** @type {?} */
|
|
670
|
-
var charLength = 1;
|
|
671
|
-
if (this.showClearanceFlag && this.anchorLength > 0) {
|
|
672
|
-
charLength = Math.floor((this.anchorLength - 50) / 7);
|
|
673
|
-
}
|
|
674
|
-
else {
|
|
675
|
-
charLength = Math.floor((this.anchorLength - 50) / 7);
|
|
676
|
-
}
|
|
677
|
-
if (anchorDisplayText.length > charLength) {
|
|
678
|
-
anchorDisplayText = anchorDisplayText.slice(0, charLength - 2) + '...';
|
|
679
|
-
}
|
|
680
|
-
return anchorDisplayText;
|
|
681
|
-
},
|
|
682
|
-
enumerable: true,
|
|
683
|
-
configurable: true
|
|
684
|
-
});
|
|
685
|
-
Object.defineProperty(AnchorComponent.prototype, "anchorClass", {
|
|
686
|
-
/**
|
|
687
|
-
* anchor CSS class
|
|
688
|
-
*/
|
|
689
|
-
get: /**
|
|
690
|
-
* anchor CSS class
|
|
691
|
-
* @return {?}
|
|
692
|
-
*/ function () {
|
|
693
|
-
/** @type {?} */
|
|
694
|
-
var anchorClassStatusPart;
|
|
695
|
-
/** @type {?} */
|
|
696
|
-
var anchorClassFontColor;
|
|
697
|
-
if (this.disabled) {
|
|
698
|
-
anchorClassStatusPart = 'selection-anchor-disabled';
|
|
699
|
-
anchorClassFontColor = 'place-holder';
|
|
700
|
-
}
|
|
701
|
-
else {
|
|
702
|
-
if (this.openStatus) {
|
|
703
|
-
anchorClassStatusPart = 'selection-anchor-open';
|
|
704
|
-
}
|
|
705
|
-
else {
|
|
706
|
-
anchorClassStatusPart = 'selection-anchor-close';
|
|
707
|
-
}
|
|
708
|
-
if (this.selectedText != null) {
|
|
709
|
-
anchorClassFontColor = 'selected-item';
|
|
710
|
-
}
|
|
711
|
-
else {
|
|
712
|
-
anchorClassFontColor = 'place-holder';
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
return anchorClassStatusPart + " " + anchorClassFontColor;
|
|
716
|
-
},
|
|
717
|
-
enumerable: true,
|
|
718
|
-
configurable: true
|
|
719
|
-
});
|
|
720
|
-
/**
|
|
721
|
-
* triggered when clicking the anchor
|
|
722
|
-
*/
|
|
723
|
-
/**
|
|
724
|
-
* triggered when clicking the anchor
|
|
725
|
-
* @param {?} event
|
|
726
|
-
* @return {?}
|
|
727
|
-
*/
|
|
728
|
-
AnchorComponent.prototype.onAnchorClick = /**
|
|
729
|
-
* triggered when clicking the anchor
|
|
730
|
-
* @param {?} event
|
|
731
|
-
* @return {?}
|
|
732
|
-
*/
|
|
733
|
-
function (event) {
|
|
734
|
-
this.anchorClick.emit(event);
|
|
735
|
-
};
|
|
736
|
-
/**
|
|
737
|
-
* triggered with (blur) of anchor
|
|
738
|
-
*/
|
|
739
|
-
/**
|
|
740
|
-
* triggered with (blur) of anchor
|
|
741
|
-
* @param {?} event
|
|
742
|
-
* @return {?}
|
|
743
|
-
*/
|
|
744
|
-
AnchorComponent.prototype.onAnchorBlur = /**
|
|
745
|
-
* triggered with (blur) of anchor
|
|
746
|
-
* @param {?} event
|
|
747
|
-
* @return {?}
|
|
748
|
-
*/
|
|
749
|
-
function (event) {
|
|
750
|
-
stopPropagationAndDefault(event);
|
|
751
|
-
};
|
|
752
|
-
/**
|
|
753
|
-
* triggered when clicking the clearance
|
|
754
|
-
*/
|
|
755
|
-
/**
|
|
756
|
-
* triggered when clicking the clearance
|
|
757
|
-
* @param {?} event
|
|
758
|
-
* @return {?}
|
|
759
|
-
*/
|
|
760
|
-
AnchorComponent.prototype.onClearanceClick = /**
|
|
761
|
-
* triggered when clicking the clearance
|
|
762
|
-
* @param {?} event
|
|
763
|
-
* @return {?}
|
|
764
|
-
*/
|
|
765
|
-
function (event) {
|
|
766
|
-
this.clearanceClick.emit(event);
|
|
767
|
-
};
|
|
768
|
-
/**
|
|
769
|
-
* triggered when resizing, get the clientWidth of anchor
|
|
770
|
-
*/
|
|
771
|
-
/**
|
|
772
|
-
* triggered when resizing, get the clientWidth of anchor
|
|
773
|
-
* @return {?}
|
|
774
|
-
*/
|
|
775
|
-
AnchorComponent.prototype.onResize = /**
|
|
776
|
-
* triggered when resizing, get the clientWidth of anchor
|
|
777
|
-
* @return {?}
|
|
778
|
-
*/
|
|
779
|
-
function () {
|
|
780
|
-
this.anchorLength = this.anchorRef ? this.anchorRef.nativeElement ? this.anchorRef.nativeElement.clientWidth : 0 : 0;
|
|
781
|
-
};
|
|
782
|
-
AnchorComponent.decorators = [
|
|
783
|
-
{ type: core.Component, args: [{
|
|
784
|
-
selector: 'anchor',
|
|
785
|
-
template: "\n <span #anchor tabindex=\"2\" [ngClass]=\"anchorClass\" (window:resize)=\"onResize()\"\n (mousedown)=\"onAnchorClick($event)\" (blur)=\"onAnchorBlur($event)\"> {{anchorDisplayText}}\n <span #selectionClearance class=\"selection-clearance\" (mousedown)=\"onClearanceClick($event)\" *ngIf=\"showClearanceFlag\">×</span>\n </span>\n ",
|
|
786
|
-
providers: [common.DecimalPipe],
|
|
787
|
-
styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.selection-anchor-close:after,.selection-anchor-disabled:after,.selection-anchor-open:after,.vertical-center{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.hover-box,.selection-anchor-close:hover{outline:0;box-shadow:0 0 6px #23adff;border-radius:4px}.anchor-box,.selection-anchor,.selection-anchor-close,.selection-anchor-disabled,.selection-anchor-open{height:100%;border-radius:4px;width:100%;position:relative;display:inline-block;padding:8px 12px 5px;border:1px solid;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-sizing:border-box;white-space:nowrap}.selection-anchor,.selection-anchor-close,.selection-anchor-open{cursor:pointer}.selection-anchor .selection-clearance,.selection-anchor-close .selection-clearance,.selection-anchor-open .selection-clearance{position:absolute;right:35px;font-weight:700}.selection-anchor .selection-clearance:hover,.selection-anchor-close .selection-clearance:hover,.selection-anchor-open .selection-clearance:hover{color:#000}.selection-anchor-close:focus,.selection-anchor-open:focus,.selection-anchor:focus{box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;border-color:#66afe9}.selection-anchor-disabled{border-color:#ccc;cursor:default;pointer-events:none;background:#f8f8f8;-webkit-filter:opacity(50%);filter:opacity(50%)}.selection-anchor-disabled:after{font-size:12px;content:'\\0023F7';right:10px;padding-bottom:3px}.selection-anchor-open{border-bottom:none;border-bottom-right-radius:0;border-bottom-left-radius:0;border-color:#66afe9}.selection-anchor-open:after{font-size:12px;content:\"\\0023F6\";right:10px;padding-bottom:3px}.selection-anchor-close{border-color:#ccc}.selection-anchor-close:after{font-size:12px;content:'\\0023F7';right:10px;padding-bottom:3px}.place-holder{color:#999}.selected-item{color:#495057}"]
|
|
788
|
-
}] }
|
|
789
|
-
];
|
|
790
|
-
/** @nocollapse */
|
|
791
|
-
AnchorComponent.ctorParameters = function () {
|
|
792
|
-
return [
|
|
793
|
-
{ type: common.DecimalPipe }
|
|
794
|
-
];
|
|
795
|
-
};
|
|
796
|
-
AnchorComponent.propDecorators = {
|
|
797
|
-
anchorRef: [{ type: core.ViewChild, args: ['anchor', { read: core.ElementRef },] }],
|
|
798
|
-
placeHolder: [{ type: core.Input }],
|
|
799
|
-
checkbox: [{ type: core.Input }],
|
|
800
|
-
suffixText: [{ type: core.Input }],
|
|
801
|
-
allowClear: [{ type: core.Input }],
|
|
802
|
-
formatNumber: [{ type: core.Input }],
|
|
803
|
-
selectedText: [{ type: core.Input }],
|
|
804
|
-
openStatus: [{ type: core.Input }],
|
|
805
|
-
disabled: [{ type: core.Input }],
|
|
806
|
-
anchorClick: [{ type: core.Output }],
|
|
807
|
-
clearanceClick: [{ type: core.Output }]
|
|
808
|
-
};
|
|
809
|
-
return AnchorComponent;
|
|
810
|
-
}());
|
|
811
|
-
|
|
812
|
-
/**
|
|
813
|
-
* @fileoverview added by tsickle
|
|
814
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
815
|
-
*/
|
|
816
|
-
var DropdownComponent = /** @class */ (function () {
|
|
817
|
-
function DropdownComponent() {
|
|
818
|
-
/**
|
|
819
|
-
* bind to [checkbox], the flag for multi-select (checkbox) mode.
|
|
820
|
-
*/
|
|
821
|
-
this.checkbox = false;
|
|
822
|
-
/**
|
|
823
|
-
* bind to [filterBox] for displaying the filter input text box
|
|
824
|
-
*/
|
|
825
|
-
this.filterBox = false;
|
|
826
|
-
/**
|
|
827
|
-
* bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
|
|
828
|
-
*/
|
|
829
|
-
this.allowClear = true;
|
|
830
|
-
/**
|
|
831
|
-
* bind to [formatNumber] for show formatted number text
|
|
832
|
-
*/
|
|
833
|
-
this.formatNumber = false;
|
|
834
|
-
/**
|
|
835
|
-
* for 2-way binding of [selectedValue]
|
|
836
|
-
*/
|
|
837
|
-
this.selectedValueChange = new core.EventEmitter(true);
|
|
838
|
-
/**
|
|
839
|
-
* [selectionChange] event that will be triggered when changing of the selection
|
|
840
|
-
*/
|
|
841
|
-
this.selectionChange = new core.EventEmitter(true);
|
|
842
|
-
/**
|
|
843
|
-
* [dropdownBlur] event that will be triggered with (blur) of dropdown
|
|
844
|
-
*/
|
|
845
|
-
this.dropdownBlur = new core.EventEmitter();
|
|
846
|
-
/**
|
|
847
|
-
* [itemClick] event that will be triggered when clicking the option of dropdown
|
|
848
|
-
*/
|
|
849
|
-
this.itemClick = new core.EventEmitter();
|
|
850
|
-
/**
|
|
851
|
-
* flag of clicking dropdown. It's to prevent (blur) of dropdown from happening in checkbox mode.
|
|
852
|
-
*/
|
|
853
|
-
this._clickedItems = false;
|
|
854
|
-
}
|
|
855
|
-
/**
|
|
856
|
-
* @param {?} changes
|
|
857
|
-
* @return {?}
|
|
858
|
-
*/
|
|
859
|
-
DropdownComponent.prototype.ngOnChanges = /**
|
|
860
|
-
* @param {?} changes
|
|
861
|
-
* @return {?}
|
|
862
|
-
*/
|
|
863
|
-
function (changes) {
|
|
864
|
-
if (changes.items) {
|
|
865
|
-
this._checkSelectionChange(changes.items.previousValue, changes.items.currentValue);
|
|
866
|
-
}
|
|
867
|
-
};
|
|
868
|
-
/**
|
|
869
|
-
* triggered when clicking the dropdown
|
|
870
|
-
*/
|
|
871
|
-
/**
|
|
872
|
-
* triggered when clicking the dropdown
|
|
873
|
-
* @param {?} event
|
|
874
|
-
* @return {?}
|
|
875
|
-
*/
|
|
876
|
-
DropdownComponent.prototype.onItemsClick = /**
|
|
877
|
-
* triggered when clicking the dropdown
|
|
878
|
-
* @param {?} event
|
|
879
|
-
* @return {?}
|
|
880
|
-
*/
|
|
881
|
-
function (event) {
|
|
882
|
-
if (event.offsetX > (event.target.clientWidth + event.target.clientLeft)) {
|
|
883
|
-
stopPropagationAndDefault(event);
|
|
884
|
-
return;
|
|
885
|
-
}
|
|
886
|
-
// should ignore clicking on filter
|
|
887
|
-
if (this.checkbox && event.target.type !== 'text') {
|
|
888
|
-
this._clickedItems = true;
|
|
889
|
-
}
|
|
890
|
-
};
|
|
891
|
-
/**
|
|
892
|
-
* triggered when clicking the item
|
|
893
|
-
*/
|
|
894
|
-
/**
|
|
895
|
-
* triggered when clicking the item
|
|
896
|
-
* @param {?} currentItem
|
|
897
|
-
* @return {?}
|
|
898
|
-
*/
|
|
899
|
-
DropdownComponent.prototype.onItemClick = /**
|
|
900
|
-
* triggered when clicking the item
|
|
901
|
-
* @param {?} currentItem
|
|
902
|
-
* @return {?}
|
|
903
|
-
*/
|
|
904
|
-
function (currentItem) {
|
|
905
|
-
if (!this.checkbox) {
|
|
906
|
-
this.selectedValue = this._getItemValue(currentItem); // currentItem.value != null ? currentItem.value : currentItem.text;
|
|
907
|
-
clearAllSelection(this.items);
|
|
908
|
-
// set the selection of current one
|
|
909
|
-
currentItem.selected = true;
|
|
910
|
-
this.itemClick.emit(currentItem);
|
|
911
|
-
this._onSelectionChange(this.selectedValue);
|
|
912
|
-
}
|
|
913
|
-
};
|
|
914
|
-
/**
|
|
915
|
-
* triggers with (blur) event of filter input box
|
|
916
|
-
*/
|
|
917
|
-
/**
|
|
918
|
-
* triggers with (blur) event of filter input box
|
|
919
|
-
* @param {?} event
|
|
920
|
-
* @return {?}
|
|
921
|
-
*/
|
|
922
|
-
DropdownComponent.prototype.onFilterTextBlur = /**
|
|
923
|
-
* triggers with (blur) event of filter input box
|
|
924
|
-
* @param {?} event
|
|
925
|
-
* @return {?}
|
|
926
|
-
*/
|
|
927
|
-
function (event) {
|
|
928
|
-
this.dropdownBlur.emit(event);
|
|
929
|
-
};
|
|
930
|
-
/**
|
|
931
|
-
* triggers with (blur) event of dropdown
|
|
932
|
-
*/
|
|
933
|
-
/**
|
|
934
|
-
* triggers with (blur) event of dropdown
|
|
935
|
-
* @param {?} event
|
|
936
|
-
* @return {?}
|
|
937
|
-
*/
|
|
938
|
-
DropdownComponent.prototype.onItemsBlur = /**
|
|
939
|
-
* triggers with (blur) event of dropdown
|
|
940
|
-
* @param {?} event
|
|
941
|
-
* @return {?}
|
|
942
|
-
*/
|
|
943
|
-
function (event) {
|
|
944
|
-
if (this.checkbox) {
|
|
945
|
-
if (this._clickedItems) {
|
|
946
|
-
// in checkbox mode, this blur event will be ignored when clicking the dropdown (check the checkbox)
|
|
947
|
-
event.target.focus();
|
|
948
|
-
this._clickedItems = false;
|
|
949
|
-
return;
|
|
950
|
-
}
|
|
951
|
-
}
|
|
952
|
-
this.dropdownBlur.emit(event);
|
|
953
|
-
};
|
|
954
|
-
/**
|
|
955
|
-
* toggle the selection when checking status changed (in checkbox mode)
|
|
956
|
-
*/
|
|
957
|
-
/**
|
|
958
|
-
* toggle the selection when checking status changed (in checkbox mode)
|
|
959
|
-
* @param {?} item
|
|
960
|
-
* @return {?}
|
|
961
|
-
*/
|
|
962
|
-
DropdownComponent.prototype.toggleSelection = /**
|
|
963
|
-
* toggle the selection when checking status changed (in checkbox mode)
|
|
964
|
-
* @param {?} item
|
|
965
|
-
* @return {?}
|
|
966
|
-
*/
|
|
967
|
-
function (item) {
|
|
968
|
-
item.selected = !item.selected;
|
|
969
|
-
this.selectionChange.emit(this._getItemValue(item)); // item.value != null ? item.value : item.text);
|
|
970
|
-
};
|
|
971
|
-
Object.defineProperty(DropdownComponent.prototype, "itemsValues", {
|
|
972
|
-
/**
|
|
973
|
-
* items values list after applying the filter
|
|
974
|
-
*/
|
|
975
|
-
get: /**
|
|
976
|
-
* items values list after applying the filter
|
|
977
|
-
* @return {?}
|
|
978
|
-
*/ function () {
|
|
979
|
-
/** @type {?} */
|
|
980
|
-
var filter;
|
|
981
|
-
if (this.filterValue) {
|
|
982
|
-
filter = this.filterValue.toUpperCase();
|
|
983
|
-
}
|
|
984
|
-
if (filter == null) {
|
|
985
|
-
return this.items;
|
|
986
|
-
}
|
|
987
|
-
if (!this.items || this.items.length === 0) {
|
|
988
|
-
return [];
|
|
989
|
-
}
|
|
990
|
-
if (hasGroup(this.items)) {
|
|
991
|
-
/** @type {?} */
|
|
992
|
-
var items_1 = [];
|
|
993
|
-
this.items.forEach(function (groupItem) {
|
|
994
|
-
if (groupItem.group != null && groupItem.group.toString().toUpperCase().includes(filter)) {
|
|
995
|
-
// if groupItem contains the filters, the groupItem needs to be displayed as well
|
|
996
|
-
items_1.push(groupItem);
|
|
997
|
-
}
|
|
998
|
-
else {
|
|
999
|
-
/** @type {?} */
|
|
1000
|
-
var filteredItems = groupItem.items.filter(function (item) { return item.text != null && item.text.toString().toUpperCase().includes(filter); });
|
|
1001
|
-
if (filteredItems && filteredItems.length > 0) {
|
|
1002
|
-
items_1.push({ group: groupItem.group, items: filteredItems });
|
|
1003
|
-
}
|
|
1004
|
-
}
|
|
1005
|
-
});
|
|
1006
|
-
return items_1;
|
|
1007
|
-
}
|
|
1008
|
-
else {
|
|
1009
|
-
return this.items.filter(function (item) { return (item.text != null && item.text.toString().toUpperCase().includes(filter)); });
|
|
1010
|
-
}
|
|
1011
|
-
},
|
|
1012
|
-
enumerable: true,
|
|
1013
|
-
configurable: true
|
|
1014
|
-
});
|
|
1015
|
-
Object.defineProperty(DropdownComponent.prototype, "optionsClass", {
|
|
1016
|
-
/**
|
|
1017
|
-
* options CSS class
|
|
1018
|
-
*/
|
|
1019
|
-
get: /**
|
|
1020
|
-
* options CSS class
|
|
1021
|
-
* @return {?}
|
|
1022
|
-
*/ function () {
|
|
1023
|
-
if (this.filterBox && !this.checkbox) {
|
|
1024
|
-
return 'options with-filter';
|
|
1025
|
-
}
|
|
1026
|
-
else {
|
|
1027
|
-
return 'options no-filter';
|
|
1028
|
-
}
|
|
1029
|
-
},
|
|
1030
|
-
enumerable: true,
|
|
1031
|
-
configurable: true
|
|
1032
|
-
});
|
|
1033
|
-
/**
|
|
1034
|
-
* get item value. Return text if value is not available
|
|
1035
|
-
*/
|
|
1036
|
-
/**
|
|
1037
|
-
* get item value. Return text if value is not available
|
|
1038
|
-
* @private
|
|
1039
|
-
* @param {?} item
|
|
1040
|
-
* @return {?}
|
|
1041
|
-
*/
|
|
1042
|
-
DropdownComponent.prototype._getItemValue = /**
|
|
1043
|
-
* get item value. Return text if value is not available
|
|
1044
|
-
* @private
|
|
1045
|
-
* @param {?} item
|
|
1046
|
-
* @return {?}
|
|
1047
|
-
*/
|
|
1048
|
-
function (item) {
|
|
1049
|
-
return item ? item.value != null ? item.value : item.text : undefined;
|
|
1050
|
-
};
|
|
1051
|
-
/**
|
|
1052
|
-
* selection changed, emits events: (selectedValueChange) and (selectionChange);
|
|
1053
|
-
*/
|
|
1054
|
-
/**
|
|
1055
|
-
* selection changed, emits events: (selectedValueChange) and (selectionChange);
|
|
1056
|
-
* @private
|
|
1057
|
-
* @param {?} value
|
|
1058
|
-
* @return {?}
|
|
1059
|
-
*/
|
|
1060
|
-
DropdownComponent.prototype._onSelectionChange = /**
|
|
1061
|
-
* selection changed, emits events: (selectedValueChange) and (selectionChange);
|
|
1062
|
-
* @private
|
|
1063
|
-
* @param {?} value
|
|
1064
|
-
* @return {?}
|
|
1065
|
-
*/
|
|
1066
|
-
function (value) {
|
|
1067
|
-
this.selectedValueChange.emit(value);
|
|
1068
|
-
this.selectionChange.emit(value);
|
|
1069
|
-
};
|
|
1070
|
-
/**
|
|
1071
|
-
* check whether the selection is changed. Emits relative events when if changed.
|
|
1072
|
-
*/
|
|
1073
|
-
/**
|
|
1074
|
-
* check whether the selection is changed. Emits relative events when if changed.
|
|
1075
|
-
* @private
|
|
1076
|
-
* @param {?} previousValue
|
|
1077
|
-
* @param {?} currentValue
|
|
1078
|
-
* @return {?}
|
|
1079
|
-
*/
|
|
1080
|
-
DropdownComponent.prototype._checkSelectionChange = /**
|
|
1081
|
-
* check whether the selection is changed. Emits relative events when if changed.
|
|
1082
|
-
* @private
|
|
1083
|
-
* @param {?} previousValue
|
|
1084
|
-
* @param {?} currentValue
|
|
1085
|
-
* @return {?}
|
|
1086
|
-
*/
|
|
1087
|
-
function (previousValue, currentValue) {
|
|
1088
|
-
/** @type {?} */
|
|
1089
|
-
var curSelectedItem = getFirstSelectedItem(currentValue);
|
|
1090
|
-
/** @type {?} */
|
|
1091
|
-
var lastSelectedItem = getFirstSelectedItem(previousValue);
|
|
1092
|
-
/** @type {?} */
|
|
1093
|
-
var curSelectedItemId = curSelectedItem ? curSelectedItem.id : undefined;
|
|
1094
|
-
/** @type {?} */
|
|
1095
|
-
var lastSelectedItemId = lastSelectedItem ? lastSelectedItem.id : undefined;
|
|
1096
|
-
if (curSelectedItemId !== lastSelectedItemId && !this.checkbox) {
|
|
1097
|
-
this._onSelectionChange(this._getItemValue(curSelectedItem));
|
|
1098
|
-
}
|
|
1099
|
-
};
|
|
1100
|
-
DropdownComponent.decorators = [
|
|
1101
|
-
{ type: core.Component, args: [{
|
|
1102
|
-
selector: 'dropdown',
|
|
1103
|
-
template: "\n <span #dropdown class=\"dropdown\" tabindex=\"3\" (mousedown)=\"onItemsClick($event)\" (blur)=\"onItemsBlur($event)\" *ngIf=\"!disabled\" >\n <input-filter #filterInput tabindex=\"4\" *ngIf=\"filterBox && !checkbox\" [(filterValue)]=\"filterValue\" (inputFilterBlur)=\"onFilterTextBlur($event)\"></input-filter>\n <span #selectionOptions [ngClass]=\"optionsClass\">\n <ng-container *ngFor=\"let item of itemsValues\" >\n <ng-container *ngIf=\"item && item.group\">\n <group-item [item]=\"item\"></group-item>\n <item *ngFor=\"let subItem of item.items\" (itemClick)=\"onItemClick(subItem)\" (checkStatusChange)=\"toggleSelection(subItem)\"\n [item]=\"subItem\" [checkbox]=\"checkbox\" [formatNumber]=\"formatNumber\" [suffixText]=\"suffixText\">\n </item>\n </ng-container>\n <ng-container *ngIf=\"item && !item.group\">\n <item (itemClick)=\"onItemClick(item)\" (checkStatusChange)=\"toggleSelection(item)\"\n [item]=\"item\" [checkbox]=\"checkbox\" [formatNumber]=\"formatNumber\" [suffixText]=\"suffixText\">\n </item>\n </ng-container>\n </ng-container>\n </span>\n </span>\n ",
|
|
1104
|
-
styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.dropdown{width:100%;padding:0;display:none;margin:0;border:1px solid #66afe9;border-top:none;border-bottom:none;border-top-right-radius:0;border-top-left-radius:0;box-sizing:border-box;position:relative;z-index:999}.dropdown:focus{outline:0}.dropdown .options{width:calc(100% + 2px);left:0;box-sizing:border-box;background:#fff;position:absolute;max-height:228px;overflow-y:auto;overflow-x:hidden;border:1px solid #66afe9;border-top:none;border-bottom-right-radius:4px;border-bottom-left-radius:4px;margin-left:-1px;margin-right:-1px}.dropdown .with-filter{top:32px}.dropdown .no-filter{top:0}"]
|
|
1105
|
-
}] }
|
|
1106
|
-
];
|
|
1107
|
-
DropdownComponent.propDecorators = {
|
|
1108
|
-
dropdownRef: [{ type: core.ViewChild, args: ['dropdown', { read: core.ElementRef },] }],
|
|
1109
|
-
filterInputRef: [{ type: core.ViewChild, args: ['filterInput', { read: core.ElementRef },] }],
|
|
1110
|
-
placeHolder: [{ type: core.Input }],
|
|
1111
|
-
items: [{ type: core.Input }],
|
|
1112
|
-
checkbox: [{ type: core.Input }],
|
|
1113
|
-
selectedValue: [{ type: core.Input }],
|
|
1114
|
-
filterBox: [{ type: core.Input }],
|
|
1115
|
-
suffixText: [{ type: core.Input }],
|
|
1116
|
-
disabled: [{ type: core.Input }],
|
|
1117
|
-
allowClear: [{ type: core.Input }],
|
|
1118
|
-
formatNumber: [{ type: core.Input }],
|
|
1119
|
-
selectedValueChange: [{ type: core.Output }],
|
|
1120
|
-
selectionChange: [{ type: core.Output }],
|
|
1121
|
-
dropdownBlur: [{ type: core.Output }],
|
|
1122
|
-
itemClick: [{ type: core.Output }]
|
|
1123
|
-
};
|
|
1124
|
-
return DropdownComponent;
|
|
1125
|
-
}());
|
|
1126
|
-
|
|
1127
|
-
/**
|
|
1128
|
-
* @fileoverview added by tsickle
|
|
1129
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
1130
|
-
*/
|
|
1131
|
-
var DropdownListModule = /** @class */ (function () {
|
|
1132
|
-
function DropdownListModule() {
|
|
1133
|
-
}
|
|
1134
|
-
DropdownListModule.decorators = [
|
|
1135
|
-
{ type: core.NgModule, args: [{
|
|
1136
|
-
declarations: [
|
|
1137
|
-
DropdownListComponent,
|
|
1138
|
-
ItemComponent,
|
|
1139
|
-
GroupItemComponent,
|
|
1140
|
-
InputFilterComponent,
|
|
1141
|
-
AnchorComponent,
|
|
1142
|
-
DropdownComponent
|
|
1143
|
-
],
|
|
1144
|
-
exports: [DropdownListComponent],
|
|
1145
|
-
imports: [common.CommonModule, forms.FormsModule],
|
|
1146
|
-
providers: [],
|
|
1147
|
-
bootstrap: [],
|
|
1148
|
-
},] }
|
|
1149
|
-
];
|
|
1150
|
-
return DropdownListModule;
|
|
1151
|
-
}());
|
|
1152
|
-
|
|
1153
|
-
/**
|
|
1154
|
-
* @fileoverview added by tsickle
|
|
1155
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
1156
|
-
*/
|
|
1157
|
-
|
|
1158
|
-
/**
|
|
1159
|
-
* @fileoverview added by tsickle
|
|
1160
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
1161
|
-
*/
|
|
1162
|
-
|
|
1163
|
-
/**
|
|
1164
|
-
* @fileoverview added by tsickle
|
|
1165
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
1166
|
-
*/
|
|
1167
|
-
|
|
1168
|
-
exports.DropdownListComponent = DropdownListComponent;
|
|
1169
|
-
exports.DropdownListModule = DropdownListModule;
|
|
1170
|
-
exports.ɵd = AnchorComponent;
|
|
1171
|
-
exports.ɵe = DropdownComponent;
|
|
1172
|
-
exports.ɵc = InputFilterComponent;
|
|
1173
|
-
exports.ɵb = GroupItemComponent;
|
|
1174
|
-
exports.ɵa = ItemComponent;
|
|
1175
|
-
|
|
1176
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
1177
|
-
|
|
1178
|
-
})));
|
|
1179
|
-
|
|
1180
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWRyb3Bkb3duLWxpc3QudW1kLmpzLm1hcCIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5nOi8vbmd4LWRyb3Bkb3duLWxpc3Qvc3JjL25neC1kcm9wZG93bi1saXN0L3V0aWxzL3V0aWwudHMiLCJuZzovL25neC1kcm9wZG93bi1saXN0L3NyYy9uZ3gtZHJvcGRvd24tbGlzdC9kcm9wZG93bi1saXN0LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWRyb3Bkb3duLWxpc3Qvc3JjL25neC1kcm9wZG93bi1saXN0L2l0ZW0vaXRlbS5jb21wb25lbnQudHMiLCJuZzovL25neC1kcm9wZG93bi1saXN0L3NyYy9uZ3gtZHJvcGRvd24tbGlzdC9ncm91cC1pdGVtL2dyb3VwLWl0ZW0uY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtZHJvcGRvd24tbGlzdC9zcmMvbmd4LWRyb3Bkb3duLWxpc3QvZmlsdGVyL2lucHV0LWZpbHRlci5jb21wb25lbnQudHMiLCJuZzovL25neC1kcm9wZG93bi1saXN0L3NyYy9uZ3gtZHJvcGRvd24tbGlzdC9hbmNob3IvYW5jaG9yLmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWRyb3Bkb3duLWxpc3Qvc3JjL25neC1kcm9wZG93bi1saXN0L2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWRyb3Bkb3duLWxpc3Qvc3JjL25neC1kcm9wZG93bi1saXN0L2Ryb3Bkb3duLWxpc3QubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMClcclxuICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZShyZXN1bHQudmFsdWUpOyB9KS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuIiwiLyoqXHJcbiAqIGNoZWNrIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGl0ZW1zIGNvbnRhaW5zIGdyb3VwXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaGFzR3JvdXAoaXRlbXMpOiBib29sZWFuIHtcclxuICByZXR1cm4gaXRlbXMgPyAoaXRlbXMuZmluZChpdGVtID0+IGl0ZW0uZ3JvdXApICE9IG51bGwpIDogZmFsc2U7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBjbGVhciBhbGwgc2VsZWN0aW9ucyBmcm9tIHRoZSBwcm92aWRlIGl0ZW1zLlxyXG4gKiBAcGFyYW0gaXRlbXMgdGhlIGRyb3Bkb3duIGl0ZW1zLCBjYW4gYmUgZ3JvdXAgb3IgaXRlbVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQWxsU2VsZWN0aW9uKGl0ZW1zOiBhbnkpOiB2b2lkIHtcclxuICBpZiAoaGFzR3JvdXAoaXRlbXMpKSB7XHJcbiAgICBmb3IgKGNvbnN0IGdyb3VwSXRlbSBvZiBpdGVtcykge1xyXG4gICAgICBpZiAoZ3JvdXBJdGVtLml0ZW1zKSB7XHJcbiAgICAgICAgZ3JvdXBJdGVtLml0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uc2VsZWN0ZWQpLmZvckVhY2goaXRlbSA9PiBpdGVtLnNlbGVjdGVkID0gZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIGNsZWFyIHRoZSBzZWxlY3Rpb24gb2YgcHJldmlvdXMgc2VsZWN0ZWQgaXRlbVxyXG4gICAgaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zZWxlY3RlZCkuZm9yRWFjaChpdGVtID0+IGl0ZW0uc2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogc3RvcCBhbGwgcHJvcGFnYXRpb24gYW5kIGRlZmF1bHQgYWN0aW9uc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHN0b3BQcm9wYWdhdGlvbkFuZERlZmF1bHQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIGNoZWNrIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHZhbHVlIGlzIG51bWJlciBvZiBub3RcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcih2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuICEodmFsdWUgPT0gbnVsbCB8fCBpc05hTih2YWx1ZSkgfHwgdmFsdWUubGVuZ3RoID09PSAwKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIGdldCB0aGUgc2VsZWN0ZWQgaXRlbSBmcm9tIHRoZSBpdGVtcyBsaXN0IChpbmNsdWRpbmcgaXRlbSBhbmQgZ3JvdXApXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rmlyc3RTZWxlY3RlZEl0ZW0oaXRlbXM6IGFueSk6IGFueSB7XHJcbiAgaWYgKCFpdGVtcykge1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcbiAgbGV0IHNlbGVjdGVkSXRlbTtcclxuICBpZiAoaGFzR3JvdXAoaXRlbXMpKSB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgc2VsZWN0ZWRJdGVtID0gaXRlbS5pdGVtcyA/IGl0ZW0uaXRlbXMuZmluZChzdWJJdGVtID0+IHN1Ykl0ZW0uc2VsZWN0ZWQpIDogdW5kZWZpbmVkO1xyXG4gICAgICBpZiAoc2VsZWN0ZWRJdGVtKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgc2VsZWN0ZWRJdGVtID0gaXRlbXMgPyBpdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5zZWxlY3RlZCkgOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIHJldHVybiBzZWxlY3RlZEl0ZW07XHJcbn1cclxuIiwiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Y2xlYXJBbGxTZWxlY3Rpb24sIGdldEZpcnN0U2VsZWN0ZWRJdGVtLCBzdG9wUHJvcGFnYXRpb25BbmREZWZhdWx0fSBmcm9tICcuL3V0aWxzL3V0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZHJvcGRvd24tbGlzdCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHNwYW4gY2xhc3M9XCJuZ3gtc2VsZWN0XCI+XG4gICAgICAgIDxhbmNob3IgKGFuY2hvckNsaWNrKT1cIm9uQW5jaG9yQ2xpY2soJGV2ZW50KVwiIChjbGVhcmFuY2VDbGljayk9XCJvbkNsZWFyYW5jZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIFtjaGVja2JveF09XCJtdWx0aVNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgW2Zvcm1hdE51bWJlcl09XCJmb3JtYXROdW1iZXJcIlxuICAgICAgICAgICAgICAgIFtzdWZmaXhUZXh0XT1cInN1ZmZpeFRleHRcIlxuICAgICAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCJwbGFjZUhvbGRlclwiXG4gICAgICAgICAgICAgICAgW2FsbG93Q2xlYXJdPVwiYWxsb3dDbGVhclwiXG4gICAgICAgICAgICAgICAgW29wZW5TdGF0dXNdPVwiZHJvcGRvd25WaXNpYmlsaXR5XCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRUZXh0XT1cInNlbGVjdGVkVGV4dFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgIDwvYW5jaG9yPlxuICAgICAgICA8ZHJvcGRvd24gI2Ryb3Bkb3duIChkcm9wZG93bkJsdXIpID0gXCJvbkl0ZW1zQmx1cigpXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbaXRlbXNdPVwiaXRlbXNcIlxuICAgICAgICAgICAgICAgIFtjaGVja2JveF09XCJtdWx0aVNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgW2ZpbHRlckJveF09XCJmaWx0ZXJCb3hcIlxuICAgICAgICAgICAgICAgIFtmb3JtYXROdW1iZXJdPVwiZm9ybWF0TnVtYmVyXCJcbiAgICAgICAgICAgICAgICBbc3VmZml4VGV4dF09XCJzdWZmaXhUZXh0XCJcbiAgICAgICAgICAgICAgICBbKHNlbGVjdGVkVmFsdWUpXT1cInNlbGVjdGVkVmFsdWVcIlxuICAgICAgICAgICAgICAgIChpdGVtQ2xpY2spID0gXCJvbkl0ZW1DbGljaygpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgPC9kcm9wZG93bj5cbiAgICA8L3NwYW4+XG4gIGAsXG4gIHN0eWxlVXJsczogWycuL2Ryb3Bkb3duLWxpc3QuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5cbmV4cG9ydCBjbGFzcyBEcm9wZG93bkxpc3RDb21wb25lbnQge1xuICBAVmlld0NoaWxkKCdkcm9wZG93bicsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBkcm9wZG93blJlZjogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogYmluZCB0byBbcGxhY2VIb2xkZXJdIGZvciBkaXNwbGF5aW5nIHRoZSBwbGFjZSBob2xkZXIgc3RyaW5nIG9mIHRoZSBhbmNob3IuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZUhvbGRlcjogc3RyaW5nO1xuICAvKipcbiAgICogYmluZCB0byBbaXRlbXNdIGZvciB0aGUgb3B0aW9ucy9ncm91cHMgaW4gdGhlIGRyb3Bkb3duXG4gICAqL1xuICBASW5wdXQoKSBpdGVtczogYW55W107XG4gIC8qKlxuICAgKiBiaW5kIHRvIFttdWx0aVNlbGVjdGlvbl0sIHRoZSBmbGFnIGZvciBtdWx0aS1zZWxlY3QgKGNoZWNrYm94KSBtb2RlLlxuICAgKi9cbiAgQElucHV0KCkgbXVsdGlTZWxlY3Rpb24gPSBmYWxzZTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW3NlbGVjdGVkVmFsdWVdIGZvciB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIG9wdGlvbiBmcm9tIGRyb3Bkb3duXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RlZFZhbHVlOiBhbnk7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtmaWx0ZXJCb3hdIGZvciBkaXNwbGF5aW5nIHRoZSBmaWx0ZXIgaW5wdXQgdGV4dCBib3hcbiAgICovXG4gIEBJbnB1dCgpIGZpbHRlckJveCA9IGZhbHNlO1xuICAvKipcbiAgICogYmluZCB0byBbc3VmZml4VGV4dF0gZm9yIGRpc3BsYXlpbmcgdGhlIHN1ZmZpeCBvZiB0aGUgc2VsZWN0ZWQgdGV4dCBvZiBhbmNob3JcbiAgICovXG4gIEBJbnB1dCgpIHN1ZmZpeFRleHQ6IHN0cmluZztcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2Rpc2FibGVkXSBmb3IgZGlzYWJsaW5nIHRoZSBkcm9wZG93blxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBiaW5kIHRvIFthbGxvd0NsZWFyXSBmb3IgZW5hYmxpbmcgdGhlIGNsZWFyYW5jZSAoY2xlYXJhbmNlIGlzIG5vdCBhdmFpYWJsZSB3aGVuIGNoZWNrYm94IGlzIGVuYWJsZWQpXG4gICAqL1xuICBASW5wdXQoKSBhbGxvd0NsZWFyID0gdHJ1ZTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2Zvcm1hdE51bWJlcl0gZm9yIHNob3cgZm9ybWF0dGVkIG51bWJlciB0ZXh0XG4gICAqL1xuICBASW5wdXQoKSBmb3JtYXROdW1iZXIgPSBmYWxzZTtcbiAgLyoqXG4gICAqIGZvciAyLXdheSBiaW5kaW5nIG9mIFtzZWxlY3RlZFZhbHVlXSwgdXNpbmcgYXN5bmMgZXZlbnQgdG9cbiAgICogcHJldmVudCBcIkV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcIi5cbiAgICovXG4gIEBPdXRwdXQoKSBzZWxlY3RlZFZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KHRydWUpO1xuICAvKipcbiAgICogW3NlbGVjdGlvbkNoYW5nZV0gZXZlbnQgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIGNoYW5naW5nIG9mIHRoZSBzZWxlY3Rpb24uXG4gICAqIFVzaW5nIGFzeW5jIGV2ZW50IHRvIHByZXZlbnQgXCJFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yXCIuXG4gICAqL1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KHRydWUpO1xuXG4gIC8qKlxuICAgKiB2aXNpYmlsaXR5IGZsYWcgb2YgZHJvcCBkb3duXG4gICAqL1xuICBkcm9wZG93blZpc2liaWxpdHkgPSBmYWxzZTtcblxuICAvKipcbiAgICogY3VycmVudCBzZWxlY3RlZCB0ZXh0XG4gICAqL1xuICBnZXQgc2VsZWN0ZWRUZXh0KCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLm11bHRpU2VsZWN0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSBnZXRGaXJzdFNlbGVjdGVkSXRlbSh0aGlzLml0ZW1zKTtcbiAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW0gPyBzZWxlY3RlZEl0ZW0udGV4dCA6IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdpdGggKHNlbGVjdGlvbkNoYW5nZSkgZXZlbnQsIGVtaXRzIChzZWxlY3RlZFZhbHVlQ2hhbmdlKSBhbmQgKHNlbGVjdGlvbkNoYW5nZSlcbiAgICovXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKGV2ZW50KSB7XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlQ2hhbmdlLmVtaXQoZXZlbnQpO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXJlZCB3aXRoIChhbmNob3JDbGljaykgZXZlbnQsIGNvbnRyb2xsaW5nIHRoZSBcIm9wZW5cIiBhbmQgXCJjbG9zZVwiIG9mIHRoZSBkcm9wZG93blxuICAgKi9cbiAgb25BbmNob3JDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgc3RvcFByb3BhZ2F0aW9uQW5kRGVmYXVsdChldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9pc1NlbGVjdGlvbk9wZW4oKSkge1xuICAgICAgdGhpcy5faGlkZUl0ZW1MaXN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Nob3dJdGVtc0xpc3QoKTtcbiAgICB9XG4gICAgc3RvcFByb3BhZ2F0aW9uQW5kRGVmYXVsdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdpdGggKGl0ZW1DbGljaykgZXZlbnQsIGNsb3NlcyB0aGUgZHJvcGRvd24gaW4gbm9uLWNoZWNrYm94IG1vZGVcbiAgICovXG4gIG9uSXRlbUNsaWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aVNlbGVjdGlvbikge1xuICAgICAgdGhpcy5faGlkZUl0ZW1MaXN0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXJlZCB3aXRoIChjbGVhcmFuY2VDbGljaykgZXZlbnQsIGNsZWFyaW5nIGFsbCBzZWxlY3Rpb25zXG4gICAqIGFuZCBlbWl0cyAoc2VsZWN0ZWRWYWx1ZUNoYW5nZSkgYW5kIChzZWxlY3Rpb25DaGFuZ2UpIGV2ZW50IGZvciBlbXB0eSB2YWx1ZVxuICAgKi9cbiAgb25DbGVhcmFuY2VDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubXVsdGlTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9IHZvaWQgMDtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZUNoYW5nZS5lbWl0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHVuZGVmaW5lZCk7XG4gICAgICBjbGVhckFsbFNlbGVjdGlvbih0aGlzLml0ZW1zKTtcbiAgICB9XG4gICAgc3RvcFByb3BhZ2F0aW9uQW5kRGVmYXVsdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdpdGggKGRyb3Bkb3duQmx1cikgZXZlbnQsIGNsb3NlcyB0aGUgZHJvcGRvd25cbiAgICovXG4gIG9uSXRlbXNCbHVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc1NlbGVjdGlvbk9wZW4oKSkge1xuICAgICAgdGhpcy5faGlkZUl0ZW1MaXN0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNsb3NlIHRoZSBkcm9wZG93blxuICAgKi9cbiAgcHJpdmF0ZSBfaGlkZUl0ZW1MaXN0KCk6IHZvaWQge1xuICAgIC8vIGhpZGUgdGhlIGRyb3Bkb3duIGVsZW1lbnQgKGhhcyBzb21lIHByb2JsZW0gZm9yIHVzaW5nIENTUyBkaXJlY3RseSwgdXNpbmcgdGhpcyBhcyBhIHdvcmthcm91bmQpXG4gICAgdGhpcy5fZHJvcGRvd25FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLmRyb3Bkb3duVmlzaWJpbGl0eSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gdGhlIGRyb3Bkb3duXG4gICAqL1xuICBwcml2YXRlIF9zaG93SXRlbXNMaXN0KCk6IHZvaWQge1xuICAgIC8vIGRpc3BsYXkgdGhlIGRyb3Bkb3duIGVsZW1lbnQgKGhhcyBzb21lIHByb2JsZW0gZm9yIHVzaW5nIENTUyBkaXJlY3RseSwgdXNpbmcgdGhpcyBhcyBhIHdvcmthcm91bmQpXG4gICAgdGhpcy5fZHJvcGRvd25FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICB0aGlzLmRyb3Bkb3duVmlzaWJpbGl0eSA9IHRydWU7XG5cbiAgICAvLyBzY3JvbGxpbmcgdG8gdGhlIHNlbGVjdGVkIGl0ZW1cbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRFbGVtZW50KSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZEVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ2luc3RhbnQnLCBibG9jazogJ2NlbnRlcicgfSk7XG4gICAgfVxuXG4gICAgLy8gc2V0dGluZyB0aGUgZm9jdXNcbiAgICBpZiAodGhpcy5maWx0ZXJCb3ggJiYgIXRoaXMubXVsdGlTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMuX2ZpbHRlcklucHV0RWxlbWVudC5mb2N1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdmlzaWJpbGl0eSBzdGF0dXMgb2YgZHJvcGRvd25cbiAgICovXG4gIHByaXZhdGUgX2lzU2VsZWN0aW9uT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kcm9wZG93blZpc2liaWxpdHk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSByZWFsIGRyb3Bkb3duIGVsZW1lbnQgKGZvciBmb2N1c2luZyBhbmQgdmlzaWJpbGl0eSBjb250cm9sbGluZyksIHRoZSA8c3Bhbj4gbm90IHRoZSA8ZHJvcGRvd24+XG4gICAqL1xuICBwcml2YXRlIGdldCBfZHJvcGRvd25FbGVtZW50KCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZHJvcGRvd25SZWYgPyB0aGlzLmRyb3Bkb3duUmVmLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLmRyb3Bkb3duUmVmLm5hdGl2ZUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgOiBudWxsIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIHJlYWwgZmlsdGVyIGVsZW1lbnQgKGZvciBmb2N1c2luZyksIHRoZSA8aW5wdXQ+IG5vdCB0aGUgPGlucHV0LWZpbHRlcj5cbiAgICovXG4gIHByaXZhdGUgZ2V0IF9maWx0ZXJJbnB1dEVsZW1lbnQoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fZHJvcGRvd25FbGVtZW50ID9cbiAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCA/IHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCA6IG51bGwgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgSFRNTEVsZW1lbnQgb2Ygc2VsZWN0ZWQgaXRlbSwgZm9yIGRvaW5nIChzY3JvbGxJbnRvVmlldykgc2Nyb2xsaW5nIHRvIHRoZSBzZWxlY3RlZCBpdGVtXG4gICAqL1xuICBwcml2YXRlIGdldCBfc2VsZWN0ZWRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSBnZXRGaXJzdFNlbGVjdGVkSXRlbSh0aGlzLml0ZW1zKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRJdGVtID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZWN0ZWRJdGVtLmlkKSBhcyBIVE1MRWxlbWVudCA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NlbGVjdGlvbkl0ZW19IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7aXNOdW1iZXJ9IGZyb20gJy4uL3V0aWxzL3V0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpdGVtJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bGFiZWwgW2NsYXNzLmNvbnRhaW5lci1jaGVja2JveF09XCJjaGVja2JveFwiXG4gICAgICAgICAgIFtjbGFzcy5jb250YWluZXItc2VsZWN0aW9uXT1cIiFjaGVja2JveCAmJiAhaXRlbS5zZWxlY3RlZFwiXG4gICAgICAgICAgIFtjbGFzcy5jb250YWluZXItc2VsZWN0aW9uLXNlbGVjdGVkXT1cIiFjaGVja2JveCAmJiBpdGVtLnNlbGVjdGVkXCJcbiAgICAgICAgICAgW2lkXT1cIml0ZW0uaWRcIiAobW91c2Vkb3duKT1cIm9uSXRlbUNsaWNrKGl0ZW0pXCI+XG4gICAgICB7e25lZWRGb3JtYXROdW1iZXIoaXRlbS50ZXh0KT8gKGl0ZW0udGV4dCB8IG51bWJlcjonMS4wLTInKSA6IGl0ZW0udGV4dH19e3tzdWZmaXhUZXh0PyBzdWZmaXhUZXh0IDogJyd9fVxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNoZWNrYm94XCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPSdjaGVja2JveCcgW2lkXT1cIidjaGVja2JveC0nK2l0ZW0udGV4dFwiIChjaGFuZ2UpPVwib25DaGVja1N0YXR1c0NoYW5nZShpdGVtKVwiIFtjaGVja2VkXT1cIml0ZW0uc2VsZWN0ZWRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja21hcmtcIiBbaWRdPVwiJ2NoZWNrbWFyay0nK2l0ZW0udGV4dFwiPjwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbGFiZWw+YCxcbiAgc3R5bGVVcmxzOiBbJy4vaXRlbS5jb21wb25lbnQuc2NzcyddXG59KVxuXG5leHBvcnQgY2xhc3MgSXRlbUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtjaGVja2JveF0sIHRoZSBmbGFnIG9mIGNoZWNrYm94IG1vZGVcbiAgICovXG4gIEBJbnB1dCgpIGNoZWNrYm94OiBib29sZWFuO1xuICAvKipcbiAgICogYmluZCB0byBbaXRlbV0sIHRoZSBkcm9wZG93biBvcHRpb24gaXRlbVxuICAgKi9cbiAgQElucHV0KCkgaXRlbTogU2VsZWN0aW9uSXRlbTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2Zvcm1hdE51bWJlcl0sIHRoZSBmbGFnIGZvciBmb3JtYXR0aW5nIHRoZSBudW1iZXJcbiAgICovXG4gIEBJbnB1dCgpIGZvcm1hdE51bWJlciA9IGZhbHNlO1xuICAvKipcbiAgICogYmluZCB0byBbc3VmZml4VGV4dF0sIHRoZSBzdWZmaXhUZXh0IHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGRyb3Bkb3duXG4gICAqL1xuICBASW5wdXQoKSBzdWZmaXhUZXh0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtpdGVtQ2xpY2tdIGV2ZW50LCB0cmlnZ2VycyB3aGVuIGNsaWNraW5nIHRoZSBpdGVtIG9mIGRyb3Bkb3duXG4gICAqL1xuICBAT3V0cHV0KCkgaXRlbUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtjaGVja1N0YXR1c0NoYW5nZV0gZXZlbnQsIHRyaWdnZXJzIHdoZW4gY2hlY2sgc3RhdHVzIGlzIGNoYW5nZWQgaW4gY2hlY2tib3ggbW9kZS5cbiAgICovXG4gIEBPdXRwdXQoKSBjaGVja1N0YXR1c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBjaGVjayB3aGV0aGVyIG5lZWRzIHRvIGZvcm1hdCBudW1iZXIgZm9yIHRoZSBwcm92aWRlZCB0ZXh0XG4gICAqL1xuICBuZWVkRm9ybWF0TnVtYmVyKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOdW1iZXIodmFsdWUpICYmIHRoaXMuZm9ybWF0TnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXJlZCB3aGVuIGNsaWNraW5nIHRoZSBpdGVtLCBlbWl0cyB0aGUgW2l0ZW1DbGlja10gZXZlbnRcbiAgICovXG4gIG9uSXRlbUNsaWNrKGl0ZW0pIHtcbiAgICB0aGlzLml0ZW1DbGljay5lbWl0KGl0ZW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXJlZCB3aGVuIGNoZWNraW5nIHN0YXR1cyBjaGFuZ2VkIGluIGNoZWNrYm94IG1vZGUsIGVtaXRzIHRoZSBbY2hlY2tTdGF0dXNDaGFuZ2VdIGV2ZW50XG4gICAqL1xuICBvbkNoZWNrU3RhdHVzQ2hhbmdlKGl0ZW0pIHtcbiAgICB0aGlzLmNoZWNrU3RhdHVzQ2hhbmdlLmVtaXQoaXRlbSk7XG4gIH1cbn1cbiIsImltcG9ydCB7Q29tcG9uZW50LCBJbnB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NlbGVjdGlvbkdyb3VwSXRlbXN9IGZyb20gJy4uL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3JvdXAtaXRlbScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGxhYmVsIGNsYXNzPVwiZHJvcGRvd24taXRlbSBkcm9wZG93bi1pdGVtLWdyb3VwXCIgKG1vdXNlZG93bik9XCJvbkl0ZW1Hcm91cENsaWNrKCRldmVudClcIj57e2l0ZW0uZ3JvdXB9fTwvbGFiZWw+XG4gIGAsXG4gIHN0eWxlVXJsczogWycuL2dyb3VwLWl0ZW0uY29tcG9uZW50LnNjc3MnXVxufSlcblxuZXhwb3J0IGNsYXNzIEdyb3VwSXRlbUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtpdGVtXSwgdGhlIGdyb3VwIGl0ZW0gb2YgZHJvcGRvd25cbiAgICovXG4gIEBJbnB1dCgpIGl0ZW06IFNlbGVjdGlvbkdyb3VwSXRlbXM7XG5cbiAgLyoqXG4gICAqIHByZXZlbnQgYWxsIGNsaWNraW5nIGV2ZW50IGZyb20gaGFwcGVuaW5nXG4gICAqL1xuICBvbkl0ZW1Hcm91cENsaWNrKGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lucHV0LWZpbHRlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmaWx0ZXItYm94XCIgWyhuZ01vZGVsKV09XCJmaWx0ZXJWYWx1ZVwiIChpbnB1dCk9XCJvbkNoYW5nZSgpXCIgKGJsdXIpPVwib25GaWx0ZXJUZXh0Qmx1cigkZXZlbnQpXCI+XG4gIGAsXG4gIHN0eWxlVXJsczogWycuL2lucHV0LWZpbHRlci5jb21wb25lbnQuc2NzcyddXG59KVxuXG5leHBvcnQgY2xhc3MgSW5wdXRGaWx0ZXJDb21wb25lbnQge1xuICAvKipcbiAgICogYmluZCB0byBbZmlsdGVyVmFsdWVdLCB0aGUgdmFsdWUgb2YgdGhlIGZpbHRlclxuICAgKi9cbiAgQElucHV0KCkgZmlsdGVyVmFsdWU6IHN0cmluZztcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2lucHV0RmlsdGVyQmx1cl0sIGVtaXRzIHdpdGggKGJsdXIpIG9mIGZpbHRlciBpbnB1dCBib3hcbiAgICovXG4gIEBPdXRwdXQoKSBpbnB1dEZpbHRlckJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2ZpbHRlclZhbHVlQ2hhbmdlXSwgZm9yIDItd2F5IGJpbmRpbmcgb2YgZmlsdGVyVmFsdWVcbiAgICovXG4gIEBPdXRwdXQoKSBmaWx0ZXJWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiB0cmlnZ2VycyB3aXRoIChibHVyKSBldmVudCwgZW1pdHMgdGhlIChpbnB1dEZpbHRlckJsdXIpIGV2ZW50XG4gICAqL1xuICBvbkZpbHRlclRleHRCbHVyKGV2ZW50KSB7XG4gICAgdGhpcy5pbnB1dEZpbHRlckJsdXIuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcnMgd2l0aCAoaW5wdXQpIGV2ZW50LCBlbWl0cyB0aGUgKGZpbHRlclZhbHVlQ2hhbmdlKSBldmVudCBmb3IgMi13YXkgYmluZGluZyBvZiBmaWx0ZXJWYWx1ZVxuICAgKi9cbiAgb25DaGFuZ2UoKSB7XG4gICAgdGhpcy5maWx0ZXJWYWx1ZUNoYW5nZS5lbWl0KHRoaXMuZmlsdGVyVmFsdWUpO1xuICB9XG59XG4iLCJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtzdG9wUHJvcGFnYXRpb25BbmREZWZhdWx0LCBpc051bWJlcn0gZnJvbSAnLi4vdXRpbHMvdXRpbCc7XG5pbXBvcnQge0RlY2ltYWxQaXBlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhbmNob3InLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxzcGFuICNhbmNob3IgdGFiaW5kZXg9XCIyXCIgW25nQ2xhc3NdPVwiYW5jaG9yQ2xhc3NcIiAod2luZG93OnJlc2l6ZSk9XCJvblJlc2l6ZSgpXCJcbiAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQW5jaG9yQ2xpY2soJGV2ZW50KVwiIChibHVyKT1cIm9uQW5jaG9yQmx1cigkZXZlbnQpXCI+IHt7YW5jaG9yRGlzcGxheVRleHR9fVxuICAgICAgPHNwYW4gI3NlbGVjdGlvbkNsZWFyYW5jZSBjbGFzcz1cInNlbGVjdGlvbi1jbGVhcmFuY2VcIiAobW91c2Vkb3duKT1cIm9uQ2xlYXJhbmNlQ2xpY2soJGV2ZW50KVwiICpuZ0lmPVwic2hvd0NsZWFyYW5jZUZsYWdcIj4mdGltZXM7PC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vYW5jaG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW0RlY2ltYWxQaXBlXVxufSlcblxuZXhwb3J0IGNsYXNzIEFuY2hvckNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBDaGlsZCBlbGVtZW50IHJlZmVyZW5jZSBvZiBhbmNob3JcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2FuY2hvcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBhbmNob3JSZWY6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIGJpbmQgdG8gW3BsYWNlSG9sZGVyXSBmb3IgZGlzcGxheWluZyB0aGUgcGxhY2UgaG9sZGVyIHN0cmluZyBvZiB0aGUgYW5jaG9yLlxuICAgKi9cbiAgQElucHV0KCkgcGxhY2VIb2xkZXI6IHN0cmluZztcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2NoZWNrYm94XSBmb3IgY2hlY2tpbmcgd2hldGhlciB0aGUgY2xlYXJhbmNlIGZsYWcgc2hvdWxkIGJlIHNob3duIG9yIG5vdC5cbiAgICovXG4gIEBJbnB1dCgpIGNoZWNrYm94ID0gZmFsc2U7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtzdWZmaXhUZXh0XSBmb3IgZGlzcGxheWluZyB0aGUgc3VmZml4IG9mIHRoZSBzZWxlY3RlZCB0ZXh0IG9mIGFuY2hvclxuICAgKi9cbiAgQElucHV0KCkgc3VmZml4VGV4dDogc3RyaW5nO1xuICAvKipcbiAgICogYmluZCB0byBbYWxsb3dDbGVhcl0gZm9yIGVuYWJsaW5nIHRoZSBjbGVhcmFuY2UgKGNsZWFyYW5jZSBpcyBub3QgYXZhaWFibGUgd2hlbiBjaGVja2JveCBpcyBlbmFibGVkKVxuICAgKi9cbiAgQElucHV0KCkgYWxsb3dDbGVhciA9IHRydWU7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtmb3JtYXROdW1iZXJdIGZvciBzaG93IGZvcm1hdHRlZCBudW1iZXIgdGV4dFxuICAgKi9cbiAgQElucHV0KCkgZm9ybWF0TnVtYmVyOiBib29sZWFuO1xuICAvKipcbiAgICogYmluZCB0byBbc2VsZWN0ZWRUZXh0XSBmb3IgZGlzcGxheWluZyB0aGUgc2VsZWN0ZWQgdGV4dCBvbiBhbmNob3JcbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkVGV4dDogYW55O1xuICAvKipcbiAgICogYmluZCB0byBbb3BlblN0YXR1c10sIGl0J3MgdGhlIHZpc2liaWxpdHkgc3RhdHVzIG9mIGRyb3Bkb3duLCBmb3Igc2hvd2luZyB0aGUgYXJyb3cgb24gYW5jaG9yXG4gICAqL1xuICBASW5wdXQoKSBvcGVuU3RhdHVzID0gZmFsc2U7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtkaXNhYmxlZF0gZm9yIGRpc2FibGluZyB0aGUgYW5jaG9yXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICAvKipcbiAgICogd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiBjbGlja2luZyB0aGUgYW5jaG9yXG4gICAqL1xuICBAT3V0cHV0KCkgYW5jaG9yQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLyoqXG4gICAqIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gY2xpY2tpbmcgdGhlIGNsZWFyYW5jZVxuICAgKi9cbiAgQE91dHB1dCgpIGNsZWFyYW5jZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIGxlbmd0aCBvZiBhbmNob3IgZWxlbWVudCwgdXNlZCBmb3IgY2FsY3VsYXRlIHRoZSBzdHJpbmcgbGVuZ3RoIG9mIHRoZSBhbmNob3IgZGlzcGxheWVkIHRleHQuXG4gICAqL1xuICBhbmNob3JMZW5ndGg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kZWNpbWFsUGlwZTogRGVjaW1hbFBpcGUpIHt9XG5cbiAgLyoqXG4gICAqIGZsYWcgZm9yIHNob3dpbmcgdGhlIGNsZWFyYW5jZSBmbGFnXG4gICAqL1xuICBnZXQgc2hvd0NsZWFyYW5jZUZsYWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmNoZWNrYm94ICYmIHRoaXMuc2VsZWN0ZWRUZXh0ICYmIHRoaXMuYWxsb3dDbGVhcjtcbiAgfVxuXG4gIC8qKlxuICAgKiB0aGUgdGV4dCBkaXNwbGF5cyBvbiBhbmNob3JcbiAgICovXG4gIGdldCBhbmNob3JEaXNwbGF5VGV4dCgpOiBzdHJpbmcge1xuICAgIGxldCBhbmNob3JEaXNwbGF5VGV4dCA9ICB0aGlzLnNlbGVjdGVkVGV4dCA/ICh0aGlzLmZvcm1hdE51bWJlciA/IChpc051bWJlcih0aGlzLnNlbGVjdGVkVGV4dCkgP1xuICAgICAgdGhpcy5fZGVjaW1hbFBpcGUudHJhbnNmb3JtKHRoaXMuc2VsZWN0ZWRUZXh0LCAnMS4wLTInKSA6IHRoaXMuc2VsZWN0ZWRUZXh0KSA6XG4gICAgICB0aGlzLnNlbGVjdGVkVGV4dCkgKyAodGhpcy5zdWZmaXhUZXh0ID8gdGhpcy5zdWZmaXhUZXh0IDogJycpIDogdGhpcy5wbGFjZUhvbGRlcjtcblxuICAgIGxldCBjaGFyTGVuZ3RoID0gMTtcbiAgICBpZiAodGhpcy5zaG93Q2xlYXJhbmNlRmxhZyAmJiB0aGlzLmFuY2hvckxlbmd0aCA+IDApIHtcbiAgICAgIGNoYXJMZW5ndGggPSBNYXRoLmZsb29yKCh0aGlzLmFuY2hvckxlbmd0aCAtIDUwKSAvIDcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFyTGVuZ3RoID0gTWF0aC5mbG9vcigodGhpcy5hbmNob3JMZW5ndGggLSA1MCkgLyA3KTtcbiAgICB9XG5cbiAgICBpZiAoYW5jaG9yRGlzcGxheVRleHQubGVuZ3RoID4gY2hhckxlbmd0aCkge1xuICAgICAgYW5jaG9yRGlzcGxheVRleHQgPSBhbmNob3JEaXNwbGF5VGV4dC5zbGljZSgwLCBjaGFyTGVuZ3RoIC0gMikgKyAnLi4uJztcbiAgICB9XG4gICAgcmV0dXJuIGFuY2hvckRpc3BsYXlUZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIGFuY2hvciBDU1MgY2xhc3NcbiAgICovXG4gIGdldCBhbmNob3JDbGFzcygpOiBzdHJpbmcge1xuICAgIGxldCBhbmNob3JDbGFzc1N0YXR1c1BhcnQ7XG4gICAgbGV0IGFuY2hvckNsYXNzRm9udENvbG9yO1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICBhbmNob3JDbGFzc1N0YXR1c1BhcnQgPSAnc2VsZWN0aW9uLWFuY2hvci1kaXNhYmxlZCc7XG4gICAgICBhbmNob3JDbGFzc0ZvbnRDb2xvciA9ICdwbGFjZS1ob2xkZXInO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcGVuU3RhdHVzKSB7XG4gICAgICAgIGFuY2hvckNsYXNzU3RhdHVzUGFydCA9ICdzZWxlY3Rpb24tYW5jaG9yLW9wZW4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYW5jaG9yQ2xhc3NTdGF0dXNQYXJ0ID0gJ3NlbGVjdGlvbi1hbmNob3ItY2xvc2UnO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRUZXh0ICE9IG51bGwpIHtcbiAgICAgICAgYW5jaG9yQ2xhc3NGb250Q29sb3IgPSAnc2VsZWN0ZWQtaXRlbSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbmNob3JDbGFzc0ZvbnRDb2xvciA9ICdwbGFjZS1ob2xkZXInO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYCR7YW5jaG9yQ2xhc3NTdGF0dXNQYXJ0fSAke2FuY2hvckNsYXNzRm9udENvbG9yfWA7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdoZW4gY2xpY2tpbmcgdGhlIGFuY2hvclxuICAgKi9cbiAgb25BbmNob3JDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmFuY2hvckNsaWNrLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXJlZCB3aXRoIChibHVyKSBvZiBhbmNob3JcbiAgICovXG4gIG9uQW5jaG9yQmx1cihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBzdG9wUHJvcGFnYXRpb25BbmREZWZhdWx0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyZWQgd2hlbiBjbGlja2luZyB0aGUgY2xlYXJhbmNlXG4gICAqL1xuICBvbkNsZWFyYW5jZUNsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJhbmNlQ2xpY2suZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdoZW4gcmVzaXppbmcsIGdldCB0aGUgY2xpZW50V2lkdGggb2YgYW5jaG9yXG4gICAqL1xuICBvblJlc2l6ZSgpIHtcbiAgICB0aGlzLmFuY2hvckxlbmd0aCA9IHRoaXMuYW5jaG9yUmVmID8gdGhpcy5hbmNob3JSZWYubmF0aXZlRWxlbWVudCA/IHRoaXMuYW5jaG9yUmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggOiAwIDogMDtcbiAgfVxufVxuIiwiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtjbGVhckFsbFNlbGVjdGlvbiwgZ2V0Rmlyc3RTZWxlY3RlZEl0ZW0sIGhhc0dyb3VwLCBzdG9wUHJvcGFnYXRpb25BbmREZWZhdWx0fSBmcm9tICcuLi91dGlscy91dGlsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZHJvcGRvd24nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxzcGFuICNkcm9wZG93biBjbGFzcz1cImRyb3Bkb3duXCIgdGFiaW5kZXg9XCIzXCIgKG1vdXNlZG93bik9XCJvbkl0ZW1zQ2xpY2soJGV2ZW50KVwiIChibHVyKT1cIm9uSXRlbXNCbHVyKCRldmVudClcIiAqbmdJZj1cIiFkaXNhYmxlZFwiID5cbiAgICAgIDxpbnB1dC1maWx0ZXIgI2ZpbHRlcklucHV0IHRhYmluZGV4PVwiNFwiICpuZ0lmPVwiZmlsdGVyQm94ICYmICFjaGVja2JveFwiIFsoZmlsdGVyVmFsdWUpXT1cImZpbHRlclZhbHVlXCIgKGlucHV0RmlsdGVyQmx1cik9XCJvbkZpbHRlclRleHRCbHVyKCRldmVudClcIj48L2lucHV0LWZpbHRlcj5cbiAgICAgIDxzcGFuICNzZWxlY3Rpb25PcHRpb25zIFtuZ0NsYXNzXT1cIm9wdGlvbnNDbGFzc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zVmFsdWVzXCIgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtICYmIGl0ZW0uZ3JvdXBcIj5cbiAgICAgICAgICAgIDxncm91cC1pdGVtIFtpdGVtXT1cIml0ZW1cIj48L2dyb3VwLWl0ZW0+XG4gICAgICAgICAgICA8aXRlbSAqbmdGb3I9XCJsZXQgc3ViSXRlbSBvZiBpdGVtLml0ZW1zXCIgKGl0ZW1DbGljayk9XCJvbkl0ZW1DbGljayhzdWJJdGVtKVwiIChjaGVja1N0YXR1c0NoYW5nZSk9XCJ0b2dnbGVTZWxlY3Rpb24oc3ViSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwic3ViSXRlbVwiIFtjaGVja2JveF09XCJjaGVja2JveFwiIFtmb3JtYXROdW1iZXJdPVwiZm9ybWF0TnVtYmVyXCIgW3N1ZmZpeFRleHRdPVwic3VmZml4VGV4dFwiPlxuICAgICAgICAgICAgPC9pdGVtPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtICYmICFpdGVtLmdyb3VwXCI+XG4gICAgICAgICAgICA8aXRlbSAoaXRlbUNsaWNrKT1cIm9uSXRlbUNsaWNrKGl0ZW0pXCIgKGNoZWNrU3RhdHVzQ2hhbmdlKT1cInRvZ2dsZVNlbGVjdGlvbihpdGVtKVwiXG4gICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCIgW2NoZWNrYm94XT1cImNoZWNrYm94XCIgW2Zvcm1hdE51bWJlcl09XCJmb3JtYXROdW1iZXJcIiBbc3VmZml4VGV4dF09XCJzdWZmaXhUZXh0XCI+XG4gICAgICAgICAgICA8L2l0ZW0+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vZHJvcGRvd24uY29tcG9uZW50LnNjc3MnXVxufSlcblxuZXhwb3J0IGNsYXNzIERyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIENoaWxkIGVsZW1lbnQgcmVmZXJlbmNlIG9mIGRyb3Bkb3duXG4gICAqL1xuICBAVmlld0NoaWxkKCdkcm9wZG93bicsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBkcm9wZG93blJlZjogRWxlbWVudFJlZjtcbiAgLyoqXG4gICAqIENoaWxkIGVsZW1lbnQgcmVmZXJlbmNlIG9mIGZpbHRlciBpbnB1dCB0ZXh0XG4gICAqL1xuICBAVmlld0NoaWxkKCdmaWx0ZXJJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBmaWx0ZXJJbnB1dFJlZjogRWxlbWVudFJlZjtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW3BsYWNlSG9sZGVyXSBmb3IgZGlzcGxheWluZyB0aGUgcGxhY2UgaG9sZGVyIHN0cmluZyBvZiB0aGUgYW5jaG9yLlxuICAgKi9cbiAgQElucHV0KCkgcGxhY2VIb2xkZXI6IHN0cmluZztcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2l0ZW1zXSBmb3IgdGhlIG9wdGlvbnMvZ3JvdXBzIGluIHRoZSBkcm9wZG93blxuICAgKi9cbiAgQElucHV0KCkgaXRlbXM6IGFueVtdO1xuICAvKipcbiAgICogYmluZCB0byBbY2hlY2tib3hdLCB0aGUgZmxhZyBmb3IgbXVsdGktc2VsZWN0IChjaGVja2JveCkgbW9kZS5cbiAgICovXG4gIEBJbnB1dCgpIGNoZWNrYm94ID0gZmFsc2U7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtzZWxlY3RlZFZhbHVlXSBmb3IgdGhlIHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBvcHRpb24gZnJvbSBkcm9wZG93blxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0ZWRWYWx1ZTogYW55O1xuICAvKipcbiAgICogYmluZCB0byBbZmlsdGVyQm94XSBmb3IgZGlzcGxheWluZyB0aGUgZmlsdGVyIGlucHV0IHRleHQgYm94XG4gICAqL1xuICBASW5wdXQoKSBmaWx0ZXJCb3ggPSBmYWxzZTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW3N1ZmZpeFRleHRdIGZvciBkaXNwbGF5aW5nIHRoZSBzdWZmaXggb2YgdGhlIHNlbGVjdGVkIHRleHQgb2YgYW5jaG9yXG4gICAqL1xuICBASW5wdXQoKSBzdWZmaXhUZXh0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtkaXNhYmxlZF0gZm9yIGRpc2FibGluZyB0aGUgZHJvcGRvd25cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xuICAvKipcbiAgICogYmluZCB0byBbYWxsb3dDbGVhcl0gZm9yIGVuYWJsaW5nIHRoZSBjbGVhcmFuY2UgKGNsZWFyYW5jZSBpcyBub3QgYXZhaWFibGUgd2hlbiBjaGVja2JveCBpcyBlbmFibGVkKVxuICAgKi9cbiAgQElucHV0KCkgYWxsb3dDbGVhciA9IHRydWU7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtmb3JtYXROdW1iZXJdIGZvciBzaG93IGZvcm1hdHRlZCBudW1iZXIgdGV4dFxuICAgKi9cbiAgQElucHV0KCkgZm9ybWF0TnVtYmVyID0gZmFsc2U7XG4gIC8qKlxuICAgKiBmb3IgMi13YXkgYmluZGluZyBvZiBbc2VsZWN0ZWRWYWx1ZV1cbiAgICovXG4gIEBPdXRwdXQoKSBzZWxlY3RlZFZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KHRydWUpO1xuICAvKipcbiAgICogW3NlbGVjdGlvbkNoYW5nZV0gZXZlbnQgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIGNoYW5naW5nIG9mIHRoZSBzZWxlY3Rpb25cbiAgICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4odHJ1ZSk7XG4gIC8qKlxuICAgKiBbZHJvcGRvd25CbHVyXSBldmVudCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdpdGggKGJsdXIpIG9mIGRyb3Bkb3duXG4gICAqL1xuICBAT3V0cHV0KCkgZHJvcGRvd25CbHVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8qKlxuICAgKiBbaXRlbUNsaWNrXSBldmVudCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gY2xpY2tpbmcgdGhlIG9wdGlvbiBvZiBkcm9wZG93blxuICAgKi9cbiAgQE91dHB1dCgpIGl0ZW1DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAvKipcbiAgICogZmlsdGVyIHZhbHVlXG4gICAqL1xuICBmaWx0ZXJWYWx1ZTogc3RyaW5nO1xuICAvKipcbiAgICogZmxhZyBvZiBjbGlja2luZyBkcm9wZG93bi4gSXQncyB0byBwcmV2ZW50IChibHVyKSBvZiBkcm9wZG93biBmcm9tIGhhcHBlbmluZyBpbiBjaGVja2JveCBtb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2xpY2tlZEl0ZW1zID0gZmFsc2U7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLml0ZW1zKSB7XG4gICAgICB0aGlzLl9jaGVja1NlbGVjdGlvbkNoYW5nZShjaGFuZ2VzLml0ZW1zLnByZXZpb3VzVmFsdWUsIGNoYW5nZXMuaXRlbXMuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdoZW4gY2xpY2tpbmcgdGhlIGRyb3Bkb3duXG4gICAqL1xuICBvbkl0ZW1zQ2xpY2soZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmIChldmVudC5vZmZzZXRYID4gKGV2ZW50LnRhcmdldC5jbGllbnRXaWR0aCArIGV2ZW50LnRhcmdldC5jbGllbnRMZWZ0KSkge1xuICAgICAgc3RvcFByb3BhZ2F0aW9uQW5kRGVmYXVsdChldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIHNob3VsZCBpZ25vcmUgY2xpY2tpbmcgb24gZmlsdGVyXG4gICAgaWYgKHRoaXMuY2hlY2tib3ggJiYgZXZlbnQudGFyZ2V0LnR5cGUgIT09ICd0ZXh0Jykge1xuICAgICAgdGhpcy5fY2xpY2tlZEl0ZW1zID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdoZW4gY2xpY2tpbmcgdGhlIGl0ZW1cbiAgICovXG4gIG9uSXRlbUNsaWNrKGN1cnJlbnRJdGVtKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoZWNrYm94KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSB0aGlzLl9nZXRJdGVtVmFsdWUoY3VycmVudEl0ZW0pOyAvLyBjdXJyZW50SXRlbS52YWx1ZSAhPSBudWxsID8gY3VycmVudEl0ZW0udmFsdWUgOiBjdXJyZW50SXRlbS50ZXh0O1xuICAgICAgY2xlYXJBbGxTZWxlY3Rpb24odGhpcy5pdGVtcyk7XG4gICAgICAvLyBzZXQgdGhlIHNlbGVjdGlvbiBvZiBjdXJyZW50IG9uZVxuICAgICAgY3VycmVudEl0ZW0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5pdGVtQ2xpY2suZW1pdChjdXJyZW50SXRlbSk7XG4gICAgICB0aGlzLl9vblNlbGVjdGlvbkNoYW5nZSh0aGlzLnNlbGVjdGVkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VycyB3aXRoIChibHVyKSBldmVudCBvZiBmaWx0ZXIgaW5wdXQgYm94XG4gICAqL1xuICBvbkZpbHRlclRleHRCbHVyKGV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kcm9wZG93bkJsdXIuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcnMgd2l0aCAoYmx1cikgZXZlbnQgb2YgZHJvcGRvd25cbiAgICovXG4gIG9uSXRlbXNCbHVyKGV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tib3gpIHtcbiAgICAgIGlmICh0aGlzLl9jbGlja2VkSXRlbXMpIHtcbiAgICAgICAgLy8gaW4gY2hlY2tib3ggbW9kZSwgdGhpcyBibHVyIGV2ZW50IHdpbGwgYmUgaWdub3JlZCB3aGVuIGNsaWNraW5nIHRoZSBkcm9wZG93biAoY2hlY2sgdGhlIGNoZWNrYm94KVxuICAgICAgICBldmVudC50YXJnZXQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5fY2xpY2tlZEl0ZW1zID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kcm9wZG93bkJsdXIuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogdG9nZ2xlIHRoZSBzZWxlY3Rpb24gd2hlbiBjaGVja2luZyBzdGF0dXMgY2hhbmdlZCAoaW4gY2hlY2tib3ggbW9kZSlcbiAgICovXG4gIHRvZ2dsZVNlbGVjdGlvbihpdGVtOiB7aWQ6IHN0cmluZywgdmFsdWU/OiBhbnksIHRleHQ6IGFueSwgc2VsZWN0ZWQ/OiBib29sZWFufSk6IHZvaWQge1xuICAgIGl0ZW0uc2VsZWN0ZWQgPSAhaXRlbS5zZWxlY3RlZDtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuX2dldEl0ZW1WYWx1ZShpdGVtKSk7IC8vIGl0ZW0udmFsdWUgIT0gbnVsbCA/IGl0ZW0udmFsdWUgOiBpdGVtLnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGl0ZW1zIHZhbHVlcyBsaXN0IGFmdGVyIGFwcGx5aW5nIHRoZSBmaWx0ZXJcbiAgICovXG4gIGdldCBpdGVtc1ZhbHVlcygpOiBhbnlbXSB7XG4gICAgbGV0IGZpbHRlcjtcbiAgICBpZiAodGhpcy5maWx0ZXJWYWx1ZSkge1xuICAgICAgZmlsdGVyID0gdGhpcy5maWx0ZXJWYWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXRlbXM7XG4gICAgfVxuICAgIGlmICghdGhpcy5pdGVtcyB8fCB0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoaGFzR3JvdXAodGhpcy5pdGVtcykpIHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgICB0aGlzLml0ZW1zLmZvckVhY2goZ3JvdXBJdGVtID0+IHtcbiAgICAgICAgaWYgKGdyb3VwSXRlbS5ncm91cCAhPSBudWxsICYmIGdyb3VwSXRlbS5ncm91cC50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyKSkge1xuICAgICAgICAgIC8vIGlmIGdyb3VwSXRlbSBjb250YWlucyB0aGUgZmlsdGVycywgdGhlIGdyb3VwSXRlbSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQgYXMgd2VsbFxuICAgICAgICAgIGl0ZW1zLnB1c2goZ3JvdXBJdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZEl0ZW1zID0gZ3JvdXBJdGVtLml0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0udGV4dCAhPSBudWxsICYmIGl0ZW0udGV4dC50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyKSk7XG4gICAgICAgICAgaWYgKGZpbHRlcmVkSXRlbXMgJiYgZmlsdGVyZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtncm91cDogZ3JvdXBJdGVtLmdyb3VwLCBpdGVtczogZmlsdGVyZWRJdGVtc30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gaXRlbXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IChpdGVtLnRleHQgIT0gbnVsbCAmJiBpdGVtLnRleHQudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlcikpKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIG9wdGlvbnMgQ1NTIGNsYXNzXG4gICAqL1xuICBnZXQgb3B0aW9uc0NsYXNzKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmlsdGVyQm94ICYmICF0aGlzLmNoZWNrYm94KSB7XG4gICAgICByZXR1cm4gJ29wdGlvbnMgd2l0aC1maWx0ZXInO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ29wdGlvbnMgbm8tZmlsdGVyJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGl0ZW0gdmFsdWUuIFJldHVybiB0ZXh0IGlmIHZhbHVlIGlzIG5vdCBhdmFpbGFibGVcbiAgICovXG4gIHByaXZhdGUgX2dldEl0ZW1WYWx1ZShpdGVtKTogYW55IHtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0udmFsdWUgIT0gbnVsbCA/IGl0ZW0udmFsdWUgOiBpdGVtLnRleHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogc2VsZWN0aW9uIGNoYW5nZWQsIGVtaXRzIGV2ZW50czogKHNlbGVjdGVkVmFsdWVDaGFuZ2UpIGFuZCAoc2VsZWN0aW9uQ2hhbmdlKTtcbiAgICovXG4gIHByaXZhdGUgX29uU2VsZWN0aW9uQ2hhbmdlKHZhbHVlKSB7XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNoZWNrIHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBpcyBjaGFuZ2VkLiBFbWl0cyByZWxhdGl2ZSBldmVudHMgd2hlbiBpZiBjaGFuZ2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2hlY2tTZWxlY3Rpb25DaGFuZ2UocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlKSB7XG4gICAgY29uc3QgY3VyU2VsZWN0ZWRJdGVtID0gZ2V0Rmlyc3RTZWxlY3RlZEl0ZW0oY3VycmVudFZhbHVlKTtcbiAgICBjb25zdCBsYXN0U2VsZWN0ZWRJdGVtID0gZ2V0Rmlyc3RTZWxlY3RlZEl0ZW0ocHJldmlvdXNWYWx1ZSk7XG4gICAgY29uc3QgY3VyU2VsZWN0ZWRJdGVtSWQgPSBjdXJTZWxlY3RlZEl0ZW0gPyBjdXJTZWxlY3RlZEl0ZW0uaWQgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGFzdFNlbGVjdGVkSXRlbUlkID0gbGFzdFNlbGVjdGVkSXRlbSA/IGxhc3RTZWxlY3RlZEl0ZW0uaWQgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGN1clNlbGVjdGVkSXRlbUlkICE9PSBsYXN0U2VsZWN0ZWRJdGVtSWQgJiYgIXRoaXMuY2hlY2tib3gpIHtcbiAgICAgIHRoaXMuX29uU2VsZWN0aW9uQ2hhbmdlKHRoaXMuX2dldEl0ZW1WYWx1ZShjdXJTZWxlY3RlZEl0ZW0pKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9pdGVtL2l0ZW0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgR3JvdXBJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9ncm91cC1pdGVtL2dyb3VwLWl0ZW0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgSW5wdXRGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlci9pbnB1dC1maWx0ZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQW5jaG9yQ29tcG9uZW50IH0gZnJvbSAnLi9hbmNob3IvYW5jaG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi9kcm9wZG93bi9kcm9wZG93bi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEcm9wZG93bkxpc3RDb21wb25lbnQgfSBmcm9tICcuL2Ryb3Bkb3duLWxpc3QuY29tcG9uZW50JztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbXHJcbiAgICBEcm9wZG93bkxpc3RDb21wb25lbnQsXHJcbiAgICBJdGVtQ29tcG9uZW50LFxyXG4gICAgR3JvdXBJdGVtQ29tcG9uZW50LFxyXG4gICAgSW5wdXRGaWx0ZXJDb21wb25lbnQsXHJcbiAgICBBbmNob3JDb21wb25lbnQsXHJcbiAgICBEcm9wZG93bkNvbXBvbmVudFxyXG4gIF0sXHJcbiAgZXhwb3J0czogWyBEcm9wZG93bkxpc3RDb21wb25lbnRdLFxyXG4gIGltcG9ydHM6IFsgQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSBdLFxyXG4gIHByb3ZpZGVyczogW10sXHJcbiAgYm9vdHN0cmFwOiBbXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTGlzdE1vZHVsZSB7fVxyXG4iXSwibmFtZXMiOlsidHNsaWJfMS5fX3ZhbHVlcyIsIkV2ZW50RW1pdHRlciIsIkNvbXBvbmVudCIsIlZpZXdDaGlsZCIsIkVsZW1lbnRSZWYiLCJJbnB1dCIsIk91dHB1dCIsIkRlY2ltYWxQaXBlIiwiTmdNb2R1bGUiLCJDb21tb25Nb2R1bGUiLCJGb3Jtc01vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0lBQUE7Ozs7Ozs7Ozs7Ozs7O0FBY0EsYUE0RmdCLFFBQVEsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxHQUFHLE9BQU8sTUFBTSxLQUFLLFVBQVUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE9BQU87WUFDSCxJQUFJLEVBQUU7Z0JBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNO29CQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztnQkFDbkMsT0FB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
|