igniteui-angular 15.1.30 → 15.1.31

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 (67) hide show
  1. package/esm2020/lib/action-strip/action-strip.component.mjs +3 -3
  2. package/esm2020/lib/action-strip/grid-actions/grid-action-button.component.mjs +3 -3
  3. package/esm2020/lib/banner/banner.component.mjs +8 -8
  4. package/esm2020/lib/card/card.component.mjs +3 -3
  5. package/esm2020/lib/carousel/carousel.component.mjs +7 -7
  6. package/esm2020/lib/combo/combo-dropdown.component.mjs +3 -3
  7. package/esm2020/lib/combo/combo.common.mjs +5 -5
  8. package/esm2020/lib/combo/combo.component.mjs +3 -3
  9. package/esm2020/lib/combo/combo.directives.mjs +2 -2
  10. package/esm2020/lib/core/navigation/directives.mjs +3 -3
  11. package/esm2020/lib/date-common/calendar-container/calendar-container.component.mjs +3 -3
  12. package/esm2020/lib/date-picker/date-picker.component.mjs +7 -7
  13. package/esm2020/lib/date-range-picker/date-range-picker.component.mjs +6 -6
  14. package/esm2020/lib/dialog/dialog.component.mjs +5 -5
  15. package/esm2020/lib/directives/button/button.directive.mjs +8 -8
  16. package/esm2020/lib/directives/ripple/ripple.directive.mjs +6 -6
  17. package/esm2020/lib/directives/tooltip/tooltip-target.directive.mjs +7 -9
  18. package/esm2020/lib/directives/tooltip/tooltip.directive.mjs +2 -2
  19. package/esm2020/lib/drop-down/drop-down.component.mjs +3 -3
  20. package/esm2020/lib/expansion-panel/expansion-panel.component.mjs +4 -4
  21. package/esm2020/lib/grids/column-actions/column-actions.component.mjs +3 -3
  22. package/esm2020/lib/grids/common/crud.service.mjs +2 -2
  23. package/esm2020/lib/grids/filtering/base/grid-filtering-row.component.mjs +3 -3
  24. package/esm2020/lib/grids/filtering/excel-style/excel-style-custom-dialog.component.mjs +3 -3
  25. package/esm2020/lib/grids/filtering/excel-style/excel-style-date-expression.component.mjs +3 -3
  26. package/esm2020/lib/grids/filtering/excel-style/excel-style-default-expression.component.mjs +3 -3
  27. package/esm2020/lib/grids/filtering/excel-style/excel-style-header.component.mjs +3 -3
  28. package/esm2020/lib/grids/filtering/excel-style/excel-style-moving.component.mjs +3 -3
  29. package/esm2020/lib/grids/filtering/excel-style/excel-style-search.component.mjs +3 -3
  30. package/esm2020/lib/grids/filtering/excel-style/excel-style-sorting.component.mjs +3 -3
  31. package/esm2020/lib/grids/grid/grid.component.mjs +3 -3
  32. package/esm2020/lib/grids/grid-base.directive.mjs +4 -4
  33. package/esm2020/lib/grids/hierarchical-grid/hierarchical-grid.component.mjs +3 -3
  34. package/esm2020/lib/grids/tree-grid/tree-grid.component.mjs +3 -3
  35. package/esm2020/lib/query-builder/query-builder.component.mjs +3 -3
  36. package/esm2020/lib/simple-combo/simple-combo.component.mjs +3 -3
  37. package/esm2020/lib/snackbar/snackbar.component.mjs +4 -4
  38. package/esm2020/lib/tabs/tabs/tabs.component.mjs +3 -3
  39. package/esm2020/lib/time-picker/time-picker.component.mjs +6 -5
  40. package/esm2020/lib/toast/toast.component.mjs +2 -2
  41. package/esm2020/lib/tree/tree-node/tree-node.component.mjs +4 -4
  42. package/fesm2015/igniteui-angular.mjs +117 -118
  43. package/fesm2015/igniteui-angular.mjs.map +1 -1
  44. package/fesm2020/igniteui-angular.mjs +117 -118
  45. package/fesm2020/igniteui-angular.mjs.map +1 -1
  46. package/lib/banner/banner.component.d.ts +5 -5
  47. package/lib/card/card.component.d.ts +2 -2
  48. package/lib/carousel/carousel.component.d.ts +6 -6
  49. package/lib/combo/combo.common.d.ts +4 -4
  50. package/lib/combo/combo.directives.d.ts +1 -1
  51. package/lib/core/navigation/directives.d.ts +2 -2
  52. package/lib/date-picker/date-picker.component.d.ts +4 -4
  53. package/lib/date-range-picker/date-range-picker.component.d.ts +3 -3
  54. package/lib/dialog/dialog.component.d.ts +4 -4
  55. package/lib/directives/button/button.directive.d.ts +7 -7
  56. package/lib/directives/ripple/ripple.directive.d.ts +6 -6
  57. package/lib/directives/tooltip/tooltip-target.directive.d.ts +6 -8
  58. package/lib/directives/tooltip/tooltip.directive.d.ts +1 -1
  59. package/lib/expansion-panel/expansion-panel.component.d.ts +3 -3
  60. package/lib/grids/common/crud.service.d.ts +1 -1
  61. package/lib/grids/grid-base.directive.d.ts +3 -3
  62. package/lib/snackbar/snackbar.component.d.ts +1 -1
  63. package/lib/time-picker/time-picker.component.d.ts +1 -1
  64. package/lib/toast/toast.component.d.ts +1 -1
  65. package/lib/tree/tree-node/tree-node.component.d.ts +3 -3
  66. package/migrations/common/UpdateChanges.js +1 -1
  67. package/package.json +1 -1
@@ -956,7 +956,7 @@ IgxHierarchicalGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14
956
956
  IgxForOfSyncService,
957
957
  IgxForOfScrollSyncService,
958
958
  IgxRowIslandAPIService
959
- ], queries: [{ propertyName: "toolbarTemplate", first: true, predicate: IgxGridToolbarDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "childLayoutList", predicate: IgxRowIslandComponent, read: IgxRowIslandComponent }, { propertyName: "allLayoutList", predicate: IgxRowIslandComponent, descendants: true, read: IgxRowIslandComponent }, { propertyName: "paginatorList", predicate: IgxPaginatorComponent, descendants: true }], viewQueries: [{ propertyName: "toolbarOutlet", first: true, predicate: ["toolbarOutlet"], descendants: true, read: ViewContainerRef }, { propertyName: "paginatorOutlet", first: true, predicate: ["paginatorOutlet"], descendants: true, read: ViewContainerRef }, { propertyName: "hierarchicalRecordTemplate", first: true, predicate: ["hierarchical_record_template"], descendants: true, read: TemplateRef, static: true }, { propertyName: "childTemplate", first: true, predicate: ["child_record_template"], descendants: true, read: TemplateRef, static: true }, { propertyName: "templateOutlets", predicate: IgxTemplateOutletDirective, descendants: true, read: IgxTemplateOutletDirective }, { propertyName: "hierarchicalRows", predicate: IgxChildGridRowComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-content select=\"igx-grid-toolbar\"></ng-content>\n<ng-container #toolbarOutlet></ng-container>\n\n<igx-grid-header-row class=\"igx-grid-thead\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (focus)=\"navigation.focusFirstCell()\"\n>\n</igx-grid-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" (focus)=\"navigation.focusTbody($event)\"\n (keydown)=\"navigation.handleNavigation($event)\" (dragStop)=\"selectionService.dragMode = $event\"\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\" [attr.aria-activedescendant]=\"activeDescendant\" [attr.role]=\"dataView.length ? null : 'row'\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth' #tbody (scroll)='preventContainerScroll($event)'>\n <span *ngIf=\"moving && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"moving && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-template #pinnedRecordsTemplate>\n <ng-container *ngIf=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridAddRow:true:pipeTrigger\n | gridRowPinning:id:true:pipeTrigger\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger:true\n | gridSort:sortingExpressions:[]:sortStrategy:id:pipeTrigger:true as pinnedData\">\n <div #pinContainer *ngIf='pinnedData.length > 0' class='igx-grid__tr--pinned'\n [ngClass]=\"{ 'igx-grid__tr--pinned-bottom': !isRowPinningToTop, 'igx-grid__tr--pinned-top': isRowPinningToTop }\"\n [style.width.px]='calcWidth'>\n <ng-container *ngFor=\"let rowData of pinnedData; let rowIndex = index\">\n <ng-container *ngTemplateOutlet=\"pinned_hierarchical_record_template; context: getContext(rowData, rowIndex, true)\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-template igxGridFor let-rowData let-rowIndex=\"index\" [igxGridForOf]=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger\n | gridSort:sortingExpressions:[]:sortStrategy:id:pipeTrigger\n | gridHierarchicalPaging:!!paginator:page:perPage:id:pipeTrigger\n | gridHierarchical:expansionStates:id:primaryKey:childLayoutKeys:pipeTrigger\n | gridAddRow:false:pipeTrigger\n | gridRowPinning:id:false:pipeTrigger\"\n [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight' [igxForItemSize]=\"renderedRowHeight\" [igxForTrackBy]='trackChanges'\n #verticalScrollContainer (chunkPreload)=\"dataLoading($event)\" (dataChanging)=\"dataRebinding($event)\" (dataChanged)=\"dataRebound($event)\">\n <ng-template\n [igxTemplateOutlet]='(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) ? child_record_template : hierarchical_record_template))'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex, false)' (viewCreated)='viewCreatedHandler($event)'\n (viewMoved)='viewMovedHandler($event)' (cachedViewLoaded)='cachedViewLoaded($event)'>\n </ng-template>\n <!-- <ng-container *igxTemplateOutlet=\"(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) && isExpanded(rowData) ? child_record_template : hierarchical_record_template)); context: getContext(rowData)\"></ng-container> -->\n </ng-template>\n <ng-template #hierarchical_record_template let-rowIndex=\"index\" let-disabledRow=\"disabled\" let-rowData>\n <igx-hierarchical-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [disabled]=\"disabledRow\" [data]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:rowData:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-hierarchical-grid-row>\n </ng-template>\n\n <ng-template #pinned_hierarchical_record_template let-rowIndex=\"index\" let-rowData>\n <igx-hierarchical-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [data]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:rowData:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row #pinnedRow>\n </igx-hierarchical-grid-row>\n </ng-template>\n <ng-template #child_record_template let-rowIndex=\"index\" let-rowData>\n <div style=\"overflow: auto; width: 100%;\" [attr.data-rowindex]='rowIndex' (scroll)='onContainerScroll()'\n [ngClass]=\"{\n 'igx-grid__tr-container': true,\n 'igx-grid__tr--highlighted':isRowHighlighted(rowData)\n }\">\n <igx-child-grid-row *ngFor=\"let layout of childLayoutList\" [parentGridID]=\"id\" [index]=\"rowIndex\"\n [data]=\"rowData\" [layout]='layout' #row>\n </igx-child-grid-row>\n </div>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <span *ngIf=\"moving && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div class=\"igx-grid__row-editing-outlet\" igxOverlayOutlet #igxRowEditingOverlayOutlet></div>\n <igc-trial-watermark *ngIf=\"!this.parent\"></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"moving && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div igxOverlayOutlet #igxBodyOverlayOutlet=\"overlay-outlet\"></div>\n</div>\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" [style.height.px]='summaryRowHeight' #tfoot>\n <div tabindex=\"0\" (focus)=\"navigation.focusFirstCell(false)\" [attr.aria-activedescendant]=\"activeDescendant\"\n (keydown)=\"navigation.summaryNav($event)\">\n <igx-grid-summary-row [style.width.px]='calcWidth' [style.height.px]='summaryRowHeight'\n *ngIf=\"hasSummarizedColumns && rootSummariesEnabled\" [gridID]=\"id\" role=\"row\"\n [summaries]=\"id | igxGridSummaryDataPipe:summaryService.retriggerRootPipe\" [index]=\"dataView.length\"\n class=\"igx-grid__summaries\" #summaryRow>\n </igx-grid-summary-row>\n <div class=\"igx-grid__tfoot-thumb\" [hidden]='!hasVerticalScroll()' [style.height.px]='summaryRowHeight'\n [style.width.px]=\"scrollSize\"></div>\n </div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='[]' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n <ng-content select=\"igx-paginator\"></ng-content>\n <ng-container #paginatorOutlet></ng-container>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultAddRowEmptyTemplate>\n <button igxButton=\"raised\" igxRipple (click)=\"this.crudService.enterAddRowMode(null, false, $event)\">\n {{resourceStrings.igx_grid_add_row_label}}\n </button>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n\n<ng-template #defaultCollapsedTemplate>\n <igx-icon role=\"button\">unfold_more</igx-icon>\n</ng-template>\n\n<ng-template #defaultExpandedTemplate>\n <igx-icon role=\"button\" [active]='hasExpandedRecords() && hasExpandableChildren'>unfold_less</igx-icon>\n</ng-template>\n\n<div *ngIf=\"rowEditable\" igxToggle #rowEditingOverlay>\n <div [className]=\"bannerClass\">\n <ng-container\n *ngTemplateOutlet=\"resolveRowEditContainer; context: { rowChangesCount: rowChangesCount, endEdit: this.crudService.endEdit.bind(this) }\">\n </ng-container>\n </div>\n</div>\n<ng-template #defaultRowEditText>\n You have {{ rowChangesCount }} changes in this row and {{ hiddenColumnsCount }} hidden columns\n</ng-template>\n<ng-template #defaultRowEditActions>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(false, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_cancel }}</button>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(true, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_done }}</button>\n</ng-template>\n<ng-template #defaultRowEditTemplate>\n <div class=\"igx-banner__message\">\n <span class=\"igx-banner__text\">\n <ng-container\n *ngTemplateOutlet=\"this.crudService.row?.getClassName() === 'IgxAddRow' ? rowAddTextTemplate : resolveRowEditText || defaultRowEditText;\n context: { $implicit: this.crudService.row?.getClassName() !== 'IgxAddRow' ? rowChangesCount : null }\">\n </ng-container>\n </span>\n </div>\n <div class=\"igx-banner__actions\">\n <div class=\"igx-banner__row\">\n <ng-container\n *ngTemplateOutlet=\"resolveRowEditActions || defaultRowEditActions; context: { $implicit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #dragIndicatorIconBase>\n <igx-icon>drag_indicator</igx-icon>\n</ng-template>\n\n<igx-grid-column-resizer *ngIf=\"colResizingService.showResizer\"></igx-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n", dependencies: [{ kind: "directive", type: i3.IgxRowEditTabStopDirective, selector: "[igxRowEditTabStop]" }, { kind: "directive", type: i4.IgxGridBodyDirective, selector: "[igxGridBody]" }, { kind: "component", type: i5.IgxGridHeaderRowComponent, selector: "igx-grid-header-row", inputs: ["grid", "pinnedColumnCollection", "unpinnedColumnCollection", "activeDescendant", "hasMRL", "width", "density"] }, { kind: "component", type: i6.IgxGridColumnResizerComponent, selector: "igx-grid-column-resizer", inputs: ["restrictResizerTop"] }, { kind: "directive", type: i7.IgxColumnMovingDropDirective, selector: "[igxColumnMovingDrop]", inputs: ["igxColumnMovingDrop"] }, { kind: "directive", type: i8.IgxGridDragSelectDirective, selector: "[igxGridDragSelect]", inputs: ["igxGridDragSelect"], outputs: ["dragStop", "dragScroll"] }, { kind: "component", type: i9.IgxSummaryRowComponent, selector: "igx-grid-summary-row", inputs: ["summaries", "gridID", "index", "firstCellIndentation"] }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i10.IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { kind: "component", type: i11.IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: i12.IgxRippleDirective, selector: "[igxRipple]", inputs: ["igxRippleTarget", "igxRipple", "igxRippleDuration", "igxRippleCentered", "igxRippleDisabled"] }, { kind: "directive", type: i13.IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { kind: "directive", type: i13.IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { kind: "directive", type: i14.IgxGridForOfDirective, selector: "[igxGridFor][igxGridForOf]", inputs: ["igxGridForOf", "igxGridForOfUniqueSizeCache", "igxGridForOfVariableSizes"], outputs: ["dataChanging"] }, { kind: "directive", type: i15.IgxTemplateOutletDirective, selector: "[igxTemplateOutlet]", inputs: ["igxTemplateOutletContext", "igxTemplateOutlet"], outputs: ["viewCreated", "viewMoved", "cachedViewLoaded", "beforeViewDetach"] }, { kind: "component", type: i16.IgxCircularProgressBarComponent, selector: "igx-circular-bar", inputs: ["id", "isIndeterminate", "textVisibility", "text"] }, { kind: "component", type: i17.IgxSnackbarComponent, selector: "igx-snackbar", inputs: ["id", "actionText", "positionSettings"], outputs: ["clicked", "animationStarted", "animationDone"] }, { kind: "component", type: i18.IgxHierarchicalRowComponent, selector: "igx-hierarchical-grid-row" }, { kind: "component", type: IgxChildGridRowComponent, selector: "igx-child-grid-row", inputs: ["layout", "parentGridID", "data", "index"] }, { kind: "pipe", type: i19.IgxGridSortingPipe, name: "gridSort" }, { kind: "pipe", type: i19.IgxGridFilteringPipe, name: "gridFiltering" }, { kind: "pipe", type: i20.IgxGridTransactionPipe, name: "gridTransaction" }, { kind: "pipe", type: i20.IgxHasVisibleColumnsPipe, name: "visibleColumns" }, { kind: "pipe", type: i20.IgxGridRowPinningPipe, name: "gridRowPinning" }, { kind: "pipe", type: i20.IgxGridAddRowPipe, name: "gridAddRow" }, { kind: "pipe", type: i20.IgxGridRowClassesPipe, name: "igxGridRowClasses" }, { kind: "pipe", type: i20.IgxGridRowStylesPipe, name: "igxGridRowStyles" }, { kind: "pipe", type: i21.IgxSummaryDataPipe, name: "igxGridSummaryDataPipe" }, { kind: "pipe", type: i22.IgxGridHierarchicalPipe, name: "gridHierarchical" }, { kind: "pipe", type: i22.IgxGridHierarchicalPagingPipe, name: "gridHierarchicalPaging" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
959
+ ], queries: [{ propertyName: "toolbarTemplate", first: true, predicate: IgxGridToolbarDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "childLayoutList", predicate: IgxRowIslandComponent, read: IgxRowIslandComponent }, { propertyName: "allLayoutList", predicate: IgxRowIslandComponent, descendants: true, read: IgxRowIslandComponent }, { propertyName: "paginatorList", predicate: IgxPaginatorComponent, descendants: true }], viewQueries: [{ propertyName: "toolbarOutlet", first: true, predicate: ["toolbarOutlet"], descendants: true, read: ViewContainerRef }, { propertyName: "paginatorOutlet", first: true, predicate: ["paginatorOutlet"], descendants: true, read: ViewContainerRef }, { propertyName: "hierarchicalRecordTemplate", first: true, predicate: ["hierarchical_record_template"], descendants: true, read: TemplateRef, static: true }, { propertyName: "childTemplate", first: true, predicate: ["child_record_template"], descendants: true, read: TemplateRef, static: true }, { propertyName: "templateOutlets", predicate: IgxTemplateOutletDirective, descendants: true, read: IgxTemplateOutletDirective }, { propertyName: "hierarchicalRows", predicate: IgxChildGridRowComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-content select=\"igx-grid-toolbar\"></ng-content>\n<ng-container #toolbarOutlet></ng-container>\n\n<igx-grid-header-row class=\"igx-grid-thead\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (focus)=\"navigation.focusFirstCell()\"\n>\n</igx-grid-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" (focus)=\"navigation.focusTbody($event)\"\n (keydown)=\"navigation.handleNavigation($event)\" (dragStop)=\"selectionService.dragMode = $event\"\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\" [attr.aria-activedescendant]=\"activeDescendant\" [attr.role]=\"dataView.length ? null : 'row'\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth' #tbody (scroll)='preventContainerScroll($event)'>\n <span *ngIf=\"moving && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"moving && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-template #pinnedRecordsTemplate>\n <ng-container *ngIf=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridAddRow:true:pipeTrigger\n | gridRowPinning:id:true:pipeTrigger\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger:true\n | gridSort:sortingExpressions:[]:sortStrategy:id:pipeTrigger:true as pinnedData\">\n <div #pinContainer *ngIf='pinnedData.length > 0' class='igx-grid__tr--pinned'\n [ngClass]=\"{ 'igx-grid__tr--pinned-bottom': !isRowPinningToTop, 'igx-grid__tr--pinned-top': isRowPinningToTop }\"\n [style.width.px]='calcWidth'>\n <ng-container *ngFor=\"let rowData of pinnedData; let rowIndex = index\">\n <ng-container *ngTemplateOutlet=\"pinned_hierarchical_record_template; context: getContext(rowData, rowIndex, true)\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-template igxGridFor let-rowData let-rowIndex=\"index\" [igxGridForOf]=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger\n | gridSort:sortingExpressions:[]:sortStrategy:id:pipeTrigger\n | gridHierarchicalPaging:!!paginator:page:perPage:id:pipeTrigger\n | gridHierarchical:expansionStates:id:primaryKey:childLayoutKeys:pipeTrigger\n | gridAddRow:false:pipeTrigger\n | gridRowPinning:id:false:pipeTrigger\"\n [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight' [igxForItemSize]=\"renderedRowHeight\" [igxForTrackBy]='trackChanges'\n #verticalScrollContainer (chunkPreload)=\"dataLoading($event)\" (dataChanging)=\"dataRebinding($event)\" (dataChanged)=\"dataRebound($event)\">\n <ng-template\n [igxTemplateOutlet]='(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) ? child_record_template : hierarchical_record_template))'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex, false)' (viewCreated)='viewCreatedHandler($event)'\n (viewMoved)='viewMovedHandler($event)' (cachedViewLoaded)='cachedViewLoaded($event)'>\n </ng-template>\n <!-- <ng-container *igxTemplateOutlet=\"(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) && isExpanded(rowData) ? child_record_template : hierarchical_record_template)); context: getContext(rowData)\"></ng-container> -->\n </ng-template>\n <ng-template #hierarchical_record_template let-rowIndex=\"index\" let-disabledRow=\"disabled\" let-rowData>\n <igx-hierarchical-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [disabled]=\"disabledRow\" [data]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:rowData:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-hierarchical-grid-row>\n </ng-template>\n\n <ng-template #pinned_hierarchical_record_template let-rowIndex=\"index\" let-rowData>\n <igx-hierarchical-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [data]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:rowData:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row #pinnedRow>\n </igx-hierarchical-grid-row>\n </ng-template>\n <ng-template #child_record_template let-rowIndex=\"index\" let-rowData>\n <div style=\"overflow: auto; width: 100%;\" [attr.data-rowindex]='rowIndex' (scroll)='onContainerScroll()'\n [ngClass]=\"{\n 'igx-grid__tr-container': true,\n 'igx-grid__tr--highlighted':isRowHighlighted(rowData)\n }\">\n <igx-child-grid-row *ngFor=\"let layout of childLayoutList\" [parentGridID]=\"id\" [index]=\"rowIndex\"\n [data]=\"rowData\" [layout]='layout' #row>\n </igx-child-grid-row>\n </div>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <span *ngIf=\"moving && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div class=\"igx-grid__row-editing-outlet\" igxOverlayOutlet #igxRowEditingOverlayOutlet></div>\n <igc-trial-watermark *ngIf=\"!this.parent\"></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"moving && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div igxOverlayOutlet #igxBodyOverlayOutlet=\"overlay-outlet\"></div>\n</div>\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" [style.height.px]='summaryRowHeight' #tfoot>\n <div tabindex=\"0\" (focus)=\"navigation.focusFirstCell(false)\" [attr.aria-activedescendant]=\"activeDescendant\"\n (keydown)=\"navigation.summaryNav($event)\">\n <igx-grid-summary-row [style.width.px]='calcWidth' [style.height.px]='summaryRowHeight'\n *ngIf=\"hasSummarizedColumns && rootSummariesEnabled\" [gridID]=\"id\" role=\"row\"\n [summaries]=\"id | igxGridSummaryDataPipe:summaryService.retriggerRootPipe\" [index]=\"dataView.length\"\n class=\"igx-grid__summaries\" #summaryRow>\n </igx-grid-summary-row>\n <div class=\"igx-grid__tfoot-thumb\" [hidden]='!hasVerticalScroll()' [style.height.px]='summaryRowHeight'\n [style.width.px]=\"scrollSize\"></div>\n </div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='[]' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n <ng-content select=\"igx-paginator\"></ng-content>\n <ng-container #paginatorOutlet></ng-container>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultAddRowEmptyTemplate>\n <button type=\"button\" igxButton=\"raised\" igxRipple (click)=\"this.crudService.enterAddRowMode(null, false, $event)\">\n {{resourceStrings.igx_grid_add_row_label}}\n </button>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n\n<ng-template #defaultCollapsedTemplate>\n <igx-icon role=\"button\">unfold_more</igx-icon>\n</ng-template>\n\n<ng-template #defaultExpandedTemplate>\n <igx-icon role=\"button\" [active]='hasExpandedRecords() && hasExpandableChildren'>unfold_less</igx-icon>\n</ng-template>\n\n<div *ngIf=\"rowEditable\" igxToggle #rowEditingOverlay>\n <div [className]=\"bannerClass\">\n <ng-container\n *ngTemplateOutlet=\"resolveRowEditContainer; context: { rowChangesCount: rowChangesCount, endEdit: this.crudService.endEdit.bind(this) }\">\n </ng-container>\n </div>\n</div>\n<ng-template #defaultRowEditText>\n You have {{ rowChangesCount }} changes in this row and {{ hiddenColumnsCount }} hidden columns\n</ng-template>\n<ng-template #defaultRowEditActions>\n <button type=\"button\" igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(false, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_cancel }}</button>\n <button type=\"button\" igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(true, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_done }}</button>\n</ng-template>\n<ng-template #defaultRowEditTemplate>\n <div class=\"igx-banner__message\">\n <span class=\"igx-banner__text\">\n <ng-container\n *ngTemplateOutlet=\"this.crudService.row?.getClassName() === 'IgxAddRow' ? rowAddTextTemplate : resolveRowEditText || defaultRowEditText;\n context: { $implicit: this.crudService.row?.getClassName() !== 'IgxAddRow' ? rowChangesCount : null }\">\n </ng-container>\n </span>\n </div>\n <div class=\"igx-banner__actions\">\n <div class=\"igx-banner__row\">\n <ng-container\n *ngTemplateOutlet=\"resolveRowEditActions || defaultRowEditActions; context: { $implicit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #dragIndicatorIconBase>\n <igx-icon>drag_indicator</igx-icon>\n</ng-template>\n\n<igx-grid-column-resizer *ngIf=\"colResizingService.showResizer\"></igx-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n", dependencies: [{ kind: "directive", type: i3.IgxRowEditTabStopDirective, selector: "[igxRowEditTabStop]" }, { kind: "directive", type: i4.IgxGridBodyDirective, selector: "[igxGridBody]" }, { kind: "component", type: i5.IgxGridHeaderRowComponent, selector: "igx-grid-header-row", inputs: ["grid", "pinnedColumnCollection", "unpinnedColumnCollection", "activeDescendant", "hasMRL", "width", "density"] }, { kind: "component", type: i6.IgxGridColumnResizerComponent, selector: "igx-grid-column-resizer", inputs: ["restrictResizerTop"] }, { kind: "directive", type: i7.IgxColumnMovingDropDirective, selector: "[igxColumnMovingDrop]", inputs: ["igxColumnMovingDrop"] }, { kind: "directive", type: i8.IgxGridDragSelectDirective, selector: "[igxGridDragSelect]", inputs: ["igxGridDragSelect"], outputs: ["dragStop", "dragScroll"] }, { kind: "component", type: i9.IgxSummaryRowComponent, selector: "igx-grid-summary-row", inputs: ["summaries", "gridID", "index", "firstCellIndentation"] }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i10.IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { kind: "component", type: i11.IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: i12.IgxRippleDirective, selector: "[igxRipple]", inputs: ["igxRippleTarget", "igxRipple", "igxRippleDuration", "igxRippleCentered", "igxRippleDisabled"] }, { kind: "directive", type: i13.IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { kind: "directive", type: i13.IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { kind: "directive", type: i14.IgxGridForOfDirective, selector: "[igxGridFor][igxGridForOf]", inputs: ["igxGridForOf", "igxGridForOfUniqueSizeCache", "igxGridForOfVariableSizes"], outputs: ["dataChanging"] }, { kind: "directive", type: i15.IgxTemplateOutletDirective, selector: "[igxTemplateOutlet]", inputs: ["igxTemplateOutletContext", "igxTemplateOutlet"], outputs: ["viewCreated", "viewMoved", "cachedViewLoaded", "beforeViewDetach"] }, { kind: "component", type: i16.IgxCircularProgressBarComponent, selector: "igx-circular-bar", inputs: ["id", "isIndeterminate", "textVisibility", "text"] }, { kind: "component", type: i17.IgxSnackbarComponent, selector: "igx-snackbar", inputs: ["id", "actionText", "positionSettings"], outputs: ["clicked", "animationStarted", "animationDone"] }, { kind: "component", type: i18.IgxHierarchicalRowComponent, selector: "igx-hierarchical-grid-row" }, { kind: "component", type: IgxChildGridRowComponent, selector: "igx-child-grid-row", inputs: ["layout", "parentGridID", "data", "index"] }, { kind: "pipe", type: i19.IgxGridSortingPipe, name: "gridSort" }, { kind: "pipe", type: i19.IgxGridFilteringPipe, name: "gridFiltering" }, { kind: "pipe", type: i20.IgxGridTransactionPipe, name: "gridTransaction" }, { kind: "pipe", type: i20.IgxHasVisibleColumnsPipe, name: "visibleColumns" }, { kind: "pipe", type: i20.IgxGridRowPinningPipe, name: "gridRowPinning" }, { kind: "pipe", type: i20.IgxGridAddRowPipe, name: "gridAddRow" }, { kind: "pipe", type: i20.IgxGridRowClassesPipe, name: "igxGridRowClasses" }, { kind: "pipe", type: i20.IgxGridRowStylesPipe, name: "igxGridRowStyles" }, { kind: "pipe", type: i21.IgxSummaryDataPipe, name: "igxGridSummaryDataPipe" }, { kind: "pipe", type: i22.IgxGridHierarchicalPipe, name: "gridHierarchical" }, { kind: "pipe", type: i22.IgxGridHierarchicalPagingPipe, name: "gridHierarchicalPaging" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
960
960
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: IgxHierarchicalGridComponent, decorators: [{
961
961
  type: Component,
962
962
  args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-hierarchical-grid', providers: [
@@ -972,7 +972,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
972
972
  IgxForOfSyncService,
973
973
  IgxForOfScrollSyncService,
974
974
  IgxRowIslandAPIService
975
- ], template: "<ng-content select=\"igx-grid-toolbar\"></ng-content>\n<ng-container #toolbarOutlet></ng-container>\n\n<igx-grid-header-row class=\"igx-grid-thead\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (focus)=\"navigation.focusFirstCell()\"\n>\n</igx-grid-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" (focus)=\"navigation.focusTbody($event)\"\n (keydown)=\"navigation.handleNavigation($event)\" (dragStop)=\"selectionService.dragMode = $event\"\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\" [attr.aria-activedescendant]=\"activeDescendant\" [attr.role]=\"dataView.length ? null : 'row'\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth' #tbody (scroll)='preventContainerScroll($event)'>\n <span *ngIf=\"moving && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"moving && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-template #pinnedRecordsTemplate>\n <ng-container *ngIf=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridAddRow:true:pipeTrigger\n | gridRowPinning:id:true:pipeTrigger\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger:true\n | gridSort:sortingExpressions:[]:sortStrategy:id:pipeTrigger:true as pinnedData\">\n <div #pinContainer *ngIf='pinnedData.length > 0' class='igx-grid__tr--pinned'\n [ngClass]=\"{ 'igx-grid__tr--pinned-bottom': !isRowPinningToTop, 'igx-grid__tr--pinned-top': isRowPinningToTop }\"\n [style.width.px]='calcWidth'>\n <ng-container *ngFor=\"let rowData of pinnedData; let rowIndex = index\">\n <ng-container *ngTemplateOutlet=\"pinned_hierarchical_record_template; context: getContext(rowData, rowIndex, true)\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-template igxGridFor let-rowData let-rowIndex=\"index\" [igxGridForOf]=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger\n | gridSort:sortingExpressions:[]:sortStrategy:id:pipeTrigger\n | gridHierarchicalPaging:!!paginator:page:perPage:id:pipeTrigger\n | gridHierarchical:expansionStates:id:primaryKey:childLayoutKeys:pipeTrigger\n | gridAddRow:false:pipeTrigger\n | gridRowPinning:id:false:pipeTrigger\"\n [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight' [igxForItemSize]=\"renderedRowHeight\" [igxForTrackBy]='trackChanges'\n #verticalScrollContainer (chunkPreload)=\"dataLoading($event)\" (dataChanging)=\"dataRebinding($event)\" (dataChanged)=\"dataRebound($event)\">\n <ng-template\n [igxTemplateOutlet]='(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) ? child_record_template : hierarchical_record_template))'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex, false)' (viewCreated)='viewCreatedHandler($event)'\n (viewMoved)='viewMovedHandler($event)' (cachedViewLoaded)='cachedViewLoaded($event)'>\n </ng-template>\n <!-- <ng-container *igxTemplateOutlet=\"(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) && isExpanded(rowData) ? child_record_template : hierarchical_record_template)); context: getContext(rowData)\"></ng-container> -->\n </ng-template>\n <ng-template #hierarchical_record_template let-rowIndex=\"index\" let-disabledRow=\"disabled\" let-rowData>\n <igx-hierarchical-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [disabled]=\"disabledRow\" [data]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:rowData:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-hierarchical-grid-row>\n </ng-template>\n\n <ng-template #pinned_hierarchical_record_template let-rowIndex=\"index\" let-rowData>\n <igx-hierarchical-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [data]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:rowData:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row #pinnedRow>\n </igx-hierarchical-grid-row>\n </ng-template>\n <ng-template #child_record_template let-rowIndex=\"index\" let-rowData>\n <div style=\"overflow: auto; width: 100%;\" [attr.data-rowindex]='rowIndex' (scroll)='onContainerScroll()'\n [ngClass]=\"{\n 'igx-grid__tr-container': true,\n 'igx-grid__tr--highlighted':isRowHighlighted(rowData)\n }\">\n <igx-child-grid-row *ngFor=\"let layout of childLayoutList\" [parentGridID]=\"id\" [index]=\"rowIndex\"\n [data]=\"rowData\" [layout]='layout' #row>\n </igx-child-grid-row>\n </div>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <span *ngIf=\"moving && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div class=\"igx-grid__row-editing-outlet\" igxOverlayOutlet #igxRowEditingOverlayOutlet></div>\n <igc-trial-watermark *ngIf=\"!this.parent\"></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"moving && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div igxOverlayOutlet #igxBodyOverlayOutlet=\"overlay-outlet\"></div>\n</div>\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" [style.height.px]='summaryRowHeight' #tfoot>\n <div tabindex=\"0\" (focus)=\"navigation.focusFirstCell(false)\" [attr.aria-activedescendant]=\"activeDescendant\"\n (keydown)=\"navigation.summaryNav($event)\">\n <igx-grid-summary-row [style.width.px]='calcWidth' [style.height.px]='summaryRowHeight'\n *ngIf=\"hasSummarizedColumns && rootSummariesEnabled\" [gridID]=\"id\" role=\"row\"\n [summaries]=\"id | igxGridSummaryDataPipe:summaryService.retriggerRootPipe\" [index]=\"dataView.length\"\n class=\"igx-grid__summaries\" #summaryRow>\n </igx-grid-summary-row>\n <div class=\"igx-grid__tfoot-thumb\" [hidden]='!hasVerticalScroll()' [style.height.px]='summaryRowHeight'\n [style.width.px]=\"scrollSize\"></div>\n </div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='[]' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n <ng-content select=\"igx-paginator\"></ng-content>\n <ng-container #paginatorOutlet></ng-container>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultAddRowEmptyTemplate>\n <button igxButton=\"raised\" igxRipple (click)=\"this.crudService.enterAddRowMode(null, false, $event)\">\n {{resourceStrings.igx_grid_add_row_label}}\n </button>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n\n<ng-template #defaultCollapsedTemplate>\n <igx-icon role=\"button\">unfold_more</igx-icon>\n</ng-template>\n\n<ng-template #defaultExpandedTemplate>\n <igx-icon role=\"button\" [active]='hasExpandedRecords() && hasExpandableChildren'>unfold_less</igx-icon>\n</ng-template>\n\n<div *ngIf=\"rowEditable\" igxToggle #rowEditingOverlay>\n <div [className]=\"bannerClass\">\n <ng-container\n *ngTemplateOutlet=\"resolveRowEditContainer; context: { rowChangesCount: rowChangesCount, endEdit: this.crudService.endEdit.bind(this) }\">\n </ng-container>\n </div>\n</div>\n<ng-template #defaultRowEditText>\n You have {{ rowChangesCount }} changes in this row and {{ hiddenColumnsCount }} hidden columns\n</ng-template>\n<ng-template #defaultRowEditActions>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(false, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_cancel }}</button>\n <button igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(true, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_done }}</button>\n</ng-template>\n<ng-template #defaultRowEditTemplate>\n <div class=\"igx-banner__message\">\n <span class=\"igx-banner__text\">\n <ng-container\n *ngTemplateOutlet=\"this.crudService.row?.getClassName() === 'IgxAddRow' ? rowAddTextTemplate : resolveRowEditText || defaultRowEditText;\n context: { $implicit: this.crudService.row?.getClassName() !== 'IgxAddRow' ? rowChangesCount : null }\">\n </ng-container>\n </span>\n </div>\n <div class=\"igx-banner__actions\">\n <div class=\"igx-banner__row\">\n <ng-container\n *ngTemplateOutlet=\"resolveRowEditActions || defaultRowEditActions; context: { $implicit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #dragIndicatorIconBase>\n <igx-icon>drag_indicator</igx-icon>\n</ng-template>\n\n<igx-grid-column-resizer *ngIf=\"colResizingService.showResizer\"></igx-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n" }]
975
+ ], template: "<ng-content select=\"igx-grid-toolbar\"></ng-content>\n<ng-container #toolbarOutlet></ng-container>\n\n<igx-grid-header-row class=\"igx-grid-thead\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (focus)=\"navigation.focusFirstCell()\"\n>\n</igx-grid-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" (focus)=\"navigation.focusTbody($event)\"\n (keydown)=\"navigation.handleNavigation($event)\" (dragStop)=\"selectionService.dragMode = $event\"\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\" [attr.aria-activedescendant]=\"activeDescendant\" [attr.role]=\"dataView.length ? null : 'row'\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth' #tbody (scroll)='preventContainerScroll($event)'>\n <span *ngIf=\"moving && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"moving && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-template #pinnedRecordsTemplate>\n <ng-container *ngIf=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridAddRow:true:pipeTrigger\n | gridRowPinning:id:true:pipeTrigger\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger:true\n | gridSort:sortingExpressions:[]:sortStrategy:id:pipeTrigger:true as pinnedData\">\n <div #pinContainer *ngIf='pinnedData.length > 0' class='igx-grid__tr--pinned'\n [ngClass]=\"{ 'igx-grid__tr--pinned-bottom': !isRowPinningToTop, 'igx-grid__tr--pinned-top': isRowPinningToTop }\"\n [style.width.px]='calcWidth'>\n <ng-container *ngFor=\"let rowData of pinnedData; let rowIndex = index\">\n <ng-container *ngTemplateOutlet=\"pinned_hierarchical_record_template; context: getContext(rowData, rowIndex, true)\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-template igxGridFor let-rowData let-rowIndex=\"index\" [igxGridForOf]=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger\n | gridSort:sortingExpressions:[]:sortStrategy:id:pipeTrigger\n | gridHierarchicalPaging:!!paginator:page:perPage:id:pipeTrigger\n | gridHierarchical:expansionStates:id:primaryKey:childLayoutKeys:pipeTrigger\n | gridAddRow:false:pipeTrigger\n | gridRowPinning:id:false:pipeTrigger\"\n [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight' [igxForItemSize]=\"renderedRowHeight\" [igxForTrackBy]='trackChanges'\n #verticalScrollContainer (chunkPreload)=\"dataLoading($event)\" (dataChanging)=\"dataRebinding($event)\" (dataChanged)=\"dataRebound($event)\">\n <ng-template\n [igxTemplateOutlet]='(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) ? child_record_template : hierarchical_record_template))'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex, false)' (viewCreated)='viewCreatedHandler($event)'\n (viewMoved)='viewMovedHandler($event)' (cachedViewLoaded)='cachedViewLoaded($event)'>\n </ng-template>\n <!-- <ng-container *igxTemplateOutlet=\"(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) && isExpanded(rowData) ? child_record_template : hierarchical_record_template)); context: getContext(rowData)\"></ng-container> -->\n </ng-template>\n <ng-template #hierarchical_record_template let-rowIndex=\"index\" let-disabledRow=\"disabled\" let-rowData>\n <igx-hierarchical-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [disabled]=\"disabledRow\" [data]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:rowData:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-hierarchical-grid-row>\n </ng-template>\n\n <ng-template #pinned_hierarchical_record_template let-rowIndex=\"index\" let-rowData>\n <igx-hierarchical-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [data]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:rowData:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row #pinnedRow>\n </igx-hierarchical-grid-row>\n </ng-template>\n <ng-template #child_record_template let-rowIndex=\"index\" let-rowData>\n <div style=\"overflow: auto; width: 100%;\" [attr.data-rowindex]='rowIndex' (scroll)='onContainerScroll()'\n [ngClass]=\"{\n 'igx-grid__tr-container': true,\n 'igx-grid__tr--highlighted':isRowHighlighted(rowData)\n }\">\n <igx-child-grid-row *ngFor=\"let layout of childLayoutList\" [parentGridID]=\"id\" [index]=\"rowIndex\"\n [data]=\"rowData\" [layout]='layout' #row>\n </igx-child-grid-row>\n </div>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null\">\n </ng-container>\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <span *ngIf=\"moving && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div class=\"igx-grid__row-editing-outlet\" igxOverlayOutlet #igxRowEditingOverlayOutlet></div>\n <igc-trial-watermark *ngIf=\"!this.parent\"></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"moving && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div igxOverlayOutlet #igxBodyOverlayOutlet=\"overlay-outlet\"></div>\n</div>\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" [style.height.px]='summaryRowHeight' #tfoot>\n <div tabindex=\"0\" (focus)=\"navigation.focusFirstCell(false)\" [attr.aria-activedescendant]=\"activeDescendant\"\n (keydown)=\"navigation.summaryNav($event)\">\n <igx-grid-summary-row [style.width.px]='calcWidth' [style.height.px]='summaryRowHeight'\n *ngIf=\"hasSummarizedColumns && rootSummariesEnabled\" [gridID]=\"id\" role=\"row\"\n [summaries]=\"id | igxGridSummaryDataPipe:summaryService.retriggerRootPipe\" [index]=\"dataView.length\"\n class=\"igx-grid__summaries\" #summaryRow>\n </igx-grid-summary-row>\n <div class=\"igx-grid__tfoot-thumb\" [hidden]='!hasVerticalScroll()' [style.height.px]='summaryRowHeight'\n [style.width.px]=\"scrollSize\"></div>\n </div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='[]' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n <ng-content select=\"igx-paginator\"></ng-content>\n <ng-container #paginatorOutlet></ng-container>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n <span *ngIf='showAddButton'>\n <ng-container *ngTemplateOutlet='addRowEmptyTemplate || defaultAddRowEmptyTemplate'></ng-container>\n </span>\n </span>\n</ng-template>\n\n<ng-template #defaultAddRowEmptyTemplate>\n <button type=\"button\" igxButton=\"raised\" igxRipple (click)=\"this.crudService.enterAddRowMode(null, false, $event)\">\n {{resourceStrings.igx_grid_add_row_label}}\n </button>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n\n<ng-template #defaultCollapsedTemplate>\n <igx-icon role=\"button\">unfold_more</igx-icon>\n</ng-template>\n\n<ng-template #defaultExpandedTemplate>\n <igx-icon role=\"button\" [active]='hasExpandedRecords() && hasExpandableChildren'>unfold_less</igx-icon>\n</ng-template>\n\n<div *ngIf=\"rowEditable\" igxToggle #rowEditingOverlay>\n <div [className]=\"bannerClass\">\n <ng-container\n *ngTemplateOutlet=\"resolveRowEditContainer; context: { rowChangesCount: rowChangesCount, endEdit: this.crudService.endEdit.bind(this) }\">\n </ng-container>\n </div>\n</div>\n<ng-template #defaultRowEditText>\n You have {{ rowChangesCount }} changes in this row and {{ hiddenColumnsCount }} hidden columns\n</ng-template>\n<ng-template #defaultRowEditActions>\n <button type=\"button\" igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(false, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_cancel }}</button>\n <button type=\"button\" igxButton igxRowEditTabStop (click)=\"this.endRowEditTabStop(true, $event)\">{{ this.resourceStrings.igx_grid_row_edit_btn_done }}</button>\n</ng-template>\n<ng-template #defaultRowEditTemplate>\n <div class=\"igx-banner__message\">\n <span class=\"igx-banner__text\">\n <ng-container\n *ngTemplateOutlet=\"this.crudService.row?.getClassName() === 'IgxAddRow' ? rowAddTextTemplate : resolveRowEditText || defaultRowEditText;\n context: { $implicit: this.crudService.row?.getClassName() !== 'IgxAddRow' ? rowChangesCount : null }\">\n </ng-container>\n </span>\n </div>\n <div class=\"igx-banner__actions\">\n <div class=\"igx-banner__row\">\n <ng-container\n *ngTemplateOutlet=\"resolveRowEditActions || defaultRowEditActions; context: { $implicit: this.endEdit.bind(this) }\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #dragIndicatorIconBase>\n <igx-icon>drag_indicator</igx-icon>\n</ng-template>\n\n<igx-grid-column-resizer *ngIf=\"colResizingService.showResizer\"></igx-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n" }]
976
976
  }], propDecorators: { role: [{
977
977
  type: HostBinding,
978
978
  args: ['attr.role']
@@ -1016,4 +1016,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
1016
1016
  }], expandChildren: [{
1017
1017
  type: Input
1018
1018
  }] } });
1019
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2hpY2FsLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2dyaWRzL2hpZXJhcmNoaWNhbC1ncmlkL2hpZXJhcmNoaWNhbC1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9oaWVyYXJjaGljYWwtZ3JpZC9jaGlsZC1ncmlkLXJvdy5jb21wb25lbnQuaHRtbCIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9oaWVyYXJjaGljYWwtZ3JpZC9oaWVyYXJjaGljYWwtZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUdmLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUlMLG9CQUFvQixFQUVwQixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFMUUsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixD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QUUsV0FBVyxFQUFFLEtBQUssRUFBRTtnQkFPcEYsYUFBYTtzQkFEbkIsZUFBZTt1QkFBQyxxQkFBcUIsRUFBRSxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQUluRixlQUFlO3NCQURyQixZQUFZO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUtuRSxhQUFhO3NCQURuQixlQUFlO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFJdEQsYUFBYTtzQkFEbkIsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBSS9DLGVBQWU7c0JBRHJCLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBTWpELGVBQWU7c0JBRHJCLFlBQVk7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUU7Z0JBT3ZFLGdCQUFnQjtzQkFEdEIsWUFBWTt1QkFBQyx3QkFBd0I7Z0JBSTVCLDBCQUEwQjtzQkFEbkMsU0FBUzt1QkFBQyw4QkFBOEIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJcEUsYUFBYTtzQkFEdEIsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFtRDVELEVBQUU7c0JBRlosV0FBVzt1QkFBQyxTQUFTOztzQkFDckIsS0FBSztnQkFpQkssSUFBSTtzQkFEZCxLQUFLO2dCQTBFSyxjQUFjO3NCQUR4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRG9DaGVjayxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICByZWZsZWN0Q29tcG9uZW50VHlwZSxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElneEhpZXJhcmNoaWNhbEdyaWRBUElTZXJ2aWNlIH0gZnJvbSAnLi9oaWVyYXJjaGljYWwtZ3JpZC1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hSb3dJc2xhbmRDb21wb25lbnQgfSBmcm9tICcuL3Jvdy1pc2xhbmQuY29tcG9uZW50JztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi9maWx0ZXJpbmcvZ3JpZC1maWx0ZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQsIH0gZnJvbSAnLi4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElneEhpZXJhcmNoaWNhbEdyaWROYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vaGllcmFyY2hpY2FsLWdyaWQtbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRTdW1tYXJ5U2VydmljZSB9IGZyb20gJy4uL3N1bW1hcmllcy9ncmlkLXN1bW1hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hIaWVyYXJjaGljYWxHcmlkQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4vaGllcmFyY2hpY2FsLWdyaWQtYmFzZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3RlbXBsYXRlLW91dGxldC90ZW1wbGF0ZV9vdXRsZXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VsZWN0aW9uL3NlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneEZvck9mU3luY1NlcnZpY2UsIElneEZvck9mU2Nyb2xsU3luY1NlcnZpY2UgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2Zvci1vZi9mb3Jfb2Yuc3luYy5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxUeXBlLCBHcmlkVHlwZSwgSUdYX0dSSURfQkFTRSwgSUdYX0dSSURfU0VSVklDRV9CQVNFLCBSb3dUeXBlIH0gZnJvbSAnLi4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElneFJvd0lzbGFuZEFQSVNlcnZpY2UgfSBmcm9tICcuL3Jvdy1pc2xhbmQtYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZFRvb2xiYXJEaXJlY3RpdmUsIElneEdyaWRUb29sYmFyVGVtcGxhdGVDb250ZXh0IH0gZnJvbSAnLi4vdG9vbGJhci9jb21tb24nO1xuaW1wb3J0IHsgSWd4R3JpZENSVURTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL2NydWQuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hIaWVyYXJjaGljYWxHcmlkUm93IH0gZnJvbSAnLi4vZ3JpZC1wdWJsaWMtcm93JztcbmltcG9ydCB7IElneEdyaWRDZWxsIH0gZnJvbSAnLi4vZ3JpZC1wdWJsaWMtY2VsbCc7XG5pbXBvcnQgeyBJZ3hQYWdpbmF0b3JDb21wb25lbnQgfSBmcm9tICcuLi8uLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3JpZC9ncmlkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy90b2dnbGUvdG9nZ2xlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5SZXNpemluZ1NlcnZpY2UgfSBmcm9tICcuLi9yZXNpemluZy9yZXNpemluZy5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50IH0gZnJvbSAnLi4vZmlsdGVyaW5nL2V4Y2VsLXN0eWxlL2dyaWQuZXhjZWwtc3R5bGUtZmlsdGVyaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9ncmlkL2dyaWQtdmFsaWRhdGlvbi5zZXJ2aWNlJztcblxubGV0IE5FWFRfSUQgPSAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhpZXJhcmNoaWNhbFN0YXRlUmVjb3JkIHtcbiAgICByb3dJRDogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzZWxlY3RvcjogJ2lneC1jaGlsZC1ncmlkLXJvdycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NoaWxkLWdyaWQtcm93LmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgSWd4Q2hpbGRHcmlkUm93Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0IHtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsYXlvdXQ6IElneFJvd0lzbGFuZENvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcmVudEhhc1Njcm9sbCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnBhcmVudEdyaWQudmVydGljYWxTY3JvbGxDb250YWluZXIuZGMuaW5zdGFuY2Uubm90VmlydHVhbDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwYXJlbnRHcmlkSUQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqICBUaGUgZGF0YSBwYXNzZWQgdG8gdGhlIHJvdyBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0IHRoZSByb3cgZGF0YSBmb3IgdGhlIGZpcnN0IHNlbGVjdGVkIHJvd1xuICAgICAqIGxldCBzZWxlY3RlZFJvd0RhdGEgPSB0aGlzLmdyaWQuc2VsZWN0ZWRSb3dzWzBdLmRhdGE7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRhdGEoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEgfHwgW107XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBkYXRhKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5oR3JpZCkge1xuICAgICAgICAgICAgdGhpcy5oR3JpZC5kYXRhID0gdGhpcy5fZGF0YS5jaGlsZEdyaWRzRGF0YVt0aGlzLmxheW91dC5rZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgcm93LlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldCB0aGUgaW5kZXggb2YgdGhlIHNlY29uZCBzZWxlY3RlZCByb3dcbiAgICAgKiBsZXQgc2VsZWN0ZWRSb3dJbmRleCA9IHRoaXMuZ3JpZC5zZWxlY3RlZFJvd3NbMV0uaW5kZXg7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaW5kZXg6IG51bWJlcjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHtyZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWV9KVxuICAgIHB1YmxpYyBjb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGhHcmlkOiBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBncmlkIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHJvdy5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBoYW5kbGVSb3dTZWxlY3Rpb24oZXZlbnQpIHtcbiAgICAgKiAgLy8gdGhlIGdyaWQgb24gd2hpY2ggdGhlIHJvd1NlbGVjdGVkIGV2ZW50IHdhcyB0cmlnZ2VyZWRcbiAgICAgKiAgY29uc3QgZ3JpZCA9IGV2ZW50LnJvdy5ncmlkO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1ncmlkXG4gICAgICogICAgW2RhdGFdPVwiZGF0YVwiXG4gICAgICogICAgKHJvd1NlbGVjdGVkKT1cImhhbmRsZVJvd1NlbGVjdGlvbigkZXZlbnQpXCI+XG4gICAgICogIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgLy8gVE9ETzogUmVmYWN0b3JcbiAgICBwdWJsaWMgZ2V0IHBhcmVudEdyaWQoKTogSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuZ3JpZCBhcyBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50O1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWxldmVsJylcbiAgICBwdWJsaWMgZ2V0IGxldmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXQubGV2ZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG5hdGl2ZSBET00gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIHJvdy4gQ291bGQgYmUgbnVsbCBpbiBjZXJ0YWluIGVudmlyb25tZW50cy5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXQgdGhlIG5hdGl2ZUVsZW1lbnQgb2YgdGhlIHNlY29uZCBzZWxlY3RlZCByb3dcbiAgICAgKiBsZXQgc2VsZWN0ZWRSb3dOYXRpdmVFbGVtZW50ID0gdGhpcy5ncmlkLnNlbGVjdGVkUm93c1sxXS5uYXRpdmVFbGVtZW50O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcm93IGlzIGV4cGFuZGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBSb3dFeHBhbmRlZCA9IHRoaXMuZ3JpZDEucm93TGlzdC5maXJzdC5leHBhbmRlZDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwYW5kZWQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgX2RhdGE6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KElHWF9HUklEX1NFUlZJQ0VfQkFTRSkgcHVibGljIGdyaWRBUEk6IElneEhpZXJhcmNoaWNhbEdyaWRBUElTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50LCB7IGluamVjdG9yOiB0aGlzLmNvbnRhaW5lci5pbmplY3RvciB9KTtcbiAgICAgICAgdGhpcy5oR3JpZCA9IHJlZi5pbnN0YW5jZTtcbiAgICAgICAgdGhpcy5oR3JpZC5kYXRhID0gdGhpcy5kYXRhLmNoaWxkR3JpZHNEYXRhW3RoaXMubGF5b3V0LmtleV07XG4gICAgICAgIHRoaXMubGF5b3V0LmxheW91dENoYW5nZS5zdWJzY3JpYmUoKGNoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVMYXlvdXRDaGFuZ2VzKGNoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLmxheW91dC5pbml0aWFsQ2hhbmdlcztcbiAgICAgICAgY2hhbmdlcy5mb3JFYWNoKGNoYW5nZSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVMYXlvdXRDaGFuZ2VzKGNoYW5nZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmhHcmlkLnBhcmVudCA9IHRoaXMucGFyZW50R3JpZDtcbiAgICAgICAgdGhpcy5oR3JpZC5wYXJlbnRJc2xhbmQgPSB0aGlzLmxheW91dDtcbiAgICAgICAgdGhpcy5oR3JpZC5jaGlsZFJvdyA9IHRoaXM7XG4gICAgICAgIC8vIGhhbmRsZXIgbG9naWMgdGhhdCByZS1lbWl0cyBoZ3JpZCBldmVudHMgb24gdGhlIHJvdyBpc2xhbmRcbiAgICAgICAgdGhpcy5zZXR1cEV2ZW50RW1pdHRlcnMoKTtcbiAgICAgICAgdGhpcy5sYXlvdXQuZ3JpZENyZWF0ZWQuZW1pdCh7XG4gICAgICAgICAgICBvd25lcjogdGhpcy5sYXlvdXQsXG4gICAgICAgICAgICBwYXJlbnRJRDogdGhpcy5kYXRhLnJvd0lELFxuICAgICAgICAgICAgZ3JpZDogdGhpcy5oR3JpZFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5oR3JpZC5jaGlsZExheW91dExpc3QgPSB0aGlzLmxheW91dC5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgbGF5b3V0cyA9IHRoaXMuaEdyaWQuY2hpbGRMYXlvdXRMaXN0LnRvQXJyYXkoKTtcbiAgICAgICAgbGF5b3V0cy5mb3JFYWNoKChsKSA9PiB0aGlzLmhHcmlkLmdyaWRBUEkucmVnaXN0ZXJDaGlsZFJvd0lzbGFuZChsKSk7XG4gICAgICAgIHRoaXMucGFyZW50R3JpZC5ncmlkQVBJLnJlZ2lzdGVyQ2hpbGRHcmlkKHRoaXMuZGF0YS5yb3dJRCwgdGhpcy5sYXlvdXQua2V5LCB0aGlzLmhHcmlkKTtcbiAgICAgICAgdGhpcy5sYXlvdXQucm93SXNsYW5kQVBJLnJlZ2lzdGVyQ2hpbGRHcmlkKHRoaXMuZGF0YS5yb3dJRCwgdGhpcy5oR3JpZCk7XG5cbiAgICAgICAgdGhpcy5sYXlvdXQuZ3JpZEluaXRpYWxpemVkLmVtaXQoe1xuICAgICAgICAgICAgb3duZXI6IHRoaXMubGF5b3V0LFxuICAgICAgICAgICAgcGFyZW50SUQ6IHRoaXMuZGF0YS5yb3dJRCxcbiAgICAgICAgICAgIGdyaWQ6IHRoaXMuaEdyaWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5oR3JpZC5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBFdmVudEVtaXR0ZXJzKCkge1xuICAgICAgICBjb25zdCBkZXN0cnVjdG9yID0gdGFrZVVudGlsKHRoaXMuaEdyaWQuZGVzdHJveSQpO1xuXG4gICAgICAgIGNvbnN0IG1pcnJvciA9IHJlZmxlY3RDb21wb25lbnRUeXBlKElneEdyaWRDb21wb25lbnQpO1xuICAgICAgICAvLyBleGNsdWRlIG91dHB1dHMgcmVsYXRlZCB0byB0d28td2F5IGJpbmRpbmcgZnVuY3Rpb25hbGl0eVxuICAgICAgICBjb25zdCBpbnB1dE5hbWVzID0gbWlycm9yLmlucHV0cy5tYXAoaW5wdXQgPT4gaW5wdXQucHJvcE5hbWUpO1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gbWlycm9yLm91dHB1dHMuZmlsdGVyKG8gPT4ge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdJbnB1dFByb3BOYW1lID0gby5wcm9wTmFtZS5zbGljZSgwLCBvLnByb3BOYW1lLmluZGV4T2YoJ0NoYW5nZScpKTtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dE5hbWVzLmluZGV4T2YobWF0Y2hpbmdJbnB1dFByb3BOYW1lKSA9PT0gLTE7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRPRE86IFNraXAgdGhlIGByZW5kZXJlZGAgb3V0cHV0LiBSZW5kZXJlZCBzaG91bGQgYmUgY2FsbGVkIG9uY2UgcGVyIGdyaWQuXG4gICAgICAgIG91dHB1dHMuZmlsdGVyKG8gPT4gby5wcm9wTmFtZSAhPT0gJ3JlbmRlcmVkJykuZm9yRWFjaChvdXRwdXQgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaEdyaWRbb3V0cHV0LnByb3BOYW1lXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaEdyaWRbb3V0cHV0LnByb3BOYW1lXS5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmdzLm93bmVyID0gdGhpcy5oR3JpZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRbb3V0cHV0LnByb3BOYW1lXS5lbWl0KGFyZ3MpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgX2hhbmRsZUxheW91dENoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGNoYW5nZSBpbiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShjaGFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oR3JpZFtjaGFuZ2VdID0gY2hhbmdlc1tjaGFuZ2VdLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzZWxlY3RvcjogJ2lneC1oaWVyYXJjaGljYWwtZ3JpZCcsXG4gICAgdGVtcGxhdGVVcmw6ICdoaWVyYXJjaGljYWwtZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIElneEdyaWRDUlVEU2VydmljZSxcbiAgICAgICAgSWd4R3JpZFZhbGlkYXRpb25TZXJ2aWNlLFxuICAgICAgICBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgeyBwcm92aWRlOiBJR1hfR1JJRF9TRVJWSUNFX0JBU0UsIHVzZUNsYXNzOiBJZ3hIaWVyYXJjaGljYWxHcmlkQVBJU2VydmljZSB9LFxuICAgICAgICB7IHByb3ZpZGU6IElHWF9HUklEX0JBU0UsIHVzZUV4aXN0aW5nOiBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50IH0sXG4gICAgICAgIElneEdyaWRTdW1tYXJ5U2VydmljZSxcbiAgICAgICAgSWd4RmlsdGVyaW5nU2VydmljZSxcbiAgICAgICAgSWd4SGllcmFyY2hpY2FsR3JpZE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICBJZ3hDb2x1bW5SZXNpemluZ1NlcnZpY2UsXG4gICAgICAgIElneEZvck9mU3luY1NlcnZpY2UsXG4gICAgICAgIElneEZvck9mU2Nyb2xsU3luY1NlcnZpY2UsXG4gICAgICAgIElneFJvd0lzbGFuZEFQSVNlcnZpY2VcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnQgZXh0ZW5kcyBJZ3hIaWVyYXJjaGljYWxHcmlkQmFzZURpcmVjdGl2ZVxuICAgIGltcGxlbWVudHMgR3JpZFR5cGUsIEFmdGVyVmlld0luaXQsIEFmdGVyQ29udGVudEluaXQsIE9uSW5pdCwgT25EZXN0cm95LCBEb0NoZWNrIHtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyByb2xlID0gJ2dyaWQnO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93SXNsYW5kQ29tcG9uZW50LCB7IHJlYWQ6IElneFJvd0lzbGFuZENvbXBvbmVudCwgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gICAgcHVibGljIGNoaWxkTGF5b3V0TGlzdDogUXVlcnlMaXN0PElneFJvd0lzbGFuZENvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dJc2xhbmRDb21wb25lbnQsIHsgcmVhZDogSWd4Um93SXNsYW5kQ29tcG9uZW50LCBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICAgIHB1YmxpYyBhbGxMYXlvdXRMaXN0OiBRdWVyeUxpc3Q8SWd4Um93SXNsYW5kQ29tcG9uZW50PjtcblxuICAgIEBDb250ZW50Q2hpbGQoSWd4R3JpZFRvb2xiYXJEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB0b29sYmFyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRUb29sYmFyVGVtcGxhdGVDb250ZXh0PjtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4UGFnaW5hdG9yQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gICAgcHVibGljIHBhZ2luYXRvckxpc3Q6IFF1ZXJ5TGlzdDxJZ3hQYWdpbmF0b3JDb21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgndG9vbGJhck91dGxldCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICAgIHB1YmxpYyB0b29sYmFyT3V0bGV0OiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgQFZpZXdDaGlsZCgncGFnaW5hdG9yT3V0bGV0JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gICAgcHVibGljIHBhZ2luYXRvck91dGxldDogVmlld0NvbnRhaW5lclJlZjtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSwgeyByZWFkOiBJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSB9KVxuICAgIHB1YmxpYyB0ZW1wbGF0ZU91dGxldHM6IFF1ZXJ5TGlzdDxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4Q2hpbGRHcmlkUm93Q29tcG9uZW50KVxuICAgIHB1YmxpYyBoaWVyYXJjaGljYWxSb3dzOiBRdWVyeUxpc3Q8SWd4Q2hpbGRHcmlkUm93Q29tcG9uZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2hpZXJhcmNoaWNhbF9yZWNvcmRfdGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgaGllcmFyY2hpY2FsUmVjb3JkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdjaGlsZF9yZWNvcmRfdGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgY2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8vIEBWaWV3Q2hpbGQoJ2hlYWRlckhpZXJhcmNoeUV4cGFuZGVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZ2V0IGhlYWRlckhpZXJhcmNoeUV4cGFuZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdz8uaGVhZGVySGllcmFyY2h5RXhwYW5kZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBjaGlsZExheW91dEtleXMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaGlnaGxpZ2h0ZWRSb3dJRCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZU9uUmVuZGVyID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHBhcmVudDogSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGNoaWxkUm93OiBJZ3hDaGlsZEdyaWRSb3dDb21wb25lbnQ7XG5cbiAgICBwcml2YXRlIF9kYXRhO1xuICAgIHByaXZhdGUgaF9pZCA9IGBpZ3gtaGllcmFyY2hpY2FsLWdyaWQtJHtORVhUX0lEKyt9YDtcbiAgICBwcml2YXRlIGNoaWxkR3JpZFRlbXBsYXRlczogTWFwPGFueSwgYW55PiA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIHNjcm9sbFRvcCA9IDA7XG4gICAgcHJpdmF0ZSBzY3JvbGxMZWZ0ID0gMDtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBpZGAgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiBub3QgcHJvdmlkZWQgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWhpZXJhcmNoaWNhbC1ncmlkIFtpZF09XCInaWd4LWhncmlkLTEnXCIgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWhpZXJhcmNoaWNhbC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmhfaWQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgaWQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmhfaWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBsZXRzIHlvdSBmaWxsIHRoZSBgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudGAgd2l0aCBhbiBhcnJheSBvZiBkYXRhLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWhpZXJhcmNoaWNhbC1ncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1oaWVyYXJjaGljYWwtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGRhdGEodmFsdWU6IGFueVtdIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9kYXRhID0gdmFsdWUgfHwgW107XG4gICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24udXBkYXRlQWxsKHRoaXMuX2RhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNob3VsZEdlbmVyYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwQ29sdW1ucygpO1xuICAgICAgICAgICAgdGhpcy5yZWZsb3coKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmICh0aGlzLmhlaWdodCA9PT0gbnVsbCB8fCB0aGlzLmhlaWdodC5pbmRleE9mKCclJykgIT09IC0xKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGhlaWdodCB3aWxsIGNoYW5nZSBiYXNlZCBvbiBob3cgbXVjaCBkYXRhIHRoZXJlIGlzLCByZWNhbGN1bGF0ZSBzaXplcyBpbiBpZ3hGb3JPZi5cbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgZGF0YSBzZXQgdG8gdGhlIGBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50YC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGZpbHRlcmVkRGF0YSA9IHRoaXMuZ3JpZC5maWx0ZXJlZERhdGE7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IHBhZ2luYXRvcigpIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmlkO1xuICAgICAgICByZXR1cm4gKCF0aGlzLnBhcmVudElzbGFuZCAmJiB0aGlzLnBhZ2luYXRpb25Db21wb25lbnRzPy5maXJzdCkgfHwgdGhpcy5yb290R3JpZC5wYWdpbmF0b3JMaXN0Py5maW5kKChwZykgPT5cbiAgICAgICAgICAgIHBnLm5hdGl2ZUVsZW1lbnQub2Zmc2V0UGFyZW50Py5pZCA9PT0gaWQpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCgpIDogSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRJc2xhbmQgP1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRJc2xhbmQuZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudHMuZmlyc3QgOlxuICAgICAgICAgICAgc3VwZXIuZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRvdGFsIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBkYXRhIHNvdXJjZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBwcm9wZXJ0eSBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGdyaWQgdmlydHVhbGl6YXRpb24gdG8gZnVuY3Rpb24gd2hlbiBpdCBpcyBib3VuZCB0byByZW1vdGUgZGF0YS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBpdGVtQ291bnQgPSB0aGlzLmdyaWQxLnRvdGFsSXRlbUNvdW50O1xuICAgICAqIHRoaXMuZ3JpZDEudG90YWxJdGVtQ291bnQgPSA1NTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHRvdGFsSXRlbUNvdW50KGNvdW50KSB7XG4gICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIudG90YWxJdGVtQ291bnQgPSBjb3VudDtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdG90YWxJdGVtQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnRvdGFsSXRlbUNvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgaWYgYWxsIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgYElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRgIHNob3VsZCBiZSBleHBhbmRlZC9jb2xsYXBzZWQuXG4gICAgICogRGVmdWx0IHZhbHVlIGlzIGZhbHNlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWhpZXJhcmNoaWNhbC1ncmlkIFtpZF09XCInaWd4LWdyaWQtMSdcIiBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgW2V4cGFuZENoaWxkcmVuXT1cInRydWVcIj48L2lneC1oaWVyYXJjaGljYWwtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGV4cGFuZENoaWxkcmVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmV4cGFuc2lvblN0YXRlcyA9IG5ldyBNYXA8YW55LCBib29sZWFuPigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgaWYgYWxsIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgYElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRgIHByZXZpb3VzbHkgaGF2ZSBiZWVuIHNldCB0byBiZSBleHBhbmRlZC9jb2xsYXBzZWQuXG4gICAgICogSWYgcHJldmlvdXNseSBzZXQgYW5kIHNvbWUgcm93cyBoYXZlIGJlZW4gbWFudWFsbHkgZXhwYW5kZWQvY29sbGFwc2VkIGl0IHdpbGwgc3RpbGwgcmV0dXJuIHRoZSBsYXN0IHNldCB2YWx1ZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZXhwYW5kZWQgPSB0aGlzLmdyaWQuZXhwYW5kQ2hpbGRyZW47XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXhwYW5kQ2hpbGRyZW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RXhwYW5kU3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSBgZ2V0Q2VsbEJ5Q29sdW1uYCBvciBgZ2V0Q2VsbEJ5S2V5YCBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGEgYENlbGxUeXBlYCBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjb25kaXRpb25zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDZWxsID0gdGhpcy5ncmlkMS5nZXRDZWxsQnlDb2x1bW5WaXNpYmxlSW5kZXgoMixcIlVuaXRQcmljZVwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SW5kZXhcbiAgICAgKiBAcGFyYW0gaW5kZXhcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2VsbEJ5Q29sdW1uVmlzaWJsZUluZGV4KHJvd0luZGV4OiBudW1iZXIsIGluZGV4OiBudW1iZXIpOiBDZWxsVHlwZSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0Um93QnlJbmRleChyb3dJbmRleCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC52aXNpYmxlSW5kZXggPT09IGluZGV4KTtcbiAgICAgICAgaWYgKHJvdyAmJiByb3cgaW5zdGFuY2VvZiBJZ3hIaWVyYXJjaGljYWxHcmlkUm93ICYmIGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZ3hHcmlkQ2VsbCh0aGlzLCByb3dJbmRleCwgY29sdW1uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgcm93LiBJdCBtYXkgYmUgYSBgc3RyaW5nYCBvciBgbnVtYmVyYCBpZiBgcHJpbWFyeUtleWAgb2YgdGhlXG4gICAgICogcGFyZW50IGdyaWQgaXMgc2V0IG9yIGFuIG9iamVjdCByZWZlcmVuY2Ugb2YgdGhlIHBhcmVudCByZWNvcmQgb3RoZXJ3aXNlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBmb3JlaWduS2V5ID0gdGhpcy5ncmlkLmZvcmVpZ25LZXk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZm9yZWlnbktleSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmdyaWRBUEkuZ2V0UGFyZW50Um93SWQodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzRXhwYW5kYWJsZUNoaWxkcmVuKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLmNoaWxkTGF5b3V0S2V5cy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzb2x2ZVJvd0VkaXRDb250YWluZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudElzbGFuZCAmJiB0aGlzLnBhcmVudElzbGFuZC5yb3dFZGl0Q3VzdG9tKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRJc2xhbmQucm93RWRpdENvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yb3dFZGl0Q29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlc29sdmVSb3dFZGl0QWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50SXNsYW5kID8gdGhpcy5wYXJlbnRJc2xhbmQucm93RWRpdEFjdGlvbnNUZW1wbGF0ZSA6IHRoaXMucm93RWRpdEFjdGlvbnNUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNvbHZlUm93RWRpdFRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudElzbGFuZCA/IHRoaXMucGFyZW50SXNsYW5kLnJvd0VkaXRUZXh0VGVtcGxhdGUgOiB0aGlzLnJvd0VkaXRUZXh0VGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgaGlkZUFjdGlvblN0cmlwKCkge1xuICAgICAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICAvLyBoaWRlIGNoaWxkIGxheW91dCBhY3Rpb25zIHN0cmlwcyB3aGVuXG4gICAgICAgICAgICAvLyBtb3Zpbmcgb3V0c2lkZSByb290IGdyaWQuXG4gICAgICAgICAgICBzdXBlci5oaWRlQWN0aW9uU3RyaXAoKTtcbiAgICAgICAgICAgIHRoaXMuYWxsTGF5b3V0TGlzdC5mb3JFYWNoKHJpID0+IHtcbiAgICAgICAgICAgICAgICByaS5hY3Rpb25TdHJpcD8uaGlkZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBwYXJlbnRSb3dPdXRsZXREaXJlY3RpdmUoKSB7XG4gICAgICAgIC8vIFRhcmdldGluZyBwYXJlbnQgb3V0bGV0IGluIG9yZGVyIHRvIHByZXZlbnQgaGlkaW5nIHdoZW4gb3V0bGV0XG4gICAgICAgIC8vIGlzIHByZXNlbnQgYXQgYSBjaGlsZCBncmlkIGFuZCBpcyBhdHRhY2hlZCB0byBhIHJvdy5cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQucm93T3V0bGV0RGlyZWN0aXZlIDogdGhpcy5vdXRsZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBuZ09uSW5pdCgpIHtcbiAgICAgICAgLy8gdGhpcy5leHBhbnNpb25TdGF0ZXNDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgodmFsdWU6IE1hcDxhbnksIGJvb2xlYW4+KSA9PiB7XG4gICAgICAgIC8vICAgICBjb25zdCByZXMgPSBBcnJheS5mcm9tKHZhbHVlLmVudHJpZXMoKSkuZmlsdGVyKCh7MTogdn0pID0+IHYgPT09IHRydWUpLm1hcCgoW2tdKSA9PiBrKTtcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIHRoaXMuYmF0Y2hFZGl0aW5nID0gISF0aGlzLnJvb3RHcmlkLmJhdGNoRWRpdGluZztcbiAgICAgICAgaWYgKHRoaXMucm9vdEdyaWQgIT09IHRoaXMpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEdyaWQuYmF0Y2hFZGl0aW5nQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHZhbDogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYmF0Y2hFZGl0aW5nID0gdmFsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmdldFNjcm9sbCgpLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGdfdmVydGljYWxTY3JvbGxIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJDb250YWluZXIuZ2V0U2Nyb2xsKCkuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oZ19ob3Jpem9udGFsU2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuYmVmb3JlVmlld0Rlc3Ryb3llZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCh2aWV3KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByb3dEYXRhID0gdmlldy5jb250ZXh0LiRpbXBsaWNpdDtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ2hpbGRHcmlkUmVjb3JkKHJvd0RhdGEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMuY2hpbGRHcmlkVGVtcGxhdGVzLmdldChyb3dEYXRhLnJvd0lEKTtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0bWxwT3V0bGV0ID0gY2FjaGVkRGF0YS5vd25lcjtcbiAgICAgICAgICAgICAgICAgICAgdG1scE91dGxldC5fdmlld0NvbnRhaW5lclJlZi5kZXRhY2goMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXlEZW5zaXR5ID0gdGhpcy5yb290R3JpZC5kaXNwbGF5RGVuc2l0eTtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2Uuc3VtbWFyeUhlaWdodCA9IDA7XG4gICAgICAgICAgICB0aGlzLnJvb3RHcmlkLmRlbnNpdHlDaGFuZ2VkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXlEZW5zaXR5ID0gdGhpcy5yb290R3JpZC5kaXNwbGF5RGVuc2l0eTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLnN1bW1hcnlIZWlnaHQgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jaGlsZExheW91dEtleXMgPSB0aGlzLnBhcmVudElzbGFuZC5jaGlsZHJlbi5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWN0aW9uU3RyaXAgPSB0aGlzLnBhcmVudElzbGFuZCA/IHRoaXMucGFyZW50SXNsYW5kLmFjdGlvblN0cmlwIDogdGhpcy5hY3Rpb25TdHJpcDtcblxuICAgICAgICB0aGlzLmhlYWRTZWxlY3RvcnNUZW1wbGF0ZXMgPSB0aGlzLnBhcmVudElzbGFuZCA/XG4gICAgICAgICAgICB0aGlzLnBhcmVudElzbGFuZC5oZWFkU2VsZWN0b3JzVGVtcGxhdGVzIDpcbiAgICAgICAgICAgIHRoaXMuaGVhZFNlbGVjdG9yc1RlbXBsYXRlcztcblxuICAgICAgICB0aGlzLnJvd1NlbGVjdG9yc1RlbXBsYXRlcyA9IHRoaXMucGFyZW50SXNsYW5kID9cbiAgICAgICAgICAgIHRoaXMucGFyZW50SXNsYW5kLnJvd1NlbGVjdG9yc1RlbXBsYXRlcyA6XG4gICAgICAgICAgICB0aGlzLnJvd1NlbGVjdG9yc1RlbXBsYXRlcztcbiAgICAgICAgdGhpcy5kcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlID0gdGhpcy5wYXJlbnRJc2xhbmQgP1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRJc2xhbmQuZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSA6XG4gICAgICAgICAgICB0aGlzLmRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGU7XG4gICAgICAgIHRoaXMucm93RXhwYW5kZWRJbmRpY2F0b3JUZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQucm93RXhwYW5kZWRJbmRpY2F0b3JUZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5yb3dDb2xsYXBzZWRJbmRpY2F0b3JUZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQucm93Q29sbGFwc2VkSW5kaWNhdG9yVGVtcGxhdGU7XG4gICAgICAgIHRoaXMuaGVhZGVyQ29sbGFwc2VJbmRpY2F0b3JUZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQuaGVhZGVyQ29sbGFwc2VJbmRpY2F0b3JUZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5oZWFkZXJFeHBhbmRJbmRpY2F0b3JUZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQuaGVhZGVyRXhwYW5kSW5kaWNhdG9yVGVtcGxhdGU7XG4gICAgICAgIHRoaXMuZXhjZWxTdHlsZUhlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQuZXhjZWxTdHlsZUhlYWRlckljb25UZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5zb3J0QXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlID0gdGhpcy5yb290R3JpZC5zb3J0QXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlO1xuICAgICAgICB0aGlzLnNvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlID0gdGhpcy5yb290R3JpZC5zb3J0RGVzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5zb3J0SGVhZGVySWNvblRlbXBsYXRlID0gdGhpcy5yb290R3JpZC5zb3J0SGVhZGVySWNvblRlbXBsYXRlO1xuICAgICAgICB0aGlzLmhhc0NoaWxkcmVuS2V5ID0gdGhpcy5wYXJlbnRJc2xhbmQgP1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRJc2xhbmQuaGFzQ2hpbGRyZW5LZXkgfHwgdGhpcy5yb290R3JpZC5oYXNDaGlsZHJlbktleSA6XG4gICAgICAgICAgICB0aGlzLnJvb3RHcmlkLmhhc0NoaWxkcmVuS2V5O1xuICAgICAgICB0aGlzLnNob3dFeHBhbmRBbGwgPSB0aGlzLnBhcmVudElzbGFuZCA/XG4gICAgICAgICAgICB0aGlzLnBhcmVudElzbGFuZC5zaG93RXhwYW5kQWxsIDogdGhpcy5yb290R3JpZC5zaG93RXhwYW5kQWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgb3V0bGV0RGlyZWN0aXZlKCk6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290R3JpZC5vdXRsZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29sdW1uTGlzdChmYWxzZSk7XG4gICAgICAgIHRoaXMuY2hpbGRMYXlvdXRLZXlzID0gdGhpcy5wYXJlbnQgP1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRJc2xhbmQuY2hpbGRyZW4ubWFwKChpdGVtKSA9PiBpdGVtLmtleSkgOlxuICAgICAgICAgICAgdGhpcy5jaGlsZExheW91dEtleXMgPSB0aGlzLmNoaWxkTGF5b3V0TGlzdC5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KTtcbiAgICAgICAgdGhpcy5jaGlsZExheW91dExpc3Qubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuY2hpbGRMYXlvdXRMaXN0LmNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PlxuICAgICAgICAgICAgdGhpcy5vblJvd0lzbGFuZENoYW5nZSgpXG4gICAgICAgICk7XG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJDb250ZW50SW5pdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBSb3dUeXBlYCBieSBpbmRleC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Um93ID0gdGhpcy5ncmlkMS5nZXRSb3dCeUluZGV4KDEpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBpbmRleFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSb3dCeUluZGV4KGluZGV4OiBudW1iZXIpOiBSb3dUeXBlIHtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmRhdGFWaWV3Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSb3coaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBSb3dUeXBlYCBieSBrZXkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteVJvdyA9IHRoaXMuZ3JpZDEuZ2V0Um93QnlLZXkoMSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGtleVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSb3dCeUtleShrZXk6IGFueSk6IFJvd1R5cGUge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhVmlldztcbiAgICAgICAgY29uc3QgcmVjID0gdGhpcy5wcmltYXJ5S2V5ID9cbiAgICAgICAgICAgIGRhdGEuZmluZChyZWNvcmQgPT4gcmVjb3JkW3RoaXMucHJpbWFyeUtleV0gPT09IGtleSkgOlxuICAgICAgICAgICAgZGF0YS5maW5kKHJlY29yZCA9PiByZWNvcmQgPT09IGtleSk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YS5pbmRleE9mKHJlYyk7XG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgSWd4SGllcmFyY2hpY2FsR3JpZFJvdyh0aGlzIGFzIGFueSwgaW5kZXgsIHJlYyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWxsUm93cygpOiBSb3dUeXBlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhVmlldy5tYXAoKHJlYywgaW5kZXgpID0+IHRoaXMuY3JlYXRlUm93KGluZGV4KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiBgSWd4SGllcmFyY2hpY2FsR3JpZFJvd2BzIGZvciBjdXJyZW50IHBhZ2UuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkYXRhUm93cygpOiBSb3dUeXBlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxSb3dzKCkuZmlsdGVyKHJvdyA9PiByb3cgaW5zdGFuY2VvZiBJZ3hIaWVyYXJjaGljYWxHcmlkUm93KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBzZWxlY3RlZCBgSWd4R3JpZENlbGxgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHNlbGVjdGVkQ2VsbHMgPSB0aGlzLmdyaWQuc2VsZWN0ZWRDZWxscztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkQ2VsbHMoKTogQ2VsbFR5cGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFSb3dzKCkubWFwKChyb3cpID0+IHJvdy5jZWxscy5maWx0ZXIoKGNlbGwpID0+IGNlbGwuc2VsZWN0ZWQpKVxuICAgICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYiksIFtdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYENlbGxUeXBlYCBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjb25kaXRpb25zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDZWxsID0gdGhpcy5ncmlkMS5nZXRDZWxsQnlDb2x1bW4oMiwgXCJVbml0UHJpY2VcIik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0luZGV4XG4gICAgICogQHBhcmFtIGNvbHVtbkZpZWxkXG4gICAgICovXG4gICAgcHVibGljIGdldENlbGxCeUNvbHVtbihyb3dJbmRleDogbnVtYmVyLCBjb2x1bW5GaWVsZDogc3RyaW5nKTogQ2VsbFR5cGUge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmdldFJvd0J5SW5kZXgocm93SW5kZXgpO1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGNvbHVtbkZpZWxkKTtcbiAgICAgICAgaWYgKHJvdyAmJiByb3cgaW5zdGFuY2VvZiBJZ3hIaWVyYXJjaGljYWxHcmlkUm93ICYmIGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZ3hHcmlkQ2VsbCh0aGlzLCByb3dJbmRleCwgY29sdW1uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBgQ2VsbFR5cGVgIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNvbmRpdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoYXQgdGhlIHByaW1hcnlLZXkgcHJvcGVydHkgaXMgc2V0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQuZ2V0Q2VsbEJ5S2V5KDEsICdpbmRleCcpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dTZWxlY3RvciBtYXRjaCBhbnkgcm93SURcbiAgICAgKiBAcGFyYW0gY29sdW1uRmllbGRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2VsbEJ5S2V5KHJvd1NlbGVjdG9yOiBhbnksIGNvbHVtbkZpZWxkOiBzdHJpbmcpOiBDZWxsVHlwZSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0Um93QnlLZXkocm93U2VsZWN0b3IpO1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGNvbHVtbkZpZWxkKTtcbiAgICAgICAgaWYgKHJvdyAmJiBjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSWd4R3JpZENlbGwodGhpcywgcm93LmluZGV4LCBjb2x1bW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHBpblJvdyhyb3dJRDogYW55LCBpbmRleD86IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmdldFJvd0J5S2V5KHJvd0lEKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnBpblJvdyhyb3dJRCwgaW5kZXgsIHJvdyk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHVucGluUm93KHJvd0lEOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5nZXRSb3dCeUtleShyb3dJRCk7XG4gICAgICAgIHJldHVybiBzdXBlci51bnBpblJvdyhyb3dJRCwgcm93KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkYXRhTG9hZGluZyhldmVudCkge1xuICAgICAgICB0aGlzLmRhdGFQcmVMb2FkLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIG92ZXJyaWRlIGZlYXR1cmVDb2x1bW5zV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5mZWF0dXJlQ29sdW1uc1dpZHRoKHRoaXMuaGVhZGVySGllcmFyY2h5RXhwYW5kZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Sb3dJc2xhbmRDaGFuZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5jaGlsZExheW91dEtleXMgPSB0aGlzLnBhcmVudElzbGFuZC5jaGlsZHJlbi5maWx0ZXIoaXRlbSA9PiAhKGl0ZW0gYXMgYW55KS5fZGVzdHJveWVkKS5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRMYXlvdXRLZXlzID0gdGhpcy5jaGlsZExheW91dExpc3QuZmlsdGVyKGl0ZW0gPT4gIShpdGVtIGFzIGFueSkuX2Rlc3Ryb3llZCkubWFwKChpdGVtKSA9PiBpdGVtLmtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEodGhpcy5jZHIgYXMgYW55KS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLmdldENoaWxkR3JpZHModHJ1ZSkuZm9yRWFjaCgoZ3JpZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZ3JpZC5jaGlsZFJvdy5jZHIuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyaWQuY2hpbGRSb3cuY2RyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIGluIGNhc2Ugc2VsZWN0aW9uIGlzIGluIGRlc3Ryb3llZCBjaGlsZCBncmlkLCBzZWxlY3Rpb24gc2hvdWxkIGJlIGNsZWFyZWQuXG4gICAgICAgICAgICB0aGlzLl9jbGVhclNlbGV0aW9uSGlnaGxpZ2h0cygpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBpc1Jvd0hpZ2hsaWdodGVkKHJvd0RhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRSb3dJRCA9PT0gcm93RGF0YS5yb3dJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGlzSGllcmFyY2hpY2FsUmVjb3JkKHJlY29yZDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmlzR2hvc3RSZWNvcmQocmVjb3JkKSkge1xuICAgICAgICAgICAgcmVjb3JkID0gcmVjb3JkLnJlY29yZFJlZjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZExheW91dExpc3QubGVuZ3RoICE9PSAwICYmIHJlY29yZFt0aGlzLmNoaWxkTGF5b3V0TGlzdC5maXJzdC5rZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNDaGlsZEdyaWRSZWNvcmQocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgLy8gQ2FuIGJlIG51bGwgd2hlbiB0aGVyZSBpcyBkZWZpbmVkIGxheW91dCBidXQgbm8gY2hpbGQgZGF0YSB3YXMgZm91bmRcbiAgICAgICAgcmV0dXJuIHJlY29yZD8uY2hpbGRHcmlkc0RhdGEgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHRyYWNrQ2hhbmdlcyhpbmRleCwgcmVjKSB7XG4gICAgICAgIGlmIChyZWMuY2hpbGRHcmlkc0RhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gaWYgaXMgY2hpbGQgcmVjXG4gICAgICAgICAgICByZXR1cm4gcmVjLnJvd0lEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb250ZXh0KHJvd0RhdGEsIHJvd0luZGV4LCBwaW5uZWQpOiBhbnkge1xuICAgICAgICBpZiAodGhpcy5pc0NoaWxkR3JpZFJlY29yZChyb3dEYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMuY2hpbGRHcmlkVGVtcGxhdGVzLmdldChyb3dEYXRhLnJvd0lEKTtcbiAgICAgICAgICAgIGlmIChjYWNoZWREYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IGNhY2hlZERhdGEudmlldztcbiAgICAgICAgICAgICAgICBjb25zdCB0bWxwT3V0bGV0ID0gY2FjaGVkRGF0YS5vd25lcjtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHJvd0RhdGEsXG4gICAgICAgICAgICAgICAgICAgIG1vdmVWaWV3OiB2aWV3LFxuICAgICAgICAgICAgICAgICAgICBvd25lcjogdG1scE91dGxldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMuZGF0YVZpZXcuaW5kZXhPZihyb3dEYXRhKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNoaWxkIHJvd3MgY29udGFpbiB1bmlxdWUgZ3JpZHMsIGhlbmNlIHNob3VsZCBoYXZlIHVuaXF1ZSB0ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHJvd0RhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlSUQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjaGlsZFJvdycsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogcm93RGF0YS5yb3dJRFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5kYXRhVmlldy5pbmRleE9mKHJvd0RhdGEpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgJGltcGxpY2l0OiB0aGlzLmlzR2hvc3RSZWNvcmQocm93RGF0YSkgPyByb3dEYXRhLnJlY29yZFJlZiA6IHJvd0RhdGEsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVJRDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGF0YVJvdycsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBudWxsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5nZXREYXRhVmlld0luZGV4KHJvd0luZGV4LCBwaW5uZWQpLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0aGlzLmlzR2hvc3RSZWNvcmQocm93RGF0YSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCByb290R3JpZCgpOiBHcmlkVHlwZSB7XG4gICAgICAgIGxldCBjdXJyR3JpZCA9IHRoaXMgYXMgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudDtcbiAgICAgICAgd2hpbGUgKGN1cnJHcmlkLnBhcmVudCkge1xuICAgICAgICAgICAgY3VyckdyaWQgPSBjdXJyR3JpZC5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJHcmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGljb25UZW1wbGF0ZSgpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmhhc0V4cGFuZGVkUmVjb3JkcygpICYmIHRoaXMuaGFzRXhwYW5kYWJsZUNoaWxkcmVuO1xuICAgICAgICBpZiAoIWV4cGFuZGVkICYmIHRoaXMuc2hvd0V4cGFuZEFsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyQ29sbGFwc2VJbmRpY2F0b3JUZW1wbGF0ZSB8fCB0aGlzLmRlZmF1bHRDb2xsYXBzZWRUZW1wbGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhlYWRlckV4cGFuZEluZGljYXRvclRlbXBsYXRlIHx8IHRoaXMuZGVmYXVsdEV4cGFuZGVkVGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldERyYWdHaG9zdEN1c3RvbVRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRJc2xhbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudElzbGFuZC5nZXREcmFnR2hvc3RDdXN0b21UZW1wbGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci5nZXREcmFnR2hvc3RDdXN0b21UZW1wbGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBHZXRzIHRoZSB2aXNpYmxlIGNvbnRlbnQgaGVpZ2h0IHRoYXQgaW5jbHVkZXMgaGVhZGVyICsgdGJvZHkgKyBmb290ZXIuXG4gICAgICogRm9yIGhpZXJhcmNoaWNhbCBjaGlsZCBncmlkIGl0IG1heSBiZSBzY3JvbGxlZCBhbmQgbm90IGZ1bGx5IHZpc2libGUuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldFZpc2libGVDb250ZW50SGVpZ2h0KCkge1xuICAgICAgICBsZXQgaGVpZ2h0ID0gc3VwZXIuZ2V0VmlzaWJsZUNvbnRlbnRIZWlnaHQoKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCByb290SGVpZ2h0ID0gdGhpcy5yb290R3JpZC5nZXRWaXNpYmxlQ29udGVudEhlaWdodCgpO1xuICAgICAgICAgICAgY29uc3QgdG9wRGlmZiA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLnJvb3RHcmlkLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICAgICAgaGVpZ2h0ID0gcm9vdEhlaWdodCAtIHRvcERpZmYgPiBoZWlnaHQgPyBoZWlnaHQgOiByb290SGVpZ2h0IC0gdG9wRGlmZjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlQWxsKCkge1xuICAgICAgICBjb25zdCBleHBhbmRlZCA9IHRoaXMuaGFzRXhwYW5kZWRSZWNvcmRzKCkgJiYgdGhpcy5oYXNFeHBhbmRhYmxlQ2hpbGRyZW47XG4gICAgICAgIGlmICghZXhwYW5kZWQgJiYgdGhpcy5zaG93RXhwYW5kQWxsKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZEFsbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2xsYXBzZUFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhc0V4cGFuZGVkUmVjb3JkcygpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoYXNFeHBhbmRlZEVudHJ5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaGFzRXhwYW5kZWRFbnRyeSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGhhc0V4cGFuZGVkRW50cnk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGdldERlZmF1bHRFeHBhbmRTdGF0ZShyZWNvcmQ6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5oYXNDaGlsZHJlbktleSAmJiAhcmVjb3JkW3RoaXMuaGFzQ2hpbGRyZW5LZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwYW5kQ2hpbGRyZW47XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGlzRXhwYW5kZWQocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5nZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyZWNvcmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdmlld0NyZWF0ZWRIYW5kbGVyKGFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDaGlsZEdyaWRSZWNvcmQoYXJncy5jb250ZXh0LiRpbXBsaWNpdCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGFyZ3MuY29udGV4dC4kaW1wbGljaXQucm93SUQ7XG4gICAgICAgICAgICB0aGlzLmNoaWxkR3JpZFRlbXBsYXRlcy5zZXQoa2V5LCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdmlld01vdmVkSGFuZGxlcihhcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ2hpbGRHcmlkUmVjb3JkKGFyZ3MuY29udGV4dC4kaW1wbGljaXQpKSB7XG4gICAgICAgICAgICAvLyB2aWV3IHdhcyBtb3ZlZCwgdXBkYXRlIG93bmVyIGluIGNhY2hlXG4gICAgICAgICAgICBjb25zdCBrZXkgPSBhcmdzLmNvbnRleHQuJGltcGxpY2l0LnJvd0lEO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMuY2hpbGRHcmlkVGVtcGxhdGVzLmdldChrZXkpO1xuICAgICAgICAgICAgY2FjaGVkRGF0YS5vd25lciA9IGFyZ3Mub3duZXI7XG5cbiAgICAgICAgICAgIHRoaXMuY2hpbGRMYXlvdXRMaXN0LmZvckVhY2goKGxheW91dCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRHcmlkID0gdGhpcy5ncmlkQVBJLmdldENoaWxkR3JpZEJ5SUQobGF5b3V0LmtleSwgYXJncy5jb250ZXh0LiRpbXBsaWNpdC5yb3dJRCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRHcmlkICYmIHJlbGF0ZWRHcmlkLnVwZGF0ZU9uUmVuZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERldGVjdCBjaGFuZ2VzIGlmIGBleHBhbmRDaGlsZHJlbmAgaGFzIGNoYW5nZWQgd2hlbiB0aGUgZ3JpZCB3YXNuJ3QgdmlzaWJsZS4gVGhpcyBpcyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEdyaWQubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEdyaWQudXBkYXRlT25SZW5kZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkNvbnRhaW5lclNjcm9sbCgpIHtcbiAgICAgICAgdGhpcy5oaWRlT3ZlcmxheXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVJvdyhpbmRleDogbnVtYmVyLCBkYXRhPzogYW55KTogUm93VHlwZSB7XG4gICAgICAgIGxldCByb3c6IFJvd1R5cGU7XG4gICAgICAgIGNvbnN0IGRhdGFJbmRleCA9IHRoaXMuX2dldERhdGFWaWV3SW5kZXgoaW5kZXgpO1xuICAgICAgICBjb25zdCByZWM6IGFueSA9IGRhdGEgPz8gdGhpcy5kYXRhVmlld1tkYXRhSW5kZXhdO1xuXG4gICAgICAgIGlmICghcm93ICYmIHJlYyAmJiAhcmVjLmNoaWxkR3JpZHNEYXRhKSB7XG4gICAgICAgICAgICByb3cgPSBuZXcgSWd4SGllcmFyY2hpY2FsR3JpZFJvdyh0aGlzIGFzIGFueSwgaW5kZXgsIHJlYyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcm93O1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXRDaGlsZEdyaWRzKGluRGVwaD86IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5nZXRDaGlsZEdyaWRzKGluRGVwaCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGdlbmVyYXRlRGF0YUZpZWxkcyhkYXRhOiBhbnlbXSk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdlbmVyYXRlRGF0YUZpZWxkcyhkYXRhKS5maWx0ZXIoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYXlvdXRzTGlzdCA9IHRoaXMucGFyZW50SXNsYW5kID8gdGhpcy5wYXJlbnRJc2xhbmQuY2hpbGRyZW4gOiB0aGlzLmNoaWxkTGF5b3V0TGlzdDtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBsYXlvdXRzTGlzdC5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KTtcbiAgICAgICAgICAgIHJldHVybiBrZXlzLmluZGV4T2YoZmllbGQpID09PSAtMTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc2l6ZU5vdGlmeUhhbmRsZXIoKSB7XG4gICAgICAgIC8vIGRvIG5vdCB0cmlnZ2VyIHJlZmxvdyBpZiBlbGVtZW50IGlzIGRldGFjaGVkIG9yIGlmIGl0IGlzIGNoaWxkIGdyaWQuXG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50LmNvbnRhaW5zKHRoaXMubmF0aXZlRWxlbWVudCkgJiYgIXRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGluaXRDb2x1bW5zKGNvbGxlY3Rpb246IElneENvbHVtbkNvbXBvbmVudFtdLCBjYjogKGFyZ3M6IGFueSkgPT4gdm9pZCA9IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgLy8gaW52YWxpZCBjb25maWd1cmF0aW9uIC0gaGllcmFyY2hpY2FsIGdyaWQgc2hvdWxkIG5vdCBhbGxvdyBjb2x1bW4gbGF5b3V0c1xuICAgICAgICAgICAgLy8gcmVtb3ZlIGNvbHVtbiBsYXlvdXRzXG4gICAgICAgICAgICBjb25zdCBub25Db2x1bW5MYXlvdXRDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiAhY29sLmNvbHVtbkxheW91dCAmJiAhY29sLmNvbHVtbkxheW91dENoaWxkKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1ucyhub25Db2x1bW5MYXlvdXRDb2x1bW5zKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5pbml0Q29sdW1ucyhjb2xsZWN0aW9uLCBjYik7XG4gICAgfVxuXG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2V0dXBDb2x1bW5zKCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRJc2xhbmQgJiYgdGhpcy5wYXJlbnRJc2xhbmQuY2hpbGRDb2x1bW5zLmxlbmd0aCA+IDAgJiYgIXRoaXMuYXV0b0dlbmVyYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUNvbHVtbnNMaXN0KHRoaXMucGFyZW50SXNsYW5kLmNoaWxkQ29sdW1ucy50b0FycmF5KCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VwZXIuc2V0dXBDb2x1bW5zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0Q29sdW1uTGlzdCgpIHtcbiAgICAgICAgY29uc3QgY2hpbGRMYXlvdXRzID0gdGhpcy5wYXJlbnQgPyB0aGlzLmNoaWxkTGF5b3V0TGlzdCA6IHRoaXMuYWxsTGF5b3V0TGlzdDtcbiAgICAgICAgY29uc3QgbmVzdGVkQ29sdW1ucyA9IGNoaWxkTGF5b3V0cy5tYXAoKGxheW91dCkgPT4gbGF5b3V0LmNvbHVtbkxpc3QudG9BcnJheSgpKTtcbiAgICAgICAgY29uc3QgY29sc0FycmF5ID0gW10uY29uY2F0LmFwcGx5KFtdLCBuZXN0ZWRDb2x1bW5zKTtcbiAgICAgICAgaWYgKGNvbHNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB0b3BDb2xzID0gdGhpcy5jb2x1bW5MaXN0LmZpbHRlcigoaXRlbSkgPT4gY29sc0FycmF5LmluZGV4T2YoaXRlbSkgPT09IC0xKTtcbiAgICAgICAgICAgIHJldHVybiB0b3BDb2xzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5MaXN0LnRvQXJyYXkoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIG9uQ29sdW1uc0NoYW5nZWQoKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5MaXN0KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBfc2hvdWxkQXV0b1NpemUocmVuZGVyZWRIZWlnaHQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNQZXJjZW50SGVpZ2h0ICYmIHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuX3Nob3VsZEF1dG9TaXplKHJlbmRlcmVkSGVpZ2h0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNvbHVtbkxpc3QocmVjYWxjQ29sU2l6ZXMgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTGF5b3V0cyA9IHRoaXMucGFyZW50ID8gdGhpcy5jaGlsZExheW91dExpc3QgOiB0aGlzLmFsbExheW91dExpc3Q7XG4gICAgICAgIGNvbnN0IG5lc3RlZENvbHVtbnMgPSBjaGlsZExheW91dHMubWFwKChsYXlvdXQpID0+IGxheW91dC5jb2x1bW5MaXN0LnRvQXJyYXkoKSk7XG4gICAgICAgIGNvbnN0IGNvbHNBcnJheSA9IFtdLmNvbmNhdC5hcHBseShbXSwgbmVzdGVkQ29sdW1ucyk7XG4gICAgICAgIGNvbnN0IGNvbExlbmd0aCA9IHRoaXMuY29sdW1ucy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHRvcENvbHMgPSB0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKChpdGVtKSA9PiBjb2xzQXJyYXkuaW5kZXhPZihpdGVtKSA9PT0gLTEpO1xuICAgICAgICBpZiAodG9wQ29scy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnModG9wQ29scyk7XG4gICAgICAgICAgICBpZiAocmVjYWxjQ29sU2l6ZXMgJiYgdGhpcy5jb2x1bW5zLmxlbmd0aCAhPT0gY29sTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkU2l6ZXMoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2xlYXJTZWxldGlvbkhpZ2hsaWdodHMoKSB7XG4gICAgICAgIFt0aGlzLnJvb3RHcmlkLCAuLi50aGlzLnJvb3RHcmlkLmdldENoaWxkR3JpZHModHJ1ZSldLmZvckVhY2goZ3JpZCA9PiB7XG4gICAgICAgICAgICBncmlkLnNlbGVjdGlvblNlcnZpY2UuY2xlYXIoKTtcbiAgICAgICAgICAgIGdyaWQuc2VsZWN0aW9uU2VydmljZS5hY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgIGdyaWQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdpZ3gtZ3JpZF9fdHItLWhpZ2hsaWdodGVkJyk7XG4gICAgICAgICAgICBncmlkLmhpZ2hsaWdodGVkUm93SUQgPSBudWxsO1xuICAgICAgICAgICAgZ3JpZC5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBoZ192ZXJ0aWNhbFNjcm9sbEhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zY3JvbGxQb3NpdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBoZ19ob3Jpem9udGFsU2Nyb2xsSGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxMZWZ0ID0gdGhpcy5oZWFkZXJDb250YWluZXIuc2Nyb2xsUG9zaXRpb247XG4gICAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX2hpZXJhcmNoaWNhbC1pbmRlbnRcIiBbbmdDbGFzc109XCJ7J2lneC1ncmlkX19oaWVyYXJjaGljYWwtaW5kZW50LS1zY3JvbGwnOiBwYXJlbnRIYXNTY3JvbGx9XCI+XG4gICAgPG5nLWNvbnRhaW5lciAjY29udGFpbmVyPjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iLCI8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtZ3JpZC10b29sYmFyXCI+PC9uZy1jb250ZW50PlxuPG5nLWNvbnRhaW5lciAjdG9vbGJhck91dGxldD48L25nLWNvbnRhaW5lcj5cblxuPGlneC1ncmlkLWhlYWRlci1yb3cgY2xhc3M9XCJpZ3gtZ3JpZC10aGVhZFwiIHRhYmluZGV4PVwiMFwiXG4gICAgW2dyaWRdPVwidGhpc1wiXG4gICAgW2hhc01STF09XCJoYXNDb2x1bW5MYXlvdXRzXCJcbiAgICBbYWN0aXZlRGVzY2VuZGFudF09XCJhY3RpdmVEZXNjZW5kYW50XCJcbiAgICBbd2lkdGhdPVwiY2FsY1dpZHRoXCJcbiAgICBbcGlubmVkQ29sdW1uQ29sbGVjdGlvbl09XCJwaW5uZWRDb2x1bW5zXCJcbiAgICBbdW5waW5uZWRDb2x1bW5Db2xsZWN0aW9uXT1cInVucGlubmVkQ29sdW1uc1wiXG4gICAgKGtleWRvd24ubWV0YS5jKT1cImNvcHlIYW5kbGVyKCRldmVudClcIlxuICAgIChrZXlkb3duLmNvbnRyb2wuYyk9XCJjb3B5SGFuZGxlcigkZXZlbnQpXCJcbiAgICAoY29weSk9XCJjb3B5SGFuZGxlcigkZXZlbnQpXCJcbiAgICAoa2V5ZG93bik9XCJuYXZpZ2F0aW9uLmhlYWRlck5hdmlnYXRpb24oJGV2ZW50KVwiXG4gICAgKGZvY3VzKT1cIm5hdmlnYXRpb24uZm9jdXNGaXJzdENlbGwoKVwiXG4+XG48L2lneC1ncmlkLWhlYWRlci1yb3c+XG5cbjxkaXYgaWd4R3JpZEJvZHkgKGtleWRvd24uY29udHJvbC5jKT1cImNvcHlIYW5kbGVyKCRldmVudClcIiAoY29weSk9XCJjb3B5SGFuZGxlcigkZXZlbnQpXCIgY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHlcIiByb2xlPVwicm93Z3JvdXBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Rib2R5LWNvbnRlbnRcIiAgdGFiaW5kZXg9XCIwXCIgKGZvY3VzKT1cIm5hdmlnYXRpb24uZm9jdXNUYm9keSgkZXZlbnQpXCJcbiAgICAgKGtleWRvd24pPVwibmF2aWdhdGlvbi5oYW5kbGVOYXZpZ2F0aW9uKCRldmVudClcIiAoZHJhZ1N0b3ApPVwic2VsZWN0aW9uU2VydmljZS5kcmFnTW9kZSA9ICRldmVudFwiXG4gICAgICAgIChkcmFnU2Nyb2xsKT1cImRyYWdTY3JvbGwoJGV2ZW50KVwiIFtpZ3hHcmlkRHJhZ1NlbGVjdF09XCJzZWxlY3Rpb25TZXJ2aWNlLmRyYWdNb2RlXCIgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImFjdGl2ZURlc2NlbmRhbnRcIiBbYXR0ci5yb2xlXT1cImRhdGFWaWV3Lmxlbmd0aCA/IG51bGwgOiAncm93J1wiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPSd0b3RhbEhlaWdodCcgW3N0eWxlLndpZHRoLnB4XT0nY2FsY1dpZHRoJyAjdGJvZHkgKHNjcm9sbCk9J3ByZXZlbnRDb250YWluZXJTY3JvbGwoJGV2ZW50KSc+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwibW92aW5nICYmIGNvbHVtbkluRHJhZyAmJiBwaW5uZWRDb2x1bW5zLmxlbmd0aCA8PSAwXCJcbiAgICAgICAgICAgIFtpZ3hDb2x1bW5Nb3ZpbmdEcm9wXT1cImhlYWRlckNvbnRhaW5lclwiIFthdHRyLmRyb3BwYWJsZV09XCJ0cnVlXCIgaWQ9XCJsZWZ0XCJcbiAgICAgICAgICAgIGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1vbi1kcmFnLWxlZnRcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwibW92aW5nICYmIGNvbHVtbkluRHJhZyAmJiBwaW5uZWRDb2x1bW5zLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgW2lneENvbHVtbk1vdmluZ0Ryb3BdPVwiaGVhZGVyQ29udGFpbmVyXCIgW2F0dHIuZHJvcHBhYmxlXT1cInRydWVcIiBpZD1cImxlZnRcIlxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctcGlubmVkXCIgW3N0eWxlLmxlZnQucHhdPVwicGlubmVkV2lkdGhcIj48L3NwYW4+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcGlubmVkUmVjb3Jkc1RlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGFcbiAgICAgICAgICAgIHwgZ3JpZFRyYW5zYWN0aW9uOmlkOnBpcGVUcmlnZ2VyXG4gICAgICAgICAgICB8IHZpc2libGVDb2x1bW5zOmhhc1Zpc2libGVDb2x1bW5zXG4gICAgICAgICAgICB8IGdyaWRBZGRSb3c6dHJ1ZTpwaXBlVHJpZ2dlclxuICAgICAgICAgICAgfCBncmlkUm93UGlubmluZzppZDp0cnVlOnBpcGVUcmlnZ2VyXG4gICAgICAgICAgICB8IGdyaWRGaWx0ZXJpbmc6ZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlOmZpbHRlclN0cmF0ZWd5OmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlOmlkOnBpcGVUcmlnZ2VyOmZpbHRlcmluZ1BpcGVUcmlnZ2VyOnRydWVcbiAgICAgICAgICAgIHwgZ3JpZFNvcnQ6c29ydGluZ0V4cHJlc3Npb25zOltdOnNvcnRTdHJhdGVneTppZDpwaXBlVHJpZ2dlcjp0cnVlIGFzIHBpbm5lZERhdGFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICNwaW5Db250YWluZXIgKm5nSWY9J3Bpbm5lZERhdGEubGVuZ3RoID4gMCcgY2xhc3M9J2lneC1ncmlkX190ci0tcGlubmVkJ1xuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpZ3gtZ3JpZF9fdHItLXBpbm5lZC1ib3R0b20nOiAgIWlzUm93UGlubmluZ1RvVG9wLCAnaWd4LWdyaWRfX3RyLS1waW5uZWQtdG9wJzogaXNSb3dQaW5uaW5nVG9Ub3AgfVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09J2NhbGNXaWR0aCc+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvd0RhdGEgb2YgcGlubmVkRGF0YTsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwaW5uZWRfaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZTsgY29udGV4dDogZ2V0Q29udGV4dChyb3dEYXRhLCByb3dJbmRleCwgdHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGFzUGlubmVkUmVjb3JkcyAmJiBpc1Jvd1Bpbm5pbmdUb1RvcCA/IHBpbm5lZFJlY29yZHNUZW1wbGF0ZSA6IG51bGxcIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hHcmlkRm9yIGxldC1yb3dEYXRhIGxldC1yb3dJbmRleD1cImluZGV4XCIgW2lneEdyaWRGb3JPZl09XCJkYXRhXG4gICAgICAgIHwgZ3JpZFRyYW5zYWN0aW9uOmlkOnBpcGVUcmlnZ2VyXG4gICAgICAgIHwgdmlzaWJsZUNvbHVtbnM6aGFzVmlzaWJsZUNvbHVtbnNcbiAgICAgICAgfCBncmlkRmlsdGVyaW5nOmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTpmaWx0ZXJTdHJhdGVneTphZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTppZDpwaXBlVHJpZ2dlcjpmaWx0ZXJpbmdQaXBlVHJpZ2dlclxuICAgICAgICB8IGdyaWRTb3J0OnNvcnRpbmdFeHByZXNzaW9uczpbXTpzb3J0U3RyYXRlZ3k6aWQ6cGlwZVRyaWdnZXJcbiAgICAgICAgfCBncmlkSGllcmFyY2hpY2FsUGFnaW5nOiEhcGFnaW5hdG9yOnBhZ2U6cGVyUGFnZTppZDpwaXBlVHJpZ2dlclxuICAgICAgICB8IGdyaWRIaWVyYXJjaGljYWw6ZXhwYW5zaW9uU3RhdGVzOmlkOnByaW1hcnlLZXk6Y2hpbGRMYXlvdXRLZXlzOnBpcGVUcmlnZ2VyXG4gICAgICAgIHwgZ3JpZEFkZFJvdzpmYWxzZTpwaXBlVHJpZ2dlclxuICAgICAgICB8IGdyaWRSb3dQaW5uaW5nOmlkOmZhbHNlOnBpcGVUcmlnZ2VyXCJcbiAgICAgICAgICAgIFtpZ3hGb3JTY3JvbGxPcmllbnRhdGlvbl09XCIndmVydGljYWwnXCIgW2lneEZvclNjcm9sbENvbnRhaW5lcl09J3ZlcnRpY2FsU2Nyb2xsJ1xuICAgICAgICAgICAgW2lneEZvckNvbnRhaW5lclNpemVdPSdjYWxjSGVpZ2h0JyBbaWd4Rm9ySXRlbVNpemVdPVwicmVuZGVyZWRSb3dIZWlnaHRcIiBbaWd4Rm9yVHJhY2tCeV09J3RyYWNrQ2hhbmdlcydcbiAgICAgICAgICAgICN2ZXJ0aWNhbFNjcm9sbENvbnRhaW5lciAoY2h1bmtQcmVsb2FkKT1cImRhdGFMb2FkaW5nKCRldmVudClcIiAoZGF0YUNoYW5naW5nKT1cImRhdGFSZWJpbmRpbmcoJGV2ZW50KVwiIChkYXRhQ2hhbmdlZCk9XCJkYXRhUmVib3VuZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICBbaWd4VGVtcGxhdGVPdXRsZXRdPScoaXNIaWVyYXJjaGljYWxSZWNvcmQocm93RGF0YSkgPyBoaWVyYXJjaGljYWxfcmVjb3JkX3RlbXBsYXRlIDogKGlzQ2hpbGRHcmlkUmVjb3JkKHJvd0RhdGEpID8gY2hpbGRfcmVjb3JkX3RlbXBsYXRlIDogaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZSkpJ1xuICAgICAgICAgICAgICAgIFtpZ3hUZW1wbGF0ZU91dGxldENvbnRleHRdPSdnZXRDb250ZXh0KHJvd0RhdGEsIHJvd0luZGV4LCBmYWxzZSknICh2aWV3Q3JlYXRlZCk9J3ZpZXdDcmVhdGVkSGFuZGxlcigkZXZlbnQpJ1xuICAgICAgICAgICAgICAgICh2aWV3TW92ZWQpPSd2aWV3TW92ZWRIYW5kbGVyKCRldmVudCknIChjYWNoZWRWaWV3TG9hZGVkKT0nY2FjaGVkVmlld0xvYWRlZCgkZXZlbnQpJz5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKmlneFRlbXBsYXRlT3V0bGV0PVwiKGlzSGllcmFyY2hpY2FsUmVjb3JkKHJvd0RhdGEpID8gaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZSA6IChpc0NoaWxkR3JpZFJlY29yZChyb3dEYXRhKSAmJiBpc0V4cGFuZGVkKHJvd0RhdGEpID8gY2hpbGRfcmVjb3JkX3RlbXBsYXRlIDogaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZSkpOyBjb250ZXh0OiBnZXRDb250ZXh0KHJvd0RhdGEpXCI+PC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2hpZXJhcmNoaWNhbF9yZWNvcmRfdGVtcGxhdGUgbGV0LXJvd0luZGV4PVwiaW5kZXhcIiBsZXQtZGlzYWJsZWRSb3c9XCJkaXNhYmxlZFwiIGxldC1yb3dEYXRhPlxuICAgICAgICAgICAgPGlneC1oaWVyYXJjaGljYWwtZ3JpZC1yb3cgW2dyaWRJRF09XCJpZFwiIFtpbmRleF09XCJyb3dJbmRleFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFJvd1wiIFtkYXRhXT1cInJvd0RhdGFcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0NsYXNzZXMgfCBpZ3hHcmlkUm93Q2xhc3Nlczpyb3c6cm93LmluRWRpdE1vZGU6cm93LnNlbGVjdGVkOnJvdy5kaXJ0eTpyb3cuZGVsZXRlZDpyb3cuZHJhZ2dpbmc6cm93SW5kZXg6aGFzQ29sdW1uTGF5b3V0czpmYWxzZTpyb3dEYXRhOnBpcGVUcmlnZ2VyXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJyb3dTdHlsZXMgfCBpZ3hHcmlkUm93U3R5bGVzOnJvd0RhdGE6cm93SW5kZXg6cGlwZVRyaWdnZXJcIiAjcm93PlxuICAgICAgICAgICAgPC9pZ3gtaGllcmFyY2hpY2FsLWdyaWQtcm93PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcGlubmVkX2hpZXJhcmNoaWNhbF9yZWNvcmRfdGVtcGxhdGUgbGV0LXJvd0luZGV4PVwiaW5kZXhcIiBsZXQtcm93RGF0YT5cbiAgICAgICAgICAgIDxpZ3gtaGllcmFyY2hpY2FsLWdyaWQtcm93IFtncmlkSURdPVwiaWRcIiBbaW5kZXhdPVwicm93SW5kZXhcIiBbZGF0YV09XCJyb3dEYXRhXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dDbGFzc2VzIHwgaWd4R3JpZFJvd0NsYXNzZXM6cm93OnJvdy5pbkVkaXRNb2RlOnJvdy5zZWxlY3RlZDpyb3cuZGlydHk6cm93LmRlbGV0ZWQ6cm93LmRyYWdnaW5nOnJvd0luZGV4Omhhc0NvbHVtbkxheW91dHM6ZmFsc2U6cm93RGF0YTpwaXBlVHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwicm93U3R5bGVzIHwgaWd4R3JpZFJvd1N0eWxlczpyb3dEYXRhOnJvd0luZGV4OnBpcGVUcmlnZ2VyXCIgI3JvdyAjcGlubmVkUm93PlxuICAgICAgICAgICAgPC9pZ3gtaGllcmFyY2hpY2FsLWdyaWQtcm93PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2NoaWxkX3JlY29yZF90ZW1wbGF0ZSBsZXQtcm93SW5kZXg9XCJpbmRleFwiIGxldC1yb3dEYXRhPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm92ZXJmbG93OiBhdXRvOyB3aWR0aDogMTAwJTtcIiBbYXR0ci5kYXRhLXJvd2luZGV4XT0ncm93SW5kZXgnIChzY3JvbGwpPSdvbkNvbnRhaW5lclNjcm9sbCgpJ1xuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAnaWd4LWdyaWRfX3RyLWNvbnRhaW5lcic6IHRydWUsXG4gICAgICAgICAgICAgICAgJ2lneC1ncmlkX190ci0taGlnaGxpZ2h0ZWQnOmlzUm93SGlnaGxpZ2h0ZWQocm93RGF0YSlcbiAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICA8aWd4LWNoaWxkLWdyaWQtcm93ICpuZ0Zvcj1cImxldCBsYXlvdXQgb2YgY2hpbGRMYXlvdXRMaXN0XCIgW3BhcmVudEdyaWRJRF09XCJpZFwiIFtpbmRleF09XCJyb3dJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cInJvd0RhdGFcIiBbbGF5b3V0XT0nbGF5b3V0JyAjcm93PlxuICAgICAgICAgICAgICAgIDwvaWd4LWNoaWxkLWdyaWQtcm93PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoYXNQaW5uZWRSZWNvcmRzICYmICFpc1Jvd1Bpbm5pbmdUb1RvcCA/IHBpbm5lZFJlY29yZHNUZW1wbGF0ZSA6IG51bGxcIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIm1vdmluZyAmJiBjb2x1bW5JbkRyYWdcIiBbaWd4Q29sdW1uTW92aW5nRHJvcF09XCJoZWFkZXJDb250YWluZXJcIiBbYXR0ci5kcm9wcGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBpZD1cInJpZ2h0XCIgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctcmlnaHRcIj48L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fcm93LWVkaXRpbmctb3V0bGV0XCIgaWd4T3ZlcmxheU91dGxldCAjaWd4Um93RWRpdGluZ092ZXJsYXlPdXRsZXQ+PC9kaXY+XG4gICAgICAgIDxpZ2MtdHJpYWwtd2F0ZXJtYXJrICpuZ0lmPVwiIXRoaXMucGFyZW50XCI+PC9pZ2MtdHJpYWwtd2F0ZXJtYXJrPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWd4VG9nZ2xlICNsb2FkaW5nT3ZlcmxheT5cbiAgICAgICAgPGlneC1jaXJjdWxhci1iYXIgW2luZGV0ZXJtaW5hdGVdPVwidHJ1ZVwiICpuZ0lmPSdzaG91bGRPdmVybGF5TG9hZGluZyc+XG4gICAgICAgIDwvaWd4LWNpcmN1bGFyLWJhcj5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiAqbmdJZj1cIm1vdmluZyAmJiBjb2x1bW5JbkRyYWdcIiBbaWd4Q29sdW1uTW92aW5nRHJvcF09XCJoZWFkZXJDb250YWluZXJcIiBbYXR0ci5kcm9wcGFibGVdPVwidHJ1ZVwiXG4gICAgICAgIGlkPVwicmlnaHRcIiBjbGFzcz1cImlneC1ncmlkX19zY3JvbGwtb24tZHJhZy1yaWdodFwiPjwvc3Bhbj5cbiAgICA8ZGl2IFtoaWRkZW5dPSchaGFzVmVydGljYWxTY3JvbGwoKScgY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktc2Nyb2xsYmFyXCIgW3N0eWxlLndpZHRoLnB4XT1cInNjcm9sbFNpemVcIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1zY3JvbGxiYXItc3RhcnRcIiBbc3R5bGUuaGVpZ2h0LnB4XT0nIGlzUm93UGlubmluZ1RvVG9wID8gcGlubmVkUm93SGVpZ2h0IDogMCc+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktc2Nyb2xsYmFyLW1haW5cIiBbc3R5bGUuaGVpZ2h0LnB4XT0nY2FsY0hlaWdodCc+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgaWd4R3JpZEZvciBbaWd4R3JpZEZvck9mXT0nW10nICN2ZXJ0aWNhbFNjcm9sbEhvbGRlcj48L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1zY3JvbGxiYXItZW5kXCIgW3N0eWxlLmhlaWdodC5weF09JyFpc1Jvd1Bpbm5pbmdUb1RvcCA/IHBpbm5lZFJvd0hlaWdodCA6IDAnPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fYWRkcm93LXNuYWNrYmFyXCI+XG4gICAgICAgIDxpZ3gtc25hY2tiYXIgI2FkZFJvd1NuYWNrYmFyIFtvdXRsZXRdPVwiaWd4Qm9keU92ZXJsYXlPdXRsZXRcIiBbYWN0aW9uVGV4dF09XCJyZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfc25hY2tiYXJfYWRkcm93X2FjdGlvbnRleHRcIiBbZGlzcGxheVRpbWVdPSdzbmFja2JhckRpc3BsYXlUaW1lJz57e3Jlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9zbmFja2Jhcl9hZGRyb3dfbGFiZWx9fTwvaWd4LXNuYWNrYmFyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBpZ3hPdmVybGF5T3V0bGV0ICNpZ3hCb2R5T3ZlcmxheU91dGxldD1cIm92ZXJsYXktb3V0bGV0XCI+PC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImlneC1ncmlkX190Zm9vdFwiIHJvbGU9XCJyb3dncm91cFwiIFtzdHlsZS5oZWlnaHQucHhdPSdzdW1tYXJ5Um93SGVpZ2h0JyAjdGZvb3Q+XG4gICAgPGRpdiB0YWJpbmRleD1cIjBcIiAoZm9jdXMpPVwibmF2aWdhdGlvbi5mb2N1c0ZpcnN0Q2VsbChmYWxzZSlcIiBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiYWN0aXZlRGVzY2VuZGFudFwiXG4gICAgIChrZXlkb3duKT1cIm5hdmlnYXRpb24uc3VtbWFyeU5hdigkZXZlbnQpXCI+XG4gICAgICAgIDxpZ3gtZ3JpZC1zdW1tYXJ5LXJvdyBbc3R5bGUud2lkdGgucHhdPSdjYWxjV2lkdGgnIFtzdHlsZS5oZWlnaHQucHhdPSdzdW1tYXJ5Um93SGVpZ2h0J1xuICAgICAgICAgICAgKm5nSWY9XCJoYXNTdW1tYXJpemVkQ29sdW1ucyAmJiByb290U3VtbWFyaWVzRW5hYmxlZFwiIFtncmlkSURdPVwiaWRcIiByb2xlPVwicm93XCJcbiAgICAgICAgICAgIFtzdW1tYXJpZXNdPVwiaWQgfCBpZ3hHcmlkU3VtbWFyeURhdGFQaXBlOnN1bW1hcnlTZXJ2aWNlLnJldHJpZ2dlclJvb3RQaXBlXCIgW2luZGV4XT1cImRhdGFWaWV3Lmxlbmd0aFwiXG4gICAgICAgICAgICBjbGFzcz1cImlneC1ncmlkX19zdW1tYXJpZXNcIiAjc3VtbWFyeVJvdz5cbiAgICAgICAgPC9pZ3gtZ3JpZC1zdW1tYXJ5LXJvdz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190Zm9vdC10aHVtYlwiIFtoaWRkZW5dPSchaGFzVmVydGljYWxTY3JvbGwoKScgW3N0eWxlLmhlaWdodC5weF09J3N1bW1hcnlSb3dIZWlnaHQnXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwic2Nyb2xsU2l6ZVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsXCIgW3N0eWxlLmhlaWdodC5weF09XCJzY3JvbGxTaXplXCIgI3NjciBbaGlkZGVuXT1cImlzSG9yaXpvbnRhbFNjcm9sbEhpZGRlblwiICAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1zdGFydFwiIFtzdHlsZS53aWR0aC5weF09J2lzUGlubmluZ1RvU3RhcnQgPyBwaW5uZWRXaWR0aCA6IGhlYWRlckZlYXR1cmVzV2lkdGgnIFtzdHlsZS5taW4td2lkdGgucHhdPSdpc1Bpbm5pbmdUb1N0YXJ0ID8gcGlubmVkV2lkdGggOiBoZWFkZXJGZWF0dXJlc1dpZHRoJz48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1tYWluXCIgW3N0eWxlLndpZHRoLnB4XT0ndW5waW5uZWRXaWR0aCc+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hHcmlkRm9yIFtpZ3hHcmlkRm9yT2ZdPSdbXScgI3Njcm9sbENvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1lbmRcIiBbc3R5bGUuZmxvYXRdPSdcInJpZ2h0XCInIFtzdHlsZS53aWR0aC5weF09J3Bpbm5lZFdpZHRoJyBbc3R5bGUubWluLXdpZHRoLnB4XT0ncGlubmVkV2lkdGgnIFtoaWRkZW5dPVwicGlubmVkV2lkdGggPT09IDAgfHwgaXNQaW5uaW5nVG9TdGFydFwiPjwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fZm9vdGVyXCIgI2Zvb3Rlcj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtZ3JpZC1mb290ZXJcIj48L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXBhZ2luYXRvclwiPjwvbmctY29udGVudD5cbiAgICA8bmctY29udGFpbmVyICNwYWdpbmF0b3JPdXRsZXQ+PC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNlbXB0eUZpbHRlcmVkR3JpZD5cbiAgICA8c3BhbiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1tZXNzYWdlXCIgcm9sZT1cImNlbGxcIj5cbiAgICAgICAgPHNwYW4+e3tlbXB0eUZpbHRlcmVkR3JpZE1lc3NhZ2V9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nSWY9J3Nob3dBZGRCdXR0b24nPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD0nYWRkUm93RW1wdHlUZW1wbGF0ZSB8fCBkZWZhdWx0QWRkUm93RW1wdHlUZW1wbGF0ZSc+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRFbXB0eUdyaWQ+XG4gICAgPHNwYW4gY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktbWVzc2FnZVwiIHJvbGU9XCJjZWxsXCI+XG4gICAgICAgIDxzcGFuPnt7ZW1wdHlHcmlkTWVzc2FnZX19PC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj0nc2hvd0FkZEJ1dHRvbic+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PSdhZGRSb3dFbXB0eVRlbXBsYXRlIHx8IGRlZmF1bHRBZGRSb3dFbXB0eVRlbXBsYXRlJz48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEFkZFJvd0VtcHR5VGVtcGxhdGU+XG4gICAgPGJ1dHRvbiBpZ3hCdXR0b249XCJyYWlzZWRcIiBpZ3hSaXBwbGUgKGNsaWNrKT1cInRoaXMuY3J1ZFNlcnZpY2UuZW50ZXJBZGRSb3dNb2RlKG51bGwsIGZhbHNlLCAkZXZlbnQpXCI+XG4gICAgICAgIHt7cmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2FkZF9yb3dfbGFiZWx9fVxuICAgIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0TG9hZGluZ0dyaWQ+XG4gICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX19sb2FkaW5nXCI+XG4gICAgICAgIDxpZ3gtY2lyY3VsYXItYmFyIFtpbmRldGVybWluYXRlXT1cInRydWVcIj5cbiAgICAgICAgPC9pZ3gtY2lyY3VsYXItYmFyPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0Q29sbGFwc2VkVGVtcGxhdGU+XG4gICAgPGlneC1pY29uIHJvbGU9XCJidXR0b25cIj51bmZvbGRfbW9yZTwvaWd4LWljb24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRFeHBhbmRlZFRlbXBsYXRlPlxuICAgIDxpZ3gtaWNvbiByb2xlPVwiYnV0dG9uXCIgW2FjdGl2ZV09J2hhc0V4cGFuZGVkUmVjb3JkcygpICYmIGhhc0V4cGFuZGFibGVDaGlsZHJlbic+dW5mb2xkX2xlc3M8L2lneC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiAqbmdJZj1cInJvd0VkaXRhYmxlXCIgaWd4VG9nZ2xlICNyb3dFZGl0aW5nT3ZlcmxheT5cbiAgICA8ZGl2IFtjbGFzc05hbWVdPVwiYmFubmVyQ2xhc3NcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZXNvbHZlUm93RWRpdENvbnRhaW5lcjsgY29udGV4dDogeyByb3dDaGFuZ2VzQ291bnQ6IHJvd0NoYW5nZXNDb3VudCwgZW5kRWRpdDogdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0LmJpbmQodGhpcykgfVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPG5nLXRlbXBsYXRlICNkZWZhdWx0Um93RWRpdFRleHQ+XG4gICAgWW91IGhhdmUge3sgcm93Q2hhbmdlc0NvdW50IH19IGNoYW5nZXMgaW4gdGhpcyByb3cgYW5kIHt7IGhpZGRlbkNvbHVtbnNDb3VudCB9fSBoaWRkZW4gY29sdW1uc1xuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJvd0VkaXRBY3Rpb25zPlxuICAgIDxidXR0b24gaWd4QnV0dG9uIGlneFJvd0VkaXRUYWJTdG9wIChjbGljayk9XCJ0aGlzLmVuZFJvd0VkaXRUYWJTdG9wKGZhbHNlLCAkZXZlbnQpXCI+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfcm93X2VkaXRfYnRuX2NhbmNlbCB9fTwvYnV0dG9uPlxuICAgIDxidXR0b24gaWd4QnV0dG9uIGlneFJvd0VkaXRUYWJTdG9wIChjbGljayk9XCJ0aGlzLmVuZFJvd0VkaXRUYWJTdG9wKHRydWUsICRldmVudClcIj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9yb3dfZWRpdF9idG5fZG9uZSB9fTwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJvd0VkaXRUZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWJhbm5lcl9fbWVzc2FnZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImlneC1iYW5uZXJfX3RleHRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRoaXMuY3J1ZFNlcnZpY2Uucm93Py5nZXRDbGFzc05hbWUoKSA9PT0gJ0lneEFkZFJvdycgPyByb3dBZGRUZXh0VGVtcGxhdGUgOiByZXNvbHZlUm93RWRpdFRleHQgfHwgZGVmYXVsdFJvd0VkaXRUZXh0O1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgJGltcGxpY2l0OiB0aGlzLmNydWRTZXJ2aWNlLnJvdz8uZ2V0Q2xhc3NOYW1lKCkgIT09ICdJZ3hBZGRSb3cnID8gcm93Q2hhbmdlc0NvdW50IDogbnVsbCB9XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtYmFubmVyX19hY3Rpb25zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtYmFubmVyX19yb3dcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInJlc29sdmVSb3dFZGl0QWN0aW9ucyB8fCBkZWZhdWx0Um93RWRpdEFjdGlvbnM7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB0aGlzLmVuZEVkaXQuYmluZCh0aGlzKSB9XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RyYWdJbmRpY2F0b3JJY29uQmFzZT5cbiAgICA8aWd4LWljb24+ZHJhZ19pbmRpY2F0b3I8L2lneC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGlneC1ncmlkLWNvbHVtbi1yZXNpemVyICpuZ0lmPVwiY29sUmVzaXppbmdTZXJ2aWNlLnNob3dSZXNpemVyXCI+PC9pZ3gtZ3JpZC1jb2x1bW4tcmVzaXplcj5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fbG9hZGluZy1vdXRsZXRcIiAjaWd4TG9hZGluZ092ZXJsYXlPdXRsZXQgaWd4T3ZlcmxheU91dGxldD48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fb3V0bGV0XCIgI2lneEZpbHRlcmluZ092ZXJsYXlPdXRsZXQgaWd4T3ZlcmxheU91dGxldD48L2Rpdj5cbiJdfQ==
1019
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2hpY2FsLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2dyaWRzL2hpZXJhcmNoaWNhbC1ncmlkL2hpZXJhcmNoaWNhbC1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9oaWVyYXJjaGljYWwtZ3JpZC9jaGlsZC1ncmlkLXJvdy5jb21wb25lbnQuaHRtbCIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9oaWVyYXJjaGljYWwtZ3JpZC9oaWVyYXJjaGljYWwtZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUdmLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUlMLG9CQUFvQixFQUVwQixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFMUUsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixD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QUUsV0FBVyxFQUFFLEtBQUssRUFBRTtnQkFPcEYsYUFBYTtzQkFEbkIsZUFBZTt1QkFBQyxxQkFBcUIsRUFBRSxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQUluRixlQUFlO3NCQURyQixZQUFZO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUtuRSxhQUFhO3NCQURuQixlQUFlO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFJdEQsYUFBYTtzQkFEbkIsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBSS9DLGVBQWU7c0JBRHJCLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBTWpELGVBQWU7c0JBRHJCLFlBQVk7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUU7Z0JBT3ZFLGdCQUFnQjtzQkFEdEIsWUFBWTt1QkFBQyx3QkFBd0I7Z0JBSTVCLDBCQUEwQjtzQkFEbkMsU0FBUzt1QkFBQyw4QkFBOEIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJcEUsYUFBYTtzQkFEdEIsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFtRDVELEVBQUU7c0JBRlosV0FBVzt1QkFBQyxTQUFTOztzQkFDckIsS0FBSztnQkFpQkssSUFBSTtzQkFEZCxLQUFLO2dCQTBFSyxjQUFjO3NCQUR4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRG9DaGVjayxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICByZWZsZWN0Q29tcG9uZW50VHlwZSxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElneEhpZXJhcmNoaWNhbEdyaWRBUElTZXJ2aWNlIH0gZnJvbSAnLi9oaWVyYXJjaGljYWwtZ3JpZC1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hSb3dJc2xhbmRDb21wb25lbnQgfSBmcm9tICcuL3Jvdy1pc2xhbmQuY29tcG9uZW50JztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi9maWx0ZXJpbmcvZ3JpZC1maWx0ZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQsIH0gZnJvbSAnLi4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElneEhpZXJhcmNoaWNhbEdyaWROYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vaGllcmFyY2hpY2FsLWdyaWQtbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRTdW1tYXJ5U2VydmljZSB9IGZyb20gJy4uL3N1bW1hcmllcy9ncmlkLXN1bW1hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hIaWVyYXJjaGljYWxHcmlkQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4vaGllcmFyY2hpY2FsLWdyaWQtYmFzZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3RlbXBsYXRlLW91dGxldC90ZW1wbGF0ZV9vdXRsZXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VsZWN0aW9uL3NlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneEZvck9mU3luY1NlcnZpY2UsIElneEZvck9mU2Nyb2xsU3luY1NlcnZpY2UgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2Zvci1vZi9mb3Jfb2Yuc3luYy5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxUeXBlLCBHcmlkVHlwZSwgSUdYX0dSSURfQkFTRSwgSUdYX0dSSURfU0VSVklDRV9CQVNFLCBSb3dUeXBlIH0gZnJvbSAnLi4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElneFJvd0lzbGFuZEFQSVNlcnZpY2UgfSBmcm9tICcuL3Jvdy1pc2xhbmQtYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZFRvb2xiYXJEaXJlY3RpdmUsIElneEdyaWRUb29sYmFyVGVtcGxhdGVDb250ZXh0IH0gZnJvbSAnLi4vdG9vbGJhci9jb21tb24nO1xuaW1wb3J0IHsgSWd4R3JpZENSVURTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL2NydWQuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hIaWVyYXJjaGljYWxHcmlkUm93IH0gZnJvbSAnLi4vZ3JpZC1wdWJsaWMtcm93JztcbmltcG9ydCB7IElneEdyaWRDZWxsIH0gZnJvbSAnLi4vZ3JpZC1wdWJsaWMtY2VsbCc7XG5pbXBvcnQgeyBJZ3hQYWdpbmF0b3JDb21wb25lbnQgfSBmcm9tICcuLi8uLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3JpZC9ncmlkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy90b2dnbGUvdG9nZ2xlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5SZXNpemluZ1NlcnZpY2UgfSBmcm9tICcuLi9yZXNpemluZy9yZXNpemluZy5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50IH0gZnJvbSAnLi4vZmlsdGVyaW5nL2V4Y2VsLXN0eWxlL2dyaWQuZXhjZWwtc3R5bGUtZmlsdGVyaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9ncmlkL2dyaWQtdmFsaWRhdGlvbi5zZXJ2aWNlJztcblxubGV0IE5FWFRfSUQgPSAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhpZXJhcmNoaWNhbFN0YXRlUmVjb3JkIHtcbiAgICByb3dJRDogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzZWxlY3RvcjogJ2lneC1jaGlsZC1ncmlkLXJvdycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NoaWxkLWdyaWQtcm93LmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgSWd4Q2hpbGRHcmlkUm93Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0IHtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsYXlvdXQ6IElneFJvd0lzbGFuZENvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcmVudEhhc1Njcm9sbCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnBhcmVudEdyaWQudmVydGljYWxTY3JvbGxDb250YWluZXIuZGMuaW5zdGFuY2Uubm90VmlydHVhbDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwYXJlbnRHcmlkSUQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqICBUaGUgZGF0YSBwYXNzZWQgdG8gdGhlIHJvdyBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0IHRoZSByb3cgZGF0YSBmb3IgdGhlIGZpcnN0IHNlbGVjdGVkIHJvd1xuICAgICAqIGxldCBzZWxlY3RlZFJvd0RhdGEgPSB0aGlzLmdyaWQuc2VsZWN0ZWRSb3dzWzBdLmRhdGE7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRhdGEoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEgfHwgW107XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBkYXRhKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5oR3JpZCkge1xuICAgICAgICAgICAgdGhpcy5oR3JpZC5kYXRhID0gdGhpcy5fZGF0YS5jaGlsZEdyaWRzRGF0YVt0aGlzLmxheW91dC5rZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgcm93LlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldCB0aGUgaW5kZXggb2YgdGhlIHNlY29uZCBzZWxlY3RlZCByb3dcbiAgICAgKiBsZXQgc2VsZWN0ZWRSb3dJbmRleCA9IHRoaXMuZ3JpZC5zZWxlY3RlZFJvd3NbMV0uaW5kZXg7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaW5kZXg6IG51bWJlcjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHtyZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWV9KVxuICAgIHB1YmxpYyBjb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGhHcmlkOiBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBncmlkIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHJvdy5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBoYW5kbGVSb3dTZWxlY3Rpb24oZXZlbnQpIHtcbiAgICAgKiAgLy8gdGhlIGdyaWQgb24gd2hpY2ggdGhlIHJvd1NlbGVjdGVkIGV2ZW50IHdhcyB0cmlnZ2VyZWRcbiAgICAgKiAgY29uc3QgZ3JpZCA9IGV2ZW50LnJvdy5ncmlkO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1ncmlkXG4gICAgICogICAgW2RhdGFdPVwiZGF0YVwiXG4gICAgICogICAgKHJvd1NlbGVjdGVkKT1cImhhbmRsZVJvd1NlbGVjdGlvbigkZXZlbnQpXCI+XG4gICAgICogIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgLy8gVE9ETzogUmVmYWN0b3JcbiAgICBwdWJsaWMgZ2V0IHBhcmVudEdyaWQoKTogSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuZ3JpZCBhcyBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50O1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWxldmVsJylcbiAgICBwdWJsaWMgZ2V0IGxldmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXQubGV2ZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG5hdGl2ZSBET00gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIHJvdy4gQ291bGQgYmUgbnVsbCBpbiBjZXJ0YWluIGVudmlyb25tZW50cy5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXQgdGhlIG5hdGl2ZUVsZW1lbnQgb2YgdGhlIHNlY29uZCBzZWxlY3RlZCByb3dcbiAgICAgKiBsZXQgc2VsZWN0ZWRSb3dOYXRpdmVFbGVtZW50ID0gdGhpcy5ncmlkLnNlbGVjdGVkUm93c1sxXS5uYXRpdmVFbGVtZW50O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcm93IGlzIGV4cGFuZGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBSb3dFeHBhbmRlZCA9IHRoaXMuZ3JpZDEucm93TGlzdC5maXJzdC5leHBhbmRlZDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwYW5kZWQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgX2RhdGE6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KElHWF9HUklEX1NFUlZJQ0VfQkFTRSkgcHVibGljIGdyaWRBUEk6IElneEhpZXJhcmNoaWNhbEdyaWRBUElTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50LCB7IGluamVjdG9yOiB0aGlzLmNvbnRhaW5lci5pbmplY3RvciB9KTtcbiAgICAgICAgdGhpcy5oR3JpZCA9IHJlZi5pbnN0YW5jZTtcbiAgICAgICAgdGhpcy5oR3JpZC5kYXRhID0gdGhpcy5kYXRhLmNoaWxkR3JpZHNEYXRhW3RoaXMubGF5b3V0LmtleV07XG4gICAgICAgIHRoaXMubGF5b3V0LmxheW91dENoYW5nZS5zdWJzY3JpYmUoKGNoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVMYXlvdXRDaGFuZ2VzKGNoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLmxheW91dC5pbml0aWFsQ2hhbmdlcztcbiAgICAgICAgY2hhbmdlcy5mb3JFYWNoKGNoYW5nZSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVMYXlvdXRDaGFuZ2VzKGNoYW5nZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmhHcmlkLnBhcmVudCA9IHRoaXMucGFyZW50R3JpZDtcbiAgICAgICAgdGhpcy5oR3JpZC5wYXJlbnRJc2xhbmQgPSB0aGlzLmxheW91dDtcbiAgICAgICAgdGhpcy5oR3JpZC5jaGlsZFJvdyA9IHRoaXM7XG4gICAgICAgIC8vIGhhbmRsZXIgbG9naWMgdGhhdCByZS1lbWl0cyBoZ3JpZCBldmVudHMgb24gdGhlIHJvdyBpc2xhbmRcbiAgICAgICAgdGhpcy5zZXR1cEV2ZW50RW1pdHRlcnMoKTtcbiAgICAgICAgdGhpcy5sYXlvdXQuZ3JpZENyZWF0ZWQuZW1pdCh7XG4gICAgICAgICAgICBvd25lcjogdGhpcy5sYXlvdXQsXG4gICAgICAgICAgICBwYXJlbnRJRDogdGhpcy5kYXRhLnJvd0lELFxuICAgICAgICAgICAgZ3JpZDogdGhpcy5oR3JpZFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5oR3JpZC5jaGlsZExheW91dExpc3QgPSB0aGlzLmxheW91dC5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgbGF5b3V0cyA9IHRoaXMuaEdyaWQuY2hpbGRMYXlvdXRMaXN0LnRvQXJyYXkoKTtcbiAgICAgICAgbGF5b3V0cy5mb3JFYWNoKChsKSA9PiB0aGlzLmhHcmlkLmdyaWRBUEkucmVnaXN0ZXJDaGlsZFJvd0lzbGFuZChsKSk7XG4gICAgICAgIHRoaXMucGFyZW50R3JpZC5ncmlkQVBJLnJlZ2lzdGVyQ2hpbGRHcmlkKHRoaXMuZGF0YS5yb3dJRCwgdGhpcy5sYXlvdXQua2V5LCB0aGlzLmhHcmlkKTtcbiAgICAgICAgdGhpcy5sYXlvdXQucm93SXNsYW5kQVBJLnJlZ2lzdGVyQ2hpbGRHcmlkKHRoaXMuZGF0YS5yb3dJRCwgdGhpcy5oR3JpZCk7XG5cbiAgICAgICAgdGhpcy5sYXlvdXQuZ3JpZEluaXRpYWxpemVkLmVtaXQoe1xuICAgICAgICAgICAgb3duZXI6IHRoaXMubGF5b3V0LFxuICAgICAgICAgICAgcGFyZW50SUQ6IHRoaXMuZGF0YS5yb3dJRCxcbiAgICAgICAgICAgIGdyaWQ6IHRoaXMuaEdyaWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5oR3JpZC5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBFdmVudEVtaXR0ZXJzKCkge1xuICAgICAgICBjb25zdCBkZXN0cnVjdG9yID0gdGFrZVVudGlsKHRoaXMuaEdyaWQuZGVzdHJveSQpO1xuXG4gICAgICAgIGNvbnN0IG1pcnJvciA9IHJlZmxlY3RDb21wb25lbnRUeXBlKElneEdyaWRDb21wb25lbnQpO1xuICAgICAgICAvLyBleGNsdWRlIG91dHB1dHMgcmVsYXRlZCB0byB0d28td2F5IGJpbmRpbmcgZnVuY3Rpb25hbGl0eVxuICAgICAgICBjb25zdCBpbnB1dE5hbWVzID0gbWlycm9yLmlucHV0cy5tYXAoaW5wdXQgPT4gaW5wdXQucHJvcE5hbWUpO1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gbWlycm9yLm91dHB1dHMuZmlsdGVyKG8gPT4ge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdJbnB1dFByb3BOYW1lID0gby5wcm9wTmFtZS5zbGljZSgwLCBvLnByb3BOYW1lLmluZGV4T2YoJ0NoYW5nZScpKTtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dE5hbWVzLmluZGV4T2YobWF0Y2hpbmdJbnB1dFByb3BOYW1lKSA9PT0gLTE7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRPRE86IFNraXAgdGhlIGByZW5kZXJlZGAgb3V0cHV0LiBSZW5kZXJlZCBzaG91bGQgYmUgY2FsbGVkIG9uY2UgcGVyIGdyaWQuXG4gICAgICAgIG91dHB1dHMuZmlsdGVyKG8gPT4gby5wcm9wTmFtZSAhPT0gJ3JlbmRlcmVkJykuZm9yRWFjaChvdXRwdXQgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaEdyaWRbb3V0cHV0LnByb3BOYW1lXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaEdyaWRbb3V0cHV0LnByb3BOYW1lXS5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmdzLm93bmVyID0gdGhpcy5oR3JpZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRbb3V0cHV0LnByb3BOYW1lXS5lbWl0KGFyZ3MpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgX2hhbmRsZUxheW91dENoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGNoYW5nZSBpbiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShjaGFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oR3JpZFtjaGFuZ2VdID0gY2hhbmdlc1tjaGFuZ2VdLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzZWxlY3RvcjogJ2lneC1oaWVyYXJjaGljYWwtZ3JpZCcsXG4gICAgdGVtcGxhdGVVcmw6ICdoaWVyYXJjaGljYWwtZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIElneEdyaWRDUlVEU2VydmljZSxcbiAgICAgICAgSWd4R3JpZFZhbGlkYXRpb25TZXJ2aWNlLFxuICAgICAgICBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgeyBwcm92aWRlOiBJR1hfR1JJRF9TRVJWSUNFX0JBU0UsIHVzZUNsYXNzOiBJZ3hIaWVyYXJjaGljYWxHcmlkQVBJU2VydmljZSB9LFxuICAgICAgICB7IHByb3ZpZGU6IElHWF9HUklEX0JBU0UsIHVzZUV4aXN0aW5nOiBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50IH0sXG4gICAgICAgIElneEdyaWRTdW1tYXJ5U2VydmljZSxcbiAgICAgICAgSWd4RmlsdGVyaW5nU2VydmljZSxcbiAgICAgICAgSWd4SGllcmFyY2hpY2FsR3JpZE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICBJZ3hDb2x1bW5SZXNpemluZ1NlcnZpY2UsXG4gICAgICAgIElneEZvck9mU3luY1NlcnZpY2UsXG4gICAgICAgIElneEZvck9mU2Nyb2xsU3luY1NlcnZpY2UsXG4gICAgICAgIElneFJvd0lzbGFuZEFQSVNlcnZpY2VcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnQgZXh0ZW5kcyBJZ3hIaWVyYXJjaGljYWxHcmlkQmFzZURpcmVjdGl2ZVxuICAgIGltcGxlbWVudHMgR3JpZFR5cGUsIEFmdGVyVmlld0luaXQsIEFmdGVyQ29udGVudEluaXQsIE9uSW5pdCwgT25EZXN0cm95LCBEb0NoZWNrIHtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyByb2xlID0gJ2dyaWQnO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93SXNsYW5kQ29tcG9uZW50LCB7IHJlYWQ6IElneFJvd0lzbGFuZENvbXBvbmVudCwgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gICAgcHVibGljIGNoaWxkTGF5b3V0TGlzdDogUXVlcnlMaXN0PElneFJvd0lzbGFuZENvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dJc2xhbmRDb21wb25lbnQsIHsgcmVhZDogSWd4Um93SXNsYW5kQ29tcG9uZW50LCBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICAgIHB1YmxpYyBhbGxMYXlvdXRMaXN0OiBRdWVyeUxpc3Q8SWd4Um93SXNsYW5kQ29tcG9uZW50PjtcblxuICAgIEBDb250ZW50Q2hpbGQoSWd4R3JpZFRvb2xiYXJEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB0b29sYmFyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRUb29sYmFyVGVtcGxhdGVDb250ZXh0PjtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4UGFnaW5hdG9yQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gICAgcHVibGljIHBhZ2luYXRvckxpc3Q6IFF1ZXJ5TGlzdDxJZ3hQYWdpbmF0b3JDb21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgndG9vbGJhck91dGxldCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICAgIHB1YmxpYyB0b29sYmFyT3V0bGV0OiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgQFZpZXdDaGlsZCgncGFnaW5hdG9yT3V0bGV0JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gICAgcHVibGljIHBhZ2luYXRvck91dGxldDogVmlld0NvbnRhaW5lclJlZjtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSwgeyByZWFkOiBJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSB9KVxuICAgIHB1YmxpYyB0ZW1wbGF0ZU91dGxldHM6IFF1ZXJ5TGlzdDxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4Q2hpbGRHcmlkUm93Q29tcG9uZW50KVxuICAgIHB1YmxpYyBoaWVyYXJjaGljYWxSb3dzOiBRdWVyeUxpc3Q8SWd4Q2hpbGRHcmlkUm93Q29tcG9uZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2hpZXJhcmNoaWNhbF9yZWNvcmRfdGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgaGllcmFyY2hpY2FsUmVjb3JkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdjaGlsZF9yZWNvcmRfdGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgY2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8vIEBWaWV3Q2hpbGQoJ2hlYWRlckhpZXJhcmNoeUV4cGFuZGVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZ2V0IGhlYWRlckhpZXJhcmNoeUV4cGFuZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdz8uaGVhZGVySGllcmFyY2h5RXhwYW5kZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBjaGlsZExheW91dEtleXMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaGlnaGxpZ2h0ZWRSb3dJRCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZU9uUmVuZGVyID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHBhcmVudDogSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGNoaWxkUm93OiBJZ3hDaGlsZEdyaWRSb3dDb21wb25lbnQ7XG5cbiAgICBwcml2YXRlIF9kYXRhO1xuICAgIHByaXZhdGUgaF9pZCA9IGBpZ3gtaGllcmFyY2hpY2FsLWdyaWQtJHtORVhUX0lEKyt9YDtcbiAgICBwcml2YXRlIGNoaWxkR3JpZFRlbXBsYXRlczogTWFwPGFueSwgYW55PiA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIHNjcm9sbFRvcCA9IDA7XG4gICAgcHJpdmF0ZSBzY3JvbGxMZWZ0ID0gMDtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBpZGAgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiBub3QgcHJvdmlkZWQgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWhpZXJhcmNoaWNhbC1ncmlkIFtpZF09XCInaWd4LWhncmlkLTEnXCIgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWhpZXJhcmNoaWNhbC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmhfaWQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgaWQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmhfaWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBsZXRzIHlvdSBmaWxsIHRoZSBgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudGAgd2l0aCBhbiBhcnJheSBvZiBkYXRhLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWhpZXJhcmNoaWNhbC1ncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1oaWVyYXJjaGljYWwtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGRhdGEodmFsdWU6IGFueVtdIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9kYXRhID0gdmFsdWUgfHwgW107XG4gICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24udXBkYXRlQWxsKHRoaXMuX2RhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNob3VsZEdlbmVyYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwQ29sdW1ucygpO1xuICAgICAgICAgICAgdGhpcy5yZWZsb3coKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmICh0aGlzLmhlaWdodCA9PT0gbnVsbCB8fCB0aGlzLmhlaWdodC5pbmRleE9mKCclJykgIT09IC0xKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGhlaWdodCB3aWxsIGNoYW5nZSBiYXNlZCBvbiBob3cgbXVjaCBkYXRhIHRoZXJlIGlzLCByZWNhbGN1bGF0ZSBzaXplcyBpbiBpZ3hGb3JPZi5cbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgZGF0YSBzZXQgdG8gdGhlIGBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50YC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGZpbHRlcmVkRGF0YSA9IHRoaXMuZ3JpZC5maWx0ZXJlZERhdGE7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IHBhZ2luYXRvcigpIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmlkO1xuICAgICAgICByZXR1cm4gKCF0aGlzLnBhcmVudElzbGFuZCAmJiB0aGlzLnBhZ2luYXRpb25Db21wb25lbnRzPy5maXJzdCkgfHwgdGhpcy5yb290R3JpZC5wYWdpbmF0b3JMaXN0Py5maW5kKChwZykgPT5cbiAgICAgICAgICAgIHBnLm5hdGl2ZUVsZW1lbnQub2Zmc2V0UGFyZW50Py5pZCA9PT0gaWQpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCgpIDogSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRJc2xhbmQgP1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRJc2xhbmQuZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudHMuZmlyc3QgOlxuICAgICAgICAgICAgc3VwZXIuZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRvdGFsIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBkYXRhIHNvdXJjZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBwcm9wZXJ0eSBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGdyaWQgdmlydHVhbGl6YXRpb24gdG8gZnVuY3Rpb24gd2hlbiBpdCBpcyBib3VuZCB0byByZW1vdGUgZGF0YS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBpdGVtQ291bnQgPSB0aGlzLmdyaWQxLnRvdGFsSXRlbUNvdW50O1xuICAgICAqIHRoaXMuZ3JpZDEudG90YWxJdGVtQ291bnQgPSA1NTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHRvdGFsSXRlbUNvdW50KGNvdW50KSB7XG4gICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIudG90YWxJdGVtQ291bnQgPSBjb3VudDtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdG90YWxJdGVtQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnRvdGFsSXRlbUNvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgaWYgYWxsIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgYElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRgIHNob3VsZCBiZSBleHBhbmRlZC9jb2xsYXBzZWQuXG4gICAgICogRGVmdWx0IHZhbHVlIGlzIGZhbHNlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWhpZXJhcmNoaWNhbC1ncmlkIFtpZF09XCInaWd4LWdyaWQtMSdcIiBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgW2V4cGFuZENoaWxkcmVuXT1cInRydWVcIj48L2lneC1oaWVyYXJjaGljYWwtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGV4cGFuZENoaWxkcmVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmV4cGFuc2lvblN0YXRlcyA9IG5ldyBNYXA8YW55LCBib29sZWFuPigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgaWYgYWxsIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgYElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRgIHByZXZpb3VzbHkgaGF2ZSBiZWVuIHNldCB0byBiZSBleHBhbmRlZC9jb2xsYXBzZWQuXG4gICAgICogSWYgcHJldmlvdXNseSBzZXQgYW5kIHNvbWUgcm93cyBoYXZlIGJlZW4gbWFudWFsbHkgZXhwYW5kZWQvY29sbGFwc2VkIGl0IHdpbGwgc3RpbGwgcmV0dXJuIHRoZSBsYXN0IHNldCB2YWx1ZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZXhwYW5kZWQgPSB0aGlzLmdyaWQuZXhwYW5kQ2hpbGRyZW47XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXhwYW5kQ2hpbGRyZW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RXhwYW5kU3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSBgZ2V0Q2VsbEJ5Q29sdW1uYCBvciBgZ2V0Q2VsbEJ5S2V5YCBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGEgYENlbGxUeXBlYCBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjb25kaXRpb25zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDZWxsID0gdGhpcy5ncmlkMS5nZXRDZWxsQnlDb2x1bW5WaXNpYmxlSW5kZXgoMixcIlVuaXRQcmljZVwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SW5kZXhcbiAgICAgKiBAcGFyYW0gaW5kZXhcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2VsbEJ5Q29sdW1uVmlzaWJsZUluZGV4KHJvd0luZGV4OiBudW1iZXIsIGluZGV4OiBudW1iZXIpOiBDZWxsVHlwZSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0Um93QnlJbmRleChyb3dJbmRleCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC52aXNpYmxlSW5kZXggPT09IGluZGV4KTtcbiAgICAgICAgaWYgKHJvdyAmJiByb3cgaW5zdGFuY2VvZiBJZ3hIaWVyYXJjaGljYWxHcmlkUm93ICYmIGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZ3hHcmlkQ2VsbCh0aGlzLCByb3dJbmRleCwgY29sdW1uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgcm93LiBJdCBtYXkgYmUgYSBgc3RyaW5nYCBvciBgbnVtYmVyYCBpZiBgcHJpbWFyeUtleWAgb2YgdGhlXG4gICAgICogcGFyZW50IGdyaWQgaXMgc2V0IG9yIGFuIG9iamVjdCByZWZlcmVuY2Ugb2YgdGhlIHBhcmVudCByZWNvcmQgb3RoZXJ3aXNlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBmb3JlaWduS2V5ID0gdGhpcy5ncmlkLmZvcmVpZ25LZXk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZm9yZWlnbktleSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmdyaWRBUEkuZ2V0UGFyZW50Um93SWQodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzRXhwYW5kYWJsZUNoaWxkcmVuKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLmNoaWxkTGF5b3V0S2V5cy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzb2x2ZVJvd0VkaXRDb250YWluZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudElzbGFuZCAmJiB0aGlzLnBhcmVudElzbGFuZC5yb3dFZGl0Q3VzdG9tKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRJc2xhbmQucm93RWRpdENvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yb3dFZGl0Q29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlc29sdmVSb3dFZGl0QWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50SXNsYW5kID8gdGhpcy5wYXJlbnRJc2xhbmQucm93RWRpdEFjdGlvbnNUZW1wbGF0ZSA6IHRoaXMucm93RWRpdEFjdGlvbnNUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNvbHZlUm93RWRpdFRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudElzbGFuZCA/IHRoaXMucGFyZW50SXNsYW5kLnJvd0VkaXRUZXh0VGVtcGxhdGUgOiB0aGlzLnJvd0VkaXRUZXh0VGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgaGlkZUFjdGlvblN0cmlwKCkge1xuICAgICAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICAvLyBoaWRlIGNoaWxkIGxheW91dCBhY3Rpb25zIHN0cmlwcyB3aGVuXG4gICAgICAgICAgICAvLyBtb3Zpbmcgb3V0c2lkZSByb290IGdyaWQuXG4gICAgICAgICAgICBzdXBlci5oaWRlQWN0aW9uU3RyaXAoKTtcbiAgICAgICAgICAgIHRoaXMuYWxsTGF5b3V0TGlzdC5mb3JFYWNoKHJpID0+IHtcbiAgICAgICAgICAgICAgICByaS5hY3Rpb25TdHJpcD8uaGlkZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBwYXJlbnRSb3dPdXRsZXREaXJlY3RpdmUoKSB7XG4gICAgICAgIC8vIFRhcmdldGluZyBwYXJlbnQgb3V0bGV0IGluIG9yZGVyIHRvIHByZXZlbnQgaGlkaW5nIHdoZW4gb3V0bGV0XG4gICAgICAgIC8vIGlzIHByZXNlbnQgYXQgYSBjaGlsZCBncmlkIGFuZCBpcyBhdHRhY2hlZCB0byBhIHJvdy5cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQucm93T3V0bGV0RGlyZWN0aXZlIDogdGhpcy5vdXRsZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBuZ09uSW5pdCgpIHtcbiAgICAgICAgLy8gdGhpcy5leHBhbnNpb25TdGF0ZXNDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgodmFsdWU6IE1hcDxhbnksIGJvb2xlYW4+KSA9PiB7XG4gICAgICAgIC8vICAgICBjb25zdCByZXMgPSBBcnJheS5mcm9tKHZhbHVlLmVudHJpZXMoKSkuZmlsdGVyKCh7MTogdn0pID0+IHYgPT09IHRydWUpLm1hcCgoW2tdKSA9PiBrKTtcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIHRoaXMuYmF0Y2hFZGl0aW5nID0gISF0aGlzLnJvb3RHcmlkLmJhdGNoRWRpdGluZztcbiAgICAgICAgaWYgKHRoaXMucm9vdEdyaWQgIT09IHRoaXMpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEdyaWQuYmF0Y2hFZGl0aW5nQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHZhbDogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYmF0Y2hFZGl0aW5nID0gdmFsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmdldFNjcm9sbCgpLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGdfdmVydGljYWxTY3JvbGxIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJDb250YWluZXIuZ2V0U2Nyb2xsKCkuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oZ19ob3Jpem9udGFsU2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuYmVmb3JlVmlld0Rlc3Ryb3llZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCh2aWV3KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByb3dEYXRhID0gdmlldy5jb250ZXh0LiRpbXBsaWNpdDtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ2hpbGRHcmlkUmVjb3JkKHJvd0RhdGEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMuY2hpbGRHcmlkVGVtcGxhdGVzLmdldChyb3dEYXRhLnJvd0lEKTtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0bWxwT3V0bGV0ID0gY2FjaGVkRGF0YS5vd25lcjtcbiAgICAgICAgICAgICAgICAgICAgdG1scE91dGxldC5fdmlld0NvbnRhaW5lclJlZi5kZXRhY2goMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXlEZW5zaXR5ID0gdGhpcy5yb290R3JpZC5kaXNwbGF5RGVuc2l0eTtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2Uuc3VtbWFyeUhlaWdodCA9IDA7XG4gICAgICAgICAgICB0aGlzLnJvb3RHcmlkLmRlbnNpdHlDaGFuZ2VkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXlEZW5zaXR5ID0gdGhpcy5yb290R3JpZC5kaXNwbGF5RGVuc2l0eTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLnN1bW1hcnlIZWlnaHQgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jaGlsZExheW91dEtleXMgPSB0aGlzLnBhcmVudElzbGFuZC5jaGlsZHJlbi5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWN0aW9uU3RyaXAgPSB0aGlzLnBhcmVudElzbGFuZCA/IHRoaXMucGFyZW50SXNsYW5kLmFjdGlvblN0cmlwIDogdGhpcy5hY3Rpb25TdHJpcDtcblxuICAgICAgICB0aGlzLmhlYWRTZWxlY3RvcnNUZW1wbGF0ZXMgPSB0aGlzLnBhcmVudElzbGFuZCA/XG4gICAgICAgICAgICB0aGlzLnBhcmVudElzbGFuZC5oZWFkU2VsZWN0b3JzVGVtcGxhdGVzIDpcbiAgICAgICAgICAgIHRoaXMuaGVhZFNlbGVjdG9yc1RlbXBsYXRlcztcblxuICAgICAgICB0aGlzLnJvd1NlbGVjdG9yc1RlbXBsYXRlcyA9IHRoaXMucGFyZW50SXNsYW5kID9cbiAgICAgICAgICAgIHRoaXMucGFyZW50SXNsYW5kLnJvd1NlbGVjdG9yc1RlbXBsYXRlcyA6XG4gICAgICAgICAgICB0aGlzLnJvd1NlbGVjdG9yc1RlbXBsYXRlcztcbiAgICAgICAgdGhpcy5kcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlID0gdGhpcy5wYXJlbnRJc2xhbmQgP1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRJc2xhbmQuZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSA6XG4gICAgICAgICAgICB0aGlzLmRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGU7XG4gICAgICAgIHRoaXMucm93RXhwYW5kZWRJbmRpY2F0b3JUZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQucm93RXhwYW5kZWRJbmRpY2F0b3JUZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5yb3dDb2xsYXBzZWRJbmRpY2F0b3JUZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQucm93Q29sbGFwc2VkSW5kaWNhdG9yVGVtcGxhdGU7XG4gICAgICAgIHRoaXMuaGVhZGVyQ29sbGFwc2VJbmRpY2F0b3JUZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQuaGVhZGVyQ29sbGFwc2VJbmRpY2F0b3JUZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5oZWFkZXJFeHBhbmRJbmRpY2F0b3JUZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQuaGVhZGVyRXhwYW5kSW5kaWNhdG9yVGVtcGxhdGU7XG4gICAgICAgIHRoaXMuZXhjZWxTdHlsZUhlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQuZXhjZWxTdHlsZUhlYWRlckljb25UZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5zb3J0QXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlID0gdGhpcy5yb290R3JpZC5zb3J0QXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlO1xuICAgICAgICB0aGlzLnNvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlID0gdGhpcy5yb290R3JpZC5zb3J0RGVzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5zb3J0SGVhZGVySWNvblRlbXBsYXRlID0gdGhpcy5yb290R3JpZC5zb3J0SGVhZGVySWNvblRlbXBsYXRlO1xuICAgICAgICB0aGlzLmhhc0NoaWxkcmVuS2V5ID0gdGhpcy5wYXJlbnRJc2xhbmQgP1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRJc2xhbmQuaGFzQ2hpbGRyZW5LZXkgfHwgdGhpcy5yb290R3JpZC5oYXNDaGlsZHJlbktleSA6XG4gICAgICAgICAgICB0aGlzLnJvb3RHcmlkLmhhc0NoaWxkcmVuS2V5O1xuICAgICAgICB0aGlzLnNob3dFeHBhbmRBbGwgPSB0aGlzLnBhcmVudElzbGFuZCA/XG4gICAgICAgICAgICB0aGlzLnBhcmVudElzbGFuZC5zaG93RXhwYW5kQWxsIDogdGhpcy5yb290R3JpZC5zaG93RXhwYW5kQWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgb3V0bGV0RGlyZWN0aXZlKCk6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290R3JpZC5vdXRsZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29sdW1uTGlzdChmYWxzZSk7XG4gICAgICAgIHRoaXMuY2hpbGRMYXlvdXRLZXlzID0gdGhpcy5wYXJlbnQgP1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRJc2xhbmQuY2hpbGRyZW4ubWFwKChpdGVtKSA9PiBpdGVtLmtleSkgOlxuICAgICAgICAgICAgdGhpcy5jaGlsZExheW91dEtleXMgPSB0aGlzLmNoaWxkTGF5b3V0TGlzdC5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KTtcbiAgICAgICAgdGhpcy5jaGlsZExheW91dExpc3Qubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuY2hpbGRMYXlvdXRMaXN0LmNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PlxuICAgICAgICAgICAgdGhpcy5vblJvd0lzbGFuZENoYW5nZSgpXG4gICAgICAgICk7XG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJDb250ZW50SW5pdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBSb3dUeXBlYCBieSBpbmRleC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Um93ID0gdGhpcy5ncmlkMS5nZXRSb3dCeUluZGV4KDEpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBpbmRleFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSb3dCeUluZGV4KGluZGV4OiBudW1iZXIpOiBSb3dUeXBlIHtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmRhdGFWaWV3Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSb3coaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBSb3dUeXBlYCBieSBrZXkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteVJvdyA9IHRoaXMuZ3JpZDEuZ2V0Um93QnlLZXkoMSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGtleVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSb3dCeUtleShrZXk6IGFueSk6IFJvd1R5cGUge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhVmlldztcbiAgICAgICAgY29uc3QgcmVjID0gdGhpcy5wcmltYXJ5S2V5ID9cbiAgICAgICAgICAgIGRhdGEuZmluZChyZWNvcmQgPT4gcmVjb3JkW3RoaXMucHJpbWFyeUtleV0gPT09IGtleSkgOlxuICAgICAgICAgICAgZGF0YS5maW5kKHJlY29yZCA9PiByZWNvcmQgPT09IGtleSk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YS5pbmRleE9mKHJlYyk7XG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgSWd4SGllcmFyY2hpY2FsR3JpZFJvdyh0aGlzIGFzIGFueSwgaW5kZXgsIHJlYyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWxsUm93cygpOiBSb3dUeXBlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhVmlldy5tYXAoKHJlYywgaW5kZXgpID0+IHRoaXMuY3JlYXRlUm93KGluZGV4KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiBgSWd4SGllcmFyY2hpY2FsR3JpZFJvd2BzIGZvciBjdXJyZW50IHBhZ2UuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkYXRhUm93cygpOiBSb3dUeXBlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxSb3dzKCkuZmlsdGVyKHJvdyA9PiByb3cgaW5zdGFuY2VvZiBJZ3hIaWVyYXJjaGljYWxHcmlkUm93KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBzZWxlY3RlZCBgSWd4R3JpZENlbGxgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHNlbGVjdGVkQ2VsbHMgPSB0aGlzLmdyaWQuc2VsZWN0ZWRDZWxscztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkQ2VsbHMoKTogQ2VsbFR5cGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFSb3dzKCkubWFwKChyb3cpID0+IHJvdy5jZWxscy5maWx0ZXIoKGNlbGwpID0+IGNlbGwuc2VsZWN0ZWQpKVxuICAgICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYiksIFtdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYENlbGxUeXBlYCBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjb25kaXRpb25zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDZWxsID0gdGhpcy5ncmlkMS5nZXRDZWxsQnlDb2x1bW4oMiwgXCJVbml0UHJpY2VcIik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0luZGV4XG4gICAgICogQHBhcmFtIGNvbHVtbkZpZWxkXG4gICAgICovXG4gICAgcHVibGljIGdldENlbGxCeUNvbHVtbihyb3dJbmRleDogbnVtYmVyLCBjb2x1bW5GaWVsZDogc3RyaW5nKTogQ2VsbFR5cGUge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmdldFJvd0J5SW5kZXgocm93SW5kZXgpO1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGNvbHVtbkZpZWxkKTtcbiAgICAgICAgaWYgKHJvdyAmJiByb3cgaW5zdGFuY2VvZiBJZ3hIaWVyYXJjaGljYWxHcmlkUm93ICYmIGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZ3hHcmlkQ2VsbCh0aGlzLCByb3dJbmRleCwgY29sdW1uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBgQ2VsbFR5cGVgIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNvbmRpdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoYXQgdGhlIHByaW1hcnlLZXkgcHJvcGVydHkgaXMgc2V0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQuZ2V0Q2VsbEJ5S2V5KDEsICdpbmRleCcpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dTZWxlY3RvciBtYXRjaCBhbnkgcm93SURcbiAgICAgKiBAcGFyYW0gY29sdW1uRmllbGRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2VsbEJ5S2V5KHJvd1NlbGVjdG9yOiBhbnksIGNvbHVtbkZpZWxkOiBzdHJpbmcpOiBDZWxsVHlwZSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0Um93QnlLZXkocm93U2VsZWN0b3IpO1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGNvbHVtbkZpZWxkKTtcbiAgICAgICAgaWYgKHJvdyAmJiBjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSWd4R3JpZENlbGwodGhpcywgcm93LmluZGV4LCBjb2x1bW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHBpblJvdyhyb3dJRDogYW55LCBpbmRleD86IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmdldFJvd0J5S2V5KHJvd0lEKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnBpblJvdyhyb3dJRCwgaW5kZXgsIHJvdyk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHVucGluUm93KHJvd0lEOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5nZXRSb3dCeUtleShyb3dJRCk7XG4gICAgICAgIHJldHVybiBzdXBlci51bnBpblJvdyhyb3dJRCwgcm93KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkYXRhTG9hZGluZyhldmVudCkge1xuICAgICAgICB0aGlzLmRhdGFQcmVMb2FkLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIG92ZXJyaWRlIGZlYXR1cmVDb2x1bW5zV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5mZWF0dXJlQ29sdW1uc1dpZHRoKHRoaXMuaGVhZGVySGllcmFyY2h5RXhwYW5kZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Sb3dJc2xhbmRDaGFuZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5jaGlsZExheW91dEtleXMgPSB0aGlzLnBhcmVudElzbGFuZC5jaGlsZHJlbi5maWx0ZXIoaXRlbSA9PiAhKGl0ZW0gYXMgYW55KS5fZGVzdHJveWVkKS5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRMYXlvdXRLZXlzID0gdGhpcy5jaGlsZExheW91dExpc3QuZmlsdGVyKGl0ZW0gPT4gIShpdGVtIGFzIGFueSkuX2Rlc3Ryb3llZCkubWFwKChpdGVtKSA9PiBpdGVtLmtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEodGhpcy5jZHIgYXMgYW55KS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLmdldENoaWxkR3JpZHModHJ1ZSkuZm9yRWFjaCgoZ3JpZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZ3JpZC5jaGlsZFJvdy5jZHIuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyaWQuY2hpbGRSb3cuY2RyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIGluIGNhc2Ugc2VsZWN0aW9uIGlzIGluIGRlc3Ryb3llZCBjaGlsZCBncmlkLCBzZWxlY3Rpb24gc2hvdWxkIGJlIGNsZWFyZWQuXG4gICAgICAgICAgICB0aGlzLl9jbGVhclNlbGV0aW9uSGlnaGxpZ2h0cygpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBpc1Jvd0hpZ2hsaWdodGVkKHJvd0RhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRSb3dJRCA9PT0gcm93RGF0YS5yb3dJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGlzSGllcmFyY2hpY2FsUmVjb3JkKHJlY29yZDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmlzR2hvc3RSZWNvcmQocmVjb3JkKSkge1xuICAgICAgICAgICAgcmVjb3JkID0gcmVjb3JkLnJlY29yZFJlZjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZExheW91dExpc3QubGVuZ3RoICE9PSAwICYmIHJlY29yZFt0aGlzLmNoaWxkTGF5b3V0TGlzdC5maXJzdC5rZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNDaGlsZEdyaWRSZWNvcmQocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgLy8gQ2FuIGJlIG51bGwgd2hlbiB0aGVyZSBpcyBkZWZpbmVkIGxheW91dCBidXQgbm8gY2hpbGQgZGF0YSB3YXMgZm91bmRcbiAgICAgICAgcmV0dXJuIHJlY29yZD8uY2hpbGRHcmlkc0RhdGEgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHRyYWNrQ2hhbmdlcyhpbmRleCwgcmVjKSB7XG4gICAgICAgIGlmIChyZWMuY2hpbGRHcmlkc0RhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gaWYgaXMgY2hpbGQgcmVjXG4gICAgICAgICAgICByZXR1cm4gcmVjLnJvd0lEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb250ZXh0KHJvd0RhdGEsIHJvd0luZGV4LCBwaW5uZWQpOiBhbnkge1xuICAgICAgICBpZiAodGhpcy5pc0NoaWxkR3JpZFJlY29yZChyb3dEYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMuY2hpbGRHcmlkVGVtcGxhdGVzLmdldChyb3dEYXRhLnJvd0lEKTtcbiAgICAgICAgICAgIGlmIChjYWNoZWREYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IGNhY2hlZERhdGEudmlldztcbiAgICAgICAgICAgICAgICBjb25zdCB0bWxwT3V0bGV0ID0gY2FjaGVkRGF0YS5vd25lcjtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHJvd0RhdGEsXG4gICAgICAgICAgICAgICAgICAgIG1vdmVWaWV3OiB2aWV3LFxuICAgICAgICAgICAgICAgICAgICBvd25lcjogdG1scE91dGxldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMuZGF0YVZpZXcuaW5kZXhPZihyb3dEYXRhKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNoaWxkIHJvd3MgY29udGFpbiB1bmlxdWUgZ3JpZHMsIGhlbmNlIHNob3VsZCBoYXZlIHVuaXF1ZSB0ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHJvd0RhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlSUQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjaGlsZFJvdycsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogcm93RGF0YS5yb3dJRFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5kYXRhVmlldy5pbmRleE9mKHJvd0RhdGEpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgJGltcGxpY2l0OiB0aGlzLmlzR2hvc3RSZWNvcmQocm93RGF0YSkgPyByb3dEYXRhLnJlY29yZFJlZiA6IHJvd0RhdGEsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVJRDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGF0YVJvdycsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBudWxsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5nZXREYXRhVmlld0luZGV4KHJvd0luZGV4LCBwaW5uZWQpLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0aGlzLmlzR2hvc3RSZWNvcmQocm93RGF0YSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCByb290R3JpZCgpOiBHcmlkVHlwZSB7XG4gICAgICAgIGxldCBjdXJyR3JpZCA9IHRoaXMgYXMgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudDtcbiAgICAgICAgd2hpbGUgKGN1cnJHcmlkLnBhcmVudCkge1xuICAgICAgICAgICAgY3VyckdyaWQgPSBjdXJyR3JpZC5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJHcmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGljb25UZW1wbGF0ZSgpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmhhc0V4cGFuZGVkUmVjb3JkcygpICYmIHRoaXMuaGFzRXhwYW5kYWJsZUNoaWxkcmVuO1xuICAgICAgICBpZiAoIWV4cGFuZGVkICYmIHRoaXMuc2hvd0V4cGFuZEFsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyQ29sbGFwc2VJbmRpY2F0b3JUZW1wbGF0ZSB8fCB0aGlzLmRlZmF1bHRDb2xsYXBzZWRUZW1wbGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhlYWRlckV4cGFuZEluZGljYXRvclRlbXBsYXRlIHx8IHRoaXMuZGVmYXVsdEV4cGFuZGVkVGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldERyYWdHaG9zdEN1c3RvbVRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRJc2xhbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudElzbGFuZC5nZXREcmFnR2hvc3RDdXN0b21UZW1wbGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci5nZXREcmFnR2hvc3RDdXN0b21UZW1wbGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBHZXRzIHRoZSB2aXNpYmxlIGNvbnRlbnQgaGVpZ2h0IHRoYXQgaW5jbHVkZXMgaGVhZGVyICsgdGJvZHkgKyBmb290ZXIuXG4gICAgICogRm9yIGhpZXJhcmNoaWNhbCBjaGlsZCBncmlkIGl0IG1heSBiZSBzY3JvbGxlZCBhbmQgbm90IGZ1bGx5IHZpc2libGUuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldFZpc2libGVDb250ZW50SGVpZ2h0KCkge1xuICAgICAgICBsZXQgaGVpZ2h0ID0gc3VwZXIuZ2V0VmlzaWJsZUNvbnRlbnRIZWlnaHQoKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCByb290SGVpZ2h0ID0gdGhpcy5yb290R3JpZC5nZXRWaXNpYmxlQ29udGVudEhlaWdodCgpO1xuICAgICAgICAgICAgY29uc3QgdG9wRGlmZiA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLnJvb3RHcmlkLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICAgICAgaGVpZ2h0ID0gcm9vdEhlaWdodCAtIHRvcERpZmYgPiBoZWlnaHQgPyBoZWlnaHQgOiByb290SGVpZ2h0IC0gdG9wRGlmZjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlQWxsKCkge1xuICAgICAgICBjb25zdCBleHBhbmRlZCA9IHRoaXMuaGFzRXhwYW5kZWRSZWNvcmRzKCkgJiYgdGhpcy5oYXNFeHBhbmRhYmxlQ2hpbGRyZW47XG4gICAgICAgIGlmICghZXhwYW5kZWQgJiYgdGhpcy5zaG93RXhwYW5kQWxsKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZEFsbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2xsYXBzZUFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhc0V4cGFuZGVkUmVjb3JkcygpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoYXNFeHBhbmRlZEVudHJ5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaGFzRXhwYW5kZWRFbnRyeSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGhhc0V4cGFuZGVkRW50cnk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGdldERlZmF1bHRFeHBhbmRTdGF0ZShyZWNvcmQ6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5oYXNDaGlsZHJlbktleSAmJiAhcmVjb3JkW3RoaXMuaGFzQ2hpbGRyZW5LZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwYW5kQ2hpbGRyZW47XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGlzRXhwYW5kZWQocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5nZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyZWNvcmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdmlld0NyZWF0ZWRIYW5kbGVyKGFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDaGlsZEdyaWRSZWNvcmQoYXJncy5jb250ZXh0LiRpbXBsaWNpdCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGFyZ3MuY29udGV4dC4kaW1wbGljaXQucm93SUQ7XG4gICAgICAgICAgICB0aGlzLmNoaWxkR3JpZFRlbXBsYXRlcy5zZXQoa2V5LCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdmlld01vdmVkSGFuZGxlcihhcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ2hpbGRHcmlkUmVjb3JkKGFyZ3MuY29udGV4dC4kaW1wbGljaXQpKSB7XG4gICAgICAgICAgICAvLyB2aWV3IHdhcyBtb3ZlZCwgdXBkYXRlIG93bmVyIGluIGNhY2hlXG4gICAgICAgICAgICBjb25zdCBrZXkgPSBhcmdzLmNvbnRleHQuJGltcGxpY2l0LnJvd0lEO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMuY2hpbGRHcmlkVGVtcGxhdGVzLmdldChrZXkpO1xuICAgICAgICAgICAgY2FjaGVkRGF0YS5vd25lciA9IGFyZ3Mub3duZXI7XG5cbiAgICAgICAgICAgIHRoaXMuY2hpbGRMYXlvdXRMaXN0LmZvckVhY2goKGxheW91dCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRHcmlkID0gdGhpcy5ncmlkQVBJLmdldENoaWxkR3JpZEJ5SUQobGF5b3V0LmtleSwgYXJncy5jb250ZXh0LiRpbXBsaWNpdC5yb3dJRCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRHcmlkICYmIHJlbGF0ZWRHcmlkLnVwZGF0ZU9uUmVuZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERldGVjdCBjaGFuZ2VzIGlmIGBleHBhbmRDaGlsZHJlbmAgaGFzIGNoYW5nZWQgd2hlbiB0aGUgZ3JpZCB3YXNuJ3QgdmlzaWJsZS4gVGhpcyBpcyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEdyaWQubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEdyaWQudXBkYXRlT25SZW5kZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkNvbnRhaW5lclNjcm9sbCgpIHtcbiAgICAgICAgdGhpcy5oaWRlT3ZlcmxheXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVJvdyhpbmRleDogbnVtYmVyLCBkYXRhPzogYW55KTogUm93VHlwZSB7XG4gICAgICAgIGxldCByb3c6IFJvd1R5cGU7XG4gICAgICAgIGNvbnN0IGRhdGFJbmRleCA9IHRoaXMuX2dldERhdGFWaWV3SW5kZXgoaW5kZXgpO1xuICAgICAgICBjb25zdCByZWM6IGFueSA9IGRhdGEgPz8gdGhpcy5kYXRhVmlld1tkYXRhSW5kZXhdO1xuXG4gICAgICAgIGlmICghcm93ICYmIHJlYyAmJiAhcmVjLmNoaWxkR3JpZHNEYXRhKSB7XG4gICAgICAgICAgICByb3cgPSBuZXcgSWd4SGllcmFyY2hpY2FsR3JpZFJvdyh0aGlzIGFzIGFueSwgaW5kZXgsIHJlYyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcm93O1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXRDaGlsZEdyaWRzKGluRGVwaD86IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5nZXRDaGlsZEdyaWRzKGluRGVwaCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGdlbmVyYXRlRGF0YUZpZWxkcyhkYXRhOiBhbnlbXSk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdlbmVyYXRlRGF0YUZpZWxkcyhkYXRhKS5maWx0ZXIoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYXlvdXRzTGlzdCA9IHRoaXMucGFyZW50SXNsYW5kID8gdGhpcy5wYXJlbnRJc2xhbmQuY2hpbGRyZW4gOiB0aGlzLmNoaWxkTGF5b3V0TGlzdDtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBsYXlvdXRzTGlzdC5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KTtcbiAgICAgICAgICAgIHJldHVybiBrZXlzLmluZGV4T2YoZmllbGQpID09PSAtMTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc2l6ZU5vdGlmeUhhbmRsZXIoKSB7XG4gICAgICAgIC8vIGRvIG5vdCB0cmlnZ2VyIHJlZmxvdyBpZiBlbGVtZW50IGlzIGRldGFjaGVkIG9yIGlmIGl0IGlzIGNoaWxkIGdyaWQuXG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50LmNvbnRhaW5zKHRoaXMubmF0aXZlRWxlbWVudCkgJiYgIXRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGluaXRDb2x1bW5zKGNvbGxlY3Rpb246IElneENvbHVtbkNvbXBvbmVudFtdLCBjYjogKGFyZ3M6IGFueSkgPT4gdm9pZCA9IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgLy8gaW52YWxpZCBjb25maWd1cmF0aW9uIC0gaGllcmFyY2hpY2FsIGdyaWQgc2hvdWxkIG5vdCBhbGxvdyBjb2x1bW4gbGF5b3V0c1xuICAgICAgICAgICAgLy8gcmVtb3ZlIGNvbHVtbiBsYXlvdXRzXG4gICAgICAgICAgICBjb25zdCBub25Db2x1bW5MYXlvdXRDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiAhY29sLmNvbHVtbkxheW91dCAmJiAhY29sLmNvbHVtbkxheW91dENoaWxkKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1ucyhub25Db2x1bW5MYXlvdXRDb2x1bW5zKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5pbml0Q29sdW1ucyhjb2xsZWN0aW9uLCBjYik7XG4gICAgfVxuXG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2V0dXBDb2x1bW5zKCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRJc2xhbmQgJiYgdGhpcy5wYXJlbnRJc2xhbmQuY2hpbGRDb2x1bW5zLmxlbmd0aCA+IDAgJiYgIXRoaXMuYXV0b0dlbmVyYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUNvbHVtbnNMaXN0KHRoaXMucGFyZW50SXNsYW5kLmNoaWxkQ29sdW1ucy50b0FycmF5KCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VwZXIuc2V0dXBDb2x1bW5zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0Q29sdW1uTGlzdCgpIHtcbiAgICAgICAgY29uc3QgY2hpbGRMYXlvdXRzID0gdGhpcy5wYXJlbnQgPyB0aGlzLmNoaWxkTGF5b3V0TGlzdCA6IHRoaXMuYWxsTGF5b3V0TGlzdDtcbiAgICAgICAgY29uc3QgbmVzdGVkQ29sdW1ucyA9IGNoaWxkTGF5b3V0cy5tYXAoKGxheW91dCkgPT4gbGF5b3V0LmNvbHVtbkxpc3QudG9BcnJheSgpKTtcbiAgICAgICAgY29uc3QgY29sc0FycmF5ID0gW10uY29uY2F0LmFwcGx5KFtdLCBuZXN0ZWRDb2x1bW5zKTtcbiAgICAgICAgaWYgKGNvbHNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB0b3BDb2xzID0gdGhpcy5jb2x1bW5MaXN0LmZpbHRlcigoaXRlbSkgPT4gY29sc0FycmF5LmluZGV4T2YoaXRlbSkgPT09IC0xKTtcbiAgICAgICAgICAgIHJldHVybiB0b3BDb2xzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5MaXN0LnRvQXJyYXkoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIG9uQ29sdW1uc0NoYW5nZWQoKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5MaXN0KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBfc2hvdWxkQXV0b1NpemUocmVuZGVyZWRIZWlnaHQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNQZXJjZW50SGVpZ2h0ICYmIHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuX3Nob3VsZEF1dG9TaXplKHJlbmRlcmVkSGVpZ2h0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNvbHVtbkxpc3QocmVjYWxjQ29sU2l6ZXMgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTGF5b3V0cyA9IHRoaXMucGFyZW50ID8gdGhpcy5jaGlsZExheW91dExpc3QgOiB0aGlzLmFsbExheW91dExpc3Q7XG4gICAgICAgIGNvbnN0IG5lc3RlZENvbHVtbnMgPSBjaGlsZExheW91dHMubWFwKChsYXlvdXQpID0+IGxheW91dC5jb2x1bW5MaXN0LnRvQXJyYXkoKSk7XG4gICAgICAgIGNvbnN0IGNvbHNBcnJheSA9IFtdLmNvbmNhdC5hcHBseShbXSwgbmVzdGVkQ29sdW1ucyk7XG4gICAgICAgIGNvbnN0IGNvbExlbmd0aCA9IHRoaXMuY29sdW1ucy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHRvcENvbHMgPSB0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKChpdGVtKSA9PiBjb2xzQXJyYXkuaW5kZXhPZihpdGVtKSA9PT0gLTEpO1xuICAgICAgICBpZiAodG9wQ29scy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnModG9wQ29scyk7XG4gICAgICAgICAgICBpZiAocmVjYWxjQ29sU2l6ZXMgJiYgdGhpcy5jb2x1bW5zLmxlbmd0aCAhPT0gY29sTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkU2l6ZXMoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2xlYXJTZWxldGlvbkhpZ2hsaWdodHMoKSB7XG4gICAgICAgIFt0aGlzLnJvb3RHcmlkLCAuLi50aGlzLnJvb3RHcmlkLmdldENoaWxkR3JpZHModHJ1ZSldLmZvckVhY2goZ3JpZCA9PiB7XG4gICAgICAgICAgICBncmlkLnNlbGVjdGlvblNlcnZpY2UuY2xlYXIoKTtcbiAgICAgICAgICAgIGdyaWQuc2VsZWN0aW9uU2VydmljZS5hY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgIGdyaWQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdpZ3gtZ3JpZF9fdHItLWhpZ2hsaWdodGVkJyk7XG4gICAgICAgICAgICBncmlkLmhpZ2hsaWdodGVkUm93SUQgPSBudWxsO1xuICAgICAgICAgICAgZ3JpZC5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBoZ192ZXJ0aWNhbFNjcm9sbEhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zY3JvbGxQb3NpdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBoZ19ob3Jpem9udGFsU2Nyb2xsSGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxMZWZ0ID0gdGhpcy5oZWFkZXJDb250YWluZXIuc2Nyb2xsUG9zaXRpb247XG4gICAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX2hpZXJhcmNoaWNhbC1pbmRlbnRcIiBbbmdDbGFzc109XCJ7J2lneC1ncmlkX19oaWVyYXJjaGljYWwtaW5kZW50LS1zY3JvbGwnOiBwYXJlbnRIYXNTY3JvbGx9XCI+XG4gICAgPG5nLWNvbnRhaW5lciAjY29udGFpbmVyPjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iLCI8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtZ3JpZC10b29sYmFyXCI+PC9uZy1jb250ZW50PlxuPG5nLWNvbnRhaW5lciAjdG9vbGJhck91dGxldD48L25nLWNvbnRhaW5lcj5cblxuPGlneC1ncmlkLWhlYWRlci1yb3cgY2xhc3M9XCJpZ3gtZ3JpZC10aGVhZFwiIHRhYmluZGV4PVwiMFwiXG4gICAgW2dyaWRdPVwidGhpc1wiXG4gICAgW2hhc01STF09XCJoYXNDb2x1bW5MYXlvdXRzXCJcbiAgICBbYWN0aXZlRGVzY2VuZGFudF09XCJhY3RpdmVEZXNjZW5kYW50XCJcbiAgICBbd2lkdGhdPVwiY2FsY1dpZHRoXCJcbiAgICBbcGlubmVkQ29sdW1uQ29sbGVjdGlvbl09XCJwaW5uZWRDb2x1bW5zXCJcbiAgICBbdW5waW5uZWRDb2x1bW5Db2xsZWN0aW9uXT1cInVucGlubmVkQ29sdW1uc1wiXG4gICAgKGtleWRvd24ubWV0YS5jKT1cImNvcHlIYW5kbGVyKCRldmVudClcIlxuICAgIChrZXlkb3duLmNvbnRyb2wuYyk9XCJjb3B5SGFuZGxlcigkZXZlbnQpXCJcbiAgICAoY29weSk9XCJjb3B5SGFuZGxlcigkZXZlbnQpXCJcbiAgICAoa2V5ZG93bik9XCJuYXZpZ2F0aW9uLmhlYWRlck5hdmlnYXRpb24oJGV2ZW50KVwiXG4gICAgKGZvY3VzKT1cIm5hdmlnYXRpb24uZm9jdXNGaXJzdENlbGwoKVwiXG4+XG48L2lneC1ncmlkLWhlYWRlci1yb3c+XG5cbjxkaXYgaWd4R3JpZEJvZHkgKGtleWRvd24uY29udHJvbC5jKT1cImNvcHlIYW5kbGVyKCRldmVudClcIiAoY29weSk9XCJjb3B5SGFuZGxlcigkZXZlbnQpXCIgY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHlcIiByb2xlPVwicm93Z3JvdXBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Rib2R5LWNvbnRlbnRcIiAgdGFiaW5kZXg9XCIwXCIgKGZvY3VzKT1cIm5hdmlnYXRpb24uZm9jdXNUYm9keSgkZXZlbnQpXCJcbiAgICAgKGtleWRvd24pPVwibmF2aWdhdGlvbi5oYW5kbGVOYXZpZ2F0aW9uKCRldmVudClcIiAoZHJhZ1N0b3ApPVwic2VsZWN0aW9uU2VydmljZS5kcmFnTW9kZSA9ICRldmVudFwiXG4gICAgICAgIChkcmFnU2Nyb2xsKT1cImRyYWdTY3JvbGwoJGV2ZW50KVwiIFtpZ3hHcmlkRHJhZ1NlbGVjdF09XCJzZWxlY3Rpb25TZXJ2aWNlLmRyYWdNb2RlXCIgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImFjdGl2ZURlc2NlbmRhbnRcIiBbYXR0ci5yb2xlXT1cImRhdGFWaWV3Lmxlbmd0aCA/IG51bGwgOiAncm93J1wiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPSd0b3RhbEhlaWdodCcgW3N0eWxlLndpZHRoLnB4XT0nY2FsY1dpZHRoJyAjdGJvZHkgKHNjcm9sbCk9J3ByZXZlbnRDb250YWluZXJTY3JvbGwoJGV2ZW50KSc+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwibW92aW5nICYmIGNvbHVtbkluRHJhZyAmJiBwaW5uZWRDb2x1bW5zLmxlbmd0aCA8PSAwXCJcbiAgICAgICAgICAgIFtpZ3hDb2x1bW5Nb3ZpbmdEcm9wXT1cImhlYWRlckNvbnRhaW5lclwiIFthdHRyLmRyb3BwYWJsZV09XCJ0cnVlXCIgaWQ9XCJsZWZ0XCJcbiAgICAgICAgICAgIGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1vbi1kcmFnLWxlZnRcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwibW92aW5nICYmIGNvbHVtbkluRHJhZyAmJiBwaW5uZWRDb2x1bW5zLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgW2lneENvbHVtbk1vdmluZ0Ryb3BdPVwiaGVhZGVyQ29udGFpbmVyXCIgW2F0dHIuZHJvcHBhYmxlXT1cInRydWVcIiBpZD1cImxlZnRcIlxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctcGlubmVkXCIgW3N0eWxlLmxlZnQucHhdPVwicGlubmVkV2lkdGhcIj48L3NwYW4+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcGlubmVkUmVjb3Jkc1RlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGFcbiAgICAgICAgICAgIHwgZ3JpZFRyYW5zYWN0aW9uOmlkOnBpcGVUcmlnZ2VyXG4gICAgICAgICAgICB8IHZpc2libGVDb2x1bW5zOmhhc1Zpc2libGVDb2x1bW5zXG4gICAgICAgICAgICB8IGdyaWRBZGRSb3c6dHJ1ZTpwaXBlVHJpZ2dlclxuICAgICAgICAgICAgfCBncmlkUm93UGlubmluZzppZDp0cnVlOnBpcGVUcmlnZ2VyXG4gICAgICAgICAgICB8IGdyaWRGaWx0ZXJpbmc6ZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlOmZpbHRlclN0cmF0ZWd5OmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlOmlkOnBpcGVUcmlnZ2VyOmZpbHRlcmluZ1BpcGVUcmlnZ2VyOnRydWVcbiAgICAgICAgICAgIHwgZ3JpZFNvcnQ6c29ydGluZ0V4cHJlc3Npb25zOltdOnNvcnRTdHJhdGVneTppZDpwaXBlVHJpZ2dlcjp0cnVlIGFzIHBpbm5lZERhdGFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICNwaW5Db250YWluZXIgKm5nSWY9J3Bpbm5lZERhdGEubGVuZ3RoID4gMCcgY2xhc3M9J2lneC1ncmlkX190ci0tcGlubmVkJ1xuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpZ3gtZ3JpZF9fdHItLXBpbm5lZC1ib3R0b20nOiAgIWlzUm93UGlubmluZ1RvVG9wLCAnaWd4LWdyaWRfX3RyLS1waW5uZWQtdG9wJzogaXNSb3dQaW5uaW5nVG9Ub3AgfVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09J2NhbGNXaWR0aCc+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvd0RhdGEgb2YgcGlubmVkRGF0YTsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwaW5uZWRfaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZTsgY29udGV4dDogZ2V0Q29udGV4dChyb3dEYXRhLCByb3dJbmRleCwgdHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGFzUGlubmVkUmVjb3JkcyAmJiBpc1Jvd1Bpbm5pbmdUb1RvcCA/IHBpbm5lZFJlY29yZHNUZW1wbGF0ZSA6IG51bGxcIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hHcmlkRm9yIGxldC1yb3dEYXRhIGxldC1yb3dJbmRleD1cImluZGV4XCIgW2lneEdyaWRGb3JPZl09XCJkYXRhXG4gICAgICAgIHwgZ3JpZFRyYW5zYWN0aW9uOmlkOnBpcGVUcmlnZ2VyXG4gICAgICAgIHwgdmlzaWJsZUNvbHVtbnM6aGFzVmlzaWJsZUNvbHVtbnNcbiAgICAgICAgfCBncmlkRmlsdGVyaW5nOmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTpmaWx0ZXJTdHJhdGVneTphZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTppZDpwaXBlVHJpZ2dlcjpmaWx0ZXJpbmdQaXBlVHJpZ2dlclxuICAgICAgICB8IGdyaWRTb3J0OnNvcnRpbmdFeHByZXNzaW9uczpbXTpzb3J0U3RyYXRlZ3k6aWQ6cGlwZVRyaWdnZXJcbiAgICAgICAgfCBncmlkSGllcmFyY2hpY2FsUGFnaW5nOiEhcGFnaW5hdG9yOnBhZ2U6cGVyUGFnZTppZDpwaXBlVHJpZ2dlclxuICAgICAgICB8IGdyaWRIaWVyYXJjaGljYWw6ZXhwYW5zaW9uU3RhdGVzOmlkOnByaW1hcnlLZXk6Y2hpbGRMYXlvdXRLZXlzOnBpcGVUcmlnZ2VyXG4gICAgICAgIHwgZ3JpZEFkZFJvdzpmYWxzZTpwaXBlVHJpZ2dlclxuICAgICAgICB8IGdyaWRSb3dQaW5uaW5nOmlkOmZhbHNlOnBpcGVUcmlnZ2VyXCJcbiAgICAgICAgICAgIFtpZ3hGb3JTY3JvbGxPcmllbnRhdGlvbl09XCIndmVydGljYWwnXCIgW2lneEZvclNjcm9sbENvbnRhaW5lcl09J3ZlcnRpY2FsU2Nyb2xsJ1xuICAgICAgICAgICAgW2lneEZvckNvbnRhaW5lclNpemVdPSdjYWxjSGVpZ2h0JyBbaWd4Rm9ySXRlbVNpemVdPVwicmVuZGVyZWRSb3dIZWlnaHRcIiBbaWd4Rm9yVHJhY2tCeV09J3RyYWNrQ2hhbmdlcydcbiAgICAgICAgICAgICN2ZXJ0aWNhbFNjcm9sbENvbnRhaW5lciAoY2h1bmtQcmVsb2FkKT1cImRhdGFMb2FkaW5nKCRldmVudClcIiAoZGF0YUNoYW5naW5nKT1cImRhdGFSZWJpbmRpbmcoJGV2ZW50KVwiIChkYXRhQ2hhbmdlZCk9XCJkYXRhUmVib3VuZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICBbaWd4VGVtcGxhdGVPdXRsZXRdPScoaXNIaWVyYXJjaGljYWxSZWNvcmQocm93RGF0YSkgPyBoaWVyYXJjaGljYWxfcmVjb3JkX3RlbXBsYXRlIDogKGlzQ2hpbGRHcmlkUmVjb3JkKHJvd0RhdGEpID8gY2hpbGRfcmVjb3JkX3RlbXBsYXRlIDogaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZSkpJ1xuICAgICAgICAgICAgICAgIFtpZ3hUZW1wbGF0ZU91dGxldENvbnRleHRdPSdnZXRDb250ZXh0KHJvd0RhdGEsIHJvd0luZGV4LCBmYWxzZSknICh2aWV3Q3JlYXRlZCk9J3ZpZXdDcmVhdGVkSGFuZGxlcigkZXZlbnQpJ1xuICAgICAgICAgICAgICAgICh2aWV3TW92ZWQpPSd2aWV3TW92ZWRIYW5kbGVyKCRldmVudCknIChjYWNoZWRWaWV3TG9hZGVkKT0nY2FjaGVkVmlld0xvYWRlZCgkZXZlbnQpJz5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKmlneFRlbXBsYXRlT3V0bGV0PVwiKGlzSGllcmFyY2hpY2FsUmVjb3JkKHJvd0RhdGEpID8gaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZSA6IChpc0NoaWxkR3JpZFJlY29yZChyb3dEYXRhKSAmJiBpc0V4cGFuZGVkKHJvd0RhdGEpID8gY2hpbGRfcmVjb3JkX3RlbXBsYXRlIDogaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZSkpOyBjb250ZXh0OiBnZXRDb250ZXh0KHJvd0RhdGEpXCI+PC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2hpZXJhcmNoaWNhbF9yZWNvcmRfdGVtcGxhdGUgbGV0LXJvd0luZGV4PVwiaW5kZXhcIiBsZXQtZGlzYWJsZWRSb3c9XCJkaXNhYmxlZFwiIGxldC1yb3dEYXRhPlxuICAgICAgICAgICAgPGlneC1oaWVyYXJjaGljYWwtZ3JpZC1yb3cgW2dyaWRJRF09XCJpZFwiIFtpbmRleF09XCJyb3dJbmRleFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFJvd1wiIFtkYXRhXT1cInJvd0RhdGFcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0NsYXNzZXMgfCBpZ3hHcmlkUm93Q2xhc3Nlczpyb3c6cm93LmluRWRpdE1vZGU6cm93LnNlbGVjdGVkOnJvdy5kaXJ0eTpyb3cuZGVsZXRlZDpyb3cuZHJhZ2dpbmc6cm93SW5kZXg6aGFzQ29sdW1uTGF5b3V0czpmYWxzZTpyb3dEYXRhOnBpcGVUcmlnZ2VyXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJyb3dTdHlsZXMgfCBpZ3hHcmlkUm93U3R5bGVzOnJvd0RhdGE6cm93SW5kZXg6cGlwZVRyaWdnZXJcIiAjcm93PlxuICAgICAgICAgICAgPC9pZ3gtaGllcmFyY2hpY2FsLWdyaWQtcm93PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcGlubmVkX2hpZXJhcmNoaWNhbF9yZWNvcmRfdGVtcGxhdGUgbGV0LXJvd0luZGV4PVwiaW5kZXhcIiBsZXQtcm93RGF0YT5cbiAgICAgICAgICAgIDxpZ3gtaGllcmFyY2hpY2FsLWdyaWQtcm93IFtncmlkSURdPVwiaWRcIiBbaW5kZXhdPVwicm93SW5kZXhcIiBbZGF0YV09XCJyb3dEYXRhXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dDbGFzc2VzIHwgaWd4R3JpZFJvd0NsYXNzZXM6cm93OnJvdy5pbkVkaXRNb2RlOnJvdy5zZWxlY3RlZDpyb3cuZGlydHk6cm93LmRlbGV0ZWQ6cm93LmRyYWdnaW5nOnJvd0luZGV4Omhhc0NvbHVtbkxheW91dHM6ZmFsc2U6cm93RGF0YTpwaXBlVHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwicm93U3R5bGVzIHwgaWd4R3JpZFJvd1N0eWxlczpyb3dEYXRhOnJvd0luZGV4OnBpcGVUcmlnZ2VyXCIgI3JvdyAjcGlubmVkUm93PlxuICAgICAgICAgICAgPC9pZ3gtaGllcmFyY2hpY2FsLWdyaWQtcm93PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2NoaWxkX3JlY29yZF90ZW1wbGF0ZSBsZXQtcm93SW5kZXg9XCJpbmRleFwiIGxldC1yb3dEYXRhPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm92ZXJmbG93OiBhdXRvOyB3aWR0aDogMTAwJTtcIiBbYXR0ci5kYXRhLXJvd2luZGV4XT0ncm93SW5kZXgnIChzY3JvbGwpPSdvbkNvbnRhaW5lclNjcm9sbCgpJ1xuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAnaWd4LWdyaWRfX3RyLWNvbnRhaW5lcic6IHRydWUsXG4gICAgICAgICAgICAgICAgJ2lneC1ncmlkX190ci0taGlnaGxpZ2h0ZWQnOmlzUm93SGlnaGxpZ2h0ZWQocm93RGF0YSlcbiAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICA8aWd4LWNoaWxkLWdyaWQtcm93ICpuZ0Zvcj1cImxldCBsYXlvdXQgb2YgY2hpbGRMYXlvdXRMaXN0XCIgW3BhcmVudEdyaWRJRF09XCJpZFwiIFtpbmRleF09XCJyb3dJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cInJvd0RhdGFcIiBbbGF5b3V0XT0nbGF5b3V0JyAjcm93PlxuICAgICAgICAgICAgICAgIDwvaWd4LWNoaWxkLWdyaWQtcm93PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoYXNQaW5uZWRSZWNvcmRzICYmICFpc1Jvd1Bpbm5pbmdUb1RvcCA/IHBpbm5lZFJlY29yZHNUZW1wbGF0ZSA6IG51bGxcIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIm1vdmluZyAmJiBjb2x1bW5JbkRyYWdcIiBbaWd4Q29sdW1uTW92aW5nRHJvcF09XCJoZWFkZXJDb250YWluZXJcIiBbYXR0ci5kcm9wcGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBpZD1cInJpZ2h0XCIgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctcmlnaHRcIj48L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fcm93LWVkaXRpbmctb3V0bGV0XCIgaWd4T3ZlcmxheU91dGxldCAjaWd4Um93RWRpdGluZ092ZXJsYXlPdXRsZXQ+PC9kaXY+XG4gICAgICAgIDxpZ2MtdHJpYWwtd2F0ZXJtYXJrICpuZ0lmPVwiIXRoaXMucGFyZW50XCI+PC9pZ2MtdHJpYWwtd2F0ZXJtYXJrPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWd4VG9nZ2xlICNsb2FkaW5nT3ZlcmxheT5cbiAgICAgICAgPGlneC1jaXJjdWxhci1iYXIgW2luZGV0ZXJtaW5hdGVdPVwidHJ1ZVwiICpuZ0lmPSdzaG91bGRPdmVybGF5TG9hZGluZyc+XG4gICAgICAgIDwvaWd4LWNpcmN1bGFyLWJhcj5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiAqbmdJZj1cIm1vdmluZyAmJiBjb2x1bW5JbkRyYWdcIiBbaWd4Q29sdW1uTW92aW5nRHJvcF09XCJoZWFkZXJDb250YWluZXJcIiBbYXR0ci5kcm9wcGFibGVdPVwidHJ1ZVwiXG4gICAgICAgIGlkPVwicmlnaHRcIiBjbGFzcz1cImlneC1ncmlkX19zY3JvbGwtb24tZHJhZy1yaWdodFwiPjwvc3Bhbj5cbiAgICA8ZGl2IFtoaWRkZW5dPSchaGFzVmVydGljYWxTY3JvbGwoKScgY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktc2Nyb2xsYmFyXCIgW3N0eWxlLndpZHRoLnB4XT1cInNjcm9sbFNpemVcIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1zY3JvbGxiYXItc3RhcnRcIiBbc3R5bGUuaGVpZ2h0LnB4XT0nIGlzUm93UGlubmluZ1RvVG9wID8gcGlubmVkUm93SGVpZ2h0IDogMCc+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktc2Nyb2xsYmFyLW1haW5cIiBbc3R5bGUuaGVpZ2h0LnB4XT0nY2FsY0hlaWdodCc+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgaWd4R3JpZEZvciBbaWd4R3JpZEZvck9mXT0nW10nICN2ZXJ0aWNhbFNjcm9sbEhvbGRlcj48L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1zY3JvbGxiYXItZW5kXCIgW3N0eWxlLmhlaWdodC5weF09JyFpc1Jvd1Bpbm5pbmdUb1RvcCA/IHBpbm5lZFJvd0hlaWdodCA6IDAnPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fYWRkcm93LXNuYWNrYmFyXCI+XG4gICAgICAgIDxpZ3gtc25hY2tiYXIgI2FkZFJvd1NuYWNrYmFyIFtvdXRsZXRdPVwiaWd4Qm9keU92ZXJsYXlPdXRsZXRcIiBbYWN0aW9uVGV4dF09XCJyZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfc25hY2tiYXJfYWRkcm93X2FjdGlvbnRleHRcIiBbZGlzcGxheVRpbWVdPSdzbmFja2JhckRpc3BsYXlUaW1lJz57e3Jlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9zbmFja2Jhcl9hZGRyb3dfbGFiZWx9fTwvaWd4LXNuYWNrYmFyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBpZ3hPdmVybGF5T3V0bGV0ICNpZ3hCb2R5T3ZlcmxheU91dGxldD1cIm92ZXJsYXktb3V0bGV0XCI+PC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImlneC1ncmlkX190Zm9vdFwiIHJvbGU9XCJyb3dncm91cFwiIFtzdHlsZS5oZWlnaHQucHhdPSdzdW1tYXJ5Um93SGVpZ2h0JyAjdGZvb3Q+XG4gICAgPGRpdiB0YWJpbmRleD1cIjBcIiAoZm9jdXMpPVwibmF2aWdhdGlvbi5mb2N1c0ZpcnN0Q2VsbChmYWxzZSlcIiBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiYWN0aXZlRGVzY2VuZGFudFwiXG4gICAgIChrZXlkb3duKT1cIm5hdmlnYXRpb24uc3VtbWFyeU5hdigkZXZlbnQpXCI+XG4gICAgICAgIDxpZ3gtZ3JpZC1zdW1tYXJ5LXJvdyBbc3R5bGUud2lkdGgucHhdPSdjYWxjV2lkdGgnIFtzdHlsZS5oZWlnaHQucHhdPSdzdW1tYXJ5Um93SGVpZ2h0J1xuICAgICAgICAgICAgKm5nSWY9XCJoYXNTdW1tYXJpemVkQ29sdW1ucyAmJiByb290U3VtbWFyaWVzRW5hYmxlZFwiIFtncmlkSURdPVwiaWRcIiByb2xlPVwicm93XCJcbiAgICAgICAgICAgIFtzdW1tYXJpZXNdPVwiaWQgfCBpZ3hHcmlkU3VtbWFyeURhdGFQaXBlOnN1bW1hcnlTZXJ2aWNlLnJldHJpZ2dlclJvb3RQaXBlXCIgW2luZGV4XT1cImRhdGFWaWV3Lmxlbmd0aFwiXG4gICAgICAgICAgICBjbGFzcz1cImlneC1ncmlkX19zdW1tYXJpZXNcIiAjc3VtbWFyeVJvdz5cbiAgICAgICAgPC9pZ3gtZ3JpZC1zdW1tYXJ5LXJvdz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190Zm9vdC10aHVtYlwiIFtoaWRkZW5dPSchaGFzVmVydGljYWxTY3JvbGwoKScgW3N0eWxlLmhlaWdodC5weF09J3N1bW1hcnlSb3dIZWlnaHQnXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwic2Nyb2xsU2l6ZVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsXCIgW3N0eWxlLmhlaWdodC5weF09XCJzY3JvbGxTaXplXCIgI3NjciBbaGlkZGVuXT1cImlzSG9yaXpvbnRhbFNjcm9sbEhpZGRlblwiICAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1zdGFydFwiIFtzdHlsZS53aWR0aC5weF09J2lzUGlubmluZ1RvU3RhcnQgPyBwaW5uZWRXaWR0aCA6IGhlYWRlckZlYXR1cmVzV2lkdGgnIFtzdHlsZS5taW4td2lkdGgucHhdPSdpc1Bpbm5pbmdUb1N0YXJ0ID8gcGlubmVkV2lkdGggOiBoZWFkZXJGZWF0dXJlc1dpZHRoJz48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1tYWluXCIgW3N0eWxlLndpZHRoLnB4XT0ndW5waW5uZWRXaWR0aCc+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hHcmlkRm9yIFtpZ3hHcmlkRm9yT2ZdPSdbXScgI3Njcm9sbENvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1lbmRcIiBbc3R5bGUuZmxvYXRdPSdcInJpZ2h0XCInIFtzdHlsZS53aWR0aC5weF09J3Bpbm5lZFdpZHRoJyBbc3R5bGUubWluLXdpZHRoLnB4XT0ncGlubmVkV2lkdGgnIFtoaWRkZW5dPVwicGlubmVkV2lkdGggPT09IDAgfHwgaXNQaW5uaW5nVG9TdGFydFwiPjwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fZm9vdGVyXCIgI2Zvb3Rlcj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtZ3JpZC1mb290ZXJcIj48L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXBhZ2luYXRvclwiPjwvbmctY29udGVudD5cbiAgICA8bmctY29udGFpbmVyICNwYWdpbmF0b3JPdXRsZXQ+PC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNlbXB0eUZpbHRlcmVkR3JpZD5cbiAgICA8c3BhbiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1tZXNzYWdlXCIgcm9sZT1cImNlbGxcIj5cbiAgICAgICAgPHNwYW4+e3tlbXB0eUZpbHRlcmVkR3JpZE1lc3NhZ2V9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nSWY9J3Nob3dBZGRCdXR0b24nPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD0nYWRkUm93RW1wdHlUZW1wbGF0ZSB8fCBkZWZhdWx0QWRkUm93RW1wdHlUZW1wbGF0ZSc+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRFbXB0eUdyaWQ+XG4gICAgPHNwYW4gY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktbWVzc2FnZVwiIHJvbGU9XCJjZWxsXCI+XG4gICAgICAgIDxzcGFuPnt7ZW1wdHlHcmlkTWVzc2FnZX19PC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj0nc2hvd0FkZEJ1dHRvbic+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PSdhZGRSb3dFbXB0eVRlbXBsYXRlIHx8IGRlZmF1bHRBZGRSb3dFbXB0eVRlbXBsYXRlJz48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEFkZFJvd0VtcHR5VGVtcGxhdGU+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uPVwicmFpc2VkXCIgaWd4UmlwcGxlIChjbGljayk9XCJ0aGlzLmNydWRTZXJ2aWNlLmVudGVyQWRkUm93TW9kZShudWxsLCBmYWxzZSwgJGV2ZW50KVwiPlxuICAgICAgICB7e3Jlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9hZGRfcm93X2xhYmVsfX1cbiAgICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRpbmdHcmlkPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fbG9hZGluZ1wiPlxuICAgICAgICA8aWd4LWNpcmN1bGFyLWJhciBbaW5kZXRlcm1pbmF0ZV09XCJ0cnVlXCI+XG4gICAgICAgIDwvaWd4LWNpcmN1bGFyLWJhcj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdENvbGxhcHNlZFRlbXBsYXRlPlxuICAgIDxpZ3gtaWNvbiByb2xlPVwiYnV0dG9uXCI+dW5mb2xkX21vcmU8L2lneC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0RXhwYW5kZWRUZW1wbGF0ZT5cbiAgICA8aWd4LWljb24gcm9sZT1cImJ1dHRvblwiIFthY3RpdmVdPSdoYXNFeHBhbmRlZFJlY29yZHMoKSAmJiBoYXNFeHBhbmRhYmxlQ2hpbGRyZW4nPnVuZm9sZF9sZXNzPC9pZ3gtaWNvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgKm5nSWY9XCJyb3dFZGl0YWJsZVwiIGlneFRvZ2dsZSAjcm93RWRpdGluZ092ZXJsYXk+XG4gICAgPGRpdiBbY2xhc3NOYW1lXT1cImJhbm5lckNsYXNzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwicmVzb2x2ZVJvd0VkaXRDb250YWluZXI7IGNvbnRleHQ6IHsgcm93Q2hhbmdlc0NvdW50OiByb3dDaGFuZ2VzQ291bnQsIGVuZEVkaXQ6IHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdC5iaW5kKHRoaXMpIH1cIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJvd0VkaXRUZXh0PlxuICAgIFlvdSBoYXZlIHt7IHJvd0NoYW5nZXNDb3VudCB9fSBjaGFuZ2VzIGluIHRoaXMgcm93IGFuZCB7eyBoaWRkZW5Db2x1bW5zQ291bnQgfX0gaGlkZGVuIGNvbHVtbnNcbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRSb3dFZGl0QWN0aW9ucz5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZ3hCdXR0b24gaWd4Um93RWRpdFRhYlN0b3AgKGNsaWNrKT1cInRoaXMuZW5kUm93RWRpdFRhYlN0b3AoZmFsc2UsICRldmVudClcIj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9yb3dfZWRpdF9idG5fY2FuY2VsIH19PC9idXR0b24+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uIGlneFJvd0VkaXRUYWJTdG9wIChjbGljayk9XCJ0aGlzLmVuZFJvd0VkaXRUYWJTdG9wKHRydWUsICRldmVudClcIj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9yb3dfZWRpdF9idG5fZG9uZSB9fTwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJvd0VkaXRUZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWJhbm5lcl9fbWVzc2FnZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImlneC1iYW5uZXJfX3RleHRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRoaXMuY3J1ZFNlcnZpY2Uucm93Py5nZXRDbGFzc05hbWUoKSA9PT0gJ0lneEFkZFJvdycgPyByb3dBZGRUZXh0VGVtcGxhdGUgOiByZXNvbHZlUm93RWRpdFRleHQgfHwgZGVmYXVsdFJvd0VkaXRUZXh0O1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgJGltcGxpY2l0OiB0aGlzLmNydWRTZXJ2aWNlLnJvdz8uZ2V0Q2xhc3NOYW1lKCkgIT09ICdJZ3hBZGRSb3cnID8gcm93Q2hhbmdlc0NvdW50IDogbnVsbCB9XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtYmFubmVyX19hY3Rpb25zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtYmFubmVyX19yb3dcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInJlc29sdmVSb3dFZGl0QWN0aW9ucyB8fCBkZWZhdWx0Um93RWRpdEFjdGlvbnM7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB0aGlzLmVuZEVkaXQuYmluZCh0aGlzKSB9XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RyYWdJbmRpY2F0b3JJY29uQmFzZT5cbiAgICA8aWd4LWljb24+ZHJhZ19pbmRpY2F0b3I8L2lneC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGlneC1ncmlkLWNvbHVtbi1yZXNpemVyICpuZ0lmPVwiY29sUmVzaXppbmdTZXJ2aWNlLnNob3dSZXNpemVyXCI+PC9pZ3gtZ3JpZC1jb2x1bW4tcmVzaXplcj5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fbG9hZGluZy1vdXRsZXRcIiAjaWd4TG9hZGluZ092ZXJsYXlPdXRsZXQgaWd4T3ZlcmxheU91dGxldD48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fb3V0bGV0XCIgI2lneEZpbHRlcmluZ092ZXJsYXlPdXRsZXQgaWd4T3ZlcmxheU91dGxldD48L2Rpdj5cbiJdfQ==