igniteui-angular 16.1.2 → 16.1.3

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 (66) hide show
  1. package/README.md +6 -5
  2. package/esm2022/lib/action-strip/action-strip.component.mjs +3 -3
  3. package/esm2022/lib/action-strip/grid-actions/grid-action-button.component.mjs +3 -3
  4. package/esm2022/lib/banner/banner.component.mjs +8 -8
  5. package/esm2022/lib/card/card.component.mjs +3 -3
  6. package/esm2022/lib/carousel/carousel.component.mjs +7 -7
  7. package/esm2022/lib/combo/combo-dropdown.component.mjs +3 -3
  8. package/esm2022/lib/combo/combo.common.mjs +5 -5
  9. package/esm2022/lib/combo/combo.component.mjs +3 -3
  10. package/esm2022/lib/combo/combo.directives.mjs +2 -2
  11. package/esm2022/lib/core/navigation/directives.mjs +3 -3
  12. package/esm2022/lib/date-common/calendar-container/calendar-container.component.mjs +3 -3
  13. package/esm2022/lib/date-picker/date-picker.component.mjs +7 -7
  14. package/esm2022/lib/date-range-picker/date-range-picker.component.mjs +6 -6
  15. package/esm2022/lib/dialog/dialog.component.mjs +5 -5
  16. package/esm2022/lib/directives/button/button.directive.mjs +8 -8
  17. package/esm2022/lib/directives/ripple/ripple.directive.mjs +6 -6
  18. package/esm2022/lib/directives/tooltip/tooltip-target.directive.mjs +7 -9
  19. package/esm2022/lib/directives/tooltip/tooltip.directive.mjs +2 -2
  20. package/esm2022/lib/drop-down/drop-down.component.mjs +3 -3
  21. package/esm2022/lib/expansion-panel/expansion-panel.component.mjs +4 -4
  22. package/esm2022/lib/grids/column-actions/column-actions.component.mjs +3 -3
  23. package/esm2022/lib/grids/common/crud.service.mjs +2 -2
  24. package/esm2022/lib/grids/filtering/base/grid-filtering-row.component.mjs +3 -3
  25. package/esm2022/lib/grids/filtering/excel-style/excel-style-custom-dialog.component.mjs +3 -3
  26. package/esm2022/lib/grids/filtering/excel-style/excel-style-date-expression.component.mjs +3 -3
  27. package/esm2022/lib/grids/filtering/excel-style/excel-style-default-expression.component.mjs +3 -3
  28. package/esm2022/lib/grids/filtering/excel-style/excel-style-header.component.mjs +3 -3
  29. package/esm2022/lib/grids/filtering/excel-style/excel-style-moving.component.mjs +3 -3
  30. package/esm2022/lib/grids/filtering/excel-style/excel-style-search.component.mjs +3 -3
  31. package/esm2022/lib/grids/filtering/excel-style/excel-style-sorting.component.mjs +3 -3
  32. package/esm2022/lib/grids/grid/grid.component.mjs +3 -3
  33. package/esm2022/lib/grids/grid-base.directive.mjs +4 -4
  34. package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid.component.mjs +3 -3
  35. package/esm2022/lib/grids/tree-grid/tree-grid.component.mjs +3 -3
  36. package/esm2022/lib/query-builder/query-builder.component.mjs +3 -3
  37. package/esm2022/lib/simple-combo/simple-combo.component.mjs +3 -3
  38. package/esm2022/lib/snackbar/snackbar.component.mjs +4 -4
  39. package/esm2022/lib/tabs/tabs/tabs.component.mjs +3 -3
  40. package/esm2022/lib/time-picker/time-picker.component.mjs +6 -5
  41. package/esm2022/lib/toast/toast.component.mjs +2 -2
  42. package/esm2022/lib/tree/tree-node/tree-node.component.mjs +4 -4
  43. package/fesm2022/igniteui-angular.mjs +117 -118
  44. package/fesm2022/igniteui-angular.mjs.map +1 -1
  45. package/lib/banner/banner.component.d.ts +5 -5
  46. package/lib/card/card.component.d.ts +2 -2
  47. package/lib/carousel/carousel.component.d.ts +6 -6
  48. package/lib/combo/combo.common.d.ts +4 -4
  49. package/lib/combo/combo.directives.d.ts +1 -1
  50. package/lib/core/navigation/directives.d.ts +2 -2
  51. package/lib/date-picker/date-picker.component.d.ts +4 -4
  52. package/lib/date-range-picker/date-range-picker.component.d.ts +3 -3
  53. package/lib/dialog/dialog.component.d.ts +4 -4
  54. package/lib/directives/button/button.directive.d.ts +7 -7
  55. package/lib/directives/ripple/ripple.directive.d.ts +6 -6
  56. package/lib/directives/tooltip/tooltip-target.directive.d.ts +6 -8
  57. package/lib/directives/tooltip/tooltip.directive.d.ts +1 -1
  58. package/lib/expansion-panel/expansion-panel.component.d.ts +3 -3
  59. package/lib/grids/common/crud.service.d.ts +1 -1
  60. package/lib/grids/grid-base.directive.d.ts +3 -3
  61. package/lib/snackbar/snackbar.component.d.ts +1 -1
  62. package/lib/time-picker/time-picker.component.d.ts +1 -1
  63. package/lib/toast/toast.component.d.ts +1 -1
  64. package/lib/tree/tree-node/tree-node.component.d.ts +3 -3
  65. package/migrations/common/UpdateChanges.js +1 -1
  66. package/package.json +1 -1
@@ -920,7 +920,7 @@ export class IgxHierarchicalGridComponent extends IgxHierarchicalGridBaseDirecti
920
920
  IgxForOfSyncService,
921
921
  IgxForOfScrollSyncService,
922
922
  IgxRowIslandAPIService
923
- ], queries: [{ 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 [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.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: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: IgxGridHeaderRowComponent, selector: "igx-grid-header-row", inputs: ["grid", "pinnedColumnCollection", "unpinnedColumnCollection", "activeDescendant", "hasMRL", "width", "density"] }, { kind: "directive", type: IgxGridBodyDirective, selector: "[igxGridBody]" }, { kind: "directive", type: IgxGridDragSelectDirective, selector: "[igxGridDragSelect]", inputs: ["igxGridDragSelect"], outputs: ["dragStop", "dragScroll"] }, { kind: "directive", type: IgxColumnMovingDropDirective, selector: "[igxColumnMovingDrop]", inputs: ["igxColumnMovingDrop"] }, { kind: "directive", type: IgxGridForOfDirective, selector: "[igxGridFor][igxGridForOf]", inputs: ["igxGridForOf", "igxGridForOfUniqueSizeCache", "igxGridForOfVariableSizes"], outputs: ["dataChanging"] }, { kind: "directive", type: IgxTemplateOutletDirective, selector: "[igxTemplateOutlet]", inputs: ["igxTemplateOutletContext", "igxTemplateOutlet"], outputs: ["viewCreated", "viewMoved", "cachedViewLoaded", "beforeViewDetach"] }, { kind: "component", type: IgxHierarchicalRowComponent, selector: "igx-hierarchical-grid-row" }, { kind: "directive", type: IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { kind: "directive", type: IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { kind: "component", type: IgxCircularProgressBarComponent, selector: "igx-circular-bar", inputs: ["id", "isIndeterminate", "textVisibility", "text"] }, { kind: "component", type: IgxSnackbarComponent, selector: "igx-snackbar", inputs: ["id", "actionText", "positionSettings"], outputs: ["clicked", "animationStarted", "animationDone"] }, { kind: "component", type: IgxSummaryRowComponent, selector: "igx-grid-summary-row", inputs: ["summaries", "gridID", "index", "firstCellIndentation"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { kind: "directive", type: IgxRippleDirective, selector: "[igxRipple]", inputs: ["igxRippleTarget", "igxRipple", "igxRippleDuration", "igxRippleCentered", "igxRippleDisabled"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: IgxRowEditTabStopDirective, selector: "[igxRowEditTabStop]" }, { kind: "component", type: IgxGridColumnResizerComponent, selector: "igx-grid-column-resizer", inputs: ["restrictResizerTop"] }, { kind: "component", type: IgxChildGridRowComponent, selector: "igx-child-grid-row", inputs: ["layout", "parentGridID", "data", "index"] }, { kind: "pipe", type: IgxGridSortingPipe, name: "gridSort" }, { kind: "pipe", type: IgxGridFilteringPipe, name: "gridFiltering" }, { kind: "pipe", type: IgxGridTransactionPipe, name: "gridTransaction" }, { kind: "pipe", type: IgxHasVisibleColumnsPipe, name: "visibleColumns" }, { kind: "pipe", type: IgxGridRowPinningPipe, name: "gridRowPinning" }, { kind: "pipe", type: IgxGridAddRowPipe, name: "gridAddRow" }, { kind: "pipe", type: IgxGridRowClassesPipe, name: "igxGridRowClasses" }, { kind: "pipe", type: IgxGridRowStylesPipe, name: "igxGridRowStyles" }, { kind: "pipe", type: IgxSummaryDataPipe, name: "igxGridSummaryDataPipe" }, { kind: "pipe", type: IgxGridHierarchicalPipe, name: "gridHierarchical" }, { kind: "pipe", type: IgxGridHierarchicalPagingPipe, name: "gridHierarchicalPaging" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
923
+ ], queries: [{ 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 [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.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: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: IgxGridHeaderRowComponent, selector: "igx-grid-header-row", inputs: ["grid", "pinnedColumnCollection", "unpinnedColumnCollection", "activeDescendant", "hasMRL", "width", "density"] }, { kind: "directive", type: IgxGridBodyDirective, selector: "[igxGridBody]" }, { kind: "directive", type: IgxGridDragSelectDirective, selector: "[igxGridDragSelect]", inputs: ["igxGridDragSelect"], outputs: ["dragStop", "dragScroll"] }, { kind: "directive", type: IgxColumnMovingDropDirective, selector: "[igxColumnMovingDrop]", inputs: ["igxColumnMovingDrop"] }, { kind: "directive", type: IgxGridForOfDirective, selector: "[igxGridFor][igxGridForOf]", inputs: ["igxGridForOf", "igxGridForOfUniqueSizeCache", "igxGridForOfVariableSizes"], outputs: ["dataChanging"] }, { kind: "directive", type: IgxTemplateOutletDirective, selector: "[igxTemplateOutlet]", inputs: ["igxTemplateOutletContext", "igxTemplateOutlet"], outputs: ["viewCreated", "viewMoved", "cachedViewLoaded", "beforeViewDetach"] }, { kind: "component", type: IgxHierarchicalRowComponent, selector: "igx-hierarchical-grid-row" }, { kind: "directive", type: IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { kind: "directive", type: IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { kind: "component", type: IgxCircularProgressBarComponent, selector: "igx-circular-bar", inputs: ["id", "isIndeterminate", "textVisibility", "text"] }, { kind: "component", type: IgxSnackbarComponent, selector: "igx-snackbar", inputs: ["id", "actionText", "positionSettings"], outputs: ["clicked", "animationStarted", "animationDone"] }, { kind: "component", type: IgxSummaryRowComponent, selector: "igx-grid-summary-row", inputs: ["summaries", "gridID", "index", "firstCellIndentation"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { kind: "directive", type: IgxRippleDirective, selector: "[igxRipple]", inputs: ["igxRippleTarget", "igxRipple", "igxRippleDuration", "igxRippleCentered", "igxRippleDisabled"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: IgxRowEditTabStopDirective, selector: "[igxRowEditTabStop]" }, { kind: "component", type: IgxGridColumnResizerComponent, selector: "igx-grid-column-resizer", inputs: ["restrictResizerTop"] }, { kind: "component", type: IgxChildGridRowComponent, selector: "igx-child-grid-row", inputs: ["layout", "parentGridID", "data", "index"] }, { kind: "pipe", type: IgxGridSortingPipe, name: "gridSort" }, { kind: "pipe", type: IgxGridFilteringPipe, name: "gridFiltering" }, { kind: "pipe", type: IgxGridTransactionPipe, name: "gridTransaction" }, { kind: "pipe", type: IgxHasVisibleColumnsPipe, name: "visibleColumns" }, { kind: "pipe", type: IgxGridRowPinningPipe, name: "gridRowPinning" }, { kind: "pipe", type: IgxGridAddRowPipe, name: "gridAddRow" }, { kind: "pipe", type: IgxGridRowClassesPipe, name: "igxGridRowClasses" }, { kind: "pipe", type: IgxGridRowStylesPipe, name: "igxGridRowStyles" }, { kind: "pipe", type: IgxSummaryDataPipe, name: "igxGridSummaryDataPipe" }, { kind: "pipe", type: IgxGridHierarchicalPipe, name: "gridHierarchical" }, { kind: "pipe", type: IgxGridHierarchicalPagingPipe, name: "gridHierarchicalPaging" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
924
924
  }
925
925
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: IgxHierarchicalGridComponent, decorators: [{
926
926
  type: Component,
@@ -972,7 +972,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImpor
972
972
  IgxSummaryDataPipe,
973
973
  IgxGridHierarchicalPipe,
974
974
  IgxGridHierarchicalPagingPipe
975
- ], schemas: [CUSTOM_ELEMENTS_SCHEMA], 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 [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.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
+ ], schemas: [CUSTOM_ELEMENTS_SCHEMA], 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 [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.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']
@@ -1015,4 +1015,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImpor
1015
1015
  }], expandChildren: [{
1016
1016
  type: Input
1017
1017
  }] } });
1018
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2hpY2FsLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2dyaWRzL2hpZXJhcmNoaWNhbC1ncmlkL2hpZXJhcmNoaWNhbC1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9oaWVyYXJjaGljYWwtZ3JpZC9jaGlsZC1ncmlkLXJvdy5jb21wb25lbnQuaHRtbCIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9oaWVyYXJjaGljYWwtZ3JpZC9oaWVyYXJjaGljYWwtZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBQ2Ysc0JBQXNCLEVBR3RCLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUlMLG9CQUFvQixFQUVwQixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWxGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTFFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxD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Q0FBQzs4QkFTMUIsSUFBSTtzQkFEVixXQUFXO3VCQUFDLFdBQVc7Z0JBT2pCLGVBQWU7c0JBRHJCLGVBQWU7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRTtnQkFPcEYsYUFBYTtzQkFEbkIsZUFBZTt1QkFBQyxxQkFBcUIsRUFBRSxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQUtuRixhQUFhO3NCQURuQixlQUFlO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFLdEQsYUFBYTtzQkFEbkIsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBSy9DLGVBQWU7c0JBRHJCLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBTWpELGVBQWU7c0JBRHJCLFlBQVk7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUU7Z0JBT3ZFLGdCQUFnQjtzQkFEdEIsWUFBWTt1QkFBQyx3QkFBd0I7Z0JBSTVCLDBCQUEwQjtzQkFEbkMsU0FBUzt1QkFBQyw4QkFBOEIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJcEUsYUFBYTtzQkFEdEIsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFpRDVELEVBQUU7c0JBRlosV0FBVzt1QkFBQyxTQUFTOztzQkFDckIsS0FBSztnQkFpQkssSUFBSTtzQkFEZCxLQUFLO2dCQXdESyxjQUFjO3NCQUR4QixLQUFLO2dCQW1CSyxjQUFjO3NCQUR4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxuICAgIERvQ2hlY2ssXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBRdWVyeUxpc3QsXG4gICAgcmVmbGVjdENvbXBvbmVudFR5cGUsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0lmLCBOZ0NsYXNzLCBOZ0ZvciwgTmdUZW1wbGF0ZU91dGxldCwgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IElneEhpZXJhcmNoaWNhbEdyaWRBUElTZXJ2aWNlIH0gZnJvbSAnLi9oaWVyYXJjaGljYWwtZ3JpZC1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hSb3dJc2xhbmRDb21wb25lbnQgfSBmcm9tICcuL3Jvdy1pc2xhbmQuY29tcG9uZW50JztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi9maWx0ZXJpbmcvZ3JpZC1maWx0ZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQsIH0gZnJvbSAnLi4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElneEhpZXJhcmNoaWNhbEdyaWROYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vaGllcmFyY2hpY2FsLWdyaWQtbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRTdW1tYXJ5U2VydmljZSB9IGZyb20gJy4uL3N1bW1hcmllcy9ncmlkLXN1bW1hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hIaWVyYXJjaGljYWxHcmlkQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4vaGllcmFyY2hpY2FsLWdyaWQtYmFzZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3RlbXBsYXRlLW91dGxldC90ZW1wbGF0ZV9vdXRsZXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VsZWN0aW9uL3NlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneEZvck9mU3luY1NlcnZpY2UsIElneEZvck9mU2Nyb2xsU3luY1NlcnZpY2UgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2Zvci1vZi9mb3Jfb2Yuc3luYy5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxUeXBlLCBHcmlkVHlwZSwgSUdYX0dSSURfQkFTRSwgSUdYX0dSSURfU0VSVklDRV9CQVNFLCBSb3dUeXBlIH0gZnJvbSAnLi4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElneFJvd0lzbGFuZEFQSVNlcnZpY2UgfSBmcm9tICcuL3Jvdy1pc2xhbmQtYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZENSVURTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL2NydWQuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hIaWVyYXJjaGljYWxHcmlkUm93IH0gZnJvbSAnLi4vZ3JpZC1wdWJsaWMtcm93JztcbmltcG9ydCB7IElneEdyaWRDZWxsIH0gZnJvbSAnLi4vZ3JpZC1wdWJsaWMtY2VsbCc7XG5pbXBvcnQgeyBJZ3hQYWdpbmF0b3JDb21wb25lbnQgfSBmcm9tICcuLi8uLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3JpZC9ncmlkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBJZ3hUb2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3RvZ2dsZS90b2dnbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneENvbHVtblJlc2l6aW5nU2VydmljZSB9IGZyb20gJy4uL3Jlc2l6aW5nL3Jlc2l6aW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgfSBmcm9tICcuLi9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZXhjZWwtc3R5bGUtZmlsdGVyaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9ncmlkL2dyaWQtdmFsaWRhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRIaWVyYXJjaGljYWxQaXBlLCBJZ3hHcmlkSGllcmFyY2hpY2FsUGFnaW5nUGlwZSB9IGZyb20gJy4vaGllcmFyY2hpY2FsLWdyaWQucGlwZXMnO1xuaW1wb3J0IHsgSWd4U3VtbWFyeURhdGFQaXBlIH0gZnJvbSAnLi4vc3VtbWFyaWVzL2dyaWQtcm9vdC1zdW1tYXJ5LnBpcGUnO1xuaW1wb3J0IHsgSWd4R3JpZFRyYW5zYWN0aW9uUGlwZSwgSWd4SGFzVmlzaWJsZUNvbHVtbnNQaXBlLCBJZ3hHcmlkUm93UGlubmluZ1BpcGUsIElneEdyaWRBZGRSb3dQaXBlLCBJZ3hHcmlkUm93Q2xhc3Nlc1BpcGUsIElneEdyaWRSb3dTdHlsZXNQaXBlIH0gZnJvbSAnLi4vY29tbW9uL3BpcGVzJztcbmltcG9ydCB7IElneEdyaWRTb3J0aW5nUGlwZSwgSWd4R3JpZEZpbHRlcmluZ1BpcGUgfSBmcm9tICcuLi9ncmlkL2dyaWQucGlwZXMnO1xuaW1wb3J0IHsgSWd4R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQgfSBmcm9tICcuLi9yZXNpemluZy9yZXNpemVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZSB9IGZyb20gJy4uL2dyaWQucm93RWRpdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4UmlwcGxlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9yaXBwbGUvcmlwcGxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hCdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2J1dHRvbi9idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IElneFN1bW1hcnlSb3dDb21wb25lbnQgfSBmcm9tICcuLi9zdW1tYXJpZXMvc3VtbWFyeS1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IElneFNuYWNrYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc25hY2tiYXIvc25hY2tiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IElneENpcmN1bGFyUHJvZ3Jlc3NCYXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9wcm9ncmVzc2Jhci9wcm9ncmVzc2Jhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4SGllcmFyY2hpY2FsUm93Q29tcG9uZW50IH0gZnJvbSAnLi9oaWVyYXJjaGljYWwtcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2Zvci1vZi9mb3Jfb2YuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneENvbHVtbk1vdmluZ0Ryb3BEaXJlY3RpdmUgfSBmcm9tICcuLi9tb3ZpbmcvbW92aW5nLmRyb3AuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEdyaWREcmFnU2VsZWN0RGlyZWN0aXZlIH0gZnJvbSAnLi4vc2VsZWN0aW9uL2RyYWctc2VsZWN0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hHcmlkQm9keURpcmVjdGl2ZSB9IGZyb20gJy4uL2dyaWQuY29tbW9uJztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJSb3dDb21wb25lbnQgfSBmcm9tICcuLi9oZWFkZXJzL2dyaWQtaGVhZGVyLXJvdy5jb21wb25lbnQnO1xuXG5sZXQgTkVYVF9JRCA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGllcmFyY2hpY2FsU3RhdGVSZWNvcmQge1xuICAgIHJvd0lEOiBhbnk7XG59XG5cbkBDb21wb25lbnQoe1xuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHNlbGVjdG9yOiAnaWd4LWNoaWxkLWdyaWQtcm93JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2hpbGQtZ3JpZC1yb3cuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW05nQ2xhc3NdXG59KVxuZXhwb3J0IGNsYXNzIElneENoaWxkR3JpZFJvd0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCB7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbGF5b3V0OiBJZ3hSb3dJc2xhbmRDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBwYXJlbnRIYXNTY3JvbGwoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5wYXJlbnRHcmlkLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmRjLmluc3RhbmNlLm5vdFZpcnR1YWw7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcGFyZW50R3JpZElEOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiAgVGhlIGRhdGEgcGFzc2VkIHRvIHRoZSByb3cgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldCB0aGUgcm93IGRhdGEgZm9yIHRoZSBmaXJzdCBzZWxlY3RlZCByb3dcbiAgICAgKiBsZXQgc2VsZWN0ZWRSb3dEYXRhID0gdGhpcy5ncmlkLnNlbGVjdGVkUm93c1swXS5kYXRhO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBkYXRhKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhIHx8IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZGF0YSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuaEdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMuaEdyaWQuZGF0YSA9IHRoaXMuX2RhdGEuY2hpbGRHcmlkc0RhdGFbdGhpcy5sYXlvdXQua2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIHJvdy5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXQgdGhlIGluZGV4IG9mIHRoZSBzZWNvbmQgc2VsZWN0ZWQgcm93XG4gICAgICogbGV0IHNlbGVjdGVkUm93SW5kZXggPSB0aGlzLmdyaWQuc2VsZWN0ZWRSb3dzWzFdLmluZGV4O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGluZGV4OiBudW1iZXI7XG5cbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7cmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlfSlcbiAgICBwdWJsaWMgY29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBoR3JpZDogSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgZ3JpZCB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RlZCByb3cuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogaGFuZGxlUm93U2VsZWN0aW9uKGV2ZW50KSB7XG4gICAgICogIC8vIHRoZSBncmlkIG9uIHdoaWNoIHRoZSByb3dTZWxlY3RlZCBldmVudCB3YXMgdHJpZ2dlcmVkXG4gICAgICogIGNvbnN0IGdyaWQgPSBldmVudC5yb3cuZ3JpZDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtZ3JpZFxuICAgICAqICAgIFtkYXRhXT1cImRhdGFcIlxuICAgICAqICAgIChyb3dTZWxlY3RlZCk9XCJoYW5kbGVSb3dTZWxlY3Rpb24oJGV2ZW50KVwiPlxuICAgICAqICA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIC8vIFRPRE86IFJlZmFjdG9yXG4gICAgcHVibGljIGdldCBwYXJlbnRHcmlkKCk6IElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkQVBJLmdyaWQgYXMgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sZXZlbCcpXG4gICAgcHVibGljIGdldCBsZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0LmxldmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBuYXRpdmUgRE9NIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSByb3cuIENvdWxkIGJlIG51bGwgaW4gY2VydGFpbiBlbnZpcm9ubWVudHMuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0IHRoZSBuYXRpdmVFbGVtZW50IG9mIHRoZSBzZWNvbmQgc2VsZWN0ZWQgcm93XG4gICAgICogbGV0IHNlbGVjdGVkUm93TmF0aXZlRWxlbWVudCA9IHRoaXMuZ3JpZC5zZWxlY3RlZFJvd3NbMV0ubmF0aXZlRWxlbWVudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG5hdGl2ZUVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJvdyBpcyBleHBhbmRlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgUm93RXhwYW5kZWQgPSB0aGlzLmdyaWQxLnJvd0xpc3QuZmlyc3QuZXhwYW5kZWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZGVkID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIF9kYXRhOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChJR1hfR1JJRF9TRVJWSUNFX0JBU0UpIHB1YmxpYyByZWFkb25seSBncmlkQVBJOiBJZ3hIaWVyYXJjaGljYWxHcmlkQVBJU2VydmljZSxcbiAgICAgICAgcHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikgeyB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICBjb25zdCByZWYgPSB0aGlzLmNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudCwgeyBpbmplY3RvcjogdGhpcy5jb250YWluZXIuaW5qZWN0b3IgfSk7XG4gICAgICAgIHRoaXMuaEdyaWQgPSByZWYuaW5zdGFuY2U7XG4gICAgICAgIHRoaXMuaEdyaWQuZGF0YSA9IHRoaXMuZGF0YS5jaGlsZEdyaWRzRGF0YVt0aGlzLmxheW91dC5rZXldO1xuICAgICAgICB0aGlzLmxheW91dC5sYXlvdXRDaGFuZ2Uuc3Vic2NyaWJlKChjaCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlTGF5b3V0Q2hhbmdlcyhjaCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5sYXlvdXQuaW5pdGlhbENoYW5nZXM7XG4gICAgICAgIGNoYW5nZXMuZm9yRWFjaChjaGFuZ2UgPT4ge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlTGF5b3V0Q2hhbmdlcyhjaGFuZ2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5oR3JpZC5wYXJlbnQgPSB0aGlzLnBhcmVudEdyaWQ7XG4gICAgICAgIHRoaXMuaEdyaWQucGFyZW50SXNsYW5kID0gdGhpcy5sYXlvdXQ7XG4gICAgICAgIHRoaXMuaEdyaWQuY2hpbGRSb3cgPSB0aGlzO1xuICAgICAgICAvLyBoYW5kbGVyIGxvZ2ljIHRoYXQgcmUtZW1pdHMgaGdyaWQgZXZlbnRzIG9uIHRoZSByb3cgaXNsYW5kXG4gICAgICAgIHRoaXMuc2V0dXBFdmVudEVtaXR0ZXJzKCk7XG4gICAgICAgIHRoaXMubGF5b3V0LmdyaWRDcmVhdGVkLmVtaXQoe1xuICAgICAgICAgICAgb3duZXI6IHRoaXMubGF5b3V0LFxuICAgICAgICAgICAgcGFyZW50SUQ6IHRoaXMuZGF0YS5yb3dJRCxcbiAgICAgICAgICAgIGdyaWQ6IHRoaXMuaEdyaWRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuaEdyaWQuY2hpbGRMYXlvdXRMaXN0ID0gdGhpcy5sYXlvdXQuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IGxheW91dHMgPSB0aGlzLmhHcmlkLmNoaWxkTGF5b3V0TGlzdC50b0FycmF5KCk7XG4gICAgICAgIGxheW91dHMuZm9yRWFjaCgobCkgPT4gdGhpcy5oR3JpZC5ncmlkQVBJLnJlZ2lzdGVyQ2hpbGRSb3dJc2xhbmQobCkpO1xuICAgICAgICB0aGlzLnBhcmVudEdyaWQuZ3JpZEFQSS5yZWdpc3RlckNoaWxkR3JpZCh0aGlzLmRhdGEucm93SUQsIHRoaXMubGF5b3V0LmtleSwgdGhpcy5oR3JpZCk7XG4gICAgICAgIHRoaXMubGF5b3V0LnJvd0lzbGFuZEFQSS5yZWdpc3RlckNoaWxkR3JpZCh0aGlzLmRhdGEucm93SUQsIHRoaXMuaEdyaWQpO1xuXG4gICAgICAgIHRoaXMubGF5b3V0LmdyaWRJbml0aWFsaXplZC5lbWl0KHtcbiAgICAgICAgICAgIG93bmVyOiB0aGlzLmxheW91dCxcbiAgICAgICAgICAgIHBhcmVudElEOiB0aGlzLmRhdGEucm93SUQsXG4gICAgICAgICAgICBncmlkOiB0aGlzLmhHcmlkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaEdyaWQuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwRXZlbnRFbWl0dGVycygpIHtcbiAgICAgICAgY29uc3QgZGVzdHJ1Y3RvciA9IHRha2VVbnRpbCh0aGlzLmhHcmlkLmRlc3Ryb3kkKTtcblxuICAgICAgICBjb25zdCBtaXJyb3IgPSByZWZsZWN0Q29tcG9uZW50VHlwZShJZ3hHcmlkQ29tcG9uZW50KTtcbiAgICAgICAgLy8gZXhjbHVkZSBvdXRwdXRzIHJlbGF0ZWQgdG8gdHdvLXdheSBiaW5kaW5nIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgY29uc3QgaW5wdXROYW1lcyA9IG1pcnJvci5pbnB1dHMubWFwKGlucHV0ID0+IGlucHV0LnByb3BOYW1lKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IG1pcnJvci5vdXRwdXRzLmZpbHRlcihvID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nSW5wdXRQcm9wTmFtZSA9IG8ucHJvcE5hbWUuc2xpY2UoMCwgby5wcm9wTmFtZS5pbmRleE9mKCdDaGFuZ2UnKSk7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXROYW1lcy5pbmRleE9mKG1hdGNoaW5nSW5wdXRQcm9wTmFtZSkgPT09IC0xO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUT0RPOiBTa2lwIHRoZSBgcmVuZGVyZWRgIG91dHB1dC4gUmVuZGVyZWQgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIHBlciBncmlkLlxuICAgICAgICBvdXRwdXRzLmZpbHRlcihvID0+IG8ucHJvcE5hbWUgIT09ICdyZW5kZXJlZCcpLmZvckVhY2gob3V0cHV0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhHcmlkW291dHB1dC5wcm9wTmFtZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhHcmlkW291dHB1dC5wcm9wTmFtZV0ucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0ge307XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXJncy5vd25lciA9IHRoaXMuaEdyaWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0W291dHB1dC5wcm9wTmFtZV0uZW1pdChhcmdzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIF9oYW5kbGVMYXlvdXRDaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGFuZ2UgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoY2hhbmdlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaEdyaWRbY2hhbmdlXSA9IGNoYW5nZXNbY2hhbmdlXS5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHNlbGVjdG9yOiAnaWd4LWhpZXJhcmNoaWNhbC1ncmlkJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2hpZXJhcmNoaWNhbC1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgSWd4R3JpZENSVURTZXJ2aWNlLFxuICAgICAgICBJZ3hHcmlkVmFsaWRhdGlvblNlcnZpY2UsXG4gICAgICAgIElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICB7IHByb3ZpZGU6IElHWF9HUklEX1NFUlZJQ0VfQkFTRSwgdXNlQ2xhc3M6IElneEhpZXJhcmNoaWNhbEdyaWRBUElTZXJ2aWNlIH0sXG4gICAgICAgIHsgcHJvdmlkZTogSUdYX0dSSURfQkFTRSwgdXNlRXhpc3Rpbmc6IElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnQgfSxcbiAgICAgICAgSWd4R3JpZFN1bW1hcnlTZXJ2aWNlLFxuICAgICAgICBJZ3hGaWx0ZXJpbmdTZXJ2aWNlLFxuICAgICAgICBJZ3hIaWVyYXJjaGljYWxHcmlkTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgICAgIElneENvbHVtblJlc2l6aW5nU2VydmljZSxcbiAgICAgICAgSWd4Rm9yT2ZTeW5jU2VydmljZSxcbiAgICAgICAgSWd4Rm9yT2ZTY3JvbGxTeW5jU2VydmljZSxcbiAgICAgICAgSWd4Um93SXNsYW5kQVBJU2VydmljZVxuICAgIF0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE5nSWYsXG4gICAgICAgIE5nQ2xhc3MsXG4gICAgICAgIE5nRm9yLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBOZ1N0eWxlLFxuICAgICAgICBJZ3hHcmlkSGVhZGVyUm93Q29tcG9uZW50LFxuICAgICAgICBJZ3hHcmlkQm9keURpcmVjdGl2ZSxcbiAgICAgICAgSWd4R3JpZERyYWdTZWxlY3REaXJlY3RpdmUsXG4gICAgICAgIElneENvbHVtbk1vdmluZ0Ryb3BEaXJlY3RpdmUsXG4gICAgICAgIElneEdyaWRGb3JPZkRpcmVjdGl2ZSxcbiAgICAgICAgSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUsXG4gICAgICAgIElneEhpZXJhcmNoaWNhbFJvd0NvbXBvbmVudCxcbiAgICAgICAgSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSxcbiAgICAgICAgSWd4VG9nZ2xlRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDaXJjdWxhclByb2dyZXNzQmFyQ29tcG9uZW50LFxuICAgICAgICBJZ3hTbmFja2JhckNvbXBvbmVudCxcbiAgICAgICAgSWd4U3VtbWFyeVJvd0NvbXBvbmVudCxcbiAgICAgICAgSWd4QnV0dG9uRGlyZWN0aXZlLFxuICAgICAgICBJZ3hSaXBwbGVEaXJlY3RpdmUsXG4gICAgICAgIElneEljb25Db21wb25lbnQsXG4gICAgICAgIElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlLFxuICAgICAgICBJZ3hHcmlkQ29sdW1uUmVzaXplckNvbXBvbmVudCxcbiAgICAgICAgSWd4Q2hpbGRHcmlkUm93Q29tcG9uZW50LFxuICAgICAgICBJZ3hHcmlkU29ydGluZ1BpcGUsXG4gICAgICAgIElneEdyaWRGaWx0ZXJpbmdQaXBlLFxuICAgICAgICBJZ3hHcmlkVHJhbnNhY3Rpb25QaXBlLFxuICAgICAgICBJZ3hIYXNWaXNpYmxlQ29sdW1uc1BpcGUsXG4gICAgICAgIElneEdyaWRSb3dQaW5uaW5nUGlwZSxcbiAgICAgICAgSWd4R3JpZEFkZFJvd1BpcGUsXG4gICAgICAgIElneEdyaWRSb3dDbGFzc2VzUGlwZSxcbiAgICAgICAgSWd4R3JpZFJvd1N0eWxlc1BpcGUsXG4gICAgICAgIElneFN1bW1hcnlEYXRhUGlwZSxcbiAgICAgICAgSWd4R3JpZEhpZXJhcmNoaWNhbFBpcGUsXG4gICAgICAgIElneEdyaWRIaWVyYXJjaGljYWxQYWdpbmdQaXBlXG4gICAgXSxcbiAgICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudCBleHRlbmRzIElneEhpZXJhcmNoaWNhbEdyaWRCYXNlRGlyZWN0aXZlXG4gICAgaW1wbGVtZW50cyBHcmlkVHlwZSwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25Jbml0LCBPbkRlc3Ryb3ksIERvQ2hlY2sge1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIHJvbGUgPSAnZ3JpZCc7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dJc2xhbmRDb21wb25lbnQsIHsgcmVhZDogSWd4Um93SXNsYW5kQ29tcG9uZW50LCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgY2hpbGRMYXlvdXRMaXN0OiBRdWVyeUxpc3Q8SWd4Um93SXNsYW5kQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0lzbGFuZENvbXBvbmVudCwgeyByZWFkOiBJZ3hSb3dJc2xhbmRDb21wb25lbnQsIGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gICAgcHVibGljIGFsbExheW91dExpc3Q6IFF1ZXJ5TGlzdDxJZ3hSb3dJc2xhbmRDb21wb25lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hQYWdpbmF0b3JDb21wb25lbnQsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgICBwdWJsaWMgcGFnaW5hdG9yTGlzdDogUXVlcnlMaXN0PElneFBhZ2luYXRvckNvbXBvbmVudD47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAVmlld0NoaWxkKCd0b29sYmFyT3V0bGV0JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gICAgcHVibGljIHRvb2xiYXJPdXRsZXQ6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAVmlld0NoaWxkKCdwYWdpbmF0b3JPdXRsZXQnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgICBwdWJsaWMgcGFnaW5hdG9yT3V0bGV0OiBWaWV3Q29udGFpbmVyUmVmO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAVmlld0NoaWxkcmVuKElneFRlbXBsYXRlT3V0bGV0RGlyZWN0aXZlLCB7IHJlYWQ6IElneFRlbXBsYXRlT3V0bGV0RGlyZWN0aXZlIH0pXG4gICAgcHVibGljIHRlbXBsYXRlT3V0bGV0czogUXVlcnlMaXN0PGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hDaGlsZEdyaWRSb3dDb21wb25lbnQpXG4gICAgcHVibGljIGhpZXJhcmNoaWNhbFJvd3M6IFF1ZXJ5TGlzdDxJZ3hDaGlsZEdyaWRSb3dDb21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBoaWVyYXJjaGljYWxSZWNvcmRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NoaWxkX3JlY29yZF90ZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBjaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLy8gQFZpZXdDaGlsZCgnaGVhZGVySGllcmFyY2h5RXhwYW5kZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBnZXQgaGVhZGVySGllcmFyY2h5RXhwYW5kZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZWFkUm93Py5oZWFkZXJIaWVyYXJjaHlFeHBhbmRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGNoaWxkTGF5b3V0S2V5cyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBoaWdobGlnaHRlZFJvd0lEID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlT25SZW5kZXIgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyZW50OiBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2hpbGRSb3c6IElneENoaWxkR3JpZFJvd0NvbXBvbmVudDtcblxuICAgIHByaXZhdGUgX2RhdGE7XG4gICAgcHJpdmF0ZSBoX2lkID0gYGlneC1oaWVyYXJjaGljYWwtZ3JpZC0ke05FWFRfSUQrK31gO1xuICAgIHByaXZhdGUgY2hpbGRHcmlkVGVtcGxhdGVzOiBNYXA8YW55LCBhbnk+ID0gbmV3IE1hcCgpO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYGlkYCBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIG5vdCBwcm92aWRlZCBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtaGllcmFyY2hpY2FsLWdyaWQgW2lkXT1cIidpZ3gtaGdyaWQtMSdcIiBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtaGllcmFyY2hpY2FsLWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaF9pZDtcbiAgICB9XG4gICAgcHVibGljIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuaF9pZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IGxldHMgeW91IGZpbGwgdGhlIGBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50YCB3aXRoIGFuIGFycmF5IG9mIGRhdGEuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtaGllcmFyY2hpY2FsLWdyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWhpZXJhcmNoaWNhbC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZGF0YSh2YWx1ZTogYW55W10gfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB2YWx1ZSB8fCBbXTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbi51cGRhdGVBbGwodGhpcy5fZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkR2VuZXJhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBDb2x1bW5zKCk7XG4gICAgICAgICAgICB0aGlzLnJlZmxvdygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgKHRoaXMuaGVpZ2h0ID09PSBudWxsIHx8IHRoaXMuaGVpZ2h0LmluZGV4T2YoJyUnKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgaGVpZ2h0IHdpbGwgY2hhbmdlIGJhc2VkIG9uIGhvdyBtdWNoIGRhdGEgdGhlcmUgaXMsIHJlY2FsY3VsYXRlIHNpemVzIGluIGlneEZvck9mLlxuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBkYXRhIHNldCB0byB0aGUgYElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgZmlsdGVyZWREYXRhID0gdGhpcy5ncmlkLmZpbHRlcmVkRGF0YTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBkYXRhKCk6IGFueVtdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgcGFnaW5hdG9yKCkge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuaWQ7XG4gICAgICAgIHJldHVybiAoIXRoaXMucGFyZW50SXNsYW5kICYmIHRoaXMucGFnaW5hdGlvbkNvbXBvbmVudHM/LmZpcnN0KSB8fCB0aGlzLnJvb3RHcmlkLnBhZ2luYXRvckxpc3Q/LmZpbmQoKHBnKSA9PlxuICAgICAgICAgICAgcGcubmF0aXZlRWxlbWVudC5vZmZzZXRQYXJlbnQ/LmlkID09PSBpZCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBleGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50KCkgOiBJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudElzbGFuZCA/XG4gICAgICAgICAgICB0aGlzLnBhcmVudElzbGFuZC5leGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50cy5maXJzdCA6XG4gICAgICAgICAgICBzdXBlci5leGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIHByb3BlcnR5IGlzIHJlcXVpcmVkIGZvciByZW1vdGUgZ3JpZCB2aXJ0dWFsaXphdGlvbiB0byBmdW5jdGlvbiB3aGVuIGl0IGlzIGJvdW5kIHRvIHJlbW90ZSBkYXRhLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGl0ZW1Db3VudCA9IHRoaXMuZ3JpZDEudG90YWxJdGVtQ291bnQ7XG4gICAgICogdGhpcy5ncmlkMS50b3RhbEl0ZW1Db3VudCA9IDU1O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCB0b3RhbEl0ZW1Db3VudChjb3VudCkge1xuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnRvdGFsSXRlbUNvdW50ID0gY291bnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b3RhbEl0ZW1Db3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIudG90YWxJdGVtQ291bnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBpZiBhbGwgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudGAgc2hvdWxkIGJlIGV4cGFuZGVkL2NvbGxhcHNlZC5cbiAgICAgKiBEZWZ1bHQgdmFsdWUgaXMgZmFsc2UuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtaGllcmFyY2hpY2FsLWdyaWQgW2lkXT1cIidpZ3gtZ3JpZC0xJ1wiIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbZXhwYW5kQ2hpbGRyZW5dPVwidHJ1ZVwiPjwvaWd4LWhpZXJhcmNoaWNhbC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZXhwYW5kQ2hpbGRyZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEV4cGFuZFN0YXRlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVzID0gbmV3IE1hcDxhbnksIGJvb2xlYW4+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBpZiBhbGwgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudGAgcHJldmlvdXNseSBoYXZlIGJlZW4gc2V0IHRvIGJlIGV4cGFuZGVkL2NvbGxhcHNlZC5cbiAgICAgKiBJZiBwcmV2aW91c2x5IHNldCBhbmQgc29tZSByb3dzIGhhdmUgYmVlbiBtYW51YWxseSBleHBhbmRlZC9jb2xsYXBzZWQgaXQgd2lsbCBzdGlsbCByZXR1cm4gdGhlIGxhc3Qgc2V0IHZhbHVlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBleHBhbmRlZCA9IHRoaXMuZ3JpZC5leHBhbmRDaGlsZHJlbjtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBleHBhbmRDaGlsZHJlbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50IHJvdy4gSXQgbWF5IGJlIGEgYHN0cmluZ2Agb3IgYG51bWJlcmAgaWYgYHByaW1hcnlLZXlgIG9mIHRoZVxuICAgICAqIHBhcmVudCBncmlkIGlzIHNldCBvciBhbiBvYmplY3QgcmVmZXJlbmNlIG9mIHRoZSBwYXJlbnQgcmVjb3JkIG90aGVyd2lzZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZm9yZWlnbktleSA9IHRoaXMuZ3JpZC5mb3JlaWduS2V5O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZvcmVpZ25LZXkoKSB7XG4gICAgICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5ncmlkQVBJLmdldFBhcmVudFJvd0lkKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0V4cGFuZGFibGVDaGlsZHJlbigpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5jaGlsZExheW91dEtleXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlc29sdmVSb3dFZGl0Q29udGFpbmVyKCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRJc2xhbmQgJiYgdGhpcy5wYXJlbnRJc2xhbmQucm93RWRpdEN1c3RvbSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50SXNsYW5kLnJvd0VkaXRDb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdENvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNvbHZlUm93RWRpdEFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudElzbGFuZCA/IHRoaXMucGFyZW50SXNsYW5kLnJvd0VkaXRBY3Rpb25zVGVtcGxhdGUgOiB0aGlzLnJvd0VkaXRBY3Rpb25zVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzb2x2ZVJvd0VkaXRUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRJc2xhbmQgPyB0aGlzLnBhcmVudElzbGFuZC5yb3dFZGl0VGV4dFRlbXBsYXRlIDogdGhpcy5yb3dFZGl0VGV4dFRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIG92ZXJyaWRlIGhpZGVBY3Rpb25TdHJpcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgLy8gaGlkZSBjaGlsZCBsYXlvdXQgYWN0aW9ucyBzdHJpcHMgd2hlblxuICAgICAgICAgICAgLy8gbW92aW5nIG91dHNpZGUgcm9vdCBncmlkLlxuICAgICAgICAgICAgc3VwZXIuaGlkZUFjdGlvblN0cmlwKCk7XG4gICAgICAgICAgICB0aGlzLmFsbExheW91dExpc3QuZm9yRWFjaChyaSA9PiB7XG4gICAgICAgICAgICAgICAgcmkuYWN0aW9uU3RyaXA/LmhpZGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgcGFyZW50Um93T3V0bGV0RGlyZWN0aXZlKCkge1xuICAgICAgICAvLyBUYXJnZXRpbmcgcGFyZW50IG91dGxldCBpbiBvcmRlciB0byBwcmV2ZW50IGhpZGluZyB3aGVuIG91dGxldFxuICAgICAgICAvLyBpcyBwcmVzZW50IGF0IGEgY2hpbGQgZ3JpZCBhbmQgaXMgYXR0YWNoZWQgdG8gYSByb3cuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LnJvd091dGxldERpcmVjdGl2ZSA6IHRoaXMub3V0bGV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgICAgIC8vIHRoaXMuZXhwYW5zaW9uU3RhdGVzQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHZhbHVlOiBNYXA8YW55LCBib29sZWFuPikgPT4ge1xuICAgICAgICAvLyAgICAgY29uc3QgcmVzID0gQXJyYXkuZnJvbSh2YWx1ZS5lbnRyaWVzKCkpLmZpbHRlcigoezE6IHZ9KSA9PiB2ID09PSB0cnVlKS5tYXAoKFtrXSkgPT4gayk7XG4gICAgICAgIC8vIH0pO1xuICAgICAgICB0aGlzLmJhdGNoRWRpdGluZyA9ICEhdGhpcy5yb290R3JpZC5iYXRjaEVkaXRpbmc7XG4gICAgICAgIGlmICh0aGlzLnJvb3RHcmlkICE9PSB0aGlzKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3RHcmlkLmJhdGNoRWRpdGluZ0NoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCh2YWw6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJhdGNoRWRpdGluZyA9IHZhbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmJlZm9yZVZpZXdEZXN0cm95ZWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgodmlldykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IHZpZXcuY29udGV4dC4kaW1wbGljaXQ7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0NoaWxkR3JpZFJlY29yZChyb3dEYXRhKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZERhdGEgPSB0aGlzLmNoaWxkR3JpZFRlbXBsYXRlcy5nZXQocm93RGF0YS5yb3dJRCk7XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlZERhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG1scE91dGxldCA9IGNhY2hlZERhdGEub3duZXI7XG4gICAgICAgICAgICAgICAgICAgIHRtbHBPdXRsZXQuX3ZpZXdDb250YWluZXJSZWYuZGV0YWNoKDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNwbGF5RGVuc2l0eSA9IHRoaXMucm9vdEdyaWQuZGlzcGxheURlbnNpdHk7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLnN1bW1hcnlIZWlnaHQgPSAwO1xuICAgICAgICAgICAgdGhpcy5yb290R3JpZC5kZW5zaXR5Q2hhbmdlZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5RGVuc2l0eSA9IHRoaXMucm9vdEdyaWQuZGlzcGxheURlbnNpdHk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5zdW1tYXJ5SGVpZ2h0ID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRMYXlvdXRLZXlzID0gdGhpcy5wYXJlbnRJc2xhbmQuY2hpbGRyZW4ubWFwKChpdGVtKSA9PiBpdGVtLmtleSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFjdGlvblN0cmlwID0gdGhpcy5wYXJlbnRJc2xhbmQgPyB0aGlzLnBhcmVudElzbGFuZC5hY3Rpb25TdHJpcCA6IHRoaXMuYWN0aW9uU3RyaXA7XG5cbiAgICAgICAgdGhpcy5oZWFkU2VsZWN0b3JzVGVtcGxhdGVzID0gdGhpcy5wYXJlbnRJc2xhbmQgP1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRJc2xhbmQuaGVhZFNlbGVjdG9yc1RlbXBsYXRlcyA6XG4gICAgICAgICAgICB0aGlzLmhlYWRTZWxlY3RvcnNUZW1wbGF0ZXM7XG5cbiAgICAgICAgdGhpcy5yb3dTZWxlY3RvcnNUZW1wbGF0ZXMgPSB0aGlzLnBhcmVudElzbGFuZCA/XG4gICAgICAgICAgICB0aGlzLnBhcmVudElzbGFuZC5yb3dTZWxlY3RvcnNUZW1wbGF0ZXMgOlxuICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3RvcnNUZW1wbGF0ZXM7XG4gICAgICAgIHRoaXMuZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSA9IHRoaXMucGFyZW50SXNsYW5kID9cbiAgICAgICAgICAgIHRoaXMucGFyZW50SXNsYW5kLmRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUgOlxuICAgICAgICAgICAgdGhpcy5kcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlO1xuICAgICAgICB0aGlzLnJvd0V4cGFuZGVkSW5kaWNhdG9yVGVtcGxhdGUgPSB0aGlzLnJvb3RHcmlkLnJvd0V4cGFuZGVkSW5kaWNhdG9yVGVtcGxhdGU7XG4gICAgICAgIHRoaXMucm93Q29sbGFwc2VkSW5kaWNhdG9yVGVtcGxhdGUgPSB0aGlzLnJvb3RHcmlkLnJvd0NvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlO1xuICAgICAgICB0aGlzLmhlYWRlckNvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlID0gdGhpcy5yb290R3JpZC5oZWFkZXJDb2xsYXBzZWRJbmRpY2F0b3JUZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5oZWFkZXJFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlID0gdGhpcy5yb290R3JpZC5oZWFkZXJFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlO1xuICAgICAgICB0aGlzLmV4Y2VsU3R5bGVIZWFkZXJJY29uVGVtcGxhdGUgPSB0aGlzLnJvb3RHcmlkLmV4Y2VsU3R5bGVIZWFkZXJJY29uVGVtcGxhdGU7XG4gICAgICAgIHRoaXMuc29ydEFzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQuc29ydEFzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5zb3J0RGVzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQuc29ydERlc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGU7XG4gICAgICAgIHRoaXMuc29ydEhlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQuc29ydEhlYWRlckljb25UZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5oYXNDaGlsZHJlbktleSA9IHRoaXMucGFyZW50SXNsYW5kID9cbiAgICAgICAgICAgIHRoaXMucGFyZW50SXNsYW5kLmhhc0NoaWxkcmVuS2V5IHx8IHRoaXMucm9vdEdyaWQuaGFzQ2hpbGRyZW5LZXkgOlxuICAgICAgICAgICAgdGhpcy5yb290R3JpZC5oYXNDaGlsZHJlbktleTtcbiAgICAgICAgdGhpcy5zaG93RXhwYW5kQWxsID0gdGhpcy5wYXJlbnRJc2xhbmQgP1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRJc2xhbmQuc2hvd0V4cGFuZEFsbCA6IHRoaXMucm9vdEdyaWQuc2hvd0V4cGFuZEFsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5MaXN0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5jaGlsZExheW91dEtleXMgPSB0aGlzLnBhcmVudCA/XG4gICAgICAgICAgICB0aGlzLnBhcmVudElzbGFuZC5jaGlsZHJlbi5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KSA6XG4gICAgICAgICAgICB0aGlzLmNoaWxkTGF5b3V0S2V5cyA9IHRoaXMuY2hpbGRMYXlvdXRMaXN0Lm1hcCgoaXRlbSkgPT4gaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLmNoaWxkTGF5b3V0TGlzdC5ub3RpZnlPbkNoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5jaGlsZExheW91dExpc3QuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICB0aGlzLm9uUm93SXNsYW5kQ2hhbmdlKClcbiAgICAgICAgKTtcbiAgICAgICAgc3VwZXIubmdBZnRlckNvbnRlbnRJbml0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYFJvd1R5cGVgIGJ5IGluZGV4LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlSb3cgPSB0aGlzLmdyaWQxLmdldFJvd0J5SW5kZXgoMSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGluZGV4XG4gICAgICovXG4gICAgcHVibGljIGdldFJvd0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IFJvd1R5cGUge1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZGF0YVZpZXcubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVJvdyhpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYFJvd1R5cGVgIGJ5IGtleS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Um93ID0gdGhpcy5ncmlkMS5nZXRSb3dCeUtleSgxKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0ga2V5XG4gICAgICovXG4gICAgcHVibGljIGdldFJvd0J5S2V5KGtleTogYW55KTogUm93VHlwZSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFWaWV3O1xuICAgICAgICBjb25zdCByZWMgPSB0aGlzLnByaW1hcnlLZXkgP1xuICAgICAgICAgICAgZGF0YS5maW5kKHJlY29yZCA9PiByZWNvcmRbdGhpcy5wcmltYXJ5S2V5XSA9PT0ga2V5KSA6XG4gICAgICAgICAgICBkYXRhLmZpbmQocmVjb3JkID0+IHJlY29yZCA9PT0ga2V5KTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhLmluZGV4T2YocmVjKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IGRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBJZ3hIaWVyYXJjaGljYWxHcmlkUm93KHRoaXMgYXMgYW55LCBpbmRleCwgcmVjKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhbGxSb3dzKCk6IFJvd1R5cGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFWaWV3Lm1hcCgocmVjLCBpbmRleCkgPT4gdGhpcy5jcmVhdGVSb3coaW5kZXgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIGBJZ3hIaWVyYXJjaGljYWxHcmlkUm93YHMgZm9yIGN1cnJlbnQgcGFnZS5cbiAgICAgKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRhdGFSb3dzKCk6IFJvd1R5cGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFsbFJvd3MoKS5maWx0ZXIocm93ID0+IHJvdyBpbnN0YW5jZW9mIElneEhpZXJhcmNoaWNhbEdyaWRSb3cpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHNlbGVjdGVkIGBJZ3hHcmlkQ2VsbGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc2VsZWN0ZWRDZWxscyA9IHRoaXMuZ3JpZC5zZWxlY3RlZENlbGxzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRDZWxscygpOiBDZWxsVHlwZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVJvd3MoKS5tYXAoKHJvdykgPT4gcm93LmNlbGxzLmZpbHRlcigoY2VsbCkgPT4gY2VsbC5zZWxlY3RlZCkpXG4gICAgICAgICAgICAucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBgQ2VsbFR5cGVgIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNvbmRpdGlvbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUNlbGwgPSB0aGlzLmdyaWQxLmdldENlbGxCeUNvbHVtbigyLCBcIlVuaXRQcmljZVwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SW5kZXhcbiAgICAgKiBAcGFyYW0gY29sdW1uRmllbGRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2VsbEJ5Q29sdW1uKHJvd0luZGV4OiBudW1iZXIsIGNvbHVtbkZpZWxkOiBzdHJpbmcpOiBDZWxsVHlwZSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0Um93QnlJbmRleChyb3dJbmRleCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0gY29sdW1uRmllbGQpO1xuICAgICAgICBpZiAocm93ICYmIHJvdyBpbnN0YW5jZW9mIElneEhpZXJhcmNoaWNhbEdyaWRSb3cgJiYgY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IElneEdyaWRDZWxsKHRoaXMsIHJvd0luZGV4LCBjb2x1bW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGBDZWxsVHlwZWAgb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgY29uZGl0aW9ucy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVxdWlyZXMgdGhhdCB0aGUgcHJpbWFyeUtleSBwcm9wZXJ0eSBpcyBzZXQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5nZXRDZWxsQnlLZXkoMSwgJ2luZGV4Jyk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yIG1hdGNoIGFueSByb3dJRFxuICAgICAqIEBwYXJhbSBjb2x1bW5GaWVsZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDZWxsQnlLZXkocm93U2VsZWN0b3I6IGFueSwgY29sdW1uRmllbGQ6IHN0cmluZyk6IENlbGxUeXBlIHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5nZXRSb3dCeUtleShyb3dTZWxlY3Rvcik7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0gY29sdW1uRmllbGQpO1xuICAgICAgICBpZiAocm93ICYmIGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZ3hHcmlkQ2VsbCh0aGlzLCByb3cuaW5kZXgsIGNvbHVtbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgcGluUm93KHJvd0lEOiBhbnksIGluZGV4PzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0Um93QnlLZXkocm93SUQpO1xuICAgICAgICByZXR1cm4gc3VwZXIucGluUm93KHJvd0lELCBpbmRleCwgcm93KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgdW5waW5Sb3cocm93SUQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmdldFJvd0J5S2V5KHJvd0lEKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnVucGluUm93KHJvd0lELCByb3cpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRhdGFMb2FkaW5nKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZGF0YVByZUxvYWQuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZmVhdHVyZUNvbHVtbnNXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmZlYXR1cmVDb2x1bW5zV2lkdGgodGhpcy5oZWFkZXJIaWVyYXJjaHlFeHBhbmRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvblJvd0lzbGFuZENoYW5nZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNoaWxkTGF5b3V0S2V5cyA9IHRoaXMucGFyZW50SXNsYW5kLmNoaWxkcmVuLmZpbHRlcihpdGVtID0+ICEoaXRlbSBhcyBhbnkpLl9kZXN0cm95ZWQpLm1hcCgoaXRlbSkgPT4gaXRlbS5rZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaGlsZExheW91dEtleXMgPSB0aGlzLmNoaWxkTGF5b3V0TGlzdC5maWx0ZXIoaXRlbSA9PiAhKGl0ZW0gYXMgYW55KS5fZGVzdHJveWVkKS5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISh0aGlzLmNkciBhcyBhbnkpLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICoqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLmdldENoaWxkR3JpZHModHJ1ZSkuZm9yRWFjaCgoZ3JpZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZ3JpZC5jaGlsZFJvdy5jZHIuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyaWQuY2hpbGRSb3cuY2RyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIGluIGNhc2Ugc2VsZWN0aW9uIGlzIGluIGRlc3Ryb3llZCBjaGlsZCBncmlkLCBzZWxlY3Rpb24gc2hvdWxkIGJlIGNsZWFyZWQuXG4gICAgICAgICAgICB0aGlzLl9jbGVhclNlbGV0aW9uSGlnaGxpZ2h0cygpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBpc1Jvd0hpZ2hsaWdodGVkKHJvd0RhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRSb3dJRCA9PT0gcm93RGF0YS5yb3dJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGlzSGllcmFyY2hpY2FsUmVjb3JkKHJlY29yZDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmlzR2hvc3RSZWNvcmQocmVjb3JkKSkge1xuICAgICAgICAgICAgcmVjb3JkID0gcmVjb3JkLnJlY29yZFJlZjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZExheW91dExpc3QubGVuZ3RoICE9PSAwICYmIHJlY29yZFt0aGlzLmNoaWxkTGF5b3V0TGlzdC5maXJzdC5rZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNDaGlsZEdyaWRSZWNvcmQocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgLy8gQ2FuIGJlIG51bGwgd2hlbiB0aGVyZSBpcyBkZWZpbmVkIGxheW91dCBidXQgbm8gY2hpbGQgZGF0YSB3YXMgZm91bmRcbiAgICAgICAgcmV0dXJuIHJlY29yZD8uY2hpbGRHcmlkc0RhdGEgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHRyYWNrQ2hhbmdlcyhpbmRleCwgcmVjKSB7XG4gICAgICAgIGlmIChyZWMuY2hpbGRHcmlkc0RhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gaWYgaXMgY2hpbGQgcmVjXG4gICAgICAgICAgICByZXR1cm4gcmVjLnJvd0lEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb250ZXh0KHJvd0RhdGEsIHJvd0luZGV4LCBwaW5uZWQpOiBhbnkge1xuICAgICAgICBpZiAodGhpcy5pc0NoaWxkR3JpZFJlY29yZChyb3dEYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMuY2hpbGRHcmlkVGVtcGxhdGVzLmdldChyb3dEYXRhLnJvd0lEKTtcbiAgICAgICAgICAgIGlmIChjYWNoZWREYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IGNhY2hlZERhdGEudmlldztcbiAgICAgICAgICAgICAgICBjb25zdCB0bWxwT3V0bGV0ID0gY2FjaGVkRGF0YS5vd25lcjtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHJvd0RhdGEsXG4gICAgICAgICAgICAgICAgICAgIG1vdmVWaWV3OiB2aWV3LFxuICAgICAgICAgICAgICAgICAgICBvd25lcjogdG1scE91dGxldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMuZGF0YVZpZXcuaW5kZXhPZihyb3dEYXRhKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNoaWxkIHJvd3MgY29udGFpbiB1bmlxdWUgZ3JpZHMsIGhlbmNlIHNob3VsZCBoYXZlIHVuaXF1ZSB0ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHJvd0RhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlSUQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjaGlsZFJvdycsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogcm93RGF0YS5yb3dJRFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5kYXRhVmlldy5pbmRleE9mKHJvd0RhdGEpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgJGltcGxpY2l0OiB0aGlzLmlzR2hvc3RSZWNvcmQocm93RGF0YSkgPyByb3dEYXRhLnJlY29yZFJlZiA6IHJvd0RhdGEsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVJRDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGF0YVJvdycsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBudWxsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5nZXREYXRhVmlld0luZGV4KHJvd0luZGV4LCBwaW5uZWQpLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0aGlzLmlzR2hvc3RSZWNvcmQocm93RGF0YSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCByb290R3JpZCgpOiBHcmlkVHlwZSB7XG4gICAgICAgIGxldCBjdXJyR3JpZCA9IHRoaXMgYXMgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudDtcbiAgICAgICAgd2hpbGUgKGN1cnJHcmlkLnBhcmVudCkge1xuICAgICAgICAgICAgY3VyckdyaWQgPSBjdXJyR3JpZC5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJHcmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGljb25UZW1wbGF0ZSgpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmhhc0V4cGFuZGVkUmVjb3JkcygpICYmIHRoaXMuaGFzRXhwYW5kYWJsZUNoaWxkcmVuO1xuICAgICAgICBpZiAoIWV4cGFuZGVkICYmIHRoaXMuc2hvd0V4cGFuZEFsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyQ29sbGFwc2VkSW5kaWNhdG9yVGVtcGxhdGUgfHwgdGhpcy5kZWZhdWx0Q29sbGFwc2VkVGVtcGxhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlIHx8IHRoaXMuZGVmYXVsdEV4cGFuZGVkVGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldERyYWdHaG9zdEN1c3RvbVRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRJc2xhbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudElzbGFuZC5nZXREcmFnR2hvc3RDdXN0b21UZW1wbGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci5nZXREcmFnR2hvc3RDdXN0b21UZW1wbGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBHZXRzIHRoZSB2aXNpYmxlIGNvbnRlbnQgaGVpZ2h0IHRoYXQgaW5jbHVkZXMgaGVhZGVyICsgdGJvZHkgKyBmb290ZXIuXG4gICAgICogRm9yIGhpZXJhcmNoaWNhbCBjaGlsZCBncmlkIGl0IG1heSBiZSBzY3JvbGxlZCBhbmQgbm90IGZ1bGx5IHZpc2libGUuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldFZpc2libGVDb250ZW50SGVpZ2h0KCkge1xuICAgICAgICBsZXQgaGVpZ2h0ID0gc3VwZXIuZ2V0VmlzaWJsZUNvbnRlbnRIZWlnaHQoKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCByb290SGVpZ2h0ID0gdGhpcy5yb290R3JpZC5nZXRWaXNpYmxlQ29udGVudEhlaWdodCgpO1xuICAgICAgICAgICAgY29uc3QgdG9wRGlmZiA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLnJvb3RHcmlkLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICAgICAgaGVpZ2h0ID0gcm9vdEhlaWdodCAtIHRvcERpZmYgPiBoZWlnaHQgPyBoZWlnaHQgOiByb290SGVpZ2h0IC0gdG9wRGlmZjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlQWxsKCkge1xuICAgICAgICBjb25zdCBleHBhbmRlZCA9IHRoaXMuaGFzRXhwYW5kZWRSZWNvcmRzKCkgJiYgdGhpcy5oYXNFeHBhbmRhYmxlQ2hpbGRyZW47XG4gICAgICAgIGlmICghZXhwYW5kZWQgJiYgdGhpcy5zaG93RXhwYW5kQWxsKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZEFsbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2xsYXBzZUFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhc0V4cGFuZGVkUmVjb3JkcygpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoYXNFeHBhbmRlZEVudHJ5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaGFzRXhwYW5kZWRFbnRyeSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGhhc0V4cGFuZGVkRW50cnk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGdldERlZmF1bHRFeHBhbmRTdGF0ZShyZWNvcmQ6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5oYXNDaGlsZHJlbktleSAmJiAhcmVjb3JkW3RoaXMuaGFzQ2hpbGRyZW5LZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwYW5kQ2hpbGRyZW47XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGlzRXhwYW5kZWQocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5nZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyZWNvcmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdmlld0NyZWF0ZWRIYW5kbGVyKGFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDaGlsZEdyaWRSZWNvcmQoYXJncy5jb250ZXh0LiRpbXBsaWNpdCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGFyZ3MuY29udGV4dC4kaW1wbGljaXQucm93SUQ7XG4gICAgICAgICAgICB0aGlzLmNoaWxkR3JpZFRlbXBsYXRlcy5zZXQoa2V5LCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdmlld01vdmVkSGFuZGxlcihhcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ2hpbGRHcmlkUmVjb3JkKGFyZ3MuY29udGV4dC4kaW1wbGljaXQpKSB7XG4gICAgICAgICAgICAvLyB2aWV3IHdhcyBtb3ZlZCwgdXBkYXRlIG93bmVyIGluIGNhY2hlXG4gICAgICAgICAgICBjb25zdCBrZXkgPSBhcmdzLmNvbnRleHQuJGltcGxpY2l0LnJvd0lEO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMuY2hpbGRHcmlkVGVtcGxhdGVzLmdldChrZXkpO1xuICAgICAgICAgICAgY2FjaGVkRGF0YS5vd25lciA9IGFyZ3Mub3duZXI7XG5cbiAgICAgICAgICAgIHRoaXMuY2hpbGRMYXlvdXRMaXN0LmZvckVhY2goKGxheW91dCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRHcmlkID0gdGhpcy5ncmlkQVBJLmdldENoaWxkR3JpZEJ5SUQobGF5b3V0LmtleSwgYXJncy5jb250ZXh0LiRpbXBsaWNpdC5yb3dJRCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRHcmlkICYmIHJlbGF0ZWRHcmlkLnVwZGF0ZU9uUmVuZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERldGVjdCBjaGFuZ2VzIGlmIGBleHBhbmRDaGlsZHJlbmAgaGFzIGNoYW5nZWQgd2hlbiB0aGUgZ3JpZCB3YXNuJ3QgdmlzaWJsZS4gVGhpcyBpcyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEdyaWQubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEdyaWQudXBkYXRlT25SZW5kZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqKi9cbiAgICBwdWJsaWMgb25Db250YWluZXJTY3JvbGwoKSB7XG4gICAgICAgIHRoaXMuaGlkZU92ZXJsYXlzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVSb3coaW5kZXg6IG51bWJlciwgZGF0YT86IGFueSk6IFJvd1R5cGUge1xuICAgICAgICBsZXQgcm93OiBSb3dUeXBlO1xuICAgICAgICBjb25zdCBkYXRhSW5kZXggPSB0aGlzLl9nZXREYXRhVmlld0luZGV4KGluZGV4KTtcbiAgICAgICAgY29uc3QgcmVjOiBhbnkgPSBkYXRhID8/IHRoaXMuZGF0YVZpZXdbZGF0YUluZGV4XTtcblxuICAgICAgICBpZiAoIXJvdyAmJiByZWMgJiYgIXJlYy5jaGlsZEdyaWRzRGF0YSkge1xuICAgICAgICAgICAgcm93ID0gbmV3IElneEhpZXJhcmNoaWNhbEdyaWRSb3codGhpcyBhcyBhbnksIGluZGV4LCByZWMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0Q2hpbGRHcmlkcyhpbkRlcGg/OiBib29sZWFuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuZ2V0Q2hpbGRHcmlkcyhpbkRlcGgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBnZW5lcmF0ZURhdGFGaWVsZHMoZGF0YTogYW55W10pOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZW5lcmF0ZURhdGFGaWVsZHMoZGF0YSkuZmlsdGVyKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGF5b3V0c0xpc3QgPSB0aGlzLnBhcmVudElzbGFuZCA/IHRoaXMucGFyZW50SXNsYW5kLmNoaWxkcmVuIDogdGhpcy5jaGlsZExheW91dExpc3Q7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gbGF5b3V0c0xpc3QubWFwKChpdGVtKSA9PiBpdGVtLmtleSk7XG4gICAgICAgICAgICByZXR1cm4ga2V5cy5pbmRleE9mKGZpZWxkKSA9PT0gLTE7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNpemVOb3RpZnlIYW5kbGVyKCkge1xuICAgICAgICAvLyBkbyBub3QgdHJpZ2dlciByZWZsb3cgaWYgZWxlbWVudCBpcyBkZXRhY2hlZCBvciBpZiBpdCBpcyBjaGlsZCBncmlkLlxuICAgICAgICBpZiAodGhpcy5kb2N1bWVudC5jb250YWlucyh0aGlzLm5hdGl2ZUVsZW1lbnQpICYmICF0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvdmVycmlkZSBpbml0Q29sdW1ucyhjb2xsZWN0aW9uOiBJZ3hDb2x1bW5Db21wb25lbnRbXSwgY2I6IChhcmdzOiBhbnkpID0+IHZvaWQgPSBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIC8vIGludmFsaWQgY29uZmlndXJhdGlvbiAtIGhpZXJhcmNoaWNhbCBncmlkIHNob3VsZCBub3QgYWxsb3cgY29sdW1uIGxheW91dHNcbiAgICAgICAgICAgIC8vIHJlbW92ZSBjb2x1bW4gbGF5b3V0c1xuICAgICAgICAgICAgY29uc3Qgbm9uQ29sdW1uTGF5b3V0Q29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gIWNvbC5jb2x1bW5MYXlvdXQgJiYgIWNvbC5jb2x1bW5MYXlvdXRDaGlsZCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMobm9uQ29sdW1uTGF5b3V0Q29sdW1ucyk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuaW5pdENvbHVtbnMoY29sbGVjdGlvbiwgY2IpO1xuICAgIH1cblxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHNldHVwQ29sdW1ucygpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50SXNsYW5kICYmIHRoaXMucGFyZW50SXNsYW5kLmNoaWxkQ29sdW1ucy5sZW5ndGggPiAwICYmICF0aGlzLmF1dG9HZW5lcmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVDb2x1bW5zTGlzdCh0aGlzLnBhcmVudElzbGFuZC5jaGlsZENvbHVtbnMudG9BcnJheSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLnNldHVwQ29sdW1ucygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldENvbHVtbkxpc3QoKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTGF5b3V0cyA9IHRoaXMucGFyZW50ID8gdGhpcy5jaGlsZExheW91dExpc3QgOiB0aGlzLmFsbExheW91dExpc3Q7XG4gICAgICAgIGNvbnN0IG5lc3RlZENvbHVtbnMgPSBjaGlsZExheW91dHMubWFwKChsYXlvdXQpID0+IGxheW91dC5jb2x1bW5MaXN0LnRvQXJyYXkoKSk7XG4gICAgICAgIGNvbnN0IGNvbHNBcnJheSA9IFtdLmNvbmNhdC5hcHBseShbXSwgbmVzdGVkQ29sdW1ucyk7XG4gICAgICAgIGlmIChjb2xzQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdG9wQ29scyA9IHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoKGl0ZW0pID0+IGNvbHNBcnJheS5pbmRleE9mKGl0ZW0pID09PSAtMSk7XG4gICAgICAgICAgICByZXR1cm4gdG9wQ29scztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGlzdC50b0FycmF5KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBvbkNvbHVtbnNDaGFuZ2VkKCkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1uTGlzdCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX3Nob3VsZEF1dG9TaXplKHJlbmRlcmVkSGVpZ2h0KSB7XG4gICAgICAgIGlmICh0aGlzLmlzUGVyY2VudEhlaWdodCAmJiB0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLl9zaG91bGRBdXRvU2l6ZShyZW5kZXJlZEhlaWdodCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5MaXN0KHJlY2FsY0NvbFNpemVzID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBjaGlsZExheW91dHMgPSB0aGlzLnBhcmVudCA/IHRoaXMuY2hpbGRMYXlvdXRMaXN0IDogdGhpcy5hbGxMYXlvdXRMaXN0O1xuICAgICAgICBjb25zdCBuZXN0ZWRDb2x1bW5zID0gY2hpbGRMYXlvdXRzLm1hcCgobGF5b3V0KSA9PiBsYXlvdXQuY29sdW1uTGlzdC50b0FycmF5KCkpO1xuICAgICAgICBjb25zdCBjb2xzQXJyYXkgPSBbXS5jb25jYXQuYXBwbHkoW10sIG5lc3RlZENvbHVtbnMpO1xuICAgICAgICBjb25zdCBjb2xMZW5ndGggPSB0aGlzLmNvbHVtbnMubGVuZ3RoO1xuICAgICAgICBjb25zdCB0b3BDb2xzID0gdGhpcy5jb2x1bW5MaXN0LmZpbHRlcigoaXRlbSkgPT4gY29sc0FycmF5LmluZGV4T2YoaXRlbSkgPT09IC0xKTtcbiAgICAgICAgaWYgKHRvcENvbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKHRvcENvbHMpO1xuICAgICAgICAgICAgaWYgKHJlY2FsY0NvbFNpemVzICYmIHRoaXMuY29sdW1ucy5sZW5ndGggIT09IGNvbExlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZFNpemVzKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2NsZWFyU2VsZXRpb25IaWdobGlnaHRzKCkge1xuICAgICAgICBbdGhpcy5yb290R3JpZCwgLi4udGhpcy5yb290R3JpZC5nZXRDaGlsZEdyaWRzKHRydWUpXS5mb3JFYWNoKGdyaWQgPT4ge1xuICAgICAgICAgICAgZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKCk7XG4gICAgICAgICAgICBncmlkLnNlbGVjdGlvblNlcnZpY2UuYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICBncmlkLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaWd4LWdyaWRfX3RyLS1oaWdobGlnaHRlZCcpO1xuICAgICAgICAgICAgZ3JpZC5oaWdobGlnaHRlZFJvd0lEID0gbnVsbDtcbiAgICAgICAgICAgIGdyaWQuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9faGllcmFyY2hpY2FsLWluZGVudFwiIFtuZ0NsYXNzXT1cInsnaWd4LWdyaWRfX2hpZXJhcmNoaWNhbC1pbmRlbnQtLXNjcm9sbCc6IHBhcmVudEhhc1Njcm9sbH1cIj5cbiAgICA8bmctY29udGFpbmVyICNjb250YWluZXI+PC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiIsIjxuZy1jb250ZW50IHNlbGVjdD1cImlneC1ncmlkLXRvb2xiYXJcIj48L25nLWNvbnRlbnQ+XG48bmctY29udGFpbmVyICN0b29sYmFyT3V0bGV0PjwvbmctY29udGFpbmVyPlxuXG48aWd4LWdyaWQtaGVhZGVyLXJvdyBjbGFzcz1cImlneC1ncmlkLXRoZWFkXCIgdGFiaW5kZXg9XCIwXCJcbiAgICBbZ3JpZF09XCJ0aGlzXCJcbiAgICBbaGFzTVJMXT1cImhhc0NvbHVtbkxheW91dHNcIlxuICAgIFthY3RpdmVEZXNjZW5kYW50XT1cImFjdGl2ZURlc2NlbmRhbnRcIlxuICAgIFt3aWR0aF09XCJjYWxjV2lkdGhcIlxuICAgIFtwaW5uZWRDb2x1bW5Db2xsZWN0aW9uXT1cInBpbm5lZENvbHVtbnNcIlxuICAgIFt1bnBpbm5lZENvbHVtbkNvbGxlY3Rpb25dPVwidW5waW5uZWRDb2x1bW5zXCJcbiAgICAoa2V5ZG93bi5tZXRhLmMpPVwiY29weUhhbmRsZXIoJGV2ZW50KVwiXG4gICAgKGtleWRvd24uY29udHJvbC5jKT1cImNvcHlIYW5kbGVyKCRldmVudClcIlxuICAgIChjb3B5KT1cImNvcHlIYW5kbGVyKCRldmVudClcIlxuICAgIChrZXlkb3duKT1cIm5hdmlnYXRpb24uaGVhZGVyTmF2aWdhdGlvbigkZXZlbnQpXCJcbiAgICAoZm9jdXMpPVwibmF2aWdhdGlvbi5mb2N1c0ZpcnN0Q2VsbCgpXCJcbj5cbjwvaWd4LWdyaWQtaGVhZGVyLXJvdz5cblxuPGRpdiBpZ3hHcmlkQm9keSAoa2V5ZG93bi5jb250cm9sLmMpPVwiY29weUhhbmRsZXIoJGV2ZW50KVwiIChjb3B5KT1cImNvcHlIYW5kbGVyKCRldmVudClcIiBjbGFzcz1cImlneC1ncmlkX190Ym9keVwiIHJvbGU9XCJyb3dncm91cFwiPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktY29udGVudFwiICB0YWJpbmRleD1cIjBcIiAoZm9jdXMpPVwibmF2aWdhdGlvbi5mb2N1c1Rib2R5KCRldmVudClcIlxuICAgICAoa2V5ZG93bik9XCJuYXZpZ2F0aW9uLmhhbmRsZU5hdmlnYXRpb24oJGV2ZW50KVwiIChkcmFnU3RvcCk9XCJzZWxlY3Rpb25TZXJ2aWNlLmRyYWdNb2RlID0gJGV2ZW50XCJcbiAgICAgICAgKGRyYWdTY3JvbGwpPVwiZHJhZ1Njcm9sbCgkZXZlbnQpXCIgW2lneEdyaWREcmFnU2VsZWN0XT1cInNlbGVjdGlvblNlcnZpY2UuZHJhZ01vZGVcIiBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiYWN0aXZlRGVzY2VuZGFudFwiIFthdHRyLnJvbGVdPVwiZGF0YVZpZXcubGVuZ3RoID8gbnVsbCA6ICdyb3cnXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJ0b3RhbEhlaWdodFwiIFtzdHlsZS53aWR0aC5weF09XCJjYWxjV2lkdGhcIiAjdGJvZHkgKHNjcm9sbCk9XCJwcmV2ZW50Q29udGFpbmVyU2Nyb2xsKCRldmVudClcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJtb3ZpbmcgJiYgY29sdW1uSW5EcmFnICYmIHBpbm5lZENvbHVtbnMubGVuZ3RoIDw9IDBcIlxuICAgICAgICAgICAgW2lneENvbHVtbk1vdmluZ0Ryb3BdPVwiaGVhZGVyQ29udGFpbmVyXCIgW2F0dHIuZHJvcHBhYmxlXT1cInRydWVcIiBpZD1cImxlZnRcIlxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctbGVmdFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJtb3ZpbmcgJiYgY29sdW1uSW5EcmFnICYmIHBpbm5lZENvbHVtbnMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICBbaWd4Q29sdW1uTW92aW5nRHJvcF09XCJoZWFkZXJDb250YWluZXJcIiBbYXR0ci5kcm9wcGFibGVdPVwidHJ1ZVwiIGlkPVwibGVmdFwiXG4gICAgICAgICAgICBjbGFzcz1cImlneC1ncmlkX19zY3JvbGwtb24tZHJhZy1waW5uZWRcIiBbc3R5bGUubGVmdC5weF09XCJwaW5uZWRXaWR0aFwiPjwvc3Bhbj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNwaW5uZWRSZWNvcmRzVGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YVxuICAgICAgICAgICAgfCBncmlkVHJhbnNhY3Rpb246aWQ6cGlwZVRyaWdnZXJcbiAgICAgICAgICAgIHwgdmlzaWJsZUNvbHVtbnM6aGFzVmlzaWJsZUNvbHVtbnNcbiAgICAgICAgICAgIHwgZ3JpZEFkZFJvdzp0cnVlOnBpcGVUcmlnZ2VyXG4gICAgICAgICAgICB8IGdyaWRSb3dQaW5uaW5nOmlkOnRydWU6cGlwZVRyaWdnZXJcbiAgICAgICAgICAgIHwgZ3JpZEZpbHRlcmluZzpmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6ZmlsdGVyU3RyYXRlZ3k6YWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6aWQ6cGlwZVRyaWdnZXI6ZmlsdGVyaW5nUGlwZVRyaWdnZXI6dHJ1ZVxuICAgICAgICAgICAgfCBncmlkU29ydDpzb3J0aW5nRXhwcmVzc2lvbnM6W106c29ydFN0cmF0ZWd5OmlkOnBpcGVUcmlnZ2VyOnRydWUgYXMgcGlubmVkRGF0YVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgI3BpbkNvbnRhaW5lciAqbmdJZj1cInBpbm5lZERhdGEubGVuZ3RoID4gMFwiIGNsYXNzPVwiaWd4LWdyaWRfX3RyLS1waW5uZWRcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpZ3gtZ3JpZF9fdHItLXBpbm5lZC1ib3R0b20nOiAgIWlzUm93UGlubmluZ1RvVG9wLCAnaWd4LWdyaWRfX3RyLS1waW5uZWQtdG9wJzogaXNSb3dQaW5uaW5nVG9Ub3AgfVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjYWxjV2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93RGF0YSBvZiBwaW5uZWREYXRhOyBsZXQgcm93SW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBpbm5lZF9oaWVyYXJjaGljYWxfcmVjb3JkX3RlbXBsYXRlOyBjb250ZXh0OiBnZXRDb250ZXh0KHJvd0RhdGEsIHJvd0luZGV4LCB0cnVlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoYXNQaW5uZWRSZWNvcmRzICYmIGlzUm93UGlubmluZ1RvVG9wID8gcGlubmVkUmVjb3Jkc1RlbXBsYXRlIDogbnVsbFwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGlneEdyaWRGb3IgbGV0LXJvd0RhdGEgbGV0LXJvd0luZGV4PVwiaW5kZXhcIiBbaWd4R3JpZEZvck9mXT1cImRhdGFcbiAgICAgICAgfCBncmlkVHJhbnNhY3Rpb246aWQ6cGlwZVRyaWdnZXJcbiAgICAgICAgfCB2aXNpYmxlQ29sdW1uczpoYXNWaXNpYmxlQ29sdW1uc1xuICAgICAgICB8IGdyaWRGaWx0ZXJpbmc6ZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlOmZpbHRlclN0cmF0ZWd5OmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlOmlkOnBpcGVUcmlnZ2VyOmZpbHRlcmluZ1BpcGVUcmlnZ2VyXG4gICAgICAgIHwgZ3JpZFNvcnQ6c29ydGluZ0V4cHJlc3Npb25zOltdOnNvcnRTdHJhdGVneTppZDpwaXBlVHJpZ2dlclxuICAgICAgICB8IGdyaWRIaWVyYXJjaGljYWxQYWdpbmc6ISFwYWdpbmF0b3I6cGFnZTpwZXJQYWdlOmlkOnBpcGVUcmlnZ2VyXG4gICAgICAgIHwgZ3JpZEhpZXJhcmNoaWNhbDpleHBhbnNpb25TdGF0ZXM6aWQ6cHJpbWFyeUtleTpjaGlsZExheW91dEtleXM6cGlwZVRyaWdnZXJcbiAgICAgICAgfCBncmlkQWRkUm93OmZhbHNlOnBpcGVUcmlnZ2VyXG4gICAgICAgIHwgZ3JpZFJvd1Bpbm5pbmc6aWQ6ZmFsc2U6cGlwZVRyaWdnZXJcIlxuICAgICAgICAgICAgW2lneEZvclNjcm9sbE9yaWVudGF0aW9uXT1cIid2ZXJ0aWNhbCdcIiBbaWd4Rm9yU2Nyb2xsQ29udGFpbmVyXT1cInZlcnRpY2FsU2Nyb2xsXCJcbiAgICAgICAgICAgIFtpZ3hGb3JDb250YWluZXJTaXplXT1cImNhbGNIZWlnaHRcIiBbaWd4Rm9ySXRlbVNpemVdPVwicmVuZGVyZWRSb3dIZWlnaHRcIiBbaWd4Rm9yVHJhY2tCeV09XCJ0cmFja0NoYW5nZXNcIlxuICAgICAgICAgICAgI3ZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyIChjaHVua1ByZWxvYWQpPVwiZGF0YUxvYWRpbmcoJGV2ZW50KVwiIChkYXRhQ2hhbmdpbmcpPVwiZGF0YVJlYmluZGluZygkZXZlbnQpXCIgKGRhdGFDaGFuZ2VkKT1cImRhdGFSZWJvdW5kKCRldmVudClcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgIFtpZ3hUZW1wbGF0ZU91dGxldF09XCIoaXNIaWVyYXJjaGljYWxSZWNvcmQocm93RGF0YSkgPyBoaWVyYXJjaGljYWxfcmVjb3JkX3RlbXBsYXRlIDogKGlzQ2hpbGRHcmlkUmVjb3JkKHJvd0RhdGEpID8gY2hpbGRfcmVjb3JkX3RlbXBsYXRlIDogaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZSkpXCJcbiAgICAgICAgICAgICAgICBbaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldENvbnRleHQocm93RGF0YSwgcm93SW5kZXgsIGZhbHNlKVwiICh2aWV3Q3JlYXRlZCk9XCJ2aWV3Q3JlYXRlZEhhbmRsZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHZpZXdNb3ZlZCk9XCJ2aWV3TW92ZWRIYW5kbGVyKCRldmVudClcIiAoY2FjaGVkVmlld0xvYWRlZCk9XCJjYWNoZWRWaWV3TG9hZGVkKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKmlneFRlbXBsYXRlT3V0bGV0PVwiKGlzSGllcmFyY2hpY2FsUmVjb3JkKHJvd0RhdGEpID8gaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZSA6IChpc0NoaWxkR3JpZFJlY29yZChyb3dEYXRhKSAmJiBpc0V4cGFuZGVkKHJvd0RhdGEpID8gY2hpbGRfcmVjb3JkX3RlbXBsYXRlIDogaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZSkpOyBjb250ZXh0OiBnZXRDb250ZXh0KHJvd0RhdGEpXCI+PC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2hpZXJhcmNoaWNhbF9yZWNvcmRfdGVtcGxhdGUgbGV0LXJvd0luZGV4PVwiaW5kZXhcIiBsZXQtZGlzYWJsZWRSb3c9XCJkaXNhYmxlZFwiIGxldC1yb3dEYXRhPlxuICAgICAgICAgICAgPGlneC1oaWVyYXJjaGljYWwtZ3JpZC1yb3cgW2dyaWRJRF09XCJpZFwiIFtpbmRleF09XCJyb3dJbmRleFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFJvd1wiIFtkYXRhXT1cInJvd0RhdGFcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0NsYXNzZXMgfCBpZ3hHcmlkUm93Q2xhc3Nlczpyb3c6cm93LmluRWRpdE1vZGU6cm93LnNlbGVjdGVkOnJvdy5kaXJ0eTpyb3cuZGVsZXRlZDpyb3cuZHJhZ2dpbmc6cm93SW5kZXg6aGFzQ29sdW1uTGF5b3V0czpmYWxzZTpyb3dEYXRhOnBpcGVUcmlnZ2VyXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJyb3dTdHlsZXMgfCBpZ3hHcmlkUm93U3R5bGVzOnJvd0RhdGE6cm93SW5kZXg6cGlwZVRyaWdnZXJcIiAjcm93PlxuICAgICAgICAgICAgPC9pZ3gtaGllcmFyY2hpY2FsLWdyaWQtcm93PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcGlubmVkX2hpZXJhcmNoaWNhbF9yZWNvcmRfdGVtcGxhdGUgbGV0LXJvd0luZGV4PVwiaW5kZXhcIiBsZXQtcm93RGF0YT5cbiAgICAgICAgICAgIDxpZ3gtaGllcmFyY2hpY2FsLWdyaWQtcm93IFtncmlkSURdPVwiaWRcIiBbaW5kZXhdPVwicm93SW5kZXhcIiBbZGF0YV09XCJyb3dEYXRhXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dDbGFzc2VzIHwgaWd4R3JpZFJvd0NsYXNzZXM6cm93OnJvdy5pbkVkaXRNb2RlOnJvdy5zZWxlY3RlZDpyb3cuZGlydHk6cm93LmRlbGV0ZWQ6cm93LmRyYWdnaW5nOnJvd0luZGV4Omhhc0NvbHVtbkxheW91dHM6ZmFsc2U6cm93RGF0YTpwaXBlVHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwicm93U3R5bGVzIHwgaWd4R3JpZFJvd1N0eWxlczpyb3dEYXRhOnJvd0luZGV4OnBpcGVUcmlnZ2VyXCIgI3JvdyAjcGlubmVkUm93PlxuICAgICAgICAgICAgPC9pZ3gtaGllcmFyY2hpY2FsLWdyaWQtcm93PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2NoaWxkX3JlY29yZF90ZW1wbGF0ZSBsZXQtcm93SW5kZXg9XCJpbmRleFwiIGxldC1yb3dEYXRhPlxuICAgICAgICAgICAgPGRpdiBbYXR0ci5kYXRhLXJvd2luZGV4XT1cInJvd0luZGV4XCIgKHNjcm9sbCk9XCJvbkNvbnRhaW5lclNjcm9sbCgpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ2lneC1ncmlkX190ci1jb250YWluZXInOiB0cnVlLFxuICAgICAgICAgICAgICAgICdpZ3gtZ3JpZF9fdHItLWhpZ2hsaWdodGVkJzppc1Jvd0hpZ2hsaWdodGVkKHJvd0RhdGEpXG4gICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgPGlneC1jaGlsZC1ncmlkLXJvdyAqbmdGb3I9XCJsZXQgbGF5b3V0IG9mIGNoaWxkTGF5b3V0TGlzdFwiIFtwYXJlbnRHcmlkSURdPVwiaWRcIiBbaW5kZXhdPVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJyb3dEYXRhXCIgW2xheW91dF09XCJsYXlvdXRcIiAjcm93PlxuICAgICAgICAgICAgICAgIDwvaWd4LWNoaWxkLWdyaWQtcm93PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoYXNQaW5uZWRSZWNvcmRzICYmICFpc1Jvd1Bpbm5pbmdUb1RvcCA/IHBpbm5lZFJlY29yZHNUZW1wbGF0ZSA6IG51bGxcIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIm1vdmluZyAmJiBjb2x1bW5JbkRyYWdcIiBbaWd4Q29sdW1uTW92aW5nRHJvcF09XCJoZWFkZXJDb250YWluZXJcIiBbYXR0ci5kcm9wcGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBpZD1cInJpZ2h0XCIgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctcmlnaHRcIj48L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fcm93LWVkaXRpbmctb3V0bGV0XCIgaWd4T3ZlcmxheU91dGxldCAjaWd4Um93RWRpdGluZ092ZXJsYXlPdXRsZXQ+PC9kaXY+XG4gICAgICAgIDxpZ2MtdHJpYWwtd2F0ZXJtYXJrICpuZ0lmPVwiIXRoaXMucGFyZW50XCI+PC9pZ2MtdHJpYWwtd2F0ZXJtYXJrPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWd4VG9nZ2xlICNsb2FkaW5nT3ZlcmxheT5cbiAgICAgICAgPGlneC1jaXJjdWxhci1iYXIgW2luZGV0ZXJtaW5hdGVdPVwidHJ1ZVwiICpuZ0lmPVwic2hvdWxkT3ZlcmxheUxvYWRpbmdcIj5cbiAgICAgICAgPC9pZ3gtY2lyY3VsYXItYmFyPlxuICAgIDwvZGl2PlxuICAgIDxzcGFuICpuZ0lmPVwibW92aW5nICYmIGNvbHVtbkluRHJhZ1wiIFtpZ3hDb2x1bW5Nb3ZpbmdEcm9wXT1cImhlYWRlckNvbnRhaW5lclwiIFthdHRyLmRyb3BwYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgaWQ9XCJyaWdodFwiIGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1vbi1kcmFnLXJpZ2h0XCI+PC9zcGFuPlxuICAgIDxkaXYgW2hpZGRlbl09XCIhaGFzVmVydGljYWxTY3JvbGwoKVwiIGNsYXNzPVwiaWd4LWdyaWRfX3Rib2R5LXNjcm9sbGJhclwiIFtzdHlsZS53aWR0aC5weF09XCJzY3JvbGxTaXplXCIgKHBvaW50ZXJkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktc2Nyb2xsYmFyLXN0YXJ0XCIgW3N0eWxlLmhlaWdodC5weF09XCJpc1Jvd1Bpbm5pbmdUb1RvcCA/IHBpbm5lZFJvd0hlaWdodCA6IDBcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1zY3JvbGxiYXItbWFpblwiIFtzdHlsZS5oZWlnaHQucHhdPVwiY2FsY0hlaWdodFwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGlneEdyaWRGb3IgW2lneEdyaWRGb3JPZl09XCJbXVwiICN2ZXJ0aWNhbFNjcm9sbEhvbGRlcj48L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1zY3JvbGxiYXItZW5kXCIgW3N0eWxlLmhlaWdodC5weF09XCIhaXNSb3dQaW5uaW5nVG9Ub3AgPyBwaW5uZWRSb3dIZWlnaHQgOiAwXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX19hZGRyb3ctc25hY2tiYXJcIj5cbiAgICAgICAgPGlneC1zbmFja2JhciAjYWRkUm93U25hY2tiYXIgW291dGxldF09XCJpZ3hCb2R5T3ZlcmxheU91dGxldFwiIFthY3Rpb25UZXh0XT1cInJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9zbmFja2Jhcl9hZGRyb3dfYWN0aW9udGV4dFwiIFtkaXNwbGF5VGltZV09XCJzbmFja2JhckRpc3BsYXlUaW1lXCI+e3tyZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfc25hY2tiYXJfYWRkcm93X2xhYmVsfX08L2lneC1zbmFja2Jhcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgaWd4T3ZlcmxheU91dGxldCAjaWd4Qm9keU92ZXJsYXlPdXRsZXQ9XCJvdmVybGF5LW91dGxldFwiPjwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdGZvb3RcIiByb2xlPVwicm93Z3JvdXBcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cInN1bW1hcnlSb3dIZWlnaHRcIiAjdGZvb3Q+XG4gICAgPGRpdiB0YWJpbmRleD1cIjBcIiAoZm9jdXMpPVwibmF2aWdhdGlvbi5mb2N1c0ZpcnN0Q2VsbChmYWxzZSlcIiBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiYWN0aXZlRGVzY2VuZGFudFwiXG4gICAgIChrZXlkb3duKT1cIm5hdmlnYXRpb24uc3VtbWFyeU5hdigkZXZlbnQpXCI+XG4gICAgICAgIDxpZ3gtZ3JpZC1zdW1tYXJ5LXJvdyBbc3R5bGUud2lkdGgucHhdPVwiY2FsY1dpZHRoXCIgW3N0eWxlLmhlaWdodC5weF09XCJzdW1tYXJ5Um93SGVpZ2h0XCJcbiAgICAgICAgICAgICpuZ0lmPVwiaGFzU3VtbWFyaXplZENvbHVtbnMgJiYgcm9vdFN1bW1hcmllc0VuYWJsZWRcIiBbZ3JpZElEXT1cImlkXCIgcm9sZT1cInJvd1wiXG4gICAgICAgICAgICBbc3VtbWFyaWVzXT1cImlkIHwgaWd4R3JpZFN1bW1hcnlEYXRhUGlwZTpzdW1tYXJ5U2VydmljZS5yZXRyaWdnZXJSb290UGlwZVwiIFtpbmRleF09XCJkYXRhVmlldy5sZW5ndGhcIlxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZ3JpZF9fc3VtbWFyaWVzXCIgI3N1bW1hcnlSb3c+XG4gICAgICAgIDwvaWd4LWdyaWQtc3VtbWFyeS1yb3c+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdGZvb3QtdGh1bWJcIiBbaGlkZGVuXT1cIiFoYXNWZXJ0aWNhbFNjcm9sbCgpXCIgW3N0eWxlLmhlaWdodC5weF09XCJzdW1tYXJ5Um93SGVpZ2h0XCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzY3JvbGxTaXplXCI+PC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImlneC1ncmlkX19zY3JvbGxcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cInNjcm9sbFNpemVcIiAjc2NyIFtoaWRkZW5dPVwiaXNIb3Jpem9udGFsU2Nyb2xsSGlkZGVuXCIgKHBvaW50ZXJkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX19zY3JvbGwtc3RhcnRcIiBbc3R5bGUud2lkdGgucHhdPVwiaXNQaW5uaW5nVG9TdGFydCA/IHBpbm5lZFdpZHRoIDogaGVhZGVyRmVhdHVyZXNXaWR0aFwiIFtzdHlsZS5taW4td2lkdGgucHhdPVwiaXNQaW5uaW5nVG9TdGFydCA/IHBpbm5lZFdpZHRoIDogaGVhZGVyRmVhdHVyZXNXaWR0aFwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW1haW5cIiBbc3R5bGUud2lkdGgucHhdPVwidW5waW5uZWRXaWR0aFwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgaWd4R3JpZEZvciBbaWd4R3JpZEZvck9mXT1cIltdXCIgI3Njcm9sbENvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1lbmRcIiBbc3R5bGUud2lkdGgucHhdPVwicGlubmVkV2lkdGhcIiBbc3R5bGUubWluLXdpZHRoLnB4XT1cInBpbm5lZFdpZHRoXCIgW2hpZGRlbl09XCJwaW5uZWRXaWR0aCA9PT0gMCB8fCBpc1Bpbm5pbmdUb1N0YXJ0XCI+PC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImlneC1ncmlkX19mb290ZXJcIiAjZm9vdGVyPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImlneC1ncmlkLWZvb3RlclwiPjwvbmctY29udGVudD5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtcGFnaW5hdG9yXCI+PC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250YWluZXIgI3BhZ2luYXRvck91dGxldD48L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2VtcHR5RmlsdGVyZWRHcmlkPlxuICAgIDxzcGFuIGNsYXNzPVwiaWd4LWdyaWRfX3Rib2R5LW1lc3NhZ2VcIiByb2xlPVwiY2VsbFwiPlxuICAgICAgICA8c3Bhbj57e2VtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZX19PC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dBZGRCdXR0b25cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRSb3dFbXB0eVRlbXBsYXRlIHx8IGRlZmF1bHRBZGRSb3dFbXB0eVRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRFbXB0eUdyaWQ+XG4gICAgPHNwYW4gY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktbWVzc2FnZVwiIHJvbGU9XCJjZWxsXCI+XG4gICAgICAgIDxzcGFuPnt7ZW1wdHlHcmlkTWVzc2FnZX19PC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dBZGRCdXR0b25cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRSb3dFbXB0eVRlbXBsYXRlIHx8IGRlZmF1bHRBZGRSb3dFbXB0eVRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRBZGRSb3dFbXB0eVRlbXBsYXRlPlxuICAgIDxidXR0b24gaWd4QnV0dG9uPVwicmFpc2VkXCIgaWd4UmlwcGxlIChjbGljayk9XCJ0aGlzLmNydWRTZXJ2aWNlLmVudGVyQWRkUm93TW9kZShudWxsLCBmYWxzZSwgJGV2ZW50KVwiPlxuICAgICAgICB7e3Jlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9hZGRfcm93X2xhYmVsfX1cbiAgICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRpbmdHcmlkPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fbG9hZGluZ1wiPlxuICAgICAgICA8aWd4LWNpcmN1bGFyLWJhciBbaW5kZXRlcm1pbmF0ZV09XCJ0cnVlXCI+XG4gICAgICAgIDwvaWd4LWNpcmN1bGFyLWJhcj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdENvbGxhcHNlZFRlbXBsYXRlPlxuICAgIDxpZ3gtaWNvbiByb2xlPVwiYnV0dG9uXCI+dW5mb2xkX21vcmU8L2lneC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0RXhwYW5kZWRUZW1wbGF0ZT5cbiAgICA8aWd4LWljb24gcm9sZT1cImJ1dHRvblwiIFthY3RpdmVdPVwiaGFzRXhwYW5kZWRSZWNvcmRzKCkgJiYgaGFzRXhwYW5kYWJsZUNoaWxkcmVuXCI+dW5mb2xkX2xlc3M8L2lneC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiAqbmdJZj1cInJvd0VkaXRhYmxlXCIgaWd4VG9nZ2xlICNyb3dFZGl0aW5nT3ZlcmxheT5cbiAgICA8ZGl2IFtjbGFzc05hbWVdPVwiYmFubmVyQ2xhc3NcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZXNvbHZlUm93RWRpdENvbnRhaW5lcjsgY29udGV4dDogeyByb3dDaGFuZ2VzQ291bnQ6IHJvd0NoYW5nZXNDb3VudCwgZW5kRWRpdDogdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0LmJpbmQodGhpcykgfVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPG5nLXRlbXBsYXRlICNkZWZhdWx0Um93RWRpdFRleHQ+XG4gICAgWW91IGhhdmUge3sgcm93Q2hhbmdlc0NvdW50IH19IGNoYW5nZXMgaW4gdGhpcyByb3cgYW5kIHt7IGhpZGRlbkNvbHVtbnNDb3VudCB9fSBoaWRkZW4gY29sdW1uc1xuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJvd0VkaXRBY3Rpb25zPlxuICAgIDxidXR0b24gaWd4QnV0dG9uIGlneFJvd0VkaXRUYWJTdG9wIChjbGljayk9XCJ0aGlzLmVuZFJvd0VkaXRUYWJTdG9wKGZhbHNlLCAkZXZlbnQpXCI+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfcm93X2VkaXRfYnRuX2NhbmNlbCB9fTwvYnV0dG9uPlxuICAgIDxidXR0b24gaWd4QnV0dG9uIGlneFJvd0VkaXRUYWJTdG9wIChjbGljayk9XCJ0aGlzLmVuZFJvd0VkaXRUYWJTdG9wKHRydWUsICRldmVudClcIj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9yb3dfZWRpdF9idG5fZG9uZSB9fTwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJvd0VkaXRUZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWJhbm5lcl9fbWVzc2FnZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImlneC1iYW5uZXJfX3RleHRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRoaXMuY3J1ZFNlcnZpY2Uucm93Py5nZXRDbGFzc05hbWUoKSA9PT0gJ0lneEFkZFJvdycgPyByb3dBZGRUZXh0VGVtcGxhdGUgOiByZXNvbHZlUm93RWRpdFRleHQgfHwgZGVmYXVsdFJvd0VkaXRUZXh0O1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgJGltcGxpY2l0OiB0aGlzLmNydWRTZXJ2aWNlLnJvdz8uZ2V0Q2xhc3NOYW1lKCkgIT09ICdJZ3hBZGRSb3cnID8gcm93Q2hhbmdlc0NvdW50IDogbnVsbCB9XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtYmFubmVyX19hY3Rpb25zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtYmFubmVyX19yb3dcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInJlc29sdmVSb3dFZGl0QWN0aW9ucyB8fCBkZWZhdWx0Um93RWRpdEFjdGlvbnM7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB0aGlzLmVuZEVkaXQuYmluZCh0aGlzKSB9XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RyYWdJbmRpY2F0b3JJY29uQmFzZT5cbiAgICA8aWd4LWljb24+ZHJhZ19pbmRpY2F0b3I8L2lneC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGlneC1ncmlkLWNvbHVtbi1yZXNpemVyICpuZ0lmPVwiY29sUmVzaXppbmdTZXJ2aWNlLnNob3dSZXNpemVyXCI+PC9pZ3gtZ3JpZC1jb2x1bW4tcmVzaXplcj5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fbG9hZGluZy1vdXRsZXRcIiAjaWd4TG9hZGluZ092ZXJsYXlPdXRsZXQgaWd4T3ZlcmxheU91dGxldD48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fb3V0bGV0XCIgI2lneEZpbHRlcmluZ092ZXJsYXlPdXRsZXQgaWd4T3ZlcmxheU91dGxldD48L2Rpdj5cbiJdfQ==
1018
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2hpY2FsLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2dyaWRzL2hpZXJhcmNoaWNhbC1ncmlkL2hpZXJhcmNoaWNhbC1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9oaWVyYXJjaGljYWwtZ3JpZC9jaGlsZC1ncmlkLXJvdy5jb21wb25lbnQuaHRtbCIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9oaWVyYXJjaGljYWwtZ3JpZC9oaWVyYXJjaGljYWwtZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBQ2Ysc0JBQXNCLEVBR3RCLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUlMLG9CQUFvQixFQUVwQixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWxGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTFFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUN4RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM3RyxPQUFPLEVBQXNCLGFBQWEsRUFBRSxxQkFBcUIsRUFBVyxNQUFNLDBCQUEwQixDQUFDO0FBQzdHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN6RyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUV4RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsd0JBQXdCLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxSyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNqRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7O0FBRWpGLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztBQWFoQixNQUFNLE9BQU8sd0JBQXdCO0lBSWpDOztPQUVHO0lBQ0gsSUFBVyxlQUFlO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO0lBQzNFLENBQUM7SUFTRDs7Ozs7OztPQU9HO0lBQ0gsSUFDVyxJQUFJO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBVyxJQUFJLENBQUMsS0FBVTtRQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDWixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2hFO0lBQ0wsQ0FBQztJQXFCRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNILGlCQUFpQjtJQUNqQixJQUFXLFVBQVU7UUFDakIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQW9DLENBQUM7SUFDN0QsQ0FBQztJQUVELElBQ1csS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxJQUFXLGFBQWE7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUN0QyxDQUFDO0lBWUQsWUFDbUQsT0FBc0MsRUFDOUUsT0FBZ0MsRUFDaEMsR0FBc0I7UUFGa0IsWUFBTyxHQUFQLE9BQU8sQ0FBK0I7UUFDOUUsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7UUFDaEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFiakM7Ozs7O1dBS0c7UUFDSSxhQUFRLEdBQUcsS0FBSyxDQUFDO0lBT2EsQ0FBQztJQUV0Qzs7T0FFRztJQUNJLFFBQVE7UUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDaEgsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFDM0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNyQixJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQzNCLDZEQUE2RDtRQUM3RCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDekIsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ2xCLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFDekIsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLO1NBQ25CLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWU7UUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDbEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhFLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztZQUM3QixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbEIsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUN6QixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUs7U0FDbkIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVPLGtCQUFrQjtRQUN0QixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVsRCxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RELDJEQUEyRDtRQUMzRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN0QyxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO1FBRUgsNkVBQTZFO1FBQzdFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM1RCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQzVELElBQUksQ0FBQyxJQUFJLEVBQUU7d0JBQ1AsSUFBSSxHQUFHLEVBQUUsQ0FBQztxQkFDYjtvQkFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUMsQ0FBQyxDQUFDLENBQUM7YUFDTjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUdPLG9CQUFvQixDQUFDLE9BQXNCO1FBQy9DLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO1lBQzFCLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDO2FBQ3JEO1NBQ0o7SUFDTCxDQUFDOzhHQTVMUSx3QkFBd0Isa0JBMkdyQixxQkFBcUI7a0dBM0d4Qix3QkFBd0Isc1RBaURGLGdCQUFnQiwyQ0NoSW5ELGdMQUdBLDRDRDBFYyxPQUFPOzsyRkFFUix3QkFBd0I7a0JBUHBDLFNBQVM7c0NBQ1csdUJBQXVCLENBQUMsTUFBTSxZQUNyQyxvQkFBb0IsY0FFbEIsSUFBSSxXQUNQLENBQUMsT0FBTyxDQUFDOzswQkE2R2IsTUFBTTsyQkFBQyxxQkFBcUI7cUdBekcxQixNQUFNO3NCQURaLEtBQUs7Z0JBZUMsWUFBWTtzQkFEbEIsS0FBSztnQkFZSyxJQUFJO3NCQURkLEtBQUs7Z0JBcUJDLEtBQUs7c0JBRFgsS0FBSztnQkFJQyxTQUFTO3NCQURmLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBK0JuRCxLQUFLO3NCQURmLFdBQVc7dUJBQUMsaUJBQWlCOztBQXlLbEMsTUFBTSxPQUFPLDRCQUE2QixTQUFRLGdDQUFnQztJQXpEbEY7O1FBNERJOztXQUVHO1FBRUksU0FBSSxHQUFHLE1BQU0sQ0FBQztRQWdEckI7O1dBRUc7UUFDSSxvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUU1Qjs7V0FFRztRQUNJLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUUvQjs7V0FFRztRQUNJLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRTlCOztXQUVHO1FBQ0ksV0FBTSxHQUFpQyxJQUFJLENBQUM7UUFRM0MsU0FBSSxHQUFHLHlCQUF5QixPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQzVDLHVCQUFrQixHQUFrQixJQUFJLEdBQUcsRUFBRSxDQUFDO0tBc3VCekQ7SUF0d0JHLDRFQUE0RTtJQUM1RSxJQUFjLHVCQUF1QjtRQUNqQyxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsdUJBQXVCLENBQUM7SUFDbEQsQ0FBQztJQStCRDs7Ozs7Ozs7O09BU0c7SUFDSCxJQUVXLEVBQUU7UUFDVCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUNELElBQVcsRUFBRSxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxJQUNXLElBQUksQ0FBQyxLQUFtQjtRQUMvQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDakI7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDMUUsNEZBQTRGO1lBQzVGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDNUI7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQVcsSUFBSTtRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLElBQW9CLFNBQVM7UUFDekIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNuQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUN4RyxFQUFFLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFvQiw0QkFBNEI7UUFDNUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2RCxLQUFLLENBQUMsNEJBQTRCLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxJQUNXLGNBQWMsQ0FBQyxLQUFLO1FBQzNCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDckIsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILElBQ1csY0FBYyxDQUFDLEtBQWM7UUFDcEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFnQixDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILElBQVcsY0FBYztRQUNyQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxJQUFXLFVBQVU7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxxQkFBcUI7UUFDNUIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyx1QkFBdUI7UUFDOUIsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFO1lBQ3RELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQztTQUM3QztRQUNELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcscUJBQXFCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQ3RHLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsa0JBQWtCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2hHLENBQUM7SUFFRCxjQUFjO0lBQ0UsZUFBZTtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNkLHdDQUF3QztZQUN4Qyw0QkFBNEI7WUFDNUIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUM1QixFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFvQix3QkFBd0I7UUFDeEMsaUVBQWlFO1FBQ2pFLHVEQUF1RDtRQUN2RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdEUsQ0FBQztJQUVEOztPQUVHO0lBQ2EsUUFBUTtRQUNwQixzR0FBc0c7UUFDdEcsOEZBQThGO1FBQzlGLE1BQU07UUFDTixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNqRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFZLEVBQUUsRUFBRTtnQkFDdkYsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7WUFDNUIsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUNELEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDYSxlQUFlO1FBQzNCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMvRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUN2QyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzlELElBQUksVUFBVSxFQUFFO29CQUNaLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7b0JBQ3BDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzFDO2FBQ0o7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNiLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7WUFDcEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDdkUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM3RTtRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFFeEYsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBRWhDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUMvQixJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxZQUFZLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMseUJBQXlCLENBQUM7UUFDbkMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsNEJBQTRCLENBQUM7UUFDL0UsSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUM7UUFDakYsSUFBSSxDQUFDLGdDQUFnQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZ0NBQWdDLENBQUM7UUFDdkYsSUFBSSxDQUFDLCtCQUErQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQUM7UUFDckYsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsNEJBQTRCLENBQUM7UUFDL0UsSUFBSSxDQUFDLCtCQUErQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQUM7UUFDckYsSUFBSSxDQUFDLGdDQUFnQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZ0NBQWdDLENBQUM7UUFDdkYsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUM7UUFDbkUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7SUFDdEUsQ0FBQztJQUVEOztPQUVHO0lBQ2Esa0JBQWtCO1FBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUN2RSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FDM0IsQ0FBQztRQUNGLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLGFBQWEsQ0FBQyxLQUFhO1FBQzlCLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDNUMsT0FBTyxTQUFTLENBQUM7U0FDcEI7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksV0FBVyxDQUFDLEdBQVE7UUFDdkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2xDLE9BQU8sU0FBUyxDQUFDO1NBQ3BCO1FBRUQsT0FBTyxJQUFJLHNCQUFzQixDQUFDLElBQVcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTztRQUNWLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxRQUFRO1FBQ1gsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLHNCQUFzQixDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxJQUFXLGFBQWE7UUFDcEIsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3pFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLGVBQWUsQ0FBQyxRQUFnQixFQUFFLFdBQW1CO1FBQ3hELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLENBQUM7UUFDckUsSUFBSSxHQUFHLElBQUksR0FBRyxZQUFZLHNCQUFzQixJQUFJLE1BQU0sRUFBRTtZQUN4RCxPQUFPLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDbEQ7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSSxZQUFZLENBQUMsV0FBZ0IsRUFBRSxXQUFtQjtRQUNyRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDO1FBQ3JFLElBQUksR0FBRyxJQUFJLE1BQU0sRUFBRTtZQUNmLE9BQU8sSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDbkQ7SUFDTCxDQUFDO0lBRWUsTUFBTSxDQUFDLEtBQVUsRUFBRSxLQUFjO1FBQzdDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVlLFFBQVEsQ0FBQyxLQUFVO1FBQy9CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXLENBQUMsS0FBSztRQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsY0FBYztJQUNFLG1CQUFtQjtRQUMvQixPQUFPLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUI7UUFDcEIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2IsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFFLElBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN2SDthQUFNO1lBQ0gsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUUsSUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2pIO1FBQ0QsSUFBSSxDQUFFLElBQUksQ0FBQyxHQUFXLENBQUMsU0FBUyxFQUFFO1lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDNUI7SUFDTCxDQUFDO0lBRUQseUJBQXlCO0lBQ1QsV0FBVztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFO29CQUM5QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQkFDL0I7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUU7WUFDcEQsNkVBQTZFO1lBQzdFLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1NBQ25DO1FBQ0QsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNJLGdCQUFnQixDQUFDLE9BQU87UUFDM0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQztJQUNuRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxvQkFBb0IsQ0FBQyxNQUFXO1FBQ25DLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM1QixNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztTQUM3QjtRQUNELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUIsQ0FBQyxNQUFXO1FBQ2hDLHVFQUF1RTtRQUN2RSxPQUFPLE1BQU0sRUFBRSxjQUFjLEtBQUssU0FBUyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRztRQUMxQixJQUFJLEdBQUcsQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFO1lBQ2xDLGtCQUFrQjtZQUNsQixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUM7U0FDcEI7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU07UUFDdkMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUQsSUFBSSxVQUFVLEVBQUU7Z0JBQ1osTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztnQkFDN0IsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztnQkFDcEMsT0FBTztvQkFDSCxTQUFTLEVBQUUsT0FBTztvQkFDbEIsUUFBUSxFQUFFLElBQUk7b0JBQ2QsS0FBSyxFQUFFLFVBQVU7b0JBQ2pCLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7aUJBQ3hDLENBQUM7YUFDTDtpQkFBTTtnQkFDSCxzRUFBc0U7Z0JBQ3RFLE9BQU87b0JBQ0gsU0FBUyxFQUFFLE9BQU87b0JBQ2xCLFVBQVUsRUFBRTt3QkFDUixJQUFJLEVBQUUsVUFBVTt3QkFDaEIsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLO3FCQUNwQjtvQkFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2lCQUN4QyxDQUFDO2FBQ0w7U0FDSjthQUFNO1lBQ0gsT0FBTztnQkFDSCxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTztnQkFDcEUsVUFBVSxFQUFFO29CQUNSLElBQUksRUFBRSxTQUFTO29CQUNmLEVBQUUsRUFBRSxJQUFJO2lCQUNYO2dCQUNELEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztnQkFDOUMsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO2FBQ3hDLENBQUM7U0FDTDtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsUUFBUTtRQUNmLElBQUksUUFBUSxHQUFHLElBQW9DLENBQUM7UUFDcEQsT0FBTyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3BCLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1NBQzlCO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxZQUFZO1FBQ25CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUN6RSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDakMsT0FBTyxJQUFJLENBQUMsZ0NBQWdDLElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUFDO1NBQ2pGO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQywrQkFBK0IsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUM7U0FDL0U7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ2EsMEJBQTBCO1FBQ3RDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztTQUN6RDtRQUNELE9BQU8sS0FBSyxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDYSx1QkFBdUI7UUFDbkMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDN0MsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQzNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDekgsTUFBTSxHQUFHLFVBQVUsR0FBRyxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUM7U0FDMUU7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ1osTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDO1FBQ3pFLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNqQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDcEI7YUFBTTtZQUNILElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUN0QjtJQUNMLENBQUM7SUFHRDs7O09BR0c7SUFDSSxrQkFBa0I7UUFDckIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3JCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQyxJQUFJLEtBQUssRUFBRTtnQkFDUCxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7YUFDNUI7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sZ0JBQWdCLENBQUM7SUFDNUIsQ0FBQztJQUVlLHFCQUFxQixDQUFDLE1BQVc7UUFDN0MsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNyRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUUvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVLENBQUMsTUFBVztRQUN6QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksa0JBQWtCLENBQUMsSUFBSTtRQUMxQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2hELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztZQUN6QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUMxQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLGdCQUFnQixDQUFDLElBQUk7UUFDeEIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNoRCx3Q0FBd0M7WUFDeEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQ3pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEQsVUFBVSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBRTlCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ3BDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUYsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLGNBQWMsRUFBRTtvQkFDM0MsZ0hBQWdIO29CQUNoSCxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoQyxXQUFXLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztpQkFDdEM7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVELHlCQUF5QjtJQUNsQixpQkFBaUI7UUFDcEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVMsQ0FBQyxLQUFhLEVBQUUsSUFBVTtRQUN0QyxJQUFJLEdBQVksQ0FBQztRQUNqQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsTUFBTSxHQUFHLEdBQVEsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFbEQsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFO1lBQ3BDLEdBQUcsR0FBRyxJQUFJLHNCQUFzQixDQUFDLElBQVcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDN0Q7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRCx3QkFBd0I7SUFDakIsYUFBYSxDQUFDLE1BQWdCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVrQixrQkFBa0IsQ0FBQyxJQUFXO1FBQzdDLE9BQU8sS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzFGLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRVMsbUJBQW1CO1FBQ3pCLHVFQUF1RTtRQUN2RSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDNUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM1QjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNnQixXQUFXLENBQUMsVUFBZ0MsRUFBRSxLQUEwQixJQUFJO1FBQzNGLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3ZCLDRFQUE0RTtZQUM1RSx3QkFBd0I7WUFDeEIsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDekcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUdrQixZQUFZO1FBQzNCLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0RixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUNwRTthQUFNO1lBQ0gsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3hCO0lBQ0wsQ0FBQztJQUVrQixhQUFhO1FBQzVCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDN0UsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNyRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakYsT0FBTyxPQUFPLENBQUM7U0FDbEI7YUFBTTtZQUNKLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtTQUNsQztJQUNMLENBQUM7SUFFa0IsZ0JBQWdCO1FBQy9CLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVrQixlQUFlLENBQUMsY0FBYztRQUM3QyxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNyQyxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxLQUFLLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxjQUFjLEdBQUcsSUFBSTtRQUMxQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQzdFLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNoRixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDckQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRixJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUIsSUFBSSxjQUFjLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUNyRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbEM7U0FDSjtJQUNMLENBQUM7SUFFTyx3QkFBd0I7UUFDNUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDakUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzNDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OEdBdnpCUSw0QkFBNEI7a0dBQTVCLDRCQUE0QixzUEFyRDFCO1lBQ1Asa0JBQWtCO1lBQ2xCLHdCQUF3QjtZQUN4Qix1QkFBdUI7WUFDdkIsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsUUFBUSxFQUFFLDZCQUE2QixFQUFFO1lBQzNFLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsNEJBQTRCLEVBQUU7WUFDckUscUJBQXFCO1lBQ3JCLG1CQUFtQjtZQUNuQixvQ0FBb0M7WUFDcEMsd0JBQXdCO1lBQ3hCLG1CQUFtQjtZQUNuQix5QkFBeUI7WUFDekIsc0JBQXNCO1NBQ3pCLDBEQW9EZ0IscUJBQXFCLFFBQVUscUJBQXFCLGdEQU1wRCxxQkFBcUIsMkJBQVUscUJBQXFCLGdEQUlwRCxxQkFBcUIsMklBSUYsZ0JBQWdCLDZHQUlkLGdCQUFnQixxSUFjSCxXQUFXLCtIQUdsQixXQUFXLGdFQVp6QywwQkFBMEIsMkJBQVUsMEJBQTBCLG1EQU05RCx3QkFBd0IsdUVFaFgxQyw0aWJBa09BLDRDRmdFUSxJQUFJLDZGQUNKLE9BQU8sb0ZBQ1AsS0FBSyxtSEFDTCxnQkFBZ0Isb0pBQ2hCLE9BQU8sMkVBQ1AseUJBQXlCLDBMQUN6QixvQkFBb0IsMERBQ3BCLDBCQUEwQixvSUFDMUIsNEJBQTRCLG1HQUM1QixxQkFBcUIsd0xBQ3JCLDBCQUEwQiwwTUFDMUIsMkJBQTJCLHNFQUMzQix5QkFBeUIsNkZBQ3pCLGtCQUFrQiwrSkFDbEIsK0JBQStCLDBIQUMvQixvQkFBb0Isc0tBQ3BCLHNCQUFzQixtSUFDdEIsa0JBQWtCLHdNQUNsQixrQkFBa0IsaUtBQ2xCLGdCQUFnQiwyRkFDaEIsMEJBQTBCLGdFQUMxQiw2QkFBNkIsb0dBeE94Qix3QkFBd0IsK0dBME83QixrQkFBa0IsNENBQ2xCLG9CQUFvQixpREFDcEIsc0JBQXNCLG1EQUN0Qix3QkFBd0Isa0RBQ3hCLHFCQUFxQixrREFDckIsaUJBQWlCLDhDQUNqQixxQkFBcUIscURBQ3JCLG9CQUFvQixvREFDcEIsa0JBQWtCLDBEQUNsQix1QkFBdUIsb0RBQ3ZCLDZCQUE2Qjs7MkZBSXhCLDRCQUE0QjtrQkF6RHhDLFNBQVM7c0NBQ1csdUJBQXVCLENBQUMsTUFBTSxZQUNyQyx1QkFBdUIsYUFFdEI7d0JBQ1Asa0JBQWtCO3dCQUNsQix3QkFBd0I7d0JBQ3hCLHVCQUF1Qjt3QkFDdkIsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsUUFBUSxFQUFFLDZCQUE2QixFQUFFO3dCQUMzRSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyw4QkFBOEIsRUFBRTt3QkFDckUscUJBQXFCO3dCQUNyQixtQkFBbUI7d0JBQ25CLG9DQUFvQzt3QkFDcEMsd0JBQXdCO3dCQUN4QixtQkFBbUI7d0JBQ25CLHlCQUF5Qjt3QkFDekIsc0JBQXNCO3FCQUN6QixjQUNXLElBQUksV0FDUDt3QkFDTCxJQUFJO3dCQUNKLE9BQU87d0JBQ1AsS0FBSzt3QkFDTCxnQkFBZ0I7d0JBQ2hCLE9BQU87d0JBQ1AseUJBQXlCO3dCQUN6QixvQkFBb0I7d0JBQ3BCLDBCQUEwQjt3QkFDMUIsNEJBQTRCO3dCQUM1QixxQkFBcUI7d0JBQ3JCLDBCQUEwQjt3QkFDMUIsMkJBQTJCO3dCQUMzQix5QkFBeUI7d0JBQ3pCLGtCQUFrQjt3QkFDbEIsK0JBQStCO3dCQUMvQixvQkFBb0I7d0JBQ3BCLHNCQUFzQjt3QkFDdEIsa0JBQWtCO3dCQUNsQixrQkFBa0I7d0JBQ2xCLGdCQUFnQjt3QkFDaEIsMEJBQTBCO3dCQUMxQiw2QkFBNkI7d0JBQzdCLHdCQUF3Qjt3QkFDeEIsa0JBQWtCO3dCQUNsQixvQkFBb0I7d0JBQ3BCLHNCQUFzQjt3QkFDdEIsd0JBQXdCO3dCQUN4QixxQkFBcUI7d0JBQ3JCLGlCQUFpQjt3QkFDakIscUJBQXFCO3dCQUNyQixvQkFBb0I7d0JBQ3BCLGtCQUFrQjt3QkFDbEIsdUJBQXVCO3dCQUN2Qiw2QkFBNkI7cUJBQ2hDLFdBQ1EsQ0FBQyxzQkFBc0IsQ0FBQzs4QkFTMUIsSUFBSTtzQkFEVixXQUFXO3VCQUFDLFdBQVc7Z0JBT2pCLGVBQWU7c0JBRHJCLGVBQWU7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRTtnQkFPcEYsYUFBYTtzQkFEbkIsZUFBZTt1QkFBQyxxQkFBcUIsRUFBRSxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQUtuRixhQUFhO3NCQURuQixlQUFlO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFLdEQsYUFBYTtzQkFEbkIsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBSy9DLGVBQWU7c0JBRHJCLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBTWpELGVBQWU7c0JBRHJCLFlBQVk7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUU7Z0JBT3ZFLGdCQUFnQjtzQkFEdEIsWUFBWTt1QkFBQyx3QkFBd0I7Z0JBSTVCLDBCQUEwQjtzQkFEbkMsU0FBUzt1QkFBQyw4QkFBOEIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJcEUsYUFBYTtzQkFEdEIsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFpRDVELEVBQUU7c0JBRlosV0FBVzt1QkFBQyxTQUFTOztzQkFDckIsS0FBSztnQkFpQkssSUFBSTtzQkFEZCxLQUFLO2dCQXdESyxjQUFjO3NCQUR4QixLQUFLO2dCQW1CSyxjQUFjO3NCQUR4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxuICAgIERvQ2hlY2ssXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBRdWVyeUxpc3QsXG4gICAgcmVmbGVjdENvbXBvbmVudFR5cGUsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0lmLCBOZ0NsYXNzLCBOZ0ZvciwgTmdUZW1wbGF0ZU91dGxldCwgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IElneEhpZXJhcmNoaWNhbEdyaWRBUElTZXJ2aWNlIH0gZnJvbSAnLi9oaWVyYXJjaGljYWwtZ3JpZC1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hSb3dJc2xhbmRDb21wb25lbnQgfSBmcm9tICcuL3Jvdy1pc2xhbmQuY29tcG9uZW50JztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi9maWx0ZXJpbmcvZ3JpZC1maWx0ZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQsIH0gZnJvbSAnLi4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElneEhpZXJhcmNoaWNhbEdyaWROYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vaGllcmFyY2hpY2FsLWdyaWQtbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRTdW1tYXJ5U2VydmljZSB9IGZyb20gJy4uL3N1bW1hcmllcy9ncmlkLXN1bW1hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hIaWVyYXJjaGljYWxHcmlkQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4vaGllcmFyY2hpY2FsLWdyaWQtYmFzZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3RlbXBsYXRlLW91dGxldC90ZW1wbGF0ZV9vdXRsZXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VsZWN0aW9uL3NlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneEZvck9mU3luY1NlcnZpY2UsIElneEZvck9mU2Nyb2xsU3luY1NlcnZpY2UgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2Zvci1vZi9mb3Jfb2Yuc3luYy5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxUeXBlLCBHcmlkVHlwZSwgSUdYX0dSSURfQkFTRSwgSUdYX0dSSURfU0VSVklDRV9CQVNFLCBSb3dUeXBlIH0gZnJvbSAnLi4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElneFJvd0lzbGFuZEFQSVNlcnZpY2UgfSBmcm9tICcuL3Jvdy1pc2xhbmQtYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZENSVURTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL2NydWQuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hIaWVyYXJjaGljYWxHcmlkUm93IH0gZnJvbSAnLi4vZ3JpZC1wdWJsaWMtcm93JztcbmltcG9ydCB7IElneEdyaWRDZWxsIH0gZnJvbSAnLi4vZ3JpZC1wdWJsaWMtY2VsbCc7XG5pbXBvcnQgeyBJZ3hQYWdpbmF0b3JDb21wb25lbnQgfSBmcm9tICcuLi8uLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3JpZC9ncmlkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBJZ3hUb2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3RvZ2dsZS90b2dnbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneENvbHVtblJlc2l6aW5nU2VydmljZSB9IGZyb20gJy4uL3Jlc2l6aW5nL3Jlc2l6aW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgfSBmcm9tICcuLi9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZXhjZWwtc3R5bGUtZmlsdGVyaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9ncmlkL2dyaWQtdmFsaWRhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRIaWVyYXJjaGljYWxQaXBlLCBJZ3hHcmlkSGllcmFyY2hpY2FsUGFnaW5nUGlwZSB9IGZyb20gJy4vaGllcmFyY2hpY2FsLWdyaWQucGlwZXMnO1xuaW1wb3J0IHsgSWd4U3VtbWFyeURhdGFQaXBlIH0gZnJvbSAnLi4vc3VtbWFyaWVzL2dyaWQtcm9vdC1zdW1tYXJ5LnBpcGUnO1xuaW1wb3J0IHsgSWd4R3JpZFRyYW5zYWN0aW9uUGlwZSwgSWd4SGFzVmlzaWJsZUNvbHVtbnNQaXBlLCBJZ3hHcmlkUm93UGlubmluZ1BpcGUsIElneEdyaWRBZGRSb3dQaXBlLCBJZ3hHcmlkUm93Q2xhc3Nlc1BpcGUsIElneEdyaWRSb3dTdHlsZXNQaXBlIH0gZnJvbSAnLi4vY29tbW9uL3BpcGVzJztcbmltcG9ydCB7IElneEdyaWRTb3J0aW5nUGlwZSwgSWd4R3JpZEZpbHRlcmluZ1BpcGUgfSBmcm9tICcuLi9ncmlkL2dyaWQucGlwZXMnO1xuaW1wb3J0IHsgSWd4R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQgfSBmcm9tICcuLi9yZXNpemluZy9yZXNpemVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZSB9IGZyb20gJy4uL2dyaWQucm93RWRpdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4UmlwcGxlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9yaXBwbGUvcmlwcGxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hCdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2J1dHRvbi9idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IElneFN1bW1hcnlSb3dDb21wb25lbnQgfSBmcm9tICcuLi9zdW1tYXJpZXMvc3VtbWFyeS1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IElneFNuYWNrYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc25hY2tiYXIvc25hY2tiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IElneENpcmN1bGFyUHJvZ3Jlc3NCYXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9wcm9ncmVzc2Jhci9wcm9ncmVzc2Jhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4SGllcmFyY2hpY2FsUm93Q29tcG9uZW50IH0gZnJvbSAnLi9oaWVyYXJjaGljYWwtcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2Zvci1vZi9mb3Jfb2YuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneENvbHVtbk1vdmluZ0Ryb3BEaXJlY3RpdmUgfSBmcm9tICcuLi9tb3ZpbmcvbW92aW5nLmRyb3AuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEdyaWREcmFnU2VsZWN0RGlyZWN0aXZlIH0gZnJvbSAnLi4vc2VsZWN0aW9uL2RyYWctc2VsZWN0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hHcmlkQm9keURpcmVjdGl2ZSB9IGZyb20gJy4uL2dyaWQuY29tbW9uJztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJSb3dDb21wb25lbnQgfSBmcm9tICcuLi9oZWFkZXJzL2dyaWQtaGVhZGVyLXJvdy5jb21wb25lbnQnO1xuXG5sZXQgTkVYVF9JRCA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGllcmFyY2hpY2FsU3RhdGVSZWNvcmQge1xuICAgIHJvd0lEOiBhbnk7XG59XG5cbkBDb21wb25lbnQoe1xuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHNlbGVjdG9yOiAnaWd4LWNoaWxkLWdyaWQtcm93JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2hpbGQtZ3JpZC1yb3cuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW05nQ2xhc3NdXG59KVxuZXhwb3J0IGNsYXNzIElneENoaWxkR3JpZFJvd0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCB7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbGF5b3V0OiBJZ3hSb3dJc2xhbmRDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBwYXJlbnRIYXNTY3JvbGwoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5wYXJlbnRHcmlkLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmRjLmluc3RhbmNlLm5vdFZpcnR1YWw7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcGFyZW50R3JpZElEOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiAgVGhlIGRhdGEgcGFzc2VkIHRvIHRoZSByb3cgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldCB0aGUgcm93IGRhdGEgZm9yIHRoZSBmaXJzdCBzZWxlY3RlZCByb3dcbiAgICAgKiBsZXQgc2VsZWN0ZWRSb3dEYXRhID0gdGhpcy5ncmlkLnNlbGVjdGVkUm93c1swXS5kYXRhO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBkYXRhKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhIHx8IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZGF0YSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuaEdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMuaEdyaWQuZGF0YSA9IHRoaXMuX2RhdGEuY2hpbGRHcmlkc0RhdGFbdGhpcy5sYXlvdXQua2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIHJvdy5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXQgdGhlIGluZGV4IG9mIHRoZSBzZWNvbmQgc2VsZWN0ZWQgcm93XG4gICAgICogbGV0IHNlbGVjdGVkUm93SW5kZXggPSB0aGlzLmdyaWQuc2VsZWN0ZWRSb3dzWzFdLmluZGV4O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGluZGV4OiBudW1iZXI7XG5cbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7cmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlfSlcbiAgICBwdWJsaWMgY29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBoR3JpZDogSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgZ3JpZCB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RlZCByb3cuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogaGFuZGxlUm93U2VsZWN0aW9uKGV2ZW50KSB7XG4gICAgICogIC8vIHRoZSBncmlkIG9uIHdoaWNoIHRoZSByb3dTZWxlY3RlZCBldmVudCB3YXMgdHJpZ2dlcmVkXG4gICAgICogIGNvbnN0IGdyaWQgPSBldmVudC5yb3cuZ3JpZDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtZ3JpZFxuICAgICAqICAgIFtkYXRhXT1cImRhdGFcIlxuICAgICAqICAgIChyb3dTZWxlY3RlZCk9XCJoYW5kbGVSb3dTZWxlY3Rpb24oJGV2ZW50KVwiPlxuICAgICAqICA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIC8vIFRPRE86IFJlZmFjdG9yXG4gICAgcHVibGljIGdldCBwYXJlbnRHcmlkKCk6IElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkQVBJLmdyaWQgYXMgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sZXZlbCcpXG4gICAgcHVibGljIGdldCBsZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0LmxldmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBuYXRpdmUgRE9NIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSByb3cuIENvdWxkIGJlIG51bGwgaW4gY2VydGFpbiBlbnZpcm9ubWVudHMuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0IHRoZSBuYXRpdmVFbGVtZW50IG9mIHRoZSBzZWNvbmQgc2VsZWN0ZWQgcm93XG4gICAgICogbGV0IHNlbGVjdGVkUm93TmF0aXZlRWxlbWVudCA9IHRoaXMuZ3JpZC5zZWxlY3RlZFJvd3NbMV0ubmF0aXZlRWxlbWVudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG5hdGl2ZUVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJvdyBpcyBleHBhbmRlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgUm93RXhwYW5kZWQgPSB0aGlzLmdyaWQxLnJvd0xpc3QuZmlyc3QuZXhwYW5kZWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZGVkID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIF9kYXRhOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChJR1hfR1JJRF9TRVJWSUNFX0JBU0UpIHB1YmxpYyByZWFkb25seSBncmlkQVBJOiBJZ3hIaWVyYXJjaGljYWxHcmlkQVBJU2VydmljZSxcbiAgICAgICAgcHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikgeyB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICBjb25zdCByZWYgPSB0aGlzLmNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudCwgeyBpbmplY3RvcjogdGhpcy5jb250YWluZXIuaW5qZWN0b3IgfSk7XG4gICAgICAgIHRoaXMuaEdyaWQgPSByZWYuaW5zdGFuY2U7XG4gICAgICAgIHRoaXMuaEdyaWQuZGF0YSA9IHRoaXMuZGF0YS5jaGlsZEdyaWRzRGF0YVt0aGlzLmxheW91dC5rZXldO1xuICAgICAgICB0aGlzLmxheW91dC5sYXlvdXRDaGFuZ2Uuc3Vic2NyaWJlKChjaCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlTGF5b3V0Q2hhbmdlcyhjaCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5sYXlvdXQuaW5pdGlhbENoYW5nZXM7XG4gICAgICAgIGNoYW5nZXMuZm9yRWFjaChjaGFuZ2UgPT4ge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlTGF5b3V0Q2hhbmdlcyhjaGFuZ2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5oR3JpZC5wYXJlbnQgPSB0aGlzLnBhcmVudEdyaWQ7XG4gICAgICAgIHRoaXMuaEdyaWQucGFyZW50SXNsYW5kID0gdGhpcy5sYXlvdXQ7XG4gICAgICAgIHRoaXMuaEdyaWQuY2hpbGRSb3cgPSB0aGlzO1xuICAgICAgICAvLyBoYW5kbGVyIGxvZ2ljIHRoYXQgcmUtZW1pdHMgaGdyaWQgZXZlbnRzIG9uIHRoZSByb3cgaXNsYW5kXG4gICAgICAgIHRoaXMuc2V0dXBFdmVudEVtaXR0ZXJzKCk7XG4gICAgICAgIHRoaXMubGF5b3V0LmdyaWRDcmVhdGVkLmVtaXQoe1xuICAgICAgICAgICAgb3duZXI6IHRoaXMubGF5b3V0LFxuICAgICAgICAgICAgcGFyZW50SUQ6IHRoaXMuZGF0YS5yb3dJRCxcbiAgICAgICAgICAgIGdyaWQ6IHRoaXMuaEdyaWRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuaEdyaWQuY2hpbGRMYXlvdXRMaXN0ID0gdGhpcy5sYXlvdXQuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IGxheW91dHMgPSB0aGlzLmhHcmlkLmNoaWxkTGF5b3V0TGlzdC50b0FycmF5KCk7XG4gICAgICAgIGxheW91dHMuZm9yRWFjaCgobCkgPT4gdGhpcy5oR3JpZC5ncmlkQVBJLnJlZ2lzdGVyQ2hpbGRSb3dJc2xhbmQobCkpO1xuICAgICAgICB0aGlzLnBhcmVudEdyaWQuZ3JpZEFQSS5yZWdpc3RlckNoaWxkR3JpZCh0aGlzLmRhdGEucm93SUQsIHRoaXMubGF5b3V0LmtleSwgdGhpcy5oR3JpZCk7XG4gICAgICAgIHRoaXMubGF5b3V0LnJvd0lzbGFuZEFQSS5yZWdpc3RlckNoaWxkR3JpZCh0aGlzLmRhdGEucm93SUQsIHRoaXMuaEdyaWQpO1xuXG4gICAgICAgIHRoaXMubGF5b3V0LmdyaWRJbml0aWFsaXplZC5lbWl0KHtcbiAgICAgICAgICAgIG93bmVyOiB0aGlzLmxheW91dCxcbiAgICAgICAgICAgIHBhcmVudElEOiB0aGlzLmRhdGEucm93SUQsXG4gICAgICAgICAgICBncmlkOiB0aGlzLmhHcmlkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaEdyaWQuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwRXZlbnRFbWl0dGVycygpIHtcbiAgICAgICAgY29uc3QgZGVzdHJ1Y3RvciA9IHRha2VVbnRpbCh0aGlzLmhHcmlkLmRlc3Ryb3kkKTtcblxuICAgICAgICBjb25zdCBtaXJyb3IgPSByZWZsZWN0Q29tcG9uZW50VHlwZShJZ3hHcmlkQ29tcG9uZW50KTtcbiAgICAgICAgLy8gZXhjbHVkZSBvdXRwdXRzIHJlbGF0ZWQgdG8gdHdvLXdheSBiaW5kaW5nIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgY29uc3QgaW5wdXROYW1lcyA9IG1pcnJvci5pbnB1dHMubWFwKGlucHV0ID0+IGlucHV0LnByb3BOYW1lKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IG1pcnJvci5vdXRwdXRzLmZpbHRlcihvID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nSW5wdXRQcm9wTmFtZSA9IG8ucHJvcE5hbWUuc2xpY2UoMCwgby5wcm9wTmFtZS5pbmRleE9mKCdDaGFuZ2UnKSk7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXROYW1lcy5pbmRleE9mKG1hdGNoaW5nSW5wdXRQcm9wTmFtZSkgPT09IC0xO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUT0RPOiBTa2lwIHRoZSBgcmVuZGVyZWRgIG91dHB1dC4gUmVuZGVyZWQgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIHBlciBncmlkLlxuICAgICAgICBvdXRwdXRzLmZpbHRlcihvID0+IG8ucHJvcE5hbWUgIT09ICdyZW5kZXJlZCcpLmZvckVhY2gob3V0cHV0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhHcmlkW291dHB1dC5wcm9wTmFtZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhHcmlkW291dHB1dC5wcm9wTmFtZV0ucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0ge307XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXJncy5vd25lciA9IHRoaXMuaEdyaWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0W291dHB1dC5wcm9wTmFtZV0uZW1pdChhcmdzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIF9oYW5kbGVMYXlvdXRDaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGFuZ2UgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoY2hhbmdlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaEdyaWRbY2hhbmdlXSA9IGNoYW5nZXNbY2hhbmdlXS5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHNlbGVjdG9yOiAnaWd4LWhpZXJhcmNoaWNhbC1ncmlkJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2hpZXJhcmNoaWNhbC1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgSWd4R3JpZENSVURTZXJ2aWNlLFxuICAgICAgICBJZ3hHcmlkVmFsaWRhdGlvblNlcnZpY2UsXG4gICAgICAgIElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICB7IHByb3ZpZGU6IElHWF9HUklEX1NFUlZJQ0VfQkFTRSwgdXNlQ2xhc3M6IElneEhpZXJhcmNoaWNhbEdyaWRBUElTZXJ2aWNlIH0sXG4gICAgICAgIHsgcHJvdmlkZTogSUdYX0dSSURfQkFTRSwgdXNlRXhpc3Rpbmc6IElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnQgfSxcbiAgICAgICAgSWd4R3JpZFN1bW1hcnlTZXJ2aWNlLFxuICAgICAgICBJZ3hGaWx0ZXJpbmdTZXJ2aWNlLFxuICAgICAgICBJZ3hIaWVyYXJjaGljYWxHcmlkTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgICAgIElneENvbHVtblJlc2l6aW5nU2VydmljZSxcbiAgICAgICAgSWd4Rm9yT2ZTeW5jU2VydmljZSxcbiAgICAgICAgSWd4Rm9yT2ZTY3JvbGxTeW5jU2VydmljZSxcbiAgICAgICAgSWd4Um93SXNsYW5kQVBJU2VydmljZVxuICAgIF0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE5nSWYsXG4gICAgICAgIE5nQ2xhc3MsXG4gICAgICAgIE5nRm9yLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBOZ1N0eWxlLFxuICAgICAgICBJZ3hHcmlkSGVhZGVyUm93Q29tcG9uZW50LFxuICAgICAgICBJZ3hHcmlkQm9keURpcmVjdGl2ZSxcbiAgICAgICAgSWd4R3JpZERyYWdTZWxlY3REaXJlY3RpdmUsXG4gICAgICAgIElneENvbHVtbk1vdmluZ0Ryb3BEaXJlY3RpdmUsXG4gICAgICAgIElneEdyaWRGb3JPZkRpcmVjdGl2ZSxcbiAgICAgICAgSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUsXG4gICAgICAgIElneEhpZXJhcmNoaWNhbFJvd0NvbXBvbmVudCxcbiAgICAgICAgSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSxcbiAgICAgICAgSWd4VG9nZ2xlRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDaXJjdWxhclByb2dyZXNzQmFyQ29tcG9uZW50LFxuICAgICAgICBJZ3hTbmFja2JhckNvbXBvbmVudCxcbiAgICAgICAgSWd4U3VtbWFyeVJvd0NvbXBvbmVudCxcbiAgICAgICAgSWd4QnV0dG9uRGlyZWN0aXZlLFxuICAgICAgICBJZ3hSaXBwbGVEaXJlY3RpdmUsXG4gICAgICAgIElneEljb25Db21wb25lbnQsXG4gICAgICAgIElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlLFxuICAgICAgICBJZ3hHcmlkQ29sdW1uUmVzaXplckNvbXBvbmVudCxcbiAgICAgICAgSWd4Q2hpbGRHcmlkUm93Q29tcG9uZW50LFxuICAgICAgICBJZ3hHcmlkU29ydGluZ1BpcGUsXG4gICAgICAgIElneEdyaWRGaWx0ZXJpbmdQaXBlLFxuICAgICAgICBJZ3hHcmlkVHJhbnNhY3Rpb25QaXBlLFxuICAgICAgICBJZ3hIYXNWaXNpYmxlQ29sdW1uc1BpcGUsXG4gICAgICAgIElneEdyaWRSb3dQaW5uaW5nUGlwZSxcbiAgICAgICAgSWd4R3JpZEFkZFJvd1BpcGUsXG4gICAgICAgIElneEdyaWRSb3dDbGFzc2VzUGlwZSxcbiAgICAgICAgSWd4R3JpZFJvd1N0eWxlc1BpcGUsXG4gICAgICAgIElneFN1bW1hcnlEYXRhUGlwZSxcbiAgICAgICAgSWd4R3JpZEhpZXJhcmNoaWNhbFBpcGUsXG4gICAgICAgIElneEdyaWRIaWVyYXJjaGljYWxQYWdpbmdQaXBlXG4gICAgXSxcbiAgICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudCBleHRlbmRzIElneEhpZXJhcmNoaWNhbEdyaWRCYXNlRGlyZWN0aXZlXG4gICAgaW1wbGVtZW50cyBHcmlkVHlwZSwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25Jbml0LCBPbkRlc3Ryb3ksIERvQ2hlY2sge1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIHJvbGUgPSAnZ3JpZCc7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dJc2xhbmRDb21wb25lbnQsIHsgcmVhZDogSWd4Um93SXNsYW5kQ29tcG9uZW50LCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgY2hpbGRMYXlvdXRMaXN0OiBRdWVyeUxpc3Q8SWd4Um93SXNsYW5kQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0lzbGFuZENvbXBvbmVudCwgeyByZWFkOiBJZ3hSb3dJc2xhbmRDb21wb25lbnQsIGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gICAgcHVibGljIGFsbExheW91dExpc3Q6IFF1ZXJ5TGlzdDxJZ3hSb3dJc2xhbmRDb21wb25lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hQYWdpbmF0b3JDb21wb25lbnQsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgICBwdWJsaWMgcGFnaW5hdG9yTGlzdDogUXVlcnlMaXN0PElneFBhZ2luYXRvckNvbXBvbmVudD47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAVmlld0NoaWxkKCd0b29sYmFyT3V0bGV0JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gICAgcHVibGljIHRvb2xiYXJPdXRsZXQ6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAVmlld0NoaWxkKCdwYWdpbmF0b3JPdXRsZXQnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgICBwdWJsaWMgcGFnaW5hdG9yT3V0bGV0OiBWaWV3Q29udGFpbmVyUmVmO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAVmlld0NoaWxkcmVuKElneFRlbXBsYXRlT3V0bGV0RGlyZWN0aXZlLCB7IHJlYWQ6IElneFRlbXBsYXRlT3V0bGV0RGlyZWN0aXZlIH0pXG4gICAgcHVibGljIHRlbXBsYXRlT3V0bGV0czogUXVlcnlMaXN0PGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hDaGlsZEdyaWRSb3dDb21wb25lbnQpXG4gICAgcHVibGljIGhpZXJhcmNoaWNhbFJvd3M6IFF1ZXJ5TGlzdDxJZ3hDaGlsZEdyaWRSb3dDb21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBoaWVyYXJjaGljYWxSZWNvcmRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NoaWxkX3JlY29yZF90ZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBjaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLy8gQFZpZXdDaGlsZCgnaGVhZGVySGllcmFyY2h5RXhwYW5kZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBnZXQgaGVhZGVySGllcmFyY2h5RXhwYW5kZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZWFkUm93Py5oZWFkZXJIaWVyYXJjaHlFeHBhbmRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGNoaWxkTGF5b3V0S2V5cyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBoaWdobGlnaHRlZFJvd0lEID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlT25SZW5kZXIgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyZW50OiBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2hpbGRSb3c6IElneENoaWxkR3JpZFJvd0NvbXBvbmVudDtcblxuICAgIHByaXZhdGUgX2RhdGE7XG4gICAgcHJpdmF0ZSBoX2lkID0gYGlneC1oaWVyYXJjaGljYWwtZ3JpZC0ke05FWFRfSUQrK31gO1xuICAgIHByaXZhdGUgY2hpbGRHcmlkVGVtcGxhdGVzOiBNYXA8YW55LCBhbnk+ID0gbmV3IE1hcCgpO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYGlkYCBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIG5vdCBwcm92aWRlZCBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtaGllcmFyY2hpY2FsLWdyaWQgW2lkXT1cIidpZ3gtaGdyaWQtMSdcIiBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtaGllcmFyY2hpY2FsLWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaF9pZDtcbiAgICB9XG4gICAgcHVibGljIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuaF9pZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IGxldHMgeW91IGZpbGwgdGhlIGBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50YCB3aXRoIGFuIGFycmF5IG9mIGRhdGEuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtaGllcmFyY2hpY2FsLWdyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWhpZXJhcmNoaWNhbC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZGF0YSh2YWx1ZTogYW55W10gfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB2YWx1ZSB8fCBbXTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbi51cGRhdGVBbGwodGhpcy5fZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkR2VuZXJhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBDb2x1bW5zKCk7XG4gICAgICAgICAgICB0aGlzLnJlZmxvdygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgKHRoaXMuaGVpZ2h0ID09PSBudWxsIHx8IHRoaXMuaGVpZ2h0LmluZGV4T2YoJyUnKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgaGVpZ2h0IHdpbGwgY2hhbmdlIGJhc2VkIG9uIGhvdyBtdWNoIGRhdGEgdGhlcmUgaXMsIHJlY2FsY3VsYXRlIHNpemVzIGluIGlneEZvck9mLlxuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBkYXRhIHNldCB0byB0aGUgYElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgZmlsdGVyZWREYXRhID0gdGhpcy5ncmlkLmZpbHRlcmVkRGF0YTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBkYXRhKCk6IGFueVtdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgcGFnaW5hdG9yKCkge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuaWQ7XG4gICAgICAgIHJldHVybiAoIXRoaXMucGFyZW50SXNsYW5kICYmIHRoaXMucGFnaW5hdGlvbkNvbXBvbmVudHM/LmZpcnN0KSB8fCB0aGlzLnJvb3RHcmlkLnBhZ2luYXRvckxpc3Q/LmZpbmQoKHBnKSA9PlxuICAgICAgICAgICAgcGcubmF0aXZlRWxlbWVudC5vZmZzZXRQYXJlbnQ/LmlkID09PSBpZCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBleGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50KCkgOiBJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudElzbGFuZCA/XG4gICAgICAgICAgICB0aGlzLnBhcmVudElzbGFuZC5leGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50cy5maXJzdCA6XG4gICAgICAgICAgICBzdXBlci5leGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIHByb3BlcnR5IGlzIHJlcXVpcmVkIGZvciByZW1vdGUgZ3JpZCB2aXJ0dWFsaXphdGlvbiB0byBmdW5jdGlvbiB3aGVuIGl0IGlzIGJvdW5kIHRvIHJlbW90ZSBkYXRhLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGl0ZW1Db3VudCA9IHRoaXMuZ3JpZDEudG90YWxJdGVtQ291bnQ7XG4gICAgICogdGhpcy5ncmlkMS50b3RhbEl0ZW1Db3VudCA9IDU1O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCB0b3RhbEl0ZW1Db3VudChjb3VudCkge1xuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnRvdGFsSXRlbUNvdW50ID0gY291bnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b3RhbEl0ZW1Db3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIudG90YWxJdGVtQ291bnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBpZiBhbGwgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudGAgc2hvdWxkIGJlIGV4cGFuZGVkL2NvbGxhcHNlZC5cbiAgICAgKiBEZWZ1bHQgdmFsdWUgaXMgZmFsc2UuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtaGllcmFyY2hpY2FsLWdyaWQgW2lkXT1cIidpZ3gtZ3JpZC0xJ1wiIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbZXhwYW5kQ2hpbGRyZW5dPVwidHJ1ZVwiPjwvaWd4LWhpZXJhcmNoaWNhbC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZXhwYW5kQ2hpbGRyZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEV4cGFuZFN0YXRlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVzID0gbmV3IE1hcDxhbnksIGJvb2xlYW4+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBpZiBhbGwgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudGAgcHJldmlvdXNseSBoYXZlIGJlZW4gc2V0IHRvIGJlIGV4cGFuZGVkL2NvbGxhcHNlZC5cbiAgICAgKiBJZiBwcmV2aW91c2x5IHNldCBhbmQgc29tZSByb3dzIGhhdmUgYmVlbiBtYW51YWxseSBleHBhbmRlZC9jb2xsYXBzZWQgaXQgd2lsbCBzdGlsbCByZXR1cm4gdGhlIGxhc3Qgc2V0IHZhbHVlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBleHBhbmRlZCA9IHRoaXMuZ3JpZC5leHBhbmRDaGlsZHJlbjtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hIaWVyYXJjaGljYWxHcmlkQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBleHBhbmRDaGlsZHJlbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50IHJvdy4gSXQgbWF5IGJlIGEgYHN0cmluZ2Agb3IgYG51bWJlcmAgaWYgYHByaW1hcnlLZXlgIG9mIHRoZVxuICAgICAqIHBhcmVudCBncmlkIGlzIHNldCBvciBhbiBvYmplY3QgcmVmZXJlbmNlIG9mIHRoZSBwYXJlbnQgcmVjb3JkIG90aGVyd2lzZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZm9yZWlnbktleSA9IHRoaXMuZ3JpZC5mb3JlaWduS2V5O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZvcmVpZ25LZXkoKSB7XG4gICAgICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5ncmlkQVBJLmdldFBhcmVudFJvd0lkKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0V4cGFuZGFibGVDaGlsZHJlbigpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5jaGlsZExheW91dEtleXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlc29sdmVSb3dFZGl0Q29udGFpbmVyKCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRJc2xhbmQgJiYgdGhpcy5wYXJlbnRJc2xhbmQucm93RWRpdEN1c3RvbSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50SXNsYW5kLnJvd0VkaXRDb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdENvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNvbHZlUm93RWRpdEFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudElzbGFuZCA/IHRoaXMucGFyZW50SXNsYW5kLnJvd0VkaXRBY3Rpb25zVGVtcGxhdGUgOiB0aGlzLnJvd0VkaXRBY3Rpb25zVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzb2x2ZVJvd0VkaXRUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRJc2xhbmQgPyB0aGlzLnBhcmVudElzbGFuZC5yb3dFZGl0VGV4dFRlbXBsYXRlIDogdGhpcy5yb3dFZGl0VGV4dFRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIG92ZXJyaWRlIGhpZGVBY3Rpb25TdHJpcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgLy8gaGlkZSBjaGlsZCBsYXlvdXQgYWN0aW9ucyBzdHJpcHMgd2hlblxuICAgICAgICAgICAgLy8gbW92aW5nIG91dHNpZGUgcm9vdCBncmlkLlxuICAgICAgICAgICAgc3VwZXIuaGlkZUFjdGlvblN0cmlwKCk7XG4gICAgICAgICAgICB0aGlzLmFsbExheW91dExpc3QuZm9yRWFjaChyaSA9PiB7XG4gICAgICAgICAgICAgICAgcmkuYWN0aW9uU3RyaXA/LmhpZGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgcGFyZW50Um93T3V0bGV0RGlyZWN0aXZlKCkge1xuICAgICAgICAvLyBUYXJnZXRpbmcgcGFyZW50IG91dGxldCBpbiBvcmRlciB0byBwcmV2ZW50IGhpZGluZyB3aGVuIG91dGxldFxuICAgICAgICAvLyBpcyBwcmVzZW50IGF0IGEgY2hpbGQgZ3JpZCBhbmQgaXMgYXR0YWNoZWQgdG8gYSByb3cuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LnJvd091dGxldERpcmVjdGl2ZSA6IHRoaXMub3V0bGV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgICAgIC8vIHRoaXMuZXhwYW5zaW9uU3RhdGVzQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHZhbHVlOiBNYXA8YW55LCBib29sZWFuPikgPT4ge1xuICAgICAgICAvLyAgICAgY29uc3QgcmVzID0gQXJyYXkuZnJvbSh2YWx1ZS5lbnRyaWVzKCkpLmZpbHRlcigoezE6IHZ9KSA9PiB2ID09PSB0cnVlKS5tYXAoKFtrXSkgPT4gayk7XG4gICAgICAgIC8vIH0pO1xuICAgICAgICB0aGlzLmJhdGNoRWRpdGluZyA9ICEhdGhpcy5yb290R3JpZC5iYXRjaEVkaXRpbmc7XG4gICAgICAgIGlmICh0aGlzLnJvb3RHcmlkICE9PSB0aGlzKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3RHcmlkLmJhdGNoRWRpdGluZ0NoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCh2YWw6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJhdGNoRWRpdGluZyA9IHZhbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmJlZm9yZVZpZXdEZXN0cm95ZWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgodmlldykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IHZpZXcuY29udGV4dC4kaW1wbGljaXQ7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0NoaWxkR3JpZFJlY29yZChyb3dEYXRhKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZERhdGEgPSB0aGlzLmNoaWxkR3JpZFRlbXBsYXRlcy5nZXQocm93RGF0YS5yb3dJRCk7XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlZERhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG1scE91dGxldCA9IGNhY2hlZERhdGEub3duZXI7XG4gICAgICAgICAgICAgICAgICAgIHRtbHBPdXRsZXQuX3ZpZXdDb250YWluZXJSZWYuZGV0YWNoKDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNwbGF5RGVuc2l0eSA9IHRoaXMucm9vdEdyaWQuZGlzcGxheURlbnNpdHk7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLnN1bW1hcnlIZWlnaHQgPSAwO1xuICAgICAgICAgICAgdGhpcy5yb290R3JpZC5kZW5zaXR5Q2hhbmdlZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5RGVuc2l0eSA9IHRoaXMucm9vdEdyaWQuZGlzcGxheURlbnNpdHk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5zdW1tYXJ5SGVpZ2h0ID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRMYXlvdXRLZXlzID0gdGhpcy5wYXJlbnRJc2xhbmQuY2hpbGRyZW4ubWFwKChpdGVtKSA9PiBpdGVtLmtleSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFjdGlvblN0cmlwID0gdGhpcy5wYXJlbnRJc2xhbmQgPyB0aGlzLnBhcmVudElzbGFuZC5hY3Rpb25TdHJpcCA6IHRoaXMuYWN0aW9uU3RyaXA7XG5cbiAgICAgICAgdGhpcy5oZWFkU2VsZWN0b3JzVGVtcGxhdGVzID0gdGhpcy5wYXJlbnRJc2xhbmQgP1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRJc2xhbmQuaGVhZFNlbGVjdG9yc1RlbXBsYXRlcyA6XG4gICAgICAgICAgICB0aGlzLmhlYWRTZWxlY3RvcnNUZW1wbGF0ZXM7XG5cbiAgICAgICAgdGhpcy5yb3dTZWxlY3RvcnNUZW1wbGF0ZXMgPSB0aGlzLnBhcmVudElzbGFuZCA/XG4gICAgICAgICAgICB0aGlzLnBhcmVudElzbGFuZC5yb3dTZWxlY3RvcnNUZW1wbGF0ZXMgOlxuICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3RvcnNUZW1wbGF0ZXM7XG4gICAgICAgIHRoaXMuZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSA9IHRoaXMucGFyZW50SXNsYW5kID9cbiAgICAgICAgICAgIHRoaXMucGFyZW50SXNsYW5kLmRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUgOlxuICAgICAgICAgICAgdGhpcy5kcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlO1xuICAgICAgICB0aGlzLnJvd0V4cGFuZGVkSW5kaWNhdG9yVGVtcGxhdGUgPSB0aGlzLnJvb3RHcmlkLnJvd0V4cGFuZGVkSW5kaWNhdG9yVGVtcGxhdGU7XG4gICAgICAgIHRoaXMucm93Q29sbGFwc2VkSW5kaWNhdG9yVGVtcGxhdGUgPSB0aGlzLnJvb3RHcmlkLnJvd0NvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlO1xuICAgICAgICB0aGlzLmhlYWRlckNvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlID0gdGhpcy5yb290R3JpZC5oZWFkZXJDb2xsYXBzZWRJbmRpY2F0b3JUZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5oZWFkZXJFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlID0gdGhpcy5yb290R3JpZC5oZWFkZXJFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlO1xuICAgICAgICB0aGlzLmV4Y2VsU3R5bGVIZWFkZXJJY29uVGVtcGxhdGUgPSB0aGlzLnJvb3RHcmlkLmV4Y2VsU3R5bGVIZWFkZXJJY29uVGVtcGxhdGU7XG4gICAgICAgIHRoaXMuc29ydEFzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQuc29ydEFzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5zb3J0RGVzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQuc29ydERlc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGU7XG4gICAgICAgIHRoaXMuc29ydEhlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMucm9vdEdyaWQuc29ydEhlYWRlckljb25UZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5oYXNDaGlsZHJlbktleSA9IHRoaXMucGFyZW50SXNsYW5kID9cbiAgICAgICAgICAgIHRoaXMucGFyZW50SXNsYW5kLmhhc0NoaWxkcmVuS2V5IHx8IHRoaXMucm9vdEdyaWQuaGFzQ2hpbGRyZW5LZXkgOlxuICAgICAgICAgICAgdGhpcy5yb290R3JpZC5oYXNDaGlsZHJlbktleTtcbiAgICAgICAgdGhpcy5zaG93RXhwYW5kQWxsID0gdGhpcy5wYXJlbnRJc2xhbmQgP1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRJc2xhbmQuc2hvd0V4cGFuZEFsbCA6IHRoaXMucm9vdEdyaWQuc2hvd0V4cGFuZEFsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5MaXN0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5jaGlsZExheW91dEtleXMgPSB0aGlzLnBhcmVudCA/XG4gICAgICAgICAgICB0aGlzLnBhcmVudElzbGFuZC5jaGlsZHJlbi5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KSA6XG4gICAgICAgICAgICB0aGlzLmNoaWxkTGF5b3V0S2V5cyA9IHRoaXMuY2hpbGRMYXlvdXRMaXN0Lm1hcCgoaXRlbSkgPT4gaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLmNoaWxkTGF5b3V0TGlzdC5ub3RpZnlPbkNoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5jaGlsZExheW91dExpc3QuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICB0aGlzLm9uUm93SXNsYW5kQ2hhbmdlKClcbiAgICAgICAgKTtcbiAgICAgICAgc3VwZXIubmdBZnRlckNvbnRlbnRJbml0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYFJvd1R5cGVgIGJ5IGluZGV4LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlSb3cgPSB0aGlzLmdyaWQxLmdldFJvd0J5SW5kZXgoMSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGluZGV4XG4gICAgICovXG4gICAgcHVibGljIGdldFJvd0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IFJvd1R5cGUge1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZGF0YVZpZXcubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVJvdyhpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYFJvd1R5cGVgIGJ5IGtleS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Um93ID0gdGhpcy5ncmlkMS5nZXRSb3dCeUtleSgxKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0ga2V5XG4gICAgICovXG4gICAgcHVibGljIGdldFJvd0J5S2V5KGtleTogYW55KTogUm93VHlwZSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFWaWV3O1xuICAgICAgICBjb25zdCByZWMgPSB0aGlzLnByaW1hcnlLZXkgP1xuICAgICAgICAgICAgZGF0YS5maW5kKHJlY29yZCA9PiByZWNvcmRbdGhpcy5wcmltYXJ5S2V5XSA9PT0ga2V5KSA6XG4gICAgICAgICAgICBkYXRhLmZpbmQocmVjb3JkID0+IHJlY29yZCA9PT0ga2V5KTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhLmluZGV4T2YocmVjKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IGRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBJZ3hIaWVyYXJjaGljYWxHcmlkUm93KHRoaXMgYXMgYW55LCBpbmRleCwgcmVjKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhbGxSb3dzKCk6IFJvd1R5cGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFWaWV3Lm1hcCgocmVjLCBpbmRleCkgPT4gdGhpcy5jcmVhdGVSb3coaW5kZXgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIGBJZ3hIaWVyYXJjaGljYWxHcmlkUm93YHMgZm9yIGN1cnJlbnQgcGFnZS5cbiAgICAgKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRhdGFSb3dzKCk6IFJvd1R5cGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFsbFJvd3MoKS5maWx0ZXIocm93ID0+IHJvdyBpbnN0YW5jZW9mIElneEhpZXJhcmNoaWNhbEdyaWRSb3cpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHNlbGVjdGVkIGBJZ3hHcmlkQ2VsbGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc2VsZWN0ZWRDZWxscyA9IHRoaXMuZ3JpZC5zZWxlY3RlZENlbGxzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRDZWxscygpOiBDZWxsVHlwZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVJvd3MoKS5tYXAoKHJvdykgPT4gcm93LmNlbGxzLmZpbHRlcigoY2VsbCkgPT4gY2VsbC5zZWxlY3RlZCkpXG4gICAgICAgICAgICAucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBgQ2VsbFR5cGVgIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNvbmRpdGlvbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUNlbGwgPSB0aGlzLmdyaWQxLmdldENlbGxCeUNvbHVtbigyLCBcIlVuaXRQcmljZVwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SW5kZXhcbiAgICAgKiBAcGFyYW0gY29sdW1uRmllbGRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2VsbEJ5Q29sdW1uKHJvd0luZGV4OiBudW1iZXIsIGNvbHVtbkZpZWxkOiBzdHJpbmcpOiBDZWxsVHlwZSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0Um93QnlJbmRleChyb3dJbmRleCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0gY29sdW1uRmllbGQpO1xuICAgICAgICBpZiAocm93ICYmIHJvdyBpbnN0YW5jZW9mIElneEhpZXJhcmNoaWNhbEdyaWRSb3cgJiYgY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IElneEdyaWRDZWxsKHRoaXMsIHJvd0luZGV4LCBjb2x1bW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGBDZWxsVHlwZWAgb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgY29uZGl0aW9ucy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVxdWlyZXMgdGhhdCB0aGUgcHJpbWFyeUtleSBwcm9wZXJ0eSBpcyBzZXQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5nZXRDZWxsQnlLZXkoMSwgJ2luZGV4Jyk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yIG1hdGNoIGFueSByb3dJRFxuICAgICAqIEBwYXJhbSBjb2x1bW5GaWVsZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDZWxsQnlLZXkocm93U2VsZWN0b3I6IGFueSwgY29sdW1uRmllbGQ6IHN0cmluZyk6IENlbGxUeXBlIHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5nZXRSb3dCeUtleShyb3dTZWxlY3Rvcik7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0gY29sdW1uRmllbGQpO1xuICAgICAgICBpZiAocm93ICYmIGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZ3hHcmlkQ2VsbCh0aGlzLCByb3cuaW5kZXgsIGNvbHVtbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgcGluUm93KHJvd0lEOiBhbnksIGluZGV4PzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0Um93QnlLZXkocm93SUQpO1xuICAgICAgICByZXR1cm4gc3VwZXIucGluUm93KHJvd0lELCBpbmRleCwgcm93KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgdW5waW5Sb3cocm93SUQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmdldFJvd0J5S2V5KHJvd0lEKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnVucGluUm93KHJvd0lELCByb3cpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRhdGFMb2FkaW5nKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZGF0YVByZUxvYWQuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZmVhdHVyZUNvbHVtbnNXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmZlYXR1cmVDb2x1bW5zV2lkdGgodGhpcy5oZWFkZXJIaWVyYXJjaHlFeHBhbmRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvblJvd0lzbGFuZENoYW5nZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNoaWxkTGF5b3V0S2V5cyA9IHRoaXMucGFyZW50SXNsYW5kLmNoaWxkcmVuLmZpbHRlcihpdGVtID0+ICEoaXRlbSBhcyBhbnkpLl9kZXN0cm95ZWQpLm1hcCgoaXRlbSkgPT4gaXRlbS5rZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaGlsZExheW91dEtleXMgPSB0aGlzLmNoaWxkTGF5b3V0TGlzdC5maWx0ZXIoaXRlbSA9PiAhKGl0ZW0gYXMgYW55KS5fZGVzdHJveWVkKS5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISh0aGlzLmNkciBhcyBhbnkpLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICoqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLmdldENoaWxkR3JpZHModHJ1ZSkuZm9yRWFjaCgoZ3JpZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZ3JpZC5jaGlsZFJvdy5jZHIuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyaWQuY2hpbGRSb3cuY2RyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIGluIGNhc2Ugc2VsZWN0aW9uIGlzIGluIGRlc3Ryb3llZCBjaGlsZCBncmlkLCBzZWxlY3Rpb24gc2hvdWxkIGJlIGNsZWFyZWQuXG4gICAgICAgICAgICB0aGlzLl9jbGVhclNlbGV0aW9uSGlnaGxpZ2h0cygpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBpc1Jvd0hpZ2hsaWdodGVkKHJvd0RhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRSb3dJRCA9PT0gcm93RGF0YS5yb3dJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGlzSGllcmFyY2hpY2FsUmVjb3JkKHJlY29yZDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmlzR2hvc3RSZWNvcmQocmVjb3JkKSkge1xuICAgICAgICAgICAgcmVjb3JkID0gcmVjb3JkLnJlY29yZFJlZjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZExheW91dExpc3QubGVuZ3RoICE9PSAwICYmIHJlY29yZFt0aGlzLmNoaWxkTGF5b3V0TGlzdC5maXJzdC5rZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNDaGlsZEdyaWRSZWNvcmQocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgLy8gQ2FuIGJlIG51bGwgd2hlbiB0aGVyZSBpcyBkZWZpbmVkIGxheW91dCBidXQgbm8gY2hpbGQgZGF0YSB3YXMgZm91bmRcbiAgICAgICAgcmV0dXJuIHJlY29yZD8uY2hpbGRHcmlkc0RhdGEgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHRyYWNrQ2hhbmdlcyhpbmRleCwgcmVjKSB7XG4gICAgICAgIGlmIChyZWMuY2hpbGRHcmlkc0RhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gaWYgaXMgY2hpbGQgcmVjXG4gICAgICAgICAgICByZXR1cm4gcmVjLnJvd0lEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb250ZXh0KHJvd0RhdGEsIHJvd0luZGV4LCBwaW5uZWQpOiBhbnkge1xuICAgICAgICBpZiAodGhpcy5pc0NoaWxkR3JpZFJlY29yZChyb3dEYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMuY2hpbGRHcmlkVGVtcGxhdGVzLmdldChyb3dEYXRhLnJvd0lEKTtcbiAgICAgICAgICAgIGlmIChjYWNoZWREYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IGNhY2hlZERhdGEudmlldztcbiAgICAgICAgICAgICAgICBjb25zdCB0bWxwT3V0bGV0ID0gY2FjaGVkRGF0YS5vd25lcjtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHJvd0RhdGEsXG4gICAgICAgICAgICAgICAgICAgIG1vdmVWaWV3OiB2aWV3LFxuICAgICAgICAgICAgICAgICAgICBvd25lcjogdG1scE91dGxldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMuZGF0YVZpZXcuaW5kZXhPZihyb3dEYXRhKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNoaWxkIHJvd3MgY29udGFpbiB1bmlxdWUgZ3JpZHMsIGhlbmNlIHNob3VsZCBoYXZlIHVuaXF1ZSB0ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHJvd0RhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlSUQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjaGlsZFJvdycsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogcm93RGF0YS5yb3dJRFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5kYXRhVmlldy5pbmRleE9mKHJvd0RhdGEpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgJGltcGxpY2l0OiB0aGlzLmlzR2hvc3RSZWNvcmQocm93RGF0YSkgPyByb3dEYXRhLnJlY29yZFJlZiA6IHJvd0RhdGEsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVJRDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGF0YVJvdycsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBudWxsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5nZXREYXRhVmlld0luZGV4KHJvd0luZGV4LCBwaW5uZWQpLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0aGlzLmlzR2hvc3RSZWNvcmQocm93RGF0YSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCByb290R3JpZCgpOiBHcmlkVHlwZSB7XG4gICAgICAgIGxldCBjdXJyR3JpZCA9IHRoaXMgYXMgSWd4SGllcmFyY2hpY2FsR3JpZENvbXBvbmVudDtcbiAgICAgICAgd2hpbGUgKGN1cnJHcmlkLnBhcmVudCkge1xuICAgICAgICAgICAgY3VyckdyaWQgPSBjdXJyR3JpZC5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJHcmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGljb25UZW1wbGF0ZSgpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmhhc0V4cGFuZGVkUmVjb3JkcygpICYmIHRoaXMuaGFzRXhwYW5kYWJsZUNoaWxkcmVuO1xuICAgICAgICBpZiAoIWV4cGFuZGVkICYmIHRoaXMuc2hvd0V4cGFuZEFsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyQ29sbGFwc2VkSW5kaWNhdG9yVGVtcGxhdGUgfHwgdGhpcy5kZWZhdWx0Q29sbGFwc2VkVGVtcGxhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlIHx8IHRoaXMuZGVmYXVsdEV4cGFuZGVkVGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldERyYWdHaG9zdEN1c3RvbVRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRJc2xhbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudElzbGFuZC5nZXREcmFnR2hvc3RDdXN0b21UZW1wbGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci5nZXREcmFnR2hvc3RDdXN0b21UZW1wbGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBHZXRzIHRoZSB2aXNpYmxlIGNvbnRlbnQgaGVpZ2h0IHRoYXQgaW5jbHVkZXMgaGVhZGVyICsgdGJvZHkgKyBmb290ZXIuXG4gICAgICogRm9yIGhpZXJhcmNoaWNhbCBjaGlsZCBncmlkIGl0IG1heSBiZSBzY3JvbGxlZCBhbmQgbm90IGZ1bGx5IHZpc2libGUuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldFZpc2libGVDb250ZW50SGVpZ2h0KCkge1xuICAgICAgICBsZXQgaGVpZ2h0ID0gc3VwZXIuZ2V0VmlzaWJsZUNvbnRlbnRIZWlnaHQoKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCByb290SGVpZ2h0ID0gdGhpcy5yb290R3JpZC5nZXRWaXNpYmxlQ29udGVudEhlaWdodCgpO1xuICAgICAgICAgICAgY29uc3QgdG9wRGlmZiA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLnJvb3RHcmlkLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICAgICAgaGVpZ2h0ID0gcm9vdEhlaWdodCAtIHRvcERpZmYgPiBoZWlnaHQgPyBoZWlnaHQgOiByb290SGVpZ2h0IC0gdG9wRGlmZjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlQWxsKCkge1xuICAgICAgICBjb25zdCBleHBhbmRlZCA9IHRoaXMuaGFzRXhwYW5kZWRSZWNvcmRzKCkgJiYgdGhpcy5oYXNFeHBhbmRhYmxlQ2hpbGRyZW47XG4gICAgICAgIGlmICghZXhwYW5kZWQgJiYgdGhpcy5zaG93RXhwYW5kQWxsKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZEFsbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2xsYXBzZUFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhc0V4cGFuZGVkUmVjb3JkcygpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoYXNFeHBhbmRlZEVudHJ5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaGFzRXhwYW5kZWRFbnRyeSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGhhc0V4cGFuZGVkRW50cnk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGdldERlZmF1bHRFeHBhbmRTdGF0ZShyZWNvcmQ6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5oYXNDaGlsZHJlbktleSAmJiAhcmVjb3JkW3RoaXMuaGFzQ2hpbGRyZW5LZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwYW5kQ2hpbGRyZW47XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGlzRXhwYW5kZWQocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5nZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyZWNvcmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdmlld0NyZWF0ZWRIYW5kbGVyKGFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDaGlsZEdyaWRSZWNvcmQoYXJncy5jb250ZXh0LiRpbXBsaWNpdCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGFyZ3MuY29udGV4dC4kaW1wbGljaXQucm93SUQ7XG4gICAgICAgICAgICB0aGlzLmNoaWxkR3JpZFRlbXBsYXRlcy5zZXQoa2V5LCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdmlld01vdmVkSGFuZGxlcihhcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ2hpbGRHcmlkUmVjb3JkKGFyZ3MuY29udGV4dC4kaW1wbGljaXQpKSB7XG4gICAgICAgICAgICAvLyB2aWV3IHdhcyBtb3ZlZCwgdXBkYXRlIG93bmVyIGluIGNhY2hlXG4gICAgICAgICAgICBjb25zdCBrZXkgPSBhcmdzLmNvbnRleHQuJGltcGxpY2l0LnJvd0lEO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMuY2hpbGRHcmlkVGVtcGxhdGVzLmdldChrZXkpO1xuICAgICAgICAgICAgY2FjaGVkRGF0YS5vd25lciA9IGFyZ3Mub3duZXI7XG5cbiAgICAgICAgICAgIHRoaXMuY2hpbGRMYXlvdXRMaXN0LmZvckVhY2goKGxheW91dCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRHcmlkID0gdGhpcy5ncmlkQVBJLmdldENoaWxkR3JpZEJ5SUQobGF5b3V0LmtleSwgYXJncy5jb250ZXh0LiRpbXBsaWNpdC5yb3dJRCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRHcmlkICYmIHJlbGF0ZWRHcmlkLnVwZGF0ZU9uUmVuZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERldGVjdCBjaGFuZ2VzIGlmIGBleHBhbmRDaGlsZHJlbmAgaGFzIGNoYW5nZWQgd2hlbiB0aGUgZ3JpZCB3YXNuJ3QgdmlzaWJsZS4gVGhpcyBpcyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEdyaWQubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEdyaWQudXBkYXRlT25SZW5kZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqKi9cbiAgICBwdWJsaWMgb25Db250YWluZXJTY3JvbGwoKSB7XG4gICAgICAgIHRoaXMuaGlkZU92ZXJsYXlzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVSb3coaW5kZXg6IG51bWJlciwgZGF0YT86IGFueSk6IFJvd1R5cGUge1xuICAgICAgICBsZXQgcm93OiBSb3dUeXBlO1xuICAgICAgICBjb25zdCBkYXRhSW5kZXggPSB0aGlzLl9nZXREYXRhVmlld0luZGV4KGluZGV4KTtcbiAgICAgICAgY29uc3QgcmVjOiBhbnkgPSBkYXRhID8/IHRoaXMuZGF0YVZpZXdbZGF0YUluZGV4XTtcblxuICAgICAgICBpZiAoIXJvdyAmJiByZWMgJiYgIXJlYy5jaGlsZEdyaWRzRGF0YSkge1xuICAgICAgICAgICAgcm93ID0gbmV3IElneEhpZXJhcmNoaWNhbEdyaWRSb3codGhpcyBhcyBhbnksIGluZGV4LCByZWMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0Q2hpbGRHcmlkcyhpbkRlcGg/OiBib29sZWFuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuZ2V0Q2hpbGRHcmlkcyhpbkRlcGgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBnZW5lcmF0ZURhdGFGaWVsZHMoZGF0YTogYW55W10pOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZW5lcmF0ZURhdGFGaWVsZHMoZGF0YSkuZmlsdGVyKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGF5b3V0c0xpc3QgPSB0aGlzLnBhcmVudElzbGFuZCA/IHRoaXMucGFyZW50SXNsYW5kLmNoaWxkcmVuIDogdGhpcy5jaGlsZExheW91dExpc3Q7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gbGF5b3V0c0xpc3QubWFwKChpdGVtKSA9PiBpdGVtLmtleSk7XG4gICAgICAgICAgICByZXR1cm4ga2V5cy5pbmRleE9mKGZpZWxkKSA9PT0gLTE7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNpemVOb3RpZnlIYW5kbGVyKCkge1xuICAgICAgICAvLyBkbyBub3QgdHJpZ2dlciByZWZsb3cgaWYgZWxlbWVudCBpcyBkZXRhY2hlZCBvciBpZiBpdCBpcyBjaGlsZCBncmlkLlxuICAgICAgICBpZiAodGhpcy5kb2N1bWVudC5jb250YWlucyh0aGlzLm5hdGl2ZUVsZW1lbnQpICYmICF0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvdmVycmlkZSBpbml0Q29sdW1ucyhjb2xsZWN0aW9uOiBJZ3hDb2x1bW5Db21wb25lbnRbXSwgY2I6IChhcmdzOiBhbnkpID0+IHZvaWQgPSBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIC8vIGludmFsaWQgY29uZmlndXJhdGlvbiAtIGhpZXJhcmNoaWNhbCBncmlkIHNob3VsZCBub3QgYWxsb3cgY29sdW1uIGxheW91dHNcbiAgICAgICAgICAgIC8vIHJlbW92ZSBjb2x1bW4gbGF5b3V0c1xuICAgICAgICAgICAgY29uc3Qgbm9uQ29sdW1uTGF5b3V0Q29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gIWNvbC5jb2x1bW5MYXlvdXQgJiYgIWNvbC5jb2x1bW5MYXlvdXRDaGlsZCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMobm9uQ29sdW1uTGF5b3V0Q29sdW1ucyk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuaW5pdENvbHVtbnMoY29sbGVjdGlvbiwgY2IpO1xuICAgIH1cblxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHNldHVwQ29sdW1ucygpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50SXNsYW5kICYmIHRoaXMucGFyZW50SXNsYW5kLmNoaWxkQ29sdW1ucy5sZW5ndGggPiAwICYmICF0aGlzLmF1dG9HZW5lcmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVDb2x1bW5zTGlzdCh0aGlzLnBhcmVudElzbGFuZC5jaGlsZENvbHVtbnMudG9BcnJheSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLnNldHVwQ29sdW1ucygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldENvbHVtbkxpc3QoKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTGF5b3V0cyA9IHRoaXMucGFyZW50ID8gdGhpcy5jaGlsZExheW91dExpc3QgOiB0aGlzLmFsbExheW91dExpc3Q7XG4gICAgICAgIGNvbnN0IG5lc3RlZENvbHVtbnMgPSBjaGlsZExheW91dHMubWFwKChsYXlvdXQpID0+IGxheW91dC5jb2x1bW5MaXN0LnRvQXJyYXkoKSk7XG4gICAgICAgIGNvbnN0IGNvbHNBcnJheSA9IFtdLmNvbmNhdC5hcHBseShbXSwgbmVzdGVkQ29sdW1ucyk7XG4gICAgICAgIGlmIChjb2xzQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdG9wQ29scyA9IHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoKGl0ZW0pID0+IGNvbHNBcnJheS5pbmRleE9mKGl0ZW0pID09PSAtMSk7XG4gICAgICAgICAgICByZXR1cm4gdG9wQ29scztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGlzdC50b0FycmF5KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBvbkNvbHVtbnNDaGFuZ2VkKCkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1uTGlzdCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX3Nob3VsZEF1dG9TaXplKHJlbmRlcmVkSGVpZ2h0KSB7XG4gICAgICAgIGlmICh0aGlzLmlzUGVyY2VudEhlaWdodCAmJiB0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLl9zaG91bGRBdXRvU2l6ZShyZW5kZXJlZEhlaWdodCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5MaXN0KHJlY2FsY0NvbFNpemVzID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBjaGlsZExheW91dHMgPSB0aGlzLnBhcmVudCA/IHRoaXMuY2hpbGRMYXlvdXRMaXN0IDogdGhpcy5hbGxMYXlvdXRMaXN0O1xuICAgICAgICBjb25zdCBuZXN0ZWRDb2x1bW5zID0gY2hpbGRMYXlvdXRzLm1hcCgobGF5b3V0KSA9PiBsYXlvdXQuY29sdW1uTGlzdC50b0FycmF5KCkpO1xuICAgICAgICBjb25zdCBjb2xzQXJyYXkgPSBbXS5jb25jYXQuYXBwbHkoW10sIG5lc3RlZENvbHVtbnMpO1xuICAgICAgICBjb25zdCBjb2xMZW5ndGggPSB0aGlzLmNvbHVtbnMubGVuZ3RoO1xuICAgICAgICBjb25zdCB0b3BDb2xzID0gdGhpcy5jb2x1bW5MaXN0LmZpbHRlcigoaXRlbSkgPT4gY29sc0FycmF5LmluZGV4T2YoaXRlbSkgPT09IC0xKTtcbiAgICAgICAgaWYgKHRvcENvbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKHRvcENvbHMpO1xuICAgICAgICAgICAgaWYgKHJlY2FsY0NvbFNpemVzICYmIHRoaXMuY29sdW1ucy5sZW5ndGggIT09IGNvbExlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZFNpemVzKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2NsZWFyU2VsZXRpb25IaWdobGlnaHRzKCkge1xuICAgICAgICBbdGhpcy5yb290R3JpZCwgLi4udGhpcy5yb290R3JpZC5nZXRDaGlsZEdyaWRzKHRydWUpXS5mb3JFYWNoKGdyaWQgPT4ge1xuICAgICAgICAgICAgZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKCk7XG4gICAgICAgICAgICBncmlkLnNlbGVjdGlvblNlcnZpY2UuYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICBncmlkLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaWd4LWdyaWRfX3RyLS1oaWdobGlnaHRlZCcpO1xuICAgICAgICAgICAgZ3JpZC5oaWdobGlnaHRlZFJvd0lEID0gbnVsbDtcbiAgICAgICAgICAgIGdyaWQuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9faGllcmFyY2hpY2FsLWluZGVudFwiIFtuZ0NsYXNzXT1cInsnaWd4LWdyaWRfX2hpZXJhcmNoaWNhbC1pbmRlbnQtLXNjcm9sbCc6IHBhcmVudEhhc1Njcm9sbH1cIj5cbiAgICA8bmctY29udGFpbmVyICNjb250YWluZXI+PC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiIsIjxuZy1jb250ZW50IHNlbGVjdD1cImlneC1ncmlkLXRvb2xiYXJcIj48L25nLWNvbnRlbnQ+XG48bmctY29udGFpbmVyICN0b29sYmFyT3V0bGV0PjwvbmctY29udGFpbmVyPlxuXG48aWd4LWdyaWQtaGVhZGVyLXJvdyBjbGFzcz1cImlneC1ncmlkLXRoZWFkXCIgdGFiaW5kZXg9XCIwXCJcbiAgICBbZ3JpZF09XCJ0aGlzXCJcbiAgICBbaGFzTVJMXT1cImhhc0NvbHVtbkxheW91dHNcIlxuICAgIFthY3RpdmVEZXNjZW5kYW50XT1cImFjdGl2ZURlc2NlbmRhbnRcIlxuICAgIFt3aWR0aF09XCJjYWxjV2lkdGhcIlxuICAgIFtwaW5uZWRDb2x1bW5Db2xsZWN0aW9uXT1cInBpbm5lZENvbHVtbnNcIlxuICAgIFt1bnBpbm5lZENvbHVtbkNvbGxlY3Rpb25dPVwidW5waW5uZWRDb2x1bW5zXCJcbiAgICAoa2V5ZG93bi5tZXRhLmMpPVwiY29weUhhbmRsZXIoJGV2ZW50KVwiXG4gICAgKGtleWRvd24uY29udHJvbC5jKT1cImNvcHlIYW5kbGVyKCRldmVudClcIlxuICAgIChjb3B5KT1cImNvcHlIYW5kbGVyKCRldmVudClcIlxuICAgIChrZXlkb3duKT1cIm5hdmlnYXRpb24uaGVhZGVyTmF2aWdhdGlvbigkZXZlbnQpXCJcbiAgICAoZm9jdXMpPVwibmF2aWdhdGlvbi5mb2N1c0ZpcnN0Q2VsbCgpXCJcbj5cbjwvaWd4LWdyaWQtaGVhZGVyLXJvdz5cblxuPGRpdiBpZ3hHcmlkQm9keSAoa2V5ZG93bi5jb250cm9sLmMpPVwiY29weUhhbmRsZXIoJGV2ZW50KVwiIChjb3B5KT1cImNvcHlIYW5kbGVyKCRldmVudClcIiBjbGFzcz1cImlneC1ncmlkX190Ym9keVwiIHJvbGU9XCJyb3dncm91cFwiPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktY29udGVudFwiICB0YWJpbmRleD1cIjBcIiAoZm9jdXMpPVwibmF2aWdhdGlvbi5mb2N1c1Rib2R5KCRldmVudClcIlxuICAgICAoa2V5ZG93bik9XCJuYXZpZ2F0aW9uLmhhbmRsZU5hdmlnYXRpb24oJGV2ZW50KVwiIChkcmFnU3RvcCk9XCJzZWxlY3Rpb25TZXJ2aWNlLmRyYWdNb2RlID0gJGV2ZW50XCJcbiAgICAgICAgKGRyYWdTY3JvbGwpPVwiZHJhZ1Njcm9sbCgkZXZlbnQpXCIgW2lneEdyaWREcmFnU2VsZWN0XT1cInNlbGVjdGlvblNlcnZpY2UuZHJhZ01vZGVcIiBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiYWN0aXZlRGVzY2VuZGFudFwiIFthdHRyLnJvbGVdPVwiZGF0YVZpZXcubGVuZ3RoID8gbnVsbCA6ICdyb3cnXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJ0b3RhbEhlaWdodFwiIFtzdHlsZS53aWR0aC5weF09XCJjYWxjV2lkdGhcIiAjdGJvZHkgKHNjcm9sbCk9XCJwcmV2ZW50Q29udGFpbmVyU2Nyb2xsKCRldmVudClcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJtb3ZpbmcgJiYgY29sdW1uSW5EcmFnICYmIHBpbm5lZENvbHVtbnMubGVuZ3RoIDw9IDBcIlxuICAgICAgICAgICAgW2lneENvbHVtbk1vdmluZ0Ryb3BdPVwiaGVhZGVyQ29udGFpbmVyXCIgW2F0dHIuZHJvcHBhYmxlXT1cInRydWVcIiBpZD1cImxlZnRcIlxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctbGVmdFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJtb3ZpbmcgJiYgY29sdW1uSW5EcmFnICYmIHBpbm5lZENvbHVtbnMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICBbaWd4Q29sdW1uTW92aW5nRHJvcF09XCJoZWFkZXJDb250YWluZXJcIiBbYXR0ci5kcm9wcGFibGVdPVwidHJ1ZVwiIGlkPVwibGVmdFwiXG4gICAgICAgICAgICBjbGFzcz1cImlneC1ncmlkX19zY3JvbGwtb24tZHJhZy1waW5uZWRcIiBbc3R5bGUubGVmdC5weF09XCJwaW5uZWRXaWR0aFwiPjwvc3Bhbj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNwaW5uZWRSZWNvcmRzVGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YVxuICAgICAgICAgICAgfCBncmlkVHJhbnNhY3Rpb246aWQ6cGlwZVRyaWdnZXJcbiAgICAgICAgICAgIHwgdmlzaWJsZUNvbHVtbnM6aGFzVmlzaWJsZUNvbHVtbnNcbiAgICAgICAgICAgIHwgZ3JpZEFkZFJvdzp0cnVlOnBpcGVUcmlnZ2VyXG4gICAgICAgICAgICB8IGdyaWRSb3dQaW5uaW5nOmlkOnRydWU6cGlwZVRyaWdnZXJcbiAgICAgICAgICAgIHwgZ3JpZEZpbHRlcmluZzpmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6ZmlsdGVyU3RyYXRlZ3k6YWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6aWQ6cGlwZVRyaWdnZXI6ZmlsdGVyaW5nUGlwZVRyaWdnZXI6dHJ1ZVxuICAgICAgICAgICAgfCBncmlkU29ydDpzb3J0aW5nRXhwcmVzc2lvbnM6W106c29ydFN0cmF0ZWd5OmlkOnBpcGVUcmlnZ2VyOnRydWUgYXMgcGlubmVkRGF0YVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgI3BpbkNvbnRhaW5lciAqbmdJZj1cInBpbm5lZERhdGEubGVuZ3RoID4gMFwiIGNsYXNzPVwiaWd4LWdyaWRfX3RyLS1waW5uZWRcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpZ3gtZ3JpZF9fdHItLXBpbm5lZC1ib3R0b20nOiAgIWlzUm93UGlubmluZ1RvVG9wLCAnaWd4LWdyaWRfX3RyLS1waW5uZWQtdG9wJzogaXNSb3dQaW5uaW5nVG9Ub3AgfVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjYWxjV2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93RGF0YSBvZiBwaW5uZWREYXRhOyBsZXQgcm93SW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBpbm5lZF9oaWVyYXJjaGljYWxfcmVjb3JkX3RlbXBsYXRlOyBjb250ZXh0OiBnZXRDb250ZXh0KHJvd0RhdGEsIHJvd0luZGV4LCB0cnVlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoYXNQaW5uZWRSZWNvcmRzICYmIGlzUm93UGlubmluZ1RvVG9wID8gcGlubmVkUmVjb3Jkc1RlbXBsYXRlIDogbnVsbFwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGlneEdyaWRGb3IgbGV0LXJvd0RhdGEgbGV0LXJvd0luZGV4PVwiaW5kZXhcIiBbaWd4R3JpZEZvck9mXT1cImRhdGFcbiAgICAgICAgfCBncmlkVHJhbnNhY3Rpb246aWQ6cGlwZVRyaWdnZXJcbiAgICAgICAgfCB2aXNpYmxlQ29sdW1uczpoYXNWaXNpYmxlQ29sdW1uc1xuICAgICAgICB8IGdyaWRGaWx0ZXJpbmc6ZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlOmZpbHRlclN0cmF0ZWd5OmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlOmlkOnBpcGVUcmlnZ2VyOmZpbHRlcmluZ1BpcGVUcmlnZ2VyXG4gICAgICAgIHwgZ3JpZFNvcnQ6c29ydGluZ0V4cHJlc3Npb25zOltdOnNvcnRTdHJhdGVneTppZDpwaXBlVHJpZ2dlclxuICAgICAgICB8IGdyaWRIaWVyYXJjaGljYWxQYWdpbmc6ISFwYWdpbmF0b3I6cGFnZTpwZXJQYWdlOmlkOnBpcGVUcmlnZ2VyXG4gICAgICAgIHwgZ3JpZEhpZXJhcmNoaWNhbDpleHBhbnNpb25TdGF0ZXM6aWQ6cHJpbWFyeUtleTpjaGlsZExheW91dEtleXM6cGlwZVRyaWdnZXJcbiAgICAgICAgfCBncmlkQWRkUm93OmZhbHNlOnBpcGVUcmlnZ2VyXG4gICAgICAgIHwgZ3JpZFJvd1Bpbm5pbmc6aWQ6ZmFsc2U6cGlwZVRyaWdnZXJcIlxuICAgICAgICAgICAgW2lneEZvclNjcm9sbE9yaWVudGF0aW9uXT1cIid2ZXJ0aWNhbCdcIiBbaWd4Rm9yU2Nyb2xsQ29udGFpbmVyXT1cInZlcnRpY2FsU2Nyb2xsXCJcbiAgICAgICAgICAgIFtpZ3hGb3JDb250YWluZXJTaXplXT1cImNhbGNIZWlnaHRcIiBbaWd4Rm9ySXRlbVNpemVdPVwicmVuZGVyZWRSb3dIZWlnaHRcIiBbaWd4Rm9yVHJhY2tCeV09XCJ0cmFja0NoYW5nZXNcIlxuICAgICAgICAgICAgI3ZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyIChjaHVua1ByZWxvYWQpPVwiZGF0YUxvYWRpbmcoJGV2ZW50KVwiIChkYXRhQ2hhbmdpbmcpPVwiZGF0YVJlYmluZGluZygkZXZlbnQpXCIgKGRhdGFDaGFuZ2VkKT1cImRhdGFSZWJvdW5kKCRldmVudClcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgIFtpZ3hUZW1wbGF0ZU91dGxldF09XCIoaXNIaWVyYXJjaGljYWxSZWNvcmQocm93RGF0YSkgPyBoaWVyYXJjaGljYWxfcmVjb3JkX3RlbXBsYXRlIDogKGlzQ2hpbGRHcmlkUmVjb3JkKHJvd0RhdGEpID8gY2hpbGRfcmVjb3JkX3RlbXBsYXRlIDogaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZSkpXCJcbiAgICAgICAgICAgICAgICBbaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldENvbnRleHQocm93RGF0YSwgcm93SW5kZXgsIGZhbHNlKVwiICh2aWV3Q3JlYXRlZCk9XCJ2aWV3Q3JlYXRlZEhhbmRsZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHZpZXdNb3ZlZCk9XCJ2aWV3TW92ZWRIYW5kbGVyKCRldmVudClcIiAoY2FjaGVkVmlld0xvYWRlZCk9XCJjYWNoZWRWaWV3TG9hZGVkKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKmlneFRlbXBsYXRlT3V0bGV0PVwiKGlzSGllcmFyY2hpY2FsUmVjb3JkKHJvd0RhdGEpID8gaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZSA6IChpc0NoaWxkR3JpZFJlY29yZChyb3dEYXRhKSAmJiBpc0V4cGFuZGVkKHJvd0RhdGEpID8gY2hpbGRfcmVjb3JkX3RlbXBsYXRlIDogaGllcmFyY2hpY2FsX3JlY29yZF90ZW1wbGF0ZSkpOyBjb250ZXh0OiBnZXRDb250ZXh0KHJvd0RhdGEpXCI+PC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2hpZXJhcmNoaWNhbF9yZWNvcmRfdGVtcGxhdGUgbGV0LXJvd0luZGV4PVwiaW5kZXhcIiBsZXQtZGlzYWJsZWRSb3c9XCJkaXNhYmxlZFwiIGxldC1yb3dEYXRhPlxuICAgICAgICAgICAgPGlneC1oaWVyYXJjaGljYWwtZ3JpZC1yb3cgW2dyaWRJRF09XCJpZFwiIFtpbmRleF09XCJyb3dJbmRleFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFJvd1wiIFtkYXRhXT1cInJvd0RhdGFcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0NsYXNzZXMgfCBpZ3hHcmlkUm93Q2xhc3Nlczpyb3c6cm93LmluRWRpdE1vZGU6cm93LnNlbGVjdGVkOnJvdy5kaXJ0eTpyb3cuZGVsZXRlZDpyb3cuZHJhZ2dpbmc6cm93SW5kZXg6aGFzQ29sdW1uTGF5b3V0czpmYWxzZTpyb3dEYXRhOnBpcGVUcmlnZ2VyXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJyb3dTdHlsZXMgfCBpZ3hHcmlkUm93U3R5bGVzOnJvd0RhdGE6cm93SW5kZXg6cGlwZVRyaWdnZXJcIiAjcm93PlxuICAgICAgICAgICAgPC9pZ3gtaGllcmFyY2hpY2FsLWdyaWQtcm93PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcGlubmVkX2hpZXJhcmNoaWNhbF9yZWNvcmRfdGVtcGxhdGUgbGV0LXJvd0luZGV4PVwiaW5kZXhcIiBsZXQtcm93RGF0YT5cbiAgICAgICAgICAgIDxpZ3gtaGllcmFyY2hpY2FsLWdyaWQtcm93IFtncmlkSURdPVwiaWRcIiBbaW5kZXhdPVwicm93SW5kZXhcIiBbZGF0YV09XCJyb3dEYXRhXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dDbGFzc2VzIHwgaWd4R3JpZFJvd0NsYXNzZXM6cm93OnJvdy5pbkVkaXRNb2RlOnJvdy5zZWxlY3RlZDpyb3cuZGlydHk6cm93LmRlbGV0ZWQ6cm93LmRyYWdnaW5nOnJvd0luZGV4Omhhc0NvbHVtbkxheW91dHM6ZmFsc2U6cm93RGF0YTpwaXBlVHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwicm93U3R5bGVzIHwgaWd4R3JpZFJvd1N0eWxlczpyb3dEYXRhOnJvd0luZGV4OnBpcGVUcmlnZ2VyXCIgI3JvdyAjcGlubmVkUm93PlxuICAgICAgICAgICAgPC9pZ3gtaGllcmFyY2hpY2FsLWdyaWQtcm93PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2NoaWxkX3JlY29yZF90ZW1wbGF0ZSBsZXQtcm93SW5kZXg9XCJpbmRleFwiIGxldC1yb3dEYXRhPlxuICAgICAgICAgICAgPGRpdiBbYXR0ci5kYXRhLXJvd2luZGV4XT1cInJvd0luZGV4XCIgKHNjcm9sbCk9XCJvbkNvbnRhaW5lclNjcm9sbCgpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ2lneC1ncmlkX190ci1jb250YWluZXInOiB0cnVlLFxuICAgICAgICAgICAgICAgICdpZ3gtZ3JpZF9fdHItLWhpZ2hsaWdodGVkJzppc1Jvd0hpZ2hsaWdodGVkKHJvd0RhdGEpXG4gICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgPGlneC1jaGlsZC1ncmlkLXJvdyAqbmdGb3I9XCJsZXQgbGF5b3V0IG9mIGNoaWxkTGF5b3V0TGlzdFwiIFtwYXJlbnRHcmlkSURdPVwiaWRcIiBbaW5kZXhdPVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJyb3dEYXRhXCIgW2xheW91dF09XCJsYXlvdXRcIiAjcm93PlxuICAgICAgICAgICAgICAgIDwvaWd4LWNoaWxkLWdyaWQtcm93PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoYXNQaW5uZWRSZWNvcmRzICYmICFpc1Jvd1Bpbm5pbmdUb1RvcCA/IHBpbm5lZFJlY29yZHNUZW1wbGF0ZSA6IG51bGxcIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIm1vdmluZyAmJiBjb2x1bW5JbkRyYWdcIiBbaWd4Q29sdW1uTW92aW5nRHJvcF09XCJoZWFkZXJDb250YWluZXJcIiBbYXR0ci5kcm9wcGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBpZD1cInJpZ2h0XCIgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctcmlnaHRcIj48L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fcm93LWVkaXRpbmctb3V0bGV0XCIgaWd4T3ZlcmxheU91dGxldCAjaWd4Um93RWRpdGluZ092ZXJsYXlPdXRsZXQ+PC9kaXY+XG4gICAgICAgIDxpZ2MtdHJpYWwtd2F0ZXJtYXJrICpuZ0lmPVwiIXRoaXMucGFyZW50XCI+PC9pZ2MtdHJpYWwtd2F0ZXJtYXJrPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWd4VG9nZ2xlICNsb2FkaW5nT3ZlcmxheT5cbiAgICAgICAgPGlneC1jaXJjdWxhci1iYXIgW2luZGV0ZXJtaW5hdGVdPVwidHJ1ZVwiICpuZ0lmPVwic2hvdWxkT3ZlcmxheUxvYWRpbmdcIj5cbiAgICAgICAgPC9pZ3gtY2lyY3VsYXItYmFyPlxuICAgIDwvZGl2PlxuICAgIDxzcGFuICpuZ0lmPVwibW92aW5nICYmIGNvbHVtbkluRHJhZ1wiIFtpZ3hDb2x1bW5Nb3ZpbmdEcm9wXT1cImhlYWRlckNvbnRhaW5lclwiIFthdHRyLmRyb3BwYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgaWQ9XCJyaWdodFwiIGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1vbi1kcmFnLXJpZ2h0XCI+PC9zcGFuPlxuICAgIDxkaXYgW2hpZGRlbl09XCIhaGFzVmVydGljYWxTY3JvbGwoKVwiIGNsYXNzPVwiaWd4LWdyaWRfX3Rib2R5LXNjcm9sbGJhclwiIFtzdHlsZS53aWR0aC5weF09XCJzY3JvbGxTaXplXCIgKHBvaW50ZXJkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktc2Nyb2xsYmFyLXN0YXJ0XCIgW3N0eWxlLmhlaWdodC5weF09XCJpc1Jvd1Bpbm5pbmdUb1RvcCA/IHBpbm5lZFJvd0hlaWdodCA6IDBcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1zY3JvbGxiYXItbWFpblwiIFtzdHlsZS5oZWlnaHQucHhdPVwiY2FsY0hlaWdodFwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGlneEdyaWRGb3IgW2lneEdyaWRGb3JPZl09XCJbXVwiICN2ZXJ0aWNhbFNjcm9sbEhvbGRlcj48L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1zY3JvbGxiYXItZW5kXCIgW3N0eWxlLmhlaWdodC5weF09XCIhaXNSb3dQaW5uaW5nVG9Ub3AgPyBwaW5uZWRSb3dIZWlnaHQgOiAwXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX19hZGRyb3ctc25hY2tiYXJcIj5cbiAgICAgICAgPGlneC1zbmFja2JhciAjYWRkUm93U25hY2tiYXIgW291dGxldF09XCJpZ3hCb2R5T3ZlcmxheU91dGxldFwiIFthY3Rpb25UZXh0XT1cInJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9zbmFja2Jhcl9hZGRyb3dfYWN0aW9udGV4dFwiIFtkaXNwbGF5VGltZV09XCJzbmFja2JhckRpc3BsYXlUaW1lXCI+e3tyZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfc25hY2tiYXJfYWRkcm93X2xhYmVsfX08L2lneC1zbmFja2Jhcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgaWd4T3ZlcmxheU91dGxldCAjaWd4Qm9keU92ZXJsYXlPdXRsZXQ9XCJvdmVybGF5LW91dGxldFwiPjwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdGZvb3RcIiByb2xlPVwicm93Z3JvdXBcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cInN1bW1hcnlSb3dIZWlnaHRcIiAjdGZvb3Q+XG4gICAgPGRpdiB0YWJpbmRleD1cIjBcIiAoZm9jdXMpPVwibmF2aWdhdGlvbi5mb2N1c0ZpcnN0Q2VsbChmYWxzZSlcIiBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiYWN0aXZlRGVzY2VuZGFudFwiXG4gICAgIChrZXlkb3duKT1cIm5hdmlnYXRpb24uc3VtbWFyeU5hdigkZXZlbnQpXCI+XG4gICAgICAgIDxpZ3gtZ3JpZC1zdW1tYXJ5LXJvdyBbc3R5bGUud2lkdGgucHhdPVwiY2FsY1dpZHRoXCIgW3N0eWxlLmhlaWdodC5weF09XCJzdW1tYXJ5Um93SGVpZ2h0XCJcbiAgICAgICAgICAgICpuZ0lmPVwiaGFzU3VtbWFyaXplZENvbHVtbnMgJiYgcm9vdFN1bW1hcmllc0VuYWJsZWRcIiBbZ3JpZElEXT1cImlkXCIgcm9sZT1cInJvd1wiXG4gICAgICAgICAgICBbc3VtbWFyaWVzXT1cImlkIHwgaWd4R3JpZFN1bW1hcnlEYXRhUGlwZTpzdW1tYXJ5U2VydmljZS5yZXRyaWdnZXJSb290UGlwZVwiIFtpbmRleF09XCJkYXRhVmlldy5sZW5ndGhcIlxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZ3JpZF9fc3VtbWFyaWVzXCIgI3N1bW1hcnlSb3c+XG4gICAgICAgIDwvaWd4LWdyaWQtc3VtbWFyeS1yb3c+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdGZvb3QtdGh1bWJcIiBbaGlkZGVuXT1cIiFoYXNWZXJ0aWNhbFNjcm9sbCgpXCIgW3N0eWxlLmhlaWdodC5weF09XCJzdW1tYXJ5Um93SGVpZ2h0XCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzY3JvbGxTaXplXCI+PC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImlneC1ncmlkX19zY3JvbGxcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cInNjcm9sbFNpemVcIiAjc2NyIFtoaWRkZW5dPVwiaXNIb3Jpem9udGFsU2Nyb2xsSGlkZGVuXCIgKHBvaW50ZXJkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX19zY3JvbGwtc3RhcnRcIiBbc3R5bGUud2lkdGgucHhdPVwiaXNQaW5uaW5nVG9TdGFydCA/IHBpbm5lZFdpZHRoIDogaGVhZGVyRmVhdHVyZXNXaWR0aFwiIFtzdHlsZS5taW4td2lkdGgucHhdPVwiaXNQaW5uaW5nVG9TdGFydCA/IHBpbm5lZFdpZHRoIDogaGVhZGVyRmVhdHVyZXNXaWR0aFwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW1haW5cIiBbc3R5bGUud2lkdGgucHhdPVwidW5waW5uZWRXaWR0aFwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgaWd4R3JpZEZvciBbaWd4R3JpZEZvck9mXT1cIltdXCIgI3Njcm9sbENvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1lbmRcIiBbc3R5bGUud2lkdGgucHhdPVwicGlubmVkV2lkdGhcIiBbc3R5bGUubWluLXdpZHRoLnB4XT1cInBpbm5lZFdpZHRoXCIgW2hpZGRlbl09XCJwaW5uZWRXaWR0aCA9PT0gMCB8fCBpc1Bpbm5pbmdUb1N0YXJ0XCI+PC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImlneC1ncmlkX19mb290ZXJcIiAjZm9vdGVyPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImlneC1ncmlkLWZvb3RlclwiPjwvbmctY29udGVudD5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtcGFnaW5hdG9yXCI+PC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250YWluZXIgI3BhZ2luYXRvck91dGxldD48L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2VtcHR5RmlsdGVyZWRHcmlkPlxuICAgIDxzcGFuIGNsYXNzPVwiaWd4LWdyaWRfX3Rib2R5LW1lc3NhZ2VcIiByb2xlPVwiY2VsbFwiPlxuICAgICAgICA8c3Bhbj57e2VtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZX19PC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dBZGRCdXR0b25cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRSb3dFbXB0eVRlbXBsYXRlIHx8IGRlZmF1bHRBZGRSb3dFbXB0eVRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRFbXB0eUdyaWQ+XG4gICAgPHNwYW4gY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktbWVzc2FnZVwiIHJvbGU9XCJjZWxsXCI+XG4gICAgICAgIDxzcGFuPnt7ZW1wdHlHcmlkTWVzc2FnZX19PC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dBZGRCdXR0b25cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRSb3dFbXB0eVRlbXBsYXRlIHx8IGRlZmF1bHRBZGRSb3dFbXB0eVRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRBZGRSb3dFbXB0eVRlbXBsYXRlPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlneEJ1dHRvbj1cInJhaXNlZFwiIGlneFJpcHBsZSAoY2xpY2spPVwidGhpcy5jcnVkU2VydmljZS5lbnRlckFkZFJvd01vZGUobnVsbCwgZmFsc2UsICRldmVudClcIj5cbiAgICAgICAge3tyZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfYWRkX3Jvd19sYWJlbH19XG4gICAgPC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRMb2FkaW5nR3JpZD5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX2xvYWRpbmdcIj5cbiAgICAgICAgPGlneC1jaXJjdWxhci1iYXIgW2luZGV0ZXJtaW5hdGVdPVwidHJ1ZVwiPlxuICAgICAgICA8L2lneC1jaXJjdWxhci1iYXI+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRDb2xsYXBzZWRUZW1wbGF0ZT5cbiAgICA8aWd4LWljb24gcm9sZT1cImJ1dHRvblwiPnVuZm9sZF9tb3JlPC9pZ3gtaWNvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEV4cGFuZGVkVGVtcGxhdGU+XG4gICAgPGlneC1pY29uIHJvbGU9XCJidXR0b25cIiBbYWN0aXZlXT1cImhhc0V4cGFuZGVkUmVjb3JkcygpICYmIGhhc0V4cGFuZGFibGVDaGlsZHJlblwiPnVuZm9sZF9sZXNzPC9pZ3gtaWNvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgKm5nSWY9XCJyb3dFZGl0YWJsZVwiIGlneFRvZ2dsZSAjcm93RWRpdGluZ092ZXJsYXk+XG4gICAgPGRpdiBbY2xhc3NOYW1lXT1cImJhbm5lckNsYXNzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwicmVzb2x2ZVJvd0VkaXRDb250YWluZXI7IGNvbnRleHQ6IHsgcm93Q2hhbmdlc0NvdW50OiByb3dDaGFuZ2VzQ291bnQsIGVuZEVkaXQ6IHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdC5iaW5kKHRoaXMpIH1cIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJvd0VkaXRUZXh0PlxuICAgIFlvdSBoYXZlIHt7IHJvd0NoYW5nZXNDb3VudCB9fSBjaGFuZ2VzIGluIHRoaXMgcm93IGFuZCB7eyBoaWRkZW5Db2x1bW5zQ291bnQgfX0gaGlkZGVuIGNvbHVtbnNcbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRSb3dFZGl0QWN0aW9ucz5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZ3hCdXR0b24gaWd4Um93RWRpdFRhYlN0b3AgKGNsaWNrKT1cInRoaXMuZW5kUm93RWRpdFRhYlN0b3AoZmFsc2UsICRldmVudClcIj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9yb3dfZWRpdF9idG5fY2FuY2VsIH19PC9idXR0b24+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uIGlneFJvd0VkaXRUYWJTdG9wIChjbGljayk9XCJ0aGlzLmVuZFJvd0VkaXRUYWJTdG9wKHRydWUsICRldmVudClcIj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9yb3dfZWRpdF9idG5fZG9uZSB9fTwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJvd0VkaXRUZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWJhbm5lcl9fbWVzc2FnZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImlneC1iYW5uZXJfX3RleHRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRoaXMuY3J1ZFNlcnZpY2Uucm93Py5nZXRDbGFzc05hbWUoKSA9PT0gJ0lneEFkZFJvdycgPyByb3dBZGRUZXh0VGVtcGxhdGUgOiByZXNvbHZlUm93RWRpdFRleHQgfHwgZGVmYXVsdFJvd0VkaXRUZXh0O1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgJGltcGxpY2l0OiB0aGlzLmNydWRTZXJ2aWNlLnJvdz8uZ2V0Q2xhc3NOYW1lKCkgIT09ICdJZ3hBZGRSb3cnID8gcm93Q2hhbmdlc0NvdW50IDogbnVsbCB9XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtYmFubmVyX19hY3Rpb25zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtYmFubmVyX19yb3dcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInJlc29sdmVSb3dFZGl0QWN0aW9ucyB8fCBkZWZhdWx0Um93RWRpdEFjdGlvbnM7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB0aGlzLmVuZEVkaXQuYmluZCh0aGlzKSB9XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RyYWdJbmRpY2F0b3JJY29uQmFzZT5cbiAgICA8aWd4LWljb24+ZHJhZ19pbmRpY2F0b3I8L2lneC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGlneC1ncmlkLWNvbHVtbi1yZXNpemVyICpuZ0lmPVwiY29sUmVzaXppbmdTZXJ2aWNlLnNob3dSZXNpemVyXCI+PC9pZ3gtZ3JpZC1jb2x1bW4tcmVzaXplcj5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fbG9hZGluZy1vdXRsZXRcIiAjaWd4TG9hZGluZ092ZXJsYXlPdXRsZXQgaWd4T3ZlcmxheU91dGxldD48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fb3V0bGV0XCIgI2lneEZpbHRlcmluZ092ZXJsYXlPdXRsZXQgaWd4T3ZlcmxheU91dGxldD48L2Rpdj5cbiJdfQ==