@fundamental-ngx/platform 0.43.37 → 0.43.38

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 (28) hide show
  1. package/approval-flow/approval-flow-user-list/approval-flow-user-list.component.d.ts +10 -0
  2. package/esm2020/approval-flow/approval-flow-add-node/approval-flow-add-node.component.mjs +2 -4
  3. package/esm2020/approval-flow/approval-flow-user-list/approval-flow-user-list.component.mjs +50 -14
  4. package/esm2020/list/base-list-item.mjs +4 -2
  5. package/esm2020/list/list.component.mjs +12 -2
  6. package/esm2020/table/components/table-row/table-row.component.mjs +3 -3
  7. package/esm2020/table-helpers/directives/table-virtual-scroll.directive.mjs +8 -2
  8. package/fesm2015/fundamental-ngx-platform-approval-flow.mjs +52 -20
  9. package/fesm2015/fundamental-ngx-platform-approval-flow.mjs.map +1 -1
  10. package/fesm2015/fundamental-ngx-platform-list.mjs +15 -2
  11. package/fesm2015/fundamental-ngx-platform-list.mjs.map +1 -1
  12. package/fesm2015/fundamental-ngx-platform-table-helpers.mjs +7 -1
  13. package/fesm2015/fundamental-ngx-platform-table-helpers.mjs.map +1 -1
  14. package/fesm2015/fundamental-ngx-platform-table.mjs +2 -2
  15. package/fesm2015/fundamental-ngx-platform-table.mjs.map +1 -1
  16. package/fesm2020/fundamental-ngx-platform-approval-flow.mjs +50 -18
  17. package/fesm2020/fundamental-ngx-platform-approval-flow.mjs.map +1 -1
  18. package/fesm2020/fundamental-ngx-platform-list.mjs +14 -2
  19. package/fesm2020/fundamental-ngx-platform-list.mjs.map +1 -1
  20. package/fesm2020/fundamental-ngx-platform-table-helpers.mjs +7 -1
  21. package/fesm2020/fundamental-ngx-platform-table-helpers.mjs.map +1 -1
  22. package/fesm2020/fundamental-ngx-platform-table.mjs +2 -2
  23. package/fesm2020/fundamental-ngx-platform-table.mjs.map +1 -1
  24. package/fundamental-ngx-platform-v0.43.38.tgz +0 -0
  25. package/list/list.component.d.ts +6 -0
  26. package/package.json +4 -4
  27. package/schematics/ng-add/index.js +1 -1
  28. package/fundamental-ngx-platform-v0.43.37.tgz +0 -0
@@ -202,7 +202,7 @@ TableRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", vers
202
202
  useExisting: TableRowComponent
203
203
  },
204
204
  DestroyedService
205
- ], viewQueries: [{ propertyName: "_focusableViewCellItems", predicate: FDK_FOCUSABLE_ITEM_DIRECTIVE, descendants: true }, { propertyName: "_editableCells", predicate: EditableTableCell, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ng-template #fallbackContent>\n <fd-busy-indicator *ngIf=\"useCellPlaceholder\" [loading]=\"true\" size=\"s\" [block]=\"true\"> </fd-busy-indicator>\n</ng-template>\n\n<ng-template\n *ngIf=\"onlyRenderVisibleCells; else tdPrimaryContent\"\n fdpOnlyRenderVisibleCell\n [tableViewport]=\"tdPrimaryContent\"\n [viewportFallback]=\"fallbackContent\"\n>\n <ng-template [ngTemplateOutlet]=\"tdPrimaryContent\"></ng-template>\n</ng-template>\n\n<ng-template #tdPrimaryContent>\n <td\n *ngIf=\"_fdpTableService._semanticHighlighting$ | async as semanticHighlighting\"\n fd-table-cell\n fd-table-status-indicator\n fdkDisabled\n [addDisabledClass]=\"false\"\n [status]=\"row.value[semanticHighlighting]\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n ></td>\n\n <!-- hidden text for screenreader -->\n <ng-template #selectionScreenReaderText>\n <span\n aria-hidden=\"true\"\n [attr.id]=\"_rowSelectionHelperTextId\"\n [ngStyle]=\"{\n position: 'absolute !important',\n height: '1px',\n width: '1px',\n overflow: 'hidden',\n clip: 'rect(1px, 1px, 1px, 1px)',\n color: 'transparent',\n display: 'block'\n }\"\n >\n {{ (row.checked ? 'platformTable.deselectSingleRow' : 'platformTable.selectSingleRow') | fdTranslate }}\n </span>\n </ng-template>\n\n <!-- Row Selection Cell -->\n <ng-container [ngSwitch]=\"selectionMode\">\n <ng-container *ngSwitchCase=\"SELECTION_MODE.SINGLE\">\n <td\n *ngIf=\"row.value[selectableKey] !== false; else selectionMock\"\n class=\"fd-table__cell--checkbox\"\n [class.fd-table__cell--fixed]=\"fixed\"\n [attr.role]=\"_hasRowHeaderColumn ? 'rowheader' : 'gridcell'\"\n fd-table-cell\n [focusable]=\"true\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n [style]=\"\n _contentDensityObserver\n | async\n | selectionCellStyles : _rtl : (_fdpTableService._semanticHighlightingColumnWidth$ | async)\n \"\n [attr.aria-selected]=\"row.checked\"\n [attr.aria-labelledby]=\"_rowSelectionHelperTextId\"\n (click)=\"_toggleSingleSelectableRow()\"\n (keydown.enter)=\"_toggleSingleSelectableRow($event)\"\n (keydown.space)=\"_toggleSingleSelectableRow($event)\"\n >\n <ng-template [ngTemplateOutlet]=\"selectionScreenReaderText\"></ng-template>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"SELECTION_MODE.MULTIPLE\">\n <td\n *ngIf=\"row.value[selectableKey] !== false; else selectionMock\"\n class=\"fd-table__cell--checkbox\"\n [class.fd-table__cell--fixed]=\"fixed\"\n role=\"cell\"\n fd-table-cell\n [focusable]=\"true\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n (keydown.enter)=\"_toggleMultiSelectRow(row, $event)\"\n (keydown.space)=\"_toggleMultiSelectRow(row, $event)\"\n [attr.aria-selected]=\"row.checked\"\n [attr.aria-labelledby]=\"_rowSelectionHelperTextId\"\n [style]=\"\n _contentDensityObserver\n | async\n | selectionCellStyles : _rtl : (_fdpTableService._semanticHighlightingColumnWidth$ | async)\n \"\n >\n <ng-template [ngTemplateOutlet]=\"selectionScreenReaderText\"></ng-template>\n <fd-checkbox\n tabIndexValue=\"-1\"\n labelClass=\"fd-table__checkbox-label\"\n [tristate]=\"enableTristateMode\"\n [tristateSelectable]=\"false\"\n [ngModel]=\"row.checked$ | async\"\n (ngModelChange)=\"_toggleMultiSelectRow(row)\"\n ></fd-checkbox>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-template #selectionMock>\n <td\n class=\"fd-table__cell--checkbox\"\n role=\"gridcell\"\n fd-table-cell\n fdkDisabled\n [addDisabledClass]=\"false\"\n [class.fd-table__cell--fixed]=\"fixed\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n ></td>\n </ng-template>\n\n <td\n *ngFor=\"\n let column of _fdpTableService.visibleColumns$ | async;\n let colIdx = index;\n last as isLast;\n trackBy: _columnTrackBy\n \"\n #tableCellElement\n [fdpTableCellResizable]=\"\n colIdx\n | columnResizableSide\n : _fdpTableService.visibleColumnsLength\n : (_fdpTableService._isShownNavigationColumn$ | async) === true\n \"\n [columnName]=\"column.name\"\n [focusable]=\"true\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n [attr.role]=\"column.role\"\n [headers]=\"rowId + '__' + column.name\"\n [ngClass]=\"[\n 'fdp-table__col--' + column.name,\n column._freezed ? 'fd-table__cell--fixed' : '',\n column.name === freezeColumnsTo ? 'fd-table__cell--fixed-last' : '',\n column._endFreezed ? 'fd-table__cell--fixed-end' : '',\n column.name === freezeEndColumnsTo ? 'fd-table__cell--fixed-end-last' : '',\n row.isTree && colIdx === 0 ? 'fd-table__cell--expand' : '',\n isLast && (_fdpTableService._isShownNavigationColumn$ | async) === false ? 'is-last-child' : ''\n ]\"\n [ngStyle]=\"\n column\n | tableCellStyles\n : _rtl\n : (_fdpTableService._semanticHighlightingColumnWidth$ | async)\n : selectionColumnWidth\n : column._freezed\n : column._endFreezed\n : _tableColumnResizeService.getPrevColumnsWidth(column.name)\n : _tableColumnResizeService.getColumnWidthStyle(column.name)\n : _tableColumnResizeService.getNextColumnsWidth(column.name)\n \"\n [attr.aria-expanded]=\"_isTreeRowFirstCell(colIdx, row) ? row.expanded : null\"\n [attr.data-nesting-level]=\"colIdx === 0 ? row.level + 1 : null\"\n (cellFocused)=\"_tableRowService.cellFocused($event); _tableRowService.cellActivate(colIdx, row)\"\n (click)=\"_tableRowService.cellClicked({ index: colIdx, row })\"\n (keydown.enter)=\"_isTreeRowFirstCell(colIdx, row, $event) && _toggleGroupRow()\"\n (keydown.arrowLeft)=\"_tableRowService.scrollToOverlappedCell()\"\n (keydown.arrowRight)=\"_tableRowService.scrollToOverlappedCell()\"\n (keydown.space)=\"_handleCellSpaceKey(colIdx, tableCellElement, $event)\"\n >\n <ng-template #primaryTextContainer>\n <div\n [class.fd-table__text]=\"column.applyText\"\n [class.fd-table__text--no-wrap]=\"column.applyText\"\n [class.fd-table__cell--truncate-txt]=\"column.applyText\"\n [attr.title]=\"\n tableTextContainer.offsetWidth < tableTextContainer.scrollWidth\n ? tableTextContainer.textContent\n : null\n \"\n #tableTextContainer\n >\n <span\n *ngIf=\"_isTreeRowFirstCell(colIdx, row)\"\n class=\"fd-table__expand\"\n [class.fd-table__expand--open]=\"row.expanded$ | async\"\n aria-hidden=\"true\"\n ></span>\n\n <ng-container *ngIf=\"row.state === 'readonly'; else editModeCell\">\n <span\n *ngIf=\"tableTextContainer?.textContent?.trim() === ''\"\n style=\"\n position: absolute !important;\n height: 1px;\n width: 1px;\n overflow: hidden;\n opacity: 0;\n clip: rect(1px 1px 1px 1px);\n clip: rect(1px, 1px, 1px, 1px);\n \"\n >{{ 'platformTable.emptyCell' | fdTranslate }}</span\n >\n <ng-container *ngIf=\"column?.columnCellTemplate; else defaultTableCellTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n column.columnCellTemplate!;\n context: { $implicit: row.value, popping: false, rowIndex: row.index }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n <ng-template #defaultTableCellTemplate>{{ row.value | valueByPath : column.key }}</ng-template>\n\n <ng-template #editModeCell>\n <ng-container *ngIf=\"column?.editableColumnCellTemplate; else defaultEditableTableCellTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n column.editableColumnCellTemplate!;\n context: { $implicit: row.value, popping: false, rowIndex: row.index }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template #defaultEditableTableCellTemplate>\n <fdp-table-editable-cell\n [row]=\"row\"\n [column]=\"column\"\n [columnValue]=\"row.value | valueByPath : column.key\"\n ></fdp-table-editable-cell>\n </ng-template>\n </ng-template>\n </div>\n </ng-template>\n\n <ng-template\n *ngIf=\"onlyRenderVisibleCells; else primaryTextContainer\"\n fdpOnlyRenderVisibleCell\n [tableViewport]=\"primaryTextContainer\"\n [viewportFallback]=\"fallbackContent\"\n >\n <ng-template [ngTemplateOutlet]=\"primaryTextContainer\"></ng-template>\n </ng-template>\n </td>\n\n <ng-content></ng-content>\n\n <td\n *ngIf=\"_fdpTableService._isShownNavigationColumn$ | async\"\n fd-table-cell\n class=\"fdp-table__cell--navigation is-last-child\"\n fdkDisabled\n [addDisabledClass]=\"false\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n >\n <i\n *ngIf=\"row.navigatable\"\n fd-table-icon\n [navigation]=\"true\"\n [class]=\"_rtl ? 'sap-icon--slim-arrow-left' : 'sap-icon--slim-arrow-right'\"\n class=\"fdp-table__navigation-indicator\"\n ></i>\n </td>\n\n <td\n aria-hidden=\"true\"\n class=\"fd-table__cell fd-table__cell--mock\"\n [class.fd-table__cell--mock-borderless]=\"(_tableColumnResizeService.cellMockVisible$ | async) !== true\"\n fdkDisabled\n [addDisabledClass]=\"false\"\n ></td>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.TableCellDirective, selector: "[fdTableCell], [fd-table-cell]", inputs: ["noBorderX", "noBorderY", "activable", "focusable", "hoverable", "fitContent", "noPadding", "noData", "key"] }, { kind: "directive", type: i3.TableStatusIndicatorDirective, selector: "[fdTableStatusIndicator], [fd-table-status-indicator]", inputs: ["status"] }, { kind: "directive", type: i3.TableIconDirective, selector: "[fdTableIcon], [fd-table-icon]", inputs: ["class", "glyph", "navigation"] }, { kind: "component", type: i4.CheckboxComponent, selector: "fd-checkbox", inputs: ["ariaLabel", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "tristate", "tristateSelectable", "labelClass", "required", "values", "standalone"], outputs: ["focusChange"] }, { kind: "component", type: i5.BusyIndicatorComponent, selector: "fd-busy-indicator", inputs: ["loading", "size", "block", "ariaLabel", "title", "label", "ariaLive"] }, { kind: "directive", type: i6.DisabledBehaviorDirective, selector: "[fdkDisabled]", inputs: ["fdkDisabled", "addDisabledClass", "disabledClass"] }, { kind: "directive", type: i7.PlatformTableCellResizableDirective, selector: "[fdpTableCellResizable]", inputs: ["fdpTableCellResizable", "columnName"] }, { kind: "directive", type: i7.FdpRenderVisibleCellDirective, selector: "[fdpOnlyRenderVisibleCell]", inputs: ["tableViewport", "viewportFallback"] }, { kind: "component", type: i8.TableEditableCellComponent, selector: "fdp-table-editable-cell", inputs: ["row", "column", "columnValue"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.ValueByPathPipe, name: "valueByPath" }, { kind: "pipe", type: i9.FdTranslatePipe, name: "fdTranslate" }, { kind: "pipe", type: i7.SelectionCellStylesPipe, name: "selectionCellStyles" }, { kind: "pipe", type: i7.TableCellStylesPipe, name: "tableCellStyles" }, { kind: "pipe", type: i7.ColumnResizableSidePipe, name: "columnResizableSide" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
205
+ ], viewQueries: [{ propertyName: "_focusableViewCellItems", predicate: FDK_FOCUSABLE_ITEM_DIRECTIVE, descendants: true }, { propertyName: "_editableCells", predicate: EditableTableCell, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ng-template #fallbackContent>\n <fd-busy-indicator *ngIf=\"useCellPlaceholder\" [loading]=\"true\" size=\"s\" [block]=\"true\"> </fd-busy-indicator>\n</ng-template>\n\n<ng-template\n *ngIf=\"onlyRenderVisibleCells; else tdPrimaryContent\"\n fdpOnlyRenderVisibleCell\n [tableViewport]=\"tdPrimaryContent\"\n [viewportFallback]=\"fallbackContent\"\n>\n <ng-template [ngTemplateOutlet]=\"tdPrimaryContent\"></ng-template>\n</ng-template>\n\n<ng-template #tdPrimaryContent>\n <td\n *ngIf=\"_fdpTableService._semanticHighlighting$ | async as semanticHighlighting\"\n fd-table-cell\n fd-table-status-indicator\n fdkDisabled\n [addDisabledClass]=\"false\"\n [status]=\"row.value[semanticHighlighting]\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n ></td>\n\n <!-- hidden text for screenreader -->\n <ng-template #selectionScreenReaderText>\n <span\n aria-hidden=\"true\"\n [attr.id]=\"_rowSelectionHelperTextId\"\n [ngStyle]=\"{\n position: 'absolute !important',\n height: '1px',\n width: '1px',\n overflow: 'hidden',\n clip: 'rect(1px, 1px, 1px, 1px)',\n color: 'transparent',\n display: 'block'\n }\"\n >\n {{ (row.checked ? 'platformTable.deselectSingleRow' : 'platformTable.selectSingleRow') | fdTranslate }}\n </span>\n </ng-template>\n\n <!-- Row Selection Cell -->\n <ng-container [ngSwitch]=\"selectionMode\">\n <ng-container *ngSwitchCase=\"SELECTION_MODE.SINGLE\">\n <td\n *ngIf=\"row.value[selectableKey] !== false; else selectionMock\"\n class=\"fd-table__cell--checkbox\"\n [class.fd-table__cell--fixed]=\"fixed\"\n [attr.role]=\"_hasRowHeaderColumn ? 'rowheader' : 'gridcell'\"\n fd-table-cell\n [focusable]=\"true\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n [style]=\"\n _contentDensityObserver\n | async\n | selectionCellStyles : _rtl : (_fdpTableService._semanticHighlightingColumnWidth$ | async)\n \"\n [attr.aria-selected]=\"row.checked\"\n [attr.aria-labelledby]=\"_rowSelectionHelperTextId\"\n (click)=\"_toggleSingleSelectableRow()\"\n (keydown.enter)=\"_toggleSingleSelectableRow($event)\"\n (keydown.space)=\"_toggleSingleSelectableRow($event)\"\n >\n <ng-template [ngTemplateOutlet]=\"selectionScreenReaderText\"></ng-template>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"SELECTION_MODE.MULTIPLE\">\n <td\n *ngIf=\"row.value[selectableKey] !== false; else selectionMock\"\n class=\"fd-table__cell--checkbox\"\n [class.fd-table__cell--fixed]=\"fixed\"\n role=\"cell\"\n fd-table-cell\n [focusable]=\"true\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n (keydown.enter)=\"_toggleMultiSelectRow(row, $event)\"\n (keydown.space)=\"_toggleMultiSelectRow(row, $event)\"\n [attr.aria-selected]=\"row.checked\"\n [attr.aria-labelledby]=\"_rowSelectionHelperTextId\"\n [style]=\"\n _contentDensityObserver\n | async\n | selectionCellStyles : _rtl : (_fdpTableService._semanticHighlightingColumnWidth$ | async)\n \"\n >\n <ng-template [ngTemplateOutlet]=\"selectionScreenReaderText\"></ng-template>\n <fd-checkbox\n tabIndexValue=\"-1\"\n labelClass=\"fd-table__checkbox-label\"\n [tristate]=\"enableTristateMode\"\n [tristateSelectable]=\"false\"\n [ngModel]=\"row.checked$ | async\"\n (ngModelChange)=\"_toggleMultiSelectRow(row)\"\n ></fd-checkbox>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-template #selectionMock>\n <td\n class=\"fd-table__cell--checkbox\"\n role=\"gridcell\"\n fd-table-cell\n fdkDisabled\n [addDisabledClass]=\"false\"\n [class.fd-table__cell--fixed]=\"fixed\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n ></td>\n </ng-template>\n\n <td\n *ngFor=\"\n let column of _fdpTableService.visibleColumns$ | async;\n let colIdx = index;\n last as isLast;\n trackBy: _columnTrackBy\n \"\n #tableCellElement\n [fdpTableCellResizable]=\"\n colIdx\n | columnResizableSide\n : _fdpTableService.visibleColumnsLength\n : (_fdpTableService._isShownNavigationColumn$ | async) === true\n \"\n [columnName]=\"column.name\"\n [focusable]=\"true\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n [attr.role]=\"column.role\"\n [headers]=\"rowId + '__' + column.name\"\n [ngClass]=\"[\n 'fdp-table__col--' + column.name,\n column._freezed ? 'fd-table__cell--fixed' : '',\n column.name === freezeColumnsTo ? 'fd-table__cell--fixed-last' : '',\n column._endFreezed ? 'fd-table__cell--fixed-end' : '',\n column.name === freezeEndColumnsTo ? 'fd-table__cell--fixed-end-last' : '',\n row.isTree && colIdx === 0 ? 'fd-table__cell--expand' : '',\n isLast && (_fdpTableService._isShownNavigationColumn$ | async) === false ? 'is-last-child' : ''\n ]\"\n [ngStyle]=\"\n column\n | tableCellStyles\n : _rtl\n : (_fdpTableService._semanticHighlightingColumnWidth$ | async)\n : selectionColumnWidth\n : column._freezed\n : column._endFreezed\n : _tableColumnResizeService.getPrevColumnsWidth(column.name)\n : _tableColumnResizeService.getColumnWidthStyle(column.name)\n : _tableColumnResizeService.getNextColumnsWidth(column.name)\n \"\n [attr.aria-expanded]=\"_isTreeRowFirstCell(colIdx, row) ? row.expanded : null\"\n [attr.data-nesting-level]=\"colIdx === 0 ? row.level + 1 : null\"\n (cellFocused)=\"_tableRowService.cellFocused($event); _tableRowService.cellActivate(colIdx, row)\"\n (click)=\"_tableRowService.cellClicked({ index: colIdx, row })\"\n (keydown.enter)=\"_isTreeRowFirstCell(colIdx, row, $event) && _toggleGroupRow()\"\n (keydown.arrowLeft)=\"_tableRowService.scrollToOverlappedCell()\"\n (keydown.arrowRight)=\"_tableRowService.scrollToOverlappedCell()\"\n (keydown.space)=\"_handleCellSpaceKey(colIdx, tableCellElement, $event)\"\n >\n <ng-template #primaryTextContainer>\n <div\n [class.fd-table__text]=\"column.applyText\"\n [class.fd-table__text--no-wrap]=\"column.applyText\"\n [class.fd-table__cell--truncate-txt]=\"column.applyText\"\n #tableTextContainer\n >\n <span\n *ngIf=\"_isTreeRowFirstCell(colIdx, row)\"\n class=\"fd-table__expand\"\n [class.fd-table__expand--open]=\"row.expanded$ | async\"\n aria-hidden=\"true\"\n ></span>\n\n <ng-container *ngIf=\"row.state === 'readonly'; else editModeCell\">\n <span\n *ngIf=\"tableTextContainer?.textContent?.trim() === ''\"\n style=\"\n position: absolute !important;\n height: 1px;\n width: 1px;\n overflow: hidden;\n opacity: 0;\n clip: rect(1px 1px 1px 1px);\n clip: rect(1px, 1px, 1px, 1px);\n \"\n >{{ 'platformTable.emptyCell' | fdTranslate }}</span\n >\n <ng-container *ngIf=\"column?.columnCellTemplate; else defaultTableCellTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n column.columnCellTemplate!;\n context: { $implicit: row.value, popping: false, rowIndex: row.index }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n <ng-template #defaultTableCellTemplate>{{ row.value | valueByPath : column.key }}</ng-template>\n\n <ng-template #editModeCell>\n <ng-container *ngIf=\"column?.editableColumnCellTemplate; else defaultEditableTableCellTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n column.editableColumnCellTemplate!;\n context: { $implicit: row.value, popping: false, rowIndex: row.index }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template #defaultEditableTableCellTemplate>\n <fdp-table-editable-cell\n [row]=\"row\"\n [column]=\"column\"\n [columnValue]=\"row.value | valueByPath : column.key\"\n ></fdp-table-editable-cell>\n </ng-template>\n </ng-template>\n </div>\n </ng-template>\n\n <ng-template\n *ngIf=\"onlyRenderVisibleCells; else primaryTextContainer\"\n fdpOnlyRenderVisibleCell\n [tableViewport]=\"primaryTextContainer\"\n [viewportFallback]=\"fallbackContent\"\n >\n <ng-template [ngTemplateOutlet]=\"primaryTextContainer\"></ng-template>\n </ng-template>\n </td>\n\n <ng-content></ng-content>\n\n <td\n *ngIf=\"_fdpTableService._isShownNavigationColumn$ | async\"\n fd-table-cell\n class=\"fdp-table__cell--navigation is-last-child\"\n fdkDisabled\n [addDisabledClass]=\"false\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n >\n <i\n *ngIf=\"row.navigatable\"\n fd-table-icon\n [navigation]=\"true\"\n [class]=\"_rtl ? 'sap-icon--slim-arrow-left' : 'sap-icon--slim-arrow-right'\"\n class=\"fdp-table__navigation-indicator\"\n ></i>\n </td>\n\n <td\n aria-hidden=\"true\"\n class=\"fd-table__cell fd-table__cell--mock\"\n [class.fd-table__cell--mock-borderless]=\"(_tableColumnResizeService.cellMockVisible$ | async) !== true\"\n fdkDisabled\n [addDisabledClass]=\"false\"\n ></td>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.TableCellDirective, selector: "[fdTableCell], [fd-table-cell]", inputs: ["noBorderX", "noBorderY", "activable", "focusable", "hoverable", "fitContent", "noPadding", "noData", "key"] }, { kind: "directive", type: i3.TableStatusIndicatorDirective, selector: "[fdTableStatusIndicator], [fd-table-status-indicator]", inputs: ["status"] }, { kind: "directive", type: i3.TableIconDirective, selector: "[fdTableIcon], [fd-table-icon]", inputs: ["class", "glyph", "navigation"] }, { kind: "component", type: i4.CheckboxComponent, selector: "fd-checkbox", inputs: ["ariaLabel", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "tristate", "tristateSelectable", "labelClass", "required", "values", "standalone"], outputs: ["focusChange"] }, { kind: "component", type: i5.BusyIndicatorComponent, selector: "fd-busy-indicator", inputs: ["loading", "size", "block", "ariaLabel", "title", "label", "ariaLive"] }, { kind: "directive", type: i6.DisabledBehaviorDirective, selector: "[fdkDisabled]", inputs: ["fdkDisabled", "addDisabledClass", "disabledClass"] }, { kind: "directive", type: i7.PlatformTableCellResizableDirective, selector: "[fdpTableCellResizable]", inputs: ["fdpTableCellResizable", "columnName"] }, { kind: "directive", type: i7.FdpRenderVisibleCellDirective, selector: "[fdpOnlyRenderVisibleCell]", inputs: ["tableViewport", "viewportFallback"] }, { kind: "component", type: i8.TableEditableCellComponent, selector: "fdp-table-editable-cell", inputs: ["row", "column", "columnValue"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.ValueByPathPipe, name: "valueByPath" }, { kind: "pipe", type: i9.FdTranslatePipe, name: "fdTranslate" }, { kind: "pipe", type: i7.SelectionCellStylesPipe, name: "selectionCellStyles" }, { kind: "pipe", type: i7.TableCellStylesPipe, name: "tableCellStyles" }, { kind: "pipe", type: i7.ColumnResizableSidePipe, name: "columnResizableSide" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
206
206
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TableRowComponent, decorators: [{
207
207
  type: Component,
208
208
  args: [{ selector: '[fdp-table-row]', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
@@ -214,7 +214,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
214
214
  ], host: {
215
215
  role: 'row',
216
216
  '[attr.aria-expanded]': '_isTreeRow(row) ? row.expanded : null'
217
- }, template: "<ng-template #fallbackContent>\n <fd-busy-indicator *ngIf=\"useCellPlaceholder\" [loading]=\"true\" size=\"s\" [block]=\"true\"> </fd-busy-indicator>\n</ng-template>\n\n<ng-template\n *ngIf=\"onlyRenderVisibleCells; else tdPrimaryContent\"\n fdpOnlyRenderVisibleCell\n [tableViewport]=\"tdPrimaryContent\"\n [viewportFallback]=\"fallbackContent\"\n>\n <ng-template [ngTemplateOutlet]=\"tdPrimaryContent\"></ng-template>\n</ng-template>\n\n<ng-template #tdPrimaryContent>\n <td\n *ngIf=\"_fdpTableService._semanticHighlighting$ | async as semanticHighlighting\"\n fd-table-cell\n fd-table-status-indicator\n fdkDisabled\n [addDisabledClass]=\"false\"\n [status]=\"row.value[semanticHighlighting]\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n ></td>\n\n <!-- hidden text for screenreader -->\n <ng-template #selectionScreenReaderText>\n <span\n aria-hidden=\"true\"\n [attr.id]=\"_rowSelectionHelperTextId\"\n [ngStyle]=\"{\n position: 'absolute !important',\n height: '1px',\n width: '1px',\n overflow: 'hidden',\n clip: 'rect(1px, 1px, 1px, 1px)',\n color: 'transparent',\n display: 'block'\n }\"\n >\n {{ (row.checked ? 'platformTable.deselectSingleRow' : 'platformTable.selectSingleRow') | fdTranslate }}\n </span>\n </ng-template>\n\n <!-- Row Selection Cell -->\n <ng-container [ngSwitch]=\"selectionMode\">\n <ng-container *ngSwitchCase=\"SELECTION_MODE.SINGLE\">\n <td\n *ngIf=\"row.value[selectableKey] !== false; else selectionMock\"\n class=\"fd-table__cell--checkbox\"\n [class.fd-table__cell--fixed]=\"fixed\"\n [attr.role]=\"_hasRowHeaderColumn ? 'rowheader' : 'gridcell'\"\n fd-table-cell\n [focusable]=\"true\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n [style]=\"\n _contentDensityObserver\n | async\n | selectionCellStyles : _rtl : (_fdpTableService._semanticHighlightingColumnWidth$ | async)\n \"\n [attr.aria-selected]=\"row.checked\"\n [attr.aria-labelledby]=\"_rowSelectionHelperTextId\"\n (click)=\"_toggleSingleSelectableRow()\"\n (keydown.enter)=\"_toggleSingleSelectableRow($event)\"\n (keydown.space)=\"_toggleSingleSelectableRow($event)\"\n >\n <ng-template [ngTemplateOutlet]=\"selectionScreenReaderText\"></ng-template>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"SELECTION_MODE.MULTIPLE\">\n <td\n *ngIf=\"row.value[selectableKey] !== false; else selectionMock\"\n class=\"fd-table__cell--checkbox\"\n [class.fd-table__cell--fixed]=\"fixed\"\n role=\"cell\"\n fd-table-cell\n [focusable]=\"true\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n (keydown.enter)=\"_toggleMultiSelectRow(row, $event)\"\n (keydown.space)=\"_toggleMultiSelectRow(row, $event)\"\n [attr.aria-selected]=\"row.checked\"\n [attr.aria-labelledby]=\"_rowSelectionHelperTextId\"\n [style]=\"\n _contentDensityObserver\n | async\n | selectionCellStyles : _rtl : (_fdpTableService._semanticHighlightingColumnWidth$ | async)\n \"\n >\n <ng-template [ngTemplateOutlet]=\"selectionScreenReaderText\"></ng-template>\n <fd-checkbox\n tabIndexValue=\"-1\"\n labelClass=\"fd-table__checkbox-label\"\n [tristate]=\"enableTristateMode\"\n [tristateSelectable]=\"false\"\n [ngModel]=\"row.checked$ | async\"\n (ngModelChange)=\"_toggleMultiSelectRow(row)\"\n ></fd-checkbox>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-template #selectionMock>\n <td\n class=\"fd-table__cell--checkbox\"\n role=\"gridcell\"\n fd-table-cell\n fdkDisabled\n [addDisabledClass]=\"false\"\n [class.fd-table__cell--fixed]=\"fixed\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n ></td>\n </ng-template>\n\n <td\n *ngFor=\"\n let column of _fdpTableService.visibleColumns$ | async;\n let colIdx = index;\n last as isLast;\n trackBy: _columnTrackBy\n \"\n #tableCellElement\n [fdpTableCellResizable]=\"\n colIdx\n | columnResizableSide\n : _fdpTableService.visibleColumnsLength\n : (_fdpTableService._isShownNavigationColumn$ | async) === true\n \"\n [columnName]=\"column.name\"\n [focusable]=\"true\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n [attr.role]=\"column.role\"\n [headers]=\"rowId + '__' + column.name\"\n [ngClass]=\"[\n 'fdp-table__col--' + column.name,\n column._freezed ? 'fd-table__cell--fixed' : '',\n column.name === freezeColumnsTo ? 'fd-table__cell--fixed-last' : '',\n column._endFreezed ? 'fd-table__cell--fixed-end' : '',\n column.name === freezeEndColumnsTo ? 'fd-table__cell--fixed-end-last' : '',\n row.isTree && colIdx === 0 ? 'fd-table__cell--expand' : '',\n isLast && (_fdpTableService._isShownNavigationColumn$ | async) === false ? 'is-last-child' : ''\n ]\"\n [ngStyle]=\"\n column\n | tableCellStyles\n : _rtl\n : (_fdpTableService._semanticHighlightingColumnWidth$ | async)\n : selectionColumnWidth\n : column._freezed\n : column._endFreezed\n : _tableColumnResizeService.getPrevColumnsWidth(column.name)\n : _tableColumnResizeService.getColumnWidthStyle(column.name)\n : _tableColumnResizeService.getNextColumnsWidth(column.name)\n \"\n [attr.aria-expanded]=\"_isTreeRowFirstCell(colIdx, row) ? row.expanded : null\"\n [attr.data-nesting-level]=\"colIdx === 0 ? row.level + 1 : null\"\n (cellFocused)=\"_tableRowService.cellFocused($event); _tableRowService.cellActivate(colIdx, row)\"\n (click)=\"_tableRowService.cellClicked({ index: colIdx, row })\"\n (keydown.enter)=\"_isTreeRowFirstCell(colIdx, row, $event) && _toggleGroupRow()\"\n (keydown.arrowLeft)=\"_tableRowService.scrollToOverlappedCell()\"\n (keydown.arrowRight)=\"_tableRowService.scrollToOverlappedCell()\"\n (keydown.space)=\"_handleCellSpaceKey(colIdx, tableCellElement, $event)\"\n >\n <ng-template #primaryTextContainer>\n <div\n [class.fd-table__text]=\"column.applyText\"\n [class.fd-table__text--no-wrap]=\"column.applyText\"\n [class.fd-table__cell--truncate-txt]=\"column.applyText\"\n [attr.title]=\"\n tableTextContainer.offsetWidth < tableTextContainer.scrollWidth\n ? tableTextContainer.textContent\n : null\n \"\n #tableTextContainer\n >\n <span\n *ngIf=\"_isTreeRowFirstCell(colIdx, row)\"\n class=\"fd-table__expand\"\n [class.fd-table__expand--open]=\"row.expanded$ | async\"\n aria-hidden=\"true\"\n ></span>\n\n <ng-container *ngIf=\"row.state === 'readonly'; else editModeCell\">\n <span\n *ngIf=\"tableTextContainer?.textContent?.trim() === ''\"\n style=\"\n position: absolute !important;\n height: 1px;\n width: 1px;\n overflow: hidden;\n opacity: 0;\n clip: rect(1px 1px 1px 1px);\n clip: rect(1px, 1px, 1px, 1px);\n \"\n >{{ 'platformTable.emptyCell' | fdTranslate }}</span\n >\n <ng-container *ngIf=\"column?.columnCellTemplate; else defaultTableCellTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n column.columnCellTemplate!;\n context: { $implicit: row.value, popping: false, rowIndex: row.index }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n <ng-template #defaultTableCellTemplate>{{ row.value | valueByPath : column.key }}</ng-template>\n\n <ng-template #editModeCell>\n <ng-container *ngIf=\"column?.editableColumnCellTemplate; else defaultEditableTableCellTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n column.editableColumnCellTemplate!;\n context: { $implicit: row.value, popping: false, rowIndex: row.index }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template #defaultEditableTableCellTemplate>\n <fdp-table-editable-cell\n [row]=\"row\"\n [column]=\"column\"\n [columnValue]=\"row.value | valueByPath : column.key\"\n ></fdp-table-editable-cell>\n </ng-template>\n </ng-template>\n </div>\n </ng-template>\n\n <ng-template\n *ngIf=\"onlyRenderVisibleCells; else primaryTextContainer\"\n fdpOnlyRenderVisibleCell\n [tableViewport]=\"primaryTextContainer\"\n [viewportFallback]=\"fallbackContent\"\n >\n <ng-template [ngTemplateOutlet]=\"primaryTextContainer\"></ng-template>\n </ng-template>\n </td>\n\n <ng-content></ng-content>\n\n <td\n *ngIf=\"_fdpTableService._isShownNavigationColumn$ | async\"\n fd-table-cell\n class=\"fdp-table__cell--navigation is-last-child\"\n fdkDisabled\n [addDisabledClass]=\"false\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n >\n <i\n *ngIf=\"row.navigatable\"\n fd-table-icon\n [navigation]=\"true\"\n [class]=\"_rtl ? 'sap-icon--slim-arrow-left' : 'sap-icon--slim-arrow-right'\"\n class=\"fdp-table__navigation-indicator\"\n ></i>\n </td>\n\n <td\n aria-hidden=\"true\"\n class=\"fd-table__cell fd-table__cell--mock\"\n [class.fd-table__cell--mock-borderless]=\"(_tableColumnResizeService.cellMockVisible$ | async) !== true\"\n fdkDisabled\n [addDisabledClass]=\"false\"\n ></td>\n</ng-template>\n" }]
217
+ }, template: "<ng-template #fallbackContent>\n <fd-busy-indicator *ngIf=\"useCellPlaceholder\" [loading]=\"true\" size=\"s\" [block]=\"true\"> </fd-busy-indicator>\n</ng-template>\n\n<ng-template\n *ngIf=\"onlyRenderVisibleCells; else tdPrimaryContent\"\n fdpOnlyRenderVisibleCell\n [tableViewport]=\"tdPrimaryContent\"\n [viewportFallback]=\"fallbackContent\"\n>\n <ng-template [ngTemplateOutlet]=\"tdPrimaryContent\"></ng-template>\n</ng-template>\n\n<ng-template #tdPrimaryContent>\n <td\n *ngIf=\"_fdpTableService._semanticHighlighting$ | async as semanticHighlighting\"\n fd-table-cell\n fd-table-status-indicator\n fdkDisabled\n [addDisabledClass]=\"false\"\n [status]=\"row.value[semanticHighlighting]\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n ></td>\n\n <!-- hidden text for screenreader -->\n <ng-template #selectionScreenReaderText>\n <span\n aria-hidden=\"true\"\n [attr.id]=\"_rowSelectionHelperTextId\"\n [ngStyle]=\"{\n position: 'absolute !important',\n height: '1px',\n width: '1px',\n overflow: 'hidden',\n clip: 'rect(1px, 1px, 1px, 1px)',\n color: 'transparent',\n display: 'block'\n }\"\n >\n {{ (row.checked ? 'platformTable.deselectSingleRow' : 'platformTable.selectSingleRow') | fdTranslate }}\n </span>\n </ng-template>\n\n <!-- Row Selection Cell -->\n <ng-container [ngSwitch]=\"selectionMode\">\n <ng-container *ngSwitchCase=\"SELECTION_MODE.SINGLE\">\n <td\n *ngIf=\"row.value[selectableKey] !== false; else selectionMock\"\n class=\"fd-table__cell--checkbox\"\n [class.fd-table__cell--fixed]=\"fixed\"\n [attr.role]=\"_hasRowHeaderColumn ? 'rowheader' : 'gridcell'\"\n fd-table-cell\n [focusable]=\"true\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n [style]=\"\n _contentDensityObserver\n | async\n | selectionCellStyles : _rtl : (_fdpTableService._semanticHighlightingColumnWidth$ | async)\n \"\n [attr.aria-selected]=\"row.checked\"\n [attr.aria-labelledby]=\"_rowSelectionHelperTextId\"\n (click)=\"_toggleSingleSelectableRow()\"\n (keydown.enter)=\"_toggleSingleSelectableRow($event)\"\n (keydown.space)=\"_toggleSingleSelectableRow($event)\"\n >\n <ng-template [ngTemplateOutlet]=\"selectionScreenReaderText\"></ng-template>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"SELECTION_MODE.MULTIPLE\">\n <td\n *ngIf=\"row.value[selectableKey] !== false; else selectionMock\"\n class=\"fd-table__cell--checkbox\"\n [class.fd-table__cell--fixed]=\"fixed\"\n role=\"cell\"\n fd-table-cell\n [focusable]=\"true\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n (keydown.enter)=\"_toggleMultiSelectRow(row, $event)\"\n (keydown.space)=\"_toggleMultiSelectRow(row, $event)\"\n [attr.aria-selected]=\"row.checked\"\n [attr.aria-labelledby]=\"_rowSelectionHelperTextId\"\n [style]=\"\n _contentDensityObserver\n | async\n | selectionCellStyles : _rtl : (_fdpTableService._semanticHighlightingColumnWidth$ | async)\n \"\n >\n <ng-template [ngTemplateOutlet]=\"selectionScreenReaderText\"></ng-template>\n <fd-checkbox\n tabIndexValue=\"-1\"\n labelClass=\"fd-table__checkbox-label\"\n [tristate]=\"enableTristateMode\"\n [tristateSelectable]=\"false\"\n [ngModel]=\"row.checked$ | async\"\n (ngModelChange)=\"_toggleMultiSelectRow(row)\"\n ></fd-checkbox>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-template #selectionMock>\n <td\n class=\"fd-table__cell--checkbox\"\n role=\"gridcell\"\n fd-table-cell\n fdkDisabled\n [addDisabledClass]=\"false\"\n [class.fd-table__cell--fixed]=\"fixed\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n ></td>\n </ng-template>\n\n <td\n *ngFor=\"\n let column of _fdpTableService.visibleColumns$ | async;\n let colIdx = index;\n last as isLast;\n trackBy: _columnTrackBy\n \"\n #tableCellElement\n [fdpTableCellResizable]=\"\n colIdx\n | columnResizableSide\n : _fdpTableService.visibleColumnsLength\n : (_fdpTableService._isShownNavigationColumn$ | async) === true\n \"\n [columnName]=\"column.name\"\n [focusable]=\"true\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n [attr.role]=\"column.role\"\n [headers]=\"rowId + '__' + column.name\"\n [ngClass]=\"[\n 'fdp-table__col--' + column.name,\n column._freezed ? 'fd-table__cell--fixed' : '',\n column.name === freezeColumnsTo ? 'fd-table__cell--fixed-last' : '',\n column._endFreezed ? 'fd-table__cell--fixed-end' : '',\n column.name === freezeEndColumnsTo ? 'fd-table__cell--fixed-end-last' : '',\n row.isTree && colIdx === 0 ? 'fd-table__cell--expand' : '',\n isLast && (_fdpTableService._isShownNavigationColumn$ | async) === false ? 'is-last-child' : ''\n ]\"\n [ngStyle]=\"\n column\n | tableCellStyles\n : _rtl\n : (_fdpTableService._semanticHighlightingColumnWidth$ | async)\n : selectionColumnWidth\n : column._freezed\n : column._endFreezed\n : _tableColumnResizeService.getPrevColumnsWidth(column.name)\n : _tableColumnResizeService.getColumnWidthStyle(column.name)\n : _tableColumnResizeService.getNextColumnsWidth(column.name)\n \"\n [attr.aria-expanded]=\"_isTreeRowFirstCell(colIdx, row) ? row.expanded : null\"\n [attr.data-nesting-level]=\"colIdx === 0 ? row.level + 1 : null\"\n (cellFocused)=\"_tableRowService.cellFocused($event); _tableRowService.cellActivate(colIdx, row)\"\n (click)=\"_tableRowService.cellClicked({ index: colIdx, row })\"\n (keydown.enter)=\"_isTreeRowFirstCell(colIdx, row, $event) && _toggleGroupRow()\"\n (keydown.arrowLeft)=\"_tableRowService.scrollToOverlappedCell()\"\n (keydown.arrowRight)=\"_tableRowService.scrollToOverlappedCell()\"\n (keydown.space)=\"_handleCellSpaceKey(colIdx, tableCellElement, $event)\"\n >\n <ng-template #primaryTextContainer>\n <div\n [class.fd-table__text]=\"column.applyText\"\n [class.fd-table__text--no-wrap]=\"column.applyText\"\n [class.fd-table__cell--truncate-txt]=\"column.applyText\"\n #tableTextContainer\n >\n <span\n *ngIf=\"_isTreeRowFirstCell(colIdx, row)\"\n class=\"fd-table__expand\"\n [class.fd-table__expand--open]=\"row.expanded$ | async\"\n aria-hidden=\"true\"\n ></span>\n\n <ng-container *ngIf=\"row.state === 'readonly'; else editModeCell\">\n <span\n *ngIf=\"tableTextContainer?.textContent?.trim() === ''\"\n style=\"\n position: absolute !important;\n height: 1px;\n width: 1px;\n overflow: hidden;\n opacity: 0;\n clip: rect(1px 1px 1px 1px);\n clip: rect(1px, 1px, 1px, 1px);\n \"\n >{{ 'platformTable.emptyCell' | fdTranslate }}</span\n >\n <ng-container *ngIf=\"column?.columnCellTemplate; else defaultTableCellTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n column.columnCellTemplate!;\n context: { $implicit: row.value, popping: false, rowIndex: row.index }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n <ng-template #defaultTableCellTemplate>{{ row.value | valueByPath : column.key }}</ng-template>\n\n <ng-template #editModeCell>\n <ng-container *ngIf=\"column?.editableColumnCellTemplate; else defaultEditableTableCellTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n column.editableColumnCellTemplate!;\n context: { $implicit: row.value, popping: false, rowIndex: row.index }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template #defaultEditableTableCellTemplate>\n <fdp-table-editable-cell\n [row]=\"row\"\n [column]=\"column\"\n [columnValue]=\"row.value | valueByPath : column.key\"\n ></fdp-table-editable-cell>\n </ng-template>\n </ng-template>\n </div>\n </ng-template>\n\n <ng-template\n *ngIf=\"onlyRenderVisibleCells; else primaryTextContainer\"\n fdpOnlyRenderVisibleCell\n [tableViewport]=\"primaryTextContainer\"\n [viewportFallback]=\"fallbackContent\"\n >\n <ng-template [ngTemplateOutlet]=\"primaryTextContainer\"></ng-template>\n </ng-template>\n </td>\n\n <ng-content></ng-content>\n\n <td\n *ngIf=\"_fdpTableService._isShownNavigationColumn$ | async\"\n fd-table-cell\n class=\"fdp-table__cell--navigation is-last-child\"\n fdkDisabled\n [addDisabledClass]=\"false\"\n [cellFocusedEventAnnouncer]=\"_itemFocusedEventAnnouncer\"\n >\n <i\n *ngIf=\"row.navigatable\"\n fd-table-icon\n [navigation]=\"true\"\n [class]=\"_rtl ? 'sap-icon--slim-arrow-left' : 'sap-icon--slim-arrow-right'\"\n class=\"fdp-table__navigation-indicator\"\n ></i>\n </td>\n\n <td\n aria-hidden=\"true\"\n class=\"fd-table__cell fd-table__cell--mock\"\n [class.fd-table__cell--mock-borderless]=\"(_tableColumnResizeService.cellMockVisible$ | async) !== true\"\n fdkDisabled\n [addDisabledClass]=\"false\"\n ></td>\n</ng-template>\n" }]
218
218
  }], ctorParameters: function () { return []; }, propDecorators: { rowId: [{
219
219
  type: Input
220
220
  }], row: [{
@@ -256,4 +256,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
256
256
  type: HostBinding,
257
257
  args: ['attr.aria-selected']
258
258
  }] } });
259
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL3RhYmxlLXJvdy90YWJsZS1yb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL3RhYmxlL2NvbXBvbmVudHMvdGFibGUtcm93L3RhYmxlLXJvdy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUNMLE1BQU0sRUFJTixNQUFNLEVBQ04sU0FBUyxFQUVULFlBQVksRUFDWixpQkFBaUIsRUFDakIsTUFBTSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxnQkFBZ0IsRUFDaEIsNEJBQTRCLEVBQzVCLDRCQUE0QixFQUc1QixPQUFPLEVBQ1AsVUFBVSxFQUNWLE1BQU0sRUFDVCxNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFDSCxpQkFBaUIsRUFDakIsYUFBYSxFQUdiLHdCQUF3QixFQUN4Qix1QkFBdUIsRUFHdkIsZUFBZSxFQUNmLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsU0FBUyxFQUNaLE1BQU0seUNBQXlDLENBQUM7QUFDakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFD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QkFLTixhQUFhO3NCQURaLEtBQUs7Z0JBS04sa0JBQWtCO3NCQURqQixLQUFLO2dCQVNOLEtBQUs7c0JBREosS0FBSztnQkFLTixvQkFBb0I7c0JBRG5CLEtBQUs7Z0JBS04sZUFBZTtzQkFEZCxLQUFLO2dCQUtOLGtCQUFrQjtzQkFEakIsS0FBSztnQkFLTixTQUFTO3NCQURSLEtBQUs7Z0JBS04sc0JBQXNCO3NCQURyQixLQUFLO2dCQVFOLGtCQUFrQjtzQkFEakIsS0FBSztnQkFPTixZQUFZO3NCQURYLE1BQU07Z0JBUUssdUJBQXVCO3NCQURsQyxZQUFZO3VCQUFDLDRCQUE0QjtnQkFPekIsY0FBYztzQkFEOUIsWUFBWTt1QkFBQyxpQkFBaUI7Z0JBS25CLGFBQWE7c0JBRHhCLFdBQVc7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZyAqL1xuaW1wb3J0IHsgRE9XTl9BUlJPVywgVVBfQVJST1cgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIERlc3Ryb3llZFNlcnZpY2UsXG4gICAgRkRLX0ZPQ1VTQUJMRV9JVEVNX0RJUkVDVElWRSxcbiAgICBGREtfRk9DVVNBQkxFX0xJU1RfRElSRUNUSVZFLFxuICAgIEZvY3VzYWJsZUl0ZW1EaXJlY3RpdmUsXG4gICAgRm9jdXNhYmxlSXRlbVBvc2l0aW9uLFxuICAgIEtleVV0aWwsXG4gICAgUnRsU2VydmljZSxcbiAgICB1dWlkdjRcbn0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHsgQ29udGVudERlbnNpdHlPYnNlcnZlciB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9jb250ZW50LWRlbnNpdHknO1xuaW1wb3J0IHsgVGFibGVSb3dEaXJlY3RpdmUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvdGFibGUnO1xuaW1wb3J0IHtcbiAgICBFZGl0YWJsZVRhYmxlQ2VsbCxcbiAgICBTZWxlY3Rpb25Nb2RlLFxuICAgIFNlbGVjdGlvbk1vZGVWYWx1ZSxcbiAgICBUYWJsZUNvbHVtbixcbiAgICBUYWJsZUNvbHVtblJlc2l6ZVNlcnZpY2UsXG4gICAgVGFibGVEcmFnZ2FibGVEaXJlY3RpdmUsXG4gICAgVGFibGVSb3csXG4gICAgVGFibGVSb3dLZXlib2FyZERyYWcsXG4gICAgVGFibGVSb3dTZXJ2aWNlLFxuICAgIFRhYmxlU2VydmljZSxcbiAgICBpc1RyZWVSb3dGaXJzdENlbGwsXG4gICAgaXNUcmVlUm93XG59IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvcGxhdGZvcm0vdGFibGUtaGVscGVycyc7XG5pbXBvcnQgeyBTdWJqZWN0LCBmcm9tRXZlbnQsIG1lcmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdbZmRwLXRhYmxlLXJvd10nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS1yb3cuY29tcG9uZW50Lmh0bWwnLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IEZES19GT0NVU0FCTEVfTElTVF9ESVJFQ1RJVkUsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogVGFibGVSb3dDb21wb25lbnRcbiAgICAgICAgfSxcbiAgICAgICAgRGVzdHJveWVkU2VydmljZVxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICByb2xlOiAncm93JyxcbiAgICAgICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ19pc1RyZWVSb3cocm93KSA/IHJvdy5leHBhbmRlZCA6IG51bGwnXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVJvd0NvbXBvbmVudDxUPiBleHRlbmRzIFRhYmxlUm93RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gICAgLyoqIFJvdyBJRC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHJvd0lkOiBzdHJpbmc7XG5cbiAgICAvKiogVGFibGUgUm93LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcm93OiBUYWJsZVJvdzxUPjtcblxuICAgIC8qKiBSb3cgaW5kZXguICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtcm93aW5kZXgnKVxuICAgIEBJbnB1dCgpXG4gICAgaW5kZXg6IG51bWJlcjtcblxuICAgIC8qKiBTZWxlY3Rpb24gbW9kZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNlbGVjdGlvbk1vZGU6IFNlbGVjdGlvbk1vZGVWYWx1ZTtcblxuICAgIC8qKiBTZWxlY3RhYmxlIGZsYWcga2V5LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2VsZWN0YWJsZUtleTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdG8gZW5hYmxlIGNoZWNrYm94IHRyaXN0YXRlIG1vZGUuICovXG4gICAgQElucHV0KClcbiAgICBlbmFibGVUcmlzdGF0ZU1vZGU6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGZpeCB0aGUgdGFibGUgaGVhZGVyIGFuZCBmb290ZXIuIERlZmF1bHQgaXMgdHJ1ZS5cbiAgICAgKiBOb3RlIHRoYXQgaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGZyZWV6YWJsZSBjb2x1bW5zLCB0aGUgaGVhZGVyIGFuZFxuICAgICAqIGZvb3RlciB3aWxsIGJlIGZpeGVkIGF1dG9tYXRpY2FsbHksIHJlZ2FyZGxlc3Mgb2YgdGhpcyBpbnB1dCB2YWx1ZS5cbiAgICAgKiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZml4ZWQ6IGJvb2xlYW47XG5cbiAgICAvKiogU2VsZWN0aW9uIGNvbHVtbiB3aWR0aC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNlbGVjdGlvbkNvbHVtbldpZHRoOiBudW1iZXI7XG5cbiAgICAvKiogVGhlIGNvbHVtbiBgbmFtZWAgdG8gZnJlZXplIGNvbHVtbnMgdXAgdG8gYW5kIGluY2x1ZGluZy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGZyZWV6ZUNvbHVtbnNUbzogc3RyaW5nO1xuXG4gICAgLyoqIFRoZSBjb2x1bW4gYG5hbWVgIHRvIGZyZWV6ZSBjb2x1bW5zIGFmdGVyIGFuZCBpbmNsdWRpbmcuICovXG4gICAgQElucHV0KClcbiAgICBmcmVlemVFbmRDb2x1bW5zVG86IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSByb3cgaXMgdHJlZSByb3cuICovXG4gICAgQElucHV0KClcbiAgICBpc1RyZWVSb3c6IGJvb2xlYW47XG5cbiAgICAvKiogV2hldGhlciB0aGUgY2VsbCBpcyBvbmx5IHJlbmRlcmluZyB3aXRoaW4gdmlld3BvcnQgKi9cbiAgICBASW5wdXQoKVxuICAgIG9ubHlSZW5kZXJWaXNpYmxlQ2VsbHM6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIHVzZSBwbGFjZWhvbGRlciBbZmQtYnVzeS1pbmRpY2F0b3JdIGZvciBjZWxscyB0aGF0IGFyZSBub3QgaW4gdGhlIHZpZXdwb3J0XG4gICAgICogVGhpcyBvcHRpb24gd29ya3Mgb25seSB3aGVuIGBvbmx5UmVuZGVyVmlzaWJsZUNlbGxzYCBpcyB0cnVlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB1c2VDZWxsUGxhY2Vob2xkZXIgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBrZXlib2FyZCBkcmFnIHBlcmZvcm1lZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBrZXlib2FyZERyYWcgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUm93S2V5Ym9hcmREcmFnPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfaGFzUm93SGVhZGVyQ29sdW1uID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oRkRLX0ZPQ1VTQUJMRV9JVEVNX0RJUkVDVElWRSlcbiAgICBwcml2YXRlIHNldCBfZm9jdXNhYmxlVmlld0NlbGxJdGVtcyhpdGVtczogUXVlcnlMaXN0PEZvY3VzYWJsZUl0ZW1EaXJlY3RpdmU+KSB7XG4gICAgICAgIHRoaXMuc2V0SXRlbXMoaXRlbXMpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZHJlbihFZGl0YWJsZVRhYmxlQ2VsbClcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lZGl0YWJsZUNlbGxzOiBRdWVyeUxpc3Q8RWRpdGFibGVUYWJsZUNlbGw+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1zZWxlY3RlZCcpXG4gICAgcHJpdmF0ZSBnZXQgX2FyaWFTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5yb3cuY2hlY2tlZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9ydGwgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3Jvd1NlbGVjdGlvbkhlbHBlclRleHRJZCA9IGByb3dTZWxlY3Rpb25IZWxwZXItJHt1dWlkdjQoKX1gO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWFkb25seSBfaXNUcmVlUm93Rmlyc3RDZWxsID0gaXNUcmVlUm93Rmlyc3RDZWxsO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWFkb25seSBTRUxFQ1RJT05fTU9ERSA9IFNlbGVjdGlvbk1vZGU7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlYWRvbmx5IF9jb250ZW50RGVuc2l0eU9ic2VydmVyID0gaW5qZWN0KENvbnRlbnREZW5zaXR5T2JzZXJ2ZXIpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWFkb25seSBfdGFibGVDb2x1bW5SZXNpemVTZXJ2aWNlID0gaW5qZWN0KFRhYmxlQ29sdW1uUmVzaXplU2VydmljZSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlZnJlc2hDaGlsZFJvd3MkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnRsU2VydmljZSA9IGluamVjdChSdGxTZXJ2aWNlLCB7XG4gICAgICAgIG9wdGlvbmFsOiB0cnVlXG4gICAgfSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlYWRvbmx5IF9mZHBUYWJsZVNlcnZpY2UgPSBpbmplY3QoVGFibGVTZXJ2aWNlKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVhZG9ubHkgX3RhYmxlUm93U2VydmljZSA9IGluamVjdChUYWJsZVJvd1NlcnZpY2UpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWFkb25seSBfaXNUcmVlUm93ID0gaXNUcmVlUm93O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsbVJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZG5kVGFibGVEaXJlY3RpdmUgPSBpbmplY3QoVGFibGVEcmFnZ2FibGVEaXJlY3RpdmUsIHtcbiAgICAgICAgb3B0aW9uYWw6IHRydWVcbiAgICB9KTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3J0bFNlcnZpY2U/LnJ0bC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgocnRsKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9ydGwgPSBydGw7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3RhYmxlQ29sdW1uUmVzaXplU2VydmljZS5yZXNpemVJblByb2dyZXNzJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuX3RhYmxlQ29sdW1uUmVzaXplU2VydmljZS5tYXJrRm9yQ2hlY2spLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4odGhpcy5fZWxtUmVmLm5hdGl2ZUVsZW1lbnQsICdrZXlkb3duJylcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+ICEhdGhpcy5fZG5kVGFibGVEaXJlY3RpdmUpLFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uS2V5RG93bihldmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMuX2ZkcFRhYmxlU2VydmljZS52aXNpYmxlQ29sdW1ucyQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKGNvbHVtbnMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2hhc1Jvd0hlYWRlckNvbHVtbiA9IGNvbHVtbnMuc29tZSgoYykgPT4gYy5yb2xlID09PSAncm93aGVhZGVyJyk7XG4gICAgICAgICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICAgICAgdGhpcy5fZWRpdGFibGVDZWxscy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG51bGwpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2VsbHMgPSB0aGlzLl9lZGl0YWJsZUNlbGxzLnRvQXJyYXkoKTtcbiAgICAgICAgICAgIGlmIChjZWxscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFibGVSb3dTZXJ2aWNlLnVwZGF0ZUVkaXRhYmxlQ2VsbHModGhpcy5yb3csIGNlbGxzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFibGVSb3dTZXJ2aWNlLnJlbW92ZUVkaXRhYmxlQ2VsbHModGhpcy5yb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XG4gICAgICAgIGlmICgncm93JyBpbiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5Ub1Jvd0V4cGFuc2lvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5fcmVmcmVzaENoaWxkUm93cyQubmV4dCgpO1xuICAgICAgICB0aGlzLl9yZWZyZXNoQ2hpbGRSb3dzJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl90YWJsZVJvd1NlcnZpY2UucmVtb3ZlRWRpdGFibGVDZWxscyh0aGlzLnJvdyk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgX2hhbmRsZUNlbGxTcGFjZUtleShjb2xJZHg6IG51bWJlciwgdGFibGVDZWxsRWxlbWVudDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQsICRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCRldmVudC50YXJnZXQgPT09IHRhYmxlQ2VsbEVsZW1lbnQgJiYgaXNUcmVlUm93Rmlyc3RDZWxsKGNvbElkeCwgdGhpcy5yb3csICRldmVudCkpIHtcbiAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlR3JvdXBSb3coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfbGlzdGVuVG9Sb3dFeHBhbnNpb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hDaGlsZFJvd3MkLm5leHQoKTtcbiAgICAgICAgY29uc3QgcmVmcmVzaCA9IG1lcmdlKHRoaXMuX3JlZnJlc2hDaGlsZFJvd3MkLCB0aGlzLl9kZXN0cm95JCk7XG4gICAgICAgIC8vIExvYWQgaXRlbXMgb25seSBvbmNlLiBGdXJ0aGVyIGxvYWRpbmcgd2lsbCBiZSBjb3ZlcmVkIGJ5IHRoZSBsYXp5IGxvYWRpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICAgICAgdGhpcy5yb3c/LmV4cGFuZGVkJFxuICAgICAgICAgICAgPy5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoZXhwYW5kZWQpID0+IGV4cGFuZGVkICYmIHRoaXMucm93LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHJlZnJlc2gpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl90YWJsZVJvd1NlcnZpY2UubG9hZENoaWxkUm93cyh0aGlzLnJvdyk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX29uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpc0Fycm93RG93biA9IEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBET1dOX0FSUk9XKTtcbiAgICAgICAgY29uc3QgaXNBcnJvd1VwID0gS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIFVQX0FSUk9XKTtcblxuICAgICAgICBpZiAoIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0Fycm93RG93biAmJiAhaXNBcnJvd1VwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kbmRUYWJsZURpcmVjdGl2ZT8uZHJhZ1Jvd0Zyb21LZXlib2FyZChcbiAgICAgICAgICAgIGlzQXJyb3dEb3duID8gJ2Rvd24nIDogJ3VwJyxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgdGhpcy5pbmRleCxcbiAgICAgICAgICAgIGV2ZW50LnNoaWZ0S2V5ID8gJ2dyb3VwJyA6ICdzaGlmdCdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF90b2dnbGVHcm91cFJvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGFibGVSb3dTZXJ2aWNlLnRvZ2dsZVJvdyh7IHR5cGU6ICd0b2dnbGVSb3cnLCByb3c6IHRoaXMucm93IH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3RvZ2dsZVNpbmdsZVNlbGVjdGFibGVSb3coZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fdGFibGVSb3dTZXJ2aWNlLnRvZ2dsZVJvdyh7IHR5cGU6ICd0b2dnbGVTaW5nbGVTZWxlY3RhYmxlUm93Jywgcm93OiB0aGlzLnJvdyB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF90b2dnbGVNdWx0aVNlbGVjdFJvdyhyb3c6IFRhYmxlUm93PFQ+LCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl90YWJsZVJvd1NlcnZpY2UudG9nZ2xlUm93KHsgLi4ueyByb3csIGV2ZW50IH0sIC4uLnsgdHlwZTogJ3RvZ2dsZU11bHRpU2VsZWN0Um93JyB9IH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2NvbHVtblRyYWNrQnkoaW5kZXg6IG51bWJlciwgY29sdW1uOiBUYWJsZUNvbHVtbik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBjb2x1bW4ubmFtZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9pdGVtRm9jdXNlZEV2ZW50QW5ub3VuY2VyID0gKHBvc2l0aW9uOiBGb2N1c2FibGVJdGVtUG9zaXRpb24pOiBzdHJpbmcgPT4ge1xuICAgICAgICBsZXQgcmV0VmFsID0gYENvbHVtbiAke3Bvc2l0aW9uLmNvbEluZGV4ICsgMX0gb2YgJHtwb3NpdGlvbi50b3RhbENvbHN9LCBgO1xuICAgICAgICBsZXQgY29sdW1uO1xuICAgICAgICBpZiAodGhpcy5fZmRwVGFibGVTZXJ2aWNlPy52aXNpYmxlQ29sdW1ucyQpIHtcbiAgICAgICAgICAgIGxldCBjb2xJbmRleCA9IHBvc2l0aW9uLmNvbEluZGV4O1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ3NpbmdsZScgfHwgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgICAgICAgICAgY29sSW5kZXgtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbHVtbiA9IHRoaXMuX2ZkcFRhYmxlU2VydmljZS52aXNpYmxlQ29sdW1ucyQuZ2V0VmFsdWUoKVtjb2xJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbHVtbiAmJiAoY29sdW1uLl9mcmVlemVkIHx8IGNvbHVtbi5fZW5kRnJlZXplZCkpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbCArICdmaXhlZCwgJztcbiAgICAgICAgfVxuICAgICAgICByZXRWYWwgPSByZXRWYWwgKyBgcm93OiAke3Bvc2l0aW9uLnJvd0luZGV4ICsgMX0gb2YgJHtwb3NpdGlvbi50b3RhbFJvd3N9YDtcbiAgICAgICAgaWYgKHRoaXMuaXNUcmVlUm93IHx8IHRoaXMucm93LmxldmVsID4gMCkge1xuICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsICsgJywgbGV2ZWwgJyArICh0aGlzLnJvdy5sZXZlbCArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfTtcbn1cbiIsIjxuZy10ZW1wbGF0ZSAjZmFsbGJhY2tDb250ZW50PlxuICAgIDxmZC1idXN5LWluZGljYXRvciAqbmdJZj1cInVzZUNlbGxQbGFjZWhvbGRlclwiIFtsb2FkaW5nXT1cInRydWVcIiBzaXplPVwic1wiIFtibG9ja109XCJ0cnVlXCI+IDwvZmQtYnVzeS1pbmRpY2F0b3I+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgICAqbmdJZj1cIm9ubHlSZW5kZXJWaXNpYmxlQ2VsbHM7IGVsc2UgdGRQcmltYXJ5Q29udGVudFwiXG4gICAgZmRwT25seVJlbmRlclZpc2libGVDZWxsXG4gICAgW3RhYmxlVmlld3BvcnRdPVwidGRQcmltYXJ5Q29udGVudFwiXG4gICAgW3ZpZXdwb3J0RmFsbGJhY2tdPVwiZmFsbGJhY2tDb250ZW50XCJcbj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwidGRQcmltYXJ5Q29udGVudFwiPjwvbmctdGVtcGxhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RkUHJpbWFyeUNvbnRlbnQ+XG4gICAgPHRkXG4gICAgICAgICpuZ0lmPVwiX2ZkcFRhYmxlU2VydmljZS5fc2VtYW50aWNIaWdobGlnaHRpbmckIHwgYXN5bmMgYXMgc2VtYW50aWNIaWdobGlnaHRpbmdcIlxuICAgICAgICBmZC10YWJsZS1jZWxsXG4gICAgICAgIGZkLXRhYmxlLXN0YXR1cy1pbmRpY2F0b3JcbiAgICAgICAgZmRrRGlzYWJsZWRcbiAgICAgICAgW2FkZERpc2FibGVkQ2xhc3NdPVwiZmFsc2VcIlxuICAgICAgICBbc3RhdHVzXT1cInJvdy52YWx1ZVtzZW1hbnRpY0hpZ2hsaWdodGluZ11cIlxuICAgICAgICBbY2VsbEZvY3VzZWRFdmVudEFubm91bmNlcl09XCJfaXRlbUZvY3VzZWRFdmVudEFubm91bmNlclwiXG4gICAgPjwvdGQ+XG5cbiAgICA8IS0tIGhpZGRlbiB0ZXh0IGZvciBzY3JlZW5yZWFkZXIgLS0+XG4gICAgPG5nLXRlbXBsYXRlICNzZWxlY3Rpb25TY3JlZW5SZWFkZXJUZXh0PlxuICAgICAgICA8c3BhblxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgIFthdHRyLmlkXT1cIl9yb3dTZWxlY3Rpb25IZWxwZXJUZXh0SWRcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUgIWltcG9ydGFudCcsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnMXB4JyxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzFweCcsXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIGNsaXA6ICdyZWN0KDFweCwgMXB4LCAxcHgsIDFweCknLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaydcbiAgICAgICAgICAgIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgICB7eyAocm93LmNoZWNrZWQgPyAncGxhdGZvcm1UYWJsZS5kZXNlbGVjdFNpbmdsZVJvdycgOiAncGxhdGZvcm1UYWJsZS5zZWxlY3RTaW5nbGVSb3cnKSB8IGZkVHJhbnNsYXRlIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSBSb3cgU2VsZWN0aW9uIENlbGwgLS0+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwic2VsZWN0aW9uTW9kZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJTRUxFQ1RJT05fTU9ERS5TSU5HTEVcIj5cbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICpuZ0lmPVwicm93LnZhbHVlW3NlbGVjdGFibGVLZXldICE9PSBmYWxzZTsgZWxzZSBzZWxlY3Rpb25Nb2NrXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLXRhYmxlX19jZWxsLS1jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZkLXRhYmxlX19jZWxsLS1maXhlZF09XCJmaXhlZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCJfaGFzUm93SGVhZGVyQ29sdW1uID8gJ3Jvd2hlYWRlcicgOiAnZ3JpZGNlbGwnXCJcbiAgICAgICAgICAgICAgICBmZC10YWJsZS1jZWxsXG4gICAgICAgICAgICAgICAgW2ZvY3VzYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbY2VsbEZvY3VzZWRFdmVudEFubm91bmNlcl09XCJfaXRlbUZvY3VzZWRFdmVudEFubm91bmNlclwiXG4gICAgICAgICAgICAgICAgW3N0eWxlXT1cIlxuICAgICAgICAgICAgICAgICAgICBfY29udGVudERlbnNpdHlPYnNlcnZlclxuICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBzZWxlY3Rpb25DZWxsU3R5bGVzIDogX3J0bCA6IChfZmRwVGFibGVTZXJ2aWNlLl9zZW1hbnRpY0hpZ2hsaWdodGluZ0NvbHVtbldpZHRoJCB8IGFzeW5jKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJyb3cuY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIl9yb3dTZWxlY3Rpb25IZWxwZXJUZXh0SWRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJfdG9nZ2xlU2luZ2xlU2VsZWN0YWJsZVJvdygpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJfdG9nZ2xlU2luZ2xlU2VsZWN0YWJsZVJvdygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJfdG9nZ2xlU2luZ2xlU2VsZWN0YWJsZVJvdygkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0aW9uU2NyZWVuUmVhZGVyVGV4dFwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJTRUxFQ1RJT05fTU9ERS5NVUxUSVBMRVwiPlxuICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJyb3cudmFsdWVbc2VsZWN0YWJsZUtleV0gIT09IGZhbHNlOyBlbHNlIHNlbGVjdGlvbk1vY2tcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtdGFibGVfX2NlbGwtLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtdGFibGVfX2NlbGwtLWZpeGVkXT1cImZpeGVkXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiY2VsbFwiXG4gICAgICAgICAgICAgICAgZmQtdGFibGUtY2VsbFxuICAgICAgICAgICAgICAgIFtmb2N1c2FibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2NlbGxGb2N1c2VkRXZlbnRBbm5vdW5jZXJdPVwiX2l0ZW1Gb2N1c2VkRXZlbnRBbm5vdW5jZXJcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIl90b2dnbGVNdWx0aVNlbGVjdFJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIl90b2dnbGVNdWx0aVNlbGVjdFJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwicm93LmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJfcm93U2VsZWN0aW9uSGVscGVyVGV4dElkXCJcbiAgICAgICAgICAgICAgICBbc3R5bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgIF9jb250ZW50RGVuc2l0eU9ic2VydmVyXG4gICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICB8IHNlbGVjdGlvbkNlbGxTdHlsZXMgOiBfcnRsIDogKF9mZHBUYWJsZVNlcnZpY2UuX3NlbWFudGljSGlnaGxpZ2h0aW5nQ29sdW1uV2lkdGgkIHwgYXN5bmMpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0aW9uU2NyZWVuUmVhZGVyVGV4dFwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPGZkLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgIHRhYkluZGV4VmFsdWU9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJmZC10YWJsZV9fY2hlY2tib3gtbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBbdHJpc3RhdGVdPVwiZW5hYmxlVHJpc3RhdGVNb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgW3RyaXN0YXRlU2VsZWN0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5jaGVja2VkJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiX3RvZ2dsZU11bHRpU2VsZWN0Um93KHJvdylcIlxuICAgICAgICAgICAgICAgID48L2ZkLWNoZWNrYm94PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGUgI3NlbGVjdGlvbk1vY2s+XG4gICAgICAgIDx0ZFxuICAgICAgICAgICAgY2xhc3M9XCJmZC10YWJsZV9fY2VsbC0tY2hlY2tib3hcIlxuICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgIGZkLXRhYmxlLWNlbGxcbiAgICAgICAgICAgIGZka0Rpc2FibGVkXG4gICAgICAgICAgICBbYWRkRGlzYWJsZWRDbGFzc109XCJmYWxzZVwiXG4gICAgICAgICAgICBbY2xhc3MuZmQtdGFibGVfX2NlbGwtLWZpeGVkXT1cImZpeGVkXCJcbiAgICAgICAgICAgIFtjZWxsRm9jdXNlZEV2ZW50QW5ub3VuY2VyXT1cIl9pdGVtRm9jdXNlZEV2ZW50QW5ub3VuY2VyXCJcbiAgICAgICAgPjwvdGQ+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDx0ZFxuICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgIGxldCBjb2x1bW4gb2YgX2ZkcFRhYmxlU2VydmljZS52aXNpYmxlQ29sdW1ucyQgfCBhc3luYztcbiAgICAgICAgICAgIGxldCBjb2xJZHggPSBpbmRleDtcbiAgICAgICAgICAgIGxhc3QgYXMgaXNMYXN0O1xuICAgICAgICAgICAgdHJhY2tCeTogX2NvbHVtblRyYWNrQnlcbiAgICAgICAgXCJcbiAgICAgICAgI3RhYmxlQ2VsbEVsZW1lbnRcbiAgICAgICAgW2ZkcFRhYmxlQ2VsbFJlc2l6YWJsZV09XCJcbiAgICAgICAgICAgIGNvbElkeFxuICAgICAgICAgICAgICAgIHwgY29sdW1uUmVzaXphYmxlU2lkZVxuICAgICAgICAgICAgICAgICAgICA6IF9mZHBUYWJsZVNlcnZpY2UudmlzaWJsZUNvbHVtbnNMZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgOiAoX2ZkcFRhYmxlU2VydmljZS5faXNTaG93bk5hdmlnYXRpb25Db2x1bW4kIHwgYXN5bmMpID09PSB0cnVlXG4gICAgICAgIFwiXG4gICAgICAgIFtjb2x1bW5OYW1lXT1cImNvbHVtbi5uYW1lXCJcbiAgICAgICAgW2ZvY3VzYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgW2NlbGxGb2N1c2VkRXZlbnRBbm5vdW5jZXJdPVwiX2l0ZW1Gb2N1c2VkRXZlbnRBbm5vdW5jZXJcIlxuICAgICAgICBbYXR0ci5yb2xlXT1cImNvbHVtbi5yb2xlXCJcbiAgICAgICAgW2hlYWRlcnNdPVwicm93SWQgKyAnX18nICsgY29sdW1uLm5hbWVcIlxuICAgICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgICAgICAnZmRwLXRhYmxlX19jb2wtLScgKyBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgIGNvbHVtbi5fZnJlZXplZCA/ICdmZC10YWJsZV9fY2VsbC0tZml4ZWQnIDogJycsXG4gICAgICAgICAgICBjb2x1bW4ubmFtZSA9PT0gZnJlZXplQ29sdW1uc1RvID8gJ2ZkLXRhYmxlX19jZWxsLS1maXhlZC1sYXN0JyA6ICcnLFxuICAgICAgICAgICAgY29sdW1uLl9lbmRGcmVlemVkID8gJ2ZkLXRhYmxlX19jZWxsLS1maXhlZC1lbmQnIDogJycsXG4gICAgICAgICAgICBjb2x1bW4ubmFtZSA9PT0gZnJlZXplRW5kQ29sdW1uc1RvID8gJ2ZkLXRhYmxlX19jZWxsLS1maXhlZC1lbmQtbGFzdCcgOiAnJyxcbiAgICAgICAgICAgIHJvdy5pc1RyZWUgJiYgY29sSWR4ID09PSAwID8gJ2ZkLXRhYmxlX19jZWxsLS1leHBhbmQnIDogJycsXG4gICAgICAgICAgICBpc0xhc3QgJiYgKF9mZHBUYWJsZVNlcnZpY2UuX2lzU2hvd25OYXZpZ2F0aW9uQ29sdW1uJCB8IGFzeW5jKSA9PT0gZmFsc2UgPyAnaXMtbGFzdC1jaGlsZCcgOiAnJ1xuICAgICAgICBdXCJcbiAgICAgICAgW25nU3R5bGVdPVwiXG4gICAgICAgICAgICBjb2x1bW5cbiAgICAgICAgICAgICAgICB8IHRhYmxlQ2VsbFN0eWxlc1xuICAgICAgICAgICAgICAgICAgICA6IF9ydGxcbiAgICAgICAgICAgICAgICAgICAgOiAoX2ZkcFRhYmxlU2VydmljZS5fc2VtYW50aWNIaWdobGlnaHRpbmdDb2x1bW5XaWR0aCQgfCBhc3luYylcbiAgICAgICAgICAgICAgICAgICAgOiBzZWxlY3Rpb25Db2x1bW5XaWR0aFxuICAgICAgICAgICAgICAgICAgICA6IGNvbHVtbi5fZnJlZXplZFxuICAgICAgICAgICAgICAgICAgICA6IGNvbHVtbi5fZW5kRnJlZXplZFxuICAgICAgICAgICAgICAgICAgICA6IF90YWJsZUNvbHVtblJlc2l6ZVNlcnZpY2UuZ2V0UHJldkNvbHVtbnNXaWR0aChjb2x1bW4ubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgOiBfdGFibGVDb2x1bW5SZXNpemVTZXJ2aWNlLmdldENvbHVtbldpZHRoU3R5bGUoY29sdW1uLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgIDogX3RhYmxlQ29sdW1uUmVzaXplU2VydmljZS5nZXROZXh0Q29sdW1uc1dpZHRoKGNvbHVtbi5uYW1lKVxuICAgICAgICBcIlxuICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIl9pc1RyZWVSb3dGaXJzdENlbGwoY29sSWR4LCByb3cpID8gcm93LmV4cGFuZGVkIDogbnVsbFwiXG4gICAgICAgIFthdHRyLmRhdGEtbmVzdGluZy1sZXZlbF09XCJjb2xJZHggPT09IDAgPyByb3cubGV2ZWwgKyAxIDogbnVsbFwiXG4gICAgICAgIChjZWxsRm9jdXNlZCk9XCJfdGFibGVSb3dTZXJ2aWNlLmNlbGxGb2N1c2VkKCRldmVudCk7IF90YWJsZVJvd1NlcnZpY2UuY2VsbEFjdGl2YXRlKGNvbElkeCwgcm93KVwiXG4gICAgICAgIChjbGljayk9XCJfdGFibGVSb3dTZXJ2aWNlLmNlbGxDbGlja2VkKHsgaW5kZXg6IGNvbElkeCwgcm93IH0pXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiX2lzVHJlZVJvd0ZpcnN0Q2VsbChjb2xJZHgsIHJvdywgJGV2ZW50KSAmJiBfdG9nZ2xlR3JvdXBSb3coKVwiXG4gICAgICAgIChrZXlkb3duLmFycm93TGVmdCk9XCJfdGFibGVSb3dTZXJ2aWNlLnNjcm9sbFRvT3ZlcmxhcHBlZENlbGwoKVwiXG4gICAgICAgIChrZXlkb3duLmFycm93UmlnaHQpPVwiX3RhYmxlUm93U2VydmljZS5zY3JvbGxUb092ZXJsYXBwZWRDZWxsKClcIlxuICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJfaGFuZGxlQ2VsbFNwYWNlS2V5KGNvbElkeCwgdGFibGVDZWxsRWxlbWVudCwgJGV2ZW50KVwiXG4gICAgPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3ByaW1hcnlUZXh0Q29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mZC10YWJsZV9fdGV4dF09XCJjb2x1bW4uYXBwbHlUZXh0XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtdGFibGVfX3RleHQtLW5vLXdyYXBdPVwiY29sdW1uLmFwcGx5VGV4dFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZkLXRhYmxlX19jZWxsLS10cnVuY2F0ZS10eHRdPVwiY29sdW1uLmFwcGx5VGV4dFwiXG4gICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlVGV4dENvbnRhaW5lci5vZmZzZXRXaWR0aCA8IHRhYmxlVGV4dENvbnRhaW5lci5zY3JvbGxXaWR0aFxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0YWJsZVRleHRDb250YWluZXIudGV4dENvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgI3RhYmxlVGV4dENvbnRhaW5lclxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiX2lzVHJlZVJvd0ZpcnN0Q2VsbChjb2xJZHgsIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZkLXRhYmxlX19leHBhbmRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZmQtdGFibGVfX2V4cGFuZC0tb3Blbl09XCJyb3cuZXhwYW5kZWQkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgID48L3NwYW4+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LnN0YXRlID09PSAncmVhZG9ubHknOyBlbHNlIGVkaXRNb2RlQ2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0YWJsZVRleHRDb250YWluZXI/LnRleHRDb250ZW50Py50cmltKCkgPT09ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxcHg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDFweDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcDogcmVjdCgxcHggMXB4IDFweCAxcHgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXA6IHJlY3QoMXB4LCAxcHgsIDFweCwgMXB4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+e3sgJ3BsYXRmb3JtVGFibGUuZW1wdHlDZWxsJyB8IGZkVHJhbnNsYXRlIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbj8uY29sdW1uQ2VsbFRlbXBsYXRlOyBlbHNlIGRlZmF1bHRUYWJsZUNlbGxUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5jb2x1bW5DZWxsVGVtcGxhdGUhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7ICRpbXBsaWNpdDogcm93LnZhbHVlLCBwb3BwaW5nOiBmYWxzZSwgcm93SW5kZXg6IHJvdy5pbmRleCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGFibGVDZWxsVGVtcGxhdGU+e3sgcm93LnZhbHVlIHwgdmFsdWVCeVBhdGggOiBjb2x1bW4ua2V5IH19PC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWRpdE1vZGVDZWxsPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uPy5lZGl0YWJsZUNvbHVtbkNlbGxUZW1wbGF0ZTsgZWxzZSBkZWZhdWx0RWRpdGFibGVUYWJsZUNlbGxUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5lZGl0YWJsZUNvbHVtbkNlbGxUZW1wbGF0ZSE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3cudmFsdWUsIHBvcHBpbmc6IGZhbHNlLCByb3dJbmRleDogcm93LmluZGV4IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRFZGl0YWJsZVRhYmxlQ2VsbFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGZkcC10YWJsZS1lZGl0YWJsZS1jZWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uVmFsdWVdPVwicm93LnZhbHVlIHwgdmFsdWVCeVBhdGggOiBjb2x1bW4ua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2ZkcC10YWJsZS1lZGl0YWJsZS1jZWxsPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICpuZ0lmPVwib25seVJlbmRlclZpc2libGVDZWxsczsgZWxzZSBwcmltYXJ5VGV4dENvbnRhaW5lclwiXG4gICAgICAgICAgICBmZHBPbmx5UmVuZGVyVmlzaWJsZUNlbGxcbiAgICAgICAgICAgIFt0YWJsZVZpZXdwb3J0XT1cInByaW1hcnlUZXh0Q29udGFpbmVyXCJcbiAgICAgICAgICAgIFt2aWV3cG9ydEZhbGxiYWNrXT1cImZhbGxiYWNrQ29udGVudFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJwcmltYXJ5VGV4dENvbnRhaW5lclwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC90ZD5cblxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblxuICAgIDx0ZFxuICAgICAgICAqbmdJZj1cIl9mZHBUYWJsZVNlcnZpY2UuX2lzU2hvd25OYXZpZ2F0aW9uQ29sdW1uJCB8IGFzeW5jXCJcbiAgICAgICAgZmQtdGFibGUtY2VsbFxuICAgICAgICBjbGFzcz1cImZkcC10YWJsZV9fY2VsbC0tbmF2aWdhdGlvbiBpcy1sYXN0LWNoaWxkXCJcbiAgICAgICAgZmRrRGlzYWJsZWRcbiAgICAgICAgW2FkZERpc2FibGVkQ2xhc3NdPVwiZmFsc2VcIlxuICAgICAgICBbY2VsbEZvY3VzZWRFdmVudEFubm91bmNlcl09XCJfaXRlbUZvY3VzZWRFdmVudEFubm91bmNlclwiXG4gICAgPlxuICAgICAgICA8aVxuICAgICAgICAgICAgKm5nSWY9XCJyb3cubmF2aWdhdGFibGVcIlxuICAgICAgICAgICAgZmQtdGFibGUtaWNvblxuICAgICAgICAgICAgW25hdmlnYXRpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiX3J0bCA/ICdzYXAtaWNvbi0tc2xpbS1hcnJvdy1sZWZ0JyA6ICdzYXAtaWNvbi0tc2xpbS1hcnJvdy1yaWdodCdcIlxuICAgICAgICAgICAgY2xhc3M9XCJmZHAtdGFibGVfX25hdmlnYXRpb24taW5kaWNhdG9yXCJcbiAgICAgICAgPjwvaT5cbiAgICA8L3RkPlxuXG4gICAgPHRkXG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgIGNsYXNzPVwiZmQtdGFibGVfX2NlbGwgZmQtdGFibGVfX2NlbGwtLW1vY2tcIlxuICAgICAgICBbY2xhc3MuZmQtdGFibGVfX2NlbGwtLW1vY2stYm9yZGVybGVzc109XCIoX3RhYmxlQ29sdW1uUmVzaXplU2VydmljZS5jZWxsTW9ja1Zpc2libGUkIHwgYXN5bmMpICE9PSB0cnVlXCJcbiAgICAgICAgZmRrRGlzYWJsZWRcbiAgICAgICAgW2FkZERpc2FibGVkQ2xhc3NdPVwiZmFsc2VcIlxuICAgID48L3RkPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
259
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL3RhYmxlLXJvdy90YWJsZS1yb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL3RhYmxlL2NvbXBvbmVudHMvdGFibGUtcm93L3RhYmxlLXJvdy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUNMLE1BQU0sRUFJTixNQUFNLEVBQ04sU0FBUyxFQUVULFlBQVksRUFDWixpQkFBaUIsRUFDakIsTUFBTSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxnQkFBZ0IsRUFDaEIsNEJBQTRCLEVBQzVCLDRCQUE0QixFQUc1QixPQUFPLEVBQ1AsVUFBVSxFQUNWLE1BQU0sRUFDVCxNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFDSCxpQkFBaUIsRUFDakIsYUFBYSxFQUdiLHdCQUF3QixFQUN4Qix1QkFBdUIsRUFHdkIsZUFBZSxFQUNmLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsU0FBUyxFQUNaLE1BQU0seUNBQXlDLENBQUM7QUFDakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFD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QkFLTixhQUFhO3NCQURaLEtBQUs7Z0JBS04sa0JBQWtCO3NCQURqQixLQUFLO2dCQVNOLEtBQUs7c0JBREosS0FBSztnQkFLTixvQkFBb0I7c0JBRG5CLEtBQUs7Z0JBS04sZUFBZTtzQkFEZCxLQUFLO2dCQUtOLGtCQUFrQjtzQkFEakIsS0FBSztnQkFLTixTQUFTO3NCQURSLEtBQUs7Z0JBS04sc0JBQXNCO3NCQURyQixLQUFLO2dCQVFOLGtCQUFrQjtzQkFEakIsS0FBSztnQkFPTixZQUFZO3NCQURYLE1BQU07Z0JBUUssdUJBQXVCO3NCQURsQyxZQUFZO3VCQUFDLDRCQUE0QjtnQkFPekIsY0FBYztzQkFEOUIsWUFBWTt1QkFBQyxpQkFBaUI7Z0JBS25CLGFBQWE7c0JBRHhCLFdBQVc7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZyAqL1xuaW1wb3J0IHsgRE9XTl9BUlJPVywgVVBfQVJST1cgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIERlc3Ryb3llZFNlcnZpY2UsXG4gICAgRkRLX0ZPQ1VTQUJMRV9JVEVNX0RJUkVDVElWRSxcbiAgICBGREtfRk9DVVNBQkxFX0xJU1RfRElSRUNUSVZFLFxuICAgIEZvY3VzYWJsZUl0ZW1EaXJlY3RpdmUsXG4gICAgRm9jdXNhYmxlSXRlbVBvc2l0aW9uLFxuICAgIEtleVV0aWwsXG4gICAgUnRsU2VydmljZSxcbiAgICB1dWlkdjRcbn0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHsgQ29udGVudERlbnNpdHlPYnNlcnZlciB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9jb250ZW50LWRlbnNpdHknO1xuaW1wb3J0IHsgVGFibGVSb3dEaXJlY3RpdmUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvdGFibGUnO1xuaW1wb3J0IHtcbiAgICBFZGl0YWJsZVRhYmxlQ2VsbCxcbiAgICBTZWxlY3Rpb25Nb2RlLFxuICAgIFNlbGVjdGlvbk1vZGVWYWx1ZSxcbiAgICBUYWJsZUNvbHVtbixcbiAgICBUYWJsZUNvbHVtblJlc2l6ZVNlcnZpY2UsXG4gICAgVGFibGVEcmFnZ2FibGVEaXJlY3RpdmUsXG4gICAgVGFibGVSb3csXG4gICAgVGFibGVSb3dLZXlib2FyZERyYWcsXG4gICAgVGFibGVSb3dTZXJ2aWNlLFxuICAgIFRhYmxlU2VydmljZSxcbiAgICBpc1RyZWVSb3dGaXJzdENlbGwsXG4gICAgaXNUcmVlUm93XG59IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvcGxhdGZvcm0vdGFibGUtaGVscGVycyc7XG5pbXBvcnQgeyBTdWJqZWN0LCBmcm9tRXZlbnQsIG1lcmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdbZmRwLXRhYmxlLXJvd10nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS1yb3cuY29tcG9uZW50Lmh0bWwnLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IEZES19GT0NVU0FCTEVfTElTVF9ESVJFQ1RJVkUsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogVGFibGVSb3dDb21wb25lbnRcbiAgICAgICAgfSxcbiAgICAgICAgRGVzdHJveWVkU2VydmljZVxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICByb2xlOiAncm93JyxcbiAgICAgICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ19pc1RyZWVSb3cocm93KSA/IHJvdy5leHBhbmRlZCA6IG51bGwnXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVJvd0NvbXBvbmVudDxUPiBleHRlbmRzIFRhYmxlUm93RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gICAgLyoqIFJvdyBJRC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHJvd0lkOiBzdHJpbmc7XG5cbiAgICAvKiogVGFibGUgUm93LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcm93OiBUYWJsZVJvdzxUPjtcblxuICAgIC8qKiBSb3cgaW5kZXguICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtcm93aW5kZXgnKVxuICAgIEBJbnB1dCgpXG4gICAgaW5kZXg6IG51bWJlcjtcblxuICAgIC8qKiBTZWxlY3Rpb24gbW9kZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNlbGVjdGlvbk1vZGU6IFNlbGVjdGlvbk1vZGVWYWx1ZTtcblxuICAgIC8qKiBTZWxlY3RhYmxlIGZsYWcga2V5LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2VsZWN0YWJsZUtleTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdG8gZW5hYmxlIGNoZWNrYm94IHRyaXN0YXRlIG1vZGUuICovXG4gICAgQElucHV0KClcbiAgICBlbmFibGVUcmlzdGF0ZU1vZGU6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGZpeCB0aGUgdGFibGUgaGVhZGVyIGFuZCBmb290ZXIuIERlZmF1bHQgaXMgdHJ1ZS5cbiAgICAgKiBOb3RlIHRoYXQgaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGZyZWV6YWJsZSBjb2x1bW5zLCB0aGUgaGVhZGVyIGFuZFxuICAgICAqIGZvb3RlciB3aWxsIGJlIGZpeGVkIGF1dG9tYXRpY2FsbHksIHJlZ2FyZGxlc3Mgb2YgdGhpcyBpbnB1dCB2YWx1ZS5cbiAgICAgKiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZml4ZWQ6IGJvb2xlYW47XG5cbiAgICAvKiogU2VsZWN0aW9uIGNvbHVtbiB3aWR0aC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNlbGVjdGlvbkNvbHVtbldpZHRoOiBudW1iZXI7XG5cbiAgICAvKiogVGhlIGNvbHVtbiBgbmFtZWAgdG8gZnJlZXplIGNvbHVtbnMgdXAgdG8gYW5kIGluY2x1ZGluZy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGZyZWV6ZUNvbHVtbnNUbzogc3RyaW5nO1xuXG4gICAgLyoqIFRoZSBjb2x1bW4gYG5hbWVgIHRvIGZyZWV6ZSBjb2x1bW5zIGFmdGVyIGFuZCBpbmNsdWRpbmcuICovXG4gICAgQElucHV0KClcbiAgICBmcmVlemVFbmRDb2x1bW5zVG86IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSByb3cgaXMgdHJlZSByb3cuICovXG4gICAgQElucHV0KClcbiAgICBpc1RyZWVSb3c6IGJvb2xlYW47XG5cbiAgICAvKiogV2hldGhlciB0aGUgY2VsbCBpcyBvbmx5IHJlbmRlcmluZyB3aXRoaW4gdmlld3BvcnQgKi9cbiAgICBASW5wdXQoKVxuICAgIG9ubHlSZW5kZXJWaXNpYmxlQ2VsbHM6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIHVzZSBwbGFjZWhvbGRlciBbZmQtYnVzeS1pbmRpY2F0b3JdIGZvciBjZWxscyB0aGF0IGFyZSBub3QgaW4gdGhlIHZpZXdwb3J0XG4gICAgICogVGhpcyBvcHRpb24gd29ya3Mgb25seSB3aGVuIGBvbmx5UmVuZGVyVmlzaWJsZUNlbGxzYCBpcyB0cnVlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB1c2VDZWxsUGxhY2Vob2xkZXIgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBrZXlib2FyZCBkcmFnIHBlcmZvcm1lZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBrZXlib2FyZERyYWcgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUm93S2V5Ym9hcmREcmFnPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfaGFzUm93SGVhZGVyQ29sdW1uID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oRkRLX0ZPQ1VTQUJMRV9JVEVNX0RJUkVDVElWRSlcbiAgICBwcml2YXRlIHNldCBfZm9jdXNhYmxlVmlld0NlbGxJdGVtcyhpdGVtczogUXVlcnlMaXN0PEZvY3VzYWJsZUl0ZW1EaXJlY3RpdmU+KSB7XG4gICAgICAgIHRoaXMuc2V0SXRlbXMoaXRlbXMpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZHJlbihFZGl0YWJsZVRhYmxlQ2VsbClcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lZGl0YWJsZUNlbGxzOiBRdWVyeUxpc3Q8RWRpdGFibGVUYWJsZUNlbGw+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1zZWxlY3RlZCcpXG4gICAgcHJpdmF0ZSBnZXQgX2FyaWFTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5yb3cuY2hlY2tlZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9ydGwgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3Jvd1NlbGVjdGlvbkhlbHBlclRleHRJZCA9IGByb3dTZWxlY3Rpb25IZWxwZXItJHt1dWlkdjQoKX1gO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWFkb25seSBfaXNUcmVlUm93Rmlyc3RDZWxsID0gaXNUcmVlUm93Rmlyc3RDZWxsO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWFkb25seSBTRUxFQ1RJT05fTU9ERSA9IFNlbGVjdGlvbk1vZGU7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlYWRvbmx5IF9jb250ZW50RGVuc2l0eU9ic2VydmVyID0gaW5qZWN0KENvbnRlbnREZW5zaXR5T2JzZXJ2ZXIpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWFkb25seSBfdGFibGVDb2x1bW5SZXNpemVTZXJ2aWNlID0gaW5qZWN0KFRhYmxlQ29sdW1uUmVzaXplU2VydmljZSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlZnJlc2hDaGlsZFJvd3MkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnRsU2VydmljZSA9IGluamVjdChSdGxTZXJ2aWNlLCB7XG4gICAgICAgIG9wdGlvbmFsOiB0cnVlXG4gICAgfSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlYWRvbmx5IF9mZHBUYWJsZVNlcnZpY2UgPSBpbmplY3QoVGFibGVTZXJ2aWNlKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVhZG9ubHkgX3RhYmxlUm93U2VydmljZSA9IGluamVjdChUYWJsZVJvd1NlcnZpY2UpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWFkb25seSBfaXNUcmVlUm93ID0gaXNUcmVlUm93O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsbVJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZG5kVGFibGVEaXJlY3RpdmUgPSBpbmplY3QoVGFibGVEcmFnZ2FibGVEaXJlY3RpdmUsIHtcbiAgICAgICAgb3B0aW9uYWw6IHRydWVcbiAgICB9KTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3J0bFNlcnZpY2U/LnJ0bC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgocnRsKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9ydGwgPSBydGw7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3RhYmxlQ29sdW1uUmVzaXplU2VydmljZS5yZXNpemVJblByb2dyZXNzJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuX3RhYmxlQ29sdW1uUmVzaXplU2VydmljZS5tYXJrRm9yQ2hlY2spLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4odGhpcy5fZWxtUmVmLm5hdGl2ZUVsZW1lbnQsICdrZXlkb3duJylcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+ICEhdGhpcy5fZG5kVGFibGVEaXJlY3RpdmUpLFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uS2V5RG93bihldmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMuX2ZkcFRhYmxlU2VydmljZS52aXNpYmxlQ29sdW1ucyQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKGNvbHVtbnMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2hhc1Jvd0hlYWRlckNvbHVtbiA9IGNvbHVtbnMuc29tZSgoYykgPT4gYy5yb2xlID09PSAncm93aGVhZGVyJyk7XG4gICAgICAgICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICAgICAgdGhpcy5fZWRpdGFibGVDZWxscy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG51bGwpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2VsbHMgPSB0aGlzLl9lZGl0YWJsZUNlbGxzLnRvQXJyYXkoKTtcbiAgICAgICAgICAgIGlmIChjZWxscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFibGVSb3dTZXJ2aWNlLnVwZGF0ZUVkaXRhYmxlQ2VsbHModGhpcy5yb3csIGNlbGxzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFibGVSb3dTZXJ2aWNlLnJlbW92ZUVkaXRhYmxlQ2VsbHModGhpcy5yb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XG4gICAgICAgIGlmICgncm93JyBpbiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5Ub1Jvd0V4cGFuc2lvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5fcmVmcmVzaENoaWxkUm93cyQubmV4dCgpO1xuICAgICAgICB0aGlzLl9yZWZyZXNoQ2hpbGRSb3dzJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl90YWJsZVJvd1NlcnZpY2UucmVtb3ZlRWRpdGFibGVDZWxscyh0aGlzLnJvdyk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgX2hhbmRsZUNlbGxTcGFjZUtleShjb2xJZHg6IG51bWJlciwgdGFibGVDZWxsRWxlbWVudDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQsICRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCRldmVudC50YXJnZXQgPT09IHRhYmxlQ2VsbEVsZW1lbnQgJiYgaXNUcmVlUm93Rmlyc3RDZWxsKGNvbElkeCwgdGhpcy5yb3csICRldmVudCkpIHtcbiAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlR3JvdXBSb3coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfbGlzdGVuVG9Sb3dFeHBhbnNpb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hDaGlsZFJvd3MkLm5leHQoKTtcbiAgICAgICAgY29uc3QgcmVmcmVzaCA9IG1lcmdlKHRoaXMuX3JlZnJlc2hDaGlsZFJvd3MkLCB0aGlzLl9kZXN0cm95JCk7XG4gICAgICAgIC8vIExvYWQgaXRlbXMgb25seSBvbmNlLiBGdXJ0aGVyIGxvYWRpbmcgd2lsbCBiZSBjb3ZlcmVkIGJ5IHRoZSBsYXp5IGxvYWRpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICAgICAgdGhpcy5yb3c/LmV4cGFuZGVkJFxuICAgICAgICAgICAgPy5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoZXhwYW5kZWQpID0+IGV4cGFuZGVkICYmIHRoaXMucm93LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHJlZnJlc2gpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl90YWJsZVJvd1NlcnZpY2UubG9hZENoaWxkUm93cyh0aGlzLnJvdyk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX29uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpc0Fycm93RG93biA9IEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBET1dOX0FSUk9XKTtcbiAgICAgICAgY29uc3QgaXNBcnJvd1VwID0gS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIFVQX0FSUk9XKTtcblxuICAgICAgICBpZiAoIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0Fycm93RG93biAmJiAhaXNBcnJvd1VwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kbmRUYWJsZURpcmVjdGl2ZT8uZHJhZ1Jvd0Zyb21LZXlib2FyZChcbiAgICAgICAgICAgIGlzQXJyb3dEb3duID8gJ2Rvd24nIDogJ3VwJyxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgdGhpcy5pbmRleCxcbiAgICAgICAgICAgIGV2ZW50LnNoaWZ0S2V5ID8gJ2dyb3VwJyA6ICdzaGlmdCdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF90b2dnbGVHcm91cFJvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGFibGVSb3dTZXJ2aWNlLnRvZ2dsZVJvdyh7IHR5cGU6ICd0b2dnbGVSb3cnLCByb3c6IHRoaXMucm93IH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3RvZ2dsZVNpbmdsZVNlbGVjdGFibGVSb3coZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fdGFibGVSb3dTZXJ2aWNlLnRvZ2dsZVJvdyh7IHR5cGU6ICd0b2dnbGVTaW5nbGVTZWxlY3RhYmxlUm93Jywgcm93OiB0aGlzLnJvdyB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF90b2dnbGVNdWx0aVNlbGVjdFJvdyhyb3c6IFRhYmxlUm93PFQ+LCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl90YWJsZVJvd1NlcnZpY2UudG9nZ2xlUm93KHsgLi4ueyByb3csIGV2ZW50IH0sIC4uLnsgdHlwZTogJ3RvZ2dsZU11bHRpU2VsZWN0Um93JyB9IH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2NvbHVtblRyYWNrQnkoaW5kZXg6IG51bWJlciwgY29sdW1uOiBUYWJsZUNvbHVtbik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBjb2x1bW4ubmFtZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9pdGVtRm9jdXNlZEV2ZW50QW5ub3VuY2VyID0gKHBvc2l0aW9uOiBGb2N1c2FibGVJdGVtUG9zaXRpb24pOiBzdHJpbmcgPT4ge1xuICAgICAgICBsZXQgcmV0VmFsID0gYENvbHVtbiAke3Bvc2l0aW9uLmNvbEluZGV4ICsgMX0gb2YgJHtwb3NpdGlvbi50b3RhbENvbHN9LCBgO1xuICAgICAgICBsZXQgY29sdW1uO1xuICAgICAgICBpZiAodGhpcy5fZmRwVGFibGVTZXJ2aWNlPy52aXNpYmxlQ29sdW1ucyQpIHtcbiAgICAgICAgICAgIGxldCBjb2xJbmRleCA9IHBvc2l0aW9uLmNvbEluZGV4O1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ3NpbmdsZScgfHwgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgICAgICAgICAgY29sSW5kZXgtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbHVtbiA9IHRoaXMuX2ZkcFRhYmxlU2VydmljZS52aXNpYmxlQ29sdW1ucyQuZ2V0VmFsdWUoKVtjb2xJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbHVtbiAmJiAoY29sdW1uLl9mcmVlemVkIHx8IGNvbHVtbi5fZW5kRnJlZXplZCkpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbCArICdmaXhlZCwgJztcbiAgICAgICAgfVxuICAgICAgICByZXRWYWwgPSByZXRWYWwgKyBgcm93OiAke3Bvc2l0aW9uLnJvd0luZGV4ICsgMX0gb2YgJHtwb3NpdGlvbi50b3RhbFJvd3N9YDtcbiAgICAgICAgaWYgKHRoaXMuaXNUcmVlUm93IHx8IHRoaXMucm93LmxldmVsID4gMCkge1xuICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsICsgJywgbGV2ZWwgJyArICh0aGlzLnJvdy5sZXZlbCArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfTtcbn1cbiIsIjxuZy10ZW1wbGF0ZSAjZmFsbGJhY2tDb250ZW50PlxuICAgIDxmZC1idXN5LWluZGljYXRvciAqbmdJZj1cInVzZUNlbGxQbGFjZWhvbGRlclwiIFtsb2FkaW5nXT1cInRydWVcIiBzaXplPVwic1wiIFtibG9ja109XCJ0cnVlXCI+IDwvZmQtYnVzeS1pbmRpY2F0b3I+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgICAqbmdJZj1cIm9ubHlSZW5kZXJWaXNpYmxlQ2VsbHM7IGVsc2UgdGRQcmltYXJ5Q29udGVudFwiXG4gICAgZmRwT25seVJlbmRlclZpc2libGVDZWxsXG4gICAgW3RhYmxlVmlld3BvcnRdPVwidGRQcmltYXJ5Q29udGVudFwiXG4gICAgW3ZpZXdwb3J0RmFsbGJhY2tdPVwiZmFsbGJhY2tDb250ZW50XCJcbj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwidGRQcmltYXJ5Q29udGVudFwiPjwvbmctdGVtcGxhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RkUHJpbWFyeUNvbnRlbnQ+XG4gICAgPHRkXG4gICAgICAgICpuZ0lmPVwiX2ZkcFRhYmxlU2VydmljZS5fc2VtYW50aWNIaWdobGlnaHRpbmckIHwgYXN5bmMgYXMgc2VtYW50aWNIaWdobGlnaHRpbmdcIlxuICAgICAgICBmZC10YWJsZS1jZWxsXG4gICAgICAgIGZkLXRhYmxlLXN0YXR1cy1pbmRpY2F0b3JcbiAgICAgICAgZmRrRGlzYWJsZWRcbiAgICAgICAgW2FkZERpc2FibGVkQ2xhc3NdPVwiZmFsc2VcIlxuICAgICAgICBbc3RhdHVzXT1cInJvdy52YWx1ZVtzZW1hbnRpY0hpZ2hsaWdodGluZ11cIlxuICAgICAgICBbY2VsbEZvY3VzZWRFdmVudEFubm91bmNlcl09XCJfaXRlbUZvY3VzZWRFdmVudEFubm91bmNlclwiXG4gICAgPjwvdGQ+XG5cbiAgICA8IS0tIGhpZGRlbiB0ZXh0IGZvciBzY3JlZW5yZWFkZXIgLS0+XG4gICAgPG5nLXRlbXBsYXRlICNzZWxlY3Rpb25TY3JlZW5SZWFkZXJUZXh0PlxuICAgICAgICA8c3BhblxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgIFthdHRyLmlkXT1cIl9yb3dTZWxlY3Rpb25IZWxwZXJUZXh0SWRcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUgIWltcG9ydGFudCcsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnMXB4JyxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzFweCcsXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIGNsaXA6ICdyZWN0KDFweCwgMXB4LCAxcHgsIDFweCknLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaydcbiAgICAgICAgICAgIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgICB7eyAocm93LmNoZWNrZWQgPyAncGxhdGZvcm1UYWJsZS5kZXNlbGVjdFNpbmdsZVJvdycgOiAncGxhdGZvcm1UYWJsZS5zZWxlY3RTaW5nbGVSb3cnKSB8IGZkVHJhbnNsYXRlIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSBSb3cgU2VsZWN0aW9uIENlbGwgLS0+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwic2VsZWN0aW9uTW9kZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJTRUxFQ1RJT05fTU9ERS5TSU5HTEVcIj5cbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICpuZ0lmPVwicm93LnZhbHVlW3NlbGVjdGFibGVLZXldICE9PSBmYWxzZTsgZWxzZSBzZWxlY3Rpb25Nb2NrXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLXRhYmxlX19jZWxsLS1jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZkLXRhYmxlX19jZWxsLS1maXhlZF09XCJmaXhlZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCJfaGFzUm93SGVhZGVyQ29sdW1uID8gJ3Jvd2hlYWRlcicgOiAnZ3JpZGNlbGwnXCJcbiAgICAgICAgICAgICAgICBmZC10YWJsZS1jZWxsXG4gICAgICAgICAgICAgICAgW2ZvY3VzYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbY2VsbEZvY3VzZWRFdmVudEFubm91bmNlcl09XCJfaXRlbUZvY3VzZWRFdmVudEFubm91bmNlclwiXG4gICAgICAgICAgICAgICAgW3N0eWxlXT1cIlxuICAgICAgICAgICAgICAgICAgICBfY29udGVudERlbnNpdHlPYnNlcnZlclxuICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBzZWxlY3Rpb25DZWxsU3R5bGVzIDogX3J0bCA6IChfZmRwVGFibGVTZXJ2aWNlLl9zZW1hbnRpY0hpZ2hsaWdodGluZ0NvbHVtbldpZHRoJCB8IGFzeW5jKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJyb3cuY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIl9yb3dTZWxlY3Rpb25IZWxwZXJUZXh0SWRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJfdG9nZ2xlU2luZ2xlU2VsZWN0YWJsZVJvdygpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJfdG9nZ2xlU2luZ2xlU2VsZWN0YWJsZVJvdygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJfdG9nZ2xlU2luZ2xlU2VsZWN0YWJsZVJvdygkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0aW9uU2NyZWVuUmVhZGVyVGV4dFwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJTRUxFQ1RJT05fTU9ERS5NVUxUSVBMRVwiPlxuICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJyb3cudmFsdWVbc2VsZWN0YWJsZUtleV0gIT09IGZhbHNlOyBlbHNlIHNlbGVjdGlvbk1vY2tcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtdGFibGVfX2NlbGwtLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtdGFibGVfX2NlbGwtLWZpeGVkXT1cImZpeGVkXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiY2VsbFwiXG4gICAgICAgICAgICAgICAgZmQtdGFibGUtY2VsbFxuICAgICAgICAgICAgICAgIFtmb2N1c2FibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2NlbGxGb2N1c2VkRXZlbnRBbm5vdW5jZXJdPVwiX2l0ZW1Gb2N1c2VkRXZlbnRBbm5vdW5jZXJcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIl90b2dnbGVNdWx0aVNlbGVjdFJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIl90b2dnbGVNdWx0aVNlbGVjdFJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwicm93LmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJfcm93U2VsZWN0aW9uSGVscGVyVGV4dElkXCJcbiAgICAgICAgICAgICAgICBbc3R5bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgIF9jb250ZW50RGVuc2l0eU9ic2VydmVyXG4gICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICB8IHNlbGVjdGlvbkNlbGxTdHlsZXMgOiBfcnRsIDogKF9mZHBUYWJsZVNlcnZpY2UuX3NlbWFudGljSGlnaGxpZ2h0aW5nQ29sdW1uV2lkdGgkIHwgYXN5bmMpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0aW9uU2NyZWVuUmVhZGVyVGV4dFwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPGZkLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgIHRhYkluZGV4VmFsdWU9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJmZC10YWJsZV9fY2hlY2tib3gtbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBbdHJpc3RhdGVdPVwiZW5hYmxlVHJpc3RhdGVNb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgW3RyaXN0YXRlU2VsZWN0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5jaGVja2VkJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiX3RvZ2dsZU11bHRpU2VsZWN0Um93KHJvdylcIlxuICAgICAgICAgICAgICAgID48L2ZkLWNoZWNrYm94PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGUgI3NlbGVjdGlvbk1vY2s+XG4gICAgICAgIDx0ZFxuICAgICAgICAgICAgY2xhc3M9XCJmZC10YWJsZV9fY2VsbC0tY2hlY2tib3hcIlxuICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgIGZkLXRhYmxlLWNlbGxcbiAgICAgICAgICAgIGZka0Rpc2FibGVkXG4gICAgICAgICAgICBbYWRkRGlzYWJsZWRDbGFzc109XCJmYWxzZVwiXG4gICAgICAgICAgICBbY2xhc3MuZmQtdGFibGVfX2NlbGwtLWZpeGVkXT1cImZpeGVkXCJcbiAgICAgICAgICAgIFtjZWxsRm9jdXNlZEV2ZW50QW5ub3VuY2VyXT1cIl9pdGVtRm9jdXNlZEV2ZW50QW5ub3VuY2VyXCJcbiAgICAgICAgPjwvdGQ+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDx0ZFxuICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgIGxldCBjb2x1bW4gb2YgX2ZkcFRhYmxlU2VydmljZS52aXNpYmxlQ29sdW1ucyQgfCBhc3luYztcbiAgICAgICAgICAgIGxldCBjb2xJZHggPSBpbmRleDtcbiAgICAgICAgICAgIGxhc3QgYXMgaXNMYXN0O1xuICAgICAgICAgICAgdHJhY2tCeTogX2NvbHVtblRyYWNrQnlcbiAgICAgICAgXCJcbiAgICAgICAgI3RhYmxlQ2VsbEVsZW1lbnRcbiAgICAgICAgW2ZkcFRhYmxlQ2VsbFJlc2l6YWJsZV09XCJcbiAgICAgICAgICAgIGNvbElkeFxuICAgICAgICAgICAgICAgIHwgY29sdW1uUmVzaXphYmxlU2lkZVxuICAgICAgICAgICAgICAgICAgICA6IF9mZHBUYWJsZVNlcnZpY2UudmlzaWJsZUNvbHVtbnNMZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgOiAoX2ZkcFRhYmxlU2VydmljZS5faXNTaG93bk5hdmlnYXRpb25Db2x1bW4kIHwgYXN5bmMpID09PSB0cnVlXG4gICAgICAgIFwiXG4gICAgICAgIFtjb2x1bW5OYW1lXT1cImNvbHVtbi5uYW1lXCJcbiAgICAgICAgW2ZvY3VzYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgW2NlbGxGb2N1c2VkRXZlbnRBbm5vdW5jZXJdPVwiX2l0ZW1Gb2N1c2VkRXZlbnRBbm5vdW5jZXJcIlxuICAgICAgICBbYXR0ci5yb2xlXT1cImNvbHVtbi5yb2xlXCJcbiAgICAgICAgW2hlYWRlcnNdPVwicm93SWQgKyAnX18nICsgY29sdW1uLm5hbWVcIlxuICAgICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgICAgICAnZmRwLXRhYmxlX19jb2wtLScgKyBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgIGNvbHVtbi5fZnJlZXplZCA/ICdmZC10YWJsZV9fY2VsbC0tZml4ZWQnIDogJycsXG4gICAgICAgICAgICBjb2x1bW4ubmFtZSA9PT0gZnJlZXplQ29sdW1uc1RvID8gJ2ZkLXRhYmxlX19jZWxsLS1maXhlZC1sYXN0JyA6ICcnLFxuICAgICAgICAgICAgY29sdW1uLl9lbmRGcmVlemVkID8gJ2ZkLXRhYmxlX19jZWxsLS1maXhlZC1lbmQnIDogJycsXG4gICAgICAgICAgICBjb2x1bW4ubmFtZSA9PT0gZnJlZXplRW5kQ29sdW1uc1RvID8gJ2ZkLXRhYmxlX19jZWxsLS1maXhlZC1lbmQtbGFzdCcgOiAnJyxcbiAgICAgICAgICAgIHJvdy5pc1RyZWUgJiYgY29sSWR4ID09PSAwID8gJ2ZkLXRhYmxlX19jZWxsLS1leHBhbmQnIDogJycsXG4gICAgICAgICAgICBpc0xhc3QgJiYgKF9mZHBUYWJsZVNlcnZpY2UuX2lzU2hvd25OYXZpZ2F0aW9uQ29sdW1uJCB8IGFzeW5jKSA9PT0gZmFsc2UgPyAnaXMtbGFzdC1jaGlsZCcgOiAnJ1xuICAgICAgICBdXCJcbiAgICAgICAgW25nU3R5bGVdPVwiXG4gICAgICAgICAgICBjb2x1bW5cbiAgICAgICAgICAgICAgICB8IHRhYmxlQ2VsbFN0eWxlc1xuICAgICAgICAgICAgICAgICAgICA6IF9ydGxcbiAgICAgICAgICAgICAgICAgICAgOiAoX2ZkcFRhYmxlU2VydmljZS5fc2VtYW50aWNIaWdobGlnaHRpbmdDb2x1bW5XaWR0aCQgfCBhc3luYylcbiAgICAgICAgICAgICAgICAgICAgOiBzZWxlY3Rpb25Db2x1bW5XaWR0aFxuICAgICAgICAgICAgICAgICAgICA6IGNvbHVtbi5fZnJlZXplZFxuICAgICAgICAgICAgICAgICAgICA6IGNvbHVtbi5fZW5kRnJlZXplZFxuICAgICAgICAgICAgICAgICAgICA6IF90YWJsZUNvbHVtblJlc2l6ZVNlcnZpY2UuZ2V0UHJldkNvbHVtbnNXaWR0aChjb2x1bW4ubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgOiBfdGFibGVDb2x1bW5SZXNpemVTZXJ2aWNlLmdldENvbHVtbldpZHRoU3R5bGUoY29sdW1uLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgIDogX3RhYmxlQ29sdW1uUmVzaXplU2VydmljZS5nZXROZXh0Q29sdW1uc1dpZHRoKGNvbHVtbi5uYW1lKVxuICAgICAgICBcIlxuICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIl9pc1RyZWVSb3dGaXJzdENlbGwoY29sSWR4LCByb3cpID8gcm93LmV4cGFuZGVkIDogbnVsbFwiXG4gICAgICAgIFthdHRyLmRhdGEtbmVzdGluZy1sZXZlbF09XCJjb2xJZHggPT09IDAgPyByb3cubGV2ZWwgKyAxIDogbnVsbFwiXG4gICAgICAgIChjZWxsRm9jdXNlZCk9XCJfdGFibGVSb3dTZXJ2aWNlLmNlbGxGb2N1c2VkKCRldmVudCk7IF90YWJsZVJvd1NlcnZpY2UuY2VsbEFjdGl2YXRlKGNvbElkeCwgcm93KVwiXG4gICAgICAgIChjbGljayk9XCJfdGFibGVSb3dTZXJ2aWNlLmNlbGxDbGlja2VkKHsgaW5kZXg6IGNvbElkeCwgcm93IH0pXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiX2lzVHJlZVJvd0ZpcnN0Q2VsbChjb2xJZHgsIHJvdywgJGV2ZW50KSAmJiBfdG9nZ2xlR3JvdXBSb3coKVwiXG4gICAgICAgIChrZXlkb3duLmFycm93TGVmdCk9XCJfdGFibGVSb3dTZXJ2aWNlLnNjcm9sbFRvT3ZlcmxhcHBlZENlbGwoKVwiXG4gICAgICAgIChrZXlkb3duLmFycm93UmlnaHQpPVwiX3RhYmxlUm93U2VydmljZS5zY3JvbGxUb092ZXJsYXBwZWRDZWxsKClcIlxuICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJfaGFuZGxlQ2VsbFNwYWNlS2V5KGNvbElkeCwgdGFibGVDZWxsRWxlbWVudCwgJGV2ZW50KVwiXG4gICAgPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3ByaW1hcnlUZXh0Q29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mZC10YWJsZV9fdGV4dF09XCJjb2x1bW4uYXBwbHlUZXh0XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtdGFibGVfX3RleHQtLW5vLXdyYXBdPVwiY29sdW1uLmFwcGx5VGV4dFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZkLXRhYmxlX19jZWxsLS10cnVuY2F0ZS10eHRdPVwiY29sdW1uLmFwcGx5VGV4dFwiXG4gICAgICAgICAgICAgICAgI3RhYmxlVGV4dENvbnRhaW5lclxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiX2lzVHJlZVJvd0ZpcnN0Q2VsbChjb2xJZHgsIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZkLXRhYmxlX19leHBhbmRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZmQtdGFibGVfX2V4cGFuZC0tb3Blbl09XCJyb3cuZXhwYW5kZWQkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgID48L3NwYW4+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LnN0YXRlID09PSAncmVhZG9ubHknOyBlbHNlIGVkaXRNb2RlQ2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0YWJsZVRleHRDb250YWluZXI/LnRleHRDb250ZW50Py50cmltKCkgPT09ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxcHg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDFweDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcDogcmVjdCgxcHggMXB4IDFweCAxcHgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXA6IHJlY3QoMXB4LCAxcHgsIDFweCwgMXB4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+e3sgJ3BsYXRmb3JtVGFibGUuZW1wdHlDZWxsJyB8IGZkVHJhbnNsYXRlIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbj8uY29sdW1uQ2VsbFRlbXBsYXRlOyBlbHNlIGRlZmF1bHRUYWJsZUNlbGxUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5jb2x1bW5DZWxsVGVtcGxhdGUhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7ICRpbXBsaWNpdDogcm93LnZhbHVlLCBwb3BwaW5nOiBmYWxzZSwgcm93SW5kZXg6IHJvdy5pbmRleCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGFibGVDZWxsVGVtcGxhdGU+e3sgcm93LnZhbHVlIHwgdmFsdWVCeVBhdGggOiBjb2x1bW4ua2V5IH19PC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWRpdE1vZGVDZWxsPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uPy5lZGl0YWJsZUNvbHVtbkNlbGxUZW1wbGF0ZTsgZWxzZSBkZWZhdWx0RWRpdGFibGVUYWJsZUNlbGxUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5lZGl0YWJsZUNvbHVtbkNlbGxUZW1wbGF0ZSE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3cudmFsdWUsIHBvcHBpbmc6IGZhbHNlLCByb3dJbmRleDogcm93LmluZGV4IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRFZGl0YWJsZVRhYmxlQ2VsbFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGZkcC10YWJsZS1lZGl0YWJsZS1jZWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uVmFsdWVdPVwicm93LnZhbHVlIHwgdmFsdWVCeVBhdGggOiBjb2x1bW4ua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2ZkcC10YWJsZS1lZGl0YWJsZS1jZWxsPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICpuZ0lmPVwib25seVJlbmRlclZpc2libGVDZWxsczsgZWxzZSBwcmltYXJ5VGV4dENvbnRhaW5lclwiXG4gICAgICAgICAgICBmZHBPbmx5UmVuZGVyVmlzaWJsZUNlbGxcbiAgICAgICAgICAgIFt0YWJsZVZpZXdwb3J0XT1cInByaW1hcnlUZXh0Q29udGFpbmVyXCJcbiAgICAgICAgICAgIFt2aWV3cG9ydEZhbGxiYWNrXT1cImZhbGxiYWNrQ29udGVudFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJwcmltYXJ5VGV4dENvbnRhaW5lclwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC90ZD5cblxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblxuICAgIDx0ZFxuICAgICAgICAqbmdJZj1cIl9mZHBUYWJsZVNlcnZpY2UuX2lzU2hvd25OYXZpZ2F0aW9uQ29sdW1uJCB8IGFzeW5jXCJcbiAgICAgICAgZmQtdGFibGUtY2VsbFxuICAgICAgICBjbGFzcz1cImZkcC10YWJsZV9fY2VsbC0tbmF2aWdhdGlvbiBpcy1sYXN0LWNoaWxkXCJcbiAgICAgICAgZmRrRGlzYWJsZWRcbiAgICAgICAgW2FkZERpc2FibGVkQ2xhc3NdPVwiZmFsc2VcIlxuICAgICAgICBbY2VsbEZvY3VzZWRFdmVudEFubm91bmNlcl09XCJfaXRlbUZvY3VzZWRFdmVudEFubm91bmNlclwiXG4gICAgPlxuICAgICAgICA8aVxuICAgICAgICAgICAgKm5nSWY9XCJyb3cubmF2aWdhdGFibGVcIlxuICAgICAgICAgICAgZmQtdGFibGUtaWNvblxuICAgICAgICAgICAgW25hdmlnYXRpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiX3J0bCA/ICdzYXAtaWNvbi0tc2xpbS1hcnJvdy1sZWZ0JyA6ICdzYXAtaWNvbi0tc2xpbS1hcnJvdy1yaWdodCdcIlxuICAgICAgICAgICAgY2xhc3M9XCJmZHAtdGFibGVfX25hdmlnYXRpb24taW5kaWNhdG9yXCJcbiAgICAgICAgPjwvaT5cbiAgICA8L3RkPlxuXG4gICAgPHRkXG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgIGNsYXNzPVwiZmQtdGFibGVfX2NlbGwgZmQtdGFibGVfX2NlbGwtLW1vY2tcIlxuICAgICAgICBbY2xhc3MuZmQtdGFibGVfX2NlbGwtLW1vY2stYm9yZGVybGVzc109XCIoX3RhYmxlQ29sdW1uUmVzaXplU2VydmljZS5jZWxsTW9ja1Zpc2libGUkIHwgYXN5bmMpICE9PSB0cnVlXCJcbiAgICAgICAgZmRrRGlzYWJsZWRcbiAgICAgICAgW2FkZERpc2FibGVkQ2xhc3NdPVwiZmFsc2VcIlxuICAgID48L3RkPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -235,7 +235,13 @@ export class TableVirtualScrollDirective extends TableVirtualScroll {
235
235
  const tableContainer = this._table.tableContainer.nativeElement;
236
236
  let tableHeight = tableContainer.clientHeight;
237
237
  tableHeight = tableHeight - tableContainer.querySelector('thead').clientHeight;
238
- return Math.floor(tableHeight / (this.rowHeight + 2));
238
+ const numberOfRows = Math.floor(tableHeight / (this.rowHeight + 2));
239
+ if (this._table._tableRowsVisible.length < numberOfRows) {
240
+ return this._table._tableRowsVisible.length;
241
+ }
242
+ else {
243
+ return numberOfRows;
244
+ }
239
245
  }
240
246
  /**
241
247
  * @hidden
@@ -320,4 +326,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
320
326
  type: HostListener,
321
327
  args: ['keydown', ['$event']]
322
328
  }] } });
323
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtdmlydHVhbC1zY3JvbGwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL3RhYmxlLWhlbHBlcnMvZGlyZWN0aXZlcy90YWJsZS12aXJ0dWFsLXNjcm9sbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLGdCQUFnQixFQUF5QixPQUFPLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRTNGLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQWM5RCxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsa0JBQWtCO0lBWm5FOztRQWFJOztXQUVHO1FBRUgsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFtQnRCLHdFQUF3RTtRQUV4RSxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQU1qQjs7O1dBR0c7UUFFSCxjQUFT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QUF5QixFQUFFLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsWUFBWSxDQUFDO1FBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO1lBQ3RCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7WUFDOUIsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZO1NBQ25ELENBQUMsQ0FBQztJQUNQLENBQUM7O3dIQTFWUSwyQkFBMkI7NEdBQTNCLDJCQUEyQixvU0FSekI7UUFDUCxnQkFBZ0I7UUFDaEI7WUFDSSxPQUFPLEVBQUUsa0NBQWtDO1lBQzNDLFdBQVcsRUFBRSwyQkFBMkI7U0FDM0M7S0FDSjsyRkFFUSwyQkFBMkI7a0JBWnZDLFNBQVM7bUJBQUM7b0JBQ1AsOERBQThEO29CQUM5RCxRQUFRLEVBQUUsMEJBQTBCO29CQUNwQyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsU0FBUyxFQUFFO3dCQUNQLGdCQUFnQjt3QkFDaEI7NEJBQ0ksT0FBTyxFQUFFLGtDQUFrQzs0QkFDM0MsV0FBVyw2QkFBNkI7eUJBQzNDO3FCQUNKO2lCQUNKOzhCQU1HLGFBQWE7c0JBRFosS0FBSztnQkFTRixlQUFlO3NCQURsQixLQUFLO2dCQWNOLFdBQVc7c0JBRFYsS0FBSztnQkFLTixVQUFVO3NCQURULEtBQUs7Z0JBUU4sU0FBUztzQkFEUixLQUFLO2dCQStDTixlQUFlO3NCQURkLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0TGlzdGVuZXIsIGluamVjdCwgSW5wdXQsIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERlc3Ryb3llZFNlcnZpY2UsIEZvY3VzYWJsZUl0ZW1Qb3NpdGlvbiwgS2V5VXRpbCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL3V0aWxzJztcbmltcG9ydCB7IENvbnRlbnREZW5zaXR5TW9kZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9jb250ZW50LWRlbnNpdHknO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmaWx0ZXIsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRkRQX1RBQkxFX1ZJUlRVQUxfU0NST0xMX0RJUkVDVElWRSwgUk9XX0hFSUdIVCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBUYWJsZVZpcnR1YWxTY3JvbGwgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgVGFibGVTY3JvbGxEaXNwYXRjaGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3RhYmxlLXNjcm9sbC1kaXNwYXRjaGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tICcuLi90YWJsZSc7XG5pbXBvcnQgeyBET1dOX0FSUk9XLCBVUF9BUlJPVyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQgeyBUYWJsZVJvd1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy90YWJsZS1yb3cuc2VydmljZSc7XG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuXG5ARGlyZWN0aXZlKHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnZmRwLXRhYmxlW3ZpcnR1YWxTY3JvbGxdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBEZXN0cm95ZWRTZXJ2aWNlLFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBGRFBfVEFCTEVfVklSVFVBTF9TQ1JPTExfRElSRUNUSVZFLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IFRhYmxlVmlydHVhbFNjcm9sbERpcmVjdGl2ZVxuICAgICAgICB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVZpcnR1YWxTY3JvbGxEaXJlY3RpdmUgZXh0ZW5kcyBUYWJsZVZpcnR1YWxTY3JvbGwgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgICAvKiogV2hldGhlciB0byBzaG93IG9ubHkgdmlzaWJsZSByb3dzIGluIG1hdHRlciBvZiBwZXJmb3JtYW5jZVxuICAgICAqIGZhbHNlIGJ5IGRlZmF1bHQsIHdoZW4gdHJ1ZSBzZXR0aW5nIGJvZHlIZWlnaHQgYW5kIHJvd0hlaWdodCBpcyByZXF1aXJlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHZpcnR1YWxTY3JvbGwgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gc2Nyb2xsIHdob2xlIHJvd3MgcmF0aGVyIHRoYW4gcGl4ZWwgYnkgcGl4ZWwgd2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhIHNjcm9sbC5cbiAgICAgKiBUaGlzIGdpdmVzIGdyZWF0ZXIgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGJ1dCBhbHNvIGxlbmRzIHRvIHNvbWUgcG90ZW50aWFsbHkgdW5kZXNpcmFibGUgVVggY2hhbmdlcy5cbiAgICAgKiBBIFwicm93SGVpZ2h0XCIgbXVzdCBiZSBwcm92aWRlZCB3aGVuIHVzaW5nIHRoaXMgZmVhdHVyZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBzY3JvbGxXaG9sZVJvd3ModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc2Nyb2xsV2hvbGVSb3dzID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuX3Njcm9sbFdob2xlUm93cykge1xuICAgICAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBzY3JvbGxXaG9sZVJvd3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxXaG9sZVJvd3M7XG4gICAgfVxuXG4gICAgLyoqIENhY2hlIHNpemUgZm9yIHRoZSB2aXJ0dWFsU2Nyb2xsLCBkZWZhdWx0IGlzIDQwIGluIGVhY2ggZGlyZWN0aW9uICovXG4gICAgQElucHV0KClcbiAgICByZW5kZXJBaGVhZCA9IDQwO1xuXG4gICAgLyoqIEJvZHkgaGVpZ2h0LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYm9keUhlaWdodDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSGVpZ2h0IG9mIHRoZSByb3csIHJlcXVpcmVkIGZvciB0aGUgdmlydHVhbFNjcm9sbCxcbiAgICAgKiBkZWZhdWx0IGlzIDQ0cHggaW4gY296eSwgMzJweCBpbiBjb21wYWN0IGFuZCAyNHB4IGluIGNvbmRlbnNlZCAoc2V0IGF1dG9tYXRpY2FsbHkpXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICByb3dIZWlnaHQgPSBST1dfSEVJR0hULmdldChDb250ZW50RGVuc2l0eU1vZGUuQ09aWSkhO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICB2aXJ0dWFsU2Nyb2xsVG90YWxIZWlnaHQgPSAwO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICB2aXJ0dWFsU2Nyb2xsVHJhbnNmb3JtJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfdGFibGU6IFRhYmxlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF92aXJ0dWFsU2Nyb2xsQ2FjaGUgPSB7IHN0YXJ0Tm9kZUluZGV4OiAtMSwgdmlzaWJsZU5vZGVDb3VudDogLTEsIHRvdGFsTm9kZUNvdW50OiAtMSB9O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJsZVNjcm9sbERpc3BhdGNoZXIgPSBpbmplY3QoVGFibGVTY3JvbGxEaXNwYXRjaGVyU2VydmljZSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYmxlUm93U2VydmljZSA9IGluamVjdChUYWJsZVJvd1NlcnZpY2UpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95JCA9IGluamVjdChEZXN0cm95ZWRTZXJ2aWNlKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfd2hlZWxUaW1lb3V0OiBhbnk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Njcm9sbE1vY2tUaW1lb3V0OiBhbnk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2xhc3RNb2NrU2Nyb2xsUG9zaXRpb24gPSAwO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9mb2N1c2FibGVHcmlkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2ZvY3VzZWRDZWxsOiBGb2N1c2FibGVJdGVtUG9zaXRpb247XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3ByZXZpb3VzU3RhcnROb2RlSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zY3JvbGxXaG9sZVJvd3MgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgX2tleWRvd25IYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFdob2xlUm93cykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2ZvY3VzZWRDZWxsPy5yb3dJbmRleCA9PT0gMCAmJiBLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgVVBfQVJST1cpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RhYmxlLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgndHInKVsxXS5hcmlhUm93SW5kZXggIT09ICcwJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsVG9Gb2N1cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbEluZGV4OiB0aGlzLl9mb2N1c2VkQ2VsbC5jb2xJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiAxXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhYmxlLl9mb2N1c2FibGVHcmlkLmZvY3VzQ2VsbChjZWxsVG9Gb2N1cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFJvdygtMSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRDZWxsPy5yb3dJbmRleCA9PT0gdGhpcy5fZ2V0TnVtYmVyT2ZSb3dzVG9EaXNwbGF5KCkgJiZcbiAgICAgICAgICAgICAgICBLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRE9XTl9BUlJPVylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFJvdygxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFdob2xlUm93cyAmJiAhdGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fdGFibGUudGFibGVTY3JvbGxhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCAmJiAoY2hhbmdlc1sncm93SGVpZ2h0J10gfHwgY2hhbmdlc1sndmlydHVhbFNjcm9sbCddIHx8IGNoYW5nZXNbJ3JlbmRlckFoZWFkJ10pKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVZpcnR1YWxTY3JvbGxSb3dzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb2N1c2FibGVHcmlkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKiBTZXRzIHRhYmxlIHJlZmVyZW5jZS4gKi9cbiAgICBzZXRUYWJsZSh0YWJsZTogVGFibGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGFibGUgPSB0YWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaG93IG1hbnkgcm93cyBjYW4gYmUgZGlzcGxheWVkIGluIHRoZSB0YWJsZSwgYW5kIHNldHMgdGhlIHJvd3MgaW4gdGhlIHRhYmxlIGJhc2VkIG9uIHRoZVxuICAgICAqIHN0YXJ0IG5vZGUgaW5kZXgsIHdoaWNoIG1heSBjb21lIGZyb20gdGhlIHRhYmxlIHN0YXRlXG4gICAgICovXG4gICAgY2FsY3VsYXRlVmlydHVhbFNjcm9sbFJvd3MoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFdob2xlUm93cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9mb2N1c2FibGVHcmlkU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNhYmxlR3JpZFN1YnNjcmlwdGlvbiA9IHRoaXMuX3RhYmxlLl9mb2N1c2FibGVHcmlkLml0ZW1Gb2N1c2VkLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZENlbGwgPSBldmVudDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy52aXJ0dWFsU2Nyb2xsIHx8ICF0aGlzLmJvZHlIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBzdGFydE5vZGVJbmRleCA9IDA7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSB0aGlzLl90YWJsZS5nZXRUYWJsZVN0YXRlKCkuc2Nyb2xsVG9wUG9zaXRpb247XG4gICAgICAgICAgICBpZiAoc2Nyb2xsVG9wICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgc3RhcnROb2RlSW5kZXggPSBNYXRoLmZsb29yKHNjcm9sbFRvcCAvIHRoaXMucm93SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnROb2RlSW5kZXggPiB0aGlzLl90YWJsZS5fdGFibGVSb3dzVmlzaWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnROb2RlSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdG90YWxOb2RlQ291bnQgPSB0aGlzLl90YWJsZS5fdGFibGVSb3dzVmlzaWJsZS5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgdmlzaWJsZU5vZGVDb3VudCA9IE1hdGguZmxvb3IodGhpcy5fdGFibGUudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgLyB0aGlzLnJvd0hlaWdodCk7XG4gICAgICAgICAgICB2aXNpYmxlTm9kZUNvdW50ID0gTWF0aC5taW4odG90YWxOb2RlQ291bnQgLSBzdGFydE5vZGVJbmRleCwgdmlzaWJsZU5vZGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxUb3RhbEhlaWdodCA9IHRvdGFsTm9kZUNvdW50ICogdGhpcy5yb3dIZWlnaHQgLSB2aXNpYmxlTm9kZUNvdW50ICogdGhpcy5yb3dIZWlnaHQ7XG5cbiAgICAgICAgICAgIHRoaXMuX3NldFJvd3Moc3RhcnROb2RlSW5kZXgpO1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsTW9ja0NvbnRhaW5lciA9IHRoaXMuX3RhYmxlLnRhYmxlU2Nyb2xsTW9ja0NvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgc2Nyb2xsTW9ja0NvbnRhaW5lci5zdHlsZS5tYXhIZWlnaHQgPSB0aGlzLmJvZHlIZWlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbCB8fCAhdGhpcy5ib2R5SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByb3dIZWlnaHQgPSB0aGlzLnJvd0hlaWdodCArIDE7XG5cbiAgICAgICAgICAgIGNvbnN0IHJvd3NWaXNpYmxlID0gdGhpcy5fdGFibGUuX3RhYmxlUm93c1Zpc2libGU7XG4gICAgICAgICAgICBjb25zdCByb3dzSW5WaWV3UG9ydCA9IHRoaXMuX3RhYmxlLmdldFJvd3NJblZpZXdwb3J0KCk7XG4gICAgICAgICAgICBjb25zdCB0b3RhbE5vZGVDb3VudCA9IHJvd3NWaXNpYmxlLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IHRoaXMuX3RhYmxlLnRhYmxlU2Nyb2xsYWJsZS5nZXRTY3JvbGxUb3AoKTtcblxuICAgICAgICAgICAgbGV0IHN0YXJ0Tm9kZUluZGV4ID0gTWF0aC5mbG9vcihzY3JvbGxUb3AgLyByb3dIZWlnaHQpIC0gdGhpcy5yZW5kZXJBaGVhZDtcbiAgICAgICAgICAgIHN0YXJ0Tm9kZUluZGV4ID0gTWF0aC5tYXgoMCwgc3RhcnROb2RlSW5kZXgpO1xuXG4gICAgICAgICAgICBsZXQgdmlzaWJsZU5vZGVDb3VudCA9XG4gICAgICAgICAgICAgICAgTWF0aC5jZWlsKHRoaXMuX3RhYmxlLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0IC8gcm93SGVpZ2h0KSArIDIgKiB0aGlzLnJlbmRlckFoZWFkO1xuICAgICAgICAgICAgdmlzaWJsZU5vZGVDb3VudCA9IE1hdGgubWluKHRvdGFsTm9kZUNvdW50IC0gc3RhcnROb2RlSW5kZXgsIHZpc2libGVOb2RlQ291bnQpO1xuXG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxUcmFuc2Zvcm0kLm5leHQoc3RhcnROb2RlSW5kZXggKiByb3dIZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBTaW1wbGUgY2FjaGluZyB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJpbmdzXG4gICAgICAgICAgICBjb25zdCBpc0NhY2hlZCA9XG4gICAgICAgICAgICAgICAgc3RhcnROb2RlSW5kZXggPT09IHRoaXMuX3ZpcnR1YWxTY3JvbGxDYWNoZS5zdGFydE5vZGVJbmRleCAmJlxuICAgICAgICAgICAgICAgIHZpc2libGVOb2RlQ291bnQgPT09IHRoaXMuX3ZpcnR1YWxTY3JvbGxDYWNoZS52aXNpYmxlTm9kZUNvdW50ICYmXG4gICAgICAgICAgICAgICAgdG90YWxOb2RlQ291bnQgPT09IHRoaXMuX3ZpcnR1YWxTY3JvbGxDYWNoZS50b3RhbE5vZGVDb3VudCAmJlxuICAgICAgICAgICAgICAgIC8vIE9uIHJvd3MgY2hhbmdlLCBldmVuIGlmIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cyBpcyB0aGUgc2FtZSwgdGhlIHJvdyBvYmplY3Qgd2lsbCBiZSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICBzdGFydE5vZGVJbmRleCA9PT0gcm93c0luVmlld1BvcnRbMF07XG5cbiAgICAgICAgICAgIGlmIChpc0NhY2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fdmlydHVhbFNjcm9sbENhY2hlID0geyBzdGFydE5vZGVJbmRleCwgdmlzaWJsZU5vZGVDb3VudCwgdG90YWxOb2RlQ291bnQgfTtcbiAgICAgICAgICAgIHRoaXMudmlydHVhbFNjcm9sbFRvdGFsSGVpZ2h0ID0gdG90YWxOb2RlQ291bnQgKiByb3dIZWlnaHQgLSB2aXNpYmxlTm9kZUNvdW50ICogcm93SGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5fdGFibGUuc2V0Um93c0luVmlld3BvcnQoXG4gICAgICAgICAgICAgICAgc3RhcnROb2RlSW5kZXgsXG4gICAgICAgICAgICAgICAgcm93c1Zpc2libGUuc2xpY2Uoc3RhcnROb2RlSW5kZXgsIHN0YXJ0Tm9kZUluZGV4ICsgdmlzaWJsZU5vZGVDb3VudCkubGVuZ3RoXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEluaXRpYWxpc2VzIHNjcm9sbCBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgbGlzdGVuT25WaXJ0dWFsU2Nyb2xsKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxXaG9sZVJvd3MpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLl93aGVlbFNjcm9sbExpc3RlbmVyRnVuY3Rpb24sIHtcbiAgICAgICAgICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl90YWJsZS50YWJsZVNjcm9sbE1vY2tDb250YWluZXIubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICdzY3JvbGwnLFxuICAgICAgICAgICAgICAgIHRoaXMuX21vY2tTY3JvbGxiYXJMaXN0ZW5lckZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgIHsgcGFzc2l2ZTogZmFsc2UgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlU2Nyb2xsRGlzcGF0Y2hlclxuICAgICAgICAgICAgICAgIC52ZXJ0aWNhbGx5U2Nyb2xsZWQoKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy52aXJ0dWFsU2Nyb2xsICYmICEhdGhpcy5ib2R5SGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChzY3JvbGxhYmxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVmlydHVhbFNjcm9sbFJvd3MoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFibGUuc2V0VGFibGVTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLl90YWJsZS5nZXRUYWJsZVN0YXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3BQb3NpdGlvbjogc2Nyb2xsYWJsZS5nZXRTY3JvbGxUb3AoKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2V0TnVtYmVyT2ZSb3dzVG9EaXNwbGF5KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gdGhpcy5fdGFibGUudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgbGV0IHRhYmxlSGVpZ2h0ID0gdGFibGVDb250YWluZXIuY2xpZW50SGVpZ2h0O1xuICAgICAgICB0YWJsZUhlaWdodCA9IHRhYmxlSGVpZ2h0IC0gdGFibGVDb250YWluZXIucXVlcnlTZWxlY3RvcigndGhlYWQnKS5jbGllbnRIZWlnaHQ7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRhYmxlSGVpZ2h0IC8gKHRoaXMucm93SGVpZ2h0ICsgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHBlcmZvcm1zIGEgd2hlZWwgZXZlbnQuIEl0IGRldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHVzZXIgaGFzIHNjcm9sbGVkXG4gICAgICogdXAgb3IgZG93biB1c2luZyB0aGUgZXZlbnQncyBkZWx0YVggcHJvcGVydHksIGFuZCBzY3JvbGxzIHRoZSB0YWJsZSBieSBvbmUgcm93LlxuICAgICAqL1xuICAgIHByaXZhdGUgX3doZWVsU2Nyb2xsTGlzdGVuZXJGdW5jdGlvbiA9IChldmVudDogV2hlZWxFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoTWF0aC5hYnMoZXZlbnQuZGVsdGFYKSA8IE1hdGguYWJzKGV2ZW50LmRlbHRhWSkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93aGVlbFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fd2hlZWxUaW1lb3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IGV2ZW50LmRlbHRhWTtcbiAgICAgICAgICAgIGlmIChkZWx0YVkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93aGVlbFRpbWVvdXQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsUm93KGRlbHRhWSA+IDAgPyAxIDogLTEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBtb2NrIHNjcm9sbGJhciAod2hlbiB1c2luZyAnc2Nyb2xsV2hvbGVSb3dzJykgaXMgbW92ZWQuIEl0IGRldGVybWluZXMgaWYgdGhlXG4gICAgICogc2Nyb2xsIHdhcyB1cCBvciBkb3duIGJ5IGNvbXBhcmluZyB0aGUgY3VycmVudCBzY3JvbGwgdG9wIHRvIHRoZSBwcmV2aW91cyBzY3JvbGwgdG9wIGFuZCBzY3JvbGxzIHJvd3MgYWNjb3JkaW5nbHkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbW9ja1Njcm9sbGJhckxpc3RlbmVyRnVuY3Rpb24gPSAoZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5fc2Nyb2xsTW9ja1RpbWVvdXQpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9zY3JvbGxNb2NrVGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGVTY3JvbGxNb2NrQ29udGFpbmVyID0gdGhpcy5fdGFibGUudGFibGVTY3JvbGxNb2NrQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGxldCBkZWx0YVkgPSB0YWJsZVNjcm9sbE1vY2tDb250YWluZXIuc2Nyb2xsVG9wIC0gdGhpcy5fbGFzdE1vY2tTY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgZGVsdGFZID0gTWF0aC5jZWlsKGRlbHRhWSAvIHRoaXMucm93SGVpZ2h0KTtcbiAgICAgICAgdGhpcy5fc2Nyb2xsTW9ja1RpbWVvdXQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFJvdyhkZWx0YVksIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5fbGFzdE1vY2tTY3JvbGxQb3NpdGlvbiA9IHRhYmxlU2Nyb2xsTW9ja0NvbnRhaW5lci5zY3JvbGxUb3A7XG4gICAgICAgICAgICBpZiAodGFibGVTY3JvbGxNb2NrQ29udGFpbmVyLnNjcm9sbFRvcCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBkaXNwbGF5IHRoZSBmaXJzdCByb3cgb2YgdGhlIHRhYmxlIHdoZW4gdGhlIHVzZXIgc2Nyb2xscyBhbGwgdGhlIHdheSB0byB0aGUgdG9wXG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0Um93cygwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0YWJsZVNjcm9sbE1vY2tDb250YWluZXIuc2Nyb2xsVG9wICsgdGFibGVTY3JvbGxNb2NrQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCA9PT1cbiAgICAgICAgICAgICAgICB0YWJsZVNjcm9sbE1vY2tDb250YWluZXIuc2Nyb2xsSGVpZ2h0XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBBbHdheXMgZGlzcGxheSB0aGUgbGFzdCByb3dzIG9mIHRoZSB0YWJsZSB3aGVuIHRoZSB1c2VyIHNjcm9sbHMgYWxsIHRoZSB3YXkgdG8gdGhlIGJvdHRvbVxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0aW5nTm9kZUluZGV4ID0gdGhpcy5fdGFibGUuX3RhYmxlUm93c1Zpc2libGUubGVuZ3RoIC0gdGhpcy5fZ2V0TnVtYmVyT2ZSb3dzVG9EaXNwbGF5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0Um93cyhzdGFydGluZ05vZGVJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogVGhpcyBmdW5jdGlvbiwgdXNlZCBvbmx5IHdoZW4gJ3Njcm9sbFdob2xlUm93cycgaXMgdHJ1dGh5LCBjYWxjdWxhdGVzIHdoYXQgc2hvdWxkIGJlIHRoZSBuZXcgc3RhcnRpbmcgbm9kZSwgYmFzZWRcbiAgICAgKiBvZmYgdGhlIHByZXZpb3VzIHN0YXJ0aW5nIG5vZGUgYW5kIHRoZSBwcm92aWRlZCAnY291bnQnIHBhcmFtZXRlci4gRm9yIGV4YW1wbGUgaWYgdGhlIHByZXZpb3VzIHN0YXJ0IG5vZGUgd2FzIDEwXG4gICAgICogYW5kIHRoZSBjb3VudCBwYXJhbWV0ZXIgaXMgLTIsIHRoZSBuZXcgc3RhcnRpbmcgbm9kZSB3aWxsIGJlIDguIFRoaXMgZnVuY3Rpb24gYWxzbyBwcm9ncmFtbWF0aWNhbGx5IG1vdmVzIHRoZVxuICAgICAqIG1vY2sgc2Nyb2xsYmFyLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3Njcm9sbFJvdyhjb3VudDogbnVtYmVyLCBmcm9tTW9ja1Njcm9sbGJhckxpc3RlbmVyID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgbGV0IHN0YXJ0aW5nTm9kZSA9IDA7XG4gICAgICAgIGlmICh0aGlzLl9wcmV2aW91c1N0YXJ0Tm9kZUluZGV4ICE9PSBudWxsICYmIHRoaXMuX3ByZXZpb3VzU3RhcnROb2RlSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgc3RhcnRpbmdOb2RlID0gdGhpcy5fcHJldmlvdXNTdGFydE5vZGVJbmRleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBzdGFydGluZ05vZGUgKyBjb3VudCArIHRoaXMuX2dldE51bWJlck9mUm93c1RvRGlzcGxheSgpIDw9IHRoaXMuX3RhYmxlLl90YWJsZVJvd3NWaXNpYmxlLmxlbmd0aCB8fFxuICAgICAgICAgICAgY291bnQgPCAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgc3RhcnRpbmdOb2RlID0gTWF0aC5jZWlsKHN0YXJ0aW5nTm9kZSArIGNvdW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnRpbmdOb2RlIDwgMCkge1xuICAgICAgICAgICAgc3RhcnRpbmdOb2RlID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIG5leHQgJ2lmJyBzdGF0ZW1lbnQgaXMgZm9yIHRyaWdnZXJpbmcgbmV3IHBhZ2UgbG9hZHMgd2hlbiAncGFnZVNjcm9sbGluZycgaXMgdHJ1ZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb3VudCA+IDAgJiZcbiAgICAgICAgICAgIHN0YXJ0aW5nTm9kZSA9PT0gdGhpcy5fcHJldmlvdXNTdGFydE5vZGVJbmRleCAmJlxuICAgICAgICAgICAgdGhpcy5fdGFibGUucGFnZVNjcm9sbGluZyAmJlxuICAgICAgICAgICAgdGhpcy5fdGFibGUuX3RhYmxlUm93c1Zpc2libGUubGVuZ3RoID09PSB0aGlzLl90YWJsZS5fdGFibGVSb3dzLmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlLl9vblNweUludGVyc2VjdCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZXRSb3dzKHN0YXJ0aW5nTm9kZSk7XG4gICAgICAgIGNvbnN0IHRhYmxlU2Nyb2xsTW9ja0NvbnRhaW5lciA9IHRoaXMuX3RhYmxlLnRhYmxlU2Nyb2xsTW9ja0NvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAoIWZyb21Nb2NrU2Nyb2xsYmFyTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHRhYmxlU2Nyb2xsTW9ja0NvbnRhaW5lci5zY3JvbGxCeSh7IHRvcDogY291bnQgKiB0aGlzLnJvd0hlaWdodCB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9sYXN0TW9ja1Njcm9sbFBvc2l0aW9uID0gdGFibGVTY3JvbGxNb2NrQ29udGFpbmVyLnNjcm9sbFRvcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogVGhpcyBmdW5jdGlvbiBzZXRzIHJvd3MgaW4gdGhlIHRhYmxlJ3Mgdmlld3BvcnQgZGVwZW5kaW5nIG9uIHRoZSBwcm92aWRlZCBzdGFydGluZyBub2RlLiBJdCBhbHNvIHNldHMgdGhlIHRhYmxlXG4gICAgICogc3RhdGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0Um93cyhzdGFydGluZ05vZGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl90YWJsZS5zZXRSb3dzSW5WaWV3cG9ydChzdGFydGluZ05vZGUsIHRoaXMuX2dldE51bWJlck9mUm93c1RvRGlzcGxheSgpKTtcbiAgICAgICAgdGhpcy5fcHJldmlvdXNTdGFydE5vZGVJbmRleCA9IHN0YXJ0aW5nTm9kZTtcbiAgICAgICAgdGhpcy5fdGFibGUuc2V0VGFibGVTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLl90YWJsZS5nZXRUYWJsZVN0YXRlKCksXG4gICAgICAgICAgICBzY3JvbGxUb3BQb3NpdGlvbjogdGhpcy5yb3dIZWlnaHQgKiBzdGFydGluZ05vZGVcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
329
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtdmlydHVhbC1zY3JvbGwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL3RhYmxlLWhlbHBlcnMvZGlyZWN0aXZlcy90YWJsZS12aXJ0dWFsLXNjcm9sbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLGdCQUFnQixFQUF5QixPQUFPLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRTNGLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQWM5RCxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsa0JBQWtCO0lBWm5FOztRQWFJOztXQUVHO1FBRUgsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFtQnRCLHdFQUF3RTtRQUV4RSxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQU1qQjs7O1dBR0c7UUFFSCxjQUFT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SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERlc3Ryb3llZFNlcnZpY2UsIEZvY3VzYWJsZUl0ZW1Qb3NpdGlvbiwgS2V5VXRpbCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL3V0aWxzJztcbmltcG9ydCB7IENvbnRlbnREZW5zaXR5TW9kZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9jb250ZW50LWRlbnNpdHknO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmaWx0ZXIsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRkRQX1RBQkxFX1ZJUlRVQUxfU0NST0xMX0RJUkVDVElWRSwgUk9XX0hFSUdIVCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBUYWJsZVZpcnR1YWxTY3JvbGwgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgVGFibGVTY3JvbGxEaXNwYXRjaGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3RhYmxlLXNjcm9sbC1kaXNwYXRjaGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tICcuLi90YWJsZSc7XG5pbXBvcnQgeyBET1dOX0FSUk9XLCBVUF9BUlJPVyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQgeyBUYWJsZVJvd1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy90YWJsZS1yb3cuc2VydmljZSc7XG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuXG5ARGlyZWN0aXZlKHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnZmRwLXRhYmxlW3ZpcnR1YWxTY3JvbGxdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBEZXN0cm95ZWRTZXJ2aWNlLFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBGRFBfVEFCTEVfVklSVFVBTF9TQ1JPTExfRElSRUNUSVZFLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IFRhYmxlVmlydHVhbFNjcm9sbERpcmVjdGl2ZVxuICAgICAgICB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVZpcnR1YWxTY3JvbGxEaXJlY3RpdmUgZXh0ZW5kcyBUYWJsZVZpcnR1YWxTY3JvbGwgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgICAvKiogV2hldGhlciB0byBzaG93IG9ubHkgdmlzaWJsZSByb3dzIGluIG1hdHRlciBvZiBwZXJmb3JtYW5jZVxuICAgICAqIGZhbHNlIGJ5IGRlZmF1bHQsIHdoZW4gdHJ1ZSBzZXR0aW5nIGJvZHlIZWlnaHQgYW5kIHJvd0hlaWdodCBpcyByZXF1aXJlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHZpcnR1YWxTY3JvbGwgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gc2Nyb2xsIHdob2xlIHJvd3MgcmF0aGVyIHRoYW4gcGl4ZWwgYnkgcGl4ZWwgd2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhIHNjcm9sbC5cbiAgICAgKiBUaGlzIGdpdmVzIGdyZWF0ZXIgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGJ1dCBhbHNvIGxlbmRzIHRvIHNvbWUgcG90ZW50aWFsbHkgdW5kZXNpcmFibGUgVVggY2hhbmdlcy5cbiAgICAgKiBBIFwicm93SGVpZ2h0XCIgbXVzdCBiZSBwcm92aWRlZCB3aGVuIHVzaW5nIHRoaXMgZmVhdHVyZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBzY3JvbGxXaG9sZVJvd3ModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc2Nyb2xsV2hvbGVSb3dzID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuX3Njcm9sbFdob2xlUm93cykge1xuICAgICAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBzY3JvbGxXaG9sZVJvd3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxXaG9sZVJvd3M7XG4gICAgfVxuXG4gICAgLyoqIENhY2hlIHNpemUgZm9yIHRoZSB2aXJ0dWFsU2Nyb2xsLCBkZWZhdWx0IGlzIDQwIGluIGVhY2ggZGlyZWN0aW9uICovXG4gICAgQElucHV0KClcbiAgICByZW5kZXJBaGVhZCA9IDQwO1xuXG4gICAgLyoqIEJvZHkgaGVpZ2h0LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYm9keUhlaWdodDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSGVpZ2h0IG9mIHRoZSByb3csIHJlcXVpcmVkIGZvciB0aGUgdmlydHVhbFNjcm9sbCxcbiAgICAgKiBkZWZhdWx0IGlzIDQ0cHggaW4gY296eSwgMzJweCBpbiBjb21wYWN0IGFuZCAyNHB4IGluIGNvbmRlbnNlZCAoc2V0IGF1dG9tYXRpY2FsbHkpXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICByb3dIZWlnaHQgPSBST1dfSEVJR0hULmdldChDb250ZW50RGVuc2l0eU1vZGUuQ09aWSkhO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICB2aXJ0dWFsU2Nyb2xsVG90YWxIZWlnaHQgPSAwO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICB2aXJ0dWFsU2Nyb2xsVHJhbnNmb3JtJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfdGFibGU6IFRhYmxlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF92aXJ0dWFsU2Nyb2xsQ2FjaGUgPSB7IHN0YXJ0Tm9kZUluZGV4OiAtMSwgdmlzaWJsZU5vZGVDb3VudDogLTEsIHRvdGFsTm9kZUNvdW50OiAtMSB9O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJsZVNjcm9sbERpc3BhdGNoZXIgPSBpbmplY3QoVGFibGVTY3JvbGxEaXNwYXRjaGVyU2VydmljZSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYmxlUm93U2VydmljZSA9IGluamVjdChUYWJsZVJvd1NlcnZpY2UpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95JCA9IGluamVjdChEZXN0cm95ZWRTZXJ2aWNlKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfd2hlZWxUaW1lb3V0OiBhbnk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Njcm9sbE1vY2tUaW1lb3V0OiBhbnk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2xhc3RNb2NrU2Nyb2xsUG9zaXRpb24gPSAwO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9mb2N1c2FibGVHcmlkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2ZvY3VzZWRDZWxsOiBGb2N1c2FibGVJdGVtUG9zaXRpb247XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3ByZXZpb3VzU3RhcnROb2RlSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zY3JvbGxXaG9sZVJvd3MgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgX2tleWRvd25IYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFdob2xlUm93cykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2ZvY3VzZWRDZWxsPy5yb3dJbmRleCA9PT0gMCAmJiBLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgVVBfQVJST1cpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RhYmxlLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgndHInKVsxXS5hcmlhUm93SW5kZXggIT09ICcwJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsVG9Gb2N1cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbEluZGV4OiB0aGlzLl9mb2N1c2VkQ2VsbC5jb2xJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiAxXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhYmxlLl9mb2N1c2FibGVHcmlkLmZvY3VzQ2VsbChjZWxsVG9Gb2N1cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFJvdygtMSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRDZWxsPy5yb3dJbmRleCA9PT0gdGhpcy5fZ2V0TnVtYmVyT2ZSb3dzVG9EaXNwbGF5KCkgJiZcbiAgICAgICAgICAgICAgICBLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRE9XTl9BUlJPVylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFJvdygxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFdob2xlUm93cyAmJiAhdGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fdGFibGUudGFibGVTY3JvbGxhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCAmJiAoY2hhbmdlc1sncm93SGVpZ2h0J10gfHwgY2hhbmdlc1sndmlydHVhbFNjcm9sbCddIHx8IGNoYW5nZXNbJ3JlbmRlckFoZWFkJ10pKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVZpcnR1YWxTY3JvbGxSb3dzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb2N1c2FibGVHcmlkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKiBTZXRzIHRhYmxlIHJlZmVyZW5jZS4gKi9cbiAgICBzZXRUYWJsZSh0YWJsZTogVGFibGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGFibGUgPSB0YWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaG93IG1hbnkgcm93cyBjYW4gYmUgZGlzcGxheWVkIGluIHRoZSB0YWJsZSwgYW5kIHNldHMgdGhlIHJvd3MgaW4gdGhlIHRhYmxlIGJhc2VkIG9uIHRoZVxuICAgICAqIHN0YXJ0IG5vZGUgaW5kZXgsIHdoaWNoIG1heSBjb21lIGZyb20gdGhlIHRhYmxlIHN0YXRlXG4gICAgICovXG4gICAgY2FsY3VsYXRlVmlydHVhbFNjcm9sbFJvd3MoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFdob2xlUm93cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9mb2N1c2FibGVHcmlkU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNhYmxlR3JpZFN1YnNjcmlwdGlvbiA9IHRoaXMuX3RhYmxlLl9mb2N1c2FibGVHcmlkLml0ZW1Gb2N1c2VkLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZENlbGwgPSBldmVudDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy52aXJ0dWFsU2Nyb2xsIHx8ICF0aGlzLmJvZHlIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBzdGFydE5vZGVJbmRleCA9IDA7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSB0aGlzLl90YWJsZS5nZXRUYWJsZVN0YXRlKCkuc2Nyb2xsVG9wUG9zaXRpb247XG4gICAgICAgICAgICBpZiAoc2Nyb2xsVG9wICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgc3RhcnROb2RlSW5kZXggPSBNYXRoLmZsb29yKHNjcm9sbFRvcCAvIHRoaXMucm93SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnROb2RlSW5kZXggPiB0aGlzLl90YWJsZS5fdGFibGVSb3dzVmlzaWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnROb2RlSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdG90YWxOb2RlQ291bnQgPSB0aGlzLl90YWJsZS5fdGFibGVSb3dzVmlzaWJsZS5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgdmlzaWJsZU5vZGVDb3VudCA9IE1hdGguZmxvb3IodGhpcy5fdGFibGUudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgLyB0aGlzLnJvd0hlaWdodCk7XG4gICAgICAgICAgICB2aXNpYmxlTm9kZUNvdW50ID0gTWF0aC5taW4odG90YWxOb2RlQ291bnQgLSBzdGFydE5vZGVJbmRleCwgdmlzaWJsZU5vZGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxUb3RhbEhlaWdodCA9IHRvdGFsTm9kZUNvdW50ICogdGhpcy5yb3dIZWlnaHQgLSB2aXNpYmxlTm9kZUNvdW50ICogdGhpcy5yb3dIZWlnaHQ7XG5cbiAgICAgICAgICAgIHRoaXMuX3NldFJvd3Moc3RhcnROb2RlSW5kZXgpO1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsTW9ja0NvbnRhaW5lciA9IHRoaXMuX3RhYmxlLnRhYmxlU2Nyb2xsTW9ja0NvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgc2Nyb2xsTW9ja0NvbnRhaW5lci5zdHlsZS5tYXhIZWlnaHQgPSB0aGlzLmJvZHlIZWlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbCB8fCAhdGhpcy5ib2R5SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByb3dIZWlnaHQgPSB0aGlzLnJvd0hlaWdodCArIDE7XG5cbiAgICAgICAgICAgIGNvbnN0IHJvd3NWaXNpYmxlID0gdGhpcy5fdGFibGUuX3RhYmxlUm93c1Zpc2libGU7XG4gICAgICAgICAgICBjb25zdCByb3dzSW5WaWV3UG9ydCA9IHRoaXMuX3RhYmxlLmdldFJvd3NJblZpZXdwb3J0KCk7XG4gICAgICAgICAgICBjb25zdCB0b3RhbE5vZGVDb3VudCA9IHJvd3NWaXNpYmxlLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IHRoaXMuX3RhYmxlLnRhYmxlU2Nyb2xsYWJsZS5nZXRTY3JvbGxUb3AoKTtcblxuICAgICAgICAgICAgbGV0IHN0YXJ0Tm9kZUluZGV4ID0gTWF0aC5mbG9vcihzY3JvbGxUb3AgLyByb3dIZWlnaHQpIC0gdGhpcy5yZW5kZXJBaGVhZDtcbiAgICAgICAgICAgIHN0YXJ0Tm9kZUluZGV4ID0gTWF0aC5tYXgoMCwgc3RhcnROb2RlSW5kZXgpO1xuXG4gICAgICAgICAgICBsZXQgdmlzaWJsZU5vZGVDb3VudCA9XG4gICAgICAgICAgICAgICAgTWF0aC5jZWlsKHRoaXMuX3RhYmxlLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0IC8gcm93SGVpZ2h0KSArIDIgKiB0aGlzLnJlbmRlckFoZWFkO1xuICAgICAgICAgICAgdmlzaWJsZU5vZGVDb3VudCA9IE1hdGgubWluKHRvdGFsTm9kZUNvdW50IC0gc3RhcnROb2RlSW5kZXgsIHZpc2libGVOb2RlQ291bnQpO1xuXG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxUcmFuc2Zvcm0kLm5leHQoc3RhcnROb2RlSW5kZXggKiByb3dIZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBTaW1wbGUgY2FjaGluZyB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJpbmdzXG4gICAgICAgICAgICBjb25zdCBpc0NhY2hlZCA9XG4gICAgICAgICAgICAgICAgc3RhcnROb2RlSW5kZXggPT09IHRoaXMuX3ZpcnR1YWxTY3JvbGxDYWNoZS5zdGFydE5vZGVJbmRleCAmJlxuICAgICAgICAgICAgICAgIHZpc2libGVOb2RlQ291bnQgPT09IHRoaXMuX3ZpcnR1YWxTY3JvbGxDYWNoZS52aXNpYmxlTm9kZUNvdW50ICYmXG4gICAgICAgICAgICAgICAgdG90YWxOb2RlQ291bnQgPT09IHRoaXMuX3ZpcnR1YWxTY3JvbGxDYWNoZS50b3RhbE5vZGVDb3VudCAmJlxuICAgICAgICAgICAgICAgIC8vIE9uIHJvd3MgY2hhbmdlLCBldmVuIGlmIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cyBpcyB0aGUgc2FtZSwgdGhlIHJvdyBvYmplY3Qgd2lsbCBiZSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICBzdGFydE5vZGVJbmRleCA9PT0gcm93c0luVmlld1BvcnRbMF07XG5cbiAgICAgICAgICAgIGlmIChpc0NhY2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fdmlydHVhbFNjcm9sbENhY2hlID0geyBzdGFydE5vZGVJbmRleCwgdmlzaWJsZU5vZGVDb3VudCwgdG90YWxOb2RlQ291bnQgfTtcbiAgICAgICAgICAgIHRoaXMudmlydHVhbFNjcm9sbFRvdGFsSGVpZ2h0ID0gdG90YWxOb2RlQ291bnQgKiByb3dIZWlnaHQgLSB2aXNpYmxlTm9kZUNvdW50ICogcm93SGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5fdGFibGUuc2V0Um93c0luVmlld3BvcnQoXG4gICAgICAgICAgICAgICAgc3RhcnROb2RlSW5kZXgsXG4gICAgICAgICAgICAgICAgcm93c1Zpc2libGUuc2xpY2Uoc3RhcnROb2RlSW5kZXgsIHN0YXJ0Tm9kZUluZGV4ICsgdmlzaWJsZU5vZGVDb3VudCkubGVuZ3RoXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEluaXRpYWxpc2VzIHNjcm9sbCBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgbGlzdGVuT25WaXJ0dWFsU2Nyb2xsKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxXaG9sZVJvd3MpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLl93aGVlbFNjcm9sbExpc3RlbmVyRnVuY3Rpb24sIHtcbiAgICAgICAgICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl90YWJsZS50YWJsZVNjcm9sbE1vY2tDb250YWluZXIubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICdzY3JvbGwnLFxuICAgICAgICAgICAgICAgIHRoaXMuX21vY2tTY3JvbGxiYXJMaXN0ZW5lckZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgIHsgcGFzc2l2ZTogZmFsc2UgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlU2Nyb2xsRGlzcGF0Y2hlclxuICAgICAgICAgICAgICAgIC52ZXJ0aWNhbGx5U2Nyb2xsZWQoKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy52aXJ0dWFsU2Nyb2xsICYmICEhdGhpcy5ib2R5SGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChzY3JvbGxhYmxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVmlydHVhbFNjcm9sbFJvd3MoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFibGUuc2V0VGFibGVTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLl90YWJsZS5nZXRUYWJsZVN0YXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3BQb3NpdGlvbjogc2Nyb2xsYWJsZS5nZXRTY3JvbGxUb3AoKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2V0TnVtYmVyT2ZSb3dzVG9EaXNwbGF5KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gdGhpcy5fdGFibGUudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgbGV0IHRhYmxlSGVpZ2h0ID0gdGFibGVDb250YWluZXIuY2xpZW50SGVpZ2h0O1xuICAgICAgICB0YWJsZUhlaWdodCA9IHRhYmxlSGVpZ2h0IC0gdGFibGVDb250YWluZXIucXVlcnlTZWxlY3RvcigndGhlYWQnKS5jbGllbnRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IG51bWJlck9mUm93cyA9IE1hdGguZmxvb3IodGFibGVIZWlnaHQgLyAodGhpcy5yb3dIZWlnaHQgKyAyKSk7XG4gICAgICAgIGlmICh0aGlzLl90YWJsZS5fdGFibGVSb3dzVmlzaWJsZS5sZW5ndGggPCBudW1iZXJPZlJvd3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90YWJsZS5fdGFibGVSb3dzVmlzaWJsZS5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyT2ZSb3dzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgcGVyZm9ybXMgYSB3aGVlbCBldmVudC4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgdXNlciBoYXMgc2Nyb2xsZWRcbiAgICAgKiB1cCBvciBkb3duIHVzaW5nIHRoZSBldmVudCdzIGRlbHRhWCBwcm9wZXJ0eSwgYW5kIHNjcm9sbHMgdGhlIHRhYmxlIGJ5IG9uZSByb3cuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfd2hlZWxTY3JvbGxMaXN0ZW5lckZ1bmN0aW9uID0gKGV2ZW50OiBXaGVlbEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChNYXRoLmFicyhldmVudC5kZWx0YVgpIDwgTWF0aC5hYnMoZXZlbnQuZGVsdGFZKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3doZWVsVGltZW91dCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl93aGVlbFRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGVsdGFZID0gZXZlbnQuZGVsdGFZO1xuICAgICAgICAgICAgaWYgKGRlbHRhWSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3doZWVsVGltZW91dCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxSb3coZGVsdGFZID4gMCA/IDEgOiAtMSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIG1vY2sgc2Nyb2xsYmFyICh3aGVuIHVzaW5nICdzY3JvbGxXaG9sZVJvd3MnKSBpcyBtb3ZlZC4gSXQgZGV0ZXJtaW5lcyBpZiB0aGVcbiAgICAgKiBzY3JvbGwgd2FzIHVwIG9yIGRvd24gYnkgY29tcGFyaW5nIHRoZSBjdXJyZW50IHNjcm9sbCB0b3AgdG8gdGhlIHByZXZpb3VzIHNjcm9sbCB0b3AgYW5kIHNjcm9sbHMgcm93cyBhY2NvcmRpbmdseS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9tb2NrU2Nyb2xsYmFyTGlzdGVuZXJGdW5jdGlvbiA9IChldmVudDogRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLl9zY3JvbGxNb2NrVGltZW91dCkge1xuICAgICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3Njcm9sbE1vY2tUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZVNjcm9sbE1vY2tDb250YWluZXIgPSB0aGlzLl90YWJsZS50YWJsZVNjcm9sbE1vY2tDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgbGV0IGRlbHRhWSA9IHRhYmxlU2Nyb2xsTW9ja0NvbnRhaW5lci5zY3JvbGxUb3AgLSB0aGlzLl9sYXN0TW9ja1Njcm9sbFBvc2l0aW9uO1xuICAgICAgICBkZWx0YVkgPSBNYXRoLmNlaWwoZGVsdGFZIC8gdGhpcy5yb3dIZWlnaHQpO1xuICAgICAgICB0aGlzLl9zY3JvbGxNb2NrVGltZW91dCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsUm93KGRlbHRhWSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLl9sYXN0TW9ja1Njcm9sbFBvc2l0aW9uID0gdGFibGVTY3JvbGxNb2NrQ29udGFpbmVyLnNjcm9sbFRvcDtcbiAgICAgICAgICAgIGlmICh0YWJsZVNjcm9sbE1vY2tDb250YWluZXIuc2Nyb2xsVG9wID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQWx3YXlzIGRpc3BsYXkgdGhlIGZpcnN0IHJvdyBvZiB0aGUgdGFibGUgd2hlbiB0aGUgdXNlciBzY3JvbGxzIGFsbCB0aGUgd2F5IHRvIHRoZSB0b3BcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRSb3dzKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRhYmxlU2Nyb2xsTW9ja0NvbnRhaW5lci5zY3JvbGxUb3AgKyB0YWJsZVNjcm9sbE1vY2tDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ID09PVxuICAgICAgICAgICAgICAgIHRhYmxlU2Nyb2xsTW9ja0NvbnRhaW5lci5zY3JvbGxIZWlnaHRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBkaXNwbGF5IHRoZSBsYXN0IHJvd3Mgb2YgdGhlIHRhYmxlIHdoZW4gdGhlIHVzZXIgc2Nyb2xscyBhbGwgdGhlIHdheSB0byB0aGUgYm90dG9tXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRpbmdOb2RlSW5kZXggPSB0aGlzLl90YWJsZS5fdGFibGVSb3dzVmlzaWJsZS5sZW5ndGggLSB0aGlzLl9nZXROdW1iZXJPZlJvd3NUb0Rpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRSb3dzKHN0YXJ0aW5nTm9kZUluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uLCB1c2VkIG9ubHkgd2hlbiAnc2Nyb2xsV2hvbGVSb3dzJyBpcyB0cnV0aHksIGNhbGN1bGF0ZXMgd2hhdCBzaG91bGQgYmUgdGhlIG5ldyBzdGFydGluZyBub2RlLCBiYXNlZFxuICAgICAqIG9mZiB0aGUgcHJldmlvdXMgc3RhcnRpbmcgbm9kZSBhbmQgdGhlIHByb3ZpZGVkICdjb3VudCcgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZSBpZiB0aGUgcHJldmlvdXMgc3RhcnQgbm9kZSB3YXMgMTBcbiAgICAgKiBhbmQgdGhlIGNvdW50IHBhcmFtZXRlciBpcyAtMiwgdGhlIG5ldyBzdGFydGluZyBub2RlIHdpbGwgYmUgOC4gVGhpcyBmdW5jdGlvbiBhbHNvIHByb2dyYW1tYXRpY2FsbHkgbW92ZXMgdGhlXG4gICAgICogbW9jayBzY3JvbGxiYXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2Nyb2xsUm93KGNvdW50OiBudW1iZXIsIGZyb21Nb2NrU2Nyb2xsYmFyTGlzdGVuZXIgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBsZXQgc3RhcnRpbmdOb2RlID0gMDtcbiAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzU3RhcnROb2RlSW5kZXggIT09IG51bGwgJiYgdGhpcy5fcHJldmlvdXNTdGFydE5vZGVJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBzdGFydGluZ05vZGUgPSB0aGlzLl9wcmV2aW91c1N0YXJ0Tm9kZUluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHN0YXJ0aW5nTm9kZSArIGNvdW50ICsgdGhpcy5fZ2V0TnVtYmVyT2ZSb3dzVG9EaXNwbGF5KCkgPD0gdGhpcy5fdGFibGUuX3RhYmxlUm93c1Zpc2libGUubGVuZ3RoIHx8XG4gICAgICAgICAgICBjb3VudCA8IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBzdGFydGluZ05vZGUgPSBNYXRoLmNlaWwoc3RhcnRpbmdOb2RlICsgY291bnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydGluZ05vZGUgPCAwKSB7XG4gICAgICAgICAgICBzdGFydGluZ05vZGUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoaXMgbmV4dCAnaWYnIHN0YXRlbWVudCBpcyBmb3IgdHJpZ2dlcmluZyBuZXcgcGFnZSBsb2FkcyB3aGVuICdwYWdlU2Nyb2xsaW5nJyBpcyB0cnVlXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvdW50ID4gMCAmJlxuICAgICAgICAgICAgc3RhcnRpbmdOb2RlID09PSB0aGlzLl9wcmV2aW91c1N0YXJ0Tm9kZUluZGV4ICYmXG4gICAgICAgICAgICB0aGlzLl90YWJsZS5wYWdlU2Nyb2xsaW5nICYmXG4gICAgICAgICAgICB0aGlzLl90YWJsZS5fdGFibGVSb3dzVmlzaWJsZS5sZW5ndGggPT09IHRoaXMuX3RhYmxlLl90YWJsZVJvd3MubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5fdGFibGUuX29uU3B5SW50ZXJzZWN0KHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldFJvd3Moc3RhcnRpbmdOb2RlKTtcbiAgICAgICAgY29uc3QgdGFibGVTY3JvbGxNb2NrQ29udGFpbmVyID0gdGhpcy5fdGFibGUudGFibGVTY3JvbGxNb2NrQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmICghZnJvbU1vY2tTY3JvbGxiYXJMaXN0ZW5lcikge1xuICAgICAgICAgICAgdGFibGVTY3JvbGxNb2NrQ29udGFpbmVyLnNjcm9sbEJ5KHsgdG9wOiBjb3VudCAqIHRoaXMucm93SGVpZ2h0IH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xhc3RNb2NrU2Nyb2xsUG9zaXRpb24gPSB0YWJsZVNjcm9sbE1vY2tDb250YWluZXIuc2Nyb2xsVG9wO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNldHMgcm93cyBpbiB0aGUgdGFibGUncyB2aWV3cG9ydCBkZXBlbmRpbmcgb24gdGhlIHByb3ZpZGVkIHN0YXJ0aW5nIG5vZGUuIEl0IGFsc28gc2V0cyB0aGUgdGFibGVcbiAgICAgKiBzdGF0ZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZXRSb3dzKHN0YXJ0aW5nTm9kZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3RhYmxlLnNldFJvd3NJblZpZXdwb3J0KHN0YXJ0aW5nTm9kZSwgdGhpcy5fZ2V0TnVtYmVyT2ZSb3dzVG9EaXNwbGF5KCkpO1xuICAgICAgICB0aGlzLl9wcmV2aW91c1N0YXJ0Tm9kZUluZGV4ID0gc3RhcnRpbmdOb2RlO1xuICAgICAgICB0aGlzLl90YWJsZS5zZXRUYWJsZVN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX3RhYmxlLmdldFRhYmxlU3RhdGUoKSxcbiAgICAgICAgICAgIHNjcm9sbFRvcFBvc2l0aW9uOiB0aGlzLnJvd0hlaWdodCAqIHN0YXJ0aW5nTm9kZVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=