@sumaris-net/ngx-components 18.26.13 → 18.27.0-alpha1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/doc/changelog.md +3 -1
- package/esm2022/public_api.mjs +2 -1
- package/esm2022/src/app/core/core.module.mjs +4 -1
- package/esm2022/src/app/core/form/form.utils.mjs +12 -1
- package/esm2022/src/app/shared/field-accessor.mjs +16 -0
- package/esm2022/src/app/shared/focusable.mjs +1 -1
- package/esm2022/src/app/shared/inputs.mjs +22 -3
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +175 -46
- package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +69 -23
- package/esm2022/src/app/shared/material/datetime/material.date.mjs +18 -4
- package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +116 -28
- package/esm2022/src/app/shared/material/duration/duration.module.mjs +10 -3
- package/esm2022/src/app/shared/material/duration/material.duration.mjs +63 -33
- package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +3 -3
- package/esm2022/src/app/shared/material/latlong/material.latlong-input.mjs +14 -1
- package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +16 -1
- package/esm2022/src/app/shared/material/testing/common.test.mjs +218 -27
- package/fesm2022/sumaris-net.ngx-components.mjs +985 -429
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/src/app/core/core.module.d.ts +15 -15
- package/src/app/core/form/form.utils.d.ts +7 -0
- package/src/app/shared/field-accessor.d.ts +51 -0
- package/src/app/shared/focusable.d.ts +3 -1
- package/src/app/shared/inputs.d.ts +3 -1
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +20 -7
- package/src/app/shared/material/boolean/material.boolean.d.ts +12 -4
- package/src/app/shared/material/datetime/material.date.d.ts +6 -2
- package/src/app/shared/material/datetime/material.datetime.d.ts +20 -4
- package/src/app/shared/material/duration/duration.module.d.ts +3 -1
- package/src/app/shared/material/duration/material.duration.d.ts +15 -13
- package/src/app/shared/material/latlong/material.latlong-input.d.ts +5 -3
- package/src/app/shared/material/latlong/material.latlong.d.ts +5 -1
- package/src/app/shared/material/testing/common.test.d.ts +49 -6
- package/src/assets/i18n/en.json +1 -1
- package/src/assets/manifest.json +1 -1
|
@@ -3,8 +3,10 @@ import { DOCUMENT } from '@angular/common';
|
|
|
3
3
|
import { NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
|
|
4
4
|
import { BehaviorSubject, isObservable, merge, Subject, Subscription, timer } from 'rxjs';
|
|
5
5
|
import { debounceTime, distinctUntilChanged, filter, map, mergeMap, startWith, switchMap, takeUntil, tap, throttleTime } from 'rxjs/operators';
|
|
6
|
-
import {
|
|
6
|
+
import { toLoadResult } from '../../services/entity-service.class';
|
|
7
|
+
import { changeCaseToUnderscore, findParentWithClass, firstArrayValue, isNil, isNilOrBlank, isNotEmptyArray, isNotNil, isNotNilObject, isNotNilOrBlank, isNotNilString, propertiesPathComparator } from '../../functions';
|
|
7
8
|
import { focusInput, selectInputContent, selectInputRange } from '../../inputs';
|
|
9
|
+
import { INPUT_FIELD_ACCESSOR } from '../../field-accessor';
|
|
8
10
|
import { firstNotNilPromise, waitFor } from '../../observables';
|
|
9
11
|
import { MatAutocomplete, MatAutocompleteTrigger } from '@angular/material/autocomplete';
|
|
10
12
|
import { fromScrollEndEvent } from '../../events';
|
|
@@ -14,6 +16,7 @@ import { MatAutocompleteFieldUtils } from './material.autocomplete.utils';
|
|
|
14
16
|
import { APP_SHOW_TOOLTIP, DEFAULT_JOIN_PROPERTIES_SEPARATOR } from '../../constants';
|
|
15
17
|
import { RegExpUtils } from '../../regexps';
|
|
16
18
|
import { MaterialAutocompleteFooterDirective, MaterialAutocompleteHeaderDirective } from './material.autocomplete.directive';
|
|
19
|
+
import { AppFormUtils } from '../../../core/form/form.utils';
|
|
17
20
|
import * as i0 from "@angular/core";
|
|
18
21
|
import * as i1 from "@ionic/angular";
|
|
19
22
|
import * as i2 from "@angular/forms";
|
|
@@ -41,6 +44,10 @@ const DEFAULT_VALUE_ACCESSOR = {
|
|
|
41
44
|
useExisting: forwardRef(() => MatAutocompleteField),
|
|
42
45
|
multi: true,
|
|
43
46
|
};
|
|
47
|
+
const INPUT_FIELD_ACCESSOR_PROVIDER = {
|
|
48
|
+
provide: INPUT_FIELD_ACCESSOR,
|
|
49
|
+
useExisting: forwardRef(() => MatAutocompleteField),
|
|
50
|
+
};
|
|
44
51
|
export class MatAutocompleteField {
|
|
45
52
|
injector;
|
|
46
53
|
el;
|
|
@@ -66,14 +73,16 @@ export class MatAutocompleteField {
|
|
|
66
73
|
_$filteredItems = new BehaviorSubject(undefined);
|
|
67
74
|
_selectedItem;
|
|
68
75
|
_displayValue = '';
|
|
76
|
+
_hiddenSearchText = '';
|
|
69
77
|
_moreItemsCount;
|
|
70
78
|
_fetchMore$ = new EventEmitter();
|
|
71
79
|
_defaultPanelWidth = null;
|
|
72
80
|
_focused = false;
|
|
73
81
|
_panelClosedAtTime;
|
|
74
82
|
get searchText() {
|
|
75
|
-
return this.matInputText?.nativeElement.value ?? this.ionSearchbar?.value;
|
|
83
|
+
return this.matInputText?.nativeElement.value ?? this.ionSearchbar?.value ?? this._hiddenSearchText;
|
|
76
84
|
}
|
|
85
|
+
showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });
|
|
77
86
|
equals;
|
|
78
87
|
logPrefix = '[mat-autocomplete]';
|
|
79
88
|
formControl;
|
|
@@ -142,7 +151,7 @@ export class MatAutocompleteField {
|
|
|
142
151
|
// eslint-disable-next-line @angular-eslint/no-output-native
|
|
143
152
|
blurred = new EventEmitter();
|
|
144
153
|
// eslint-disable-next-line @angular-eslint/no-output-native
|
|
145
|
-
|
|
154
|
+
focusedChanges = new EventEmitter();
|
|
146
155
|
dropButtonClick = new EventEmitter(true);
|
|
147
156
|
keydownEscape = new EventEmitter();
|
|
148
157
|
keydownBackspace = new EventEmitter();
|
|
@@ -163,7 +172,12 @@ export class MatAutocompleteField {
|
|
|
163
172
|
autocompleteTrigger;
|
|
164
173
|
panelHeaderTemplate;
|
|
165
174
|
panelFooterTemplate;
|
|
166
|
-
|
|
175
|
+
get focused() {
|
|
176
|
+
return this._focused;
|
|
177
|
+
}
|
|
178
|
+
get controlName() {
|
|
179
|
+
return this.formControlName || AppFormUtils.getControlName(this.formControl);
|
|
180
|
+
}
|
|
167
181
|
constructor(injector, el, cd, modalController, renderer, formGroupDir) {
|
|
168
182
|
this.injector = injector;
|
|
169
183
|
this.el = el;
|
|
@@ -308,10 +322,10 @@ export class MatAutocompleteField {
|
|
|
308
322
|
this.debounceTime = this.debounceTime ?? (this.mobile ? 650 : 250);
|
|
309
323
|
this.highlightAccent = this.highlightAccent ?? false;
|
|
310
324
|
this.matAutocompletePosition = this.matAutocompletePosition ?? 'auto';
|
|
311
|
-
this.applyImplicitValue = this.applyImplicitValue ?? !this.
|
|
325
|
+
this.applyImplicitValue = this.applyImplicitValue ?? !this.multiple;
|
|
312
326
|
this.selectInputContentOnFocus = this.selectInputContentOnFocus ?? false;
|
|
313
327
|
this.selectInputContentOnFocusDelay = this.selectInputContentOnFocusDelay ?? 0;
|
|
314
|
-
this.clearInvalidValueOnBlur = this.clearInvalidValueOnBlur ??
|
|
328
|
+
this.clearInvalidValueOnBlur = this.clearInvalidValueOnBlur ?? (this.mobile && !this.showSearchBar);
|
|
315
329
|
this.previewImplicitValue = this.previewImplicitValue ?? false;
|
|
316
330
|
// No suggestFn: filter on the given items
|
|
317
331
|
if (!this.suggestFn) {
|
|
@@ -383,7 +397,7 @@ export class MatAutocompleteField {
|
|
|
383
397
|
// On dropdown button click (no debounceTime)
|
|
384
398
|
this.dropButtonClick.pipe(filter((event) => !event || !event.defaultPrevented)),
|
|
385
399
|
// Focus or click => Load all (no debounceTime)
|
|
386
|
-
merge(this.
|
|
400
|
+
merge(this.focusedChanges, this.clicked)
|
|
387
401
|
// Avoid too many call, e.g. when focused and clicked
|
|
388
402
|
.pipe(throttleTime(100)),
|
|
389
403
|
// DEBUG
|
|
@@ -409,7 +423,7 @@ export class MatAutocompleteField {
|
|
|
409
423
|
// DEBUG
|
|
410
424
|
//tap(items => this.debug && console.debug(this.logPrefix + ' Received from suggest: ', items)),
|
|
411
425
|
// Store implicit value (will use it onBlur if not other value selected)
|
|
412
|
-
tap((items) => !
|
|
426
|
+
tap((items) => !this.multiple && this.updateImplicitValue(items)));
|
|
413
427
|
// Fetch more events
|
|
414
428
|
const fetchMoreItemsChanges = this._fetchMore$.pipe(tap((event) => event?.preventDefault()), // Avoid to close the mat-select
|
|
415
429
|
filter(() => this.canFetchMore), mergeMap(() => this.fetchMore()),
|
|
@@ -458,7 +472,7 @@ export class MatAutocompleteField {
|
|
|
458
472
|
this._subscription.add(this.blurred
|
|
459
473
|
.pipe(
|
|
460
474
|
// Skip if multiple (no implicit value) or disable
|
|
461
|
-
filter(() => !this.multiple &&
|
|
475
|
+
filter(() => !this.multiple && this.enabled),
|
|
462
476
|
// DEBUG
|
|
463
477
|
//,tap(_ => this.debug && console.debug(this.logPrefix + ' Received blurred event')),
|
|
464
478
|
map(() => this.formControl.value))
|
|
@@ -471,7 +485,9 @@ export class MatAutocompleteField {
|
|
|
471
485
|
// - an explicit value
|
|
472
486
|
// - field is not empty (user fill something)
|
|
473
487
|
// - OR field empty but is required
|
|
474
|
-
if (isNotNil(this._implicitValue) && ((this.required && isNilOrBlank(value))
|
|
488
|
+
if (isNotNil(this._implicitValue) && ((this.required && isNilOrBlank(value))
|
|
489
|
+
|| (isNotNilOrBlank(value) && typeof value !== 'object')
|
|
490
|
+
|| (isNotNilOrBlank(this._hiddenSearchText) && isNil(value)))) {
|
|
475
491
|
this.writeValue(this._implicitValue);
|
|
476
492
|
this.formControl.markAsPending({ emitEvent: false, onlySelf: true });
|
|
477
493
|
this.formControl.updateValueAndValidity({ emitEvent: false, onlySelf: true });
|
|
@@ -500,13 +516,14 @@ export class MatAutocompleteField {
|
|
|
500
516
|
}
|
|
501
517
|
}
|
|
502
518
|
this._implicitValue = null; // reset the implicit value
|
|
519
|
+
this._hiddenSearchText = null; // reset search text
|
|
503
520
|
this.closePanel(); // Close panel
|
|
504
521
|
// Invalidate loaded items
|
|
505
522
|
if (invalidateFilteredItems) {
|
|
506
523
|
this.markAsLoading(); // Should force next focus to reload items
|
|
507
524
|
}
|
|
508
525
|
// Move caret to the beginning (fix issue IMAGINE-469)
|
|
509
|
-
if (moveCaretToBeginning) {
|
|
526
|
+
if (moveCaretToBeginning && this.matInputText) {
|
|
510
527
|
// DEBUG
|
|
511
528
|
//if (this.debug) console.debug(this.logPrefix + ' Moving caret to the beginning, on blur');
|
|
512
529
|
selectInputRange(this.matInputText.nativeElement, 0, 0);
|
|
@@ -519,7 +536,7 @@ export class MatAutocompleteField {
|
|
|
519
536
|
.subscribe(() => this.checkIfTouched()));
|
|
520
537
|
// Select input content, on focus or press enter
|
|
521
538
|
if (this.selectInputContentOnFocus && !this.mobile && !this.multiple) {
|
|
522
|
-
this._subscription.add(merge(this.
|
|
539
|
+
this._subscription.add(merge(this.focusedChanges.pipe(filter((event) => !event.defaultPrevented)
|
|
523
540
|
//tap((event) => event.preventDefault())
|
|
524
541
|
), this.keyupEnter.pipe(filter(() => isNotNilObject(this.formControl.value))))
|
|
525
542
|
.pipe(debounceTime(this.selectInputContentOnFocusDelay))
|
|
@@ -529,7 +546,7 @@ export class MatAutocompleteField {
|
|
|
529
546
|
}));
|
|
530
547
|
}
|
|
531
548
|
if (this.reloadItemsOnFocus) {
|
|
532
|
-
this._subscription.add(this.
|
|
549
|
+
this._subscription.add(this.focusedChanges.pipe(filter((event) => !this.loading && !event.defaultPrevented)).subscribe(() => {
|
|
533
550
|
//if (this.debug) console.debug(this.logPrefix + ' Reloading items (focused)');
|
|
534
551
|
this.reloadItems();
|
|
535
552
|
}));
|
|
@@ -553,7 +570,7 @@ export class MatAutocompleteField {
|
|
|
553
570
|
this.dropButtonClick.complete();
|
|
554
571
|
this.clicked.complete();
|
|
555
572
|
this.blurred.complete();
|
|
556
|
-
this.
|
|
573
|
+
this.focusedChanges.complete();
|
|
557
574
|
this.keydownEscape.complete();
|
|
558
575
|
this.keyupEnter.complete();
|
|
559
576
|
this._fetchMore$.complete();
|
|
@@ -580,8 +597,8 @@ export class MatAutocompleteField {
|
|
|
580
597
|
// Force a refresh
|
|
581
598
|
this._reload$.next(value || (this.showAllOnFocus && this.suggestLengthThreshold <= 0 ? '*' : this.formControl.value));
|
|
582
599
|
// Clear the search bar (only if hidden)
|
|
583
|
-
if (this.matSelect && !this.matSelect.panelOpen
|
|
584
|
-
this.
|
|
600
|
+
if (this.matSelect && !this.matSelect.panelOpen) {
|
|
601
|
+
this.clearSearchbar();
|
|
585
602
|
}
|
|
586
603
|
}
|
|
587
604
|
writeValue(value) {
|
|
@@ -617,12 +634,60 @@ export class MatAutocompleteField {
|
|
|
617
634
|
}
|
|
618
635
|
this.cd.markForCheck();
|
|
619
636
|
}
|
|
620
|
-
focus() {
|
|
637
|
+
focus(options, origin) {
|
|
621
638
|
if (this.matSelect) {
|
|
622
|
-
this.matSelect.focus();
|
|
639
|
+
this.matSelect.focus(options);
|
|
640
|
+
if (!this._focused) {
|
|
641
|
+
this._focused = true;
|
|
642
|
+
this.focusedChanges.next(new FocusEvent('focus', {
|
|
643
|
+
bubbles: true,
|
|
644
|
+
cancelable: false,
|
|
645
|
+
relatedTarget: null
|
|
646
|
+
}));
|
|
647
|
+
}
|
|
623
648
|
}
|
|
624
649
|
else {
|
|
625
|
-
focusInput(this.matInputText);
|
|
650
|
+
focusInput(this.matInputText, options, origin);
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
/** ITextInputFieldAccessor: type text into the search input and trigger suggest */
|
|
654
|
+
typeText(text) {
|
|
655
|
+
if (isNilOrBlank(text))
|
|
656
|
+
return;
|
|
657
|
+
if (this.hasValidValue()) {
|
|
658
|
+
// Clear the existing value
|
|
659
|
+
this.clearValue();
|
|
660
|
+
// Clear text value
|
|
661
|
+
if (this.matInputText)
|
|
662
|
+
this.matInputText.nativeElement.value = '';
|
|
663
|
+
if (this.ionSearchbar)
|
|
664
|
+
this.clearSearchbar();
|
|
665
|
+
// Loop with a delay, to let write value emit changes
|
|
666
|
+
setTimeout(() => this.typeText(text));
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
if (this.mobile) {
|
|
670
|
+
if (!this.isOpen) {
|
|
671
|
+
this.matSelect.open();
|
|
672
|
+
}
|
|
673
|
+
if (this.ionSearchbar) {
|
|
674
|
+
this.ionSearchbar.value = (this.ionSearchbar.value ?? '') + text;
|
|
675
|
+
}
|
|
676
|
+
else {
|
|
677
|
+
if (this.showAllOnFocus) {
|
|
678
|
+
this.selectFirstOptionByText(text);
|
|
679
|
+
}
|
|
680
|
+
else {
|
|
681
|
+
this._hiddenSearchText = (this._hiddenSearchText ?? '') + text;
|
|
682
|
+
console.log('SEARCH ' + this._hiddenSearchText);
|
|
683
|
+
this._matSelectSearchChanged(this._hiddenSearchText);
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
else if (this.matInputText) {
|
|
688
|
+
this.matInputText.nativeElement.value += text ?? '';
|
|
689
|
+
// Trigger suggest by dispatching input event
|
|
690
|
+
this.matInputText.nativeElement.dispatchEvent(new Event('input', { bubbles: true }));
|
|
626
691
|
}
|
|
627
692
|
}
|
|
628
693
|
filterInputTextFocusEvent(event) {
|
|
@@ -655,7 +720,7 @@ export class MatAutocompleteField {
|
|
|
655
720
|
setTimeout(() => {
|
|
656
721
|
if (!this._focused)
|
|
657
722
|
return; // Skip if blur event received
|
|
658
|
-
this.
|
|
723
|
+
this.focusedChanges.emit(event);
|
|
659
724
|
}, 10);
|
|
660
725
|
return true;
|
|
661
726
|
}
|
|
@@ -728,21 +793,8 @@ export class MatAutocompleteField {
|
|
|
728
793
|
event.preventDefault();
|
|
729
794
|
event.stopPropagation();
|
|
730
795
|
// Get the value to search
|
|
731
|
-
const
|
|
732
|
-
|
|
733
|
-
//console.debug(this.logPrefix + " Received <ion-searchbar> changes", value);
|
|
734
|
-
// Update the display value (in the visible form control)
|
|
735
|
-
if (!this.multiple) {
|
|
736
|
-
this._displayValue = value;
|
|
737
|
-
}
|
|
738
|
-
// Mark component as loading
|
|
739
|
-
this.markAsLoading();
|
|
740
|
-
// Reload items
|
|
741
|
-
this.reloadItems(value);
|
|
742
|
-
// TODO Find a way to avoid mat-select to give focus to an option, when typing
|
|
743
|
-
/*if (this.multiple) {
|
|
744
|
-
this.matSelect._elementRef;
|
|
745
|
-
}*/
|
|
796
|
+
const searchText = event?.detail.value;
|
|
797
|
+
this._matSelectSearchChanged(searchText);
|
|
746
798
|
}
|
|
747
799
|
filterMatSelectFocusEvent(event) {
|
|
748
800
|
if (!event || event.defaultPrevented)
|
|
@@ -750,7 +802,7 @@ export class MatAutocompleteField {
|
|
|
750
802
|
// DEBUG
|
|
751
803
|
//console.debug(this.logPrefix + ' Received <mat-select> focus event', event);
|
|
752
804
|
// Emit event
|
|
753
|
-
this.
|
|
805
|
+
this.focusedChanges.emit(event);
|
|
754
806
|
}
|
|
755
807
|
filterMatSelectBlurEvent(event) {
|
|
756
808
|
if (!event || event.defaultPrevented)
|
|
@@ -777,12 +829,10 @@ export class MatAutocompleteField {
|
|
|
777
829
|
return true;
|
|
778
830
|
}
|
|
779
831
|
clearValue(event) {
|
|
832
|
+
event?.stopPropagation();
|
|
780
833
|
this.closePanel();
|
|
834
|
+
this.clearSearchbar();
|
|
781
835
|
this.writeValue(null);
|
|
782
|
-
event?.stopPropagation();
|
|
783
|
-
if (this.ionSearchbar) {
|
|
784
|
-
this.ionSearchbar.value = null;
|
|
785
|
-
}
|
|
786
836
|
this.markAsLoading();
|
|
787
837
|
}
|
|
788
838
|
_initAutocompleteInfiniteScroll(threshold) {
|
|
@@ -852,6 +902,13 @@ export class MatAutocompleteField {
|
|
|
852
902
|
onSelectionChange(event) {
|
|
853
903
|
this.selectionChange.emit({ source: event.source, value: event.value });
|
|
854
904
|
}
|
|
905
|
+
onMatSelectOpenedChange(opened) {
|
|
906
|
+
this.openedChange.emit(opened);
|
|
907
|
+
if (!opened) {
|
|
908
|
+
this._focused = false;
|
|
909
|
+
this.blurred.emit();
|
|
910
|
+
}
|
|
911
|
+
}
|
|
855
912
|
onOptionSelected(event) {
|
|
856
913
|
// DEBUG
|
|
857
914
|
//if (this.debug) console.debug(this.logPrefix + ' Option selected', event);
|
|
@@ -982,8 +1039,9 @@ export class MatAutocompleteField {
|
|
|
982
1039
|
}
|
|
983
1040
|
return ele;
|
|
984
1041
|
}
|
|
985
|
-
getMatSelectPanel() {
|
|
986
|
-
|
|
1042
|
+
getMatSelectPanel(option) {
|
|
1043
|
+
option = option ?? this.matSelect.options.last;
|
|
1044
|
+
const ele = option?._getHostElement().parentElement;
|
|
987
1045
|
if (!ele) {
|
|
988
1046
|
// DEBUG
|
|
989
1047
|
console.warn(this.logPrefix + ' Unable to find the mat-select container...');
|
|
@@ -1159,12 +1217,83 @@ export class MatAutocompleteField {
|
|
|
1159
1217
|
// Emit changes
|
|
1160
1218
|
this.toggleFavorite.emit({ source: this.matSelect || this.autocomplete, value: value });
|
|
1161
1219
|
}
|
|
1220
|
+
hasValidValue() {
|
|
1221
|
+
return isNotNil(this.formControl?.value) && this.formControl.valid;
|
|
1222
|
+
}
|
|
1223
|
+
clearSearchbar() {
|
|
1224
|
+
if (this.ionSearchbar) {
|
|
1225
|
+
this.ionSearchbar.value = null;
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
async selectFirstOptionByText(text) {
|
|
1229
|
+
if (!this.isOpen || isNilOrBlank(text) || !this.matSelect)
|
|
1230
|
+
return;
|
|
1231
|
+
const { data: filteredItems } = toLoadResult(await this.suggestFn(text, this.filter));
|
|
1232
|
+
this.updateImplicitValue(filteredItems);
|
|
1233
|
+
const first = firstArrayValue(filteredItems);
|
|
1234
|
+
if (!first)
|
|
1235
|
+
return;
|
|
1236
|
+
// Find the corresponding options
|
|
1237
|
+
await waitFor(() => !this.loading && this.matSelect.options?.length > 0, { stop: this._destroy$ });
|
|
1238
|
+
const options = this.matSelect.options.toArray();
|
|
1239
|
+
let index = options.findIndex(o => o.value && this.equals(o.value, first));
|
|
1240
|
+
if (index === -1)
|
|
1241
|
+
return;
|
|
1242
|
+
// Select as implicit value
|
|
1243
|
+
const activeOption = options[index];
|
|
1244
|
+
// Highlight the option
|
|
1245
|
+
this.matSelect._keyManager.setActiveItem(index);
|
|
1246
|
+
// Scroll to the option
|
|
1247
|
+
await this.scrollToOption(activeOption);
|
|
1248
|
+
}
|
|
1249
|
+
async scrollToOption(option, opts) {
|
|
1250
|
+
const optionEl = option?._getHostElement();
|
|
1251
|
+
if (!optionEl)
|
|
1252
|
+
return;
|
|
1253
|
+
// Scroll normal
|
|
1254
|
+
optionEl.scrollIntoView({ block: 'nearest', behavior: 'smooth', ...opts });
|
|
1255
|
+
// Apply a top offset, because of header/footer
|
|
1256
|
+
if (this.showPanelHeader || this.showPanelFooter) {
|
|
1257
|
+
// Wait for the panel to exists
|
|
1258
|
+
await waitFor(() => !!optionEl.parentElement, { stop: this._destroy$, timeout: 200 });
|
|
1259
|
+
// Scroll to the option, with an offset
|
|
1260
|
+
setTimeout(() => {
|
|
1261
|
+
// Get the updated panel (can have changed, when multiple open/close occurs)
|
|
1262
|
+
const panel = optionEl.parentElement;
|
|
1263
|
+
const headerHeight = this.showPanelHeader ? 20 : 0;
|
|
1264
|
+
const footerHeight = this.showPanelFooter ? 20 : 0;
|
|
1265
|
+
const optionRect = optionEl.getBoundingClientRect();
|
|
1266
|
+
const panelRect = panel.getBoundingClientRect();
|
|
1267
|
+
// Si l'option est trop haute (cachée par le header)
|
|
1268
|
+
if (optionRect.top < panelRect.top + headerHeight) {
|
|
1269
|
+
panel.scrollTop -= (panelRect.top + headerHeight - optionRect.top);
|
|
1270
|
+
}
|
|
1271
|
+
// Si l'option est trop basse (cachée par le footer)
|
|
1272
|
+
if (optionRect.bottom > panelRect.bottom - footerHeight) {
|
|
1273
|
+
panel.scrollTop += (optionRect.bottom - (panelRect.bottom - footerHeight));
|
|
1274
|
+
}
|
|
1275
|
+
});
|
|
1276
|
+
}
|
|
1277
|
+
}
|
|
1278
|
+
_matSelectSearchChanged(searchText) {
|
|
1279
|
+
// DEBUG
|
|
1280
|
+
//console.debug(this.logPrefix + " Received search changes", searchText);
|
|
1281
|
+
// Update the display value (in the visible form control)
|
|
1282
|
+
if (!this.multiple) {
|
|
1283
|
+
this._displayValue = searchText;
|
|
1284
|
+
}
|
|
1285
|
+
// Mark component as loading
|
|
1286
|
+
this.markAsLoading();
|
|
1287
|
+
// Reload items
|
|
1288
|
+
this.reloadItems(searchText);
|
|
1289
|
+
// TODO Find a way to avoid mat-select to give focus to an option, when typing
|
|
1290
|
+
}
|
|
1162
1291
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MatAutocompleteField, deps: [{ token: i0.Injector }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.ModalController }, { token: i0.Renderer2 }, { token: i2.FormGroupDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
1163
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MatAutocompleteField, selector: "mat-autocomplete-field", inputs: { equals: "equals", logPrefix: "logPrefix", formControl: "formControl", formControlName: "formControlName", floatLabel: "floatLabel", label: "label", appearance: "appearance", subscriptSizing: "subscriptSizing", placeholder: "placeholder", suggestFn: "suggestFn", required: ["required", "required", booleanAttribute], hideRequiredMarker: ["hideRequiredMarker", "hideRequiredMarker", booleanAttribute], mobile: ["mobile", "mobile", booleanAttribute], showPanelHeader: ["showPanelHeader", "showPanelHeader", booleanAttribute], showPanelFooter: ["showPanelFooter", "showPanelFooter", booleanAttribute], clearable: ["clearable", "clearable", booleanAttribute], debounceTime: ["debounceTime", "debounceTime", numberAttribute], displaySeparator: "displaySeparator", displayWith: "displayWith", displayAttributes: "displayAttributes", displayColumnSizes: "displayColumnSizes", displayColumnNames: "displayColumnNames", highlightAccent: ["highlightAccent", "highlightAccent", booleanAttribute], showAllOnFocus: ["showAllOnFocus", "showAllOnFocus", booleanAttribute], showPanelOnFocus: ["showPanelOnFocus", "showPanelOnFocus", booleanAttribute], reloadItemsOnFocus: ["reloadItemsOnFocus", "reloadItemsOnFocus", booleanAttribute], clearInvalidValueOnBlur: ["clearInvalidValueOnBlur", "clearInvalidValueOnBlur", booleanAttribute], autofocus: ["autofocus", "autofocus", booleanAttribute], config: "config", i18nPrefix: "i18nPrefix", noResultMessage: "noResultMessage", panelClass: "panelClass", panelWidth: "panelWidth", disableRipple: ["disableRipple", "disableRipple", booleanAttribute], matAutocompletePosition: "matAutocompletePosition", multiple: ["multiple", "multiple", booleanAttribute], fetchMoreThreshold: "fetchMoreThreshold", suggestLengthThreshold: ["suggestLengthThreshold", "suggestLengthThreshold", numberAttribute], showLoadingSpinner: ["showLoadingSpinner", "showLoadingSpinner", booleanAttribute], debug: ["debug", "debug", booleanAttribute], showSearchBar: ["showSearchBar", "showSearchBar", booleanAttribute], stickySearchBar: ["stickySearchBar", "stickySearchBar", booleanAttribute], applyImplicitValue: "applyImplicitValue", dropButtonTitle: "dropButtonTitle", clearButtonTitle: "clearButtonTitle", trimSearchText: ["trimSearchText", "trimSearchText", booleanAttribute], splitSearchText: ["splitSearchText", "splitSearchText", booleanAttribute], selectInputContentOnFocus: ["selectInputContentOnFocus", "selectInputContentOnFocus", booleanAttribute], selectInputContentOnFocusDelay: ["selectInputContentOnFocusDelay", "selectInputContentOnFocusDelay", numberAttribute], previewImplicitValue: ["previewImplicitValue", "previewImplicitValue", booleanAttribute], showFavorites: "showFavorites", toggleFavoriteTitle: "toggleFavoriteTitle", favoriteItems: "favoriteItems", colSizes: "colSizes", classList: ["class", "classList"], filter: "filter", readonly: ["readonly", "readonly", booleanAttribute], tabindex: "tabindex", items: "items" }, outputs: { clicked: "click", blurred: "blur", focused: "focus", dropButtonClick: "dropButtonClick", keydownEscape: "keydown.escape", keydownBackspace: "keydown.backspace", keyupEnter: "keyup.enter", arrowUp: "arrowUp", arrowDown: "arrowDown", enter: "enter", selectionChange: "selectionChange", openedChange: "openedChange", toggleFavorite: "toggleFavorite" }, providers: [DEFAULT_VALUE_ACCESSOR], queries: [{ propertyName: "panelHeaderTemplate", first: true, predicate: MaterialAutocompleteHeaderDirective, descendants: true, read: TemplateRef }, { propertyName: "panelFooterTemplate", first: true, predicate: MaterialAutocompleteFooterDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "matSelect", first: true, predicate: ["matSelect"], descendants: true }, { propertyName: "ionSearchbar", first: true, predicate: ["ionSearchbar"], descendants: true }, { propertyName: "matInputText", first: true, predicate: ["matInputText"], descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }], ngImport: i0, template: "<ion-grid class=\"ion-no-padding field-container\">\n <ion-row>\n <ion-col [size]=\"colSizes?.[0]\" class=\"ion-no-padding\">\n <!-- readonly -->\n @if (_readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [title]=\"!showTooltip ? _displayValue || '' : ''\"\n [matTooltip]=\"showTooltip ? _displayValue || '' : ''\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\" />\n <ion-text>{{ value | toString: displayWith }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n <!-- hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n } @else {\n @let hasFavorites = toggleFavorite.observed || (favoriteItems | isNotEmptyArray);\n\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [title]=\"!showTooltip ? _displayValue || '' : ''\"\n [matTooltip]=\"showTooltip ? _displayValue || '' : ''\"\n [hideRequiredMarker]=\"hideRequiredMarker\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if ((label || placeholder) && floatLabel !== 'never') {\n <mat-label>{{ label || placeholder }}</mat-label>\n }\n <!-- Mobile or Multiple (use <mat-select>) -->\n @if (mobile || multiple) {\n <mat-select\n #matSelect\n hideSingleSelectionIndicator\n disableOptionCentering\n [disableRipple]=\"disableRipple\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"panelClass\"\n [panelWidth]=\"panelWidth || _defaultPanelWidth\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"emitEscape($event)\"\n (keyup.enter)=\"emitEnter($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n (openedChange)=\"openedChange.emit($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\"\n [class.mat-mdc-select-arrow-hidden]=\"!mobile\"\n >\n <mat-select-trigger>{{ value | toString: displayWith }}</mat-select-trigger>\n <!-- Search bar -->\n @if (showSearchBar) {\n <mat-optgroup class=\"mat-select-searchbar\" [class.mat-select-searchbar-sticky]=\"stickySearchBar\">\n <!-- FIXME on iOS devices, when animated=\"true\", then the search icon overlap the placeholder -->\n <ion-searchbar\n #ionSearchbar\n inputmode=\"search\"\n autocomplete=\"off\"\n animated=\"false\"\n showClearButton=\"true\"\n [debounce]=\"debounceTime\"\n (ionClear)=\"markAsLoading()\"\n (ionInput)=\"ionSearchBarChanged($event)\"\n [placeholder]=\"'COMMON.BTN_SEARCH' | translate\"\n ></ion-searchbar>\n </mat-optgroup>\n }\n\n <!-- Custom header -->\n <ng-container\n [ngTemplateOutlet]=\"panelHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n\n <!-- Headers -->\n <ion-row\n class=\"mat-select-header column sticky ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.mat-select-searchbar-sticky]=\"showSearchBar && stickySearchBar\"\n [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\"\n >\n <!-- favorite spacer -->\n @if (hasFavorites) {\n <ion-col size=\"auto\" class=\"favorite-col\"></ion-col>\n }\n <!-- attribute headers -->\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n\n <!-- None option -->\n @if (!required && !multiple && !clearable) {\n <mat-option class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n }\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n } @else {\n <!-- Options -->\n @for (item of items; track i; let i = $index) {\n @let isFavorite = hasFavorites && (favoriteItems | arrayIncludes: item);\n\n <mat-option [value]=\"item\" class=\"ion-no-padding\" [class.mdc-list-item--favorite]=\"isFavorite\">\n <ion-row [classList]=\"item?.classList || ''\" [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\">\n <!-- favorite icon -->\n @if (hasFavorites) {\n <ion-col size=\"auto\" class=\"favorite-col\">\n @if (isFavorite) {\n <ion-icon name=\"star\" color=\"tertiary\"></ion-icon>\n }\n </ion-col>\n }\n\n <!-- attribute columns -->\n @for (path of displayAttributes; track j; let j = $index) {\n <ion-col [size]=\"displayColumnSizes[j]\" class=\"ion-align-self-center ion-text-wrap\">\n <ion-label\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight: { search: ionSearchbar?.value, withAccent: highlightAccent }\n \"\n ></ion-label>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option class=\"ion-padding mat-pseudo-checkbox-hidden\" (ngInit)=\"_initMatSelectInfiniteScroll()\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- need more character -->\n <mat-option class=\"ion-padding text-italic mat-pseudo-checkbox-hidden\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- loading spinner -->\n <mat-option class=\"ion-padding mat-pseudo-checkbox-hidden\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (showPanelFooter && itemCount; as count) {\n <mat-option class=\"mat-option-footer mat-autocomplete-footer mat-pseudo-checkbox-hidden ion-no-padding\" disabled>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </mat-option>\n }\n\n <!-- Custom footer -->\n <ng-container\n [ngTemplateOutlet]=\"panelFooterTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n </mat-select>\n } @else {\n <!-- desktop (use mat-autocomplete) -->\n <input\n matInput\n #matInputText\n type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"(label || floatLabel === 'never') && placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"emitEscape($event)\"\n (keydown.backspace)=\"onBackspace($event)\"\n (keyup.enter)=\"emitEnter($event)\"\n (keyup.arrowUp)=\"emitArrowUp($event)\"\n (keyup.arrowDown)=\"emitArrowDown($event)\"\n />\n <!-- autocomplete -->\n <mat-autocomplete\n #autocomplete=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n [hideSingleSelectionIndicator]=\"true\"\n [displayWith]=\"displayWith\"\n [class]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n [disableRipple]=\"disableRipple\"\n (optionSelected)=\"onOptionSelected($event)\"\n (opened)=\"openedChange.emit(true)\"\n (closed)=\"openedChange.emit(false)\"\n >\n\n <!-- Custom header -->\n <ng-container\n [ngTemplateOutlet]=\"panelHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n\n <!-- Headers -->\n @if (showPanelHeader) {\n <ion-row\n class=\"mat-autocomplete-header column sticky ion-no-padding\"\n [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\"\n >\n <!-- favorite spacer -->\n @if (hasFavorites) {\n <ion-col size=\"auto\" class=\"favorite-col\"></ion-col>\n }\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n }\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n } @else {\n <!-- Options -->\n @for (item of items; track i; let i = $index) {\n @let isFavorite = hasFavorites && (favoriteItems | arrayIncludes: item);\n <mat-option\n [value]=\"item\"\n class=\"ion-no-padding\"\n [class.mdc-list-item--selected]=\"item === _selectedItem\"\n [class.mdc-list-item--favorite]=\"isFavorite\"\n >\n <ion-row [classList]=\"item?.classList || ''\" [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\">\n <!-- favorite icon -->\n @if (hasFavorites) {\n <ion-col\n matPrefix\n size=\"auto\"\n class=\"favorite-col\"\n (click)=\"toggleFavoriteClick($event, item)\"\n >\n @if (isFavorite) {\n <ion-icon name=\"star\" color=\"tertiary\"></ion-icon>\n } @else if (toggleFavorite.observed) {\n <ion-icon name=\"star-outline\" color=\"medium\" class=\"visible-hover\"></ion-icon>\n }\n </ion-col>\n }\n @for (path of displayAttributes; track j; let j = $index) {\n <ion-col\n [size]=\"displayColumnSizes[j]\"\n [title]=\"!showTooltip ? text.innerText : ''\"\n [matTooltip]=\"showTooltip ? text.innerText : ''\"\n class=\"ion-align-self-center\"\n >\n <ion-label>\n <span\n #text\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight\n : {\n search: matInputText.value,\n withAccent: highlightAccent,\n }\n \"\n ></span>\n </ion-label>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option class=\"ion-padding\" (ngInit)=\"_initAutocompleteInfiniteScroll()\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- Need more characters -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- Loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (showPanelFooter && itemCount; as count) {\n <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n\n <!-- Custom footer -->\n <ng-container\n [ngTemplateOutlet]=\"panelFooterTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n\n </mat-autocomplete>\n }\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n @if (formControl?.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @if (formControl?.hasError('entity')) {\n <mat-error translate>ERROR.FIELD_INVALID</mat-error>\n }\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n <!-- Hints -->\n @if (!formControl?.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n }\n </ion-col>\n <ion-col [size]=\"colSizes?.[1]\" class=\"ion-no-padding\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n @if (!mobile) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"toggleShowPanel($event)\"\n [hidden]=\"disabled\"\n [title]=\"!showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n [matTooltip]=\"showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n >\n <mat-icon>{{ mobile ? 'arrow_drop_down' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n }\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\"\n [title]=\"!showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n [matTooltip]=\"showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;position:relative}:host.ion-text-wrap ion-label,:host.ion-text-wrap ion-text{white-space:normal!important}:host ::ng-deep .mat-mdc-select-arrow-hidden .mat-mdc-select-arrow-wrapper{display:none;visibility:hidden}ion-grid.field-container>ion-row>ion-col.ion-no-padding{--ion-padding-start: 0}ion-row{flex-wrap:nowrap}button[hidden]{display:none}mat-autocomplete mat-option{--mat-option-text-width: 100%}ion-col.favorite-col{flex:0 0 auto;width:24px!important}mat-option .visible-hover{opacity:0;display:none;animation:fadeinout 1s linear 1 backwards}mat-option:hover .visible-hover{display:inline-block;opacity:1}\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocapitalize", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "maxlength", "minlength", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "component", type: i1.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar,ion-range" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgInitDirective, selector: "[ngInit]", outputs: ["ngInit"] }, { kind: "directive", type: i5.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i7.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i12.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "directive", type: i13.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i15.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i16.HighlightPipe, name: "highlight" }, { kind: "pipe", type: i17.NotEmptyArrayPipe, name: "isNotEmptyArray" }, { kind: "pipe", type: i17.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i17.ArrayIncludesPipe, name: "arrayIncludes" }, { kind: "pipe", type: i18.ToStringPipe, name: "toString" }, { kind: "pipe", type: i18.StrLengthPipe, name: "strLength" }, { kind: "pipe", type: i19.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i20.RxPush, name: "push" }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1292
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MatAutocompleteField, selector: "mat-autocomplete-field", inputs: { equals: "equals", logPrefix: "logPrefix", formControl: "formControl", formControlName: "formControlName", floatLabel: "floatLabel", label: "label", appearance: "appearance", subscriptSizing: "subscriptSizing", placeholder: "placeholder", suggestFn: "suggestFn", required: ["required", "required", booleanAttribute], hideRequiredMarker: ["hideRequiredMarker", "hideRequiredMarker", booleanAttribute], mobile: ["mobile", "mobile", booleanAttribute], showPanelHeader: ["showPanelHeader", "showPanelHeader", booleanAttribute], showPanelFooter: ["showPanelFooter", "showPanelFooter", booleanAttribute], clearable: ["clearable", "clearable", booleanAttribute], debounceTime: ["debounceTime", "debounceTime", numberAttribute], displaySeparator: "displaySeparator", displayWith: "displayWith", displayAttributes: "displayAttributes", displayColumnSizes: "displayColumnSizes", displayColumnNames: "displayColumnNames", highlightAccent: ["highlightAccent", "highlightAccent", booleanAttribute], showAllOnFocus: ["showAllOnFocus", "showAllOnFocus", booleanAttribute], showPanelOnFocus: ["showPanelOnFocus", "showPanelOnFocus", booleanAttribute], reloadItemsOnFocus: ["reloadItemsOnFocus", "reloadItemsOnFocus", booleanAttribute], clearInvalidValueOnBlur: ["clearInvalidValueOnBlur", "clearInvalidValueOnBlur", booleanAttribute], autofocus: ["autofocus", "autofocus", booleanAttribute], config: "config", i18nPrefix: "i18nPrefix", noResultMessage: "noResultMessage", panelClass: "panelClass", panelWidth: "panelWidth", disableRipple: ["disableRipple", "disableRipple", booleanAttribute], matAutocompletePosition: "matAutocompletePosition", multiple: ["multiple", "multiple", booleanAttribute], fetchMoreThreshold: "fetchMoreThreshold", suggestLengthThreshold: ["suggestLengthThreshold", "suggestLengthThreshold", numberAttribute], showLoadingSpinner: ["showLoadingSpinner", "showLoadingSpinner", booleanAttribute], debug: ["debug", "debug", booleanAttribute], showSearchBar: ["showSearchBar", "showSearchBar", booleanAttribute], stickySearchBar: ["stickySearchBar", "stickySearchBar", booleanAttribute], applyImplicitValue: "applyImplicitValue", dropButtonTitle: "dropButtonTitle", clearButtonTitle: "clearButtonTitle", trimSearchText: ["trimSearchText", "trimSearchText", booleanAttribute], splitSearchText: ["splitSearchText", "splitSearchText", booleanAttribute], selectInputContentOnFocus: ["selectInputContentOnFocus", "selectInputContentOnFocus", booleanAttribute], selectInputContentOnFocusDelay: ["selectInputContentOnFocusDelay", "selectInputContentOnFocusDelay", numberAttribute], previewImplicitValue: ["previewImplicitValue", "previewImplicitValue", booleanAttribute], showFavorites: "showFavorites", toggleFavoriteTitle: "toggleFavoriteTitle", favoriteItems: "favoriteItems", colSizes: "colSizes", classList: ["class", "classList"], filter: "filter", readonly: ["readonly", "readonly", booleanAttribute], tabindex: "tabindex", items: "items" }, outputs: { clicked: "click", blurred: "blur", focusedChanges: "focus", dropButtonClick: "dropButtonClick", keydownEscape: "keydown.escape", keydownBackspace: "keydown.backspace", keyupEnter: "keyup.enter", arrowUp: "arrowUp", arrowDown: "arrowDown", enter: "enter", selectionChange: "selectionChange", openedChange: "openedChange", toggleFavorite: "toggleFavorite" }, providers: [DEFAULT_VALUE_ACCESSOR, INPUT_FIELD_ACCESSOR_PROVIDER], queries: [{ propertyName: "panelHeaderTemplate", first: true, predicate: MaterialAutocompleteHeaderDirective, descendants: true, read: TemplateRef }, { propertyName: "panelFooterTemplate", first: true, predicate: MaterialAutocompleteFooterDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "matSelect", first: true, predicate: ["matSelect"], descendants: true }, { propertyName: "ionSearchbar", first: true, predicate: ["ionSearchbar"], descendants: true }, { propertyName: "matInputText", first: true, predicate: ["matInputText"], descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }], ngImport: i0, template: "<ion-grid class=\"ion-no-padding field-container\">\n <ion-row>\n <ion-col [size]=\"colSizes?.[0]\" class=\"ion-no-padding\">\n <!-- readonly -->\n @if (_readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [title]=\"!showTooltip ? _displayValue || '' : ''\"\n [matTooltip]=\"showTooltip ? _displayValue || '' : ''\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\" />\n <ion-text>{{ value | toString: displayWith }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n <!-- hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n } @else {\n @let hasFavorites = toggleFavorite.observed || (favoriteItems | isNotEmptyArray);\n\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [title]=\"!showTooltip ? _displayValue || '' : ''\"\n [matTooltip]=\"showTooltip ? _displayValue || '' : ''\"\n [hideRequiredMarker]=\"hideRequiredMarker\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if ((label || placeholder) && floatLabel !== 'never') {\n <mat-label>{{ label || placeholder }}</mat-label>\n }\n <!-- Mobile or Multiple (use <mat-select>) -->\n @if (mobile || multiple) {\n <mat-select\n #matSelect\n hideSingleSelectionIndicator\n disableOptionCentering\n [disableRipple]=\"disableRipple\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"panelClass\"\n [panelWidth]=\"panelWidth || _defaultPanelWidth\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"emitEscape($event)\"\n (keyup.enter)=\"emitEnter($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n (openedChange)=\"onMatSelectOpenedChange($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\"\n [class.mat-mdc-select-arrow-hidden]=\"!mobile\"\n >\n <mat-select-trigger>\n {{ value | toString: displayWith }}\n </mat-select-trigger>\n <!-- Search bar -->\n @if (showSearchBar) {\n <mat-optgroup class=\"mat-select-searchbar\" [class.mat-select-searchbar-sticky]=\"stickySearchBar\">\n <!-- FIXME on iOS devices, when animated=\"true\", then the search icon overlap the placeholder -->\n <ion-searchbar\n #ionSearchbar\n inputmode=\"search\"\n autocomplete=\"off\"\n [animated]=\"false\"\n [showClearButton]=\"true\"\n [debounce]=\"debounceTime\"\n (ionClear)=\"markAsLoading()\"\n (ionInput)=\"ionSearchBarChanged($event)\"\n [placeholder]=\"'COMMON.BTN_SEARCH' | translate\"\n ></ion-searchbar>\n </mat-optgroup>\n }\n\n <!-- Custom header -->\n <ng-container\n [ngTemplateOutlet]=\"panelHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n\n <!-- Headers -->\n <ion-row\n class=\"mat-select-header column sticky ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.mat-select-searchbar-sticky]=\"showSearchBar && stickySearchBar\"\n [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\"\n >\n <!-- favorite spacer -->\n @if (hasFavorites) {\n <ion-col size=\"auto\" class=\"favorite-col\"></ion-col>\n }\n <!-- attribute headers -->\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n\n <!-- None option -->\n @if (!required && !multiple && !clearable && (showAllOnFocus || !_displayValue)) {\n <mat-option class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n }\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n @if (_hiddenSearchText) {\n (<b>{{ _hiddenSearchText }}</b>)\n }\n </ion-label>\n </mat-option>\n } @else {\n <!-- Options -->\n @for (item of items; track i; let i = $index) {\n @let isFavorite = hasFavorites && (favoriteItems | arrayIncludes: item);\n\n <mat-option [value]=\"item\" class=\"ion-no-padding\" [class.mdc-list-item--favorite]=\"isFavorite\">\n <ion-row [classList]=\"item?.classList || ''\" [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\">\n <!-- favorite icon -->\n @if (hasFavorites) {\n <ion-col size=\"auto\" class=\"favorite-col\">\n @if (isFavorite) {\n <ion-icon name=\"star\" color=\"tertiary\"></ion-icon>\n }\n </ion-col>\n }\n\n <!-- attribute columns -->\n @for (path of displayAttributes; track j; let j = $index) {\n <ion-col [size]=\"displayColumnSizes[j]\" class=\"ion-align-self-center ion-text-wrap\">\n <ion-label\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight: { search: ionSearchbar?.value, withAccent: highlightAccent }\n \"\n ></ion-label>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option class=\"ion-padding mat-pseudo-checkbox-hidden\" (ngInit)=\"_initMatSelectInfiniteScroll()\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- need more character -->\n <mat-option class=\"ion-padding text-italic mat-pseudo-checkbox-hidden\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- loading spinner -->\n <mat-option class=\"ion-padding mat-pseudo-checkbox-hidden\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (showPanelFooter && itemCount; as count) {\n <mat-option class=\"mat-option-footer mat-autocomplete-footer mat-pseudo-checkbox-hidden ion-no-padding\" disabled>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </mat-option>\n }\n\n <!-- Custom footer -->\n <ng-container\n [ngTemplateOutlet]=\"panelFooterTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n </mat-select>\n } @else {\n <!-- desktop (use mat-autocomplete) -->\n <input\n matInput\n #matInputText\n type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"(label || floatLabel === 'never') && placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"emitEscape($event)\"\n (keydown.backspace)=\"onBackspace($event)\"\n (keyup.enter)=\"emitEnter($event)\"\n (keyup.arrowUp)=\"emitArrowUp($event)\"\n (keyup.arrowDown)=\"emitArrowDown($event)\"\n />\n <!-- autocomplete -->\n <mat-autocomplete\n #autocomplete=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n [hideSingleSelectionIndicator]=\"true\"\n [displayWith]=\"displayWith\"\n [class]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n [disableRipple]=\"disableRipple\"\n (optionSelected)=\"onOptionSelected($event)\"\n (opened)=\"openedChange.emit(true)\"\n (closed)=\"openedChange.emit(false)\"\n >\n\n <!-- Custom header -->\n <ng-container\n [ngTemplateOutlet]=\"panelHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n\n <!-- Headers -->\n @if (showPanelHeader) {\n <ion-row\n class=\"mat-autocomplete-header column sticky ion-no-padding\"\n [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\"\n >\n <!-- favorite spacer -->\n @if (hasFavorites) {\n <ion-col size=\"auto\" class=\"favorite-col\"></ion-col>\n }\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n }\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n } @else {\n <!-- Options -->\n @for (item of items; track i; let i = $index) {\n @let isFavorite = hasFavorites && (favoriteItems | arrayIncludes: item);\n <mat-option\n [value]=\"item\"\n class=\"ion-no-padding\"\n [class.mdc-list-item--selected]=\"item === _selectedItem\"\n [class.mdc-list-item--favorite]=\"isFavorite\"\n >\n <ion-row [classList]=\"item?.classList || ''\" [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\">\n <!-- favorite icon -->\n @if (hasFavorites) {\n <ion-col\n matPrefix\n size=\"auto\"\n class=\"favorite-col\"\n (click)=\"toggleFavoriteClick($event, item)\"\n >\n @if (isFavorite) {\n <ion-icon name=\"star\" color=\"tertiary\"></ion-icon>\n } @else if (toggleFavorite.observed) {\n <ion-icon name=\"star-outline\" color=\"medium\" class=\"visible-hover\"></ion-icon>\n }\n </ion-col>\n }\n @for (path of displayAttributes; track j; let j = $index) {\n <ion-col\n [size]=\"displayColumnSizes[j]\"\n [title]=\"!showTooltip ? text.innerText : ''\"\n [matTooltip]=\"showTooltip ? text.innerText : ''\"\n class=\"ion-align-self-center\"\n >\n <ion-label>\n <span\n #text\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight\n : {\n search: matInputText.value,\n withAccent: highlightAccent,\n }\n \"\n ></span>\n </ion-label>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option class=\"ion-padding\" (ngInit)=\"_initAutocompleteInfiniteScroll()\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- Need more characters -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- Loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (showPanelFooter && itemCount; as count) {\n <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n\n <!-- Custom footer -->\n <ng-container\n [ngTemplateOutlet]=\"panelFooterTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n\n </mat-autocomplete>\n }\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n @if (formControl?.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @if (formControl?.hasError('entity')) {\n <mat-error translate>ERROR.FIELD_INVALID</mat-error>\n }\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n <!-- Hints -->\n @if (!formControl?.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n }\n </ion-col>\n <ion-col [size]=\"colSizes?.[1]\" class=\"ion-no-padding\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n @if (!mobile) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"toggleShowPanel($event)\"\n [hidden]=\"disabled\"\n [title]=\"!showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n [matTooltip]=\"showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n >\n <mat-icon>{{ mobile ? 'arrow_drop_down' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n }\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\"\n [title]=\"!showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n [matTooltip]=\"showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;position:relative}:host.ion-text-wrap ion-label,:host.ion-text-wrap ion-text{white-space:normal!important}:host ::ng-deep .mat-mdc-select-arrow-hidden .mat-mdc-select-arrow-wrapper{display:none;visibility:hidden}ion-grid.field-container>ion-row>ion-col.ion-no-padding{--ion-padding-start: 0}ion-row{flex-wrap:nowrap}button[hidden]{display:none}mat-autocomplete mat-option{--mat-option-text-width: 100%}ion-col.favorite-col{flex:0 0 auto;width:24px!important}mat-option .visible-hover{opacity:0;display:none;animation:fadeinout 1s linear 1 backwards}mat-option:hover .visible-hover{display:inline-block;opacity:1}\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocapitalize", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "maxlength", "minlength", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "component", type: i1.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar,ion-range" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgInitDirective, selector: "[ngInit]", outputs: ["ngInit"] }, { kind: "directive", type: i5.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i7.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i12.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "directive", type: i13.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i15.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i16.HighlightPipe, name: "highlight" }, { kind: "pipe", type: i17.NotEmptyArrayPipe, name: "isNotEmptyArray" }, { kind: "pipe", type: i17.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i17.ArrayIncludesPipe, name: "arrayIncludes" }, { kind: "pipe", type: i18.ToStringPipe, name: "toString" }, { kind: "pipe", type: i18.StrLengthPipe, name: "strLength" }, { kind: "pipe", type: i19.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i20.RxPush, name: "push" }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1164
1293
|
}
|
|
1165
1294
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MatAutocompleteField, decorators: [{
|
|
1166
1295
|
type: Component,
|
|
1167
|
-
args: [{ selector: 'mat-autocomplete-field', providers: [DEFAULT_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<ion-grid class=\"ion-no-padding field-container\">\n <ion-row>\n <ion-col [size]=\"colSizes?.[0]\" class=\"ion-no-padding\">\n <!-- readonly -->\n @if (_readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [title]=\"!showTooltip ? _displayValue || '' : ''\"\n [matTooltip]=\"showTooltip ? _displayValue || '' : ''\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\" />\n <ion-text>{{ value | toString: displayWith }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n <!-- hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n } @else {\n @let hasFavorites = toggleFavorite.observed || (favoriteItems | isNotEmptyArray);\n\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [title]=\"!showTooltip ? _displayValue || '' : ''\"\n [matTooltip]=\"showTooltip ? _displayValue || '' : ''\"\n [hideRequiredMarker]=\"hideRequiredMarker\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if ((label || placeholder) && floatLabel !== 'never') {\n <mat-label>{{ label || placeholder }}</mat-label>\n }\n <!-- Mobile or Multiple (use <mat-select>) -->\n @if (mobile || multiple) {\n <mat-select\n #matSelect\n hideSingleSelectionIndicator\n disableOptionCentering\n [disableRipple]=\"disableRipple\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"panelClass\"\n [panelWidth]=\"panelWidth || _defaultPanelWidth\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"emitEscape($event)\"\n (keyup.enter)=\"emitEnter($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n (openedChange)=\"openedChange.emit($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\"\n [class.mat-mdc-select-arrow-hidden]=\"!mobile\"\n >\n <mat-select-trigger>{{ value | toString: displayWith }}</mat-select-trigger>\n <!-- Search bar -->\n @if (showSearchBar) {\n <mat-optgroup class=\"mat-select-searchbar\" [class.mat-select-searchbar-sticky]=\"stickySearchBar\">\n <!-- FIXME on iOS devices, when animated=\"true\", then the search icon overlap the placeholder -->\n <ion-searchbar\n #ionSearchbar\n inputmode=\"search\"\n autocomplete=\"off\"\n animated=\"false\"\n showClearButton=\"true\"\n [debounce]=\"debounceTime\"\n (ionClear)=\"markAsLoading()\"\n (ionInput)=\"ionSearchBarChanged($event)\"\n [placeholder]=\"'COMMON.BTN_SEARCH' | translate\"\n ></ion-searchbar>\n </mat-optgroup>\n }\n\n <!-- Custom header -->\n <ng-container\n [ngTemplateOutlet]=\"panelHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n\n <!-- Headers -->\n <ion-row\n class=\"mat-select-header column sticky ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.mat-select-searchbar-sticky]=\"showSearchBar && stickySearchBar\"\n [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\"\n >\n <!-- favorite spacer -->\n @if (hasFavorites) {\n <ion-col size=\"auto\" class=\"favorite-col\"></ion-col>\n }\n <!-- attribute headers -->\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n\n <!-- None option -->\n @if (!required && !multiple && !clearable) {\n <mat-option class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n }\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n } @else {\n <!-- Options -->\n @for (item of items; track i; let i = $index) {\n @let isFavorite = hasFavorites && (favoriteItems | arrayIncludes: item);\n\n <mat-option [value]=\"item\" class=\"ion-no-padding\" [class.mdc-list-item--favorite]=\"isFavorite\">\n <ion-row [classList]=\"item?.classList || ''\" [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\">\n <!-- favorite icon -->\n @if (hasFavorites) {\n <ion-col size=\"auto\" class=\"favorite-col\">\n @if (isFavorite) {\n <ion-icon name=\"star\" color=\"tertiary\"></ion-icon>\n }\n </ion-col>\n }\n\n <!-- attribute columns -->\n @for (path of displayAttributes; track j; let j = $index) {\n <ion-col [size]=\"displayColumnSizes[j]\" class=\"ion-align-self-center ion-text-wrap\">\n <ion-label\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight: { search: ionSearchbar?.value, withAccent: highlightAccent }\n \"\n ></ion-label>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option class=\"ion-padding mat-pseudo-checkbox-hidden\" (ngInit)=\"_initMatSelectInfiniteScroll()\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- need more character -->\n <mat-option class=\"ion-padding text-italic mat-pseudo-checkbox-hidden\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- loading spinner -->\n <mat-option class=\"ion-padding mat-pseudo-checkbox-hidden\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (showPanelFooter && itemCount; as count) {\n <mat-option class=\"mat-option-footer mat-autocomplete-footer mat-pseudo-checkbox-hidden ion-no-padding\" disabled>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </mat-option>\n }\n\n <!-- Custom footer -->\n <ng-container\n [ngTemplateOutlet]=\"panelFooterTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n </mat-select>\n } @else {\n <!-- desktop (use mat-autocomplete) -->\n <input\n matInput\n #matInputText\n type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"(label || floatLabel === 'never') && placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"emitEscape($event)\"\n (keydown.backspace)=\"onBackspace($event)\"\n (keyup.enter)=\"emitEnter($event)\"\n (keyup.arrowUp)=\"emitArrowUp($event)\"\n (keyup.arrowDown)=\"emitArrowDown($event)\"\n />\n <!-- autocomplete -->\n <mat-autocomplete\n #autocomplete=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n [hideSingleSelectionIndicator]=\"true\"\n [displayWith]=\"displayWith\"\n [class]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n [disableRipple]=\"disableRipple\"\n (optionSelected)=\"onOptionSelected($event)\"\n (opened)=\"openedChange.emit(true)\"\n (closed)=\"openedChange.emit(false)\"\n >\n\n <!-- Custom header -->\n <ng-container\n [ngTemplateOutlet]=\"panelHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n\n <!-- Headers -->\n @if (showPanelHeader) {\n <ion-row\n class=\"mat-autocomplete-header column sticky ion-no-padding\"\n [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\"\n >\n <!-- favorite spacer -->\n @if (hasFavorites) {\n <ion-col size=\"auto\" class=\"favorite-col\"></ion-col>\n }\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n }\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n } @else {\n <!-- Options -->\n @for (item of items; track i; let i = $index) {\n @let isFavorite = hasFavorites && (favoriteItems | arrayIncludes: item);\n <mat-option\n [value]=\"item\"\n class=\"ion-no-padding\"\n [class.mdc-list-item--selected]=\"item === _selectedItem\"\n [class.mdc-list-item--favorite]=\"isFavorite\"\n >\n <ion-row [classList]=\"item?.classList || ''\" [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\">\n <!-- favorite icon -->\n @if (hasFavorites) {\n <ion-col\n matPrefix\n size=\"auto\"\n class=\"favorite-col\"\n (click)=\"toggleFavoriteClick($event, item)\"\n >\n @if (isFavorite) {\n <ion-icon name=\"star\" color=\"tertiary\"></ion-icon>\n } @else if (toggleFavorite.observed) {\n <ion-icon name=\"star-outline\" color=\"medium\" class=\"visible-hover\"></ion-icon>\n }\n </ion-col>\n }\n @for (path of displayAttributes; track j; let j = $index) {\n <ion-col\n [size]=\"displayColumnSizes[j]\"\n [title]=\"!showTooltip ? text.innerText : ''\"\n [matTooltip]=\"showTooltip ? text.innerText : ''\"\n class=\"ion-align-self-center\"\n >\n <ion-label>\n <span\n #text\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight\n : {\n search: matInputText.value,\n withAccent: highlightAccent,\n }\n \"\n ></span>\n </ion-label>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option class=\"ion-padding\" (ngInit)=\"_initAutocompleteInfiniteScroll()\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- Need more characters -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- Loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (showPanelFooter && itemCount; as count) {\n <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n\n <!-- Custom footer -->\n <ng-container\n [ngTemplateOutlet]=\"panelFooterTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n\n </mat-autocomplete>\n }\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n @if (formControl?.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @if (formControl?.hasError('entity')) {\n <mat-error translate>ERROR.FIELD_INVALID</mat-error>\n }\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n <!-- Hints -->\n @if (!formControl?.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n }\n </ion-col>\n <ion-col [size]=\"colSizes?.[1]\" class=\"ion-no-padding\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n @if (!mobile) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"toggleShowPanel($event)\"\n [hidden]=\"disabled\"\n [title]=\"!showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n [matTooltip]=\"showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n >\n <mat-icon>{{ mobile ? 'arrow_drop_down' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n }\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\"\n [title]=\"!showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n [matTooltip]=\"showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;position:relative}:host.ion-text-wrap ion-label,:host.ion-text-wrap ion-text{white-space:normal!important}:host ::ng-deep .mat-mdc-select-arrow-hidden .mat-mdc-select-arrow-wrapper{display:none;visibility:hidden}ion-grid.field-container>ion-row>ion-col.ion-no-padding{--ion-padding-start: 0}ion-row{flex-wrap:nowrap}button[hidden]{display:none}mat-autocomplete mat-option{--mat-option-text-width: 100%}ion-col.favorite-col{flex:0 0 auto;width:24px!important}mat-option .visible-hover{opacity:0;display:none;animation:fadeinout 1s linear 1 backwards}mat-option:hover .visible-hover{display:inline-block;opacity:1}\n"] }]
|
|
1296
|
+
args: [{ selector: 'mat-autocomplete-field', providers: [DEFAULT_VALUE_ACCESSOR, INPUT_FIELD_ACCESSOR_PROVIDER], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<ion-grid class=\"ion-no-padding field-container\">\n <ion-row>\n <ion-col [size]=\"colSizes?.[0]\" class=\"ion-no-padding\">\n <!-- readonly -->\n @if (_readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [title]=\"!showTooltip ? _displayValue || '' : ''\"\n [matTooltip]=\"showTooltip ? _displayValue || '' : ''\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\" />\n <ion-text>{{ value | toString: displayWith }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n <!-- hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n } @else {\n @let hasFavorites = toggleFavorite.observed || (favoriteItems | isNotEmptyArray);\n\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [title]=\"!showTooltip ? _displayValue || '' : ''\"\n [matTooltip]=\"showTooltip ? _displayValue || '' : ''\"\n [hideRequiredMarker]=\"hideRequiredMarker\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if ((label || placeholder) && floatLabel !== 'never') {\n <mat-label>{{ label || placeholder }}</mat-label>\n }\n <!-- Mobile or Multiple (use <mat-select>) -->\n @if (mobile || multiple) {\n <mat-select\n #matSelect\n hideSingleSelectionIndicator\n disableOptionCentering\n [disableRipple]=\"disableRipple\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"panelClass\"\n [panelWidth]=\"panelWidth || _defaultPanelWidth\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"emitEscape($event)\"\n (keyup.enter)=\"emitEnter($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n (openedChange)=\"onMatSelectOpenedChange($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\"\n [class.mat-mdc-select-arrow-hidden]=\"!mobile\"\n >\n <mat-select-trigger>\n {{ value | toString: displayWith }}\n </mat-select-trigger>\n <!-- Search bar -->\n @if (showSearchBar) {\n <mat-optgroup class=\"mat-select-searchbar\" [class.mat-select-searchbar-sticky]=\"stickySearchBar\">\n <!-- FIXME on iOS devices, when animated=\"true\", then the search icon overlap the placeholder -->\n <ion-searchbar\n #ionSearchbar\n inputmode=\"search\"\n autocomplete=\"off\"\n [animated]=\"false\"\n [showClearButton]=\"true\"\n [debounce]=\"debounceTime\"\n (ionClear)=\"markAsLoading()\"\n (ionInput)=\"ionSearchBarChanged($event)\"\n [placeholder]=\"'COMMON.BTN_SEARCH' | translate\"\n ></ion-searchbar>\n </mat-optgroup>\n }\n\n <!-- Custom header -->\n <ng-container\n [ngTemplateOutlet]=\"panelHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n\n <!-- Headers -->\n <ion-row\n class=\"mat-select-header column sticky ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.mat-select-searchbar-sticky]=\"showSearchBar && stickySearchBar\"\n [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\"\n >\n <!-- favorite spacer -->\n @if (hasFavorites) {\n <ion-col size=\"auto\" class=\"favorite-col\"></ion-col>\n }\n <!-- attribute headers -->\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n\n <!-- None option -->\n @if (!required && !multiple && !clearable && (showAllOnFocus || !_displayValue)) {\n <mat-option class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n }\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n @if (_hiddenSearchText) {\n (<b>{{ _hiddenSearchText }}</b>)\n }\n </ion-label>\n </mat-option>\n } @else {\n <!-- Options -->\n @for (item of items; track i; let i = $index) {\n @let isFavorite = hasFavorites && (favoriteItems | arrayIncludes: item);\n\n <mat-option [value]=\"item\" class=\"ion-no-padding\" [class.mdc-list-item--favorite]=\"isFavorite\">\n <ion-row [classList]=\"item?.classList || ''\" [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\">\n <!-- favorite icon -->\n @if (hasFavorites) {\n <ion-col size=\"auto\" class=\"favorite-col\">\n @if (isFavorite) {\n <ion-icon name=\"star\" color=\"tertiary\"></ion-icon>\n }\n </ion-col>\n }\n\n <!-- attribute columns -->\n @for (path of displayAttributes; track j; let j = $index) {\n <ion-col [size]=\"displayColumnSizes[j]\" class=\"ion-align-self-center ion-text-wrap\">\n <ion-label\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight: { search: ionSearchbar?.value, withAccent: highlightAccent }\n \"\n ></ion-label>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option class=\"ion-padding mat-pseudo-checkbox-hidden\" (ngInit)=\"_initMatSelectInfiniteScroll()\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- need more character -->\n <mat-option class=\"ion-padding text-italic mat-pseudo-checkbox-hidden\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- loading spinner -->\n <mat-option class=\"ion-padding mat-pseudo-checkbox-hidden\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (showPanelFooter && itemCount; as count) {\n <mat-option class=\"mat-option-footer mat-autocomplete-footer mat-pseudo-checkbox-hidden ion-no-padding\" disabled>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </mat-option>\n }\n\n <!-- Custom footer -->\n <ng-container\n [ngTemplateOutlet]=\"panelFooterTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n </mat-select>\n } @else {\n <!-- desktop (use mat-autocomplete) -->\n <input\n matInput\n #matInputText\n type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"(label || floatLabel === 'never') && placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"emitEscape($event)\"\n (keydown.backspace)=\"onBackspace($event)\"\n (keyup.enter)=\"emitEnter($event)\"\n (keyup.arrowUp)=\"emitArrowUp($event)\"\n (keyup.arrowDown)=\"emitArrowDown($event)\"\n />\n <!-- autocomplete -->\n <mat-autocomplete\n #autocomplete=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n [hideSingleSelectionIndicator]=\"true\"\n [displayWith]=\"displayWith\"\n [class]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n [disableRipple]=\"disableRipple\"\n (optionSelected)=\"onOptionSelected($event)\"\n (opened)=\"openedChange.emit(true)\"\n (closed)=\"openedChange.emit(false)\"\n >\n\n <!-- Custom header -->\n <ng-container\n [ngTemplateOutlet]=\"panelHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n\n <!-- Headers -->\n @if (showPanelHeader) {\n <ion-row\n class=\"mat-autocomplete-header column sticky ion-no-padding\"\n [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\"\n >\n <!-- favorite spacer -->\n @if (hasFavorites) {\n <ion-col size=\"auto\" class=\"favorite-col\"></ion-col>\n }\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n }\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n } @else {\n <!-- Options -->\n @for (item of items; track i; let i = $index) {\n @let isFavorite = hasFavorites && (favoriteItems | arrayIncludes: item);\n <mat-option\n [value]=\"item\"\n class=\"ion-no-padding\"\n [class.mdc-list-item--selected]=\"item === _selectedItem\"\n [class.mdc-list-item--favorite]=\"isFavorite\"\n >\n <ion-row [classList]=\"item?.classList || ''\" [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\">\n <!-- favorite icon -->\n @if (hasFavorites) {\n <ion-col\n matPrefix\n size=\"auto\"\n class=\"favorite-col\"\n (click)=\"toggleFavoriteClick($event, item)\"\n >\n @if (isFavorite) {\n <ion-icon name=\"star\" color=\"tertiary\"></ion-icon>\n } @else if (toggleFavorite.observed) {\n <ion-icon name=\"star-outline\" color=\"medium\" class=\"visible-hover\"></ion-icon>\n }\n </ion-col>\n }\n @for (path of displayAttributes; track j; let j = $index) {\n <ion-col\n [size]=\"displayColumnSizes[j]\"\n [title]=\"!showTooltip ? text.innerText : ''\"\n [matTooltip]=\"showTooltip ? text.innerText : ''\"\n class=\"ion-align-self-center\"\n >\n <ion-label>\n <span\n #text\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight\n : {\n search: matInputText.value,\n withAccent: highlightAccent,\n }\n \"\n ></span>\n </ion-label>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option class=\"ion-padding\" (ngInit)=\"_initAutocompleteInfiniteScroll()\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- Need more characters -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- Loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (showPanelFooter && itemCount; as count) {\n <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n\n <!-- Custom footer -->\n <ng-container\n [ngTemplateOutlet]=\"panelFooterTemplate\"\n [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n ></ng-container>\n\n </mat-autocomplete>\n }\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n @if (formControl?.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @if (formControl?.hasError('entity')) {\n <mat-error translate>ERROR.FIELD_INVALID</mat-error>\n }\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n <!-- Hints -->\n @if (!formControl?.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n }\n </ion-col>\n <ion-col [size]=\"colSizes?.[1]\" class=\"ion-no-padding\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n @if (!mobile) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"toggleShowPanel($event)\"\n [hidden]=\"disabled\"\n [title]=\"!showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n [matTooltip]=\"showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n >\n <mat-icon>{{ mobile ? 'arrow_drop_down' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n }\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\"\n [title]=\"!showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n [matTooltip]=\"showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;position:relative}:host.ion-text-wrap ion-label,:host.ion-text-wrap ion-text{white-space:normal!important}:host ::ng-deep .mat-mdc-select-arrow-hidden .mat-mdc-select-arrow-wrapper{display:none;visibility:hidden}ion-grid.field-container>ion-row>ion-col.ion-no-padding{--ion-padding-start: 0}ion-row{flex-wrap:nowrap}button[hidden]{display:none}mat-autocomplete mat-option{--mat-option-text-width: 100%}ion-col.favorite-col{flex:0 0 auto;width:24px!important}mat-option .visible-hover{opacity:0;display:none;animation:fadeinout 1s linear 1 backwards}mat-option:hover .visible-hover{display:inline-block;opacity:1}\n"] }]
|
|
1168
1297
|
}], ctorParameters: () => [{ type: i0.Injector }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.ModalController }, { type: i0.Renderer2 }, { type: i2.FormGroupDirective, decorators: [{
|
|
1169
1298
|
type: Optional
|
|
1170
1299
|
}] }], propDecorators: { equals: [{
|
|
@@ -1309,7 +1438,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1309
1438
|
}], blurred: [{
|
|
1310
1439
|
type: Output,
|
|
1311
1440
|
args: ['blur']
|
|
1312
|
-
}],
|
|
1441
|
+
}], focusedChanges: [{
|
|
1313
1442
|
type: Output,
|
|
1314
1443
|
args: ['focus']
|
|
1315
1444
|
}], dropButtonClick: [{
|
|
@@ -1372,4 +1501,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1372
1501
|
}], items: [{
|
|
1373
1502
|
type: Input
|
|
1374
1503
|
}] } });
|
|
1375
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuYXV0b2NvbXBsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL21hdGVyaWFsLmF1dG9jb21wbGV0ZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2F1dG9jb21wbGV0ZS9tYXRlcmlhbC5hdXRvY29tcGxldGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUVOLEtBQUssRUFDTCxlQUFlLEVBR2YsUUFBUSxFQUNSLE1BQU0sRUFHTixtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUEyQyxpQkFBaUIsRUFBc0IsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0gsT0FBTyxFQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3BHLE9BQU8sRUFBQyxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTdJLE9BQU8sRUFBQyxzQkFBc0IsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsd0JBQXdCLEdBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4TSxPQUFPLEVBQUMsVUFBVSxFQUFnQixrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUM1RixPQUFPLEVBQUMsa0JBQWtCLEVBQUUsT0FBTyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHOUQsT0FBTyxFQUFDLGVBQWUsRUFBZ0Msc0JBQXNCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNySCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFaEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWhELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBSXhFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxpQ0FBaUMsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3BGLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFDLG1DQUFtQyxFQUFFLG1DQUFtQyxFQUFDLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFM0gsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0FBV3RCLE1BQU0sc0JBQXNCLEdBQWE7SUFDdkMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixDQUFDO0lBQ25ELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQVdGLE1BQU0sT0FBTyxvQkFBb0I7SUF1SW5CO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDVTtJQTNJZCxpQkFBaUIsR0FBcUIsSUFBSSxDQUFDO0lBQzNDLGtCQUFrQixHQUFlLElBQUksQ0FBQztJQUV0QyxvQkFBb0IsQ0FBK0I7SUFDbkQsY0FBYyxDQUFNO0lBQ3BCLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ25DLGtCQUFrQixDQUFlO0lBQ2pDLG1CQUFtQixDQUFlO0lBQ2xDLFFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBTSxTQUFTLENBQUMsQ0FBQztJQUMvQyxVQUFVLENBQVM7SUFDbkIsbUJBQW1CLEdBQVcsQ0FBQyxDQUFDLENBQUMsZ0NBQWdDO0lBQ2pFLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO0lBQzlCLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRTlCLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsU0FBUyxDQUFTO0lBQ2xCLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBUSxTQUFTLENBQUMsQ0FBQztJQUNyRCxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQVEsU0FBUyxDQUFDLENBQUM7SUFDeEQsYUFBYSxDQUFNO0lBQ25CLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDbkIsZUFBZSxDQUFTO0lBQ3hCLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO0lBQ3hDLGtCQUFrQixHQUFXLElBQUksQ0FBQztJQUNsQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLGtCQUFrQixDQUFTO0lBRXJDLElBQWMsVUFBVTtRQUN0QixPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQztJQUM1RSxDQUFDO0lBRVEsTUFBTSxDQUFXO0lBQ2pCLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQztJQUNqQyxXQUFXLENBQXFCO0lBQ2hDLGVBQWUsR0FBVyxJQUFJLENBQUM7SUFDL0IsVUFBVSxHQUFzQixNQUFNLENBQUM7SUFDdkMsS0FBSyxHQUFXLElBQUksQ0FBQztJQUNyQixVQUFVLENBQXlCO0lBQ25DLGVBQWUsQ0FBa0I7SUFDakMsV0FBVyxDQUFTO0lBQ3BCLFNBQVMsQ0FBc0I7SUFDQSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUMzQixNQUFNLENBQVU7SUFDaEIsZUFBZSxHQUFZLElBQUksQ0FBQztJQUNoQyxlQUFlLEdBQVksSUFBSSxDQUFDO0lBQ2hDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbkIsWUFBWSxHQUFXLElBQUksQ0FBQztJQUMxRCxnQkFBZ0IsQ0FBZ0I7SUFDaEMsV0FBVyxDQUFtQjtJQUM5QixpQkFBaUIsQ0FBVztJQUM1QixrQkFBa0IsQ0FBa0M7SUFDcEQsa0JBQWtCLENBQVc7SUFDRSxlQUFlLENBQVU7SUFDekIsY0FBYyxDQUFVO0lBQ3hCLGdCQUFnQixDQUFVO0lBQzFCLGtCQUFrQixDQUFVO0lBQzVCLHVCQUF1QixDQUFVO0lBQ2pDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDakQsTUFBTSxDQUE2QjtJQUNuQyxVQUFVLEdBQUcsY0FBYyxDQUFDO0lBQzVCLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztJQUNyQyxVQUFVLENBQVM7SUFDbkIsVUFBVSxDQUFTO0lBQ1ksYUFBYSxHQUFHLEtBQUssQ0FBQztJQUNyRCx1QkFBdUIsQ0FBNkI7SUFDckIsUUFBUSxDQUFVO0lBQ2pELGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUNHLHNCQUFzQixHQUFXLElBQUksQ0FBQztJQUNyQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFDMUIsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNkLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFDckIsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUN2RCxrQkFBa0IsQ0FBc0M7SUFDeEQsZUFBZSxDQUFTO0lBQ3hCLGdCQUFnQixDQUFTO0lBQ00sY0FBYyxDQUFVO0lBQ3hCLGVBQWUsQ0FBVTtJQUN6Qix5QkFBeUIsQ0FBVTtJQUNwQyw4QkFBOEIsQ0FBUztJQUN0QyxvQkFBb0IsQ0FBVTtJQUM3RCxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLG1CQUFtQixHQUFHLDZCQUE2QixDQUFDO0lBQ3BELGFBQWEsR0FBVSxFQUFFLENBQUM7SUFDMUIsUUFBUSxHQUF1QyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUU1RTs7T0FFRztJQUNILElBQStCLFNBQVMsQ0FBQyxLQUFhO1FBQ3BELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELDREQUE0RDtJQUMzQyxPQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztJQUMxRCw0REFBNEQ7SUFDNUMsT0FBTyxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7SUFDekQsNERBQTREO0lBQzNDLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO0lBQ2hELGVBQWUsR0FBRyxJQUFJLFlBQVksQ0FBUSxJQUFJLENBQUMsQ0FBQztJQUNoQyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztJQUN2QyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO0lBRTFFOztPQUVHO0lBQ29CLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO0lBRTNDLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBeUIsQ0FBQztJQUNsRCxTQUFTLEdBQUcsSUFBSSxZQUFZLEVBQXlCLENBQUM7SUFDMUQsS0FBSyxHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO0lBRXhDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBb0MsQ0FBQztJQUMxRSxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztJQUN6QyxjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQXNDLENBQUM7SUFFMUUsU0FBUyxDQUFZO0lBQ2xCLFlBQVksQ0FBZTtJQUMzQixZQUFZLENBQStCO0lBQzFDLFlBQVksQ0FBa0I7SUFDdkIsbUJBQW1CLENBQXlCO0lBRy9FLG1CQUFtQixDQUFvQjtJQUd2QyxtQkFBbUIsQ0FBb0I7SUFFdkMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRTNELFlBQ1ksUUFBa0IsRUFDbEIsRUFBMkIsRUFDM0IsRUFBcUIsRUFDckIsZUFBZ0MsRUFDaEMsUUFBbUIsRUFDVCxZQUFnQztRQUwxQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLE9BQUUsR0FBRixFQUFFLENBQXlCO1FBQzNCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBQ3JCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ1QsaUJBQVksR0FBWixZQUFZLENBQW9CO0lBQ25ELENBQUM7SUFFSixJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxJQUFhLE1BQU0sQ0FBQyxLQUFVO1FBQzVCLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEMsUUFBUTtZQUNSLDREQUE0RDtZQUM1RCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQTRDLFFBQVEsQ0FBQyxLQUFjO1FBQ2pFLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFhLFFBQVEsQ0FBQyxLQUFhO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFhLEtBQUssQ0FBQyxLQUFnQztRQUNqRCxvREFBb0Q7UUFDcEQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsd0JBQXdCLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEMsQ0FBQztRQUVELElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDbEQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFjLENBQUMsQ0FBQztZQUN6QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztJQUNyRCxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7SUFDckQsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVztZQUNkLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQXdCLENBQUMsQ0FBQztRQUM5SSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDZGQUE2RixDQUFDLENBQUM7UUFFdEksbUNBQW1DO1FBQ25DLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ2pDLENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDaEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUMxRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQzdFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDN0UsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDO1lBQ2xGLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUMvRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUM7WUFDM0UsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNoRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDdEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ2hELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQztZQUNoRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7WUFDeEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1lBQzlFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztZQUNwRixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDakYsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQzVELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUNsRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUM7WUFDM0UsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO1lBQ3BGLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMseUJBQXlCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQztZQUN6RyxJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsOEJBQThCLENBQUM7WUFDeEgsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDO1lBQ25HLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQztRQUM1RixDQUFDO1FBRUQsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztRQUN2QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxpQ0FBaUMsQ0FBQztRQUNuRixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUkseUJBQXlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQy9JLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUM7UUFDcEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLDhFQUE4RTtRQUN6SSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUkseUJBQXlCLENBQUMsYUFBYSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVyRCxJQUFJLENBQUMsa0JBQWtCO1lBQ3JCLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ3ZCLDRCQUE0QjtnQkFDNUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNwRCx3QkFBd0I7Z0JBQ3hCLCtCQUErQjtnQkFDL0IsbUNBQW1DO2dCQUNuQyxxQkFBcUI7Z0JBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzFILElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUNsRCxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQzdJLENBQUM7UUFFRiwwRkFBMEY7UUFDMUY7Ozs7Ozs7OzJHQVFtRztRQUVuRyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixJQUFJLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQztRQUN0RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixJQUFJLEtBQUssQ0FBQztRQUMzRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsSUFBSSxLQUFLLENBQUM7UUFDckQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxNQUFNLENBQUM7UUFDdEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDbEUsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyx5QkFBeUIsSUFBSSxLQUFLLENBQUM7UUFDekUsSUFBSSxDQUFDLDhCQUE4QixHQUFHLElBQUksQ0FBQyw4QkFBOEIsSUFBSSxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxLQUFLLENBQUM7UUFDckUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLENBQUM7UUFFL0QsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsTUFBTSxrQkFBa0IsR0FBd0IsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN0RSxRQUFRO1lBQ1IsaUdBQWlHO1lBRWpHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRTtnQkFDL0MsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtnQkFDeEMsR0FBRyxNQUFNO2FBQ1YsQ0FBQyxDQUFDO1lBRUwscUVBQXFFO1lBQ3JFLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDdkMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNuQyxRQUFRO29CQUNSLGdGQUFnRjtvQkFFaEYsTUFBTSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO29CQUV0RSxRQUFRO29CQUNSLDZGQUE2RjtnQkFDL0YsQ0FBQztnQkFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDO2dCQUVwQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTztZQUMvQyxDQUFDLENBQUM7UUFDSixDQUFDO1FBRUQsK0JBQStCO1FBQy9CLGdEQUFnRDtRQUNoRCxtREFBbUQ7UUFDbkQseURBQXlEO1FBQ3pELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUN2QyxJQUFJLENBQUMsc0JBQXNCLElBQUksQ0FBQztZQUNoQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFL0gsTUFBTSxvQkFBb0IsR0FBRyxLQUFLO1FBQ2hDLG9GQUFvRjtRQUNwRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDaEIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFDMUIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEVBQ3pCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQzNEO1FBRUQsNkVBQTZFO1FBQzdFLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDaEMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCwyRkFBMkY7UUFDM0YsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUQsaUNBQWlDO1FBQ2pDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2YsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQ3ZELHNFQUFzRTtnQkFDdEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0JBQzNCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO1FBQ0YsdUJBQXVCO1FBQ3ZCLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQy9CLFFBQVE7UUFDUiwrRkFBK0Y7U0FDaEc7UUFFRCwyREFBMkQ7UUFDM0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUNoQyxTQUFTLENBQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFDdEMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDeEMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDWixRQUFRO1lBQ1IsNEZBQTRGO1lBRTVGLHFDQUFxQztZQUNyQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuRCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssWUFBWSxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO2dCQUVsQyxzQ0FBc0M7Z0JBQ3RDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsOEVBQThFO1FBQzlFLGlDQUFpQztRQUNqQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUN2RTtRQUVELG9FQUFvRTtRQUNwRSxLQUFLO1FBQ0gsNkNBQTZDO1FBQzdDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMvRSwrQ0FBK0M7UUFDL0MsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUMvQixxREFBcUQ7YUFDcEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixRQUFRO1FBQ1Isd0dBQXdHO1FBQ3hHLGdDQUFnQztRQUNoQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUMxQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzNCLFFBQVE7UUFDUixtR0FBbUc7U0FDcEcsQ0FDRixDQUFDLElBQUksQ0FDSixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUMxQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakcsc0JBQXNCO1FBQ3RCLG9CQUFvQixDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1FBQzlCLHlFQUF5RTtRQUN6RSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQ3hEO1FBQ0QsdUNBQXVDO1FBQ3ZDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztRQUN6QixRQUFRO1FBQ1IsaUdBQWlHO1NBQ2xHLENBQ0YsQ0FBQyxJQUFJO1FBQ0osaUJBQWlCO1FBQ2pCLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJELHNFQUFzRTtRQUN0RSxNQUFNLENBQUMsUUFBUSxDQUFDO1FBRWhCLFFBQVE7UUFDUixnR0FBZ0c7UUFFaEcsd0VBQXdFO1FBQ3hFLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUNuRixDQUFDO1FBRUYsb0JBQW9CO1FBQ3BCLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ2pELEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsZ0NBQWdDO1FBQ3pFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQy9CLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFaEMsUUFBUTtRQUNSLDZGQUE2RjtRQUU3RiwyQkFBMkI7UUFDM0IsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUN6RSxDQUFDO1FBRUYsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNwQixLQUFLLENBQ0gsSUFBSSxDQUFDLFlBQVk7UUFFakIsc0JBQXNCO1FBQ3RCLG9CQUFvQjtRQUVwQixvQkFBb0I7UUFDcEIscUJBQXFCLENBQ3RCLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDcEIsaURBQWlEO1lBQ2pELG9EQUFvRDtZQUNwRCxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFFMUIsMkNBQTJDO2dCQUMzQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNwQixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUMxQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6RixDQUFDO3lCQUFNLENBQUM7d0JBQ04sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQzs0QkFDOUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzs0QkFDbEUsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQ0FDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ3BDLENBQUM7aUNBQU0sQ0FBQztnQ0FDTixpRUFBaUU7Z0NBQ2pFLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0NBQ2pDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dDQUM5QixDQUFDOzRCQUNILENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsUUFBUTtZQUNSLHdGQUF3RjtZQUV4RixhQUFhO1lBQ2IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FDcEIsSUFBSSxDQUFDLE9BQU87YUFDVCxJQUFJO1FBQ0gsa0RBQWtEO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDNUQsUUFBUTtRQUNSLHFGQUFxRjtRQUNyRixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FDbEM7YUFDQSxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixJQUFJLHVCQUF1QixHQUFHLEtBQUssQ0FBQztZQUNwQyxJQUFJLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUVqQyxRQUFRO1lBQ1IsNEZBQTRGO1lBRTVGLCtEQUErRDtZQUMvRCxzQkFBc0I7WUFDdEIsNkNBQTZDO1lBQzdDLG1DQUFtQztZQUNuQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2SSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDOUUsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUM7Z0JBQ3pFLG9CQUFvQixHQUFHLElBQUksQ0FBQyxDQUFDLHNEQUFzRDtZQUNyRixDQUFDO1lBQ0QsaUNBQWlDO2lCQUM1QixJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3JFLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLENBQUM7WUFDRCxtQ0FBbUM7aUJBQzlCLENBQUM7Z0JBQ0osMEJBQTBCO2dCQUMxQixJQUFJLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUMxQix1QkFBdUIsR0FBRyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztvQkFDekUsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLENBQUMsc0RBQXNEO2dCQUNyRixDQUFDO2dCQUNELHlDQUF5QztxQkFDcEMsSUFBSSxJQUFJLENBQUMsdUJBQXVCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ25FLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDckUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzlFLHVCQUF1QixHQUFHLElBQUksQ0FBQztnQkFDakMsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxDQUFDLDJCQUEyQjtZQUN2RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxjQUFjO1lBRWpDLDBCQUEwQjtZQUMxQixJQUFJLHVCQUF1QixFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLDBDQUEwQztZQUNsRSxDQUFDO1lBRUQsc0RBQXNEO1lBQ3RELElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDekIsUUFBUTtnQkFDUiw0RkFBNEY7Z0JBQzVGLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0wsQ0FBQztRQUVGLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhO2FBQzNCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzdCLHlCQUF5QjthQUN4QixTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQzFDLENBQUM7UUFFRixnREFBZ0Q7UUFDaEQsSUFBSSxJQUFJLENBQUMseUJBQXlCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNwQixLQUFLLENBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2YsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztZQUMxQyx3Q0FBd0M7YUFDekMsRUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUMzRTtpQkFDRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO2lCQUN2RCxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNkLHVGQUF1RjtnQkFDdkYsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN0RCxDQUFDLENBQUMsQ0FDTCxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUM1RiwrRUFBK0U7Z0JBQy9FLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXpCLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFFdkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFFakMsNERBQTREO1FBQzVELElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVyxDQUFDLEtBQVc7UUFDckIsUUFBUTtRQUNSLG9GQUFvRjtRQUNwRixrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsc0JBQXNCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUV0SCx3Q0FBd0M7UUFDeEMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3JFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFVO1FBQ25CLFFBQVE7UUFDUiw0RUFBNEU7UUFFNUUsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFN0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTlCLG1DQUFtQztZQUNuQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQztRQUVELGNBQWM7YUFDVCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RCLHVEQUF1RDtZQUN2RCxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixDQUFDO1lBRUQsdUJBQXVCO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxFQUFPO1FBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQW1CO1FBQ2xDLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLENBQUM7UUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixDQUFDO2FBQU0sQ0FBQztZQUNOLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxLQUFpQjtRQUN6QyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JDLGdIQUFnSDtZQUNoSCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCwrQkFBK0I7UUFDL0IsSUFBSSxLQUFLLENBQUMsYUFBYSxZQUFZLFdBQVcsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUMvRixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxLQUFLLENBQUMsZUFBZTtnQkFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbkQsS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFFMUIsUUFBUTtZQUNSLDRFQUE0RTtZQUU1RSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxpRkFBaUY7UUFDakYsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRWhDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXJCLFFBQVE7UUFDUiwwRUFBMEU7UUFDMUUsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFFLEtBQUssQ0FBQyxNQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFakUsK0VBQStFO1FBQy9FLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNoRSxRQUFRO1lBQ1Isc0VBQXNFO1lBRXRFLG1IQUFtSDtZQUNuSCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtvQkFBRSxPQUFPLENBQUMsOEJBQThCO2dCQUUxRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFUCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFUyx3QkFBd0IsQ0FBQyxLQUFpQjtRQUNsRCxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0I7WUFBRSxPQUFPO1FBRTdDLFFBQVE7UUFDUixxRkFBcUY7UUFFckYsK0JBQStCO1FBQy9CLElBQ0UsQ0FBQyxLQUFLLENBQUMsYUFBYSxZQUFZLFdBQVcsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUM7WUFDNUYsNkhBQTZIO1lBQzdILENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsRUFDM0QsQ0FBQztZQUNELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixJQUFJLEtBQUssQ0FBQyxlQUFlO2dCQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNuRCxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUUxQixRQUFRO1lBQ1IsMkVBQTJFO1lBRTNFLE9BQU87UUFDVCxDQUFDO1FBRUQsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFdEIsK0VBQStFO1FBQy9FLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLElBQUksQ0FBQyxRQUFRO2dCQUFFLE9BQU8sQ0FBQyxzQkFBc0I7WUFFakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVTLFNBQVMsQ0FBQyxLQUE0QjtRQUM5QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU1QiwyQ0FBMkM7UUFDM0MsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUE0QjtRQUN0QyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQTRCO1FBQ3hDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQzthQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFUyxVQUFVLENBQUMsS0FBNEI7UUFDL0MsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsNENBQTRDO1lBQzVDLEtBQUssRUFBRSxlQUFlLEVBQUUsQ0FBQztZQUN6QixLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUM7WUFFeEIsUUFBUTtZQUNSLHdFQUF3RTtZQUV4RSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVTLG1CQUFtQixDQUFDLEtBQVk7UUFDeEMsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzFFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFeEIsMEJBQTBCO1FBQzFCLE1BQU0sS0FBSyxHQUFJLEtBQWlELEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUUvRSxRQUFRO1FBQ1IsNkVBQTZFO1FBRTdFLHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzdCLENBQUM7UUFFRCw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXJCLGVBQWU7UUFDZixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhCLDhFQUE4RTtRQUM5RTs7V0FFRztJQUNMLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxLQUFpQjtRQUN6QyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0I7WUFBRSxPQUFPO1FBQzdDLFFBQVE7UUFDUiw4RUFBOEU7UUFFOUUsYUFBYTtRQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxLQUFpQjtRQUN4QyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0I7WUFBRSxPQUFPO1FBRTdDLFFBQVE7UUFDUiw4RUFBOEU7UUFFOUUsSUFDRSxLQUFLLENBQUMsYUFBYSxZQUFZLFdBQVc7WUFDMUMsK0JBQStCO1lBQy9CLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEtBQUssWUFBWTtnQkFDM0MsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sS0FBSyxLQUFLLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUMsSUFBSSwwRkFBMEY7Z0JBQ3ZNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFDekcsQ0FBQztZQUNELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixJQUFJLEtBQUssQ0FBQyxlQUFlO2dCQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNuRCxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUMxQixRQUFRO1lBQ1IseUVBQXlFO1lBQ3pFLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBRXRCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBYTtRQUN0QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixLQUFLLEVBQUUsZUFBZSxFQUFFLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELCtCQUErQixDQUFDLFNBQWtCO1FBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU8sQ0FBQyxPQUFPO1FBRXZDLFFBQVE7UUFDUix1RUFBdUU7UUFFdkUsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFvQixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDekgsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FDN0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEVBQ3RDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFDaEIsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFDMUQsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQ3BDLENBQUM7UUFFRiw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRS9FLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsNEJBQTRCLENBQUMsU0FBa0I7UUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxDQUFDLE9BQU87UUFFcEMsUUFBUTtRQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxrQ0FBa0MsQ0FBQyxDQUFDO1FBRW5FLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVILE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQzdCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxFQUNuQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQ2hCLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQzFELFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUN4QyxDQUFDO1FBRUYsNkNBQTZDO1FBQzdDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU1SCx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLElBQUksS0FBSyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUV0RCxxQ0FBcUM7UUFDckMsdUZBQXVGO1FBQ3ZGLE9BQU8sUUFBUSxHQUFHLEdBQUcsQ0FBQztJQUN4QixDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDekMsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQsNEJBQTRCO0lBRWxCLGFBQWE7UUFDckIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQy9CLHdFQUF3RTtZQUV4RSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUM1QixJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztZQUNoQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVTLGlCQUFpQixDQUFDLEtBQXNCO1FBQ2hELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxLQUFtQztRQUM1RCxRQUFRO1FBQ1IsNEVBQTRFO1FBRTVFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRVMsZUFBZSxDQUFDLEtBQVk7UUFDcEMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsS0FBSyxFQUFFLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLEtBQUssRUFBRSxlQUFlLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVELDBCQUEwQjtJQUVsQixLQUFLLENBQUMsT0FBTyxDQUFDLEtBQVUsRUFBRSxNQUF1QjtRQUN2RCw2QkFBNkI7UUFDN0IsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFFdEMsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2pFLG1EQUFtRDtZQUNuRCxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ2xELE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDakUsSUFBSSxtQkFBbUIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUMvQixLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztnQkFDbEQsQ0FBQztZQUNILENBQUM7WUFFRCxtQkFBbUI7WUFDbkIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsSUFBSSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU5QyxvRUFBb0U7UUFDcEUsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLG1CQUFtQjtZQUFFLE9BQU8sU0FBUyxDQUFDO1FBRXRELFFBQVE7UUFDUiw4RkFBOEY7UUFFOUYsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztZQUN0QyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQztZQUN6QixHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ1gsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLEdBQUcsR0FBRyxHQUFZLENBQUM7WUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQzdCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUM7WUFDdEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDM0IsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxHQUFzQixDQUFDO1lBQzFELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUM7WUFDdEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekUsR0FBRyxHQUFHLElBQUksQ0FBQztRQUNiLENBQUM7UUFFRCxnQkFBZ0I7UUFDaEIsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDeEMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNuRyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQy9JLE1BQU0scUJBQXFCLEdBQUcsZ0JBQWdCO2dCQUM1QyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ25FLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQ25FLElBQUksZUFBZSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQztnQkFDM0MscUJBQXFCLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQzdFLEdBQUcsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNJLENBQUM7UUFDSCxDQUFDO1FBRUQsUUFBUTtRQUNSLDhGQUE4RjtRQUU5RixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTyxLQUFLLENBQUMsU0FBUztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQjtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRTFDLHdEQUF3RDtRQUN4RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDOUMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztRQUV0QyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxXQUFXLEVBQUUsQ0FBQztRQUU1RCxvQkFBb0I7UUFDcEIsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDeEMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RyxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUMzQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0I7UUFDekYsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sbUJBQW1CLENBQUMsS0FBWTtRQUN0Qyx3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksS0FBSyxFQUFFLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQzVJLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7Z0JBRXBDLHFFQUFxRTtnQkFDckUsSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsQ0FBQztvQkFDbEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO29CQUV6RCxpRUFBaUU7b0JBQ2pFLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQzt3QkFDbEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFDckQsSUFBSSxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7NEJBQ3BFLHlEQUF5RDs0QkFDekQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7d0JBQzNGLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO2dCQUVELE9BQU87WUFDVCxDQUFDO1lBQ0Qsa0NBQWtDO1FBQ3BDLENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUMsYUFBYSxDQUFDO1FBQzdFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULFFBQVE7WUFDUixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcseUNBQXlDLENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDekUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsUUFBUTtZQUNSLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVPLGlDQUFpQztRQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBRTVCLDJDQUEyQztRQUMzQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7UUFFckMsSUFBSSxxQkFBbUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNuRCxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULDJCQUEyQjtnQkFDM0IsTUFBTSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDO2dCQUNwRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUE0QixDQUFDO2dCQUN2RSxNQUFNLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztnQkFFMUUsb0ZBQW9GO2dCQUNwRixJQUFJLENBQUMsMEJBQTBCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBRTdDLDZCQUE2QjtnQkFDN0IsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ3ZCLHFCQUFxQixHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztvQkFDbkYsSUFBSSxxQkFBcUI7d0JBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDM0UsQ0FBQztnQkFFRCxpQkFBaUI7Z0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUM5QyxDQUFDO1lBQ0QsV0FBVztpQkFDTixDQUFDO2dCQUNKLG9DQUFvQztnQkFDcEMsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO29CQUMxQixxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztvQkFDakQscUJBQXFCLEdBQUcsSUFBSSxDQUFDO29CQUU3QixtQkFBbUI7b0JBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztnQkFDdkMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLDBCQUEwQixDQUFDLFdBQXdCO1FBQ3pELElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUV6Qix5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQ3BCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsV0FBVyxDQUFDLEtBQUssQ0FBQyxTQUFTO2FBQ3hCLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ2IsQ0FBQztRQUVGLDBFQUEwRTtRQUMxRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLGlHQUFpRztZQUNqRyxNQUFNLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUMzRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztnQkFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0RCxDQUFDO1FBQ0gsQ0FBQztRQUVELG1EQUFtRDtRQUNuRCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUNwQyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzVFLDhHQUE4RztZQUM5RyxNQUFNLEtBQUssR0FBRyxHQUFHLFdBQVcsQ0FBQyxXQUFXLElBQUksQ0FBQztZQUM3QyxNQUFNLE9BQU8sR0FBRyxTQUFTLEtBQUssVUFBVSxJQUFJLE1BQU0sS0FBSyxtQkFBbUIsQ0FBQztZQUMzRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBRUQsbURBQW1EO1FBQ25ELE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ2xDLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekUsOEdBQThHO1lBQzlHLE1BQU0sTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLFlBQVksSUFBSSxHQUFHLElBQUksQ0FBQztZQUN0RCxNQUFNLE1BQU0sR0FBRyxTQUFTLE1BQU0sVUFBVSxHQUFHLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQztZQUMzRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxLQUFLLENBQUMsb0JBQW9CLENBQUMsWUFBeUIsRUFBRSxXQUF3QjtRQUNwRixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTztRQUVsRCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLENBQUMsaUJBQWlCO1FBRTVDLGdDQUFnQztRQUNoQyxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLFlBQVksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxPQUFPO1FBQzlCLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQztRQUV0RCxRQUFRO1FBQ1IsaUJBQWlCO1FBQ2pCLE9BQU8sQ0FBQyxLQUFLLENBQ1gsR0FBRyxJQUFJLENBQUMsU0FBUyxpREFBaUQsY0FBYyxFQUFFLE9BQU8sSUFBSSxNQUFNLGdDQUFnQyxDQUNwSSxDQUFDO1FBRUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFMUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEgsTUFBTSxRQUFRLEdBQUcsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFekgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxJQUFJLFFBQVEsSUFBSSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUM7UUFFdEUsZ0VBQWdFO1FBQ2hFLE9BQU8sSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFO1lBQzNCLFFBQVE7WUFDUixpQkFBaUI7WUFDakIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLGtGQUFrRixDQUFDLENBQUM7WUFFbkgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLHNCQUFzQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDckYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8saUJBQWlCLENBQUMsS0FBYSxFQUFFLG1CQUE0QixFQUFFLGlCQUEwQixFQUFFLFNBQWtDO1FBQ25JLHNDQUFzQztRQUN0QyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDcEQsSUFBSSxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNkLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUN2RyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVTLFdBQVcsQ0FBQyxLQUFZO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLEtBQUssRUFBRSxNQUEwQixDQUFDO1FBRWhELDRHQUE0RztRQUM1RyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN2QyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1lBQzVDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7WUFDeEMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUV4QiwrRkFBK0Y7WUFDL0YsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLGNBQWMsR0FBRyxDQUFDLElBQUksY0FBYyxHQUFHLFlBQVksSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUNoSCxRQUFRO2dCQUNSLGdIQUFnSDtnQkFFaEgsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUV2QixrRUFBa0U7Z0JBQ2xFLE1BQU0sZ0JBQWdCLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQztnQkFDNUMsS0FBSyxHQUFHLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUVyRSx1QkFBdUI7Z0JBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUUzQiwrQ0FBK0M7Z0JBQy9DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBRTlELDRCQUE0QjtnQkFDNUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUVyQixlQUFlO2dCQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1FBQ1AsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRVMsbUJBQW1CLENBQUMsS0FBYyxFQUFFLEtBQVU7UUFDdEQsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxFQUFFLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRO1lBQUUsT0FBTyxDQUFDLE9BQU87UUFFN0YsUUFBUTtRQUNSLGtGQUFrRjtRQUVsRixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNuQyxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDaEcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN0RyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELGVBQWU7UUFDZixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDMUYsQ0FBQzt3R0E3MENVLG9CQUFvQjs0RkFBcEIsb0JBQW9CLHlWQXlDWCxnQkFBZ0Isb0VBQ2hCLGdCQUFnQixnQ0FDaEIsZ0JBQWdCLDJEQUNoQixnQkFBZ0IsMkRBQ2hCLGdCQUFnQix5Q0FDaEIsZ0JBQWdCLGtEQUNoQixlQUFlLHlQQU1mLGdCQUFnQix3REFDaEIsZ0JBQWdCLDhEQUNoQixnQkFBZ0Isb0VBQ2hCLGdCQUFnQixtRkFDaEIsZ0JBQWdCLHlDQUNoQixnQkFBZ0IseUxBTWhCLGdCQUFnQiwwRkFFaEIsZ0JBQWdCLDBIQUVoQixlQUFlLG9FQUNmLGdCQUFnQiw2QkFDaEIsZ0JBQWdCLHFEQUNoQixnQkFBZ0IsMkRBQ2hCLGdCQUFnQiw0S0FJaEIsZ0JBQWdCLDJEQUNoQixnQkFBZ0IseUZBQ2hCLGdCQUFnQix3R0FDaEIsZUFBZSwwRUFDZixnQkFBZ0IsNk5BbUZoQixnQkFBZ0IsK1pBdkt2QixDQUFDLHNCQUFzQixDQUFDLDJFQWtJdkIsbUNBQW1DLDJCQUFVLFdBQVcsbUVBR3hELG1DQUFtQywyQkFBVSxXQUFXLGtXQU4zRCxlQUFlLHNGQUNmLHNCQUFzQixnREN2TW5DLGt0bUJBb2JBOzs0RkR6V2Esb0JBQW9CO2tCQVRoQyxTQUFTOytCQUVJLHdCQUF3QixhQUd2QixDQUFDLHNCQUFzQixDQUFDLG1CQUNsQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLEtBQUs7OzBCQThJaEIsUUFBUTt5Q0E3R0YsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ2tDLFFBQVE7c0JBQS9DLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0Usa0JBQWtCO3NCQUF6RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLE1BQU07c0JBQTdDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsZUFBZTtzQkFBdEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxlQUFlO3NCQUF0RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLFNBQVM7c0JBQWhELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0MsWUFBWTtzQkFBbEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBQzVCLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNrQyxlQUFlO3NCQUF0RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLGNBQWM7c0JBQXJELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsZ0JBQWdCO3NCQUF2RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLGtCQUFrQjtzQkFBekQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSx1QkFBdUI7c0JBQTlELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsU0FBUztzQkFBaEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDN0IsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ2tDLGFBQWE7c0JBQXBELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzdCLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDa0MsUUFBUTtzQkFBL0MsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDN0Isa0JBQWtCO3NCQUExQixLQUFLO2dCQUNpQyxzQkFBc0I7c0JBQTVELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUNHLGtCQUFrQjtzQkFBekQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxLQUFLO3NCQUE1QyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLGFBQWE7c0JBQXBELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsZUFBZTtzQkFBdEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDN0Isa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNrQyxjQUFjO3NCQUFyRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLGVBQWU7c0JBQXRELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UseUJBQXlCO3NCQUFoRSxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNDLDhCQUE4QjtzQkFBcEUsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBQ0csb0JBQW9CO3NCQUEzRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUM3QixhQUFhO3NCQUFyQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS3lCLFNBQVM7c0JBQXZDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO2dCQVNSLE9BQU87c0JBQXZCLE1BQU07dUJBQUMsT0FBTztnQkFFQyxPQUFPO3NCQUF0QixNQUFNO3VCQUFDLE1BQU07Z0JBRUcsT0FBTztzQkFBdkIsTUFBTTt1QkFBQyxPQUFPO2dCQUNMLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ21CLGFBQWE7c0JBQXRDLE1BQU07dUJBQUMsZ0JBQWdCO2dCQUNLLGdCQUFnQjtzQkFBNUMsTUFBTTt1QkFBQyxtQkFBbUI7Z0JBS0osVUFBVTtzQkFBaEMsTUFBTTt1QkFBQyxhQUFhO2dCQUVGLE9BQU87c0JBQXpCLE1BQU07dUJBQUMsU0FBUztnQkFDSSxTQUFTO3NCQUE3QixNQUFNO3VCQUFDLFdBQVc7Z0JBQ0YsS0FBSztzQkFBckIsTUFBTTt1QkFBQyxPQUFPO2dCQUVZLGVBQWU7c0JBQXpDLE1BQU07dUJBQUMsaUJBQWlCO2dCQUNELFlBQVk7c0JBQW5DLE1BQU07dUJBQUMsY0FBYztnQkFDSSxjQUFjO3NCQUF2QyxNQUFNO3VCQUFDLGdCQUFnQjtnQkFFQSxTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ0ssWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNFLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDRyxZQUFZO3NCQUF2QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ1MsbUJBQW1CO3NCQUFyRCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFHakMsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLG1DQUFtQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFJeEUsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLG1DQUFtQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFzQjNELE1BQU07c0JBQWxCLEtBQUs7Z0JBWXNDLFFBQVE7c0JBQW5ELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBU3pCLFFBQVE7c0JBQXBCLEtBQUs7Z0JBU08sS0FBSztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgaW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIG51bWJlckF0dHJpYnV0ZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFByb3ZpZGVyLFxuICBSZW5kZXJlcjIsXG4gIFJlbmRlcmVyU3R5bGVGbGFnczIsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUdyb3VwRGlyZWN0aXZlLCBOR19WQUxVRV9BQ0NFU1NPUiwgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgaXNPYnNlcnZhYmxlLCBtZXJnZSwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aW1lcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBtZXJnZU1hcCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwLCB0aHJvdHRsZVRpbWV9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7RmV0Y2hNb3JlRm4sIExvYWRSZXN1bHQsIFN1Z2dlc3RGbn0gZnJvbSAnLi4vLi4vc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtjaGFuZ2VDYXNlVG9VbmRlcnNjb3JlLCBmaW5kUGFyZW50V2l0aENsYXNzLCBpc05pbCwgaXNOaWxPckJsYW5rLCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsLCBpc05vdE5pbE9iamVjdCwgaXNOb3ROaWxPckJsYW5rLCBpc05vdE5pbFN0cmluZywgcHJvcGVydGllc1BhdGhDb21wYXJhdG9yLH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zJztcbmltcG9ydCB7Zm9jdXNJbnB1dCwgSW5wdXRFbGVtZW50LCBzZWxlY3RJbnB1dENvbnRlbnQsIHNlbGVjdElucHV0UmFuZ2V9IGZyb20gJy4uLy4uL2lucHV0cyc7XG5pbXBvcnQge2ZpcnN0Tm90TmlsUHJvbWlzZSwgd2FpdEZvcn0gZnJvbSAnLi4vLi4vb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHtNYXRGb3JtRmllbGRBcHBlYXJhbmNlLCBTdWJzY3JpcHRTaXppbmd9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHtNYXRTZWxlY3QsIE1hdFNlbGVjdENoYW5nZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlLCBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50LCBNYXRBdXRvY29tcGxldGVUcmlnZ2VyfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHtmcm9tU2Nyb2xsRW5kRXZlbnR9IGZyb20gJy4uLy4uL2V2ZW50cyc7XG5pbXBvcnQge0lvblNlYXJjaGJhciwgTW9kYWxDb250cm9sbGVyfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQge2lzTW9iaWxlfSBmcm9tICcuLi8uLi9wbGF0Zm9ybXMnO1xuaW1wb3J0IHtzdWdnZXN0RnJvbUFycmF5fSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQge1NlYXJjaGJhckNoYW5nZUV2ZW50RGV0YWlsfSBmcm9tICdAaW9uaWMvY29yZS9kaXN0L3R5cGVzL2NvbXBvbmVudHMvc2VhcmNoYmFyL3NlYXJjaGJhci1pbnRlcmZhY2UnO1xuaW1wb3J0IHtNYXRBdXRvY29tcGxldGVGaWVsZFV0aWxzfSBmcm9tICcuL21hdGVyaWFsLmF1dG9jb21wbGV0ZS51dGlscyc7XG5pbXBvcnQge01hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnfSBmcm9tICcuL21hdGVyaWFsLmF1dG9jb21wbGV0ZS5jb25maWcnO1xuXG5cbmltcG9ydCB7QVBQX1NIT1dfVE9PTFRJUCwgREVGQVVMVF9KT0lOX1BST1BFUlRJRVNfU0VQQVJBVE9SfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHtSZWdFeHBVdGlsc30gZnJvbSAnLi4vLi4vcmVnZXhwcyc7XG5pbXBvcnQge0FwcEZsb2F0TGFiZWxUeXBlLCBEaXNwbGF5Rm4sIEVxdWFsc0ZufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge01hdGVyaWFsQXV0b2NvbXBsZXRlRm9vdGVyRGlyZWN0aXZlLCBNYXRlcmlhbEF1dG9jb21wbGV0ZUhlYWRlckRpcmVjdGl2ZX0gZnJvbSAnLi9tYXRlcmlhbC5hdXRvY29tcGxldGUuZGlyZWN0aXZlJztcblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuZXhwb3J0IGludGVyZmFjZSBNYXRBdXRvY29tcGxldGVGaWVsZFNlbGVjdENoYW5nZSB7XG4gIHNvdXJjZTogTWF0U2VsZWN0IHwgTWF0QXV0b2NvbXBsZXRlO1xuICB2YWx1ZTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hdEF1dG9jb21wbGV0ZUZpZWxkVG9nZ2xlRmF2b3JpdGUge1xuICBzb3VyY2U6IE1hdFNlbGVjdCB8IE1hdEF1dG9jb21wbGV0ZTtcbiAgdmFsdWU6IGFueTtcbn1cblxuY29uc3QgREVGQVVMVF9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNYXRBdXRvY29tcGxldGVGaWVsZCksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuQENvbXBvbmVudCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ21hdC1hdXRvY29tcGxldGUtZmllbGQnLFxuICAgIHN0eWxlVXJsczogWycuL21hdGVyaWFsLmF1dG9jb21wbGV0ZS5zY3NzJ10sXG4gICAgdGVtcGxhdGVVcmw6ICcuL21hdGVyaWFsLmF1dG9jb21wbGV0ZS5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtERUZBVUxUX1ZBTFVFX0FDQ0VTU09SXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzdGFuZGFsb25lOiBmYWxzZVxufSlcbmV4cG9ydCBjbGFzcyBNYXRBdXRvY29tcGxldGVGaWVsZCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBJbnB1dEVsZW1lbnQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcblxuICBwcml2YXRlIF9vbkZldGNoTW9yZUNhbGxiYWNrOiBGZXRjaE1vcmVGbjxMb2FkUmVzdWx0PGFueT4+O1xuICBwcml2YXRlIF9pbXBsaWNpdFZhbHVlOiBhbnk7XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBfaXRlbXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBfb3BlbmVkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgXyRmaWx0ZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfaXRlbUNvdW50OiBudW1iZXI7XG4gIHByaXZhdGUgX3N1Z2dlc3RFeGVjdXRpb25JZDogbnVtYmVyID0gMDsgLy8gSWRlbnRpZmllciBvZiB0aGUgc3VnZ2VzdCBqb2JcbiAgcHJpdmF0ZSBfcmVsb2FkJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByb3RlY3RlZCBfcmVhZG9ubHkgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF90YWJpbmRleDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgXyRpbnB1dEl0ZW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIF8kZmlsdGVyZWRJdGVtcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBfc2VsZWN0ZWRJdGVtOiBhbnk7XG4gIHByb3RlY3RlZCBfZGlzcGxheVZhbHVlID0gJyc7XG4gIHByb3RlY3RlZCBfbW9yZUl0ZW1zQ291bnQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9mZXRjaE1vcmUkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgcHJvdGVjdGVkIF9kZWZhdWx0UGFuZWxXaWR0aDogc3RyaW5nID0gbnVsbDtcbiAgcHJvdGVjdGVkIF9mb2N1c2VkID0gZmFsc2U7XG4gIHByb3RlY3RlZCBfcGFuZWxDbG9zZWRBdFRpbWU6IG51bWJlcjtcblxuICBwcm90ZWN0ZWQgZ2V0IHNlYXJjaFRleHQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tYXRJbnB1dFRleHQ/Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPz8gdGhpcy5pb25TZWFyY2hiYXI/LnZhbHVlO1xuICB9XG5cbiAgQElucHV0KCkgZXF1YWxzOiBFcXVhbHNGbjtcbiAgQElucHV0KCkgbG9nUHJlZml4ID0gJ1ttYXQtYXV0b2NvbXBsZXRlXSc7XG4gIEBJbnB1dCgpIGZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIEBJbnB1dCgpIGZvcm1Db250cm9sTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgQElucHV0KCkgZmxvYXRMYWJlbDogQXBwRmxvYXRMYWJlbFR5cGUgPSAnYXV0byc7XG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSBudWxsO1xuICBASW5wdXQoKSBhcHBlYXJhbmNlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlO1xuICBASW5wdXQoKSBzdWJzY3JpcHRTaXppbmc6IFN1YnNjcmlwdFNpemluZztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgc3VnZ2VzdEZuOiBTdWdnZXN0Rm48YW55LCBhbnk+O1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcmVxdWlyZWQgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGhpZGVSZXF1aXJlZE1hcmtlciA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbW9iaWxlOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd1BhbmVsSGVhZGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dQYW5lbEZvb3RlcjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjbGVhcmFibGUgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgZGVib3VuY2VUaW1lOiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBkaXNwbGF5U2VwYXJhdG9yOiBzdHJpbmcgfCBudWxsO1xuICBASW5wdXQoKSBkaXNwbGF5V2l0aDogRGlzcGxheUZuIHwgbnVsbDtcbiAgQElucHV0KCkgZGlzcGxheUF0dHJpYnV0ZXM6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBkaXNwbGF5Q29sdW1uU2l6ZXM6IChudW1iZXIgfCAnYXV0bycgfCB1bmRlZmluZWQpW107XG4gIEBJbnB1dCgpIGRpc3BsYXlDb2x1bW5OYW1lczogc3RyaW5nW107XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBoaWdobGlnaHRBY2NlbnQ6IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93QWxsT25Gb2N1czogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dQYW5lbE9uRm9jdXM6IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByZWxvYWRJdGVtc09uRm9jdXM6IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjbGVhckludmFsaWRWYWx1ZU9uQmx1cjogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGF1dG9mb2N1cyA9IGZhbHNlO1xuICBASW5wdXQoKSBjb25maWc6IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnO1xuICBASW5wdXQoKSBpMThuUHJlZml4ID0gJ1JFRkVSRU5USUFMLic7XG4gIEBJbnB1dCgpIG5vUmVzdWx0TWVzc2FnZSA9ICdDT01NT04uTk9fUkVTVUxUJztcbiAgQElucHV0KCkgcGFuZWxDbGFzczogc3RyaW5nO1xuICBASW5wdXQoKSBwYW5lbFdpZHRoOiBzdHJpbmc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkaXNhYmxlUmlwcGxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hdEF1dG9jb21wbGV0ZVBvc2l0aW9uOiAnYXV0bycgfCAnYWJvdmUnIHwgJ2JlbG93JztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG11bHRpcGxlOiBib29sZWFuO1xuICBASW5wdXQoKSBmZXRjaE1vcmVUaHJlc2hvbGQgPSAnMTUlJztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgc3VnZ2VzdExlbmd0aFRocmVzaG9sZDogbnVtYmVyID0gbnVsbDtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dMb2FkaW5nU3Bpbm5lciA9IHRydWU7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkZWJ1ZyA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd1NlYXJjaEJhciA9IHRydWU7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzdGlja3lTZWFyY2hCYXIgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBwbHlJbXBsaWNpdFZhbHVlOiBib29sZWFuIHwgKCh2YWx1ZTogYW55KSA9PiBib29sZWFuKTtcbiAgQElucHV0KCkgZHJvcEJ1dHRvblRpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNsZWFyQnV0dG9uVGl0bGU6IHN0cmluZztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHRyaW1TZWFyY2hUZXh0OiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc3BsaXRTZWFyY2hUZXh0OiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2VsZWN0SW5wdXRDb250ZW50T25Gb2N1czogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgc2VsZWN0SW5wdXRDb250ZW50T25Gb2N1c0RlbGF5OiBudW1iZXI7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBwcmV2aWV3SW1wbGljaXRWYWx1ZTogYm9vbGVhbjtcbiAgQElucHV0KCkgc2hvd0Zhdm9yaXRlcyA9IHRydWU7XG4gIEBJbnB1dCgpIHRvZ2dsZUZhdm9yaXRlVGl0bGUgPSAnQ09NTU9OLkJUTl9BRERfVE9fRkFWT1JJVEVTJztcbiAgQElucHV0KCkgZmF2b3JpdGVJdGVtczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgY29sU2l6ZXM6IFtudW1iZXIgfCAnYXV0bycsIG51bWJlciB8ICdhdXRvJ10gPSBbdW5kZWZpbmVkLCAnYXV0byddO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgcGFuZWxDbGFzcyBpbnN0ZWFkXG4gICAqL1xuICBASW5wdXQoeyBhbGlhczogJ2NsYXNzJyB9KSBzZXQgY2xhc3NMaXN0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnBhbmVsQ2xhc3MgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBjbGFzc0xpc3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbENsYXNzO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoJ2NsaWNrJykgY2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoJ2JsdXInKSBibHVycmVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PigpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgnZm9jdXMnKSBmb2N1c2VkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PigpO1xuICBAT3V0cHV0KCkgZHJvcEJ1dHRvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4odHJ1ZSk7XG4gIEBPdXRwdXQoJ2tleWRvd24uZXNjYXBlJykga2V5ZG93bkVzY2FwZSA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIEBPdXRwdXQoJ2tleWRvd24uYmFja3NwYWNlJykga2V5ZG93bkJhY2tzcGFjZSA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFByZWZlciB1c2luZyB0aGUgYEBPdXRwdXQoJ2VudGVyJylgIGluc3RlYWRcbiAgICovXG4gIEBPdXRwdXQoJ2tleXVwLmVudGVyJykga2V5dXBFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgnYXJyb3dVcCcpIGFycm93VXAgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50IHwgS2V5Ym9hcmRFdmVudD4oKTtcbiAgQE91dHB1dCgnYXJyb3dEb3duJykgYXJyb3dEb3duID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudCB8IEtleWJvYXJkRXZlbnQ+KCk7XG4gIEBPdXRwdXQoJ2VudGVyJykgZW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50IHwgS2V5Ym9hcmRFdmVudD4oKTtcblxuICBAT3V0cHV0KCdzZWxlY3Rpb25DaGFuZ2UnKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE1hdEF1dG9jb21wbGV0ZUZpZWxkU2VsZWN0Q2hhbmdlPigpO1xuICBAT3V0cHV0KCdvcGVuZWRDaGFuZ2UnKSBvcGVuZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoJ3RvZ2dsZUZhdm9yaXRlJykgdG9nZ2xlRmF2b3JpdGUgPSBuZXcgRXZlbnRFbWl0dGVyPE1hdEF1dG9jb21wbGV0ZUZpZWxkVG9nZ2xlRmF2b3JpdGU+KCk7XG5cbiAgQFZpZXdDaGlsZCgnbWF0U2VsZWN0JykgbWF0U2VsZWN0OiBNYXRTZWxlY3Q7XG4gIEBWaWV3Q2hpbGQoJ2lvblNlYXJjaGJhcicpIGlvblNlYXJjaGJhcjogSW9uU2VhcmNoYmFyO1xuICBAVmlld0NoaWxkKCdtYXRJbnB1dFRleHQnKSBtYXRJbnB1dFRleHQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoTWF0QXV0b2NvbXBsZXRlKSBhdXRvY29tcGxldGU6IE1hdEF1dG9jb21wbGV0ZTtcbiAgQFZpZXdDaGlsZChNYXRBdXRvY29tcGxldGVUcmlnZ2VyKSBhdXRvY29tcGxldGVUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xuXG4gIEBDb250ZW50Q2hpbGQoTWF0ZXJpYWxBdXRvY29tcGxldGVIZWFkZXJEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgcGFuZWxIZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZChNYXRlcmlhbEF1dG9jb21wbGV0ZUZvb3RlckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBwYW5lbEZvb3RlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICBzaG93VG9vbHRpcCA9IGluamVjdChBUFBfU0hPV19UT09MVElQLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIGVsOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCBtb2RhbENvbnRyb2xsZXI6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1Hcm91cERpcjogRm9ybUdyb3VwRGlyZWN0aXZlXG4gICkge31cblxuICBnZXQgaXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1Db3VudDtcbiAgfVxuXG4gIGdldCBjYW5GZXRjaE1vcmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgJiYgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPiAwO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGZpbHRlcih2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl8kZmlsdGVyLnZhbHVlKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgU2V0dGluZyBmaWx0ZXI6XCIsIHZhbHVlKTtcbiAgICAgIHRoaXMuXyRmaWx0ZXIubmV4dCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZpbHRlcigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl8kZmlsdGVyLnZhbHVlO1xuICB9XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNldCByZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdGFiaW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3RhYmluZGV4ID0gdmFsdWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCB0YWJpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90YWJpbmRleDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBpdGVtcyh2YWx1ZTogT2JzZXJ2YWJsZTxhbnlbXT4gfCBhbnlbXSkge1xuICAgIC8vIFJlbW92ZSBwcmV2aW91cyBzdWJzY3JpcHRpb24gb24gaXRlbXMgKGlmIGV4aXN0cylcbiAgICBpZiAodGhpcy5faXRlbXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLmxvZ1ByZWZpeCArICcgSXRlbXMgcmVjZWl2ZWQgdHdpY2UhJyk7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24ucmVtb3ZlKHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uKTtcbiAgICAgIHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uID0gdmFsdWUuc3Vic2NyaWJlKCh2KSA9PiB0aGlzLl8kaW5wdXRJdGVtcy5uZXh0KHYpKTtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQodGhpcy5faXRlbXNTdWJzY3JpcHRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmFsdWUgIT09IHRoaXMuXyRpbnB1dEl0ZW1zLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuXyRpbnB1dEl0ZW1zLm5leHQodmFsdWUgYXMgYW55W10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBpdGVtcygpOiBPYnNlcnZhYmxlPGFueVtdPiB8IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5fJGlucHV0SXRlbXM7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29udHJvbC52YWx1ZTtcbiAgfVxuXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHkgfHwgdGhpcy5mb3JtQ29udHJvbC5kaXNhYmxlZDtcbiAgfVxuXG4gIGdldCBlbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fcmVhZG9ubHkgJiYgdGhpcy5mb3JtQ29udHJvbC5lbmFibGVkO1xuICB9XG5cbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTmlsKHRoaXMuXyRmaWx0ZXJlZEl0ZW1zLnZhbHVlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZm9ybUNvbnRyb2wgPVxuICAgICAgdGhpcy5mb3JtQ29udHJvbCA/PyAodGhpcy5mb3JtQ29udHJvbE5hbWUgJiYgdGhpcy5mb3JtR3JvdXBEaXIgJiYgKHRoaXMuZm9ybUdyb3VwRGlyLmZvcm0uZ2V0KHRoaXMuZm9ybUNvbnRyb2xOYW1lKSBhcyBVbnR5cGVkRm9ybUNvbnRyb2wpKTtcbiAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgbWFuZGF0b3J5IGF0dHJpYnV0ZSAnZm9ybUNvbnRyb2wnIG9yICdmb3JtQ29udHJvbE5hbWUnIGluIDxtYXQtYXV0b2NvbXBsZXRlLWZpZWxkPi5cIik7XG5cbiAgICAvLyBDb25maWd1cmF0aW9uIGZyb20gY29uZmlnIG9iamVjdFxuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5zdWdnZXN0Rm4gPSB0aGlzLnN1Z2dlc3RGbiA/PyB0aGlzLmNvbmZpZy5zdWdnZXN0Rm47XG4gICAgICBpZiAoIXRoaXMuc3VnZ2VzdEZuICYmIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmNvbmZpZy5pdGVtcztcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVyID0gdGhpcy5maWx0ZXIgPz8gdGhpcy5jb25maWcuZmlsdGVyO1xuICAgICAgdGhpcy5kaXNwbGF5QXR0cmlidXRlcyA9IHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMgPz8gdGhpcy5jb25maWcuYXR0cmlidXRlcztcbiAgICAgIHRoaXMuZGlzcGxheUNvbHVtblNpemVzID0gdGhpcy5kaXNwbGF5Q29sdW1uU2l6ZXMgPz8gdGhpcy5jb25maWcuY29sdW1uU2l6ZXM7XG4gICAgICB0aGlzLmRpc3BsYXlDb2x1bW5OYW1lcyA9IHRoaXMuZGlzcGxheUNvbHVtbk5hbWVzID8/IHRoaXMuY29uZmlnLmNvbHVtbk5hbWVzO1xuICAgICAgdGhpcy5kaXNwbGF5U2VwYXJhdG9yID0gdGhpcy5kaXNwbGF5U2VwYXJhdG9yID8/IHRoaXMuY29uZmlnLmRpc3BsYXlXaXRoU2VwYXJhdG9yO1xuICAgICAgdGhpcy5kaXNwbGF5V2l0aCA9IHRoaXMuZGlzcGxheVdpdGggPz8gdGhpcy5jb25maWcuZGlzcGxheVdpdGg7XG4gICAgICB0aGlzLnNwbGl0U2VhcmNoVGV4dCA9IHRoaXMuc3BsaXRTZWFyY2hUZXh0ID8/IHRoaXMuY29uZmlnLnNwbGl0U2VhcmNoVGV4dDtcbiAgICAgIHRoaXMudHJpbVNlYXJjaFRleHQgPSB0aGlzLnRyaW1TZWFyY2hUZXh0ID8/IHRoaXMuY29uZmlnLnRyaW1TZWFyY2hUZXh0O1xuICAgICAgdGhpcy5lcXVhbHMgPSB0aGlzLmVxdWFscyA/PyB0aGlzLmNvbmZpZy5lcXVhbHM7XG4gICAgICB0aGlzLm11bHRpcGxlID0gdGhpcy5tdWx0aXBsZSA/PyB0aGlzLmNvbmZpZy5tdWx0aXBsZTtcbiAgICAgIHRoaXMubW9iaWxlID0gdGhpcy5tb2JpbGUgPz8gdGhpcy5jb25maWcubW9iaWxlO1xuICAgICAgdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkID0gdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkID8/IHRoaXMuY29uZmlnLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQ7XG4gICAgICB0aGlzLnNob3dBbGxPbkZvY3VzID0gdGhpcy5zaG93QWxsT25Gb2N1cyA/PyB0aGlzLmNvbmZpZy5zaG93QWxsT25Gb2N1cztcbiAgICAgIHRoaXMuc2hvd1BhbmVsT25Gb2N1cyA9IHRoaXMuc2hvd1BhbmVsT25Gb2N1cyA/PyB0aGlzLmNvbmZpZy5zaG93UGFuZWxPbkZvY3VzO1xuICAgICAgdGhpcy5yZWxvYWRJdGVtc09uRm9jdXMgPSB0aGlzLnJlbG9hZEl0ZW1zT25Gb2N1cyA/PyB0aGlzLmNvbmZpZy5yZWxvYWRJdGVtc09uRm9jdXM7XG4gICAgICB0aGlzLnBhbmVsQ2xhc3MgPSB0aGlzLnBhbmVsQ2xhc3MgPz8gdGhpcy5jb25maWcucGFuZWxDbGFzcyA/PyB0aGlzLmNvbmZpZy5jbGFzcztcbiAgICAgIHRoaXMucGFuZWxXaWR0aCA9IHRoaXMucGFuZWxXaWR0aCA/PyB0aGlzLmNvbmZpZy5wYW5lbFdpZHRoO1xuICAgICAgdGhpcy5kZWJvdW5jZVRpbWUgPSB0aGlzLmRlYm91bmNlVGltZSA/PyB0aGlzLmNvbmZpZy5kZWJvdW5jZVRpbWU7XG4gICAgICB0aGlzLmhpZ2hsaWdodEFjY2VudCA9IHRoaXMuaGlnaGxpZ2h0QWNjZW50ID8/IHRoaXMuY29uZmlnLmhpZ2hsaWdodEFjY2VudDtcbiAgICAgIHRoaXMuYXBwbHlJbXBsaWNpdFZhbHVlID0gdGhpcy5hcHBseUltcGxpY2l0VmFsdWUgPz8gdGhpcy5jb25maWcuYXBwbHlJbXBsaWNpdFZhbHVlO1xuICAgICAgdGhpcy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzID0gdGhpcy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzID8/IHRoaXMuY29uZmlnLnNlbGVjdElucHV0Q29udGVudE9uRm9jdXM7XG4gICAgICB0aGlzLnNlbGVjdElucHV0Q29udGVudE9uRm9jdXNEZWxheSA9IHRoaXMuc2VsZWN0SW5wdXRDb250ZW50T25Gb2N1c0RlbGF5ID8/IHRoaXMuY29uZmlnLnNlbGVjdElucHV0Q29udGVudE9uRm9jdXNEZWxheTtcbiAgICAgIHRoaXMuY2xlYXJJbnZhbGlkVmFsdWVPbkJsdXIgPSB0aGlzLmNsZWFySW52YWxpZFZhbHVlT25CbHVyID8/IHRoaXMuY29uZmlnLmNsZWFySW52YWxpZFZhbHVlT25CbHVyO1xuICAgICAgdGhpcy5wcmV2aWV3SW1wbGljaXRWYWx1ZSA9IHRoaXMucHJldmlld0ltcGxpY2l0VmFsdWUgPz8gdGhpcy5jb25maWcucHJldmlld0ltcGxpY2l0VmFsdWU7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB2YWx1ZXNcbiAgICB0aGlzLnJlcXVpcmVkID0gdGhpcy5yZXF1aXJlZCA/PyB0aGlzLmZvcm1Db250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICB0aGlzLm11bHRpcGxlID0gdGhpcy5tdWx0aXBsZSA/PyBmYWxzZTtcbiAgICB0aGlzLm1vYmlsZSA9IHRoaXMubW9iaWxlID8/IGlzTW9iaWxlKHdpbmRvdyk7XG4gICAgdGhpcy5kaXNwbGF5QXR0cmlidXRlcyA9IHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMgPz8gdGhpcy5maWx0ZXI/LmF0dHJpYnV0ZXMgPz8gWydsYWJlbCcsICduYW1lJ107XG4gICAgdGhpcy5kaXNwbGF5U2VwYXJhdG9yID0gdGhpcy5kaXNwbGF5U2VwYXJhdG9yID8/IERFRkFVTFRfSk9JTl9QUk9QRVJUSUVTX1NFUEFSQVRPUjtcbiAgICB0aGlzLmRpc3BsYXlXaXRoID0gdGhpcy5kaXNwbGF5V2l0aCB8fCBNYXRBdXRvY29tcGxldGVGaWVsZFV0aWxzLmNyZWF0ZURpc3BsYXlGbih0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLCB0aGlzLm11bHRpcGxlLCB0aGlzLmRpc3BsYXlTZXBhcmF0b3IpO1xuICAgIHRoaXMuc3BsaXRTZWFyY2hUZXh0ID0gdGhpcy5zcGxpdFNlYXJjaFRleHQgPz8gdHJ1ZTtcbiAgICB0aGlzLnRyaW1TZWFyY2hUZXh0ID0gdGhpcy50cmltU2VhcmNoVGV4dCA/PyAhdGhpcy5tb2JpbGU7IC8vIFRydWUgYnkgZGVmYXVsdCBvbiBkZXNrdG9wLCBidXQgZmFsc2UgaW4gbW9iaWxlIChub3QgbmVlZCBpbiB0aGUgc2VhcmNoYmFyKVxuICAgIHRoaXMuZXF1YWxzID0gdGhpcy5lcXVhbHMgfHwgTWF0QXV0b2NvbXBsZXRlRmllbGRVdGlscy5kZWZhdWx0RXF1YWxzO1xuICAgIHRoaXMuY29sU2l6ZXMgPSB0aGlzLmNvbFNpemVzID8/IFt1bmRlZmluZWQsICdhdXRvJ107XG5cbiAgICB0aGlzLmRpc3BsYXlDb2x1bW5TaXplcyA9XG4gICAgICB0aGlzLmRpc3BsYXlDb2x1bW5TaXplcyB8fFxuICAgICAgLy8gaWYgb25seSBjb2x1bW46IGF1dG8gc2l6ZVxuICAgICAgKHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMubGVuZ3RoID09PSAxICYmIFt1bmRlZmluZWRdKSB8fFxuICAgICAgLy8gQ29tcHV0ZWQgY29sdW1uIHNpemU6XG4gICAgICAvLyAtIGlmIGxhYmVsIHRoZW4gY29sIHNpemUgPSAyXG4gICAgICAvLyAtIGlmIHJhbmtPcmRlciB0aGVuIGNvbCBzaXplID0gMVxuICAgICAgLy8gLSBlc2UgPT4gYXV0byBzaXplXG4gICAgICB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLm1hcCgoYXR0cikgPT4gYXR0ciAmJiAoYXR0ci5lbmRzV2l0aCgnbGFiZWwnKSA/IDMgOiBhdHRyLmVuZHNXaXRoKCdyYW5rT3JkZXInKSA/IDIgOiB1bmRlZmluZWQpKTtcbiAgICB0aGlzLmRpc3BsYXlDb2x1bW5OYW1lcyA9IHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMubWFwKFxuICAgICAgKGF0dHIsIGluZGV4KSA9PiAodGhpcy5kaXNwbGF5Q29sdW1uTmFtZXMgJiYgdGhpcy5kaXNwbGF5Q29sdW1uTmFtZXNbaW5kZXhdKSB8fCB0aGlzLmkxOG5QcmVmaXggKyBjaGFuZ2VDYXNlVG9VbmRlcnNjb3JlKGF0dHIpLnRvVXBwZXJDYXNlKClcbiAgICApO1xuXG4gICAgLy8gTm8gbW9yZSBuZWVkLCBiZWNhdXNlIHNldHRpbmcgdGhlIHBhbmVsV2lkdGggd2lsbCBmb3JjZSBhIHdpZHRoLCBpbnN0ZWFkIG9mIGEgbWluLXdpZHRoXG4gICAgLypjb25zdCBwYW5lbENsYXNzZXMgPSB0aGlzLnBhbmVsQ2xhc3M/LnNwbGl0KC9cXHMrLyk7XG4gICAgdGhpcy5wYW5lbFdpZHRoID1cbiAgICAgIHRoaXMucGFuZWxXaWR0aCA/P1xuICAgICAgKHBhbmVsQ2xhc3NlcyAmJlxuICAgICAgICAoKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnbWluLXdpZHRoLW1lZGl1bScpICYmICczMDBweCcpIHx8XG4gICAgICAgICAgKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnbWluLXdpZHRoLWxhcmdlJykgJiYgJzQwMHB4JykgfHxcbiAgICAgICAgICAocGFuZWxDbGFzc2VzLmluY2x1ZGVzKCdtaW4td2lkdGgteGxhcmdlJykgJiYgJzQ1MHB4JykgfHxcbiAgICAgICAgICAocGFuZWxDbGFzc2VzLmluY2x1ZGVzKCdtaW4td2lkdGgtODB2dycpICYmICc4MHZ3JykgfHxcbiAgICAgICAgICAoKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnZnVsbC13aWR0aCcpIHx8IHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnZnVsbC1zaXplJykpICYmICcxMDB2dycpKSk7Ki9cblxuICAgIHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA9IHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA/PyAwO1xuICAgIHRoaXMuc2hvd0FsbE9uRm9jdXMgPSB0aGlzLnNob3dBbGxPbkZvY3VzID8/ICh0aGlzLm1vYmlsZSAmJiB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgPD0gMCk7XG4gICAgdGhpcy5zaG93UGFuZWxPbkZvY3VzID0gdGhpcy5zaG93UGFuZWxPbkZvY3VzID8/IHRydWU7XG4gICAgdGhpcy5yZWxvYWRJdGVtc09uRm9jdXMgPSB0aGlzLnJlbG9hZEl0ZW1zT25Gb2N1cyA/PyBmYWxzZTtcbiAgICB0aGlzLmRlYm91bmNlVGltZSA9IHRoaXMuZGVib3VuY2VUaW1lID8/ICh0aGlzLm1vYmlsZSA/IDY1MCA6IDI1MCk7XG4gICAgdGhpcy5oaWdobGlnaHRBY2NlbnQgPSB0aGlzLmhpZ2hsaWdodEFjY2VudCA/PyBmYWxzZTtcbiAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZVBvc2l0aW9uID0gdGhpcy5tYXRBdXRvY29tcGxldGVQb3NpdGlvbiA/PyAnYXV0byc7XG4gICAgdGhpcy5hcHBseUltcGxpY2l0VmFsdWUgPSB0aGlzLmFwcGx5SW1wbGljaXRWYWx1ZSA/PyAhdGhpcy5tb2JpbGU7XG4gICAgdGhpcy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzID0gdGhpcy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzID8/IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0SW5wdXRDb250ZW50T25Gb2N1c0RlbGF5ID0gdGhpcy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzRGVsYXkgPz8gMDtcbiAgICB0aGlzLmNsZWFySW52YWxpZFZhbHVlT25CbHVyID0gdGhpcy5jbGVhckludmFsaWRWYWx1ZU9uQmx1ciA/PyBmYWxzZTtcbiAgICB0aGlzLnByZXZpZXdJbXBsaWNpdFZhbHVlID0gdGhpcy5wcmV2aWV3SW1wbGljaXRWYWx1ZSA/PyBmYWxzZTtcblxuICAgIC8vIE5vIHN1Z2dlc3RGbjogZmlsdGVyIG9uIHRoZSBnaXZlbiBpdGVtc1xuICAgIGlmICghdGhpcy5zdWdnZXN0Rm4pIHtcbiAgICAgIGNvbnN0IHN1Z2dlc3RGcm9tQXJyYXlGbjogU3VnZ2VzdEZuPGFueSwgYW55PiA9IGFzeW5jICh2YWx1ZSwgZmlsdGVyKSA9PlxuICAgICAgICAvLyBERUJVR1xuICAgICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBDYWxsaW5nIHN1Z2dlc3RGcm9tQXJyYXkgd2l0aCB2YWx1ZT0nLCB2YWx1ZSk7XG5cbiAgICAgICAgc3VnZ2VzdEZyb21BcnJheSh0aGlzLl8kaW5wdXRJdGVtcy52YWx1ZSwgdmFsdWUsIHtcbiAgICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOiB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLFxuICAgICAgICAgIC4uLmZpbHRlcixcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIFdhaXQgKG9uY2UpIHRoYXQgaXRlbXMgYXJlIGxvYWRlZCwgdGhlbiBjYWxsIHN1Z2dlc3QgZnJvbSBhcnJheSBmblxuICAgICAgdGhpcy5zdWdnZXN0Rm4gPSBhc3luYyAodmFsdWUsIGZpbHRlcikgPT4ge1xuICAgICAgICBpZiAoaXNOaWwodGhpcy5fJGlucHV0SXRlbXMudmFsdWUpKSB7XG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgV2FpdGluZyBpdGVtcyB0byBiZSBzZXQuLi5cIik7XG5cbiAgICAgICAgICBhd2FpdCBmaXJzdE5vdE5pbFByb21pc2UodGhpcy5fJGlucHV0SXRlbXMsIHsgc3RvcDogdGhpcy5fZGVzdHJveSQgfSk7XG5cbiAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBSZWNlaXZlZCBpdGVtczpcIiwgdGhpcy5pbnB1dEl0ZW1zJC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdWdnZXN0Rm4gPSBzdWdnZXN0RnJvbUFycmF5Rm47XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3VnZ2VzdEZuKHZhbHVlLCBmaWx0ZXIpOyAvLyBMb29wXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFNlbmQgdmFsdWUgdG8gc3VnZ2VzdCB3aGVuIDpcbiAgICAvLyAtIGlzIG5pbCBhbmQgJyonLCBhbmQgbm8gbWluIGxlbmd0aCB0aHJlc2hvbGRcbiAgICAvLyAtIGlzIG5vdCBuaWwgYW5kIG5vdCBhIHN0cmluZyB0eXBlIChlLmcuIG9iamVjdClcbiAgICAvLyAtIGlzIG5vdCBuaWwgYW5kIGlzIGEgc3RyaW5nLCBhbmQgaGFzIGVub3VnaCBjaGFyYWN0ZXJcbiAgICBjb25zdCB0aHJlc2hvbGRGaWx0ZXJGbiA9ICh2YWx1ZTogYW55KSA9PlxuICAgICAgdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkIDw9IDAgfHxcbiAgICAgIChpc05vdE5pbCh2YWx1ZSkgJiYgKCEodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgfHwgKHZhbHVlICE9PSAnKicgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+PSB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQpKSk7XG5cbiAgICBjb25zdCBmaWx0ZXJlZEl0ZW1zQ2hhbmdlcyA9IG1lcmdlKFxuICAgICAgLy8gUmVsb2FkIGV2ZW50IChubyBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIHBpcGUsIHRvIGZvcmNlIHJlbG9hZCBldmVuIGlmIHNhbWUgdmFsdWUpXG4gICAgICB0aGlzLl9yZWxvYWQkLnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmVuYWJsZWQpLFxuICAgICAgICBmaWx0ZXIodGhyZXNob2xkRmlsdGVyRm4pLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5zaG93TG9hZGluZ1NwaW5uZXIgJiYgdGhpcy5tYXJrQXNMb2FkaW5nKCkpXG4gICAgICApLFxuXG4gICAgICAvLyBTZWFyY2ggdGV4dCAobm8gZGlzdGluY3RVbnRpbENoYW5nZWQoKSBiZWNhdXNlIG9mIHRoZSBkZWJvdW5jZVRpbWUoKSBwaXBlKVxuICAgICAgdGhpcy5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgZmlsdGVyKCh2YWx1ZSkgPT4gdGhpcy5lbmFibGVkICYmIGlzTm90TmlsU3RyaW5nKHZhbHVlKSksXG4gICAgICAgIC8vIE1hcmsgYXMgbG9hZGluZyAodG8gc2hvdyBsb2FkaW5nIHNwaW5uZXIpIC0gYXMgc29vbiBhcyBwb3NzaWJsZSwgYW5kIGJlZm9yZSBkZWJvdW5jZVRpbWVcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuc2hvd0xvYWRpbmdTcGlubmVyICYmIHRoaXMubWFya0FzTG9hZGluZygpKSxcbiAgICAgICAgLy8gRmlsdGVyIGlmIG5vdCBlbm91Z2ggY2hhcmFjdGVyXG4gICAgICAgIGZpbHRlcigodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAoKHZhbHVlPy5sZW5ndGggfHwgMCkgPCB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBkaXNwbGF5IHZhbHVlLCB0byBlbmFibGUgdGhlIG1lc3NhZ2UgXCJub3QgZW5vdWdoIGNoYXJhY3RlcnNcIlxuICAgICAgICAgICAgdGhpcy5fZGlzcGxheVZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KSxcbiAgICAgICAgLy8gV2FpdCBhIGRlYm91bmNlIHRpbWVcbiAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lKVxuICAgICAgICAvLyBERUJVR1xuICAgICAgICAvLyx0YXAoKHZhbHVlKSA9PiB0aGlzLmRlYnVnICYmIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFNlYXJjaCB0ZXh0IGNoYW5nZXM6JywgdmFsdWUpKVxuICAgICAgKSxcblxuICAgICAgLy8gT2JqZWN0IHNldDogdXNlIGl0IChubyBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIHBpcGUgbmVlZClcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aDxhbnk+KHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpLFxuICAgICAgICBmaWx0ZXIoKHZhbHVlKSA9PiBpc05vdE5pbE9iamVjdCh2YWx1ZSkpLFxuICAgICAgICB0YXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBjb250cm9sIHZhbHVlIGNoYW5nZXM6JywgdmFsdWUpO1xuXG4gICAgICAgICAgLy8gVXBkYXRlIHRoZSBkaXNwbGF5IHZhbHVlIChpZiBuZWVkKVxuICAgICAgICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IHRoaXMuZGlzcGxheVdpdGgodmFsdWUpIHx8ICcnO1xuICAgICAgICAgIGlmICh0aGlzLl9kaXNwbGF5VmFsdWUgIT09IGRpc3BsYXlWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fZGlzcGxheVZhbHVlID0gZGlzcGxheVZhbHVlO1xuXG4gICAgICAgICAgICAvLyBBcHBseSB0byB0aGUgaW5wdXRbdHlwZT10ZXh0XSBmaWVsZFxuICAgICAgICAgICAgdGhpcy5zZXRJbnB1dFRleHRWYWx1ZSh0aGlzLl9kaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIElmIG11bHRpcGxlOiBkbyBub3QgcmVjb21wdXRlIGl0ZW1zIChvbmx5IGZvciB0aGUgZmlyc3QgdGltZSwgd2hlbiBsb2FkaW5nKVxuICAgICAgICAvLyB3aGVuIGZvcm1Db250cm9sIHZhbHVlIGNoYW5nZXNcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMubG9hZGluZyB8fCAoIXRoaXMubXVsdGlwbGUgJiYgIXRoaXMuc2hvd0FsbE9uRm9jdXMpKVxuICAgICAgKSxcblxuICAgICAgLy8gTWVyZ2Ugc29tZSBvYnNlcnZhYmxlcywgd2l0aCBhIGNvbW1vbiBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIHBpcGVcbiAgICAgIG1lcmdlKFxuICAgICAgICAvLyBPbiBkcm9wZG93biBidXR0b24gY2xpY2sgKG5vIGRlYm91bmNlVGltZSlcbiAgICAgICAgdGhpcy5kcm9wQnV0dG9uQ2xpY2sucGlwZShmaWx0ZXIoKGV2ZW50KSA9PiAhZXZlbnQgfHwgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpKSxcbiAgICAgICAgLy8gRm9jdXMgb3IgY2xpY2sgPT4gTG9hZCBhbGwgKG5vIGRlYm91bmNlVGltZSlcbiAgICAgICAgbWVyZ2UodGhpcy5mb2N1c2VkLCB0aGlzLmNsaWNrZWQpXG4gICAgICAgICAgLy8gQXZvaWQgdG9vIG1hbnkgY2FsbCwgZS5nLiB3aGVuIGZvY3VzZWQgYW5kIGNsaWNrZWRcbiAgICAgICAgICAucGlwZSh0aHJvdHRsZVRpbWUoMTAwKSksXG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIC8vLnBpcGUodGFwKChfKSA9PiB0aGlzLmRlYnVnICYmIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIGZvY3VzZWQgb3IgY2xpY2tlZCBldmVudCcpKSksXG4gICAgICAgIC8vIElucHV0IGl0ZW1zIG9yIGZpbHRlciBjaGFuZ2VzXG4gICAgICAgIG1lcmdlKHRoaXMuXyRpbnB1dEl0ZW1zLCB0aGlzLl8kZmlsdGVyKS5waXBlKFxuICAgICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5sb2FkaW5nKVxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy90YXAoKF8pID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgJGlucHV0SXRlbXMgb3IgZmlsdGVyIGV2ZW50JykpXG4gICAgICAgIClcbiAgICAgICkucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZW5hYmxlZCksXG4gICAgICAgIG1hcCgoKSA9PiAodGhpcy5tdWx0aXBsZSA/IHRoaXMuc2VhcmNoVGV4dCA6IHRoaXMuc2hvd0FsbE9uRm9jdXMgPyAnKicgOiB0aGlzLmZvcm1Db250cm9sLnZhbHVlKSksXG4gICAgICAgIC8vIERpc3Rpbmd1aXNoIGNoYW5nZXNcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHYxLCB2MikgPT5cbiAgICAgICAgICAvLyBJZiBsb2FkaW5nIChub3QgbG9hZGVkIHlldCksIHNpbXVsYXRlIHRoYXQgdmFsdWUgY2hhbmdlZCB0byBmb3JjZSBsb2FkXG4gICAgICAgICAgdGhpcy5sb2FkaW5nID8gZmFsc2UgOiB2MSA9PT0gdjIgfHwgdGhpcy5lcXVhbHModjEsIHYyKVxuICAgICAgICApLFxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIGNoYXJhY3RlcnNcbiAgICAgICAgZmlsdGVyKHRocmVzaG9sZEZpbHRlckZuKVxuICAgICAgICAvLyBERUJVR1xuICAgICAgICAvL3RhcCgodmFsdWUpID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgdXBkYXRlIGV2ZW50OiAnLCB2YWx1ZSkpXG4gICAgICApXG4gICAgKS5waXBlKFxuICAgICAgLy8gU3VnZ2VzdCB2YWx1ZXNcbiAgICAgIG1lcmdlTWFwKCh2YWx1ZSkgPT4gdGhpcy5zdWdnZXN0KHZhbHVlLCB0aGlzLmZpbHRlcikpLFxuXG4gICAgICAvLyBJZ25vcmUgdW5kZWZpbmVkIHJlc3VsdCAoZS5nLiB3aGVuIGEgbmV3ZXIgc3VnZ2VzdCBjYWxsIGlzIHJ1bm5pbmcpXG4gICAgICBmaWx0ZXIoaXNOb3ROaWwpLFxuXG4gICAgICAvLyBERUJVR1xuICAgICAgLy90YXAoaXRlbXMgPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBmcm9tIHN1Z2dlc3Q6ICcsIGl0ZW1zKSksXG5cbiAgICAgIC8vIFN0b3JlIGltcGxpY2l0IHZhbHVlICh3aWxsIHVzZSBpdCBvbkJsdXIgaWYgbm90IG90aGVyIHZhbHVlIHNlbGVjdGVkKVxuICAgICAgdGFwKChpdGVtcykgPT4gISh0aGlzLm1vYmlsZSB8fCB0aGlzLm11bHRpcGxlKSAmJiB0aGlzLnVwZGF0ZUltcGxpY2l0VmFsdWUoaXRlbXMpKVxuICAgICk7XG5cbiAgICAvLyBGZXRjaCBtb3JlIGV2ZW50c1xuICAgIGNvbnN0IGZldGNoTW9yZUl0ZW1zQ2hhbmdlcyA9IHRoaXMuX2ZldGNoTW9yZSQucGlwZShcbiAgICAgIHRhcCgoZXZlbnQpID0+IGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpKSwgLy8gQXZvaWQgdG8gY2xvc2UgdGhlIG1hdC1zZWxlY3RcbiAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmNhbkZldGNoTW9yZSksXG4gICAgICBtZXJnZU1hcCgoKSA9PiB0aGlzLmZldGNoTW9yZSgpKSxcblxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vdGFwKG1vcmVJdGVtcyA9PiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBmcm9tIGZldGNoIE1vcmU6ICcsIG1vcmVJdGVtcykpLFxuXG4gICAgICAvLyBDb25jYXQgdG8gZXhpc3RpbmcgaXRlbXNcbiAgICAgIG1hcCgobW9yZUl0ZW1zKSA9PiAodGhpcy5fJGZpbHRlcmVkSXRlbXMudmFsdWUgfHwgW10pLmNvbmNhdChtb3JlSXRlbXMpKVxuICAgICk7XG5cbiAgICAvLyBVcGRhdGUgZmlsdGVyZWQgaXRlbXNcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIHRoaXMuXyRpbnB1dEl0ZW1zLFxuXG4gICAgICAgIC8vIFVwZGF0ZSBpdGVtcyBldmVudHNcbiAgICAgICAgZmlsdGVyZWRJdGVtc0NoYW5nZXMsXG5cbiAgICAgICAgLy8gRmV0Y2ggbW9yZSBldmVudHNcbiAgICAgICAgZmV0Y2hNb3JlSXRlbXNDaGFuZ2VzXG4gICAgICApLnN1YnNjcmliZSgoaXRlbXMpID0+IHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIGNvbnRyb2wgdmFsdWUgaXMgaW5zaWRlIChtYXQtc2VsZWN0KVxuICAgICAgICAvLyAob3RoZXJ3aXNlIGN1cnJlbnQgdmFsdWUgd2lsbCB2aXN1YWxseSBkaXNhcHBlYXIpXG4gICAgICAgIGlmIChpdGVtcykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZEl0ZW0gPSBudWxsO1xuXG4gICAgICAgICAgLy8gSWYgZm9ybSB2YWx1ZSBpcyBtaXNzaW5nOiBhcHBlbmQgdG8gbGlzdFxuICAgICAgICAgIGlmIChpc05vdE5pbCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KHZhbHVlLmZpbHRlcigodikgPT4gIWl0ZW1zLnNvbWUoKGl0ZW0pID0+IHRoaXMuZXF1YWxzKGl0ZW0sIHYpKSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gdGhpcy5lcXVhbHMoaXRlbSwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEl0ZW0gPSBpdGVtc1tpbmRleF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBjdXJyZW50IHZhbHVlIHRvIHRoZSBsaXN0LCBpZiBtaXNzaW5nIChtYXQtc2VsZWN0IG9ubHkpXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5tb2JpbGUgfHwgdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmNvbmNhdCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgbmV3IGZpbHRlcmVkIGl0ZW1zJywgaXRlbXMpO1xuXG4gICAgICAgIC8vIEVtaXQgaXRlbXNcbiAgICAgICAgdGhpcy5fJGZpbHRlcmVkSXRlbXMubmV4dChpdGVtcyk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBBcHBseWluZyBpbXBsaWNpdCB2YWx1ZSwgb24gYmx1clxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmJsdXJyZWRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gU2tpcCBpZiBtdWx0aXBsZSAobm8gaW1wbGljaXQgdmFsdWUpIG9yIGRpc2FibGVcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMubXVsdGlwbGUgJiYgIXRoaXMubW9iaWxlICYmIHRoaXMuZW5hYmxlZCksXG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvLyx0YXAoXyA9PiB0aGlzLmRlYnVnICYmIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIGJsdXJyZWQgZXZlbnQnKSksXG4gICAgICAgICAgbWFwKCgpID0+IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICBsZXQgaW52YWxpZGF0ZUZpbHRlcmVkSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgICBsZXQgbW92ZUNhcmV0VG9CZWdpbm5pbmcgPSBmYWxzZTtcblxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgQXBwbHlpbmcgaW1wbGljaXQgdmFsdWUgb24gYmx1cicsIHZhbHVlKTtcblxuICAgICAgICAgIC8vIFdoZW4gbGVhdmUgY29tcG9uZW50IHdpdGhvdXQgb2JqZWN0LCB1c2UgaW1wbGljaXQgdmFsdWUgaWYgOlxuICAgICAgICAgIC8vIC0gYW4gZXhwbGljaXQgdmFsdWVcbiAgICAgICAgICAvLyAtIGZpZWxkIGlzIG5vdCBlbXB0eSAodXNlciBmaWxsIHNvbWV0aGluZylcbiAgICAgICAgICAvLyAtIE9SIGZpZWxkIGVtcHR5IGJ1dCBpcyByZXF1aXJlZFxuICAgICAgICAgIGlmIChpc05vdE5pbCh0aGlzLl9pbXBsaWNpdFZhbHVlKSAmJiAoKHRoaXMucmVxdWlyZWQgJiYgaXNOaWxPckJsYW5rKHZhbHVlKSkgfHwgKGlzTm90TmlsT3JCbGFuayh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykpKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5faW1wbGljaXRWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc1BlbmRpbmcoeyBlbWl0RXZlbnQ6IGZhbHNlLCBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UsIG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICAgICAgaW52YWxpZGF0ZUZpbHRlcmVkSXRlbXMgPSB0aGlzLnNob3dBbGxPbkZvY3VzIHx8IHRoaXMucmVsb2FkSXRlbXNPbkZvY3VzO1xuICAgICAgICAgICAgbW92ZUNhcmV0VG9CZWdpbm5pbmcgPSB0cnVlOyAvLyBNb3ZlIGNhcmV0IHRvIHRoZSBiZWdpbm5pbmcgKGZpeCBpc3N1ZSBJTUFHSU5FLTQ2OSlcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTm8gdmFsdWUgYW5kIG5vIGltcGxpY2l0IHZhbHVlXG4gICAgICAgICAgZWxzZSBpZiAoaXNOaWxPckJsYW5rKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNQZW5kaW5nKHsgZW1pdEV2ZW50OiBmYWxzZSwgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlLCBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSGFzIHZhbHVlLCBidXQgbm8gaW1wbGljaXQgdmFsdWVcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFZhbHVlIGlzIGEgdmFsaWQgb2JqZWN0XG4gICAgICAgICAgICBpZiAoaXNOb3ROaWxPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGludmFsaWRhdGVGaWx0ZXJlZEl0ZW1zID0gdGhpcy5zaG93QWxsT25Gb2N1cyB8fCB0aGlzLnJlbG9hZEl0ZW1zT25Gb2N1cztcbiAgICAgICAgICAgICAgbW92ZUNhcmV0VG9CZWdpbm5pbmcgPSB0cnVlOyAvLyBNb3ZlIGNhcmV0IHRvIHRoZSBiZWdpbm5pbmcgKGZpeCBpc3N1ZSBJTUFHSU5FLTQ2OSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEludmFsaWQgdmFsaWQgdmFsdWU6IGNsZWFyIHNlYXJjaCB0ZXh0XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmNsZWFySW52YWxpZFZhbHVlT25CbHVyICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKG51bGwpO1xuICAgICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc1BlbmRpbmcoeyBlbWl0RXZlbnQ6IGZhbHNlLCBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSwgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgICAgIGludmFsaWRhdGVGaWx0ZXJlZEl0ZW1zID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gbnVsbDsgLy8gcmVzZXQgdGhlIGltcGxpY2l0IHZhbHVlXG4gICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7IC8vIENsb3NlIHBhbmVsXG5cbiAgICAgICAgICAvLyBJbnZhbGlkYXRlIGxvYWRlZCBpdGVtc1xuICAgICAgICAgIGlmIChpbnZhbGlkYXRlRmlsdGVyZWRJdGVtcykge1xuICAgICAgICAgICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7IC8vIFNob3VsZCBmb3JjZSBuZXh0IGZvY3VzIHRvIHJlbG9hZCBpdGVtc1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1vdmUgY2FyZXQgdG8gdGhlIGJlZ2lubmluZyAoZml4IGlzc3VlIElNQUdJTkUtNDY5KVxuICAgICAgICAgIGlmIChtb3ZlQ2FyZXRUb0JlZ2lubmluZykge1xuICAgICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIE1vdmluZyBjYXJldCB0byB0aGUgYmVnaW5uaW5nLCBvbiBibHVyJyk7XG4gICAgICAgICAgICBzZWxlY3RJbnB1dFJhbmdlKHRoaXMubWF0SW5wdXRUZXh0Lm5hdGl2ZUVsZW1lbnQsIDAsIDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gTGlzdGVuIGZvcm0gY29udHJvbCBzdGF0dXMgY2hhbmdlXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc3RhdHVzQ2hhbmdlc1xuICAgICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IHN0YXRlXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jaGVja0lmVG91Y2hlZCgpKVxuICAgICk7XG5cbiAgICAvLyBTZWxlY3QgaW5wdXQgY29udGVudCwgb24gZm9jdXMgb3IgcHJlc3MgZW50ZXJcbiAgICBpZiAodGhpcy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzICYmICF0aGlzLm1vYmlsZSAmJiAhdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgbWVyZ2UoXG4gICAgICAgICAgdGhpcy5mb2N1c2VkLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKGV2ZW50KSA9PiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICAgICAgICAgIC8vdGFwKChldmVudCkgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHRoaXMua2V5dXBFbnRlci5waXBlKGZpbHRlcigoKSA9PiBpc05vdE5pbE9iamVjdCh0aGlzLmZvcm1Db250cm9sLnZhbHVlKSkpXG4gICAgICAgIClcbiAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzRGVsYXkpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgU2VsZWN0aW5nIGlucHV0IGNvbnRlbnQgKGZvY3VzZWQpJyk7XG4gICAgICAgICAgICBzZWxlY3RJbnB1dENvbnRlbnQodGhpcy5tYXRJbnB1dFRleHQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVsb2FkSXRlbXNPbkZvY3VzKSB7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICB0aGlzLmZvY3VzZWQucGlwZShmaWx0ZXIoKGV2ZW50KSA9PiAhdGhpcy5sb2FkaW5nICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWxvYWRpbmcgaXRlbXMgKGZvY3VzZWQpJyk7XG4gICAgICAgICAgdGhpcy5yZWxvYWRJdGVtcygpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5fZml4TWF0U2VsZWN0UG9zaXRpb25BbmRTZWFyY2hiYXIoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl8kaW5wdXRJdGVtcy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuXyRpbnB1dEl0ZW1zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fJGZpbHRlcmVkSXRlbXMuY29tcGxldGUoKTtcbiAgICB0aGlzLl8kZmlsdGVyZWRJdGVtcy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3JlbG9hZCQuY29tcGxldGUoKTtcbiAgICB0aGlzLl8kZmlsdGVyLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLmRyb3BCdXR0b25DbGljay5jb21wbGV0ZSgpO1xuICAgIHRoaXMuY2xpY2tlZC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuYmx1cnJlZC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZm9jdXNlZC5jb21wbGV0ZSgpO1xuICAgIHRoaXMua2V5ZG93bkVzY2FwZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMua2V5dXBFbnRlci5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2ZldGNoTW9yZSQuY29tcGxldGUoKTtcblxuICAgIHRoaXMuX2ltcGxpY2l0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5mb3JtQ29udHJvbCA9IG51bGw7XG4gICAgdGhpcy5kaXNwbGF5V2l0aCA9IG51bGw7XG4gICAgdGhpcy5lcXVhbHMgPSBudWxsO1xuICAgIHRoaXMuc3VnZ2VzdEZuID0gbnVsbDtcbiAgICB0aGlzLl8kZmlsdGVyZWRJdGVtcyA9IG51bGw7XG4gICAgdGhpcy5jb25maWcgPSBudWxsO1xuICAgIHRoaXMucGFuZWxDbGFzcyA9IG51bGw7XG5cbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IG51bGw7XG5cbiAgICAvLyBEZXN0cm95IHRoZSAnYXV0b2NvbXBsZXRlJyBpbnN0YW5jZSwgdG8gYXZvaWQgbWVtb3J5IGxlYWtcbiAgICB0aGlzLmF1dG9jb21wbGV0ZT8ubmdPbkRlc3Ryb3koKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byByZWxvYWQgY29udGVudC4gVXNlZnVsIHdoZW4gZmlsdGVyIGhhcyBiZWVuIGNoYW5nZWQgYnV0IG5vdCBkZXRlY3RlZFxuICAgKi9cbiAgcmVsb2FkSXRlbXModmFsdWU/OiBhbnkpIHtcbiAgICAvLyBERUJVR1xuICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEFza2luZyB0byByZWxvYWRJdGVtcygpJywgdmFsdWUpO1xuICAgIC8vIEZvcmNlIGEgcmVmcmVzaFxuICAgIHRoaXMuX3JlbG9hZCQubmV4dCh2YWx1ZSB8fCAodGhpcy5zaG93QWxsT25Gb2N1cyAmJiB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgPD0gMCA/ICcqJyA6IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpKTtcblxuICAgIC8vIENsZWFyIHRoZSBzZWFyY2ggYmFyIChvbmx5IGlmIGhpZGRlbilcbiAgICBpZiAodGhpcy5tYXRTZWxlY3QgJiYgIXRoaXMubWF0U2VsZWN0LnBhbmVsT3BlbiAmJiB0aGlzLmlvblNlYXJjaGJhcikge1xuICAgICAgdGhpcy5pb25TZWFyY2hiYXIudmFsdWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgV3JpdGluZyB2YWx1ZTogJywgdmFsdWUpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLmZvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB0aGlzLl9kaXNwbGF5VmFsdWUgPSB0aGlzLmRpc3BsYXlXaXRoKHZhbHVlKTtcblxuICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh2YWx1ZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIG5lZWQgdG8gdXBkYXRlIGNvbnRyb2xzXG4gICAgICB0aGlzLmNoZWNrSWZUb3VjaGVkKCk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgdmFsdWVcbiAgICBlbHNlIGlmIChpc05pbCh2YWx1ZSkpIHtcbiAgICAgIC8vIFVwZGF0ZSBkaXNwbGF5IHZhbHVlIChlLmcuIHNob3VsZCByZWZyZXNoIHRoZSB0aXRsZSlcbiAgICAgIGlmIChpc05vdE5pbE9yQmxhbmsodGhpcy5fZGlzcGxheVZhbHVlKSkge1xuICAgICAgICB0aGlzLl9kaXNwbGF5VmFsdWUgPSAnJztcbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzZXQgaW1wbGljaXQgdmFsdWVcbiAgICAgIHRoaXMuX2ltcGxpY2l0VmFsdWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGlzRGlzYWJsZWQgJiYgdGhpcy5hdXRvY29tcGxldGU/LmlzT3Blbikge1xuICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBmb2N1cygpIHtcbiAgICBpZiAodGhpcy5tYXRTZWxlY3QpIHtcbiAgICAgIHRoaXMubWF0U2VsZWN0LmZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvY3VzSW5wdXQodGhpcy5tYXRJbnB1dFRleHQpO1xuICAgIH1cbiAgfVxuXG4gIGZpbHRlcklucHV0VGV4dEZvY3VzRXZlbnQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50IHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIGNhbGxpbmcgZmlsdGVySW5wdXRUZXh0Rm9jdXNFdmVudCAtIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBJZ25vcmUgZXZlbnQgZnJvbSBtYXQtb3B0aW9uXG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcblxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIENhbmNlbGxpbmcgZm9jdXMgZXZlbnQnKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEFscmVhZHkgZm9jdXNlZCAtIGZpeCBpc3N1ZSBzdW1hcmlzLWFwcCM4MzcgKDIgcGFuZWxzIG9wZW5lZCBhdCB0aGUgc2FtZSB0aW1lKVxuICAgIGlmICh0aGlzLl9mb2N1c2VkKSByZXR1cm4gZmFsc2U7XG5cbiAgICB0aGlzLl9mb2N1c2VkID0gdHJ1ZTtcblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgU2VsZWN0IGlucHV0IGNvbnRlbnQnKTtcbiAgICBjb25zdCBoYXNDb250ZW50ID0gaXNOb3ROaWxPckJsYW5rKChldmVudC50YXJnZXQgYXMgYW55KT8udmFsdWUpO1xuXG4gICAgLy8gSWYgY29tYm8gaXMgZW1wdHksIG9yIGlmIGhhcyBjb250ZW50IGJ1dCBzaG91bGQgZm9yY2UgdG8gc2hvdyBwYW5lbCBvbiBmb2N1c1xuICAgIGlmICghaGFzQ29udGVudCB8fCB0aGlzLnNob3dQYW5lbE9uRm9jdXMgfHwgdGhpcy5zaG93QWxsT25Gb2N1cykge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEVtaXQgZm9jdXMgZXZlbnQnKTtcblxuICAgICAgLy8gTmVlZCBhIGRlbGF5IHRvIHByZXZlbnQgZWFybHkgZm9jdXMgZXZlbnQsIGp1c3QgYWZ0ZXIgYSBibHVyIGV2ZW50IChzZWUgaXNzdWUgc3VtYXJpcy1hcHAjODM3IC0gMiBwYW5lbHMgb3BlbmVkKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5fZm9jdXNlZCkgcmV0dXJuOyAvLyBTa2lwIGlmIGJsdXIgZXZlbnQgcmVjZWl2ZWRcblxuICAgICAgICB0aGlzLmZvY3VzZWQuZW1pdChldmVudCk7XG4gICAgICB9LCAxMCk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlsdGVySW5wdXRUZXh0Qmx1ckV2ZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG5cbiAgICAvLyBERUJVR1xuICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIGZpbHRlcklucHV0VGV4dEJsdXJFdmVudCcsIGV2ZW50KTtcblxuICAgIC8vIElnbm9yZSBldmVudCBmcm9tIG1hdC1vcHRpb25cbiAgICBpZiAoXG4gICAgICAoZXZlbnQucmVsYXRlZFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGV2ZW50LnJlbGF0ZWRUYXJnZXQudGFnTmFtZSA9PT0gJ01BVC1PUFRJT04nKSB8fFxuICAgICAgLy8gT3IgYXV0b2NvbXBsZXRlIHBhbmVsIGlzIG9wZW4gYmVjYXVzZSBldmVudC5yZWxhdGVkVGFyZ2V0IGlzIG51bGwgKGNmLiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8yNDE4MilcbiAgICAgIChldmVudC5yZWxhdGVkVGFyZ2V0ID09PSBudWxsICYmIHRoaXMuYXV0b2NvbXBsZXRlPy5pc09wZW4pXG4gICAgKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuXG4gICAgICAvLyBERUJVR1xuICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIENhbmNlbGxpbmcgYmx1ciBldmVudFwiKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFscmVhZHkgYmx1cnJlZDogc2tpcFxuICAgIGlmICghdGhpcy5fZm9jdXNlZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fZm9jdXNlZCA9IGZhbHNlO1xuXG4gICAgLy8gTmVlZCBhIGRlbGF5IHRvIHByZXZlbnQgZWFybHkgYmx1ciBldmVudCB3aXRob3V0IHRyaWdnZXJpbmcgZm9ybUNoYW5nZSBldmVudFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2ZvY3VzZWQpIHJldHVybjsgLy8gU2tpcCBpZiBmb2N1cyBhZ2FpblxuXG4gICAgICB0aGlzLmJsdXJyZWQuZW1pdChldmVudCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0RW50ZXIoZXZlbnQ6IEV2ZW50IHwgS2V5Ym9hcmRFdmVudCkge1xuICAgIHRoaXMua2V5dXBFbnRlci5lbWl0KGV2ZW50KTtcblxuICAgIC8vIFVzZSBpc0p1c3RDbG9zZWQgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVcbiAgICBpZiAodGhpcy5lbnRlci5vYnNlcnZlZCAmJiAhdGhpcy5pc0p1c3RDbG9zZWQpIHtcbiAgICAgIHRoaXMuZW50ZXIuZW1pdChldmVudCk7XG4gICAgfVxuICB9XG5cbiAgZW1pdEFycm93VXAoZXZlbnQ6IEV2ZW50IHwgS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLmFycm93VXAub2JzZXJ2ZWQgJiYgIXRoaXMuaXNPcGVuKSB7XG4gICAgICB0aGlzLmFycm93VXAuZW1pdChldmVudCk7XG4gICAgfVxuICB9XG5cbiAgZW1pdEFycm93RG93bihldmVudDogRXZlbnQgfCBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuYXJyb3dEb3duLm9ic2VydmVkICYmICF0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy5hcnJvd0Rvd24uZW1pdChldmVudCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMuZHJvcEJ1dHRvbkNsaWNrLmVtaXQoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0RXNjYXBlKGV2ZW50OiBLZXlib2FyZEV2ZW50IHwgRXZlbnQpIHtcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIC8vIEF2b2lkIGZvcm0gb3IgcGFnZSB0byBtYW5hZ2UgZXNjYXBlIGV2ZW50XG4gICAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIENsb3NpbmcgdGhlIHBhbmVsIChrZXlkb3duLmVzY2FwZSlcIik7XG5cbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmtleWRvd25Fc2NhcGUuZW1pdChldmVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGlvblNlYXJjaEJhckNoYW5nZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICF0aGlzLm1hdFNlbGVjdC5wYW5lbE9wZW4pIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gR2V0IHRoZSB2YWx1ZSB0byBzZWFyY2hcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudCBhcyBDdXN0b21FdmVudDxTZWFyY2hiYXJDaGFuZ2VFdmVudERldGFpbD4pPy5kZXRhaWwudmFsdWU7XG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFJlY2VpdmVkIDxpb24tc2VhcmNoYmFyPiBjaGFuZ2VzXCIsIHZhbHVlKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgZGlzcGxheSB2YWx1ZSAoaW4gdGhlIHZpc2libGUgZm9ybSBjb250cm9sKVxuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5fZGlzcGxheVZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gTWFyayBjb21wb25lbnQgYXMgbG9hZGluZ1xuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuXG4gICAgLy8gUmVsb2FkIGl0ZW1zXG4gICAgdGhpcy5yZWxvYWRJdGVtcyh2YWx1ZSk7XG5cbiAgICAvLyBUT0RPIEZpbmQgYSB3YXkgdG8gYXZvaWQgbWF0LXNlbGVjdCB0byBnaXZlIGZvY3VzIHRvIGFuIG9wdGlvbiwgd2hlbiB0eXBpbmdcbiAgICAvKmlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLm1hdFNlbGVjdC5fZWxlbWVudFJlZjtcbiAgICB9Ki9cbiAgfVxuXG4gIGZpbHRlck1hdFNlbGVjdEZvY3VzRXZlbnQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50IHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgPG1hdC1zZWxlY3Q+IGZvY3VzIGV2ZW50JywgZXZlbnQpO1xuXG4gICAgLy8gRW1pdCBldmVudFxuICAgIHRoaXMuZm9jdXNlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGZpbHRlck1hdFNlbGVjdEJsdXJFdmVudChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuXG4gICAgLy8gREVCVUdcbiAgICAvLyBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgUmVjZWl2ZWQgPG1hdC1zZWxlY3Q+IGJsdXIgZXZlbnRcIiwgZXZlbnQpO1xuXG4gICAgaWYgKFxuICAgICAgZXZlbnQucmVsYXRlZFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmXG4gICAgICAvLyBJZ25vcmUgZXZlbnQgZnJvbSBtYXQtb3B0aW9uXG4gICAgICAoZXZlbnQucmVsYXRlZFRhcmdldC50YWdOYW1lID09PSAnTUFULU9QVElPTicgfHxcbiAgICAgICAgKGV2ZW50LnJlbGF0ZWRUYXJnZXQudGFnTmFtZSA9PT0gJ0RJVicgJiYgZXZlbnQucmVsYXRlZFRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC1tZGMtc2VsZWN0LXBhbmVsJykpIHx8IC8vIE5ldyBNREMgdGFnIGFuZCBjbGFzcyBuYW1lIChlcXVpdmFsZW50IHRvIGV2ZW50LnJlbGF0ZWRUYXJnZXQudGFnTmFtZSA9PT0gJ01BVC1PUFRJT04nKVxuICAgICAgICAoZXZlbnQucmVsYXRlZFRhcmdldC50YWdOYW1lID09PSAnSU5QVVQnICYmIGV2ZW50LnJlbGF0ZWRUYXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWFyY2hiYXItaW5wdXQnKSkpXG4gICAgKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBDYW5jZWxsaW5nIDxtYXQtc2VsZWN0PiBibHVyIGV2ZW50XCIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9mb2N1c2VkKSB7XG4gICAgICB0aGlzLl9mb2N1c2VkID0gZmFsc2U7XG5cbiAgICAgIHRoaXMuYmx1cnJlZC5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNsZWFyVmFsdWUoZXZlbnQ/OiBFdmVudCkge1xuICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIHRoaXMud3JpdGVWYWx1ZShudWxsKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuaW9uU2VhcmNoYmFyKSB7XG4gICAgICB0aGlzLmlvblNlYXJjaGJhci52YWx1ZSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuICB9XG5cbiAgX2luaXRBdXRvY29tcGxldGVJbmZpbml0ZVNjcm9sbCh0aHJlc2hvbGQ/OiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuYXV0b2NvbXBsZXRlKSByZXR1cm47IC8vIFNraXBcblxuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBJbml0IGF1dG9jb21wbGV0ZSBzY3JvbGwgbGlzdGVuZXInKTtcblxuICAgIGlmICh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZSh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IG9wZW5lZCQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuYXV0b2NvbXBsZXRlLl9pc09wZW4gPyB0aW1lcigwKSA6IHRoaXMuYXV0b2NvbXBsZXRlLm9wZW5lZC5waXBlKGRlYm91bmNlVGltZSgyMDApKTtcbiAgICBjb25zdCBzY3JvbGxFbmQkID0gb3BlbmVkJC5waXBlKFxuICAgICAgbWFwKCgpID0+IHRoaXMuZ2V0QXV0b2NvbXBsZXRlUGFuZWwoKSksXG4gICAgICBmaWx0ZXIoaXNOb3ROaWwpLFxuICAgICAgc3dpdGNoTWFwKChwYW5lbCkgPT4gZnJvbVNjcm9sbEVuZEV2ZW50KHBhbmVsLCB0aHJlc2hvbGQpKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLmF1dG9jb21wbGV0ZS5jbG9zZWQpXG4gICAgKTtcblxuICAgIC8vIFRyaWdnZXIgZmV0Y2ggbW9yZSwgd2hlbiBlbmQgc2Nyb2xsIHJlYWNoZWRcbiAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24gPSBzY3JvbGxFbmQkLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9mZXRjaE1vcmUkLmVtaXQoKSk7XG5cbiAgICAvLyBSZWdpc3RlciBzdWJzY3JpcHRpb25cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbik7XG4gIH1cblxuICBfaW5pdE1hdFNlbGVjdEluZmluaXRlU2Nyb2xsKHRocmVzaG9sZD86IHN0cmluZykge1xuICAgIGlmICghdGhpcy5tYXRTZWxlY3QpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgLy8gREVCVUdcbiAgICBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBJbml0IG1hdC1zZWxlY3Qgc2Nyb2xsIGxpc3RlbmVyJyk7XG5cbiAgICBpZiAodGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5yZW1vdmUodGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcGVuZWQkOiBPYnNlcnZhYmxlPGFueT4gPSB0aGlzLm1hdFNlbGVjdC5wYW5lbE9wZW4gPyB0aW1lcigwKSA6IHRoaXMubWF0U2VsZWN0Ll9vcGVuZWRTdHJlYW0ucGlwZShkZWJvdW5jZVRpbWUoMjAwKSk7XG4gICAgY29uc3Qgc2Nyb2xsRW5kJCA9IG9wZW5lZCQucGlwZShcbiAgICAgIG1hcCgoKSA9PiB0aGlzLmdldE1hdFNlbGVjdFBhbmVsKCkpLFxuICAgICAgZmlsdGVyKGlzTm90TmlsKSxcbiAgICAgIHN3aXRjaE1hcCgocGFuZWwpID0+IGZyb21TY3JvbGxFbmRFdmVudChwYW5lbCwgdGhyZXNob2xkKSksXG4gICAgICB0YWtlVW50aWwodGhpcy5tYXRTZWxlY3QuX2Nsb3NlZFN0cmVhbSlcbiAgICApO1xuXG4gICAgLy8gVHJpZ2dlciBmZXRjaCBtb3JlLCBlbmQgZW5kIHNjcm9sbCByZWFjaGVkXG4gICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uID0gc2Nyb2xsRW5kJC5waXBlKGZpbHRlcigoKSA9PiB0aGlzLl9tb3JlSXRlbXNDb3VudCA+IDApKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZmV0Y2hNb3JlJC5lbWl0KCkpO1xuXG4gICAgLy8gUmVnaXN0ZXIgc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pO1xuICB9XG5cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hdXRvY29tcGxldGU/LmlzT3BlbiB8fCB0aGlzLm1hdFNlbGVjdD8ucGFuZWxPcGVuIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGlzSnVzdENsb3NlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc09wZW4gfHwgIXRoaXMuX3BhbmVsQ2xvc2VkQXRUaW1lKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBjbG9zZUFnZSA9IERhdGUubm93KCkgLSB0aGlzLl9wYW5lbENsb3NlZEF0VGltZTtcblxuICAgIC8vIFdvcmthcm91bmQgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVcbiAgICAvLyBlLmcuIFBhbmVsIGl0ZW0gY2FuIGJlIHZhbGlkYXRlZCBieSB0aGUgZW50ZXIga2V5LCBzbyB3ZSBkZXRlY3QgaWYgcGFuZWwganVzdCBjbG9zZWRcbiAgICByZXR1cm4gY2xvc2VBZ2UgPiAyMDA7XG4gIH1cblxuICBjbG9zZVBhbmVsKCkge1xuICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZT8uaXNPcGVuKSB7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVRyaWdnZXI/LmNsb3NlUGFuZWwoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWF0U2VsZWN0Py5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMubWF0U2VsZWN0Py5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2QgLS0gKi9cblxuICBwcm90ZWN0ZWQgbWFya0FzTG9hZGluZygpIHtcbiAgICBpZiAodGhpcy5fJGZpbHRlcmVkSXRlbXMudmFsdWUpIHtcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIE1hcmtpbmcgYXMgbG9hZGluZycpO1xuXG4gICAgICB0aGlzLl8kZmlsdGVyZWRJdGVtcy5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLl9pdGVtQ291bnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21vcmVJdGVtc0NvdW50ID0gMDtcbiAgICAgIHRoaXMuX3NlbGVjdGVkSXRlbSA9IG51bGw7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvblNlbGVjdGlvbkNoYW5nZShldmVudDogTWF0U2VsZWN0Q2hhbmdlKSB7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7IHNvdXJjZTogZXZlbnQuc291cmNlLCB2YWx1ZTogZXZlbnQudmFsdWUgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25PcHRpb25TZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCkge1xuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgT3B0aW9uIHNlbGVjdGVkJywgZXZlbnQpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7IHNvdXJjZTogZXZlbnQuc291cmNlLCB2YWx1ZTogZXZlbnQub3B0aW9uLnZhbHVlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZVNob3dQYW5lbChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZHJvcEJ1dHRvbkNsaWNrLmVtaXQoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qIC0tIHByaXZhdGUgbWV0aG9kIC0tICovXG5cbiAgcHJpdmF0ZSBhc3luYyBzdWdnZXN0KHZhbHVlOiBhbnksIGZpbHRlcjogYW55IHwgdW5kZWZpbmVkKTogUHJvbWlzZTxhbnlbXSB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIENvbXB1dGUgYSBuZXcgZXhlY3V0aW9uIGlkXG4gICAgY29uc3QgaWQgPSArK3RoaXMuX3N1Z2dlc3RFeGVjdXRpb25JZDtcblxuICAgIC8vIFNwbGl0IHN0cmluZyB2YWx1ZSwgaWYgYWxsb3cgKC5lLmcgJ0FBQSAtIEl0ZW0gQUFBJyA9PiAnQUFBJylcbiAgICBpZiAoISh0aGlzLm11bHRpcGxlIHx8IHRoaXMubW9iaWxlKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBTcGxpdCBzZWFyY2ggdGV4dCAoYW5kIGtlZXAgb25seSB0aGUgZmlyc3QgcGFydClcbiAgICAgIGlmICh0aGlzLnNwbGl0U2VhcmNoVGV4dCAmJiB0aGlzLmRpc3BsYXlTZXBhcmF0b3IpIHtcbiAgICAgICAgY29uc3QgZmlyc3RTZXBhcmF0b3JJbmRleCA9IHZhbHVlLmluZGV4T2YodGhpcy5kaXNwbGF5U2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKGZpcnN0U2VwYXJhdG9ySW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgZmlyc3RTZXBhcmF0b3JJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVHJpbSBzZWFyY2ggdGV4dFxuICAgICAgaWYgKHRoaXMudHJpbVNlYXJjaFRleHQpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsbCBzdWdnZXN0aW9uIGZ1bmN0aW9uXG4gICAgbGV0IHJlcyA9IGF3YWl0IHRoaXMuc3VnZ2VzdEZuKHZhbHVlLCBmaWx0ZXIpO1xuXG4gICAgLy8gSWdub3JlIHRoZSBjdXJyZW50IHJlc3VsdCwgaWYgYSBuZXdlciBleGVjdXRpb24gaGFzIGJlZW4gbGF1bmNoZWRcbiAgICBpZiAoaWQgIT09IHRoaXMuX3N1Z2dlc3RFeGVjdXRpb25JZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgRmlsdGVyZWQgaXRlbXMgYnkgc3VnZ2VzdEZuOicsIHZhbHVlLCByZXMpO1xuXG4gICAgaWYgKCFyZXMpIHtcbiAgICAgIHRoaXMuX2l0ZW1Db3VudCA9IDA7XG4gICAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSAwO1xuICAgICAgcmVzID0gW107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHtcbiAgICAgIHJlcyA9IHJlcyBhcyBhbnlbXTtcbiAgICAgIHRoaXMuX2l0ZW1Db3VudCA9IHJlcy5sZW5ndGg7XG4gICAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IGRhdGEsIHRvdGFsLCBmZXRjaE1vcmUgfSA9IHJlcyBhcyBMb2FkUmVzdWx0PGFueT47XG4gICAgICB0aGlzLl9pdGVtQ291bnQgPSB0b3RhbCA/PyBkYXRhLmxlbmd0aCA/PyAwO1xuICAgICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IGZldGNoTW9yZTtcbiAgICAgIHRoaXMuX21vcmVJdGVtc0NvdW50ID0gKGZldGNoTW9yZSAmJiB0aGlzLl9pdGVtQ291bnQgLSBkYXRhLmxlbmd0aCkgfHwgMDtcbiAgICAgIHJlcyA9IGRhdGE7XG4gICAgfVxuXG4gICAgLy8gQWRkIGZhdm9yaXRlc1xuICAgIGlmIChpc05vdEVtcHR5QXJyYXkodGhpcy5mYXZvcml0ZUl0ZW1zKSkge1xuICAgICAgY29uc3Qgc2hvd0FsbEZhdm9yaXRlcyA9ICF2YWx1ZSB8fCB2YWx1ZSA9PT0gJyonIHx8IChpc05vdE5pbE9iamVjdCh2YWx1ZSkgJiYgdGhpcy5zaG93QWxsT25Gb2N1cyk7XG4gICAgICBjb25zdCBzb3J0QXR0cmlidXRlcyA9IHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMgfHwgKGZpbHRlciAmJiAoKGZpbHRlci5zZWFyY2hBdHRyaWJ1dGUgJiYgW2ZpbHRlci5zZWFyY2hBdHRyaWJ1dGVdKSB8fCBmaWx0ZXIuc2VhcmNoQXR0cmlidXRlcykpO1xuICAgICAgY29uc3QgZmlsdGVyZWRGYXZvcml0ZUl0ZW1zID0gc2hvd0FsbEZhdm9yaXRlc1xuICAgICAgICA/IHRoaXMuZmF2b3JpdGVJdGVtcy5zb3J0KHByb3BlcnRpZXNQYXRoQ29tcGFyYXRvcihzb3J0QXR0cmlidXRlcykpXG4gICAgICAgIDogc3VnZ2VzdEZyb21BcnJheSh0aGlzLmZhdm9yaXRlSXRlbXMsIHZhbHVlLCB0aGlzLmZpbHRlcik/LmRhdGE7XG4gICAgICBpZiAoaXNOb3RFbXB0eUFycmF5KGZpbHRlcmVkRmF2b3JpdGVJdGVtcykpIHtcbiAgICAgICAgZmlsdGVyZWRGYXZvcml0ZUl0ZW1zLnNvcnQocHJvcGVydGllc1BhdGhDb21wYXJhdG9yKHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMpKTtcbiAgICAgICAgcmVzID0gZmlsdGVyZWRGYXZvcml0ZUl0ZW1zLmNvbmNhdChyZXMuZmlsdGVyKChpdGVtKSA9PiAhZmlsdGVyZWRGYXZvcml0ZUl0ZW1zLnNvbWUoKGZhdm9yaXRlSXRlbSkgPT4gdGhpcy5lcXVhbHMoZmF2b3JpdGVJdGVtLCBpdGVtKSkpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBERUJVR1xuICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEZpbHRlcmVkIGl0ZW1zIGJ5IHN1Z2dlc3RGbjonLCB2YWx1ZSwgcmVzKTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoTW9yZSgpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgaWYgKCF0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrKSByZXR1cm4gW107XG5cbiAgICAvLyBTYXZlIHRoZW4gcmVtb3ZlIGZldGNoIGZ1bmN0aW9uICh0byBhdm9pZCBtdWx0aS1jYWxsKVxuICAgIGNvbnN0IGZldGNoTW9yZUZuID0gdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjaztcbiAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuXG4gICAgbGV0IHsgZGF0YTogaXRlbXMsIHRvdGFsLCBmZXRjaE1vcmUgfSA9IGF3YWl0IGZldGNoTW9yZUZuKCk7XG5cbiAgICAvLyBFeGNsdWRlIGZhdm9yaXRlc1xuICAgIGlmIChpc05vdEVtcHR5QXJyYXkodGhpcy5mYXZvcml0ZUl0ZW1zKSkge1xuICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+ICF0aGlzLmZhdm9yaXRlSXRlbXMuc29tZSgoZmF2b3JpdGVJdGVtKSA9PiB0aGlzLmVxdWFscyhmYXZvcml0ZUl0ZW0sIGl0ZW0pKSk7XG4gICAgfVxuXG4gICAgdGhpcy5faXRlbUNvdW50ID0gdG90YWwgfHwgdGhpcy5faXRlbUNvdW50O1xuICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSBmZXRjaE1vcmU7XG4gICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSBNYXRoLm1heCgwLCB0aGlzLl9tb3JlSXRlbXNDb3VudCAtIGl0ZW1zLmxlbmd0aCk7IC8vIEJvcm5lIG1pbiA9IDBcbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUltcGxpY2l0VmFsdWUoaXRlbXM6IGFueVtdKSB7XG4gICAgLy8gU3RvcmUgaW1wbGljaXQgdmFsdWUgKHdpbGwgdXNlIGl0IG9uQmx1ciBpZiBub3Qgb3RoZXIgdmFsdWUgc2VsZWN0ZWQpXG4gICAgaWYgKCF0aGlzLm11bHRpcGxlICYmIGl0ZW1zPy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGltcGxpY2l0VmFsdWUgPSBpdGVtc1swXTtcbiAgICAgIGNvbnN0IGFwcGx5SW1wbGljaXRWYWx1ZSA9IHR5cGVvZiB0aGlzLmFwcGx5SW1wbGljaXRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuYXBwbHlJbXBsaWNpdFZhbHVlKGltcGxpY2l0VmFsdWUpIDogdGhpcy5hcHBseUltcGxpY2l0VmFsdWU7XG4gICAgICBpZiAoYXBwbHlJbXBsaWNpdFZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2ltcGxpY2l0VmFsdWUgPSBpbXBsaWNpdFZhbHVlO1xuXG4gICAgICAgIC8vIFByZXZpZXcgdGhlIGltcGxpY2l0IGluIHRoZSBpbnB1dCB0ZXh0IChhbmQgc2VsZWN0IHRoZSBhZGRlZCBwYXJ0KVxuICAgICAgICBpZiAodGhpcy5wcmV2aWV3SW1wbGljaXRWYWx1ZSAmJiB0aGlzLm1hdElucHV0VGV4dD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLm1hdElucHV0VGV4dC5uYXRpdmVFbGVtZW50LnZhbHVlO1xuXG4gICAgICAgICAgLy8gQ29tcGxldGUgdGhlIHNlYXJjaCB0ZXh0LCB3aXRoIHRoZSBmdWxsIGltcGxpY2l0IHZhbHVlIGFwcGxpZWRcbiAgICAgICAgICBpZiAoIVJlZ0V4cFV0aWxzLmhhc1dpbGRjYXJkQ2hhcmFjdGVyKHNlYXJjaFRleHQpKSB7XG4gICAgICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSB0aGlzLmRpc3BsYXlXaXRoKGltcGxpY2l0VmFsdWUpO1xuICAgICAgICAgICAgaWYgKGRpc3BsYXlWYWx1ZS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoc2VhcmNoVGV4dC50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIGFkZGl0aW9uYWwgdGV4dCB0byBtYXRjaCB0aGUgaW1wbGljaXQgdmFsdWVcbiAgICAgICAgICAgICAgdGhpcy5zZXRJbnB1dFRleHRWYWx1ZShkaXNwbGF5VmFsdWUsIHNlYXJjaFRleHQubGVuZ3RoLCBkaXNwbGF5VmFsdWUubGVuZ3RoLCAnYmFja3dhcmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBDb250aW51ZSA6IHJlc3RlIGltcGxpY2l0IHZhbHVlXG4gICAgfVxuXG4gICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tJZlRvdWNoZWQoKSB7XG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudG91Y2hlZCkge1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdXRvY29tcGxldGVQYW5lbCgpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgZWxlID0gdGhpcy5hdXRvY29tcGxldGU/Lm9wdGlvbnMubGFzdD8uX2dldEhvc3RFbGVtZW50KCkucGFyZW50RWxlbWVudDtcbiAgICBpZiAoIWVsZSkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLmxvZ1ByZWZpeCArICcgVW5hYmxlIHRvIGZpbmQgdGhlIGF1dG9jb21wbGV0ZSBkaXYuLi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWF0U2VsZWN0UGFuZWwoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGVsZSA9IHRoaXMubWF0U2VsZWN0Lm9wdGlvbnMubGFzdD8uX2dldEhvc3RFbGVtZW50KCkucGFyZW50RWxlbWVudDtcbiAgICBpZiAoIWVsZSkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLmxvZ1ByZWZpeCArICcgVW5hYmxlIHRvIGZpbmQgdGhlIG1hdC1zZWxlY3QgY29udGFpbmVyLi4uJyk7XG4gICAgfVxuICAgIHJldHVybiBlbGU7XG4gIH1cblxuICBwcml2YXRlIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZml4TWF0U2VsZWN0UG9zaXRpb25BbmRTZWFyY2hiYXIoKSB7XG4gICAgaWYgKCF0aGlzLm1hdFNlbGVjdCkgcmV0dXJuO1xuXG4gICAgLy8gSGlkZSB0aGUgcGFuZWwgKHdpbGwgYmUgc2hvdyB3aGVuIHJlYWR5KVxuICAgIHRoaXMubWF0U2VsZWN0LnBhbmVsQ2xhc3MgPSAnaGlkZGVuJztcblxuICAgIGxldCBzZWFyY2hCYXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5tYXRTZWxlY3Qub3BlbmVkQ2hhbmdlLnN1YnNjcmliZShhc3luYyAob3BlbikgPT4ge1xuICAgICAgICBpZiAob3Blbikge1xuICAgICAgICAgIC8vIFdhaXQgcGFuZWwgdG8gYmUgY3JlYXRlZFxuICAgICAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4gISF0aGlzLm1hdFNlbGVjdC5wYW5lbCwge3N0b3A6IHRoaXMuX2Rlc3Ryb3kkfSk7XG4gICAgICAgICAgY29uc3QgcGFuZWxFbGVtZW50ID0gdGhpcy5tYXRTZWxlY3QucGFuZWwubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICBjb25zdCBvdmVybGF5UGFuZSA9IGZpbmRQYXJlbnRXaXRoQ2xhc3MocGFuZWxFbGVtZW50LCAnY2RrLW92ZXJsYXktcGFuZScpO1xuXG4gICAgICAgICAgLy8gRml4IHBhbmVsIHBvc2l0aW9uLCB3aGVuIG92ZXJsYXkgaGFzIGFuIHRyYW5zZm9ybVggKGFkZGVkIHdoZW4ga2V5Ym9hcmQgaXMgc2hvd24pXG4gICAgICAgICAgdGhpcy5fZml4TWF0U2VsZWN0UGFuZWxQb3NpdGlvbihvdmVybGF5UGFuZSk7XG5cbiAgICAgICAgICAvLyBGaXggb3ZlcmxheSwgZm9yIHNlYXJjaGJhclxuICAgICAgICAgIGlmICh0aGlzLnNob3dTZWFyY2hCYXIpIHtcbiAgICAgICAgICAgIHNlYXJjaEJhclN1YnNjcmlwdGlvbiA9IGF3YWl0IHRoaXMuX2ZpeFNlYXJjaGJhck92ZXJsYXkocGFuZWxFbGVtZW50LCBvdmVybGF5UGFuZSk7XG4gICAgICAgICAgICBpZiAoc2VhcmNoQmFyU3Vic2NyaXB0aW9uKSB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHNlYXJjaEJhclN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2hvdyB0aGUgcGFuZWxcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHBhbmVsRWxlbWVudCwgJ2hpZGRlbicpO1xuICAgICAgICAgIHRoaXMubWF0U2VsZWN0LnBhbmVsQ2xhc3MgPSB0aGlzLnBhbmVsQ2xhc3M7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT04gY2xvc2VcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gVW5zdWJzY3JpYmUgc2VhcmNoIGJhciB3b3JrYXJvdW5kXG4gICAgICAgICAgaWYgKHNlYXJjaEJhclN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgc2VhcmNoQmFyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24ucmVtb3ZlKHNlYXJjaEJhclN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICBzZWFyY2hCYXJTdWJzY3JpcHRpb24gPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBIaWRlIHBhbmVsIGFnYWluXG4gICAgICAgICAgICB0aGlzLm1hdFNlbGVjdC5wYW5lbENsYXNzID0gJ2hpZGRlbic7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9maXhNYXRTZWxlY3RQYW5lbFBvc2l0aW9uKG92ZXJsYXlQYW5lOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghb3ZlcmxheVBhbmUpIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSB0aGUgdW53YW50ZWQgZGVmYXVsdCB0cmFuc2xhdGVYXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgIG92ZXJsYXlQYW5lLFxuICAgICAgJ3RyYW5zZm9ybScsXG4gICAgICBvdmVybGF5UGFuZS5zdHlsZS50cmFuc2Zvcm1cbiAgICAgICAgLnNwbGl0KCcgJylcbiAgICAgICAgLmZpbHRlcigocHJvcCkgPT4gIXByb3AubWF0Y2goL150cmFuc2xhdGVYLykpXG4gICAgICAgIC5qb2luKCcgJylcbiAgICApO1xuXG4gICAgLy8gRml4IHBhbmVsIHdpZHRoIHRvIGZpZWxkIHdpZHRoIChpdCB3YXMgbm90IGZvcmNlZCBieSBASW5wdXQgcGFuZWxXaWR0aClcbiAgICBpZiAoIXRoaXMucGFuZWxXaWR0aCkge1xuICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLmxvZ1ByZWZpeH0gRml4aW5nIHNlbGVjdCBwYW5lbCB3aWR0aCB0byB0aGUgZmllbGQgc2l6ZWApO1xuICAgICAgY29uc3Qgd2lkdGggPSBgJHt0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggLSAxfXB4YDtcbiAgICAgIGlmICh0aGlzLl9kZWZhdWx0UGFuZWxXaWR0aCAhPT0gd2lkdGgpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFBhbmVsV2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShvdmVybGF5UGFuZSwgJ3dpZHRoJywgd2lkdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZpeCBwYW5lbCdzIGxlZnQsIHRvIGF2b2lkIG92ZXJmbG93IG9uIHRoZSByaWdodFxuICAgIGNvbnN0IGxlZnQgPSBvdmVybGF5UGFuZS5zdHlsZS5sZWZ0O1xuICAgIGlmIChpc05vdE5pbE9yQmxhbmsobGVmdCkgJiYgIWxlZnQuaW5jbHVkZXMoJ2NhbGMoJykgJiYgbGVmdC5lbmRzV2l0aCgncHgnKSkge1xuICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLmxvZ1ByZWZpeH0gRml4aW5nIHNlbGVjdCBwYW5lbCBsZWZ0LCB0byBhdm9pZCBvdmVyZmxvdyBvbiB0aGUgcmlnaHRgKTtcbiAgICAgIGNvbnN0IHdpZHRoID0gYCR7b3ZlcmxheVBhbmUuY2xpZW50V2lkdGh9cHhgO1xuICAgICAgY29uc3QgZml4TGVmdCA9IGBjYWxjKC0ke3dpZHRofSArIG1pbigke2xlZnR9ICsgJHt3aWR0aH0sIC0zMnB4ICsgMTAwdncpKWA7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG92ZXJsYXlQYW5lLCAnbGVmdCcsIGZpeExlZnQsIFJlbmRlcmVyU3R5bGVGbGFnczIuSW1wb3J0YW50KTtcbiAgICB9XG5cbiAgICAvLyBGaXggcGFuZWwncyB0b3AsIHRvIGF2b2lkIG92ZXJmbG93IG9uIHRoZSBib3R0b21cbiAgICBjb25zdCB0b3AgPSBvdmVybGF5UGFuZS5zdHlsZS50b3A7XG4gICAgaWYgKGlzTm90TmlsT3JCbGFuayh0b3ApICYmICF0b3AuaW5jbHVkZXMoJ2NhbGMoJykgJiYgdG9wLmVuZHNXaXRoKCdweCcpKSB7XG4gICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMubG9nUHJlZml4fSBGaXhpbmcgc2VsZWN0IHBhbmVsIHRvcCwgdG8gYXZvaWQgb3ZlcmZsb3cgb24gdGhlIGJvdHRvbWApO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gYCR7b3ZlcmxheVBhbmUuY2xpZW50SGVpZ2h0IHx8IDI3NX1weGA7XG4gICAgICBjb25zdCBmaXhUb3AgPSBgY2FsYygtJHtoZWlnaHR9ICsgbWluKCR7dG9wfSArICR7aGVpZ2h0fSwgLTMycHggKyAxMDB2aCkpYDtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3ZlcmxheVBhbmUsICd0b3AnLCBmaXhUb3AsIFJlbmRlcmVyU3R5bGVGbGFnczIuSW1wb3J0YW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFjayA6IGlmIHdlIGFyZSBpbiBhIElvbk1vZGFsLCBpdCdzIG5lY2Vzc2FyeSB0byBtb3ZlIHRoZSBDZGtPdmVybGF5IGNvbnRhaW5lclxuICAgKiAgICAgaW4gdGhlIElvbk1vZGFsIHRvIG1pZ2h0IGtlZXAgZm9jdXMgaW4gSW9uU2VhcmNoYmFyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFuZWxFbGVtZW50XG4gICAqIEBwYXJhbSBvdmVybGF5UGFuZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZml4U2VhcmNoYmFyT3ZlcmxheShwYW5lbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvdmVybGF5UGFuZTogSFRNTEVsZW1lbnQpOiBQcm9taXNlPFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5tYXRTZWxlY3QgfHwgIXRoaXMuaW9uU2VhcmNoYmFyKSByZXR1cm47XG5cbiAgICBjb25zdCBtb2RhbEVsZW1lbnQgPSBhd2FpdCB0aGlzLm1vZGFsQ29udHJvbGxlci5nZXRUb3AoKTtcbiAgICBpZiAoIW1vZGFsRWxlbWVudCkgcmV0dXJuOyAvLyBObyBtb2RhbDogc2tpcFxuXG4gICAgLy8gR2V0IHRoZSBDREsgb3ZlcmxheSBjb250YWluZXJcbiAgICBjb25zdCBvdmVybGF5Q29udGFpbmVyID0gZmluZFBhcmVudFdpdGhDbGFzcyhwYW5lbEVsZW1lbnQsICdjZGstb3ZlcmxheS1jb250YWluZXInKTtcbiAgICBpZiAoIW92ZXJsYXlDb250YWluZXIpIHJldHVybjtcbiAgICBjb25zdCBvcmlnaW5hbFBhcmVudCA9IG92ZXJsYXlDb250YWluZXIucGFyZW50RWxlbWVudDtcblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZylcbiAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgYCR7dGhpcy5sb2dQcmVmaXh9IE1vdmluZyB0aGUgXCJjZGstb3ZlcmxheVwiIGNvbnRhaW5lciBmcm9tIHRoZSBcIiR7b3JpZ2luYWxQYXJlbnQ/LnRhZ05hbWUgfHwgJ2JvZHknfVwiIHRvIHRoZSBcImlvbi1tb2RhbFwiIGNvbnRhaW5lcmBcbiAgICApO1xuXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChtb2RhbEVsZW1lbnQsIG92ZXJsYXlDb250YWluZXIpO1xuXG4gICAgY29uc3QgX2RvY3VtZW50ID0gdGhpcy5pbmplY3Rvci5nZXQoRE9DVU1FTlQpO1xuICAgIGNvbnN0IHNoaWZ0TGVmdCA9IChfZG9jdW1lbnQuZGVmYXVsdFZpZXcuaW5uZXJXaWR0aCAtIG1vZGFsRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkgLyAyO1xuICAgIGNvbnN0IHNoaWZ0VG9wID0gKF9kb2N1bWVudC5kZWZhdWx0Vmlldy5pbm5lckhlaWdodCAtIG1vZGFsRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpIC8gMjtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3ZlcmxheVBhbmUsICdtYXJnaW4tdG9wJywgYC0ke3NoaWZ0VG9wfXB4YCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShvdmVybGF5UGFuZSwgJ21hcmdpbi1sZWZ0JywgYC0ke3NoaWZ0TGVmdH1weGApO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZXZlcnNlIGZ1bmN0aW9uLCB0byByZXBsYWNlIHRoZSBjb250YWluZXIgaW4gYm9keVxuICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKCgpID0+IHtcbiAgICAgIC8vIERFQlVHXG4gICAgICAvL2lmICh0aGlzLmRlYnVnKVxuICAgICAgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLmxvZ1ByZWZpeH0gbW92aW5nIHRoZSBcImNkay1vdmVybGF5XCIgY29udGFpbmVyIGZyb20gdGhlIFwiaW9uLW1vZGFsXCIgdG8gdGhlIFwiYm9keVwiIGNvbnRhaW5lcmApO1xuXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKG9yaWdpbmFsUGFyZW50IC8qdGhpcy5kb2N1bWVudC5ib2R5Ki8sIG92ZXJsYXlDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbnB1dFRleHRWYWx1ZSh2YWx1ZTogc3RyaW5nLCBzZWxlY3Rpb25TdGFydEluZGV4PzogbnVtYmVyLCBzZWxlY3Rpb25FbmRJbmRleD86IG51bWJlciwgZGlyZWN0aW9uPzogJ2JhY2t3YXJkJyB8ICdmb3J3YXJkJykge1xuICAgIC8vIEFwcGx5IHRvIHRoZSBpbnB1dFt0eXBlPXRleHRdIGZpZWxkXG4gICAgaWYgKHRoaXMubWF0SW5wdXRUZXh0Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLm1hdElucHV0VGV4dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWUgPz8gJyc7XG4gICAgICBpZiAoaXNOb3ROaWwoc2VsZWN0aW9uU3RhcnRJbmRleCkpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgc2VsZWN0SW5wdXRSYW5nZSh0aGlzLm1hdElucHV0VGV4dC5uYXRpdmVFbGVtZW50LCBzZWxlY3Rpb25TdGFydEluZGV4LCBzZWxlY3Rpb25FbmRJbmRleCwgZGlyZWN0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmFja3NwYWNlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQ/LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXG4gICAgLy8gSWYgcHJldmlldyBlbmFibGVkLCByZW1vdmUgc2VsZWN0aW9uIHdoZW4gcHJlc3MgYmFja3NwYWNlIChieSBkZWZhdWx0IG9ubHkgdGhlIHNlbGVjdGlvbiB3aWxsIGJlIGRlbGV0ZWQpXG4gICAgaWYgKHRoaXMucHJldmlld0ltcGxpY2l0VmFsdWUgJiYgaW5wdXQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGlvblN0YXJ0ID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICBjb25zdCBzZWxlY3Rpb25FbmQgPSBpbnB1dC5zZWxlY3Rpb25FbmQ7XG4gICAgICBsZXQgdmFsdWUgPSBpbnB1dC52YWx1ZTtcblxuICAgICAgLy8gTWFrZSBzdXJlIHRvIHJlbW92ZSB0aGUgbGFzdCB0eXBlZCBjaGFyYWN0ZXIgKGJ5IGRlZmF1bHQgb25seSB0aGUgc2VsZWN0aW9uIHdpbGwgYmUgZGVsZXRlZClcbiAgICAgIGlmICh0aGlzLl9pbXBsaWNpdFZhbHVlICYmIHNlbGVjdGlvblN0YXJ0ID4gMCAmJiBzZWxlY3Rpb25TdGFydCA8IHNlbGVjdGlvbkVuZCAmJiB2YWx1ZS5sZW5ndGggPT09IHNlbGVjdGlvbkVuZCkge1xuICAgICAgICAvLyBERUJVR1xuICAgICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMubG9nUHJlZml4fSBCYWNrc3BhY2UgcHJlc3NlZCwgYWRkaXRpb25hbCB0ZXh0IGZyb20gdGhlIGltcGxpY2l0IHZhbHVlYCk7XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAvLyBEZWZpbmUgdGhlIG5ldyB2YWx1ZSBieSByZW1vdmluZyB0aGUgdGV4dCBpbiB0aGUgYWRqdXN0ZWQgcmFuZ2VcbiAgICAgICAgY29uc3QgbmV3Q2FyZXRQb3NpdGlvbiA9IHNlbGVjdGlvblN0YXJ0IC0gMTtcbiAgICAgICAgdmFsdWUgPSBuZXdDYXJldFBvc2l0aW9uID4gMCA/IHZhbHVlLnNsaWNlKDAsIG5ld0NhcmV0UG9zaXRpb24pIDogJyc7XG5cbiAgICAgICAgLy8gY2xlYW4gaW1wbGljaXQgdmFsdWVcbiAgICAgICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IG51bGw7XG5cbiAgICAgICAgLy8gQXBwbHkgdGhlIG5ldyB2YWx1ZSBhbmQgdXBkYXRlIHRoZSBzZWxlY3Rpb25cbiAgICAgICAgdGhpcy5zZXRJbnB1dFRleHRWYWx1ZSh2YWx1ZSwgbmV3Q2FyZXRQb3NpdGlvbiwgc2VsZWN0aW9uRW5kKTtcblxuICAgICAgICAvLyBNYXJrIGNvbXBvbmVudCBhcyBsb2FkaW5nXG4gICAgICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuXG4gICAgICAgIC8vIFJlbG9hZCBpdGVtc1xuICAgICAgICB0aGlzLnJlbG9hZEl0ZW1zKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbWl0XG4gICAgdGhpcy5rZXlkb3duQmFja3NwYWNlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZUZhdm9yaXRlQ2xpY2soZXZlbnQ6IFVJRXZlbnQsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoaXNOaWwodmFsdWUpIHx8IGV2ZW50Py5kZWZhdWx0UHJldmVudGVkIHx8ICF0aGlzLnRvZ2dsZUZhdm9yaXRlLm9ic2VydmVkKSByZXR1cm47IC8vIFNraXBcblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgRmF2b3JpdGUgaXRlbSBjbGlja2VkJywgdmFsdWUpO1xuXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0Zhdm9yaXRlID0gdGhpcy5mYXZvcml0ZUl0ZW1zPy5zb21lKChmYXZvcml0ZUl0ZW0pID0+IHRoaXMuZXF1YWxzKGZhdm9yaXRlSXRlbSwgdmFsdWUpKTtcbiAgICBpZiAoaXNGYXZvcml0ZSkge1xuICAgICAgdGhpcy5mYXZvcml0ZUl0ZW1zID0gdGhpcy5mYXZvcml0ZUl0ZW1zLmZpbHRlcigoZmF2b3JpdGVJdGVtKSA9PiAhdGhpcy5lcXVhbHMoZmF2b3JpdGVJdGVtLCB2YWx1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZhdm9yaXRlSXRlbXMgPSB0aGlzLmZhdm9yaXRlSXRlbXMuY29uY2F0KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IGNoYW5nZXNcbiAgICB0aGlzLnRvZ2dsZUZhdm9yaXRlLmVtaXQoeyBzb3VyY2U6IHRoaXMubWF0U2VsZWN0IHx8IHRoaXMuYXV0b2NvbXBsZXRlLCB2YWx1ZTogdmFsdWUgfSk7XG4gIH1cbn1cbiIsIjxpb24tZ3JpZCBjbGFzcz1cImlvbi1uby1wYWRkaW5nIGZpZWxkLWNvbnRhaW5lclwiPlxuICA8aW9uLXJvdz5cbiAgICA8aW9uLWNvbCBbc2l6ZV09XCJjb2xTaXplcz8uWzBdXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPCEtLSByZWFkb25seSAtLT5cbiAgICAgIEBpZiAoX3JlYWRvbmx5KSB7XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/IF9kaXNwbGF5VmFsdWUgfHwgJycgOiAnJ1wiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyBfZGlzcGxheVZhbHVlIHx8ICcnIDogJydcIlxuICAgICAgICAgIGNsYXNzPVwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWRcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBtYXRQcmVmaXg+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgaGlkZGVuIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHk9XCJ0cnVlXCIgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCIgLz5cbiAgICAgICAgICA8aW9uLXRleHQ+e3sgdmFsdWUgfCB0b1N0cmluZzogZGlzcGxheVdpdGggfX08L2lvbi10ZXh0PlxuICAgICAgICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBoaW50cyAtLT5cbiAgICAgICAgICBAaWYgKCFmb3JtQ29udHJvbC5pbnZhbGlkKSB7XG4gICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRIaW50VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgfVxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIEBsZXQgaGFzRmF2b3JpdGVzID0gdG9nZ2xlRmF2b3JpdGUub2JzZXJ2ZWQgfHwgKGZhdm9yaXRlSXRlbXMgfCBpc05vdEVtcHR5QXJyYXkpO1xuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/IF9kaXNwbGF5VmFsdWUgfHwgJycgOiAnJ1wiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyBfZGlzcGxheVZhbHVlIHx8ICcnIDogJydcIlxuICAgICAgICAgIFtoaWRlUmVxdWlyZWRNYXJrZXJdPVwiaGlkZVJlcXVpcmVkTWFya2VyXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgbWF0UHJlZml4PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmICgobGFiZWwgfHwgcGxhY2Vob2xkZXIpICYmIGZsb2F0TGFiZWwgIT09ICduZXZlcicpIHtcbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgbGFiZWwgfHwgcGxhY2Vob2xkZXIgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICB9XG4gICAgICAgICAgPCEtLSBNb2JpbGUgb3IgTXVsdGlwbGUgKHVzZSA8bWF0LXNlbGVjdD4pIC0tPlxuICAgICAgICAgIEBpZiAobW9iaWxlIHx8IG11bHRpcGxlKSB7XG4gICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAjbWF0U2VsZWN0XG4gICAgICAgICAgICAgIGhpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3JcbiAgICAgICAgICAgICAgZGlzYWJsZU9wdGlvbkNlbnRlcmluZ1xuICAgICAgICAgICAgICBbZGlzYWJsZVJpcHBsZV09XCJkaXNhYmxlUmlwcGxlXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIl90YWJpbmRleFwiXG4gICAgICAgICAgICAgIFtwYW5lbENsYXNzXT1cInBhbmVsQ2xhc3NcIlxuICAgICAgICAgICAgICBbcGFuZWxXaWR0aF09XCJwYW5lbFdpZHRoIHx8IF9kZWZhdWx0UGFuZWxXaWR0aFwiXG4gICAgICAgICAgICAgIChmb2N1cyk9XCJmaWx0ZXJNYXRTZWxlY3RGb2N1c0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJmaWx0ZXJNYXRTZWxlY3RCbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJlbWl0RXNjYXBlKCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiZW1pdEVudGVyKCRldmVudClcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAob3BlbmVkQ2hhbmdlKT1cIm9wZW5lZENoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiZXF1YWxzXCJcbiAgICAgICAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgICAgICAgICAgICAgW3R5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWxdPVwiZGVib3VuY2VUaW1lICogMTBcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgICBbY2xhc3MubWF0LW1kYy1zZWxlY3QtYXJyb3ctaGlkZGVuXT1cIiFtb2JpbGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPnt7IHZhbHVlIHwgdG9TdHJpbmc6IGRpc3BsYXlXaXRoIH19PC9tYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgICAgICAgIDwhLS0gU2VhcmNoIGJhciAtLT5cbiAgICAgICAgICAgICAgQGlmIChzaG93U2VhcmNoQmFyKSB7XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCBjbGFzcz1cIm1hdC1zZWxlY3Qtc2VhcmNoYmFyXCIgW2NsYXNzLm1hdC1zZWxlY3Qtc2VhcmNoYmFyLXN0aWNreV09XCJzdGlja3lTZWFyY2hCYXJcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gRklYTUUgb24gaU9TIGRldmljZXMsIHdoZW4gYW5pbWF0ZWQ9XCJ0cnVlXCIsIHRoZW4gdGhlIHNlYXJjaCBpY29uIG92ZXJsYXAgdGhlIHBsYWNlaG9sZGVyIC0tPlxuICAgICAgICAgICAgICAgICAgPGlvbi1zZWFyY2hiYXJcbiAgICAgICAgICAgICAgICAgICAgI2lvblNlYXJjaGJhclxuICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICBhbmltYXRlZD1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgc2hvd0NsZWFyQnV0dG9uPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkZWJvdW5jZV09XCJkZWJvdW5jZVRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAoaW9uQ2xlYXIpPVwibWFya0FzTG9hZGluZygpXCJcbiAgICAgICAgICAgICAgICAgICAgKGlvbklucHV0KT1cImlvblNlYXJjaEJhckNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInQ09NTU9OLkJUTl9TRUFSQ0gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgID48L2lvbi1zZWFyY2hiYXI+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICA8IS0tIEN1c3RvbSBoZWFkZXIgLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJwYW5lbEhlYWRlclRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBpdGVtQ291bnQ6IGl0ZW1Db3VudCB9XCJcbiAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDwhLS0gSGVhZGVycyAtLT5cbiAgICAgICAgICAgICAgPGlvbi1yb3dcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1zZWxlY3QtaGVhZGVyIGNvbHVtbiBzdGlja3kgaW9uLW5vLXBhZGRpbmdcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5tdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm1hdC1zZWxlY3Qtc2VhcmNoYmFyLXN0aWNreV09XCJzaG93U2VhcmNoQmFyICYmIHN0aWNreVNlYXJjaEJhclwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLi0taW9uLWdyaWQtY29sdW1uc109XCJoYXNGYXZvcml0ZXMgPyAxMyA6IDEyXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwhLS0gZmF2b3JpdGUgc3BhY2VyIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoaGFzRmF2b3JpdGVzKSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiIGNsYXNzPVwiZmF2b3JpdGUtY29sXCI+PC9pb24tY29sPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8IS0tIGF0dHJpYnV0ZSBoZWFkZXJzIC0tPlxuICAgICAgICAgICAgICAgIEBmb3IgKGF0dHIgb2YgZGlzcGxheUF0dHJpYnV0ZXM7IHRyYWNrIGF0dHI7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLWNvbCBbc2l6ZV09XCJkaXNwbGF5Q29sdW1uU2l6ZXNbaV1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBbaW5uZXJIVE1MXT1cImRpc3BsYXlDb2x1bW5OYW1lc1tpXSB8IHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9pb24tcm93PlxuXG4gICAgICAgICAgICAgIDwhLS0gTm9uZSBvcHRpb24gLS0+XG4gICAgICAgICAgICAgIEBpZiAoIXJlcXVpcmVkICYmICFtdWx0aXBsZSAmJiAhY2xlYXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbD48aSB0cmFuc2xhdGU+Q09NTU9OLkVNUFRZX09QVElPTjwvaT48L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKF8kZmlsdGVyZWRJdGVtcyB8IHB1c2g6ICd1c2VyQmxvY2tpbmcnOyBhcyBpdGVtcykge1xuICAgICAgICAgICAgICAgIDwhLS0gTm8gaXRlbSBvcHRpb24gLS0+XG4gICAgICAgICAgICAgICAgQGlmIChpdGVtcyB8IGlzRW1wdHlBcnJheSkge1xuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJpb24tcGFkZGluZyB0ZXh0LWl0YWxpY1wiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxpPnt7IG5vUmVzdWx0TWVzc2FnZSB8IHRyYW5zbGF0ZSB9fTwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8IS0tIE9wdGlvbnMgLS0+XG4gICAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGl0ZW1zOyB0cmFjayBpOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBAbGV0IGlzRmF2b3JpdGUgPSBoYXNGYXZvcml0ZXMgJiYgKGZhdm9yaXRlSXRlbXMgfCBhcnJheUluY2x1ZGVzOiBpdGVtKTtcblxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbVwiIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIiBbY2xhc3MubWRjLWxpc3QtaXRlbS0tZmF2b3JpdGVdPVwiaXNGYXZvcml0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24tcm93IFtjbGFzc0xpc3RdPVwiaXRlbT8uY2xhc3NMaXN0IHx8ICcnXCIgW3N0eWxlLi0taW9uLWdyaWQtY29sdW1uc109XCJoYXNGYXZvcml0ZXMgPyAxMyA6IDEyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGZhdm9yaXRlIGljb24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhhc0Zhdm9yaXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiIGNsYXNzPVwiZmF2b3JpdGUtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpc0Zhdm9yaXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInN0YXJcIiBjb2xvcj1cInRlcnRpYXJ5XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhdHRyaWJ1dGUgY29sdW1ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKHBhdGggb2YgZGlzcGxheUF0dHJpYnV0ZXM7IHRyYWNrIGo7IGxldCBqID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tY29sIFtzaXplXT1cImRpc3BsYXlDb2x1bW5TaXplc1tqXVwiIGNsYXNzPVwiaW9uLWFsaWduLXNlbGYtY2VudGVyIGlvbi10ZXh0LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcm9wZXJ0eUdldDogcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaGlnaGxpZ2h0OiB7IHNlYXJjaDogaW9uU2VhcmNoYmFyPy52YWx1ZSwgd2l0aEFjY2VudDogaGlnaGxpZ2h0QWNjZW50IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwhLS0gTW9yZSBpdGVtIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoX21vcmVJdGVtc0NvdW50KSB7XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1wYWRkaW5nIG1hdC1wc2V1ZG8tY2hlY2tib3gtaGlkZGVuXCIgKG5nSW5pdCk9XCJfaW5pdE1hdFNlbGVjdEluZmluaXRlU2Nyb2xsKClcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIGlmICgoX2Rpc3BsYXlWYWx1ZSB8IHN0ckxlbmd0aCkgPCBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBuZWVkIG1vcmUgY2hhcmFjdGVyIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiaW9uLXBhZGRpbmcgdGV4dC1pdGFsaWMgbWF0LXBzZXVkby1jaGVja2JveC1oaWRkZW5cIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdJTkZPLlBMRUFTRV9UWVBFX01PUkVfQ0hBUkFDVEVSUycgfCB0cmFuc2xhdGU6IHsgbWluTGVuZ3RoOiBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkIH0gfX1cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPCEtLSBsb2FkaW5nIHNwaW5uZXIgLS0+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJpb24tcGFkZGluZyBtYXQtcHNldWRvLWNoZWNrYm94LWhpZGRlblwiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgPCEtLSBmb290ZXIgLS0+XG4gICAgICAgICAgICAgIEBpZiAoc2hvd1BhbmVsRm9vdGVyICYmIGl0ZW1Db3VudDsgYXMgY291bnQpIHtcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cIm1hdC1vcHRpb24tZm9vdGVyIG1hdC1hdXRvY29tcGxldGUtZm9vdGVyIG1hdC1wc2V1ZG8tY2hlY2tib3gtaGlkZGVuIGlvbi1uby1wYWRkaW5nXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJpb24tZmxvYXQtZW5kIGlvbi1wYWRkaW5nLWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8aT57eyAnQ09NTU9OLlJFU1VMVF9DT1VOVCcgfCB0cmFuc2xhdGU6IHsgY291bnQ6IGNvdW50IH0gfX08L2k+XG4gICAgICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIDwhLS0gQ3VzdG9tIGZvb3RlciAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBhbmVsRm9vdGVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGl0ZW1Db3VudDogaXRlbUNvdW50IH1cIlxuICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8IS0tIGRlc2t0b3AgKHVzZSBtYXQtYXV0b2NvbXBsZXRlKSAtLT5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAjbWF0SW5wdXRUZXh0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlUG9zaXRpb25dPVwibWF0QXV0b2NvbXBsZXRlUG9zaXRpb25cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiKGxhYmVsIHx8IGZsb2F0TGFiZWwgPT09ICduZXZlcicpICYmIHBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW2FwcEF1dG9mb2N1c109XCJhdXRvZm9jdXNcIlxuICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiX3RhYmluZGV4XCJcbiAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrZWQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cImZpbHRlcklucHV0VGV4dEZvY3VzRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChibHVyKT1cImZpbHRlcklucHV0VGV4dEJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImVtaXRFc2NhcGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXlkb3duLmJhY2tzcGFjZSk9XCJvbkJhY2tzcGFjZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImVtaXRFbnRlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmFycm93VXApPVwiZW1pdEFycm93VXAoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXl1cC5hcnJvd0Rvd24pPVwiZW1pdEFycm93RG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8IS0tIGF1dG9jb21wbGV0ZSAtLT5cbiAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICNhdXRvY29tcGxldGU9XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICBbYXV0b0FjdGl2ZUZpcnN0T3B0aW9uXT1cInRydWVcIlxuICAgICAgICAgICAgICBbaGlkZVNpbmdsZVNlbGVjdGlvbkluZGljYXRvcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlXaXRoXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cInBhbmVsQ2xhc3NcIlxuICAgICAgICAgICAgICBbcGFuZWxXaWR0aF09XCJwYW5lbFdpZHRoXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVSaXBwbGVdPVwiZGlzYWJsZVJpcHBsZVwiXG4gICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvbk9wdGlvblNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAob3BlbmVkKT1cIm9wZW5lZENoYW5nZS5lbWl0KHRydWUpXCJcbiAgICAgICAgICAgICAgKGNsb3NlZCk9XCJvcGVuZWRDaGFuZ2UuZW1pdChmYWxzZSlcIlxuICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICAgIDwhLS0gQ3VzdG9tIGhlYWRlciAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBhbmVsSGVhZGVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGl0ZW1Db3VudDogaXRlbUNvdW50IH1cIlxuICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPCEtLSBIZWFkZXJzIC0tPlxuICAgICAgICAgICAgICBAaWYgKHNob3dQYW5lbEhlYWRlcikge1xuICAgICAgICAgICAgICAgIDxpb24tcm93XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1hdXRvY29tcGxldGUtaGVhZGVyIGNvbHVtbiBzdGlja3kgaW9uLW5vLXBhZGRpbmdcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLi0taW9uLWdyaWQtY29sdW1uc109XCJoYXNGYXZvcml0ZXMgPyAxMyA6IDEyXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8IS0tIGZhdm9yaXRlIHNwYWNlciAtLT5cbiAgICAgICAgICAgICAgICAgIEBpZiAoaGFzRmF2b3JpdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCIgY2xhc3M9XCJmYXZvcml0ZS1jb2xcIj48L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAZm9yIChhdHRyIG9mIGRpc3BsYXlBdHRyaWJ1dGVzOyB0cmFjayBhdHRyOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbCBbc2l6ZV09XCJkaXNwbGF5Q29sdW1uU2l6ZXNbaV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIFtpbm5lckhUTUxdPVwiZGlzcGxheUNvbHVtbk5hbWVzW2ldIHwgdHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChfJGZpbHRlcmVkSXRlbXMgfCBwdXNoOiAndXNlckJsb2NraW5nJzsgYXMgaXRlbXMpIHtcbiAgICAgICAgICAgICAgICA8IS0tIE5vIGl0ZW0gb3B0aW9uIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoaXRlbXMgfCBpc0VtcHR5QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiaW9uLXBhZGRpbmcgdGV4dC1pdGFsaWNcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8aT57eyBub1Jlc3VsdE1lc3NhZ2UgfCB0cmFuc2xhdGUgfX08L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgPCEtLSBPcHRpb25zIC0tPlxuICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBpdGVtczsgdHJhY2sgaTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgQGxldCBpc0Zhdm9yaXRlID0gaGFzRmF2b3JpdGVzICYmIChmYXZvcml0ZUl0ZW1zIHwgYXJyYXlJbmNsdWRlczogaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5tZGMtbGlzdC1pdGVtLS1zZWxlY3RlZF09XCJpdGVtID09PSBfc2VsZWN0ZWRJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWRjLWxpc3QtaXRlbS0tZmF2b3JpdGVdPVwiaXNGYXZvcml0ZVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aW9uLXJvdyBbY2xhc3NMaXN0XT1cIml0ZW0/LmNsYXNzTGlzdCB8fCAnJ1wiIFtzdHlsZS4tLWlvbi1ncmlkLWNvbHVtbnNdPVwiaGFzRmF2b3JpdGVzID8gMTMgOiAxMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBmYXZvcml0ZSBpY29uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChoYXNGYXZvcml0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1jb2xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRQcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXZvcml0ZS1jb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVGYXZvcml0ZUNsaWNrKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpc0Zhdm9yaXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInN0YXJcIiBjb2xvcj1cInRlcnRpYXJ5XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIGlmICh0b2dnbGVGYXZvcml0ZS5vYnNlcnZlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJzdGFyLW91dGxpbmVcIiBjb2xvcj1cIm1lZGl1bVwiIGNsYXNzPVwidmlzaWJsZS1ob3ZlclwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChwYXRoIG9mIGRpc3BsYXlBdHRyaWJ1dGVzOyB0cmFjayBqOyBsZXQgaiA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cImRpc3BsYXlDb2x1bW5TaXplc1tqXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/IHRleHQuaW5uZXJUZXh0IDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gdGV4dC5pbm5lclRleHQgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpb24tYWxpZ24tc2VsZi1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcm9wZXJ0eUdldDogcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoaWdobGlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2g6IG1hdElucHV0VGV4dC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhBY2NlbnQ6IGhpZ2hsaWdodEFjY2VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwhLS0gTW9yZSBpdGVtIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoX21vcmVJdGVtc0NvdW50KSB7XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1wYWRkaW5nXCIgKG5nSW5pdCk9XCJfaW5pdEF1dG9jb21wbGV0ZUluZmluaXRlU2Nyb2xsKClcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIGlmICgoX2Rpc3BsYXlWYWx1ZSB8IHN0ckxlbmd0aCkgPCBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBOZWVkIG1vcmUgY2hhcmFjdGVycyAtLT5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1wYWRkaW5nIHRleHQtaXRhbGljXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICB7eyAnSU5GTy5QTEVBU0VfVFlQRV9NT1JFX0NIQVJBQ1RFUlMnIHwgdHJhbnNsYXRlOiB7IG1pbkxlbmd0aDogc3VnZ2VzdExlbmd0aFRocmVzaG9sZCB9IH19XG4gICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDwhLS0gTG9hZGluZyBzcGlubmVyIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiaW9uLXBhZGRpbmdcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIDwhLS0gZm9vdGVyIC0tPlxuICAgICAgICAgICAgICBAaWYgKHNob3dQYW5lbEZvb3RlciAmJiBpdGVtQ291bnQ7IGFzIGNvdW50KSB7XG4gICAgICAgICAgICAgICAgPGlvbi1yb3cgY2xhc3M9XCJtYXQtYXV0b2NvbXBsZXRlLWZvb3RlciBpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cImlvbi1mbG9hdC1lbmQgaW9uLXBhZGRpbmctZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGk+e3sgJ0NPTU1PTi5SRVNVTFRfQ09VTlQnIHwgdHJhbnNsYXRlOiB7IGNvdW50OiBjb3VudCB9IH19PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIDwhLS0gQ3VzdG9tIGZvb3RlciAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBhbmVsRm9vdGVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGl0ZW1Db3VudDogaXRlbUNvdW50IH1cIlxuICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICB9XG4gICAgICAgICAgPCEtLVxuICAgICAgICAgIE5PVEUgOlxuICAgICAgICAgIC0gXCJzZWxlY3RJbnB1dENvbnRlbnQoJGV2ZW50KSB8fCBvbkZvY3VzLmVtaXQoJGV2ZW50KVwiIDogY2FsbCBvbkZvY3VzIG9ubHkgd2hlbiB0byB0aGUgaW5wdXQgaXMgZW1wdHkgKG5vdGhpbmcgdG8gc2VsZWN0KVxuICAgICAgICAgIC0tPlxuICAgICAgICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcbiAgICAgICAgICAgIDxtYXQtZXJyb3IgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdlbnRpdHknKSkge1xuICAgICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfSU5WQUxJRDwvbWF0LWVycm9yPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0RXJyb3JUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwhLS0gSGludHMgLS0+XG4gICAgICAgICAgQGlmICghZm9ybUNvbnRyb2w/LmludmFsaWQpIHtcbiAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEhpbnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICB9XG4gICAgPC9pb24tY29sPlxuICAgIDxpb24tY29sIFtzaXplXT1cImNvbFNpemVzPy5bMV1cIiBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0QWZ0ZXJdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvaW9uLWNvbD5cbiAgPC9pb24tcm93PlxuPC9pb24tZ3JpZD5cblxuPG5nLXRlbXBsYXRlICNtYXRQcmVmaXhUZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFByZWZpeF1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21hdFN1ZmZpeFRlbXBsYXRlPlxuICBAaWYgKCFtb2JpbGUpIHtcbiAgICA8YnV0dG9uXG4gICAgICBtYXRTdWZmaXhcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVTaG93UGFuZWwoJGV2ZW50KVwiXG4gICAgICBbaGlkZGVuXT1cImRpc2FibGVkXCJcbiAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoZHJvcEJ1dHRvblRpdGxlIHx8ICcnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKGRyb3BCdXR0b25UaXRsZSB8fCAnJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPnt7IG1vYmlsZSA/ICdhcnJvd19kcm9wX2Rvd24nIDogJ2tleWJvYXJkX2Fycm93X2Rvd24nIH19PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgfVxuICBAaWYgKGNsZWFyYWJsZSkge1xuICAgIDxidXR0b25cbiAgICAgIG1hdFN1ZmZpeFxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoJGV2ZW50KVwiXG4gICAgICBbaGlkZGVuXT1cImRpc2FibGVkIHx8ICFmb3JtQ29udHJvbC52YWx1ZVwiXG4gICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKGNsZWFyQnV0dG9uVGl0bGUgfHwgJycgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyAoY2xlYXJCdXR0b25UaXRsZSB8fCAnJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgfVxuXG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtYXRFcnJvclRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtZXJyb3IsW21hdEVycm9yXVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0SGludFRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtd3JhcHBlclwiPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50Om5vdChbYWxpZ249J2VuZCddKSxbbWF0SGludF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXNwYWNlclwiPjwvZGl2PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50W2FsaWduPSdlbmQnXVwiPjwvbmctY29udGVudD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
1504
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuYXV0b2NvbXBsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL21hdGVyaWFsLmF1dG9jb21wbGV0ZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2F1dG9jb21wbGV0ZS9tYXRlcmlhbC5hdXRvY29tcGxldGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUVOLEtBQUssRUFDTCxlQUFlLEVBR2YsUUFBUSxFQUNSLE1BQU0sRUFHTixtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUEyQyxpQkFBaUIsRUFBc0IsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0gsT0FBTyxFQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3BHLE9BQU8sRUFBQyxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzdJLE9BQU8sRUFBcUMsWUFBWSxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDckcsT0FBTyxFQUNMLHNCQUFzQixFQUV0QixtQkFBbUIsRUFDbkIsZUFBZSxFQUVmLEtBQUssRUFDTCxZQUFZLEVBQ1osZUFBZSxFQUNm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U0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQVN6QixRQUFRO3NCQUFwQixLQUFLO2dCQVNPLEtBQUs7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIGluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBudW1iZXJBdHRyaWJ1dGUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBQcm92aWRlcixcbiAgUmVuZGVyZXIyLFxuICBSZW5kZXJlclN0eWxlRmxhZ3MyLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Hcm91cERpcmVjdGl2ZSwgTkdfVkFMVUVfQUNDRVNTT1IsIFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGlzT2JzZXJ2YWJsZSwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGltZXJ9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCwgdGhyb3R0bGVUaW1lfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0ZldGNoTW9yZUZuLCBMb2FkUmVzdWx0LCBTdWdnZXN0Rm4sIHRvTG9hZFJlc3VsdH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtcbiAgY2hhbmdlQ2FzZVRvVW5kZXJzY29yZSxcbiAgZXF1YWxzLFxuICBmaW5kUGFyZW50V2l0aENsYXNzLFxuICBmaXJzdEFycmF5VmFsdWUsXG4gIGlzRW1wdHlBcnJheSxcbiAgaXNOaWwsXG4gIGlzTmlsT3JCbGFuayxcbiAgaXNOb3RFbXB0eUFycmF5LFxuICBpc05vdE5pbCxcbiAgaXNOb3ROaWxPYmplY3QsXG4gIGlzTm90TmlsT3JCbGFuayxcbiAgaXNOb3ROaWxTdHJpbmcsXG4gIHByb3BlcnRpZXNQYXRoQ29tcGFyYXRvclxufSBmcm9tICcuLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHtmb2N1c0lucHV0LCBJbnB1dEVsZW1lbnQsIHNlbGVjdElucHV0Q29udGVudCwgc2VsZWN0SW5wdXRSYW5nZX0gZnJvbSAnLi4vLi4vaW5wdXRzJztcbmltcG9ydCB7SU5QVVRfRklFTERfQUNDRVNTT1IsIFRleHRDb250cm9sRmllbGRBY2Nlc3Nvcn0gZnJvbSAnLi4vLi4vZmllbGQtYWNjZXNzb3InO1xuaW1wb3J0IHtmaXJzdE5vdE5pbFByb21pc2UsIHdhaXRGb3J9IGZyb20gJy4uLy4uL29ic2VydmFibGVzJztcbmltcG9ydCB7TWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSwgU3Vic2NyaXB0U2l6aW5nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7TWF0T3B0aW9uLCBNYXRTZWxlY3QsIE1hdFNlbGVjdENoYW5nZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlLCBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50LCBNYXRBdXRvY29tcGxldGVUcmlnZ2VyfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHtmcm9tU2Nyb2xsRW5kRXZlbnR9IGZyb20gJy4uLy4uL2V2ZW50cyc7XG5pbXBvcnQge0lvblNlYXJjaGJhciwgTW9kYWxDb250cm9sbGVyfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQge2lzTW9iaWxlfSBmcm9tICcuLi8uLi9wbGF0Zm9ybXMnO1xuaW1wb3J0IHtzdWdnZXN0RnJvbUFycmF5fSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQge1NlYXJjaGJhckNoYW5nZUV2ZW50RGV0YWlsfSBmcm9tICdAaW9uaWMvY29yZS9kaXN0L3R5cGVzL2NvbXBvbmVudHMvc2VhcmNoYmFyL3NlYXJjaGJhci1pbnRlcmZhY2UnO1xuaW1wb3J0IHtNYXRBdXRvY29tcGxldGVGaWVsZFV0aWxzfSBmcm9tICcuL21hdGVyaWFsLmF1dG9jb21wbGV0ZS51dGlscyc7XG5pbXBvcnQge01hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnfSBmcm9tICcuL21hdGVyaWFsLmF1dG9jb21wbGV0ZS5jb25maWcnO1xuXG5cbmltcG9ydCB7QVBQX1NIT1dfVE9PTFRJUCwgREVGQVVMVF9KT0lOX1BST1BFUlRJRVNfU0VQQVJBVE9SfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHtSZWdFeHBVdGlsc30gZnJvbSAnLi4vLi4vcmVnZXhwcyc7XG5pbXBvcnQge0FwcEZsb2F0TGFiZWxUeXBlLCBEaXNwbGF5Rm4sIEVxdWFsc0ZufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge01hdGVyaWFsQXV0b2NvbXBsZXRlRm9vdGVyRGlyZWN0aXZlLCBNYXRlcmlhbEF1dG9jb21wbGV0ZUhlYWRlckRpcmVjdGl2ZX0gZnJvbSAnLi9tYXRlcmlhbC5hdXRvY29tcGxldGUuZGlyZWN0aXZlJztcbmltcG9ydCB7QXBwRm9ybVV0aWxzfSBmcm9tICcuLi8uLi8uLi9jb3JlL2Zvcm0vZm9ybS51dGlscyc7XG5pbXBvcnQge0ZvY3VzT3JpZ2lufSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcbmV4cG9ydCBpbnRlcmZhY2UgTWF0QXV0b2NvbXBsZXRlRmllbGRTZWxlY3RDaGFuZ2Uge1xuICBzb3VyY2U6IE1hdFNlbGVjdCB8IE1hdEF1dG9jb21wbGV0ZTtcbiAgdmFsdWU6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXRBdXRvY29tcGxldGVGaWVsZFRvZ2dsZUZhdm9yaXRlIHtcbiAgc291cmNlOiBNYXRTZWxlY3QgfCBNYXRBdXRvY29tcGxldGU7XG4gIHZhbHVlOiBhbnk7XG59XG5cbmNvbnN0IERFRkFVTFRfVkFMVUVfQUNDRVNTT1I6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0QXV0b2NvbXBsZXRlRmllbGQpLFxuICBtdWx0aTogdHJ1ZSxcbn07XG5cbmNvbnN0IElOUFVUX0ZJRUxEX0FDQ0VTU09SX1BST1ZJREVSOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogSU5QVVRfRklFTERfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1hdEF1dG9jb21wbGV0ZUZpZWxkKSxcbn07XG5cbkBDb21wb25lbnQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdtYXQtYXV0b2NvbXBsZXRlLWZpZWxkJyxcbiAgICBzdHlsZVVybHM6IFsnLi9tYXRlcmlhbC5hdXRvY29tcGxldGUuc2NzcyddLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9tYXRlcmlhbC5hdXRvY29tcGxldGUuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbREVGQVVMVF9WQUxVRV9BQ0NFU1NPUiwgSU5QVVRfRklFTERfQUNDRVNTT1JfUFJPVklERVJdLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHN0YW5kYWxvbmU6IGZhbHNlXG59KVxuZXhwb3J0IGNsYXNzIE1hdEF1dG9jb21wbGV0ZUZpZWxkIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIElucHV0RWxlbWVudCwgVGV4dENvbnRyb2xGaWVsZEFjY2Vzc29yLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHByaXZhdGUgX29uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIF9vblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG5cbiAgcHJpdmF0ZSBfb25GZXRjaE1vcmVDYWxsYmFjazogRmV0Y2hNb3JlRm48TG9hZFJlc3VsdDxhbnk+PjtcbiAgcHJpdmF0ZSBfaW1wbGljaXRWYWx1ZTogYW55O1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgX2l0ZW1zU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgX29wZW5lZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF8kZmlsdGVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgX2l0ZW1Db3VudDogbnVtYmVyO1xuICBwcml2YXRlIF9zdWdnZXN0RXhlY3V0aW9uSWQ6IG51bWJlciA9IDA7IC8vIElkZW50aWZpZXIgb2YgdGhlIHN1Z2dlc3Qgam9iXG4gIHByaXZhdGUgX3JlbG9hZCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcm90ZWN0ZWQgX3JlYWRvbmx5ID0gZmFsc2U7XG4gIHByb3RlY3RlZCBfdGFiaW5kZXg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF8kaW5wdXRJdGVtcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBfJGZpbHRlcmVkSXRlbXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgX3NlbGVjdGVkSXRlbTogYW55O1xuICBwcm90ZWN0ZWQgX2Rpc3BsYXlWYWx1ZSA9ICcnO1xuICBwcm90ZWN0ZWQgX2hpZGRlblNlYXJjaFRleHQgPSAnJztcbiAgcHJvdGVjdGVkIF9tb3JlSXRlbXNDb3VudDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX2ZldGNoTW9yZSQgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICBwcm90ZWN0ZWQgX2RlZmF1bHRQYW5lbFdpZHRoOiBzdHJpbmcgPSBudWxsO1xuICBwcm90ZWN0ZWQgX2ZvY3VzZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9wYW5lbENsb3NlZEF0VGltZTogbnVtYmVyO1xuXG4gIHByb3RlY3RlZCBnZXQgc2VhcmNoVGV4dCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1hdElucHV0VGV4dD8ubmF0aXZlRWxlbWVudC52YWx1ZSA/PyB0aGlzLmlvblNlYXJjaGJhcj8udmFsdWUgPz8gdGhpcy5faGlkZGVuU2VhcmNoVGV4dDtcbiAgfVxuICBwcm90ZWN0ZWQgc2hvd1Rvb2x0aXAgPSBpbmplY3QoQVBQX1NIT1dfVE9PTFRJUCwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICBASW5wdXQoKSBlcXVhbHM6IEVxdWFsc0ZuO1xuICBASW5wdXQoKSBsb2dQcmVmaXggPSAnW21hdC1hdXRvY29tcGxldGVdJztcbiAgQElucHV0KCkgZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgQElucHV0KCkgZm9ybUNvbnRyb2xOYW1lOiBzdHJpbmcgPSBudWxsO1xuICBASW5wdXQoKSBmbG9hdExhYmVsOiBBcHBGbG9hdExhYmVsVHlwZSA9ICdhdXRvJztcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9IG51bGw7XG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2U7XG4gIEBJbnB1dCgpIHN1YnNjcmlwdFNpemluZzogU3Vic2NyaXB0U2l6aW5nO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBzdWdnZXN0Rm46IFN1Z2dlc3RGbjxhbnksIGFueT47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByZXF1aXJlZCA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgaGlkZVJlcXVpcmVkTWFya2VyID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBtb2JpbGU6IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93UGFuZWxIZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd1BhbmVsRm9vdGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNsZWFyYWJsZSA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBkZWJvdW5jZVRpbWU6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCgpIGRpc3BsYXlTZXBhcmF0b3I6IHN0cmluZyB8IG51bGw7XG4gIEBJbnB1dCgpIGRpc3BsYXlXaXRoOiBEaXNwbGF5Rm4gfCBudWxsO1xuICBASW5wdXQoKSBkaXNwbGF5QXR0cmlidXRlczogc3RyaW5nW107XG4gIEBJbnB1dCgpIGRpc3BsYXlDb2x1bW5TaXplczogKG51bWJlciB8ICdhdXRvJyB8IHVuZGVmaW5lZClbXTtcbiAgQElucHV0KCkgZGlzcGxheUNvbHVtbk5hbWVzOiBzdHJpbmdbXTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGhpZ2hsaWdodEFjY2VudDogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dBbGxPbkZvY3VzOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd1BhbmVsT25Gb2N1czogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHJlbG9hZEl0ZW1zT25Gb2N1czogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNsZWFySW52YWxpZFZhbHVlT25CbHVyOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgYXV0b2ZvY3VzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbmZpZzogTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWc7XG4gIEBJbnB1dCgpIGkxOG5QcmVmaXggPSAnUkVGRVJFTlRJQUwuJztcbiAgQElucHV0KCkgbm9SZXN1bHRNZXNzYWdlID0gJ0NPTU1PTi5OT19SRVNVTFQnO1xuICBASW5wdXQoKSBwYW5lbENsYXNzOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBhbmVsV2lkdGg6IHN0cmluZztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRpc2FibGVSaXBwbGUgPSBmYWxzZTtcbiAgQElucHV0KCkgbWF0QXV0b2NvbXBsZXRlUG9zaXRpb246ICdhdXRvJyB8ICdhYm92ZScgfCAnYmVsb3cnO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbXVsdGlwbGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGZldGNoTW9yZVRocmVzaG9sZCA9ICcxNSUnO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkOiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0xvYWRpbmdTcGlubmVyID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRlYnVnID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93U2VhcmNoQmFyID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHN0aWNreVNlYXJjaEJhciA9IGZhbHNlO1xuICBASW5wdXQoKSBhcHBseUltcGxpY2l0VmFsdWU6IGJvb2xlYW4gfCAoKHZhbHVlOiBhbnkpID0+IGJvb2xlYW4pO1xuICBASW5wdXQoKSBkcm9wQnV0dG9uVGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgY2xlYXJCdXR0b25UaXRsZTogc3RyaW5nO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgdHJpbVNlYXJjaFRleHQ6IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzcGxpdFNlYXJjaFRleHQ6IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBzZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzRGVsYXk6IG51bWJlcjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHByZXZpZXdJbXBsaWNpdFZhbHVlOiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93RmF2b3JpdGVzID0gdHJ1ZTtcbiAgQElucHV0KCkgdG9nZ2xlRmF2b3JpdGVUaXRsZSA9ICdDT01NT04uQlROX0FERF9UT19GQVZPUklURVMnO1xuICBASW5wdXQoKSBmYXZvcml0ZUl0ZW1zOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBjb2xTaXplczogW251bWJlciB8ICdhdXRvJywgbnVtYmVyIHwgJ2F1dG8nXSA9IFt1bmRlZmluZWQsICdhdXRvJ107XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBwYW5lbENsYXNzIGluc3RlYWRcbiAgICovXG4gIEBJbnB1dCh7IGFsaWFzOiAnY2xhc3MnIH0pIHNldCBjbGFzc0xpc3QodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMucGFuZWxDbGFzcyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGNsYXNzTGlzdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhbmVsQ2xhc3M7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgnY2xpY2snKSBjbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgnYmx1cicpIGJsdXJyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCdmb2N1cycpIGZvY3VzZWRDaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PigpO1xuICBAT3V0cHV0KCkgZHJvcEJ1dHRvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4odHJ1ZSk7XG4gIEBPdXRwdXQoJ2tleWRvd24uZXNjYXBlJykga2V5ZG93bkVzY2FwZSA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIEBPdXRwdXQoJ2tleWRvd24uYmFja3NwYWNlJykga2V5ZG93bkJhY2tzcGFjZSA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFByZWZlciB1c2luZyB0aGUgYEBPdXRwdXQoJ2VudGVyJylgIGluc3RlYWRcbiAgICovXG4gIEBPdXRwdXQoJ2tleXVwLmVudGVyJykga2V5dXBFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgnYXJyb3dVcCcpIGFycm93VXAgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50IHwgS2V5Ym9hcmRFdmVudD4oKTtcbiAgQE91dHB1dCgnYXJyb3dEb3duJykgYXJyb3dEb3duID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudCB8IEtleWJvYXJkRXZlbnQ+KCk7XG4gIEBPdXRwdXQoJ2VudGVyJykgZW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50IHwgS2V5Ym9hcmRFdmVudD4oKTtcblxuICBAT3V0cHV0KCdzZWxlY3Rpb25DaGFuZ2UnKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE1hdEF1dG9jb21wbGV0ZUZpZWxkU2VsZWN0Q2hhbmdlPigpO1xuICBAT3V0cHV0KCdvcGVuZWRDaGFuZ2UnKSBvcGVuZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoJ3RvZ2dsZUZhdm9yaXRlJykgdG9nZ2xlRmF2b3JpdGUgPSBuZXcgRXZlbnRFbWl0dGVyPE1hdEF1dG9jb21wbGV0ZUZpZWxkVG9nZ2xlRmF2b3JpdGU+KCk7XG5cbiAgQFZpZXdDaGlsZCgnbWF0U2VsZWN0JykgbWF0U2VsZWN0OiBNYXRTZWxlY3Q7XG4gIEBWaWV3Q2hpbGQoJ2lvblNlYXJjaGJhcicpIGlvblNlYXJjaGJhcjogSW9uU2VhcmNoYmFyO1xuICBAVmlld0NoaWxkKCdtYXRJbnB1dFRleHQnKSBtYXRJbnB1dFRleHQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoTWF0QXV0b2NvbXBsZXRlKSBhdXRvY29tcGxldGU6IE1hdEF1dG9jb21wbGV0ZTtcbiAgQFZpZXdDaGlsZChNYXRBdXRvY29tcGxldGVUcmlnZ2VyKSBhdXRvY29tcGxldGVUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xuXG4gIEBDb250ZW50Q2hpbGQoTWF0ZXJpYWxBdXRvY29tcGxldGVIZWFkZXJEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgcGFuZWxIZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZChNYXRlcmlhbEF1dG9jb21wbGV0ZUZvb3RlckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBwYW5lbEZvb3RlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICBnZXQgZm9jdXNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9jdXNlZFxuICB9XG5cbiAgZ2V0IGNvbnRyb2xOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sTmFtZSB8fCBBcHBGb3JtVXRpbHMuZ2V0Q29udHJvbE5hbWUodGhpcy5mb3JtQ29udHJvbCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCBlbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcm90ZWN0ZWQgbW9kYWxDb250cm9sbGVyOiBNb2RhbENvbnRyb2xsZXIsXG4gICAgcHJvdGVjdGVkIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmb3JtR3JvdXBEaXI6IEZvcm1Hcm91cERpcmVjdGl2ZVxuICApIHt9XG5cbiAgZ2V0IGl0ZW1Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pdGVtQ291bnQ7XG4gIH1cblxuICBnZXQgY2FuRmV0Y2hNb3JlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrICYmIHRoaXMuX21vcmVJdGVtc0NvdW50ID4gMDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBmaWx0ZXIodmFsdWU6IGFueSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fJGZpbHRlci52YWx1ZSkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFNldHRpbmcgZmlsdGVyOlwiLCB2YWx1ZSk7XG4gICAgICB0aGlzLl8kZmlsdGVyLm5leHQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBmaWx0ZXIoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fJGZpbHRlci52YWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzZXQgcmVhZG9ubHkodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9yZWFkb25seSA9IHZhbHVlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRhYmluZGV4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl90YWJpbmRleCA9IHZhbHVlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgdGFiaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiaW5kZXg7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgaXRlbXModmFsdWU6IE9ic2VydmFibGU8YW55W10+IHwgYW55W10pIHtcbiAgICAvLyBSZW1vdmUgcHJldmlvdXMgc3Vic2NyaXB0aW9uIG9uIGl0ZW1zIChpZiBleGlzdHMpXG4gICAgaWYgKHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uKSB7XG4gICAgICBjb25zb2xlLndhcm4odGhpcy5sb2dQcmVmaXggKyAnIEl0ZW1zIHJlY2VpdmVkIHR3aWNlIScpO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZSh0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbik7XG4gICAgICB0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmIChpc09ic2VydmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbiA9IHZhbHVlLnN1YnNjcmliZSgodikgPT4gdGhpcy5fJGlucHV0SXRlbXMubmV4dCh2KSk7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl8kaW5wdXRJdGVtcy52YWx1ZSkge1xuICAgICAgICB0aGlzLl8kaW5wdXRJdGVtcy5uZXh0KHZhbHVlIGFzIGFueVtdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgaXRlbXMoKTogT2JzZXJ2YWJsZTxhbnlbXT4gfCBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuXyRpbnB1dEl0ZW1zO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbnRyb2wudmFsdWU7XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5IHx8IHRoaXMuZm9ybUNvbnRyb2wuZGlzYWJsZWQ7XG4gIH1cblxuICBnZXQgZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX3JlYWRvbmx5ICYmIHRoaXMuZm9ybUNvbnRyb2wuZW5hYmxlZDtcbiAgfVxuXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05pbCh0aGlzLl8kZmlsdGVyZWRJdGVtcy52YWx1ZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmZvcm1Db250cm9sID1cbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgPz8gKHRoaXMuZm9ybUNvbnRyb2xOYW1lICYmIHRoaXMuZm9ybUdyb3VwRGlyICYmICh0aGlzLmZvcm1Hcm91cERpci5mb3JtLmdldCh0aGlzLmZvcm1Db250cm9sTmFtZSkgYXMgVW50eXBlZEZvcm1Db250cm9sKSk7XG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG1hbmRhdG9yeSBhdHRyaWJ1dGUgJ2Zvcm1Db250cm9sJyBvciAnZm9ybUNvbnRyb2xOYW1lJyBpbiA8bWF0LWF1dG9jb21wbGV0ZS1maWVsZD4uXCIpO1xuXG4gICAgLy8gQ29uZmlndXJhdGlvbiBmcm9tIGNvbmZpZyBvYmplY3RcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuc3VnZ2VzdEZuID0gdGhpcy5zdWdnZXN0Rm4gPz8gdGhpcy5jb25maWcuc3VnZ2VzdEZuO1xuICAgICAgaWYgKCF0aGlzLnN1Z2dlc3RGbiAmJiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5jb25maWcuaXRlbXM7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlciA9IHRoaXMuZmlsdGVyID8/IHRoaXMuY29uZmlnLmZpbHRlcjtcbiAgICAgIHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMgPSB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzID8/IHRoaXMuY29uZmlnLmF0dHJpYnV0ZXM7XG4gICAgICB0aGlzLmRpc3BsYXlDb2x1bW5TaXplcyA9IHRoaXMuZGlzcGxheUNvbHVtblNpemVzID8/IHRoaXMuY29uZmlnLmNvbHVtblNpemVzO1xuICAgICAgdGhpcy5kaXNwbGF5Q29sdW1uTmFtZXMgPSB0aGlzLmRpc3BsYXlDb2x1bW5OYW1lcyA/PyB0aGlzLmNvbmZpZy5jb2x1bW5OYW1lcztcbiAgICAgIHRoaXMuZGlzcGxheVNlcGFyYXRvciA9IHRoaXMuZGlzcGxheVNlcGFyYXRvciA/PyB0aGlzLmNvbmZpZy5kaXNwbGF5V2l0aFNlcGFyYXRvcjtcbiAgICAgIHRoaXMuZGlzcGxheVdpdGggPSB0aGlzLmRpc3BsYXlXaXRoID8/IHRoaXMuY29uZmlnLmRpc3BsYXlXaXRoO1xuICAgICAgdGhpcy5zcGxpdFNlYXJjaFRleHQgPSB0aGlzLnNwbGl0U2VhcmNoVGV4dCA/PyB0aGlzLmNvbmZpZy5zcGxpdFNlYXJjaFRleHQ7XG4gICAgICB0aGlzLnRyaW1TZWFyY2hUZXh0ID0gdGhpcy50cmltU2VhcmNoVGV4dCA/PyB0aGlzLmNvbmZpZy50cmltU2VhcmNoVGV4dDtcbiAgICAgIHRoaXMuZXF1YWxzID0gdGhpcy5lcXVhbHMgPz8gdGhpcy5jb25maWcuZXF1YWxzO1xuICAgICAgdGhpcy5tdWx0aXBsZSA9IHRoaXMubXVsdGlwbGUgPz8gdGhpcy5jb25maWcubXVsdGlwbGU7XG4gICAgICB0aGlzLm1vYmlsZSA9IHRoaXMubW9iaWxlID8/IHRoaXMuY29uZmlnLm1vYmlsZTtcbiAgICAgIHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA9IHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA/PyB0aGlzLmNvbmZpZy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkO1xuICAgICAgdGhpcy5zaG93QWxsT25Gb2N1cyA9IHRoaXMuc2hvd0FsbE9uRm9jdXMgPz8gdGhpcy5jb25maWcuc2hvd0FsbE9uRm9jdXM7XG4gICAgICB0aGlzLnNob3dQYW5lbE9uRm9jdXMgPSB0aGlzLnNob3dQYW5lbE9uRm9jdXMgPz8gdGhpcy5jb25maWcuc2hvd1BhbmVsT25Gb2N1cztcbiAgICAgIHRoaXMucmVsb2FkSXRlbXNPbkZvY3VzID0gdGhpcy5yZWxvYWRJdGVtc09uRm9jdXMgPz8gdGhpcy5jb25maWcucmVsb2FkSXRlbXNPbkZvY3VzO1xuICAgICAgdGhpcy5wYW5lbENsYXNzID0gdGhpcy5wYW5lbENsYXNzID8/IHRoaXMuY29uZmlnLnBhbmVsQ2xhc3MgPz8gdGhpcy5jb25maWcuY2xhc3M7XG4gICAgICB0aGlzLnBhbmVsV2lkdGggPSB0aGlzLnBhbmVsV2lkdGggPz8gdGhpcy5jb25maWcucGFuZWxXaWR0aDtcbiAgICAgIHRoaXMuZGVib3VuY2VUaW1lID0gdGhpcy5kZWJvdW5jZVRpbWUgPz8gdGhpcy5jb25maWcuZGVib3VuY2VUaW1lO1xuICAgICAgdGhpcy5oaWdobGlnaHRBY2NlbnQgPSB0aGlzLmhpZ2hsaWdodEFjY2VudCA/PyB0aGlzLmNvbmZpZy5oaWdobGlnaHRBY2NlbnQ7XG4gICAgICB0aGlzLmFwcGx5SW1wbGljaXRWYWx1ZSA9IHRoaXMuYXBwbHlJbXBsaWNpdFZhbHVlID8/IHRoaXMuY29uZmlnLmFwcGx5SW1wbGljaXRWYWx1ZTtcbiAgICAgIHRoaXMuc2VsZWN0SW5wdXRDb250ZW50T25Gb2N1cyA9IHRoaXMuc2VsZWN0SW5wdXRDb250ZW50T25Gb2N1cyA/PyB0aGlzLmNvbmZpZy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzO1xuICAgICAgdGhpcy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzRGVsYXkgPSB0aGlzLnNlbGVjdElucHV0Q29udGVudE9uRm9jdXNEZWxheSA/PyB0aGlzLmNvbmZpZy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzRGVsYXk7XG4gICAgICB0aGlzLmNsZWFySW52YWxpZFZhbHVlT25CbHVyID0gdGhpcy5jbGVhckludmFsaWRWYWx1ZU9uQmx1ciA/PyB0aGlzLmNvbmZpZy5jbGVhckludmFsaWRWYWx1ZU9uQmx1cjtcbiAgICAgIHRoaXMucHJldmlld0ltcGxpY2l0VmFsdWUgPSB0aGlzLnByZXZpZXdJbXBsaWNpdFZhbHVlID8/IHRoaXMuY29uZmlnLnByZXZpZXdJbXBsaWNpdFZhbHVlO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdmFsdWVzXG4gICAgdGhpcy5yZXF1aXJlZCA9IHRoaXMucmVxdWlyZWQgPz8gdGhpcy5mb3JtQ29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgdGhpcy5tdWx0aXBsZSA9IHRoaXMubXVsdGlwbGUgPz8gZmFsc2U7XG4gICAgdGhpcy5tb2JpbGUgPSB0aGlzLm1vYmlsZSA/PyBpc01vYmlsZSh3aW5kb3cpO1xuICAgIHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMgPSB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzID8/IHRoaXMuZmlsdGVyPy5hdHRyaWJ1dGVzID8/IFsnbGFiZWwnLCAnbmFtZSddO1xuICAgIHRoaXMuZGlzcGxheVNlcGFyYXRvciA9IHRoaXMuZGlzcGxheVNlcGFyYXRvciA/PyBERUZBVUxUX0pPSU5fUFJPUEVSVElFU19TRVBBUkFUT1I7XG4gICAgdGhpcy5kaXNwbGF5V2l0aCA9IHRoaXMuZGlzcGxheVdpdGggfHwgTWF0QXV0b2NvbXBsZXRlRmllbGRVdGlscy5jcmVhdGVEaXNwbGF5Rm4odGhpcy5kaXNwbGF5QXR0cmlidXRlcywgdGhpcy5tdWx0aXBsZSwgdGhpcy5kaXNwbGF5U2VwYXJhdG9yKTtcbiAgICB0aGlzLnNwbGl0U2VhcmNoVGV4dCA9IHRoaXMuc3BsaXRTZWFyY2hUZXh0ID8/IHRydWU7XG4gICAgdGhpcy50cmltU2VhcmNoVGV4dCA9IHRoaXMudHJpbVNlYXJjaFRleHQgPz8gIXRoaXMubW9iaWxlOyAvLyBUcnVlIGJ5IGRlZmF1bHQgb24gZGVza3RvcCwgYnV0IGZhbHNlIGluIG1vYmlsZSAobm90IG5lZWQgaW4gdGhlIHNlYXJjaGJhcilcbiAgICB0aGlzLmVxdWFscyA9IHRoaXMuZXF1YWxzIHx8IE1hdEF1dG9jb21wbGV0ZUZpZWxkVXRpbHMuZGVmYXVsdEVxdWFscztcbiAgICB0aGlzLmNvbFNpemVzID0gdGhpcy5jb2xTaXplcyA/PyBbdW5kZWZpbmVkLCAnYXV0byddO1xuXG4gICAgdGhpcy5kaXNwbGF5Q29sdW1uU2l6ZXMgPVxuICAgICAgdGhpcy5kaXNwbGF5Q29sdW1uU2l6ZXMgfHxcbiAgICAgIC8vIGlmIG9ubHkgY29sdW1uOiBhdXRvIHNpemVcbiAgICAgICh0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMSAmJiBbdW5kZWZpbmVkXSkgfHxcbiAgICAgIC8vIENvbXB1dGVkIGNvbHVtbiBzaXplOlxuICAgICAgLy8gLSBpZiBsYWJlbCB0aGVuIGNvbCBzaXplID0gMlxuICAgICAgLy8gLSBpZiByYW5rT3JkZXIgdGhlbiBjb2wgc2l6ZSA9IDFcbiAgICAgIC8vIC0gZXNlID0+IGF1dG8gc2l6ZVxuICAgICAgdGhpcy5kaXNwbGF5QXR0cmlidXRlcy5tYXAoKGF0dHIpID0+IGF0dHIgJiYgKGF0dHIuZW5kc1dpdGgoJ2xhYmVsJykgPyAzIDogYXR0ci5lbmRzV2l0aCgncmFua09yZGVyJykgPyAyIDogdW5kZWZpbmVkKSk7XG4gICAgdGhpcy5kaXNwbGF5Q29sdW1uTmFtZXMgPSB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLm1hcChcbiAgICAgIChhdHRyLCBpbmRleCkgPT4gKHRoaXMuZGlzcGxheUNvbHVtbk5hbWVzICYmIHRoaXMuZGlzcGxheUNvbHVtbk5hbWVzW2luZGV4XSkgfHwgdGhpcy5pMThuUHJlZml4ICsgY2hhbmdlQ2FzZVRvVW5kZXJzY29yZShhdHRyKS50b1VwcGVyQ2FzZSgpXG4gICAgKTtcblxuICAgIC8vIE5vIG1vcmUgbmVlZCwgYmVjYXVzZSBzZXR0aW5nIHRoZSBwYW5lbFdpZHRoIHdpbGwgZm9yY2UgYSB3aWR0aCwgaW5zdGVhZCBvZiBhIG1pbi13aWR0aFxuICAgIC8qY29uc3QgcGFuZWxDbGFzc2VzID0gdGhpcy5wYW5lbENsYXNzPy5zcGxpdCgvXFxzKy8pO1xuICAgIHRoaXMucGFuZWxXaWR0aCA9XG4gICAgICB0aGlzLnBhbmVsV2lkdGggPz9cbiAgICAgIChwYW5lbENsYXNzZXMgJiZcbiAgICAgICAgKChwYW5lbENsYXNzZXMuaW5jbHVkZXMoJ21pbi13aWR0aC1tZWRpdW0nKSAmJiAnMzAwcHgnKSB8fFxuICAgICAgICAgIChwYW5lbENsYXNzZXMuaW5jbHVkZXMoJ21pbi13aWR0aC1sYXJnZScpICYmICc0MDBweCcpIHx8XG4gICAgICAgICAgKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnbWluLXdpZHRoLXhsYXJnZScpICYmICc0NTBweCcpIHx8XG4gICAgICAgICAgKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnbWluLXdpZHRoLTgwdncnKSAmJiAnODB2dycpIHx8XG4gICAgICAgICAgKChwYW5lbENsYXNzZXMuaW5jbHVkZXMoJ2Z1bGwtd2lkdGgnKSB8fCBwYW5lbENsYXNzZXMuaW5jbHVkZXMoJ2Z1bGwtc2l6ZScpKSAmJiAnMTAwdncnKSkpOyovXG5cbiAgICB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgPSB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgPz8gMDtcbiAgICB0aGlzLnNob3dBbGxPbkZvY3VzID0gdGhpcy5zaG93QWxsT25Gb2N1cyA/PyAodGhpcy5tb2JpbGUgJiYgdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkIDw9IDApO1xuICAgIHRoaXMuc2hvd1BhbmVsT25Gb2N1cyA9IHRoaXMuc2hvd1BhbmVsT25Gb2N1cyA/PyB0cnVlO1xuICAgIHRoaXMucmVsb2FkSXRlbXNPbkZvY3VzID0gdGhpcy5yZWxvYWRJdGVtc09uRm9jdXMgPz8gZmFsc2U7XG4gICAgdGhpcy5kZWJvdW5jZVRpbWUgPSB0aGlzLmRlYm91bmNlVGltZSA/PyAodGhpcy5tb2JpbGUgPyA2NTAgOiAyNTApO1xuICAgIHRoaXMuaGlnaGxpZ2h0QWNjZW50ID0gdGhpcy5oaWdobGlnaHRBY2NlbnQgPz8gZmFsc2U7XG4gICAgdGhpcy5tYXRBdXRvY29tcGxldGVQb3NpdGlvbiA9IHRoaXMubWF0QXV0b2NvbXBsZXRlUG9zaXRpb24gPz8gJ2F1dG8nO1xuICAgIHRoaXMuYXBwbHlJbXBsaWNpdFZhbHVlID0gdGhpcy5hcHBseUltcGxpY2l0VmFsdWUgPz8gIXRoaXMubXVsdGlwbGU7XG4gICAgdGhpcy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzID0gdGhpcy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzID8/IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0SW5wdXRDb250ZW50T25Gb2N1c0RlbGF5ID0gdGhpcy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzRGVsYXkgPz8gMDtcbiAgICB0aGlzLmNsZWFySW52YWxpZFZhbHVlT25CbHVyID0gdGhpcy5jbGVhckludmFsaWRWYWx1ZU9uQmx1ciA/PyAodGhpcy5tb2JpbGUgJiYgIXRoaXMuc2hvd1NlYXJjaEJhcik7XG4gICAgdGhpcy5wcmV2aWV3SW1wbGljaXRWYWx1ZSA9IHRoaXMucHJldmlld0ltcGxpY2l0VmFsdWUgPz8gZmFsc2U7XG5cbiAgICAvLyBObyBzdWdnZXN0Rm46IGZpbHRlciBvbiB0aGUgZ2l2ZW4gaXRlbXNcbiAgICBpZiAoIXRoaXMuc3VnZ2VzdEZuKSB7XG4gICAgICBjb25zdCBzdWdnZXN0RnJvbUFycmF5Rm46IFN1Z2dlc3RGbjxhbnksIGFueT4gPSBhc3luYyAodmFsdWUsIGZpbHRlcikgPT5cbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgQ2FsbGluZyBzdWdnZXN0RnJvbUFycmF5IHdpdGggdmFsdWU9JywgdmFsdWUpO1xuXG4gICAgICAgIHN1Z2dlc3RGcm9tQXJyYXkodGhpcy5fJGlucHV0SXRlbXMudmFsdWUsIHZhbHVlLCB7XG4gICAgICAgICAgc2VhcmNoQXR0cmlidXRlczogdGhpcy5kaXNwbGF5QXR0cmlidXRlcyxcbiAgICAgICAgICAuLi5maWx0ZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBXYWl0IChvbmNlKSB0aGF0IGl0ZW1zIGFyZSBsb2FkZWQsIHRoZW4gY2FsbCBzdWdnZXN0IGZyb20gYXJyYXkgZm5cbiAgICAgIHRoaXMuc3VnZ2VzdEZuID0gYXN5bmMgKHZhbHVlLCBmaWx0ZXIpID0+IHtcbiAgICAgICAgaWYgKGlzTmlsKHRoaXMuXyRpbnB1dEl0ZW1zLnZhbHVlKSkge1xuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFdhaXRpbmcgaXRlbXMgdG8gYmUgc2V0Li4uXCIpO1xuXG4gICAgICAgICAgYXdhaXQgZmlyc3ROb3ROaWxQcm9taXNlKHRoaXMuXyRpbnB1dEl0ZW1zLCB7IHN0b3A6IHRoaXMuX2Rlc3Ryb3kkIH0pO1xuXG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgUmVjZWl2ZWQgaXRlbXM6XCIsIHRoaXMuaW5wdXRJdGVtcyQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3VnZ2VzdEZuID0gc3VnZ2VzdEZyb21BcnJheUZuO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnN1Z2dlc3RGbih2YWx1ZSwgZmlsdGVyKTsgLy8gTG9vcFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBTZW5kIHZhbHVlIHRvIHN1Z2dlc3Qgd2hlbiA6XG4gICAgLy8gLSBpcyBuaWwgYW5kICcqJywgYW5kIG5vIG1pbiBsZW5ndGggdGhyZXNob2xkXG4gICAgLy8gLSBpcyBub3QgbmlsIGFuZCBub3QgYSBzdHJpbmcgdHlwZSAoZS5nLiBvYmplY3QpXG4gICAgLy8gLSBpcyBub3QgbmlsIGFuZCBpcyBhIHN0cmluZywgYW5kIGhhcyBlbm91Z2ggY2hhcmFjdGVyXG4gICAgY29uc3QgdGhyZXNob2xkRmlsdGVyRm4gPSAodmFsdWU6IGFueSkgPT5cbiAgICAgIHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA8PSAwIHx8XG4gICAgICAoaXNOb3ROaWwodmFsdWUpICYmICghKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHx8ICh2YWx1ZSAhPT0gJyonICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPj0gdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkKSkpO1xuXG4gICAgY29uc3QgZmlsdGVyZWRJdGVtc0NoYW5nZXMgPSBtZXJnZShcbiAgICAgIC8vIFJlbG9hZCBldmVudCAobm8gZGlzdGluY3RVbnRpbENoYW5nZWQoKSBwaXBlLCB0byBmb3JjZSByZWxvYWQgZXZlbiBpZiBzYW1lIHZhbHVlKVxuICAgICAgdGhpcy5fcmVsb2FkJC5waXBlKFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5lbmFibGVkKSxcbiAgICAgICAgZmlsdGVyKHRocmVzaG9sZEZpbHRlckZuKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuc2hvd0xvYWRpbmdTcGlubmVyICYmIHRoaXMubWFya0FzTG9hZGluZygpKVxuICAgICAgKSxcblxuICAgICAgLy8gU2VhcmNoIHRleHQgKG5vIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkgYmVjYXVzZSBvZiB0aGUgZGVib3VuY2VUaW1lKCkgcGlwZSlcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgIGZpbHRlcigodmFsdWUpID0+IHRoaXMuZW5hYmxlZCAmJiBpc05vdE5pbFN0cmluZyh2YWx1ZSkpLFxuICAgICAgICAvLyBNYXJrIGFzIGxvYWRpbmcgKHRvIHNob3cgbG9hZGluZyBzcGlubmVyKSAtIGFzIHNvb24gYXMgcG9zc2libGUsIGFuZCBiZWZvcmUgZGVib3VuY2VUaW1lXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLnNob3dMb2FkaW5nU3Bpbm5lciAmJiB0aGlzLm1hcmtBc0xvYWRpbmcoKSksXG4gICAgICAgIC8vIEZpbHRlciBpZiBub3QgZW5vdWdoIGNoYXJhY3RlclxuICAgICAgICBmaWx0ZXIoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKCh2YWx1ZT8ubGVuZ3RoIHx8IDApIDwgdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgZGlzcGxheSB2YWx1ZSwgdG8gZW5hYmxlIHRoZSBtZXNzYWdlIFwibm90IGVub3VnaCBjaGFyYWN0ZXJzXCJcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSksXG4gICAgICAgIC8vIFdhaXQgYSBkZWJvdW5jZSB0aW1lXG4gICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZSlcbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy8sdGFwKCh2YWx1ZSkgPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBTZWFyY2ggdGV4dCBjaGFuZ2VzOicsIHZhbHVlKSlcbiAgICAgICksXG5cbiAgICAgIC8vIE9iamVjdCBzZXQ6IHVzZSBpdCAobm8gZGlzdGluY3RVbnRpbENoYW5nZWQoKSBwaXBlIG5lZWQpXG4gICAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICBzdGFydFdpdGg8YW55Pih0aGlzLmZvcm1Db250cm9sLnZhbHVlKSxcbiAgICAgICAgZmlsdGVyKCh2YWx1ZSkgPT4gaXNOb3ROaWxPYmplY3QodmFsdWUpKSxcbiAgICAgICAgdGFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgY29udHJvbCB2YWx1ZSBjaGFuZ2VzOicsIHZhbHVlKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZGlzcGxheSB2YWx1ZSAoaWYgbmVlZClcbiAgICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSB0aGlzLmRpc3BsYXlXaXRoKHZhbHVlKSB8fCAnJztcbiAgICAgICAgICBpZiAodGhpcy5fZGlzcGxheVZhbHVlICE9PSBkaXNwbGF5VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IGRpc3BsYXlWYWx1ZTtcblxuICAgICAgICAgICAgLy8gQXBwbHkgdG8gdGhlIGlucHV0W3R5cGU9dGV4dF0gZmllbGRcbiAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRUZXh0VmFsdWUodGhpcy5fZGlzcGxheVZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBJZiBtdWx0aXBsZTogZG8gbm90IHJlY29tcHV0ZSBpdGVtcyAob25seSBmb3IgdGhlIGZpcnN0IHRpbWUsIHdoZW4gbG9hZGluZylcbiAgICAgICAgLy8gd2hlbiBmb3JtQ29udHJvbCB2YWx1ZSBjaGFuZ2VzXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmxvYWRpbmcgfHwgKCF0aGlzLm11bHRpcGxlICYmICF0aGlzLnNob3dBbGxPbkZvY3VzKSlcbiAgICAgICksXG5cbiAgICAgIC8vIE1lcmdlIHNvbWUgb2JzZXJ2YWJsZXMsIHdpdGggYSBjb21tb24gZGlzdGluY3RVbnRpbENoYW5nZWQoKSBwaXBlXG4gICAgICBtZXJnZShcbiAgICAgICAgLy8gT24gZHJvcGRvd24gYnV0dG9uIGNsaWNrIChubyBkZWJvdW5jZVRpbWUpXG4gICAgICAgIHRoaXMuZHJvcEJ1dHRvbkNsaWNrLnBpcGUoZmlsdGVyKChldmVudCkgPT4gIWV2ZW50IHx8ICFldmVudC5kZWZhdWx0UHJldmVudGVkKSksXG4gICAgICAgIC8vIEZvY3VzIG9yIGNsaWNrID0+IExvYWQgYWxsIChubyBkZWJvdW5jZVRpbWUpXG4gICAgICAgIG1lcmdlKHRoaXMuZm9jdXNlZENoYW5nZXMsIHRoaXMuY2xpY2tlZClcbiAgICAgICAgICAvLyBBdm9pZCB0b28gbWFueSBjYWxsLCBlLmcuIHdoZW4gZm9jdXNlZCBhbmQgY2xpY2tlZFxuICAgICAgICAgIC5waXBlKHRocm90dGxlVGltZSgxMDApKSxcbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy8ucGlwZSh0YXAoKF8pID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgZm9jdXNlZCBvciBjbGlja2VkIGV2ZW50JykpKSxcbiAgICAgICAgLy8gSW5wdXQgaXRlbXMgb3IgZmlsdGVyIGNoYW5nZXNcbiAgICAgICAgbWVyZ2UodGhpcy5fJGlucHV0SXRlbXMsIHRoaXMuXyRmaWx0ZXIpLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLmxvYWRpbmcpXG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvL3RhcCgoXykgPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCAkaW5wdXRJdGVtcyBvciBmaWx0ZXIgZXZlbnQnKSlcbiAgICAgICAgKVxuICAgICAgKS5waXBlKFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5lbmFibGVkKSxcbiAgICAgICAgbWFwKCgpID0+ICh0aGlzLm11bHRpcGxlID8gdGhpcy5zZWFyY2hUZXh0IDogdGhpcy5zaG93QWxsT25Gb2N1cyA/ICcqJyA6IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpKSxcbiAgICAgICAgLy8gRGlzdGluZ3Vpc2ggY2hhbmdlc1xuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgodjEsIHYyKSA9PlxuICAgICAgICAgIC8vIElmIGxvYWRpbmcgKG5vdCBsb2FkZWQgeWV0KSwgc2ltdWxhdGUgdGhhdCB2YWx1ZSBjaGFuZ2VkIHRvIGZvcmNlIGxvYWRcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPyBmYWxzZSA6IHYxID09PSB2MiB8fCB0aGlzLmVxdWFscyh2MSwgdjIpXG4gICAgICAgICksXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggY2hhcmFjdGVyc1xuICAgICAgICBmaWx0ZXIodGhyZXNob2xkRmlsdGVyRm4pXG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIC8vdGFwKCh2YWx1ZSkgPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCB1cGRhdGUgZXZlbnQ6ICcsIHZhbHVlKSlcbiAgICAgIClcbiAgICApLnBpcGUoXG4gICAgICAvLyBTdWdnZXN0IHZhbHVlc1xuICAgICAgbWVyZ2VNYXAoKHZhbHVlKSA9PiB0aGlzLnN1Z2dlc3QodmFsdWUsIHRoaXMuZmlsdGVyKSksXG5cbiAgICAgIC8vIElnbm9yZSB1bmRlZmluZWQgcmVzdWx0IChlLmcuIHdoZW4gYSBuZXdlciBzdWdnZXN0IGNhbGwgaXMgcnVubmluZylcbiAgICAgIGZpbHRlcihpc05vdE5pbCksXG5cbiAgICAgIC8vIERFQlVHXG4gICAgICAvL3RhcChpdGVtcyA9PiB0aGlzLmRlYnVnICYmIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIGZyb20gc3VnZ2VzdDogJywgaXRlbXMpKSxcblxuICAgICAgLy8gU3RvcmUgaW1wbGljaXQgdmFsdWUgKHdpbGwgdXNlIGl0IG9uQmx1ciBpZiBub3Qgb3RoZXIgdmFsdWUgc2VsZWN0ZWQpXG4gICAgICB0YXAoKGl0ZW1zKSA9PiAhdGhpcy5tdWx0aXBsZSAmJiB0aGlzLnVwZGF0ZUltcGxpY2l0VmFsdWUoaXRlbXMpKVxuICAgICk7XG5cbiAgICAvLyBGZXRjaCBtb3JlIGV2ZW50c1xuICAgIGNvbnN0IGZldGNoTW9yZUl0ZW1zQ2hhbmdlcyA9IHRoaXMuX2ZldGNoTW9yZSQucGlwZShcbiAgICAgIHRhcCgoZXZlbnQpID0+IGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpKSwgLy8gQXZvaWQgdG8gY2xvc2UgdGhlIG1hdC1zZWxlY3RcbiAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmNhbkZldGNoTW9yZSksXG4gICAgICBtZXJnZU1hcCgoKSA9PiB0aGlzLmZldGNoTW9yZSgpKSxcblxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vdGFwKG1vcmVJdGVtcyA9PiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBmcm9tIGZldGNoIE1vcmU6ICcsIG1vcmVJdGVtcykpLFxuXG4gICAgICAvLyBDb25jYXQgdG8gZXhpc3RpbmcgaXRlbXNcbiAgICAgIG1hcCgobW9yZUl0ZW1zKSA9PiAodGhpcy5fJGZpbHRlcmVkSXRlbXMudmFsdWUgfHwgW10pLmNvbmNhdChtb3JlSXRlbXMpKVxuICAgICk7XG5cbiAgICAvLyBVcGRhdGUgZmlsdGVyZWQgaXRlbXNcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIHRoaXMuXyRpbnB1dEl0ZW1zLFxuXG4gICAgICAgIC8vIFVwZGF0ZSBpdGVtcyBldmVudHNcbiAgICAgICAgZmlsdGVyZWRJdGVtc0NoYW5nZXMsXG5cbiAgICAgICAgLy8gRmV0Y2ggbW9yZSBldmVudHNcbiAgICAgICAgZmV0Y2hNb3JlSXRlbXNDaGFuZ2VzXG4gICAgICApLnN1YnNjcmliZSgoaXRlbXMpID0+IHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIGNvbnRyb2wgdmFsdWUgaXMgaW5zaWRlIChtYXQtc2VsZWN0KVxuICAgICAgICAvLyAob3RoZXJ3aXNlIGN1cnJlbnQgdmFsdWUgd2lsbCB2aXN1YWxseSBkaXNhcHBlYXIpXG4gICAgICAgIGlmIChpdGVtcykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZEl0ZW0gPSBudWxsO1xuXG4gICAgICAgICAgLy8gSWYgZm9ybSB2YWx1ZSBpcyBtaXNzaW5nOiBhcHBlbmQgdG8gbGlzdFxuICAgICAgICAgIGlmIChpc05vdE5pbCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KHZhbHVlLmZpbHRlcigodikgPT4gIWl0ZW1zLnNvbWUoKGl0ZW0pID0+IHRoaXMuZXF1YWxzKGl0ZW0sIHYpKSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gdGhpcy5lcXVhbHMoaXRlbSwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEl0ZW0gPSBpdGVtc1tpbmRleF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBjdXJyZW50IHZhbHVlIHRvIHRoZSBsaXN0LCBpZiBtaXNzaW5nIChtYXQtc2VsZWN0IG9ubHkpXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5tb2JpbGUgfHwgdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmNvbmNhdCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgbmV3IGZpbHRlcmVkIGl0ZW1zJywgaXRlbXMpO1xuXG4gICAgICAgIC8vIEVtaXQgaXRlbXNcbiAgICAgICAgdGhpcy5fJGZpbHRlcmVkSXRlbXMubmV4dChpdGVtcyk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBBcHBseWluZyBpbXBsaWNpdCB2YWx1ZSwgb24gYmx1clxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmJsdXJyZWRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gU2tpcCBpZiBtdWx0aXBsZSAobm8gaW1wbGljaXQgdmFsdWUpIG9yIGRpc2FibGVcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMubXVsdGlwbGUgJiYgdGhpcy5lbmFibGVkKSxcbiAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgIC8vLHRhcChfID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgYmx1cnJlZCBldmVudCcpKSxcbiAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGxldCBpbnZhbGlkYXRlRmlsdGVyZWRJdGVtcyA9IGZhbHNlO1xuICAgICAgICAgIGxldCBtb3ZlQ2FyZXRUb0JlZ2lubmluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBBcHBseWluZyBpbXBsaWNpdCB2YWx1ZSBvbiBibHVyJywgdmFsdWUpO1xuXG4gICAgICAgICAgLy8gV2hlbiBsZWF2ZSBjb21wb25lbnQgd2l0aG91dCBvYmplY3QsIHVzZSBpbXBsaWNpdCB2YWx1ZSBpZiA6XG4gICAgICAgICAgLy8gLSBhbiBleHBsaWNpdCB2YWx1ZVxuICAgICAgICAgIC8vIC0gZmllbGQgaXMgbm90IGVtcHR5ICh1c2VyIGZpbGwgc29tZXRoaW5nKVxuICAgICAgICAgIC8vIC0gT1IgZmllbGQgZW1wdHkgYnV0IGlzIHJlcXVpcmVkXG4gICAgICAgICAgaWYgKGlzTm90TmlsKHRoaXMuX2ltcGxpY2l0VmFsdWUpICYmIChcbiAgICAgICAgICAgICh0aGlzLnJlcXVpcmVkICYmIGlzTmlsT3JCbGFuayh2YWx1ZSkpXG4gICAgICAgICAgICAgIHx8IChpc05vdE5pbE9yQmxhbmsodmFsdWUpICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpXG4gICAgICAgICAgICAgIHx8IChpc05vdE5pbE9yQmxhbmsodGhpcy5faGlkZGVuU2VhcmNoVGV4dCkgJiYgaXNOaWwodmFsdWUpKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLl9pbXBsaWNpdFZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzUGVuZGluZyh7IGVtaXRFdmVudDogZmFsc2UsIG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSwgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgICBpbnZhbGlkYXRlRmlsdGVyZWRJdGVtcyA9IHRoaXMuc2hvd0FsbE9uRm9jdXMgfHwgdGhpcy5yZWxvYWRJdGVtc09uRm9jdXM7XG4gICAgICAgICAgICBtb3ZlQ2FyZXRUb0JlZ2lubmluZyA9IHRydWU7IC8vIE1vdmUgY2FyZXQgdG8gdGhlIGJlZ2lubmluZyAoZml4IGlzc3VlIElNQUdJTkUtNDY5KVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBObyB2YWx1ZSBhbmQgbm8gaW1wbGljaXQgdmFsdWVcbiAgICAgICAgICBlbHNlIGlmIChpc05pbE9yQmxhbmsodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUobnVsbCk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc1BlbmRpbmcoeyBlbWl0RXZlbnQ6IGZhbHNlLCBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UsIG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBIYXMgdmFsdWUsIGJ1dCBubyBpbXBsaWNpdCB2YWx1ZVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gVmFsdWUgaXMgYSB2YWxpZCBvYmplY3RcbiAgICAgICAgICAgIGlmIChpc05vdE5pbE9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgaW52YWxpZGF0ZUZpbHRlcmVkSXRlbXMgPSB0aGlzLnNob3dBbGxPbkZvY3VzIHx8IHRoaXMucmVsb2FkSXRlbXNPbkZvY3VzO1xuICAgICAgICAgICAgICBtb3ZlQ2FyZXRUb0JlZ2lubmluZyA9IHRydWU7IC8vIE1vdmUgY2FyZXQgdG8gdGhlIGJlZ2lubmluZyAoZml4IGlzc3VlIElNQUdJTkUtNDY5KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSW52YWxpZCB2YWxpZCB2YWx1ZTogY2xlYXIgc2VhcmNoIHRleHRcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY2xlYXJJbnZhbGlkVmFsdWVPbkJsdXIgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUobnVsbCk7XG4gICAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzUGVuZGluZyh7IGVtaXRFdmVudDogZmFsc2UsIG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlLCBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgaW52YWxpZGF0ZUZpbHRlcmVkSXRlbXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX2ltcGxpY2l0VmFsdWUgPSBudWxsOyAvLyByZXNldCB0aGUgaW1wbGljaXQgdmFsdWVcbiAgICAgICAgICB0aGlzLl9oaWRkZW5TZWFyY2hUZXh0ID0gbnVsbDsgLy8gcmVzZXQgc2VhcmNoIHRleHRcbiAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTsgLy8gQ2xvc2UgcGFuZWxcblxuICAgICAgICAgIC8vIEludmFsaWRhdGUgbG9hZGVkIGl0ZW1zXG4gICAgICAgICAgaWYgKGludmFsaWRhdGVGaWx0ZXJlZEl0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTsgLy8gU2hvdWxkIGZvcmNlIG5leHQgZm9jdXMgdG8gcmVsb2FkIGl0ZW1zXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTW92ZSBjYXJldCB0byB0aGUgYmVnaW5uaW5nIChmaXggaXNzdWUgSU1BR0lORS00NjkpXG4gICAgICAgICAgaWYgKG1vdmVDYXJldFRvQmVnaW5uaW5nICYmIHRoaXMubWF0SW5wdXRUZXh0KSB7XG4gICAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgTW92aW5nIGNhcmV0IHRvIHRoZSBiZWdpbm5pbmcsIG9uIGJsdXInKTtcbiAgICAgICAgICAgIHNlbGVjdElucHV0UmFuZ2UodGhpcy5tYXRJbnB1dFRleHQubmF0aXZlRWxlbWVudCwgMCwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBMaXN0ZW4gZm9ybSBjb250cm9sIHN0YXR1cyBjaGFuZ2VcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zdGF0dXNDaGFuZ2VzXG4gICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG4gICAgICAgIC8vIFVwZGF0ZSBjb21wb25lbnQgc3RhdGVcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNoZWNrSWZUb3VjaGVkKCkpXG4gICAgKTtcblxuICAgIC8vIFNlbGVjdCBpbnB1dCBjb250ZW50LCBvbiBmb2N1cyBvciBwcmVzcyBlbnRlclxuICAgIGlmICh0aGlzLnNlbGVjdElucHV0Q29udGVudE9uRm9jdXMgJiYgIXRoaXMubW9iaWxlICYmICF0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICBtZXJnZShcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKGV2ZW50KSA9PiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICAgICAgICAgIC8vdGFwKChldmVudCkgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHRoaXMua2V5dXBFbnRlci5waXBlKGZpbHRlcigoKSA9PiBpc05vdE5pbE9iamVjdCh0aGlzLmZvcm1Db250cm9sLnZhbHVlKSkpXG4gICAgICAgIClcbiAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzRGVsYXkpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgU2VsZWN0aW5nIGlucHV0IGNvbnRlbnQgKGZvY3VzZWQpJyk7XG4gICAgICAgICAgICBzZWxlY3RJbnB1dENvbnRlbnQodGhpcy5tYXRJbnB1dFRleHQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVsb2FkSXRlbXNPbkZvY3VzKSB7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICB0aGlzLmZvY3VzZWRDaGFuZ2VzLnBpcGUoZmlsdGVyKChldmVudCkgPT4gIXRoaXMubG9hZGluZyAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVsb2FkaW5nIGl0ZW1zIChmb2N1c2VkKScpO1xuICAgICAgICAgIHRoaXMucmVsb2FkSXRlbXMoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuX2ZpeE1hdFNlbGVjdFBvc2l0aW9uQW5kU2VhcmNoYmFyKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fJGlucHV0SXRlbXMuY29tcGxldGUoKTtcbiAgICB0aGlzLl8kaW5wdXRJdGVtcy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuXyRmaWx0ZXJlZEl0ZW1zLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fJGZpbHRlcmVkSXRlbXMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9yZWxvYWQkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fJGZpbHRlci5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5kcm9wQnV0dG9uQ2xpY2suY29tcGxldGUoKTtcbiAgICB0aGlzLmNsaWNrZWQuY29tcGxldGUoKTtcbiAgICB0aGlzLmJsdXJyZWQuY29tcGxldGUoKTtcbiAgICB0aGlzLmZvY3VzZWRDaGFuZ2VzLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5rZXlkb3duRXNjYXBlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5rZXl1cEVudGVyLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZmV0Y2hNb3JlJC5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmZvcm1Db250cm9sID0gbnVsbDtcbiAgICB0aGlzLmRpc3BsYXlXaXRoID0gbnVsbDtcbiAgICB0aGlzLmVxdWFscyA9IG51bGw7XG4gICAgdGhpcy5zdWdnZXN0Rm4gPSBudWxsO1xuICAgIHRoaXMuXyRmaWx0ZXJlZEl0ZW1zID0gbnVsbDtcbiAgICB0aGlzLmNvbmZpZyA9IG51bGw7XG4gICAgdGhpcy5wYW5lbENsYXNzID0gbnVsbDtcblxuICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gbnVsbDtcblxuICAgIC8vIERlc3Ryb3kgdGhlICdhdXRvY29tcGxldGUnIGluc3RhbmNlLCB0byBhdm9pZCBtZW1vcnkgbGVha1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlPy5uZ09uRGVzdHJveSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHRvIHJlbG9hZCBjb250ZW50LiBVc2VmdWwgd2hlbiBmaWx0ZXIgaGFzIGJlZW4gY2hhbmdlZCBidXQgbm90IGRldGVjdGVkXG4gICAqL1xuICByZWxvYWRJdGVtcyh2YWx1ZT86IGFueSkge1xuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgQXNraW5nIHRvIHJlbG9hZEl0ZW1zKCknLCB2YWx1ZSk7XG4gICAgLy8gRm9yY2UgYSByZWZyZXNoXG4gICAgdGhpcy5fcmVsb2FkJC5uZXh0KHZhbHVlIHx8ICh0aGlzLnNob3dBbGxPbkZvY3VzICYmIHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA8PSAwID8gJyonIDogdGhpcy5mb3JtQ29udHJvbC52YWx1ZSkpO1xuXG4gICAgLy8gQ2xlYXIgdGhlIHNlYXJjaCBiYXIgKG9ubHkgaWYgaGlkZGVuKVxuICAgIGlmICh0aGlzLm1hdFNlbGVjdCAmJiAhdGhpcy5tYXRTZWxlY3QucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLmNsZWFyU2VhcmNoYmFyKCk7XG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gREVCVUdcbiAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBXcml0aW5nIHZhbHVlOiAnLCB2YWx1ZSk7XG5cbiAgICBpZiAodmFsdWUgIT09IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IHRoaXMuZGlzcGxheVdpdGgodmFsdWUpO1xuXG4gICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHZhbHVlKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgbmVlZCB0byB1cGRhdGUgY29udHJvbHNcbiAgICAgIHRoaXMuY2hlY2tJZlRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhciB2YWx1ZVxuICAgIGVsc2UgaWYgKGlzTmlsKHZhbHVlKSkge1xuICAgICAgLy8gVXBkYXRlIGRpc3BsYXkgdmFsdWUgKGUuZy4gc2hvdWxkIHJlZnJlc2ggdGhlIHRpdGxlKVxuICAgICAgaWYgKGlzTm90TmlsT3JCbGFuayh0aGlzLl9kaXNwbGF5VmFsdWUpKSB7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9ICcnO1xuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNldCBpbXBsaWNpdCB2YWx1ZVxuICAgICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoaXNEaXNhYmxlZCAmJiB0aGlzLmF1dG9jb21wbGV0ZT8uaXNPcGVuKSB7XG4gICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGZvY3VzKG9wdGlvbnM/OiBGb2N1c09wdGlvbnMsIG9yaWdpbj86IEZvY3VzT3JpZ2luKSB7XG4gICAgaWYgKHRoaXMubWF0U2VsZWN0KSB7XG4gICAgICB0aGlzLm1hdFNlbGVjdC5mb2N1cyhvcHRpb25zKTtcbiAgICAgIGlmICghdGhpcy5fZm9jdXNlZCkge1xuICAgICAgICB0aGlzLl9mb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ2hhbmdlcy5uZXh0KG5ldyBGb2N1c0V2ZW50KCdmb2N1cycsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IG51bGxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb2N1c0lucHV0KHRoaXMubWF0SW5wdXRUZXh0LCBvcHRpb25zLCBvcmlnaW4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBJVGV4dElucHV0RmllbGRBY2Nlc3NvcjogdHlwZSB0ZXh0IGludG8gdGhlIHNlYXJjaCBpbnB1dCBhbmQgdHJpZ2dlciBzdWdnZXN0ICovXG4gIHR5cGVUZXh0KHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChpc05pbE9yQmxhbmsodGV4dCkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmhhc1ZhbGlkVmFsdWUoKSkge1xuICAgICAgLy8gQ2xlYXIgdGhlIGV4aXN0aW5nIHZhbHVlXG4gICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcblxuICAgICAgLy8gQ2xlYXIgdGV4dCB2YWx1ZVxuICAgICAgaWYgKHRoaXMubWF0SW5wdXRUZXh0KSB0aGlzLm1hdElucHV0VGV4dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICBpZiAodGhpcy5pb25TZWFyY2hiYXIpIHRoaXMuY2xlYXJTZWFyY2hiYXIoKTtcblxuICAgICAgLy8gTG9vcCB3aXRoIGEgZGVsYXksIHRvIGxldCB3cml0ZSB2YWx1ZSBlbWl0IGNoYW5nZXNcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50eXBlVGV4dCh0ZXh0KSlcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2JpbGUpIHtcbiAgICAgIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgICAgdGhpcy5tYXRTZWxlY3Qub3BlbigpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaW9uU2VhcmNoYmFyKSB7XG4gICAgICAgIHRoaXMuaW9uU2VhcmNoYmFyLnZhbHVlID0gKHRoaXMuaW9uU2VhcmNoYmFyLnZhbHVlID8/ICcnKSArIHRleHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5zaG93QWxsT25Gb2N1cykge1xuICAgICAgICAgIHRoaXMuc2VsZWN0Rmlyc3RPcHRpb25CeVRleHQodGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5faGlkZGVuU2VhcmNoVGV4dCA9ICh0aGlzLl9oaWRkZW5TZWFyY2hUZXh0ID8/ICcnKSArIHRleHQ7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1NFQVJDSCAnICsgdGhpcy5faGlkZGVuU2VhcmNoVGV4dCk7XG4gICAgICAgICAgdGhpcy5fbWF0U2VsZWN0U2VhcmNoQ2hhbmdlZCh0aGlzLl9oaWRkZW5TZWFyY2hUZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5tYXRJbnB1dFRleHQpIHtcbiAgICAgIHRoaXMubWF0SW5wdXRUZXh0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgKz0gdGV4dCA/PyAnJztcbiAgICAgIC8vIFRyaWdnZXIgc3VnZ2VzdCBieSBkaXNwYXRjaGluZyBpbnB1dCBldmVudFxuICAgICAgdGhpcy5tYXRJbnB1dFRleHQubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgIH1cbiAgfVxuXG4gIGZpbHRlcklucHV0VGV4dEZvY3VzRXZlbnQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50IHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIGNhbGxpbmcgZmlsdGVySW5wdXRUZXh0Rm9jdXNFdmVudCAtIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBJZ25vcmUgZXZlbnQgZnJvbSBtYXQtb3B0aW9uXG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcblxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIENhbmNlbGxpbmcgZm9jdXMgZXZlbnQnKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEFscmVhZHkgZm9jdXNlZCAtIGZpeCBpc3N1ZSBzdW1hcmlzLWFwcCM4MzcgKDIgcGFuZWxzIG9wZW5lZCBhdCB0aGUgc2FtZSB0aW1lKVxuICAgIGlmICh0aGlzLl9mb2N1c2VkKSByZXR1cm4gZmFsc2U7XG5cbiAgICB0aGlzLl9mb2N1c2VkID0gdHJ1ZTtcblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgU2VsZWN0IGlucHV0IGNvbnRlbnQnKTtcbiAgICBjb25zdCBoYXNDb250ZW50ID0gaXNOb3ROaWxPckJsYW5rKChldmVudC50YXJnZXQgYXMgYW55KT8udmFsdWUpO1xuXG4gICAgLy8gSWYgY29tYm8gaXMgZW1wdHksIG9yIGlmIGhhcyBjb250ZW50IGJ1dCBzaG91bGQgZm9yY2UgdG8gc2hvdyBwYW5lbCBvbiBmb2N1c1xuICAgIGlmICghaGFzQ29udGVudCB8fCB0aGlzLnNob3dQYW5lbE9uRm9jdXMgfHwgdGhpcy5zaG93QWxsT25Gb2N1cykge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEVtaXQgZm9jdXMgZXZlbnQnKTtcblxuICAgICAgLy8gTmVlZCBhIGRlbGF5IHRvIHByZXZlbnQgZWFybHkgZm9jdXMgZXZlbnQsIGp1c3QgYWZ0ZXIgYSBibHVyIGV2ZW50IChzZWUgaXNzdWUgc3VtYXJpcy1hcHAjODM3IC0gMiBwYW5lbHMgb3BlbmVkKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5fZm9jdXNlZCkgcmV0dXJuOyAvLyBTa2lwIGlmIGJsdXIgZXZlbnQgcmVjZWl2ZWRcblxuICAgICAgICB0aGlzLmZvY3VzZWRDaGFuZ2VzLmVtaXQoZXZlbnQpO1xuICAgICAgfSwgMTApO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpbHRlcklucHV0VGV4dEJsdXJFdmVudChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuXG4gICAgLy8gREVCVUdcbiAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBmaWx0ZXJJbnB1dFRleHRCbHVyRXZlbnQnLCBldmVudCk7XG5cbiAgICAvLyBJZ25vcmUgZXZlbnQgZnJvbSBtYXQtb3B0aW9uXG4gICAgaWYgKFxuICAgICAgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJykgfHxcbiAgICAgIC8vIE9yIGF1dG9jb21wbGV0ZSBwYW5lbCBpcyBvcGVuIGJlY2F1c2UgZXZlbnQucmVsYXRlZFRhcmdldCBpcyBudWxsIChjZi4gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMjQxODIpXG4gICAgICAoZXZlbnQucmVsYXRlZFRhcmdldCA9PT0gbnVsbCAmJiB0aGlzLmF1dG9jb21wbGV0ZT8uaXNPcGVuKVxuICAgICkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcblxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBDYW5jZWxsaW5nIGJsdXIgZXZlbnRcIik7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBbHJlYWR5IGJsdXJyZWQ6IHNraXBcbiAgICBpZiAoIXRoaXMuX2ZvY3VzZWQpIHJldHVybjtcblxuICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTtcblxuICAgIC8vIE5lZWQgYSBkZWxheSB0byBwcmV2ZW50IGVhcmx5IGJsdXIgZXZlbnQgd2l0aG91dCB0cmlnZ2VyaW5nIGZvcm1DaGFuZ2UgZXZlbnRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9mb2N1c2VkKSByZXR1cm47IC8vIFNraXAgaWYgZm9jdXMgYWdhaW5cblxuICAgICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEVudGVyKGV2ZW50OiBFdmVudCB8IEtleWJvYXJkRXZlbnQpIHtcbiAgICB0aGlzLmtleXVwRW50ZXIuZW1pdChldmVudCk7XG5cbiAgICAvLyBVc2UgaXNKdXN0Q2xvc2VkIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlXG4gICAgaWYgKHRoaXMuZW50ZXIub2JzZXJ2ZWQgJiYgIXRoaXMuaXNKdXN0Q2xvc2VkKSB7XG4gICAgICB0aGlzLmVudGVyLmVtaXQoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGVtaXRBcnJvd1VwKGV2ZW50OiBFdmVudCB8IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAodGhpcy5hcnJvd1VwLm9ic2VydmVkICYmICF0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy5hcnJvd1VwLmVtaXQoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGVtaXRBcnJvd0Rvd24oZXZlbnQ6IEV2ZW50IHwgS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLmFycm93RG93bi5vYnNlcnZlZCAmJiAhdGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMuYXJyb3dEb3duLmVtaXQoZXZlbnQpO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNPcGVuKSB7XG4gICAgICB0aGlzLmRyb3BCdXR0b25DbGljay5lbWl0KGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEVzY2FwZShldmVudDogS2V5Ym9hcmRFdmVudCB8IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAvLyBBdm9pZCBmb3JtIG9yIHBhZ2UgdG8gbWFuYWdlIGVzY2FwZSBldmVudFxuICAgICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIC8vIERFQlVHXG4gICAgICAvL2NvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBDbG9zaW5nIHRoZSBwYW5lbCAoa2V5ZG93bi5lc2NhcGUpXCIpO1xuXG4gICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rZXlkb3duRXNjYXBlLmVtaXQoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBpb25TZWFyY2hCYXJDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCB8fCAhdGhpcy5tYXRTZWxlY3QucGFuZWxPcGVuKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIC8vIEdldCB0aGUgdmFsdWUgdG8gc2VhcmNoXG4gICAgY29uc3Qgc2VhcmNoVGV4dCA9IChldmVudCBhcyBDdXN0b21FdmVudDxTZWFyY2hiYXJDaGFuZ2VFdmVudERldGFpbD4pPy5kZXRhaWwudmFsdWU7XG5cbiAgICB0aGlzLl9tYXRTZWxlY3RTZWFyY2hDaGFuZ2VkKHNlYXJjaFRleHQpO1xuICB9XG5cbiAgZmlsdGVyTWF0U2VsZWN0Rm9jdXNFdmVudChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCA8bWF0LXNlbGVjdD4gZm9jdXMgZXZlbnQnLCBldmVudCk7XG5cbiAgICAvLyBFbWl0IGV2ZW50XG4gICAgdGhpcy5mb2N1c2VkQ2hhbmdlcy5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGZpbHRlck1hdFNlbGVjdEJsdXJFdmVudChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuXG4gICAgLy8gREVCVUdcbiAgICAvLyBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgUmVjZWl2ZWQgPG1hdC1zZWxlY3Q+IGJsdXIgZXZlbnRcIiwgZXZlbnQpO1xuXG4gICAgaWYgKFxuICAgICAgZXZlbnQucmVsYXRlZFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmXG4gICAgICAvLyBJZ25vcmUgZXZlbnQgZnJvbSBtYXQtb3B0aW9uXG4gICAgICAoZXZlbnQucmVsYXRlZFRhcmdldC50YWdOYW1lID09PSAnTUFULU9QVElPTicgfHxcbiAgICAgICAgKGV2ZW50LnJlbGF0ZWRUYXJnZXQudGFnTmFtZSA9PT0gJ0RJVicgJiYgZXZlbnQucmVsYXRlZFRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC1tZGMtc2VsZWN0LXBhbmVsJykpIHx8IC8vIE5ldyBNREMgdGFnIGFuZCBjbGFzcyBuYW1lIChlcXVpdmFsZW50IHRvIGV2ZW50LnJlbGF0ZWRUYXJnZXQudGFnTmFtZSA9PT0gJ01BVC1PUFRJT04nKVxuICAgICAgICAoZXZlbnQucmVsYXRlZFRhcmdldC50YWdOYW1lID09PSAnSU5QVVQnICYmIGV2ZW50LnJlbGF0ZWRUYXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWFyY2hiYXItaW5wdXQnKSkpXG4gICAgKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBDYW5jZWxsaW5nIDxtYXQtc2VsZWN0PiBibHVyIGV2ZW50XCIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9mb2N1c2VkKSB7XG4gICAgICB0aGlzLl9mb2N1c2VkID0gZmFsc2U7XG5cbiAgICAgIHRoaXMuYmx1cnJlZC5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNsZWFyVmFsdWUoZXZlbnQ/OiBFdmVudCkge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB0aGlzLmNsZWFyU2VhcmNoYmFyKCk7XG4gICAgdGhpcy53cml0ZVZhbHVlKG51bGwpO1xuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuICB9XG5cbiAgX2luaXRBdXRvY29tcGxldGVJbmZpbml0ZVNjcm9sbCh0aHJlc2hvbGQ/OiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuYXV0b2NvbXBsZXRlKSByZXR1cm47IC8vIFNraXBcblxuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBJbml0IGF1dG9jb21wbGV0ZSBzY3JvbGwgbGlzdGVuZXInKTtcblxuICAgIGlmICh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZSh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IG9wZW5lZCQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuYXV0b2NvbXBsZXRlLl9pc09wZW4gPyB0aW1lcigwKSA6IHRoaXMuYXV0b2NvbXBsZXRlLm9wZW5lZC5waXBlKGRlYm91bmNlVGltZSgyMDApKTtcbiAgICBjb25zdCBzY3JvbGxFbmQkID0gb3BlbmVkJC5waXBlKFxuICAgICAgbWFwKCgpID0+IHRoaXMuZ2V0QXV0b2NvbXBsZXRlUGFuZWwoKSksXG4gICAgICBmaWx0ZXIoaXNOb3ROaWwpLFxuICAgICAgc3dpdGNoTWFwKChwYW5lbCkgPT4gZnJvbVNjcm9sbEVuZEV2ZW50KHBhbmVsLCB0aHJlc2hvbGQpKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLmF1dG9jb21wbGV0ZS5jbG9zZWQpXG4gICAgKTtcblxuICAgIC8vIFRyaWdnZXIgZmV0Y2ggbW9yZSwgd2hlbiBlbmQgc2Nyb2xsIHJlYWNoZWRcbiAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24gPSBzY3JvbGxFbmQkLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9mZXRjaE1vcmUkLmVtaXQoKSk7XG5cbiAgICAvLyBSZWdpc3RlciBzdWJzY3JpcHRpb25cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbik7XG4gIH1cblxuICBfaW5pdE1hdFNlbGVjdEluZmluaXRlU2Nyb2xsKHRocmVzaG9sZD86IHN0cmluZykge1xuICAgIGlmICghdGhpcy5tYXRTZWxlY3QpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgLy8gREVCVUdcbiAgICBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBJbml0IG1hdC1zZWxlY3Qgc2Nyb2xsIGxpc3RlbmVyJyk7XG5cbiAgICBpZiAodGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5yZW1vdmUodGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcGVuZWQkOiBPYnNlcnZhYmxlPGFueT4gPSB0aGlzLm1hdFNlbGVjdC5wYW5lbE9wZW4gPyB0aW1lcigwKSA6IHRoaXMubWF0U2VsZWN0Ll9vcGVuZWRTdHJlYW0ucGlwZShkZWJvdW5jZVRpbWUoMjAwKSk7XG4gICAgY29uc3Qgc2Nyb2xsRW5kJCA9IG9wZW5lZCQucGlwZShcbiAgICAgIG1hcCgoKSA9PiB0aGlzLmdldE1hdFNlbGVjdFBhbmVsKCkpLFxuICAgICAgZmlsdGVyKGlzTm90TmlsKSxcbiAgICAgIHN3aXRjaE1hcCgocGFuZWwpID0+IGZyb21TY3JvbGxFbmRFdmVudChwYW5lbCwgdGhyZXNob2xkKSksXG4gICAgICB0YWtlVW50aWwodGhpcy5tYXRTZWxlY3QuX2Nsb3NlZFN0cmVhbSlcbiAgICApO1xuXG4gICAgLy8gVHJpZ2dlciBmZXRjaCBtb3JlLCBlbmQgZW5kIHNjcm9sbCByZWFjaGVkXG4gICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uID0gc2Nyb2xsRW5kJC5waXBlKGZpbHRlcigoKSA9PiB0aGlzLl9tb3JlSXRlbXNDb3VudCA+IDApKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZmV0Y2hNb3JlJC5lbWl0KCkpO1xuXG4gICAgLy8gUmVnaXN0ZXIgc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pO1xuICB9XG5cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hdXRvY29tcGxldGU/LmlzT3BlbiB8fCB0aGlzLm1hdFNlbGVjdD8ucGFuZWxPcGVuIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGlzSnVzdENsb3NlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc09wZW4gfHwgIXRoaXMuX3BhbmVsQ2xvc2VkQXRUaW1lKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBjbG9zZUFnZSA9IERhdGUubm93KCkgLSB0aGlzLl9wYW5lbENsb3NlZEF0VGltZTtcblxuICAgIC8vIFdvcmthcm91bmQgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVcbiAgICAvLyBlLmcuIFBhbmVsIGl0ZW0gY2FuIGJlIHZhbGlkYXRlZCBieSB0aGUgZW50ZXIga2V5LCBzbyB3ZSBkZXRlY3QgaWYgcGFuZWwganVzdCBjbG9zZWRcbiAgICByZXR1cm4gY2xvc2VBZ2UgPiAyMDA7XG4gIH1cblxuICBjbG9zZVBhbmVsKCkge1xuICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZT8uaXNPcGVuKSB7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVRyaWdnZXI/LmNsb3NlUGFuZWwoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWF0U2VsZWN0Py5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMubWF0U2VsZWN0Py5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2QgLS0gKi9cblxuICBwcm90ZWN0ZWQgbWFya0FzTG9hZGluZygpIHtcbiAgICBpZiAodGhpcy5fJGZpbHRlcmVkSXRlbXMudmFsdWUpIHtcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIE1hcmtpbmcgYXMgbG9hZGluZycpO1xuXG4gICAgICB0aGlzLl8kZmlsdGVyZWRJdGVtcy5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLl9pdGVtQ291bnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21vcmVJdGVtc0NvdW50ID0gMDtcbiAgICAgIHRoaXMuX3NlbGVjdGVkSXRlbSA9IG51bGw7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvblNlbGVjdGlvbkNoYW5nZShldmVudDogTWF0U2VsZWN0Q2hhbmdlKSB7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7IHNvdXJjZTogZXZlbnQuc291cmNlLCB2YWx1ZTogZXZlbnQudmFsdWUgfSk7XG4gIH1cblxuICBvbk1hdFNlbGVjdE9wZW5lZENoYW5nZShvcGVuZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9wZW5lZENoYW5nZS5lbWl0KG9wZW5lZCk7XG4gICAgaWYgKCFvcGVuZWQpIHtcbiAgICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuYmx1cnJlZC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uT3B0aW9uU2VsZWN0ZWQoZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpIHtcbiAgICAvLyBERUJVR1xuICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIE9wdGlvbiBzZWxlY3RlZCcsIGV2ZW50KTtcblxuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoeyBzb3VyY2U6IGV2ZW50LnNvdXJjZSwgdmFsdWU6IGV2ZW50Lm9wdGlvbi52YWx1ZSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVTaG93UGFuZWwoZXZlbnQ/OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kcm9wQnV0dG9uQ2xpY2suZW1pdChldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyogLS0gcHJpdmF0ZSBtZXRob2QgLS0gKi9cblxuICBwcml2YXRlIGFzeW5jIHN1Z2dlc3QodmFsdWU6IGFueSwgZmlsdGVyOiBhbnkgfCB1bmRlZmluZWQpOiBQcm9taXNlPGFueVtdIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gQ29tcHV0ZSBhIG5ldyBleGVjdXRpb24gaWRcbiAgICBjb25zdCBpZCA9ICsrdGhpcy5fc3VnZ2VzdEV4ZWN1dGlvbklkO1xuXG4gICAgLy8gU3BsaXQgc3RyaW5nIHZhbHVlLCBpZiBhbGxvdyAoLmUuZyAnQUFBIC0gSXRlbSBBQUEnID0+ICdBQUEnKVxuICAgIGlmICghKHRoaXMubXVsdGlwbGUgfHwgdGhpcy5tb2JpbGUpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFNwbGl0IHNlYXJjaCB0ZXh0IChhbmQga2VlcCBvbmx5IHRoZSBmaXJzdCBwYXJ0KVxuICAgICAgaWYgKHRoaXMuc3BsaXRTZWFyY2hUZXh0ICYmIHRoaXMuZGlzcGxheVNlcGFyYXRvcikge1xuICAgICAgICBjb25zdCBmaXJzdFNlcGFyYXRvckluZGV4ID0gdmFsdWUuaW5kZXhPZih0aGlzLmRpc3BsYXlTZXBhcmF0b3IpO1xuICAgICAgICBpZiAoZmlyc3RTZXBhcmF0b3JJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCBmaXJzdFNlcGFyYXRvckluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUcmltIHNlYXJjaCB0ZXh0XG4gICAgICBpZiAodGhpcy50cmltU2VhcmNoVGV4dCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYWxsIHN1Z2dlc3Rpb24gZnVuY3Rpb25cbiAgICBsZXQgcmVzID0gYXdhaXQgdGhpcy5zdWdnZXN0Rm4odmFsdWUsIGZpbHRlcik7XG5cbiAgICAvLyBJZ25vcmUgdGhlIGN1cnJlbnQgcmVzdWx0LCBpZiBhIG5ld2VyIGV4ZWN1dGlvbiBoYXMgYmVlbiBsYXVuY2hlZFxuICAgIGlmIChpZCAhPT0gdGhpcy5fc3VnZ2VzdEV4ZWN1dGlvbklkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gREVCVUdcbiAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBGaWx0ZXJlZCBpdGVtcyBieSBzdWdnZXN0Rm46JywgdmFsdWUsIHJlcyk7XG5cbiAgICBpZiAoIXJlcykge1xuICAgICAgdGhpcy5faXRlbUNvdW50ID0gMDtcbiAgICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tb3JlSXRlbXNDb3VudCA9IDA7XG4gICAgICByZXMgPSBbXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xuICAgICAgcmVzID0gcmVzIGFzIGFueVtdO1xuICAgICAgdGhpcy5faXRlbUNvdW50ID0gcmVzLmxlbmd0aDtcbiAgICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tb3JlSXRlbXNDb3VudCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgZGF0YSwgdG90YWwsIGZldGNoTW9yZSB9ID0gcmVzIGFzIExvYWRSZXN1bHQ8YW55PjtcbiAgICAgIHRoaXMuX2l0ZW1Db3VudCA9IHRvdGFsID8/IGRhdGEubGVuZ3RoID8/IDA7XG4gICAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gZmV0Y2hNb3JlO1xuICAgICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSAoZmV0Y2hNb3JlICYmIHRoaXMuX2l0ZW1Db3VudCAtIGRhdGEubGVuZ3RoKSB8fCAwO1xuICAgICAgcmVzID0gZGF0YTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZmF2b3JpdGVzXG4gICAgaWYgKGlzTm90RW1wdHlBcnJheSh0aGlzLmZhdm9yaXRlSXRlbXMpKSB7XG4gICAgICBjb25zdCBzaG93QWxsRmF2b3JpdGVzID0gIXZhbHVlIHx8IHZhbHVlID09PSAnKicgfHwgKGlzTm90TmlsT2JqZWN0KHZhbHVlKSAmJiB0aGlzLnNob3dBbGxPbkZvY3VzKTtcbiAgICAgIGNvbnN0IHNvcnRBdHRyaWJ1dGVzID0gdGhpcy5kaXNwbGF5QXR0cmlidXRlcyB8fCAoZmlsdGVyICYmICgoZmlsdGVyLnNlYXJjaEF0dHJpYnV0ZSAmJiBbZmlsdGVyLnNlYXJjaEF0dHJpYnV0ZV0pIHx8IGZpbHRlci5zZWFyY2hBdHRyaWJ1dGVzKSk7XG4gICAgICBjb25zdCBmaWx0ZXJlZEZhdm9yaXRlSXRlbXMgPSBzaG93QWxsRmF2b3JpdGVzXG4gICAgICAgID8gdGhpcy5mYXZvcml0ZUl0ZW1zLnNvcnQocHJvcGVydGllc1BhdGhDb21wYXJhdG9yKHNvcnRBdHRyaWJ1dGVzKSlcbiAgICAgICAgOiBzdWdnZXN0RnJvbUFycmF5KHRoaXMuZmF2b3JpdGVJdGVtcywgdmFsdWUsIHRoaXMuZmlsdGVyKT8uZGF0YTtcbiAgICAgIGlmIChpc05vdEVtcHR5QXJyYXkoZmlsdGVyZWRGYXZvcml0ZUl0ZW1zKSkge1xuICAgICAgICBmaWx0ZXJlZEZhdm9yaXRlSXRlbXMuc29ydChwcm9wZXJ0aWVzUGF0aENvbXBhcmF0b3IodGhpcy5kaXNwbGF5QXR0cmlidXRlcykpO1xuICAgICAgICByZXMgPSBmaWx0ZXJlZEZhdm9yaXRlSXRlbXMuY29uY2F0KHJlcy5maWx0ZXIoKGl0ZW0pID0+ICFmaWx0ZXJlZEZhdm9yaXRlSXRlbXMuc29tZSgoZmF2b3JpdGVJdGVtKSA9PiB0aGlzLmVxdWFscyhmYXZvcml0ZUl0ZW0sIGl0ZW0pKSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgRmlsdGVyZWQgaXRlbXMgYnkgc3VnZ2VzdEZuOicsIHZhbHVlLCByZXMpO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hNb3JlKCk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAoIXRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2spIHJldHVybiBbXTtcblxuICAgIC8vIFNhdmUgdGhlbiByZW1vdmUgZmV0Y2ggZnVuY3Rpb24gKHRvIGF2b2lkIG11bHRpLWNhbGwpXG4gICAgY29uc3QgZmV0Y2hNb3JlRm4gPSB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrO1xuICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG5cbiAgICBsZXQgeyBkYXRhOiBpdGVtcywgdG90YWwsIGZldGNoTW9yZSB9ID0gYXdhaXQgZmV0Y2hNb3JlRm4oKTtcblxuICAgIC8vIEV4Y2x1ZGUgZmF2b3JpdGVzXG4gICAgaWYgKGlzTm90RW1wdHlBcnJheSh0aGlzLmZhdm9yaXRlSXRlbXMpKSB7XG4gICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gIXRoaXMuZmF2b3JpdGVJdGVtcy5zb21lKChmYXZvcml0ZUl0ZW0pID0+IHRoaXMuZXF1YWxzKGZhdm9yaXRlSXRlbSwgaXRlbSkpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9pdGVtQ291bnQgPSB0b3RhbCB8fCB0aGlzLl9pdGVtQ291bnQ7XG4gICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IGZldGNoTW9yZTtcbiAgICB0aGlzLl9tb3JlSXRlbXNDb3VudCA9IE1hdGgubWF4KDAsIHRoaXMuX21vcmVJdGVtc0NvdW50IC0gaXRlbXMubGVuZ3RoKTsgLy8gQm9ybmUgbWluID0gMFxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW1wbGljaXRWYWx1ZShpdGVtczogYW55W10pIHtcbiAgICAvLyBTdG9yZSBpbXBsaWNpdCB2YWx1ZSAod2lsbCB1c2UgaXQgb25CbHVyIGlmIG5vdCBvdGhlciB2YWx1ZSBzZWxlY3RlZClcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgaXRlbXM/Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgaW1wbGljaXRWYWx1ZSA9IGl0ZW1zWzBdO1xuICAgICAgY29uc3QgYXBwbHlJbXBsaWNpdFZhbHVlID0gdHlwZW9mIHRoaXMuYXBwbHlJbXBsaWNpdFZhbHVlID09PSAnZnVuY3Rpb24nID8gdGhpcy5hcHBseUltcGxpY2l0VmFsdWUoaW1wbGljaXRWYWx1ZSkgOiB0aGlzLmFwcGx5SW1wbGljaXRWYWx1ZTtcbiAgICAgIGlmIChhcHBseUltcGxpY2l0VmFsdWUpIHtcbiAgICAgICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IGltcGxpY2l0VmFsdWU7XG5cbiAgICAgICAgLy8gUHJldmlldyB0aGUgaW1wbGljaXQgaW4gdGhlIGlucHV0IHRleHQgKGFuZCBzZWxlY3QgdGhlIGFkZGVkIHBhcnQpXG4gICAgICAgIGlmICh0aGlzLnByZXZpZXdJbXBsaWNpdFZhbHVlICYmIHRoaXMubWF0SW5wdXRUZXh0Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3Qgc2VhcmNoVGV4dCA9IHRoaXMubWF0SW5wdXRUZXh0Lm5hdGl2ZUVsZW1lbnQudmFsdWU7XG5cbiAgICAgICAgICAvLyBDb21wbGV0ZSB0aGUgc2VhcmNoIHRleHQsIHdpdGggdGhlIGZ1bGwgaW1wbGljaXQgdmFsdWUgYXBwbGllZFxuICAgICAgICAgIGlmICghUmVnRXhwVXRpbHMuaGFzV2lsZGNhcmRDaGFyYWN0ZXIoc2VhcmNoVGV4dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IHRoaXMuZGlzcGxheVdpdGgoaW1wbGljaXRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoZGlzcGxheVZhbHVlLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChzZWFyY2hUZXh0LnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgIC8vIFNlbGVjdCB0aGUgYWRkaXRpb25hbCB0ZXh0IHRvIG1hdGNoIHRoZSBpbXBsaWNpdCB2YWx1ZVxuICAgICAgICAgICAgICB0aGlzLnNldElucHV0VGV4dFZhbHVlKGRpc3BsYXlWYWx1ZSwgc2VhcmNoVGV4dC5sZW5ndGgsIGRpc3BsYXlWYWx1ZS5sZW5ndGgsICdiYWNrd2FyZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIENvbnRpbnVlIDogcmVzdGUgaW1wbGljaXQgdmFsdWVcbiAgICB9XG5cbiAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmVG91Y2hlZCgpIHtcbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbC50b3VjaGVkKSB7XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEF1dG9jb21wbGV0ZVBhbmVsKCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBlbGUgPSB0aGlzLmF1dG9jb21wbGV0ZT8ub3B0aW9ucy5sYXN0Py5fZ2V0SG9zdEVsZW1lbnQoKS5wYXJlbnRFbGVtZW50O1xuICAgIGlmICghZWxlKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgY29uc29sZS53YXJuKHRoaXMubG9nUHJlZml4ICsgJyBVbmFibGUgdG8gZmluZCB0aGUgYXV0b2NvbXBsZXRlIGRpdi4uLicpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYXRTZWxlY3RQYW5lbChvcHRpb24/OiBNYXRPcHRpb24pOiBIVE1MRWxlbWVudCB7XG4gICAgb3B0aW9uID0gb3B0aW9uID8/IHRoaXMubWF0U2VsZWN0Lm9wdGlvbnMubGFzdDtcbiAgICBjb25zdCBlbGUgPSBvcHRpb24/Ll9nZXRIb3N0RWxlbWVudCgpLnBhcmVudEVsZW1lbnQ7XG4gICAgaWYgKCFlbGUpIHtcbiAgICAgIC8vIERFQlVHXG4gICAgICBjb25zb2xlLndhcm4odGhpcy5sb2dQcmVmaXggKyAnIFVuYWJsZSB0byBmaW5kIHRoZSBtYXQtc2VsZWN0IGNvbnRhaW5lci4uLicpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpeE1hdFNlbGVjdFBvc2l0aW9uQW5kU2VhcmNoYmFyKCkge1xuICAgIGlmICghdGhpcy5tYXRTZWxlY3QpIHJldHVybjtcblxuICAgIC8vIEhpZGUgdGhlIHBhbmVsICh3aWxsIGJlIHNob3cgd2hlbiByZWFkeSlcbiAgICB0aGlzLm1hdFNlbGVjdC5wYW5lbENsYXNzID0gJ2hpZGRlbic7XG5cbiAgICBsZXQgc2VhcmNoQmFyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMubWF0U2VsZWN0Lm9wZW5lZENoYW5nZS5zdWJzY3JpYmUoYXN5bmMgKG9wZW4pID0+IHtcbiAgICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgICAvLyBXYWl0IHBhbmVsIHRvIGJlIGNyZWF0ZWRcbiAgICAgICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+ICEhdGhpcy5tYXRTZWxlY3QucGFuZWwsIHtzdG9wOiB0aGlzLl9kZXN0cm95JH0pO1xuICAgICAgICAgIGNvbnN0IHBhbmVsRWxlbWVudCA9IHRoaXMubWF0U2VsZWN0LnBhbmVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgY29uc3Qgb3ZlcmxheVBhbmUgPSBmaW5kUGFyZW50V2l0aENsYXNzKHBhbmVsRWxlbWVudCwgJ2Nkay1vdmVybGF5LXBhbmUnKTtcblxuICAgICAgICAgIC8vIEZpeCBwYW5lbCBwb3NpdGlvbiwgd2hlbiBvdmVybGF5IGhhcyBhbiB0cmFuc2Zvcm1YIChhZGRlZCB3aGVuIGtleWJvYXJkIGlzIHNob3duKVxuICAgICAgICAgIHRoaXMuX2ZpeE1hdFNlbGVjdFBhbmVsUG9zaXRpb24ob3ZlcmxheVBhbmUpO1xuXG4gICAgICAgICAgLy8gRml4IG92ZXJsYXksIGZvciBzZWFyY2hiYXJcbiAgICAgICAgICBpZiAodGhpcy5zaG93U2VhcmNoQmFyKSB7XG4gICAgICAgICAgICBzZWFyY2hCYXJTdWJzY3JpcHRpb24gPSBhd2FpdCB0aGlzLl9maXhTZWFyY2hiYXJPdmVybGF5KHBhbmVsRWxlbWVudCwgb3ZlcmxheVBhbmUpO1xuICAgICAgICAgICAgaWYgKHNlYXJjaEJhclN1YnNjcmlwdGlvbikgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChzZWFyY2hCYXJTdWJzY3JpcHRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNob3cgdGhlIHBhbmVsXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhwYW5lbEVsZW1lbnQsICdoaWRkZW4nKTtcbiAgICAgICAgICB0aGlzLm1hdFNlbGVjdC5wYW5lbENsYXNzID0gdGhpcy5wYW5lbENsYXNzO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9OIGNsb3NlXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIC8vIFVuc3Vic2NyaWJlIHNlYXJjaCBiYXIgd29ya2Fyb3VuZFxuICAgICAgICAgIGlmIChzZWFyY2hCYXJTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHNlYXJjaEJhclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZShzZWFyY2hCYXJTdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgc2VhcmNoQmFyU3Vic2NyaXB0aW9uID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gSGlkZSBwYW5lbCBhZ2FpblxuICAgICAgICAgICAgdGhpcy5tYXRTZWxlY3QucGFuZWxDbGFzcyA9ICdoaWRkZW4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZml4TWF0U2VsZWN0UGFuZWxQb3NpdGlvbihvdmVybGF5UGFuZTogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoIW92ZXJsYXlQYW5lKSByZXR1cm47XG5cbiAgICAvLyBSZW1vdmUgdGhlIHVud2FudGVkIGRlZmF1bHQgdHJhbnNsYXRlWFxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICBvdmVybGF5UGFuZSxcbiAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgb3ZlcmxheVBhbmUuc3R5bGUudHJhbnNmb3JtXG4gICAgICAgIC5zcGxpdCgnICcpXG4gICAgICAgIC5maWx0ZXIoKHByb3ApID0+ICFwcm9wLm1hdGNoKC9edHJhbnNsYXRlWC8pKVxuICAgICAgICAuam9pbignICcpXG4gICAgKTtcblxuICAgIC8vIEZpeCBwYW5lbCB3aWR0aCB0byBmaWVsZCB3aWR0aCAoaXQgd2FzIG5vdCBmb3JjZWQgYnkgQElucHV0IHBhbmVsV2lkdGgpXG4gICAgaWYgKCF0aGlzLnBhbmVsV2lkdGgpIHtcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5sb2dQcmVmaXh9IEZpeGluZyBzZWxlY3QgcGFuZWwgd2lkdGggdG8gdGhlIGZpZWxkIHNpemVgKTtcbiAgICAgIGNvbnN0IHdpZHRoID0gYCR7dGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIC0gMX1weGA7XG4gICAgICBpZiAodGhpcy5fZGVmYXVsdFBhbmVsV2lkdGggIT09IHdpZHRoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQYW5lbFdpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3ZlcmxheVBhbmUsICd3aWR0aCcsIHdpZHRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaXggcGFuZWwncyBsZWZ0LCB0byBhdm9pZCBvdmVyZmxvdyBvbiB0aGUgcmlnaHRcbiAgICBjb25zdCBsZWZ0ID0gb3ZlcmxheVBhbmUuc3R5bGUubGVmdDtcbiAgICBpZiAoaXNOb3ROaWxPckJsYW5rKGxlZnQpICYmICFsZWZ0LmluY2x1ZGVzKCdjYWxjKCcpICYmIGxlZnQuZW5kc1dpdGgoJ3B4JykpIHtcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5sb2dQcmVmaXh9IEZpeGluZyBzZWxlY3QgcGFuZWwgbGVmdCwgdG8gYXZvaWQgb3ZlcmZsb3cgb24gdGhlIHJpZ2h0YCk7XG4gICAgICBjb25zdCB3aWR0aCA9IGAke292ZXJsYXlQYW5lLmNsaWVudFdpZHRofXB4YDtcbiAgICAgIGNvbnN0IGZpeExlZnQgPSBgY2FsYygtJHt3aWR0aH0gKyBtaW4oJHtsZWZ0fSArICR7d2lkdGh9LCAtMzJweCArIDEwMHZ3KSlgO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShvdmVybGF5UGFuZSwgJ2xlZnQnLCBmaXhMZWZ0LCBSZW5kZXJlclN0eWxlRmxhZ3MyLkltcG9ydGFudCk7XG4gICAgfVxuXG4gICAgLy8gRml4IHBhbmVsJ3MgdG9wLCB0byBhdm9pZCBvdmVyZmxvdyBvbiB0aGUgYm90dG9tXG4gICAgY29uc3QgdG9wID0gb3ZlcmxheVBhbmUuc3R5bGUudG9wO1xuICAgIGlmIChpc05vdE5pbE9yQmxhbmsodG9wKSAmJiAhdG9wLmluY2x1ZGVzKCdjYWxjKCcpICYmIHRvcC5lbmRzV2l0aCgncHgnKSkge1xuICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLmxvZ1ByZWZpeH0gRml4aW5nIHNlbGVjdCBwYW5lbCB0b3AsIHRvIGF2b2lkIG92ZXJmbG93IG9uIHRoZSBib3R0b21gKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IGAke292ZXJsYXlQYW5lLmNsaWVudEhlaWdodCB8fCAyNzV9cHhgO1xuICAgICAgY29uc3QgZml4VG9wID0gYGNhbGMoLSR7aGVpZ2h0fSArIG1pbigke3RvcH0gKyAke2hlaWdodH0sIC0zMnB4ICsgMTAwdmgpKWA7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG92ZXJsYXlQYW5lLCAndG9wJywgZml4VG9wLCBSZW5kZXJlclN0eWxlRmxhZ3MyLkltcG9ydGFudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhY2sgOiBpZiB3ZSBhcmUgaW4gYSBJb25Nb2RhbCwgaXQncyBuZWNlc3NhcnkgdG8gbW92ZSB0aGUgQ2RrT3ZlcmxheSBjb250YWluZXJcbiAgICogICAgIGluIHRoZSBJb25Nb2RhbCB0byBtaWdodCBrZWVwIGZvY3VzIGluIElvblNlYXJjaGJhci5cbiAgICpcbiAgICogQHBhcmFtIHBhbmVsRWxlbWVudFxuICAgKiBAcGFyYW0gb3ZlcmxheVBhbmVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2ZpeFNlYXJjaGJhck92ZXJsYXkocGFuZWxFbGVtZW50OiBIVE1MRWxlbWVudCwgb3ZlcmxheVBhbmU6IEhUTUxFbGVtZW50KTogUHJvbWlzZTxTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMubWF0U2VsZWN0IHx8ICF0aGlzLmlvblNlYXJjaGJhcikgcmV0dXJuO1xuXG4gICAgY29uc3QgbW9kYWxFbGVtZW50ID0gYXdhaXQgdGhpcy5tb2RhbENvbnRyb2xsZXIuZ2V0VG9wKCk7XG4gICAgaWYgKCFtb2RhbEVsZW1lbnQpIHJldHVybjsgLy8gTm8gbW9kYWw6IHNraXBcblxuICAgIC8vIEdldCB0aGUgQ0RLIG92ZXJsYXkgY29udGFpbmVyXG4gICAgY29uc3Qgb3ZlcmxheUNvbnRhaW5lciA9IGZpbmRQYXJlbnRXaXRoQ2xhc3MocGFuZWxFbGVtZW50LCAnY2RrLW92ZXJsYXktY29udGFpbmVyJyk7XG4gICAgaWYgKCFvdmVybGF5Q29udGFpbmVyKSByZXR1cm47XG4gICAgY29uc3Qgb3JpZ2luYWxQYXJlbnQgPSBvdmVybGF5Q29udGFpbmVyLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAvLyBERUJVR1xuICAgIC8vaWYgKHRoaXMuZGVidWcpXG4gICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgIGAke3RoaXMubG9nUHJlZml4fSBNb3ZpbmcgdGhlIFwiY2RrLW92ZXJsYXlcIiBjb250YWluZXIgZnJvbSB0aGUgXCIke29yaWdpbmFsUGFyZW50Py50YWdOYW1lIHx8ICdib2R5J31cIiB0byB0aGUgXCJpb24tbW9kYWxcIiBjb250YWluZXJgXG4gICAgKTtcblxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQobW9kYWxFbGVtZW50LCBvdmVybGF5Q29udGFpbmVyKTtcblxuICAgIGNvbnN0IF9kb2N1bWVudCA9IHRoaXMuaW5qZWN0b3IuZ2V0KERPQ1VNRU5UKTtcbiAgICBjb25zdCBzaGlmdExlZnQgPSAoX2RvY3VtZW50LmRlZmF1bHRWaWV3LmlubmVyV2lkdGggLSBtb2RhbEVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpIC8gMjtcbiAgICBjb25zdCBzaGlmdFRvcCA9IChfZG9jdW1lbnQuZGVmYXVsdFZpZXcuaW5uZXJIZWlnaHQgLSBtb2RhbEVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSAvIDI7XG5cbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG92ZXJsYXlQYW5lLCAnbWFyZ2luLXRvcCcsIGAtJHtzaGlmdFRvcH1weGApO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3ZlcmxheVBhbmUsICdtYXJnaW4tbGVmdCcsIGAtJHtzaGlmdExlZnR9cHhgKTtcblxuICAgIC8vIFJldHVybiB0aGUgcmV2ZXJzZSBmdW5jdGlvbiwgdG8gcmVwbGFjZSB0aGUgY29udGFpbmVyIGluIGJvZHlcbiAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbigoKSA9PiB7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy9pZiAodGhpcy5kZWJ1ZylcbiAgICAgIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5sb2dQcmVmaXh9IG1vdmluZyB0aGUgXCJjZGstb3ZlcmxheVwiIGNvbnRhaW5lciBmcm9tIHRoZSBcImlvbi1tb2RhbFwiIHRvIHRoZSBcImJvZHlcIiBjb250YWluZXJgKTtcblxuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChvcmlnaW5hbFBhcmVudCAvKnRoaXMuZG9jdW1lbnQuYm9keSovLCBvdmVybGF5Q29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SW5wdXRUZXh0VmFsdWUodmFsdWU6IHN0cmluZywgc2VsZWN0aW9uU3RhcnRJbmRleD86IG51bWJlciwgc2VsZWN0aW9uRW5kSW5kZXg/OiBudW1iZXIsIGRpcmVjdGlvbj86ICdiYWNrd2FyZCcgfCAnZm9yd2FyZCcpIHtcbiAgICAvLyBBcHBseSB0byB0aGUgaW5wdXRbdHlwZT10ZXh0XSBmaWVsZFxuICAgIGlmICh0aGlzLm1hdElucHV0VGV4dD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5tYXRJbnB1dFRleHQubmF0aXZlRWxlbWVudC52YWx1ZSA9IHZhbHVlID8/ICcnO1xuICAgICAgaWYgKGlzTm90TmlsKHNlbGVjdGlvblN0YXJ0SW5kZXgpKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHNlbGVjdElucHV0UmFuZ2UodGhpcy5tYXRJbnB1dFRleHQubmF0aXZlRWxlbWVudCwgc2VsZWN0aW9uU3RhcnRJbmRleCwgc2VsZWN0aW9uRW5kSW5kZXgsIGRpcmVjdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJhY2tzcGFjZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50Py50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcblxuICAgIC8vIElmIHByZXZpZXcgZW5hYmxlZCwgcmVtb3ZlIHNlbGVjdGlvbiB3aGVuIHByZXNzIGJhY2tzcGFjZSAoYnkgZGVmYXVsdCBvbmx5IHRoZSBzZWxlY3Rpb24gd2lsbCBiZSBkZWxldGVkKVxuICAgIGlmICh0aGlzLnByZXZpZXdJbXBsaWNpdFZhbHVlICYmIGlucHV0KSB7XG4gICAgICBjb25zdCBzZWxlY3Rpb25TdGFydCA9IGlucHV0LnNlbGVjdGlvblN0YXJ0O1xuICAgICAgY29uc3Qgc2VsZWN0aW9uRW5kID0gaW5wdXQuc2VsZWN0aW9uRW5kO1xuICAgICAgbGV0IHZhbHVlID0gaW5wdXQudmFsdWU7XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0byByZW1vdmUgdGhlIGxhc3QgdHlwZWQgY2hhcmFjdGVyIChieSBkZWZhdWx0IG9ubHkgdGhlIHNlbGVjdGlvbiB3aWxsIGJlIGRlbGV0ZWQpXG4gICAgICBpZiAodGhpcy5faW1wbGljaXRWYWx1ZSAmJiBzZWxlY3Rpb25TdGFydCA+IDAgJiYgc2VsZWN0aW9uU3RhcnQgPCBzZWxlY3Rpb25FbmQgJiYgdmFsdWUubGVuZ3RoID09PSBzZWxlY3Rpb25FbmQpIHtcbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLmxvZ1ByZWZpeH0gQmFja3NwYWNlIHByZXNzZWQsIGFkZGl0aW9uYWwgdGV4dCBmcm9tIHRoZSBpbXBsaWNpdCB2YWx1ZWApO1xuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgLy8gRGVmaW5lIHRoZSBuZXcgdmFsdWUgYnkgcmVtb3ZpbmcgdGhlIHRleHQgaW4gdGhlIGFkanVzdGVkIHJhbmdlXG4gICAgICAgIGNvbnN0IG5ld0NhcmV0UG9zaXRpb24gPSBzZWxlY3Rpb25TdGFydCAtIDE7XG4gICAgICAgIHZhbHVlID0gbmV3Q2FyZXRQb3NpdGlvbiA+IDAgPyB2YWx1ZS5zbGljZSgwLCBuZXdDYXJldFBvc2l0aW9uKSA6ICcnO1xuXG4gICAgICAgIC8vIGNsZWFuIGltcGxpY2l0IHZhbHVlXG4gICAgICAgIHRoaXMuX2ltcGxpY2l0VmFsdWUgPSBudWxsO1xuXG4gICAgICAgIC8vIEFwcGx5IHRoZSBuZXcgdmFsdWUgYW5kIHVwZGF0ZSB0aGUgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuc2V0SW5wdXRUZXh0VmFsdWUodmFsdWUsIG5ld0NhcmV0UG9zaXRpb24sIHNlbGVjdGlvbkVuZCk7XG5cbiAgICAgICAgLy8gTWFyayBjb21wb25lbnQgYXMgbG9hZGluZ1xuICAgICAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgICAgICAvLyBSZWxvYWQgaXRlbXNcbiAgICAgICAgdGhpcy5yZWxvYWRJdGVtcyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW1pdFxuICAgIHRoaXMua2V5ZG93bkJhY2tzcGFjZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVGYXZvcml0ZUNsaWNrKGV2ZW50OiBVSUV2ZW50LCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKGlzTmlsKHZhbHVlKSB8fCBldmVudD8uZGVmYXVsdFByZXZlbnRlZCB8fCAhdGhpcy50b2dnbGVGYXZvcml0ZS5vYnNlcnZlZCkgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICAvLyBERUJVR1xuICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEZhdm9yaXRlIGl0ZW0gY2xpY2tlZCcsIHZhbHVlKTtcblxuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNGYXZvcml0ZSA9IHRoaXMuZmF2b3JpdGVJdGVtcz8uc29tZSgoZmF2b3JpdGVJdGVtKSA9PiB0aGlzLmVxdWFscyhmYXZvcml0ZUl0ZW0sIHZhbHVlKSk7XG4gICAgaWYgKGlzRmF2b3JpdGUpIHtcbiAgICAgIHRoaXMuZmF2b3JpdGVJdGVtcyA9IHRoaXMuZmF2b3JpdGVJdGVtcy5maWx0ZXIoKGZhdm9yaXRlSXRlbSkgPT4gIXRoaXMuZXF1YWxzKGZhdm9yaXRlSXRlbSwgdmFsdWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mYXZvcml0ZUl0ZW1zID0gdGhpcy5mYXZvcml0ZUl0ZW1zLmNvbmNhdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBjaGFuZ2VzXG4gICAgdGhpcy50b2dnbGVGYXZvcml0ZS5lbWl0KHsgc291cmNlOiB0aGlzLm1hdFNlbGVjdCB8fCB0aGlzLmF1dG9jb21wbGV0ZSwgdmFsdWU6IHZhbHVlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhc1ZhbGlkVmFsdWUoKSB7XG4gICAgcmV0dXJuIGlzTm90TmlsKHRoaXMuZm9ybUNvbnRyb2w/LnZhbHVlKSAmJiB0aGlzLmZvcm1Db250cm9sLnZhbGlkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyU2VhcmNoYmFyKCkge1xuICAgIGlmICh0aGlzLmlvblNlYXJjaGJhcikge1xuICAgICAgdGhpcy5pb25TZWFyY2hiYXIudmFsdWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzZWxlY3RGaXJzdE9wdGlvbkJ5VGV4dCh0ZXh0OiBzdHJpbmcpe1xuICAgIGlmICghdGhpcy5pc09wZW4gfHwgaXNOaWxPckJsYW5rKHRleHQpIHx8ICF0aGlzLm1hdFNlbGVjdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBkYXRhOiBmaWx0ZXJlZEl0ZW1zIH0gPSB0b0xvYWRSZXN1bHQoYXdhaXQgdGhpcy5zdWdnZXN0Rm4odGV4dCwgdGhpcy5maWx0ZXIpKTtcbiAgICB0aGlzLnVwZGF0ZUltcGxpY2l0VmFsdWUoZmlsdGVyZWRJdGVtcyk7XG5cbiAgICBjb25zdCBmaXJzdCA9IGZpcnN0QXJyYXlWYWx1ZShmaWx0ZXJlZEl0ZW1zKTtcbiAgICBpZiAoIWZpcnN0KSByZXR1cm5cblxuICAgIC8vIEZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgb3B0aW9uc1xuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4gIXRoaXMubG9hZGluZyAmJiB0aGlzLm1hdFNlbGVjdC5vcHRpb25zPy5sZW5ndGggPiAwLCB7c3RvcDogdGhpcy5fZGVzdHJveSR9KTtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5tYXRTZWxlY3Qub3B0aW9ucy50b0FycmF5KCk7XG4gICAgbGV0IGluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgobyA9PiBvLnZhbHVlICYmIHRoaXMuZXF1YWxzKG8udmFsdWUsIGZpcnN0KSlcbiAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm47XG5cbiAgICAvLyBTZWxlY3QgYXMgaW1wbGljaXQgdmFsdWVcbiAgICBjb25zdCBhY3RpdmVPcHRpb24gPSBvcHRpb25zW2luZGV4XTtcblxuICAgIC8vIEhpZ2hsaWdodCAgdGhlIG9wdGlvblxuICAgIHRoaXMubWF0U2VsZWN0Ll9rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0oaW5kZXgpO1xuXG4gICAgLy8gU2Nyb2xsIHRvIHRoZSBvcHRpb25cbiAgICBhd2FpdCB0aGlzLnNjcm9sbFRvT3B0aW9uKGFjdGl2ZU9wdGlvbik7XG5cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzY3JvbGxUb09wdGlvbihvcHRpb246IE1hdE9wdGlvbiwgb3B0cz86IFNjcm9sbEludG9WaWV3T3B0aW9ucykge1xuICAgIGNvbnN0IG9wdGlvbkVsID0gb3B0aW9uPy5fZ2V0SG9zdEVsZW1lbnQoKTtcbiAgICBpZiAoIW9wdGlvbkVsKSByZXR1cm47XG5cbiAgICAvLyBTY3JvbGwgbm9ybWFsXG4gICAgb3B0aW9uRWwuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnLCBiZWhhdmlvcjogJ3Ntb290aCcsIC4uLm9wdHMgfSk7XG5cbiAgICAvLyBBcHBseSBhIHRvcCBvZmZzZXQsIGJlY2F1c2Ugb2YgaGVhZGVyL2Zvb3RlclxuICAgIGlmICh0aGlzLnNob3dQYW5lbEhlYWRlciB8fCB0aGlzLnNob3dQYW5lbEZvb3Rlcikge1xuXG4gICAgICAvLyBXYWl0IGZvciB0aGUgcGFuZWwgdG8gZXhpc3RzXG4gICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+ICEhb3B0aW9uRWwucGFyZW50RWxlbWVudCwge3N0b3A6IHRoaXMuX2Rlc3Ryb3kkLCB0aW1lb3V0OiAyMDB9KTtcblxuICAgICAgLy8gU2Nyb2xsIHRvIHRoZSBvcHRpb24sIHdpdGggYW4gb2Zmc2V0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gR2V0IHRoZSB1cGRhdGVkIHBhbmVsIChjYW4gaGF2ZSBjaGFuZ2VkLCB3aGVuIG11bHRpcGxlIG9wZW4vY2xvc2Ugb2NjdXJzKVxuICAgICAgICBjb25zdCBwYW5lbCA9IG9wdGlvbkVsLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3QgaGVhZGVySGVpZ2h0ID0gdGhpcy5zaG93UGFuZWxIZWFkZXIgPyAyMCA6IDA7XG4gICAgICAgIGNvbnN0IGZvb3RlckhlaWdodCA9IHRoaXMuc2hvd1BhbmVsRm9vdGVyID8gMjAgOiAwO1xuICAgICAgICBjb25zdCBvcHRpb25SZWN0ID0gb3B0aW9uRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHBhbmVsUmVjdCA9IHBhbmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIC8vIFNpIGwnb3B0aW9uIGVzdCB0cm9wIGhhdXRlIChjYWNow6llIHBhciBsZSBoZWFkZXIpXG4gICAgICAgIGlmIChvcHRpb25SZWN0LnRvcCA8IHBhbmVsUmVjdC50b3AgKyBoZWFkZXJIZWlnaHQpIHtcbiAgICAgICAgICBwYW5lbC5zY3JvbGxUb3AgLT0gKHBhbmVsUmVjdC50b3AgKyBoZWFkZXJIZWlnaHQgLSBvcHRpb25SZWN0LnRvcCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaSBsJ29wdGlvbiBlc3QgdHJvcCBiYXNzZSAoY2FjaMOpZSBwYXIgbGUgZm9vdGVyKVxuICAgICAgICBpZiAob3B0aW9uUmVjdC5ib3R0b20gPiBwYW5lbFJlY3QuYm90dG9tIC0gZm9vdGVySGVpZ2h0KSB7XG4gICAgICAgICAgcGFuZWwuc2Nyb2xsVG9wICs9IChvcHRpb25SZWN0LmJvdHRvbSAtIChwYW5lbFJlY3QuYm90dG9tIC0gZm9vdGVySGVpZ2h0KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX21hdFNlbGVjdFNlYXJjaENoYW5nZWQoc2VhcmNoVGV4dDogc3RyaW5nKSB7XG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBSZWNlaXZlZCBzZWFyY2ggY2hhbmdlc1wiLCBzZWFyY2hUZXh0KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgZGlzcGxheSB2YWx1ZSAoaW4gdGhlIHZpc2libGUgZm9ybSBjb250cm9sKVxuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5fZGlzcGxheVZhbHVlID0gc2VhcmNoVGV4dDtcbiAgICB9XG5cbiAgICAvLyBNYXJrIGNvbXBvbmVudCBhcyBsb2FkaW5nXG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICAvLyBSZWxvYWQgaXRlbXNcbiAgICB0aGlzLnJlbG9hZEl0ZW1zKHNlYXJjaFRleHQpO1xuXG4gICAgLy8gVE9ETyBGaW5kIGEgd2F5IHRvIGF2b2lkIG1hdC1zZWxlY3QgdG8gZ2l2ZSBmb2N1cyB0byBhbiBvcHRpb24sIHdoZW4gdHlwaW5nXG4gIH1cbn1cbiIsIjxpb24tZ3JpZCBjbGFzcz1cImlvbi1uby1wYWRkaW5nIGZpZWxkLWNvbnRhaW5lclwiPlxuICA8aW9uLXJvdz5cbiAgICA8aW9uLWNvbCBbc2l6ZV09XCJjb2xTaXplcz8uWzBdXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPCEtLSByZWFkb25seSAtLT5cbiAgICAgIEBpZiAoX3JlYWRvbmx5KSB7XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/IF9kaXNwbGF5VmFsdWUgfHwgJycgOiAnJ1wiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyBfZGlzcGxheVZhbHVlIHx8ICcnIDogJydcIlxuICAgICAgICAgIGNsYXNzPVwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWRcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBtYXRQcmVmaXg+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgaGlkZGVuIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHk9XCJ0cnVlXCIgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCIgLz5cbiAgICAgICAgICA8aW9uLXRleHQ+e3sgdmFsdWUgfCB0b1N0cmluZzogZGlzcGxheVdpdGggfX08L2lvbi10ZXh0PlxuICAgICAgICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBoaW50cyAtLT5cbiAgICAgICAgICBAaWYgKCFmb3JtQ29udHJvbC5pbnZhbGlkKSB7XG4gICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRIaW50VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgfVxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIEBsZXQgaGFzRmF2b3JpdGVzID0gdG9nZ2xlRmF2b3JpdGUub2JzZXJ2ZWQgfHwgKGZhdm9yaXRlSXRlbXMgfCBpc05vdEVtcHR5QXJyYXkpO1xuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/IF9kaXNwbGF5VmFsdWUgfHwgJycgOiAnJ1wiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyBfZGlzcGxheVZhbHVlIHx8ICcnIDogJydcIlxuICAgICAgICAgIFtoaWRlUmVxdWlyZWRNYXJrZXJdPVwiaGlkZVJlcXVpcmVkTWFya2VyXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgbWF0UHJlZml4PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmICgobGFiZWwgfHwgcGxhY2Vob2xkZXIpICYmIGZsb2F0TGFiZWwgIT09ICduZXZlcicpIHtcbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgbGFiZWwgfHwgcGxhY2Vob2xkZXIgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICB9XG4gICAgICAgICAgPCEtLSBNb2JpbGUgb3IgTXVsdGlwbGUgKHVzZSA8bWF0LXNlbGVjdD4pIC0tPlxuICAgICAgICAgIEBpZiAobW9iaWxlIHx8IG11bHRpcGxlKSB7XG4gICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAjbWF0U2VsZWN0XG4gICAgICAgICAgICAgIGhpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3JcbiAgICAgICAgICAgICAgZGlzYWJsZU9wdGlvbkNlbnRlcmluZ1xuICAgICAgICAgICAgICBbZGlzYWJsZVJpcHBsZV09XCJkaXNhYmxlUmlwcGxlXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIl90YWJpbmRleFwiXG4gICAgICAgICAgICAgIFtwYW5lbENsYXNzXT1cInBhbmVsQ2xhc3NcIlxuICAgICAgICAgICAgICBbcGFuZWxXaWR0aF09XCJwYW5lbFdpZHRoIHx8IF9kZWZhdWx0UGFuZWxXaWR0aFwiXG4gICAgICAgICAgICAgIChmb2N1cyk9XCJmaWx0ZXJNYXRTZWxlY3RGb2N1c0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJmaWx0ZXJNYXRTZWxlY3RCbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJlbWl0RXNjYXBlKCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiZW1pdEVudGVyKCRldmVudClcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAob3BlbmVkQ2hhbmdlKT1cIm9uTWF0U2VsZWN0T3BlbmVkQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiZXF1YWxzXCJcbiAgICAgICAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgICAgICAgICAgICAgW3R5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWxdPVwiZGVib3VuY2VUaW1lICogMTBcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgICBbY2xhc3MubWF0LW1kYy1zZWxlY3QtYXJyb3ctaGlkZGVuXT1cIiFtb2JpbGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPlxuICAgICAgICAgICAgICAgIHt7IHZhbHVlIHwgdG9TdHJpbmc6IGRpc3BsYXlXaXRoIH19XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxuICAgICAgICAgICAgICA8IS0tIFNlYXJjaCBiYXIgLS0+XG4gICAgICAgICAgICAgIEBpZiAoc2hvd1NlYXJjaEJhcikge1xuICAgICAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXAgY2xhc3M9XCJtYXQtc2VsZWN0LXNlYXJjaGJhclwiIFtjbGFzcy5tYXQtc2VsZWN0LXNlYXJjaGJhci1zdGlja3ldPVwic3RpY2t5U2VhcmNoQmFyXCI+XG4gICAgICAgICAgICAgICAgICA8IS0tIEZJWE1FIG9uIGlPUyBkZXZpY2VzLCB3aGVuIGFuaW1hdGVkPVwidHJ1ZVwiLCB0aGVuIHRoZSBzZWFyY2ggaWNvbiBvdmVybGFwIHRoZSBwbGFjZWhvbGRlciAtLT5cbiAgICAgICAgICAgICAgICAgIDxpb24tc2VhcmNoYmFyXG4gICAgICAgICAgICAgICAgICAgICNpb25TZWFyY2hiYXJcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwic2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgW2FuaW1hdGVkXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dDbGVhckJ1dHRvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2RlYm91bmNlXT1cImRlYm91bmNlVGltZVwiXG4gICAgICAgICAgICAgICAgICAgIChpb25DbGVhcik9XCJtYXJrQXNMb2FkaW5nKClcIlxuICAgICAgICAgICAgICAgICAgICAoaW9uSW5wdXQpPVwiaW9uU2VhcmNoQmFyQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidDT01NT04uQlROX1NFQVJDSCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgPjwvaW9uLXNlYXJjaGJhcj5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIDwhLS0gQ3VzdG9tIGhlYWRlciAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBhbmVsSGVhZGVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGl0ZW1Db3VudDogaXRlbUNvdW50IH1cIlxuICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPCEtLSBIZWFkZXJzIC0tPlxuICAgICAgICAgICAgICA8aW9uLXJvd1xuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LXNlbGVjdC1oZWFkZXIgY29sdW1uIHN0aWNreSBpb24tbm8tcGFkZGluZ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm11bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubWF0LXNlbGVjdC1zZWFyY2hiYXItc3RpY2t5XT1cInNob3dTZWFyY2hCYXIgJiYgc3RpY2t5U2VhcmNoQmFyXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuLS1pb24tZ3JpZC1jb2x1bW5zXT1cImhhc0Zhdm9yaXRlcyA/IDEzIDogMTJcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPCEtLSBmYXZvcml0ZSBzcGFjZXIgLS0+XG4gICAgICAgICAgICAgICAgQGlmIChoYXNGYXZvcml0ZXMpIHtcbiAgICAgICAgICAgICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCIgY2xhc3M9XCJmYXZvcml0ZS1jb2xcIj48L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwhLS0gYXR0cmlidXRlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICAgICAgQGZvciAoYXR0ciBvZiBkaXNwbGF5QXR0cmlidXRlczsgdHJhY2sgYXR0cjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxpb24tY29sIFtzaXplXT1cImRpc3BsYXlDb2x1bW5TaXplc1tpXVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIFtpbm5lckhUTUxdPVwiZGlzcGxheUNvbHVtbk5hbWVzW2ldIHwgdHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2lvbi1yb3c+XG5cbiAgICAgICAgICAgICAgPCEtLSBOb25lIG9wdGlvbiAtLT5cbiAgICAgICAgICAgICAgQGlmICghcmVxdWlyZWQgJiYgIW11bHRpcGxlICYmICFjbGVhcmFibGUgJiYgKHNob3dBbGxPbkZvY3VzIHx8ICFfZGlzcGxheVZhbHVlKSkge1xuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+PGkgdHJhbnNsYXRlPkNPTU1PTi5FTVBUWV9PUFRJT048L2k+PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChfJGZpbHRlcmVkSXRlbXMgfCBwdXNoOiAndXNlckJsb2NraW5nJzsgYXMgaXRlbXMpIHtcbiAgICAgICAgICAgICAgICA8IS0tIE5vIGl0ZW0gb3B0aW9uIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoaXRlbXMgfCBpc0VtcHR5QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiaW9uLXBhZGRpbmcgdGV4dC1pdGFsaWNcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8aT57eyBub1Jlc3VsdE1lc3NhZ2UgfCB0cmFuc2xhdGUgfX08L2k+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChfaGlkZGVuU2VhcmNoVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgKDxiPnt7IF9oaWRkZW5TZWFyY2hUZXh0IH19PC9iPilcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgPCEtLSBPcHRpb25zIC0tPlxuICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBpdGVtczsgdHJhY2sgaTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgQGxldCBpc0Zhdm9yaXRlID0gaGFzRmF2b3JpdGVzICYmIChmYXZvcml0ZUl0ZW1zIHwgYXJyYXlJbmNsdWRlczogaXRlbSk7XG5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW1cIiBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCIgW2NsYXNzLm1kYy1saXN0LWl0ZW0tLWZhdm9yaXRlXT1cImlzRmF2b3JpdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW9uLXJvdyBbY2xhc3NMaXN0XT1cIml0ZW0/LmNsYXNzTGlzdCB8fCAnJ1wiIFtzdHlsZS4tLWlvbi1ncmlkLWNvbHVtbnNdPVwiaGFzRmF2b3JpdGVzID8gMTMgOiAxMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBmYXZvcml0ZSBpY29uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChoYXNGYXZvcml0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIiBjbGFzcz1cImZhdm9yaXRlLWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXNGYXZvcml0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJzdGFyXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYXR0cmlidXRlIGNvbHVtbnMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChwYXRoIG9mIGRpc3BsYXlBdHRyaWJ1dGVzOyB0cmFjayBqOyBsZXQgaiA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbCBbc2l6ZV09XCJkaXNwbGF5Q29sdW1uU2l6ZXNbal1cIiBjbGFzcz1cImlvbi1hbGlnbi1zZWxmLWNlbnRlciBpb24tdGV4dC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHJvcGVydHlHZXQ6IHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhpZ2hsaWdodDogeyBzZWFyY2g6IGlvblNlYXJjaGJhcj8udmFsdWUsIHdpdGhBY2NlbnQ6IGhpZ2hsaWdodEFjY2VudCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8IS0tIE1vcmUgaXRlbSAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKF9tb3JlSXRlbXNDb3VudCkge1xuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJpb24tcGFkZGluZyBtYXQtcHNldWRvLWNoZWNrYm94LWhpZGRlblwiIChuZ0luaXQpPVwiX2luaXRNYXRTZWxlY3RJbmZpbml0ZVNjcm9sbCgpXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoKF9kaXNwbGF5VmFsdWUgfCBzdHJMZW5ndGgpIDwgc3VnZ2VzdExlbmd0aFRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIDwhLS0gbmVlZCBtb3JlIGNoYXJhY3RlciAtLT5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1wYWRkaW5nIHRleHQtaXRhbGljIG1hdC1wc2V1ZG8tY2hlY2tib3gtaGlkZGVuXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICB7eyAnSU5GTy5QTEVBU0VfVFlQRV9NT1JFX0NIQVJBQ1RFUlMnIHwgdHJhbnNsYXRlOiB7IG1pbkxlbmd0aDogc3VnZ2VzdExlbmd0aFRocmVzaG9sZCB9IH19XG4gICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDwhLS0gbG9hZGluZyBzcGlubmVyIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiaW9uLXBhZGRpbmcgbWF0LXBzZXVkby1jaGVja2JveC1oaWRkZW5cIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIDwhLS0gZm9vdGVyIC0tPlxuICAgICAgICAgICAgICBAaWYgKHNob3dQYW5lbEZvb3RlciAmJiBpdGVtQ291bnQ7IGFzIGNvdW50KSB7XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJtYXQtb3B0aW9uLWZvb3RlciBtYXQtYXV0b2NvbXBsZXRlLWZvb3RlciBtYXQtcHNldWRvLWNoZWNrYm94LWhpZGRlbiBpb24tbm8tcGFkZGluZ1wiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0IGNsYXNzPVwiaW9uLWZsb2F0LWVuZCBpb24tcGFkZGluZy1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGk+e3sgJ0NPTU1PTi5SRVNVTFRfQ09VTlQnIHwgdHJhbnNsYXRlOiB7IGNvdW50OiBjb3VudCB9IH19PC9pPlxuICAgICAgICAgICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICA8IS0tIEN1c3RvbSBmb290ZXIgLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJwYW5lbEZvb3RlclRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBpdGVtQ291bnQ6IGl0ZW1Db3VudCB9XCJcbiAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPCEtLSBkZXNrdG9wICh1c2UgbWF0LWF1dG9jb21wbGV0ZSkgLS0+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgI21hdElucHV0VGV4dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZVBvc2l0aW9uXT1cIm1hdEF1dG9jb21wbGV0ZVBvc2l0aW9uXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIihsYWJlbCB8fCBmbG9hdExhYmVsID09PSAnbmV2ZXInKSAmJiBwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCJcbiAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIl90YWJpbmRleFwiXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjbGlja2VkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChmb2N1cyk9XCJmaWx0ZXJJbnB1dFRleHRGb2N1c0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJmaWx0ZXJJbnB1dFRleHRCbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJlbWl0RXNjYXBlKCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5iYWNrc3BhY2UpPVwib25CYWNrc3BhY2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJlbWl0RW50ZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXl1cC5hcnJvd1VwKT1cImVtaXRBcnJvd1VwKCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5dXAuYXJyb3dEb3duKT1cImVtaXRBcnJvd0Rvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPCEtLSBhdXRvY29tcGxldGUgLS0+XG4gICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAjYXV0b2NvbXBsZXRlPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgW2F1dG9BY3RpdmVGaXJzdE9wdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2hpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3JdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5V2l0aFwiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJwYW5lbENsYXNzXCJcbiAgICAgICAgICAgICAgW3BhbmVsV2lkdGhdPVwicGFuZWxXaWR0aFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlUmlwcGxlXT1cImRpc2FibGVSaXBwbGVcIlxuICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25PcHRpb25TZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9wZW5lZCk9XCJvcGVuZWRDaGFuZ2UuZW1pdCh0cnVlKVwiXG4gICAgICAgICAgICAgIChjbG9zZWQpPVwib3BlbmVkQ2hhbmdlLmVtaXQoZmFsc2UpXCJcbiAgICAgICAgICAgID5cblxuICAgICAgICAgICAgICA8IS0tIEN1c3RvbSBoZWFkZXIgLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJwYW5lbEhlYWRlclRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBpdGVtQ291bnQ6IGl0ZW1Db3VudCB9XCJcbiAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDwhLS0gSGVhZGVycyAtLT5cbiAgICAgICAgICAgICAgQGlmIChzaG93UGFuZWxIZWFkZXIpIHtcbiAgICAgICAgICAgICAgICA8aW9uLXJvd1xuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtYXV0b2NvbXBsZXRlLWhlYWRlciBjb2x1bW4gc3RpY2t5IGlvbi1uby1wYWRkaW5nXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS4tLWlvbi1ncmlkLWNvbHVtbnNdPVwiaGFzRmF2b3JpdGVzID8gMTMgOiAxMlwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPCEtLSBmYXZvcml0ZSBzcGFjZXIgLS0+XG4gICAgICAgICAgICAgICAgICBAaWYgKGhhc0Zhdm9yaXRlcykge1xuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiIGNsYXNzPVwiZmF2b3JpdGUtY29sXCI+PC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGZvciAoYXR0ciBvZiBkaXNwbGF5QXR0cmlidXRlczsgdHJhY2sgYXR0cjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPGlvbi1jb2wgW3NpemVdPVwiZGlzcGxheUNvbHVtblNpemVzW2ldXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBbaW5uZXJIVE1MXT1cImRpc3BsYXlDb2x1bW5OYW1lc1tpXSB8IHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoXyRmaWx0ZXJlZEl0ZW1zIHwgcHVzaDogJ3VzZXJCbG9ja2luZyc7IGFzIGl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBObyBpdGVtIG9wdGlvbiAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKGl0ZW1zIHwgaXNFbXB0eUFycmF5KSB7XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1wYWRkaW5nIHRleHQtaXRhbGljXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGk+e3sgbm9SZXN1bHRNZXNzYWdlIHwgdHJhbnNsYXRlIH19PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIDwhLS0gT3B0aW9ucyAtLT5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXM7IHRyYWNrIGk7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIEBsZXQgaXNGYXZvcml0ZSA9IGhhc0Zhdm9yaXRlcyAmJiAoZmF2b3JpdGVJdGVtcyB8IGFycmF5SW5jbHVkZXM6IGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWRdPVwiaXRlbSA9PT0gX3NlbGVjdGVkSXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1kYy1saXN0LWl0ZW0tLWZhdm9yaXRlXT1cImlzRmF2b3JpdGVcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1yb3cgW2NsYXNzTGlzdF09XCJpdGVtPy5jbGFzc0xpc3QgfHwgJydcIiBbc3R5bGUuLS1pb24tZ3JpZC1jb2x1bW5zXT1cImhhc0Zhdm9yaXRlcyA/IDEzIDogMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZmF2b3JpdGUgaWNvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaGFzRmF2b3JpdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tY29sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0UHJlZml4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cImF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmF2b3JpdGUtY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRmF2b3JpdGVDbGljaygkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXNGYXZvcml0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJzdGFyXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAodG9nZ2xlRmF2b3JpdGUub2JzZXJ2ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwic3Rhci1vdXRsaW5lXCIgY29sb3I9XCJtZWRpdW1cIiBjbGFzcz1cInZpc2libGUtaG92ZXJcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAocGF0aCBvZiBkaXNwbGF5QXR0cmlidXRlczsgdHJhY2sgajsgbGV0IGogPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1jb2xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCJkaXNwbGF5Q29sdW1uU2l6ZXNbal1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyB0ZXh0LmlubmVyVGV4dCA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/IHRleHQuaW5uZXJUZXh0IDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW9uLWFsaWduLXNlbGYtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHJvcGVydHlHZXQ6IHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaGlnaGxpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoOiBtYXRJbnB1dFRleHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQWNjZW50OiBoaWdobGlnaHRBY2NlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8IS0tIE1vcmUgaXRlbSAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKF9tb3JlSXRlbXNDb3VudCkge1xuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJpb24tcGFkZGluZ1wiIChuZ0luaXQpPVwiX2luaXRBdXRvY29tcGxldGVJbmZpbml0ZVNjcm9sbCgpXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoKF9kaXNwbGF5VmFsdWUgfCBzdHJMZW5ndGgpIDwgc3VnZ2VzdExlbmd0aFRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIDwhLS0gTmVlZCBtb3JlIGNoYXJhY3RlcnMgLS0+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJpb24tcGFkZGluZyB0ZXh0LWl0YWxpY1wiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAge3sgJ0lORk8uUExFQVNFX1RZUEVfTU9SRV9DSEFSQUNURVJTJyB8IHRyYW5zbGF0ZTogeyBtaW5MZW5ndGg6IHN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgfSB9fVxuICAgICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8IS0tIExvYWRpbmcgc3Bpbm5lciAtLT5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1wYWRkaW5nXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICA8IS0tIGZvb3RlciAtLT5cbiAgICAgICAgICAgICAgQGlmIChzaG93UGFuZWxGb290ZXIgJiYgaXRlbUNvdW50OyBhcyBjb3VudCkge1xuICAgICAgICAgICAgICAgIDxpb24tcm93IGNsYXNzPVwibWF0LWF1dG9jb21wbGV0ZS1mb290ZXIgaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxpb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJpb24tZmxvYXQtZW5kIGlvbi1wYWRkaW5nLWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpPnt7ICdDT01NT04uUkVTVUxUX0NPVU5UJyB8IHRyYW5zbGF0ZTogeyBjb3VudDogY291bnQgfSB9fTwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICA8IS0tIEN1c3RvbSBmb290ZXIgLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJwYW5lbEZvb3RlclRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBpdGVtQ291bnQ6IGl0ZW1Db3VudCB9XCJcbiAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgfVxuICAgICAgICAgIDwhLS1cbiAgICAgICAgICBOT1RFIDpcbiAgICAgICAgICAtIFwic2VsZWN0SW5wdXRDb250ZW50KCRldmVudCkgfHwgb25Gb2N1cy5lbWl0KCRldmVudClcIiA6IGNhbGwgb25Gb2N1cyBvbmx5IHdoZW4gdG8gdGhlIGlucHV0IGlzIGVtcHR5IChub3RoaW5nIHRvIHNlbGVjdClcbiAgICAgICAgICAtLT5cbiAgICAgICAgICA8ZGl2IG1hdFN1ZmZpeD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XG4gICAgICAgICAgICA8bWF0LWVycm9yIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGZvcm1Db250cm9sPy5oYXNFcnJvcignZW50aXR5JykpIHtcbiAgICAgICAgICAgIDxtYXQtZXJyb3IgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX0lOVkFMSUQ8L21hdC1lcnJvcj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEVycm9yVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8IS0tIEhpbnRzIC0tPlxuICAgICAgICAgIEBpZiAoIWZvcm1Db250cm9sPy5pbnZhbGlkKSB7XG4gICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRIaW50VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgfVxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgfVxuICAgIDwvaW9uLWNvbD5cbiAgICA8aW9uLWNvbCBbc2l6ZV09XCJjb2xTaXplcz8uWzFdXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdEFmdGVyXVwiPjwvbmctY29udGVudD5cbiAgICA8L2lvbi1jb2w+XG4gIDwvaW9uLXJvdz5cbjwvaW9uLWdyaWQ+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0UHJlZml4VGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRQcmVmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtYXRTdWZmaXhUZW1wbGF0ZT5cbiAgQGlmICghbW9iaWxlKSB7XG4gICAgPGJ1dHRvblxuICAgICAgbWF0U3VmZml4XG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlU2hvd1BhbmVsKCRldmVudClcIlxuICAgICAgW2hpZGRlbl09XCJkaXNhYmxlZFwiXG4gICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKGRyb3BCdXR0b25UaXRsZSB8fCAnJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/IChkcm9wQnV0dG9uVGl0bGUgfHwgJycgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj57eyBtb2JpbGUgPyAnYXJyb3dfZHJvcF9kb3duJyA6ICdrZXlib2FyZF9hcnJvd19kb3duJyB9fTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIH1cbiAgQGlmIChjbGVhcmFibGUpIHtcbiAgICA8YnV0dG9uXG4gICAgICBtYXRTdWZmaXhcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKCRldmVudClcIlxuICAgICAgW2hpZGRlbl09XCJkaXNhYmxlZCB8fCAhZm9ybUNvbnRyb2wudmFsdWVcIlxuICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/IChjbGVhckJ1dHRvblRpdGxlIHx8ICcnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKGNsZWFyQnV0dG9uVGl0bGUgfHwgJycgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIH1cblxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0U3VmZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0RXJyb3JUZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWVycm9yLFttYXRFcnJvcl1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21hdEhpbnRUZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXdyYXBwZXJcIj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtaGludDpub3QoW2FsaWduPSdlbmQnXSksW21hdEhpbnRdXCI+PC9uZy1jb250ZW50PlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtaGludC1zcGFjZXJcIj48L2Rpdj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtaGludFthbGlnbj0nZW5kJ11cIj48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|