ng-select2-component 8.0.3 → 8.1.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.
@@ -1,384 +1,415 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * Generated from: lib/select2-utils.ts
4
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
- */
6
- import { defaultMinCountForSearch, protectRegexp, unicodePatterns } from './select2-const';
7
- export class Select2Utils {
8
- /**
9
- * @param {?} data
10
- * @param {?} value
11
- * @return {?}
12
- */
13
- static getOptionByValue(data, value) {
14
- if (Array.isArray(data)) {
15
- for (const groupOrOption of data) {
16
- /** @type {?} */
17
- const options = ((/** @type {?} */ (groupOrOption))).options;
18
- if (options) {
19
- for (const option of options) {
20
- if (option.value === value) {
21
- return option;
22
- }
23
- }
24
- }
25
- else {
26
- if (((/** @type {?} */ (groupOrOption))).value === value) {
27
- return (/** @type {?} */ (groupOrOption));
28
- }
29
- }
30
- }
31
- }
32
- return null;
33
- }
34
- /**
35
- * @param {?} data
36
- * @param {?} value
37
- * @param {?} multiple
38
- * @return {?}
39
- */
40
- static getOptionsByValue(data, value, multiple) {
41
- if (multiple) {
42
- /** @type {?} */
43
- const values = Array.isArray(value) ? value : [];
44
- /** @type {?} */
45
- const result = [];
46
- for (const v of values) {
47
- /** @type {?} */
48
- const option = Select2Utils.getOptionByValue(data, v);
49
- if (option) {
50
- result.push(option);
51
- }
52
- }
53
- return result;
54
- }
55
- return Select2Utils.getOptionByValue(data, (/** @type {?} */ (value)));
56
- }
57
- /**
58
- * @param {?} data
59
- * @return {?}
60
- */
61
- static getFirstAvailableOption(data) {
62
- if (Array.isArray(data)) {
63
- for (const groupOrOption of data) {
64
- /** @type {?} */
65
- const options = ((/** @type {?} */ (groupOrOption))).options;
66
- if (options) {
67
- for (const option of options) {
68
- if (!option.disabled) {
69
- return option.value;
70
- }
71
- }
72
- }
73
- else {
74
- /** @type {?} */
75
- const option = (/** @type {?} */ (groupOrOption));
76
- if (!option.disabled) {
77
- return option.value;
78
- }
79
- }
80
- }
81
- }
82
- return null;
83
- }
84
- /**
85
- * @private
86
- * @param {?} data
87
- * @return {?}
88
- */
89
- static getOptionsCount(data) {
90
- /** @type {?} */
91
- let count = 0;
92
- if (Array.isArray(data)) {
93
- for (const groupOrOption of data) {
94
- /** @type {?} */
95
- const options = ((/** @type {?} */ (groupOrOption))).options;
96
- if (options) {
97
- count += options.length;
98
- }
99
- else {
100
- count++;
101
- }
102
- }
103
- }
104
- return count;
105
- }
106
- /**
107
- * @param {?} filteredData
108
- * @param {?} value
109
- * @return {?}
110
- */
111
- static valueIsNotInFilteredData(filteredData, value) {
112
- if (Select2Utils.isNullOrUndefined(value)) {
113
- return true;
114
- }
115
- for (const groupOrOption of filteredData) {
116
- /** @type {?} */
117
- const options = ((/** @type {?} */ (groupOrOption))).options;
118
- if (options) {
119
- for (const option of options) {
120
- if (option.value === value) {
121
- return false;
122
- }
123
- }
124
- }
125
- else {
126
- if (((/** @type {?} */ (groupOrOption))).value === value) {
127
- return false;
128
- }
129
- }
130
- }
131
- return true;
132
- }
133
- // tslint:disable-next-line:cognitive-complexity
134
- /**
135
- * @param {?} filteredData
136
- * @param {?} hoveringValue
137
- * @return {?}
138
- */
139
- static getPreviousOption(filteredData, hoveringValue) {
140
- /** @type {?} */
141
- let findIt = Select2Utils.isNullOrUndefined(hoveringValue);
142
- for (let i = filteredData.length - 1; i >= 0; i--) {
143
- /** @type {?} */
144
- const groupOrOption = filteredData[i];
145
- /** @type {?} */
146
- const options = ((/** @type {?} */ (groupOrOption))).options;
147
- if (options) {
148
- for (let j = options.length - 1; j >= 0; j--) {
149
- /** @type {?} */
150
- const option = options[j];
151
- if (findIt) {
152
- if (!option.disabled && !option.hide) {
153
- return option;
154
- }
155
- }
156
- if (!findIt) {
157
- findIt = option.value === hoveringValue;
158
- }
159
- }
160
- }
161
- else {
162
- /** @type {?} */
163
- const option = (/** @type {?} */ (groupOrOption));
164
- if (findIt) {
165
- if (!option.disabled && !option.hide) {
166
- return option;
167
- }
168
- }
169
- if (!findIt) {
170
- findIt = option.value === hoveringValue;
171
- }
172
- }
173
- }
174
- return null;
175
- }
176
- // tslint:disable-next-line:cognitive-complexity
177
- /**
178
- * @param {?} filteredData
179
- * @param {?} hoveringValue
180
- * @return {?}
181
- */
182
- static getNextOption(filteredData, hoveringValue) {
183
- /** @type {?} */
184
- let findIt = Select2Utils.isNullOrUndefined(hoveringValue);
185
- for (const groupOrOption of filteredData) {
186
- /** @type {?} */
187
- const options = ((/** @type {?} */ (groupOrOption))).options;
188
- if (options) {
189
- for (const option of options) {
190
- if (findIt) {
191
- if (!option.disabled && !option.hide) {
192
- return option;
193
- }
194
- }
195
- else if (!findIt) {
196
- findIt = option.value === hoveringValue;
197
- }
198
- }
199
- }
200
- else {
201
- /** @type {?} */
202
- const option = (/** @type {?} */ (groupOrOption));
203
- if (findIt) {
204
- if (!option.disabled && !option.hide) {
205
- return option;
206
- }
207
- }
208
- else if (!findIt) {
209
- findIt = option.value === hoveringValue;
210
- }
211
- }
212
- }
213
- return null;
214
- }
215
- /**
216
- * @private
217
- * @param {?} value
218
- * @return {?}
219
- */
220
- static isNullOrUndefined(value) {
221
- return value === null || value === undefined;
222
- }
223
- /**
224
- * @private
225
- * @param {?} label
226
- * @param {?} searchText
227
- * @param {?} editPattern
228
- * @return {?}
229
- */
230
- static containSearchText(label, searchText, editPattern) {
231
- return searchText
232
- ? Select2Utils
233
- .formatSansUnicode(label)
234
- .match(new RegExp(Select2Utils.formatPattern(searchText, editPattern), 'i')) !== null
235
- : true;
236
- }
237
- /**
238
- * @private
239
- * @param {?} str
240
- * @return {?}
241
- */
242
- static protectPattern(str) {
243
- return str.replace(protectRegexp, '\\$&');
244
- }
245
- /**
246
- * @private
247
- * @param {?} str
248
- * @return {?}
249
- */
250
- static formatSansUnicode(str) {
251
- for (const unicodePattern of unicodePatterns) {
252
- str = str.replace(unicodePattern.s, unicodePattern.l);
253
- }
254
- return str;
255
- }
256
- /**
257
- * @private
258
- * @param {?} str
259
- * @param {?} editPattern
260
- * @return {?}
261
- */
262
- static formatPattern(str, editPattern) {
263
- str = Select2Utils.formatSansUnicode(Select2Utils.protectPattern(str));
264
- if (editPattern && typeof editPattern === 'function') {
265
- str = editPattern(str);
266
- }
267
- return str;
268
- }
269
- /**
270
- * @param {?} data
271
- * @param {?} searchText
272
- * @param {?=} editPattern
273
- * @return {?}
274
- */
275
- static getFilteredData(data, searchText, editPattern) {
276
- if (searchText) {
277
- /** @type {?} */
278
- const result = [];
279
- for (const groupOrOption of data) {
280
- /** @type {?} */
281
- const options = ((/** @type {?} */ (groupOrOption))).options;
282
- if (options) {
283
- if (options.some((/**
284
- * @param {?} group
285
- * @return {?}
286
- */
287
- group => Select2Utils.containSearchText(group.label, searchText, editPattern)))) {
288
- /** @type {?} */
289
- const filteredOptions = options.filter((/**
290
- * @param {?} group
291
- * @return {?}
292
- */
293
- group => Select2Utils.containSearchText(group.label, searchText, editPattern)));
294
- result.push({
295
- label: groupOrOption.label,
296
- options: filteredOptions
297
- });
298
- }
299
- }
300
- else if (Select2Utils.containSearchText(groupOrOption.label, searchText, editPattern)) {
301
- result.push(groupOrOption);
302
- }
303
- }
304
- return result;
305
- }
306
- else {
307
- return data;
308
- }
309
- }
310
- /**
311
- * @param {?} data
312
- * @param {?} selectedOptions
313
- * @return {?}
314
- */
315
- static getFilteredSelectedData(data, selectedOptions) {
316
- /** @type {?} */
317
- const result = [];
318
- for (const groupOrOption of data) {
319
- /** @type {?} */
320
- const options = ((/** @type {?} */ (groupOrOption))).options;
321
- if (options) {
322
- /** @type {?} */
323
- const filteredOptions = options.filter((/**
324
- * @param {?} group
325
- * @return {?}
326
- */
327
- group => Select2Utils.isSelected(selectedOptions, group, true) === 'false'));
328
- if (filteredOptions.length) {
329
- result.push({
330
- label: groupOrOption.label,
331
- options: filteredOptions
332
- });
333
- }
334
- }
335
- else if (Select2Utils.isSelected(selectedOptions, (/** @type {?} */ (groupOrOption)), true) === 'false') {
336
- result.push(groupOrOption);
337
- }
338
- }
339
- return result;
340
- }
341
- /**
342
- * @param {?} data
343
- * @param {?=} minCountForSearch
344
- * @return {?}
345
- */
346
- static isSearchboxHiddex(data, minCountForSearch) {
347
- if (minCountForSearch === '' || minCountForSearch === undefined || minCountForSearch === null || isNaN(+minCountForSearch)) {
348
- minCountForSearch = defaultMinCountForSearch;
349
- }
350
- /** @type {?} */
351
- const optionCount = Select2Utils.getOptionsCount(data);
352
- return optionCount < +minCountForSearch;
353
- }
354
- /**
355
- * @param {?} options
356
- * @param {?} option
357
- * @param {?} multiple
358
- * @return {?}
359
- */
360
- static isSelected(options, option, multiple) {
361
- return multiple
362
- ? options && ((/** @type {?} */ (options)))
363
- .some((/**
364
- * @param {?} op
365
- * @return {?}
366
- */
367
- op => op.value === option.value)) ? 'true' : 'false'
368
- : options && option.value === ((/** @type {?} */ (options))).value ? 'true' : 'false';
369
- }
370
- /**
371
- * @param {?} options
372
- * @param {?} option
373
- * @return {?}
374
- */
375
- static removeSelection(options, option) {
376
- for (let i = 0; i < ((/** @type {?} */ (options))).length; i++) {
377
- if (((/** @type {?} */ (options)))[i].value === option.value) {
378
- ((/** @type {?} */ (options))).splice(i, 1);
379
- return;
380
- }
381
- }
382
- }
383
- }
384
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0Mi11dGlscy5qcyIsInNvdXJjZVJvb3QiOiJDOi9waXRjaC9uZy1zZWxlY3QyL3Byb2plY3RzL25nLXNlbGVjdDItY29tcG9uZW50L3NyYy8iLCJzb3VyY2VzIjpbImxpYi9zZWxlY3QyLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUczRixNQUFNLE9BQU8sWUFBWTs7Ozs7O0lBRXJCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFpQixFQUFFLEtBQXNDO1FBQzdFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNyQixLQUFLLE1BQU0sYUFBYSxJQUFJLElBQUksRUFBRTs7c0JBQ3hCLE9BQU8sR0FBRyxDQUFDLG1CQUFBLGFBQWEsRUFBZ0IsQ0FBQyxDQUFDLE9BQU87Z0JBQ3ZELElBQUksT0FBTyxFQUFFO29CQUNULEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO3dCQUMxQixJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFOzRCQUN4QixPQUFPLE1BQU0sQ0FBQzt5QkFDakI7cUJBQ0o7aUJBQ0o7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLG1CQUFBLGFBQWEsRUFBaUIsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUU7d0JBQ2xELE9BQU8sbUJBQUEsYUFBYSxFQUFpQixDQUFDO3FCQUN6QztpQkFDSjthQUNKO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzs7Ozs7O0lBRUQsTUFBTSxDQUFDLGlCQUFpQixDQUNwQixJQUFpQixFQUNqQixLQUE0QyxFQUM1QyxRQUFvQztRQUVwQyxJQUFJLFFBQVEsRUFBRTs7a0JBQ0osTUFBTSxHQUFtQixLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMs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TUFBcUI7UUFDekYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsbUJBQUEsT0FBTyxFQUFtQixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFELElBQUksQ0FBQyxtQkFBQSxPQUFPLEVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRTtnQkFDeEQsQ0FBQyxtQkFBQSxPQUFPLEVBQW1CLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMxQyxPQUFPO2FBQ1Y7U0FDSjtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmF1bHRNaW5Db3VudEZvclNlYXJjaCwgcHJvdGVjdFJlZ2V4cCwgdW5pY29kZVBhdHRlcm5zIH0gZnJvbSAnLi9zZWxlY3QyLWNvbnN0JztcclxuaW1wb3J0IHsgU2VsZWN0MkRhdGEsIFNlbGVjdDJHcm91cCwgU2VsZWN0Mk9wdGlvbiwgU2VsZWN0MlVwZGF0ZVZhbHVlLCBTZWxlY3QyVmFsdWUgfSBmcm9tICcuL3NlbGVjdDItaW50ZXJmYWNlcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgU2VsZWN0MlV0aWxzIHtcclxuXHJcbiAgICBzdGF0aWMgZ2V0T3B0aW9uQnlWYWx1ZShkYXRhOiBTZWxlY3QyRGF0YSwgdmFsdWU6IFNlbGVjdDJWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGdyb3VwT3JPcHRpb24gb2YgZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IChncm91cE9yT3B0aW9uIGFzIFNlbGVjdDJHcm91cCkub3B0aW9ucztcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnZhbHVlID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKChncm91cE9yT3B0aW9uIGFzIFNlbGVjdDJPcHRpb24pLnZhbHVlID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBPck9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0T3B0aW9uc0J5VmFsdWUoXHJcbiAgICAgICAgZGF0YTogU2VsZWN0MkRhdGEsXHJcbiAgICAgICAgdmFsdWU6IFNlbGVjdDJVcGRhdGVWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgbXVsdGlwbGU6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkXHJcbiAgICApIHtcclxuICAgICAgICBpZiAobXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWVzOiBTZWxlY3QyVmFsdWVbXSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBTZWxlY3QyT3B0aW9uW10gPSBbXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIHZhbHVlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gU2VsZWN0MlV0aWxzLmdldE9wdGlvbkJ5VmFsdWUoZGF0YSwgdik7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob3B0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gU2VsZWN0MlV0aWxzLmdldE9wdGlvbkJ5VmFsdWUoZGF0YSwgdmFsdWUgYXMgU2VsZWN0MlZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEZpcnN0QXZhaWxhYmxlT3B0aW9uKGRhdGE6IFNlbGVjdDJEYXRhKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBncm91cE9yT3B0aW9uIG9mIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoZ3JvdXBPck9wdGlvbiBhcyBTZWxlY3QyR3JvdXApLm9wdGlvbnM7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb24udmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IGdyb3VwT3JPcHRpb24gYXMgU2VsZWN0Mk9wdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbi5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRPcHRpb25zQ291bnQoZGF0YTogU2VsZWN0MkRhdGEpIHtcclxuICAgICAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZ3JvdXBPck9wdGlvbiBvZiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gKGdyb3VwT3JPcHRpb24gYXMgU2VsZWN0Mkdyb3VwKS5vcHRpb25zO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBvcHRpb25zLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHZhbHVlSXNOb3RJbkZpbHRlcmVkRGF0YShmaWx0ZXJlZERhdGE6IFNlbGVjdDJEYXRhLCB2YWx1ZTogU2VsZWN0MlZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmIChTZWxlY3QyVXRpbHMuaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwT3JPcHRpb24gb2YgZmlsdGVyZWREYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoZ3JvdXBPck9wdGlvbiBhcyBTZWxlY3QyR3JvdXApLm9wdGlvbnM7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbi52YWx1ZSA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICgoZ3JvdXBPck9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uKS52YWx1ZSA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvZ25pdGl2ZS1jb21wbGV4aXR5XHJcbiAgICBzdGF0aWMgZ2V0UHJldmlvdXNPcHRpb24oZmlsdGVyZWREYXRhOiBTZWxlY3QyRGF0YSwgaG92ZXJpbmdWYWx1ZTogU2VsZWN0MlZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGxldCBmaW5kSXQgPSBTZWxlY3QyVXRpbHMuaXNOdWxsT3JVbmRlZmluZWQoaG92ZXJpbmdWYWx1ZSk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IGZpbHRlcmVkRGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBjb25zdCBncm91cE9yT3B0aW9uID0gZmlsdGVyZWREYXRhW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gKGdyb3VwT3JPcHRpb24gYXMgU2VsZWN0Mkdyb3VwKS5vcHRpb25zO1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IG9wdGlvbnMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSBvcHRpb25zW2pdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5kSXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uZGlzYWJsZWQgJiYgIW9wdGlvbi5oaWRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZmluZEl0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRJdCA9IG9wdGlvbi52YWx1ZSA9PT0gaG92ZXJpbmdWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSBncm91cE9yT3B0aW9uIGFzIFNlbGVjdDJPcHRpb247XHJcbiAgICAgICAgICAgICAgICBpZiAoZmluZEl0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uZGlzYWJsZWQgJiYgIW9wdGlvbi5oaWRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFmaW5kSXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaW5kSXQgPSBvcHRpb24udmFsdWUgPT09IGhvdmVyaW5nVmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29nbml0aXZlLWNvbXBsZXhpdHlcclxuICAgIHN0YXRpYyBnZXROZXh0T3B0aW9uKGZpbHRlcmVkRGF0YTogU2VsZWN0MkRhdGEsIGhvdmVyaW5nVmFsdWU6IFNlbGVjdDJWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICBsZXQgZmluZEl0ID0gU2VsZWN0MlV0aWxzLmlzTnVsbE9yVW5kZWZpbmVkKGhvdmVyaW5nVmFsdWUpO1xyXG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXBPck9wdGlvbiBvZiBmaWx0ZXJlZERhdGEpIHtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IChncm91cE9yT3B0aW9uIGFzIFNlbGVjdDJHcm91cCkub3B0aW9ucztcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmluZEl0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLmRpc2FibGVkICYmICFvcHRpb24uaGlkZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbmRJdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5kSXQgPSBvcHRpb24udmFsdWUgPT09IGhvdmVyaW5nVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gZ3JvdXBPck9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRJdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLmRpc2FibGVkICYmICFvcHRpb24uaGlkZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbmRJdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmRJdCA9IG9wdGlvbi52YWx1ZSA9PT0gaG92ZXJpbmdWYWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpc051bGxPclVuZGVmaW5lZCh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgY29udGFpblNlYXJjaFRleHQoXHJcbiAgICAgICAgbGFiZWw6IHN0cmluZyxcclxuICAgICAgICBzZWFyY2hUZXh0OiBzdHJpbmcgfCBudWxsLFxyXG4gICAgICAgIGVkaXRQYXR0ZXJuOiAoKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcpIHwgdW5kZWZpbmVkXHJcbiAgICApOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gc2VhcmNoVGV4dFxyXG4gICAgICAgICAgICA/IFNlbGVjdDJVdGlsc1xyXG4gICAgICAgICAgICAgICAgLmZvcm1hdFNhbnNVbmljb2RlKGxhYmVsKVxyXG4gICAgICAgICAgICAgICAgLm1hdGNoKG5ldyBSZWdFeHAoU2VsZWN0MlV0aWxzLmZvcm1hdFBhdHRlcm4oc2VhcmNoVGV4dCwgZWRpdFBhdHRlcm4pLCAnaScpKSAhPT0gbnVsbFxyXG4gICAgICAgICAgICA6IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcHJvdGVjdFBhdHRlcm4oc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBzdHIucmVwbGFjZShwcm90ZWN0UmVnZXhwLCAnXFxcXCQmJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZm9ybWF0U2Fuc1VuaWNvZGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGZvciAoY29uc3QgdW5pY29kZVBhdHRlcm4gb2YgdW5pY29kZVBhdHRlcm5zKSB7XHJcbiAgICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKHVuaWNvZGVQYXR0ZXJuLnMsIHVuaWNvZGVQYXR0ZXJuLmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGZvcm1hdFBhdHRlcm4oc3RyOiBzdHJpbmcsIGVkaXRQYXR0ZXJuOiAoKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcpIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgICAgICBzdHIgPSBTZWxlY3QyVXRpbHMuZm9ybWF0U2Fuc1VuaWNvZGUoU2VsZWN0MlV0aWxzLnByb3RlY3RQYXR0ZXJuKHN0cikpO1xyXG5cclxuICAgICAgICBpZiAoZWRpdFBhdHRlcm4gJiYgdHlwZW9mIGVkaXRQYXR0ZXJuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHN0ciA9IGVkaXRQYXR0ZXJuKHN0cik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEZpbHRlcmVkRGF0YShkYXRhOiBTZWxlY3QyRGF0YSwgc2VhcmNoVGV4dDogc3RyaW5nIHwgbnVsbCwgZWRpdFBhdHRlcm4/OiAoc3RyOiBzdHJpbmcpID0+IHN0cmluZyk6IFNlbGVjdDJEYXRhIHtcclxuICAgICAgICBpZiAoc2VhcmNoVGV4dCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFNlbGVjdDJEYXRhID0gW107XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZ3JvdXBPck9wdGlvbiBvZiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gKGdyb3VwT3JPcHRpb24gYXMgU2VsZWN0Mkdyb3VwKS5vcHRpb25zO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zb21lKGdyb3VwID0+IFNlbGVjdDJVdGlscy5jb250YWluU2VhcmNoVGV4dChncm91cC5sYWJlbCwgc2VhcmNoVGV4dCwgZWRpdFBhdHRlcm4pKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnMgPSBvcHRpb25zLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0+IFNlbGVjdDJVdGlscy5jb250YWluU2VhcmNoVGV4dChncm91cC5sYWJlbCwgc2VhcmNoVGV4dCwgZWRpdFBhdHRlcm4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBncm91cE9yT3B0aW9uLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogZmlsdGVyZWRPcHRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU2VsZWN0MlV0aWxzLmNvbnRhaW5TZWFyY2hUZXh0KGdyb3VwT3JPcHRpb24ubGFiZWwsIHNlYXJjaFRleHQsIGVkaXRQYXR0ZXJuKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdyb3VwT3JPcHRpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRGaWx0ZXJlZFNlbGVjdGVkRGF0YShkYXRhOiBTZWxlY3QyRGF0YSwgc2VsZWN0ZWRPcHRpb25zOiBTZWxlY3QyT3B0aW9uIHwgU2VsZWN0Mk9wdGlvbltdIHwgbnVsbCk6IFNlbGVjdDJEYXRhIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFNlbGVjdDJEYXRhID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBncm91cE9yT3B0aW9uIG9mIGRhdGEpIHtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IChncm91cE9yT3B0aW9uIGFzIFNlbGVjdDJHcm91cCkub3B0aW9ucztcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkT3B0aW9ucyA9IG9wdGlvbnMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwID0+IFNlbGVjdDJVdGlscy5pc1NlbGVjdGVkKHNlbGVjdGVkT3B0aW9ucywgZ3JvdXAsIHRydWUpID09PSAnZmFsc2UnXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkT3B0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBncm91cE9yT3B0aW9uLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBmaWx0ZXJlZE9wdGlvbnNcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChTZWxlY3QyVXRpbHMuaXNTZWxlY3RlZChzZWxlY3RlZE9wdGlvbnMsIGdyb3VwT3JPcHRpb24gYXMgU2VsZWN0Mk9wdGlvbiwgdHJ1ZSkgPT09ICdmYWxzZScpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdyb3VwT3JPcHRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzU2VhcmNoYm94SGlkZGV4KGRhdGE6IFNlbGVjdDJEYXRhLCBtaW5Db3VudEZvclNlYXJjaD86IG51bWJlciB8IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChtaW5Db3VudEZvclNlYXJjaCA9PT0gJycgfHwgbWluQ291bnRGb3JTZWFyY2ggPT09IHVuZGVmaW5lZCB8fCBtaW5Db3VudEZvclNlYXJjaCA9PT0gbnVsbCB8fCBpc05hTigrbWluQ291bnRGb3JTZWFyY2gpKSB7XHJcbiAgICAgICAgICAgIG1pbkNvdW50Rm9yU2VhcmNoID0gZGVmYXVsdE1pbkNvdW50Rm9yU2VhcmNoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcHRpb25Db3VudCA9IFNlbGVjdDJVdGlscy5nZXRPcHRpb25zQ291bnQoZGF0YSk7XHJcbiAgICAgICAgcmV0dXJuIG9wdGlvbkNvdW50IDwgK21pbkNvdW50Rm9yU2VhcmNoO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc1NlbGVjdGVkKFxyXG4gICAgICAgIG9wdGlvbnM6IFNlbGVjdDJPcHRpb24gfCBTZWxlY3QyT3B0aW9uW10gfCBudWxsLFxyXG4gICAgICAgIG9wdGlvbjogU2VsZWN0Mk9wdGlvbixcclxuICAgICAgICBtdWx0aXBsZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWRcclxuICAgICkge1xyXG4gICAgICAgIHJldHVybiBtdWx0aXBsZVxyXG4gICAgICAgICAgICA/IG9wdGlvbnMgJiYgKG9wdGlvbnMgYXMgU2VsZWN0Mk9wdGlvbltdKVxyXG4gICAgICAgICAgICAgICAgLnNvbWUob3AgPT4gb3AudmFsdWUgPT09IG9wdGlvbi52YWx1ZSkgPyAndHJ1ZScgOiAnZmFsc2UnXHJcbiAgICAgICAgICAgIDogb3B0aW9ucyAmJiBvcHRpb24udmFsdWUgPT09IChvcHRpb25zIGFzIFNlbGVjdDJPcHRpb24pLnZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJztcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVtb3ZlU2VsZWN0aW9uKG9wdGlvbnM6IFNlbGVjdDJPcHRpb24gfCBTZWxlY3QyT3B0aW9uW10gfCBudWxsLCBvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IChvcHRpb25zIGFzIFNlbGVjdDJPcHRpb25bXSkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKChvcHRpb25zIGFzIFNlbGVjdDJPcHRpb25bXSlbaV0udmFsdWUgPT09IG9wdGlvbi52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgKG9wdGlvbnMgYXMgU2VsZWN0Mk9wdGlvbltdKS5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * Generated from: lib/select2-utils.ts
4
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
+ */
6
+ import { defaultMinCountForSearch, protectRegexp, unicodePatterns } from './select2-const';
7
+ export class Select2Utils {
8
+ /**
9
+ * @param {?} data
10
+ * @param {?} value
11
+ * @return {?}
12
+ */
13
+ static getOptionByValue(data, value) {
14
+ if (Array.isArray(data)) {
15
+ for (const groupOrOption of data) {
16
+ /** @type {?} */
17
+ const options = ((/** @type {?} */ (groupOrOption))).options;
18
+ if (options) {
19
+ for (const option of options) {
20
+ if (option.value === value) {
21
+ return option;
22
+ }
23
+ }
24
+ }
25
+ else if (((/** @type {?} */ (groupOrOption))).value === value) {
26
+ return (/** @type {?} */ (groupOrOption));
27
+ }
28
+ }
29
+ }
30
+ return null;
31
+ }
32
+ /**
33
+ * @param {?} data
34
+ * @param {?} value
35
+ * @param {?} multiple
36
+ * @return {?}
37
+ */
38
+ static getOptionsByValue(data, value, multiple) {
39
+ if (multiple) {
40
+ /** @type {?} */
41
+ const values = Array.isArray(value) ? value : [];
42
+ /** @type {?} */
43
+ const result = [];
44
+ for (const v of values) {
45
+ /** @type {?} */
46
+ const option = Select2Utils.getOptionByValue(data, v);
47
+ if (option) {
48
+ result.push(option);
49
+ }
50
+ }
51
+ return result;
52
+ }
53
+ return Select2Utils.getOptionByValue(data, (/** @type {?} */ (value)));
54
+ }
55
+ /**
56
+ * @param {?} data
57
+ * @return {?}
58
+ */
59
+ static getFirstAvailableOption(data) {
60
+ if (Array.isArray(data)) {
61
+ for (const groupOrOption of data) {
62
+ /** @type {?} */
63
+ const options = ((/** @type {?} */ (groupOrOption))).options;
64
+ if (options) {
65
+ for (const option of options) {
66
+ if (!option.disabled) {
67
+ return option.value;
68
+ }
69
+ }
70
+ }
71
+ else {
72
+ /** @type {?} */
73
+ const option = (/** @type {?} */ (groupOrOption));
74
+ if (!option.disabled) {
75
+ return option.value;
76
+ }
77
+ }
78
+ }
79
+ }
80
+ return null;
81
+ }
82
+ /**
83
+ * @param {?} filteredData
84
+ * @param {?} value
85
+ * @return {?}
86
+ */
87
+ static valueIsNotInFilteredData(filteredData, value) {
88
+ if (Select2Utils.isNullOrUndefined(value)) {
89
+ return true;
90
+ }
91
+ for (const groupOrOption of filteredData) {
92
+ /** @type {?} */
93
+ const options = ((/** @type {?} */ (groupOrOption))).options;
94
+ if (options) {
95
+ for (const option of options) {
96
+ if (option.value === value) {
97
+ return false;
98
+ }
99
+ }
100
+ }
101
+ else if (((/** @type {?} */ (groupOrOption))).value === value) {
102
+ return false;
103
+ }
104
+ }
105
+ return true;
106
+ }
107
+ // tslint:disable-next-line:cognitive-complexity
108
+ /**
109
+ * @param {?} filteredData
110
+ * @param {?} hoveringValue
111
+ * @return {?}
112
+ */
113
+ static getPreviousOption(filteredData, hoveringValue) {
114
+ /** @type {?} */
115
+ let findIt = Select2Utils.isNullOrUndefined(hoveringValue);
116
+ for (let i = filteredData.length - 1; i >= 0; i--) {
117
+ /** @type {?} */
118
+ const groupOrOption = filteredData[i];
119
+ /** @type {?} */
120
+ const options = ((/** @type {?} */ (groupOrOption))).options;
121
+ if (options) {
122
+ for (let j = options.length - 1; j >= 0; j--) {
123
+ /** @type {?} */
124
+ const option = options[j];
125
+ if (findIt && !option.disabled && !option.hide) {
126
+ return option;
127
+ }
128
+ if (!findIt) {
129
+ findIt = option.value === hoveringValue;
130
+ }
131
+ }
132
+ }
133
+ else {
134
+ /** @type {?} */
135
+ const option = (/** @type {?} */ (groupOrOption));
136
+ if (findIt && !option.disabled && !option.hide) {
137
+ return option;
138
+ }
139
+ if (!findIt) {
140
+ findIt = option.value === hoveringValue;
141
+ }
142
+ }
143
+ }
144
+ return null;
145
+ }
146
+ // tslint:disable-next-line:cognitive-complexity
147
+ /**
148
+ * @param {?} filteredData
149
+ * @param {?} hoveringValue
150
+ * @return {?}
151
+ */
152
+ static getNextOption(filteredData, hoveringValue) {
153
+ /** @type {?} */
154
+ let findIt = Select2Utils.isNullOrUndefined(hoveringValue);
155
+ for (const groupOrOption of filteredData) {
156
+ /** @type {?} */
157
+ const options = ((/** @type {?} */ (groupOrOption))).options;
158
+ if (options) {
159
+ for (const option of options) {
160
+ if (findIt) {
161
+ if (!option.disabled && !option.hide) {
162
+ return option;
163
+ }
164
+ }
165
+ else if (!findIt) {
166
+ findIt = option.value === hoveringValue;
167
+ }
168
+ }
169
+ }
170
+ else {
171
+ /** @type {?} */
172
+ const option = (/** @type {?} */ (groupOrOption));
173
+ if (findIt) {
174
+ if (!option.disabled && !option.hide) {
175
+ return option;
176
+ }
177
+ }
178
+ else if (!findIt) {
179
+ findIt = option.value === hoveringValue;
180
+ }
181
+ }
182
+ }
183
+ return null;
184
+ }
185
+ /**
186
+ * @param {?} data
187
+ * @param {?=} maxResults
188
+ * @return {?}
189
+ */
190
+ static getReduceData(data, maxResults = 0) {
191
+ if (maxResults > 0) {
192
+ /** @type {?} */
193
+ let counter = 0;
194
+ /** @type {?} */
195
+ const result = [];
196
+ // debugger;
197
+ for (const groupOrOption of data) {
198
+ /** @type {?} */
199
+ const options = ((/** @type {?} */ (groupOrOption))).options;
200
+ if (options) {
201
+ /** @type {?} */
202
+ const group = Object.assign(Object.assign({}, groupOrOption), { options: [] });
203
+ result.push(group);
204
+ for (const item of options) {
205
+ group.options.push(item);
206
+ counter++;
207
+ if (counter === maxResults) {
208
+ return { result, reduce: true };
209
+ }
210
+ }
211
+ }
212
+ else {
213
+ result.push(groupOrOption);
214
+ counter++;
215
+ }
216
+ if (counter === maxResults) {
217
+ return { result, reduce: true };
218
+ }
219
+ }
220
+ return { result, reduce: false };
221
+ }
222
+ else {
223
+ return { result: data, reduce: false };
224
+ }
225
+ }
226
+ /**
227
+ * @param {?} data
228
+ * @param {?} searchText
229
+ * @param {?=} editPattern
230
+ * @return {?}
231
+ */
232
+ static getFilteredData(data, searchText, editPattern) {
233
+ if (searchText) {
234
+ /** @type {?} */
235
+ const result = [];
236
+ for (const groupOrOption of data) {
237
+ /** @type {?} */
238
+ const options = ((/** @type {?} */ (groupOrOption))).options;
239
+ if (options) {
240
+ if (options.some((/**
241
+ * @param {?} group
242
+ * @return {?}
243
+ */
244
+ group => Select2Utils.containSearchText(group.label, searchText, editPattern)))) {
245
+ /** @type {?} */
246
+ const filteredOptions = options.filter((/**
247
+ * @param {?} group
248
+ * @return {?}
249
+ */
250
+ group => Select2Utils.containSearchText(group.label, searchText, editPattern)));
251
+ result.push(Object.assign(Object.assign({}, groupOrOption), { options: filteredOptions }));
252
+ }
253
+ }
254
+ else if (Select2Utils.containSearchText(groupOrOption.label, searchText, editPattern)) {
255
+ result.push(groupOrOption);
256
+ }
257
+ }
258
+ return result;
259
+ }
260
+ else {
261
+ return data;
262
+ }
263
+ }
264
+ /**
265
+ * @param {?} data
266
+ * @param {?} selectedOptions
267
+ * @return {?}
268
+ */
269
+ static getFilteredSelectedData(data, selectedOptions) {
270
+ /** @type {?} */
271
+ const result = [];
272
+ for (const groupOrOption of data) {
273
+ /** @type {?} */
274
+ const options = ((/** @type {?} */ (groupOrOption))).options;
275
+ if (options) {
276
+ /** @type {?} */
277
+ const filteredOptions = options.filter((/**
278
+ * @param {?} group
279
+ * @return {?}
280
+ */
281
+ group => Select2Utils.isSelected(selectedOptions, group, true) === 'false'));
282
+ if (filteredOptions.length) {
283
+ result.push(Object.assign(Object.assign({}, groupOrOption), { options: filteredOptions }));
284
+ }
285
+ }
286
+ else if (Select2Utils.isSelected(selectedOptions, (/** @type {?} */ (groupOrOption)), true) === 'false') {
287
+ result.push(groupOrOption);
288
+ }
289
+ }
290
+ return result;
291
+ }
292
+ /**
293
+ * @param {?} data
294
+ * @param {?=} minCountForSearch
295
+ * @return {?}
296
+ */
297
+ static isSearchboxHiddex(data, minCountForSearch) {
298
+ if (minCountForSearch === '' ||
299
+ minCountForSearch === undefined ||
300
+ minCountForSearch === null ||
301
+ isNaN(+minCountForSearch)) {
302
+ minCountForSearch = defaultMinCountForSearch;
303
+ }
304
+ /** @type {?} */
305
+ const optionCount = Select2Utils.getOptionsCount(data);
306
+ return optionCount < +minCountForSearch;
307
+ }
308
+ /**
309
+ * @param {?} options
310
+ * @param {?} option
311
+ * @param {?} multiple
312
+ * @return {?}
313
+ */
314
+ static isSelected(options, option, multiple) {
315
+ return multiple
316
+ ? options && ((/** @type {?} */ (options))).some((/**
317
+ * @param {?} op
318
+ * @return {?}
319
+ */
320
+ op => op.value === option.value))
321
+ ? 'true'
322
+ : 'false'
323
+ : options && option.value === ((/** @type {?} */ (options))).value
324
+ ? 'true'
325
+ : 'false';
326
+ }
327
+ /**
328
+ * @param {?} options
329
+ * @param {?} option
330
+ * @return {?}
331
+ */
332
+ static removeSelection(options, option) {
333
+ for (let i = 0; i < ((/** @type {?} */ (options))).length; i++) {
334
+ if (((/** @type {?} */ (options)))[i].value === option.value) {
335
+ ((/** @type {?} */ (options))).splice(i, 1);
336
+ return;
337
+ }
338
+ }
339
+ }
340
+ /**
341
+ * @private
342
+ * @param {?} data
343
+ * @return {?}
344
+ */
345
+ static getOptionsCount(data) {
346
+ /** @type {?} */
347
+ let count = 0;
348
+ if (Array.isArray(data)) {
349
+ for (const groupOrOption of data) {
350
+ /** @type {?} */
351
+ const options = ((/** @type {?} */ (groupOrOption))).options;
352
+ if (options) {
353
+ count += options.length;
354
+ }
355
+ else {
356
+ count++;
357
+ }
358
+ }
359
+ }
360
+ return count;
361
+ }
362
+ /**
363
+ * @private
364
+ * @param {?} value
365
+ * @return {?}
366
+ */
367
+ static isNullOrUndefined(value) {
368
+ return value === null || value === undefined;
369
+ }
370
+ /**
371
+ * @private
372
+ * @param {?} label
373
+ * @param {?} searchText
374
+ * @param {?} editPattern
375
+ * @return {?}
376
+ */
377
+ static containSearchText(label, searchText, editPattern) {
378
+ return searchText
379
+ ? Select2Utils.formatSansUnicode(label).match(new RegExp(Select2Utils.formatPattern(searchText, editPattern), 'i')) !== null
380
+ : true;
381
+ }
382
+ /**
383
+ * @private
384
+ * @param {?} str
385
+ * @return {?}
386
+ */
387
+ static protectPattern(str) {
388
+ return str.replace(protectRegexp, '\\$&');
389
+ }
390
+ /**
391
+ * @private
392
+ * @param {?} str
393
+ * @return {?}
394
+ */
395
+ static formatSansUnicode(str) {
396
+ for (const unicodePattern of unicodePatterns) {
397
+ str = str.replace(unicodePattern.s, unicodePattern.l);
398
+ }
399
+ return str;
400
+ }
401
+ /**
402
+ * @private
403
+ * @param {?} str
404
+ * @param {?} editPattern
405
+ * @return {?}
406
+ */
407
+ static formatPattern(str, editPattern) {
408
+ str = Select2Utils.formatSansUnicode(Select2Utils.protectPattern(str));
409
+ if (editPattern && typeof editPattern === 'function') {
410
+ str = editPattern(str);
411
+ }
412
+ return str;
413
+ }
414
+ }
415
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0Mi11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIvbWVkaWEvemVmbGluZy9aQUlERS02L0dpdC9uZy1zZWxlY3QyL3Byb2plY3RzL25nLXNlbGVjdDItY29tcG9uZW50L3NyYy8iLCJzb3VyY2VzIjpbImxpYi9zZWxlY3QyLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUczRixNQUFNLE9BQU8sWUFBWTs7Ozs7O0lBQ3JCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFpQixFQUFFLEtBQXNDO1FBQzdFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNyQixLQUFLLE1BQU0sYUFBYSxJQUFJLElBQUksRUFBRTs7c0JBQ3hCLE9BQU8sR0FBRyxDQUFDLG1CQUFBLGFBQWEsRUFBZ0IsQ0FBQyxDQUFDLE9BQU87Z0JBQ3ZELElBQUksT0FBTyxFQUFFO29CQUNULEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO3dCQUMxQixJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFOzRCQUN4QixPQUFPLE1BQU0sQ0FBQzt5QkFDakI7cUJBQ0o7aUJBQ0o7cUJBQU0sSUFBSSxDQUFDLG1CQUFBLGFBQWEsRUFBaUIsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUU7b0JBQ3pELE9BQU8sbUJBQUEsYUFBYSxFQUFpQixDQUFDO2lCQUN6QzthQUNKO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzs7Ozs7O0lBRUQsTUFBTSxDQUFDLGlCQUFpQixDQUNwQixJQUFpQixFQUNqQixLQUE0QyxFQUM1QyxRQUFvQztRQUVwQyxJQUFJLFFBQVEsRUFBRTs7a0JBQ0osTUFBTSxHQUFtQixLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFL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LENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXZFLElBQUksV0FBVyxJQUFJLE9BQU8sV0FBVyxLQUFLLFVBQVUsRUFBRTtZQUNsRCxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZhdWx0TWluQ291bnRGb3JTZWFyY2gsIHByb3RlY3RSZWdleHAsIHVuaWNvZGVQYXR0ZXJucyB9IGZyb20gJy4vc2VsZWN0Mi1jb25zdCc7XG5pbXBvcnQgeyBTZWxlY3QyRGF0YSwgU2VsZWN0Mkdyb3VwLCBTZWxlY3QyT3B0aW9uLCBTZWxlY3QyVXBkYXRlVmFsdWUsIFNlbGVjdDJWYWx1ZSB9IGZyb20gJy4vc2VsZWN0Mi1pbnRlcmZhY2VzJztcblxuZXhwb3J0IGNsYXNzIFNlbGVjdDJVdGlscyB7XG4gICAgc3RhdGljIGdldE9wdGlvbkJ5VmFsdWUoZGF0YTogU2VsZWN0MkRhdGEsIHZhbHVlOiBTZWxlY3QyVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGdyb3VwT3JPcHRpb24gb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoZ3JvdXBPck9wdGlvbiBhcyBTZWxlY3QyR3JvdXApLm9wdGlvbnM7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbi52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZ3JvdXBPck9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uKS52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwT3JPcHRpb24gYXMgU2VsZWN0Mk9wdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldE9wdGlvbnNCeVZhbHVlKFxuICAgICAgICBkYXRhOiBTZWxlY3QyRGF0YSxcbiAgICAgICAgdmFsdWU6IFNlbGVjdDJVcGRhdGVWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgICAgIG11bHRpcGxlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICApIHtcbiAgICAgICAgaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXM6IFNlbGVjdDJWYWx1ZVtdID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBTZWxlY3QyT3B0aW9uW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSBTZWxlY3QyVXRpbHMuZ2V0T3B0aW9uQnlWYWx1ZShkYXRhLCB2KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU2VsZWN0MlV0aWxzLmdldE9wdGlvbkJ5VmFsdWUoZGF0YSwgdmFsdWUgYXMgU2VsZWN0MlZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEZpcnN0QXZhaWxhYmxlT3B0aW9uKGRhdGE6IFNlbGVjdDJEYXRhKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGdyb3VwT3JPcHRpb24gb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoZ3JvdXBPck9wdGlvbiBhcyBTZWxlY3QyR3JvdXApLm9wdGlvbnM7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gZ3JvdXBPck9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsdWVJc05vdEluRmlsdGVyZWREYXRhKGZpbHRlcmVkRGF0YTogU2VsZWN0MkRhdGEsIHZhbHVlOiBTZWxlY3QyVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChTZWxlY3QyVXRpbHMuaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwT3JPcHRpb24gb2YgZmlsdGVyZWREYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gKGdyb3VwT3JPcHRpb24gYXMgU2VsZWN0Mkdyb3VwKS5vcHRpb25zO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24udmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChncm91cE9yT3B0aW9uIGFzIFNlbGVjdDJPcHRpb24pLnZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29nbml0aXZlLWNvbXBsZXhpdHlcbiAgICBzdGF0aWMgZ2V0UHJldmlvdXNPcHRpb24oZmlsdGVyZWREYXRhOiBTZWxlY3QyRGF0YSwgaG92ZXJpbmdWYWx1ZTogU2VsZWN0MlZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgZmluZEl0ID0gU2VsZWN0MlV0aWxzLmlzTnVsbE9yVW5kZWZpbmVkKGhvdmVyaW5nVmFsdWUpO1xuICAgICAgICBmb3IgKGxldCBpID0gZmlsdGVyZWREYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cE9yT3B0aW9uID0gZmlsdGVyZWREYXRhW2ldO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IChncm91cE9yT3B0aW9uIGFzIFNlbGVjdDJHcm91cCkub3B0aW9ucztcbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IG9wdGlvbnMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9uc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRJdCAmJiAhb3B0aW9uLmRpc2FibGVkICYmICFvcHRpb24uaGlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRJdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmluZEl0ID0gb3B0aW9uLnZhbHVlID09PSBob3ZlcmluZ1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSBncm91cE9yT3B0aW9uIGFzIFNlbGVjdDJPcHRpb247XG4gICAgICAgICAgICAgICAgaWYgKGZpbmRJdCAmJiAhb3B0aW9uLmRpc2FibGVkICYmICFvcHRpb24uaGlkZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWZpbmRJdCkge1xuICAgICAgICAgICAgICAgICAgICBmaW5kSXQgPSBvcHRpb24udmFsdWUgPT09IGhvdmVyaW5nVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29nbml0aXZlLWNvbXBsZXhpdHlcbiAgICBzdGF0aWMgZ2V0TmV4dE9wdGlvbihmaWx0ZXJlZERhdGE6IFNlbGVjdDJEYXRhLCBob3ZlcmluZ1ZhbHVlOiBTZWxlY3QyVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBmaW5kSXQgPSBTZWxlY3QyVXRpbHMuaXNOdWxsT3JVbmRlZmluZWQoaG92ZXJpbmdWYWx1ZSk7XG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXBPck9wdGlvbiBvZiBmaWx0ZXJlZERhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoZ3JvdXBPck9wdGlvbiBhcyBTZWxlY3QyR3JvdXApLm9wdGlvbnM7XG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRJdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uZGlzYWJsZWQgJiYgIW9wdGlvbi5oaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmluZEl0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5kSXQgPSBvcHRpb24udmFsdWUgPT09IGhvdmVyaW5nVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IGdyb3VwT3JPcHRpb24gYXMgU2VsZWN0Mk9wdGlvbjtcbiAgICAgICAgICAgICAgICBpZiAoZmluZEl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLmRpc2FibGVkICYmICFvcHRpb24uaGlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbmRJdCkge1xuICAgICAgICAgICAgICAgICAgICBmaW5kSXQgPSBvcHRpb24udmFsdWUgPT09IGhvdmVyaW5nVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRSZWR1Y2VEYXRhKGRhdGE6IFNlbGVjdDJEYXRhLCBtYXhSZXN1bHRzOiBudW1iZXIgPSAwKTogeyByZXN1bHQ6IFNlbGVjdDJEYXRhOyByZWR1Y2U6IGJvb2xlYW4gfSB7XG4gICAgICAgIGlmIChtYXhSZXN1bHRzID4gMCkge1xuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBTZWxlY3QyRGF0YSA9IFtdO1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZ3JvdXBPck9wdGlvbiBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IChncm91cE9yT3B0aW9uIGFzIFNlbGVjdDJHcm91cCkub3B0aW9ucztcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmdyb3VwT3JPcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ3JvdXApO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAub3B0aW9ucy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ZXIgPT09IG1heFJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyByZXN1bHQsIHJlZHVjZTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ3JvdXBPck9wdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXIgPT09IG1heFJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0LCByZWR1Y2U6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyByZXN1bHQsIHJlZHVjZTogZmFsc2UgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdDogZGF0YSwgcmVkdWNlOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEZpbHRlcmVkRGF0YShcbiAgICAgICAgZGF0YTogU2VsZWN0MkRhdGEsXG4gICAgICAgIHNlYXJjaFRleHQ6IHN0cmluZyB8IG51bGwsXG4gICAgICAgIGVkaXRQYXR0ZXJuPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcsXG4gICAgKTogU2VsZWN0MkRhdGEge1xuICAgICAgICBpZiAoc2VhcmNoVGV4dCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBTZWxlY3QyRGF0YSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBncm91cE9yT3B0aW9uIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gKGdyb3VwT3JPcHRpb24gYXMgU2VsZWN0Mkdyb3VwKS5vcHRpb25zO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNvbWUoZ3JvdXAgPT4gU2VsZWN0MlV0aWxzLmNvbnRhaW5TZWFyY2hUZXh0KGdyb3VwLmxhYmVsLCBzZWFyY2hUZXh0LCBlZGl0UGF0dGVybikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnMgPSBvcHRpb25zLmZpbHRlcihncm91cCA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdDJVdGlscy5jb250YWluU2VhcmNoVGV4dChncm91cC5sYWJlbCwgc2VhcmNoVGV4dCwgZWRpdFBhdHRlcm4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5ncm91cE9yT3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IGZpbHRlcmVkT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTZWxlY3QyVXRpbHMuY29udGFpblNlYXJjaFRleHQoZ3JvdXBPck9wdGlvbi5sYWJlbCwgc2VhcmNoVGV4dCwgZWRpdFBhdHRlcm4pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdyb3VwT3JPcHRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRGaWx0ZXJlZFNlbGVjdGVkRGF0YShcbiAgICAgICAgZGF0YTogU2VsZWN0MkRhdGEsXG4gICAgICAgIHNlbGVjdGVkT3B0aW9uczogU2VsZWN0Mk9wdGlvbiB8IFNlbGVjdDJPcHRpb25bXSB8IG51bGwsXG4gICAgKTogU2VsZWN0MkRhdGEge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFNlbGVjdDJEYXRhID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXBPck9wdGlvbiBvZiBkYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gKGdyb3VwT3JPcHRpb24gYXMgU2VsZWN0Mkdyb3VwKS5vcHRpb25zO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnMgPSBvcHRpb25zLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPT4gU2VsZWN0MlV0aWxzLmlzU2VsZWN0ZWQoc2VsZWN0ZWRPcHRpb25zLCBncm91cCwgdHJ1ZSkgPT09ICdmYWxzZScsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5ncm91cE9yT3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogZmlsdGVyZWRPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFNlbGVjdDJVdGlscy5pc1NlbGVjdGVkKHNlbGVjdGVkT3B0aW9ucywgZ3JvdXBPck9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uLCB0cnVlKSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdyb3VwT3JPcHRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgc3RhdGljIGlzU2VhcmNoYm94SGlkZGV4KGRhdGE6IFNlbGVjdDJEYXRhLCBtaW5Db3VudEZvclNlYXJjaD86IG51bWJlciB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBtaW5Db3VudEZvclNlYXJjaCA9PT0gJycgfHxcbiAgICAgICAgICAgIG1pbkNvdW50Rm9yU2VhcmNoID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIG1pbkNvdW50Rm9yU2VhcmNoID09PSBudWxsIHx8XG4gICAgICAgICAgICBpc05hTigrbWluQ291bnRGb3JTZWFyY2gpXG4gICAgICAgICkge1xuICAgICAgICAgICAgbWluQ291bnRGb3JTZWFyY2ggPSBkZWZhdWx0TWluQ291bnRGb3JTZWFyY2g7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9uQ291bnQgPSBTZWxlY3QyVXRpbHMuZ2V0T3B0aW9uc0NvdW50KGRhdGEpO1xuICAgICAgICByZXR1cm4gb3B0aW9uQ291bnQgPCArbWluQ291bnRGb3JTZWFyY2g7XG4gICAgfVxuXG4gICAgc3RhdGljIGlzU2VsZWN0ZWQoXG4gICAgICAgIG9wdGlvbnM6IFNlbGVjdDJPcHRpb24gfCBTZWxlY3QyT3B0aW9uW10gfCBudWxsLFxuICAgICAgICBvcHRpb246IFNlbGVjdDJPcHRpb24sXG4gICAgICAgIG11bHRpcGxlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIG11bHRpcGxlXG4gICAgICAgICAgICA/IG9wdGlvbnMgJiYgKG9wdGlvbnMgYXMgU2VsZWN0Mk9wdGlvbltdKS5zb21lKG9wID0+IG9wLnZhbHVlID09PSBvcHRpb24udmFsdWUpXG4gICAgICAgICAgICAgICAgPyAndHJ1ZSdcbiAgICAgICAgICAgICAgICA6ICdmYWxzZSdcbiAgICAgICAgICAgIDogb3B0aW9ucyAmJiBvcHRpb24udmFsdWUgPT09IChvcHRpb25zIGFzIFNlbGVjdDJPcHRpb24pLnZhbHVlXG4gICAgICAgICAgICA/ICd0cnVlJ1xuICAgICAgICAgICAgOiAnZmFsc2UnO1xuICAgIH1cblxuICAgIHN0YXRpYyByZW1vdmVTZWxlY3Rpb24ob3B0aW9uczogU2VsZWN0Mk9wdGlvbiB8IFNlbGVjdDJPcHRpb25bXSB8IG51bGwsIG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IChvcHRpb25zIGFzIFNlbGVjdDJPcHRpb25bXSkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICgob3B0aW9ucyBhcyBTZWxlY3QyT3B0aW9uW10pW2ldLnZhbHVlID09PSBvcHRpb24udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAob3B0aW9ucyBhcyBTZWxlY3QyT3B0aW9uW10pLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRPcHRpb25zQ291bnQoZGF0YTogU2VsZWN0MkRhdGEpIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZ3JvdXBPck9wdGlvbiBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IChncm91cE9yT3B0aW9uIGFzIFNlbGVjdDJHcm91cCkub3B0aW9ucztcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBvcHRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNOdWxsT3JVbmRlZmluZWQodmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb250YWluU2VhcmNoVGV4dChcbiAgICAgICAgbGFiZWw6IHN0cmluZyxcbiAgICAgICAgc2VhcmNoVGV4dDogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgZWRpdFBhdHRlcm46ICgoc3RyOiBzdHJpbmcpID0+IHN0cmluZykgfCB1bmRlZmluZWQsXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzZWFyY2hUZXh0XG4gICAgICAgICAgICA/IFNlbGVjdDJVdGlscy5mb3JtYXRTYW5zVW5pY29kZShsYWJlbCkubWF0Y2goXG4gICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKFNlbGVjdDJVdGlscy5mb3JtYXRQYXR0ZXJuKHNlYXJjaFRleHQsIGVkaXRQYXR0ZXJuKSwgJ2knKSxcbiAgICAgICAgICAgICAgKSAhPT0gbnVsbFxuICAgICAgICAgICAgOiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHByb3RlY3RQYXR0ZXJuKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKHByb3RlY3RSZWdleHAsICdcXFxcJCYnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmb3JtYXRTYW5zVW5pY29kZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGZvciAoY29uc3QgdW5pY29kZVBhdHRlcm4gb2YgdW5pY29kZVBhdHRlcm5zKSB7XG4gICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSh1bmljb2RlUGF0dGVybi5zLCB1bmljb2RlUGF0dGVybi5sKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGZvcm1hdFBhdHRlcm4oc3RyOiBzdHJpbmcsIGVkaXRQYXR0ZXJuOiAoKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcpIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICAgICAgc3RyID0gU2VsZWN0MlV0aWxzLmZvcm1hdFNhbnNVbmljb2RlKFNlbGVjdDJVdGlscy5wcm90ZWN0UGF0dGVybihzdHIpKTtcblxuICAgICAgICBpZiAoZWRpdFBhdHRlcm4gJiYgdHlwZW9mIGVkaXRQYXR0ZXJuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdHIgPSBlZGl0UGF0dGVybihzdHIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxufVxuIl19