ng-select2-component 15.2.1 → 15.4.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,5 +1,5 @@
1
1
  import { CdkConnectedOverlay, } from '@angular/cdk/overlay';
2
- import { Attribute, Component, EventEmitter, HostBinding, HostListener, Input, Optional, Output, Self, TemplateRef, ViewChild, ViewChildren, booleanAttribute, numberAttribute, } from '@angular/core';
2
+ import { Attribute, Component, EventEmitter, HostBinding, HostListener, Input, Optional, Output, Self, TemplateRef, ViewChild, ViewChildren, booleanAttribute, computed, input, numberAttribute, signal, } from '@angular/core';
3
3
  import { Subject } from 'rxjs';
4
4
  import { Select2Utils } from './select2-utils';
5
5
  import * as i0 from "@angular/core";
@@ -9,7 +9,9 @@ import * as i3 from "@angular/common";
9
9
  import * as i4 from "@angular/cdk/overlay";
10
10
  import * as i5 from "ngx-infinite-scroll";
11
11
  let nextUniqueId = 0;
12
- const displaySearchStatusList = ['default', 'hidden', 'always'];
12
+ const OPEN_KEYS = ['ArrowDown', 'ArrowUp', 'Enter', ' ', 'Home', 'End', 'PageUp', 'PageDown'];
13
+ const ON_OPEN_KEYS = ['Home', 'End', 'PageUp', 'PageDown'];
14
+ const CLOSE_KEYS = ['Escape', 'Tab', { key: 'ArrowUp', altKey: true }];
13
15
  export class Select2 {
14
16
  /** data of options & optiongrps */
15
17
  set data(data) {
@@ -31,13 +33,6 @@ export class Select2 {
31
33
  this._minCountForSearch = value;
32
34
  this.updateSearchBox();
33
35
  }
34
- /** Unique id of the element. */
35
- get id() {
36
- return this._id;
37
- }
38
- set id(value) {
39
- this._id = value || this._uid;
40
- }
41
36
  /** Whether selected items should be hidden. */
42
37
  get disabled() {
43
38
  return this._control ? this._control.disabled : this._disabled;
@@ -78,9 +73,6 @@ export class Select2 {
78
73
  set searchText(text) {
79
74
  this.innerSearchText = text;
80
75
  }
81
- get ariaInvalid() {
82
- return this._isErrorState();
83
- }
84
76
  get classMaterial() {
85
77
  return this.styleMode === 'material';
86
78
  }
@@ -105,6 +97,7 @@ export class Select2 {
105
97
  this._parentForm = _parentForm;
106
98
  this._parentFormGroup = _parentFormGroup;
107
99
  this._control = _control;
100
+ this._uid = `select2-${nextUniqueId++}`;
108
101
  this.minCharForSearch = 0;
109
102
  this.limitSelection = 0;
110
103
  this.listPosition = 'below';
@@ -130,6 +123,17 @@ export class Select2 {
130
123
  this.resultMaxHeight = '200px';
131
124
  /** Active Search event */
132
125
  this.customSearchEnabled = false;
126
+ /** Unique id of the element. */
127
+ this.id = input(this._uid);
128
+ this.idLabel = computed(() => `${this.id()}-label`);
129
+ this.idCombo = computed(() => `${this.id()}-combo`);
130
+ this.idOptions = computed(() => `${this.id()}-options`);
131
+ this.idOverlay = computed(() => `${this.id()}-overlay`);
132
+ this.title = input();
133
+ this.ariaLabelledby = input();
134
+ this.ariaDescribedby = input();
135
+ this.ariaInvalid = input(false, { transform: booleanAttribute });
136
+ this.ariaResetButtonDescription = input('Reset');
133
137
  /** Whether the element is required. */
134
138
  this.required = false;
135
139
  /** Whether items are hidden when has. */
@@ -144,6 +148,14 @@ export class Select2 {
144
148
  * * string = minimal size item (100px)
145
149
  */
146
150
  this.grid = '';
151
+ /** force selection on one line */
152
+ this.selectionNoWrap = false;
153
+ /** Add an option to select or remove all (if all is selected) */
154
+ this.showSelectAll = false;
155
+ /** Text for remove all options */
156
+ this.removeAllText = 'Remove all';
157
+ /** Text for select all options */
158
+ this.selectAllText = 'Select all';
147
159
  this.update = new EventEmitter();
148
160
  this.autoCreateItem = new EventEmitter();
149
161
  this.open = new EventEmitter();
@@ -157,12 +169,13 @@ export class Select2 {
157
169
  this.isOpen = false;
158
170
  /** Whether the element is focused or not. */
159
171
  this.focused = false;
160
- this.hoveringValue = null;
172
+ this.filteredData = signal(undefined);
173
+ this.hoveringOption = signal(null);
174
+ this.hoveringOptionId = computed(() => this.getElementId(this.hoveringOption()));
161
175
  this.innerSearchText = '';
162
176
  this._stateChanges = new Subject();
163
177
  this._disabled = false;
164
178
  this._multiple = false;
165
- this._uid = `select2-${nextUniqueId++}`;
166
179
  this._value = null;
167
180
  /** View -> model callback called when select has been touched */
168
181
  this._onTouched = () => {
@@ -172,8 +185,6 @@ export class Select2 {
172
185
  this._onChange = () => {
173
186
  // do nothing
174
187
  };
175
- // eslint-disable-next-line no-self-assign
176
- this.id = this.id;
177
188
  this._tabIndex = parseInt(tabIndex, 10) || 0;
178
189
  if (this._control) {
179
190
  this._control.valueAccessor = this;
@@ -186,11 +197,11 @@ export class Select2 {
186
197
  if (!this.ifParentContainsClass(target, 'select2-dropdown')) {
187
198
  this.toggleOpenAndClose();
188
199
  }
189
- if (!this.overlay && !this.ifParentContainsId(target, this._id)) {
200
+ if (!this.overlay && !this.ifParentContainsId(target, this.id())) {
190
201
  this.clickExit();
191
202
  }
192
203
  }
193
- else if (!this.ifParentContainsId(target, this._id)) {
204
+ else if (!this.ifParentContainsId(target, this.id())) {
194
205
  this.toggleOpenAndClose();
195
206
  this.clickExit();
196
207
  }
@@ -211,7 +222,7 @@ export class Select2 {
211
222
  this.option = option;
212
223
  }
213
224
  if (!Array.isArray(option)) {
214
- this.hoveringValue = this.value;
225
+ this.hoveringOption.set(Select2Utils.getOptionByValue(this._data, this.value));
215
226
  }
216
227
  this.updateSearchBox();
217
228
  }
@@ -241,26 +252,23 @@ export class Select2 {
241
252
  }
242
253
  }
243
254
  updateSearchBox() {
244
- const hidden = this.customSearchEnabled
245
- ? false
246
- : Select2Utils.isSearchboxHiddex(this._data, this._minCountForSearch);
255
+ const hidden = this.displaySearchStatus === 'hidden' ||
256
+ (this.displaySearchStatus !== 'always' &&
257
+ !this.customSearchEnabled &&
258
+ Select2Utils.isSearchboxHidden(this._data, this._minCountForSearch));
247
259
  if (this.isSearchboxHidden !== hidden) {
248
260
  this.isSearchboxHidden = hidden;
249
261
  }
250
262
  }
251
- hideSearch() {
252
- const displaySearchStatus = displaySearchStatusList.indexOf(this.displaySearchStatus) > -1 ? this.displaySearchStatus : 'default';
253
- return (displaySearchStatus === 'default' && this.isSearchboxHidden) || displaySearchStatus === 'hidden';
254
- }
255
263
  getOptionStyle(option) {
256
264
  return ('select2-results__option ' +
257
265
  (option.hide ? 'select2-results__option--hide ' : '') +
258
- (option.value === this.hoveringValue ? 'select2-results__option--highlighted ' : '') +
266
+ (option === this.hoveringOption() ? 'select2-results__option--highlighted ' : '') +
259
267
  (option.classes || ''));
260
268
  }
261
269
  mouseenter(option) {
262
270
  if (!option.disabled) {
263
- this.hoveringValue = option.value;
271
+ this.hoveringOption.set(option);
264
272
  }
265
273
  }
266
274
  click(option) {
@@ -277,6 +285,7 @@ export class Select2 {
277
285
  if (event) {
278
286
  this.stopEvent(event);
279
287
  }
288
+ this._focus(true);
280
289
  }
281
290
  prevChange(event) {
282
291
  event.stopPropagation();
@@ -286,17 +295,18 @@ export class Select2 {
286
295
  event.stopPropagation();
287
296
  }
288
297
  toggleOpenAndClose(focus = true, open, event) {
289
- if (this.disabled) {
298
+ if (this.disabled || this.readonly) {
290
299
  return;
291
300
  }
292
301
  this._focus(focus);
302
+ const onOpenAction = event && this._testKey(event, ON_OPEN_KEYS);
293
303
  const changeEmit = this.isOpen !== (open ?? !this.isOpen);
294
304
  this.isOpen = open ?? !this.isOpen;
295
305
  if (this.isOpen) {
296
306
  if (!this.isSearchboxHidden) {
297
307
  this.innerSearchText = '';
298
308
  this.updateFilteredData();
299
- this._focusSearchboxOrResultsElement(focus);
309
+ this._focusSearchbox(focus);
300
310
  }
301
311
  if (this.isSearchboxHidden && !changeEmit && event) {
302
312
  this.keyDown(event);
@@ -310,6 +320,9 @@ export class Select2 {
310
320
  else if (this.resultsElement) {
311
321
  this.resultsElement.scrollTop = 0;
312
322
  }
323
+ if (onOpenAction) {
324
+ this.keyDown(event);
325
+ }
313
326
  setTimeout(() => {
314
327
  this.triggerRect();
315
328
  this.cdkConnectedOverlay?.overlayRef?.updatePosition();
@@ -361,6 +374,52 @@ export class Select2 {
361
374
  isNumber(o) {
362
375
  return !isNaN(o - 0) && o !== null && o !== '' && o !== false;
363
376
  }
377
+ selectAll() {
378
+ if (this.multiple) {
379
+ if (!this.selectAllTest()) {
380
+ const options = [];
381
+ this._data.forEach(e => {
382
+ if (Select2Utils.isGroup(e)) {
383
+ e.options.forEach(f => {
384
+ if (!f.disabled && !f.hide) {
385
+ options.push(f);
386
+ }
387
+ });
388
+ }
389
+ else if (!e.disabled && !e.hide) {
390
+ options.push(e);
391
+ }
392
+ });
393
+ this.option = options;
394
+ this.value = options.map(e => e.value);
395
+ }
396
+ else {
397
+ this.option = [];
398
+ this.value = [];
399
+ }
400
+ this.isOpen = false;
401
+ this.close.emit(this);
402
+ }
403
+ }
404
+ selectAllTest() {
405
+ if (this.multiple && Array.isArray(this.option) && this.option.length) {
406
+ let options = 0;
407
+ this._data.forEach(e => {
408
+ if (Select2Utils.isGroup(e)) {
409
+ e.options.forEach(f => {
410
+ if (!f.disabled && !f.hide) {
411
+ options++;
412
+ }
413
+ });
414
+ }
415
+ else if (!e.disabled && !e.hide) {
416
+ options++;
417
+ }
418
+ });
419
+ return this.option.length === options;
420
+ }
421
+ return false;
422
+ }
364
423
  testSelection(option) {
365
424
  if (option.disabled) {
366
425
  return false;
@@ -405,20 +464,58 @@ export class Select2 {
405
464
  else {
406
465
  this.maxResultsExceeded = false;
407
466
  }
408
- if (Select2Utils.valueIsNotInFilteredData(result, this.hoveringValue)) {
409
- this.hoveringValue = Select2Utils.getFirstAvailableOption(result);
467
+ if (Select2Utils.optionIsNotInFilteredData(result, this.hoveringOption())) {
468
+ this.hoveringOption.set(Select2Utils.getFirstAvailableOption(result));
410
469
  }
411
470
  if (writeValue && this._previousNativeValue !== this._value) {
412
471
  // refresh current selected value
413
472
  this.writeValue(this._control ? this._control.value : this._value);
414
473
  }
415
- this.filteredData = result;
416
- this._changeDetectorRef.markForCheck();
474
+ this.filteredData.set(result);
475
+ // replace selected options when data change
476
+ if (this.multiple && Array.isArray(this.option) && this.option.length) {
477
+ const options = [];
478
+ const value = this.option.map(e => e.value);
479
+ this._data.forEach(e => {
480
+ if (Select2Utils.isGroup(e)) {
481
+ e.options.forEach(f => {
482
+ if (value.includes(f.value)) {
483
+ options.push(f);
484
+ }
485
+ });
486
+ }
487
+ else if (value.includes(e.value)) {
488
+ options.push(e);
489
+ }
490
+ });
491
+ // preserve selection order
492
+ this.option = this.option.map(e => options.find(f => f.value === e.value));
493
+ }
494
+ else if (!Array.isArray(this.option) && this.option) {
495
+ let option = undefined;
496
+ this._data.forEach(e => {
497
+ if (Select2Utils.isGroup(e)) {
498
+ e.options.forEach(f => {
499
+ if (this.option.value === f.value) {
500
+ option = f;
501
+ }
502
+ });
503
+ }
504
+ else if (this.option.value === e.value) {
505
+ option = e;
506
+ }
507
+ });
508
+ this.option = option;
509
+ }
510
+ this._changeDetectorRef.detectChanges();
417
511
  });
418
512
  }
419
513
  clickExit() {
420
514
  this._focus(false);
421
515
  }
516
+ isInSelect(elt) {
517
+ return this.ifParentContainsId(elt, this.id()) || this.ifParentContainsId(elt, this.idOverlay());
518
+ }
422
519
  ifParentContainsClass(element, cssClass) {
423
520
  return this.getParentElementByClass(element, cssClass) !== null;
424
521
  }
@@ -470,13 +567,13 @@ export class Select2 {
470
567
  'select2-results__option',
471
568
  ]);
472
569
  }
473
- focusin() {
570
+ focusin(options) {
474
571
  if (!this.disabled) {
475
- this._focus(true);
572
+ this._focus(true, options);
476
573
  }
477
574
  }
478
- focusout() {
479
- if (this.selectionElement && !this.selectionElement.classList.contains('select2-focused')) {
575
+ focusout(event) {
576
+ if (!event.relatedTarget || !this.isInSelect(event.relatedTarget)) {
480
577
  this._focus(false);
481
578
  this._onTouched();
482
579
  }
@@ -537,42 +634,54 @@ export class Select2 {
537
634
  return Array.isArray(val1) ? val1?.length !== val2?.length : val1 !== val2;
538
635
  }
539
636
  keyDown(event, create = false) {
540
- if (create && this._testKey(event, ['Enter', 13])) {
637
+ if (create && this._testKey(event, ['Enter'])) {
541
638
  this.createAndAdd(event);
542
639
  }
543
- else if (this._testKey(event, ['ArrowDown', 40])) {
640
+ else if (this._testKey(event, [{ key: 'ArrowDown', altKey: false }])) {
544
641
  this.moveDown();
545
642
  event.preventDefault();
546
643
  }
547
- else if (this._testKey(event, ['ArrowUp', 38])) {
644
+ else if (this._testKey(event, [{ key: 'ArrowUp', altKey: false }])) {
548
645
  this.moveUp();
549
646
  event.preventDefault();
550
647
  }
551
- else if (this._testKey(event, ['Enter', 13])) {
648
+ else if (this._testKey(event, ['Home'])) {
649
+ this.moveStart();
650
+ event.preventDefault();
651
+ }
652
+ else if (this._testKey(event, ['End'])) {
653
+ this.moveEnd();
654
+ event.preventDefault();
655
+ }
656
+ else if (this._testKey(event, ['PageUp'])) {
657
+ this.moveUp(10);
658
+ event.preventDefault();
659
+ }
660
+ else if (this._testKey(event, ['PageDown'])) {
661
+ this.moveDown(10);
662
+ event.preventDefault();
663
+ }
664
+ else if (this._testKey(event, ['Enter']) || (this.isSearchboxHidden && this._testKey(event, [' ']))) {
552
665
  this.selectByEnter();
553
666
  event.preventDefault();
554
667
  }
555
- else if (this._testKey(event, ['Escape', 'Tab', 9, 27]) && this.isOpen) {
668
+ else if (this._testKey(event, CLOSE_KEYS) && this.isOpen) {
556
669
  this.toggleOpenAndClose();
557
- this._focus(false);
670
+ this._focus(true);
558
671
  }
559
672
  }
560
673
  openKey(event, create = false) {
561
- if (create && this._testKey(event, ['Enter', 13])) {
674
+ if (create && this._testKey(event, ['Enter'])) {
562
675
  this.createAndAdd(event);
563
676
  }
564
- else if (this._testKey(event, ['ArrowDown', 'ArrowUp', 'Enter', 40, 38, 13])) {
677
+ else if (this._testKey(event, OPEN_KEYS)) {
565
678
  this.toggleOpenAndClose(true, true, event);
566
679
  event.preventDefault();
567
680
  }
568
- else if (this._testKey(event, ['Escape', 'Tab', 9, 27])) {
681
+ else if (this._testKey(event, CLOSE_KEYS)) {
569
682
  if (this.isOpen) {
570
- this.toggleOpenAndClose(false);
683
+ this.toggleOpenAndClose();
571
684
  this._onTouched();
572
- event.preventDefault();
573
- }
574
- else {
575
- this._focus(false);
576
685
  }
577
686
  }
578
687
  }
@@ -588,14 +697,14 @@ export class Select2 {
588
697
  search: this.searchText,
589
698
  data: this._data,
590
699
  filteredData: (data) => {
591
- this.filteredData = data;
700
+ this.filteredData.set(data);
592
701
  this._changeDetectorRef.markForCheck();
593
702
  },
594
703
  });
595
704
  }
596
705
  }
597
706
  trackBy(_index, item) {
598
- return item.value;
707
+ return item.value ?? item;
599
708
  }
600
709
  isSelected(option) {
601
710
  return Select2Utils.isSelected(this.option, option, this.multiple);
@@ -604,6 +713,9 @@ export class Select2 {
604
713
  return option.disabled ? 'true' : 'false';
605
714
  }
606
715
  removeSelection(e, option) {
716
+ if (this.readonly || this.disabled) {
717
+ return;
718
+ }
607
719
  Select2Utils.removeSelection(this.option, option);
608
720
  if (this.multiple && this.hideSelectedItems) {
609
721
  this.updateFilteredData();
@@ -628,7 +740,10 @@ export class Select2 {
628
740
  e.preventDefault();
629
741
  e.stopPropagation();
630
742
  if (this.isOpen) {
631
- this._focusSearchboxOrResultsElement();
743
+ this._focusSearchbox();
744
+ }
745
+ else {
746
+ this._focus(true);
632
747
  }
633
748
  }
634
749
  /**
@@ -680,6 +795,43 @@ export class Select2 {
680
795
  const isSubmitted = this._parentFormGroup?.submitted || this._parentForm?.submitted;
681
796
  return !!(isInvalid && (isTouched || isSubmitted));
682
797
  }
798
+ _selectionOverrideLabel() {
799
+ if (typeof this.selectionOverride === 'function') {
800
+ return this.selectionOverride({
801
+ size: this.optionsSize(),
802
+ options: Array.isArray(this.option) ? this.option : this.option ? [this.option] : null,
803
+ });
804
+ }
805
+ else if (typeof this.selectionOverride === 'string') {
806
+ return this.selectionOverride.replaceAll('%size%', `${this.optionsSize()}`);
807
+ }
808
+ }
809
+ getElementId(elt) {
810
+ if (!elt) {
811
+ return null;
812
+ }
813
+ const [i, j] = this._getElementPath(elt);
814
+ const toSuffix = index => (index !== undefined ? `-${index}` : '');
815
+ return elt.id ?? `${this.id()}-option${toSuffix(i)}${toSuffix(j)}`;
816
+ }
817
+ _getElementPath(elt) {
818
+ for (let i = 0; i < this._data.length; i++) {
819
+ const optionOrGroup = this._data[i];
820
+ if (optionOrGroup === elt) {
821
+ return [i];
822
+ }
823
+ else if (Select2Utils.isGroup(optionOrGroup)) {
824
+ const j = optionOrGroup.options.findIndex(o => o === elt);
825
+ if (j >= 0) {
826
+ return [i, j];
827
+ }
828
+ }
829
+ }
830
+ return [];
831
+ }
832
+ optionsSize() {
833
+ return Array.isArray(this.option) ? this.option.length : this.option ? 1 : 0;
834
+ }
683
835
  addItem(value) {
684
836
  let item = Select2Utils.getOptionByValue(this._data, value);
685
837
  if (!item) {
@@ -705,15 +857,25 @@ export class Select2 {
705
857
  }
706
858
  this.stopEvent(e);
707
859
  }
708
- moveUp() {
709
- this.updateScrollFromOption(Select2Utils.getPreviousOption(this.filteredData, this.hoveringValue));
860
+ moveUp(times = 1) {
861
+ for (let i = 0; i < times; i++) {
862
+ this.updateScrollFromOption(Select2Utils.getPreviousOption(this.filteredData(), this.hoveringOption()));
863
+ }
864
+ }
865
+ moveDown(times = 1) {
866
+ for (let i = 0; i < times; i++) {
867
+ this.updateScrollFromOption(Select2Utils.getNextOption(this.filteredData(), this.hoveringOption()));
868
+ }
869
+ }
870
+ moveStart() {
871
+ this.updateScrollFromOption(Select2Utils.getFirstOption(this.filteredData()));
710
872
  }
711
- moveDown() {
712
- this.updateScrollFromOption(Select2Utils.getNextOption(this.filteredData, this.hoveringValue));
873
+ moveEnd() {
874
+ this.updateScrollFromOption(Select2Utils.getLastOption(this.filteredData()));
713
875
  }
714
876
  updateScrollFromOption(option) {
715
877
  if (option) {
716
- this.hoveringValue = option.value;
878
+ this.hoveringOption.set(option);
717
879
  const domElement = this.results.find(r => r.nativeElement.innerText.trim() === option.label);
718
880
  if (domElement && this.resultsElement) {
719
881
  this.resultsElement.scrollTop = 0;
@@ -724,32 +886,20 @@ export class Select2 {
724
886
  }
725
887
  }
726
888
  selectByEnter() {
727
- if (this.hoveringValue) {
728
- const option = Select2Utils.getOptionByValue(this._data, this.hoveringValue);
729
- this.select(option);
889
+ if (this.hoveringOption()) {
890
+ this.select(this.hoveringOption());
730
891
  }
731
892
  }
732
893
  _testKey(event, refs = []) {
733
- return this._isKey(this._getKey(event), refs);
734
- }
735
- _getKey(event) {
736
- let code;
737
- if (event.key !== undefined) {
738
- code = event.key;
739
- }
740
- else if (event['keyIdentifier'] !== undefined) {
741
- code = event['keyIdentifier'];
742
- }
743
- else if (event['keyCode'] !== undefined) {
744
- code = event['keyCode'];
745
- }
746
- else {
747
- event.preventDefault();
748
- }
749
- return code;
750
- }
751
- _isKey(code, refs = []) {
752
- return refs && refs.length > 0 ? refs.indexOf(code) !== -1 : false;
894
+ const { key, altKey } = event;
895
+ return refs.some(ref => {
896
+ if (typeof ref === 'string') {
897
+ return ref === key;
898
+ }
899
+ else {
900
+ return key === ref.key && altKey === ref.altKey;
901
+ }
902
+ });
753
903
  }
754
904
  /**
755
905
  * Sets the selected option based on a value. If no option can be
@@ -811,19 +961,34 @@ export class Select2 {
811
961
  this._stateChanges.next();
812
962
  }
813
963
  }
814
- _focusSearchboxOrResultsElement(focus = true) {
964
+ _focusSearchbox(focus = true) {
815
965
  if (!this.isSearchboxHidden) {
816
966
  setTimeout(() => {
817
967
  if (this.searchInput && this.searchInput.nativeElement && focus) {
818
968
  this.searchInput.nativeElement.focus();
819
969
  }
820
970
  });
821
- if (this.resultsElement && focus) {
822
- this.resultsElement.focus();
971
+ }
972
+ }
973
+ _focus(state, options) {
974
+ if (state) {
975
+ const eltToFocus = !this.isSearchboxHidden && this.isOpen ? this.searchInput.nativeElement : this.selection.nativeElement;
976
+ if (document.activeElement !== eltToFocus) {
977
+ eltToFocus.focus(options);
823
978
  }
824
979
  }
980
+ else if (document.activeElement === this.selection?.nativeElement ||
981
+ document.activeElement === this.searchInput?.nativeElement) {
982
+ document.activeElement.blur();
983
+ }
984
+ this._updateFocusState(state);
825
985
  }
826
- _focus(state) {
986
+ _isAbobeOverlay() {
987
+ return this.overlay && this._overlayPosition && this.listPosition === 'auto'
988
+ ? this._overlayPosition === 'top'
989
+ : this.listPosition === 'above';
990
+ }
991
+ _updateFocusState(state) {
827
992
  if (!state && this.focused) {
828
993
  this.focused = state;
829
994
  this.blur.emit(this);
@@ -833,17 +998,14 @@ export class Select2 {
833
998
  this.focus.emit(this);
834
999
  }
835
1000
  }
836
- _isAbobeOverlay() {
837
- return this.overlay && this._overlayPosition && this.listPosition === 'auto'
838
- ? this._overlayPosition === 'top'
839
- : this.listPosition === 'above';
840
- }
841
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", 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 }); }
842
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.2", type: Select2, selector: "select2", inputs: { data: "data", minCharForSearch: ["minCharForSearch", "minCharForSearch", numberAttribute], displaySearchStatus: "displaySearchStatus", placeholder: "placeholder", limitSelection: ["limitSelection", "limitSelection", numberAttribute], listPosition: "listPosition", multiple: ["multiple", "multiple", booleanAttribute], overlay: ["overlay", "overlay", booleanAttribute], styleMode: "styleMode", noResultMessage: "noResultMessage", maxResults: ["maxResults", "maxResults", numberAttribute], maxResultsMessage: "maxResultsMessage", infiniteScrollDistance: ["infiniteScrollDistance", "infiniteScrollDistance", numberAttribute], infiniteScrollThrottle: ["infiniteScrollThrottle", "infiniteScrollThrottle", numberAttribute], infiniteScroll: ["infiniteScroll", "infiniteScroll", booleanAttribute], autoCreate: ["autoCreate", "autoCreate", booleanAttribute], noLabelTemplate: ["noLabelTemplate", "noLabelTemplate", booleanAttribute], editPattern: "editPattern", templates: "templates", templateSelection: "templateSelection", resultMaxHeight: "resultMaxHeight", customSearchEnabled: ["customSearchEnabled", "customSearchEnabled", booleanAttribute], minCountForSearch: ["minCountForSearch", "minCountForSearch", numberAttribute], id: "id", required: ["required", "required", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], hideSelectedItems: ["hideSelectedItems", "hideSelectedItems", booleanAttribute], readonly: ["readonly", "readonly", booleanAttribute], value: "value", tabIndex: ["tabIndex", "tabIndex", numberAttribute], resettable: ["resettable", "resettable", booleanAttribute], resetSelectedValue: "resetSelectedValue", grid: "grid" }, outputs: { update: "update", autoCreateItem: "autoCreateItem", open: "open", close: "close", focus: "focus", blur: "blur", search: "search", scroll: "scroll", removeOption: "removeOption" }, host: { listeners: { "document:click": "clickDetection($event)" }, properties: { "id": "this.id", "attr.aria-invalid": "this.ariaInvalid", "class.material": "this.classMaterial", "class.nostyle": "this.classNostyle", "class.borderless": "this.classBorderless", "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 @if (required) {\n <span class=\"select2-required\"></span>\n }\n</div>\n\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 @if (!multiple) {\n <span class=\"select2-selection__rendered\" [title]=\"select2Option?.label || ''\">\n @if (!select2Option) {\n <span>&nbsp;</span>\n }\n @if (select2Option) {\n @if (!hasTemplate(select2Option, 'option', true) || noLabelTemplate) {\n <span [innerHTML]=\"select2Option.label\"></span>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(select2Option, 'option', true); context: select2Option\"\n ></ng-container>\n }\n }\n <span\n [class.select2-selection__placeholder__option]=\"option\"\n class=\"select2-selection__placeholder\"\n >{{ placeholder }}</span\n >\n </span>\n }\n @if (!multiple && resettable && resetSelectedValue !== value && select2Option && !(disabled || readonly)) {\n <span (click)=\"reset($event)\" class=\"select2-selection__reset\" role=\"presentation\">\u00D7</span>\n }\n @if (!multiple) {\n <span class=\"select2-selection__arrow\" role=\"presentation\"> </span>\n }\n @if (multiple) {\n <ul class=\"select2-selection__rendered\">\n @if (!autoCreate) {\n <span\n [class.select2-selection__placeholder__option]=\"select2Options?.length > 0\"\n class=\"select2-selection__placeholder\"\n >{{ placeholder }}</span\n >\n }\n @for (op of option || []; track trackBy($index, op)) {\n <li\n class=\"select2-selection__choice\"\n [title]=\"op.label\"\n tabindex=\"0\"\n (keydown.enter)=\"removeSelection($event, op)\"\n >\n @if (!(disabled || readonly)) {\n <span\n (click)=\"removeSelection($event, op)\"\n class=\"select2-selection__choice__remove\"\n role=\"presentation\"\n >\u00D7</span\n >\n }\n @if (!hasTemplate(op, 'option', true) || noLabelTemplate) {\n <span [innerHTML]=\"op.label\"></span>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(op, 'option', true); context: op\"\n ></ng-container>\n }\n </li>\n }\n @if (autoCreate) {\n <li\n class=\"select2-selection__auto-create\"\n (focus)=\"stopEvent($event)\"\n (blur)=\"stopEvent($event)\"\n >\n <input\n [id]=\"id + '-create-field'\"\n (click)=\"toggleOpenAndClose(false, true); stopEvent($event)\"\n (keydown)=\"keyDown($event, true)\"\n (keyup)=\"searchUpdate($event)\"\n (change)=\"prevChange($event)\"\n class=\"select2-create__field\"\n type=\"search\"\n role=\"textbox\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n />\n </li>\n }\n </ul>\n }\n </div>\n </div>\n @if (!overlay) {\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n }\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 [class.select2-style-borderless]=\"styleMode === 'borderless'\"\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, autoCreate)\"\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 [class.select2-grid]=\"grid && isNumber(grid)\"\n [class.select2-grid-auto]=\"grid && !isNumber(grid)\"\n [style.max-height]=\"resultMaxHeight\"\n [style.--grid-size]=\"grid || null\"\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 @for (groupOrOption of filteredData; track trackBy(i, groupOrOption); let i = $index) {\n @if (groupOrOption.options !== undefined) {\n <li class=\"select2-results__option\" role=\"group\">\n @if (!hasTemplate(groupOrOption, 'group')) {\n <strong\n [attr.class]=\"\n 'select2-results__group' +\n (groupOrOption.classes ? ' ' + groupOrOption.classes : '')\n \"\n [innerHTML]=\"groupOrOption.label\"\n ></strong>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'group'); context: groupOrOption\"\n >\n </ng-container>\n }\n <ul class=\"select2-results__options select2-results__options--nested\">\n @for (option of groupOrOption.options; track trackBy(j, option); let j = $index) {\n <li\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 @if (!hasTemplate(option, 'option')) {\n <div class=\"select2-label-content\" [innerHTML]=\"option.label\"></div>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(option, 'option'); context: option\"\n >\n </ng-container>\n }\n </li>\n }\n </ul>\n </li>\n } @else {\n <li\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 @if (!hasTemplate(groupOrOption, 'option')) {\n <div [innerHTML]=\"groupOrOption.label\" class=\"select2-label-content\"></div>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\"\n >\n </ng-container>\n }\n <ng-template #li>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\"\n >\n </ng-container>\n </ng-template>\n </li>\n }\n }\n @if (!filteredData?.length && noResultMessage) {\n <li class=\"select2-no-result select2-results__option\" [innerHTML]=\"noResultMessage\"></li>\n }\n @if (maxResultsExceeded) {\n <li\n class=\"select2-too-much-result select2-results__option\"\n [innerHTML]=\"maxResultsMessage\"\n ></li>\n }\n </ul>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".select2-label{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:var(--select2-single-height, 28px);-webkit-user-select:none;user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding:var(--select2-selection-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:var(--select2-multiple-height, 28px);-webkit-user-select:none;user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-flex;overflow:hidden;padding-left:8px;padding-bottom:2px;text-overflow:ellipsis;white-space:nowrap;flex-wrap:wrap;gap:var(--select2-selection-multiple-gap, 2px 5px)}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-selection__auto-create{flex:1 1 150px;min-width:150px;display:flex}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-create__field{width:100%;border:0}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-create__field:focus{border:0;outline:0}.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:var(--select2-dropdown-background, white);border:1px solid var(--select2-dropdown-border-color, #aaa);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:var(--select2-option-padding, 6px);-webkit-user-select:none;user-select:none;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:var(--select2-dropdown-above-border-bottom, none);border-bottom-left-radius:var(--select2-dropdown-above-border-bottom-left-radius, 0);border-bottom-right-radius:var(--select2-dropdown-above-border-bottom-right-radius, 0);bottom:27px;display:flex;flex-direction:column-reverse}.select2-container--open .select2-dropdown--below{border-top:var(--select2-dropdown-below-border-top, none);border-top-left-radius:var(--select2-dropdown-below-border-top-left-radius, 0);border-top-right-radius:var(--select2-dropdown-below-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}.select2-required:before{content:\"*\";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:var(--select2-selection-background, #fff);border:1px solid var(--select2-selection-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);display:flex}.select2-container--default .select2-selection--single .select2-selection__rendered{color:var(--select2-selection-text-color, #111);line-height:var(--select2-selection-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:var(--select2-placeholder-color, #999)}.select2-container--default .select2-selection--single .select2-selection__placeholder span{overflow:hidden;white-space:nowrap;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: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:var(--select2-reset-color, #999)}.select2-container--default.select2-container--disabled .select2-selection--single{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 var(--select2-arrow-color, #888);border-width:0 4px 5px}.select2-container--default .select2-selection--multiple{background:var(--select2-selection-background, #fff);border:1px solid var(--select2-selection-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);cursor:text;display:flex}.select2-container--default .select2-selection--multiple .select2-selection__rendered{flex:1 1 auto;box-sizing:border-box;list-style:none;margin:0;padding:var(--select2-selection-multiple-padding, 2px 5px);width:100%;min-height:1em;align-items:center}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none;line-height:var(--select2-selection-choice-line-height, 20px)}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{display:block;width:100%;color:var(--select2-placeholder-color, #999);margin-top:5px;float:left;overflow:hidden;white-space:nowrap;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:var(--select2-selection-choice-text-color, #000);background:var(--select2-selection-choice-background, #e4e4e4);border:1px solid var(--select2-selection-choice-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);cursor:default;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{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:var(--select2-selection-choice-hover-close-color, #333)}.select2-container--default.select2-container--focused .select2-selection--multiple{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 var(--select2-selection-focus-border-color, #000) 1px;outline:none}.select2-container--default.select2-container--disabled .select2-selection--multiple{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 var(--select2-search-border-color, #aaa);background:1px solid var(--select2-search-background, #fff);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;grid-column:col-start/col-end}.select2-container--default .select2-results__option[aria-disabled=true]{color:var(--select2-option-disabled-text-color, #999);background:var(--select2-option-disabled-background, transparent)}.select2-container--default .select2-results__option[aria-selected=true]{color:var(--select2-option-selected-text-color, #000);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:var(--select2-option-highlighted-background, #5897fb);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:var(--select2-option-group-text-color, gray);background:var(--select2-option-group-background, transparent)}.select2-no-result{color:var(--select2-no-result-color, #888);font-style:var(--select2-no-result-font-style, italic)}.select2-too-much-result{color:var(--select2-too-much-result-color, #888);font-style:var(--select2-too-much-font-style, italic)}.select2-grid,.select2-grid ul{display:grid;grid-template-columns:[col-start] repeat(var(--grid-size),1fr) [col-end]}.select2-grid-auto,.select2-grid-auto ul{display:grid;grid-template-columns:[col-start] repeat(auto-fill,minmax(var(--grid-size, 100px),1fr)) [col-end]}.select2-container--default .select2-grid ul,.select2-container--default .select2-grid-auto ul{padding-left:var(--select2-option-padding, 6px)}.select2-container--default .select2-grid ul .select2-results__group,.select2-container--default .select2-grid-auto ul .select2-results__group{padding-left:0}.select2-container--default .select2-grid ul .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{padding-left:var(--select2-option-padding, 6px)}: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.borderless{--select2-dropdown-above-border-bottom: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-above-border-bottom-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-above-border-bottom-right-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-below-border-top-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top-right-radius: var(--select2-selection-border-radius, 4px)}:host.borderless .select2-selection--single,:host.borderless .select2-selection--multiple{background:transparent;border-color:transparent}:host.borderless .select2-container--default .select2-focused .select2-selection--single,:host.borderless .select2-container--default .select2-focused .select2-selection--multiple,:host.borderless .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,:host.borderless .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: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: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: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:var(--select2-material-option-selected-background, rgba(0, 0, 0, .04));color:var(--select2-material-option-highlighted-text-color, #000)}:host.material .select2-container--default .select2-results__option[aria-selected=true]{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: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: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:var(--select2-hint-text-color, #888)}::ng-deep .select2-overlay-backdrop{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}::ng-deep .cdk-overlay-container .select2-style-borderless{--select2-dropdown-above-border-bottom: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-above-border-bottom-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-above-border-bottom-right-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-below-border-top-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top-right-radius: var(--select2-selection-border-radius, 4px)}@supports (-moz-appearance: none){select2.material .select2-container--default .select2-selection--single,select2.material .select2-container--default .select2-selection--multiple{height:26px}}\n"], dependencies: [{ 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", "cdkConnectedOverlayDisposeOnNavigation"], 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"] }] }); }
1001
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", 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 }); }
1002
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: Select2, selector: "select2", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: false, isRequired: true, transformFunction: null }, minCharForSearch: { classPropertyName: "minCharForSearch", publicName: "minCharForSearch", isSignal: false, isRequired: false, transformFunction: numberAttribute }, displaySearchStatus: { classPropertyName: "displaySearchStatus", publicName: "displaySearchStatus", isSignal: false, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, limitSelection: { classPropertyName: "limitSelection", publicName: "limitSelection", isSignal: false, isRequired: false, transformFunction: numberAttribute }, listPosition: { classPropertyName: "listPosition", publicName: "listPosition", isSignal: false, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, overlay: { classPropertyName: "overlay", publicName: "overlay", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, styleMode: { classPropertyName: "styleMode", publicName: "styleMode", isSignal: false, isRequired: false, transformFunction: null }, noResultMessage: { classPropertyName: "noResultMessage", publicName: "noResultMessage", isSignal: false, isRequired: false, transformFunction: null }, maxResults: { classPropertyName: "maxResults", publicName: "maxResults", isSignal: false, isRequired: false, transformFunction: numberAttribute }, maxResultsMessage: { classPropertyName: "maxResultsMessage", publicName: "maxResultsMessage", isSignal: false, isRequired: false, transformFunction: null }, infiniteScrollDistance: { classPropertyName: "infiniteScrollDistance", publicName: "infiniteScrollDistance", isSignal: false, isRequired: false, transformFunction: numberAttribute }, infiniteScrollThrottle: { classPropertyName: "infiniteScrollThrottle", publicName: "infiniteScrollThrottle", isSignal: false, isRequired: false, transformFunction: numberAttribute }, infiniteScroll: { classPropertyName: "infiniteScroll", publicName: "infiniteScroll", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, autoCreate: { classPropertyName: "autoCreate", publicName: "autoCreate", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, noLabelTemplate: { classPropertyName: "noLabelTemplate", publicName: "noLabelTemplate", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, editPattern: { classPropertyName: "editPattern", publicName: "editPattern", isSignal: false, isRequired: false, transformFunction: null }, templates: { classPropertyName: "templates", publicName: "templates", isSignal: false, isRequired: false, transformFunction: null }, templateSelection: { classPropertyName: "templateSelection", publicName: "templateSelection", isSignal: false, isRequired: false, transformFunction: null }, resultMaxHeight: { classPropertyName: "resultMaxHeight", publicName: "resultMaxHeight", isSignal: false, isRequired: false, transformFunction: null }, customSearchEnabled: { classPropertyName: "customSearchEnabled", publicName: "customSearchEnabled", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, minCountForSearch: { classPropertyName: "minCountForSearch", publicName: "minCountForSearch", isSignal: false, isRequired: false, transformFunction: numberAttribute }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "ariaLabelledby", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedby: { classPropertyName: "ariaDescribedby", publicName: "ariaDescribedby", isSignal: true, isRequired: false, transformFunction: null }, ariaInvalid: { classPropertyName: "ariaInvalid", publicName: "ariaInvalid", isSignal: true, isRequired: false, transformFunction: null }, ariaResetButtonDescription: { classPropertyName: "ariaResetButtonDescription", publicName: "ariaResetButtonDescription", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, hideSelectedItems: { classPropertyName: "hideSelectedItems", publicName: "hideSelectedItems", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, value: { classPropertyName: "value", publicName: "value", isSignal: false, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: false, isRequired: false, transformFunction: numberAttribute }, resettable: { classPropertyName: "resettable", publicName: "resettable", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, resetSelectedValue: { classPropertyName: "resetSelectedValue", publicName: "resetSelectedValue", isSignal: false, isRequired: false, transformFunction: null }, grid: { classPropertyName: "grid", publicName: "grid", isSignal: false, isRequired: false, transformFunction: null }, selectionOverride: { classPropertyName: "selectionOverride", publicName: "selectionOverride", isSignal: false, isRequired: false, transformFunction: null }, selectionNoWrap: { classPropertyName: "selectionNoWrap", publicName: "selectionNoWrap", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, showSelectAll: { classPropertyName: "showSelectAll", publicName: "showSelectAll", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, removeAllText: { classPropertyName: "removeAllText", publicName: "removeAllText", isSignal: false, isRequired: false, transformFunction: null }, selectAllText: { classPropertyName: "selectAllText", publicName: "selectAllText", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { update: "update", autoCreateItem: "autoCreateItem", open: "open", close: "close", focus: "focus", blur: "blur", search: "search", scroll: "scroll", removeOption: "removeOption" }, host: { listeners: { "document:click": "clickDetection($event)" }, properties: { "id": "id()", "class.select2-selection-nowrap": "this.selectionNoWrap", "class.material": "this.classMaterial", "class.nostyle": "this.classNostyle", "class.borderless": "this.classBorderless", "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: "<label class=\"select2-label\" (click)=\"toggleOpenAndClose()\" [id]=\"idLabel()\">\n <ng-content select=\"select2-label\"></ng-content>\n @if (required) {\n <span class=\"select2-required\" aria-hidden=\"true\"></span>\n }\n</label>\n\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 [class.select2-container--readonly]=\"readonly\"\n>\n <div\n [id]=\"idCombo()\"\n role=\"combobox\"\n class=\"selection\"\n #selection\n #trigger=\"cdkOverlayOrigin\"\n [tabindex]=\"!this.isOpen ? tabIndex : '-1'\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? idLabel()\"\n [attr.aria-expanded]=\"isOpen\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"idOptions()\"\n [attr.aria-activedescendant]=\"isOpen ? hoveringOptionId() : null\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.title]=\"title()\"\n [attr.aria-invalid]=\"_isErrorState() || ariaInvalid() ? 'true' : null\"\n [attr.aria-required]=\"required ? 'true' : null\"\n [attr.aria-readonly]=\"readonly ? 'true' : null\"\n [attr.aria-disabled]=\"disabled ? 'true' : null\"\n (click)=\"toggleOpenAndClose()\"\n (focus)=\"focusin()\"\n (focusout)=\"focusout($event)\"\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 >\n @if (selectionOverride) {\n <span class=\"select2-selection__override\" [innerHTML]=\"_selectionOverrideLabel()\"></span>\n @if (\n !multiple && resettable && resetSelectedValue !== value && select2Option && !(disabled || readonly)\n ) {\n <ng-container *ngTemplateOutlet=\"resetButton\"></ng-container>\n }\n } @else if (!multiple) {\n <span class=\"select2-selection__rendered\" [title]=\"select2Option?.label || ''\">\n @if (!select2Option) {\n <span>&nbsp;</span>\n }\n @if (select2Option) {\n @if (!hasTemplate(select2Option, 'option', true) || noLabelTemplate) {\n <span [innerHTML]=\"select2Option.label\"></span>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(select2Option, 'option', true); context: select2Option\"\n ></ng-container>\n }\n }\n <span\n [class.select2-selection__placeholder__option]=\"option\"\n class=\"select2-selection__placeholder\"\n >{{ placeholder }}</span\n >\n </span>\n @if (resettable && resetSelectedValue !== value && select2Option && !(disabled || readonly)) {\n <ng-container *ngTemplateOutlet=\"resetButton\"></ng-container>\n }\n <span class=\"select2-selection__arrow\" role=\"presentation\"> </span>\n } @else {\n <ul class=\"select2-selection__rendered\">\n @if (!autoCreate) {\n <span\n [class.select2-selection__placeholder__option]=\"select2Options?.length > 0\"\n class=\"select2-selection__placeholder\"\n >{{ placeholder }}</span\n >\n }\n @for (op of option || []; track trackBy($index, op)) {\n <li\n class=\"select2-selection__choice\"\n [title]=\"op.label\"\n tabindex=\"0\"\n (focus)=\"_updateFocusState(true)\"\n (keydown.enter)=\"removeSelection($event, op)\"\n >\n @if (!(disabled || readonly)) {\n <span\n (click)=\"removeSelection($event, op)\"\n class=\"select2-selection__choice__remove\"\n role=\"presentation\"\n aria-hidden=\"true\"\n >\u00D7</span\n >\n }\n @if (!hasTemplate(op, 'option', true) || noLabelTemplate) {\n <span [innerHTML]=\"op.label\"></span>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(op, 'option', true); context: op\"\n ></ng-container>\n }\n </li>\n }\n @if (autoCreate) {\n <li\n class=\"select2-selection__auto-create\"\n (focus)=\"stopEvent($event)\"\n (blur)=\"stopEvent($event)\"\n >\n <input\n [id]=\"id() + '-create-field'\"\n (click)=\"toggleOpenAndClose(false, true); stopEvent($event)\"\n (keydown)=\"keyDown($event, true)\"\n (keyup)=\"searchUpdate($event)\"\n (change)=\"prevChange($event)\"\n class=\"select2-create__field\"\n type=\"search\"\n role=\"textbox\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n />\n </li>\n }\n </ul>\n }\n </div>\n </div>\n @if (!overlay) {\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n }\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 [id]=\"idOverlay()\"\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 [class.select2-style-borderless]=\"styleMode === 'borderless'\"\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]=\"isSearchboxHidden\">\n <input\n #searchInput\n [id]=\"id() + '-search-field'\"\n [value]=\"searchText\"\n (keydown)=\"keyDown($event, autoCreate)\"\n (keyup)=\"searchUpdate($event)\"\n (change)=\"prevChange($event)\"\n class=\"select2-search__field\"\n type=\"search\"\n role=\"combobox\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n [attr.tabindex]=\"this.isOpen ? tabIndex : '-1'\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? idLabel()\"\n aria-autocomplete=\"list\"\n [attr.aria-controls]=\"idOptions()\"\n aria-expanded=\"true\"\n [attr.aria-activedescendant]=\"hoveringOptionId()\"\n />\n </div>\n\n <div class=\"select2-results\">\n <ul\n [id]=\"idOptions()\"\n #results\n class=\"select2-results__options\"\n [class.select2-grid]=\"grid && isNumber(grid)\"\n [class.select2-grid-auto]=\"grid && !isNumber(grid)\"\n [style.max-height]=\"resultMaxHeight\"\n [style.--grid-size]=\"grid || null\"\n role=\"listbox\"\n tabindex=\"-1\"\n infiniteScroll\n [infiniteScrollDisabled]=\"!infiniteScroll && !isOpen\"\n [infiniteScrollDistance]=\"infiniteScrollDistance\"\n [infiniteScrollThrottle]=\"infiniteScrollThrottle\"\n [infiniteScrollContainer]=\"results\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? idLabel()\"\n [attr.aria-multiselectable]=\"multiple\"\n [attr.aria-activedescendant]=\"hoveringOptionId()\"\n (scrolled)=\"onScroll('down')\"\n (scrolledUp)=\"onScroll('up')\"\n (keydown)=\"keyDown($event)\"\n >\n @if (showSelectAll && multiple) {\n <li\n class=\"select2-results__option select2-selectall\"\n (click)=\"selectAll()\"\n tabindex=\"1\"\n aria-selected\n >\n <div class=\"select2-label-content\">\n {{ selectAllTest() ? removeAllText : selectAllText }}\n </div>\n </li>\n }\n\n @for (groupOrOption of filteredData(); track trackBy(i, groupOrOption); let i = $index) {\n @if (groupOrOption.options !== undefined) {\n <li class=\"select2-results__option select2-results__group\">\n <span [id]=\"getElementId(groupOrOption)\">\n @if (!hasTemplate(groupOrOption, 'group')) {\n <strong\n [attr.class]=\"\n 'select2-results__group' +\n (groupOrOption.classes ? ' ' + groupOrOption.classes : '')\n \"\n [innerHTML]=\"groupOrOption.label\"\n ></strong>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"\n getTemplate(groupOrOption, 'group');\n context: groupOrOption\n \"\n >\n </ng-container>\n }\n </span>\n <ul\n class=\"select2-results__options select2-results__options--nested\"\n role=\"group\"\n [attr.aria-labelledby]=\"getElementId(groupOrOption)\"\n >\n @for (option of groupOrOption.options; track trackBy(j, option); let j = $index) {\n <li\n #result\n [id]=\"getElementId(option)\"\n [class]=\"getOptionStyle(option)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-disabled]=\"isDisabled(option)\"\n (mouseenter)=\"mouseenter(option)\"\n (click)=\"click(option)\"\n >\n @if (!hasTemplate(option, 'option')) {\n <div class=\"select2-label-content\" [innerHTML]=\"option.label\"></div>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(option, 'option'); context: option\"\n >\n </ng-container>\n }\n </li>\n }\n </ul>\n </li>\n } @else {\n <li\n #result\n [id]=\"getElementId(groupOrOption)\"\n [class]=\"getOptionStyle(groupOrOption)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(groupOrOption)\"\n [attr.aria-disabled]=\"isDisabled(groupOrOption)\"\n (mouseenter)=\"mouseenter(groupOrOption)\"\n (click)=\"click(groupOrOption)\"\n >\n @if (!hasTemplate(groupOrOption, 'option')) {\n <div [innerHTML]=\"groupOrOption.label\" class=\"select2-label-content\"></div>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\"\n >\n </ng-container>\n }\n </li>\n\n <ng-template #li>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\"\n >\n </ng-container>\n </ng-template>\n }\n }\n @if (!filteredData()?.length && noResultMessage) {\n <li class=\"select2-no-result select2-results__option\" [innerHTML]=\"noResultMessage\"></li>\n }\n @if (maxResultsExceeded) {\n <li\n class=\"select2-too-much-result select2-results__option\"\n [innerHTML]=\"maxResultsMessage\"\n ></li>\n }\n </ul>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #resetButton>\n <button\n type=\"button\"\n (focus)=\"_updateFocusState(true)\"\n (click)=\"reset($event)\"\n (keydown)=\"$event.stopPropagation()\"\n class=\"select2-selection__reset\"\n [attr.aria-description]=\"ariaResetButtonDescription()\"\n [attr.aria-controls]=\"idCombo()\"\n >\n <span aria-hidden=\"true\">\u00D7</span>\n </button>\n</ng-template>\n", styles: [".select2-label{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:var(--select2-single-height, 28px);-webkit-user-select:none;user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding:var(--select2-selection-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:var(--select2-multiple-height, 28px);-webkit-user-select:none;user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-flex;overflow:hidden;padding-left:8px;padding-bottom:2px;text-overflow:ellipsis;white-space:nowrap;flex-wrap:wrap;gap:var(--select2-selection-multiple-gap, 2px 5px)}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-selection__auto-create{flex:1 1 150px;min-width:150px;display:flex}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-create__field{width:100%;border:0}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-create__field:focus{border:0;outline:0}.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:var(--select2-dropdown-background, white);border:1px solid var(--select2-dropdown-border-color, #aaa);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:var(--select2-option-padding, 6px);-webkit-user-select:none;user-select:none;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:var(--select2-dropdown-above-border-bottom, none);border-bottom-left-radius:var(--select2-dropdown-above-border-bottom-left-radius, 0);border-bottom-right-radius:var(--select2-dropdown-above-border-bottom-right-radius, 0);bottom:27px;display:flex;flex-direction:column-reverse}.select2-container--open .select2-dropdown--below{border-top:var(--select2-dropdown-below-border-top, none);border-top-left-radius:var(--select2-dropdown-below-border-top-left-radius, 0);border-top-right-radius:var(--select2-dropdown-below-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}.select2-required:before{content:\"*\";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:var(--select2-selection-background, #fff);border:1px solid var(--select2-selection-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);display:flex}.select2-container--default .select2-selection--single .select2-selection__rendered{color:var(--select2-selection-text-color, #111);line-height:var(--select2-selection-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:var(--select2-placeholder-color, #999)}.select2-container--default .select2-selection--single .select2-selection__placeholder span{overflow:hidden;white-space:nowrap;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__override{flex:1;margin:0 5px}.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: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:var(--select2-reset-color, #999);background:var(--select2-reset-background, transparent);border:var(--select2-reset-border, none);border-radius:var(--select2-reset-border-radius, 4px);height:fit-content;align-self:center}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove,.select2-container--default.select2-container--readonly .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--readonly .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--disabled .select2-selection--single,.select2-container--default.select2-container--disabled .select2-selection--multiple{cursor:default;background:var(--select2-selection-disabled-background, #eee)}.select2-container--default.select2-container--readonly .select2-selection--single,.select2-container--default.select2-container--readonly .select2-selection--multiple{background:var(--select2-selection-readonly-background, #eee)}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow:before{border-color:transparent transparent var(--select2-arrow-color, #888);border-width:0 4px 5px}.select2-container--default .select2-selection--multiple{background:var(--select2-selection-background, #fff);border:1px solid var(--select2-selection-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);cursor:text;display:flex}.select2-container--default .select2-selection--multiple .select2-selection__rendered{flex:1 1 auto;box-sizing:border-box;list-style:none;margin:0;padding:var(--select2-selection-multiple-padding, 2px 5px);width:100%;min-height:1em;align-items:center}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none;line-height:var(--select2-selection-choice-line-height, 20px)}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{display:block;width:100%;color:var(--select2-placeholder-color, #999);margin-top:5px;float:left;overflow:hidden;white-space:nowrap;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__override{flex:1;margin:0 5px}.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:var(--select2-selection-choice-text-color, #000);background:var(--select2-selection-choice-background, #e4e4e4);border:1px solid var(--select2-selection-choice-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);cursor:default;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{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:var(--select2-selection-choice-hover-close-color, #333)}.select2-container--default.select2-container--focused .select2-selection--multiple{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 var(--select2-selection-focus-border-color, #000) 1px;outline: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 var(--select2-search-border-color, #aaa);background:1px solid var(--select2-search-background, #fff);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.select2-results__group{padding:0;grid-column:col-start/col-end}.select2-container--default .select2-results__option[aria-disabled=true]{color:var(--select2-option-disabled-text-color, #999);background:var(--select2-option-disabled-background, transparent)}.select2-container--default .select2-results__option[aria-selected=true]{color:var(--select2-option-selected-text-color, #000);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:var(--select2-option-highlighted-background, #5897fb);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:var(--select2-option-group-text-color, gray);background:var(--select2-option-group-background, transparent)}.select2-no-result{color:var(--select2-no-result-color, #888);font-style:var(--select2-no-result-font-style, italic)}.select2-too-much-result{color:var(--select2-too-much-result-color, #888);font-style:var(--select2-too-much-font-style, italic)}.select2-grid,.select2-grid ul{display:grid;grid-template-columns:[col-start] repeat(var(--grid-size),1fr) [col-end]}.select2-grid-auto,.select2-grid-auto ul{display:grid;grid-template-columns:[col-start] repeat(auto-fill,minmax(var(--grid-size, 100px),1fr)) [col-end]}.select2-container--default .select2-grid ul,.select2-container--default .select2-grid-auto ul{padding-left:var(--select2-option-padding, 6px)}.select2-container--default .select2-grid ul .select2-results__group,.select2-container--default .select2-grid-auto ul .select2-results__group{padding-left:0}.select2-container--default .select2-grid ul .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{padding-left:var(--select2-option-padding, 6px)}: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.borderless{--select2-dropdown-above-border-bottom: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-above-border-bottom-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-above-border-bottom-right-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-below-border-top-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top-right-radius: var(--select2-selection-border-radius, 4px)}:host.borderless .select2-selection--single,:host.borderless .select2-selection--multiple{background:transparent;border-color:transparent}:host.borderless .select2-container--default .select2-focused .select2-selection--single,:host.borderless .select2-container--default .select2-focused .select2-selection--multiple,:host.borderless .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,:host.borderless .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple{background:transparent;border-color:transparent}:host.select2-selection-nowrap .select2-selection--single.select2-selection,:host.select2-selection-nowrap .select2-selection--single.select2-selection span,:host.select2-selection-nowrap .select2-selection--single.select2-selection ul,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection span,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection ul{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host.select2-selection-nowrap .select2-selection--single.select2-selection ul,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection ul{display:flex;flex-wrap:nowrap}: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: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: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: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:var(--select2-material-option-selected-background, rgba(0, 0, 0, .04));color:var(--select2-material-option-highlighted-text-color, #000)}:host.material .select2-container--default .select2-results__option[aria-selected=true]{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,:host.material .select2-container--default.select2-container--readonly .select2-selection--single,:host.material .select2-container--default.select2-container--readonly .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: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 .select2-container--default.select2-container--readonly .select2-selection--single:before,:host.material .select2-container--default.select2-container--readonly .select2-selection--multiple:before{background:var(--select2-material-underline-readonly, 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: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:var(--select2-hint-text-color, #888)}::ng-deep .select2-overlay-backdrop{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}::ng-deep .cdk-overlay-container .select2-style-borderless{--select2-dropdown-above-border-bottom: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-above-border-bottom-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-above-border-bottom-right-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-below-border-top-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top-right-radius: var(--select2-selection-border-radius, 4px)}@supports (-moz-appearance: none){select2.material .select2-container--default .select2-selection--single,select2.material .select2-container--default .select2-selection--multiple{height:26px}}\n"], dependencies: [{ 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", "cdkConnectedOverlayDisposeOnNavigation"], 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"] }] }); }
843
1003
  }
844
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: Select2, decorators: [{
1004
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Select2, decorators: [{
845
1005
  type: Component,
846
- args: [{ selector: 'select2', template: "<div class=\"select2-label\" (click)=\"toggleOpenAndClose()\">\n <ng-content select=\"select2-label\"></ng-content>\n @if (required) {\n <span class=\"select2-required\"></span>\n }\n</div>\n\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 @if (!multiple) {\n <span class=\"select2-selection__rendered\" [title]=\"select2Option?.label || ''\">\n @if (!select2Option) {\n <span>&nbsp;</span>\n }\n @if (select2Option) {\n @if (!hasTemplate(select2Option, 'option', true) || noLabelTemplate) {\n <span [innerHTML]=\"select2Option.label\"></span>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(select2Option, 'option', true); context: select2Option\"\n ></ng-container>\n }\n }\n <span\n [class.select2-selection__placeholder__option]=\"option\"\n class=\"select2-selection__placeholder\"\n >{{ placeholder }}</span\n >\n </span>\n }\n @if (!multiple && resettable && resetSelectedValue !== value && select2Option && !(disabled || readonly)) {\n <span (click)=\"reset($event)\" class=\"select2-selection__reset\" role=\"presentation\">\u00D7</span>\n }\n @if (!multiple) {\n <span class=\"select2-selection__arrow\" role=\"presentation\"> </span>\n }\n @if (multiple) {\n <ul class=\"select2-selection__rendered\">\n @if (!autoCreate) {\n <span\n [class.select2-selection__placeholder__option]=\"select2Options?.length > 0\"\n class=\"select2-selection__placeholder\"\n >{{ placeholder }}</span\n >\n }\n @for (op of option || []; track trackBy($index, op)) {\n <li\n class=\"select2-selection__choice\"\n [title]=\"op.label\"\n tabindex=\"0\"\n (keydown.enter)=\"removeSelection($event, op)\"\n >\n @if (!(disabled || readonly)) {\n <span\n (click)=\"removeSelection($event, op)\"\n class=\"select2-selection__choice__remove\"\n role=\"presentation\"\n >\u00D7</span\n >\n }\n @if (!hasTemplate(op, 'option', true) || noLabelTemplate) {\n <span [innerHTML]=\"op.label\"></span>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(op, 'option', true); context: op\"\n ></ng-container>\n }\n </li>\n }\n @if (autoCreate) {\n <li\n class=\"select2-selection__auto-create\"\n (focus)=\"stopEvent($event)\"\n (blur)=\"stopEvent($event)\"\n >\n <input\n [id]=\"id + '-create-field'\"\n (click)=\"toggleOpenAndClose(false, true); stopEvent($event)\"\n (keydown)=\"keyDown($event, true)\"\n (keyup)=\"searchUpdate($event)\"\n (change)=\"prevChange($event)\"\n class=\"select2-create__field\"\n type=\"search\"\n role=\"textbox\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n />\n </li>\n }\n </ul>\n }\n </div>\n </div>\n @if (!overlay) {\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n }\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 [class.select2-style-borderless]=\"styleMode === 'borderless'\"\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, autoCreate)\"\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 [class.select2-grid]=\"grid && isNumber(grid)\"\n [class.select2-grid-auto]=\"grid && !isNumber(grid)\"\n [style.max-height]=\"resultMaxHeight\"\n [style.--grid-size]=\"grid || null\"\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 @for (groupOrOption of filteredData; track trackBy(i, groupOrOption); let i = $index) {\n @if (groupOrOption.options !== undefined) {\n <li class=\"select2-results__option\" role=\"group\">\n @if (!hasTemplate(groupOrOption, 'group')) {\n <strong\n [attr.class]=\"\n 'select2-results__group' +\n (groupOrOption.classes ? ' ' + groupOrOption.classes : '')\n \"\n [innerHTML]=\"groupOrOption.label\"\n ></strong>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'group'); context: groupOrOption\"\n >\n </ng-container>\n }\n <ul class=\"select2-results__options select2-results__options--nested\">\n @for (option of groupOrOption.options; track trackBy(j, option); let j = $index) {\n <li\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 @if (!hasTemplate(option, 'option')) {\n <div class=\"select2-label-content\" [innerHTML]=\"option.label\"></div>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(option, 'option'); context: option\"\n >\n </ng-container>\n }\n </li>\n }\n </ul>\n </li>\n } @else {\n <li\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 @if (!hasTemplate(groupOrOption, 'option')) {\n <div [innerHTML]=\"groupOrOption.label\" class=\"select2-label-content\"></div>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\"\n >\n </ng-container>\n }\n <ng-template #li>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\"\n >\n </ng-container>\n </ng-template>\n </li>\n }\n }\n @if (!filteredData?.length && noResultMessage) {\n <li class=\"select2-no-result select2-results__option\" [innerHTML]=\"noResultMessage\"></li>\n }\n @if (maxResultsExceeded) {\n <li\n class=\"select2-too-much-result select2-results__option\"\n [innerHTML]=\"maxResultsMessage\"\n ></li>\n }\n </ul>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".select2-label{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:var(--select2-single-height, 28px);-webkit-user-select:none;user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding:var(--select2-selection-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:var(--select2-multiple-height, 28px);-webkit-user-select:none;user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-flex;overflow:hidden;padding-left:8px;padding-bottom:2px;text-overflow:ellipsis;white-space:nowrap;flex-wrap:wrap;gap:var(--select2-selection-multiple-gap, 2px 5px)}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-selection__auto-create{flex:1 1 150px;min-width:150px;display:flex}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-create__field{width:100%;border:0}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-create__field:focus{border:0;outline:0}.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:var(--select2-dropdown-background, white);border:1px solid var(--select2-dropdown-border-color, #aaa);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:var(--select2-option-padding, 6px);-webkit-user-select:none;user-select:none;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:var(--select2-dropdown-above-border-bottom, none);border-bottom-left-radius:var(--select2-dropdown-above-border-bottom-left-radius, 0);border-bottom-right-radius:var(--select2-dropdown-above-border-bottom-right-radius, 0);bottom:27px;display:flex;flex-direction:column-reverse}.select2-container--open .select2-dropdown--below{border-top:var(--select2-dropdown-below-border-top, none);border-top-left-radius:var(--select2-dropdown-below-border-top-left-radius, 0);border-top-right-radius:var(--select2-dropdown-below-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}.select2-required:before{content:\"*\";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:var(--select2-selection-background, #fff);border:1px solid var(--select2-selection-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);display:flex}.select2-container--default .select2-selection--single .select2-selection__rendered{color:var(--select2-selection-text-color, #111);line-height:var(--select2-selection-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:var(--select2-placeholder-color, #999)}.select2-container--default .select2-selection--single .select2-selection__placeholder span{overflow:hidden;white-space:nowrap;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: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:var(--select2-reset-color, #999)}.select2-container--default.select2-container--disabled .select2-selection--single{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 var(--select2-arrow-color, #888);border-width:0 4px 5px}.select2-container--default .select2-selection--multiple{background:var(--select2-selection-background, #fff);border:1px solid var(--select2-selection-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);cursor:text;display:flex}.select2-container--default .select2-selection--multiple .select2-selection__rendered{flex:1 1 auto;box-sizing:border-box;list-style:none;margin:0;padding:var(--select2-selection-multiple-padding, 2px 5px);width:100%;min-height:1em;align-items:center}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none;line-height:var(--select2-selection-choice-line-height, 20px)}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{display:block;width:100%;color:var(--select2-placeholder-color, #999);margin-top:5px;float:left;overflow:hidden;white-space:nowrap;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:var(--select2-selection-choice-text-color, #000);background:var(--select2-selection-choice-background, #e4e4e4);border:1px solid var(--select2-selection-choice-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);cursor:default;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{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:var(--select2-selection-choice-hover-close-color, #333)}.select2-container--default.select2-container--focused .select2-selection--multiple{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 var(--select2-selection-focus-border-color, #000) 1px;outline:none}.select2-container--default.select2-container--disabled .select2-selection--multiple{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 var(--select2-search-border-color, #aaa);background:1px solid var(--select2-search-background, #fff);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;grid-column:col-start/col-end}.select2-container--default .select2-results__option[aria-disabled=true]{color:var(--select2-option-disabled-text-color, #999);background:var(--select2-option-disabled-background, transparent)}.select2-container--default .select2-results__option[aria-selected=true]{color:var(--select2-option-selected-text-color, #000);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:var(--select2-option-highlighted-background, #5897fb);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:var(--select2-option-group-text-color, gray);background:var(--select2-option-group-background, transparent)}.select2-no-result{color:var(--select2-no-result-color, #888);font-style:var(--select2-no-result-font-style, italic)}.select2-too-much-result{color:var(--select2-too-much-result-color, #888);font-style:var(--select2-too-much-font-style, italic)}.select2-grid,.select2-grid ul{display:grid;grid-template-columns:[col-start] repeat(var(--grid-size),1fr) [col-end]}.select2-grid-auto,.select2-grid-auto ul{display:grid;grid-template-columns:[col-start] repeat(auto-fill,minmax(var(--grid-size, 100px),1fr)) [col-end]}.select2-container--default .select2-grid ul,.select2-container--default .select2-grid-auto ul{padding-left:var(--select2-option-padding, 6px)}.select2-container--default .select2-grid ul .select2-results__group,.select2-container--default .select2-grid-auto ul .select2-results__group{padding-left:0}.select2-container--default .select2-grid ul .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{padding-left:var(--select2-option-padding, 6px)}: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.borderless{--select2-dropdown-above-border-bottom: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-above-border-bottom-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-above-border-bottom-right-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-below-border-top-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top-right-radius: var(--select2-selection-border-radius, 4px)}:host.borderless .select2-selection--single,:host.borderless .select2-selection--multiple{background:transparent;border-color:transparent}:host.borderless .select2-container--default .select2-focused .select2-selection--single,:host.borderless .select2-container--default .select2-focused .select2-selection--multiple,:host.borderless .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,:host.borderless .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: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: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: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:var(--select2-material-option-selected-background, rgba(0, 0, 0, .04));color:var(--select2-material-option-highlighted-text-color, #000)}:host.material .select2-container--default .select2-results__option[aria-selected=true]{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: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: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:var(--select2-hint-text-color, #888)}::ng-deep .select2-overlay-backdrop{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}::ng-deep .cdk-overlay-container .select2-style-borderless{--select2-dropdown-above-border-bottom: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-above-border-bottom-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-above-border-bottom-right-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-below-border-top-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top-right-radius: var(--select2-selection-border-radius, 4px)}@supports (-moz-appearance: none){select2.material .select2-container--default .select2-selection--single,select2.material .select2-container--default .select2-selection--multiple{height:26px}}\n"] }]
1006
+ args: [{ selector: 'select2', host: {
1007
+ '[id]': 'id()',
1008
+ }, template: "<label class=\"select2-label\" (click)=\"toggleOpenAndClose()\" [id]=\"idLabel()\">\n <ng-content select=\"select2-label\"></ng-content>\n @if (required) {\n <span class=\"select2-required\" aria-hidden=\"true\"></span>\n }\n</label>\n\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 [class.select2-container--readonly]=\"readonly\"\n>\n <div\n [id]=\"idCombo()\"\n role=\"combobox\"\n class=\"selection\"\n #selection\n #trigger=\"cdkOverlayOrigin\"\n [tabindex]=\"!this.isOpen ? tabIndex : '-1'\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? idLabel()\"\n [attr.aria-expanded]=\"isOpen\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"idOptions()\"\n [attr.aria-activedescendant]=\"isOpen ? hoveringOptionId() : null\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.title]=\"title()\"\n [attr.aria-invalid]=\"_isErrorState() || ariaInvalid() ? 'true' : null\"\n [attr.aria-required]=\"required ? 'true' : null\"\n [attr.aria-readonly]=\"readonly ? 'true' : null\"\n [attr.aria-disabled]=\"disabled ? 'true' : null\"\n (click)=\"toggleOpenAndClose()\"\n (focus)=\"focusin()\"\n (focusout)=\"focusout($event)\"\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 >\n @if (selectionOverride) {\n <span class=\"select2-selection__override\" [innerHTML]=\"_selectionOverrideLabel()\"></span>\n @if (\n !multiple && resettable && resetSelectedValue !== value && select2Option && !(disabled || readonly)\n ) {\n <ng-container *ngTemplateOutlet=\"resetButton\"></ng-container>\n }\n } @else if (!multiple) {\n <span class=\"select2-selection__rendered\" [title]=\"select2Option?.label || ''\">\n @if (!select2Option) {\n <span>&nbsp;</span>\n }\n @if (select2Option) {\n @if (!hasTemplate(select2Option, 'option', true) || noLabelTemplate) {\n <span [innerHTML]=\"select2Option.label\"></span>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(select2Option, 'option', true); context: select2Option\"\n ></ng-container>\n }\n }\n <span\n [class.select2-selection__placeholder__option]=\"option\"\n class=\"select2-selection__placeholder\"\n >{{ placeholder }}</span\n >\n </span>\n @if (resettable && resetSelectedValue !== value && select2Option && !(disabled || readonly)) {\n <ng-container *ngTemplateOutlet=\"resetButton\"></ng-container>\n }\n <span class=\"select2-selection__arrow\" role=\"presentation\"> </span>\n } @else {\n <ul class=\"select2-selection__rendered\">\n @if (!autoCreate) {\n <span\n [class.select2-selection__placeholder__option]=\"select2Options?.length > 0\"\n class=\"select2-selection__placeholder\"\n >{{ placeholder }}</span\n >\n }\n @for (op of option || []; track trackBy($index, op)) {\n <li\n class=\"select2-selection__choice\"\n [title]=\"op.label\"\n tabindex=\"0\"\n (focus)=\"_updateFocusState(true)\"\n (keydown.enter)=\"removeSelection($event, op)\"\n >\n @if (!(disabled || readonly)) {\n <span\n (click)=\"removeSelection($event, op)\"\n class=\"select2-selection__choice__remove\"\n role=\"presentation\"\n aria-hidden=\"true\"\n >\u00D7</span\n >\n }\n @if (!hasTemplate(op, 'option', true) || noLabelTemplate) {\n <span [innerHTML]=\"op.label\"></span>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(op, 'option', true); context: op\"\n ></ng-container>\n }\n </li>\n }\n @if (autoCreate) {\n <li\n class=\"select2-selection__auto-create\"\n (focus)=\"stopEvent($event)\"\n (blur)=\"stopEvent($event)\"\n >\n <input\n [id]=\"id() + '-create-field'\"\n (click)=\"toggleOpenAndClose(false, true); stopEvent($event)\"\n (keydown)=\"keyDown($event, true)\"\n (keyup)=\"searchUpdate($event)\"\n (change)=\"prevChange($event)\"\n class=\"select2-create__field\"\n type=\"search\"\n role=\"textbox\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n />\n </li>\n }\n </ul>\n }\n </div>\n </div>\n @if (!overlay) {\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n }\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 [id]=\"idOverlay()\"\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 [class.select2-style-borderless]=\"styleMode === 'borderless'\"\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]=\"isSearchboxHidden\">\n <input\n #searchInput\n [id]=\"id() + '-search-field'\"\n [value]=\"searchText\"\n (keydown)=\"keyDown($event, autoCreate)\"\n (keyup)=\"searchUpdate($event)\"\n (change)=\"prevChange($event)\"\n class=\"select2-search__field\"\n type=\"search\"\n role=\"combobox\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n [attr.tabindex]=\"this.isOpen ? tabIndex : '-1'\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? idLabel()\"\n aria-autocomplete=\"list\"\n [attr.aria-controls]=\"idOptions()\"\n aria-expanded=\"true\"\n [attr.aria-activedescendant]=\"hoveringOptionId()\"\n />\n </div>\n\n <div class=\"select2-results\">\n <ul\n [id]=\"idOptions()\"\n #results\n class=\"select2-results__options\"\n [class.select2-grid]=\"grid && isNumber(grid)\"\n [class.select2-grid-auto]=\"grid && !isNumber(grid)\"\n [style.max-height]=\"resultMaxHeight\"\n [style.--grid-size]=\"grid || null\"\n role=\"listbox\"\n tabindex=\"-1\"\n infiniteScroll\n [infiniteScrollDisabled]=\"!infiniteScroll && !isOpen\"\n [infiniteScrollDistance]=\"infiniteScrollDistance\"\n [infiniteScrollThrottle]=\"infiniteScrollThrottle\"\n [infiniteScrollContainer]=\"results\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? idLabel()\"\n [attr.aria-multiselectable]=\"multiple\"\n [attr.aria-activedescendant]=\"hoveringOptionId()\"\n (scrolled)=\"onScroll('down')\"\n (scrolledUp)=\"onScroll('up')\"\n (keydown)=\"keyDown($event)\"\n >\n @if (showSelectAll && multiple) {\n <li\n class=\"select2-results__option select2-selectall\"\n (click)=\"selectAll()\"\n tabindex=\"1\"\n aria-selected\n >\n <div class=\"select2-label-content\">\n {{ selectAllTest() ? removeAllText : selectAllText }}\n </div>\n </li>\n }\n\n @for (groupOrOption of filteredData(); track trackBy(i, groupOrOption); let i = $index) {\n @if (groupOrOption.options !== undefined) {\n <li class=\"select2-results__option select2-results__group\">\n <span [id]=\"getElementId(groupOrOption)\">\n @if (!hasTemplate(groupOrOption, 'group')) {\n <strong\n [attr.class]=\"\n 'select2-results__group' +\n (groupOrOption.classes ? ' ' + groupOrOption.classes : '')\n \"\n [innerHTML]=\"groupOrOption.label\"\n ></strong>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"\n getTemplate(groupOrOption, 'group');\n context: groupOrOption\n \"\n >\n </ng-container>\n }\n </span>\n <ul\n class=\"select2-results__options select2-results__options--nested\"\n role=\"group\"\n [attr.aria-labelledby]=\"getElementId(groupOrOption)\"\n >\n @for (option of groupOrOption.options; track trackBy(j, option); let j = $index) {\n <li\n #result\n [id]=\"getElementId(option)\"\n [class]=\"getOptionStyle(option)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-disabled]=\"isDisabled(option)\"\n (mouseenter)=\"mouseenter(option)\"\n (click)=\"click(option)\"\n >\n @if (!hasTemplate(option, 'option')) {\n <div class=\"select2-label-content\" [innerHTML]=\"option.label\"></div>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(option, 'option'); context: option\"\n >\n </ng-container>\n }\n </li>\n }\n </ul>\n </li>\n } @else {\n <li\n #result\n [id]=\"getElementId(groupOrOption)\"\n [class]=\"getOptionStyle(groupOrOption)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(groupOrOption)\"\n [attr.aria-disabled]=\"isDisabled(groupOrOption)\"\n (mouseenter)=\"mouseenter(groupOrOption)\"\n (click)=\"click(groupOrOption)\"\n >\n @if (!hasTemplate(groupOrOption, 'option')) {\n <div [innerHTML]=\"groupOrOption.label\" class=\"select2-label-content\"></div>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\"\n >\n </ng-container>\n }\n </li>\n\n <ng-template #li>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\"\n >\n </ng-container>\n </ng-template>\n }\n }\n @if (!filteredData()?.length && noResultMessage) {\n <li class=\"select2-no-result select2-results__option\" [innerHTML]=\"noResultMessage\"></li>\n }\n @if (maxResultsExceeded) {\n <li\n class=\"select2-too-much-result select2-results__option\"\n [innerHTML]=\"maxResultsMessage\"\n ></li>\n }\n </ul>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #resetButton>\n <button\n type=\"button\"\n (focus)=\"_updateFocusState(true)\"\n (click)=\"reset($event)\"\n (keydown)=\"$event.stopPropagation()\"\n class=\"select2-selection__reset\"\n [attr.aria-description]=\"ariaResetButtonDescription()\"\n [attr.aria-controls]=\"idCombo()\"\n >\n <span aria-hidden=\"true\">\u00D7</span>\n </button>\n</ng-template>\n", styles: [".select2-label{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:var(--select2-single-height, 28px);-webkit-user-select:none;user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding:var(--select2-selection-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:var(--select2-multiple-height, 28px);-webkit-user-select:none;user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-flex;overflow:hidden;padding-left:8px;padding-bottom:2px;text-overflow:ellipsis;white-space:nowrap;flex-wrap:wrap;gap:var(--select2-selection-multiple-gap, 2px 5px)}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-selection__auto-create{flex:1 1 150px;min-width:150px;display:flex}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-create__field{width:100%;border:0}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-create__field:focus{border:0;outline:0}.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:var(--select2-dropdown-background, white);border:1px solid var(--select2-dropdown-border-color, #aaa);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:var(--select2-option-padding, 6px);-webkit-user-select:none;user-select:none;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:var(--select2-dropdown-above-border-bottom, none);border-bottom-left-radius:var(--select2-dropdown-above-border-bottom-left-radius, 0);border-bottom-right-radius:var(--select2-dropdown-above-border-bottom-right-radius, 0);bottom:27px;display:flex;flex-direction:column-reverse}.select2-container--open .select2-dropdown--below{border-top:var(--select2-dropdown-below-border-top, none);border-top-left-radius:var(--select2-dropdown-below-border-top-left-radius, 0);border-top-right-radius:var(--select2-dropdown-below-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}.select2-required:before{content:\"*\";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:var(--select2-selection-background, #fff);border:1px solid var(--select2-selection-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);display:flex}.select2-container--default .select2-selection--single .select2-selection__rendered{color:var(--select2-selection-text-color, #111);line-height:var(--select2-selection-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:var(--select2-placeholder-color, #999)}.select2-container--default .select2-selection--single .select2-selection__placeholder span{overflow:hidden;white-space:nowrap;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__override{flex:1;margin:0 5px}.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: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:var(--select2-reset-color, #999);background:var(--select2-reset-background, transparent);border:var(--select2-reset-border, none);border-radius:var(--select2-reset-border-radius, 4px);height:fit-content;align-self:center}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove,.select2-container--default.select2-container--readonly .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--readonly .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--disabled .select2-selection--single,.select2-container--default.select2-container--disabled .select2-selection--multiple{cursor:default;background:var(--select2-selection-disabled-background, #eee)}.select2-container--default.select2-container--readonly .select2-selection--single,.select2-container--default.select2-container--readonly .select2-selection--multiple{background:var(--select2-selection-readonly-background, #eee)}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow:before{border-color:transparent transparent var(--select2-arrow-color, #888);border-width:0 4px 5px}.select2-container--default .select2-selection--multiple{background:var(--select2-selection-background, #fff);border:1px solid var(--select2-selection-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);cursor:text;display:flex}.select2-container--default .select2-selection--multiple .select2-selection__rendered{flex:1 1 auto;box-sizing:border-box;list-style:none;margin:0;padding:var(--select2-selection-multiple-padding, 2px 5px);width:100%;min-height:1em;align-items:center}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none;line-height:var(--select2-selection-choice-line-height, 20px)}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{display:block;width:100%;color:var(--select2-placeholder-color, #999);margin-top:5px;float:left;overflow:hidden;white-space:nowrap;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__override{flex:1;margin:0 5px}.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:var(--select2-selection-choice-text-color, #000);background:var(--select2-selection-choice-background, #e4e4e4);border:1px solid var(--select2-selection-choice-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);cursor:default;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{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:var(--select2-selection-choice-hover-close-color, #333)}.select2-container--default.select2-container--focused .select2-selection--multiple{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 var(--select2-selection-focus-border-color, #000) 1px;outline: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 var(--select2-search-border-color, #aaa);background:1px solid var(--select2-search-background, #fff);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.select2-results__group{padding:0;grid-column:col-start/col-end}.select2-container--default .select2-results__option[aria-disabled=true]{color:var(--select2-option-disabled-text-color, #999);background:var(--select2-option-disabled-background, transparent)}.select2-container--default .select2-results__option[aria-selected=true]{color:var(--select2-option-selected-text-color, #000);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:var(--select2-option-highlighted-background, #5897fb);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:var(--select2-option-group-text-color, gray);background:var(--select2-option-group-background, transparent)}.select2-no-result{color:var(--select2-no-result-color, #888);font-style:var(--select2-no-result-font-style, italic)}.select2-too-much-result{color:var(--select2-too-much-result-color, #888);font-style:var(--select2-too-much-font-style, italic)}.select2-grid,.select2-grid ul{display:grid;grid-template-columns:[col-start] repeat(var(--grid-size),1fr) [col-end]}.select2-grid-auto,.select2-grid-auto ul{display:grid;grid-template-columns:[col-start] repeat(auto-fill,minmax(var(--grid-size, 100px),1fr)) [col-end]}.select2-container--default .select2-grid ul,.select2-container--default .select2-grid-auto ul{padding-left:var(--select2-option-padding, 6px)}.select2-container--default .select2-grid ul .select2-results__group,.select2-container--default .select2-grid-auto ul .select2-results__group{padding-left:0}.select2-container--default .select2-grid ul .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{padding-left:var(--select2-option-padding, 6px)}: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.borderless{--select2-dropdown-above-border-bottom: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-above-border-bottom-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-above-border-bottom-right-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-below-border-top-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top-right-radius: var(--select2-selection-border-radius, 4px)}:host.borderless .select2-selection--single,:host.borderless .select2-selection--multiple{background:transparent;border-color:transparent}:host.borderless .select2-container--default .select2-focused .select2-selection--single,:host.borderless .select2-container--default .select2-focused .select2-selection--multiple,:host.borderless .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,:host.borderless .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple{background:transparent;border-color:transparent}:host.select2-selection-nowrap .select2-selection--single.select2-selection,:host.select2-selection-nowrap .select2-selection--single.select2-selection span,:host.select2-selection-nowrap .select2-selection--single.select2-selection ul,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection span,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection ul{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host.select2-selection-nowrap .select2-selection--single.select2-selection ul,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection ul{display:flex;flex-wrap:nowrap}: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: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: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: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:var(--select2-material-option-selected-background, rgba(0, 0, 0, .04));color:var(--select2-material-option-highlighted-text-color, #000)}:host.material .select2-container--default .select2-results__option[aria-selected=true]{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,:host.material .select2-container--default.select2-container--readonly .select2-selection--single,:host.material .select2-container--default.select2-container--readonly .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: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 .select2-container--default.select2-container--readonly .select2-selection--single:before,:host.material .select2-container--default.select2-container--readonly .select2-selection--multiple:before{background:var(--select2-material-underline-readonly, 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: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:var(--select2-hint-text-color, #888)}::ng-deep .select2-overlay-backdrop{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}::ng-deep .cdk-overlay-container .select2-style-borderless{--select2-dropdown-above-border-bottom: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-above-border-bottom-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-above-border-bottom-right-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-below-border-top-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top-right-radius: var(--select2-selection-border-radius, 4px)}@supports (-moz-appearance: none){select2.material .select2-container--default .select2-selection--single,select2.material .select2-container--default .select2-selection--multiple{height:26px}}\n"] }]
847
1009
  }], ctorParameters: () => [{ type: i1.ViewportRuler }, { type: i0.ChangeDetectorRef }, { type: i2.NgForm, decorators: [{
848
1010
  type: Optional
849
1011
  }] }, { type: i2.FormGroupDirective, decorators: [{
@@ -914,11 +1076,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImpor
914
1076
  }], minCountForSearch: [{
915
1077
  type: Input,
916
1078
  args: [{ transform: numberAttribute }]
917
- }], id: [{
918
- type: Input
919
- }, {
920
- type: HostBinding,
921
- args: ['id']
922
1079
  }], required: [{
923
1080
  type: Input,
924
1081
  args: [{ transform: booleanAttribute }]
@@ -943,6 +1100,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImpor
943
1100
  type: Input
944
1101
  }], grid: [{
945
1102
  type: Input
1103
+ }], selectionOverride: [{
1104
+ type: Input
1105
+ }], selectionNoWrap: [{
1106
+ type: HostBinding,
1107
+ args: ['class.select2-selection-nowrap']
1108
+ }, {
1109
+ type: Input,
1110
+ args: [{ transform: booleanAttribute }]
1111
+ }], showSelectAll: [{
1112
+ type: Input,
1113
+ args: [{ transform: booleanAttribute }]
1114
+ }], removeAllText: [{
1115
+ type: Input
1116
+ }], selectAllText: [{
1117
+ type: Input
946
1118
  }], update: [{
947
1119
  type: Output
948
1120
  }], autoCreateItem: [{
@@ -961,9 +1133,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImpor
961
1133
  type: Output
962
1134
  }], removeOption: [{
963
1135
  type: Output
964
- }], ariaInvalid: [{
965
- type: HostBinding,
966
- args: ['attr.aria-invalid']
967
1136
  }], classMaterial: [{
968
1137
  type: HostBinding,
969
1138
  args: ['class.material']
@@ -998,4 +1167,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImpor
998
1167
  type: HostListener,
999
1168
  args: ['document:click', ['$event']]
1000
1169
  }] } });
1001
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0Mi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1zZWxlY3QyLWNvbXBvbmVudC9zcmMvbGliL3NlbGVjdDIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctc2VsZWN0Mi1jb21wb25lbnQvc3JjL2xpYi9zZWxlY3QyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxtQkFBbUIsR0FJdEIsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBRUgsU0FBUyxFQUVULFNBQVMsRUFFVCxZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBQ0osV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGVBQWUsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7QUFFL0MsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBRXJCLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBT2hFLE1BQU0sT0FBTyxPQUFPO0lBR2hCLG1DQUFtQztJQUNuQyxJQUErQixJQUFJLENBQUMsSUFBaUI7UUFDakQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFRRCxJQUNJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLEtBQWM7UUFDdkIsSUFBSSxDQUFDLFNBQVMs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WTtzQkFEZixXQUFXO3VCQUFDLHFCQUFxQjtnQkFrQk0sbUJBQW1CO3NCQUExRCxTQUFTO3VCQUFDLG1CQUFtQjtnQkFDb0IsU0FBUztzQkFBMUQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNWLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsU0FBUztnQkFDWSxPQUFPO3NCQUF0QyxZQUFZO3VCQUFDLFFBQVE7Z0JBQ1ksV0FBVztzQkFBNUMsU0FBUzt1QkFBQyxhQUFhO2dCQUNPLFFBQVE7c0JBQXRDLFNBQVM7dUJBQUMsVUFBVTtnQkEyQ3JCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcbiAgICBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UsXG4gICAgQ29ubmVjdGVkUG9zaXRpb24sXG4gICAgVmVydGljYWxDb25uZWN0aW9uUG9zLFxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBWaWV3cG9ydFJ1bGVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRSZWYsIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIEF0dHJpYnV0ZSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRG9DaGVjayxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgU2VsZixcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgbnVtYmVyQXR0cmlidXRlLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5nQ29udHJvbCwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gICAgU2VsZWN0MkF1dG9DcmVhdGVFdmVudCxcbiAgICBTZWxlY3QyRGF0YSxcbiAgICBTZWxlY3QyR3JvdXAsXG4gICAgU2VsZWN0Mk9wdGlvbixcbiAgICBTZWxlY3QyUmVtb3ZlRXZlbnQsXG4gICAgU2VsZWN0MlNjcm9sbEV2ZW50LFxuICAgIFNlbGVjdDJTZWFyY2hFdmVudCxcbiAgICBTZWxlY3QyVXBkYXRlRXZlbnQsXG4gICAgU2VsZWN0MlVwZGF0ZVZhbHVlLFxuICAgIFNlbGVjdDJWYWx1ZSxcbn0gZnJvbSAnLi9zZWxlY3QyLWludGVyZmFjZXMnO1xuaW1wb3J0IHsgU2VsZWN0MlV0aWxzIH0gZnJvbSAnLi9zZWxlY3QyLXV0aWxzJztcblxubGV0IG5leHRVbmlxdWVJZCA9IDA7XG5cbmNvbnN0IGRpc3BsYXlTZWFyY2hTdGF0dXNMaXN0ID0gWydkZWZhdWx0JywgJ2hpZGRlbicsICdhbHdheXMnXTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzZWxlY3QyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0Mi5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0Mi5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3QyIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgRG9DaGVjaywgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgX2RhdGE6IFNlbGVjdDJEYXRhO1xuXG4gICAgLyoqIGRhdGEgb2Ygb3B0aW9ucyAmIG9wdGlvbmdycHMgKi9cbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBzZXQgZGF0YShkYXRhOiBTZWxlY3QyRGF0YSkge1xuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJlZERhdGEodHJ1ZSk7XG4gICAgfVxuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIG1pbkNoYXJGb3JTZWFyY2ggPSAwO1xuICAgIEBJbnB1dCgpIGRpc3BsYXlTZWFyY2hTdGF0dXM6ICdkZWZhdWx0JyB8ICdoaWRkZW4nIHwgJ2Fsd2F5cyc7XG4gICAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcblxuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIGxpbWl0U2VsZWN0aW9uID0gMDtcbiAgICBASW5wdXQoKSBsaXN0UG9zaXRpb246ICdhYm92ZScgfCAnYmVsb3cnIHwgJ2F1dG8nID0gJ2JlbG93JztcblxuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIGdldCBtdWx0aXBsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX211bHRpcGxlO1xuICAgIH1cbiAgICBzZXQgbXVsdGlwbGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fbXVsdGlwbGUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5uZ09uSW5pdCgpO1xuICAgIH1cblxuICAgIC8qKiB1c2UgdGhlIG1hdGVyaWFsIHN0eWxlICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgb3ZlcmxheSA9IGZhbHNlO1xuXG4gICAgLyoqIHVzZSB0aGUgbWF0ZXJpYWwgc3R5bGUgKi9cbiAgICBASW5wdXQoKSBzdHlsZU1vZGU6ICdtYXRlcmlhbCcgfCAnbm9TdHlsZScgfCAnYm9yZGVybGVzcycgfCAnZGVmYXVsdCcgPSAnZGVmYXVsdCc7XG5cbiAgICAvKiogbWVzc2FnZSB3aGVuIG5vIHJlc3VsdCAqL1xuICAgIEBJbnB1dCgpIG5vUmVzdWx0TWVzc2FnZTogc3RyaW5nO1xuXG4gICAgLyoqIG1heGltdW0gcmVzdWx0cyBsaW1pdCAoMCA9IG5vIGxpbWl0KSAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIG1heFJlc3VsdHMgPSAwO1xuXG4gICAgLyoqIG1lc3NhZ2Ugd2hlbiBtYXhpbXVtIHJlc3VsdHMgKi9cbiAgICBASW5wdXQoKSBtYXhSZXN1bHRzTWVzc2FnZSA9ICdUb28gbWFueSByZXN1bHRz4oCmJztcblxuICAgIC8qKiBpbmZpbml0ZSBzY3JvbGwgZGlzdGFuY2UgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBpbmZpbml0ZVNjcm9sbERpc3RhbmNlID0gMS41O1xuXG4gICAgLyoqIGluZmluaXRlIHNjcm9sbCBkaXN0YW5jZSAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIGluZmluaXRlU2Nyb2xsVGhyb3R0bGUgPSAxNTA7XG5cbiAgICAvKiogaW5maW5pdGUgc2Nyb2xsIGFjdGl2YXRlZCAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBpbmZpbml0ZVNjcm9sbCA9IGZhbHNlO1xuXG4gICAgLyoqIGF1dG8gY3JlYXRlIGlmIG5vdCBleGlzdCAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBhdXRvQ3JlYXRlID0gZmFsc2U7XG5cbiAgICAvKiogbm8gdGVtcGxhdGUgZm9yIGxhYmVsIHNlbGVjdGlvbiAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBub0xhYmVsVGVtcGxhdGUgPSBmYWxzZTtcblxuICAgIC8qKiB1c2UgaXQgZm9yIGNoYW5nZSB0aGUgcGF0dGVybiBvZiB0aGUgZmlsdGVyIHNlYXJjaCAqL1xuICAgIEBJbnB1dCgpIGVkaXRQYXR0ZXJuOiAoc3RyOiBzdHJpbmcpID0+IHN0cmluZztcblxuICAgIC8qKiB0ZW1wbGF0ZShzKSBmb3IgZm9ybWF0dGluZyAqL1xuICAgIEBJbnB1dCgpIHRlbXBsYXRlczogVGVtcGxhdGVSZWY8YW55PiB8IHsgW2tleTogc3RyaW5nXTogVGVtcGxhdGVSZWY8YW55PiB9O1xuXG4gICAgLyoqIHRlbXBsYXRlIGZvciBmb3JtYXR0aW5nIHNlbGVjdGVkIG9wdGlvbiAqL1xuICAgIEBJbnB1dCgpIHRlbXBsYXRlU2VsZWN0aW9uOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIHRoZSBtYXggaGVpZ2h0IG9mIHRoZSByZXN1bHRzIGNvbnRhaW5lciB3aGVuIG9wZW5pbmcgdGhlIHNlbGVjdCAqL1xuICAgIEBJbnB1dCgpIHJlc3VsdE1heEhlaWdodCA9ICcyMDBweCc7XG5cbiAgICAvKiogQWN0aXZlIFNlYXJjaCBldmVudCAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjdXN0b21TZWFyY2hFbmFibGVkID0gZmFsc2U7XG5cbiAgICAvKiogbWluaW1hbCBkYXRhIG9mIHNob3cgdGhlIHNlYXJjaCBmaWVsZCAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gICAgZ2V0IG1pbkNvdW50Rm9yU2VhcmNoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW5Db3VudEZvclNlYXJjaDtcbiAgICB9XG4gICAgc2V0IG1pbkNvdW50Rm9yU2VhcmNoKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fbWluQ291bnRGb3JTZWFyY2ggPSB2YWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVTZWFyY2hCb3goKTtcbiAgICB9XG5cbiAgICAvKiogVW5pcXVlIGlkIG9mIHRoZSBlbGVtZW50LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgQEhvc3RCaW5kaW5nKCdpZCcpXG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faWQ7XG4gICAgfVxuICAgIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2lkID0gdmFsdWUgfHwgdGhpcy5fdWlkO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIHJlcXVpcmVkLiAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlIGhpZGRlbi4gKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250cm9sID8gdGhpcy5fY29udHJvbC5kaXNhYmxlZCA6IHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cbiAgICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogV2hldGhlciBpdGVtcyBhcmUgaGlkZGVuIHdoZW4gaGFzLiAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBoaWRlU2VsZWN0ZWRJdGVtcyA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgcmVhZG9ubHkuICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgICAvKiogVGhlIGlucHV0IGVsZW1lbnQncyB2YWx1ZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCB2YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICBzZXQgdmFsdWUodmFsdWU6IFNlbGVjdDJVcGRhdGVWYWx1ZSkge1xuICAgICAgICBpZiAodGhpcy50ZXN0VmFsdWVDaGFuZ2UodGhpcy5fdmFsdWUsIHZhbHVlKSkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZSA/PyBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUodmFsdWUgPz8gbnVsbCk7XG4gICAgICAgICAgICB9LCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGFiIGluZGV4IGZvciB0aGUgc2VsZWN0MiBlbGVtZW50LiAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gICAgZ2V0IHRhYkluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkID8gLTEgOiB0aGlzLl90YWJJbmRleDtcbiAgICB9XG4gICAgc2V0IHRhYkluZGV4KHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fdGFiSW5kZXggPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogcmVzZXQgd2l0aCBubyBzZWxlY3RlZCB2YWx1ZSAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHJlc2V0dGFibGUgPSBmYWxzZTtcblxuICAgIC8qKiBzZWxlY3RlZCB2YWx1ZSB3aGVuIMOXIGlzIGNsaWNrZWQgKi9cbiAgICBASW5wdXQoKSByZXNldFNlbGVjdGVkVmFsdWU6IGFueTtcblxuICAgIC8qKiBncmlkOiBpdGVtIGJ5IGxpbmVcbiAgICAgKiAqIDAgPSBubyBncmlkXG4gICAgICogKiBudW1iZXIgPSBpdGVtIGJ5IGxpbmUgKDQpXG4gICAgICogKiBzdHJpbmcgPSBtaW5pbWFsIHNpemUgaXRlbSAoMTAwcHgpXG4gICAgICovXG4gICAgQElucHV0KCkgZ3JpZCA9ICcnO1xuXG4gICAgQE91dHB1dCgpIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0MlVwZGF0ZUV2ZW50PFNlbGVjdDJVcGRhdGVWYWx1ZT4+KCk7XG4gICAgQE91dHB1dCgpIGF1dG9DcmVhdGVJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyQXV0b0NyZWF0ZUV2ZW50PFNlbGVjdDJVcGRhdGVWYWx1ZT4+KCk7XG4gICAgQE91dHB1dCgpIG9wZW4gPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdDI+KCk7XG4gICAgQE91dHB1dCgpIGNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyPigpO1xuICAgIEBPdXRwdXQoKSBmb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0Mj4oKTtcbiAgICBAT3V0cHV0KCkgYmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0Mj4oKTtcbiAgICBAT3V0cHV0KCkgc2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyU2VhcmNoRXZlbnQ8U2VsZWN0MlVwZGF0ZVZhbHVlPj4oKTtcbiAgICBAT3V0cHV0KCkgc2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyU2Nyb2xsRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpIHJlbW92ZU9wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0MlJlbW92ZUV2ZW50PFNlbGVjdDJVcGRhdGVWYWx1ZT4+KCk7XG5cbiAgICBvcHRpb246IFNlbGVjdDJPcHRpb24gfCBTZWxlY3QyT3B0aW9uW10gfCBudWxsID0gbnVsbDtcbiAgICBpc09wZW4gPSBmYWxzZTtcbiAgICBzZWFyY2hTdHlsZTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZm9jdXNlZCBvciBub3QuICovXG4gICAgZm9jdXNlZCA9IGZhbHNlO1xuXG4gICAgZmlsdGVyZWREYXRhOiBTZWxlY3QyRGF0YTtcblxuICAgIGdldCBzZWxlY3QyT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgPyAodGhpcy5vcHRpb24gYXMgU2VsZWN0Mk9wdGlvbltdKSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IHNlbGVjdDJPcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlID8gbnVsbCA6ICh0aGlzLm9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uKTtcbiAgICB9XG5cbiAgICBnZXQgc2VhcmNoVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJTZWFyY2hUZXh0O1xuICAgIH1cblxuICAgIHNldCBzZWFyY2hUZXh0KHRleHQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLmlubmVyU2VhcmNoVGV4dCA9IHRleHQ7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtaW52YWxpZCcpXG4gICAgZ2V0IGFyaWFJbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNFcnJvclN0YXRlKCk7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5tYXRlcmlhbCcpXG4gICAgZ2V0IGNsYXNzTWF0ZXJpYWwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlTW9kZSA9PT0gJ21hdGVyaWFsJztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm5vc3R5bGUnKVxuICAgIGdldCBjbGFzc05vc3R5bGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlTW9kZSA9PT0gJ25vU3R5bGUnO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuYm9yZGVybGVzcycpXG4gICAgZ2V0IGNsYXNzQm9yZGVybGVzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVNb2RlID09PSAnYm9yZGVybGVzcyc7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZWxlY3QyLWFib3ZlJylcbiAgICBnZXQgc2VsZWN0MmFib3ZlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMub3ZlcmxheSA/IHRoaXMubGlzdFBvc2l0aW9uID09PSAnYWJvdmUnIDogdGhpcy5faXNBYm9iZU92ZXJsYXkoKTtcbiAgICB9XG5cbiAgICBvdmVybGF5V2lkdGg6IG51bWJlcjtcbiAgICBvdmVybGF5SGVpZ2h0OiBudW1iZXI7XG4gICAgX3RyaWdnZXJSZWN0OiBET01SZWN0O1xuICAgIF9kcm9wZG93blJlY3Q6IERPTVJlY3Q7XG5cbiAgICBnZXQgX3Bvc2l0aW9ucygpOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdFBvc2l0aW9uID09PSAnYXV0bycgPyB1bmRlZmluZWQgOiBudWxsO1xuICAgIH1cblxuICAgIG1heFJlc3VsdHNFeGNlZWRlZDogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgX21pbkNvdW50Rm9yU2VhcmNoPzogbnVtYmVyO1xuXG4gICAgQFZpZXdDaGlsZChDZGtDb25uZWN0ZWRPdmVybGF5KSBwcml2YXRlIGNka0Nvbm5lY3RlZE92ZXJsYXk6IENka0Nvbm5lY3RlZE92ZXJsYXk7XG4gICAgQFZpZXdDaGlsZCgnc2VsZWN0aW9uJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBzZWxlY3Rpb246IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICAgIEBWaWV3Q2hpbGQoJ3Jlc3VsdHMnKSBwcml2YXRlIHJlc3VsdENvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gICAgQFZpZXdDaGlsZHJlbigncmVzdWx0JykgcHJpdmF0ZSByZXN1bHRzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gICAgQFZpZXdDaGlsZCgnc2VhcmNoSW5wdXQnKSBwcml2YXRlIHNlYXJjaElucHV0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgICBAVmlld0NoaWxkKCdkcm9wZG93bicpIHByaXZhdGUgZHJvcGRvd246IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgcHJpdmF0ZSBob3ZlcmluZ1ZhbHVlOiBTZWxlY3QyVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbDtcbiAgICBwcml2YXRlIGlubmVyU2VhcmNoVGV4dCA9ICcnO1xuICAgIHByaXZhdGUgaXNTZWFyY2hib3hIaWRkZW46IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIHNlbGVjdGlvbkVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgcHJpdmF0ZSBnZXQgcmVzdWx0c0VsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKiBUYWIgaW5kZXggZm9yIHRoZSBlbGVtZW50LiAqL1xuICAgIHByaXZhdGUgX3RhYkluZGV4OiBudW1iZXI7XG5cbiAgICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX211bHRpcGxlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcbiAgICBwcml2YXRlIF91aWQgPSBgc2VsZWN0Mi0ke25leHRVbmlxdWVJZCsrfWA7XG4gICAgcHJpdmF0ZSBfdmFsdWU6IFNlbGVjdDJVcGRhdGVWYWx1ZSA9IG51bGw7XG4gICAgcHJpdmF0ZSBfcHJldmlvdXNOYXRpdmVWYWx1ZTogU2VsZWN0MlVwZGF0ZVZhbHVlO1xuICAgIHByaXZhdGUgX292ZXJsYXlQb3NpdGlvbjogVmVydGljYWxDb25uZWN0aW9uUG9zO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBfdmlld3BvcnRSdWxlcjogVmlld3BvcnRSdWxlcixcbiAgICAgICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9wYXJlbnRGb3JtOiBOZ0Zvcm0sXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX3BhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgICAgICBAU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBfY29udHJvbDogTmdDb250cm9sLFxuICAgICAgICBAQXR0cmlidXRlKCd0YWJpbmRleCcpIHRhYkluZGV4OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnblxuICAgICAgICB0aGlzLmlkID0gdGhpcy5pZDtcbiAgICAgICAgdGhpcy5fdGFiSW5kZXggPSBwYXJzZUludCh0YWJJbmRleCwgMTApIHx8IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2wpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gICAgY2xpY2tEZXRlY3Rpb24oZTogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4gJiYgZm9jdXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlmUGFyZW50Q29udGFpbnNDbGFzcyh0YXJnZXQsICdzZWxlY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pZlBhcmVudENvbnRhaW5zQ2xhc3ModGFyZ2V0LCAnc2VsZWN0Mi1kcm9wZG93bicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlT3BlbkFuZENsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5vdmVybGF5ICYmICF0aGlzLmlmUGFyZW50Q29udGFpbnNJZCh0YXJnZXQsIHRoaXMuX2lkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWNrRXhpdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaWZQYXJlbnRDb250YWluc0lkKHRhcmdldCwgdGhpcy5faWQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVPcGVuQW5kQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrRXhpdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9jdXNlZCkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLl9mb2N1cyh0aGlzLmNsaWNrT25TZWxlY3QyRWxlbWVudCh0YXJnZXQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHNlbGVjdCBoYXMgYmVlbiB0b3VjaGVkICovXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkID0gKCkgPT4ge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgfTtcblxuICAgIC8qKiBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHZhbHVlIGNoYW5nZXMgKi9cbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9O1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuX3ZpZXdwb3J0UnVsZXIuY2hhbmdlKDEwMCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uID0gU2VsZWN0MlV0aWxzLmdldE9wdGlvbnNCeVZhbHVlKFxuICAgICAgICAgICAgdGhpcy5fZGF0YSxcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wgPyB0aGlzLl9jb250cm9sLnZhbHVlIDogdGhpcy52YWx1ZSxcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcHRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uID0gb3B0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcHRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVyaW5nVmFsdWUgPSB0aGlzLnZhbHVlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVNlYXJjaEJveCgpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5jZGtDb25uZWN0ZWRPdmVybGF5LnBvc2l0aW9uQ2hhbmdlLnN1YnNjcmliZSgocG9zQ2hhbmdlOiBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RQb3NpdGlvbiA9PT0gJ2F1dG8nICYmXG4gICAgICAgICAgICAgICAgcG9zQ2hhbmdlLmNvbm5lY3Rpb25QYWlyPy5vcmlnaW5ZICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVBvc2l0aW9uICE9PSBwb3NDaGFuZ2UuY29ubmVjdGlvblBhaXIub3JpZ2luWVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyUmVjdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlQb3NpdGlvbiA9IHBvc0NoYW5nZS5jb25uZWN0aW9uUGFpci5vcmlnaW5ZO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25FbGVtZW50ID0gdGhpcy5zZWxlY3Rpb24ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy50cmlnZ2VyUmVjdCgpO1xuICAgIH1cblxuICAgIG5nRG9DaGVjaygpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTZWFyY2hCb3goKTtcbiAgICAgICAgdGhpcy5fZGlydHlDaGVja05hdGl2ZVZhbHVlKCk7XG4gICAgICAgIGlmICh0aGlzLl90cmlnZ2VyUmVjdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3ZlcmxheVdpZHRoICE9PSB0aGlzLl90cmlnZ2VyUmVjdC53aWR0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVdpZHRoID0gdGhpcy5fdHJpZ2dlclJlY3Qud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fZHJvcGRvd25SZWN0Py5oZWlnaHQgPiAwICYmIHRoaXMub3ZlcmxheUhlaWdodCAhPT0gdGhpcy5fZHJvcGRvd25SZWN0LmhlaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheUhlaWdodCA9IHRoaXMubGlzdFBvc2l0aW9uID09PSAnYXV0bycgPyB0aGlzLl9kcm9wZG93blJlY3QuaGVpZ2h0IDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVNlYXJjaEJveCgpIHtcbiAgICAgICAgY29uc3QgaGlkZGVuID0gdGhpcy5jdXN0b21TZWFyY2hFbmFibGVkXG4gICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICA6IFNlbGVjdDJVdGlscy5pc1NlYXJjaGJveEhpZGRleCh0aGlzLl9kYXRhLCB0aGlzLl9taW5Db3VudEZvclNlYXJjaCk7XG4gICAgICAgIGlmICh0aGlzLmlzU2VhcmNoYm94SGlkZGVuICE9PSBoaWRkZW4pIHtcbiAgICAgICAgICAgIHRoaXMuaXNTZWFyY2hib3hIaWRkZW4gPSBoaWRkZW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoaWRlU2VhcmNoKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkaXNwbGF5U2VhcmNoU3RhdHVzID1cbiAgICAgICAgICAgIGRpc3BsYXlTZWFyY2hTdGF0dXNMaXN0LmluZGV4T2YodGhpcy5kaXNwbGF5U2VhcmNoU3RhdHVzKSA+IC0xID8gdGhpcy5kaXNwbGF5U2VhcmNoU3RhdHVzIDogJ2RlZmF1bHQnO1xuICAgICAgICByZXR1cm4gKGRpc3BsYXlTZWFyY2hTdGF0dXMgPT09ICdkZWZhdWx0JyAmJiB0aGlzLmlzU2VhcmNoYm94SGlkZGVuKSB8fCBkaXNwbGF5U2VhcmNoU3RhdHVzID09PSAnaGlkZGVuJztcbiAgICB9XG5cbiAgICBnZXRPcHRpb25TdHlsZShvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICdzZWxlY3QyLXJlc3VsdHNfX29wdGlvbiAnICtcbiAgICAgICAgICAgIChvcHRpb24uaGlkZSA/ICdzZWxlY3QyLXJlc3VsdHNfX29wdGlvbi0taGlkZSAnIDogJycpICtcbiAgICAgICAgICAgIChvcHRpb24udmFsdWUgPT09IHRoaXMuaG92ZXJpbmdWYWx1ZSA/ICdzZWxlY3QyLXJlc3VsdHNfX29wdGlvbi0taGlnaGxpZ2h0ZWQgJyA6ICcnKSArXG4gICAgICAgICAgICAob3B0aW9uLmNsYXNzZXMgfHwgJycpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbW91c2VlbnRlcihvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgaWYgKCFvcHRpb24uZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJpbmdWYWx1ZSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsaWNrKG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICBpZiAodGhpcy50ZXN0U2VsZWN0aW9uKG9wdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0KG9wdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldChldmVudD86IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgLy8gY29uc3QgdGVzdCA9IFNlbGVjdDJVdGlscy5nZXRPcHRpb25CeVZhbHVlKHRoaXMuX2RhdGEsIHRoaXMucmVzZXRTZWxlY3RlZFZhbHVlKTtcbiAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgIHRoaXMuc2VsZWN0KFxuICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGVkVmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gKFNlbGVjdDJVdGlscy5nZXRPcHRpb25CeVZhbHVlKHRoaXMuX2RhdGEsIHRoaXMucmVzZXRTZWxlY3RlZFZhbHVlKSA/PyBudWxsKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByZXZDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHN0b3BFdmVudChldmVudDogRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlT3BlbkFuZENsb3NlKGZvY3VzID0gdHJ1ZSwgb3Blbj86IGJvb2xlYW4sIGV2ZW50PzogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2ZvY3VzKGZvY3VzKTtcblxuICAgICAgICBjb25zdCBjaGFuZ2VFbWl0ID0gdGhpcy5pc09wZW4gIT09IChvcGVuID8/ICF0aGlzLmlzT3Blbik7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gb3BlbiA/PyAhdGhpcy5pc09wZW47XG5cbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTZWFyY2hib3hIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlubmVyU2VhcmNoVGV4dCA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNTZWFyY2hib3hPclJlc3VsdHNFbGVtZW50KGZvY3VzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTZWFyY2hib3hIaWRkZW4gJiYgIWNoYW5nZUVtaXQgJiYgZXZlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmtleURvd24oZXZlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSBBcnJheS5pc0FycmF5KHRoaXMub3B0aW9uKSA/IHRoaXMub3B0aW9uWzBdIDogdGhpcy5vcHRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbEZyb21PcHRpb24ob3B0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc3VsdHNFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdHNFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNka0Nvbm5lY3RlZE92ZXJsYXk/Lm92ZXJsYXlSZWY/LnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hhbmdlRW1pdCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3Blbi5lbWl0KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZUVtaXQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UuZW1pdCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIGhhc1RlbXBsYXRlKG9wdGlvbjogU2VsZWN0Mk9wdGlvbiB8IFNlbGVjdDJHcm91cCwgZGVmYXVsdFZhbHVlOiBzdHJpbmcsIHNlbGVjdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoc2VsZWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLnRlbXBsYXRlcz8uWyhvcHRpb24gYXMgU2VsZWN0Mk9wdGlvbikudGVtcGxhdGVTZWxlY3Rpb25JZF0gaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LltgJHtkZWZhdWx0VmFsdWV9U2VsZWN0aW9uYF0gaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LltgdGVtcGxhdGVTZWxlY3Rpb25gXSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmIHx8XG4gICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlU2VsZWN0aW9uIGluc3RhbmNlb2YgVGVtcGxhdGVSZWZcbiAgICAgICAgICAgICAgICA6IGZhbHNlKSB8fFxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LltvcHRpb24udGVtcGxhdGVJZF0gaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiB8fFxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LltkZWZhdWx0VmFsdWVdIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYgfHxcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzPy5bJ3RlbXBsYXRlJ10gaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiB8fFxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXMgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiB8fFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRUZW1wbGF0ZShvcHRpb246IFNlbGVjdDJPcHRpb24gfCBTZWxlY3QyR3JvdXAsIGRlZmF1bHRWYWx1ZTogc3RyaW5nLCBzZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNUZW1wbGF0ZShvcHRpb24sIGRlZmF1bHRWYWx1ZSwgc2VsZWN0KVxuICAgICAgICAgICAgPyAoc2VsZWN0XG4gICAgICAgICAgICAgICAgICA/IHRoaXMudGVtcGxhdGVzPy5bKG9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uKS50ZW1wbGF0ZVNlbGVjdGlvbklkXSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlcz8uW2Ake2RlZmF1bHRWYWx1ZX1TZWxlY3Rpb25gXSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlcz8uW2B0ZW1wbGF0ZVNlbGVjdGlvbmBdIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVTZWxlY3Rpb25cbiAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkKSB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LltvcHRpb24udGVtcGxhdGVJZF0gfHxcbiAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzPy5bZGVmYXVsdFZhbHVlXSB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LlsndGVtcGxhdGUnXSB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXNcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRyaWdnZXJSZWN0KCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyUmVjdCA9IHRoaXMuc2VsZWN0aW9uRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5fZHJvcGRvd25SZWN0ID0gdGhpcy5kcm9wZG93bj8ubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgPyB0aGlzLmRyb3Bkb3duLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlzTnVtYmVyKG86IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIWlzTmFOKG8gLSAwKSAmJiBvICE9PSBudWxsICYmIG8gIT09ICcnICYmIG8gIT09IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdGVzdFNlbGVjdGlvbihvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgaWYgKG9wdGlvbi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICF0aGlzLm11bHRpcGxlIHx8XG4gICAgICAgICAgICAhdGhpcy5saW1pdFNlbGVjdGlvbiB8fFxuICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpICYmIHRoaXMuX3ZhbHVlLmxlbmd0aCA8IHRoaXMubGltaXRTZWxlY3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0ZXN0VmFsdWVDaGFuZ2UodmFsdWUxOiBTZWxlY3QyVXBkYXRlVmFsdWUsIHZhbHVlMjogU2VsZWN0MlVwZGF0ZVZhbHVlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICgodmFsdWUxID09PSBudWxsIHx8IHZhbHVlMSA9PT0gdW5kZWZpbmVkKSAmJiAodmFsdWUyID09PSBudWxsIHx8IHZhbHVlMiA9PT0gdW5kZWZpbmVkKSkgfHxcbiAgICAgICAgICAgIHZhbHVlMSA9PT0gdmFsdWUyXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGUgJiZcbiAgICAgICAgICAgICh2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pPy5sZW5ndGggJiZcbiAgICAgICAgICAgICh2YWx1ZTIgYXMgU2VsZWN0MlZhbHVlW10pPy5sZW5ndGggJiZcbiAgICAgICAgICAgICh2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pLmxlbmd0aCA9PT0gKHZhbHVlMiBhcyBTZWxlY3QyVmFsdWVbXSkubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlMSBvZiB2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0ID0gKHZhbHVlMiBhcyBTZWxlY3QyVmFsdWVbXSkuaW5kZXhPZihlMSkgPiAtMTtcbiAgICAgICAgICAgICAgICBpZiAoIXRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRmlsdGVyZWREYXRhKHdyaXRlVmFsdWUgPSBmYWxzZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9kYXRhO1xuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgdGhpcy5oaWRlU2VsZWN0ZWRJdGVtcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNlbGVjdDJVdGlscy5nZXRGaWx0ZXJlZFNlbGVjdGVkRGF0YShyZXN1bHQsIHRoaXMub3B0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmN1c3RvbVNlYXJjaEVuYWJsZWQgJiYgdGhpcy5zZWFyY2hUZXh0ICYmIHRoaXMuc2VhcmNoVGV4dC5sZW5ndGggPj0gK3RoaXMubWluQ2hhckZvclNlYXJjaCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNlbGVjdDJVdGlscy5nZXRGaWx0ZXJlZERhdGEocmVzdWx0LCB0aGlzLnNlYXJjaFRleHQsIHRoaXMuZWRpdFBhdHRlcm4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5tYXhSZXN1bHRzID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBTZWxlY3QyVXRpbHMuZ2V0UmVkdWNlRGF0YShyZXN1bHQsICt0aGlzLm1heFJlc3VsdHMpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRhdGEucmVzdWx0O1xuICAgICAgICAgICAgICAgIHRoaXMubWF4UmVzdWx0c0V4Y2VlZGVkID0gZGF0YS5yZWR1Y2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubWF4UmVzdWx0c0V4Y2VlZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChTZWxlY3QyVXRpbHMudmFsdWVJc05vdEluRmlsdGVyZWREYXRhKHJlc3VsdCwgdGhpcy5ob3ZlcmluZ1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaG92ZXJpbmdWYWx1ZSA9IFNlbGVjdDJVdGlscy5nZXRGaXJzdEF2YWlsYWJsZU9wdGlvbihyZXN1bHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAod3JpdGVWYWx1ZSAmJiB0aGlzLl9wcmV2aW91c05hdGl2ZVZhbHVlICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggY3VycmVudCBzZWxlY3RlZCB2YWx1ZVxuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLl9jb250cm9sID8gdGhpcy5fY29udHJvbC52YWx1ZSA6IHRoaXMuX3ZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSByZXN1bHQ7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGlja0V4aXQoKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzKGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlmUGFyZW50Q29udGFpbnNDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY3NzQ2xhc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJlbnRFbGVtZW50QnlDbGFzcyhlbGVtZW50LCBjc3NDbGFzcykgIT09IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpZlBhcmVudENvbnRhaW5zSWQoZWxlbWVudDogSFRNTEVsZW1lbnQsIGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyZW50RWxlbWVudEJ5SWQoZWxlbWVudCwgaWQpICE9PSBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGFyZW50RWxlbWVudEJ5Q2xhc3MoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNzc0NsYXNzOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluQ2xhc3NlcyhlbGVtZW50LCBjc3NDbGFzcy50cmltKCkuc3BsaXQoL1xccysvKSlcbiAgICAgICAgICAgID8gZWxlbWVudFxuICAgICAgICAgICAgOiBlbGVtZW50LnBhcmVudEVsZW1lbnRcbiAgICAgICAgICAgICAgPyB0aGlzLmdldFBhcmVudEVsZW1lbnRCeUNsYXNzKGVsZW1lbnQucGFyZW50RWxlbWVudCwgY3NzQ2xhc3MpXG4gICAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBhcmVudEVsZW1lbnRCeUlkKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpZDogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaWQgPT09IGlkXG4gICAgICAgICAgICA/IGVsZW1lbnRcbiAgICAgICAgICAgIDogZWxlbWVudC5wYXJlbnRFbGVtZW50XG4gICAgICAgICAgICAgID8gdGhpcy5nZXRQYXJlbnRFbGVtZW50QnlJZChlbGVtZW50LnBhcmVudEVsZW1lbnQsIGlkKVxuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb250YWluQ2xhc3NlcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY3NzQ2xhc3Nlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBjc3NDbGFzcyBvZiBjc3NDbGFzc2VzKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNzc0NsYXNzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29udGFpbkFsbW9zdE9uZUNsYXNzZXMoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNzc0NsYXNzZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb250YWluQWxtb3N0T25lID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgY3NzQ2xhc3Mgb2YgY3NzQ2xhc3Nlcykge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNzc0NsYXNzKSkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5BbG1vc3RPbmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5BbG1vc3RPbmU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGlja09uU2VsZWN0MkVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbkFsbW9zdE9uZUNsYXNzZXMoZWxlbWVudCwgW1xuICAgICAgICAgICAgJ3NlbGVjdDItb3ZlcmxheS1iYWNrZHJvcCcsXG4gICAgICAgICAgICAnc2VsZWN0Mi1sYWJlbC1jb250ZW50JyxcbiAgICAgICAgICAgICdzZWxlY3QyLXNlbGVjdGlvbl9fcmVuZGVyZWQnLFxuICAgICAgICAgICAgJ3NlbGVjdDItcmVzdWx0c19fb3B0aW9uJyxcbiAgICAgICAgXSk7XG4gICAgfVxuXG4gICAgZm9jdXNpbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1cyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3Vzb3V0KCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25FbGVtZW50ICYmICF0aGlzLnNlbGVjdGlvbkVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3QyLWZvY3VzZWQnKSkge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXMoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWxlY3Qob3B0aW9uOiBTZWxlY3QyT3B0aW9uIHwgbnVsbCwgZW1pdDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgbGV0IHZhbHVlOiBhbnk7XG4gICAgICAgIGlmIChvcHRpb24gIT09IG51bGwgJiYgb3B0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9uIGFzIFNlbGVjdDJPcHRpb25bXTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KG9wID0+IG9wLnZhbHVlID09PSBvcHRpb24udmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhbHVlID0gKHRoaXMub3B0aW9uIGFzIFNlbGVjdDJPcHRpb25bXSkubWFwKG9wID0+IG9wLnZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb24gPSBvcHRpb247XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UuZW1pdCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbGVtZW50Py5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMub3B0aW9uLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghb3B0aW9uICYmIHRoaXMuX3ZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUgPz8gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB3aGVuIHJlbW92ZSB2YWx1ZVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb24pID8gdGhpcy5vcHRpb24/Lmxlbmd0aCA6IHRoaXMub3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3B0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMuaGlkZVNlbGVjdGVkSXRlbXMpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICBlbWl0ICYmPSB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMudGVzdERpZmZWYWx1ZSh0aGlzLl92YWx1ZSwgdmFsdWUpO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW1pdCkge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZSA/PyBudWxsO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3ZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBBcnJheS5pc0FycmF5KHRoaXMub3B0aW9uKSA/IHRoaXMub3B0aW9uIDogdGhpcy5vcHRpb24gPyBbdGhpcy5vcHRpb25dIDogbnVsbCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0ZXN0RGlmZlZhbHVlKHZhbDE6IFNlbGVjdDJVcGRhdGVWYWx1ZSwgdmFsMjogYW55KSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbDEpID8gKHZhbDEgYXMgW10pPy5sZW5ndGggIT09IHZhbDI/Lmxlbmd0aCA6IHZhbDEgIT09IHZhbDI7XG4gICAgfVxuXG4gICAga2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgY3JlYXRlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGNyZWF0ZSAmJiB0aGlzLl90ZXN0S2V5KGV2ZW50LCBbJ0VudGVyJywgMTNdKSkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVBbmRBZGQoZXZlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZXZlbnQsIFsnQXJyb3dEb3duJywgNDBdKSkge1xuICAgICAgICAgICAgdGhpcy5tb3ZlRG93bigpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90ZXN0S2V5KGV2ZW50LCBbJ0Fycm93VXAnLCAzOF0pKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVVcCgpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90ZXN0S2V5KGV2ZW50LCBbJ0VudGVyJywgMTNdKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RCeUVudGVyKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZXZlbnQsIFsnRXNjYXBlJywgJ1RhYicsIDksIDI3XSkgJiYgdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlT3BlbkFuZENsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9mb2N1cyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvcGVuS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50LCBjcmVhdGUgPSBmYWxzZSkge1xuICAgICAgICBpZiAoY3JlYXRlICYmIHRoaXMuX3Rlc3RLZXkoZXZlbnQsIFsnRW50ZXInLCAxM10pKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFuZEFkZChldmVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGVzdEtleShldmVudCwgWydBcnJvd0Rvd24nLCAnQXJyb3dVcCcsICdFbnRlcicsIDQwLCAzOCwgMTNdKSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVPcGVuQW5kQ2xvc2UodHJ1ZSwgdHJ1ZSwgZXZlbnQpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90ZXN0S2V5KGV2ZW50LCBbJ0VzY2FwZScsICdUYWInLCA5LCAyN10pKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU9wZW5BbmRDbG9zZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXMoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VhcmNoVXBkYXRlKGU6IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IChlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgaWYgKCF0aGlzLmN1c3RvbVNlYXJjaEVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5lbWl0KHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3ZhbHVlLFxuICAgICAgICAgICAgICAgIHNlYXJjaDogdGhpcy5zZWFyY2hUZXh0LFxuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuX2RhdGEsXG4gICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhOiAoZGF0YTogU2VsZWN0MkRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFja0J5KF9pbmRleDogbnVtYmVyLCBpdGVtOiBTZWxlY3QyT3B0aW9uKTogYW55IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuXG4gICAgaXNTZWxlY3RlZChvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIFNlbGVjdDJVdGlscy5pc1NlbGVjdGVkKHRoaXMub3B0aW9uLCBvcHRpb24sIHRoaXMubXVsdGlwbGUpO1xuICAgIH1cblxuICAgIGlzRGlzYWJsZWQob3B0aW9uOiBTZWxlY3QyT3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBvcHRpb24uZGlzYWJsZWQgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgIH1cblxuICAgIHJlbW92ZVNlbGVjdGlvbihlOiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCwgb3B0aW9uOiBTZWxlY3QyT3B0aW9uKSB7XG4gICAgICAgIFNlbGVjdDJVdGlscy5yZW1vdmVTZWxlY3Rpb24odGhpcy5vcHRpb24sIG9wdGlvbik7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgdGhpcy5oaWRlU2VsZWN0ZWRJdGVtcykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJlZERhdGEoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKHRoaXMub3B0aW9uIGFzIFNlbGVjdDJPcHRpb25bXSkubWFwKG9wID0+IG9wLnZhbHVlKTtcblxuICAgICAgICBpZiAodGhpcy5fY29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZSA/PyBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGUuZW1pdCh7XG4gICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBvcHRpb25zOiBBcnJheS5pc0FycmF5KHRoaXMub3B0aW9uKSA/IHRoaXMub3B0aW9uIDogdGhpcy5vcHRpb24gPyBbdGhpcy5vcHRpb25dIDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVtb3ZlT3B0aW9uLmVtaXQoe1xuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgcmVtb3ZlZE9wdGlvbjogb3B0aW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1c1NlYXJjaGJveE9yUmVzdWx0c0VsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1vZGVsIHZhbHVlLiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgICAqIEBwYXJhbSB2YWx1ZVxuICAgICAqL1xuICAgIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl9zZXRTZWxlY3Rpb25CeVZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgc2VsZWN0J3MgdmFsdWVcbiAgICAgKiBjaGFuZ2VzIGZyb20gdXNlciBpbnB1dC4gUGFydCBvZiB0aGUgQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlXG4gICAgICogcmVxdWlyZWQgdG8gaW50ZWdyYXRlIHdpdGggQW5ndWxhcidzIGNvcmUgZm9ybXMgQVBJLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZuIENhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VzLlxuICAgICAqL1xuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIHNlbGVjdCBpcyBibHVycmVkXG4gICAgICogYnkgdGhlIHVzZXIuIFBhcnQgb2YgdGhlIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZSByZXF1aXJlZFxuICAgICAqIHRvIGludGVncmF0ZSB3aXRoIEFuZ3VsYXIncyBjb3JlIGZvcm1zIEFQSS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmbiBDYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHRvdWNoZWQuXG4gICAgICovXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIGRpc2FibGVkLlxuICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAgICogQHBhcmFtIGlzRGlzYWJsZWRcbiAgICAgKi9cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgb25TY3JvbGwod2F5OiAndXAnIHwgJ2Rvd24nKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsLmVtaXQoe1xuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgICAgd2F5LFxuICAgICAgICAgICAgc2VhcmNoOiB0aGlzLmlubmVyU2VhcmNoVGV4dCxcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuX2RhdGEsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9pc0Vycm9yU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGlzSW52YWxpZCA9IHRoaXMuX2NvbnRyb2w/LmludmFsaWQ7XG4gICAgICAgIGNvbnN0IGlzVG91Y2hlZCA9IHRoaXMuX2NvbnRyb2w/LnRvdWNoZWQ7XG4gICAgICAgIGNvbnN0IGlzU3VibWl0dGVkID0gdGhpcy5fcGFyZW50Rm9ybUdyb3VwPy5zdWJtaXR0ZWQgfHwgdGhpcy5fcGFyZW50Rm9ybT8uc3VibWl0dGVkO1xuICAgICAgICByZXR1cm4gISEoaXNJbnZhbGlkICYmIChpc1RvdWNoZWQgfHwgaXNTdWJtaXR0ZWQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEl0ZW0odmFsdWU6IHN0cmluZyk6IFNlbGVjdDJPcHRpb24ge1xuICAgICAgICBsZXQgaXRlbSA9IFNlbGVjdDJVdGlscy5nZXRPcHRpb25CeVZhbHVlKHRoaXMuX2RhdGEsIHZhbHVlKTtcbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgICBpdGVtID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB2YWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9kYXRhLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVBbmRBZGQoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlLnRyaW0oKSkge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuYWRkSXRlbSh2YWx1ZS50cmltKCkpO1xuICAgICAgICAgICAgdGhpcy5jbGljayhpdGVtKTtcbiAgICAgICAgICAgIChlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgdGhpcy5hdXRvQ3JlYXRlSXRlbS5lbWl0KHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbSxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvbiA6IHRoaXMub3B0aW9uID8gW3RoaXMub3B0aW9uXSA6IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0b3BFdmVudChlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1vdmVVcCgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxGcm9tT3B0aW9uKFNlbGVjdDJVdGlscy5nZXRQcmV2aW91c09wdGlvbih0aGlzLmZpbHRlcmVkRGF0YSwgdGhpcy5ob3ZlcmluZ1ZhbHVlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtb3ZlRG93bigpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxGcm9tT3B0aW9uKFNlbGVjdDJVdGlscy5nZXROZXh0T3B0aW9uKHRoaXMuZmlsdGVyZWREYXRhLCB0aGlzLmhvdmVyaW5nVmFsdWUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVNjcm9sbEZyb21PcHRpb24ob3B0aW9uOiBTZWxlY3QyT3B0aW9uKSB7XG4gICAgICAgIGlmIChvcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJpbmdWYWx1ZSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGRvbUVsZW1lbnQgPSB0aGlzLnJlc3VsdHMuZmluZChyID0+IHIubmF0aXZlRWxlbWVudC5pbm5lclRleHQudHJpbSgpID09PSBvcHRpb24ubGFiZWwpO1xuICAgICAgICAgICAgaWYgKGRvbUVsZW1lbnQgJiYgdGhpcy5yZXN1bHRzRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0c0VsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0Q2xpZW50UmVjdCA9IHRoaXMucmVzdWx0c0VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uQ2xpZW50UmVjdCA9IGRvbUVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdHNFbGVtZW50LnNjcm9sbFRvcCA9IG9wdGlvbkNsaWVudFJlY3QudG9wIC0gbGlzdENsaWVudFJlY3QudG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RCeUVudGVyKCkge1xuICAgICAgICBpZiAodGhpcy5ob3ZlcmluZ1ZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSBTZWxlY3QyVXRpbHMuZ2V0T3B0aW9uQnlWYWx1ZSh0aGlzLl9kYXRhLCB0aGlzLmhvdmVyaW5nVmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Qob3B0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3Rlc3RLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHJlZnM6IChudW1iZXIgfCBzdHJpbmcpW10gPSBbXSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNLZXkodGhpcy5fZ2V0S2V5KGV2ZW50KSwgcmVmcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0S2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgICAgICAgbGV0IGNvZGU6IG51bWJlciB8IHN0cmluZztcblxuICAgICAgICBpZiAoZXZlbnQua2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvZGUgPSBldmVudC5rZXk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRbJ2tleUlkZW50aWZpZXInXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb2RlID0gZXZlbnRbJ2tleUlkZW50aWZpZXInXTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudFsna2V5Q29kZSddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvZGUgPSBldmVudFsna2V5Q29kZSddO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2RlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2lzS2V5KGNvZGU6IG51bWJlciB8IHN0cmluZywgcmVmczogKG51bWJlciB8IHN0cmluZylbXSA9IFtdKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiByZWZzICYmIHJlZnMubGVuZ3RoID4gMCA/IHJlZnMuaW5kZXhPZihjb2RlKSAhPT0gLTEgOiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzZWxlY3RlZCBvcHRpb24gYmFzZWQgb24gYSB2YWx1ZS4gSWYgbm8gb3B0aW9uIGNhbiBiZVxuICAgICAqIGZvdW5kIHdpdGggdGhlIGRlc2lnbmF0ZWQgdmFsdWUsIHRoZSBzZWxlY3QgdHJpZ2dlciBpcyBjbGVhcmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3NldFNlbGVjdGlvbkJ5VmFsdWUodmFsdWU6IGFueSB8IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbiB8fCAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHZhbHVlICYmICFpc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb24gYXJyYXkgdmFsdWUuJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbiA9IFtdOyAvLyBpZiB2YWx1ZSBpcyBudWxsLCB0aGVuIGVtcHR5IG9wdGlvbiBhbmQgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyBub3QgbnVsbC4gUHJlc2VsZWN0IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlczogYW55ID0gU2VsZWN0MlV0aWxzLmdldE9wdGlvbnNCeVZhbHVlKHRoaXMuX2RhdGEsIHZhbHVlLCB0aGlzLm11bHRpcGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzLm1hcChpdGVtID0+IHRoaXMuc2VsZWN0KGl0ZW0sIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA/Pz0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlc3REaWZmVmFsdWUodGhpcy5fdmFsdWUsIHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvbiA6IHRoaXMub3B0aW9uID8gW3RoaXMub3B0aW9uXSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpeCBpZiB2YWx1ZSBpcyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdChudWxsLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlc3REaWZmVmFsdWUodGhpcy5fdmFsdWUsIHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3ZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBBcnJheS5pc0FycmF5KHRoaXMub3B0aW9uKSA/IHRoaXMub3B0aW9uIDogdGhpcy5vcHRpb24gPyBbdGhpcy5vcHRpb25dIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID8/PSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoU2VsZWN0MlV0aWxzLmdldE9wdGlvbkJ5VmFsdWUodGhpcy5fZGF0YSwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250cm9sLnZpZXdUb01vZGVsVXBkYXRlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRG9lcyBzb21lIG1hbnVhbCBkaXJ0eSBjaGVja2luZyBvbiB0aGUgbmF0aXZlIGlucHV0IGB2YWx1ZWAgcHJvcGVydHkuICovXG4gICAgcHJpdmF0ZSBfZGlydHlDaGVja05hdGl2ZVZhbHVlKCkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzTmF0aXZlVmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c05hdGl2ZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZm9jdXNTZWFyY2hib3hPclJlc3VsdHNFbGVtZW50KGZvY3VzID0gdHJ1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTZWFyY2hib3hIaWRkZW4pIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0ICYmIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudCAmJiBmb2N1cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc3VsdHNFbGVtZW50ICYmIGZvY3VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZm9jdXMoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCFzdGF0ZSAmJiB0aGlzLmZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IHN0YXRlO1xuICAgICAgICAgICAgdGhpcy5ibHVyLmVtaXQodGhpcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgJiYgIXRoaXMuZm9jdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gc3RhdGU7XG4gICAgICAgICAgICB0aGlzLmZvY3VzLmVtaXQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc0Fib2JlT3ZlcmxheSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcmxheSAmJiB0aGlzLl9vdmVybGF5UG9zaXRpb24gJiYgdGhpcy5saXN0UG9zaXRpb24gPT09ICdhdXRvJ1xuICAgICAgICAgICAgPyB0aGlzLl9vdmVybGF5UG9zaXRpb24gPT09ICd0b3AnXG4gICAgICAgICAgICA6IHRoaXMubGlzdFBvc2l0aW9uID09PSAnYWJvdmUnO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzZWxlY3QyLWxhYmVsXCIgKGNsaWNrKT1cInRvZ2dsZU9wZW5BbmRDbG9zZSgpXCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwic2VsZWN0Mi1sYWJlbFwiPjwvbmctY29udGVudD5cbiAgICBAaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0Mi1yZXF1aXJlZFwiPjwvc3Bhbj5cbiAgICB9XG48L2Rpdj5cblxuPGRpdlxuICAgIGNsYXNzPVwic2VsZWN0MiBzZWxlY3QyLWNvbnRhaW5lciBzZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdFwiXG4gICAgW2NsYXNzLnNlbGVjdDItY29udGFpbmVyLS1mb2N1c109XCJmb2N1c2VkXCJcbiAgICBbY2xhc3Muc2VsZWN0Mi1jb250YWluZXItLWJlbG93XT1cIiFzZWxlY3QyYWJvdmVcIlxuICAgIFtjbGFzcy5zZWxlY3QyLWNvbnRhaW5lci0tYWJvdmVdPVwic2VsZWN0MmFib3ZlXCJcbiAgICBbY2xhc3Muc2VsZWN0Mi1jb250YWluZXItLW9wZW5dPVwiaXNPcGVuXCJcbiAgICBbY2xhc3Muc2VsZWN0Mi1jb250YWluZXItLWRpc2FibGVkXT1cImRpc2FibGVkXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwic2VsZWN0aW9uXCJcbiAgICAgICAgI3NlbGVjdGlvblxuICAgICAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgICAgICBbdGFiaW5kZXhdPVwiIXRoaXMuaXNPcGVuID8gdGFiSW5kZXggOiAnLTEnXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU9wZW5BbmRDbG9zZSgpXCJcbiAgICAgICAgKGZvY3VzKT1cImZvY3VzaW4oKVwiXG4gICAgICAgIChibHVyKT1cImZvY3Vzb3V0KClcIlxuICAgICAgICAoa2V5ZG93bik9XCJvcGVuS2V5KCRldmVudClcIlxuICAgICAgICBjZGtPdmVybGF5T3JpZ2luXG4gICAgICAgIFtjbGFzcy5zZWxlY3QyLWZvY3VzZWRdPVwiZm9jdXNlZFwiXG4gICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInNlbGVjdDItc2VsZWN0aW9uXCJcbiAgICAgICAgICAgIFtjbGFzcy5zZWxlY3QyLXNlbGVjdGlvbi0tbXVsdGlwbGVdPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgW2NsYXNzLnNlbGVjdDItc2VsZWN0aW9uLS1zaW5nbGVdPVwiIW11bHRpcGxlXCJcbiAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIEBpZiAoIW11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fcmVuZGVyZWRcIiBbdGl0bGVdPVwic2VsZWN0Mk9wdGlvbj8ubGFiZWwgfHwgJydcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmICghc2VsZWN0Mk9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoc2VsZWN0Mk9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghaGFzVGVtcGxhdGUoc2VsZWN0Mk9wdGlvbiwgJ29wdGlvbicsIHRydWUpIHx8IG5vTGFiZWxUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwic2VsZWN0Mk9wdGlvbi5sYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRUZW1wbGF0ZShzZWxlY3QyT3B0aW9uLCAnb3B0aW9uJywgdHJ1ZSk7IGNvbnRleHQ6IHNlbGVjdDJPcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdDItc2VsZWN0aW9uX19wbGFjZWhvbGRlcl9fb3B0aW9uXT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdDItc2VsZWN0aW9uX19wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+e3sgcGxhY2Vob2xkZXIgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoIW11bHRpcGxlICYmIHJlc2V0dGFibGUgJiYgcmVzZXRTZWxlY3RlZFZhbHVlICE9PSB2YWx1ZSAmJiBzZWxlY3QyT3B0aW9uICYmICEoZGlzYWJsZWQgfHwgcmVhZG9ubHkpKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cInJlc2V0KCRldmVudClcIiBjbGFzcz1cInNlbGVjdDItc2VsZWN0aW9uX19yZXNldFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj7Dlzwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoIW11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fYXJyb3dcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+IDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fcmVuZGVyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmICghYXV0b0NyZWF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0Mi1zZWxlY3Rpb25fX3BsYWNlaG9sZGVyX19vcHRpb25dPVwic2VsZWN0Mk9wdGlvbnM/Lmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1zZWxlY3Rpb25fX3BsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3sgcGxhY2Vob2xkZXIgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAZm9yIChvcCBvZiBvcHRpb24gfHwgW107IHRyYWNrIHRyYWNrQnkoJGluZGV4LCBvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1zZWxlY3Rpb25fX2Nob2ljZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIm9wLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInJlbW92ZVNlbGVjdGlvbigkZXZlbnQsIG9wKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghKGRpc2FibGVkIHx8IHJlYWRvbmx5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVNlbGVjdGlvbigkZXZlbnQsIG9wKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdDItc2VsZWN0aW9uX19jaG9pY2VfX3JlbW92ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID7Dlzwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWhhc1RlbXBsYXRlKG9wLCAnb3B0aW9uJywgdHJ1ZSkgfHwgbm9MYWJlbFRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwib3AubGFiZWxcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0VGVtcGxhdGUob3AsICdvcHRpb24nLCB0cnVlKTsgY29udGV4dDogb3BcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKGF1dG9DcmVhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1zZWxlY3Rpb25fX2F1dG8tY3JlYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwic3RvcEV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cInN0b3BFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImlkICsgJy1jcmVhdGUtZmllbGQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU9wZW5BbmRDbG9zZShmYWxzZSwgdHJ1ZSk7IHN0b3BFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwia2V5RG93bigkZXZlbnQsIHRydWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cInNlYXJjaFVwZGF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJwcmV2Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdDItY3JlYXRlX19maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwidGV4dGJveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb3JyZWN0PVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NhcGl0YWxpemU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgQGlmICghb3ZlcmxheSkge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICB9XG5cbiAgICA8ZGl2IGNsYXNzPVwic2VsZWN0Mi1zdWJzY3JpcHQtd3JhcHBlclwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJzZWxlY3QyLWhpbnRcIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcFxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwic2VsZWN0Mi1vdmVybGF5LWJhY2tkcm9wXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJ0cmlnZ2VyXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwidGhpcy5pc09wZW4gJiYgb3ZlcmxheVwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlNaW5XaWR0aF09XCJvdmVybGF5V2lkdGhcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5SGVpZ2h0XT1cIm92ZXJsYXlIZWlnaHRcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zXT1cIl9wb3NpdGlvbnNcIlxuICAgIChiYWNrZHJvcENsaWNrKT1cInRvZ2dsZU9wZW5BbmRDbG9zZSgpXCJcbj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY29udGFpbmVyVGVtcGxhdGU+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cInNlbGVjdDItY29udGFpbmVyIHNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IHNlbGVjdDItY29udGFpbmVyLWRyb3Bkb3duXCJcbiAgICAgICAgW2NsYXNzLnNlbGVjdDItY29udGFpbmVyLS1vcGVuXT1cImlzT3BlblwiXG4gICAgICAgIFtjbGFzcy5zZWxlY3QyLW92ZXJsYXldPVwib3ZlcmxheVwiXG4gICAgICAgIFtjbGFzcy5zZWxlY3QyLXBvc2l0aW9uLWF1dG9dPVwibGlzdFBvc2l0aW9uID09PSAnYXV0bydcIlxuICAgICAgICBbY2xhc3Muc2VsZWN0Mi1zdHlsZS1ib3JkZXJsZXNzXT1cInN0eWxlTW9kZSA9PT0gJ2JvcmRlcmxlc3MnXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICNkcm9wZG93blxuICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLWRyb3Bkb3duXCJcbiAgICAgICAgICAgIFtjbGFzcy5zZWxlY3QyLWRyb3Bkb3duLS1iZWxvd109XCIhc2VsZWN0MmFib3ZlXCJcbiAgICAgICAgICAgIFtjbGFzcy5zZWxlY3QyLWRyb3Bkb3duLS1hYm92ZV09XCJzZWxlY3QyYWJvdmVcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0Mi1zZWFyY2ggc2VsZWN0Mi1zZWFyY2gtLWRyb3Bkb3duXCIgW2NsYXNzLnNlbGVjdDItc2VhcmNoLS1oaWRlXT1cImhpZGVTZWFyY2goKVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAjc2VhcmNoSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImlkICsgJy1zZWFyY2gtZmllbGQnXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJrZXlEb3duKCRldmVudCwgYXV0b0NyZWF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwic2VhcmNoVXBkYXRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInByZXZDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1zZWFyY2hfX2ZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJ0ZXh0Ym94XCJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2NvcnJlY3Q9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInRoaXMuaXNPcGVuID8gdGFiSW5kZXggOiAnLTEnXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0Mi1yZXN1bHRzXCI+XG4gICAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgICAgICNyZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1yZXN1bHRzX19vcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdDItZ3JpZF09XCJncmlkICYmIGlzTnVtYmVyKGdyaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdDItZ3JpZC1hdXRvXT1cImdyaWQgJiYgIWlzTnVtYmVyKGdyaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC1oZWlnaHRdPVwicmVzdWx0TWF4SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLi0tZ3JpZC1zaXplXT1cImdyaWQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJ0cmVlXCJcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgIGluZmluaXRlU2Nyb2xsXG4gICAgICAgICAgICAgICAgICAgIFtpbmZpbml0ZVNjcm9sbERpc2FibGVkXT1cIiFpbmZpbml0ZVNjcm9sbCAmJiAhaXNPcGVuXCJcbiAgICAgICAgICAgICAgICAgICAgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiaW5maW5pdGVTY3JvbGxEaXN0YW5jZVwiXG4gICAgICAgICAgICAgICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cImluZmluaXRlU2Nyb2xsVGhyb3R0bGVcIlxuICAgICAgICAgICAgICAgICAgICBbaW5maW5pdGVTY3JvbGxDb250YWluZXJdPVwicmVzdWx0c1wiXG4gICAgICAgICAgICAgICAgICAgIChzY3JvbGxlZCk9XCJvblNjcm9sbCgnZG93bicpXCJcbiAgICAgICAgICAgICAgICAgICAgKHNjcm9sbGVkVXApPVwib25TY3JvbGwoJ3VwJylcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJrZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZ3JvdXBPck9wdGlvbiBvZiBmaWx0ZXJlZERhdGE7IHRyYWNrIHRyYWNrQnkoaSwgZ3JvdXBPck9wdGlvbik7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGdyb3VwT3JPcHRpb24ub3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwic2VsZWN0Mi1yZXN1bHRzX19vcHRpb25cIiByb2xlPVwiZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghaGFzVGVtcGxhdGUoZ3JvdXBPck9wdGlvbiwgJ2dyb3VwJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbGVjdDItcmVzdWx0c19fZ3JvdXAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyb3VwT3JPcHRpb24uY2xhc3NlcyA/ICcgJyArIGdyb3VwT3JPcHRpb24uY2xhc3NlcyA6ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJncm91cE9yT3B0aW9uLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRUZW1wbGF0ZShncm91cE9yT3B0aW9uLCAnZ3JvdXAnKTsgY29udGV4dDogZ3JvdXBPck9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJzZWxlY3QyLXJlc3VsdHNfX29wdGlvbnMgc2VsZWN0Mi1yZXN1bHRzX19vcHRpb25zLS1uZXN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBncm91cE9yT3B0aW9uLm9wdGlvbnM7IHRyYWNrIHRyYWNrQnkoaiwgb3B0aW9uKTsgbGV0IGogPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwib3B0aW9uLmlkIHx8IGlkICsgJy1vcHRpb24tJyArIGkgKyAnLScgKyBqXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldE9wdGlvblN0eWxlKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwidHJlZWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNEaXNhYmxlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwibW91c2VlbnRlcihvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghaGFzVGVtcGxhdGUob3B0aW9uLCAnb3B0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QyLWxhYmVsLWNvbnRlbnRcIiBbaW5uZXJIVE1MXT1cIm9wdGlvbi5sYWJlbFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImdldFRlbXBsYXRlKG9wdGlvbiwgJ29wdGlvbicpOyBjb250ZXh0OiBvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZ3JvdXBPck9wdGlvbi5pZCB8fCBpZCArICctb3B0aW9uLScgKyBpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldE9wdGlvblN0eWxlKGdyb3VwT3JPcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRyZWVpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKGdyb3VwT3JPcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpc0Rpc2FibGVkKGdyb3VwT3JPcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwibW91c2VlbnRlcihncm91cE9yT3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGljayhncm91cE9yT3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCFoYXNUZW1wbGF0ZShncm91cE9yT3B0aW9uLCAnb3B0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJncm91cE9yT3B0aW9uLmxhYmVsXCIgY2xhc3M9XCJzZWxlY3QyLWxhYmVsLWNvbnRlbnRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRUZW1wbGF0ZShncm91cE9yT3B0aW9uLCAnb3B0aW9uJyk7IGNvbnRleHQ6IGdyb3VwT3JPcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImdldFRlbXBsYXRlKGdyb3VwT3JPcHRpb24sICdvcHRpb24nKTsgY29udGV4dDogZ3JvdXBPck9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoIWZpbHRlcmVkRGF0YT8ubGVuZ3RoICYmIG5vUmVzdWx0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwic2VsZWN0Mi1uby1yZXN1bHQgc2VsZWN0Mi1yZXN1bHRzX19vcHRpb25cIiBbaW5uZXJIVE1MXT1cIm5vUmVzdWx0TWVzc2FnZVwiPjwvbGk+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtYXhSZXN1bHRzRXhjZWVkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi10b28tbXVjaC1yZXN1bHQgc2VsZWN0Mi1yZXN1bHRzX19vcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwibWF4UmVzdWx0c01lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbGk+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
1170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0Mi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1zZWxlY3QyLWNvbXBvbmVudC9zcmMvbGliL3NlbGVjdDIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctc2VsZWN0Mi1jb21wb25lbnQvc3JjL2xpYi9zZWxlY3QyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxtQkFBbUIsR0FJdEIsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBRUgsU0FBUyxFQUVULFNBQVMsRUFFVCxZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBQ0osV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixLQUFLLEVBQ0wsZUFBZSxFQUNmLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBZS9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7OztBQUUvQyxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7QUFPckIsTUFBTSxTQUFTLEdBQXlCLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3BILE1BQU0sWUFBWSxHQUF5QixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2pGLE1BQU0sVUFBVSxHQUF5QixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FB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U0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNWLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsU0FBUztnQkFDWSxPQUFPO3NCQUF0QyxZQUFZO3VCQUFDLFFBQVE7Z0JBQ1ksV0FBVztzQkFBNUMsU0FBUzt1QkFBQyxhQUFhO2dCQUNPLFFBQVE7c0JBQXRDLFNBQVM7dUJBQUMsVUFBVTtnQkF5Q3JCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcbiAgICBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UsXG4gICAgQ29ubmVjdGVkUG9zaXRpb24sXG4gICAgVmVydGljYWxDb25uZWN0aW9uUG9zLFxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBWaWV3cG9ydFJ1bGVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRSZWYsIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIEF0dHJpYnV0ZSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRG9DaGVjayxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgU2VsZixcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgY29tcHV0ZWQsXG4gICAgaW5wdXQsXG4gICAgbnVtYmVyQXR0cmlidXRlLFxuICAgIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUdyb3VwRGlyZWN0aXZlLCBOZ0NvbnRyb2wsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICAgIFNlbGVjdDJBdXRvQ3JlYXRlRXZlbnQsXG4gICAgU2VsZWN0MkRhdGEsXG4gICAgU2VsZWN0Mkdyb3VwLFxuICAgIFNlbGVjdDJPcHRpb24sXG4gICAgU2VsZWN0MlJlbW92ZUV2ZW50LFxuICAgIFNlbGVjdDJTY3JvbGxFdmVudCxcbiAgICBTZWxlY3QyU2VhcmNoRXZlbnQsXG4gICAgU2VsZWN0MlNlbGVjdGlvbk92ZXJyaWRlLFxuICAgIFNlbGVjdDJVcGRhdGVFdmVudCxcbiAgICBTZWxlY3QyVXBkYXRlVmFsdWUsXG4gICAgU2VsZWN0MlZhbHVlLFxufSBmcm9tICcuL3NlbGVjdDItaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBTZWxlY3QyVXRpbHMgfSBmcm9tICcuL3NlbGVjdDItdXRpbHMnO1xuXG5sZXQgbmV4dFVuaXF1ZUlkID0gMDtcblxuaW50ZXJmYWNlIEtleUluZm8ge1xuICAgIGtleTogc3RyaW5nO1xuICAgIGFsdEtleTogYm9vbGVhbjtcbn1cblxuY29uc3QgT1BFTl9LRVlTOiAoc3RyaW5nIHwgS2V5SW5mbylbXSA9IFsnQXJyb3dEb3duJywgJ0Fycm93VXAnLCAnRW50ZXInLCAnICcsICdIb21lJywgJ0VuZCcsICdQYWdlVXAnLCAnUGFnZURvd24nXTtcbmNvbnN0IE9OX09QRU5fS0VZUzogKHN0cmluZyB8IEtleUluZm8pW10gPSBbJ0hvbWUnLCAnRW5kJywgJ1BhZ2VVcCcsICdQYWdlRG93biddO1xuY29uc3QgQ0xPU0VfS0VZUzogKHN0cmluZyB8IEtleUluZm8pW10gPSBbJ0VzY2FwZScsICdUYWInLCB7IGtleTogJ0Fycm93VXAnLCBhbHRLZXk6IHRydWUgfV07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnc2VsZWN0MicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdDIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NlbGVjdDIuY29tcG9uZW50LnNjc3MnXSxcbiAgICBob3N0OiB7XG4gICAgICAgICdbaWRdJzogJ2lkKCknLFxuICAgIH0sXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdDIgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBEb0NoZWNrLCBBZnRlclZpZXdJbml0IHtcbiAgICByZWFkb25seSBfdWlkID0gYHNlbGVjdDItJHtuZXh0VW5pcXVlSWQrK31gO1xuICAgIF9kYXRhOiBTZWxlY3QyRGF0YTtcblxuICAgIC8qKiBkYXRhIG9mIG9wdGlvbnMgJiBvcHRpb25ncnBzICovXG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc2V0IGRhdGEoZGF0YTogU2VsZWN0MkRhdGEpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKHRydWUpO1xuICAgIH1cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBtaW5DaGFyRm9yU2VhcmNoID0gMDtcbiAgICBASW5wdXQoKSBkaXNwbGF5U2VhcmNoU3RhdHVzOiAnZGVmYXVsdCcgfCAnaGlkZGVuJyB8ICdhbHdheXMnO1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBsaW1pdFNlbGVjdGlvbiA9IDA7XG4gICAgQElucHV0KCkgbGlzdFBvc2l0aW9uOiAnYWJvdmUnIHwgJ2JlbG93JyB8ICdhdXRvJyA9ICdiZWxvdyc7XG5cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBnZXQgbXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tdWx0aXBsZTtcbiAgICB9XG4gICAgc2V0IG11bHRpcGxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX211bHRpcGxlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubmdPbkluaXQoKTtcbiAgICB9XG5cbiAgICAvKiogdXNlIHRoZSBtYXRlcmlhbCBzdHlsZSAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIG92ZXJsYXkgPSBmYWxzZTtcblxuICAgIC8qKiB1c2UgdGhlIG1hdGVyaWFsIHN0eWxlICovXG4gICAgQElucHV0KCkgc3R5bGVNb2RlOiAnbWF0ZXJpYWwnIHwgJ25vU3R5bGUnIHwgJ2JvcmRlcmxlc3MnIHwgJ2RlZmF1bHQnID0gJ2RlZmF1bHQnO1xuXG4gICAgLyoqIG1lc3NhZ2Ugd2hlbiBubyByZXN1bHQgKi9cbiAgICBASW5wdXQoKSBub1Jlc3VsdE1lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKiBtYXhpbXVtIHJlc3VsdHMgbGltaXQgKDAgPSBubyBsaW1pdCkgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBtYXhSZXN1bHRzID0gMDtcblxuICAgIC8qKiBtZXNzYWdlIHdoZW4gbWF4aW11bSByZXN1bHRzICovXG4gICAgQElucHV0KCkgbWF4UmVzdWx0c01lc3NhZ2UgPSAnVG9vIG1hbnkgcmVzdWx0c+KApic7XG5cbiAgICAvKiogaW5maW5pdGUgc2Nyb2xsIGRpc3RhbmNlICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgaW5maW5pdGVTY3JvbGxEaXN0YW5jZSA9IDEuNTtcblxuICAgIC8qKiBpbmZpbml0ZSBzY3JvbGwgZGlzdGFuY2UgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBpbmZpbml0ZVNjcm9sbFRocm90dGxlID0gMTUwO1xuXG4gICAgLyoqIGluZmluaXRlIHNjcm9sbCBhY3RpdmF0ZWQgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgaW5maW5pdGVTY3JvbGwgPSBmYWxzZTtcblxuICAgIC8qKiBhdXRvIGNyZWF0ZSBpZiBub3QgZXhpc3QgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgYXV0b0NyZWF0ZSA9IGZhbHNlO1xuXG4gICAgLyoqIG5vIHRlbXBsYXRlIGZvciBsYWJlbCBzZWxlY3Rpb24gKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbm9MYWJlbFRlbXBsYXRlID0gZmFsc2U7XG5cbiAgICAvKiogdXNlIGl0IGZvciBjaGFuZ2UgdGhlIHBhdHRlcm4gb2YgdGhlIGZpbHRlciBzZWFyY2ggKi9cbiAgICBASW5wdXQoKSBlZGl0UGF0dGVybjogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbiAgICAvKiogdGVtcGxhdGUocykgZm9yIGZvcm1hdHRpbmcgKi9cbiAgICBASW5wdXQoKSB0ZW1wbGF0ZXM6IFRlbXBsYXRlUmVmPGFueT4gfCB7IFtrZXk6IHN0cmluZ106IFRlbXBsYXRlUmVmPGFueT4gfTtcblxuICAgIC8qKiB0ZW1wbGF0ZSBmb3IgZm9ybWF0dGluZyBzZWxlY3RlZCBvcHRpb24gKi9cbiAgICBASW5wdXQoKSB0ZW1wbGF0ZVNlbGVjdGlvbjogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKiB0aGUgbWF4IGhlaWdodCBvZiB0aGUgcmVzdWx0cyBjb250YWluZXIgd2hlbiBvcGVuaW5nIHRoZSBzZWxlY3QgKi9cbiAgICBASW5wdXQoKSByZXN1bHRNYXhIZWlnaHQgPSAnMjAwcHgnO1xuXG4gICAgLyoqIEFjdGl2ZSBTZWFyY2ggZXZlbnQgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY3VzdG9tU2VhcmNoRW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqIG1pbmltYWwgZGF0YSBvZiBzaG93IHRoZSBzZWFyY2ggZmllbGQgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICAgIGdldCBtaW5Db3VudEZvclNlYXJjaCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluQ291bnRGb3JTZWFyY2g7XG4gICAgfVxuICAgIHNldCBtaW5Db3VudEZvclNlYXJjaCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX21pbkNvdW50Rm9yU2VhcmNoID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlU2VhcmNoQm94KCk7XG4gICAgfVxuXG4gICAgLyoqIFVuaXF1ZSBpZCBvZiB0aGUgZWxlbWVudC4gKi9cbiAgICBpZCA9IGlucHV0PHN0cmluZz4odGhpcy5fdWlkKTtcbiAgICBpZExhYmVsID0gY29tcHV0ZWQoKCkgPT4gYCR7dGhpcy5pZCgpfS1sYWJlbGApO1xuICAgIGlkQ29tYm8gPSBjb21wdXRlZCgoKSA9PiBgJHt0aGlzLmlkKCl9LWNvbWJvYCk7XG4gICAgaWRPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4gYCR7dGhpcy5pZCgpfS1vcHRpb25zYCk7XG4gICAgaWRPdmVybGF5ID0gY29tcHV0ZWQoKCkgPT4gYCR7dGhpcy5pZCgpfS1vdmVybGF5YCk7XG5cbiAgICB0aXRsZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgICBhcmlhTGFiZWxsZWRieSA9IGlucHV0PHN0cmluZz4oKTtcbiAgICBhcmlhRGVzY3JpYmVkYnkgPSBpbnB1dDxzdHJpbmc+KCk7XG4gICAgYXJpYUludmFsaWQgPSBpbnB1dDxib29sZWFuLCB1bmtub3duPihmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG4gICAgYXJpYVJlc2V0QnV0dG9uRGVzY3JpcHRpb24gPSBpbnB1dDxzdHJpbmc+KCdSZXNldCcpO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgcmVxdWlyZWQuICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHJlcXVpcmVkID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgaGlkZGVuLiAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRyb2wgPyB0aGlzLl9jb250cm9sLmRpc2FibGVkIDogdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuICAgIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIGl0ZW1zIGFyZSBoaWRkZW4gd2hlbiBoYXMuICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGhpZGVTZWxlY3RlZEl0ZW1zID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciB0aGUgZWxlbWVudCBpcyByZWFkb25seS4gKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcmVhZG9ubHkgPSBmYWxzZTtcblxuICAgIC8qKiBUaGUgaW5wdXQgZWxlbWVudCdzIHZhbHVlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIHNldCB2YWx1ZSh2YWx1ZTogU2VsZWN0MlVwZGF0ZVZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnRlc3RWYWx1ZUNoYW5nZSh0aGlzLl92YWx1ZSwgdmFsdWUpKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlID8/IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZSh2YWx1ZSA/PyBudWxsKTtcbiAgICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUYWIgaW5kZXggZm9yIHRoZSBzZWxlY3QyIGVsZW1lbnQuICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcbiAgICBnZXQgdGFiSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgPyAtMSA6IHRoaXMuX3RhYkluZGV4O1xuICAgIH1cbiAgICBzZXQgdGFiSW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgICAgICB0aGlzLl90YWJJbmRleCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKiByZXNldCB3aXRoIG5vIHNlbGVjdGVkIHZhbHVlICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcmVzZXR0YWJsZSA9IGZhbHNlO1xuXG4gICAgLyoqIHNlbGVjdGVkIHZhbHVlIHdoZW4gw5cgaXMgY2xpY2tlZCAqL1xuICAgIEBJbnB1dCgpIHJlc2V0U2VsZWN0ZWRWYWx1ZTogYW55O1xuXG4gICAgLyoqIGdyaWQ6IGl0ZW0gYnkgbGluZVxuICAgICAqICogMCA9IG5vIGdyaWRcbiAgICAgKiAqIG51bWJlciA9IGl0ZW0gYnkgbGluZSAoNClcbiAgICAgKiAqIHN0cmluZyA9IG1pbmltYWwgc2l6ZSBpdGVtICgxMDBweClcbiAgICAgKi9cbiAgICBASW5wdXQoKSBncmlkID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlIHNlbGVjdGlvbiBieSBhIHRleHRcbiAgICAgKiAqIGlmIHN0cmluZzogYCVzaXplJWAgPSB0b3RhbCBzZWxlY3RlZCBvcHRpb25zXG4gICAgICogKiBpZiBmdW5jdGlvbjoganVzdGUgc2hvdyB0aGUgc3RyaW5nXG4gICAgICovXG4gICAgQElucHV0KCkgc2VsZWN0aW9uT3ZlcnJpZGU6IFNlbGVjdDJTZWxlY3Rpb25PdmVycmlkZTtcblxuICAgIC8qKiBmb3JjZSBzZWxlY3Rpb24gb24gb25lIGxpbmUgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNlbGVjdDItc2VsZWN0aW9uLW5vd3JhcCcpXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgc2VsZWN0aW9uTm9XcmFwID0gZmFsc2U7XG5cbiAgICAvKiogQWRkIGFuIG9wdGlvbiB0byBzZWxlY3Qgb3IgcmVtb3ZlIGFsbCAoaWYgYWxsIGlzIHNlbGVjdGVkKSAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHNob3dTZWxlY3RBbGwgPSBmYWxzZTtcblxuICAgIC8qKiBUZXh0IGZvciByZW1vdmUgYWxsIG9wdGlvbnMgKi9cbiAgICBASW5wdXQoKVxuICAgIHJlbW92ZUFsbFRleHQgPSAnUmVtb3ZlIGFsbCc7XG5cbiAgICAvKiogVGV4dCBmb3Igc2VsZWN0IGFsbCBvcHRpb25zICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RBbGxUZXh0ID0gJ1NlbGVjdCBhbGwnO1xuXG4gICAgQE91dHB1dCgpIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0MlVwZGF0ZUV2ZW50PFNlbGVjdDJVcGRhdGVWYWx1ZT4+KCk7XG4gICAgQE91dHB1dCgpIGF1dG9DcmVhdGVJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyQXV0b0NyZWF0ZUV2ZW50PFNlbGVjdDJVcGRhdGVWYWx1ZT4+KCk7XG4gICAgQE91dHB1dCgpIG9wZW4gPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdDI+KCk7XG4gICAgQE91dHB1dCgpIGNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyPigpO1xuICAgIEBPdXRwdXQoKSBmb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0Mj4oKTtcbiAgICBAT3V0cHV0KCkgYmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0Mj4oKTtcbiAgICBAT3V0cHV0KCkgc2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyU2VhcmNoRXZlbnQ8U2VsZWN0MlVwZGF0ZVZhbHVlPj4oKTtcbiAgICBAT3V0cHV0KCkgc2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyU2Nyb2xsRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpIHJlbW92ZU9wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0MlJlbW92ZUV2ZW50PFNlbGVjdDJVcGRhdGVWYWx1ZT4+KCk7XG5cbiAgICBvcHRpb246IFNlbGVjdDJPcHRpb24gfCBTZWxlY3QyT3B0aW9uW10gfCBudWxsID0gbnVsbDtcbiAgICBpc09wZW4gPSBmYWxzZTtcbiAgICBzZWFyY2hTdHlsZTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZm9jdXNlZCBvciBub3QuICovXG4gICAgZm9jdXNlZCA9IGZhbHNlO1xuXG4gICAgZmlsdGVyZWREYXRhID0gc2lnbmFsPFNlbGVjdDJEYXRhIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgZ2V0IHNlbGVjdDJPcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSA/ICh0aGlzLm9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uW10pIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0Mk9wdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgPyBudWxsIDogKHRoaXMub3B0aW9uIGFzIFNlbGVjdDJPcHRpb24pO1xuICAgIH1cblxuICAgIGdldCBzZWFyY2hUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbm5lclNlYXJjaFRleHQ7XG4gICAgfVxuXG4gICAgc2V0IHNlYXJjaFRleHQodGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuaW5uZXJTZWFyY2hUZXh0ID0gdGV4dDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1hdGVyaWFsJylcbiAgICBnZXQgY2xhc3NNYXRlcmlhbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVNb2RlID09PSAnbWF0ZXJpYWwnO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3Mubm9zdHlsZScpXG4gICAgZ2V0IGNsYXNzTm9zdHlsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVNb2RlID09PSAnbm9TdHlsZSc7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5ib3JkZXJsZXNzJylcbiAgICBnZXQgY2xhc3NCb3JkZXJsZXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZU1vZGUgPT09ICdib3JkZXJsZXNzJztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNlbGVjdDItYWJvdmUnKVxuICAgIGdldCBzZWxlY3QyYWJvdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5vdmVybGF5ID8gdGhpcy5saXN0UG9zaXRpb24gPT09ICdhYm92ZScgOiB0aGlzLl9pc0Fib2JlT3ZlcmxheSgpO1xuICAgIH1cblxuICAgIG92ZXJsYXlXaWR0aDogbnVtYmVyO1xuICAgIG92ZXJsYXlIZWlnaHQ6IG51bWJlcjtcbiAgICBfdHJpZ2dlclJlY3Q6IERPTVJlY3Q7XG4gICAgX2Ryb3Bkb3duUmVjdDogRE9NUmVjdDtcblxuICAgIGdldCBfcG9zaXRpb25zKCk6IENvbm5lY3RlZFBvc2l0aW9uW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0UG9zaXRpb24gPT09ICdhdXRvJyA/IHVuZGVmaW5lZCA6IG51bGw7XG4gICAgfVxuXG4gICAgbWF4UmVzdWx0c0V4Y2VlZGVkOiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBfbWluQ291bnRGb3JTZWFyY2g/OiBudW1iZXI7XG5cbiAgICBAVmlld0NoaWxkKENka0Nvbm5lY3RlZE92ZXJsYXkpIHByaXZhdGUgY2RrQ29ubmVjdGVkT3ZlcmxheTogQ2RrQ29ubmVjdGVkT3ZlcmxheTtcbiAgICBAVmlld0NoaWxkKCdzZWxlY3Rpb24nLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHNlbGVjdGlvbjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gICAgQFZpZXdDaGlsZCgncmVzdWx0cycpIHByaXZhdGUgcmVzdWx0Q29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgICBAVmlld0NoaWxkcmVuKCdyZXN1bHQnKSBwcml2YXRlIHJlc3VsdHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcpIHByaXZhdGUgc2VhcmNoSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICAgIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJykgcHJpdmF0ZSBkcm9wZG93bjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBwcml2YXRlIGhvdmVyaW5nT3B0aW9uID0gc2lnbmFsPFNlbGVjdDJPcHRpb24gfCBudWxsPihudWxsKTtcbiAgICBob3ZlcmluZ09wdGlvbklkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5nZXRFbGVtZW50SWQodGhpcy5ob3ZlcmluZ09wdGlvbigpKSk7XG5cbiAgICBwcml2YXRlIGlubmVyU2VhcmNoVGV4dCA9ICcnO1xuICAgIHByaXZhdGUgaXNTZWFyY2hib3hIaWRkZW46IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIHNlbGVjdGlvbkVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgcHJpdmF0ZSBnZXQgcmVzdWx0c0VsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKiBUYWIgaW5kZXggZm9yIHRoZSBlbGVtZW50LiAqL1xuICAgIHByaXZhdGUgX3RhYkluZGV4OiBudW1iZXI7XG5cbiAgICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX211bHRpcGxlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfdmFsdWU6IFNlbGVjdDJVcGRhdGVWYWx1ZSA9IG51bGw7XG4gICAgcHJpdmF0ZSBfcHJldmlvdXNOYXRpdmVWYWx1ZTogU2VsZWN0MlVwZGF0ZVZhbHVlO1xuICAgIHByaXZhdGUgX292ZXJsYXlQb3NpdGlvbjogVmVydGljYWxDb25uZWN0aW9uUG9zO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBfdmlld3BvcnRSdWxlcjogVmlld3BvcnRSdWxlcixcbiAgICAgICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9wYXJlbnRGb3JtOiBOZ0Zvcm0sXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX3BhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgICAgICBAU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBfY29udHJvbDogTmdDb250cm9sLFxuICAgICAgICBAQXR0cmlidXRlKCd0YWJpbmRleCcpIHRhYkluZGV4OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX3RhYkluZGV4ID0gcGFyc2VJbnQodGFiSW5kZXgsIDEwKSB8fCAwO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICAgIGNsaWNrRGV0ZWN0aW9uKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuICYmIGZvY3VzKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmICghdGhpcy5pZlBhcmVudENvbnRhaW5zQ2xhc3ModGFyZ2V0LCAnc2VsZWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaWZQYXJlbnRDb250YWluc0NsYXNzKHRhcmdldCwgJ3NlbGVjdDItZHJvcGRvd24nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU9wZW5BbmRDbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3ZlcmxheSAmJiAhdGhpcy5pZlBhcmVudENvbnRhaW5zSWQodGFyZ2V0LCB0aGlzLmlkKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tFeGl0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pZlBhcmVudENvbnRhaW5zSWQodGFyZ2V0LCB0aGlzLmlkKCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVPcGVuQW5kQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrRXhpdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9jdXNlZCkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLl9mb2N1cyh0aGlzLmNsaWNrT25TZWxlY3QyRWxlbWVudCh0YXJnZXQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHNlbGVjdCBoYXMgYmVlbiB0b3VjaGVkICovXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkID0gKCkgPT4ge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgfTtcblxuICAgIC8qKiBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHZhbHVlIGNoYW5nZXMgKi9cbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9O1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuX3ZpZXdwb3J0UnVsZXIuY2hhbmdlKDEwMCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uID0gU2VsZWN0MlV0aWxzLmdldE9wdGlvbnNCeVZhbHVlKFxuICAgICAgICAgICAgdGhpcy5fZGF0YSxcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wgPyB0aGlzLl9jb250cm9sLnZhbHVlIDogdGhpcy52YWx1ZSxcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcHRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uID0gb3B0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcHRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVyaW5nT3B0aW9uLnNldChTZWxlY3QyVXRpbHMuZ2V0T3B0aW9uQnlWYWx1ZSh0aGlzLl9kYXRhLCB0aGlzLnZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTZWFyY2hCb3goKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheS5wb3NpdGlvbkNoYW5nZS5zdWJzY3JpYmUoKHBvc0NoYW5nZTogQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0UG9zaXRpb24gPT09ICdhdXRvJyAmJlxuICAgICAgICAgICAgICAgIHBvc0NoYW5nZS5jb25uZWN0aW9uUGFpcj8ub3JpZ2luWSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlQb3NpdGlvbiAhPT0gcG9zQ2hhbmdlLmNvbm5lY3Rpb25QYWlyLm9yaWdpbllcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlY3QoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5UG9zaXRpb24gPSBwb3NDaGFuZ2UuY29ubmVjdGlvblBhaXIub3JpZ2luWTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uRWxlbWVudCA9IHRoaXMuc2VsZWN0aW9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMudHJpZ2dlclJlY3QoKTtcbiAgICB9XG5cbiAgICBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2VhcmNoQm94KCk7XG4gICAgICAgIHRoaXMuX2RpcnR5Q2hlY2tOYXRpdmVWYWx1ZSgpO1xuICAgICAgICBpZiAodGhpcy5fdHJpZ2dlclJlY3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXlXaWR0aCAhPT0gdGhpcy5fdHJpZ2dlclJlY3Qud2lkdGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlXaWR0aCA9IHRoaXMuX3RyaWdnZXJSZWN0LndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2Ryb3Bkb3duUmVjdD8uaGVpZ2h0ID4gMCAmJiB0aGlzLm92ZXJsYXlIZWlnaHQgIT09IHRoaXMuX2Ryb3Bkb3duUmVjdC5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlIZWlnaHQgPSB0aGlzLmxpc3RQb3NpdGlvbiA9PT0gJ2F1dG8nID8gdGhpcy5fZHJvcGRvd25SZWN0LmhlaWdodCA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVTZWFyY2hCb3goKSB7XG4gICAgICAgIGNvbnN0IGhpZGRlbiA9XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlTZWFyY2hTdGF0dXMgPT09ICdoaWRkZW4nIHx8XG4gICAgICAgICAgICAodGhpcy5kaXNwbGF5U2VhcmNoU3RhdHVzICE9PSAnYWx3YXlzJyAmJlxuICAgICAgICAgICAgICAgICF0aGlzLmN1c3RvbVNlYXJjaEVuYWJsZWQgJiZcbiAgICAgICAgICAgICAgICBTZWxlY3QyVXRpbHMuaXNTZWFyY2hib3hIaWRkZW4odGhpcy5fZGF0YSwgdGhpcy5fbWluQ291bnRGb3JTZWFyY2gpKTtcblxuICAgICAgICBpZiAodGhpcy5pc1NlYXJjaGJveEhpZGRlbiAhPT0gaGlkZGVuKSB7XG4gICAgICAgICAgICB0aGlzLmlzU2VhcmNoYm94SGlkZGVuID0gaGlkZGVuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0T3B0aW9uU3R5bGUob3B0aW9uOiBTZWxlY3QyT3B0aW9uKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAnc2VsZWN0Mi1yZXN1bHRzX19vcHRpb24gJyArXG4gICAgICAgICAgICAob3B0aW9uLmhpZGUgPyAnc2VsZWN0Mi1yZXN1bHRzX19vcHRpb24tLWhpZGUgJyA6ICcnKSArXG4gICAgICAgICAgICAob3B0aW9uID09PSB0aGlzLmhvdmVyaW5nT3B0aW9uKCkgPyAnc2VsZWN0Mi1yZXN1bHRzX19vcHRpb24tLWhpZ2hsaWdodGVkICcgOiAnJykgK1xuICAgICAgICAgICAgKG9wdGlvbi5jbGFzc2VzIHx8ICcnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG1vdXNlZW50ZXIob3B0aW9uOiBTZWxlY3QyT3B0aW9uKSB7XG4gICAgICAgIGlmICghb3B0aW9uLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVyaW5nT3B0aW9uLnNldChvcHRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xpY2sob3B0aW9uOiBTZWxlY3QyT3B0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLnRlc3RTZWxlY3Rpb24ob3B0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Qob3B0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0KGV2ZW50PzogTW91c2VFdmVudCkge1xuICAgICAgICAvLyBjb25zdCB0ZXN0ID0gU2VsZWN0MlV0aWxzLmdldE9wdGlvbkJ5VmFsdWUodGhpcy5fZGF0YSwgdGhpcy5yZXNldFNlbGVjdGVkVmFsdWUpO1xuICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgdGhpcy5zZWxlY3QoXG4gICAgICAgICAgICB0aGlzLnJlc2V0U2VsZWN0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyAoU2VsZWN0MlV0aWxzLmdldE9wdGlvbkJ5VmFsdWUodGhpcy5fZGF0YSwgdGhpcy5yZXNldFNlbGVjdGVkVmFsdWUpID8/IG51bGwpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2ZvY3VzKHRydWUpO1xuICAgIH1cblxuICAgIHByZXZDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHN0b3BFdmVudChldmVudDogRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlT3BlbkFuZENsb3NlKGZvY3VzID0gdHJ1ZSwgb3Blbj86IGJvb2xlYW4sIGV2ZW50PzogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm9jdXMoZm9jdXMpO1xuXG4gICAgICAgIGNvbnN0IG9uT3BlbkFjdGlvbiA9IGV2ZW50ICYmIHRoaXMuX3Rlc3RLZXkoZXZlbnQsIE9OX09QRU5fS0VZUyk7XG4gICAgICAgIGNvbnN0IGNoYW5nZUVtaXQgPSB0aGlzLmlzT3BlbiAhPT0gKG9wZW4gPz8gIXRoaXMuaXNPcGVuKTtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBvcGVuID8/ICF0aGlzLmlzT3BlbjtcblxuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1NlYXJjaGJveEhpZGRlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJTZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJlZERhdGEoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1NlYXJjaGJveChmb2N1cyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2VhcmNoYm94SGlkZGVuICYmICFjaGFuZ2VFbWl0ICYmIGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlEb3duKGV2ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvblswXSA6IHRoaXMub3B0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxGcm9tT3B0aW9uKG9wdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXN1bHRzRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvbk9wZW5BY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua2V5RG93bihldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNka0Nvbm5lY3RlZE92ZXJsYXk/Lm92ZXJsYXlSZWY/LnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hhbmdlRW1pdCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3Blbi5lbWl0KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZUVtaXQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UuZW1pdCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIGhhc1RlbXBsYXRlKG9wdGlvbjogU2VsZWN0Mk9wdGlvbiB8IFNlbGVjdDJHcm91cCwgZGVmYXVsdFZhbHVlOiBzdHJpbmcsIHNlbGVjdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoc2VsZWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLnRlbXBsYXRlcz8uWyhvcHRpb24gYXMgU2VsZWN0Mk9wdGlvbikudGVtcGxhdGVTZWxlY3Rpb25JZF0gaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LltgJHtkZWZhdWx0VmFsdWV9U2VsZWN0aW9uYF0gaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LltgdGVtcGxhdGVTZWxlY3Rpb25gXSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmIHx8XG4gICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlU2VsZWN0aW9uIGluc3RhbmNlb2YgVGVtcGxhdGVSZWZcbiAgICAgICAgICAgICAgICA6IGZhbHNlKSB8fFxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LltvcHRpb24udGVtcGxhdGVJZF0gaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiB8fFxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LltkZWZhdWx0VmFsdWVdIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYgfHxcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzPy5bJ3RlbXBsYXRlJ10gaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiB8fFxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXMgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiB8fFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRUZW1wbGF0ZShvcHRpb246IFNlbGVjdDJPcHRpb24gfCBTZWxlY3QyR3JvdXAsIGRlZmF1bHRWYWx1ZTogc3RyaW5nLCBzZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNUZW1wbGF0ZShvcHRpb24sIGRlZmF1bHRWYWx1ZSwgc2VsZWN0KVxuICAgICAgICAgICAgPyAoc2VsZWN0XG4gICAgICAgICAgICAgICAgICA/IHRoaXMudGVtcGxhdGVzPy5bKG9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uKS50ZW1wbGF0ZVNlbGVjdGlvbklkXSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlcz8uW2Ake2RlZmF1bHRWYWx1ZX1TZWxlY3Rpb25gXSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlcz8uW2B0ZW1wbGF0ZVNlbGVjdGlvbmBdIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVTZWxlY3Rpb25cbiAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkKSB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LltvcHRpb24udGVtcGxhdGVJZF0gfHxcbiAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzPy5bZGVmYXVsdFZhbHVlXSB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LlsndGVtcGxhdGUnXSB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXNcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRyaWdnZXJSZWN0KCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyUmVjdCA9IHRoaXMuc2VsZWN0aW9uRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5fZHJvcGRvd25SZWN0ID0gdGhpcy5kcm9wZG93bj8ubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgPyB0aGlzLmRyb3Bkb3duLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlzTnVtYmVyKG86IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIWlzTmFOKG8gLSAwKSAmJiBvICE9PSBudWxsICYmIG8gIT09ICcnICYmIG8gIT09IGZhbHNlO1xuICAgIH1cblxuICAgIHNlbGVjdEFsbCgpIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RBbGxUZXN0KCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zOiBTZWxlY3QyT3B0aW9uW10gPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChTZWxlY3QyVXRpbHMuaXNHcm91cChlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5vcHRpb25zLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLmRpc2FibGVkICYmICFmLmhpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKGYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFlLmRpc2FibGVkICYmICFlLmhpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uID0gb3B0aW9ucztcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gb3B0aW9ucy5tYXAoZSA9PiBlLnZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb24gPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWxlY3RBbGxUZXN0KCkge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KHRoaXMub3B0aW9uKSAmJiB0aGlzLm9wdGlvbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gMDtcbiAgICAgICAgICAgIHRoaXMuX2RhdGEuZm9yRWFjaChlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoU2VsZWN0MlV0aWxzLmlzR3JvdXAoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5vcHRpb25zLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYuZGlzYWJsZWQgJiYgIWYuaGlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZS5kaXNhYmxlZCAmJiAhZS5oaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbi5sZW5ndGggPT09IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdGVzdFNlbGVjdGlvbihvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgaWYgKG9wdGlvbi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICF0aGlzLm11bHRpcGxlIHx8XG4gICAgICAgICAgICAhdGhpcy5saW1pdFNlbGVjdGlvbiB8fFxuICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpICYmIHRoaXMuX3ZhbHVlLmxlbmd0aCA8IHRoaXMubGltaXRTZWxlY3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0ZXN0VmFsdWVDaGFuZ2UodmFsdWUxOiBTZWxlY3QyVXBkYXRlVmFsdWUsIHZhbHVlMjogU2VsZWN0MlVwZGF0ZVZhbHVlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICgodmFsdWUxID09PSBudWxsIHx8IHZhbHVlMSA9PT0gdW5kZWZpbmVkKSAmJiAodmFsdWUyID09PSBudWxsIHx8IHZhbHVlMiA9PT0gdW5kZWZpbmVkKSkgfHxcbiAgICAgICAgICAgIHZhbHVlMSA9PT0gdmFsdWUyXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGUgJiZcbiAgICAgICAgICAgICh2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pPy5sZW5ndGggJiZcbiAgICAgICAgICAgICh2YWx1ZTIgYXMgU2VsZWN0MlZhbHVlW10pPy5sZW5ndGggJiZcbiAgICAgICAgICAgICh2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pLmxlbmd0aCA9PT0gKHZhbHVlMiBhcyBTZWxlY3QyVmFsdWVbXSkubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlMSBvZiB2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0ID0gKHZhbHVlMiBhcyBTZWxlY3QyVmFsdWVbXSkuaW5kZXhPZihlMSkgPiAtMTtcbiAgICAgICAgICAgICAgICBpZiAoIXRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRmlsdGVyZWREYXRhKHdyaXRlVmFsdWUgPSBmYWxzZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9kYXRhO1xuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgdGhpcy5oaWRlU2VsZWN0ZWRJdGVtcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNlbGVjdDJVdGlscy5nZXRGaWx0ZXJlZFNlbGVjdGVkRGF0YShyZXN1bHQsIHRoaXMub3B0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmN1c3RvbVNlYXJjaEVuYWJsZWQgJiYgdGhpcy5zZWFyY2hUZXh0ICYmIHRoaXMuc2VhcmNoVGV4dC5sZW5ndGggPj0gK3RoaXMubWluQ2hhckZvclNlYXJjaCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNlbGVjdDJVdGlscy5nZXRGaWx0ZXJlZERhdGEocmVzdWx0LCB0aGlzLnNlYXJjaFRleHQsIHRoaXMuZWRpdFBhdHRlcm4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5tYXhSZXN1bHRzID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBTZWxlY3QyVXRpbHMuZ2V0UmVkdWNlRGF0YShyZXN1bHQsICt0aGlzLm1heFJlc3VsdHMpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRhdGEucmVzdWx0O1xuICAgICAgICAgICAgICAgIHRoaXMubWF4UmVzdWx0c0V4Y2VlZGVkID0gZGF0YS5yZWR1Y2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubWF4UmVzdWx0c0V4Y2VlZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChTZWxlY3QyVXRpbHMub3B0aW9uSXNOb3RJbkZpbHRlcmVkRGF0YShyZXN1bHQsIHRoaXMuaG92ZXJpbmdPcHRpb24oKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhvdmVyaW5nT3B0aW9uLnNldChTZWxlY3QyVXRpbHMuZ2V0Rmlyc3RBdmFpbGFibGVPcHRpb24ocmVzdWx0KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh3cml0ZVZhbHVlICYmIHRoaXMuX3ByZXZpb3VzTmF0aXZlVmFsdWUgIT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVmcmVzaCBjdXJyZW50IHNlbGVjdGVkIHZhbHVlXG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMuX2NvbnRyb2wgPyB0aGlzLl9jb250cm9sLnZhbHVlIDogdGhpcy5fdmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YS5zZXQocmVzdWx0KTtcblxuICAgICAgICAgICAgLy8gcmVwbGFjZSBzZWxlY3RlZCBvcHRpb25zIHdoZW4gZGF0YSBjaGFuZ2VcblxuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgJiYgdGhpcy5vcHRpb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogU2VsZWN0Mk9wdGlvbltdID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLm9wdGlvbi5tYXAoZSA9PiBlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChTZWxlY3QyVXRpbHMuaXNHcm91cChlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5vcHRpb25zLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKGYudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaChmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmNsdWRlcyhlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gcHJlc2VydmUgc2VsZWN0aW9uIG9yZGVyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb24gPSB0aGlzLm9wdGlvbi5tYXAoZSA9PiBvcHRpb25zLmZpbmQoZiA9PiBmLnZhbHVlID09PSBlLnZhbHVlKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMub3B0aW9uKSAmJiB0aGlzLm9wdGlvbikge1xuICAgICAgICAgICAgICAgIGxldCBvcHRpb246IFNlbGVjdDJPcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGF0YS5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoU2VsZWN0MlV0aWxzLmlzR3JvdXAoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUub3B0aW9ucy5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5vcHRpb24gYXMgU2VsZWN0Mk9wdGlvbikudmFsdWUgPT09IGYudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5vcHRpb24gYXMgU2VsZWN0Mk9wdGlvbikudmFsdWUgPT09IGUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9IGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbiA9IG9wdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGlja0V4aXQoKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzKGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSW5TZWxlY3QoZWx0OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlmUGFyZW50Q29udGFpbnNJZChlbHQsIHRoaXMuaWQoKSkgfHwgdGhpcy5pZlBhcmVudENvbnRhaW5zSWQoZWx0LCB0aGlzLmlkT3ZlcmxheSgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlmUGFyZW50Q29udGFpbnNDbGFzcyhlbGVtZW50OiBFbGVtZW50LCBjc3NDbGFzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmVudEVsZW1lbnRCeUNsYXNzKGVsZW1lbnQsIGNzc0NsYXNzKSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlmUGFyZW50Q29udGFpbnNJZChlbGVtZW50OiBFbGVtZW50LCBpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmVudEVsZW1lbnRCeUlkKGVsZW1lbnQsIGlkKSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBhcmVudEVsZW1lbnRCeUNsYXNzKGVsZW1lbnQ6IEVsZW1lbnQsIGNzc0NsYXNzOiBzdHJpbmcpOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5DbGFzc2VzKGVsZW1lbnQsIGNzc0NsYXNzLnRyaW0oKS5zcGxpdCgvXFxzKy8pKVxuICAgICAgICAgICAgPyBlbGVtZW50XG4gICAgICAgICAgICA6IGVsZW1lbnQucGFyZW50RWxlbWVudFxuICAgICAgICAgICAgICA/IHRoaXMuZ2V0UGFyZW50RWxlbWVudEJ5Q2xhc3MoZWxlbWVudC5wYXJlbnRFbGVtZW50LCBjc3NDbGFzcylcbiAgICAgICAgICAgICAgOiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGFyZW50RWxlbWVudEJ5SWQoZWxlbWVudDogRWxlbWVudCwgaWQ6IHN0cmluZyk6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaWQgPT09IGlkXG4gICAgICAgICAgICA/IGVsZW1lbnRcbiAgICAgICAgICAgIDogZWxlbWVudC5wYXJlbnRFbGVtZW50XG4gICAgICAgICAgICAgID8gdGhpcy5nZXRQYXJlbnRFbGVtZW50QnlJZChlbGVtZW50LnBhcmVudEVsZW1lbnQsIGlkKVxuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb250YWluQ2xhc3NlcyhlbGVtZW50OiBFbGVtZW50LCBjc3NDbGFzc2VzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWVsZW1lbnQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNzc0NsYXNzIG9mIGNzc0NsYXNzZXMpIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY3NzQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb250YWluQWxtb3N0T25lQ2xhc3NlcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY3NzQ2xhc3Nlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbnRhaW5BbG1vc3RPbmUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBjc3NDbGFzcyBvZiBjc3NDbGFzc2VzKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY3NzQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbkFsbW9zdE9uZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGFpbkFsbW9zdE9uZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsaWNrT25TZWxlY3QyRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluQWxtb3N0T25lQ2xhc3NlcyhlbGVtZW50LCBbXG4gICAgICAgICAgICAnc2VsZWN0Mi1vdmVybGF5LWJhY2tkcm9wJyxcbiAgICAgICAgICAgICdzZWxlY3QyLWxhYmVsLWNvbnRlbnQnLFxuICAgICAgICAgICAgJ3NlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZCcsXG4gICAgICAgICAgICAnc2VsZWN0Mi1yZXN1bHRzX19vcHRpb24nLFxuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICBmb2N1c2luKG9wdGlvbnM/OiBGb2N1c09wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1cyh0cnVlLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3Vzb3V0KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgICAgIGlmICghZXZlbnQucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5pc0luU2VsZWN0KGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0KG9wdGlvbjogU2VsZWN0Mk9wdGlvbiB8IG51bGwsIGVtaXQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIGxldCB2YWx1ZTogYW55O1xuICAgICAgICBpZiAob3B0aW9uICE9PSBudWxsICYmIG9wdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uW107XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcCA9PiBvcC52YWx1ZSA9PT0gb3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaChvcHRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9ICh0aGlzLm9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uW10pLm1hcChvcCA9PiBvcC52YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uID0gb3B0aW9uO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLm9wdGlvbi52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbiAmJiB0aGlzLl92YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlID8/IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gd2hlbiByZW1vdmUgdmFsdWVcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9uKSA/IHRoaXMub3B0aW9uPy5sZW5ndGggOiB0aGlzLm9wdGlvbikge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9wdGlvbiA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiB0aGlzLmhpZGVTZWxlY3RlZEl0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkRGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZW1pdCAmJj0gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnRlc3REaWZmVmFsdWUodGhpcy5fdmFsdWUsIHZhbHVlKTtcblxuICAgICAgICBpZiAodGhpcy5fY29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVtaXQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUgPz8gbnVsbDtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLl92YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvbiA6IHRoaXMub3B0aW9uID8gW3RoaXMub3B0aW9uXSA6IG51bGwsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdGVzdERpZmZWYWx1ZSh2YWwxOiBTZWxlY3QyVXBkYXRlVmFsdWUsIHZhbDI6IGFueSkge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwxKSA/ICh2YWwxIGFzIFtdKT8ubGVuZ3RoICE9PSB2YWwyPy5sZW5ndGggOiB2YWwxICE9PSB2YWwyO1xuICAgIH1cblxuICAgIGtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGNyZWF0ZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChjcmVhdGUgJiYgdGhpcy5fdGVzdEtleShldmVudCwgWydFbnRlciddKSkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVBbmRBZGQoZXZlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZXZlbnQsIFt7IGtleTogJ0Fycm93RG93bicsIGFsdEtleTogZmFsc2UgfV0pKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVEb3duKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZXZlbnQsIFt7IGtleTogJ0Fycm93VXAnLCBhbHRLZXk6IGZhbHNlIH1dKSkge1xuICAgICAgICAgICAgdGhpcy5tb3ZlVXAoKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGVzdEtleShldmVudCwgWydIb21lJ10pKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVTdGFydCgpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90ZXN0S2V5KGV2ZW50LCBbJ0VuZCddKSkge1xuICAgICAgICAgICAgdGhpcy5tb3ZlRW5kKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZXZlbnQsIFsnUGFnZVVwJ10pKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVVcCgxMCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZXZlbnQsIFsnUGFnZURvd24nXSkpIHtcbiAgICAgICAgICAgIHRoaXMubW92ZURvd24oMTApO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90ZXN0S2V5KGV2ZW50LCBbJ0VudGVyJ10pIHx8ICh0aGlzLmlzU2VhcmNoYm94SGlkZGVuICYmIHRoaXMuX3Rlc3RLZXkoZXZlbnQsIFsnICddKSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QnlFbnRlcigpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90ZXN0S2V5KGV2ZW50LCBDTE9TRV9LRVlTKSAmJiB0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVPcGVuQW5kQ2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3BlbktleShldmVudDogS2V5Ym9hcmRFdmVudCwgY3JlYXRlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGNyZWF0ZSAmJiB0aGlzLl90ZXN0S2V5KGV2ZW50LCBbJ0VudGVyJ10pKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFuZEFkZChldmVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGVzdEtleShldmVudCwgT1BFTl9LRVlTKSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVPcGVuQW5kQ2xvc2UodHJ1ZSwgdHJ1ZSwgZXZlbnQpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90ZXN0S2V5KGV2ZW50LCBDTE9TRV9LRVlTKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVPcGVuQW5kQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlYXJjaFVwZGF0ZShlOiBFdmVudCkge1xuICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSAoZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGlmICghdGhpcy5jdXN0b21TZWFyY2hFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkRGF0YSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2guZW1pdCh7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLl92YWx1ZSxcbiAgICAgICAgICAgICAgICBzZWFyY2g6IHRoaXMuc2VhcmNoVGV4dCxcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLl9kYXRhLFxuICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YTogKGRhdGE6IFNlbGVjdDJEYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWREYXRhLnNldChkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJhY2tCeShfaW5kZXg6IG51bWJlciwgaXRlbTogU2VsZWN0Mkdyb3VwIHwgU2VsZWN0Mk9wdGlvbik6IGFueSB7XG4gICAgICAgIHJldHVybiAoaXRlbSBhcyBTZWxlY3QyT3B0aW9uKS52YWx1ZSA/PyBpdGVtO1xuICAgIH1cblxuICAgIGlzU2VsZWN0ZWQob3B0aW9uOiBTZWxlY3QyT3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBTZWxlY3QyVXRpbHMuaXNTZWxlY3RlZCh0aGlzLm9wdGlvbiwgb3B0aW9uLCB0aGlzLm11bHRpcGxlKTtcbiAgICB9XG5cbiAgICBpc0Rpc2FibGVkKG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICByZXR1cm4gb3B0aW9uLmRpc2FibGVkID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG5cbiAgICByZW1vdmVTZWxlY3Rpb24oZTogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQsIG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICBpZiAodGhpcy5yZWFkb25seSB8fCB0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBTZWxlY3QyVXRpbHMucmVtb3ZlU2VsZWN0aW9uKHRoaXMub3B0aW9uLCBvcHRpb24pO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMuaGlkZVNlbGVjdGVkSXRlbXMpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLm9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uW10pLm1hcChvcCA9PiBvcC52YWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2wpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUgPz8gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlLmVtaXQoe1xuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgb3B0aW9uczogQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvbiA6IHRoaXMub3B0aW9uID8gW3RoaXMub3B0aW9uXSA6IG51bGwsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlbW92ZU9wdGlvbi5lbWl0KHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIHJlbW92ZWRPcHRpb246IG9wdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNTZWFyY2hib3goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbW9kZWwgdmFsdWUuIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAgICogQHBhcmFtIHZhbHVlXG4gICAgICovXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBzZWxlY3QncyB2YWx1ZVxuICAgICAqIGNoYW5nZXMgZnJvbSB1c2VyIGlucHV0LiBQYXJ0IG9mIHRoZSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VcbiAgICAgKiByZXF1aXJlZCB0byBpbnRlZ3JhdGUgd2l0aCBBbmd1bGFyJ3MgY29yZSBmb3JtcyBBUEkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm4gQ2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMuXG4gICAgICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgc2VsZWN0IGlzIGJsdXJyZWRcbiAgICAgKiBieSB0aGUgdXNlci4gUGFydCBvZiB0aGUgQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlIHJlcXVpcmVkXG4gICAgICogdG8gaW50ZWdyYXRlIHdpdGggQW5ndWxhcidzIGNvcmUgZm9ybXMgQVBJLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZuIENhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gdG91Y2hlZC5cbiAgICAgKi9cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgZGlzYWJsZWQuXG4gICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICAgKiBAcGFyYW0gaXNEaXNhYmxlZFxuICAgICAqL1xuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBvblNjcm9sbCh3YXk6ICd1cCcgfCAnZG93bicpIHtcbiAgICAgICAgdGhpcy5zY3JvbGwuZW1pdCh7XG4gICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICAgICAgICB3YXksXG4gICAgICAgICAgICBzZWFyY2g6IHRoaXMuaW5uZXJTZWFyY2hUZXh0LFxuICAgICAgICAgICAgZGF0YTogdGhpcy5fZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2lzRXJyb3JTdGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXNJbnZhbGlkID0gdGhpcy5fY29udHJvbD8uaW52YWxpZDtcbiAgICAgICAgY29uc3QgaXNUb3VjaGVkID0gdGhpcy5fY29udHJvbD8udG91Y2hlZDtcbiAgICAgICAgY29uc3QgaXNTdWJtaXR0ZWQgPSB0aGlzLl9wYXJlbnRGb3JtR3JvdXA/LnN1Ym1pdHRlZCB8fCB0aGlzLl9wYXJlbnRGb3JtPy5zdWJtaXR0ZWQ7XG4gICAgICAgIHJldHVybiAhIShpc0ludmFsaWQgJiYgKGlzVG91Y2hlZCB8fCBpc1N1Ym1pdHRlZCkpO1xuICAgIH1cblxuICAgIF9zZWxlY3Rpb25PdmVycmlkZUxhYmVsKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2VsZWN0aW9uT3ZlcnJpZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk92ZXJyaWRlKHtcbiAgICAgICAgICAgICAgICBzaXplOiB0aGlzLm9wdGlvbnNTaXplKCksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvbiA6IHRoaXMub3B0aW9uID8gW3RoaXMub3B0aW9uXSA6IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5zZWxlY3Rpb25PdmVycmlkZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk92ZXJyaWRlLnJlcGxhY2VBbGwoJyVzaXplJScsIGAke3RoaXMub3B0aW9uc1NpemUoKX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEVsZW1lbnRJZChlbHQ6IFNlbGVjdDJHcm91cCB8IFNlbGVjdDJPcHRpb24gfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICghZWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtpLCBqXSA9IHRoaXMuX2dldEVsZW1lbnRQYXRoKGVsdCk7XG4gICAgICAgIGNvbnN0IHRvU3VmZml4ID0gaW5kZXggPT4gKGluZGV4ICE9PSB1bmRlZmluZWQgPyBgLSR7aW5kZXh9YCA6ICcnKTtcbiAgICAgICAgcmV0dXJuIChlbHQgYXMgU2VsZWN0Mk9wdGlvbikuaWQgPz8gYCR7dGhpcy5pZCgpfS1vcHRpb24ke3RvU3VmZml4KGkpfSR7dG9TdWZmaXgoail9YDtcbiAgICB9XG5cbiAgICBfZ2V0RWxlbWVudFBhdGgoZWx0OiBTZWxlY3QyR3JvdXAgfCBTZWxlY3QyT3B0aW9uKTogbnVtYmVyW10ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbk9yR3JvdXAgPSB0aGlzLl9kYXRhW2ldO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9uT3JHcm91cCA9PT0gZWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtpXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoU2VsZWN0MlV0aWxzLmlzR3JvdXAob3B0aW9uT3JHcm91cCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBqID0gb3B0aW9uT3JHcm91cC5vcHRpb25zLmZpbmRJbmRleChvID0+IG8gPT09IGVsdCk7XG4gICAgICAgICAgICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2ksIGpdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9wdGlvbnNTaXplKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvbi5sZW5ndGggOiB0aGlzLm9wdGlvbiA/IDEgOiAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkSXRlbSh2YWx1ZTogc3RyaW5nKTogU2VsZWN0Mk9wdGlvbiB7XG4gICAgICAgIGxldCBpdGVtID0gU2VsZWN0MlV0aWxzLmdldE9wdGlvbkJ5VmFsdWUodGhpcy5fZGF0YSwgdmFsdWUpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHZhbHVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX2RhdGEucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUFuZEFkZChlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUudHJpbSgpKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5hZGRJdGVtKHZhbHVlLnRyaW0oKSk7XG4gICAgICAgICAgICB0aGlzLmNsaWNrKGl0ZW0pO1xuICAgICAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlID0gJyc7XG4gICAgICAgICAgICB0aGlzLmF1dG9DcmVhdGVJdGVtLmVtaXQoe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBBcnJheS5pc0FycmF5KHRoaXMub3B0aW9uKSA/IHRoaXMub3B0aW9uIDogdGhpcy5vcHRpb24gPyBbdGhpcy5vcHRpb25dIDogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RvcEV2ZW50KGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbW92ZVVwKHRpbWVzID0gMSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRpbWVzOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsRnJvbU9wdGlvbihTZWxlY3QyVXRpbHMuZ2V0UHJldmlvdXNPcHRpb24odGhpcy5maWx0ZXJlZERhdGEoKSwgdGhpcy5ob3ZlcmluZ09wdGlvbigpKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1vdmVEb3duKHRpbWVzID0gMSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRpbWVzOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsRnJvbU9wdGlvbihTZWxlY3QyVXRpbHMuZ2V0TmV4dE9wdGlvbih0aGlzLmZpbHRlcmVkRGF0YSgpLCB0aGlzLmhvdmVyaW5nT3B0aW9uKCkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbW92ZVN0YXJ0KCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbEZyb21PcHRpb24oU2VsZWN0MlV0aWxzLmdldEZpcnN0T3B0aW9uKHRoaXMuZmlsdGVyZWREYXRhKCkpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1vdmVFbmQoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsRnJvbU9wdGlvbihTZWxlY3QyVXRpbHMuZ2V0TGFzdE9wdGlvbih0aGlzLmZpbHRlcmVkRGF0YSgpKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVTY3JvbGxGcm9tT3B0aW9uKG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVyaW5nT3B0aW9uLnNldChvcHRpb24pO1xuICAgICAgICAgICAgY29uc3QgZG9tRWxlbWVudCA9IHRoaXMucmVzdWx0cy5maW5kKHIgPT4gci5uYXRpdmVFbGVtZW50LmlubmVyVGV4dC50cmltKCkgPT09IG9wdGlvbi5sYWJlbCk7XG4gICAgICAgICAgICBpZiAoZG9tRWxlbWVudCAmJiB0aGlzLnJlc3VsdHNFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RDbGllbnRSZWN0ID0gdGhpcy5yZXN1bHRzRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25DbGllbnRSZWN0ID0gZG9tRWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0c0VsZW1lbnQuc2Nyb2xsVG9wID0gb3B0aW9uQ2xpZW50UmVjdC50b3AgLSBsaXN0Q2xpZW50UmVjdC50b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdEJ5RW50ZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmhvdmVyaW5nT3B0aW9uKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0KHRoaXMuaG92ZXJpbmdPcHRpb24oKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF90ZXN0S2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50LCByZWZzOiAoc3RyaW5nIHwgS2V5SW5mbylbXSA9IFtdKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsga2V5LCBhbHRLZXkgfSA9IGV2ZW50O1xuICAgICAgICByZXR1cm4gcmVmcy5zb21lKHJlZiA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmID09PSBrZXk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXkgPT09IHJlZi5rZXkgJiYgYWx0S2V5ID09PSByZWYuYWx0S2V5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzZWxlY3RlZCBvcHRpb24gYmFzZWQgb24gYSB2YWx1ZS4gSWYgbm8gb3B0aW9uIGNhbiBiZVxuICAgICAqIGZvdW5kIHdpdGggdGhlIGRlc2lnbmF0ZWQgdmFsdWUsIHRoZSBzZWxlY3QgdHJpZ2dlciBpcyBjbGVhcmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3NldFNlbGVjdGlvbkJ5VmFsdWUodmFsdWU6IGFueSB8IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbiB8fCAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHZhbHVlICYmICFpc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb24gYXJyYXkgdmFsdWUuJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbiA9IFtdOyAvLyBpZiB2YWx1ZSBpcyBudWxsLCB0aGVuIGVtcHR5IG9wdGlvbiBhbmQgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyBub3QgbnVsbC4gUHJlc2VsZWN0IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlczogYW55ID0gU2VsZWN0MlV0aWxzLmdldE9wdGlvbnNCeVZhbHVlKHRoaXMuX2RhdGEsIHZhbHVlLCB0aGlzLm11bHRpcGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzLm1hcChpdGVtID0+IHRoaXMuc2VsZWN0KGl0ZW0sIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA/Pz0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlc3REaWZmVmFsdWUodGhpcy5fdmFsdWUsIHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvbiA6IHRoaXMub3B0aW9uID8gW3RoaXMub3B0aW9uXSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpeCBpZiB2YWx1ZSBpcyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdChudWxsLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlc3REaWZmVmFsdWUodGhpcy5fdmFsdWUsIHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3ZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBBcnJheS5pc0FycmF5KHRoaXMub3B0aW9uKSA/IHRoaXMub3B0aW9uIDogdGhpcy5vcHRpb24gPyBbdGhpcy5vcHRpb25dIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID8/PSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoU2VsZWN0MlV0aWxzLmdldE9wdGlvbkJ5VmFsdWUodGhpcy5fZGF0YSwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250cm9sLnZpZXdUb01vZGVsVXBkYXRlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRG9lcyBzb21lIG1hbnVhbCBkaXJ0eSBjaGVja2luZyBvbiB0aGUgbmF0aXZlIGlucHV0IGB2YWx1ZWAgcHJvcGVydHkuICovXG4gICAgcHJpdmF0ZSBfZGlydHlDaGVja05hdGl2ZVZhbHVlKCkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzTmF0aXZlVmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c05hdGl2ZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZm9jdXNTZWFyY2hib3goZm9jdXMgPSB0cnVlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1NlYXJjaGJveEhpZGRlbikge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQgJiYgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50ICYmIGZvY3VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZm9jdXMoc3RhdGU6IGJvb2xlYW4sIG9wdGlvbnM/OiBGb2N1c09wdGlvbnMpIHtcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0ZvY3VzID1cbiAgICAgICAgICAgICAgICAhdGhpcy5pc1NlYXJjaGJveEhpZGRlbiAmJiB0aGlzLmlzT3BlbiA/IHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudCA6IHRoaXMuc2VsZWN0aW9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gZWx0VG9Gb2N1cykge1xuICAgICAgICAgICAgICAgIGVsdFRvRm9jdXMuZm9jdXMob3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnNlbGVjdGlvbj8ubmF0aXZlRWxlbWVudCB8fFxuICAgICAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5zZWFyY2hJbnB1dD8ubmF0aXZlRWxlbWVudFxuICAgICAgICApIHtcbiAgICAgICAgICAgIChkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5ibHVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVGb2N1c1N0YXRlKHN0YXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc0Fib2JlT3ZlcmxheSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcmxheSAmJiB0aGlzLl9vdmVybGF5UG9zaXRpb24gJiYgdGhpcy5saXN0UG9zaXRpb24gPT09ICdhdXRvJ1xuICAgICAgICAgICAgPyB0aGlzLl9vdmVybGF5UG9zaXRpb24gPT09ICd0b3AnXG4gICAgICAgICAgICA6IHRoaXMubGlzdFBvc2l0aW9uID09PSAnYWJvdmUnO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdXBkYXRlRm9jdXNTdGF0ZShzdGF0ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAoIXN0YXRlICYmIHRoaXMuZm9jdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gc3RhdGU7XG4gICAgICAgICAgICB0aGlzLmJsdXIuZW1pdCh0aGlzKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSAmJiAhdGhpcy5mb2N1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBzdGF0ZTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMuZW1pdCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxsYWJlbCBjbGFzcz1cInNlbGVjdDItbGFiZWxcIiAoY2xpY2spPVwidG9nZ2xlT3BlbkFuZENsb3NlKClcIiBbaWRdPVwiaWRMYWJlbCgpXCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwic2VsZWN0Mi1sYWJlbFwiPjwvbmctY29udGVudD5cbiAgICBAaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0Mi1yZXF1aXJlZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICB9XG48L2xhYmVsPlxuXG48ZGl2XG4gICAgY2xhc3M9XCJzZWxlY3QyIHNlbGVjdDItY29udGFpbmVyIHNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0XCJcbiAgICBbY2xhc3Muc2VsZWN0Mi1jb250YWluZXItLWZvY3VzXT1cImZvY3VzZWRcIlxuICAgIFtjbGFzcy5zZWxlY3QyLWNvbnRhaW5lci0tYmVsb3ddPVwiIXNlbGVjdDJhYm92ZVwiXG4gICAgW2NsYXNzLnNlbGVjdDItY29udGFpbmVyLS1hYm92ZV09XCJzZWxlY3QyYWJvdmVcIlxuICAgIFtjbGFzcy5zZWxlY3QyLWNvbnRhaW5lci0tb3Blbl09XCJpc09wZW5cIlxuICAgIFtjbGFzcy5zZWxlY3QyLWNvbnRhaW5lci0tZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtjbGFzcy5zZWxlY3QyLWNvbnRhaW5lci0tcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgW2lkXT1cImlkQ29tYm8oKVwiXG4gICAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICAgIGNsYXNzPVwic2VsZWN0aW9uXCJcbiAgICAgICAgI3NlbGVjdGlvblxuICAgICAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgICAgICBbdGFiaW5kZXhdPVwiIXRoaXMuaXNPcGVuID8gdGFiSW5kZXggOiAnLTEnXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZGJ5KCkgPz8gaWRMYWJlbCgpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgICAgICBhcmlhLWhhc3BvcHVwPVwibGlzdGJveFwiXG4gICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiaWRPcHRpb25zKClcIlxuICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiaXNPcGVuID8gaG92ZXJpbmdPcHRpb25JZCgpIDogbnVsbFwiXG4gICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiYXJpYURlc2NyaWJlZGJ5KClcIlxuICAgICAgICBbYXR0ci50aXRsZV09XCJ0aXRsZSgpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cIl9pc0Vycm9yU3RhdGUoKSB8fCBhcmlhSW52YWxpZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwicmVxdWlyZWQgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1yZWFkb25seV09XCJyZWFkb25seSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVPcGVuQW5kQ2xvc2UoKVwiXG4gICAgICAgIChmb2N1cyk9XCJmb2N1c2luKClcIlxuICAgICAgICAoZm9jdXNvdXQpPVwiZm9jdXNvdXQoJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duKT1cIm9wZW5LZXkoJGV2ZW50KVwiXG4gICAgICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAgICAgW2NsYXNzLnNlbGVjdDItZm9jdXNlZF09XCJmb2N1c2VkXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1zZWxlY3Rpb25cIlxuICAgICAgICAgICAgW2NsYXNzLnNlbGVjdDItc2VsZWN0aW9uLS1tdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICAgICAgICBbY2xhc3Muc2VsZWN0Mi1zZWxlY3Rpb24tLXNpbmdsZV09XCIhbXVsdGlwbGVcIlxuICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKHNlbGVjdGlvbk92ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fb3ZlcnJpZGVcIiBbaW5uZXJIVE1MXT1cIl9zZWxlY3Rpb25PdmVycmlkZUxhYmVsKClcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICAgICAgIW11bHRpcGxlICYmIHJlc2V0dGFibGUgJiYgcmVzZXRTZWxlY3RlZFZhbHVlICE9PSB2YWx1ZSAmJiBzZWxlY3QyT3B0aW9uICYmICEoZGlzYWJsZWQgfHwgcmVhZG9ubHkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZXNldEJ1dHRvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gQGVsc2UgaWYgKCFtdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0Mi1zZWxlY3Rpb25fX3JlbmRlcmVkXCIgW3RpdGxlXT1cInNlbGVjdDJPcHRpb24/LmxhYmVsIHx8ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoIXNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKHNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWhhc1RlbXBsYXRlKHNlbGVjdDJPcHRpb24sICdvcHRpb24nLCB0cnVlKSB8fCBub0xhYmVsVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cInNlbGVjdDJPcHRpb24ubGFiZWxcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0VGVtcGxhdGUoc2VsZWN0Mk9wdGlvbiwgJ29wdGlvbicsIHRydWUpOyBjb250ZXh0OiBzZWxlY3QyT3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3QyLXNlbGVjdGlvbl9fcGxhY2Vob2xkZXJfX29wdGlvbl09XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fcGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPnt7IHBsYWNlaG9sZGVyIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChyZXNldHRhYmxlICYmIHJlc2V0U2VsZWN0ZWRWYWx1ZSAhPT0gdmFsdWUgJiYgc2VsZWN0Mk9wdGlvbiAmJiAhKGRpc2FibGVkIHx8IHJlYWRvbmx5KSkge1xuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicmVzZXRCdXR0b25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fYXJyb3dcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+IDwvc3Bhbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZFwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKCFhdXRvQ3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3QyLXNlbGVjdGlvbl9fcGxhY2Vob2xkZXJfX29wdGlvbl09XCJzZWxlY3QyT3B0aW9ucz8ubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fcGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID57eyBwbGFjZWhvbGRlciB9fTwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKG9wIG9mIG9wdGlvbiB8fCBbXTsgdHJhY2sgdHJhY2tCeSgkaW5kZXgsIG9wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fY2hvaWNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwib3AubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cIl91cGRhdGVGb2N1c1N0YXRlKHRydWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJyZW1vdmVTZWxlY3Rpb24oJGV2ZW50LCBvcClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIShkaXNhYmxlZCB8fCByZWFkb25seSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTZWxlY3Rpb24oJGV2ZW50LCBvcClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fY2hvaWNlX19yZW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPsOXPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghaGFzVGVtcGxhdGUob3AsICdvcHRpb24nLCB0cnVlKSB8fCBub0xhYmVsVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJvcC5sYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRUZW1wbGF0ZShvcCwgJ29wdGlvbicsIHRydWUpOyBjb250ZXh0OiBvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoYXV0b0NyZWF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fYXV0by1jcmVhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJzdG9wRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwic3RvcEV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiaWQoKSArICctY3JlYXRlLWZpZWxkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVPcGVuQW5kQ2xvc2UoZmFsc2UsIHRydWUpOyBzdG9wRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImtleURvd24oJGV2ZW50LCB0cnVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJzZWFyY2hVcGRhdGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwicHJldkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLWNyZWF0ZV9fZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRleHRib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29ycmVjdD1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jYXBpdGFsaXplPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIEBpZiAoIW92ZXJsYXkpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuXG4gICAgPGRpdiBjbGFzcz1cInNlbGVjdDItc3Vic2NyaXB0LXdyYXBwZXJcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwic2VsZWN0Mi1oaW50XCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cInNlbGVjdDItb3ZlcmxheS1iYWNrZHJvcFwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidHJpZ2dlclwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cInRoaXMuaXNPcGVuICYmIG92ZXJsYXlcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5TWluV2lkdGhdPVwib3ZlcmxheVdpZHRoXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhlaWdodF09XCJvdmVybGF5SGVpZ2h0XCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uc109XCJfcG9zaXRpb25zXCJcbiAgICAoYmFja2Ryb3BDbGljayk9XCJ0b2dnbGVPcGVuQW5kQ2xvc2UoKVwiXG4+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbnRhaW5lclRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgICAgW2lkXT1cImlkT3ZlcmxheSgpXCJcbiAgICAgICAgY2xhc3M9XCJzZWxlY3QyLWNvbnRhaW5lciBzZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCBzZWxlY3QyLWNvbnRhaW5lci1kcm9wZG93blwiXG4gICAgICAgIFtjbGFzcy5zZWxlY3QyLWNvbnRhaW5lci0tb3Blbl09XCJpc09wZW5cIlxuICAgICAgICBbY2xhc3Muc2VsZWN0Mi1vdmVybGF5XT1cIm92ZXJsYXlcIlxuICAgICAgICBbY2xhc3Muc2VsZWN0Mi1wb3NpdGlvbi1hdXRvXT1cImxpc3RQb3NpdGlvbiA9PT0gJ2F1dG8nXCJcbiAgICAgICAgW2NsYXNzLnNlbGVjdDItc3R5bGUtYm9yZGVybGVzc109XCJzdHlsZU1vZGUgPT09ICdib3JkZXJsZXNzJ1wiXG4gICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZHJvcGRvd25cbiAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1kcm9wZG93blwiXG4gICAgICAgICAgICBbY2xhc3Muc2VsZWN0Mi1kcm9wZG93bi0tYmVsb3ddPVwiIXNlbGVjdDJhYm92ZVwiXG4gICAgICAgICAgICBbY2xhc3Muc2VsZWN0Mi1kcm9wZG93bi0tYWJvdmVdPVwic2VsZWN0MmFib3ZlXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdDItc2VhcmNoIHNlbGVjdDItc2VhcmNoLS1kcm9wZG93blwiIFtjbGFzcy5zZWxlY3QyLXNlYXJjaC0taGlkZV09XCJpc1NlYXJjaGJveEhpZGRlblwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAjc2VhcmNoSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImlkKCkgKyAnLXNlYXJjaC1maWVsZCdcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImtleURvd24oJGV2ZW50LCBhdXRvQ3JlYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJzZWFyY2hVcGRhdGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwicHJldkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXNlYXJjaF9fZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2NvcnJlY3Q9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInRoaXMuaXNPcGVuID8gdGFiSW5kZXggOiAnLTEnXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZGJ5KCkgPz8gaWRMYWJlbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1hdXRvY29tcGxldGU9XCJsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJpZE9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImhvdmVyaW5nT3B0aW9uSWQoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0Mi1yZXN1bHRzXCI+XG4gICAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCJpZE9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICNyZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1yZXN1bHRzX19vcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdDItZ3JpZF09XCJncmlkICYmIGlzTnVtYmVyKGdyaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdDItZ3JpZC1hdXRvXT1cImdyaWQgJiYgIWlzTnVtYmVyKGdyaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC1oZWlnaHRdPVwicmVzdWx0TWF4SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLi0tZ3JpZC1zaXplXT1cImdyaWQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgIGluZmluaXRlU2Nyb2xsXG4gICAgICAgICAgICAgICAgICAgIFtpbmZpbml0ZVNjcm9sbERpc2FibGVkXT1cIiFpbmZpbml0ZVNjcm9sbCAmJiAhaXNPcGVuXCJcbiAgICAgICAgICAgICAgICAgICAgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiaW5maW5pdGVTY3JvbGxEaXN0YW5jZVwiXG4gICAgICAgICAgICAgICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cImluZmluaXRlU2Nyb2xsVGhyb3R0bGVcIlxuICAgICAgICAgICAgICAgICAgICBbaW5maW5pdGVTY3JvbGxDb250YWluZXJdPVwicmVzdWx0c1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRieSgpID8/IGlkTGFiZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cIm11bHRpcGxlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImhvdmVyaW5nT3B0aW9uSWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChzY3JvbGxlZCk9XCJvblNjcm9sbCgnZG93bicpXCJcbiAgICAgICAgICAgICAgICAgICAgKHNjcm9sbGVkVXApPVwib25TY3JvbGwoJ3VwJylcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJrZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93U2VsZWN0QWxsICYmIG11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdDItcmVzdWx0c19fb3B0aW9uIHNlbGVjdDItc2VsZWN0YWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QWxsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1zZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QyLWxhYmVsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc2VsZWN0QWxsVGVzdCgpID8gcmVtb3ZlQWxsVGV4dCA6IHNlbGVjdEFsbFRleHQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBAZm9yIChncm91cE9yT3B0aW9uIG9mIGZpbHRlcmVkRGF0YSgpOyB0cmFjayB0cmFja0J5KGksIGdyb3VwT3JPcHRpb24pOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChncm91cE9yT3B0aW9uLm9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInNlbGVjdDItcmVzdWx0c19fb3B0aW9uIHNlbGVjdDItcmVzdWx0c19fZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lkXT1cImdldEVsZW1lbnRJZChncm91cE9yT3B0aW9uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghaGFzVGVtcGxhdGUoZ3JvdXBPck9wdGlvbiwgJ2dyb3VwJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbGVjdDItcmVzdWx0c19fZ3JvdXAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncm91cE9yT3B0aW9uLmNsYXNzZXMgPyAnICcgKyBncm91cE9yT3B0aW9uLmNsYXNzZXMgOiAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJncm91cE9yT3B0aW9uLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUZW1wbGF0ZShncm91cE9yT3B0aW9uLCAnZ3JvdXAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGdyb3VwT3JPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdDItcmVzdWx0c19fb3B0aW9ucyBzZWxlY3QyLXJlc3VsdHNfX29wdGlvbnMtLW5lc3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImdldEVsZW1lbnRJZChncm91cE9yT3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBncm91cE9yT3B0aW9uLm9wdGlvbnM7IHRyYWNrIHRyYWNrQnkoaiwgb3B0aW9uKTsgbGV0IGogPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0RWxlbWVudElkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0T3B0aW9uU3R5bGUob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNEaXNhYmxlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwibW91c2VlbnRlcihvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghaGFzVGVtcGxhdGUob3B0aW9uLCAnb3B0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QyLWxhYmVsLWNvbnRlbnRcIiBbaW5uZXJIVE1MXT1cIm9wdGlvbi5sYWJlbFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImdldFRlbXBsYXRlKG9wdGlvbiwgJ29wdGlvbicpOyBjb250ZXh0OiBvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0RWxlbWVudElkKGdyb3VwT3JPcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldE9wdGlvblN0eWxlKGdyb3VwT3JPcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChncm91cE9yT3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNEaXNhYmxlZChncm91cE9yT3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm1vdXNlZW50ZXIoZ3JvdXBPck9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2soZ3JvdXBPck9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghaGFzVGVtcGxhdGUoZ3JvdXBPck9wdGlvbiwgJ29wdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiZ3JvdXBPck9wdGlvbi5sYWJlbFwiIGNsYXNzPVwic2VsZWN0Mi1sYWJlbC1jb250ZW50XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0VGVtcGxhdGUoZ3JvdXBPck9wdGlvbiwgJ29wdGlvbicpOyBjb250ZXh0OiBncm91cE9yT3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0VGVtcGxhdGUoZ3JvdXBPck9wdGlvbiwgJ29wdGlvbicpOyBjb250ZXh0OiBncm91cE9yT3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoIWZpbHRlcmVkRGF0YSgpPy5sZW5ndGggJiYgbm9SZXN1bHRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJzZWxlY3QyLW5vLXJlc3VsdCBzZWxlY3QyLXJlc3VsdHNfX29wdGlvblwiIFtpbm5lckhUTUxdPVwibm9SZXN1bHRNZXNzYWdlXCI+PC9saT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKG1heFJlc3VsdHNFeGNlZWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXRvby1tdWNoLXJlc3VsdCBzZWxlY3QyLXJlc3VsdHNfX29wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJtYXhSZXN1bHRzTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9saT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Jlc2V0QnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChmb2N1cyk9XCJfdXBkYXRlRm9jdXNTdGF0ZSh0cnVlKVwiXG4gICAgICAgIChjbGljayk9XCJyZXNldCgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fcmVzZXRcIlxuICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaXB0aW9uXT1cImFyaWFSZXNldEJ1dHRvbkRlc2NyaXB0aW9uKClcIlxuICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImlkQ29tYm8oKVwiXG4gICAgPlxuICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj7Dlzwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=