ng-select2-component 11.0.0 → 12.0.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,853 +0,0 @@
1
- import { CdkConnectedOverlay, } from '@angular/cdk/overlay';
2
- import { Attribute, Component, EventEmitter, HostBinding, Input, Optional, Output, Self, TemplateRef, ViewChild, ViewChildren, } from '@angular/core';
3
- import { Subject } from 'rxjs';
4
- import { timeout } from './select2-const';
5
- import { Select2Utils } from './select2-utils';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/cdk/scrolling";
8
- import * as i2 from "@angular/forms";
9
- import * as i3 from "@angular/common";
10
- import * as i4 from "@angular/cdk/overlay";
11
- import * as i5 from "ngx-infinite-scroll";
12
- let nextUniqueId = 0;
13
- const displaySearchStatusList = ['default', 'hidden', 'always'];
14
- export class Select2 {
15
- /** data of options & optiongrps */
16
- set data(data) {
17
- this._data = data;
18
- this.updateFilteredData();
19
- }
20
- get multiple() {
21
- return this._multiple;
22
- }
23
- set multiple(value) {
24
- this._multiple = this._coerceBooleanProperty(value);
25
- this.ngOnInit();
26
- }
27
- /** use the material style */
28
- get overlay() {
29
- return this._overlay;
30
- }
31
- set overlay(value) {
32
- this._overlay = this._coerceBooleanProperty(value);
33
- }
34
- /** infinite scroll activated */
35
- get infiniteScroll() {
36
- return this._infiniteScroll;
37
- }
38
- set infiniteScroll(value) {
39
- this._infiniteScroll = this._coerceBooleanProperty(value);
40
- }
41
- get select2Options() {
42
- return this.multiple ? this.option : null;
43
- }
44
- get select2Option() {
45
- return this.multiple ? null : this.option;
46
- }
47
- get searchText() {
48
- return this.innerSearchText;
49
- }
50
- set searchText(text) {
51
- if (this.customSearchEnabled) {
52
- this.search.emit({
53
- component: this,
54
- value: this._value,
55
- search: text,
56
- });
57
- }
58
- this.innerSearchText = text;
59
- }
60
- /** minimal data of show the search field */
61
- get minCountForSearch() {
62
- return this._minCountForSearch;
63
- }
64
- set minCountForSearch(value) {
65
- this._minCountForSearch = value;
66
- this.updateSearchBox();
67
- }
68
- /** Unique id of the element. */
69
- get id() {
70
- return this._id;
71
- }
72
- set id(value) {
73
- this._id = value || this._uid;
74
- }
75
- /** Whether the element is required. */
76
- get required() {
77
- return this._required;
78
- }
79
- set required(value) {
80
- this._required = this._coerceBooleanProperty(value);
81
- }
82
- /** Whether selected items should be hidden. */
83
- get disabled() {
84
- return this._control ? this._control.disabled : this._disabled;
85
- }
86
- set disabled(value) {
87
- this._disabled = this._coerceBooleanProperty(value);
88
- }
89
- /** Whether items are hidden when has. */
90
- get hideSelectedItems() {
91
- return this._hideSelectedItems;
92
- }
93
- set hideSelectedItems(value) {
94
- this._hideSelectedItems = this._coerceBooleanProperty(value);
95
- }
96
- /** Whether the element is readonly. */
97
- get readonly() {
98
- return this._readonly;
99
- }
100
- set readonly(value) {
101
- this._readonly = this._coerceBooleanProperty(value);
102
- }
103
- /** The input element's value. */
104
- get value() {
105
- return this._value;
106
- }
107
- set value(value) {
108
- if (this.testValueChange(this._value, value)) {
109
- setTimeout(() => {
110
- this._value = value;
111
- this.writeValue(value);
112
- }, 10);
113
- }
114
- }
115
- /** Tab index for the select2 element. */
116
- get tabIndex() {
117
- return this.disabled ? -1 : this._tabIndex;
118
- }
119
- set tabIndex(value) {
120
- if (typeof value !== 'undefined') {
121
- this._tabIndex = value;
122
- }
123
- }
124
- /** reset with no selected value */
125
- get resettable() {
126
- return this._resettable;
127
- }
128
- set resettable(value) {
129
- this._resettable = this._coerceBooleanProperty(value);
130
- }
131
- get ariaInvalid() {
132
- return this._isErrorState();
133
- }
134
- get classMaterial() {
135
- return this.styleMode === 'material';
136
- }
137
- get classNostyle() {
138
- return this.styleMode === 'noStyle';
139
- }
140
- get select2above() {
141
- return !this.overlay ? this.listPosition === 'above' : this._isAbobeOverlay();
142
- }
143
- get _positions() {
144
- return this.listPosition === 'auto' ? undefined : null;
145
- }
146
- get resultsElement() {
147
- return this.resultContainer?.nativeElement;
148
- }
149
- constructor(_viewportRuler, _changeDetectorRef, _parentForm, _parentFormGroup, _control, tabIndex) {
150
- this._viewportRuler = _viewportRuler;
151
- this._changeDetectorRef = _changeDetectorRef;
152
- this._parentForm = _parentForm;
153
- this._parentFormGroup = _parentFormGroup;
154
- this._control = _control;
155
- this.minCharForSearch = 0;
156
- this.limitSelection = 0;
157
- this.listPosition = 'below';
158
- /** use the material style */
159
- this.styleMode = 'default';
160
- /** maximum results limit (0 = no limit) */
161
- this.maxResults = 0;
162
- /** message when maximum results */
163
- this.maxResultsMessage = 'Too many results…';
164
- /** infinite scroll distance */
165
- this.infiniteScrollDistance = 1.5;
166
- /** infinite scroll distance */
167
- this.infiniteScrollThrottle = 150;
168
- /** the max height of the results container when opening the select */
169
- this.resultMaxHeight = '200px';
170
- this.update = new EventEmitter();
171
- this.open = new EventEmitter();
172
- this.close = new EventEmitter();
173
- this.focus = new EventEmitter();
174
- this.blur = new EventEmitter();
175
- this.search = new EventEmitter();
176
- this.scroll = new EventEmitter();
177
- this.removeOption = new EventEmitter();
178
- this.option = null;
179
- this.isOpen = false;
180
- /** Whether the element is focused or not. */
181
- this.focused = false;
182
- this.hoveringValue = null;
183
- this.innerSearchText = '';
184
- this._stateChanges = new Subject();
185
- this._disabled = false;
186
- this._required = false;
187
- this._readonly = false;
188
- this._multiple = false;
189
- this._overlay = false;
190
- this._resettable = false;
191
- this._hideSelectedItems = false;
192
- this._clickDetection = false;
193
- this._uid = `select2-${nextUniqueId++}`;
194
- this._infiniteScroll = true;
195
- /** View -> model callback called when select has been touched */
196
- this._onTouched = () => {
197
- // do nothing
198
- };
199
- /** View -> model callback called when value changes */
200
- this._onChange = () => {
201
- // do nothing
202
- };
203
- // eslint-disable-next-line no-self-assign
204
- this.id = this.id;
205
- this._tabIndex = parseInt(tabIndex, 10) || 0;
206
- if (this._control) {
207
- this._control.valueAccessor = this;
208
- }
209
- this._clickDetectionFc = this.clickDetection.bind(this);
210
- }
211
- ngOnInit() {
212
- this._viewportRuler.change(100).subscribe(() => {
213
- if (this.isOpen) {
214
- this.triggerRect();
215
- }
216
- });
217
- const option = Select2Utils.getOptionsByValue(this._data, this._control ? this._control.value : this.value, this.multiple);
218
- if (option !== null) {
219
- this.option = option;
220
- }
221
- if (!Array.isArray(option)) {
222
- this.hoveringValue = this.value;
223
- }
224
- this.updateSearchBox();
225
- }
226
- ngAfterViewInit() {
227
- this.cdkConnectedOverlay.positionChange.subscribe((posChange) => {
228
- if (this.listPosition === 'auto' &&
229
- posChange.connectionPair?.originY &&
230
- this._overlayPosition !== posChange.connectionPair.originY) {
231
- this.triggerRect();
232
- this._overlayPosition = posChange.connectionPair.originY;
233
- this._changeDetectorRef.detectChanges();
234
- }
235
- });
236
- this.selectionElement = this.selection.nativeElement;
237
- this.triggerRect();
238
- }
239
- ngDoCheck() {
240
- this.updateSearchBox();
241
- this._dirtyCheckNativeValue();
242
- if (this._triggerRect) {
243
- if (this.overlayWidth !== this._triggerRect.width) {
244
- this.overlayWidth = this._triggerRect.width;
245
- }
246
- if (this._dropdownRect?.height > 0 && this.overlayHeight !== this._dropdownRect.height) {
247
- this.overlayHeight = this.listPosition === 'auto' ? this._dropdownRect.height : 0;
248
- }
249
- }
250
- }
251
- ngOnDestroy() {
252
- window.document.body.removeEventListener('click', this._clickDetectionFc);
253
- }
254
- updateSearchBox() {
255
- const hidden = this.customSearchEnabled
256
- ? false
257
- : Select2Utils.isSearchboxHiddex(this._data, this._minCountForSearch);
258
- if (this.isSearchboxHidden !== hidden) {
259
- this.isSearchboxHidden = hidden;
260
- }
261
- }
262
- hideSearch() {
263
- const displaySearchStatus = displaySearchStatusList.indexOf(this.displaySearchStatus) > -1 ? this.displaySearchStatus : 'default';
264
- return (displaySearchStatus === 'default' && this.isSearchboxHidden) || displaySearchStatus === 'hidden';
265
- }
266
- getOptionStyle(option) {
267
- return ('select2-results__option ' +
268
- (option.hide ? 'select2-results__option--hide ' : '') +
269
- (option.value === this.hoveringValue ? 'select2-results__option--highlighted ' : '') +
270
- (option.classes || ''));
271
- }
272
- mouseenter(option) {
273
- if (!option.disabled) {
274
- this.hoveringValue = option.value;
275
- }
276
- }
277
- click(option) {
278
- if (this.testSelection(option)) {
279
- this.select(option);
280
- }
281
- }
282
- reset(e) {
283
- this.select(null);
284
- e.preventDefault();
285
- e.stopPropagation();
286
- }
287
- prevChange(event) {
288
- event.stopPropagation();
289
- }
290
- toggleOpenAndClose() {
291
- if (this.disabled) {
292
- return;
293
- }
294
- this._focus(true);
295
- this.isOpen = !this.isOpen;
296
- if (this.isOpen) {
297
- this.innerSearchText = '';
298
- this.updateFilteredData();
299
- this._focusSearchboxOrResultsElement();
300
- setTimeout(() => {
301
- if (this.option) {
302
- const option = this.option instanceof Array ? this.option[0] : this.option;
303
- this.updateScrollFromOption(option);
304
- }
305
- else if (this.resultsElement) {
306
- this.resultsElement.scrollTop = 0;
307
- }
308
- setTimeout(() => {
309
- this.triggerRect();
310
- this.cdkConnectedOverlay?.overlayRef?.updatePosition();
311
- }, 100);
312
- });
313
- this.open.emit(this);
314
- }
315
- else {
316
- this.close.emit(this);
317
- }
318
- if (this.isOpen && !this._clickDetection) {
319
- setTimeout(() => {
320
- window.document.body.addEventListener('click', this._clickDetectionFc, false);
321
- this._clickDetection = true;
322
- }, timeout);
323
- }
324
- this._changeDetectorRef.markForCheck();
325
- }
326
- hasTemplate(option, defaut) {
327
- return (this.templates instanceof TemplateRef ||
328
- this.templates?.[option.templateId] instanceof TemplateRef ||
329
- this.templates?.[defaut] instanceof TemplateRef);
330
- }
331
- getTemplate(option, defaut) {
332
- return this.hasTemplate(option, defaut)
333
- ? this.templates[option.templateId] || this.templates[defaut] || this.templates
334
- : undefined;
335
- }
336
- triggerRect() {
337
- this._triggerRect = this.selectionElement.getBoundingClientRect();
338
- this._dropdownRect = this.dropdown?.nativeElement
339
- ? this.dropdown.nativeElement.getBoundingClientRect()
340
- : undefined;
341
- }
342
- testSelection(option) {
343
- if (option.disabled) {
344
- return false;
345
- }
346
- if (!this.multiple ||
347
- !this.limitSelection ||
348
- (Array.isArray(this._value) && this._value.length < this.limitSelection)) {
349
- return true;
350
- }
351
- return false;
352
- }
353
- testValueChange(value1, value2) {
354
- if (((value1 === null || value1 === undefined) && (value2 === null || value2 === undefined)) ||
355
- value1 === value2) {
356
- return false;
357
- }
358
- if (this.multiple &&
359
- value1?.length &&
360
- value2?.length &&
361
- value1.length === value2.length) {
362
- for (const e1 of value1) {
363
- const test = value2.indexOf(e1) > -1;
364
- if (!test) {
365
- return true;
366
- }
367
- }
368
- return false;
369
- }
370
- return true;
371
- }
372
- updateFilteredData() {
373
- setTimeout(() => {
374
- let result = this._data;
375
- if (this.multiple && this.hideSelectedItems) {
376
- result = Select2Utils.getFilteredSelectedData(result, this.option);
377
- }
378
- if (!this.customSearchEnabled && this.searchText && this.searchText.length >= +this.minCharForSearch) {
379
- result = Select2Utils.getFilteredData(result, this.searchText, this.editPattern);
380
- }
381
- if (this.maxResults > 0) {
382
- const data = Select2Utils.getReduceData(result, +this.maxResults);
383
- result = data.result;
384
- this.maxResultsExceeded = data.reduce;
385
- }
386
- else {
387
- this.maxResultsExceeded = false;
388
- }
389
- if (Select2Utils.valueIsNotInFilteredData(result, this.hoveringValue)) {
390
- this.hoveringValue = Select2Utils.getFirstAvailableOption(result);
391
- }
392
- this.filteredData = result;
393
- this._changeDetectorRef.markForCheck();
394
- });
395
- }
396
- clickDetection(e) {
397
- if (!this.ifParentContainsClass(e.target, 'selection')) {
398
- if (this.isOpen && !this.ifParentContainsClass(e.target, 'select2-dropdown')) {
399
- this.toggleOpenAndClose();
400
- }
401
- if (!this.ifParentContainsId(e.target, this._id)) {
402
- this.clickExit();
403
- }
404
- }
405
- else if (this.isOpen && !this.ifParentContainsId(e.target, this._id)) {
406
- this.toggleOpenAndClose();
407
- this.clickExit();
408
- }
409
- }
410
- clickExit() {
411
- this._focus(false);
412
- window.document.body.removeEventListener('click', this._clickDetectionFc);
413
- this._clickDetection = false;
414
- }
415
- ifParentContainsClass(element, cssClass) {
416
- return this.getParentElementByClass(element, cssClass) !== null;
417
- }
418
- ifParentContainsId(element, id) {
419
- return this.getParentElementById(element, id) !== null;
420
- }
421
- getParentElementByClass(element, cssClass) {
422
- if (this.containClasses(element, cssClass.trim().split(/\s+/))) {
423
- return element;
424
- }
425
- return element.parentElement ? this.getParentElementByClass(element.parentElement, cssClass) : null;
426
- }
427
- getParentElementById(element, id) {
428
- if (element.id === id) {
429
- return element;
430
- }
431
- return element.parentElement ? this.getParentElementById(element.parentElement, id) : null;
432
- }
433
- containClasses(element, cssClasses) {
434
- if (!element.classList) {
435
- return false;
436
- }
437
- for (const cssClass of cssClasses) {
438
- if (!element.classList.contains(cssClass)) {
439
- return false;
440
- }
441
- }
442
- return true;
443
- }
444
- focusin() {
445
- if (!this.disabled) {
446
- this._focus(true);
447
- }
448
- }
449
- focusout() {
450
- if (this.selectionElement && !this.selectionElement.classList.contains('select2-focused')) {
451
- this._focus(false);
452
- this._onTouched();
453
- }
454
- }
455
- select(option) {
456
- let value;
457
- if (option !== null) {
458
- if (this.multiple) {
459
- const options = this.option;
460
- const index = options.findIndex(op => op.value === option.value);
461
- if (index === -1) {
462
- options.push(option);
463
- }
464
- else {
465
- options.splice(index, 1);
466
- }
467
- value = this.option.map(op => op.value);
468
- }
469
- else {
470
- this.option = option;
471
- if (this.isOpen) {
472
- this.isOpen = false;
473
- this.close.emit(this);
474
- if (this.selectionElement) {
475
- this.selectionElement.focus();
476
- }
477
- }
478
- value = this.option.value;
479
- }
480
- }
481
- else {
482
- this.option = null;
483
- }
484
- if (this.multiple && this.hideSelectedItems) {
485
- this.updateFilteredData();
486
- }
487
- if (this._control) {
488
- this._onChange(value);
489
- }
490
- else {
491
- this._value = value;
492
- }
493
- this.update.emit({
494
- component: this,
495
- value: value,
496
- options: Array.isArray(this.option) ? this.option : this.option ? [this.option] : null,
497
- });
498
- }
499
- keyDown(e) {
500
- if (this._testKey(e, ['ArrowDown', 40])) {
501
- this.moveDown();
502
- e.preventDefault();
503
- }
504
- else if (this._testKey(e, ['ArrowUp', 38])) {
505
- this.moveUp();
506
- e.preventDefault();
507
- }
508
- else if (this._testKey(e, ['Enter', 13])) {
509
- this.selectByEnter();
510
- e.preventDefault();
511
- }
512
- else if (this._testKey(e, ['Escape', 'Tab', 9, 27]) && this.isOpen) {
513
- this.toggleOpenAndClose();
514
- this._focus(false);
515
- }
516
- }
517
- openKey(e) {
518
- if (this._testKey(e, ['ArrowDown', 'ArrowUp', 'Enter', 40, 38, 13])) {
519
- this.toggleOpenAndClose();
520
- e.preventDefault();
521
- }
522
- else if (this._testKey(e, ['Escape', 'Tab', 9, 27])) {
523
- this._focus(false);
524
- this._onTouched();
525
- }
526
- }
527
- trackBy(_index, item) {
528
- return item.value;
529
- }
530
- searchUpdate(e) {
531
- this.searchText = e.target.value;
532
- this.updateFilteredData();
533
- }
534
- isSelected(option) {
535
- return Select2Utils.isSelected(this.option, option, this.multiple);
536
- }
537
- isDisabled(option) {
538
- return option.disabled ? 'true' : 'false';
539
- }
540
- removeSelection(e, option) {
541
- Select2Utils.removeSelection(this.option, option);
542
- if (this.multiple && this.hideSelectedItems) {
543
- this.updateFilteredData();
544
- }
545
- const value = this.option.map(op => op.value);
546
- if (this._control) {
547
- this._onChange(value);
548
- }
549
- else {
550
- this._value = value;
551
- }
552
- this.update.emit({
553
- component: this,
554
- value: value,
555
- options: Array.isArray(this.option) ? this.option : this.option ? [this.option] : null,
556
- });
557
- this.removeOption.emit({
558
- component: this,
559
- value: value,
560
- removedOption: option,
561
- });
562
- e.preventDefault();
563
- e.stopPropagation();
564
- if (this.isOpen) {
565
- this._focusSearchboxOrResultsElement();
566
- }
567
- }
568
- /**
569
- * Sets the model value. Implemented as part of ControlValueAccessor.
570
- * @param value
571
- */
572
- writeValue(value) {
573
- this._setSelectionByValue(value);
574
- }
575
- /**
576
- * Saves a callback function to be invoked when the select's value
577
- * changes from user input. Part of the ControlValueAccessor interface
578
- * required to integrate with Angular's core forms API.
579
- *
580
- * @param fn Callback to be triggered when the value changes.
581
- */
582
- registerOnChange(fn) {
583
- this._onChange = fn;
584
- }
585
- /**
586
- * Saves a callback function to be invoked when the select is blurred
587
- * by the user. Part of the ControlValueAccessor interface required
588
- * to integrate with Angular's core forms API.
589
- *
590
- * @param fn Callback to be triggered when the component has been touched.
591
- */
592
- registerOnTouched(fn) {
593
- this._onTouched = fn;
594
- }
595
- /**
596
- * Sets whether the component should be disabled.
597
- * Implemented as part of ControlValueAccessor.
598
- * @param isDisabled
599
- */
600
- setDisabledState(isDisabled) {
601
- this.disabled = isDisabled;
602
- }
603
- onScroll(way) {
604
- this.scroll.emit({
605
- component: this,
606
- way,
607
- search: this.innerSearchText,
608
- });
609
- }
610
- _isErrorState() {
611
- const isInvalid = this._control && this._control.invalid;
612
- const isTouched = this._control && this._control.touched;
613
- const isSubmitted = (this._parentFormGroup && this._parentFormGroup.submitted) ||
614
- (this._parentForm && this._parentForm.submitted);
615
- return !!(isInvalid && (isTouched || isSubmitted));
616
- }
617
- moveUp() {
618
- this.updateScrollFromOption(Select2Utils.getPreviousOption(this.filteredData, this.hoveringValue));
619
- }
620
- moveDown() {
621
- this.updateScrollFromOption(Select2Utils.getNextOption(this.filteredData, this.hoveringValue));
622
- }
623
- updateScrollFromOption(option) {
624
- if (option) {
625
- this.hoveringValue = option.value;
626
- const domElement = this.results.find(r => r.nativeElement.innerText.trim() === option.label);
627
- if (domElement && this.resultsElement) {
628
- this.resultsElement.scrollTop = 0;
629
- const listClientRect = this.resultsElement.getBoundingClientRect();
630
- const optionClientRect = domElement.nativeElement.getBoundingClientRect();
631
- this.resultsElement.scrollTop = optionClientRect.top - listClientRect.top;
632
- }
633
- }
634
- }
635
- selectByEnter() {
636
- if (this.hoveringValue) {
637
- const option = Select2Utils.getOptionByValue(this._data, this.hoveringValue);
638
- this.select(option);
639
- }
640
- }
641
- _testKey(event, refs = []) {
642
- return this._isKey(this._getKey(event), refs);
643
- }
644
- _getKey(event) {
645
- let code;
646
- if (event.key !== undefined) {
647
- code = event.key;
648
- }
649
- else if (event['keyIdentifier'] !== undefined) {
650
- code = event['keyIdentifier'];
651
- }
652
- else if (event['keyCode'] !== undefined) {
653
- code = event['keyCode'];
654
- }
655
- else {
656
- event.preventDefault();
657
- }
658
- return code;
659
- }
660
- _isKey(code, refs = []) {
661
- return refs && refs.length > 0 ? refs.indexOf(code) !== -1 : false;
662
- }
663
- /**
664
- * Sets the selected option based on a value. If no option can be
665
- * found with the designated value, the select trigger is cleared.
666
- */
667
- _setSelectionByValue(value) {
668
- if (this.option || (value !== undefined && value !== null)) {
669
- const isArray = Array.isArray(value);
670
- if (this.multiple && value && !isArray) {
671
- throw new Error('Non array value.');
672
- }
673
- else if (this._data) {
674
- if (this.multiple) {
675
- this.option = []; // if value is null, then empty option and return
676
- if (isArray) {
677
- // value is not null. Preselect value
678
- const selectedValues = Select2Utils.getOptionsByValue(this._data, value, this.multiple);
679
- selectedValues.map(item => this.select(item));
680
- }
681
- }
682
- else {
683
- this.select(Select2Utils.getOptionByValue(this._data, value));
684
- }
685
- }
686
- else if (this._control) {
687
- this._control.viewToModelUpdate(value);
688
- }
689
- this._changeDetectorRef.markForCheck();
690
- }
691
- }
692
- /** Does some manual dirty checking on the native input `value` property. */
693
- _dirtyCheckNativeValue() {
694
- const newValue = this.value;
695
- if (this._previousNativeValue !== newValue) {
696
- this._previousNativeValue = newValue;
697
- this._stateChanges.next();
698
- }
699
- }
700
- _coerceBooleanProperty(value) {
701
- return value != null && `${value}` !== 'false';
702
- }
703
- _focusSearchboxOrResultsElement() {
704
- if (!this.isSearchboxHidden) {
705
- setTimeout(() => {
706
- if (this.searchInput && this.searchInput.nativeElement) {
707
- this.searchInput.nativeElement.focus();
708
- }
709
- });
710
- }
711
- else if (this.resultsElement) {
712
- this.resultsElement.focus();
713
- }
714
- }
715
- _focus(state) {
716
- if (!state && this.focused) {
717
- this.focused = state;
718
- this.blur.emit(this);
719
- }
720
- else if (state && !this.focused) {
721
- this.focused = state;
722
- this.focus.emit(this);
723
- }
724
- }
725
- _isAbobeOverlay() {
726
- return this.overlay && this._overlayPosition && this.listPosition === 'auto'
727
- ? this._overlayPosition === 'top'
728
- : this.listPosition === 'above';
729
- }
730
- }
731
- /** @nocollapse */ Select2.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: Select2, deps: [{ token: i1.ViewportRuler }, { token: i0.ChangeDetectorRef }, { token: i2.NgForm, optional: true }, { token: i2.FormGroupDirective, optional: true }, { token: i2.NgControl, optional: true, self: true }, { token: 'tabindex', attribute: true }], target: i0.ɵɵFactoryTarget.Component });
732
- /** @nocollapse */ Select2.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.5", type: Select2, selector: "select2", inputs: { data: "data", minCharForSearch: "minCharForSearch", displaySearchStatus: "displaySearchStatus", placeholder: "placeholder", customSearchEnabled: "customSearchEnabled", limitSelection: "limitSelection", listPosition: "listPosition", multiple: "multiple", overlay: "overlay", styleMode: "styleMode", noResultMessage: "noResultMessage", maxResults: "maxResults", maxResultsMessage: "maxResultsMessage", infiniteScrollDistance: "infiniteScrollDistance", infiniteScrollThrottle: "infiniteScrollThrottle", infiniteScroll: "infiniteScroll", editPattern: "editPattern", templates: "templates", resultMaxHeight: "resultMaxHeight", minCountForSearch: "minCountForSearch", id: "id", required: "required", disabled: "disabled", hideSelectedItems: "hideSelectedItems", readonly: "readonly", value: "value", tabIndex: "tabIndex", resettable: "resettable" }, outputs: { update: "update", open: "open", close: "close", focus: "focus", blur: "blur", search: "search", scroll: "scroll", removeOption: "removeOption" }, host: { properties: { "id": "this.id", "attr.aria-invalid": "this.ariaInvalid", "class.material": "this.classMaterial", "class.nostyle": "this.classNostyle", "class.select2-above": "this.select2above" } }, viewQueries: [{ propertyName: "cdkConnectedOverlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "selection", first: true, predicate: ["selection"], descendants: true, static: true }, { propertyName: "resultContainer", first: true, predicate: ["results"], descendants: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "results", predicate: ["result"], descendants: true }], ngImport: i0, template: "<div class=\"select2-label\" (click)=\"toggleOpenAndClose()\">\n <ng-content select=\"select2-label\"></ng-content>\n <span *ngIf=\"required\" class=\"select2-required\"></span>\n</div>\n<div\n class=\"select2 select2-container select2-container--default\"\n [class.select2-container--focus]=\"focused\"\n [class.select2-container--below]=\"!select2above\"\n [class.select2-container--above]=\"select2above\"\n [class.select2-container--open]=\"isOpen\"\n [class.select2-container--disabled]=\"disabled\"\n>\n <div\n class=\"selection\"\n #selection\n #trigger=\"cdkOverlayOrigin\"\n [tabindex]=\"!this.isOpen ? tabIndex : '-1'\"\n (click)=\"toggleOpenAndClose()\"\n (focus)=\"focusin()\"\n (blur)=\"focusout()\"\n (keydown)=\"openKey($event)\"\n cdkOverlayOrigin\n [class.select2-focused]=\"focused\"\n >\n <div\n class=\"select2-selection\"\n [class.select2-selection--multiple]=\"multiple\"\n [class.select2-selection--single]=\"!multiple\"\n role=\"combobox\"\n >\n <span *ngIf=\"!multiple\" class=\"select2-selection__rendered\" [title]=\"select2Option?.label || ''\">\n <span *ngIf=\"!select2Option\">&nbsp;</span>\n <span *ngIf=\"select2Option\" [innerHTML]=\"select2Option.label\"></span>\n <span [class.select2-selection__placeholder__option]=\"option\" class=\"select2-selection__placeholder\">{{\n placeholder\n }}</span>\n </span>\n <span\n (click)=\"reset($event)\"\n *ngIf=\"!multiple && resettable && select2Option && !(disabled || readonly)\"\n class=\"select2-selection__reset\"\n role=\"presentation\"\n >\u00D7</span\n >\n <span *ngIf=\"!multiple\" class=\"select2-selection__arrow\" role=\"presentation\"> </span>\n <ul *ngIf=\"multiple\" class=\"select2-selection__rendered\">\n <span\n [class.select2-selection__placeholder__option]=\"select2Options?.length > 0\"\n class=\"select2-selection__placeholder\"\n >{{ placeholder }}</span\n >\n <li\n *ngFor=\"let op of option; trackBy: trackBy\"\n class=\"select2-selection__choice\"\n [title]=\"op.label\"\n tabindex=\"0\"\n (keydown.enter)=\"removeSelection($event, op)\"\n >\n <span\n *ngIf=\"!(disabled || readonly)\"\n (click)=\"removeSelection($event, op)\"\n class=\"select2-selection__choice__remove\"\n role=\"presentation\"\n >\u00D7</span\n >\n <span [innerHTML]=\"op.label\"></span>\n </li>\n </ul>\n </div>\n </div>\n <ng-container *ngIf=\"!overlay\">\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n </ng-container>\n\n <div class=\"select2-subscript-wrapper\">\n <ng-content select=\"select2-hint\"></ng-content>\n </div>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"select2-overlay-backdrop\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"this.isOpen && overlay\"\n [cdkConnectedOverlayMinWidth]=\"overlayWidth\"\n [cdkConnectedOverlayHeight]=\"overlayHeight\"\n [cdkConnectedOverlayPositions]=\"_positions\"\n (backdropClick)=\"toggleOpenAndClose()\"\n>\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n</ng-template>\n\n<ng-template #containerTemplate>\n <div\n class=\"select2-container select2-container--default select2-container-dropdown\"\n [class.select2-container--open]=\"isOpen\"\n [class.select2-overlay]=\"overlay\"\n [class.select2-position-auto]=\"listPosition === 'auto'\"\n >\n <div\n #dropdown\n class=\"select2-dropdown\"\n [class.select2-dropdown--below]=\"!select2above\"\n [class.select2-dropdown--above]=\"select2above\"\n >\n <div class=\"select2-search select2-search--dropdown\" [class.select2-search--hide]=\"hideSearch()\">\n <input\n #searchInput\n [id]=\"id + '-search-field'\"\n [value]=\"searchText\"\n (keydown)=\"keyDown($event)\"\n (keyup)=\"searchUpdate($event)\"\n (change)=\"prevChange($event)\"\n class=\"select2-search__field\"\n type=\"search\"\n role=\"textbox\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n [attr.tabindex]=\"this.isOpen ? tabIndex : '-1'\"\n />\n </div>\n <div class=\"select2-results\">\n <ul\n #results\n class=\"select2-results__options\"\n [style.max-height]=\"resultMaxHeight\"\n role=\"tree\"\n tabindex=\"-1\"\n infiniteScroll\n [infiniteScrollDisabled]=\"!infiniteScroll && !isOpen\"\n [infiniteScrollDistance]=\"infiniteScrollDistance\"\n [infiniteScrollThrottle]=\"infiniteScrollThrottle\"\n [infiniteScrollContainer]=\"results\"\n (scrolled)=\"onScroll('down')\"\n (scrolledUp)=\"onScroll('up')\"\n (keydown)=\"keyDown($event)\"\n >\n <ng-container *ngFor=\"let groupOrOption of filteredData; index as i; trackBy: trackBy\">\n <li *ngIf=\"groupOrOption.options\" class=\"select2-results__option\" role=\"group\">\n <strong\n *ngIf=\"!hasTemplate(groupOrOption, 'group'); else optGroup\"\n [attr.class]=\"\n 'select2-results__group' +\n (groupOrOption.classes ? ' ' + groupOrOption.classes : '')\n \"\n [innerHTML]=\"groupOrOption.label\"\n ></strong>\n <ng-template #optGroup>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'group'); context: groupOrOption\"\n >\n </ng-container>\n </ng-template>\n\n <ul class=\"select2-results__options select2-results__options--nested\">\n <li\n *ngFor=\"let option of groupOrOption.options; index as j; trackBy: trackBy\"\n #result\n [id]=\"option.id || id + '-option-' + i + '-' + j\"\n [class]=\"getOptionStyle(option)\"\n role=\"treeitem\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-disabled]=\"isDisabled(option)\"\n (mouseenter)=\"mouseenter(option)\"\n (click)=\"click(option)\"\n >\n <div\n *ngIf=\"!hasTemplate(option, 'option'); else liGroup\"\n class=\"select2-label-content\"\n [innerHTML]=\"option.label\"\n ></div>\n <ng-template #liGroup>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(option, 'option'); context: option\"\n >\n </ng-container>\n </ng-template>\n </li>\n </ul>\n </li>\n <li\n *ngIf=\"!groupOrOption.options\"\n #result\n [id]=\"groupOrOption.id || id + '-option-' + i\"\n [class]=\"getOptionStyle(groupOrOption)\"\n role=\"treeitem\"\n [attr.aria-selected]=\"isSelected(groupOrOption)\"\n [attr.aria-disabled]=\"isDisabled(groupOrOption)\"\n (mouseenter)=\"mouseenter(groupOrOption)\"\n (click)=\"click(groupOrOption)\"\n >\n <div\n *ngIf=\"!hasTemplate(groupOrOption, 'option'); else li\"\n [innerHTML]=\"groupOrOption.label\"\n class=\"select2-label-content\"\n ></div>\n <ng-template #li>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\"\n >\n </ng-container>\n </ng-template>\n </li>\n </ng-container>\n <li\n class=\"select2-no-result select2-results__option\"\n *ngIf=\"!filteredData?.length && noResultMessage\"\n [innerHTML]=\"noResultMessage\"\n ></li>\n <li\n class=\"select2-too-much-result select2-results__option\"\n *ngIf=\"maxResultsExceeded\"\n [innerHTML]=\"maxResultsMessage\"\n ></li>\n </ul>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".select2-label{color:#000;color:var(--select2-label-text-color, #000)}.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle;width:100%}.select2-container .select2-container-dropdown{position:absolute;width:0px;opacity:0}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;-webkit-user-select:none;user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding:0 0 0 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1 1 auto}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;-webkit-user-select:none;user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background:white;background:var(--select2-dropdown-background, white);border:1px solid #aaa;border:1px solid var(--select2-dropdown-border-color, #aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius, 4px);box-sizing:border-box;display:block;position:absolute;width:100%;z-index:1051;height:0;overflow:hidden}.select2-dropdown .select2-label-content{display:contents}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-webkit-user-select:none;user-select:none;color:#000;color:var(--select2-option-text-color, #000)}.select2-results__option[aria-selected]{cursor:pointer}.select2-container.select2-container-dropdown.select2-container--open{width:100%;opacity:1}.select2-container--open .select2-dropdown{overflow:auto;height:auto}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;bottom:27px;display:flex;flex-direction:column-reverse}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background:#fff;filter:alpha(opacity=0)}.select2-required:before{content:\"*\";color:red;color:var(--select2-required-color, red)}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background:#fff;background:var(--select2-selection-background, #fff);border:1px solid #aaa;border:1px solid var(--select2-selection-border-color, #aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius, 4px);display:flex}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;color:var(--select2-selection-text-color, #444);line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999;color:var(--select2-placeholder-color, #999)}.select2-container--default .select2-selection--single .select2-selection__placeholder span{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-overflow:var(--select2-placeholder-overflow, ellipsis)}.select2-container--default .select2-selection--single .select2-selection__placeholder__option{display:none}.select2-container--default .select2-selection--single .select2-selection__reset,.select2-container--default .select2-selection--single .select2-selection__arrow{display:flex;width:20px;align-items:center;justify-content:center}.select2-container--default .select2-selection--single .select2-selection__arrow:before{content:\" \";border-color:#888 transparent;border-color:var(--select2-arrow-color, #888) transparent;border-style:solid;border-width:5px 4px 0;height:0;width:0}.select2-container--default .select2-selection--single .select2-selection__reset{color:#999;color:var(--select2-reset-color, #999)}.select2-container--default.select2-container--disabled .select2-selection--single{background:#eee;background:var(--select2-selection-disabled-background, #eee);cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow:before{border-color:transparent transparent #888;border-color:transparent transparent var(--select2-arrow-color, #888);border-width:0 4px 5px}.select2-container--default .select2-selection--multiple{background:#fff;background:var(--select2-selection-background, #fff);border:1px solid #aaa;border:1px solid var(--select2-selection-border-color, #aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius, 4px);cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{flex:1 1 auto;box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{display:block;width:100%;color:#999;color:var(--select2-placeholder-color, #999);margin-top:5px;float:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-overflow:var(--select2-placeholder-overflow, ellipsis)}.select2-container--default .select2-selection--multiple .select2-selection__placeholder__option{display:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{color:#000;color:var(--select2-selection-choice-text-color, #000);background:#e4e4e4;background:var(--select2-selection-choice-background, #e4e4e4);border:1px solid #aaa;border:1px solid var(--select2-selection-choice-border-color, #aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius, 4px);cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;color:var(--select2-selection-choice-close-color, #999);cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333;color:var(--select2-selection-choice-hover-close-color, #333)}.select2-container--default.select2-container--focused .select2-selection--multiple{border:solid #000 1px;border:solid var(--select2-selection-focus-border-color, #000) 1px;outline:none}.select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,.select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple{border:solid #000 1px;border:solid var(--select2-selection-focus-border-color, #000) 1px;outline:none}.select2-container--default.select2-container--disabled .select2-selection--multiple{background:#eee;background:var(--select2-selection-disabled-background, #eee);cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa;border:1px solid var(--select2-search-border-color, #aaa);background:#fff;background:1px solid var(--select2-search-background, #fff);border-radius:0;border-radius:var(--select2-search-border-radius, 0px)}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:none;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999;color:var(--select2-option-disabled-text-color, #999);background:transparent;background:var(--select2-option-disabled-background, transparent)}.select2-container--default .select2-results__option[aria-selected=true]{color:#000;color:var(--select2-option-selected-text-color, #000);background:#ddd;background:var(--select2-option-selected-background, #ddd)}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background:#5897fb;background:var(--select2-option-highlighted-background, #5897fb);color:#fff;color:var(--select2-option-highlighted-text-color, #fff)}.select2-container--default .select2-results__option--hide{display:none}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px;color:gray;color:var(--select2-option-group-text-color, gray);background:transparent;background:var(--select2-option-group-background, transparent)}.select2-no-result{color:#888;color:var(--select2-no-result-color, #888);font-style:italic;font-style:var(--select2-no-result-font-style, italic)}.select2-too-much-result{color:#888;color:var(--select2-too-much-result-color, #888);font-style:italic;font-style:var(--select2-too-much-font-style, italic)}:host.nostyle .select2-dropdown{border-color:transparent}:host.nostyle .select2-selection--single,:host.nostyle .select2-selection--multiple{background:transparent;border-color:transparent}:host.nostyle .select2-container--default .select2-focused .select2-selection--single,:host.nostyle .select2-container--default .select2-focused .select2-selection--multiple,:host.nostyle .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,:host.nostyle .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple{background:transparent;border-color:transparent}:host.material{display:inline-block;width:300px}:host.material>.select2-container{padding-bottom:1.29688em;vertical-align:inherit}:host.material>.select2-container .selection{padding:.4375em 0;border-top:.84375em solid transparent;display:inline-flex;align-items:baseline;width:100%;height:auto}:host.material .select2-container--default .select2-selection--single,:host.material .select2-container--default .select2-selection--multiple{width:100%;border:0;border-radius:0;height:24px;box-sizing:border-box}:host.material .select2-container--default .select2-selection--single:before,:host.material .select2-container--default .select2-selection--multiple:before{content:\" \";display:block;position:absolute;bottom:1.65em;background:#ddd;background:var(--select2-material-underline, #ddd);height:1px;width:100%}:host.material .select2-container--default .select2-selection--single:after,:host.material .select2-container--default .select2-selection--multiple:after{content:\" \";display:block;position:absolute;bottom:1.63em;background:#5a419e;background:var(--select2-material-underline-active, #5a419e);height:2px;width:0%;left:50%;transition:none}:host.material .select2-container--default .select2-selection--single .select2-selection__rendered,:host.material .select2-container--default .select2-selection--multiple .select2-selection__rendered{padding-left:1px;line-height:inherit}:host.material .select2-container--default .select2-selection--single .select2-selection__placeholder,:host.material .select2-container--default .select2-selection--multiple .select2-selection__placeholder{display:block;color:#00000061;color:var(--select2-material-placeholder-color, rgba(0, 0, 0, .38));transition:transform .3s;position:absolute;transform-origin:0 21px;left:0;top:20px}:host.material .select2-container--default .select2-container--open{left:0;bottom:1.6em}:host.material .select2-container--default .select2-selection__placeholder__option{transform:translateY(-1.5em) scale(.75) perspective(100px) translateZ(.001px);width:133.33333%}:host.material .select2-container--default .select2-selection__arrow{top:20px}:host.material .select2-container--default.select2-container--open .select2-selection--single:after,:host.material .select2-container--default.select2-container--open .select2-selection--multiple:after,:host.material .select2-container--default .select2-focused .select2-selection--single:after,:host.material .select2-container--default .select2-focused .select2-selection--multiple:after{transition:width .3s cubic-bezier(.12,1,.77,1),left .3s cubic-bezier(.12,1,.77,1);width:100%;left:0%}:host.material .select2-container--default .select2-dropdown{border-radius:0;border:0;box-shadow:0 5px 5px #00000080}:host.material .select2-container--default .select2-results__option[aria-selected=true],:host.material .select2-container--default .select2-results__option--highlighted[aria-selected]{background:rgba(0,0,0,.04);background:var(--select2-material-option-selected-background, rgba(0, 0, 0, .04));color:#000;color:var(--select2-material-option-highlighted-text-color, #000)}:host.material .select2-container--default .select2-results__option[aria-selected=true]{color:#ff5722;color:var(--select2-material-option-selected-text-color, #ff5722)}:host.material .select2-container--default.select2-container--disabled .select2-selection--single,:host.material .select2-container--default.select2-container--disabled .select2-selection--multiple{background:transparent}:host.material .select2-container--default.select2-container--disabled .select2-selection--single:before,:host.material .select2-container--default.select2-container--disabled .select2-selection--multiple:before{background:linear-gradient(to right,rgba(0,0,0,.26) 0,rgba(0,0,0,.26) 33%,transparent 0);background:var(--select2-material-underline-disabled, linear-gradient(to right, rgba(0, 0, 0, .26) 0, rgba(0, 0, 0, .26) 33%, transparent 0));background-size:4px 1px;background-repeat:repeat-x;background-position:0 bottom}:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--single:before,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--single:after,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--multiple:before,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--multiple:after{background:red;background:var(--select2-material-underline-invalid, red)}:host.material:not(.select2-container--open) .select2-focused .select2-selection--single,:host.material:not(.select2-container--open) .select2-focused .select2-selection--multiple{border:0}:host.material .select2-subscript-wrapper{position:absolute;top:calc(100% - 1.72917em);font-size:75%;color:#888;color:var(--select2-hint-text-color, #888)}::ng-deep .select2-overlay-backdrop{background:rgba(0,0,0,.32);background:var(--select2-overlay-backdrop, transparent)}::ng-deep .cdk-overlay-container .select2-container .select2-dropdown.select2-dropdown--above{bottom:28px}::ng-deep .cdk-overlay-container .select2-container--open.select2-position-auto .select2-dropdown{margin-bottom:28px}::ng-deep .cdk-overlay-container .select2-container--open.select2-position-auto .select2-dropdown.select2-dropdown--above{bottom:0;margin-bottom:0;margin-top:28px}@supports (-moz-appearance: none){select2.material .select2-container--default .select2-selection--single,select2.material .select2-container--default .select2-selection--multiple{height:26px}}@supports (-ms-scroll-limit: 0){select2.material .select2-container--default .select2-selection--single,select2.material .select2-container--default .select2-selection--multiple{height:25px}}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i4.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i5.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }] });
733
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: Select2, decorators: [{
734
- type: Component,
735
- args: [{ selector: 'select2', template: "<div class=\"select2-label\" (click)=\"toggleOpenAndClose()\">\n <ng-content select=\"select2-label\"></ng-content>\n <span *ngIf=\"required\" class=\"select2-required\"></span>\n</div>\n<div\n class=\"select2 select2-container select2-container--default\"\n [class.select2-container--focus]=\"focused\"\n [class.select2-container--below]=\"!select2above\"\n [class.select2-container--above]=\"select2above\"\n [class.select2-container--open]=\"isOpen\"\n [class.select2-container--disabled]=\"disabled\"\n>\n <div\n class=\"selection\"\n #selection\n #trigger=\"cdkOverlayOrigin\"\n [tabindex]=\"!this.isOpen ? tabIndex : '-1'\"\n (click)=\"toggleOpenAndClose()\"\n (focus)=\"focusin()\"\n (blur)=\"focusout()\"\n (keydown)=\"openKey($event)\"\n cdkOverlayOrigin\n [class.select2-focused]=\"focused\"\n >\n <div\n class=\"select2-selection\"\n [class.select2-selection--multiple]=\"multiple\"\n [class.select2-selection--single]=\"!multiple\"\n role=\"combobox\"\n >\n <span *ngIf=\"!multiple\" class=\"select2-selection__rendered\" [title]=\"select2Option?.label || ''\">\n <span *ngIf=\"!select2Option\">&nbsp;</span>\n <span *ngIf=\"select2Option\" [innerHTML]=\"select2Option.label\"></span>\n <span [class.select2-selection__placeholder__option]=\"option\" class=\"select2-selection__placeholder\">{{\n placeholder\n }}</span>\n </span>\n <span\n (click)=\"reset($event)\"\n *ngIf=\"!multiple && resettable && select2Option && !(disabled || readonly)\"\n class=\"select2-selection__reset\"\n role=\"presentation\"\n >\u00D7</span\n >\n <span *ngIf=\"!multiple\" class=\"select2-selection__arrow\" role=\"presentation\"> </span>\n <ul *ngIf=\"multiple\" class=\"select2-selection__rendered\">\n <span\n [class.select2-selection__placeholder__option]=\"select2Options?.length > 0\"\n class=\"select2-selection__placeholder\"\n >{{ placeholder }}</span\n >\n <li\n *ngFor=\"let op of option; trackBy: trackBy\"\n class=\"select2-selection__choice\"\n [title]=\"op.label\"\n tabindex=\"0\"\n (keydown.enter)=\"removeSelection($event, op)\"\n >\n <span\n *ngIf=\"!(disabled || readonly)\"\n (click)=\"removeSelection($event, op)\"\n class=\"select2-selection__choice__remove\"\n role=\"presentation\"\n >\u00D7</span\n >\n <span [innerHTML]=\"op.label\"></span>\n </li>\n </ul>\n </div>\n </div>\n <ng-container *ngIf=\"!overlay\">\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n </ng-container>\n\n <div class=\"select2-subscript-wrapper\">\n <ng-content select=\"select2-hint\"></ng-content>\n </div>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"select2-overlay-backdrop\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"this.isOpen && overlay\"\n [cdkConnectedOverlayMinWidth]=\"overlayWidth\"\n [cdkConnectedOverlayHeight]=\"overlayHeight\"\n [cdkConnectedOverlayPositions]=\"_positions\"\n (backdropClick)=\"toggleOpenAndClose()\"\n>\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n</ng-template>\n\n<ng-template #containerTemplate>\n <div\n class=\"select2-container select2-container--default select2-container-dropdown\"\n [class.select2-container--open]=\"isOpen\"\n [class.select2-overlay]=\"overlay\"\n [class.select2-position-auto]=\"listPosition === 'auto'\"\n >\n <div\n #dropdown\n class=\"select2-dropdown\"\n [class.select2-dropdown--below]=\"!select2above\"\n [class.select2-dropdown--above]=\"select2above\"\n >\n <div class=\"select2-search select2-search--dropdown\" [class.select2-search--hide]=\"hideSearch()\">\n <input\n #searchInput\n [id]=\"id + '-search-field'\"\n [value]=\"searchText\"\n (keydown)=\"keyDown($event)\"\n (keyup)=\"searchUpdate($event)\"\n (change)=\"prevChange($event)\"\n class=\"select2-search__field\"\n type=\"search\"\n role=\"textbox\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n [attr.tabindex]=\"this.isOpen ? tabIndex : '-1'\"\n />\n </div>\n <div class=\"select2-results\">\n <ul\n #results\n class=\"select2-results__options\"\n [style.max-height]=\"resultMaxHeight\"\n role=\"tree\"\n tabindex=\"-1\"\n infiniteScroll\n [infiniteScrollDisabled]=\"!infiniteScroll && !isOpen\"\n [infiniteScrollDistance]=\"infiniteScrollDistance\"\n [infiniteScrollThrottle]=\"infiniteScrollThrottle\"\n [infiniteScrollContainer]=\"results\"\n (scrolled)=\"onScroll('down')\"\n (scrolledUp)=\"onScroll('up')\"\n (keydown)=\"keyDown($event)\"\n >\n <ng-container *ngFor=\"let groupOrOption of filteredData; index as i; trackBy: trackBy\">\n <li *ngIf=\"groupOrOption.options\" class=\"select2-results__option\" role=\"group\">\n <strong\n *ngIf=\"!hasTemplate(groupOrOption, 'group'); else optGroup\"\n [attr.class]=\"\n 'select2-results__group' +\n (groupOrOption.classes ? ' ' + groupOrOption.classes : '')\n \"\n [innerHTML]=\"groupOrOption.label\"\n ></strong>\n <ng-template #optGroup>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'group'); context: groupOrOption\"\n >\n </ng-container>\n </ng-template>\n\n <ul class=\"select2-results__options select2-results__options--nested\">\n <li\n *ngFor=\"let option of groupOrOption.options; index as j; trackBy: trackBy\"\n #result\n [id]=\"option.id || id + '-option-' + i + '-' + j\"\n [class]=\"getOptionStyle(option)\"\n role=\"treeitem\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-disabled]=\"isDisabled(option)\"\n (mouseenter)=\"mouseenter(option)\"\n (click)=\"click(option)\"\n >\n <div\n *ngIf=\"!hasTemplate(option, 'option'); else liGroup\"\n class=\"select2-label-content\"\n [innerHTML]=\"option.label\"\n ></div>\n <ng-template #liGroup>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(option, 'option'); context: option\"\n >\n </ng-container>\n </ng-template>\n </li>\n </ul>\n </li>\n <li\n *ngIf=\"!groupOrOption.options\"\n #result\n [id]=\"groupOrOption.id || id + '-option-' + i\"\n [class]=\"getOptionStyle(groupOrOption)\"\n role=\"treeitem\"\n [attr.aria-selected]=\"isSelected(groupOrOption)\"\n [attr.aria-disabled]=\"isDisabled(groupOrOption)\"\n (mouseenter)=\"mouseenter(groupOrOption)\"\n (click)=\"click(groupOrOption)\"\n >\n <div\n *ngIf=\"!hasTemplate(groupOrOption, 'option'); else li\"\n [innerHTML]=\"groupOrOption.label\"\n class=\"select2-label-content\"\n ></div>\n <ng-template #li>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\"\n >\n </ng-container>\n </ng-template>\n </li>\n </ng-container>\n <li\n class=\"select2-no-result select2-results__option\"\n *ngIf=\"!filteredData?.length && noResultMessage\"\n [innerHTML]=\"noResultMessage\"\n ></li>\n <li\n class=\"select2-too-much-result select2-results__option\"\n *ngIf=\"maxResultsExceeded\"\n [innerHTML]=\"maxResultsMessage\"\n ></li>\n </ul>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".select2-label{color:#000;color:var(--select2-label-text-color, #000)}.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle;width:100%}.select2-container .select2-container-dropdown{position:absolute;width:0px;opacity:0}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;-webkit-user-select:none;user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding:0 0 0 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1 1 auto}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;-webkit-user-select:none;user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background:white;background:var(--select2-dropdown-background, white);border:1px solid #aaa;border:1px solid var(--select2-dropdown-border-color, #aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius, 4px);box-sizing:border-box;display:block;position:absolute;width:100%;z-index:1051;height:0;overflow:hidden}.select2-dropdown .select2-label-content{display:contents}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-webkit-user-select:none;user-select:none;color:#000;color:var(--select2-option-text-color, #000)}.select2-results__option[aria-selected]{cursor:pointer}.select2-container.select2-container-dropdown.select2-container--open{width:100%;opacity:1}.select2-container--open .select2-dropdown{overflow:auto;height:auto}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;bottom:27px;display:flex;flex-direction:column-reverse}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background:#fff;filter:alpha(opacity=0)}.select2-required:before{content:\"*\";color:red;color:var(--select2-required-color, red)}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background:#fff;background:var(--select2-selection-background, #fff);border:1px solid #aaa;border:1px solid var(--select2-selection-border-color, #aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius, 4px);display:flex}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;color:var(--select2-selection-text-color, #444);line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999;color:var(--select2-placeholder-color, #999)}.select2-container--default .select2-selection--single .select2-selection__placeholder span{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-overflow:var(--select2-placeholder-overflow, ellipsis)}.select2-container--default .select2-selection--single .select2-selection__placeholder__option{display:none}.select2-container--default .select2-selection--single .select2-selection__reset,.select2-container--default .select2-selection--single .select2-selection__arrow{display:flex;width:20px;align-items:center;justify-content:center}.select2-container--default .select2-selection--single .select2-selection__arrow:before{content:\" \";border-color:#888 transparent;border-color:var(--select2-arrow-color, #888) transparent;border-style:solid;border-width:5px 4px 0;height:0;width:0}.select2-container--default .select2-selection--single .select2-selection__reset{color:#999;color:var(--select2-reset-color, #999)}.select2-container--default.select2-container--disabled .select2-selection--single{background:#eee;background:var(--select2-selection-disabled-background, #eee);cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow:before{border-color:transparent transparent #888;border-color:transparent transparent var(--select2-arrow-color, #888);border-width:0 4px 5px}.select2-container--default .select2-selection--multiple{background:#fff;background:var(--select2-selection-background, #fff);border:1px solid #aaa;border:1px solid var(--select2-selection-border-color, #aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius, 4px);cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{flex:1 1 auto;box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{display:block;width:100%;color:#999;color:var(--select2-placeholder-color, #999);margin-top:5px;float:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-overflow:var(--select2-placeholder-overflow, ellipsis)}.select2-container--default .select2-selection--multiple .select2-selection__placeholder__option{display:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{color:#000;color:var(--select2-selection-choice-text-color, #000);background:#e4e4e4;background:var(--select2-selection-choice-background, #e4e4e4);border:1px solid #aaa;border:1px solid var(--select2-selection-choice-border-color, #aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius, 4px);cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;color:var(--select2-selection-choice-close-color, #999);cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333;color:var(--select2-selection-choice-hover-close-color, #333)}.select2-container--default.select2-container--focused .select2-selection--multiple{border:solid #000 1px;border:solid var(--select2-selection-focus-border-color, #000) 1px;outline:none}.select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,.select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple{border:solid #000 1px;border:solid var(--select2-selection-focus-border-color, #000) 1px;outline:none}.select2-container--default.select2-container--disabled .select2-selection--multiple{background:#eee;background:var(--select2-selection-disabled-background, #eee);cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa;border:1px solid var(--select2-search-border-color, #aaa);background:#fff;background:1px solid var(--select2-search-background, #fff);border-radius:0;border-radius:var(--select2-search-border-radius, 0px)}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:none;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999;color:var(--select2-option-disabled-text-color, #999);background:transparent;background:var(--select2-option-disabled-background, transparent)}.select2-container--default .select2-results__option[aria-selected=true]{color:#000;color:var(--select2-option-selected-text-color, #000);background:#ddd;background:var(--select2-option-selected-background, #ddd)}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background:#5897fb;background:var(--select2-option-highlighted-background, #5897fb);color:#fff;color:var(--select2-option-highlighted-text-color, #fff)}.select2-container--default .select2-results__option--hide{display:none}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px;color:gray;color:var(--select2-option-group-text-color, gray);background:transparent;background:var(--select2-option-group-background, transparent)}.select2-no-result{color:#888;color:var(--select2-no-result-color, #888);font-style:italic;font-style:var(--select2-no-result-font-style, italic)}.select2-too-much-result{color:#888;color:var(--select2-too-much-result-color, #888);font-style:italic;font-style:var(--select2-too-much-font-style, italic)}:host.nostyle .select2-dropdown{border-color:transparent}:host.nostyle .select2-selection--single,:host.nostyle .select2-selection--multiple{background:transparent;border-color:transparent}:host.nostyle .select2-container--default .select2-focused .select2-selection--single,:host.nostyle .select2-container--default .select2-focused .select2-selection--multiple,:host.nostyle .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,:host.nostyle .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple{background:transparent;border-color:transparent}:host.material{display:inline-block;width:300px}:host.material>.select2-container{padding-bottom:1.29688em;vertical-align:inherit}:host.material>.select2-container .selection{padding:.4375em 0;border-top:.84375em solid transparent;display:inline-flex;align-items:baseline;width:100%;height:auto}:host.material .select2-container--default .select2-selection--single,:host.material .select2-container--default .select2-selection--multiple{width:100%;border:0;border-radius:0;height:24px;box-sizing:border-box}:host.material .select2-container--default .select2-selection--single:before,:host.material .select2-container--default .select2-selection--multiple:before{content:\" \";display:block;position:absolute;bottom:1.65em;background:#ddd;background:var(--select2-material-underline, #ddd);height:1px;width:100%}:host.material .select2-container--default .select2-selection--single:after,:host.material .select2-container--default .select2-selection--multiple:after{content:\" \";display:block;position:absolute;bottom:1.63em;background:#5a419e;background:var(--select2-material-underline-active, #5a419e);height:2px;width:0%;left:50%;transition:none}:host.material .select2-container--default .select2-selection--single .select2-selection__rendered,:host.material .select2-container--default .select2-selection--multiple .select2-selection__rendered{padding-left:1px;line-height:inherit}:host.material .select2-container--default .select2-selection--single .select2-selection__placeholder,:host.material .select2-container--default .select2-selection--multiple .select2-selection__placeholder{display:block;color:#00000061;color:var(--select2-material-placeholder-color, rgba(0, 0, 0, .38));transition:transform .3s;position:absolute;transform-origin:0 21px;left:0;top:20px}:host.material .select2-container--default .select2-container--open{left:0;bottom:1.6em}:host.material .select2-container--default .select2-selection__placeholder__option{transform:translateY(-1.5em) scale(.75) perspective(100px) translateZ(.001px);width:133.33333%}:host.material .select2-container--default .select2-selection__arrow{top:20px}:host.material .select2-container--default.select2-container--open .select2-selection--single:after,:host.material .select2-container--default.select2-container--open .select2-selection--multiple:after,:host.material .select2-container--default .select2-focused .select2-selection--single:after,:host.material .select2-container--default .select2-focused .select2-selection--multiple:after{transition:width .3s cubic-bezier(.12,1,.77,1),left .3s cubic-bezier(.12,1,.77,1);width:100%;left:0%}:host.material .select2-container--default .select2-dropdown{border-radius:0;border:0;box-shadow:0 5px 5px #00000080}:host.material .select2-container--default .select2-results__option[aria-selected=true],:host.material .select2-container--default .select2-results__option--highlighted[aria-selected]{background:rgba(0,0,0,.04);background:var(--select2-material-option-selected-background, rgba(0, 0, 0, .04));color:#000;color:var(--select2-material-option-highlighted-text-color, #000)}:host.material .select2-container--default .select2-results__option[aria-selected=true]{color:#ff5722;color:var(--select2-material-option-selected-text-color, #ff5722)}:host.material .select2-container--default.select2-container--disabled .select2-selection--single,:host.material .select2-container--default.select2-container--disabled .select2-selection--multiple{background:transparent}:host.material .select2-container--default.select2-container--disabled .select2-selection--single:before,:host.material .select2-container--default.select2-container--disabled .select2-selection--multiple:before{background:linear-gradient(to right,rgba(0,0,0,.26) 0,rgba(0,0,0,.26) 33%,transparent 0);background:var(--select2-material-underline-disabled, linear-gradient(to right, rgba(0, 0, 0, .26) 0, rgba(0, 0, 0, .26) 33%, transparent 0));background-size:4px 1px;background-repeat:repeat-x;background-position:0 bottom}:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--single:before,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--single:after,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--multiple:before,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--multiple:after{background:red;background:var(--select2-material-underline-invalid, red)}:host.material:not(.select2-container--open) .select2-focused .select2-selection--single,:host.material:not(.select2-container--open) .select2-focused .select2-selection--multiple{border:0}:host.material .select2-subscript-wrapper{position:absolute;top:calc(100% - 1.72917em);font-size:75%;color:#888;color:var(--select2-hint-text-color, #888)}::ng-deep .select2-overlay-backdrop{background:rgba(0,0,0,.32);background:var(--select2-overlay-backdrop, transparent)}::ng-deep .cdk-overlay-container .select2-container .select2-dropdown.select2-dropdown--above{bottom:28px}::ng-deep .cdk-overlay-container .select2-container--open.select2-position-auto .select2-dropdown{margin-bottom:28px}::ng-deep .cdk-overlay-container .select2-container--open.select2-position-auto .select2-dropdown.select2-dropdown--above{bottom:0;margin-bottom:0;margin-top:28px}@supports (-moz-appearance: none){select2.material .select2-container--default .select2-selection--single,select2.material .select2-container--default .select2-selection--multiple{height:26px}}@supports (-ms-scroll-limit: 0){select2.material .select2-container--default .select2-selection--single,select2.material .select2-container--default .select2-selection--multiple{height:25px}}\n"] }]
736
- }], ctorParameters: function () { return [{ type: i1.ViewportRuler }, { type: i0.ChangeDetectorRef }, { type: i2.NgForm, decorators: [{
737
- type: Optional
738
- }] }, { type: i2.FormGroupDirective, decorators: [{
739
- type: Optional
740
- }] }, { type: i2.NgControl, decorators: [{
741
- type: Self
742
- }, {
743
- type: Optional
744
- }] }, { type: undefined, decorators: [{
745
- type: Attribute,
746
- args: ['tabindex']
747
- }] }]; }, propDecorators: { data: [{
748
- type: Input
749
- }], minCharForSearch: [{
750
- type: Input
751
- }], displaySearchStatus: [{
752
- type: Input
753
- }], placeholder: [{
754
- type: Input
755
- }], customSearchEnabled: [{
756
- type: Input
757
- }], limitSelection: [{
758
- type: Input
759
- }], listPosition: [{
760
- type: Input
761
- }], multiple: [{
762
- type: Input
763
- }], overlay: [{
764
- type: Input
765
- }], styleMode: [{
766
- type: Input
767
- }], noResultMessage: [{
768
- type: Input
769
- }], maxResults: [{
770
- type: Input
771
- }], maxResultsMessage: [{
772
- type: Input
773
- }], infiniteScrollDistance: [{
774
- type: Input
775
- }], infiniteScrollThrottle: [{
776
- type: Input
777
- }], infiniteScroll: [{
778
- type: Input
779
- }], editPattern: [{
780
- type: Input
781
- }], templates: [{
782
- type: Input
783
- }], resultMaxHeight: [{
784
- type: Input
785
- }], update: [{
786
- type: Output
787
- }], open: [{
788
- type: Output
789
- }], close: [{
790
- type: Output
791
- }], focus: [{
792
- type: Output
793
- }], blur: [{
794
- type: Output
795
- }], search: [{
796
- type: Output
797
- }], scroll: [{
798
- type: Output
799
- }], removeOption: [{
800
- type: Output
801
- }], minCountForSearch: [{
802
- type: Input
803
- }], id: [{
804
- type: Input
805
- }, {
806
- type: HostBinding,
807
- args: ['id']
808
- }], required: [{
809
- type: Input
810
- }], disabled: [{
811
- type: Input
812
- }], hideSelectedItems: [{
813
- type: Input
814
- }], readonly: [{
815
- type: Input
816
- }], value: [{
817
- type: Input
818
- }], tabIndex: [{
819
- type: Input
820
- }], resettable: [{
821
- type: Input
822
- }], ariaInvalid: [{
823
- type: HostBinding,
824
- args: ['attr.aria-invalid']
825
- }], classMaterial: [{
826
- type: HostBinding,
827
- args: ['class.material']
828
- }], classNostyle: [{
829
- type: HostBinding,
830
- args: ['class.nostyle']
831
- }], select2above: [{
832
- type: HostBinding,
833
- args: ['class.select2-above']
834
- }], cdkConnectedOverlay: [{
835
- type: ViewChild,
836
- args: [CdkConnectedOverlay]
837
- }], selection: [{
838
- type: ViewChild,
839
- args: ['selection', { static: true }]
840
- }], resultContainer: [{
841
- type: ViewChild,
842
- args: ['results']
843
- }], results: [{
844
- type: ViewChildren,
845
- args: ['result']
846
- }], searchInput: [{
847
- type: ViewChild,
848
- args: ['searchInput']
849
- }], dropdown: [{
850
- type: ViewChild,
851
- args: ['dropdown']
852
- }] } });
853
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0Mi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1zZWxlY3QyLWNvbXBvbmVudC9zcmMvbGliL3NlbGVjdDIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctc2VsZWN0Mi1jb21wb25lbnQvc3JjL2xpYi9zZWxlY3QyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxtQkFBbUIsR0FJdEIsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBRUgsU0FBUyxFQUVULFNBQVMsRUFFVCxZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksRUFDSixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksR0FDZixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9CLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVkxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7QUFFL0MsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBRXJCLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBT2hFLE1BQU0sT0FBTyxPQUFPO0lBR2hCLG1DQUFtQztJQUNuQyxJQUFhLElBQUksQ0FBQyxJQUFpQjtRQUMvQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBUUQsSUFDSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUFVO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdB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VWIsUUFBUTtzQkFEWCxLQUFLO2dCQVVGLFFBQVE7c0JBRFgsS0FBSztnQkFVRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBVUYsUUFBUTtzQkFEWCxLQUFLO2dCQVVGLEtBQUs7c0JBRFIsS0FBSztnQkFlRixRQUFRO3NCQURYLEtBQUs7Z0JBWUYsVUFBVTtzQkFEYixLQUFLO2dCQVNGLFdBQVc7c0JBRGQsV0FBVzt1QkFBQyxtQkFBbUI7Z0JBTTVCLGFBQWE7c0JBRGhCLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQU16QixZQUFZO3NCQURmLFdBQVc7dUJBQUMsZUFBZTtnQkFNeEIsWUFBWTtzQkFEZixXQUFXO3VCQUFDLHFCQUFxQjtnQkFrQk0sbUJBQW1CO3NCQUExRCxTQUFTO3VCQUFDLG1CQUFtQjtnQkFDb0IsU0FBUztzQkFBMUQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNWLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsU0FBUztnQkFDWSxPQUFPO3NCQUF0QyxZQUFZO3VCQUFDLFFBQVE7Z0JBQ1ksV0FBVztzQkFBNUMsU0FBUzt1QkFBQyxhQUFhO2dCQUNPLFFBQVE7c0JBQXRDLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcbiAgICBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UsXG4gICAgQ29ubmVjdGVkUG9zaXRpb24sXG4gICAgVmVydGljYWxDb25uZWN0aW9uUG9zLFxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBWaWV3cG9ydFJ1bGVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRSZWYsIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIEF0dHJpYnV0ZSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRG9DaGVjayxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgU2VsZixcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5nQ29udHJvbCwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IHRpbWVvdXQgfSBmcm9tICcuL3NlbGVjdDItY29uc3QnO1xuaW1wb3J0IHtcbiAgICBTZWxlY3QyRGF0YSxcbiAgICBTZWxlY3QyR3JvdXAsXG4gICAgU2VsZWN0Mk9wdGlvbixcbiAgICBTZWxlY3QyUmVtb3ZlRXZlbnQsXG4gICAgU2VsZWN0MlNjcm9sbEV2ZW50LFxuICAgIFNlbGVjdDJTZWFyY2hFdmVudCxcbiAgICBTZWxlY3QyVXBkYXRlRXZlbnQsXG4gICAgU2VsZWN0MlVwZGF0ZVZhbHVlLFxuICAgIFNlbGVjdDJWYWx1ZSxcbn0gZnJvbSAnLi9zZWxlY3QyLWludGVyZmFjZXMnO1xuaW1wb3J0IHsgU2VsZWN0MlV0aWxzIH0gZnJvbSAnLi9zZWxlY3QyLXV0aWxzJztcblxubGV0IG5leHRVbmlxdWVJZCA9IDA7XG5cbmNvbnN0IGRpc3BsYXlTZWFyY2hTdGF0dXNMaXN0ID0gWydkZWZhdWx0JywgJ2hpZGRlbicsICdhbHdheXMnXTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzZWxlY3QyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0Mi5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0Mi5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3QyIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25EZXN0cm95LCBEb0NoZWNrLCBBZnRlclZpZXdJbml0IHtcbiAgICBfZGF0YTogU2VsZWN0MkRhdGE7XG5cbiAgICAvKiogZGF0YSBvZiBvcHRpb25zICYgb3B0aW9uZ3JwcyAqL1xuICAgIEBJbnB1dCgpIHNldCBkYXRhKGRhdGE6IFNlbGVjdDJEYXRhKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkRGF0YSgpO1xuICAgIH1cbiAgICBASW5wdXQoKSBtaW5DaGFyRm9yU2VhcmNoID0gMDtcbiAgICBASW5wdXQoKSBkaXNwbGF5U2VhcmNoU3RhdHVzOiAnZGVmYXVsdCcgfCAnaGlkZGVuJyB8ICdhbHdheXMnO1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gICAgQElucHV0KCkgY3VzdG9tU2VhcmNoRW5hYmxlZDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBsaW1pdFNlbGVjdGlvbiA9IDA7XG4gICAgQElucHV0KCkgbGlzdFBvc2l0aW9uOiAnYWJvdmUnIHwgJ2JlbG93JyB8ICdhdXRvJyA9ICdiZWxvdyc7XG5cbiAgICBASW5wdXQoKVxuICAgIGdldCBtdWx0aXBsZSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGU7XG4gICAgfVxuICAgIHNldCBtdWx0aXBsZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuX211bHRpcGxlID0gdGhpcy5fY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICAgICAgdGhpcy5uZ09uSW5pdCgpO1xuICAgIH1cblxuICAgIC8qKiB1c2UgdGhlIG1hdGVyaWFsIHN0eWxlICovXG4gICAgQElucHV0KClcbiAgICBnZXQgb3ZlcmxheSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheTtcbiAgICB9XG4gICAgc2V0IG92ZXJsYXkodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl9vdmVybGF5ID0gdGhpcy5fY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogdXNlIHRoZSBtYXRlcmlhbCBzdHlsZSAqL1xuICAgIEBJbnB1dCgpIHN0eWxlTW9kZTogJ21hdGVyaWFsJyB8ICdub1N0eWxlJyB8ICdkZWZhdWx0JyA9ICdkZWZhdWx0JztcblxuICAgIC8qKiBtZXNzYWdlIHdoZW4gbm8gcmVzdWx0ICovXG4gICAgQElucHV0KCkgbm9SZXN1bHRNZXNzYWdlOiBzdHJpbmc7XG5cbiAgICAvKiogbWF4aW11bSByZXN1bHRzIGxpbWl0ICgwID0gbm8gbGltaXQpICovXG4gICAgQElucHV0KCkgbWF4UmVzdWx0cyA9IDA7XG5cbiAgICAvKiogbWVzc2FnZSB3aGVuIG1heGltdW0gcmVzdWx0cyAqL1xuICAgIEBJbnB1dCgpIG1heFJlc3VsdHNNZXNzYWdlID0gJ1RvbyBtYW55IHJlc3VsdHPigKYnO1xuXG4gICAgLyoqIGluZmluaXRlIHNjcm9sbCBkaXN0YW5jZSAqL1xuICAgIEBJbnB1dCgpIGluZmluaXRlU2Nyb2xsRGlzdGFuY2UgPSAxLjU7XG5cbiAgICAvKiogaW5maW5pdGUgc2Nyb2xsIGRpc3RhbmNlICovXG4gICAgQElucHV0KCkgaW5maW5pdGVTY3JvbGxUaHJvdHRsZSA9IDE1MDtcblxuICAgIC8qKiBpbmZpbml0ZSBzY3JvbGwgYWN0aXZhdGVkICovXG4gICAgQElucHV0KClcbiAgICBnZXQgaW5maW5pdGVTY3JvbGwoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luZmluaXRlU2Nyb2xsO1xuICAgIH1cbiAgICBzZXQgaW5maW5pdGVTY3JvbGwodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl9pbmZpbml0ZVNjcm9sbCA9IHRoaXMuX2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIHVzZSBpdCBmb3IgY2hhbmdlIHRoZSBwYXR0ZXJuIG9mIHRoZSBmaWx0ZXIgc2VhcmNoICovXG4gICAgQElucHV0KCkgZWRpdFBhdHRlcm46IChzdHI6IHN0cmluZykgPT4gc3RyaW5nO1xuXG4gICAgLyoqIHRlbXBsYXRlIGZvciBmb3JtYXRpbmcgKi9cbiAgICBASW5wdXQoKSB0ZW1wbGF0ZXM6IFRlbXBsYXRlUmVmPGFueT4gfCB7IFtrZXk6IHN0cmluZ106IFRlbXBsYXRlUmVmPGFueT4gfTtcblxuICAgIC8qKiB0aGUgbWF4IGhlaWdodCBvZiB0aGUgcmVzdWx0cyBjb250YWluZXIgd2hlbiBvcGVuaW5nIHRoZSBzZWxlY3QgKi9cbiAgICBASW5wdXQoKSByZXN1bHRNYXhIZWlnaHQgPSAnMjAwcHgnO1xuXG4gICAgQE91dHB1dCgpIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0MlVwZGF0ZUV2ZW50PFNlbGVjdDJVcGRhdGVWYWx1ZT4+KCk7XG4gICAgQE91dHB1dCgpIG9wZW4gPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdDI+KCk7XG4gICAgQE91dHB1dCgpIGNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyPigpO1xuICAgIEBPdXRwdXQoKSBmb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0Mj4oKTtcbiAgICBAT3V0cHV0KCkgYmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0Mj4oKTtcbiAgICBAT3V0cHV0KCkgc2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyU2VhcmNoRXZlbnQ8U2VsZWN0MlVwZGF0ZVZhbHVlPj4oKTtcbiAgICBAT3V0cHV0KCkgc2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyU2Nyb2xsRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpIHJlbW92ZU9wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0MlJlbW92ZUV2ZW50PFNlbGVjdDJVcGRhdGVWYWx1ZT4+KCk7XG5cbiAgICBvcHRpb246IFNlbGVjdDJPcHRpb24gfCBTZWxlY3QyT3B0aW9uW10gfCBudWxsID0gbnVsbDtcbiAgICBpc09wZW4gPSBmYWxzZTtcbiAgICBzZWFyY2hTdHlsZTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZm9jdXNlZCBvciBub3QuICovXG4gICAgZm9jdXNlZCA9IGZhbHNlO1xuXG4gICAgZmlsdGVyZWREYXRhOiBTZWxlY3QyRGF0YTtcblxuICAgIGdldCBzZWxlY3QyT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgPyAodGhpcy5vcHRpb24gYXMgU2VsZWN0Mk9wdGlvbltdKSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IHNlbGVjdDJPcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlID8gbnVsbCA6ICh0aGlzLm9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uKTtcbiAgICB9XG5cbiAgICBnZXQgc2VhcmNoVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJTZWFyY2hUZXh0O1xuICAgIH1cblxuICAgIHNldCBzZWFyY2hUZXh0KHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21TZWFyY2hFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5lbWl0KHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3ZhbHVlLFxuICAgICAgICAgICAgICAgIHNlYXJjaDogdGV4dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5uZXJTZWFyY2hUZXh0ID0gdGV4dDtcbiAgICB9XG5cbiAgICAvKiogbWluaW1hbCBkYXRhIG9mIHNob3cgdGhlIHNlYXJjaCBmaWVsZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IG1pbkNvdW50Rm9yU2VhcmNoKCk6IG51bWJlciB8IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW5Db3VudEZvclNlYXJjaDtcbiAgICB9XG5cbiAgICBzZXQgbWluQ291bnRGb3JTZWFyY2godmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICB0aGlzLl9taW5Db3VudEZvclNlYXJjaCA9IHZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZVNlYXJjaEJveCgpO1xuICAgIH1cblxuICAgIC8qKiBVbmlxdWUgaWQgb2YgdGhlIGVsZW1lbnQuICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2lkJylcbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZDtcbiAgICB9XG4gICAgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5faWQgPSB2YWx1ZSB8fCB0aGlzLl91aWQ7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgcmVxdWlyZWQuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgcmVxdWlyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZDtcbiAgICB9XG4gICAgc2V0IHJlcXVpcmVkKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fcmVxdWlyZWQgPSB0aGlzLl9jb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSBoaWRkZW4uICovXG4gICAgQElucHV0KClcbiAgICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250cm9sID8gdGhpcy5fY29udHJvbC5kaXNhYmxlZCA6IHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cbiAgICBzZXQgZGlzYWJsZWQodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IHRoaXMuX2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgaXRlbXMgYXJlIGhpZGRlbiB3aGVuIGhhcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBoaWRlU2VsZWN0ZWRJdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVTZWxlY3RlZEl0ZW1zO1xuICAgIH1cbiAgICBzZXQgaGlkZVNlbGVjdGVkSXRlbXModmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl9oaWRlU2VsZWN0ZWRJdGVtcyA9IHRoaXMuX2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgcmVhZG9ubHkuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgcmVhZG9ubHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkb25seTtcbiAgICB9XG4gICAgc2V0IHJlYWRvbmx5KHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fcmVhZG9ubHkgPSB0aGlzLl9jb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgaW5wdXQgZWxlbWVudCdzIHZhbHVlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIHNldCB2YWx1ZSh2YWx1ZTogU2VsZWN0MlVwZGF0ZVZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnRlc3RWYWx1ZUNoYW5nZSh0aGlzLl92YWx1ZSwgdmFsdWUpKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICB9LCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGFiIGluZGV4IGZvciB0aGUgc2VsZWN0MiBlbGVtZW50LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHRhYkluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkID8gLTEgOiB0aGlzLl90YWJJbmRleDtcbiAgICB9XG4gICAgc2V0IHRhYkluZGV4KHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhYkluZGV4ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogcmVzZXQgd2l0aCBubyBzZWxlY3RlZCB2YWx1ZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHJlc2V0dGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNldHRhYmxlO1xuICAgIH1cbiAgICBzZXQgcmVzZXR0YWJsZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuX3Jlc2V0dGFibGUgPSB0aGlzLl9jb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWludmFsaWQnKVxuICAgIGdldCBhcmlhSW52YWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRXJyb3JTdGF0ZSgpO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWF0ZXJpYWwnKVxuICAgIGdldCBjbGFzc01hdGVyaWFsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZU1vZGUgPT09ICdtYXRlcmlhbCc7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5ub3N0eWxlJylcbiAgICBnZXQgY2xhc3NOb3N0eWxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZU1vZGUgPT09ICdub1N0eWxlJztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNlbGVjdDItYWJvdmUnKVxuICAgIGdldCBzZWxlY3QyYWJvdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5vdmVybGF5ID8gdGhpcy5saXN0UG9zaXRpb24gPT09ICdhYm92ZScgOiB0aGlzLl9pc0Fib2JlT3ZlcmxheSgpO1xuICAgIH1cblxuICAgIG92ZXJsYXlXaWR0aDogbnVtYmVyO1xuICAgIG92ZXJsYXlIZWlnaHQ6IG51bWJlcjtcbiAgICBfdHJpZ2dlclJlY3Q6IERPTVJlY3Q7XG4gICAgX2Ryb3Bkb3duUmVjdDogRE9NUmVjdDtcblxuICAgIGdldCBfcG9zaXRpb25zKCk6IENvbm5lY3RlZFBvc2l0aW9uW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0UG9zaXRpb24gPT09ICdhdXRvJyA/IHVuZGVmaW5lZCA6IG51bGw7XG4gICAgfVxuXG4gICAgbWF4UmVzdWx0c0V4Y2VlZGVkOiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBfbWluQ291bnRGb3JTZWFyY2g/OiBudW1iZXIgfCBzdHJpbmc7XG5cbiAgICBAVmlld0NoaWxkKENka0Nvbm5lY3RlZE92ZXJsYXkpIHByaXZhdGUgY2RrQ29ubmVjdGVkT3ZlcmxheTogQ2RrQ29ubmVjdGVkT3ZlcmxheTtcbiAgICBAVmlld0NoaWxkKCdzZWxlY3Rpb24nLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHNlbGVjdGlvbjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gICAgQFZpZXdDaGlsZCgncmVzdWx0cycpIHByaXZhdGUgcmVzdWx0Q29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgICBAVmlld0NoaWxkcmVuKCdyZXN1bHQnKSBwcml2YXRlIHJlc3VsdHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcpIHByaXZhdGUgc2VhcmNoSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICAgIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJykgcHJpdmF0ZSBkcm9wZG93bjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBwcml2YXRlIGhvdmVyaW5nVmFsdWU6IFNlbGVjdDJWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xuICAgIHByaXZhdGUgaW5uZXJTZWFyY2hUZXh0ID0gJyc7XG4gICAgcHJpdmF0ZSBpc1NlYXJjaGJveEhpZGRlbjogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgc2VsZWN0aW9uRWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICBwcml2YXRlIGdldCByZXN1bHRzRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zdGF0ZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqIFRhYiBpbmRleCBmb3IgdGhlIGVsZW1lbnQuICovXG4gICAgcHJpdmF0ZSBfdGFiSW5kZXg6IG51bWJlcjtcblxuICAgIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfcmVxdWlyZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9yZWFkb25seSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX211bHRpcGxlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfb3ZlcmxheSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3Jlc2V0dGFibGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9oaWRlU2VsZWN0ZWRJdGVtcyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2NsaWNrRGV0ZWN0aW9uID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfY2xpY2tEZXRlY3Rpb25GYzogKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcbiAgICBwcml2YXRlIF91aWQgPSBgc2VsZWN0Mi0ke25leHRVbmlxdWVJZCsrfWA7XG4gICAgcHJpdmF0ZSBfdmFsdWU6IFNlbGVjdDJVcGRhdGVWYWx1ZTtcbiAgICBwcml2YXRlIF9wcmV2aW91c05hdGl2ZVZhbHVlOiBTZWxlY3QyVXBkYXRlVmFsdWU7XG4gICAgcHJpdmF0ZSBfaW5maW5pdGVTY3JvbGwgPSB0cnVlO1xuICAgIHByaXZhdGUgX292ZXJsYXlQb3NpdGlvbjogVmVydGljYWxDb25uZWN0aW9uUG9zO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBfdmlld3BvcnRSdWxlcjogVmlld3BvcnRSdWxlcixcbiAgICAgICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9wYXJlbnRGb3JtOiBOZ0Zvcm0sXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX3BhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgICAgICBAU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBfY29udHJvbDogTmdDb250cm9sLFxuICAgICAgICBAQXR0cmlidXRlKCd0YWJpbmRleCcpIHRhYkluZGV4OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnblxuICAgICAgICB0aGlzLmlkID0gdGhpcy5pZDtcbiAgICAgICAgdGhpcy5fdGFiSW5kZXggPSBwYXJzZUludCh0YWJJbmRleCwgMTApIHx8IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2wpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jbGlja0RldGVjdGlvbkZjID0gdGhpcy5jbGlja0RldGVjdGlvbi5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHNlbGVjdCBoYXMgYmVlbiB0b3VjaGVkICovXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkID0gKCkgPT4ge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgfTtcblxuICAgIC8qKiBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHZhbHVlIGNoYW5nZXMgKi9cbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9O1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuX3ZpZXdwb3J0UnVsZXIuY2hhbmdlKDEwMCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uID0gU2VsZWN0MlV0aWxzLmdldE9wdGlvbnNCeVZhbHVlKFxuICAgICAgICAgICAgdGhpcy5fZGF0YSxcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wgPyB0aGlzLl9jb250cm9sLnZhbHVlIDogdGhpcy52YWx1ZSxcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcHRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uID0gb3B0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcHRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVyaW5nVmFsdWUgPSB0aGlzLnZhbHVlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVNlYXJjaEJveCgpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5jZGtDb25uZWN0ZWRPdmVybGF5LnBvc2l0aW9uQ2hhbmdlLnN1YnNjcmliZSgocG9zQ2hhbmdlOiBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RQb3NpdGlvbiA9PT0gJ2F1dG8nICYmXG4gICAgICAgICAgICAgICAgcG9zQ2hhbmdlLmNvbm5lY3Rpb25QYWlyPy5vcmlnaW5ZICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVBvc2l0aW9uICE9PSBwb3NDaGFuZ2UuY29ubmVjdGlvblBhaXIub3JpZ2luWVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyUmVjdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlQb3NpdGlvbiA9IHBvc0NoYW5nZS5jb25uZWN0aW9uUGFpci5vcmlnaW5ZO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25FbGVtZW50ID0gdGhpcy5zZWxlY3Rpb24ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy50cmlnZ2VyUmVjdCgpO1xuICAgIH1cblxuICAgIG5nRG9DaGVjaygpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTZWFyY2hCb3goKTtcbiAgICAgICAgdGhpcy5fZGlydHlDaGVja05hdGl2ZVZhbHVlKCk7XG4gICAgICAgIGlmICh0aGlzLl90cmlnZ2VyUmVjdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3ZlcmxheVdpZHRoICE9PSB0aGlzLl90cmlnZ2VyUmVjdC53aWR0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVdpZHRoID0gdGhpcy5fdHJpZ2dlclJlY3Qud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fZHJvcGRvd25SZWN0Py5oZWlnaHQgPiAwICYmIHRoaXMub3ZlcmxheUhlaWdodCAhPT0gdGhpcy5fZHJvcGRvd25SZWN0LmhlaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheUhlaWdodCA9IHRoaXMubGlzdFBvc2l0aW9uID09PSAnYXV0bycgPyB0aGlzLl9kcm9wZG93blJlY3QuaGVpZ2h0IDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2NsaWNrRGV0ZWN0aW9uRmMpO1xuICAgIH1cblxuICAgIHVwZGF0ZVNlYXJjaEJveCgpIHtcbiAgICAgICAgY29uc3QgaGlkZGVuID0gdGhpcy5jdXN0b21TZWFyY2hFbmFibGVkXG4gICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICA6IFNlbGVjdDJVdGlscy5pc1NlYXJjaGJveEhpZGRleCh0aGlzLl9kYXRhLCB0aGlzLl9taW5Db3VudEZvclNlYXJjaCk7XG4gICAgICAgIGlmICh0aGlzLmlzU2VhcmNoYm94SGlkZGVuICE9PSBoaWRkZW4pIHtcbiAgICAgICAgICAgIHRoaXMuaXNTZWFyY2hib3hIaWRkZW4gPSBoaWRkZW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoaWRlU2VhcmNoKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkaXNwbGF5U2VhcmNoU3RhdHVzID1cbiAgICAgICAgICAgIGRpc3BsYXlTZWFyY2hTdGF0dXNMaXN0LmluZGV4T2YodGhpcy5kaXNwbGF5U2VhcmNoU3RhdHVzKSA+IC0xID8gdGhpcy5kaXNwbGF5U2VhcmNoU3RhdHVzIDogJ2RlZmF1bHQnO1xuICAgICAgICByZXR1cm4gKGRpc3BsYXlTZWFyY2hTdGF0dXMgPT09ICdkZWZhdWx0JyAmJiB0aGlzLmlzU2VhcmNoYm94SGlkZGVuKSB8fCBkaXNwbGF5U2VhcmNoU3RhdHVzID09PSAnaGlkZGVuJztcbiAgICB9XG5cbiAgICBnZXRPcHRpb25TdHlsZShvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICdzZWxlY3QyLXJlc3VsdHNfX29wdGlvbiAnICtcbiAgICAgICAgICAgIChvcHRpb24uaGlkZSA/ICdzZWxlY3QyLXJlc3VsdHNfX29wdGlvbi0taGlkZSAnIDogJycpICtcbiAgICAgICAgICAgIChvcHRpb24udmFsdWUgPT09IHRoaXMuaG92ZXJpbmdWYWx1ZSA/ICdzZWxlY3QyLXJlc3VsdHNfX29wdGlvbi0taGlnaGxpZ2h0ZWQgJyA6ICcnKSArXG4gICAgICAgICAgICAob3B0aW9uLmNsYXNzZXMgfHwgJycpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbW91c2VlbnRlcihvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgaWYgKCFvcHRpb24uZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJpbmdWYWx1ZSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsaWNrKG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICBpZiAodGhpcy50ZXN0U2VsZWN0aW9uKG9wdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0KG9wdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldChlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0KG51bGwpO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBwcmV2Q2hhbmdlKGV2ZW50OiBFdmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICB0b2dnbGVPcGVuQW5kQ2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm9jdXModHJ1ZSk7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gIXRoaXMuaXNPcGVuO1xuXG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5pbm5lclNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XG4gICAgICAgICAgICB0aGlzLl9mb2N1c1NlYXJjaGJveE9yUmVzdWx0c0VsZW1lbnQoKTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbjogU2VsZWN0Mk9wdGlvbiA9IHRoaXMub3B0aW9uIGluc3RhbmNlb2YgQXJyYXkgPyB0aGlzLm9wdGlvblswXSA6IHRoaXMub3B0aW9uO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbEZyb21PcHRpb24ob3B0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzdWx0c0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyUmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNka0Nvbm5lY3RlZE92ZXJsYXk/Lm92ZXJsYXlSZWY/LnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vcGVuLmVtaXQodGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc09wZW4gJiYgIXRoaXMuX2NsaWNrRGV0ZWN0aW9uKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2NsaWNrRGV0ZWN0aW9uRmMsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0RldGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIGhhc1RlbXBsYXRlKG9wdGlvbjogU2VsZWN0Mk9wdGlvbiB8IFNlbGVjdDJHcm91cCwgZGVmYXV0OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYgfHxcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzPy5bb3B0aW9uLnRlbXBsYXRlSWRdIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYgfHxcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzPy5bZGVmYXV0XSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0VGVtcGxhdGUob3B0aW9uOiBTZWxlY3QyT3B0aW9uIHwgU2VsZWN0Mkdyb3VwLCBkZWZhdXQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNUZW1wbGF0ZShvcHRpb24sIGRlZmF1dClcbiAgICAgICAgICAgID8gdGhpcy50ZW1wbGF0ZXNbb3B0aW9uLnRlbXBsYXRlSWRdIHx8IHRoaXMudGVtcGxhdGVzW2RlZmF1dF0gfHwgdGhpcy50ZW1wbGF0ZXNcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRyaWdnZXJSZWN0KCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyUmVjdCA9IHRoaXMuc2VsZWN0aW9uRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5fZHJvcGRvd25SZWN0ID0gdGhpcy5kcm9wZG93bj8ubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgPyB0aGlzLmRyb3Bkb3duLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgdGVzdFNlbGVjdGlvbihvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgaWYgKG9wdGlvbi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMubXVsdGlwbGUgfHxcbiAgICAgICAgICAgICF0aGlzLmxpbWl0U2VsZWN0aW9uIHx8XG4gICAgICAgICAgICAoQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkgJiYgdGhpcy5fdmFsdWUubGVuZ3RoIDwgdGhpcy5saW1pdFNlbGVjdGlvbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0ZXN0VmFsdWVDaGFuZ2UodmFsdWUxOiBTZWxlY3QyVXBkYXRlVmFsdWUsIHZhbHVlMjogU2VsZWN0MlVwZGF0ZVZhbHVlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICgodmFsdWUxID09PSBudWxsIHx8IHZhbHVlMSA9PT0gdW5kZWZpbmVkKSAmJiAodmFsdWUyID09PSBudWxsIHx8IHZhbHVlMiA9PT0gdW5kZWZpbmVkKSkgfHxcbiAgICAgICAgICAgIHZhbHVlMSA9PT0gdmFsdWUyXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGUgJiZcbiAgICAgICAgICAgICh2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pPy5sZW5ndGggJiZcbiAgICAgICAgICAgICh2YWx1ZTIgYXMgU2VsZWN0MlZhbHVlW10pPy5sZW5ndGggJiZcbiAgICAgICAgICAgICh2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pLmxlbmd0aCA9PT0gKHZhbHVlMiBhcyBTZWxlY3QyVmFsdWVbXSkubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlMSBvZiB2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0ID0gKHZhbHVlMiBhcyBTZWxlY3QyVmFsdWVbXSkuaW5kZXhPZihlMSkgPiAtMTtcbiAgICAgICAgICAgICAgICBpZiAoIXRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRmlsdGVyZWREYXRhKCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9kYXRhO1xuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgdGhpcy5oaWRlU2VsZWN0ZWRJdGVtcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNlbGVjdDJVdGlscy5nZXRGaWx0ZXJlZFNlbGVjdGVkRGF0YShyZXN1bHQsIHRoaXMub3B0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmN1c3RvbVNlYXJjaEVuYWJsZWQgJiYgdGhpcy5zZWFyY2hUZXh0ICYmIHRoaXMuc2VhcmNoVGV4dC5sZW5ndGggPj0gK3RoaXMubWluQ2hhckZvclNlYXJjaCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNlbGVjdDJVdGlscy5nZXRGaWx0ZXJlZERhdGEocmVzdWx0LCB0aGlzLnNlYXJjaFRleHQsIHRoaXMuZWRpdFBhdHRlcm4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5tYXhSZXN1bHRzID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBTZWxlY3QyVXRpbHMuZ2V0UmVkdWNlRGF0YShyZXN1bHQsICt0aGlzLm1heFJlc3VsdHMpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRhdGEucmVzdWx0O1xuICAgICAgICAgICAgICAgIHRoaXMubWF4UmVzdWx0c0V4Y2VlZGVkID0gZGF0YS5yZWR1Y2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubWF4UmVzdWx0c0V4Y2VlZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChTZWxlY3QyVXRpbHMudmFsdWVJc05vdEluRmlsdGVyZWREYXRhKHJlc3VsdCwgdGhpcy5ob3ZlcmluZ1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaG92ZXJpbmdWYWx1ZSA9IFNlbGVjdDJVdGlscy5nZXRGaXJzdEF2YWlsYWJsZU9wdGlvbihyZXN1bHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IHJlc3VsdDtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsaWNrRGV0ZWN0aW9uKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlmUGFyZW50Q29udGFpbnNDbGFzcyhlLnRhcmdldCBhcyBIVE1MRWxlbWVudCwgJ3NlbGVjdGlvbicpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc09wZW4gJiYgIXRoaXMuaWZQYXJlbnRDb250YWluc0NsYXNzKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCAnc2VsZWN0Mi1kcm9wZG93bicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVPcGVuQW5kQ2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5pZlBhcmVudENvbnRhaW5zSWQoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHRoaXMuX2lkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tFeGl0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc09wZW4gJiYgIXRoaXMuaWZQYXJlbnRDb250YWluc0lkKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCB0aGlzLl9pZCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlT3BlbkFuZENsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLmNsaWNrRXhpdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGlja0V4aXQoKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzKGZhbHNlKTtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9jbGlja0RldGVjdGlvbkZjKTtcbiAgICAgICAgdGhpcy5fY2xpY2tEZXRlY3Rpb24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlmUGFyZW50Q29udGFpbnNDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY3NzQ2xhc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJlbnRFbGVtZW50QnlDbGFzcyhlbGVtZW50LCBjc3NDbGFzcykgIT09IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpZlBhcmVudENvbnRhaW5zSWQoZWxlbWVudDogSFRNTEVsZW1lbnQsIGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyZW50RWxlbWVudEJ5SWQoZWxlbWVudCwgaWQpICE9PSBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGFyZW50RWxlbWVudEJ5Q2xhc3MoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNzc0NsYXNzOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy5jb250YWluQ2xhc3NlcyhlbGVtZW50LCBjc3NDbGFzcy50cmltKCkuc3BsaXQoL1xccysvKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50LnBhcmVudEVsZW1lbnQgPyB0aGlzLmdldFBhcmVudEVsZW1lbnRCeUNsYXNzKGVsZW1lbnQucGFyZW50RWxlbWVudCwgY3NzQ2xhc3MpIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBhcmVudEVsZW1lbnRCeUlkKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpZDogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaWQgPT09IGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudC5wYXJlbnRFbGVtZW50ID8gdGhpcy5nZXRQYXJlbnRFbGVtZW50QnlJZChlbGVtZW50LnBhcmVudEVsZW1lbnQsIGlkKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb250YWluQ2xhc3NlcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY3NzQ2xhc3Nlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY3NzQ2xhc3Mgb2YgY3NzQ2xhc3Nlcykge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjc3NDbGFzcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9jdXNpbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1cyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3Vzb3V0KCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25FbGVtZW50ICYmICF0aGlzLnNlbGVjdGlvbkVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3QyLWZvY3VzZWQnKSkge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXMoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWxlY3Qob3B0aW9uOiBTZWxlY3QyT3B0aW9uIHwgbnVsbCkge1xuICAgICAgICBsZXQgdmFsdWU6IGFueTtcbiAgICAgICAgaWYgKG9wdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb24gYXMgU2VsZWN0Mk9wdGlvbltdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3AgPT4gb3AudmFsdWUgPT09IG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2gob3B0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlID0gKHRoaXMub3B0aW9uIGFzIFNlbGVjdDJPcHRpb25bXSkubWFwKG9wID0+IG9wLnZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb24gPSBvcHRpb247XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UuZW1pdCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLm9wdGlvbi52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMuaGlkZVNlbGVjdGVkSXRlbXMpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlLmVtaXQoe1xuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgb3B0aW9uczogQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvbiA6IHRoaXMub3B0aW9uID8gW3RoaXMub3B0aW9uXSA6IG51bGwsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGtleURvd24oZTogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5fdGVzdEtleShlLCBbJ0Fycm93RG93bicsIDQwXSkpIHtcbiAgICAgICAgICAgIHRoaXMubW92ZURvd24oKTtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90ZXN0S2V5KGUsIFsnQXJyb3dVcCcsIDM4XSkpIHtcbiAgICAgICAgICAgIHRoaXMubW92ZVVwKCk7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGVzdEtleShlLCBbJ0VudGVyJywgMTNdKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RCeUVudGVyKCk7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGVzdEtleShlLCBbJ0VzY2FwZScsICdUYWInLCA5LCAyN10pICYmIHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZU9wZW5BbmRDbG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5fZm9jdXMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3BlbktleShlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLl90ZXN0S2V5KGUsIFsnQXJyb3dEb3duJywgJ0Fycm93VXAnLCAnRW50ZXInLCA0MCwgMzgsIDEzXSkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlT3BlbkFuZENsb3NlKCk7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGVzdEtleShlLCBbJ0VzY2FwZScsICdUYWInLCA5LCAyN10pKSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1cyhmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyYWNrQnkoX2luZGV4OiBudW1iZXIsIGl0ZW06IFNlbGVjdDJPcHRpb24pOiBhbnkge1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG5cbiAgICBzZWFyY2hVcGRhdGUoZTogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gKGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkRGF0YSgpO1xuICAgIH1cblxuICAgIGlzU2VsZWN0ZWQob3B0aW9uOiBTZWxlY3QyT3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBTZWxlY3QyVXRpbHMuaXNTZWxlY3RlZCh0aGlzLm9wdGlvbiwgb3B0aW9uLCB0aGlzLm11bHRpcGxlKTtcbiAgICB9XG5cbiAgICBpc0Rpc2FibGVkKG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICByZXR1cm4gb3B0aW9uLmRpc2FibGVkID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG5cbiAgICByZW1vdmVTZWxlY3Rpb24oZTogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQsIG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICBTZWxlY3QyVXRpbHMucmVtb3ZlU2VsZWN0aW9uKHRoaXMub3B0aW9uLCBvcHRpb24pO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMuaGlkZVNlbGVjdGVkSXRlbXMpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLm9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uW10pLm1hcChvcCA9PiBvcC52YWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2wpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZS5lbWl0KHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb24pID8gdGhpcy5vcHRpb24gOiB0aGlzLm9wdGlvbiA/IFt0aGlzLm9wdGlvbl0gOiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZW1vdmVPcHRpb24uZW1pdCh7XG4gICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICByZW1vdmVkT3B0aW9uOiBvcHRpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzU2VhcmNoYm94T3JSZXN1bHRzRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbW9kZWwgdmFsdWUuIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAgICogQHBhcmFtIHZhbHVlXG4gICAgICovXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBzZWxlY3QncyB2YWx1ZVxuICAgICAqIGNoYW5nZXMgZnJvbSB1c2VyIGlucHV0LiBQYXJ0IG9mIHRoZSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VcbiAgICAgKiByZXF1aXJlZCB0byBpbnRlZ3JhdGUgd2l0aCBBbmd1bGFyJ3MgY29yZSBmb3JtcyBBUEkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm4gQ2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMuXG4gICAgICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgc2VsZWN0IGlzIGJsdXJyZWRcbiAgICAgKiBieSB0aGUgdXNlci4gUGFydCBvZiB0aGUgQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlIHJlcXVpcmVkXG4gICAgICogdG8gaW50ZWdyYXRlIHdpdGggQW5ndWxhcidzIGNvcmUgZm9ybXMgQVBJLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZuIENhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gdG91Y2hlZC5cbiAgICAgKi9cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4ge30pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIGRpc2FibGVkLlxuICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAgICogQHBhcmFtIGlzRGlzYWJsZWRcbiAgICAgKi9cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgb25TY3JvbGwod2F5OiAndXAnIHwgJ2Rvd24nKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsLmVtaXQoe1xuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgICAgd2F5LFxuICAgICAgICAgICAgc2VhcmNoOiB0aGlzLmlubmVyU2VhcmNoVGV4dCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2lzRXJyb3JTdGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXNJbnZhbGlkID0gdGhpcy5fY29udHJvbCAmJiB0aGlzLl9jb250cm9sLmludmFsaWQ7XG4gICAgICAgIGNvbnN0IGlzVG91Y2hlZCA9IHRoaXMuX2NvbnRyb2wgJiYgdGhpcy5fY29udHJvbC50b3VjaGVkO1xuICAgICAgICBjb25zdCBpc1N1Ym1pdHRlZCA9XG4gICAgICAgICAgICAodGhpcy5fcGFyZW50Rm9ybUdyb3VwICYmIHRoaXMuX3BhcmVudEZvcm1Hcm91cC5zdWJtaXR0ZWQpIHx8XG4gICAgICAgICAgICAodGhpcy5fcGFyZW50Rm9ybSAmJiB0aGlzLl9wYXJlbnRGb3JtLnN1Ym1pdHRlZCk7XG5cbiAgICAgICAgcmV0dXJuICEhKGlzSW52YWxpZCAmJiAoaXNUb3VjaGVkIHx8IGlzU3VibWl0dGVkKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtb3ZlVXAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsRnJvbU9wdGlvbihTZWxlY3QyVXRpbHMuZ2V0UHJldmlvdXNPcHRpb24odGhpcy5maWx0ZXJlZERhdGEsIHRoaXMuaG92ZXJpbmdWYWx1ZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbW92ZURvd24oKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsRnJvbU9wdGlvbihTZWxlY3QyVXRpbHMuZ2V0TmV4dE9wdGlvbih0aGlzLmZpbHRlcmVkRGF0YSwgdGhpcy5ob3ZlcmluZ1ZhbHVlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVTY3JvbGxGcm9tT3B0aW9uKG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVyaW5nVmFsdWUgPSBvcHRpb24udmFsdWU7XG4gICAgICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gdGhpcy5yZXN1bHRzLmZpbmQociA9PiByLm5hdGl2ZUVsZW1lbnQuaW5uZXJUZXh0LnRyaW0oKSA9PT0gb3B0aW9uLmxhYmVsKTtcbiAgICAgICAgICAgIGlmIChkb21FbGVtZW50ICYmIHRoaXMucmVzdWx0c0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdHNFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdENsaWVudFJlY3QgPSB0aGlzLnJlc3VsdHNFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbkNsaWVudFJlY3QgPSBkb21FbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzRWxlbWVudC5zY3JvbGxUb3AgPSBvcHRpb25DbGllbnRSZWN0LnRvcCAtIGxpc3RDbGllbnRSZWN0LnRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0QnlFbnRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuaG92ZXJpbmdWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gU2VsZWN0MlV0aWxzLmdldE9wdGlvbkJ5VmFsdWUodGhpcy5fZGF0YSwgdGhpcy5ob3ZlcmluZ1ZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0KG9wdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF90ZXN0S2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50LCByZWZzOiAobnVtYmVyIHwgc3RyaW5nKVtdID0gW10pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzS2V5KHRoaXMuX2dldEtleShldmVudCksIHJlZnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IG51bWJlciB8IHN0cmluZyB7XG4gICAgICAgIGxldCBjb2RlOiBudW1iZXIgfCBzdHJpbmc7XG5cbiAgICAgICAgaWYgKGV2ZW50LmtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb2RlID0gZXZlbnQua2V5O1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50WydrZXlJZGVudGlmaWVyJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29kZSA9IGV2ZW50WydrZXlJZGVudGlmaWVyJ107XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRbJ2tleUNvZGUnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb2RlID0gZXZlbnRbJ2tleUNvZGUnXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29kZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc0tleShjb2RlOiBudW1iZXIgfCBzdHJpbmcsIHJlZnM6IChudW1iZXIgfCBzdHJpbmcpW10gPSBbXSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcmVmcyAmJiByZWZzLmxlbmd0aCA+IDAgPyByZWZzLmluZGV4T2YoY29kZSkgIT09IC0xIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc2VsZWN0ZWQgb3B0aW9uIGJhc2VkIG9uIGEgdmFsdWUuIElmIG5vIG9wdGlvbiBjYW4gYmVcbiAgICAgKiBmb3VuZCB3aXRoIHRoZSBkZXNpZ25hdGVkIHZhbHVlLCB0aGUgc2VsZWN0IHRyaWdnZXIgaXMgY2xlYXJlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZXRTZWxlY3Rpb25CeVZhbHVlKHZhbHVlOiBhbnkgfCBhbnlbXSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRpb24gfHwgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpKSB7XG4gICAgICAgICAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiB2YWx1ZSAmJiAhaXNBcnJheSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm9uIGFycmF5IHZhbHVlLicpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9kYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb24gPSBbXTsgLy8gaWYgdmFsdWUgaXMgbnVsbCwgdGhlbiBlbXB0eSBvcHRpb24gYW5kIHJldHVyblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgbm90IG51bGwuIFByZXNlbGVjdCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXM6IGFueSA9IFNlbGVjdDJVdGlscy5nZXRPcHRpb25zQnlWYWx1ZSh0aGlzLl9kYXRhLCB2YWx1ZSwgdGhpcy5tdWx0aXBsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFZhbHVlcy5tYXAoaXRlbSA9PiB0aGlzLnNlbGVjdChpdGVtKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdChTZWxlY3QyVXRpbHMuZ2V0T3B0aW9uQnlWYWx1ZSh0aGlzLl9kYXRhLCB2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY29udHJvbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wudmlld1RvTW9kZWxVcGRhdGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBEb2VzIHNvbWUgbWFudWFsIGRpcnR5IGNoZWNraW5nIG9uIHRoZSBuYXRpdmUgaW5wdXQgYHZhbHVlYCBwcm9wZXJ0eS4gKi9cbiAgICBwcml2YXRlIF9kaXJ0eUNoZWNrTmF0aXZlVmFsdWUoKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy52YWx1ZTtcblxuICAgICAgICBpZiAodGhpcy5fcHJldmlvdXNOYXRpdmVWYWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzTmF0aXZlVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBgJHt2YWx1ZX1gICE9PSAnZmFsc2UnO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2ZvY3VzU2VhcmNoYm94T3JSZXN1bHRzRWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2VhcmNoYm94SGlkZGVuKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dCAmJiB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXN1bHRzRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5yZXN1bHRzRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZm9jdXMoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCFzdGF0ZSAmJiB0aGlzLmZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IHN0YXRlO1xuICAgICAgICAgICAgdGhpcy5ibHVyLmVtaXQodGhpcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgJiYgIXRoaXMuZm9jdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gc3RhdGU7XG4gICAgICAgICAgICB0aGlzLmZvY3VzLmVtaXQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc0Fib2JlT3ZlcmxheSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcmxheSAmJiB0aGlzLl9vdmVybGF5UG9zaXRpb24gJiYgdGhpcy5saXN0UG9zaXRpb24gPT09ICdhdXRvJ1xuICAgICAgICAgICAgPyB0aGlzLl9vdmVybGF5UG9zaXRpb24gPT09ICd0b3AnXG4gICAgICAgICAgICA6IHRoaXMubGlzdFBvc2l0aW9uID09PSAnYWJvdmUnO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzZWxlY3QyLWxhYmVsXCIgKGNsaWNrKT1cInRvZ2dsZU9wZW5BbmRDbG9zZSgpXCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwic2VsZWN0Mi1sYWJlbFwiPjwvbmctY29udGVudD5cbiAgICA8c3BhbiAqbmdJZj1cInJlcXVpcmVkXCIgY2xhc3M9XCJzZWxlY3QyLXJlcXVpcmVkXCI+PC9zcGFuPlxuPC9kaXY+XG48ZGl2XG4gICAgY2xhc3M9XCJzZWxlY3QyIHNlbGVjdDItY29udGFpbmVyIHNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0XCJcbiAgICBbY2xhc3Muc2VsZWN0Mi1jb250YWluZXItLWZvY3VzXT1cImZvY3VzZWRcIlxuICAgIFtjbGFzcy5zZWxlY3QyLWNvbnRhaW5lci0tYmVsb3ddPVwiIXNlbGVjdDJhYm92ZVwiXG4gICAgW2NsYXNzLnNlbGVjdDItY29udGFpbmVyLS1hYm92ZV09XCJzZWxlY3QyYWJvdmVcIlxuICAgIFtjbGFzcy5zZWxlY3QyLWNvbnRhaW5lci0tb3Blbl09XCJpc09wZW5cIlxuICAgIFtjbGFzcy5zZWxlY3QyLWNvbnRhaW5lci0tZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzZWxlY3Rpb25cIlxuICAgICAgICAjc2VsZWN0aW9uXG4gICAgICAgICN0cmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgICAgIFt0YWJpbmRleF09XCIhdGhpcy5pc09wZW4gPyB0YWJJbmRleCA6ICctMSdcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlT3BlbkFuZENsb3NlKClcIlxuICAgICAgICAoZm9jdXMpPVwiZm9jdXNpbigpXCJcbiAgICAgICAgKGJsdXIpPVwiZm9jdXNvdXQoKVwiXG4gICAgICAgIChrZXlkb3duKT1cIm9wZW5LZXkoJGV2ZW50KVwiXG4gICAgICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAgICAgW2NsYXNzLnNlbGVjdDItZm9jdXNlZF09XCJmb2N1c2VkXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1zZWxlY3Rpb25cIlxuICAgICAgICAgICAgW2NsYXNzLnNlbGVjdDItc2VsZWN0aW9uLS1tdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICAgICAgICBbY2xhc3Muc2VsZWN0Mi1zZWxlY3Rpb24tLXNpbmdsZV09XCIhbXVsdGlwbGVcIlxuICAgICAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhbXVsdGlwbGVcIiBjbGFzcz1cInNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZFwiIFt0aXRsZV09XCJzZWxlY3QyT3B0aW9uPy5sYWJlbCB8fCAnJ1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXNlbGVjdDJPcHRpb25cIj4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzZWxlY3QyT3B0aW9uXCIgW2lubmVySFRNTF09XCJzZWxlY3QyT3B0aW9uLmxhYmVsXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzcy5zZWxlY3QyLXNlbGVjdGlvbl9fcGxhY2Vob2xkZXJfX29wdGlvbl09XCJvcHRpb25cIiBjbGFzcz1cInNlbGVjdDItc2VsZWN0aW9uX19wbGFjZWhvbGRlclwiPnt7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFtdWx0aXBsZSAmJiByZXNldHRhYmxlICYmIHNlbGVjdDJPcHRpb24gJiYgIShkaXNhYmxlZCB8fCByZWFkb25seSlcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1zZWxlY3Rpb25fX3Jlc2V0XCJcbiAgICAgICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAgICAgICA+w5c8L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIW11bHRpcGxlXCIgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fYXJyb3dcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+IDwvc3Bhbj5cbiAgICAgICAgICAgIDx1bCAqbmdJZj1cIm11bHRpcGxlXCIgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fcmVuZGVyZWRcIj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0Mi1zZWxlY3Rpb25fX3BsYWNlaG9sZGVyX19vcHRpb25dPVwic2VsZWN0Mk9wdGlvbnM/Lmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdDItc2VsZWN0aW9uX19wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgID57eyBwbGFjZWhvbGRlciB9fTwvc3BhblxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wIG9mIG9wdGlvbjsgdHJhY2tCeTogdHJhY2tCeVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1zZWxlY3Rpb25fX2Nob2ljZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJvcC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInJlbW92ZVNlbGVjdGlvbigkZXZlbnQsIG9wKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhKGRpc2FibGVkIHx8IHJlYWRvbmx5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlU2VsZWN0aW9uKCRldmVudCwgb3ApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1zZWxlY3Rpb25fX2Nob2ljZV9fcmVtb3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPsOXPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJvcC5sYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFvdmVybGF5XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cInNlbGVjdDItc3Vic2NyaXB0LXdyYXBwZXJcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwic2VsZWN0Mi1oaW50XCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cInNlbGVjdDItb3ZlcmxheS1iYWNrZHJvcFwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidHJpZ2dlclwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cInRoaXMuaXNPcGVuICYmIG92ZXJsYXlcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5TWluV2lkdGhdPVwib3ZlcmxheVdpZHRoXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhlaWdodF09XCJvdmVybGF5SGVpZ2h0XCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uc109XCJfcG9zaXRpb25zXCJcbiAgICAoYmFja2Ryb3BDbGljayk9XCJ0b2dnbGVPcGVuQW5kQ2xvc2UoKVwiXG4+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbnRhaW5lclRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzZWxlY3QyLWNvbnRhaW5lciBzZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCBzZWxlY3QyLWNvbnRhaW5lci1kcm9wZG93blwiXG4gICAgICAgIFtjbGFzcy5zZWxlY3QyLWNvbnRhaW5lci0tb3Blbl09XCJpc09wZW5cIlxuICAgICAgICBbY2xhc3Muc2VsZWN0Mi1vdmVybGF5XT1cIm92ZXJsYXlcIlxuICAgICAgICBbY2xhc3Muc2VsZWN0Mi1wb3NpdGlvbi1hdXRvXT1cImxpc3RQb3NpdGlvbiA9PT0gJ2F1dG8nXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICNkcm9wZG93blxuICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLWRyb3Bkb3duXCJcbiAgICAgICAgICAgIFtjbGFzcy5zZWxlY3QyLWRyb3Bkb3duLS1iZWxvd109XCIhc2VsZWN0MmFib3ZlXCJcbiAgICAgICAgICAgIFtjbGFzcy5zZWxlY3QyLWRyb3Bkb3duLS1hYm92ZV09XCJzZWxlY3QyYWJvdmVcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0Mi1zZWFyY2ggc2VsZWN0Mi1zZWFyY2gtLWRyb3Bkb3duXCIgW2NsYXNzLnNlbGVjdDItc2VhcmNoLS1oaWRlXT1cImhpZGVTZWFyY2goKVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAjc2VhcmNoSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImlkICsgJy1zZWFyY2gtZmllbGQnXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJrZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwic2VhcmNoVXBkYXRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInByZXZDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1zZWFyY2hfX2ZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJ0ZXh0Ym94XCJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2NvcnJlY3Q9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInRoaXMuaXNPcGVuID8gdGFiSW5kZXggOiAnLTEnXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0Mi1yZXN1bHRzXCI+XG4gICAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgICAgICNyZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1yZXN1bHRzX19vcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC1oZWlnaHRdPVwicmVzdWx0TWF4SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRyZWVcIlxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICAgICAgaW5maW5pdGVTY3JvbGxcbiAgICAgICAgICAgICAgICAgICAgW2luZmluaXRlU2Nyb2xsRGlzYWJsZWRdPVwiIWluZmluaXRlU2Nyb2xsICYmICFpc09wZW5cIlxuICAgICAgICAgICAgICAgICAgICBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCJpbmZpbml0ZVNjcm9sbERpc3RhbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiaW5maW5pdGVTY3JvbGxUaHJvdHRsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtpbmZpbml0ZVNjcm9sbENvbnRhaW5lcl09XCJyZXN1bHRzXCJcbiAgICAgICAgICAgICAgICAgICAgKHNjcm9sbGVkKT1cIm9uU2Nyb2xsKCdkb3duJylcIlxuICAgICAgICAgICAgICAgICAgICAoc2Nyb2xsZWRVcCk9XCJvblNjcm9sbCgndXAnKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImtleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cE9yT3B0aW9uIG9mIGZpbHRlcmVkRGF0YTsgaW5kZXggYXMgaTsgdHJhY2tCeTogdHJhY2tCeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiZ3JvdXBPck9wdGlvbi5vcHRpb25zXCIgY2xhc3M9XCJzZWxlY3QyLXJlc3VsdHNfX29wdGlvblwiIHJvbGU9XCJncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaGFzVGVtcGxhdGUoZ3JvdXBPck9wdGlvbiwgJ2dyb3VwJyk7IGVsc2Ugb3B0R3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWxlY3QyLXJlc3VsdHNfX2dyb3VwJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JvdXBPck9wdGlvbi5jbGFzc2VzID8gJyAnICsgZ3JvdXBPck9wdGlvbi5jbGFzc2VzIDogJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiZ3JvdXBPck9wdGlvbi5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3B0R3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0VGVtcGxhdGUoZ3JvdXBPck9wdGlvbiwgJ2dyb3VwJyk7IGNvbnRleHQ6IGdyb3VwT3JPcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJzZWxlY3QyLXJlc3VsdHNfX29wdGlvbnMgc2VsZWN0Mi1yZXN1bHRzX19vcHRpb25zLS1uZXN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGdyb3VwT3JPcHRpb24ub3B0aW9uczsgaW5kZXggYXMgajsgdHJhY2tCeTogdHJhY2tCeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwib3B0aW9uLmlkIHx8IGlkICsgJy1vcHRpb24tJyArIGkgKyAnLScgKyBqXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRPcHRpb25TdHlsZShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJ0cmVlaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImlzRGlzYWJsZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJtb3VzZWVudGVyKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaGFzVGVtcGxhdGUob3B0aW9uLCAnb3B0aW9uJyk7IGVsc2UgbGlHcm91cFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLWxhYmVsLWNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwib3B0aW9uLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGlHcm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0VGVtcGxhdGUob3B0aW9uLCAnb3B0aW9uJyk7IGNvbnRleHQ6IG9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWdyb3VwT3JPcHRpb24ub3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJncm91cE9yT3B0aW9uLmlkIHx8IGlkICsgJy1vcHRpb24tJyArIGlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRPcHRpb25TdHlsZShncm91cE9yT3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRyZWVpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQoZ3JvdXBPck9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNEaXNhYmxlZChncm91cE9yT3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwibW91c2VlbnRlcihncm91cE9yT3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrKGdyb3VwT3JPcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWhhc1RlbXBsYXRlKGdyb3VwT3JPcHRpb24sICdvcHRpb24nKTsgZWxzZSBsaVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiZ3JvdXBPck9wdGlvbi5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1sYWJlbC1jb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRUZW1wbGF0ZShncm91cE9yT3B0aW9uLCAnb3B0aW9uJyk7IGNvbnRleHQ6IGdyb3VwT3JPcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdDItbm8tcmVzdWx0IHNlbGVjdDItcmVzdWx0c19fb3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWZpbHRlcmVkRGF0YT8ubGVuZ3RoICYmIG5vUmVzdWx0TWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIm5vUmVzdWx0TWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgID48L2xpPlxuICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi10b28tbXVjaC1yZXN1bHQgc2VsZWN0Mi1yZXN1bHRzX19vcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtYXhSZXN1bHRzRXhjZWVkZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJtYXhSZXN1bHRzTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgID48L2xpPlxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19