UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

542 lines 103 kB
import { __decorate } from "tslib"; import { Injectable } from '@angular/core'; import { first } from 'rxjs/operators'; import { IgxGridNavigationService } from './grid-navigation.service'; export var NavigationDirection; (function (NavigationDirection) { NavigationDirection["horizontal"] = "horizontal"; NavigationDirection["vertical"] = "vertical"; })(NavigationDirection || (NavigationDirection = {})); /** @hidden */ let IgxGridMRLNavigationService = class IgxGridMRLNavigationService extends IgxGridNavigationService { /** * @hidden * @internal */ setStartNavigationCell(colStart, rowStart, dir) { this.startNavigationCell = { colStart: colStart, rowStart: rowStart, direction: dir }; } applyNavigationCell(colStart, rowStart, navDirection) { const oppositeDir = navDirection === NavigationDirection.vertical ? NavigationDirection.horizontal : NavigationDirection.vertical; if (this.startNavigationCell && this.startNavigationCell.direction !== navDirection) { this.startNavigationCell.direction = oppositeDir; } else { this.setStartNavigationCell(colStart, rowStart, oppositeDir); } return navDirection === NavigationDirection.vertical ? this.startNavigationCell.colStart : this.startNavigationCell.rowStart; } navigateUp(rowElement, selectedNode) { this.focusCellUpFromLayout(rowElement, selectedNode); } navigateDown(rowElement, selectedNode) { this.focusCellDownFromLayout(rowElement, selectedNode); } isColumnRightEdgeVisible(visibleColumnIndex) { const column = this.grid.columnList.filter(c => !c.columnGroup).find((col) => col.visibleIndex === visibleColumnIndex); const forOfDir = this.grid.headerContainer; const horizontalScroll = forOfDir.getScroll(); if (!horizontalScroll.clientWidth || (column && column.pinned)) { return true; } else if (column) { if (this.isParentColumnFullyVisible(column)) { return true; } const scrollPos = this.getChildColumnScrollPositions(visibleColumnIndex); return this.displayContainerWidth >= scrollPos.rightScroll - this.displayContainerScrollLeft && this.displayContainerScrollLeft <= scrollPos.leftScroll; } return false; } isParentColumnFullyVisible(parent) { const forOfDir = this.grid.dataRowList.length > 0 ? this.grid.dataRowList.first.virtDirRow : this.grid.headerContainer; const horizontalScroll = forOfDir.getScroll(); if (!horizontalScroll.clientWidth || parent.pinned) { return true; } const index = forOfDir.igxForOf.indexOf(parent); return this.displayContainerWidth >= forOfDir.getColumnScrollLeft(index + 1) - this.displayContainerScrollLeft && this.displayContainerScrollLeft <= forOfDir.getColumnScrollLeft(index); } isColumnLeftEdgeVisible(visibleColumnIndex) { const forOfDir = this.grid.headerContainer; const horizontalScroll = forOfDir.getScroll(); const column = this.grid.columnList.filter(c => !c.columnGroup).find((col) => col.visibleIndex === visibleColumnIndex); if (!horizontalScroll.clientWidth || column.pinned) { return true; } if (this.isParentColumnFullyVisible(column)) { return true; } const scrollPos = this.getChildColumnScrollPositions(visibleColumnIndex); return this.displayContainerScrollLeft <= scrollPos.leftScroll; } onKeydownArrowRight(element, selectedNode) { this.focusNextCellFromLayout(element, selectedNode); } onKeydownArrowLeft(element, selectedNode) { this.focusPrevCellFromLayout(element, selectedNode); } get gridOrderedColumns() { return [...this.grid.pinnedColumns, ...this.grid.unpinnedColumns].filter(c => !c.columnGroup) .sort((a, b) => a.visibleIndex - b.visibleIndex); } performTab(currentRowEl, selectedNode) { const visibleColumnIndex = selectedNode.layout ? selectedNode.layout.columnVisibleIndex : 0; const nextElementColumn = this.grid.columns.find(x => !x.columnGroup && x.visibleIndex === visibleColumnIndex + 1); const rowIndex = selectedNode.row; const row = this.grid.getRowByIndex(rowIndex); this._moveFocusToCell(currentRowEl, nextElementColumn, row, selectedNode, 'next'); if (nextElementColumn) { this.setStartNavigationCell(nextElementColumn.colStart, nextElementColumn.rowStart, null); } } _moveFocusToCell(currentRowEl, nextElementColumn, row, selectedNode, dir) { if (nextElementColumn && row.cells) { let nextCell = row.cells.find(currCell => currCell.column === nextElementColumn); const isVisible = this.isColumnRightEdgeVisible(nextElementColumn.visibleIndex); if (!nextCell || !isVisible) { this.grid.nativeElement.focus({ preventScroll: true }); const cb = () => { nextCell = row.cells.find(currCell => currCell.column === nextElementColumn); if (this.grid.rowEditable && this.isRowInEditMode(row.index)) { if (dir === 'next') { this.moveNextEditable(row.index, selectedNode.layout.columnVisibleIndex); } else { this.movePreviousEditable(row.index, selectedNode.layout.columnVisibleIndex); } return; } this._focusCell(nextCell.nativeElement); }; this.performHorizontalScrollToCell(row.index, nextElementColumn.visibleIndex, false, cb); } else { if (this.grid.rowEditable && this.isRowInEditMode(row.index)) { if (dir === 'next') { this.moveNextEditable(row.index, selectedNode.layout.columnVisibleIndex); } else { this.movePreviousEditable(row.index, selectedNode.layout.columnVisibleIndex); } return; } this._focusCell(nextCell.nativeElement); } } else { // end of layout reached if (this.isRowInEditMode(row.index)) { // TODO: make gridAPI visible for internal use and remove cast to any this.grid.gridAPI.submit_value(); if (dir === 'next') { this.grid.rowEditTabs.first.element.nativeElement.focus(); } else { this.grid.rowEditTabs.last.element.nativeElement.focus(); } return; } if (dir === 'next') { super.navigateDown(currentRowEl, { row: row.index, column: 0 }); } else { let lastVisibleIndex = 0; this.grid.unpinnedColumns.forEach((col) => { lastVisibleIndex = Math.max(lastVisibleIndex, col.visibleIndex); }); super.navigateUp(currentRowEl, { row: row.index, column: lastVisibleIndex }); } } } performShiftTabKey(currentRowEl, selectedNode) { const visibleColumnIndex = selectedNode.layout ? selectedNode.layout.columnVisibleIndex : 0; const rowIndex = selectedNode.row; const row = this.grid.getRowByIndex(rowIndex); const prevElementColumn = this.grid.columns.find(x => !x.columnGroup && x.visibleIndex === visibleColumnIndex - 1 && !x.hidden); this._moveFocusToCell(currentRowEl, prevElementColumn, row, selectedNode, 'prev'); if (prevElementColumn) { this.setStartNavigationCell(prevElementColumn.colStart, prevElementColumn.rowStart, null); } } focusCellUpFromLayout(rowElement, selectedNode) { const isNonDataRow = rowElement.tagName.toLowerCase() === 'igx-grid-groupby-row' || this._isDetailRecordAt(selectedNode.row); const currentRowStart = selectedNode.layout ? selectedNode.layout.rowStart : 1; const currentColStart = this.applyNavigationCell(selectedNode.layout ? selectedNode.layout.colStart : 1, currentRowStart, NavigationDirection.vertical); const parentIndex = selectedNode.column; const columnLayout = this.grid.columns.find(x => x.columnLayout && x.visibleIndex === parentIndex); let movePrev; // check if element up is from the same layout let upperElementColumn = columnLayout.children.find(c => (c.rowEnd === currentRowStart || c.rowStart + c.gridRowSpan === currentRowStart) && c.colStart <= currentColStart && (currentColStart < c.colEnd || currentColStart < c.colStart + c.gridColumnSpan)); if (isNonDataRow || !upperElementColumn) { // no prev row in current row layout, go to next row last rowstart const layoutRowEnd = this.grid.multiRowLayoutRowSize + 1; upperElementColumn = columnLayout.children.find(c => (c.rowEnd === layoutRowEnd || c.rowStart + c.gridRowSpan === layoutRowEnd) && c.colStart <= currentColStart && (currentColStart < c.colEnd || currentColStart < c.colStart + c.gridColumnSpan)); movePrev = true; } const rowIndex = movePrev ? selectedNode.row - 1 : selectedNode.row; if (rowIndex < 0) { // end of rows reached. return; } let prevRow; const cb = () => { prevRow = this.grid.getRowByIndex(rowIndex); if (prevRow && prevRow.cells) { this._focusCell(upperElementColumn.cells.find((c) => c.rowIndex === prevRow.index).nativeElement); } else if (prevRow) { prevRow.nativeElement.focus({ preventScroll: true }); } else { const prevElem = this.getRowByIndex(rowIndex, ''); prevElem.focus({ preventScroll: true }); } }; if (this.shouldPerformVerticalScroll(rowIndex, upperElementColumn.visibleIndex)) { this.grid.nativeElement.focus({ preventScroll: true }); this.performVerticalScrollToCell(rowIndex, upperElementColumn.visibleIndex, cb); } else { cb(); } } focusCellDownFromLayout(rowElement, selectedNode) { const isNonDataRow = rowElement.tagName.toLowerCase() === 'igx-grid-groupby-row' || this._isDetailRecordAt(selectedNode.row); const parentIndex = selectedNode.column; const columnLayout = this.grid.columns.find(x => x.columnLayout && x.visibleIndex === parentIndex); const currentRowEnd = selectedNode.layout ? selectedNode.layout.rowEnd || selectedNode.layout.rowStart + 1 : 2; const currentColStart = this.applyNavigationCell(selectedNode.layout ? selectedNode.layout.colStart : 1, selectedNode.layout ? selectedNode.layout.rowStart : 1, NavigationDirection.vertical); let moveNext; // check if element down is from the same layout let nextElementColumn = columnLayout.children.find(c => c.rowStart === currentRowEnd && c.colStart <= currentColStart && (currentColStart < c.colEnd || currentColStart < c.colStart + c.gridColumnSpan)); if (isNonDataRow || !nextElementColumn) { // no next row in current row layout, go to next row first rowstart nextElementColumn = columnLayout.children.find(c => c.rowStart === 1 && c.colStart <= currentColStart && (currentColStart < c.colEnd || currentColStart < c.colStart + c.gridColumnSpan)); moveNext = true; } const rowIndex = moveNext ? selectedNode.row + 1 : selectedNode.row; if (rowIndex > this.grid.dataView.length - 1) { // end of rows reached. return; } let nextRow; const cb = () => { nextRow = this.grid.getRowByIndex(rowIndex); if (nextRow && nextRow.cells) { this._focusCell(nextElementColumn.cells.find((c) => c.rowIndex === nextRow.index).nativeElement); } else if (nextRow) { nextRow.nativeElement.focus({ preventScroll: true }); } else { const nextElem = this.getRowByIndex(rowIndex, ''); nextElem.focus({ preventScroll: true }); } }; if (this.shouldPerformVerticalScroll(rowIndex, nextElementColumn.visibleIndex)) { this.grid.nativeElement.focus({ preventScroll: true }); this.performVerticalScrollToCell(rowIndex, nextElementColumn.visibleIndex, cb); } else { cb(); } } focusNextCellFromLayout(cellElement, selectedNode) { const parentIndex = selectedNode.column; let columnLayout = this.grid.columns.find(x => x.columnLayout && x.visibleIndex === parentIndex); const currentColEnd = selectedNode.layout.colEnd || selectedNode.layout.colStart + 1; const currentRowStart = this.applyNavigationCell(selectedNode.layout.colStart, selectedNode.layout.rowStart, NavigationDirection.horizontal); const rowIndex = selectedNode.row; // check if next element is from the same layout let nextElementColumn = columnLayout.children.find(c => c.colStart === currentColEnd && c.rowStart <= currentRowStart && (currentRowStart < c.rowEnd || currentRowStart < c.rowStart + c.gridRowSpan)); if (!nextElementColumn) { // no next column in current layout, search for next layout columnLayout = this.grid.columns.find(c => c.columnLayout && !c.hidden && c.visibleIndex === columnLayout.visibleIndex + 1); if (!columnLayout) { // reached the end return null; } // next element is from the next layout nextElementColumn = columnLayout.children.find(c => c.colStart === 1 && c.rowStart <= currentRowStart && (currentRowStart < c.rowEnd || currentRowStart < c.rowStart + c.gridRowSpan)); } const cb = () => { const nextElement = nextElementColumn.cells.find((c) => c.rowIndex === rowIndex).nativeElement; this._focusCell(nextElement); }; if (!this.isColumnRightEdgeVisible(nextElementColumn.visibleIndex)) { this.grid.nativeElement.focus({ preventScroll: true }); this.performHorizontalScrollToCell(rowIndex, nextElementColumn.visibleIndex, false, cb); } else { cb(); } } focusPrevCellFromLayout(cellElement, selectedNode) { const parentIndex = selectedNode.column; let columnLayout = this.grid.columns.find(x => x.columnLayout && x.visibleIndex === parentIndex); const currentColStart = selectedNode.layout.colStart; const currentRowStart = this.applyNavigationCell(currentColStart, selectedNode.layout.rowStart, NavigationDirection.horizontal); const rowIndex = selectedNode.row; // check previous element is from the same layout let prevElementColumn = columnLayout.children .find(c => (c.colEnd === currentColStart || c.colStart + c.gridColumnSpan === currentColStart) && c.rowStart <= currentRowStart && (currentRowStart < c.rowEnd || currentRowStart < c.rowStart + c.gridRowSpan)); if (!prevElementColumn) { // no prev column in current layout, seacrh for prev layout columnLayout = this.grid.columns.find(c => c.columnLayout && !c.hidden && c.visibleIndex === columnLayout.visibleIndex - 1); if (!columnLayout) { // reached the end return null; } const layoutSize = columnLayout.getInitialChildColumnSizes(columnLayout.children).length; // first element is from the next layout prevElementColumn = columnLayout.children .find(c => (c.colEnd === layoutSize + 1 || c.colStart + c.gridColumnSpan === layoutSize + 1) && c.rowStart <= currentRowStart && (currentRowStart < c.rowEnd || currentRowStart < c.rowStart + c.gridRowSpan)); } const cb = () => { const prevElement = prevElementColumn.cells.find((c) => c.rowIndex === rowIndex).nativeElement; this._focusCell(prevElement); }; if (!this.isColumnLeftEdgeVisible(prevElementColumn.visibleIndex)) { this.grid.nativeElement.focus({ preventScroll: true }); this.performHorizontalScrollToCell(rowIndex, prevElementColumn.visibleIndex, false, cb); } else { cb(); } } onKeydownEnd(rowIndex, isSummary = false, cellRowStart) { const layouts = this.grid.columns.filter(c => c.columnLayout && !c.hidden).sort((a, b) => a.visibleIndex - b.visibleIndex); const lastLayout = layouts[layouts.length - 1]; const lastLayoutChildren = lastLayout.children; const layoutSize = lastLayout.getInitialChildColumnSizes(lastLayoutChildren).length; const currentRowStart = this.applyNavigationCell(this.startNavigationCell ? this.startNavigationCell.colStart : 1, cellRowStart || this.grid.multiRowLayoutRowSize, NavigationDirection.horizontal); const nextElementColumn = lastLayout.children.find(c => (c.colEnd === layoutSize + 1 || c.colStart + c.gridColumnSpan === layoutSize + 1) && c.rowStart <= currentRowStart && (currentRowStart < c.rowEnd || currentRowStart < c.rowStart + c.gridRowSpan)); const indexInLayout = lastLayoutChildren.toArray().indexOf(nextElementColumn); const rowList = isSummary ? this.grid.summariesRowList : this.grid.dataRowList; let rowElement = rowList.find((row) => row.index === rowIndex); if (!rowElement) { return; } rowElement = rowElement.nativeElement; if (!this.isColumnRightEdgeVisible(nextElementColumn.visibleIndex)) { this.grid.nativeElement.focus({ preventScroll: true }); const cb = () => { const allBlocks = rowElement.querySelectorAll(this.getColumnLayoutSelector()); const cell = allBlocks[allBlocks.length - 1].children[indexInLayout]; this._focusCell(cell); }; this.performHorizontalScrollToCell(rowIndex, nextElementColumn.visibleIndex, false, cb); return; } else { const allBlocks = rowElement.querySelectorAll(this.getColumnLayoutSelector()); const cell = allBlocks[allBlocks.length - 1].children[indexInLayout]; this._focusCell(cell); } } onKeydownHome(rowIndex, isSummary = false, cellRowStart = 1) { const firstLayout = this.grid.columns.filter(c => c.columnLayout && !c.hidden)[0]; const lastLayoutChildren = firstLayout.children.toArray(); const currentRowStart = this.applyNavigationCell(this.startNavigationCell ? this.startNavigationCell.colStart : 1, cellRowStart, NavigationDirection.horizontal); const nextElementColumn = firstLayout.children.find(c => c.colStart === 1 && c.rowStart <= currentRowStart && (currentRowStart < c.rowEnd || currentRowStart < c.rowStart + c.gridRowSpan)); const indexInLayout = lastLayoutChildren.indexOf(nextElementColumn); const rowList = isSummary ? this.grid.summariesRowList : this.grid.dataRowList; let rowElement = rowList.find((row) => row.index === rowIndex); if (!rowElement) { return; } rowElement = rowElement.nativeElement; if (!this.isColumnLeftEdgeVisible(nextElementColumn.visibleIndex)) { this.grid.nativeElement.focus({ preventScroll: true }); const cb = () => { const allBlocks = rowElement.querySelectorAll(this.getColumnLayoutSelector()); const cell = allBlocks[0].children[indexInLayout]; this._focusCell(cell); }; this.performHorizontalScrollToCell(rowIndex, nextElementColumn.visibleIndex, false, cb); return; } else { const allBlocks = rowElement.querySelectorAll(this.getColumnLayoutSelector()); const cell = allBlocks[0].children[indexInLayout]; this._focusCell(cell); } } getColumnLayoutSelector() { return '.igx-grid__mrl-block'; } getChildColumnScrollPositions(visibleColIndex) { const forOfDir = this.grid.dataRowList.length > 0 ? this.grid.dataRowList.first.virtDirRow : this.grid.headerContainer; const targetCol = this.getColunmByVisibleIndex(visibleColIndex); const parent = targetCol.parent; const parentVIndex = forOfDir.igxForOf.indexOf(parent); let leftScroll = forOfDir.getColumnScrollLeft(parentVIndex), rightScroll = 0; // caculate offset from parent based on target column colStart and colEnd and the resolved child column sizes. const childSizes = parent.getFilledChildColumnSizes(parent.children); const colStart = targetCol.colStart || 1; const colEnd = targetCol.colEnd || colStart + 1; for (let i = 1; i < colStart; i++) { leftScroll += parseInt(childSizes[i - 1], 10); } rightScroll += leftScroll; for (let j = colStart; j < colEnd; j++) { rightScroll += parseInt(childSizes[j - 1], 10); } return { leftScroll, rightScroll }; } getColunmByVisibleIndex(visibleColIndex) { visibleColIndex = visibleColIndex < 0 ? 0 : visibleColIndex; return this.grid.columnList.find((col) => !col.columnLayout && col.visibleIndex === visibleColIndex); } shouldPerformVerticalScroll(rowIndex, visibleColumnIndex) { if (this._isGroupRecordAt(rowIndex) || this._isDetailRecordAt(rowIndex)) { return super.shouldPerformVerticalScroll(rowIndex, visibleColumnIndex); } if (!super.shouldPerformVerticalScroll(rowIndex, visibleColumnIndex)) { return false; } const targetRow = this.grid.summariesRowList.filter(s => s.index !== 0) .concat(this.grid.rowList.toArray()).find(r => r.index === rowIndex); const scrollTop = Math.abs(this.grid.verticalScrollContainer.getScroll().scrollTop); const containerHeight = this.grid.calcHeight ? Math.ceil(this.grid.calcHeight) : 0; const scrollPos = this.getVerticalScrollPositions(rowIndex, visibleColumnIndex); if (!targetRow || targetRow.nativeElement.offsetTop + scrollPos.topOffset < Math.abs(this.verticalDCTopOffset) || containerHeight && containerHeight < scrollPos.rowBottom - scrollTop) { return true; } else { return false; } } get verticalDCTopOffset() { return parseInt(this.grid.verticalScrollContainer.dc.instance._viewContainer.element.nativeElement.style.top, 10); } _isGroupRecordAt(rowIndex) { const record = this.grid.dataView[rowIndex]; return record.records && record.records.length; } _isDetailRecordAt(rowIndex) { const record = this.grid.dataView[rowIndex]; return this.grid.isDetailRecord(record); } performVerticalScrollToCell(rowIndex, visibleColumnIndex, cb) { if (this._isGroupRecordAt(rowIndex) || this._isDetailRecordAt(rowIndex)) { return super.performVerticalScrollToCell(rowIndex, visibleColumnIndex, cb); } const containerHeight = this.grid.calcHeight ? Math.ceil(this.grid.calcHeight) : 0; const scrollTop = Math.abs(this.grid.verticalScrollContainer.getScroll().scrollTop); const scrollPos = this.getVerticalScrollPositions(rowIndex, visibleColumnIndex); const targetRow = this.grid.summariesRowList.filter(s => s.index !== 0) .concat(this.grid.rowList.toArray()).find(r => r.index === rowIndex); const isPrevious = (scrollTop > scrollPos.rowTop) && (!targetRow || targetRow.nativeElement.offsetTop + scrollPos.topOffset < Math.abs(this.verticalDCTopOffset)); const scrollAmount = isPrevious ? scrollPos.rowTop : Math.abs(scrollTop + containerHeight - scrollPos.rowBottom); this.grid.verticalScrollContainer.onChunkLoad .pipe(first()).subscribe(() => { cb(); }); if (isPrevious) { this.grid.verticalScrollContainer.scrollPosition = scrollAmount; } else { this.grid.verticalScrollContainer.addScrollTop(scrollAmount); } } getVerticalScrollPositions(rowIndex, visibleColIndex) { const targetCol = this.getColunmByVisibleIndex(visibleColIndex); const topOffset = (targetCol.rowStart - 1) * this.grid.defaultRowHeight; const rowTop = this.grid.verticalScrollContainer.sizesCache[rowIndex] + topOffset; const rowBottom = rowTop + (this.grid.defaultRowHeight * targetCol.gridRowSpan); return { rowTop, rowBottom, topOffset }; } performHorizontalScrollToCell(rowIndex, visibleColumnIndex, isSummary = false, cb) { const scrollPos = this.getChildColumnScrollPositions(visibleColumnIndex); const hScroll = this.horizontalScroll(rowIndex); this.grid.parentVirtDir.onChunkLoad .pipe(first()) .subscribe(() => { if (cb) { cb(); } else { this._focusCell(this.getCellElementByVisibleIndex(rowIndex, visibleColumnIndex, isSummary)); } }); const isPrevItem = hScroll.getScroll().scrollLeft > scrollPos.leftScroll; const containerSize = parseInt(hScroll.igxForContainerSize, 10); const nextScroll = isPrevItem ? scrollPos.leftScroll : scrollPos.rightScroll - containerSize; hScroll.scrollPosition = nextScroll; } _focusCell(cellElem) { // in case of variable row heights in mrl grid make sure cell is really in view after it has been rendered. const gridBoundingClientRect = this.grid.tbody.nativeElement.getBoundingClientRect(); const diffTop = cellElem.getBoundingClientRect().top - gridBoundingClientRect.top; const diffBottom = cellElem.getBoundingClientRect().bottom - gridBoundingClientRect.bottom; if (diffTop < 0) { // cell is above grid top - not visible this.grid.nativeElement.focus({ preventScroll: true }); this.grid.verticalScrollContainer.onChunkLoad .pipe(first()) .subscribe(() => { cellElem.focus({ preventScroll: true }); }); this.grid.verticalScrollContainer.addScrollTop(diffTop); } else if (diffBottom > 0) { // cell is below grid bottom - not visible this.grid.nativeElement.focus({ preventScroll: true }); this.grid.verticalScrollContainer.onChunkLoad .pipe(first()) .subscribe(() => { cellElem.focus({ preventScroll: true }); }); this.grid.verticalScrollContainer.addScrollTop(diffBottom); } else { // cell is visible cellElem.focus({ preventScroll: true }); } } goToFirstCell() { this.startNavigationCell = null; super.goToFirstCell(); } goToLastCell() { this.startNavigationCell = null; super.goToLastCell(); } }; IgxGridMRLNavigationService = __decorate([ Injectable() ], IgxGridMRLNavigationService); export { IgxGridMRLNavigationService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1tcmwtbmF2aWdhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9ncmlkLW1ybC1uYXZpZ2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBVXJFLE1BQU0sQ0FBTixJQUFZLG1CQUdYO0FBSEQsV0FBWSxtQkFBbUI7SUFDM0IsZ0RBQXlCLENBQUE7SUFDekIsNENBQXFCLENBQUE7QUFDekIsQ0FBQyxFQUhXLG1CQUFtQixLQUFuQixtQkFBbUIsUUFHOUI7QUFHRCxjQUFjO0FBRWQsSUFBYSwyQkFBMkIsR0FBeEMsTUFBYSwyQkFBNEIsU0FBUSx3QkFBd0I7SUFNckU7OztPQUdHO0lBQ0ksc0JBQXNCLENBQUMsUUFBZ0IsRUFBRSxRQUFnQixFQUFFLEdBQXdCO1FBQ3RGLElBQUksQ0FBQyxtQkFBbUIsR0FBRztZQUN2QixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtZQUNsQixTQUFTLEVBQUUsR0FBRztTQUNqQixDQUFDO0lBQ04sQ0FBQztJQUVPLG1CQUFtQixDQUFDLFFBQWdCLEVBQUUsUUFBZ0IsRUFBRSxZQUFpQztRQUM3RixNQUFNLFdBQVcsR0FBRyxZQUFZLEtBQUssbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0QsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7UUFDbEUsSUFBSSxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsS0FBSyxZQUFZLEVBQUU7WUFDakYsSUFBSSxDQUFD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