igniteui-angular 16.1.6 → 16.1.7

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.
Files changed (43) hide show
  1. package/esm2022/lib/grids/filtering/excel-style/common.mjs +6 -1
  2. package/esm2022/lib/grids/filtering/excel-style/excel-style-filtering.component.mjs +2 -2
  3. package/esm2022/lib/grids/filtering/excel-style/excel-style-search.component.mjs +148 -6
  4. package/esm2022/lib/grids/pivot-grid/pivot-data-selector.component.mjs +2 -2
  5. package/esm2022/lib/grids/pivot-grid/pivot-grid.component.mjs +2 -2
  6. package/esm2022/lib/grids/pivot-grid/pivot-header-row.component.mjs +2 -2
  7. package/esm2022/lib/list/list-item.component.mjs +9 -4
  8. package/esm2022/lib/list/list.component.mjs +10 -4
  9. package/fesm2022/igniteui-angular.mjs +215 -58
  10. package/fesm2022/igniteui-angular.mjs.map +1 -1
  11. package/lib/core/styles/components/list/_list-component.scss +5 -0
  12. package/lib/core/styles/components/list/_list-theme.scss +10 -0
  13. package/lib/grids/filtering/excel-style/common.d.ts +8 -0
  14. package/lib/grids/filtering/excel-style/excel-style-search.component.d.ts +25 -3
  15. package/lib/list/list-item.component.d.ts +5 -3
  16. package/lib/list/list.component.d.ts +4 -2
  17. package/package.json +1 -1
  18. package/styles/igniteui-angular-dark.css +1 -1
  19. package/styles/igniteui-angular.css +1 -1
  20. package/styles/igniteui-bootstrap-dark.css +1 -1
  21. package/styles/igniteui-bootstrap-light.css +1 -1
  22. package/styles/igniteui-dark-green.css +1 -1
  23. package/styles/igniteui-fluent-dark-excel.css +1 -1
  24. package/styles/igniteui-fluent-dark-word.css +1 -1
  25. package/styles/igniteui-fluent-dark.css +1 -1
  26. package/styles/igniteui-fluent-light-excel.css +1 -1
  27. package/styles/igniteui-fluent-light-word.css +1 -1
  28. package/styles/igniteui-fluent-light.css +1 -1
  29. package/styles/igniteui-indigo-dark.css +1 -1
  30. package/styles/igniteui-indigo-light.css +1 -1
  31. package/styles/maps/igniteui-angular-dark.css.map +1 -1
  32. package/styles/maps/igniteui-angular.css.map +1 -1
  33. package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
  34. package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
  35. package/styles/maps/igniteui-dark-green.css.map +1 -1
  36. package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
  37. package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
  38. package/styles/maps/igniteui-fluent-dark.css.map +1 -1
  39. package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
  40. package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
  41. package/styles/maps/igniteui-fluent-light.css.map +1 -1
  42. package/styles/maps/igniteui-indigo-dark.css.map +1 -1
  43. package/styles/maps/igniteui-indigo-light.css.map +1 -1
@@ -1,4 +1,4 @@
1
- import { Component, ViewChild, TemplateRef, Directive, HostBinding } from '@angular/core';
1
+ import { Component, ViewChild, TemplateRef, Directive, HostBinding, Input, ViewChildren } from '@angular/core';
2
2
  import { IgxInputDirective } from '../../../directives/input/input.directive';
3
3
  import { DisplayDensity } from '../../../core/density';
4
4
  import { IgxForOfDirective } from '../../../directives/for-of/for_of.directive';
@@ -23,6 +23,7 @@ import { FormsModule } from '@angular/forms';
23
23
  import { IgxPrefixDirective } from '../../../directives/prefix/prefix.directive';
24
24
  import { IgxIconComponent } from '../../../icon/icon.component';
25
25
  import { IgxInputGroupComponent } from '../../../input-group/input-group.component';
26
+ import { Navigate } from '../../../drop-down/drop-down.common';
26
27
  import * as i0 from "@angular/core";
27
28
  import * as i1 from "./base-filtering.component";
28
29
  import * as i2 from "../../../core/utils";
@@ -44,6 +45,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImpor
44
45
  standalone: true
45
46
  }]
46
47
  }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
48
+ let NEXT_ID = 0;
47
49
  /**
48
50
  * A component used for presenting Excel style search UI.
49
51
  */
@@ -123,6 +125,9 @@ export class IgxExcelStyleSearchComponent {
123
125
  * @hidden @internal
124
126
  */
125
127
  this.displayedListData = [];
128
+ this.activeDescendant = '';
129
+ this._id = `igx-excel-style-search-${NEXT_ID++}`;
130
+ this._focusedItem = null;
126
131
  this.destroy$ = new Subject();
127
132
  /**
128
133
  * @hidden @internal
@@ -215,7 +220,6 @@ export class IgxExcelStyleSearchComponent {
215
220
  selectAllBtn.indeterminate = true;
216
221
  }
217
222
  }
218
- eventArgs.checkbox.nativeCheckbox.nativeElement.blur();
219
223
  }
220
224
  /**
221
225
  * @hidden @internal
@@ -279,6 +283,24 @@ export class IgxExcelStyleSearchComponent {
279
283
  // an igxForContainerSize = undefined, thus assigns the chunkSize to the igxForOf.length which leads to performance issues.
280
284
  return 0;
281
285
  }
286
+ get id() {
287
+ return this._id;
288
+ }
289
+ set id(value) {
290
+ this._id = value;
291
+ }
292
+ getItemId(index) {
293
+ return `${this.id}-item-${index}`;
294
+ }
295
+ setActiveDescendant() {
296
+ this.activeDescendant = this.focusedItem?.id || '';
297
+ }
298
+ get focusedItem() {
299
+ return this._focusedItem;
300
+ }
301
+ set focusedItem(val) {
302
+ this._focusedItem = val;
303
+ }
282
304
  /**
283
305
  * @hidden @internal
284
306
  */
@@ -473,6 +495,54 @@ export class IgxExcelStyleSearchComponent {
473
495
  }
474
496
  this.esf.closeDropdown();
475
497
  }
498
+ handleKeyDown(event) {
499
+ if (event) {
500
+ const key = event.key.toLowerCase();
501
+ const navKeys = ['space', 'spacebar', ' ',
502
+ 'arrowup', 'up', 'arrowdown', 'down', 'home', 'end'];
503
+ if (navKeys.indexOf(key) === -1) { // If key has appropriate function in DD
504
+ return;
505
+ }
506
+ event.preventDefault();
507
+ event.stopPropagation();
508
+ switch (key) {
509
+ case 'arrowup':
510
+ case 'up':
511
+ this.onArrowUpKeyDown();
512
+ break;
513
+ case 'arrowdown':
514
+ case 'down':
515
+ this.onArrowDownKeyDown();
516
+ break;
517
+ case 'home':
518
+ this.onHomeKeyDown();
519
+ break;
520
+ case 'end':
521
+ this.onEndKeyDown();
522
+ break;
523
+ case 'space':
524
+ case 'spacebar':
525
+ case ' ':
526
+ this.onActionKeyDown();
527
+ break;
528
+ default:
529
+ return;
530
+ }
531
+ }
532
+ }
533
+ onFocus() {
534
+ const firstIndexInView = this.virtDir.state.startIndex;
535
+ this.focusedItem = {
536
+ id: this.getItemId(firstIndexInView),
537
+ index: firstIndexInView,
538
+ checked: this.virtDir.igxForOf[firstIndexInView].isSelected
539
+ };
540
+ this.setActiveDescendant();
541
+ }
542
+ onFocusOut() {
543
+ this.focusedItem = null;
544
+ this.setActiveDescendant();
545
+ }
476
546
  /**
477
547
  * @hidden @internal
478
548
  */
@@ -564,18 +634,82 @@ export class IgxExcelStyleSearchComponent {
564
634
  this.searchValue = this.searchInput.value;
565
635
  }
566
636
  }
637
+ onArrowUpKeyDown() {
638
+ if (this.focusedItem && this.focusedItem.index === 0 && this.virtDir.state.startIndex === 0) {
639
+ this.searchInput.focus();
640
+ this.onFocusOut();
641
+ }
642
+ else {
643
+ this.navigateItem(this.focusedItem ? this.focusedItem.index - 1 : 0);
644
+ }
645
+ this.setActiveDescendant();
646
+ }
647
+ onArrowDownKeyDown() {
648
+ const lastIndex = this.virtDir.igxForOf.length - 1;
649
+ if (this.focusedItem && this.focusedItem.index === lastIndex) {
650
+ this.cancelButton.nativeElement.focus();
651
+ this.onFocusOut();
652
+ }
653
+ else {
654
+ this.navigateItem(this.focusedItem ? this.focusedItem.index + 1 : 0);
655
+ }
656
+ this.setActiveDescendant();
657
+ }
658
+ onHomeKeyDown() {
659
+ this.navigateItem(0);
660
+ this.setActiveDescendant();
661
+ }
662
+ onEndKeyDown() {
663
+ this.navigateItem(this.virtDir.igxForOf.length - 1);
664
+ this.setActiveDescendant();
665
+ }
666
+ onActionKeyDown() {
667
+ const dataItem = this.displayedListData[this.focusedItem.index];
668
+ const args = {
669
+ checked: !dataItem.isSelected,
670
+ checkbox: this.checkboxes.find(x => x.value === dataItem)
671
+ };
672
+ this.onCheckboxChange(args);
673
+ }
674
+ navigateItem(index) {
675
+ if (index === -1 || index >= this.virtDir.igxForOf.length) {
676
+ return;
677
+ }
678
+ const direction = index > (this.focusedItem ? this.focusedItem.index : -1) ? Navigate.Down : Navigate.Up;
679
+ const scrollRequired = this.isIndexOutOfBounds(index, direction);
680
+ this.focusedItem = {
681
+ id: this.getItemId(index),
682
+ index: index,
683
+ checked: this.virtDir.igxForOf[index].isSelected
684
+ };
685
+ if (scrollRequired) {
686
+ this.virtDir.scrollTo(index);
687
+ }
688
+ }
689
+ isIndexOutOfBounds(index, direction) {
690
+ const virtState = this.virtDir.state;
691
+ const currentPosition = this.virtDir.getScroll().scrollTop;
692
+ const itemPosition = this.virtDir.getScrollForIndex(index, direction === Navigate.Down);
693
+ const indexOutOfChunk = index < virtState.startIndex || index > virtState.chunkSize + virtState.startIndex;
694
+ const scrollNeeded = direction === Navigate.Down ? currentPosition < itemPosition : currentPosition > itemPosition;
695
+ const subRequired = indexOutOfChunk || scrollNeeded;
696
+ return subRequired;
697
+ }
567
698
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: IgxExcelStyleSearchComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.BaseFilteringComponent }, { token: i2.PlatformUtil }], target: i0.ɵɵFactoryTarget.Component }); }
568
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: IgxExcelStyleSearchComponent, isStandalone: true, selector: "igx-excel-style-search", host: { properties: { "class.igx-excel-filter__menu-main": "this.defaultClass" } }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["input"], descendants: true, read: IgxInputDirective, static: true }, { propertyName: "list", first: true, predicate: ["list"], descendants: true, read: IgxListComponent }, { propertyName: "selectAllCheckbox", first: true, predicate: ["selectAllCheckbox"], descendants: true, read: IgxCheckboxComponent }, { propertyName: "addToCurrentFilterCheckbox", first: true, predicate: ["addToCurrentFilterCheckbox"], descendants: true, read: IgxCheckboxComponent }, { propertyName: "tree", first: true, predicate: ["tree"], descendants: true, read: IgxTreeComponent }, { propertyName: "virtDir", first: true, predicate: IgxForOfDirective, descendants: true, static: true }, { propertyName: "defaultExcelStyleLoadingValuesTemplate", first: true, predicate: ["defaultExcelStyleLoadingValuesTemplate"], descendants: true, read: TemplateRef }], ngImport: i0, template: "<igx-input-group\n type=\"box\"\n [displayDensity]=\"esf.displayDensity\">\n <igx-icon igxPrefix>search</igx-icon>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue\"\n (ngModelChange)=\"filterListData()\"\n (keydown)=\"onInputKeyDown($event)\"\n [placeholder]=\"esf.column?.grid.resourceStrings.igx_grid_excel_search_placeholder\"\n autocomplete=\"off\"/>\n <igx-icon\n igxSuffix\n *ngIf=\"searchValue || searchValue === 0\"\n (click)=\"clearInput()\"\n tabindex=\"0\">\n clear\n </igx-icon>\n</igx-input-group>\n\n<igx-list #list [displayDensity]=\"esf.displayDensity\" [isLoading]=\"isLoading\" *ngIf=\"!isHierarchical()\">\n <div style=\"overflow: hidden; position: relative;\">\n <igx-list-item\n *igxFor=\"let item of displayedListData scrollOrientation : 'vertical'; containerSize: containerSize; itemSize: itemSize\">\n <igx-checkbox\n [value]=\"item\"\n [tabindex]=\"-1\"\n [checked]=\"item?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"item?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onCheckboxChange($event)\">\n {{ item.label }}\n </igx-checkbox>\n </igx-list-item>\n </div>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template igxEmptyList>\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n\n <div class=\"igx-excel-filter__filter-results\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_matches_count.replace('{0}', matchesCount) }}\n </div>\n</igx-list>\n\n<div class=\"igx-excel-filter__tree\" *ngIf=\"isHierarchical()\">\n <div class=\"igx-excel-filter__tree-alike\" *ngIf=\"!isTreeEmpty()\">\n <div class=\"igx-excel-filter__tree-alike-item\">\n <igx-checkbox #selectAllCheckbox\n [value]=\"selectAllItem\"\n [checked]=\"selectAllItem?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"selectAllItem?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onSelectAllCheckboxChange($event)\">\n {{ selectAllItem.label }}\n </igx-checkbox>\n </div>\n <div class=\"igx-excel-filter__tree-alike-item\" *ngIf=\"searchValue\">\n <igx-checkbox #addToCurrentFilterCheckbox\n [value]=\"addToCurrentFilterItem\"\n [checked]=\"addToCurrentFilterItem.isSelected\"\n [disableRipple]=\"true\"\n [disableTransitions]=\"true\">\n\n {{ addToCurrentFilterItem.label }}\n </igx-checkbox>\n </div>\n </div>\n\n <igx-tree #tree [displayDensity]=\"esf.displayDensity\" selection=\"Cascading\" (nodeSelection)=\"onNodeSelectionChange($event)\">\n <igx-tree-node [data]=\"item\" *ngFor=\"let item of displayedListData;\" [selected]=\"item.isSelected\">\n <div>{{item.label}}</div>\n <igx-tree-node [data]=\"childLevel1\" *ngFor=\"let childLevel1 of item.children\" [selected]=\"childLevel1.isSelected\">\n <div>{{childLevel1.label}}</div>\n <igx-tree-node [data]=\"childLevel2\" *ngFor=\"let childLevel2 of childLevel1.children\" [selected]=\"childLevel2.isSelected\">\n <div>{{childLevel2.label}}</div>\n <igx-tree-node [data]=\"childLevel3\" *ngFor=\"let childLevel3 of childLevel2.children\" [selected]=\"childLevel3.isSelected\">\n <div>{{childLevel3.label}}</div>\n <igx-tree-node [data]=\"childLevel4\" *ngFor=\"let childLevel4 of childLevel3.children\" [selected]=\"childLevel4.isSelected\">\n <div>{{childLevel4.label}}</div>\n <igx-tree-node [data]=\"childLevel5\" *ngFor=\"let childLevel5 of childLevel4.children\" [selected]=\"childLevel5.isSelected\">\n <div>{{childLevel5.label}}</div>\n <igx-tree-node [data]=\"childLevel6\" *ngFor=\"let childLevel6 of childLevel5.children\" [selected]=\"childLevel6.isSelected\">\n <div>{{childLevel6.label}}</div>\n <igx-tree-node [data]=\"childLevel7\" *ngFor=\"let childLevel7 of childLevel6.children\" [selected]=\"childLevel7.isSelected\">\n <div>{{childLevel7.label}}</div>\n <igx-tree-node [data]=\"childLevel8\" *ngFor=\"let childLevel8 of childLevel7.children\" [selected]=\"childLevel8.isSelected\">\n <div>{{childLevel8.label}}</div>\n <igx-tree-node [data]=\"childLevel9\" *ngFor=\"let childLevel9 of childLevel8.children\" [selected]=\"childLevel9.isSelected\">\n <div>{{childLevel9.label}}</div>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template [ngIf]=\"isTreeEmpty()\">\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n</div>\n\n<ng-template #emptySearch>\n <div class=\"igx-excel-filter__empty\">\n {{esf.grid?.resourceStrings.igx_grid_excel_no_matches}}\n </div>\n</ng-template>\n\n<ng-template #defaultExcelStyleLoadingValuesTemplate>\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n</ng-template>\n\n<footer class=\"igx-excel-filter__menu-footer\">\n <div class=\"igx-excel-filter__cancel\">\n <button type=\"button\"\n igxButton=\"flat\"\n [displayDensity]=\"esf.displayDensity\"\n (click)=\"esf.cancel()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button type=\"button\"\n igxButton=\"raised\"\n [displayDensity]=\"esf.displayDensity\"\n [disabled]=\"applyButtonDisabled\"\n (click)=\"applyFilter()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n</footer>\n", dependencies: [{ kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: IgxListComponent, selector: "igx-list", inputs: ["panEndTriggeringThreshold", "id", "allowLeftPanning", "allowRightPanning", "isLoading", "resourceStrings"], outputs: ["leftPan", "rightPan", "startPan", "endPan", "resetPan", "panStateChange", "itemClicked"] }, { kind: "directive", type: IgxForOfDirective, selector: "[igxFor][igxForOf]", inputs: ["igxForOf", "igxForSizePropName", "igxForScrollOrientation", "igxForScrollContainer", "igxForContainerSize", "igxForItemSize", "igxForTotalItemCount", "igxForTrackBy"], outputs: ["chunkLoad", "scrollbarVisibilityChanged", "contentSizeChange", "dataChanged", "beforeViewDestroyed", "chunkPreload"] }, { kind: "component", type: IgxListItemComponent, selector: "igx-list-item", inputs: ["isHeader", "hidden", "index"] }, { kind: "component", type: IgxCheckboxComponent, selector: "igx-checkbox", inputs: ["id", "labelId", "value", "name", "tabindex", "labelPosition", "disableRipple", "required", "aria-labelledby", "aria-label", "indeterminate", "checked", "disabled", "invalid", "readonly", "disableTransitions"], outputs: ["change"] }, { kind: "directive", type: IgxDataLoadingTemplateDirective, selector: "[igxDataLoading]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: IgxEmptyListTemplateDirective, selector: "[igxEmptyList]" }, { kind: "component", type: IgxTreeComponent, selector: "igx-tree", inputs: ["selection", "singleBranchExpand", "animationSettings"], outputs: ["nodeSelection", "nodeExpanding", "nodeExpanded", "nodeCollapsing", "nodeCollapsed", "activeNodeChanged"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxTreeNodeComponent, selector: "igx-tree-node", inputs: ["data", "loading", "resourceStrings", "active", "disabled", "selected", "expanded"], outputs: ["selectedChange", "expandedChange"] }, { kind: "component", type: IgxCircularProgressBarComponent, selector: "igx-circular-bar", inputs: ["id", "isIndeterminate", "textVisibility", "text"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }] }); }
699
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: IgxExcelStyleSearchComponent, isStandalone: true, selector: "igx-excel-style-search", inputs: { id: "id" }, host: { properties: { "class.igx-excel-filter__menu-main": "this.defaultClass", "attr.id": "this.id" } }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["input"], descendants: true, read: IgxInputDirective, static: true }, { propertyName: "cancelButton", first: true, predicate: ["cancelButton"], descendants: true, read: IgxButtonDirective, static: true }, { propertyName: "list", first: true, predicate: ["list"], descendants: true, read: IgxListComponent }, { propertyName: "selectAllCheckbox", first: true, predicate: ["selectAllCheckbox"], descendants: true, read: IgxCheckboxComponent }, { propertyName: "addToCurrentFilterCheckbox", first: true, predicate: ["addToCurrentFilterCheckbox"], descendants: true, read: IgxCheckboxComponent }, { propertyName: "tree", first: true, predicate: ["tree"], descendants: true, read: IgxTreeComponent }, { propertyName: "virtDir", first: true, predicate: IgxForOfDirective, descendants: true }, { propertyName: "defaultExcelStyleLoadingValuesTemplate", first: true, predicate: ["defaultExcelStyleLoadingValuesTemplate"], descendants: true, read: TemplateRef }, { propertyName: "checkboxes", predicate: IgxCheckboxComponent, descendants: true }], ngImport: i0, template: "<igx-input-group\n type=\"box\"\n [displayDensity]=\"esf.displayDensity\">\n <igx-icon igxPrefix>search</igx-icon>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue\"\n (ngModelChange)=\"filterListData()\"\n (keydown)=\"onInputKeyDown($event)\"\n [placeholder]=\"esf.column?.grid.resourceStrings.igx_grid_excel_search_placeholder\"\n autocomplete=\"off\"/>\n <igx-icon\n igxSuffix\n *ngIf=\"searchValue || searchValue === 0\"\n (click)=\"clearInput()\"\n tabindex=\"0\">\n clear\n </igx-icon>\n</igx-input-group>\n\n<igx-list #list role=\"listbox\" [displayDensity]=\"esf.displayDensity\" [isLoading]=\"isLoading\" *ngIf=\"!isHierarchical()\" (keydown)=\"handleKeyDown($event)\" tabindex=\"0\"\n[attr.aria-activedescendant]=\"this.activeDescendant\" (focus)=\"onFocus()\" (focusout)=\"onFocusOut()\">\n <div style=\"overflow: hidden; position: relative;\">\n <igx-list-item [class.igx-list__item-base--active]=\"focusedItem?.id === this.getItemId(i)\" [attr.id]=\"getItemId(i)\" role=\"option\" \n *igxFor=\"let item of displayedListData;index as i; scrollOrientation : 'vertical'; containerSize: containerSize; itemSize: itemSize\">\n <igx-checkbox\n [value]=\"item\"\n [tabindex]=\"-1\"\n [checked]=\"item?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"item?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onCheckboxChange($event)\">\n {{ item.label }}\n </igx-checkbox>\n </igx-list-item>\n </div>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template igxEmptyList>\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n\n <div class=\"igx-excel-filter__filter-results\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_matches_count.replace('{0}', matchesCount) }}\n </div>\n</igx-list>\n\n<div class=\"igx-excel-filter__tree\" *ngIf=\"isHierarchical()\">\n <div class=\"igx-excel-filter__tree-alike\" *ngIf=\"!isTreeEmpty()\">\n <div class=\"igx-excel-filter__tree-alike-item\">\n <igx-checkbox #selectAllCheckbox\n [value]=\"selectAllItem\"\n [checked]=\"selectAllItem?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"selectAllItem?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onSelectAllCheckboxChange($event)\">\n {{ selectAllItem.label }}\n </igx-checkbox>\n </div>\n <div class=\"igx-excel-filter__tree-alike-item\" *ngIf=\"searchValue\">\n <igx-checkbox #addToCurrentFilterCheckbox\n [value]=\"addToCurrentFilterItem\"\n [checked]=\"addToCurrentFilterItem.isSelected\"\n [disableRipple]=\"true\"\n [disableTransitions]=\"true\">\n\n {{ addToCurrentFilterItem.label }}\n </igx-checkbox>\n </div>\n </div>\n\n <igx-tree #tree [displayDensity]=\"esf.displayDensity\" selection=\"Cascading\" (nodeSelection)=\"onNodeSelectionChange($event)\">\n <igx-tree-node [data]=\"item\" *ngFor=\"let item of displayedListData;\" [selected]=\"item.isSelected\">\n <div>{{item.label}}</div>\n <igx-tree-node [data]=\"childLevel1\" *ngFor=\"let childLevel1 of item.children\" [selected]=\"childLevel1.isSelected\">\n <div>{{childLevel1.label}}</div>\n <igx-tree-node [data]=\"childLevel2\" *ngFor=\"let childLevel2 of childLevel1.children\" [selected]=\"childLevel2.isSelected\">\n <div>{{childLevel2.label}}</div>\n <igx-tree-node [data]=\"childLevel3\" *ngFor=\"let childLevel3 of childLevel2.children\" [selected]=\"childLevel3.isSelected\">\n <div>{{childLevel3.label}}</div>\n <igx-tree-node [data]=\"childLevel4\" *ngFor=\"let childLevel4 of childLevel3.children\" [selected]=\"childLevel4.isSelected\">\n <div>{{childLevel4.label}}</div>\n <igx-tree-node [data]=\"childLevel5\" *ngFor=\"let childLevel5 of childLevel4.children\" [selected]=\"childLevel5.isSelected\">\n <div>{{childLevel5.label}}</div>\n <igx-tree-node [data]=\"childLevel6\" *ngFor=\"let childLevel6 of childLevel5.children\" [selected]=\"childLevel6.isSelected\">\n <div>{{childLevel6.label}}</div>\n <igx-tree-node [data]=\"childLevel7\" *ngFor=\"let childLevel7 of childLevel6.children\" [selected]=\"childLevel7.isSelected\">\n <div>{{childLevel7.label}}</div>\n <igx-tree-node [data]=\"childLevel8\" *ngFor=\"let childLevel8 of childLevel7.children\" [selected]=\"childLevel8.isSelected\">\n <div>{{childLevel8.label}}</div>\n <igx-tree-node [data]=\"childLevel9\" *ngFor=\"let childLevel9 of childLevel8.children\" [selected]=\"childLevel9.isSelected\">\n <div>{{childLevel9.label}}</div>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template [ngIf]=\"isTreeEmpty()\">\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n</div>\n\n<ng-template #emptySearch>\n <div class=\"igx-excel-filter__empty\">\n {{esf.grid?.resourceStrings.igx_grid_excel_no_matches}}\n </div>\n</ng-template>\n\n<ng-template #defaultExcelStyleLoadingValuesTemplate>\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n</ng-template>\n\n<footer class=\"igx-excel-filter__menu-footer\">\n <div class=\"igx-excel-filter__cancel\">\n <button type=\"button\" #cancelButton\n igxButton=\"flat\"\n [displayDensity]=\"esf.displayDensity\"\n (click)=\"esf.cancel()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button type=\"button\"\n igxButton=\"raised\"\n [displayDensity]=\"esf.displayDensity\"\n [disabled]=\"applyButtonDisabled\"\n (click)=\"applyFilter()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n</footer>\n", dependencies: [{ kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: IgxListComponent, selector: "igx-list", inputs: ["panEndTriggeringThreshold", "id", "allowLeftPanning", "allowRightPanning", "isLoading", "resourceStrings", "role"], outputs: ["leftPan", "rightPan", "startPan", "endPan", "resetPan", "panStateChange", "itemClicked"] }, { kind: "directive", type: IgxForOfDirective, selector: "[igxFor][igxForOf]", inputs: ["igxForOf", "igxForSizePropName", "igxForScrollOrientation", "igxForScrollContainer", "igxForContainerSize", "igxForItemSize", "igxForTotalItemCount", "igxForTrackBy"], outputs: ["chunkLoad", "scrollbarVisibilityChanged", "contentSizeChange", "dataChanged", "beforeViewDestroyed", "chunkPreload"] }, { kind: "component", type: IgxListItemComponent, selector: "igx-list-item", inputs: ["isHeader", "hidden", "index", "role"] }, { kind: "component", type: IgxCheckboxComponent, selector: "igx-checkbox", inputs: ["id", "labelId", "value", "name", "tabindex", "labelPosition", "disableRipple", "required", "aria-labelledby", "aria-label", "indeterminate", "checked", "disabled", "invalid", "readonly", "disableTransitions"], outputs: ["change"] }, { kind: "directive", type: IgxDataLoadingTemplateDirective, selector: "[igxDataLoading]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: IgxEmptyListTemplateDirective, selector: "[igxEmptyList]" }, { kind: "component", type: IgxTreeComponent, selector: "igx-tree", inputs: ["selection", "singleBranchExpand", "animationSettings"], outputs: ["nodeSelection", "nodeExpanding", "nodeExpanded", "nodeCollapsing", "nodeCollapsed", "activeNodeChanged"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxTreeNodeComponent, selector: "igx-tree-node", inputs: ["data", "loading", "resourceStrings", "active", "disabled", "selected", "expanded"], outputs: ["selectedChange", "expandedChange"] }, { kind: "component", type: IgxCircularProgressBarComponent, selector: "igx-circular-bar", inputs: ["id", "isIndeterminate", "textVisibility", "text"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }] }); }
569
700
  }
570
701
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: IgxExcelStyleSearchComponent, decorators: [{
571
702
  type: Component,
572
- args: [{ selector: 'igx-excel-style-search', standalone: true, imports: [IgxInputGroupComponent, IgxIconComponent, IgxPrefixDirective, FormsModule, IgxInputDirective, NgIf, IgxSuffixDirective, IgxListComponent, IgxForOfDirective, IgxListItemComponent, IgxCheckboxComponent, IgxDataLoadingTemplateDirective, NgTemplateOutlet, IgxEmptyListTemplateDirective, IgxTreeComponent, NgFor, IgxTreeNodeComponent, IgxCircularProgressBarComponent, IgxButtonDirective], template: "<igx-input-group\n type=\"box\"\n [displayDensity]=\"esf.displayDensity\">\n <igx-icon igxPrefix>search</igx-icon>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue\"\n (ngModelChange)=\"filterListData()\"\n (keydown)=\"onInputKeyDown($event)\"\n [placeholder]=\"esf.column?.grid.resourceStrings.igx_grid_excel_search_placeholder\"\n autocomplete=\"off\"/>\n <igx-icon\n igxSuffix\n *ngIf=\"searchValue || searchValue === 0\"\n (click)=\"clearInput()\"\n tabindex=\"0\">\n clear\n </igx-icon>\n</igx-input-group>\n\n<igx-list #list [displayDensity]=\"esf.displayDensity\" [isLoading]=\"isLoading\" *ngIf=\"!isHierarchical()\">\n <div style=\"overflow: hidden; position: relative;\">\n <igx-list-item\n *igxFor=\"let item of displayedListData scrollOrientation : 'vertical'; containerSize: containerSize; itemSize: itemSize\">\n <igx-checkbox\n [value]=\"item\"\n [tabindex]=\"-1\"\n [checked]=\"item?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"item?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onCheckboxChange($event)\">\n {{ item.label }}\n </igx-checkbox>\n </igx-list-item>\n </div>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template igxEmptyList>\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n\n <div class=\"igx-excel-filter__filter-results\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_matches_count.replace('{0}', matchesCount) }}\n </div>\n</igx-list>\n\n<div class=\"igx-excel-filter__tree\" *ngIf=\"isHierarchical()\">\n <div class=\"igx-excel-filter__tree-alike\" *ngIf=\"!isTreeEmpty()\">\n <div class=\"igx-excel-filter__tree-alike-item\">\n <igx-checkbox #selectAllCheckbox\n [value]=\"selectAllItem\"\n [checked]=\"selectAllItem?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"selectAllItem?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onSelectAllCheckboxChange($event)\">\n {{ selectAllItem.label }}\n </igx-checkbox>\n </div>\n <div class=\"igx-excel-filter__tree-alike-item\" *ngIf=\"searchValue\">\n <igx-checkbox #addToCurrentFilterCheckbox\n [value]=\"addToCurrentFilterItem\"\n [checked]=\"addToCurrentFilterItem.isSelected\"\n [disableRipple]=\"true\"\n [disableTransitions]=\"true\">\n\n {{ addToCurrentFilterItem.label }}\n </igx-checkbox>\n </div>\n </div>\n\n <igx-tree #tree [displayDensity]=\"esf.displayDensity\" selection=\"Cascading\" (nodeSelection)=\"onNodeSelectionChange($event)\">\n <igx-tree-node [data]=\"item\" *ngFor=\"let item of displayedListData;\" [selected]=\"item.isSelected\">\n <div>{{item.label}}</div>\n <igx-tree-node [data]=\"childLevel1\" *ngFor=\"let childLevel1 of item.children\" [selected]=\"childLevel1.isSelected\">\n <div>{{childLevel1.label}}</div>\n <igx-tree-node [data]=\"childLevel2\" *ngFor=\"let childLevel2 of childLevel1.children\" [selected]=\"childLevel2.isSelected\">\n <div>{{childLevel2.label}}</div>\n <igx-tree-node [data]=\"childLevel3\" *ngFor=\"let childLevel3 of childLevel2.children\" [selected]=\"childLevel3.isSelected\">\n <div>{{childLevel3.label}}</div>\n <igx-tree-node [data]=\"childLevel4\" *ngFor=\"let childLevel4 of childLevel3.children\" [selected]=\"childLevel4.isSelected\">\n <div>{{childLevel4.label}}</div>\n <igx-tree-node [data]=\"childLevel5\" *ngFor=\"let childLevel5 of childLevel4.children\" [selected]=\"childLevel5.isSelected\">\n <div>{{childLevel5.label}}</div>\n <igx-tree-node [data]=\"childLevel6\" *ngFor=\"let childLevel6 of childLevel5.children\" [selected]=\"childLevel6.isSelected\">\n <div>{{childLevel6.label}}</div>\n <igx-tree-node [data]=\"childLevel7\" *ngFor=\"let childLevel7 of childLevel6.children\" [selected]=\"childLevel7.isSelected\">\n <div>{{childLevel7.label}}</div>\n <igx-tree-node [data]=\"childLevel8\" *ngFor=\"let childLevel8 of childLevel7.children\" [selected]=\"childLevel8.isSelected\">\n <div>{{childLevel8.label}}</div>\n <igx-tree-node [data]=\"childLevel9\" *ngFor=\"let childLevel9 of childLevel8.children\" [selected]=\"childLevel9.isSelected\">\n <div>{{childLevel9.label}}</div>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template [ngIf]=\"isTreeEmpty()\">\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n</div>\n\n<ng-template #emptySearch>\n <div class=\"igx-excel-filter__empty\">\n {{esf.grid?.resourceStrings.igx_grid_excel_no_matches}}\n </div>\n</ng-template>\n\n<ng-template #defaultExcelStyleLoadingValuesTemplate>\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n</ng-template>\n\n<footer class=\"igx-excel-filter__menu-footer\">\n <div class=\"igx-excel-filter__cancel\">\n <button type=\"button\"\n igxButton=\"flat\"\n [displayDensity]=\"esf.displayDensity\"\n (click)=\"esf.cancel()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button type=\"button\"\n igxButton=\"raised\"\n [displayDensity]=\"esf.displayDensity\"\n [disabled]=\"applyButtonDisabled\"\n (click)=\"applyFilter()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n</footer>\n" }]
703
+ args: [{ selector: 'igx-excel-style-search', standalone: true, imports: [IgxInputGroupComponent, IgxIconComponent, IgxPrefixDirective, FormsModule, IgxInputDirective, NgIf, IgxSuffixDirective, IgxListComponent, IgxForOfDirective, IgxListItemComponent, IgxCheckboxComponent, IgxDataLoadingTemplateDirective, NgTemplateOutlet, IgxEmptyListTemplateDirective, IgxTreeComponent, NgFor, IgxTreeNodeComponent, IgxCircularProgressBarComponent, IgxButtonDirective], template: "<igx-input-group\n type=\"box\"\n [displayDensity]=\"esf.displayDensity\">\n <igx-icon igxPrefix>search</igx-icon>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [(ngModel)]=\"searchValue\"\n (ngModelChange)=\"filterListData()\"\n (keydown)=\"onInputKeyDown($event)\"\n [placeholder]=\"esf.column?.grid.resourceStrings.igx_grid_excel_search_placeholder\"\n autocomplete=\"off\"/>\n <igx-icon\n igxSuffix\n *ngIf=\"searchValue || searchValue === 0\"\n (click)=\"clearInput()\"\n tabindex=\"0\">\n clear\n </igx-icon>\n</igx-input-group>\n\n<igx-list #list role=\"listbox\" [displayDensity]=\"esf.displayDensity\" [isLoading]=\"isLoading\" *ngIf=\"!isHierarchical()\" (keydown)=\"handleKeyDown($event)\" tabindex=\"0\"\n[attr.aria-activedescendant]=\"this.activeDescendant\" (focus)=\"onFocus()\" (focusout)=\"onFocusOut()\">\n <div style=\"overflow: hidden; position: relative;\">\n <igx-list-item [class.igx-list__item-base--active]=\"focusedItem?.id === this.getItemId(i)\" [attr.id]=\"getItemId(i)\" role=\"option\" \n *igxFor=\"let item of displayedListData;index as i; scrollOrientation : 'vertical'; containerSize: containerSize; itemSize: itemSize\">\n <igx-checkbox\n [value]=\"item\"\n [tabindex]=\"-1\"\n [checked]=\"item?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"item?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onCheckboxChange($event)\">\n {{ item.label }}\n </igx-checkbox>\n </igx-list-item>\n </div>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template igxEmptyList>\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n\n <div class=\"igx-excel-filter__filter-results\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_matches_count.replace('{0}', matchesCount) }}\n </div>\n</igx-list>\n\n<div class=\"igx-excel-filter__tree\" *ngIf=\"isHierarchical()\">\n <div class=\"igx-excel-filter__tree-alike\" *ngIf=\"!isTreeEmpty()\">\n <div class=\"igx-excel-filter__tree-alike-item\">\n <igx-checkbox #selectAllCheckbox\n [value]=\"selectAllItem\"\n [checked]=\"selectAllItem?.isSelected\"\n [disableRipple]=\"true\"\n [indeterminate]=\"selectAllItem?.indeterminate\"\n [disableTransitions]=\"true\"\n (change)=\"onSelectAllCheckboxChange($event)\">\n {{ selectAllItem.label }}\n </igx-checkbox>\n </div>\n <div class=\"igx-excel-filter__tree-alike-item\" *ngIf=\"searchValue\">\n <igx-checkbox #addToCurrentFilterCheckbox\n [value]=\"addToCurrentFilterItem\"\n [checked]=\"addToCurrentFilterItem.isSelected\"\n [disableRipple]=\"true\"\n [disableTransitions]=\"true\">\n\n {{ addToCurrentFilterItem.label }}\n </igx-checkbox>\n </div>\n </div>\n\n <igx-tree #tree [displayDensity]=\"esf.displayDensity\" selection=\"Cascading\" (nodeSelection)=\"onNodeSelectionChange($event)\">\n <igx-tree-node [data]=\"item\" *ngFor=\"let item of displayedListData;\" [selected]=\"item.isSelected\">\n <div>{{item.label}}</div>\n <igx-tree-node [data]=\"childLevel1\" *ngFor=\"let childLevel1 of item.children\" [selected]=\"childLevel1.isSelected\">\n <div>{{childLevel1.label}}</div>\n <igx-tree-node [data]=\"childLevel2\" *ngFor=\"let childLevel2 of childLevel1.children\" [selected]=\"childLevel2.isSelected\">\n <div>{{childLevel2.label}}</div>\n <igx-tree-node [data]=\"childLevel3\" *ngFor=\"let childLevel3 of childLevel2.children\" [selected]=\"childLevel3.isSelected\">\n <div>{{childLevel3.label}}</div>\n <igx-tree-node [data]=\"childLevel4\" *ngFor=\"let childLevel4 of childLevel3.children\" [selected]=\"childLevel4.isSelected\">\n <div>{{childLevel4.label}}</div>\n <igx-tree-node [data]=\"childLevel5\" *ngFor=\"let childLevel5 of childLevel4.children\" [selected]=\"childLevel5.isSelected\">\n <div>{{childLevel5.label}}</div>\n <igx-tree-node [data]=\"childLevel6\" *ngFor=\"let childLevel6 of childLevel5.children\" [selected]=\"childLevel6.isSelected\">\n <div>{{childLevel6.label}}</div>\n <igx-tree-node [data]=\"childLevel7\" *ngFor=\"let childLevel7 of childLevel6.children\" [selected]=\"childLevel7.isSelected\">\n <div>{{childLevel7.label}}</div>\n <igx-tree-node [data]=\"childLevel8\" *ngFor=\"let childLevel8 of childLevel7.children\" [selected]=\"childLevel8.isSelected\">\n <div>{{childLevel8.label}}</div>\n <igx-tree-node [data]=\"childLevel9\" *ngFor=\"let childLevel9 of childLevel8.children\" [selected]=\"childLevel9.isSelected\">\n <div>{{childLevel9.label}}</div>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree-node>\n </igx-tree>\n\n <ng-template igxDataLoading>\n <div class=\"igx-excel-filter__loading\">\n <ng-container *ngTemplateOutlet=\"valuesLoadingTemplate\">\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template [ngIf]=\"isTreeEmpty()\">\n <ng-container *ngTemplateOutlet=\"emptySearch\"></ng-container>\n </ng-template>\n</div>\n\n<ng-template #emptySearch>\n <div class=\"igx-excel-filter__empty\">\n {{esf.grid?.resourceStrings.igx_grid_excel_no_matches}}\n </div>\n</ng-template>\n\n<ng-template #defaultExcelStyleLoadingValuesTemplate>\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n</ng-template>\n\n<footer class=\"igx-excel-filter__menu-footer\">\n <div class=\"igx-excel-filter__cancel\">\n <button type=\"button\" #cancelButton\n igxButton=\"flat\"\n [displayDensity]=\"esf.displayDensity\"\n (click)=\"esf.cancel()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button type=\"button\"\n igxButton=\"raised\"\n [displayDensity]=\"esf.displayDensity\"\n [disabled]=\"applyButtonDisabled\"\n (click)=\"applyFilter()\">\n {{ esf.grid?.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n</footer>\n" }]
573
704
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.BaseFilteringComponent }, { type: i2.PlatformUtil }]; }, propDecorators: { defaultClass: [{
574
705
  type: HostBinding,
575
706
  args: ['class.igx-excel-filter__menu-main']
576
707
  }], searchInput: [{
577
708
  type: ViewChild,
578
709
  args: ['input', { read: IgxInputDirective, static: true }]
710
+ }], cancelButton: [{
711
+ type: ViewChild,
712
+ args: ['cancelButton', { read: IgxButtonDirective, static: true }]
579
713
  }], list: [{
580
714
  type: ViewChild,
581
715
  args: ['list', { read: IgxListComponent, static: false }]
@@ -590,9 +724,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImpor
590
724
  args: ['tree', { read: IgxTreeComponent, static: false }]
591
725
  }], virtDir: [{
592
726
  type: ViewChild,
593
- args: [IgxForOfDirective, { static: true }]
727
+ args: [IgxForOfDirective]
594
728
  }], defaultExcelStyleLoadingValuesTemplate: [{
595
729
  type: ViewChild,
596
730
  args: ['defaultExcelStyleLoadingValuesTemplate', { read: TemplateRef }]
731
+ }], checkboxes: [{
732
+ type: ViewChildren,
733
+ args: [IgxCheckboxComponent]
734
+ }], id: [{
735
+ type: HostBinding,
736
+ args: ['attr.id']
737
+ }, {
738
+ type: Input
597
739
  }] } });
598
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwtc3R5bGUtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZXhjZWwtc3R5bGUtc2VhcmNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZXhjZWwtc3R5bGUtc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxTQUFTLEVBQ1QsU0FBUyxFQUVULFdBQVcsRUFDWCxTQUFTLEVBRVQsV0FBVyxFQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUMvRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seURBQXlELENBQUM7QUFDekYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUNILDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLHVCQUF1QixFQUM5RSx5QkFBeUIsRUFBRSwyQkFBMkIsRUFBRSx1QkFBdUIsRUFDbEYsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBNEIsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RyxPQUFPLEVBQUUsU0FB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c0M7c0JBRC9DLFNBQVM7dUJBQUMsd0NBQXdDLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgRGlyZWN0aXZlLFxuICAgIE9uRGVzdHJveSxcbiAgICBIb3N0QmluZGluZ1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElneElucHV0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9pbnB1dC9pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGlzcGxheURlbnNpdHkgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2RlbnNpdHknO1xuaW1wb3J0IHsgSWd4Rm9yT2ZEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzL2Zvci1vZi9mb3Jfb2YuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB9IGZyb20gJy4uLy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdMb2dpYyB9IGZyb20gJy4uLy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR3JpZENvbHVtbkRhdGFUeXBlIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1vcGVyYXRpb25zL2RhdGEtdXRpbCc7XG5pbXBvcnQge1xuICAgIElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kLCBJZ3hOdW1iZXJGaWx0ZXJpbmdPcGVyYW5kLCBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZCxcbiAgICBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kLCBJZ3hEYXRlVGltZUZpbHRlcmluZ09wZXJhbmQsIElneFRpbWVGaWx0ZXJpbmdPcGVyYW5kXG59IGZyb20gJy4uLy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctY29uZGl0aW9uJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElDaGFuZ2VDaGVja2JveEV2ZW50QXJncywgSWd4Q2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jaGVja2JveC9jaGVja2JveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgY2xvbmVIaWVyYXJjaGljYWxBcnJheSwgUGxhdGZvcm1VdGlsIH0gZnJvbSAnLi4vLi4vLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBCYXNlRmlsdGVyaW5nQ29tcG9uZW50IH0gZnJvbSAnLi9iYXNlLWZpbHRlcmluZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRXhwcmVzc2lvblVJLCBGaWx0ZXJMaXN0SXRlbSB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7IElneEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZXMvYnV0dG9uL2J1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4Q2lyY3VsYXJQcm9ncmVzc0JhckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3Byb2dyZXNzYmFyL3Byb2dyZXNzYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hUcmVlTm9kZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RyZWUvdHJlZS1ub2RlL3RyZWUtbm9kZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4VHJlZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RyZWUvdHJlZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4RGF0YUxvYWRpbmdUZW1wbGF0ZURpcmVjdGl2ZSwgSWd4RW1wdHlMaXN0VGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9saXN0L2xpc3QuY29tbW9uJztcbmltcG9ydCB7IElneExpc3RJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vbGlzdC9saXN0LWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IElneExpc3RDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9saXN0L2xpc3QuY29tcG9uZW50JztcbmltcG9ydCB7IElneFN1ZmZpeERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZXMvc3VmZml4L3N1ZmZpeC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCwgTmdGb3IgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJZ3hQcmVmaXhEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzL3ByZWZpeC9wcmVmaXguZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9pY29uL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IElneElucHV0R3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9pbnB1dC1ncm91cC9pbnB1dC1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSVRyZWVOb2RlU2VsZWN0aW9uRXZlbnQgfSBmcm9tICcuLi8uLi8uLi90cmVlL2NvbW1vbic7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2lneEV4Y2VsU3R5bGVMb2FkaW5nXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBwdWJsaWMgc3RhdGljIG5nVGVtcGxhdGVDb250ZXh0R3VhcmQoX2RpcjogSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICAgICAgY3R4OiB1bmtub3duKTogY3R4IGlzIHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5kZWZpbmVkPikgeyB9XG59XG5cbi8qKlxuICogQSBjb21wb25lbnQgdXNlZCBmb3IgcHJlc2VudGluZyBFeGNlbCBzdHlsZSBzZWFyY2ggVUkuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LWV4Y2VsLXN0eWxlLXNlYXJjaCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2V4Y2VsLXN0eWxlLXNlYXJjaC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbSWd4SW5wdXRHcm91cENvbXBvbmVudCwgSWd4SWNvbkNvbXBvbmVudCwgSWd4UHJlZml4RGlyZWN0aXZlLCBGb3Jtc01vZHVsZSwgSWd4SW5wdXREaXJlY3RpdmUsIE5nSWYsIElneFN1ZmZpeERpcmVjdGl2ZSwgSWd4TGlzdENvbXBvbmVudCwgSWd4Rm9yT2ZEaXJlY3RpdmUsIElneExpc3RJdGVtQ29tcG9uZW50LCBJZ3hDaGVja2JveENvbXBvbmVudCwgSWd4RGF0YUxvYWRpbmdUZW1wbGF0ZURpcmVjdGl2ZSwgTmdUZW1wbGF0ZU91dGxldCwgSWd4RW1wdHlMaXN0VGVtcGxhdGVEaXJlY3RpdmUsIElneFRyZWVDb21wb25lbnQsIE5nRm9yLCBJZ3hUcmVlTm9kZUNvbXBvbmVudCwgSWd4Q2lyY3VsYXJQcm9ncmVzc0JhckNvbXBvbmVudCwgSWd4QnV0dG9uRGlyZWN0aXZlXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hFeGNlbFN0eWxlU2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBmaWx0ZXJPcHRpbWl6YXRpb25UaHJlc2hvbGQgPSAyO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1leGNlbC1maWx0ZXJfX21lbnUtbWFpbicpXG4gICAgcHVibGljIGRlZmF1bHRDbGFzcyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lucHV0JywgeyByZWFkOiBJZ3hJbnB1dERpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHNlYXJjaElucHV0OiBJZ3hJbnB1dERpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnbGlzdCcsIHsgcmVhZDogSWd4TGlzdENvbXBvbmVudCwgc3RhdGljOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBsaXN0OiBJZ3hMaXN0Q29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdzZWxlY3RBbGxDaGVja2JveCcsIHsgcmVhZDogSWd4Q2hlY2tib3hDb21wb25lbnQsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBwdWJsaWMgc2VsZWN0QWxsQ2hlY2tib3g6IElneENoZWNrYm94Q29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdhZGRUb0N1cnJlbnRGaWx0ZXJDaGVja2JveCcsIHsgcmVhZDogSWd4Q2hlY2tib3hDb21wb25lbnQsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBwdWJsaWMgYWRkVG9DdXJyZW50RmlsdGVyQ2hlY2tib3g6IElneENoZWNrYm94Q29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd0cmVlJywgeyByZWFkOiBJZ3hUcmVlQ29tcG9uZW50LCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcHVibGljIHRyZWU6IElneFRyZWVDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4Rm9yT2ZEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIHZpcnREaXI6IElneEZvck9mRGlyZWN0aXZlPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZWxlY3RBbGxJdGVtKCk6IEZpbHRlckxpc3RJdGVtIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZWxlY3RBbGxJdGVtKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RBbGxJdGVtID0ge1xuICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzRmlsdGVyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzU3BlY2lhbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc0JsYW5rczogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZXNmLmdyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2V4Y2VsX3NlbGVjdF9hbGwsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuZXNmLmdyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2V4Y2VsX3NlbGVjdF9hbGxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdEFsbEl0ZW0gPSBzZWxlY3RBbGxJdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdEFsbEl0ZW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGFkZFRvQ3VycmVudEZpbHRlckl0ZW0oKTogRmlsdGVyTGlzdEl0ZW0ge1xuICAgICAgICBpZiAoIXRoaXMuX2FkZFRvQ3VycmVudEZpbHRlckl0ZW0pIHtcbiAgICAgICAgICAgIGNvbnN0IGFkZFRvQ3VycmVudEZpbHRlckl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNGaWx0ZXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNTcGVjaWFsOiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzQmxhbmtzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5lc2YuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfYWRkX3RvX2ZpbHRlcixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5lc2YuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfYWRkX3RvX2ZpbHRlclxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5fYWRkVG9DdXJyZW50RmlsdGVySXRlbSA9IGFkZFRvQ3VycmVudEZpbHRlckl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkVG9DdXJyZW50RmlsdGVySXRlbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNMb2FkaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMb2FkaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldCBpc0xvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5faXNMb2FkaW5nID0gdmFsdWU7XG4gICAgICAgIGlmICghKHRoaXMuY2RyIGFzIGFueSkuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWFyY2hWYWx1ZTogYW55O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzcGxheWVkTGlzdERhdGE6IEZpbHRlckxpc3RJdGVtW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG1hdGNoZXNDb3VudDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZhbHVlc0xvYWRpbmdUZW1wbGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZXNmLmdyaWQ/LmV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGVEaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVzZi5ncmlkLmV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGVEaXJlY3RpdmUudGVtcGxhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2lzTG9hZGluZztcbiAgICBwcml2YXRlIF9hZGRUb0N1cnJlbnRGaWx0ZXJJdGVtOiBGaWx0ZXJMaXN0SXRlbTtcbiAgICBwcml2YXRlIF9zZWxlY3RBbGxJdGVtOiBGaWx0ZXJMaXN0SXRlbTtcbiAgICBwcml2YXRlIF9oaWVyYXJjaGljYWxTZWxlY3RlZEl0ZW1zOiBGaWx0ZXJMaXN0SXRlbVtdO1xuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHB1YmxpYyBlc2Y6IEJhc2VGaWx0ZXJpbmdDb21wb25lbnQsIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm1VdGlsKSB7XG4gICAgICAgIGVzZi5sb2FkaW5nU3RhcnQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZExpc3REYXRhID0gW107XG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBlc2YubG9hZGluZ0VuZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFNpemUoKTtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICBlc2YuaW5pdGlhbGl6ZWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFNpemUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgZXNmLmNvbHVtbkNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlydERpcj8ucmVzZXRTY3JvbGxQb3NpdGlvbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICBlc2YubGlzdERhdGFMb2FkZWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RBbGxJdGVtID0gdGhpcy5lc2YubGlzdERhdGFbMF07XG4gICAgICAgICAgICBpZiAodGhpcy5pc0hpZXJhcmNoaWNhbCgpICYmIHRoaXMuZXNmLmxpc3REYXRhWzBdLmlzU3BlY2lhbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXNmLmxpc3REYXRhLnNwbGljZSgwLCAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFySW5wdXQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJMaXN0RGF0YSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFNpemUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yZWZyZXNoU2l6ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZWZyZXNoU2l6ZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudmlydERpcikge1xuICAgICAgICAgICAgdGhpcy52aXJ0RGlyLmlneEZvckNvbnRhaW5lclNpemUgPSB0aGlzLmNvbnRhaW5lclNpemU7XG4gICAgICAgICAgICB0aGlzLnZpcnREaXIuaWd4Rm9ySXRlbVNpemUgPSB0aGlzLml0ZW1TaXplO1xuICAgICAgICAgICAgdGhpcy52aXJ0RGlyLnJlY2FsY1VwZGF0ZVNpemVzKCk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcklucHV0KCkge1xuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5maWx0ZXJMaXN0RGF0YSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hlY2tib3hDaGFuZ2UoZXZlbnRBcmdzOiBJQ2hhbmdlQ2hlY2tib3hFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRleCA9IHRoaXMuZGlzcGxheWVkTGlzdERhdGEuaW5kZXhPZihldmVudEFyZ3MuY2hlY2tib3gudmFsdWUpO1xuICAgICAgICBjb25zdCBzZWxlY3RBbGxCdG4gPSB0aGlzLmRpc3BsYXllZExpc3REYXRhWzBdO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZExpc3REYXRhLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT09IHRoaXMuYWRkVG9DdXJyZW50RmlsdGVySXRlbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaXNTZWxlY3RlZCA9IGV2ZW50QXJncy5jaGVja2VkO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNlbGVjdEFsbEJ0bi5pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudEFyZ3MuY2hlY2tib3gudmFsdWUuaXNTZWxlY3RlZCA9IGV2ZW50QXJncy5jaGVja2VkO1xuICAgICAgICAgICAgY29uc3QgaW5kZXhUb1N0YXJ0U2xpY2luZyA9IHRoaXMuZGlzcGxheWVkTGlzdERhdGEuaW5kZXhPZih0aGlzLmFkZFRvQ3VycmVudEZpbHRlckl0ZW0pID4gLTEgPyAyIDogMTtcblxuICAgICAgICAgICAgY29uc3Qgc2xpY2VkQXJyYXkgPVxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEuc2xpY2UoaW5kZXhUb1N0YXJ0U2xpY2luZywgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5sZW5ndGgpO1xuXG4gICAgICAgICAgICBpZiAoIXNsaWNlZEFycmF5LmZpbmQoZWwgPT4gZWwuaXNTZWxlY3RlZCA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdG4uaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzbGljZWRBcnJheS5maW5kKGVsID0+IGVsLmlzU2VsZWN0ZWQgPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdG4uaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdG4uaW5kZXRlcm1pbmF0ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnRBcmdzLmNoZWNrYm94Lm5hdGl2ZUNoZWNrYm94Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uU2VsZWN0QWxsQ2hlY2tib3hDaGFuZ2UoZXZlbnRBcmdzOiBJQ2hhbmdlQ2hlY2tib3hFdmVudEFyZ3MpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0QWxsSXRlbS5pc1NlbGVjdGVkID0gZXZlbnRBcmdzLmNoZWNrZWQ7XG4gICAgICAgIHRoaXMuX3NlbGVjdEFsbEl0ZW0uaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSB0aGlzLnRyZWUubm9kZXM7XG4gICAgICAgIHRyZWVOb2Rlcy5mb3JFYWNoKG5vZGUgPT4gKG5vZGUuZGF0YSBhcyBGaWx0ZXJMaXN0SXRlbSkuaXNTZWxlY3RlZCA9IGV2ZW50QXJncy5jaGVja2VkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbk5vZGVTZWxlY3Rpb25DaGFuZ2UoZXZlbnRBcmdzOiBJVHJlZU5vZGVTZWxlY3Rpb25FdmVudCkge1xuICAgICAgICBldmVudEFyZ3MuYWRkZWQuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIChub2RlLmRhdGEgYXMgRmlsdGVyTGlzdEl0ZW0pLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgZXZlbnRBcmdzLnJlbW92ZWQuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIChub2RlLmRhdGEgYXMgRmlsdGVyTGlzdEl0ZW0pLmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcyA9IGV2ZW50QXJncy5uZXdTZWxlY3Rpb24ubWFwKGl0ZW0gPT4gaXRlbS5kYXRhIGFzIEZpbHRlckxpc3RJdGVtKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0QWxsQnRuID0gdGhpcy5zZWxlY3RBbGxJdGVtO1xuICAgICAgICBpZiAodGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHNlbGVjdEFsbEJ0bi5pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgICAgICBzZWxlY3RBbGxCdG4uaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2hpZXJhcmNoaWNhbFNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSB0aGlzLnRyZWUubm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZWxlY3RBbGxCdG4uaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmluZGV0ZXJtaW5hdGUgPSB0cnVlO1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpdGVtU2l6ZSgpIHtcbiAgICAgICAgbGV0IGl0ZW1TaXplID0gJzQwcHgnO1xuICAgICAgICBzd2l0Y2ggKHRoaXMuZXNmLmRpc3BsYXlEZW5zaXR5KSB7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvc3k6IGl0ZW1TaXplID0gJzMycHgnOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29tcGFjdDogaXRlbVNpemUgPSAnMjRweCc7IGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1TaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb250YWluZXJTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5lc2YubGlzdERhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0Py5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR0UgTm92IDFzdCwgMjAyMSAjMTAzNTUgUmV0dXJuIGEgbnVtZXJpYyB2YWx1ZSwgc28gdGhlIGNodW5rIHNpemUgaXMgY2FsY3VsYXRlZCBwcm9wZXJseS5cbiAgICAgICAgLy8gSWYgd2Ugc2tpcCB0aGlzIGJyYW5jaCwgb24gYXBwbHlpbmcgdGhlIGZpbHRlciB0aGUgX2NhbGN1bGF0ZUNodW5rU2l6ZSgpIG1ldGhvZCBvZmYgdGhlIEZvck9mRGlyZWN0aXZlIHJlY2VpdmVzXG4gICAgICAgIC8vIGFuIGlneEZvckNvbnRhaW5lclNpemUgPSB1bmRlZmluZWQsIHRodXMgYXNzaWducyB0aGUgY2h1bmtTaXplIHRvIHRoZSBpZ3hGb3JPZi5sZW5ndGggd2hpY2ggbGVhZHMgdG8gcGVyZm9ybWFuY2UgaXNzdWVzLlxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYXBwbHlCdXR0b25EaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9zZWxlY3RBbGxJdGVtICYmICF0aGlzLl9zZWxlY3RBbGxJdGVtLmlzU2VsZWN0ZWQgJiYgIXRoaXMuX3NlbGVjdEFsbEl0ZW0uaW5kZXRlcm1pbmF0ZSkgfHxcbiAgICAgICAgICAgICh0aGlzLmRpc3BsYXllZExpc3REYXRhICYmIHRoaXMuZGlzcGxheWVkTGlzdERhdGEubGVuZ3RoID09PSAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbklucHV0S2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSB0aGlzLnBsYXRmb3JtLktFWU1BUC5FTlRFUjpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgdGhpcy5wbGF0Zm9ybS5LRVlNQVAuRVNDQVBFOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFySW5wdXQoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJMaXN0RGF0YSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZXNmLmNvbHVtbj8uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5OdW1iZXIgfHxcbiAgICAgICAgICAgIHRoaXMuZXNmLmNvbHVtbj8uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5DdXJyZW5jeSB8fFxuICAgICAgICAgICAgdGhpcy5lc2YuY29sdW1uPy5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLlBlcmNlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0Tm9uTnVtZXJpY2FsRW50cmllcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmVzZi5saXN0RGF0YSB8fCAhdGhpcy5lc2YubGlzdERhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZExpc3REYXRhID0gW107XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZWxlY3RBbGxCdG47XG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RBbGxJdGVtKSB7XG4gICAgICAgICAgICBzZWxlY3RBbGxCdG4gPSB0aGlzLl9zZWxlY3RBbGxJdGVtO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuID0gdGhpcy5lc2YubGlzdERhdGFbMF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc2VhcmNoVmFsdWUpIHtcbiAgICAgICAgICAgIGxldCBhbnlGaWx0ZXJlZCA9IHRoaXMuZXNmLmxpc3REYXRhLnNvbWUoaSA9PiBpLmlzRmlsdGVyZWQpO1xuICAgICAgICAgICAgbGV0IGFueVVuZmlsdGVyZWQgPSB0aGlzLmVzZi5saXN0RGF0YS5zb21lKGkgPT4gIWkuaXNGaWx0ZXJlZCk7XG4gICAgICAgICAgICBzZWxlY3RBbGxCdG4uaW5kZXRlcm1pbmF0ZSA9IGFueUZpbHRlcmVkICYmIGFueVVuZmlsdGVyZWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0hpZXJhcmNoaWNhbCgpICYmIHRoaXMudHJlZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hpZXJhcmNoaWNhbFNlbGVjdGVkSXRlbXMgPSB0aGlzLnRyZWUubm9kZXMubWFwKG4gPT4gbi5kYXRhIGFzIEZpbHRlckxpc3RJdGVtKS5maWx0ZXIoaXRlbSA9PiBpdGVtLmlzRmlsdGVyZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmVzZi5saXN0RGF0YS5mb3JFYWNoKGkgPT4gaS5pc1NlbGVjdGVkID0gaS5pc0ZpbHRlcmVkKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXllZExpc3REYXRhICE9PSB0aGlzLmVzZi5saXN0RGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEgPSB0aGlzLmVzZi5saXN0RGF0YTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0hpZXJhcmNoaWNhbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlLm5vZGVzLmZvckVhY2gobiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gbi5kYXRhIGFzIEZpbHRlckxpc3RJdGVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgbi5zZWxlY3RlZCA9IGl0ZW0uaXNTZWxlY3RlZCB8fCBpdGVtLmlzRmlsdGVyZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbnlGaWx0ZXJlZCA9IGFueUZpbHRlcmVkIHx8IG4uc2VsZWN0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbnlVbmZpbHRlcmVkID0gYW55VW5maWx0ZXJlZCB8fCAhbi5zZWxlY3RlZDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdEFsbEJ0bi5pbmRldGVybWluYXRlID0gYW55RmlsdGVyZWQgJiYgYW55VW5maWx0ZXJlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxlY3RBbGxCdG4ubGFiZWwgPSB0aGlzLmVzZi5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9zZWxlY3RfYWxsO1xuICAgICAgICAgICAgdGhpcy5tYXRjaGVzQ291bnQgPSB0aGlzLmRpc3BsYXllZExpc3REYXRhLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlYXJjaFZhbCA9IHRoaXMuc2VhcmNoVmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNIaWVyYXJjaGljYWwoKSkge1xuICAgICAgICAgICAgdGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5lc2YubGlzdERhdGEuZm9yRWFjaChpID0+IGkuaXNTZWxlY3RlZCA9IGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWREYXRhID0gY2xvbmVIaWVyYXJjaGljYWxBcnJheSh0aGlzLmVzZi5saXN0RGF0YSwgJ2NoaWxkcmVuJyk7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZExpc3REYXRhID0gdGhpcy5oaWVyYXJjaGljYWxTZWxlY3RNYXRjaGVzKG1hdGNoZWREYXRhLCBzZWFyY2hWYWwpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy50cmVlLm5vZGVzLmZvckVhY2gobiA9PiB7XG4gICAgICAgICAgICAgICAgbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKChuLmRhdGEgYXMgRmlsdGVyTGlzdEl0ZW0pLmxhYmVsLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaFZhbCkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZEFsbFBhcmVudE5vZGVzKG4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YSA9IHRoaXMuZXNmLmxpc3REYXRhLmZpbHRlcigoaXQsIGkpID0+IChpID09PSAwICYmIGl0LmlzU3BlY2lhbCkgfHxcbiAgICAgICAgICAgICAgICAoaXQubGFiZWwgIT09IG51bGwgJiYgaXQubGFiZWwgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgICAgICAhaXQuaXNCbGFua3MgJiZcbiAgICAgICAgICAgICAgICBpdC5sYWJlbC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hWYWwpID4gLTEpO1xuXG4gICAgICAgICAgICB0aGlzLmVzZi5saXN0RGF0YS5mb3JFYWNoKGkgPT4gaS5pc1NlbGVjdGVkID0gZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5mb3JFYWNoKGkgPT4gaS5pc1NlbGVjdGVkID0gdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZExpc3REYXRhLnNwbGljZSgxLCAwLCB0aGlzLmFkZFRvQ3VycmVudEZpbHRlckl0ZW0pO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlzcGxheWVkTGlzdERhdGEubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheWVkTGlzdERhdGEubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgdGhpcy5tYXRjaGVzQ291bnQgPSB0aGlzLmRpc3BsYXllZExpc3REYXRhLmxlbmd0aCAtIDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1hdGNoZXNDb3VudCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxlY3RBbGxCdG4uaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICBzZWxlY3RBbGxCdG4uaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHNlbGVjdEFsbEJ0bi5sYWJlbCA9IHRoaXMuZXNmLmdyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2V4Y2VsX3NlbGVjdF9hbGxfc2VhcmNoX3Jlc3VsdHM7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhcHBseUZpbHRlcigpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuT3IsIHRoaXMuZXNmLmNvbHVtbi5maWVsZCk7XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuaXNIaWVyYXJjaGljYWwoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWRkVG9DdXJyZW50RmlsdGVyQ2hlY2tib3ggJiYgdGhpcy5hZGRUb0N1cnJlbnRGaWx0ZXJDaGVja2JveC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGaWx0ZXJlZFRvU2VsZWN0ZWRJdGVtcyh0aGlzLmVzZi5saXN0RGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMgPSB0aGlzLl9oaWVyYXJjaGljYWxTZWxlY3RlZEl0ZW1zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZGlzcGxheWVkTGlzdERhdGFbMV07XG4gICAgICAgICAgICBjb25zdCBhZGRUb0N1cnJlbnRGaWx0ZXJPcHRpb25WaXNpYmxlID0gaXRlbSA9PT0gdGhpcy5hZGRUb0N1cnJlbnRGaWx0ZXJJdGVtO1xuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcyA9IGFkZFRvQ3VycmVudEZpbHRlck9wdGlvblZpc2libGUgJiYgaXRlbS5pc1NlbGVjdGVkID9cbiAgICAgICAgICAgICAgICB0aGlzLmVzZi5saXN0RGF0YS5zbGljZSgxLCB0aGlzLmVzZi5saXN0RGF0YS5sZW5ndGgpLmZpbHRlcihlbCA9PiBlbC5pc1NlbGVjdGVkIHx8IGVsLmlzRmlsdGVyZWQpIDpcbiAgICAgICAgICAgICAgICB0aGlzLmVzZi5saXN0RGF0YS5zbGljZSgxLCB0aGlzLmVzZi5saXN0RGF0YS5sZW5ndGgpLmZpbHRlcihlbCA9PiBlbC5pc1NlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB1bnNlbGVjdGVkSXRlbTtcbiAgICAgICAgaWYgKHRoaXMuaXNIaWVyYXJjaGljYWwoKSkge1xuICAgICAgICAgICAgdW5zZWxlY3RlZEl0ZW0gPSB0aGlzLmVzZi5saXN0RGF0YS5maW5kKGVsID0+IGVsLmlzU2VsZWN0ZWQgPT09IGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVuc2VsZWN0ZWRJdGVtID0gdGhpcy5lc2YubGlzdERhdGEuc2xpY2UoMSwgdGhpcy5lc2YubGlzdERhdGEubGVuZ3RoKS5maW5kKGVsID0+IGVsLmlzU2VsZWN0ZWQgPT09IGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1bnNlbGVjdGVkSXRlbSkge1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoIDw9IElneEV4Y2VsU3R5bGVTZWFyY2hDb21wb25lbnQuZmlsdGVyT3B0aW1pemF0aW9uVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGl0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsdWUgIT09IG51bGwgJiYgZWxlbWVudC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lc2YuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRoaXMuY3JlYXRlQ29uZGl0aW9uKGVsZW1lbnQudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlckNvbmRpdGlvbiA9IHRoaXMuZXNmLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLlRpbWUgPyAnYXQnIDogJ2VxdWFscyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gdGhpcy5jcmVhdGVDb25kaXRpb24oZmlsdGVyQ29uZGl0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRoaXMuY3JlYXRlQ29uZGl0aW9uKCdlbXB0eScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclRyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IHRoaXMuZXNmLmNvbHVtbi5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U6IHRoaXMuZXNmLmNvbHVtbi5maWx0ZXJpbmdJZ25vcmVDYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoVmFsOiBlbGVtZW50LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBibGFua3NJdGVtSW5kZXggPSBzZWxlY3RlZEl0ZW1zLmZpbmRJbmRleChlID0+IGUudmFsdWUgPT09IG51bGwgfHwgZS52YWx1ZSA9PT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBsZXQgYmxhbmtzSXRlbTogYW55O1xuICAgICAgICAgICAgICAgIGlmIChibGFua3NJdGVtSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBibGFua3NJdGVtID0gc2VsZWN0ZWRJdGVtc1tibGFua3NJdGVtSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLnNwbGljZShibGFua3NJdGVtSW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaWx0ZXJUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IHRoaXMuY3JlYXRlQ29uZGl0aW9uKCdpbicpLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IHRoaXMuZXNmLmNvbHVtbi5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgaWdub3JlQ2FzZTogdGhpcy5lc2YuY29sdW1uLmZpbHRlcmluZ0lnbm9yZUNhc2UsXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFZhbDogbmV3IFNldCh0aGlzLmVzZi5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5EYXRlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVzZi5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5EYXRlVGltZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLm1hcChkID0+IGQudmFsdWUudG9JU09TdHJpbmcoKSkgOiB0aGlzLmVzZi5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5UaW1lID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLm1hcChlID0+IGUudmFsdWUudG9Mb2NhbGVUaW1lU3RyaW5nKCkpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLm1hcChlID0+IGUudmFsdWUpKVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJsYW5rc0l0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogdGhpcy5jcmVhdGVDb25kaXRpb24oJ2VtcHR5JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IHRoaXMuZXNmLmNvbHVtbi5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U6IHRoaXMuZXNmLmNvbHVtbi5maWx0ZXJpbmdJZ25vcmVDYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoVmFsOiBibGFua3NJdGVtLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmVzZi5ncmlkO1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5lc2YuY29sdW1uO1xuICAgICAgICAgICAgZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlckludGVybmFsKGNvbC5maWVsZCwgZmlsdGVyVHJlZSk7XG4gICAgICAgICAgICB0aGlzLmVzZi5leHByZXNzaW9uc0xpc3QgPSBuZXcgQXJyYXk8RXhwcmVzc2lvblVJPigpO1xuICAgICAgICAgICAgZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmdlbmVyYXRlRXhwcmVzc2lvbnNMaXN0KGNvbC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgICAgICAgICAgZ3JpZC5maWx0ZXJpbmdMb2dpYywgdGhpcy5lc2YuZXhwcmVzc2lvbnNMaXN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXNmLmdyaWQuZmlsdGVyaW5nU2VydmljZS5jbGVhckZpbHRlcih0aGlzLmVzZi5jb2x1bW4uZmllbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lc2YuY2xvc2VEcm9wZG93bigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzSGllcmFyY2hpY2FsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lc2YuaXNIaWVyYXJjaGljYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUcmVlRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVzZi5pc0hpZXJhcmNoaWNhbCAmJiB0aGlzLmRpc3BsYXllZExpc3REYXRhLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhpZXJhcmNoaWNhbFNlbGVjdE1hdGNoZXMoZGF0YTogRmlsdGVyTGlzdEl0ZW1bXSwgc2VhcmNoVmFsOiBzdHJpbmcpIHtcbiAgICAgICAgZGF0YS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgZWxlbWVudC5pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgICAgICBlbGVtZW50LmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnRyZWUubm9kZXMuZmlsdGVyKG4gPT4gKG4uZGF0YSBhcyBGaWx0ZXJMaXN0SXRlbSkubGFiZWwgPT09IGVsZW1lbnQubGFiZWwpWzBdO1xuICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50LmxhYmVsLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaFZhbCkgPiAtMSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWVyYXJjaGljYWxTZWxlY3RBbGxDaGlsZHJlbihlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9oaWVyYXJjaGljYWxTZWxlY3RlZEl0ZW1zLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hpbGRyZW4gPSB0aGlzLmhpZXJhcmNoaWNhbFNlbGVjdE1hdGNoZXMoZWxlbWVudC5jaGlsZHJlbiwgc2VhcmNoVmFsKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGEuZmlsdGVyKGVsZW1lbnQgPT4gZWxlbWVudC5pc1NlbGVjdGVkID09PSB0cnVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhpZXJhcmNoaWNhbFNlbGVjdEFsbENoaWxkcmVuKGVsZW1lbnQ6IEZpbHRlckxpc3RJdGVtKSB7XG4gICAgICAgIGVsZW1lbnQuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgICBjaGlsZC5pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgICAgICBjaGlsZC5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2hpZXJhcmNoaWNhbFNlbGVjdGVkSXRlbXMucHVzaChjaGlsZCk7XG4gICAgICAgICAgICBpZiAoY2hpbGQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZXJhcmNoaWNhbFNlbGVjdEFsbENoaWxkcmVuKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4cGFuZEFsbFBhcmVudE5vZGVzKG5vZGU6IGFueSkge1xuICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBub2RlLnBhcmVudE5vZGUuZXhwYW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5leHBhbmRBbGxQYXJlbnROb2Rlcyhub2RlLnBhcmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRGaWx0ZXJlZFRvU2VsZWN0ZWRJdGVtcyhyZWNvcmRzOiBGaWx0ZXJMaXN0SXRlbVtdKSB7XG4gICAgICAgIHJlY29yZHMuZm9yRWFjaChyZWNvcmQgPT4ge1xuICAgICAgICAgICAgaWYgKHJlY29yZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmlsdGVyZWRUb1NlbGVjdGVkSXRlbXMocmVjb3JkLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlY29yZC5pc0ZpbHRlcmVkICYmIHRoaXMuX2hpZXJhcmNoaWNhbFNlbGVjdGVkSXRlbXMuaW5kZXhPZihyZWNvcmQpIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hpZXJhcmNoaWNhbFNlbGVjdGVkSXRlbXMucHVzaChyZWNvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQ29uZGl0aW9uKGNvbmRpdGlvbk5hbWU6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuZXNmLmNvbHVtbi5kYXRhVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbjpcbiAgICAgICAgICAgICAgICByZXR1cm4gSWd4Qm9vbGVhbkZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oY29uZGl0aW9uTmFtZSk7XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5OdW1iZXI6XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5DdXJyZW5jeTpcbiAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLlBlcmNlbnQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIElneE51bWJlckZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oY29uZGl0aW9uTmFtZSk7XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5EYXRlOlxuICAgICAgICAgICAgICAgIHJldHVybiBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbihjb25kaXRpb25OYW1lKTtcbiAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLlRpbWU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIElneFRpbWVGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCkuY29uZGl0aW9uKGNvbmRpdGlvbk5hbWUpO1xuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZVRpbWU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIElneERhdGVUaW1lRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbihjb25kaXRpb25OYW1lKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oY29uZGl0aW9uTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVqZWN0Tm9uTnVtZXJpY2FsRW50cmllcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVnRXhwID0gL1teMC05XFwuLGVFXFwtXS9nO1xuICAgICAgICBpZiAodGhpcy5zZWFyY2hWYWx1ZSAmJiByZWdFeHAudGVzdCh0aGlzLnNlYXJjaFZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC52YWx1ZSA9IHRoaXMuc2VhcmNoVmFsdWUucmVwbGFjZShyZWdFeHAsICcnKTtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB0aGlzLnNlYXJjaElucHV0LnZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGlneC1pbnB1dC1ncm91cFxuICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZXNmLmRpc3BsYXlEZW5zaXR5XCI+XG4gICAgPGlneC1pY29uIGlneFByZWZpeD5zZWFyY2g8L2lneC1pY29uPlxuICAgIDxpbnB1dFxuICAgICAgICAjaW5wdXRcbiAgICAgICAgaWd4SW5wdXRcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckxpc3REYXRhKClcIlxuICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0S2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cImVzZi5jb2x1bW4/LmdyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2V4Y2VsX3NlYXJjaF9wbGFjZWhvbGRlclwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiLz5cbiAgICA8aWd4LWljb25cbiAgICAgICAgaWd4U3VmZml4XG4gICAgICAgICpuZ0lmPVwic2VhcmNoVmFsdWUgfHwgc2VhcmNoVmFsdWUgPT09IDBcIlxuICAgICAgICAoY2xpY2spPVwiY2xlYXJJbnB1dCgpXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgIGNsZWFyXG4gICAgPC9pZ3gtaWNvbj5cbjwvaWd4LWlucHV0LWdyb3VwPlxuXG48aWd4LWxpc3QgI2xpc3QgW2Rpc3BsYXlEZW5zaXR5XT1cImVzZi5kaXNwbGF5RGVuc2l0eVwiIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nXCIgKm5nSWY9XCIhaXNIaWVyYXJjaGljYWwoKVwiPlxuICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7XCI+XG4gICAgICAgIDxpZ3gtbGlzdC1pdGVtXG4gICAgICAgICppZ3hGb3I9XCJsZXQgaXRlbSBvZiBkaXNwbGF5ZWRMaXN0RGF0YSBzY3JvbGxPcmllbnRhdGlvbiA6ICd2ZXJ0aWNhbCc7IGNvbnRhaW5lclNpemU6IGNvbnRhaW5lclNpemU7IGl0ZW1TaXplOiBpdGVtU2l6ZVwiPlxuICAgICAgICAgICAgPGlneC1jaGVja2JveFxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIml0ZW0/LmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlUmlwcGxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cIml0ZW0/LmluZGV0ZXJtaW5hdGVcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlVHJhbnNpdGlvbnNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgICAgICAgICA8L2lneC1jaGVja2JveD5cbiAgICAgICAgPC9pZ3gtbGlzdC1pdGVtPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLXRlbXBsYXRlIGlneERhdGFMb2FkaW5nPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fbG9hZGluZ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZhbHVlc0xvYWRpbmdUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgaWd4RW1wdHlMaXN0PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW1wdHlTZWFyY2hcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPGRpdiBjbGFzcz1cImlneC1leGNlbC1maWx0ZXJfX2ZpbHRlci1yZXN1bHRzXCIgYXJpYS1saXZlPVwicG9saXRlXCIgYXJpYS1hdG9taWM9XCJ0cnVlXCI+XG4gICAgICAgIHt7IGVzZi5ncmlkPy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfbWF0Y2hlc19jb3VudC5yZXBsYWNlKCd7MH0nLCBtYXRjaGVzQ291bnQpIH19XG4gICAgPC9kaXY+XG48L2lneC1saXN0PlxuXG48ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fdHJlZVwiICpuZ0lmPVwiaXNIaWVyYXJjaGljYWwoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZXhjZWwtZmlsdGVyX190cmVlLWFsaWtlXCIgKm5nSWY9XCIhaXNUcmVlRW1wdHkoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fdHJlZS1hbGlrZS1pdGVtXCI+XG4gICAgICAgICAgICA8aWd4LWNoZWNrYm94ICNzZWxlY3RBbGxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0QWxsSXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdEFsbEl0ZW0/LmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0QWxsSXRlbT8uaW5kZXRlcm1pbmF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlVHJhbnNpdGlvbnNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWxlY3RBbGxDaGVja2JveENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAge3sgc2VsZWN0QWxsSXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgPC9pZ3gtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fdHJlZS1hbGlrZS1pdGVtXCIgKm5nSWY9XCJzZWFyY2hWYWx1ZVwiPlxuICAgICAgICAgICAgPGlneC1jaGVja2JveCAjYWRkVG9DdXJyZW50RmlsdGVyQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImFkZFRvQ3VycmVudEZpbHRlckl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJhZGRUb0N1cnJlbnRGaWx0ZXJJdGVtLmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVUcmFuc2l0aW9uc109XCJ0cnVlXCI+XG5cbiAgICAgICAgICAgICAgICB7eyBhZGRUb0N1cnJlbnRGaWx0ZXJJdGVtLmxhYmVsIH19XG4gICAgICAgICAgICA8L2lneC1jaGVja2JveD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8aWd4LXRyZWUgI3RyZWUgW2Rpc3BsYXlEZW5zaXR5XT1cImVzZi5kaXNwbGF5RGVuc2l0eVwiIHNlbGVjdGlvbj1cIkNhc2NhZGluZ1wiICAobm9kZVNlbGVjdGlvbik9XCJvbk5vZGVTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJpdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGlzcGxheWVkTGlzdERhdGE7XCIgW3NlbGVjdGVkXT1cIml0ZW0uaXNTZWxlY3RlZFwiPlxuICAgICAgICAgICAgPGRpdj57e2l0ZW0ubGFiZWx9fTwvZGl2PlxuICAgICAgICAgICAgPGlneC10cmVlLW5vZGUgW2RhdGFdPVwiY2hpbGRMZXZlbDFcIiAqbmdGb3I9XCJsZXQgY2hpbGRMZXZlbDEgb2YgaXRlbS5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsMS5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgPGRpdj57e2NoaWxkTGV2ZWwxLmxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsMlwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsMiBvZiBjaGlsZExldmVsMS5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsMi5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsMi5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtdHJlZS1ub2RlIFtkYXRhXT1cImNoaWxkTGV2ZWwzXCIgKm5nRm9yPVwibGV0IGNoaWxkTGV2ZWwzIG9mIGNoaWxkTGV2ZWwyLmNoaWxkcmVuXCIgW3NlbGVjdGVkXT1cImNoaWxkTGV2ZWwzLmlzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsMy5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsNFwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsNCBvZiBjaGlsZExldmVsMy5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsNC5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e2NoaWxkTGV2ZWw0LmxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsNVwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsNSBvZiBjaGlsZExldmVsNC5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsNS5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsNS5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtdHJlZS1ub2RlIFtkYXRhXT1cImNoaWxkTGV2ZWw2XCIgKm5nRm9yPVwibGV0IGNoaWxkTGV2ZWw2IG9mIGNoaWxkTGV2ZWw1LmNoaWxkcmVuXCIgW3NlbGVjdGVkXT1cImNoaWxkTGV2ZWw2LmlzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsNi5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsN1wiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsNyBvZiBjaGlsZExldmVsNi5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsNy5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e2NoaWxkTGV2ZWw3LmxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsOFwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsOCBvZiBjaGlsZExldmVsNy5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsOC5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsOC5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtdHJlZS1ub2RlIFtkYXRhXT1cImNoaWxkTGV2ZWw5XCIgKm5nRm9yPVwibGV0IGNoaWxkTGV2ZWw5IG9mIGNoaWxkTGV2ZWw4LmNoaWxkcmVuXCIgW3NlbGVjdGVkXT1cImNoaWxkTGV2ZWw5LmlzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsOS5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICA8L2lneC10cmVlPlxuXG4gICAgPG5nLXRlbXBsYXRlIGlneERhdGFMb2FkaW5nPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fbG9hZGluZ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZhbHVlc0xvYWRpbmdUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaXNUcmVlRW1wdHkoKVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW1wdHlTZWFyY2hcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlTZWFyY2g+XG4gICAgPGRpdiBjbGFzcz1cImlneC1leGNlbC1maWx0ZXJfX2VtcHR5XCI+XG4gICAgICAgIHt7ZXNmLmdyaWQ/LnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9ub19tYXRjaGVzfX1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGU+XG4gICAgPGlneC1jaXJjdWxhci1iYXIgW2luZGV0ZXJtaW5hdGVdPVwidHJ1ZVwiPlxuICAgIDwvaWd4LWNpcmN1bGFyLWJhcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxmb290ZXIgY2xhc3M9XCJpZ3gtZXhjZWwtZmlsdGVyX19tZW51LWZvb3RlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZXhjZWwtZmlsdGVyX19jYW5jZWxcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGlneEJ1dHRvbj1cImZsYXRcIlxuICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cImVzZi5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZXNmLmNhbmNlbCgpXCI+XG4gICAgICAgICAgICAgICAge3sgZXNmLmdyaWQ/LnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9jYW5jZWwgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImlneC1leGNlbC1maWx0ZXJfX2FwcGx5XCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBpZ3hCdXR0b249XCJyYWlzZWRcIlxuICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cImVzZi5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiYXBwbHlCdXR0b25EaXNhYmxlZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlGaWx0ZXIoKVwiPlxuICAgICAgICAgICAgICAgIHt7IGVzZi5ncmlkPy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfYXBwbHkgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG48L2Zvb3Rlcj5cbiJdfQ==
740
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwtc3R5bGUtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZXhjZWwtc3R5bGUtc2VhcmNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZXhjZWwtc3R5bGUtc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxTQUFTLEVBQ1QsU0FBUyxFQUVULFdBQVcsRUFDWCxTQUFTLEVBRVQsV0FBVyxFQUNYLEtBQUssRUFDTCxZQUFZLEVBRWYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUN6RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQ0gsMEJBQTBCLEVBQUUseUJBQXlCLEVBQUUsdUJBQXVCLEVBQzlFLHlCQUF5QixFQUFFLDJCQUEyQixFQUFFLHVCQUF1QixFQUNsRixNQUFNLDhDQUE4QyxDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUE0QixvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFD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dCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIFZpZXdDaGlsZCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBEaXJlY3RpdmUsXG4gICAgT25EZXN0cm95LFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIElucHV0LFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBRdWVyeUxpc3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJZ3hJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZXMvaW5wdXQvaW5wdXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IERpc3BsYXlEZW5zaXR5IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9kZW5zaXR5JztcbmltcG9ydCB7IElneEZvck9mRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgfSBmcm9tICcuLi8uLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb25zLXRyZWUnO1xuaW1wb3J0IHsgRmlsdGVyaW5nTG9naWMgfSBmcm9tICcuLi8uLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IEdyaWRDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4uLy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHtcbiAgICBJZ3hCb29sZWFuRmlsdGVyaW5nT3BlcmFuZCwgSWd4TnVtYmVyRmlsdGVyaW5nT3BlcmFuZCwgSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQsXG4gICAgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZCwgSWd4RGF0ZVRpbWVGaWx0ZXJpbmdPcGVyYW5kLCBJZ3hUaW1lRmlsdGVyaW5nT3BlcmFuZFxufSBmcm9tICcuLi8uLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWNvbmRpdGlvbic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJQ2hhbmdlQ2hlY2tib3hFdmVudEFyZ3MsIElneENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNsb25lSGllcmFyY2hpY2FsQXJyYXksIFBsYXRmb3JtVXRpbCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgQmFzZUZpbHRlcmluZ0NvbXBvbmVudCB9IGZyb20gJy4vYmFzZS1maWx0ZXJpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnQsIEV4cHJlc3Npb25VSSwgRmlsdGVyTGlzdEl0ZW0gfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBJZ3hCdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzL2J1dHRvbi9idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IElneENpcmN1bGFyUHJvZ3Jlc3NCYXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9wcm9ncmVzc2Jhci9wcm9ncmVzc2Jhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4VHJlZU5vZGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi90cmVlL3RyZWUtbm9kZS90cmVlLW5vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IElneFRyZWVDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi90cmVlL3RyZWUuY29tcG9uZW50JztcbmltcG9ydCB7IElneERhdGFMb2FkaW5nVGVtcGxhdGVEaXJlY3RpdmUsIElneEVtcHR5TGlzdFRlbXBsYXRlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vbGlzdC9saXN0LmNvbW1vbic7XG5pbXBvcnQgeyBJZ3hMaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2xpc3QvbGlzdC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vbGlzdC9saXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hTdWZmaXhEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzL3N1ZmZpeC9zdWZmaXguZGlyZWN0aXZlJztcbmltcG9ydCB7IE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQsIE5nRm9yIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSWd4UHJlZml4RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9wcmVmaXgvcHJlZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vaW5wdXQtZ3JvdXAvaW5wdXQtZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElUcmVlTm9kZVNlbGVjdGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vdHJlZS9jb21tb24nO1xuaW1wb3J0IHsgTmF2aWdhdGUgfSBmcm9tICcuLi8uLi8uLi9kcm9wLWRvd24vZHJvcC1kb3duLmNvbW1vbic7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2lneEV4Y2VsU3R5bGVMb2FkaW5nXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBwdWJsaWMgc3RhdGljIG5nVGVtcGxhdGVDb250ZXh0R3VhcmQoX2RpcjogSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICAgICAgY3R4OiB1bmtub3duKTogY3R4IGlzIHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5kZWZpbmVkPikgeyB9XG59XG5cbmxldCBORVhUX0lEID0gMDtcbi8qKlxuICogQSBjb21wb25lbnQgdXNlZCBmb3IgcHJlc2VudGluZyBFeGNlbCBzdHlsZSBzZWFyY2ggVUkuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LWV4Y2VsLXN0eWxlLXNlYXJjaCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2V4Y2VsLXN0eWxlLXNlYXJjaC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbSWd4SW5wdXRHcm91cENvbXBvbmVudCwgSWd4SWNvbkNvbXBvbmVudCwgSWd4UHJlZml4RGlyZWN0aXZlLCBGb3Jtc01vZHVsZSwgSWd4SW5wdXREaXJlY3RpdmUsIE5nSWYsIElneFN1ZmZpeERpcmVjdGl2ZSwgSWd4TGlzdENvbXBvbmVudCwgSWd4Rm9yT2ZEaXJlY3RpdmUsIElneExpc3RJdGVtQ29tcG9uZW50LCBJZ3hDaGVja2JveENvbXBvbmVudCwgSWd4RGF0YUxvYWRpbmdUZW1wbGF0ZURpcmVjdGl2ZSwgTmdUZW1wbGF0ZU91dGxldCwgSWd4RW1wdHlMaXN0VGVtcGxhdGVEaXJlY3RpdmUsIElneFRyZWVDb21wb25lbnQsIE5nRm9yLCBJZ3hUcmVlTm9kZUNvbXBvbmVudCwgSWd4Q2lyY3VsYXJQcm9ncmVzc0JhckNvbXBvbmVudCwgSWd4QnV0dG9uRGlyZWN0aXZlXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hFeGNlbFN0eWxlU2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBmaWx0ZXJPcHRpbWl6YXRpb25UaHJlc2hvbGQgPSAyO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1leGNlbC1maWx0ZXJfX21lbnUtbWFpbicpXG4gICAgcHVibGljIGRlZmF1bHRDbGFzcyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lucHV0JywgeyByZWFkOiBJZ3hJbnB1dERpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHNlYXJjaElucHV0OiBJZ3hJbnB1dERpcmVjdGl2ZTtcblxuICAgIEBWaWV3Q2hpbGQoJ2NhbmNlbEJ1dHRvbicsIHtyZWFkOiBJZ3hCdXR0b25EaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBjYW5jZWxCdXR0b246IElneEJ1dHRvbkRpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnbGlzdCcsIHsgcmVhZDogSWd4TGlzdENvbXBvbmVudCwgc3RhdGljOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBsaXN0OiBJZ3hMaXN0Q29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdzZWxlY3RBbGxDaGVja2JveCcsIHsgcmVhZDogSWd4Q2hlY2tib3hDb21wb25lbnQsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBwdWJsaWMgc2VsZWN0QWxsQ2hlY2tib3g6IElneENoZWNrYm94Q29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdhZGRUb0N1cnJlbnRGaWx0ZXJDaGVja2JveCcsIHsgcmVhZDogSWd4Q2hlY2tib3hDb21wb25lbnQsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBwdWJsaWMgYWRkVG9DdXJyZW50RmlsdGVyQ2hlY2tib3g6IElneENoZWNrYm94Q29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd0cmVlJywgeyByZWFkOiBJZ3hUcmVlQ29tcG9uZW50LCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcHVibGljIHRyZWU6IElneFRyZWVDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4Rm9yT2ZEaXJlY3RpdmUpXG4gICAgcHJvdGVjdGVkIHZpcnREaXI6IElneEZvck9mRGlyZWN0aXZlPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oSWd4Q2hlY2tib3hDb21wb25lbnQpXG4gICAgcHJvdGVjdGVkIGNoZWNrYm94ZXM6IFF1ZXJ5TGlzdDxJZ3hDaGVja2JveENvbXBvbmVudD47XG4gICAgXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdEFsbEl0ZW0oKTogRmlsdGVyTGlzdEl0ZW0ge1xuICAgICAgICBpZiAoIXRoaXMuX3NlbGVjdEFsbEl0ZW0pIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdEFsbEl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNGaWx0ZXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNTcGVjaWFsOiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzQmxhbmtzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5lc2YuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfc2VsZWN0X2FsbCxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5lc2YuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfc2VsZWN0X2FsbFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0QWxsSXRlbSA9IHNlbGVjdEFsbEl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0QWxsSXRlbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYWRkVG9DdXJyZW50RmlsdGVySXRlbSgpOiBGaWx0ZXJMaXN0SXRlbSB7XG4gICAgICAgIGlmICghdGhpcy5fYWRkVG9DdXJyZW50RmlsdGVySXRlbSkge1xuICAgICAgICAgICAgY29uc3QgYWRkVG9DdXJyZW50RmlsdGVySXRlbSA9IHtcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0ZpbHRlcmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpbmRldGVybWluYXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1NwZWNpYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNCbGFua3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmVzZi5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9hZGRfdG9fZmlsdGVyLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLmVzZi5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9hZGRfdG9fZmlsdGVyXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLl9hZGRUb0N1cnJlbnRGaWx0ZXJJdGVtID0gYWRkVG9DdXJyZW50RmlsdGVySXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRUb0N1cnJlbnRGaWx0ZXJJdGVtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0xvYWRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0xvYWRpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGlzTG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9pc0xvYWRpbmcgPSB2YWx1ZTtcbiAgICAgICAgaWYgKCEodGhpcy5jZHIgYXMgYW55KS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlYXJjaFZhbHVlOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNwbGF5ZWRMaXN0RGF0YTogRmlsdGVyTGlzdEl0ZW1bXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbWF0Y2hlc0NvdW50OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsdWVzTG9hZGluZ1RlbXBsYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5lc2YuZ3JpZD8uZXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXNmLmdyaWQuZXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZS50ZW1wbGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFjdGl2ZURlc2NlbmRhbnQgPSAnJztcblxuICAgIHByaXZhdGUgX2lkID0gYGlneC1leGNlbC1zdHlsZS1zZWFyY2gtJHtORVhUX0lEKyt9YDtcbiAgICBwcml2YXRlIF9pc0xvYWRpbmc7XG4gICAgcHJpdmF0ZSBfYWRkVG9DdXJyZW50RmlsdGVySXRlbTogRmlsdGVyTGlzdEl0ZW07XG4gICAgcHJpdmF0ZSBfc2VsZWN0QWxsSXRlbTogRmlsdGVyTGlzdEl0ZW07XG4gICAgcHJpdmF0ZSBfaGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtczogRmlsdGVyTGlzdEl0ZW1bXTtcbiAgICBwcml2YXRlIF9mb2N1c2VkSXRlbTogQWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHVibGljIGVzZjogQmFzZUZpbHRlcmluZ0NvbXBvbmVudCwgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWwpIHtcbiAgICAgICAgZXNmLmxvYWRpbmdTdGFydC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVzZi5sb2FkaW5nRW5kLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2l6ZSgpO1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVzZi5pbml0aWFsaXplZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2l6ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBlc2YuY29sdW1uQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy52aXJ0RGlyPy5yZXNldFNjcm9sbFBvc2l0aW9uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGVzZi5saXN0RGF0YUxvYWRlZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdEFsbEl0ZW0gPSB0aGlzLmVzZi5saXN0RGF0YVswXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSGllcmFyY2hpY2FsKCkgJiYgdGhpcy5lc2YubGlzdERhdGFbMF0uaXNTcGVjaWFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lc2YubGlzdERhdGEuc3BsaWNlKDAsIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJJbnB1dCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckxpc3REYXRhKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2l6ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJlZnJlc2hTaXplKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlZnJlc2hTaXplID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy52aXJ0RGlyKSB7XG4gICAgICAgICAgICB0aGlzLnZpcnREaXIuaWd4Rm9yQ29udGFpbmVyU2l6ZSA9IHRoaXMuY29udGFpbmVyU2l6ZTtcbiAgICAgICAgICAgIHRoaXMudmlydERpci5pZ3hGb3JJdGVtU2l6ZSA9IHRoaXMuaXRlbVNpemU7XG4gICAgICAgICAgICB0aGlzLnZpcnREaXIucmVjYWxjVXBkYXRlU2l6ZXMoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNsZWFySW5wdXQoKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbHRlckxpc3REYXRhKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGVja2JveENoYW5nZShldmVudEFyZ3M6IElDaGFuZ2VDaGVja2JveEV2ZW50QXJncykge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5pbmRleE9mKGV2ZW50QXJncy5jaGVja2JveC52YWx1ZSk7XG4gICAgICAgIGNvbnN0IHNlbGVjdEFsbEJ0biA9IHRoaXMuZGlzcGxheWVkTGlzdERhdGFbMF07XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gdGhpcy5hZGRUb0N1cnJlbnRGaWx0ZXJJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxlbWVudC5pc1NlbGVjdGVkID0gZXZlbnRBcmdzLmNoZWNrZWQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV2ZW50QXJncy5jaGVja2JveC52YWx1ZS5pc1NlbGVjdGVkID0gZXZlbnRBcmdzLmNoZWNrZWQ7XG4gICAgICAgICAgICBjb25zdCBpbmRleFRvU3RhcnRTbGljaW5nID0gdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5pbmRleE9mKHRoaXMuYWRkVG9DdXJyZW50RmlsdGVySXRlbSkgPiAtMSA/IDIgOiAxO1xuXG4gICAgICAgICAgICBjb25zdCBzbGljZWRBcnJheSA9XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5zbGljZShpbmRleFRvU3RhcnRTbGljaW5nLCB0aGlzLmRpc3BsYXllZExpc3REYXRhLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIGlmICghc2xpY2VkQXJyYXkuZmluZChlbCA9PiBlbC5pc1NlbGVjdGVkID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdG4uaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHNlbGVjdEFsbEJ0bi5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXNsaWNlZEFycmF5LmZpbmQoZWwgPT4gZWwuaXNTZWxlY3RlZCA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdG4uaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHNlbGVjdEFsbEJ0bi5pc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGVjdEFsbEJ0bi5pbmRldGVybWluYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uU2VsZWN0QWxsQ2hlY2tib3hDaGFuZ2UoZXZlbnRBcmdzOiBJQ2hhbmdlQ2hlY2tib3hFdmVudEFyZ3MpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0QWxsSXRlbS5pc1NlbGVjdGVkID0gZXZlbnRBcmdzLmNoZWNrZWQ7XG4gICAgICAgIHRoaXMuX3NlbGVjdEFsbEl0ZW0uaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSB0aGlzLnRyZWUubm9kZXM7XG4gICAgICAgIHRyZWVOb2Rlcy5mb3JFYWNoKG5vZGUgPT4gKG5vZGUuZGF0YSBhcyBGaWx0ZXJMaXN0SXRlbSkuaXNTZWxlY3RlZCA9IGV2ZW50QXJncy5jaGVja2VkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbk5vZGVTZWxlY3Rpb25DaGFuZ2UoZXZlbnRBcmdzOiBJVHJlZU5vZGVTZWxlY3Rpb25FdmVudCkge1xuICAgICAgICBldmVudEFyZ3MuYWRkZWQuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIChub2RlLmRhdGEgYXMgRmlsdGVyTGlzdEl0ZW0pLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgZXZlbnRBcmdzLnJlbW92ZWQuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIChub2RlLmRhdGEgYXMgRmlsdGVyTGlzdEl0ZW0pLmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcyA9IGV2ZW50QXJncy5uZXdTZWxlY3Rpb24ubWFwKGl0ZW0gPT4gaXRlbS5kYXRhIGFzIEZpbHRlckxpc3RJdGVtKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0QWxsQnRuID0gdGhpcy5zZWxlY3RBbGxJdGVtO1xuICAgICAgICBpZiAodGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHNlbGVjdEFsbEJ0bi5pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgICAgICBzZWxlY3RBbGxCdG4uaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2hpZXJhcmNoaWNhbFNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSB0aGlzLnRyZWUubm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZWxlY3RBbGxCdG4uaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmluZGV0ZXJtaW5hdGUgPSB0cnVlO1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpdGVtU2l6ZSgpIHtcbiAgICAgICAgbGV0IGl0ZW1TaXplID0gJzQwcHgnO1xuICAgICAgICBzd2l0Y2ggKHRoaXMuZXNmLmRpc3BsYXlEZW5zaXR5KSB7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvc3k6IGl0ZW1TaXplID0gJzMycHgnOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29tcGFjdDogaXRlbVNpemUgPSAnMjRweCc7IGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1TaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb250YWluZXJTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5lc2YubGlzdERhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0Py5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR0UgTm92IDFzdCwgMjAyMSAjMTAzNTUgUmV0dXJuIGEgbnVtZXJpYyB2YWx1ZSwgc28gdGhlIGNodW5rIHNpemUgaXMgY2FsY3VsYXRlZCBwcm9wZXJseS5cbiAgICAgICAgLy8gSWYgd2Ugc2tpcCB0aGlzIGJyYW5jaCwgb24gYXBwbHlpbmcgdGhlIGZpbHRlciB0aGUgX2NhbGN1bGF0ZUNodW5rU2l6ZSgpIG1ldGhvZCBvZmYgdGhlIEZvck9mRGlyZWN0aXZlIHJlY2VpdmVzXG4gICAgICAgIC8vIGFuIGlneEZvckNvbnRhaW5lclNpemUgPSB1bmRlZmluZWQsIHRodXMgYXNzaWducyB0aGUgY2h1bmtTaXplIHRvIHRoZSBpZ3hGb3JPZi5sZW5ndGggd2hpY2ggbGVhZHMgdG8gcGVyZm9ybWFuY2UgaXNzdWVzLlxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHJvdGVjdGVkIGdldCBpZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5faWQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXQgaWQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRJdGVtSWQoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmlkfS1pdGVtLSR7aW5kZXh9YDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0QWN0aXZlRGVzY2VuZGFudCgpIDogdm9pZCAge1xuICAgICAgICB0aGlzLmFjdGl2ZURlc2NlbmRhbnQgPSB0aGlzLmZvY3VzZWRJdGVtPy5pZCB8fCAnJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGZvY3VzZWRJdGVtKCk6IEFjdGl2ZUVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9jdXNlZEl0ZW07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNldCBmb2N1c2VkSXRlbSh2YWw6IEFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5fZm9jdXNlZEl0ZW0gPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGFwcGx5QnV0dG9uRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5fc2VsZWN0QWxsSXRlbSAmJiAhdGhpcy5fc2VsZWN0QWxsSXRlbS5pc1NlbGVjdGVkICYmICF0aGlzLl9zZWxlY3RBbGxJdGVtLmluZGV0ZXJtaW5hdGUpIHx8XG4gICAgICAgICAgICAodGhpcy5kaXNwbGF5ZWRMaXN0RGF0YSAmJiB0aGlzLmRpc3BsYXllZExpc3REYXRhLmxlbmd0aCA9PT0gMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgdGhpcy5wbGF0Zm9ybS5LRVlNQVAuRU5URVI6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlIHRoaXMucGxhdGZvcm0uS0VZTUFQLkVTQ0FQRTpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhcklucHV0KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyTGlzdERhdGEoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmVzZi5jb2x1bW4/LmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuTnVtYmVyIHx8XG4gICAgICAgICAgICB0aGlzLmVzZi5jb2x1bW4/LmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuQ3VycmVuY3kgfHxcbiAgICAgICAgICAgIHRoaXMuZXNmLmNvbHVtbj8uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5QZXJjZW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlamVjdE5vbk51bWVyaWNhbEVudHJpZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5lc2YubGlzdERhdGEgfHwgIXRoaXMuZXNmLmxpc3REYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YSA9IFtdO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2VsZWN0QWxsQnRuO1xuICAgICAgICBpZiAodGhpcy5fc2VsZWN0QWxsSXRlbSkge1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuID0gdGhpcy5fc2VsZWN0QWxsSXRlbTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdEFsbEJ0biA9IHRoaXMuZXNmLmxpc3REYXRhWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnNlYXJjaFZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgYW55RmlsdGVyZWQgPSB0aGlzLmVzZi5saXN0RGF0YS5zb21lKGkgPT4gaS5pc0ZpbHRlcmVkKTtcbiAgICAgICAgICAgIGxldCBhbnlVbmZpbHRlcmVkID0gdGhpcy5lc2YubGlzdERhdGEuc29tZShpID0+ICFpLmlzRmlsdGVyZWQpO1xuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmluZGV0ZXJtaW5hdGUgPSBhbnlGaWx0ZXJlZCAmJiBhbnlVbmZpbHRlcmVkO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNIaWVyYXJjaGljYWwoKSAmJiB0aGlzLnRyZWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oaWVyYXJjaGljYWxTZWxlY3RlZEl0ZW1zID0gdGhpcy50cmVlLm5vZGVzLm1hcChuID0+IG4uZGF0YSBhcyBGaWx0ZXJMaXN0SXRlbSkuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pc0ZpbHRlcmVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5lc2YubGlzdERhdGEuZm9yRWFjaChpID0+IGkuaXNTZWxlY3RlZCA9IGkuaXNGaWx0ZXJlZCk7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5ZWRMaXN0RGF0YSAhPT0gdGhpcy5lc2YubGlzdERhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXllZExpc3REYXRhID0gdGhpcy5lc2YubGlzdERhdGE7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNIaWVyYXJjaGljYWwoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZS5ub2Rlcy5mb3JFYWNoKG4gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IG4uZGF0YSBhcyBGaWx0ZXJMaXN0SXRlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG4uc2VsZWN0ZWQgPSBpdGVtLmlzU2VsZWN0ZWQgfHwgaXRlbS5pc0ZpbHRlcmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW55RmlsdGVyZWQgPSBhbnlGaWx0ZXJlZCB8fCBuLnNlbGVjdGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW55VW5maWx0ZXJlZCA9IGFueVVuZmlsdGVyZWQgfHwgIW4uc2VsZWN0ZWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdG4uaW5kZXRlcm1pbmF0ZSA9IGFueUZpbHRlcmVkICYmIGFueVVuZmlsdGVyZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZWN0QWxsQnRuLmxhYmVsID0gdGhpcy5lc2YuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfc2VsZWN0X2FsbDtcbiAgICAgICAgICAgIHRoaXMubWF0Y2hlc0NvdW50ID0gdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWFyY2hWYWwgPSB0aGlzLnNlYXJjaFZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aGlzLmlzSGllcmFyY2hpY2FsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2hpZXJhcmNoaWNhbFNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZXNmLmxpc3REYXRhLmZvckVhY2goaSA9PiBpLmlzU2VsZWN0ZWQgPSBmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkRGF0YSA9IGNsb25lSGllcmFyY2hpY2FsQXJyYXkodGhpcy5lc2YubGlzdERhdGEsICdjaGlsZHJlbicpO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YSA9IHRoaXMuaGllcmFyY2hpY2FsU2VsZWN0TWF0Y2hlcyhtYXRjaGVkRGF0YSwgc2VhcmNoVmFsKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMudHJlZS5ub2Rlcy5mb3JFYWNoKG4gPT4ge1xuICAgICAgICAgICAgICAgIG4uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICgobi5kYXRhIGFzIEZpbHRlckxpc3RJdGVtKS5sYWJlbC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hWYWwpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmRBbGxQYXJlbnROb2RlcyhuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEgPSB0aGlzLmVzZi5saXN0RGF0YS5maWx0ZXIoKGl0LCBpKSA9PiAoaSA9PT0gMCAmJiBpdC5pc1NwZWNpYWwpIHx8XG4gICAgICAgICAgICAgICAgKGl0LmxhYmVsICE9PSBudWxsICYmIGl0LmxhYmVsICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAgICAgIWl0LmlzQmxhbmtzICYmXG4gICAgICAgICAgICAgICAgaXQubGFiZWwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVmFsKSA+IC0xKTtcblxuICAgICAgICAgICAgdGhpcy5lc2YubGlzdERhdGEuZm9yRWFjaChpID0+IGkuaXNTZWxlY3RlZCA9IGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEuZm9yRWFjaChpID0+IGkuaXNTZWxlY3RlZCA9IHRydWUpO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5zcGxpY2UoMSwgMCwgdGhpcy5hZGRUb0N1cnJlbnRGaWx0ZXJJdGVtKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXllZExpc3REYXRhLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkTGlzdERhdGEgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXllZExpc3REYXRhLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgIHRoaXMubWF0Y2hlc0NvdW50ID0gdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5sZW5ndGggLSAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tYXRjaGVzQ291bnQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZWN0QWxsQnRuLmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgc2VsZWN0QWxsQnRuLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICBzZWxlY3RBbGxCdG4ubGFiZWwgPSB0aGlzLmVzZi5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9zZWxlY3RfYWxsX3NlYXJjaF9yZXN1bHRzO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYXBwbHlGaWx0ZXIoKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlclRyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKEZpbHRlcmluZ0xvZ2ljLk9yLCB0aGlzLmVzZi5jb2x1bW4uZmllbGQpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZEl0ZW1zID0gW107XG4gICAgICAgIGlmICh0aGlzLmlzSGllcmFyY2hpY2FsKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFkZFRvQ3VycmVudEZpbHRlckNoZWNrYm94ICYmIHRoaXMuYWRkVG9DdXJyZW50RmlsdGVyQ2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmlsdGVyZWRUb1NlbGVjdGVkSXRlbXModGhpcy5lc2YubGlzdERhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zID0gdGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmRpc3BsYXllZExpc3REYXRhWzFdO1xuICAgICAgICAgICAgY29uc3QgYWRkVG9DdXJyZW50RmlsdGVyT3B0aW9uVmlzaWJsZSA9IGl0ZW0gPT09IHRoaXMuYWRkVG9DdXJyZW50RmlsdGVySXRlbTtcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMgPSBhZGRUb0N1cnJlbnRGaWx0ZXJPcHRpb25WaXNpYmxlICYmIGl0ZW0uaXNTZWxlY3RlZCA/XG4gICAgICAgICAgICAgICAgdGhpcy5lc2YubGlzdERhdGEuc2xpY2UoMSwgdGhpcy5lc2YubGlzdERhdGEubGVuZ3RoKS5maWx0ZXIoZWwgPT4gZWwuaXNTZWxlY3RlZCB8fCBlbC5pc0ZpbHRlcmVkKSA6XG4gICAgICAgICAgICAgICAgdGhpcy5lc2YubGlzdERhdGEuc2xpY2UoMSwgdGhpcy5lc2YubGlzdERhdGEubGVuZ3RoKS5maWx0ZXIoZWwgPT4gZWwuaXNTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdW5zZWxlY3RlZEl0ZW07XG4gICAgICAgIGlmICh0aGlzLmlzSGllcmFyY2hpY2FsKCkpIHtcbiAgICAgICAgICAgIHVuc2VsZWN0ZWRJdGVtID0gdGhpcy5lc2YubGlzdERhdGEuZmluZChlbCA9PiBlbC5pc1NlbGVjdGVkID09PSBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bnNlbGVjdGVkSXRlbSA9IHRoaXMuZXNmLmxpc3REYXRhLnNsaWNlKDEsIHRoaXMuZXNmLmxpc3REYXRhLmxlbmd0aCkuZmluZChlbCA9PiBlbC5pc1NlbGVjdGVkID09PSBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5zZWxlY3RlZEl0ZW0pIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA8PSBJZ3hFeGNlbFN0eWxlU2VhcmNoQ29tcG9uZW50LmZpbHRlck9wdGltaXphdGlvblRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnZhbHVlICE9PSBudWxsICYmIGVsZW1lbnQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXNmLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLkJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSB0aGlzLmNyZWF0ZUNvbmRpdGlvbihlbGVtZW50LnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJDb25kaXRpb24gPSB0aGlzLmVzZi5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5UaW1lID8gJ2F0JyA6ICdlcXVhbHMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRoaXMuY3JlYXRlQ29uZGl0aW9uKGZpbHRlckNvbmRpdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSB0aGlzLmNyZWF0ZUNvbmRpdGlvbignZW1wdHknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lOiB0aGlzLmVzZi5jb2x1bW4uZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiB0aGlzLmVzZi5jb2x1bW4uZmlsdGVyaW5nSWdub3JlQ2FzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFZhbDogZWxlbWVudC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmxhbmtzSXRlbUluZGV4ID0gc2VsZWN0ZWRJdGVtcy5maW5kSW5kZXgoZSA9PiBlLnZhbHVlID09PSBudWxsIHx8IGUudmFsdWUgPT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgbGV0IGJsYW5rc0l0ZW06IGFueTtcbiAgICAgICAgICAgICAgICBpZiAoYmxhbmtzSXRlbUluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYmxhbmtzSXRlbSA9IHNlbGVjdGVkSXRlbXNbYmxhbmtzSXRlbUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcy5zcGxpY2UoYmxhbmtzSXRlbUluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmlsdGVyVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiB0aGlzLmNyZWF0ZUNvbmRpdGlvbignaW4nKSxcbiAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lOiB0aGlzLmVzZi5jb2x1bW4uZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U6IHRoaXMuZXNmLmNvbHVtbi5maWx0ZXJpbmdJZ25vcmVDYXNlLFxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hWYWw6IG5ldyBTZXQodGhpcy5lc2YuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lc2YuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZVRpbWUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcy5tYXAoZCA9PiBkLnZhbHVlLnRvSVNPU3RyaW5nKCkpIDogdGhpcy5lc2YuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuVGltZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcy5tYXAoZSA9PiBlLnZhbHVlLnRvTG9jYWxlVGltZVN0cmluZygpKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcy5tYXAoZSA9PiBlLnZhbHVlKSlcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChibGFua3NJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclRyZWUuZmlsdGVyaW5nT3BlcmFuZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IHRoaXMuY3JlYXRlQ29uZGl0aW9uKCdlbXB0eScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lOiB0aGlzLmVzZi5jb2x1bW4uZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiB0aGlzLmVzZi5jb2x1bW4uZmlsdGVyaW5nSWdub3JlQ2FzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFZhbDogYmxhbmtzSXRlbS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBncmlkID0gdGhpcy5lc2YuZ3JpZDtcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuZXNmLmNvbHVtbjtcbiAgICAgICAgICAgIGdyaWQuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJJbnRlcm5hbChjb2wuZmllbGQsIGZpbHRlclRyZWUpO1xuICAgICAgICAgICAgdGhpcy5lc2YuZXhwcmVzc2lvbnNMaXN0ID0gbmV3IEFycmF5PEV4cHJlc3Npb25VST4oKTtcbiAgICAgICAgICAgIGdyaWQuZmlsdGVyaW5nU2VydmljZS5nZW5lcmF0ZUV4cHJlc3Npb25zTGlzdChjb2wuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLFxuICAgICAgICAgICAgICAgIGdyaWQuZmlsdGVyaW5nTG9naWMsIHRoaXMuZXNmLmV4cHJlc3Npb25zTGlzdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVzZi5ncmlkLmZpbHRlcmluZ1NlcnZpY2UuY2xlYXJGaWx0ZXIodGhpcy5lc2YuY29sdW1uLmZpZWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXNmLmNsb3NlRHJvcGRvd24oKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3QgbmF2S2V5cyA9IFsnc3BhY2UnLCAnc3BhY2ViYXInLCAnICcsXG4gICAgICAgICAgICAnYXJyb3d1cCcsICd1cCcsICdhcnJvd2Rvd24nLCAnZG93bicsICdob21lJywgJ2VuZCddO1xuICAgICAgICAgICAgICAgIGlmIChuYXZLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHsgLy8gSWYga2V5IGhhcyBhcHByb3ByaWF0ZSBmdW5jdGlvbiBpbiBERFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Fycm93dXAnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3VwJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkFycm93VXBLZXlEb3duKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Fycm93ZG93bic6XG4gICAgICAgICAgICAgICAgY2FzZSAnZG93bic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25BcnJvd0Rvd25LZXlEb3duKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hvbWUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uSG9tZUtleURvd24oKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVuZEtleURvd24oKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlYmFyJzpcbiAgICAgICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkFjdGlvbktleURvd24oKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRm9jdXMoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0SW5kZXhJblZpZXcgPSB0aGlzLnZpcnREaXIuc3RhdGUuc3RhcnRJbmRleDtcbiAgICAgICAgdGhpcy5mb2N1c2VkSXRlbSA9IHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmdldEl0ZW1JZChmaXJzdEluZGV4SW5WaWV3KSxcbiAgICAgICAgICAgIGluZGV4OiBmaXJzdEluZGV4SW5WaWV3LFxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy52aXJ0RGlyLmlneEZvck9mW2ZpcnN0SW5kZXhJblZpZXddLmlzU2VsZWN0ZWRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVEZXNjZW5kYW50KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRm9jdXNPdXQoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZEl0ZW0gPSBudWxsO1xuICAgICAgICB0aGlzLnNldEFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0hpZXJhcmNoaWNhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXNmLmlzSGllcmFyY2hpY2FsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzVHJlZUVtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lc2YuaXNIaWVyYXJjaGljYWwgJiYgdGhpcy5kaXNwbGF5ZWRMaXN0RGF0YS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWVyYXJjaGljYWxTZWxlY3RNYXRjaGVzKGRhdGE6IEZpbHRlckxpc3RJdGVtW10sIHNlYXJjaFZhbDogc3RyaW5nKSB7XG4gICAgICAgIGRhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQuaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgZWxlbWVudC5pc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy50cmVlLm5vZGVzLmZpbHRlcihuID0+IChuLmRhdGEgYXMgRmlsdGVyTGlzdEl0ZW0pLmxhYmVsID09PSBlbGVtZW50LmxhYmVsKVswXTtcbiAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5sYWJlbC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hWYWwpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaGllcmFyY2hpY2FsU2VsZWN0QWxsQ2hpbGRyZW4oZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5faGllcmFyY2hpY2FsU2VsZWN0ZWRJdGVtcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNoaWxkcmVuID0gdGhpcy5oaWVyYXJjaGljYWxTZWxlY3RNYXRjaGVzKGVsZW1lbnQuY2hpbGRyZW4sIHNlYXJjaFZhbCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQuaXNTZWxlY3RlZCA9PT0gdHJ1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWVyYXJjaGljYWxTZWxlY3RBbGxDaGlsZHJlbihlbGVtZW50OiBGaWx0ZXJMaXN0SXRlbSkge1xuICAgICAgICBlbGVtZW50LmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICAgICAgY2hpbGQuaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgY2hpbGQuaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9oaWVyYXJjaGljYWxTZWxlY3RlZEl0ZW1zLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWVyYXJjaGljYWxTZWxlY3RBbGxDaGlsZHJlbihjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleHBhbmRBbGxQYXJlbnROb2Rlcyhub2RlOiBhbnkpIHtcbiAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kQWxsUGFyZW50Tm9kZXMobm9kZS5wYXJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkRmlsdGVyZWRUb1NlbGVjdGVkSXRlbXMocmVjb3JkczogRmlsdGVyTGlzdEl0ZW1bXSkge1xuICAgICAgICByZWNvcmRzLmZvckVhY2gocmVjb3JkID0+IHtcbiAgICAgICAgICAgIGlmIChyZWNvcmQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZpbHRlcmVkVG9TZWxlY3RlZEl0ZW1zKHJlY29yZC5jaGlsZHJlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZWNvcmQuaXNGaWx0ZXJlZCAmJiB0aGlzLl9oaWVyYXJjaGljYWxTZWxlY3RlZEl0ZW1zLmluZGV4T2YocmVjb3JkKSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oaWVyYXJjaGljYWxTZWxlY3RlZEl0ZW1zLnB1c2gocmVjb3JkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNvbmRpdGlvbihjb25kaXRpb25OYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmVzZi5jb2x1bW4uZGF0YVR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLkJvb2xlYW46XG4gICAgICAgICAgICAgICAgcmV0dXJuIElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCkuY29uZGl0aW9uKGNvbmRpdGlvbk5hbWUpO1xuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuTnVtYmVyOlxuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuQ3VycmVuY3k6XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5QZXJjZW50OlxuICAgICAgICAgICAgICAgIHJldHVybiBJZ3hOdW1iZXJGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCkuY29uZGl0aW9uKGNvbmRpdGlvbk5hbWUpO1xuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oY29uZGl0aW9uTmFtZSk7XG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5UaW1lOlxuICAgICAgICAgICAgICAgIHJldHVybiBJZ3hUaW1lRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbihjb25kaXRpb25OYW1lKTtcbiAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLkRhdGVUaW1lOlxuICAgICAgICAgICAgICAgIHJldHVybiBJZ3hEYXRlVGltZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oY29uZGl0aW9uTmFtZSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCkuY29uZGl0aW9uKGNvbmRpdGlvbk5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlamVjdE5vbk51bWVyaWNhbEVudHJpZXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlZ0V4cCA9IC9bXjAtOVxcLixlRVxcLV0vZztcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVmFsdWUgJiYgcmVnRXhwLnRlc3QodGhpcy5zZWFyY2hWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQudmFsdWUgPSB0aGlzLnNlYXJjaFZhbHVlLnJlcGxhY2UocmVnRXhwLCAnJyk7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gdGhpcy5zZWFyY2hJbnB1dC52YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25BcnJvd1VwS2V5RG93bigpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEl0ZW0gJiYgdGhpcy5mb2N1c2VkSXRlbS5pbmRleCA9PT0gMCAmJiB0aGlzLnZpcnREaXIuc3RhdGUuc3RhcnRJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5vbkZvY3VzT3V0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlSXRlbSh0aGlzLmZvY3VzZWRJdGVtID8gdGhpcy5mb2N1c2VkSXRlbS5pbmRleCAtIDEgOiAwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQXJyb3dEb3duS2V5RG93bigpIHtcbiAgICAgICAgY29uc3QgbGFzdEluZGV4ID0gdGhpcy52aXJ0RGlyLmlneEZvck9mLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmICh0aGlzLmZvY3VzZWRJdGVtICYmIHRoaXMuZm9jdXNlZEl0ZW0uaW5kZXggPT09IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxCdXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5vbkZvY3VzT3V0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlSXRlbSh0aGlzLmZvY3VzZWRJdGVtID8gdGhpcy5mb2N1c2VkSXRlbS5pbmRleCArIDEgOiAwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uSG9tZUtleURvd24oKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGVJdGVtKDApO1xuICAgICAgICB0aGlzLnNldEFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRW5kS2V5RG93bigpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZUl0ZW0odGhpcy52aXJ0RGlyLmlneEZvck9mLmxlbmd0aCAtIDEpO1xuICAgICAgICB0aGlzLnNldEFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQWN0aW9uS2V5RG93bigpIHtcbiAgICAgICAgY29uc3QgZGF0YUl0ZW0gPSB0aGlzLmRpc3BsYXllZExpc3REYXRhW3RoaXMuZm9jdXNlZEl0ZW0uaW5kZXhdO1xuICAgICAgICBjb25zdCBhcmdzOiBJQ2hhbmdlQ2hlY2tib3hFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBjaGVja2VkOiAhZGF0YUl0ZW0uaXNTZWxlY3RlZCxcbiAgICAgICAgICAgIGNoZWNrYm94OiB0aGlzLmNoZWNrYm94ZXMuZmluZCh4ID0+IHgudmFsdWUgPT09IGRhdGFJdGVtKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGVja2JveENoYW5nZShhcmdzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5hdmlnYXRlSXRlbShpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEgfHwgaW5kZXggPj0gdGhpcy52aXJ0RGlyLmlneEZvck9mLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGluZGV4ID4gKHRoaXMuZm9jdXNlZEl0ZW0gPyB0aGlzLmZvY3VzZWRJdGVtLmluZGV4IDogLTEpID8gTmF2aWdhdGUuRG93biA6IE5hdmlnYXRlLlVwO1xuICAgICAgICBjb25zdCBzY3JvbGxSZXF1aXJlZCA9IHRoaXMuaXNJbmRleE91dE9mQm91bmRzKGluZGV4LCBkaXJlY3Rpb24pO1xuICAgICAgICB0aGlzLmZvY3VzZWRJdGVtID0ge1xuICAgICAgICAgICBpZDogdGhpcy5nZXRJdGVtSWQoaW5kZXgpLFxuICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgIGNoZWNrZWQ6IHRoaXMudmlydERpci5pZ3hGb3JPZltpbmRleF0uaXNTZWxlY3RlZFxuICAgICAgICB9O1xuICAgICAgICBpZiAoc2Nyb2xsUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHRoaXMudmlydERpci5zY3JvbGxUbyhpbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSW5kZXhPdXRPZkJvdW5kcyhpbmRleDogbnVtYmVyLCBkaXJlY3Rpb246IE5hdmlnYXRlKSB7XG4gICAgICAgIGNvbnN0IHZpcnRTdGF0ZSA9IHRoaXMudmlydERpci5zdGF0ZTtcbiAgICAgICAgY29uc3QgY3VycmVudFBvc2l0aW9uID0gdGhpcy52aXJ0RGlyLmdldFNjcm9sbCgpLnNjcm9sbFRvcDtcbiAgICAgICAgY29uc3QgaXRlbVBvc2l0aW9uID0gdGhpcy52aXJ0RGlyLmdldFNjcm9sbEZvckluZGV4KGluZGV4LCBkaXJlY3Rpb24gPT09IE5hdmlnYXRlLkRvd24pO1xuICAgICAgICBjb25zdCBpbmRleE91dE9mQ2h1bmsgPSBpbmRleCA8IHZpcnRTdGF0ZS5zdGFydEluZGV4IHx8IGluZGV4ID4gdmlydFN0YXRlLmNodW5rU2l6ZSArIHZpcnRTdGF0ZS5zdGFydEluZGV4O1xuICAgICAgICBjb25zdCBzY3JvbGxOZWVkZWQgPSBkaXJlY3Rpb24gPT09IE5hdmlnYXRlLkRvd24gPyBjdXJyZW50UG9zaXRpb24gPCBpdGVtUG9zaXRpb24gOiBjdXJyZW50UG9zaXRpb24gPiBpdGVtUG9zaXRpb247XG4gICAgICAgIGNvbnN0IHN1YlJlcXVpcmVkID0gaW5kZXhPdXRPZkNodW5rIHx8IHNjcm9sbE5lZWRlZDtcbiAgICAgICAgcmV0dXJuIHN1YlJlcXVpcmVkO1xuICAgIH1cbn1cbiIsIjxpZ3gtaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cImVzZi5kaXNwbGF5RGVuc2l0eVwiPlxuICAgIDxpZ3gtaWNvbiBpZ3hQcmVmaXg+c2VhcmNoPC9pZ3gtaWNvbj5cbiAgICA8aW5wdXRcbiAgICAgICAgI2lucHV0XG4gICAgICAgIGlneElucHV0XG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJMaXN0RGF0YSgpXCJcbiAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJlc2YuY29sdW1uPy5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9zZWFyY2hfcGxhY2Vob2xkZXJcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIi8+XG4gICAgPGlneC1pY29uXG4gICAgICAgIGlneFN1ZmZpeFxuICAgICAgICAqbmdJZj1cInNlYXJjaFZhbHVlIHx8IHNlYXJjaFZhbHVlID09PSAwXCJcbiAgICAgICAgKGNsaWNrKT1cImNsZWFySW5wdXQoKVwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICBjbGVhclxuICAgIDwvaWd4LWljb24+XG48L2lneC1pbnB1dC1ncm91cD5cblxuPGlneC1saXN0ICNsaXN0IHJvbGU9XCJsaXN0Ym94XCIgW2Rpc3BsYXlEZW5zaXR5XT1cImVzZi5kaXNwbGF5RGVuc2l0eVwiIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nXCIgKm5nSWY9XCIhaXNIaWVyYXJjaGljYWwoKVwiIChrZXlkb3duKT1cImhhbmRsZUtleURvd24oJGV2ZW50KVwiIHRhYmluZGV4PVwiMFwiXG5bYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwidGhpcy5hY3RpdmVEZXNjZW5kYW50XCIgKGZvY3VzKT1cIm9uRm9jdXMoKVwiIChmb2N1c291dCk9XCJvbkZvY3VzT3V0KClcIj5cbiAgICA8ZGl2IHN0eWxlPVwib3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlO1wiPlxuICAgICAgICA8aWd4LWxpc3QtaXRlbSBbY2xhc3MuaWd4LWxpc3RfX2l0ZW0tYmFzZS0tYWN0aXZlXT1cImZvY3VzZWRJdGVtPy5pZCA9PT0gdGhpcy5nZXRJdGVtSWQoaSlcIiBbYXR0ci5pZF09XCJnZXRJdGVtSWQoaSlcIiByb2xlPVwib3B0aW9uXCIgXG4gICAgICAgICppZ3hGb3I9XCJsZXQgaXRlbSBvZiBkaXNwbGF5ZWRMaXN0RGF0YTtpbmRleCBhcyBpOyBzY3JvbGxPcmllbnRhdGlvbiA6ICd2ZXJ0aWNhbCc7IGNvbnRhaW5lclNpemU6IGNvbnRhaW5lclNpemU7IGl0ZW1TaXplOiBpdGVtU2l6ZVwiPlxuICAgICAgICAgICAgPGlneC1jaGVja2JveFxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIml0ZW0/LmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlUmlwcGxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cIml0ZW0/LmluZGV0ZXJtaW5hdGVcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlVHJhbnNpdGlvbnNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgICAgICAgICA8L2lneC1jaGVja2JveD5cbiAgICAgICAgPC9pZ3gtbGlzdC1pdGVtPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLXRlbXBsYXRlIGlneERhdGFMb2FkaW5nPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fbG9hZGluZ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZhbHVlc0xvYWRpbmdUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgaWd4RW1wdHlMaXN0PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW1wdHlTZWFyY2hcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPGRpdiBjbGFzcz1cImlneC1leGNlbC1maWx0ZXJfX2ZpbHRlci1yZXN1bHRzXCIgYXJpYS1saXZlPVwicG9saXRlXCIgYXJpYS1hdG9taWM9XCJ0cnVlXCI+XG4gICAgICAgIHt7IGVzZi5ncmlkPy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZXhjZWxfbWF0Y2hlc19jb3VudC5yZXBsYWNlKCd7MH0nLCBtYXRjaGVzQ291bnQpIH19XG4gICAgPC9kaXY+XG48L2lneC1saXN0PlxuXG48ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fdHJlZVwiICpuZ0lmPVwiaXNIaWVyYXJjaGljYWwoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZXhjZWwtZmlsdGVyX190cmVlLWFsaWtlXCIgKm5nSWY9XCIhaXNUcmVlRW1wdHkoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fdHJlZS1hbGlrZS1pdGVtXCI+XG4gICAgICAgICAgICA8aWd4LWNoZWNrYm94ICNzZWxlY3RBbGxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0QWxsSXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdEFsbEl0ZW0/LmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0QWxsSXRlbT8uaW5kZXRlcm1pbmF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlVHJhbnNpdGlvbnNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWxlY3RBbGxDaGVja2JveENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAge3sgc2VsZWN0QWxsSXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgPC9pZ3gtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fdHJlZS1hbGlrZS1pdGVtXCIgKm5nSWY9XCJzZWFyY2hWYWx1ZVwiPlxuICAgICAgICAgICAgPGlneC1jaGVja2JveCAjYWRkVG9DdXJyZW50RmlsdGVyQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImFkZFRvQ3VycmVudEZpbHRlckl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJhZGRUb0N1cnJlbnRGaWx0ZXJJdGVtLmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVUcmFuc2l0aW9uc109XCJ0cnVlXCI+XG5cbiAgICAgICAgICAgICAgICB7eyBhZGRUb0N1cnJlbnRGaWx0ZXJJdGVtLmxhYmVsIH19XG4gICAgICAgICAgICA8L2lneC1jaGVja2JveD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8aWd4LXRyZWUgI3RyZWUgW2Rpc3BsYXlEZW5zaXR5XT1cImVzZi5kaXNwbGF5RGVuc2l0eVwiIHNlbGVjdGlvbj1cIkNhc2NhZGluZ1wiICAobm9kZVNlbGVjdGlvbik9XCJvbk5vZGVTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJpdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGlzcGxheWVkTGlzdERhdGE7XCIgW3NlbGVjdGVkXT1cIml0ZW0uaXNTZWxlY3RlZFwiPlxuICAgICAgICAgICAgPGRpdj57e2l0ZW0ubGFiZWx9fTwvZGl2PlxuICAgICAgICAgICAgPGlneC10cmVlLW5vZGUgW2RhdGFdPVwiY2hpbGRMZXZlbDFcIiAqbmdGb3I9XCJsZXQgY2hpbGRMZXZlbDEgb2YgaXRlbS5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsMS5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgPGRpdj57e2NoaWxkTGV2ZWwxLmxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsMlwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsMiBvZiBjaGlsZExldmVsMS5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsMi5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsMi5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtdHJlZS1ub2RlIFtkYXRhXT1cImNoaWxkTGV2ZWwzXCIgKm5nRm9yPVwibGV0IGNoaWxkTGV2ZWwzIG9mIGNoaWxkTGV2ZWwyLmNoaWxkcmVuXCIgW3NlbGVjdGVkXT1cImNoaWxkTGV2ZWwzLmlzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsMy5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsNFwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsNCBvZiBjaGlsZExldmVsMy5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsNC5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e2NoaWxkTGV2ZWw0LmxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsNVwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsNSBvZiBjaGlsZExldmVsNC5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsNS5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsNS5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtdHJlZS1ub2RlIFtkYXRhXT1cImNoaWxkTGV2ZWw2XCIgKm5nRm9yPVwibGV0IGNoaWxkTGV2ZWw2IG9mIGNoaWxkTGV2ZWw1LmNoaWxkcmVuXCIgW3NlbGVjdGVkXT1cImNoaWxkTGV2ZWw2LmlzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsNi5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsN1wiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsNyBvZiBjaGlsZExldmVsNi5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsNy5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e2NoaWxkTGV2ZWw3LmxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LXRyZWUtbm9kZSBbZGF0YV09XCJjaGlsZExldmVsOFwiICpuZ0Zvcj1cImxldCBjaGlsZExldmVsOCBvZiBjaGlsZExldmVsNy5jaGlsZHJlblwiIFtzZWxlY3RlZF09XCJjaGlsZExldmVsOC5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsOC5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtdHJlZS1ub2RlIFtkYXRhXT1cImNoaWxkTGV2ZWw5XCIgKm5nRm9yPVwibGV0IGNoaWxkTGV2ZWw5IG9mIGNoaWxkTGV2ZWw4LmNoaWxkcmVuXCIgW3NlbGVjdGVkXT1cImNoaWxkTGV2ZWw5LmlzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tjaGlsZExldmVsOS5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICAgICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgICAgICA8L2lneC10cmVlLW5vZGU+XG4gICAgICAgIDwvaWd4LXRyZWUtbm9kZT5cbiAgICA8L2lneC10cmVlPlxuXG4gICAgPG5nLXRlbXBsYXRlIGlneERhdGFMb2FkaW5nPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fbG9hZGluZ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZhbHVlc0xvYWRpbmdUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaXNUcmVlRW1wdHkoKVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW1wdHlTZWFyY2hcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlTZWFyY2g+XG4gICAgPGRpdiBjbGFzcz1cImlneC1leGNlbC1maWx0ZXJfX2VtcHR5XCI+XG4gICAgICAgIHt7ZXNmLmdyaWQ/LnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9ub19tYXRjaGVzfX1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGU+XG4gICAgPGlneC1jaXJjdWxhci1iYXIgW2luZGV0ZXJtaW5hdGVdPVwidHJ1ZVwiPlxuICAgIDwvaWd4LWNpcmN1bGFyLWJhcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxmb290ZXIgY2xhc3M9XCJpZ3gtZXhjZWwtZmlsdGVyX19tZW51LWZvb3RlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZXhjZWwtZmlsdGVyX19jYW5jZWxcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgI2NhbmNlbEJ1dHRvblxuICAgICAgICAgICAgaWd4QnV0dG9uPVwiZmxhdFwiXG4gICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZXNmLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgIChjbGljayk9XCJlc2YuY2FuY2VsKClcIj5cbiAgICAgICAgICAgICAgICB7eyBlc2YuZ3JpZD8ucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2V4Y2VsX2NhbmNlbCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWV4Y2VsLWZpbHRlcl9fYXBwbHlcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGlneEJ1dHRvbj1cInJhaXNlZFwiXG4gICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZXNmLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhcHBseUJ1dHRvbkRpc2FibGVkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhcHBseUZpbHRlcigpXCI+XG4gICAgICAgICAgICAgICAge3sgZXNmLmdyaWQ/LnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9leGNlbF9hcHBseSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZm9vdGVyPlxuIl19